Release v2.1.2_20190315
diff --git a/CHANGELOG b/CHANGELOG
index 306217f..5f797e7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,9 +1,262 @@
 HISTORY
+ * These are only the most important changes. For a full list, use git log:
+   http://git.savannah.nongnu.org/cgit/lwip.git
 
 (git master)
 
   * [Enter new changes just after this line - do not remove this line]
 
+(STABLE-2.1.2):
+
+  ++ Bugfixes:
+
+  2018-11-21: Jens Nielsen
+  * netbiosns.c: fix expecting too large packet (bug #55069)
+
+  2018-11-19: Dirk Ziegelmeier
+  * smtp.c: fix compiling with strict C compatibility because of strnlen (bug #55034)
+
+  2018-11-12: Simon Goldschmidt
+  * tcp.c: fix overflow check in tcp_recved triggering invalid assertion (bug #55015)
+
+  2018-11-12: Simon Goldschmidt
+  * tcp.c: fix a bug in sending RST segments (sent from port 0)
+
+(STABLE-2.1.1):
+
+  ++ Bugfixes:
+
+  2018-11-01: Joan Lledó
+  * sockets.c: fix bad assertion in lwip_poll_dec_sockets_used() (bug #54933)
+
+  2018-11-01: Dirk Ziegelmeier
+  * ip4.c: don't send 127.* to default netif (bug #54670)
+
+  2018-10-23: David Girault
+  * altcp_tls_mbedtls.c: fix use-after free (bug #54774)
+
+  2018-10-23: Ognjen Bjelica, Dirk Ziegelmeier
+  * snmp_scalar.c: Avoid NULL pointer dereference (bug #54886)
+
+  2018-10-23: Simon Goldschmidt
+  * Fix missing standard includes in multiple files
+
+  2018-10-17: Ivan Warren
+  * def.h: fix casting htonX and ntohX to u16_t (bug #54850)
+
+  2018-10-12: Simon Goldschmidt
+  * Revert "tcp_abandon: no need to buffer pcb->local_port" (fix that source port was 0 for RST
+    called when aborting a connection)
+
+  2018-10-11: Jonas Rabenstein
+  * tcp.c: tcp_recved: check for overflow and warn about too big values (patch #9699)              
+
+  2018-10-06: Joan Lledó
+  * sockets.c: alloc_socket(): Check for LWIP_SOCKET_POLL when setting select-
+    related variables (patch #9696)
+
+  2018-10-04: Spencer
+  * tcp.c: Update prev pointer when skipping entries in tcp_slowtmr (patch #9694)
+
+  2018-09-27: Martine Lenders
+  * lowpan6.c: Fix IEEE 802.15.4 address setting (bug #54749)
+
+(STABLE-2.1.0):
+
+  ++ New features:
+
+  2018-06-17: Simon Goldschmidt
+  * lwiperf: implemented iPerf client mode
+
+  2018-04-23: Dirk Ziegelmeier
+  * added cmake build files
+
+  2018-03-04: Ray Abram
+  * netbios responder: respond to '*' queries
+
+  2018-02-23: Benjamin Aigner
+  * 6lowpan: add 6lowpan-over-BLE netif (based on existing 6lowpan netif)
+
+  2018-02-22: Simon Goldschmidt
+  * ipv6: add support for stateless DHCPv6 (to get DNS servers in SLAAC nets)
+
+  2018-02-16: Simon Goldschmidt
+  * add raw API http(s) client (with proxy support)
+
+  2018-02-01: Simon Goldschmidt
+  * tcp: add hooks to implement additional socket options
+
+  2018-02-01: Simon Goldschmidt
+  * tcp: add hooks to implement tcp md5 signatures or similar (see contrib/addons for an example)
+
+  2018-01-05: Simon Goldschmidt
+  * Added sys_mbox_trypost_fromisr() and tcpip_callbackmsg_trycallback_fromisr()
+    These can be used to post preallocated messages from an ISR to the tcpip thread
+    (e.g. when using FreeRTOS)
+
+  2018-01-02: Dirk Ziegelmeier
+  * task #14780: Add debug helper asserts to ensure threading/locking requirements are met
+
+  2017-11-21: Simon Goldschmidt
+  * task #14600: tcp_alloc(): kill TF_CLOSEPEND connections before other ESTABLISHED
+
+  2017-11-21: Simon Goldschmidt
+  * makefsdata: added option "-ssi:<filename>" to control SSI tag checking/insertion
+    through a list of filenames, not by checking the file extension at runtime
+
+  2017-11-20: Joel Cunningham
+  * netconn: add LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE to use external DNS resolver (patch #9427)
+
+  2017-11-14: Joel Cunningham
+  * netifapi: Add thread safe ARP cache APIs (task #14724)
+
+  2017-11-06: Axel Lin
+  * TCP: kill existing connections with a LOWER priority than the one currently being opened.
+    Previous implementations also kill existing connections of the SAME priority.
+
+  2017-09-21: Kalle Olavi Niemitalo
+  * sockets: add poll() implementation (patch #9450)
+
+  2017-09-10: Joel Cunningham
+  * sockets: add readv() implementation (task #14610)
+
+  2017-08-04: Simon Goldschmidt
+  * Clean up DHCP a bit: no need keep msg_out and msg_in as members in struct
+    dhcp - they are used in a call stack only (p_out and options_out_len as well)
+
+  2017-08-04: Simon Goldschmidt
+  * pbuf: split pbuf_header(s16_t) into pbuf_add_header(size_t) and
+    pbuf_remove_header(size_t)
+
+  2017-07-20: Douglas
+  * sys: deprecate sys_arch_sem_wait and sys_arch_mbox_fetch returning the
+    time waited rather they are now defined to return != SYS_ARCH_TIMEOUT
+    on success.
+
+  2017-07-03: Jakub Schmidtke
+  * tcp: added support for sending TCP SACKs
+
+  2017-06-20: Joel Cunningham
+  * netconn/netdb: added core locking support to netconn_gethostbyname (task #14523)
+
+  2017-04-25: Simon Goldschmidt
+  * dhcp: added two hooks for adding and parsing user defined DHCP options
+
+  2017-04-25: Joel Cunningham
+  * sockets: added recvmsg for UDP (together with CMSG and IP_PKTINFO) (task #14247)
+
+  2017-04-20: Joel Cunningham
+  * tcp: added Appropriate Byte Counting support (task #14128)
+
+  2017-04-11: Simon Goldschmidt
+  * netconn/sockets: remove fatal error handling, fix asynchronous error handling,
+    ensure data before RST can be received
+
+  2017-03-30: Simon Goldschmidt
+  * added "application layered TCP" connection API (altcp) for seamless integration
+    of TLS or proxy connections
+
+  2017-03-09: Simon Goldschmidt
+  * sockets: add recvmsg for TCP
+
+  2017-03-02: Joel Cunningham
+  * netconn/sockets: vectorize netconn_write for TCP, treating a vectored I/O write
+    atomically in regards to TCP segmentation (patch #8882)
+
+  2017-03-02: Simon Goldschmidt
+  * netconn: added nonblocking accept/recv to netconn API (task #14396)
+
+  2017-02-28: Simon Goldschmidt
+  * Added LWIP_SINGLE_NETIF for small targets with only one netif
+
+  2017-02-10: David van Moolenbroek
+  * Implement UDP and RAW multicast support for IPv6 (core API, not netconn/sockets)
+
+  2017-02-04: David van Moolenbroek
+  * IPv6 scopes support
+
+  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
+    - Add raw_sendto_if_src()
+    - Support IP_HDRINCL socket option
+
+  ++ Bugfixes:
+
+  2018-06-19: Simon Goldschmidt
+  * tcp: fix RTO timer not working if link is down
+
+  2018-06-15: Sylvain Rochet
+  * ppp: multiple smaller bugfixes
+
+  2018-05-17: Simon Goldschmidt
+  * etharp: arp table can now be bigger than 127 entries
+
+  2018-04-25: Jens Nielsen
+  * tftp server: correctly handle retransmissions
+
+  2018-04-18: Simon Goldschmidt
+  sockets: fix race conditions when closing full-duplex sockets
+
+  2018-03-09: Simon Goldschmidt
+  * 6lowpan: fix to work against contiki; added ZigBee encapsulation netif for tests
+
+  2018-02-04: Simon Goldschmidt
+  * sockets: fix inconsistencies on close (inconsistent error codes, double FIN)
+
+  2018-01-05: Dirk Ziegelmeier
+  * Fix bug #52748: the bug in timeouts.c by reimplementing timer logic to use
+    absolute instead of relative timeout values
+
+  2017-12-31: Dirk Ziegelmeier
+  * Fix bug #52704: DHCP and bad OFFER: Stop timeout only if offer is accepted
+
+  2017-11-08: Joel Cunningham
+  * netif: ensure link and admin states are up in issue reports (bug #52353)
+
+  2017-09-12: David Lockyer
+  * select: allocate select_cb from memp for LWIP_MPU_COMPATIBLE = 1 (bug #51990)
+
+  2017-09-11: Simon Goldschmidt
+  * tcp_in.c: fix bug #51937 (leaking tcp_pcbs on passive close with unacked data)
+
+  2017-08-11: Joel Cunningham
+  * lwip_itoa: fix converting the number 0 (previously converted to '\0') (bug #51729)
+
+  2017-08-08: Dirk Ziegelmeier
+  * ip4_route_src: parameter order is reversed: ip4_route_src(dest, src) -> ip4_route_src(src, dest)
+    to make parameter order consistent with other ip*_route*() functions
+    Same also applies to LWIP_HOOK_IP4_ROUTE_SRC() parameter order.
+
+  2017-08-04: Joel Cunningham
+  * tcp: re-work persist timer to fully close window (details in bug #50837)
+
+  2017-07-26: Simon Goldschmidt
+  * snmp_msg.c: fix bug #51578 (SNMP failed to decode some values on non 32bit platforms)
+
+  2017-07-20: Simon Goldschmidt
+  * compatibility headers: moved from 'src/include/posix' to 'src/include/compat/posix',
+    'src/include/compat/stdc' etc.
+
+  2017-05-09: Joel Cunningham
+  * tcp: add zero-window probe timeout (bug #50837)
+
+  2017-04-11: Simon Goldschmidt
+  * sockets.c: task #14420 (Remove sys_sem_signal from inside SYS_ARCH_PROTECT
+    crit section) done for LWIP_TCPIP_CORE_LOCKING==1
+
+  2017-02-24: Simon Goldschmidt
+  * sockets.c: fixed close race conditions in lwip_select (for LWIP_NETCONN_FULLDUPLEX)
+
+  2017-02-24: Simon Goldschmidt
+  * sockets.c: fixed that select ignored invalid/not open sockets in the fd_sets (bug #50392)
+
+  2017-01-11: David van Moolenbroek
+  * Lots of IPv6 related fixes and improvements
+
 (STABLE-2.0.3)
 
   ++ Bugfixes:
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..f05c0f6
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,20 @@
+cmake_minimum_required(VERSION 3.7)
+
+project(lwIP)
+
+set(LWIP_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+include(src/Filelists.cmake)
+
+# 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}")
+set(CPACK_PACKAGE_VERSION_MINOR "${LWIP_VERSION_MINOR}")
+set(CPACK_PACKAGE_VERSION_PATCH "${LWIP_VERSION_REVISION}")
+set(CPACK_SOURCE_IGNORE_FILES "/build/;${CPACK_SOURCE_IGNORE_FILES};.git")
+set(CPACK_SOURCE_PACKAGE_FILE_NAME "lwip-${LWIP_VERSION_MAJOR}.${LWIP_VERSION_MINOR}.${LWIP_VERSION_REVISION}")
+include(CPack)
+
+# Target for package generation
+add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source)
+add_dependencies(dist lwipdocs)
diff --git a/FEATURES b/FEATURES
new file mode 100644
index 0000000..a50c5a5
--- /dev/null
+++ b/FEATURES
@@ -0,0 +1,11 @@
+lwIP is a small independent implementation of the TCP/IP protocol suite targeted at embedded systems.
+
+The focus of the lwIP TCP/IP implementation is to reduce resource 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.
+
+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)
+- 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)
+- Addon applications: HTTP server (HTTPS via altcp), HTTP(S) client (since v2.1.0), SNTP client, SMTP client (SMTPS via altcp), ping, NetBIOS nameserver, mDNS responder, MQTT client (TLS support since v2.1.0), TFTP server, iPerf2 counterpart
diff --git a/README b/README
index 0884d27..b95f155 100644
--- a/README
+++ b/README
@@ -1,15 +1,15 @@
 INTRODUCTION
 
-lwIP is a small independent implementation of the TCP/IP protocol
-suite that has been developed by Adam Dunkels at the Computer and
-Networks Architectures (CNA) lab at the Swedish Institute of Computer
-Science (SICS).
+lwIP is a small independent implementation of the TCP/IP protocol suite.
 
 The focus of the lwIP TCP/IP implementation is to reduce the RAM usage
 while still having a full scale TCP. This making lwIP suitable for use
 in embedded systems with tens of kilobytes of free RAM and room for
 around 40 kilobytes of code ROM.
 
+lwIP was originally developed by Adam Dunkels at the Computer and Networks
+Architectures (CNA) lab at the Swedish Institute of Computer Science (SICS)
+and is now developed and maintained by a worldwide network of developers.
 
 FEATURES
 
@@ -22,22 +22,28 @@
   * 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
   * UDP (User Datagram Protocol) including experimental UDP-lite extensions
   * TCP (Transmission Control Protocol) with congestion control, RTT estimation
-    and fast recovery/fast retransmit
+    fast recovery/fast retransmit and sending SACKs
   * raw/native API for enhanced performance
   * Optional Berkeley-like socket API
-  * DNS (Domain names resolver)
+  * TLS: optional layered TCP ("altcp") for nearly transparent TLS for any
+    TCP-based protocol (ported to mbedTLS) (see changelog for more info)
+  * PPPoS and PPPoE (Point-to-point protocol over Serial/Ethernet)
+  * DNS (Domain name resolver incl. mDNS)
+  * 6LoWPAN (via IEEE 802.15.4, BLE or ZEP)
 
 
 APPLICATIONS
 
-  * HTTP server with SSI and CGI
-  * SNMPv2c agent with MIB compiler (Simple Network Management Protocol)
+  * HTTP server with SSI and CGI (HTTPS via altcp)
+  * SNMPv2c agent with MIB compiler (Simple Network Management Protocol), v3 via altcp
   * SNTP (Simple network time protocol)
   * NetBIOS name service responder
   * MDNS (Multicast DNS) responder
   * iPerf server implementation
+  * MQTT client (TLS support via altcp)
 
 
 LICENSE
diff --git a/README.md b/README.md
index a0ac608..4c406d1 100644
--- a/README.md
+++ b/README.md
@@ -42,6 +42,7 @@
 LwIP | HAL |
 ---------- | ---------- |
 Tag v2.0.3 | Tag v1.1.4 ([stm32f1xx_hal_driver](https://github.com/STMicroelectronics/stm32f1xx_hal_driver))<br>Tag v1.2.4 ([stm32f2xx_hal_driver](https://github.com/STMicroelectronics/stm32f2xx_hal_driver))<br>
+Tag v2.1.2 | Tag v1.7.8 ([(stm32f4xx_hal_driver)](https://github.com/STMicroelectronics/stm32f4xx_hal_driver))<br>Tag v1.2.8 ([stm32f7xx_hal_driver](https://github.com/STMicroelectronics/stm32f7xx_hal_driver))<br>Tag v1.9.0 ([stm32h7xx_hal_driver](https://github.com/STMicroelectronics/stm32h7xx_hal_driver))<br>
 
 ## Troubleshooting
 
diff --git a/UPGRADING b/UPGRADING
index 60a0438..21ad8cc 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -8,6 +8,41 @@
 
   * [Enter new changes just after this line - do not remove this line]
 
+(2.1.0)
+
+  ++ Application changes:
+
+  * Use the new altcp API for seamless TLS integration into existing TCP applications (see changelog)
+  * TCP only kills existing connections with a LOWER priority than the one currently being opened.
+    Previous implementations also kill existing connections of the SAME priority.
+  * ip4_route_src: parameter order is reversed: ip4_route_src(dest, src) -> ip4_route_src(src, dest)
+    to make parameter order consistent with other ip*_route*() functions.
+    Same also applies to LWIP_HOOK_IP4_ROUTE_SRC() parameter order.
+  * pbuf API: pbuf->type (an u8_t holding the enum 'pbuf_type') has changed to only hold a
+    description of the pbuf (e.g. data following pbuf struct, data volatile, allocation
+    source heap/pool/etc.). As a consequence, applications can't test pbuf->type any more.
+    Use pbuf_match_type(pbuf, type) instead.
+  * socket API: according to the standard, SO_ERROR now only returns asynchronous errors.
+    All other/normal/synchronous errors are (and always were) available via 'errno'.
+    LWIP_SOCKET_SET_ERRNO has been removed - 'errno' is always set - and required!
+  * httpd LWIP_HTTPD_CGI_SSI: httpd_cgi_handler() has an additional parameter "struct fs_file *"
+
+  ++ Port changes:
+
+  * tcpip_trycallback() was renamed to tcpip_callbackmsg_trycallback() to avoid confusion
+    with tcpip_try_callback()
+  * compatibility headers: moved from 'src/include/posix' to 'src/include/compat/posix',
+    'src/include/compat/stdc' etc.
+  * The IPv6 implementation now supports address scopes. (See LWIP_IPV6_SCOPES documentation
+    and ip6_zone.h for more documentation)
+  * LWIP_HOOK_DHCP_APPEND_OPTIONS() has changed, see description in opt.h (options_out_len is not
+    available in struct dhcp any more)
+  * Added debug helper asserts to ensure threading/locking requirements are met (define
+    LWIP_MARK_TCPIP_THREAD() and LWIP_ASSERT_CORE_LOCKED()).
+  * Added sys_mbox_trypost_fromisr() and tcpip_callbackmsg_trycallback_fromisr()
+    These can be used to post preallocated messages from an ISR to the tcpip thread
+    (e.g. when using FreeRTOS)
+
 (2.0.2)
 
   ++ Application changes:
diff --git a/doc/NO_SYS_SampleCode.c b/doc/NO_SYS_SampleCode.c
index f0af660..71f1c9f 100644
--- a/doc/NO_SYS_SampleCode.c
+++ b/doc/NO_SYS_SampleCode.c
@@ -56,8 +56,8 @@
   netif->flags      = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP | NETIF_FLAG_MLD6;
   MIB2_INIT_NETIF(netif, snmp_ifType_ethernet_csmacd, 100000000);
 
-  SMEMCPY(netif->hwaddr, your_mac_address_goes_here, sizeof(netif->hwaddr));
-  netif->hwaddr_len = sizeof(netif->hwaddr);
+  SMEMCPY(netif->hwaddr, your_mac_address_goes_here, ETH_HWADDR_LEN);
+  netif->hwaddr_len = ETH_HWADDR_LEN;
 
   return ERR_OK;
 }
diff --git a/doc/ZeroCopyRx.c b/doc/ZeroCopyRx.c
new file mode 100644
index 0000000..0e8219b
--- /dev/null
+++ b/doc/ZeroCopyRx.c
@@ -0,0 +1,45 @@
+typedef struct my_custom_pbuf
+{
+   struct pbuf_custom p;
+   void* dma_descriptor;
+} my_custom_pbuf_t;
+
+LWIP_MEMPOOL_DECLARE(RX_POOL, 10, sizeof(my_custom_pbuf_t), "Zero-copy RX PBUF pool");
+
+void my_pbuf_free_custom(void* p)
+{
+  SYS_ARCH_DECL_PROTECT(old_level);
+
+  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_cpu_cache(p->payload, p->tot_len);
+
+  SYS_ARCH_PROTECT(old_level);
+  free_rx_dma_descriptor(my_pbuf->dma_descriptor);
+  LWIP_MEMPOOL_FREE(RX_POOL, my_pbuf);
+  SYS_ARCH_UNPROTECT(old_level);
+}
+
+void eth_rx_irq()
+{
+  dma_descriptor*   dma_desc = get_RX_DMA_descriptor_from_ethernet();
+  my_custom_pbuf_t* my_pbuf  = (my_custom_pbuf_t*)LWIP_MEMPOOL_ALLOC(RX_POOL);
+
+  my_pbuf->p.custom_free_function = my_pbuf_free_custom;
+  my_pbuf->dma_descriptor         = dma_desc;
+
+  invalidate_cpu_cache(dma_desc->rx_data, dma_desc->rx_length);
+  
+  struct pbuf* p = pbuf_alloced_custom(PBUF_RAW,
+     dma_desc->rx_length,
+     PBUF_REF,
+     &my_pbuf->p,
+     dma_desc->rx_data,
+     dma_desc->max_buffer_size);
+
+  if(netif->input(p, netif) != ERR_OK) {
+    pbuf_free(p);
+  }
+}
diff --git a/doc/doxygen/lwip.Doxyfile b/doc/doxygen/lwip.Doxyfile
index 95fa363..c2039e5 100644
--- a/doc/doxygen/lwip.Doxyfile
+++ b/doc/doxygen/lwip.Doxyfile
@@ -1,4 +1,4 @@
-# Doxyfile 1.8.11
+# Doxyfile 1.8.13
 
 # This file describes the settings to be used by the documentation system
 # doxygen (www.doxygen.org) for a project.
@@ -38,7 +38,7 @@
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = "2.0.3"
+PROJECT_NUMBER         = "2.1.2"
 
 # 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
@@ -58,7 +58,7 @@
 # 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
@@ -303,6 +303,15 @@
 
 MARKDOWN_SUPPORT       = YES
 
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# 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.
+# 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
 # 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
@@ -781,7 +790,8 @@
 # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
 # Note: If this tag is empty the current directory is searched.
 
-INPUT                  = main_page.h ../../src
+INPUT                  = main_page.h \
+                         ../../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
@@ -803,8 +813,8 @@
 # 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, *.f, *.for, *.tcl,
-# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js.
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
+# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
 
 FILE_PATTERNS          = *.c \
                          *.cc \
@@ -875,7 +885,8 @@
 # that contain example code fragments that are included (see the \include
 # command).
 
-EXAMPLE_PATH           = ../ ../../
+EXAMPLE_PATH           = ../ \
+                         ../../
 
 # If the value of the EXAMPLE_PATH tag contains directories, you can use the
 # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
@@ -2077,16 +2088,26 @@
                          LWIP_ICMP=1 \
                          LWIP_RAW=1 \
                          LWIP_DHCP=1 \
+                         LWIP_IPV6_DHCP6=1 \
                          LWIP_UDPLITE=1 \
                          LWIP_UDP=1 \
                          LWIP_IGMP=1 \
                          LWIP_TCP=1 \
+                         LWIP_ALTCP=1 \
+                         LWIP_ALTCP_TLS=1 \
+                         LWIP_IPV6_SCOPES=1 \
                          TCP_LISTEN_BACKLOG=1 \
                          LWIP_SNMP=1 \
                          SNMP_USE_NETCONN=1 \
                          SNMP_USE_RAW=1 \
                          MIB2_STATS=1 \
                          LWIP_MDNS_RESPONDER=1 \
+                         HTTPD_ENABLE_HTTPS=1 \
+                         LWIP_HTTPD_CGI=1 \
+                         LWIP_HTTPD_SSI=1 \
+                         LWIP_HTTPD_SSI_RAW=1 \
+                         LWIP_HTTPD_SUPPORT_POST=1 \
+                         LWIP_HTTPD_POST_MANUAL_WND=1 \
                          MEMP_OVERFLOW_CHECK=0 \
                          MEMP_SANITY_CHECK=1 \
                          LWIP_ARP=1 \
@@ -2097,6 +2118,7 @@
                          LWIP_NETIF_STATUS_CALLBACK=1 \
                          LWIP_NETIF_REMOVE_CALLBACK=1 \
                          LWIP_NETIF_LINK_CALLBACK=1 \
+                         LWIP_NETIF_EXT_STATUS_CALLBACK=1 \
                          LWIP_NUM_NETIF_CLIENT_DATA=1 \
                          ENABLE_LOOPBACK=1 \
                          LWIP_AUTOIP=1 \
@@ -2115,8 +2137,9 @@
                          SO_REUSE=1 \
                          SO_REUSE_RXTOALL=1 \
                          LWIP_HAVE_SLIPIF=1 \
-                         LWIP_6LOWPAN=1
- 
+                         SLIP_RX_FROM_ISR=1 \
+                         LWIP_TCP_PCB_NUM_EXT_ARGS=1
+
 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
 # tag can be used to specify a list of macro names that should be expanded. The
 # macro definition that is found in the sources will be used. Use the PREDEFINED
@@ -2228,7 +2251,7 @@
 # http://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: YES.
+# The default value is: NO.
 
 HAVE_DOT               = NO
 
@@ -2384,9 +2407,7 @@
 # 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).
-# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
-# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
-# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo,
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
 # png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
 # png:gdiplus:gdiplus.
 # The default value is: png.
@@ -2439,6 +2460,11 @@
 
 PLANTUML_JAR_PATH      =
 
+# 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.
 
diff --git a/doc/doxygen/lwip.Doxyfile.cmake.in b/doc/doxygen/lwip.Doxyfile.cmake.in
new file mode 100644
index 0000000..063c288
--- /dev/null
+++ b/doc/doxygen/lwip.Doxyfile.cmake.in
@@ -0,0 +1,2531 @@
+# Doxyfile 1.8.13
+
+# This file describes the settings to be used by the documentation system
+# 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.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# 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.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+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         = "${LWIP_VERSION_STRING}"
+
+# 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
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          = "Lightweight IP stack"
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO           =
+
+# 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
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = "${DOXYGEN_OUTPUT_DIR}"
+
+# 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
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# 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.
+# The default value is: NO.
+
+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
+# 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.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# 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
+# 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
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# 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       " \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         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
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# 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.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# 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.
+
+FULL_PATH_NAMES        = YES
+
+# 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
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# 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        = ../../
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# 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
+# 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
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = 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.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# 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
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# 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
+# 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.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# 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.
+
+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
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = 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.
+#
+# 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.
+
+EXTENSION_MAPPING      =
+
+# 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
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# 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.
+# 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
+# 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.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# 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
+# 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.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+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.
+# 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.
+# 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.
+# The default value is: YES.
+
+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
+# 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.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# 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
+# 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
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# 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.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = 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.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# 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.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = YES
+
+# 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.
+# 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.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# 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.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+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.
+
+CASE_SENSE_NAMES       = NO
+
+# 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
+# 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
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# 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.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# 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
+# 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.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# 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.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# 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.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# 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
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = NO
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+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
+# 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
+# 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
+# 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
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of 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            =
+
+# 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.
+# 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         =
+
+#---------------------------------------------------------------------------
+# 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
+# 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
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# 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.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = 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.
+# 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.
+# The default value is: NO.
+
+WARN_AS_ERROR          = NO
+
+# 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)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text       "
+
+# 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).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = main_page.h \
+                         ../../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
+# 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.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# 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.
+#
+# 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.
+
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.idl \
+                         *.odl \
+                         *.inc \
+                         *.m \
+                         *.mm \
+                         *.dox
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# 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
+# run.
+
+EXCLUDE                = ../../src/include/netif/ppp/polarssl
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (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/*
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           = ../ \
+                         ../../
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             =
+
+# 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:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# 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 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.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# 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.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# 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.
+
+USE_MDFILE_AS_MAINPAGE = main_page.h
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums 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
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+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.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+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
+# 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
+# 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
+# - 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
+# 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
+# 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.
+# The default value is: YES.
+
+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.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# 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
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+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.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs 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: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+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
+# 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.
+# 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
+# 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
+# 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
+# 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.
+# 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.
+# See also section "Doxygen usage" for information on how to generate the style
+# 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.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# 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.
+# 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.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# 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
+# 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.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+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
+# 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.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+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.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = NO
+
+# 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
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# 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
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# 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
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name 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.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# 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.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# 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.
+#
+# 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
+# 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
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               = lwip.chm
+
+# 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.
+# 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).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = NO
+
+# 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
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# 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).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# 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).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# 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).
+# 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).
+# 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).
+# 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.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# 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.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = YES
+
+# 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.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# 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.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# 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
+
+# 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
+# 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.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://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
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# 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.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# 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.
+# 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
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# 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
+# 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
+# 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
+# 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
+# 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
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+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
+# 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
+# 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.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# 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
+# search results.
+#
+# 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.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# 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.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# 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
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs 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: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# 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.
+# 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.
+# 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
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+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.
+#
+# 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.
+# 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
+# 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!
+# 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
+# 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).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_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_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+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.
+# 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 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
+# 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.
+# 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.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# 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.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs 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: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = 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.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+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.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# 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.
+# 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.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# 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.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# 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.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages 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: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# 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.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# 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.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages 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: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+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.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# 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.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# 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.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# 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
+# 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.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# 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.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           = ../../src/include
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  = *.h
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             = __DOXYGEN__=1 \
+                         NO_SYS=0 \
+                         SYS_LIGHTWEIGHT_PROT=1 \
+                         LWIP_TCPIP_CORE_LOCKING=1 \
+                         LWIP_IPV4=1 \
+                         LWIP_IPV6=1 \
+                         LWIP_ICMP=1 \
+                         LWIP_RAW=1 \
+                         LWIP_DHCP=1 \
+                         LWIP_IPV6_DHCP6=1 \
+                         LWIP_UDPLITE=1 \
+                         LWIP_UDP=1 \
+                         LWIP_IGMP=1 \
+                         LWIP_TCP=1 \
+                         LWIP_ALTCP=1 \
+                         LWIP_ALTCP_TLS=1 \
+                         LWIP_IPV6_SCOPES=1 \
+                         TCP_LISTEN_BACKLOG=1 \
+                         LWIP_SNMP=1 \
+                         SNMP_USE_NETCONN=1 \
+                         SNMP_USE_RAW=1 \
+                         MIB2_STATS=1 \
+                         LWIP_MDNS_RESPONDER=1 \
+                         HTTPD_ENABLE_HTTPS=1 \
+                         LWIP_HTTPD_CGI=1 \
+                         LWIP_HTTPD_SSI=1 \
+                         LWIP_HTTPD_SSI_RAW=1 \
+                         LWIP_HTTPD_SUPPORT_POST=1 \
+                         LWIP_HTTPD_POST_MANUAL_WND=1 \
+                         MEMP_OVERFLOW_CHECK=0 \
+                         MEMP_SANITY_CHECK=1 \
+                         LWIP_ARP=1 \
+                         LWIP_HAVE_LOOPIF=1 \
+                         LWIP_NETIF_HOSTNAME=1 \
+                         LWIP_NETIF_API=1 \
+                         LWIP_NETIF_CALLBACK=1 \
+                         LWIP_NETIF_STATUS_CALLBACK=1 \
+                         LWIP_NETIF_REMOVE_CALLBACK=1 \
+                         LWIP_NETIF_LINK_CALLBACK=1 \
+                         LWIP_NETIF_EXT_STATUS_CALLBACK=1 \
+                         LWIP_NUM_NETIF_CLIENT_DATA=1 \
+                         ENABLE_LOOPBACK=1 \
+                         LWIP_AUTOIP=1 \
+                         ARP_QUEUEING=1 \
+                         LWIP_STATS=1 \
+                         MEM_USE_POOLS=0 \
+                         LWIP_DNS=1 \
+                         LWIP_SOCKET=1 \
+                         LWIP_NETCONN=1 \
+                         IP_SOF_BROADCAST=1 \
+                         IP_SOF_BROADCAST_RECV=1 \
+                         LWIP_NETIF_API=1 \
+                         LWIP_SO_SNDTIMEO=1 \
+                         LWIP_SO_RCVBUF=1 \
+                         LWIP_SO_LINGER=1 \
+                         SO_REUSE=1 \
+                         SO_REUSE_RXTOALL=1 \
+                         LWIP_HAVE_SLIPIF=1 \
+                         SLIP_RX_FROM_ISR=1 \
+                         LWIP_TCP_PCB_NUM_EXT_ARGS=1
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# 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
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# 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
+# 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
+# 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.
+# 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
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+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
+#---------------------------------------------------------------------------
+
+# 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
+# available from the path. This tool is part of Graphviz (see:
+# http://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
+# 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.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+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.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# 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.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 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.
+# 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.
+# 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
+# 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.
+# 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.
+# 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
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# 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.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+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
+# direct and indirect include dependencies of the file with other documented
+# files.
+# 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
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# 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
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = NO
+
+# 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.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = NO
+
+# 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
+# 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.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# 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/)).
+# 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).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+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).
+
+MSCFILE_DIRS           =
+
+# 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
+# command).
+
+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.
+
+PLANTUML_JAR_PATH      =
+
+# 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.
+
+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
+# 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.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+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
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = NO
+
+# 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.
+# 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
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git a/doc/doxygen/main_page.h b/doc/doxygen/main_page.h
index d35d16e..89d86f8 100644
--- a/doc/doxygen/main_page.h
+++ b/doc/doxygen/main_page.h
@@ -1,17 +1,90 @@
-/**
+/**
  * @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
+ * code. The TCP/IP code and the application program both run in the same
+ * 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.
  *
- * @defgroup callbackstyle_api Callback-style APIs
+ * @defgroup callbackstyle_api "raw" APIs
+ * @ingroup api
  * Non thread-safe APIs, callback style for maximum performance and minimum
  * memory footprint.
+ * Program execution is driven by callbacks functions, which are then
+ * invoked by the lwIP core when activity related to that application
+ * occurs. A particular application may register to be notified via a
+ * callback function for events such as incoming data available, outgoing
+ * data sent, error notifications, poll timer expiration, connection
+ * closed, etc. An application can provide a callback function to perform
+ * processing for any or all of these events. Each callback is an ordinary
+ * C function that is called from within the TCP/IP code. Every callback
+ * function is passed the current TCP or UDP connection state as an
+ * argument. Also, in order to be able to keep program specific state,
+ * the callback functions are called with a program specified argument
+ * that is independent of the TCP/IP state.
+ * The raw API (sometimes called native API) is an event-driven API designed
+ * to be used without an operating system that implements zero-copy send and
+ * 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
  * from any thread except TCPIP thread.
+ * The sequential API provides a way for ordinary, sequential, programs
+ * to use the lwIP stack. It is quite similar to the BSD socket API. The
+ * model of execution is based on the blocking open-read-write-close
+ * 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 addons Addons
+ * @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
+ * 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
  */
@@ -28,6 +101,20 @@
 
 /**
  * @page changelog Changelog
+ *
+ * 2.1.0
+ * -----
+ * * Support TLS via new @ref altcp_api connection API (https, smtps, mqtt over TLS)
+ * * Switch to cmake as the main build system (Makefile file lists are still
+ *   maintained for now)
+ * * Improve IPv6 support: support address scopes, support stateless DHCPv6, bugfixes
+ * * Add debug helper asserts to ensure threading/locking requirements are met
+ * * 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"
  */
 
@@ -48,6 +135,8 @@
  * 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
  * -------------
@@ -91,6 +180,28 @@
  *    @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.
+ *
+ * Cache / DMA issues
+ * ==================
+ *
+ * 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
+ * DMA ethernet hardware for the next telegram to be received.
+ * See http://lists.nongnu.org/archive/html/lwip-devel/2017-12/msg00070.html
+ * 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.
+ *
+ * DMA-capable ethernet hardware and cacheline alignment
+ * -----------------------------------------------------
+ * Nice description about DMA capable hardware and buffer handling:
+ * http://www.pebblebay.com/a-guide-to-using-direct-memory-access-in-embedded-systems-part-two/
+ * Read especially sections "Cache coherency" and "Buffer alignment".
  */
 
 /**
@@ -101,6 +212,12 @@
  */
 
 /**
+ * @page zerocopyrx Zero-copy RX
+ * The following code is an example for zero-copy RX ethernet driver:
+ * @include ZeroCopyRx.c
+ */
+
+/**
  * @defgroup lwip_nosys Mainloop mode ("NO_SYS")
  * @ingroup lwip
  * Use this mode if you do not run an OS on your system. \#define NO_SYS to 1.
@@ -127,6 +244,160 @@
  */
 
 /**
- * @page raw_api lwIP API
- * @verbinclude "rawapi.txt"
+ * @page sys_init System initalization
+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).
+
+We can give you some idea on how to proceed when using the raw API.
+We assume a configuration using a single Ethernet netif and the
+UDP and TCP transport layers, IPv4 and the DHCP client.
+
+Call these functions in the order of appearance:
+
+- lwip_init(): Initialize the lwIP stack and all of its subsystems.
+
+- netif_add(struct netif *netif, ...):
+  Adds your network interface to the netif_list. Allocate a struct
+  netif and pass a pointer to this structure as the first argument.
+  Give pointers to cleared ip_addr structures when using DHCP,
+  or fill them with sane numbers otherwise. The state pointer may be NULL.
+
+  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];
+    }
+    init_my_eth_device();
+    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.
+
+- netif_set_link_up(struct netif *netif)
+  This is the hardware link state; e.g. whether cable is plugged for wired
+  Ethernet interface. This function must be called even if you don't know
+  the current state. Having link up and link down events is optional but
+  DHCP and IPv6 discover benefit well from those events.
+
+- netif_set_up(struct netif *netif)
+  This is the administrative (= software) state of the netif, when the
+  netif is fully configured this function must be called.
+
+- dhcp_start(struct netif *netif)
+  Creates a new DHCP client for this interface on the first call.
+  You can peek in the netif->dhcp struct for the actual DHCP status.
+
+- sys_check_timeouts()
+  When the system is running, you have to periodically call
+  sys_check_timeouts() which will handle all timers for all protocols in
+  the stack; add this to your main loop or equivalent.
+ */
+
+/**
+ * @page multithreading Multithreading
+ * lwIP started targeting single-threaded environments. When adding multi-
+ * threading support, instead of making the core thread-safe, another
+ * approach was chosen: there is one main thread running the lwIP core
+ * (also known as the "tcpip_thread"). When running in a multithreaded
+ * environment, raw API functions MUST only be called from the core thread
+ * since raw API functions are not protected from concurrent access (aside
+ * 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:
+ * - api.h
+ * - netbuf.h
+ * - netdb.h
+ * - netifapi.h
+ * - pppapi.h
+ * - sockets.h
+ * - sys.h
+ * 
+ * Additionaly, 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 
+ * 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. 
+ */
+
+/**
+ * @page optimization Optimization hints
+The first thing you want to optimize is the lwip_standard_checksum()
+routine from src/core/inet.c. You can override this standard
+function with the \#define LWIP_CHKSUM your_checksum_routine().
+
+There are C examples given in inet.c or you might want to
+craft an assembly function for this. RFC1071 is a good
+introduction to this subject.
+
+Other significant improvements can be made by supplying
+assembly or inline replacements for htons() and htonl()
+if you're using a little-endian architecture.
+\#define lwip_htons(x) your_htons()
+\#define lwip_htonl(x) your_htonl()
+If you \#define them to htons() and htonl(), you should
+\#define LWIP_DONT_PROVIDE_BYTEORDER_FUNCTIONS to prevent lwIP from
+defining htonx / ntohx compatibility macros.
+
+Check your network interface driver if it reads at
+a higher speed than the maximum wire-speed. If the
+hardware isn't serviced frequently and fast enough
+buffer overflows are likely to occur.
+
+E.g. when using the cs8900 driver, call cs8900if_service(ethif)
+as frequently as possible. When using an RTOS let the cs8900 interrupt
+wake a high priority task that services your driver using a binary
+semaphore or event flag. Some drivers might allow additional tuning
+to match your application and network.
+
+For a production release it is recommended to set LWIP_STATS to 0.
+Note that speed performance isn't influenced much by simply setting
+high values to the memory options.
  */
diff --git a/doc/doxygen/output/html/altcp_8c.html b/doc/doxygen/output/html/altcp_8c.html
new file mode 100644
index 0000000..d127062
--- /dev/null
+++ b/doc/doxygen/output/html/altcp_8c.html
@@ -0,0 +1,200 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/altcp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('altcp_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">altcp.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 &quot;<a class="el" href="altcp_8h.html">lwip/altcp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="altcp__priv_8h.html">lwip/priv/altcp_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="altcp__tcp_8h.html">lwip/altcp_tcp.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="mem_8h.html">lwip/mem.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6a99f8757c18fbc9b9f30925afbcf4c2"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp_8c.html#a6a99f8757c18fbc9b9f30925afbcf4c2">altcp_alloc</a> (void)</td></tr>
+<tr class="separator:a6a99f8757c18fbc9b9f30925afbcf4c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd7f6b6602e89cff51f8a8ea0315321d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp_8c.html#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:gaa51a47bcb334b188c82a1b99db49f1f1"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1">altcp_new_ip6</a> (<a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a> *allocator)</td></tr>
+<tr class="separator:gaa51a47bcb334b188c82a1b99db49f1f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga86843287b0ad0099c067817cfb7aa336"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga86843287b0ad0099c067817cfb7aa336">altcp_new</a> (<a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a> *allocator)</td></tr>
+<tr class="separator:ga86843287b0ad0099c067817cfb7aa336"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab631f6f92d7f6c58d9db27b7b415bc21"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21">altcp_new_ip_type</a> (<a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a> *allocator, u8_t ip_type)</td></tr>
+<tr class="separator:gab631f6f92d7f6c58d9db27b7b415bc21"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="memitem:ga7c4cd0b1179a53b1a223936ba2270bf9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9">altcp_accept</a> (struct altcp_pcb *conn, altcp_accept_fn <a class="el" href="group__socket.html#gade2b17671b5a4b18e941fbf7e1060310">accept</a>)</td></tr>
+<tr class="separator:ga7c4cd0b1179a53b1a223936ba2270bf9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7f89221f9d65036d890b1e5bd9192a71"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71">altcp_recv</a> (struct altcp_pcb *conn, altcp_recv_fn <a class="el" href="group__socket.html#gadd7ae45df7c005619eb1126542231e9b">recv</a>)</td></tr>
+<tr class="separator:ga7f89221f9d65036d890b1e5bd9192a71"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab2b228c77c827fb14bfc513171c79f47"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gab2b228c77c827fb14bfc513171c79f47">altcp_sent</a> (struct altcp_pcb *conn, altcp_sent_fn sent)</td></tr>
+<tr class="separator:gab2b228c77c827fb14bfc513171c79f47"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga269beeaf7d8264b6ff02333bcc7c7ab0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0">altcp_poll</a> (struct altcp_pcb *conn, altcp_poll_fn <a class="el" href="group__socket.html#ga80ae38841b0e64e60618cd8bf857f617">poll</a>, u8_t interval)</td></tr>
+<tr class="separator:ga269beeaf7d8264b6ff02333bcc7c7ab0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadc76a1f3b2448559dc87da1b33291644"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gadc76a1f3b2448559dc87da1b33291644">altcp_err</a> (struct altcp_pcb *conn, altcp_err_fn err)</td></tr>
+<tr class="separator:gadc76a1f3b2448559dc87da1b33291644"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac086951cbfedaed0c36c5fb26b44ef83"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83">altcp_recved</a> (struct altcp_pcb *conn, u16_t len)</td></tr>
+<tr class="separator:gac086951cbfedaed0c36c5fb26b44ef83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga485b248680f73b9876d8674029c5157c"><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.html#ga485b248680f73b9876d8674029c5157c">altcp_bind</a> (struct altcp_pcb *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, u16_t port)</td></tr>
+<tr class="separator:ga485b248680f73b9876d8674029c5157c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafaf1d533e4e89dc249a3f931afa93492"><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.html#gafaf1d533e4e89dc249a3f931afa93492">altcp_connect</a> (struct altcp_pcb *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, u16_t port, altcp_connected_fn connected)</td></tr>
+<tr class="separator:gafaf1d533e4e89dc249a3f931afa93492"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac69722b86b1198916f2527fb9f132c2b"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gac69722b86b1198916f2527fb9f132c2b">altcp_listen_with_backlog_and_err</a> (struct altcp_pcb *conn, u8_t backlog, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> *err)</td></tr>
+<tr class="separator:gac69722b86b1198916f2527fb9f132c2b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7f6fab99fed448385a76b4a5100796ab"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab">altcp_abort</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:ga7f6fab99fed448385a76b4a5100796ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4329798afdf3709c789a2ee060ee3993"><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.html#ga4329798afdf3709c789a2ee060ee3993">altcp_close</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:ga4329798afdf3709c789a2ee060ee3993"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0c3172d0bfe452599e242ea2e4692319"><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.html#ga0c3172d0bfe452599e242ea2e4692319">altcp_shutdown</a> (struct altcp_pcb *conn, int shut_rx, int shut_tx)</td></tr>
+<tr class="separator:ga0c3172d0bfe452599e242ea2e4692319"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaad9a38396b127cfd778e253f20a97b8d"><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.html#gaad9a38396b127cfd778e253f20a97b8d">altcp_write</a> (struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags)</td></tr>
+<tr class="separator:gaad9a38396b127cfd778e253f20a97b8d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5d2370d3b671377d7e2c98ce2dc3cfc6"><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.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6">altcp_output</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:ga5d2370d3b671377d7e2c98ce2dc3cfc6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae7cfc8bd8e45c517a706afd5857fda08"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08">altcp_mss</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:gae7cfc8bd8e45c517a706afd5857fda08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab295cba0c1ded90fe044a8c37387a12c"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c">altcp_sndbuf</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:gab295cba0c1ded90fe044a8c37387a12c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga516a1bfbf38fc47cfd47852715c505c5"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5">altcp_sndqueuelen</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:ga516a1bfbf38fc47cfd47852715c505c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5040b0a4646bca718d3611ba7fa558c5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5">altcp_setprio</a> (struct altcp_pcb *conn, u8_t prio)</td></tr>
+<tr class="separator:ga5040b0a4646bca718d3611ba7fa558c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a6a99f8757c18fbc9b9f30925afbcf4c2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6a99f8757c18fbc9b9f30925afbcf4c2">&#9670;&nbsp;</a></span>altcp_alloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_alloc </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>For altcp layer implementations only: allocate a new struct altcp_pcb from the pool and zero the memory </p>
+
+</div>
+</div>
+<a id="afd7f6b6602e89cff51f8a8ea0315321d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afd7f6b6602e89cff51f8a8ea0315321d">&#9670;&nbsp;</a></span>altcp_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void altcp_free </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>For altcp layer implementations only: return a struct altcp_pcb to the pool </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="altcp_8c.html">altcp.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/altcp_8c.js b/doc/doxygen/output/html/altcp_8c.js
new file mode 100644
index 0000000..22872df
--- /dev/null
+++ b/doc/doxygen/output/html/altcp_8c.js
@@ -0,0 +1,27 @@
+var altcp_8c =
+[
+    [ "altcp_abort", "group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab", null ],
+    [ "altcp_accept", "group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9", null ],
+    [ "altcp_alloc", "altcp_8c.html#a6a99f8757c18fbc9b9f30925afbcf4c2", null ],
+    [ "altcp_arg", "group__altcp.html#ga197a33af038556a04d8f27c7033d771f", null ],
+    [ "altcp_bind", "group__altcp.html#ga485b248680f73b9876d8674029c5157c", null ],
+    [ "altcp_close", "group__altcp.html#ga4329798afdf3709c789a2ee060ee3993", null ],
+    [ "altcp_connect", "group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492", null ],
+    [ "altcp_err", "group__altcp.html#gadc76a1f3b2448559dc87da1b33291644", null ],
+    [ "altcp_free", "altcp_8c.html#afd7f6b6602e89cff51f8a8ea0315321d", null ],
+    [ "altcp_listen_with_backlog_and_err", "group__altcp.html#gac69722b86b1198916f2527fb9f132c2b", null ],
+    [ "altcp_mss", "group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08", null ],
+    [ "altcp_new", "group__altcp.html#ga86843287b0ad0099c067817cfb7aa336", null ],
+    [ "altcp_new_ip6", "group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1", null ],
+    [ "altcp_new_ip_type", "group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21", null ],
+    [ "altcp_output", "group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6", null ],
+    [ "altcp_poll", "group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0", null ],
+    [ "altcp_recv", "group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71", null ],
+    [ "altcp_recved", "group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83", null ],
+    [ "altcp_sent", "group__altcp.html#gab2b228c77c827fb14bfc513171c79f47", null ],
+    [ "altcp_setprio", "group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5", null ],
+    [ "altcp_shutdown", "group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319", null ],
+    [ "altcp_sndbuf", "group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c", null ],
+    [ "altcp_sndqueuelen", "group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5", null ],
+    [ "altcp_write", "group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/altcp_8h.html b/doc/doxygen/output/html/altcp_8h.html
new file mode 100644
index 0000000..4e6af1e
--- /dev/null
+++ b/doc/doxygen/output/html/altcp_8h.html
@@ -0,0 +1,176 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/altcp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('altcp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">altcp.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="tcpbase_8h.html">lwip/tcpbase.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 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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga96c22e15230b5216b3a95dc9e2ca42c8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga96c22e15230b5216b3a95dc9e2ca42c8">altcp_listen</a>(conn)&#160;&#160;&#160;<a class="el" href="group__altcp.html#gac69722b86b1198916f2527fb9f132c2b">altcp_listen_with_backlog_and_err</a>(conn, <a class="el" href="group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf">TCP_DEFAULT_LISTEN_BACKLOG</a>, NULL)</td></tr>
+<tr class="separator:ga96c22e15230b5216b3a95dc9e2ca42c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga9ddf490e24b1472a96ab2b4cedd171f8"><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#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a></td></tr>
+<tr class="separator:ga9ddf490e24b1472a96ab2b4cedd171f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga86843287b0ad0099c067817cfb7aa336"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga86843287b0ad0099c067817cfb7aa336">altcp_new</a> (<a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a> *allocator)</td></tr>
+<tr class="separator:ga86843287b0ad0099c067817cfb7aa336"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa51a47bcb334b188c82a1b99db49f1f1"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1">altcp_new_ip6</a> (<a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a> *allocator)</td></tr>
+<tr class="separator:gaa51a47bcb334b188c82a1b99db49f1f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab631f6f92d7f6c58d9db27b7b415bc21"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21">altcp_new_ip_type</a> (<a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a> *allocator, u8_t ip_type)</td></tr>
+<tr class="separator:gab631f6f92d7f6c58d9db27b7b415bc21"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="memitem:ga7c4cd0b1179a53b1a223936ba2270bf9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9">altcp_accept</a> (struct altcp_pcb *conn, altcp_accept_fn <a class="el" href="group__socket.html#gade2b17671b5a4b18e941fbf7e1060310">accept</a>)</td></tr>
+<tr class="separator:ga7c4cd0b1179a53b1a223936ba2270bf9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7f89221f9d65036d890b1e5bd9192a71"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71">altcp_recv</a> (struct altcp_pcb *conn, altcp_recv_fn <a class="el" href="group__socket.html#gadd7ae45df7c005619eb1126542231e9b">recv</a>)</td></tr>
+<tr class="separator:ga7f89221f9d65036d890b1e5bd9192a71"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab2b228c77c827fb14bfc513171c79f47"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gab2b228c77c827fb14bfc513171c79f47">altcp_sent</a> (struct altcp_pcb *conn, altcp_sent_fn sent)</td></tr>
+<tr class="separator:gab2b228c77c827fb14bfc513171c79f47"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga269beeaf7d8264b6ff02333bcc7c7ab0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0">altcp_poll</a> (struct altcp_pcb *conn, altcp_poll_fn <a class="el" href="group__socket.html#ga80ae38841b0e64e60618cd8bf857f617">poll</a>, u8_t interval)</td></tr>
+<tr class="separator:ga269beeaf7d8264b6ff02333bcc7c7ab0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadc76a1f3b2448559dc87da1b33291644"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gadc76a1f3b2448559dc87da1b33291644">altcp_err</a> (struct altcp_pcb *conn, altcp_err_fn err)</td></tr>
+<tr class="separator:gadc76a1f3b2448559dc87da1b33291644"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac086951cbfedaed0c36c5fb26b44ef83"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83">altcp_recved</a> (struct altcp_pcb *conn, u16_t len)</td></tr>
+<tr class="separator:gac086951cbfedaed0c36c5fb26b44ef83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga485b248680f73b9876d8674029c5157c"><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.html#ga485b248680f73b9876d8674029c5157c">altcp_bind</a> (struct altcp_pcb *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, u16_t port)</td></tr>
+<tr class="separator:ga485b248680f73b9876d8674029c5157c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafaf1d533e4e89dc249a3f931afa93492"><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.html#gafaf1d533e4e89dc249a3f931afa93492">altcp_connect</a> (struct altcp_pcb *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, u16_t port, altcp_connected_fn connected)</td></tr>
+<tr class="separator:gafaf1d533e4e89dc249a3f931afa93492"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac69722b86b1198916f2527fb9f132c2b"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gac69722b86b1198916f2527fb9f132c2b">altcp_listen_with_backlog_and_err</a> (struct altcp_pcb *conn, u8_t backlog, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> *err)</td></tr>
+<tr class="separator:gac69722b86b1198916f2527fb9f132c2b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7f6fab99fed448385a76b4a5100796ab"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab">altcp_abort</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:ga7f6fab99fed448385a76b4a5100796ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4329798afdf3709c789a2ee060ee3993"><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.html#ga4329798afdf3709c789a2ee060ee3993">altcp_close</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:ga4329798afdf3709c789a2ee060ee3993"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0c3172d0bfe452599e242ea2e4692319"><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.html#ga0c3172d0bfe452599e242ea2e4692319">altcp_shutdown</a> (struct altcp_pcb *conn, int shut_rx, int shut_tx)</td></tr>
+<tr class="separator:ga0c3172d0bfe452599e242ea2e4692319"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaad9a38396b127cfd778e253f20a97b8d"><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.html#gaad9a38396b127cfd778e253f20a97b8d">altcp_write</a> (struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags)</td></tr>
+<tr class="separator:gaad9a38396b127cfd778e253f20a97b8d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5d2370d3b671377d7e2c98ce2dc3cfc6"><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.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6">altcp_output</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:ga5d2370d3b671377d7e2c98ce2dc3cfc6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae7cfc8bd8e45c517a706afd5857fda08"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08">altcp_mss</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:gae7cfc8bd8e45c517a706afd5857fda08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab295cba0c1ded90fe044a8c37387a12c"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c">altcp_sndbuf</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:gab295cba0c1ded90fe044a8c37387a12c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga516a1bfbf38fc47cfd47852715c505c5"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5">altcp_sndqueuelen</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:ga516a1bfbf38fc47cfd47852715c505c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5040b0a4646bca718d3611ba7fa558c5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5">altcp_setprio</a> (struct altcp_pcb *conn, u8_t prio)</td></tr>
+<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></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="altcp_8h.html">altcp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/altcp_8h.js b/doc/doxygen/output/html/altcp_8h.js
new file mode 100644
index 0000000..ddf6a83
--- /dev/null
+++ b/doc/doxygen/output/html/altcp_8h.js
@@ -0,0 +1,27 @@
+var altcp_8h =
+[
+    [ "altcp_listen", "group__altcp.html#ga96c22e15230b5216b3a95dc9e2ca42c8", null ],
+    [ "altcp_allocator_t", "group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8", null ],
+    [ "altcp_abort", "group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab", null ],
+    [ "altcp_accept", "group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9", null ],
+    [ "altcp_arg", "group__altcp.html#ga197a33af038556a04d8f27c7033d771f", null ],
+    [ "altcp_bind", "group__altcp.html#ga485b248680f73b9876d8674029c5157c", null ],
+    [ "altcp_close", "group__altcp.html#ga4329798afdf3709c789a2ee060ee3993", null ],
+    [ "altcp_connect", "group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492", null ],
+    [ "altcp_err", "group__altcp.html#gadc76a1f3b2448559dc87da1b33291644", null ],
+    [ "altcp_listen_with_backlog_and_err", "group__altcp.html#gac69722b86b1198916f2527fb9f132c2b", null ],
+    [ "altcp_mss", "group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08", null ],
+    [ "altcp_new", "group__altcp.html#ga86843287b0ad0099c067817cfb7aa336", null ],
+    [ "altcp_new_ip6", "group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1", null ],
+    [ "altcp_new_ip_type", "group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21", null ],
+    [ "altcp_output", "group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6", null ],
+    [ "altcp_poll", "group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0", null ],
+    [ "altcp_recv", "group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71", null ],
+    [ "altcp_recved", "group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83", null ],
+    [ "altcp_sent", "group__altcp.html#gab2b228c77c827fb14bfc513171c79f47", null ],
+    [ "altcp_setprio", "group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5", null ],
+    [ "altcp_shutdown", "group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319", null ],
+    [ "altcp_sndbuf", "group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c", null ],
+    [ "altcp_sndqueuelen", "group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5", null ],
+    [ "altcp_write", "group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/altcp__alloc_8c.html b/doc/doxygen/output/html/altcp__alloc_8c.html
new file mode 100644
index 0000000..fa5ad73
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__alloc_8c.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/altcp_alloc.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('altcp__alloc_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">altcp_alloc.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 &quot;<a class="el" href="altcp_8h.html">lwip/altcp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="altcp__tcp_8h.html">lwip/altcp_tcp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="altcp__tls_8h.html">lwip/altcp_tls.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="altcp__priv_8h.html">lwip/priv/altcp_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mem_8h.html">lwip/mem.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga028316a8257cf8dcace9cd063de79c0a"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a">altcp_tls_new</a> (struct altcp_tls_config *config, u8_t ip_type)</td></tr>
+<tr class="separator:ga028316a8257cf8dcace9cd063de79c0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga09e6ca8f144ee94ef21d7e5760aa4391"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391">altcp_tls_alloc</a> (void *arg, u8_t ip_type)</td></tr>
+<tr class="separator:ga09e6ca8f144ee94ef21d7e5760aa4391"><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>
+<p>This file contains allocation implementation that combine several layers. </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_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li><li class="navelem"><a class="el" href="altcp__alloc_8c.html">altcp_alloc.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/altcp__alloc_8c.js b/doc/doxygen/output/html/altcp__alloc_8c.js
new file mode 100644
index 0000000..d72903b
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__alloc_8c.js
@@ -0,0 +1,5 @@
+var altcp__alloc_8c =
+[
+    [ "altcp_tls_alloc", "group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391", null ],
+    [ "altcp_tls_new", "group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/altcp__priv_8h.html b/doc/doxygen/output/html/altcp__priv_8h.html
new file mode 100644
index 0000000..ec6a3a0
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__priv_8h.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/priv/altcp_priv.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('altcp__priv_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">altcp_priv.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="altcp_8h.html">lwip/altcp.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6a99f8757c18fbc9b9f30925afbcf4c2"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__priv_8h.html#a6a99f8757c18fbc9b9f30925afbcf4c2">altcp_alloc</a> (void)</td></tr>
+<tr class="separator:a6a99f8757c18fbc9b9f30925afbcf4c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd7f6b6602e89cff51f8a8ea0315321d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__priv_8h.html#afd7f6b6602e89cff51f8a8ea0315321d">altcp_free</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:afd7f6b6602e89cff51f8a8ea0315321d"><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><h2 class="groupheader">Function Documentation</h2>
+<a id="a6a99f8757c18fbc9b9f30925afbcf4c2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6a99f8757c18fbc9b9f30925afbcf4c2">&#9670;&nbsp;</a></span>altcp_alloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_alloc </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>For altcp layer implementations only: allocate a new struct altcp_pcb from the pool and zero the memory </p>
+
+</div>
+</div>
+<a id="afd7f6b6602e89cff51f8a8ea0315321d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afd7f6b6602e89cff51f8a8ea0315321d">&#9670;&nbsp;</a></span>altcp_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void altcp_free </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>For altcp layer implementations only: return a struct altcp_pcb to the pool </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="dir_460c501b2432fc107adcb38111835e48.html">priv</a></li><li class="navelem"><a class="el" href="altcp__priv_8h.html">altcp_priv.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/altcp__priv_8h.js b/doc/doxygen/output/html/altcp__priv_8h.js
new file mode 100644
index 0000000..6f7027b
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__priv_8h.js
@@ -0,0 +1,5 @@
+var altcp__priv_8h =
+[
+    [ "altcp_alloc", "altcp__priv_8h.html#a6a99f8757c18fbc9b9f30925afbcf4c2", null ],
+    [ "altcp_free", "altcp__priv_8h.html#afd7f6b6602e89cff51f8a8ea0315321d", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/altcp__proxyconnect_8c.html b/doc/doxygen/output/html/altcp__proxyconnect_8c.html
new file mode 100644
index 0000000..62a1f8e
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__proxyconnect_8c.html
@@ -0,0 +1,296 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/http/altcp_proxyconnect.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('altcp__proxyconnect_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">altcp_proxyconnect.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="altcp__proxyconnect_8h.html">lwip/apps/altcp_proxyconnect.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__priv_8h.html">lwip/priv/altcp_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="altcp__tcp_8h.html">lwip/altcp_tcp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="altcp__tls_8h.html">lwip/altcp_tls.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="init_8h.html">lwip/init.h</a>&quot;</code><br />
+<code>#include &lt;stdio.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a344227f22aa1b58f7ed737a2d4f4636f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__proxyconnect_8c.html#a344227f22aa1b58f7ed737a2d4f4636f">ALTCP_PROXYCONNECT_CLIENT_AGENT</a>&#160;&#160;&#160;&quot;lwIP/&quot; LWIP_VERSION_STRING &quot; (http://savannah.nongnu.org/projects/lwip)&quot;</td></tr>
+<tr class="separator:a344227f22aa1b58f7ed737a2d4f4636f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae774782064a92d0f58ce07b57a5360d1"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__proxyconnect_8c.html#ae774782064a92d0f58ce07b57a5360d1">altcp_proxyconnect_new</a> (struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb)</td></tr>
+<tr class="separator:ae774782064a92d0f58ce07b57a5360d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a24e122d2bc2c0b9f86074c1e8d5ccfe4"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__proxyconnect_8c.html#a24e122d2bc2c0b9f86074c1e8d5ccfe4">altcp_proxyconnect_new_tcp</a> (struct altcp_proxyconnect_config *config, u8_t ip_type)</td></tr>
+<tr class="separator:a24e122d2bc2c0b9f86074c1e8d5ccfe4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d3af45390467ceeaa064b7e28dd43a9"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__proxyconnect_8c.html#a3d3af45390467ceeaa064b7e28dd43a9">altcp_proxyconnect_alloc</a> (void *arg, u8_t ip_type)</td></tr>
+<tr class="separator:a3d3af45390467ceeaa064b7e28dd43a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ff49bcd035847a8915f18deef4172a9"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__proxyconnect_8c.html#a5ff49bcd035847a8915f18deef4172a9">altcp_proxyconnect_tls_alloc</a> (void *arg, u8_t ip_type)</td></tr>
+<tr class="separator:a5ff49bcd035847a8915f18deef4172a9"><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 that executes a proxy-connect.</p>
+<p>This file provides a starting layer that executes a proxy-connect e.g. to set up TLS connections through a http proxy. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a344227f22aa1b58f7ed737a2d4f4636f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a344227f22aa1b58f7ed737a2d4f4636f">&#9670;&nbsp;</a></span>ALTCP_PROXYCONNECT_CLIENT_AGENT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ALTCP_PROXYCONNECT_CLIENT_AGENT&#160;&#160;&#160;&quot;lwIP/&quot; LWIP_VERSION_STRING &quot; (http://savannah.nongnu.org/projects/lwip)&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This string is passed in the HTTP header as "User-Agent: " </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a3d3af45390467ceeaa064b7e28dd43a9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3d3af45390467ceeaa064b7e28dd43a9">&#9670;&nbsp;</a></span>altcp_proxyconnect_alloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_proxyconnect_alloc </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ip_type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocator function to allocate a proxy connect altcp pcb connecting directly via tcp to the proxy.</p>
+<p>The returned pcb is a chain: altcp_proxyconnect - altcp_tcp - tcp pcb</p>
+<p>This function is meant for use with <a class="el" href="group__altcp.html#ga86843287b0ad0099c067817cfb7aa336">altcp_new</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>struct altcp_proxyconnect_config that contains the proxy settings </td></tr>
+    <tr><td class="paramname">ip_type</td><td>IP type of the connection (<a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">lwip_ip_addr_type</a>) </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ae774782064a92d0f58ce07b57a5360d1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae774782064a92d0f58ce07b57a5360d1">&#9670;&nbsp;</a></span>altcp_proxyconnect_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_proxyconnect_new </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_proxyconnect_config *&#160;</td>
+          <td class="paramname"><em>config</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>inner_pcb</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocate a new altcp layer connecting through a proxy. This function gets the inner pcb passed.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">config</td><td>struct altcp_proxyconnect_config that contains the proxy settings </td></tr>
+    <tr><td class="paramname">inner_pcb</td><td>pcb that makes the connection to the proxy (i.e. tcp pcb) </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a24e122d2bc2c0b9f86074c1e8d5ccfe4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a24e122d2bc2c0b9f86074c1e8d5ccfe4">&#9670;&nbsp;</a></span>altcp_proxyconnect_new_tcp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_proxyconnect_new_tcp </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_proxyconnect_config *&#160;</td>
+          <td class="paramname"><em>config</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ip_type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocate a new altcp layer connecting through a proxy. This function allocates the inner pcb as tcp pcb, resulting in a direct tcp connection to the proxy.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">config</td><td>struct altcp_proxyconnect_config that contains the proxy settings </td></tr>
+    <tr><td class="paramname">ip_type</td><td>IP type of the connection (<a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">lwip_ip_addr_type</a>) </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5ff49bcd035847a8915f18deef4172a9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5ff49bcd035847a8915f18deef4172a9">&#9670;&nbsp;</a></span>altcp_proxyconnect_tls_alloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_proxyconnect_tls_alloc </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ip_type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocator function to allocate a TLS connection through a proxy.</p>
+<p>The returned pcb is a chain: altcp_tls - altcp_proxyconnect - altcp_tcp - tcp pcb</p>
+<p>This function is meant for use with <a class="el" href="group__altcp.html#ga86843287b0ad0099c067817cfb7aa336">altcp_new</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>struct altcp_proxyconnect_tls_config that contains the proxy settings and tls settings </td></tr>
+    <tr><td class="paramname">ip_type</td><td>IP type of the connection (<a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">lwip_ip_addr_type</a>) </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_34adf996f92d0eef72c45a7167a966e6.html">http</a></li><li class="navelem"><a class="el" href="altcp__proxyconnect_8c.html">altcp_proxyconnect.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/altcp__proxyconnect_8c.js b/doc/doxygen/output/html/altcp__proxyconnect_8c.js
new file mode 100644
index 0000000..fb48814
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__proxyconnect_8c.js
@@ -0,0 +1,8 @@
+var altcp__proxyconnect_8c =
+[
+    [ "ALTCP_PROXYCONNECT_CLIENT_AGENT", "altcp__proxyconnect_8c.html#a344227f22aa1b58f7ed737a2d4f4636f", null ],
+    [ "altcp_proxyconnect_alloc", "altcp__proxyconnect_8c.html#a3d3af45390467ceeaa064b7e28dd43a9", null ],
+    [ "altcp_proxyconnect_new", "altcp__proxyconnect_8c.html#ae774782064a92d0f58ce07b57a5360d1", null ],
+    [ "altcp_proxyconnect_new_tcp", "altcp__proxyconnect_8c.html#a24e122d2bc2c0b9f86074c1e8d5ccfe4", null ],
+    [ "altcp_proxyconnect_tls_alloc", "altcp__proxyconnect_8c.html#a5ff49bcd035847a8915f18deef4172a9", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/altcp__proxyconnect_8h.html b/doc/doxygen/output/html/altcp__proxyconnect_8h.html
new file mode 100644
index 0000000..a451cba
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__proxyconnect_8h.html
@@ -0,0 +1,268 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/altcp_proxyconnect.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('altcp__proxyconnect_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">altcp_proxyconnect.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="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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae774782064a92d0f58ce07b57a5360d1"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__proxyconnect_8h.html#ae774782064a92d0f58ce07b57a5360d1">altcp_proxyconnect_new</a> (struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb)</td></tr>
+<tr class="separator:ae774782064a92d0f58ce07b57a5360d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a24e122d2bc2c0b9f86074c1e8d5ccfe4"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__proxyconnect_8h.html#a24e122d2bc2c0b9f86074c1e8d5ccfe4">altcp_proxyconnect_new_tcp</a> (struct altcp_proxyconnect_config *config, u8_t ip_type)</td></tr>
+<tr class="separator:a24e122d2bc2c0b9f86074c1e8d5ccfe4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d3af45390467ceeaa064b7e28dd43a9"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__proxyconnect_8h.html#a3d3af45390467ceeaa064b7e28dd43a9">altcp_proxyconnect_alloc</a> (void *arg, u8_t ip_type)</td></tr>
+<tr class="separator:a3d3af45390467ceeaa064b7e28dd43a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ff49bcd035847a8915f18deef4172a9"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__proxyconnect_8h.html#a5ff49bcd035847a8915f18deef4172a9">altcp_proxyconnect_tls_alloc</a> (void *arg, u8_t ip_type)</td></tr>
+<tr class="separator:a5ff49bcd035847a8915f18deef4172a9"><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 that executes a proxy-connect.</p>
+<p>This file provides a starting layer that executes a proxy-connect e.g. to set up TLS connections through a http proxy. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a3d3af45390467ceeaa064b7e28dd43a9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3d3af45390467ceeaa064b7e28dd43a9">&#9670;&nbsp;</a></span>altcp_proxyconnect_alloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_proxyconnect_alloc </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ip_type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocator function to allocate a proxy connect altcp pcb connecting directly via tcp to the proxy.</p>
+<p>The returned pcb is a chain: altcp_proxyconnect - altcp_tcp - tcp pcb</p>
+<p>This function is meant for use with <a class="el" href="group__altcp.html#ga86843287b0ad0099c067817cfb7aa336">altcp_new</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>struct altcp_proxyconnect_config that contains the proxy settings </td></tr>
+    <tr><td class="paramname">ip_type</td><td>IP type of the connection (<a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">lwip_ip_addr_type</a>) </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ae774782064a92d0f58ce07b57a5360d1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae774782064a92d0f58ce07b57a5360d1">&#9670;&nbsp;</a></span>altcp_proxyconnect_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_proxyconnect_new </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_proxyconnect_config *&#160;</td>
+          <td class="paramname"><em>config</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>inner_pcb</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocate a new altcp layer connecting through a proxy. This function gets the inner pcb passed.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">config</td><td>struct altcp_proxyconnect_config that contains the proxy settings </td></tr>
+    <tr><td class="paramname">inner_pcb</td><td>pcb that makes the connection to the proxy (i.e. tcp pcb) </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a24e122d2bc2c0b9f86074c1e8d5ccfe4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a24e122d2bc2c0b9f86074c1e8d5ccfe4">&#9670;&nbsp;</a></span>altcp_proxyconnect_new_tcp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_proxyconnect_new_tcp </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_proxyconnect_config *&#160;</td>
+          <td class="paramname"><em>config</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ip_type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocate a new altcp layer connecting through a proxy. This function allocates the inner pcb as tcp pcb, resulting in a direct tcp connection to the proxy.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">config</td><td>struct altcp_proxyconnect_config that contains the proxy settings </td></tr>
+    <tr><td class="paramname">ip_type</td><td>IP type of the connection (<a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">lwip_ip_addr_type</a>) </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5ff49bcd035847a8915f18deef4172a9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5ff49bcd035847a8915f18deef4172a9">&#9670;&nbsp;</a></span>altcp_proxyconnect_tls_alloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_proxyconnect_tls_alloc </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ip_type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocator function to allocate a TLS connection through a proxy.</p>
+<p>The returned pcb is a chain: altcp_tls - altcp_proxyconnect - altcp_tcp - tcp pcb</p>
+<p>This function is meant for use with <a class="el" href="group__altcp.html#ga86843287b0ad0099c067817cfb7aa336">altcp_new</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>struct altcp_proxyconnect_tls_config that contains the proxy settings and tls settings </td></tr>
+    <tr><td class="paramname">ip_type</td><td>IP type of the connection (<a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">lwip_ip_addr_type</a>) </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="altcp__proxyconnect_8h.html">altcp_proxyconnect.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/altcp__proxyconnect_8h.js b/doc/doxygen/output/html/altcp__proxyconnect_8h.js
new file mode 100644
index 0000000..4bf0b7e
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__proxyconnect_8h.js
@@ -0,0 +1,7 @@
+var altcp__proxyconnect_8h =
+[
+    [ "altcp_proxyconnect_alloc", "altcp__proxyconnect_8h.html#a3d3af45390467ceeaa064b7e28dd43a9", null ],
+    [ "altcp_proxyconnect_new", "altcp__proxyconnect_8h.html#ae774782064a92d0f58ce07b57a5360d1", null ],
+    [ "altcp_proxyconnect_new_tcp", "altcp__proxyconnect_8h.html#a24e122d2bc2c0b9f86074c1e8d5ccfe4", null ],
+    [ "altcp_proxyconnect_tls_alloc", "altcp__proxyconnect_8h.html#a5ff49bcd035847a8915f18deef4172a9", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/altcp__tcp_8c.html b/doc/doxygen/output/html/altcp__tcp_8c.html
new file mode 100644
index 0000000..60f6e40
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__tcp_8c.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/altcp_tcp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('altcp__tcp_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">altcp_tcp.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 &quot;<a class="el" href="altcp_8h.html">lwip/altcp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="altcp__tcp_8h.html">lwip/altcp_tcp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="altcp__priv_8h.html">lwip/priv/altcp_priv.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="mem_8h.html">lwip/mem.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a211215e43cb40bd204a20c34316b7caa"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__tcp_8c.html#a211215e43cb40bd204a20c34316b7caa">altcp_tcp_alloc</a> (void *arg, u8_t ip_type)</td></tr>
+<tr class="separator:a211215e43cb40bd204a20c34316b7caa"><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>
+<p>This file contains the base implementation calling into tcp. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a211215e43cb40bd204a20c34316b7caa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a211215e43cb40bd204a20c34316b7caa">&#9670;&nbsp;</a></span>altcp_tcp_alloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_tcp_alloc </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ip_type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>altcp_tcp allocator function fitting to <a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a> / <a class="el" href="group__altcp.html#ga86843287b0ad0099c067817cfb7aa336">altcp_new</a>.</p>
+<p>arg pointer is not used for TCP. </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="altcp__tcp_8c.html">altcp_tcp.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/altcp__tcp_8c.js b/doc/doxygen/output/html/altcp__tcp_8c.js
new file mode 100644
index 0000000..ce08fca
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__tcp_8c.js
@@ -0,0 +1,4 @@
+var altcp__tcp_8c =
+[
+    [ "altcp_tcp_alloc", "altcp__tcp_8c.html#a211215e43cb40bd204a20c34316b7caa", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/altcp__tcp_8h.html b/doc/doxygen/output/html/altcp__tcp_8h.html
new file mode 100644
index 0000000..743a8f1
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__tcp_8h.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/altcp_tcp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('altcp__tcp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">altcp_tcp.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="altcp_8h.html">lwip/altcp.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a211215e43cb40bd204a20c34316b7caa"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__tcp_8h.html#a211215e43cb40bd204a20c34316b7caa">altcp_tcp_alloc</a> (void *arg, u8_t ip_type)</td></tr>
+<tr class="separator:a211215e43cb40bd204a20c34316b7caa"><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>
+<p>This file contains the base implementation calling into tcp. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a211215e43cb40bd204a20c34316b7caa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a211215e43cb40bd204a20c34316b7caa">&#9670;&nbsp;</a></span>altcp_tcp_alloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_tcp_alloc </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ip_type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>altcp_tcp allocator function fitting to <a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a> / <a class="el" href="group__altcp.html#ga86843287b0ad0099c067817cfb7aa336">altcp_new</a>.</p>
+<p>arg pointer is not used for TCP. </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="altcp__tcp_8h.html">altcp_tcp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/altcp__tcp_8h.js b/doc/doxygen/output/html/altcp__tcp_8h.js
new file mode 100644
index 0000000..29e18fc
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__tcp_8h.js
@@ -0,0 +1,4 @@
+var altcp__tcp_8h =
+[
+    [ "altcp_tcp_alloc", "altcp__tcp_8h.html#a211215e43cb40bd204a20c34316b7caa", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/altcp__tls_8h.html b/doc/doxygen/output/html/altcp__tls_8h.html
new file mode 100644
index 0000000..61a0d88
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__tls_8h.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/altcp_tls.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('altcp__tls_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">altcp_tls.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="altcp_8h.html">lwip/altcp.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga700dc0320e93cea337673e7d4295e161"><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#ga700dc0320e93cea337673e7d4295e161">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>
+<tr class="separator:ga700dc0320e93cea337673e7d4295e161"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2b249447e10c8599b6d723d403086c35"><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#ga2b249447e10c8599b6d723d403086c35">altcp_tls_create_config_client</a> (const u8_t *cert, size_t cert_len)</td></tr>
+<tr class="separator:ga2b249447e10c8599b6d723d403086c35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7352a4600fee89e167541cf0776c01fb"><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#ga7352a4600fee89e167541cf0776c01fb">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:ga7352a4600fee89e167541cf0776c01fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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:gab874adb7f87984c0520bd032c2108c47"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#gab874adb7f87984c0520bd032c2108c47">altcp_tls_wrap</a> (struct altcp_tls_config *config, struct altcp_pcb *inner_pcb)</td></tr>
+<tr class="separator:gab874adb7f87984c0520bd032c2108c47"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga028316a8257cf8dcace9cd063de79c0a"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a">altcp_tls_new</a> (struct altcp_tls_config *config, u8_t ip_type)</td></tr>
+<tr class="separator:ga028316a8257cf8dcace9cd063de79c0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga09e6ca8f144ee94ef21d7e5760aa4391"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391">altcp_tls_alloc</a> (void *arg, u8_t ip_type)</td></tr>
+<tr class="separator:ga09e6ca8f144ee94ef21d7e5760aa4391"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabc1741530d5089c3093889416430bc76"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#gabc1741530d5089c3093889416430bc76">altcp_tls_context</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:gabc1741530d5089c3093889416430bc76"><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>
+</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="altcp__tls_8h.html">altcp_tls.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/altcp__tls_8h.js b/doc/doxygen/output/html/altcp__tls_8h.js
new file mode 100644
index 0000000..7e77c27
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__tls_8h.js
@@ -0,0 +1,11 @@
+var altcp__tls_8h =
+[
+    [ "altcp_tls_alloc", "group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391", null ],
+    [ "altcp_tls_context", "group__altcp__tls.html#gabc1741530d5089c3093889416430bc76", null ],
+    [ "altcp_tls_create_config_client", "group__altcp__tls.html#ga2b249447e10c8599b6d723d403086c35", null ],
+    [ "altcp_tls_create_config_client_2wayauth", "group__altcp__tls.html#ga7352a4600fee89e167541cf0776c01fb", null ],
+    [ "altcp_tls_create_config_server_privkey_cert", "group__altcp__tls.html#ga700dc0320e93cea337673e7d4295e161", null ],
+    [ "altcp_tls_free_config", "group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145", null ],
+    [ "altcp_tls_new", "group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a", null ],
+    [ "altcp_tls_wrap", "group__altcp__tls.html#gab874adb7f87984c0520bd032c2108c47", 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
new file mode 100644
index 0000000..dd67c92
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__tls__mbedtls_8c.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/altcp_tls/altcp_tls_mbedtls.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('altcp__tls__mbedtls_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">altcp_tls_mbedtls.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 &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>
+</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_1cb496c74bbaf54ecc99133e1c434e0c.html">altcp_tls</a></li><li class="navelem"><a class="el" href="altcp__tls__mbedtls_8c.html">altcp_tls_mbedtls.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/altcp__tls__mbedtls__mem_8c.html b/doc/doxygen/output/html/altcp__tls__mbedtls__mem_8c.html
new file mode 100644
index 0000000..fe9cbd2
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__tls__mbedtls__mem_8c.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/altcp_tls/altcp_tls_mbedtls_mem.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('altcp__tls__mbedtls__mem_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">altcp_tls_mbedtls_mem.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 &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 connection API (to be used from TCPIP thread)</p>
+<p>This file contains memory management functions for a TLS layer using mbedTLS.</p>
+<p>ATTENTION: For production usage, you might want to override this file with your own implementation since this implementation simply uses the lwIP heap without caring for fragmentation or leaving heap for other parts of lwIP! </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_1cb496c74bbaf54ecc99133e1c434e0c.html">altcp_tls</a></li><li class="navelem"><a class="el" href="altcp__tls__mbedtls__mem_8c.html">altcp_tls_mbedtls_mem.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/altcp__tls__mbedtls__mem_8h.html b/doc/doxygen/output/html/altcp__tls__mbedtls__mem_8h.html
new file mode 100644
index 0000000..99224e4
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__tls__mbedtls__mem_8h.html
@@ -0,0 +1,109 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/altcp_tls/altcp_tls_mbedtls_mem.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('altcp__tls__mbedtls__mem_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">altcp_tls_mbedtls_mem.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="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 contains memory management function prototypes for a TLS layer using mbedTLS.</p>
+<p>Memory management contains:</p><ul>
+<li>allocating/freeing altcp_mbedtls_state_t</li>
+<li>allocating/freeing memory used in the mbedTLS library </li>
+</ul>
+</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_1cb496c74bbaf54ecc99133e1c434e0c.html">altcp_tls</a></li><li class="navelem"><a class="el" href="altcp__tls__mbedtls__mem_8h.html">altcp_tls_mbedtls_mem.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/altcp__tls__mbedtls__opts_8h.html b/doc/doxygen/output/html/altcp__tls__mbedtls__opts_8h.html
new file mode 100644
index 0000000..940b8c6
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__tls__mbedtls__opts_8h.html
@@ -0,0 +1,162 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/altcp_tls_mbedtls_opts.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('altcp__tls__mbedtls__opts_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">altcp_tls_mbedtls_opts.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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ac8dbfe10a4a9a64c1e2c62ea97e48639"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__tls__mbedtls__opts_8h.html#ac8dbfe10a4a9a64c1e2c62ea97e48639">LWIP_ALTCP_TLS_MBEDTLS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ac8dbfe10a4a9a64c1e2c62ea97e48639"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7727456eeb0b3311213936413d238989"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__tls__mbedtls__opts_8h.html#a7727456eeb0b3311213936413d238989">ALTCP_MBEDTLS_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:a7727456eeb0b3311213936413d238989"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6acb28346f87b2310fc00ec1fccba2b6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__tls__mbedtls__opts_8h.html#a6acb28346f87b2310fc00ec1fccba2b6">ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a6acb28346f87b2310fc00ec1fccba2b6"><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="a7727456eeb0b3311213936413d238989"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7727456eeb0b3311213936413d238989">&#9670;&nbsp;</a></span>ALTCP_MBEDTLS_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ALTCP_MBEDTLS_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>Configure debug level of this file </p>
+
+</div>
+</div>
+<a id="a6acb28346f87b2310fc00ec1fccba2b6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6acb28346f87b2310fc00ec1fccba2b6">&#9670;&nbsp;</a></span>ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set a session timeout in seconds for the basic session cache ATTENTION: Using a session cache can lower security by reusing keys! </p>
+
+</div>
+</div>
+<a id="ac8dbfe10a4a9a64c1e2c62ea97e48639"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac8dbfe10a4a9a64c1e2c62ea97e48639">&#9670;&nbsp;</a></span>LWIP_ALTCP_TLS_MBEDTLS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ALTCP_TLS_MBEDTLS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ALTCP_TLS_MBEDTLS==1: use mbedTLS for TLS support for altcp API mbedtls include directory must be reachable via include search path </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="dir_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="altcp__tls__mbedtls__opts_8h.html">altcp_tls_mbedtls_opts.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/altcp__tls__mbedtls__opts_8h.js b/doc/doxygen/output/html/altcp__tls__mbedtls__opts_8h.js
new file mode 100644
index 0000000..d4eb77d
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__tls__mbedtls__opts_8h.js
@@ -0,0 +1,6 @@
+var altcp__tls__mbedtls__opts_8h =
+[
+    [ "ALTCP_MBEDTLS_DEBUG", "altcp__tls__mbedtls__opts_8h.html#a7727456eeb0b3311213936413d238989", null ],
+    [ "ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS", "altcp__tls__mbedtls__opts_8h.html#a6acb28346f87b2310fc00ec1fccba2b6", null ],
+    [ "LWIP_ALTCP_TLS_MBEDTLS", "altcp__tls__mbedtls__opts_8h.html#ac8dbfe10a4a9a64c1e2c62ea97e48639", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/altcp__tls__mbedtls__structs_8h.html b/doc/doxygen/output/html/altcp__tls__mbedtls__structs_8h.html
new file mode 100644
index 0000000..2084cff
--- /dev/null
+++ b/doc/doxygen/output/html/altcp__tls__mbedtls__structs_8h.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/altcp_tls/altcp_tls_mbedtls_structs.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('altcp__tls__mbedtls__structs_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">altcp_tls_mbedtls_structs.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="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 contains structure definitions for a TLS layer using mbedTLS. </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_1cb496c74bbaf54ecc99133e1c434e0c.html">altcp_tls</a></li><li class="navelem"><a class="el" href="altcp__tls__mbedtls__structs_8h.html">altcp_tls_mbedtls_structs.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/annotated.html b/doc/doxygen/output/html/annotated.html
new file mode 100644
index 0000000..9dabbb9
--- /dev/null
+++ b/doc/doxygen/output/html/annotated.html
@@ -0,0 +1,228 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Structures</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('annotated.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">Data Structures</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here are the data structures with brief descriptions:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript: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_"><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="structaltcp__allocator__s.html" target="_self">altcp_allocator_s</a></td><td class="desc"></td></tr>
+<tr id="row_3_"><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_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="structautoip.html" target="_self">autoip</a></td><td class="desc"></td></tr>
+<tr id="row_5_"><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_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="structdhcp6__msg.html" target="_self">dhcp6_msg</a></td><td class="desc"></td></tr>
+<tr id="row_7_"><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_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__answer.html" target="_self">dns_answer</a></td><td class="desc"></td></tr>
+<tr id="row_9_"><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_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__hdr.html" target="_self">dns_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_11_"><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_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__req__entry.html" target="_self">dns_req_entry</a></td><td class="desc"></td></tr>
+<tr id="row_13_"><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_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__addr.html" target="_self">eth_addr</a></td><td class="desc"></td></tr>
+<tr id="row_15_"><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_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__vlan__hdr.html" target="_self">eth_vlan_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_17_"><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_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__q__entry.html" target="_self">etharp_q_entry</a></td><td class="desc"></td></tr>
+<tr id="row_19_"><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_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__echo__hdr.html" target="_self">icmp6_echo_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_21_"><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_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="structicmp__echo__hdr.html" target="_self">icmp_echo_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_23_"><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_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__group.html" target="_self">igmp_group</a></td><td class="desc"></td></tr>
+<tr id="row_25_"><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_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.html" target="_self">ip4_addr</a></td><td class="desc"></td></tr>
+<tr id="row_27_"><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_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__wordaligned.html" target="_self">ip4_addr_wordaligned</a></td><td class="desc"></td></tr>
+<tr id="row_29_"><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_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__addr__packed.html" target="_self">ip6_addr_packed</a></td><td class="desc"></td></tr>
+<tr id="row_31_"><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_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__reass__helper.html" target="_self">ip6_reass_helper</a></td><td class="desc"></td></tr>
+<tr id="row_33_"><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_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__addr.html" target="_self">ip_addr</a></td><td class="desc"></td></tr>
+<tr id="row_35_"><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_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__reass__helper.html" target="_self">ip_reass_helper</a></td><td class="desc"></td></tr>
+<tr id="row_37_"><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_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__ieee802154__data.html" target="_self">lowpan6_ieee802154_data</a></td><td class="desc"></td></tr>
+<tr id="row_39_"><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_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__reass__helper.html" target="_self">lowpan6_reass_helper</a></td><td class="desc"></td></tr>
+<tr id="row_41_"><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_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__select__cb.html" target="_self">lwip_select_cb</a></td><td class="desc"></td></tr>
+<tr id="row_43_"><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_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__host.html" target="_self">mdns_host</a></td><td class="desc"></td></tr>
+<tr id="row_45_"><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_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__packet.html" target="_self">mdns_packet</a></td><td class="desc"></td></tr>
+<tr id="row_47_"><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_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__service.html" target="_self">mdns_service</a></td><td class="desc"></td></tr>
+<tr id="row_49_"><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_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="structmemp__desc.html" target="_self">memp_desc</a></td><td class="desc"></td></tr>
+<tr id="row_51_"><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_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="structmld__header.html" target="_self">mld_header</a></td><td class="desc"></td></tr>
+<tr id="row_53_"><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_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__connect__client__info__t.html" target="_self">mqtt_connect_client_info_t</a></td><td class="desc"></td></tr>
+<tr id="row_55_"><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_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="structmqtt__ringbuf__t.html" target="_self">mqtt_ringbuf_t</a></td><td class="desc"></td></tr>
+<tr id="row_57_"><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_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__neighbor__cache__entry.html" target="_self">nd6_neighbor_cache_entry</a></td><td class="desc"></td></tr>
+<tr id="row_59_"><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_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__answer.html" target="_self">netbios_answer</a></td><td class="desc"></td></tr>
+<tr id="row_61_"><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_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__name__hdr.html" target="_self">netbios_name_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_63_"><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_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="structnetbios__resp.html" target="_self">netbios_resp</a></td><td class="desc"></td></tr>
+<tr id="row_65_"><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_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="structnetconn.html" target="_self">netconn</a></td><td class="desc"></td></tr>
+<tr id="row_67_"><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_68_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_68_" class="arrow" onclick="toggleFolder('68_')">&#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_68_0_" 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_68_1_" 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_68_2_" 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_68_3_" 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_68_4_" 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_69_"><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_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="structns__header.html" target="_self">ns_header</a></td><td class="desc"></td></tr>
+<tr id="row_71_"><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_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.html" target="_self">pbuf_custom</a></td><td class="desc"></td></tr>
+<tr id="row_73_"><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_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="structpbuf__rom.html" target="_self">pbuf_rom</a></td><td class="desc"></td></tr>
+<tr id="row_75_"><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_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="structredirect__header.html" target="_self">redirect_header</a></td><td class="desc"></td></tr>
+<tr id="row_77_"><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_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__send__request.html" target="_self">smtp_send_request</a></td><td class="desc"></td></tr>
+<tr id="row_79_"><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_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__leaf__node.html" target="_self">snmp_leaf_node</a></td><td class="desc"></td></tr>
+<tr id="row_81_"><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_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__next__oid__state.html" target="_self">snmp_next_oid_state</a></td><td class="desc"></td></tr>
+<tr id="row_83_"><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_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__node__instance.html" target="_self">snmp_node_instance</a></td><td class="desc"></td></tr>
+<tr id="row_85_"><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_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__oid__range.html" target="_self">snmp_oid_range</a></td><td class="desc"></td></tr>
+<tr id="row_87_"><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_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__array__node__def.html" target="_self">snmp_scalar_array_node_def</a></td><td class="desc"></td></tr>
+<tr id="row_89_"><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_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__col__def.html" target="_self">snmp_table_col_def</a></td><td class="desc"></td></tr>
+<tr id="row_91_"><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_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__table__simple__node.html" target="_self">snmp_table_simple_node</a></td><td class="desc"></td></tr>
+<tr id="row_93_"><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_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__threadsync__node.html" target="_self">snmp_threadsync_node</a></td><td class="desc"></td></tr>
+<tr id="row_95_"><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_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.html" target="_self">snmp_varbind</a></td><td class="desc"></td></tr>
+<tr id="row_97_"><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_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="unionsnmp__variant__value.html" target="_self">snmp_variant_value</a></td><td class="desc"></td></tr>
+<tr id="row_99_"><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_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__server.html" target="_self">sntp_server</a></td><td class="desc"></td></tr>
+<tr id="row_101_"><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_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="structsntp__timestamps.html" target="_self">sntp_timestamps</a></td><td class="desc"></td></tr>
+<tr id="row_103_"><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_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__.html" target="_self">stats_</a></td><td class="desc"></td></tr>
+<tr id="row_105_"><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_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__mem.html" target="_self">stats_mem</a></td><td class="desc"></td></tr>
+<tr id="row_107_"><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_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__mib2__netif__ctrs.html" target="_self">stats_mib2_netif_ctrs</a></td><td class="desc"></td></tr>
+<tr id="row_109_"><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_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__sys.html" target="_self">stats_sys</a></td><td class="desc"></td></tr>
+<tr id="row_111_"><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_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="structt_c_g_i.html" target="_self">tCGI</a></td><td class="desc"></td></tr>
+<tr id="row_113_"><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_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.html" target="_self">tcp_pcb</a></td><td class="desc"></td></tr>
+<tr id="row_115_"><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_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="structtftp__context.html" target="_self">tftp_context</a></td><td class="desc"></td></tr>
+<tr id="row_117_"><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_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="structudp__pcb.html" target="_self">udp_pcb</a></td><td class="desc"></td></tr>
+<tr id="row_119_"><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 -->
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/annotated_dup.js b/doc/doxygen/output/html/annotated_dup.js
new file mode 100644
index 0000000..3c0086b
--- /dev/null
+++ b/doc/doxygen/output/html/annotated_dup.js
@@ -0,0 +1,123 @@
+var annotated_dup =
+[
+    [ "_lwiperf_settings", "struct__lwiperf__settings.html", null ],
+    [ "_lwiperf_state_tcp", "struct__lwiperf__state__tcp.html", null ],
+    [ "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" ],
+    [ "dhcp6_msg", "structdhcp6__msg.html", null ],
+    [ "dhcp_msg", "structdhcp__msg.html", null ],
+    [ "dns_answer", "structdns__answer.html", null ],
+    [ "dns_api_msg", "structdns__api__msg.html", "structdns__api__msg" ],
+    [ "dns_hdr", "structdns__hdr.html", null ],
+    [ "dns_query", "structdns__query.html", null ],
+    [ "dns_req_entry", "structdns__req__entry.html", null ],
+    [ "dns_table_entry", "structdns__table__entry.html", null ],
+    [ "eth_addr", "structeth__addr.html", null ],
+    [ "eth_hdr", "structeth__hdr.html", null ],
+    [ "eth_vlan_hdr", "structeth__vlan__hdr.html", null ],
+    [ "etharp_hdr", "structetharp__hdr.html", null ],
+    [ "etharp_q_entry", "structetharp__q__entry.html", null ],
+    [ "gethostbyname_r_helper", "structgethostbyname__r__helper.html", null ],
+    [ "icmp6_echo_hdr", "structicmp6__echo__hdr.html", null ],
+    [ "icmp6_hdr", "structicmp6__hdr.html", null ],
+    [ "icmp_echo_hdr", "structicmp__echo__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 ],
+    [ "ip4_addr", "structip4__addr.html", null ],
+    [ "ip4_addr_packed", "structip4__addr__packed.html", null ],
+    [ "ip4_addr_wordaligned", "structip4__addr__wordaligned.html", null ],
+    [ "ip6_addr", "structip6__addr.html", null ],
+    [ "ip6_addr_packed", "structip6__addr__packed.html", null ],
+    [ "ip6_hdr", "structip6__hdr.html", "structip6__hdr" ],
+    [ "ip6_reass_helper", "structip6__reass__helper.html", null ],
+    [ "ip6_reassdata", "structip6__reassdata.html", null ],
+    [ "ip_addr", "structip__addr.html", "structip__addr" ],
+    [ "ip_globals", "structip__globals.html", "structip__globals" ],
+    [ "ip_reass_helper", "structip__reass__helper.html", null ],
+    [ "ip_reassdata", "structip__reassdata.html", null ],
+    [ "lowpan6_ieee802154_data", "structlowpan6__ieee802154__data.html", "structlowpan6__ieee802154__data" ],
+    [ "lowpan6_link_addr", "structlowpan6__link__addr.html", null ],
+    [ "lowpan6_reass_helper", "structlowpan6__reass__helper.html", null ],
+    [ "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_host", "structmdns__host.html", "structmdns__host" ],
+    [ "mdns_outpacket", "structmdns__outpacket.html", "structmdns__outpacket" ],
+    [ "mdns_packet", "structmdns__packet.html", "structmdns__packet" ],
+    [ "mdns_rr_info", "structmdns__rr__info.html", null ],
+    [ "mdns_service", "structmdns__service.html", "structmdns__service" ],
+    [ "mem", "structmem.html", "structmem" ],
+    [ "memp_desc", "structmemp__desc.html", "structmemp__desc" ],
+    [ "mld_group", "structmld__group.html", "structmld__group" ],
+    [ "mld_header", "structmld__header.html", null ],
+    [ "mqtt_client_s", "structmqtt__client__s.html", "structmqtt__client__s" ],
+    [ "mqtt_connect_client_info_t", "structmqtt__connect__client__info__t.html", "structmqtt__connect__client__info__t" ],
+    [ "mqtt_request_t", "structmqtt__request__t.html", "structmqtt__request__t" ],
+    [ "mqtt_ringbuf_t", "structmqtt__ringbuf__t.html", null ],
+    [ "na_header", "structna__header.html", null ],
+    [ "nd6_neighbor_cache_entry", "structnd6__neighbor__cache__entry.html", "structnd6__neighbor__cache__entry" ],
+    [ "nd6_q_entry", "structnd6__q__entry.html", null ],
+    [ "netbios_answer", "structnetbios__answer.html", "structnetbios__answer" ],
+    [ "netbios_hdr", "structnetbios__hdr.html", null ],
+    [ "netbios_name_hdr", "structnetbios__name__hdr.html", null ],
+    [ "netbios_question_hdr", "structnetbios__question__hdr.html", null ],
+    [ "netbios_resp", "structnetbios__resp.html", null ],
+    [ "netbuf", "structnetbuf.html", null ],
+    [ "netconn", "structnetconn.html", "structnetconn" ],
+    [ "netif", "structnetif.html", "structnetif" ],
+    [ "netif_ext_callback_args_t", "unionnetif__ext__callback__args__t.html", "unionnetif__ext__callback__args__t" ],
+    [ "netvector", "structnetvector.html", "structnetvector" ],
+    [ "ns_header", "structns__header.html", null ],
+    [ "pbuf", "structpbuf.html", "structpbuf" ],
+    [ "pbuf_custom", "structpbuf__custom.html", "structpbuf__custom" ],
+    [ "pbuf_custom_ref", "structpbuf__custom__ref.html", "structpbuf__custom__ref" ],
+    [ "pbuf_rom", "structpbuf__rom.html", "structpbuf__rom" ],
+    [ "raw_pcb", "structraw__pcb.html", "structraw__pcb" ],
+    [ "redirect_header", "structredirect__header.html", null ],
+    [ "rs_header", "structrs__header.html", null ],
+    [ "smtp_send_request", "structsmtp__send__request.html", "structsmtp__send__request" ],
+    [ "smtp_session", "structsmtp__session.html", "structsmtp__session" ],
+    [ "snmp_leaf_node", "structsnmp__leaf__node.html", "structsnmp__leaf__node" ],
+    [ "snmp_mib", "structsnmp__mib.html", null ],
+    [ "snmp_next_oid_state", "structsnmp__next__oid__state.html", null ],
+    [ "snmp_node", "structsnmp__node.html", "structsnmp__node" ],
+    [ "snmp_node_instance", "structsnmp__node__instance.html", "structsnmp__node__instance" ],
+    [ "snmp_obj_id", "structsnmp__obj__id.html", null ],
+    [ "snmp_oid_range", "structsnmp__oid__range.html", null ],
+    [ "snmp_scalar_array_node", "structsnmp__scalar__array__node.html", "structsnmp__scalar__array__node" ],
+    [ "snmp_scalar_array_node_def", "structsnmp__scalar__array__node__def.html", null ],
+    [ "snmp_scalar_node", "structsnmp__scalar__node.html", "structsnmp__scalar__node" ],
+    [ "snmp_table_col_def", "structsnmp__table__col__def.html", null ],
+    [ "snmp_table_node", "structsnmp__table__node.html", "structsnmp__table__node" ],
+    [ "snmp_table_simple_node", "structsnmp__table__simple__node.html", null ],
+    [ "snmp_threadsync_instance", "structsnmp__threadsync__instance.html", null ],
+    [ "snmp_threadsync_node", "structsnmp__threadsync__node.html", null ],
+    [ "snmp_tree_node", "structsnmp__tree__node.html", "structsnmp__tree__node" ],
+    [ "snmp_varbind", "structsnmp__varbind.html", "structsnmp__varbind" ],
+    [ "snmp_varbind_len", "structsnmp__varbind__len.html", null ],
+    [ "snmp_variant_value", "unionsnmp__variant__value.html", null ],
+    [ "sntp_msg", "structsntp__msg.html", null ],
+    [ "sntp_server", "structsntp__server.html", "structsntp__server" ],
+    [ "sntp_time", "structsntp__time.html", null ],
+    [ "sntp_timestamps", "structsntp__timestamps.html", null ],
+    [ "sockaddr_aligned", "unionsockaddr__aligned.html", null ],
+    [ "stats_", "structstats__.html", "structstats__" ],
+    [ "stats_igmp", "structstats__igmp.html", null ],
+    [ "stats_mem", "structstats__mem.html", null ],
+    [ "stats_mib2", "structstats__mib2.html", null ],
+    [ "stats_mib2_netif_ctrs", "structstats__mib2__netif__ctrs.html", "structstats__mib2__netif__ctrs" ],
+    [ "stats_proto", "structstats__proto.html", null ],
+    [ "stats_sys", "structstats__sys.html", null ],
+    [ "stats_syselem", "structstats__syselem.html", null ],
+    [ "tCGI", "structt_c_g_i.html", null ],
+    [ "tcp_ext_arg_callbacks", "structtcp__ext__arg__callbacks.html", "structtcp__ext__arg__callbacks" ],
+    [ "tcp_pcb", "structtcp__pcb.html", "structtcp__pcb" ],
+    [ "tcp_pcb_listen", "structtcp__pcb__listen.html", "structtcp__pcb__listen" ],
+    [ "tftp_context", "structtftp__context.html", "structtftp__context" ],
+    [ "threadsync_data", "structthreadsync__data.html", null ],
+    [ "udp_pcb", "structudp__pcb.html", "structudp__pcb" ],
+    [ "zepif_init", "structzepif__init.html", "structzepif__init" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/api_8h.html b/doc/doxygen/output/html/api_8h.html
new file mode 100644
index 0000000..bca6f6b
--- /dev/null
+++ b/doc/doxygen/output/html/api_8h.html
@@ -0,0 +1,861 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/api.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('api_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">api.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="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="netbuf_8h.html">lwip/netbuf.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="ip__addr_8h.html">lwip/ip_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="err_8h.html">lwip/err.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structnetconn.html">netconn</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="structnetvector.html">netvector</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:af77be7590d3712259e78103c1dddf63f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#af77be7590d3712259e78103c1dddf63f">NETCONN_FLAG_MBOXCLOSED</a>&#160;&#160;&#160;0x01</td></tr>
+<tr class="separator:af77be7590d3712259e78103c1dddf63f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abee57aa0ba63e35742d411bc5224900a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#abee57aa0ba63e35742d411bc5224900a">NETCONN_FLAG_NON_BLOCKING</a>&#160;&#160;&#160;0x02</td></tr>
+<tr class="separator:abee57aa0ba63e35742d411bc5224900a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70bb861ee643b60ee402fd48f581f58d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#a70bb861ee643b60ee402fd48f581f58d">NETCONN_FLAG_IN_NONBLOCKING_CONNECT</a>&#160;&#160;&#160;0x04</td></tr>
+<tr class="separator:a70bb861ee643b60ee402fd48f581f58d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d791955a4256a0589a3844e4e6f0f9c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#a9d791955a4256a0589a3844e4e6f0f9c">NETCONN_FLAG_CHECK_WRITESPACE</a>&#160;&#160;&#160;0x10</td></tr>
+<tr class="separator:a9d791955a4256a0589a3844e4e6f0f9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a60892e4eb139f10157847fea4266bf5b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#a60892e4eb139f10157847fea4266bf5b">NETCONN_FLAG_IPV6_V6ONLY</a>&#160;&#160;&#160;0x20</td></tr>
+<tr class="separator:a60892e4eb139f10157847fea4266bf5b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a24d62a2a03ba421fcf2bdce1ea89b949"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#a24d62a2a03ba421fcf2bdce1ea89b949">NETCONN_FIN_RX_PENDING</a>&#160;&#160;&#160;0x80</td></tr>
+<tr class="separator:a24d62a2a03ba421fcf2bdce1ea89b949"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3ce590f58be8f60dbde361920863b26d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#a3ce590f58be8f60dbde361920863b26d">API_EVENT</a>(c,  e,  l)</td></tr>
+<tr class="separator:a3ce590f58be8f60dbde361920863b26d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab2bd1d5e633e14e428cfc0ca908d5e0c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__common.html#gab2bd1d5e633e14e428cfc0ca908d5e0c">netconn_new</a>(t)&#160;&#160;&#160;<a class="el" href="api_8h.html#ad0a0434e5ff08bb350740cb840e2aca8">netconn_new_with_proto_and_callback</a>(t, 0, NULL)</td></tr>
+<tr class="separator:gab2bd1d5e633e14e428cfc0ca908d5e0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62cd17ad03bb2817cb0c419e1c9790b1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#a62cd17ad03bb2817cb0c419e1c9790b1">netconn_type</a>(conn)&#160;&#160;&#160;(conn-&gt;type)</td></tr>
+<tr class="separator:a62cd17ad03bb2817cb0c419e1c9790b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1065e769f2276270722a7700182077bc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__common.html#ga1065e769f2276270722a7700182077bc">netconn_peer</a>(c,  i,  p)&#160;&#160;&#160;<a class="el" href="api_8h.html#a28430d1d86733f1bf98dc31305c42104">netconn_getaddr</a>(c,i,p,0)</td></tr>
+<tr class="separator:ga1065e769f2276270722a7700182077bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga37ec33522cfc26fa57251c33e4cebb3e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__common.html#ga37ec33522cfc26fa57251c33e4cebb3e">netconn_addr</a>(c,  i,  p)&#160;&#160;&#160;<a class="el" href="api_8h.html#a28430d1d86733f1bf98dc31305c42104">netconn_getaddr</a>(c,i,p,1)</td></tr>
+<tr class="separator:ga37ec33522cfc26fa57251c33e4cebb3e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga43e3f4c2169dec0f666c502e490416b7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__tcp.html#ga43e3f4c2169dec0f666c502e490416b7">netconn_listen</a>(conn)&#160;&#160;&#160;<a class="el" href="group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d">netconn_listen_with_backlog</a>(conn, <a class="el" href="group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf">TCP_DEFAULT_LISTEN_BACKLOG</a>)</td></tr>
+<tr class="separator:ga43e3f4c2169dec0f666c502e490416b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafea5e9b90770a7c6cd0762ceb65e5b46"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__tcp.html#gafea5e9b90770a7c6cd0762ceb65e5b46">netconn_write</a>(conn,  dataptr,  size,  apiflags)&#160;&#160;&#160;<a class="el" href="group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf">netconn_write_partly</a>(conn, dataptr, size, apiflags, NULL)</td></tr>
+<tr class="separator:gafea5e9b90770a7c6cd0762ceb65e5b46"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a578dd5b55e4457e0d23574ec9c55bb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#a6a578dd5b55e4457e0d23574ec9c55bb">netconn_set_nonblocking</a>(conn,  val)</td></tr>
+<tr class="separator:a6a578dd5b55e4457e0d23574ec9c55bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5789f0030b895b40625a74deb5a1092f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#a5789f0030b895b40625a74deb5a1092f">netconn_is_nonblocking</a>(conn)&#160;&#160;&#160;(((conn)-&gt;flags &amp; <a class="el" href="api_8h.html#abee57aa0ba63e35742d411bc5224900a">NETCONN_FLAG_NON_BLOCKING</a>) != 0)</td></tr>
+<tr class="separator:a5789f0030b895b40625a74deb5a1092f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae56911e2d92bebf43d73e116530e41f1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__common.html#gae56911e2d92bebf43d73e116530e41f1">netconn_set_ipv6only</a>(conn,  val)</td></tr>
+<tr class="separator:gae56911e2d92bebf43d73e116530e41f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf001c7d5fbf97c04eb1d9ac7d14c9c31"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__common.html#gaf001c7d5fbf97c04eb1d9ac7d14c9c31">netconn_get_ipv6only</a>(conn)&#160;&#160;&#160;(((conn)-&gt;flags &amp; <a class="el" href="api_8h.html#a60892e4eb139f10157847fea4266bf5b">NETCONN_FLAG_IPV6_V6ONLY</a>) != 0)</td></tr>
+<tr class="separator:gaf001c7d5fbf97c04eb1d9ac7d14c9c31"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3ce3ad9f660e99b11fec20cafaf8f016"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#a3ce3ad9f660e99b11fec20cafaf8f016">netconn_set_sendtimeout</a>(conn,  timeout)&#160;&#160;&#160;((conn)-&gt;send_timeout = (timeout))</td></tr>
+<tr class="separator:a3ce3ad9f660e99b11fec20cafaf8f016"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7d6e84458eec796b0b0ce1bb247f323f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#a7d6e84458eec796b0b0ce1bb247f323f">netconn_get_sendtimeout</a>(conn)&#160;&#160;&#160;((conn)-&gt;send_timeout)</td></tr>
+<tr class="separator:a7d6e84458eec796b0b0ce1bb247f323f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a04785274634a5b504c760731c2e70725"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#a04785274634a5b504c760731c2e70725">netconn_set_recvbufsize</a>(conn,  recvbufsize)&#160;&#160;&#160;((conn)-&gt;recv_bufsize = (recvbufsize))</td></tr>
+<tr class="separator:a04785274634a5b504c760731c2e70725"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac0298c287dc3823047c378c014ff1eb0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#ac0298c287dc3823047c378c014ff1eb0">netconn_get_recvbufsize</a>(conn)&#160;&#160;&#160;((conn)-&gt;recv_bufsize)</td></tr>
+<tr class="separator:ac0298c287dc3823047c378c014ff1eb0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a3e130339f00202b3ab714af502163a2d"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#a3e130339f00202b3ab714af502163a2d">netconn_callback</a>) (struct <a class="el" href="structnetconn.html">netconn</a> *, enum <a class="el" href="api_8h.html#af722260882d14c49afb765293ffb0155">netconn_evt</a>, u16_t len)</td></tr>
+<tr class="separator:a3e130339f00202b3ab714af502163a2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:gaaba260d28d105fb4bce9185fd0300d91"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a> { , <br />
+&#160;&#160;<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a75d14318b91af7a452230189f47e5e1a">NETCONN_TCP</a> = 0x10, 
+<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91ae7efa7c4e50b7b381531a2136cd5a013">NETCONN_TCP_IPV6</a> = NETCONN_TCP | 0x08, 
+<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a6b8ec191d69f7e639f4ab40779069636">NETCONN_UDP</a> = 0x20, 
+<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a655e1625cc7e6a93f1e3d2646f56a1e4">NETCONN_UDPLITE</a> = 0x21, 
+<br />
+&#160;&#160;<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a7e0c3f566b3d4321b36b711b6b1ad6de">NETCONN_UDPNOCHKSUM</a> = 0x22, 
+<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a34ee1c89f6705462590a4fe2c9772d9e">NETCONN_UDP_IPV6</a> = NETCONN_UDP | 0x08, 
+<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91aa9cabc9d90606b5c5939fcc02ac588c7">NETCONN_UDPLITE_IPV6</a> = NETCONN_UDPLITE | 0x08, 
+<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a2c7f548d26f6c411f084b6c59247b60e">NETCONN_UDPNOCHKSUM_IPV6</a> = NETCONN_UDPNOCHKSUM | 0x08, 
+<br />
+&#160;&#160;<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a0d828a7e9c1614d4cae56602b09f39e9">NETCONN_RAW</a> = 0x40
+<br />
+ }</td></tr>
+<tr class="separator:gaaba260d28d105fb4bce9185fd0300d91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c6c9c1869f443c5ec7b31180a44fada"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#a2c6c9c1869f443c5ec7b31180a44fada">netconn_state</a> </td></tr>
+<tr class="separator:a2c6c9c1869f443c5ec7b31180a44fada"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af722260882d14c49afb765293ffb0155"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#af722260882d14c49afb765293ffb0155">netconn_evt</a> </td></tr>
+<tr class="separator:af722260882d14c49afb765293ffb0155"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c6ded2c082de1536019b197a0a912db"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#a5c6ded2c082de1536019b197a0a912db">netconn_igmp</a> </td></tr>
+<tr class="separator:a5c6ded2c082de1536019b197a0a912db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad0a0434e5ff08bb350740cb840e2aca8"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html#ad0a0434e5ff08bb350740cb840e2aca8">netconn_new_with_proto_and_callback</a> (enum <a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a> t, u8_t proto, <a class="el" href="api_8h.html#a3e130339f00202b3ab714af502163a2d">netconn_callback</a> callback)</td></tr>
+<tr class="separator:ad0a0434e5ff08bb350740cb840e2aca8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad5c079af0ad791a92fe9dade375744f0"><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__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0">netconn_prepare_delete</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn)</td></tr>
+<tr class="separator:gad5c079af0ad791a92fe9dade375744f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab411221f912a6d9e4c82ac3963989403"><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__netconn__common.html#gab411221f912a6d9e4c82ac3963989403">netconn_delete</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn)</td></tr>
+<tr class="separator:gab411221f912a6d9e4c82ac3963989403"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a28430d1d86733f1bf98dc31305c42104"><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="api_8h.html#a28430d1d86733f1bf98dc31305c42104">netconn_getaddr</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, u16_t *port, u8_t local)</td></tr>
+<tr class="separator:a28430d1d86733f1bf98dc31305c42104"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga63bcc4d7bd150674fa953a1253fa6230"><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__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230">netconn_bind</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, u16_t port)</td></tr>
+<tr class="separator:ga63bcc4d7bd150674fa953a1253fa6230"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa78479deeedcecd3bacade387ac40cc5"><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__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5">netconn_bind_if</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, u8_t if_idx)</td></tr>
+<tr class="separator:gaa78479deeedcecd3bacade387ac40cc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacba7f74d973872ad0b88b9a96098cf77"><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__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77">netconn_connect</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, u16_t port)</td></tr>
+<tr class="separator:gacba7f74d973872ad0b88b9a96098cf77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga90bb4c4d1af6602a655b78fce0520402"><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__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402">netconn_disconnect</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn)</td></tr>
+<tr class="separator:ga90bb4c4d1af6602a655b78fce0520402"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga84333ba8e7cdf45558d2b4795f53265d"><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__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d">netconn_listen_with_backlog</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, u8_t backlog)</td></tr>
+<tr class="separator:ga84333ba8e7cdf45558d2b4795f53265d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga13593148f60f7bbc6a505b567f175d69"><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__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69">netconn_accept</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetconn.html">netconn</a> **new_conn)</td></tr>
+<tr class="separator:ga13593148f60f7bbc6a505b567f175d69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga50490bab058f4e740798beffcf48cabf"><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__netconn__common.html#ga50490bab058f4e740798beffcf48cabf">netconn_recv</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetbuf.html">netbuf</a> **new_buf)</td></tr>
+<tr class="separator:ga50490bab058f4e740798beffcf48cabf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a805a90b546c5a149f04782351633979b"><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="api_8h.html#a805a90b546c5a149f04782351633979b">netconn_recv_udp_raw_netbuf</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetbuf.html">netbuf</a> **new_buf)</td></tr>
+<tr class="separator:a805a90b546c5a149f04782351633979b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a505c3b8e400babf9681e09c945b7f421"><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="api_8h.html#a505c3b8e400babf9681e09c945b7f421">netconn_recv_udp_raw_netbuf_flags</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetbuf.html">netbuf</a> **new_buf, u8_t apiflags)</td></tr>
+<tr class="separator:a505c3b8e400babf9681e09c945b7f421"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6893cb7648733d1f05696bac94e10490"><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__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490">netconn_recv_tcp_pbuf</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structpbuf.html">pbuf</a> **new_buf)</td></tr>
+<tr class="separator:ga6893cb7648733d1f05696bac94e10490"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabb8a242c445ef928c23258a2b2344294"><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__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294">netconn_recv_tcp_pbuf_flags</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structpbuf.html">pbuf</a> **new_buf, u8_t apiflags)</td></tr>
+<tr class="separator:gabb8a242c445ef928c23258a2b2344294"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8e1d852119bda1e1b602c2995282ef0c"><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__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c">netconn_sendto</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetbuf.html">netbuf</a> *buf, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, u16_t port)</td></tr>
+<tr class="separator:ga8e1d852119bda1e1b602c2995282ef0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac4d4d10153d47c80a783c34b27c66238"><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__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238">netconn_send</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetbuf.html">netbuf</a> *buf)</td></tr>
+<tr class="separator:gac4d4d10153d47c80a783c34b27c66238"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacf9ce6f71652739d6be2ca83f7c423bf"><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__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf">netconn_write_partly</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, const void *dataptr, size_t size, u8_t apiflags, size_t *bytes_written)</td></tr>
+<tr class="separator:gacf9ce6f71652739d6be2ca83f7c423bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a992b4fe8a855fd94861738f7260d0a32"><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="api_8h.html#a992b4fe8a855fd94861738f7260d0a32">netconn_write_vectors_partly</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetvector.html">netvector</a> *vectors, u16_t vectorcnt, u8_t apiflags, size_t *bytes_written)</td></tr>
+<tr class="separator:a992b4fe8a855fd94861738f7260d0a32"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga25bb1c1c9928f91f53149a026e2e2624"><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__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624">netconn_close</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn)</td></tr>
+<tr class="separator:ga25bb1c1c9928f91f53149a026e2e2624"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6ec6b2cf7b0f59e9371e38ae7dea2a63"><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__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63">netconn_shutdown</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, u8_t shut_rx, u8_t shut_tx)</td></tr>
+<tr class="separator:ga6ec6b2cf7b0f59e9371e38ae7dea2a63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaaf2f92eeb38dca70b3e6ad98c3c45ed"><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__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed">netconn_join_leave_group</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *multiaddr, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *netif_addr, enum <a class="el" href="api_8h.html#a5c6ded2c082de1536019b197a0a912db">netconn_igmp</a> join_or_leave)</td></tr>
+<tr class="separator:gaaaf2f92eeb38dca70b3e6ad98c3c45ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5db2a1cf06a5fbb36f433e637da8729b"><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__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b">netconn_join_leave_group_netif</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *multiaddr, u8_t if_idx, enum <a class="el" href="api_8h.html#a5c6ded2c082de1536019b197a0a912db">netconn_igmp</a> join_or_leave)</td></tr>
+<tr class="separator:ga5db2a1cf06a5fbb36f433e637da8729b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafb3494b149dff96ed8d1acb770ab52f5"><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__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5">netconn_gethostbyname_addrtype</a> (const char *name, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, u8_t dns_addrtype)</td></tr>
+<tr class="separator:gafb3494b149dff96ed8d1acb770ab52f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab9eccae90351eb6c3d2ca690068445d4"><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__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4">netconn_err</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn)</td></tr>
+<tr class="separator:gab9eccae90351eb6c3d2ca690068445d4"><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>netconn API (to be used from non-TCPIP threads) </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a3ce590f58be8f60dbde361920863b26d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3ce590f58be8f60dbde361920863b26d">&#9670;&nbsp;</a></span>API_EVENT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define API_EVENT</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">e, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">l&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><span class="keywordflow">if</span> (c-&gt;callback) {         \</div><div class="line">                           (*c-&gt;callback)(c, e, l); \</div><div class="line">                         }</div></div><!-- fragment --><p>Register an Network connection event </p>
+
+</div>
+</div>
+<a id="a24d62a2a03ba421fcf2bdce1ea89b949"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a24d62a2a03ba421fcf2bdce1ea89b949">&#9670;&nbsp;</a></span>NETCONN_FIN_RX_PENDING</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETCONN_FIN_RX_PENDING&#160;&#160;&#160;0x80</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A FIN has been received but not passed to the application yet </p>
+
+</div>
+</div>
+<a id="a9d791955a4256a0589a3844e4e6f0f9c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9d791955a4256a0589a3844e4e6f0f9c">&#9670;&nbsp;</a></span>NETCONN_FLAG_CHECK_WRITESPACE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETCONN_FLAG_CHECK_WRITESPACE&#160;&#160;&#160;0x10</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If a nonblocking write has been rejected before, poll_tcp needs to check if the netconn is writable again </p>
+
+</div>
+</div>
+<a id="a70bb861ee643b60ee402fd48f581f58d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a70bb861ee643b60ee402fd48f581f58d">&#9670;&nbsp;</a></span>NETCONN_FLAG_IN_NONBLOCKING_CONNECT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETCONN_FLAG_IN_NONBLOCKING_CONNECT&#160;&#160;&#160;0x04</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Was the last connect action a non-blocking one? </p>
+
+</div>
+</div>
+<a id="a60892e4eb139f10157847fea4266bf5b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a60892e4eb139f10157847fea4266bf5b">&#9670;&nbsp;</a></span>NETCONN_FLAG_IPV6_V6ONLY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETCONN_FLAG_IPV6_V6ONLY&#160;&#160;&#160;0x20</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If this flag is set then only IPv6 communication is allowed on the netconn. As per RFC#3493 this features defaults to OFF allowing dual-stack usage by default. </p>
+
+</div>
+</div>
+<a id="af77be7590d3712259e78103c1dddf63f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af77be7590d3712259e78103c1dddf63f">&#9670;&nbsp;</a></span>NETCONN_FLAG_MBOXCLOSED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETCONN_FLAG_MBOXCLOSED&#160;&#160;&#160;0x01</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This netconn had an error, don't block on recvmbox/acceptmbox any more </p>
+
+</div>
+</div>
+<a id="abee57aa0ba63e35742d411bc5224900a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abee57aa0ba63e35742d411bc5224900a">&#9670;&nbsp;</a></span>NETCONN_FLAG_NON_BLOCKING</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETCONN_FLAG_NON_BLOCKING&#160;&#160;&#160;0x02</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Should this netconn avoid blocking? </p>
+
+</div>
+</div>
+<a id="ac0298c287dc3823047c378c014ff1eb0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac0298c287dc3823047c378c014ff1eb0">&#9670;&nbsp;</a></span>netconn_get_recvbufsize</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netconn_get_recvbufsize</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">conn</td><td>)</td>
+          <td>&#160;&#160;&#160;((conn)-&gt;recv_bufsize)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get the receive buffer in bytes </p>
+
+</div>
+</div>
+<a id="a7d6e84458eec796b0b0ce1bb247f323f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7d6e84458eec796b0b0ce1bb247f323f">&#9670;&nbsp;</a></span>netconn_get_sendtimeout</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netconn_get_sendtimeout</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">conn</td><td>)</td>
+          <td>&#160;&#160;&#160;((conn)-&gt;send_timeout)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get the send timeout in milliseconds </p>
+
+</div>
+</div>
+<a id="a5789f0030b895b40625a74deb5a1092f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5789f0030b895b40625a74deb5a1092f">&#9670;&nbsp;</a></span>netconn_is_nonblocking</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netconn_is_nonblocking</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">conn</td><td>)</td>
+          <td>&#160;&#160;&#160;(((conn)-&gt;flags &amp; <a class="el" href="api_8h.html#abee57aa0ba63e35742d411bc5224900a">NETCONN_FLAG_NON_BLOCKING</a>) != 0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get the blocking status of netconn calls ( </p>
+
+</div>
+</div>
+<a id="a6a578dd5b55e4457e0d23574ec9c55bb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6a578dd5b55e4457e0d23574ec9c55bb">&#9670;&nbsp;</a></span>netconn_set_nonblocking</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netconn_set_nonblocking</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">conn, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">val&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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> { <span class="keywordflow">if</span>(val) { \</div><div class="line">  netconn_set_flags(conn, <a class="code" href="api_8h.html#abee57aa0ba63e35742d411bc5224900a">NETCONN_FLAG_NON_BLOCKING</a>); \</div><div class="line">} <span class="keywordflow">else</span> { \</div><div class="line">  netconn_clear_flags(conn, <a class="code" href="api_8h.html#abee57aa0ba63e35742d411bc5224900a">NETCONN_FLAG_NON_BLOCKING</a>); }} <span class="keywordflow">while</span>(0)</div><div class="ttc" id="api_8h_html_abee57aa0ba63e35742d411bc5224900a"><div class="ttname"><a href="api_8h.html#abee57aa0ba63e35742d411bc5224900a">NETCONN_FLAG_NON_BLOCKING</a></div><div class="ttdeci">#define NETCONN_FLAG_NON_BLOCKING</div><div class="ttdef"><b>Definition:</b> api.h:73</div></div>
+</div><!-- fragment --><p>Set the blocking status of netconn calls ( </p>
+
+</div>
+</div>
+<a id="a04785274634a5b504c760731c2e70725"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a04785274634a5b504c760731c2e70725">&#9670;&nbsp;</a></span>netconn_set_recvbufsize</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netconn_set_recvbufsize</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">conn, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">recvbufsize&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((conn)-&gt;recv_bufsize = (recvbufsize))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the receive buffer in bytes </p>
+
+</div>
+</div>
+<a id="a3ce3ad9f660e99b11fec20cafaf8f016"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3ce3ad9f660e99b11fec20cafaf8f016">&#9670;&nbsp;</a></span>netconn_set_sendtimeout</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netconn_set_sendtimeout</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">conn, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">timeout&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((conn)-&gt;send_timeout = (timeout))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the send timeout in milliseconds </p>
+
+</div>
+</div>
+<a id="a62cd17ad03bb2817cb0c419e1c9790b1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62cd17ad03bb2817cb0c419e1c9790b1">&#9670;&nbsp;</a></span>netconn_type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define <a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a></td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">conn</td><td>)</td>
+          <td>&#160;&#160;&#160;(conn-&gt;type)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get the type of a netconn (as enum netconn_type). </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="a3e130339f00202b3ab714af502163a2d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3e130339f00202b3ab714af502163a2d">&#9670;&nbsp;</a></span>netconn_callback</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(*  netconn_callback) (struct <a class="el" href="structnetconn.html">netconn</a> *, enum <a class="el" href="api_8h.html#af722260882d14c49afb765293ffb0155">netconn_evt</a>, u16_t len)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A callback prototype to inform about events for a netconn </p>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="af722260882d14c49afb765293ffb0155"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af722260882d14c49afb765293ffb0155">&#9670;&nbsp;</a></span>netconn_evt</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="api_8h.html#af722260882d14c49afb765293ffb0155">netconn_evt</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Used to inform the callback function about changes</p>
+<p>Event explanation:</p>
+<p>In the netconn implementation, there are three ways to block a client:</p>
+<ul>
+<li>accept mbox (sys_arch_mbox_fetch(&amp;conn-&gt;acceptmbox, &amp;accept_ptr, 0); in <a class="el" href="group__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69">netconn_accept()</a>)</li>
+<li>receive mbox (sys_arch_mbox_fetch(&amp;conn-&gt;recvmbox, &amp;buf, 0); in netconn_recv_data())</li>
+<li>send queue is full (sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0); in <a class="el" href="api__msg_8c.html#aca4545a471ead1bc673ea93fe85f7e5c">lwip_netconn_do_write()</a>)</li>
+</ul>
+<p>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.</p>
+<p>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.</p>
+<p>RCVMINUS events say: Your call to to a possibly blocking function is "acknowledged". Socket implementation decrements the counter.</p>
+<p>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 <a class="el" href="group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238">netconn_send()</a> can be called again. A SENDMINUS event occurs when the next call to a <a class="el" href="group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238">netconn_send()</a> would be blocking. </p>
+
+</div>
+</div>
+<a id="a5c6ded2c082de1536019b197a0a912db"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5c6ded2c082de1536019b197a0a912db">&#9670;&nbsp;</a></span>netconn_igmp</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="api_8h.html#a5c6ded2c082de1536019b197a0a912db">netconn_igmp</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Used for <a class="el" href="group__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed">netconn_join_leave_group()</a> </p>
+
+</div>
+</div>
+<a id="a2c6c9c1869f443c5ec7b31180a44fada"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2c6c9c1869f443c5ec7b31180a44fada">&#9670;&nbsp;</a></span>netconn_state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="api_8h.html#a2c6c9c1869f443c5ec7b31180a44fada">netconn_state</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Current state of the netconn. Non-TCP netconns are always in state NETCONN_NONE! </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a28430d1d86733f1bf98dc31305c42104"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a28430d1d86733f1bf98dc31305c42104">&#9670;&nbsp;</a></span>netconn_getaddr()</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> netconn_getaddr </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>local</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get the local or remote IP address and port of a netconn. For RAW netconns, this returns the protocol instead of a port!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn to query </td></tr>
+    <tr><td class="paramname">addr</td><td>a pointer to which to save the IP address </td></tr>
+    <tr><td class="paramname">port</td><td>a pointer to which to save the port (or protocol for RAW) </td></tr>
+    <tr><td class="paramname">local</td><td>1 to get the local IP address, 0 to get the remote one </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_CONN for invalid connections ERR_OK if the information was retrieved </dd></dl>
+
+</div>
+</div>
+<a id="ad0a0434e5ff08bb350740cb840e2aca8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad0a0434e5ff08bb350740cb840e2aca8">&#9670;&nbsp;</a></span>netconn_new_with_proto_and_callback()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetconn.html">netconn</a>* netconn_new_with_proto_and_callback </td>
+          <td>(</td>
+          <td class="paramtype">enum <a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a>&#160;</td>
+          <td class="paramname"><em>t</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="api_8h.html#a3e130339f00202b3ab714af502163a2d">netconn_callback</a>&#160;</td>
+          <td class="paramname"><em>callback</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create a new netconn (of a specific type) that has a callback function. The corresponding pcb is also created.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">t</td><td>the type of 'connection' to create (</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd>enum <a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a>) </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">proto</td><td>the IP protocol for RAW IP pcbs </td></tr>
+    <tr><td class="paramname">callback</td><td>a function to call on status changes (RX available, TX'ed) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a newly allocated struct netconn or NULL on memory error </dd></dl>
+
+</div>
+</div>
+<a id="a805a90b546c5a149f04782351633979b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a805a90b546c5a149f04782351633979b">&#9670;&nbsp;</a></span>netconn_recv_udp_raw_netbuf()</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> netconn_recv_udp_raw_netbuf </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetbuf.html">netbuf</a> **&#160;</td>
+          <td class="paramname"><em>new_buf</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Receive data (in form of a netbuf) from a UDP or RAW netconn</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn from which to receive data </td></tr>
+    <tr><td class="paramname">new_buf</td><td>pointer where a new netbuf is stored when received data </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if data has been received, an error code otherwise (timeout, memory error or another error) ERR_ARG if conn is not a UDP/RAW netconn </dd></dl>
+
+</div>
+</div>
+<a id="a505c3b8e400babf9681e09c945b7f421"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a505c3b8e400babf9681e09c945b7f421">&#9670;&nbsp;</a></span>netconn_recv_udp_raw_netbuf_flags()</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> netconn_recv_udp_raw_netbuf_flags </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetbuf.html">netbuf</a> **&#160;</td>
+          <td class="paramname"><em>new_buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>apiflags</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Receive data (in form of a netbuf) from a UDP or RAW netconn</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn from which to receive data </td></tr>
+    <tr><td class="paramname">new_buf</td><td>pointer where a new netbuf is stored when received data </td></tr>
+    <tr><td class="paramname">apiflags</td><td>flags that control function behaviour. For now only:<ul>
+<li>NETCONN_DONTBLOCK: only read data that is available now, don't wait for more data </li>
+</ul>
+</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if data has been received, an error code otherwise (timeout, memory error or another error) ERR_ARG if conn is not a UDP/RAW netconn </dd></dl>
+
+</div>
+</div>
+<a id="a992b4fe8a855fd94861738f7260d0a32"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a992b4fe8a855fd94861738f7260d0a32">&#9670;&nbsp;</a></span>netconn_write_vectors_partly()</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> netconn_write_vectors_partly </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetvector.html">netvector</a> *&#160;</td>
+          <td class="paramname"><em>vectors</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>vectorcnt</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>apiflags</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t *&#160;</td>
+          <td class="paramname"><em>bytes_written</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send vectorized data atomically over a TCP netconn.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the TCP netconn over which to send data </td></tr>
+    <tr><td class="paramname">vectors</td><td>array of vectors containing data to send </td></tr>
+    <tr><td class="paramname">vectorcnt</td><td>number of vectors in the array </td></tr>
+    <tr><td class="paramname">apiflags</td><td>combination of following flags :<ul>
+<li>NETCONN_COPY: data will be copied into memory belonging to the stack</li>
+<li>NETCONN_MORE: for TCP connection, PSH flag will be set on last segment sent</li>
+<li>NETCONN_DONTBLOCK: only write the data if all data can be written at once </li>
+</ul>
+</td></tr>
+    <tr><td class="paramname">bytes_written</td><td>pointer to a location that receives the number of written bytes </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if data was sent, any other err_t on error </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="api_8h.html">api.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/api_8h.js b/doc/doxygen/output/html/api_8h.js
new file mode 100644
index 0000000..3581670
--- /dev/null
+++ b/doc/doxygen/output/html/api_8h.js
@@ -0,0 +1,66 @@
+var api_8h =
+[
+    [ "netconn", "structnetconn.html", "structnetconn" ],
+    [ "netvector", "structnetvector.html", "structnetvector" ],
+    [ "API_EVENT", "api_8h.html#a3ce590f58be8f60dbde361920863b26d", null ],
+    [ "netconn_addr", "group__netconn__common.html#ga37ec33522cfc26fa57251c33e4cebb3e", null ],
+    [ "NETCONN_FIN_RX_PENDING", "api_8h.html#a24d62a2a03ba421fcf2bdce1ea89b949", null ],
+    [ "NETCONN_FLAG_CHECK_WRITESPACE", "api_8h.html#a9d791955a4256a0589a3844e4e6f0f9c", null ],
+    [ "NETCONN_FLAG_IN_NONBLOCKING_CONNECT", "api_8h.html#a70bb861ee643b60ee402fd48f581f58d", null ],
+    [ "NETCONN_FLAG_IPV6_V6ONLY", "api_8h.html#a60892e4eb139f10157847fea4266bf5b", null ],
+    [ "NETCONN_FLAG_MBOXCLOSED", "api_8h.html#af77be7590d3712259e78103c1dddf63f", null ],
+    [ "NETCONN_FLAG_NON_BLOCKING", "api_8h.html#abee57aa0ba63e35742d411bc5224900a", null ],
+    [ "netconn_get_ipv6only", "group__netconn__common.html#gaf001c7d5fbf97c04eb1d9ac7d14c9c31", null ],
+    [ "netconn_get_recvbufsize", "api_8h.html#ac0298c287dc3823047c378c014ff1eb0", null ],
+    [ "netconn_get_sendtimeout", "api_8h.html#a7d6e84458eec796b0b0ce1bb247f323f", null ],
+    [ "netconn_is_nonblocking", "api_8h.html#a5789f0030b895b40625a74deb5a1092f", null ],
+    [ "netconn_listen", "group__netconn__tcp.html#ga43e3f4c2169dec0f666c502e490416b7", null ],
+    [ "netconn_new", "group__netconn__common.html#gab2bd1d5e633e14e428cfc0ca908d5e0c", null ],
+    [ "netconn_peer", "group__netconn__common.html#ga1065e769f2276270722a7700182077bc", null ],
+    [ "netconn_set_ipv6only", "group__netconn__common.html#gae56911e2d92bebf43d73e116530e41f1", null ],
+    [ "netconn_set_nonblocking", "api_8h.html#a6a578dd5b55e4457e0d23574ec9c55bb", null ],
+    [ "netconn_set_recvbufsize", "api_8h.html#a04785274634a5b504c760731c2e70725", null ],
+    [ "netconn_set_sendtimeout", "api_8h.html#a3ce3ad9f660e99b11fec20cafaf8f016", null ],
+    [ "netconn_type", "api_8h.html#a62cd17ad03bb2817cb0c419e1c9790b1", null ],
+    [ "netconn_write", "group__netconn__tcp.html#gafea5e9b90770a7c6cd0762ceb65e5b46", null ],
+    [ "netconn_callback", "api_8h.html#a3e130339f00202b3ab714af502163a2d", null ],
+    [ "netconn_evt", "api_8h.html#af722260882d14c49afb765293ffb0155", null ],
+    [ "netconn_igmp", "api_8h.html#a5c6ded2c082de1536019b197a0a912db", null ],
+    [ "netconn_state", "api_8h.html#a2c6c9c1869f443c5ec7b31180a44fada", null ],
+    [ "netconn_type", "group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91", [
+      [ "NETCONN_TCP", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a75d14318b91af7a452230189f47e5e1a", null ],
+      [ "NETCONN_TCP_IPV6", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91ae7efa7c4e50b7b381531a2136cd5a013", null ],
+      [ "NETCONN_UDP", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a6b8ec191d69f7e639f4ab40779069636", null ],
+      [ "NETCONN_UDPLITE", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a655e1625cc7e6a93f1e3d2646f56a1e4", null ],
+      [ "NETCONN_UDPNOCHKSUM", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a7e0c3f566b3d4321b36b711b6b1ad6de", null ],
+      [ "NETCONN_UDP_IPV6", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a34ee1c89f6705462590a4fe2c9772d9e", null ],
+      [ "NETCONN_UDPLITE_IPV6", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91aa9cabc9d90606b5c5939fcc02ac588c7", null ],
+      [ "NETCONN_UDPNOCHKSUM_IPV6", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a2c7f548d26f6c411f084b6c59247b60e", null ],
+      [ "NETCONN_RAW", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a0d828a7e9c1614d4cae56602b09f39e9", null ]
+    ] ],
+    [ "netconn_accept", "group__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69", null ],
+    [ "netconn_bind", "group__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230", null ],
+    [ "netconn_bind_if", "group__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5", null ],
+    [ "netconn_close", "group__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624", null ],
+    [ "netconn_connect", "group__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77", null ],
+    [ "netconn_delete", "group__netconn__common.html#gab411221f912a6d9e4c82ac3963989403", null ],
+    [ "netconn_disconnect", "group__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402", null ],
+    [ "netconn_err", "group__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4", null ],
+    [ "netconn_getaddr", "api_8h.html#a28430d1d86733f1bf98dc31305c42104", null ],
+    [ "netconn_gethostbyname_addrtype", "group__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5", null ],
+    [ "netconn_join_leave_group", "group__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed", null ],
+    [ "netconn_join_leave_group_netif", "group__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b", null ],
+    [ "netconn_listen_with_backlog", "group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d", null ],
+    [ "netconn_new_with_proto_and_callback", "api_8h.html#ad0a0434e5ff08bb350740cb840e2aca8", null ],
+    [ "netconn_prepare_delete", "group__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0", null ],
+    [ "netconn_recv", "group__netconn__common.html#ga50490bab058f4e740798beffcf48cabf", null ],
+    [ "netconn_recv_tcp_pbuf", "group__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490", null ],
+    [ "netconn_recv_tcp_pbuf_flags", "group__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294", null ],
+    [ "netconn_recv_udp_raw_netbuf", "api_8h.html#a805a90b546c5a149f04782351633979b", null ],
+    [ "netconn_recv_udp_raw_netbuf_flags", "api_8h.html#a505c3b8e400babf9681e09c945b7f421", null ],
+    [ "netconn_send", "group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238", null ],
+    [ "netconn_sendto", "group__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c", null ],
+    [ "netconn_shutdown", "group__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63", null ],
+    [ "netconn_write_partly", "group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf", null ],
+    [ "netconn_write_vectors_partly", "api_8h.html#a992b4fe8a855fd94861738f7260d0a32", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/api__lib_8c.html b/doc/doxygen/output/html/api__lib_8c.html
new file mode 100644
index 0000000..44e64f8
--- /dev/null
+++ b/doc/doxygen/output/html/api__lib_8c.html
@@ -0,0 +1,418 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/api/api_lib.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('api__lib_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">api_lib.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 &quot;<a class="el" href="api_8h.html">lwip/api.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="ip_8h.html">lwip/ip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="raw_8h.html">lwip/raw.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="api__msg_8h.html">lwip/priv/api_msg.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tcp__priv_8h.html">lwip/priv/tcp_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tcpip__priv_8h.html">lwip/priv/tcpip_priv.h</a>&quot;</code><br />
+<code>#include &quot;path/to/my/lwip_hooks.h&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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad0a0434e5ff08bb350740cb840e2aca8"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__lib_8c.html#ad0a0434e5ff08bb350740cb840e2aca8">netconn_new_with_proto_and_callback</a> (enum <a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a> t, u8_t proto, <a class="el" href="api_8h.html#a3e130339f00202b3ab714af502163a2d">netconn_callback</a> callback)</td></tr>
+<tr class="separator:ad0a0434e5ff08bb350740cb840e2aca8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad5c079af0ad791a92fe9dade375744f0"><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__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0">netconn_prepare_delete</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn)</td></tr>
+<tr class="separator:gad5c079af0ad791a92fe9dade375744f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab411221f912a6d9e4c82ac3963989403"><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__netconn__common.html#gab411221f912a6d9e4c82ac3963989403">netconn_delete</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn)</td></tr>
+<tr class="separator:gab411221f912a6d9e4c82ac3963989403"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a28430d1d86733f1bf98dc31305c42104"><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="api__lib_8c.html#a28430d1d86733f1bf98dc31305c42104">netconn_getaddr</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, u16_t *port, u8_t local)</td></tr>
+<tr class="separator:a28430d1d86733f1bf98dc31305c42104"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga63bcc4d7bd150674fa953a1253fa6230"><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__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230">netconn_bind</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, u16_t port)</td></tr>
+<tr class="separator:ga63bcc4d7bd150674fa953a1253fa6230"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa78479deeedcecd3bacade387ac40cc5"><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__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5">netconn_bind_if</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, u8_t if_idx)</td></tr>
+<tr class="separator:gaa78479deeedcecd3bacade387ac40cc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacba7f74d973872ad0b88b9a96098cf77"><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__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77">netconn_connect</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, u16_t port)</td></tr>
+<tr class="separator:gacba7f74d973872ad0b88b9a96098cf77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga90bb4c4d1af6602a655b78fce0520402"><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__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402">netconn_disconnect</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn)</td></tr>
+<tr class="separator:ga90bb4c4d1af6602a655b78fce0520402"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga84333ba8e7cdf45558d2b4795f53265d"><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__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d">netconn_listen_with_backlog</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, u8_t backlog)</td></tr>
+<tr class="separator:ga84333ba8e7cdf45558d2b4795f53265d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga13593148f60f7bbc6a505b567f175d69"><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__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69">netconn_accept</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetconn.html">netconn</a> **new_conn)</td></tr>
+<tr class="separator:ga13593148f60f7bbc6a505b567f175d69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6893cb7648733d1f05696bac94e10490"><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__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490">netconn_recv_tcp_pbuf</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structpbuf.html">pbuf</a> **new_buf)</td></tr>
+<tr class="separator:ga6893cb7648733d1f05696bac94e10490"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabb8a242c445ef928c23258a2b2344294"><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__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294">netconn_recv_tcp_pbuf_flags</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structpbuf.html">pbuf</a> **new_buf, u8_t apiflags)</td></tr>
+<tr class="separator:gabb8a242c445ef928c23258a2b2344294"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a805a90b546c5a149f04782351633979b"><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="api__lib_8c.html#a805a90b546c5a149f04782351633979b">netconn_recv_udp_raw_netbuf</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetbuf.html">netbuf</a> **new_buf)</td></tr>
+<tr class="separator:a805a90b546c5a149f04782351633979b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a505c3b8e400babf9681e09c945b7f421"><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="api__lib_8c.html#a505c3b8e400babf9681e09c945b7f421">netconn_recv_udp_raw_netbuf_flags</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetbuf.html">netbuf</a> **new_buf, u8_t apiflags)</td></tr>
+<tr class="separator:a505c3b8e400babf9681e09c945b7f421"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga50490bab058f4e740798beffcf48cabf"><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__netconn__common.html#ga50490bab058f4e740798beffcf48cabf">netconn_recv</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetbuf.html">netbuf</a> **new_buf)</td></tr>
+<tr class="separator:ga50490bab058f4e740798beffcf48cabf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8e1d852119bda1e1b602c2995282ef0c"><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__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c">netconn_sendto</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetbuf.html">netbuf</a> *buf, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, u16_t port)</td></tr>
+<tr class="separator:ga8e1d852119bda1e1b602c2995282ef0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac4d4d10153d47c80a783c34b27c66238"><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__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238">netconn_send</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetbuf.html">netbuf</a> *buf)</td></tr>
+<tr class="separator:gac4d4d10153d47c80a783c34b27c66238"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacf9ce6f71652739d6be2ca83f7c423bf"><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__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf">netconn_write_partly</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, const void *dataptr, size_t size, u8_t apiflags, size_t *bytes_written)</td></tr>
+<tr class="separator:gacf9ce6f71652739d6be2ca83f7c423bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a992b4fe8a855fd94861738f7260d0a32"><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="api__lib_8c.html#a992b4fe8a855fd94861738f7260d0a32">netconn_write_vectors_partly</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetvector.html">netvector</a> *vectors, u16_t vectorcnt, u8_t apiflags, size_t *bytes_written)</td></tr>
+<tr class="separator:a992b4fe8a855fd94861738f7260d0a32"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga25bb1c1c9928f91f53149a026e2e2624"><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__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624">netconn_close</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn)</td></tr>
+<tr class="separator:ga25bb1c1c9928f91f53149a026e2e2624"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab9eccae90351eb6c3d2ca690068445d4"><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__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4">netconn_err</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn)</td></tr>
+<tr class="separator:gab9eccae90351eb6c3d2ca690068445d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6ec6b2cf7b0f59e9371e38ae7dea2a63"><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__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63">netconn_shutdown</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, u8_t shut_rx, u8_t shut_tx)</td></tr>
+<tr class="separator:ga6ec6b2cf7b0f59e9371e38ae7dea2a63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaaf2f92eeb38dca70b3e6ad98c3c45ed"><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__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed">netconn_join_leave_group</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *multiaddr, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *netif_addr, enum <a class="el" href="api_8h.html#a5c6ded2c082de1536019b197a0a912db">netconn_igmp</a> join_or_leave)</td></tr>
+<tr class="separator:gaaaf2f92eeb38dca70b3e6ad98c3c45ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5db2a1cf06a5fbb36f433e637da8729b"><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__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b">netconn_join_leave_group_netif</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *multiaddr, u8_t if_idx, enum <a class="el" href="api_8h.html#a5c6ded2c082de1536019b197a0a912db">netconn_igmp</a> join_or_leave)</td></tr>
+<tr class="separator:ga5db2a1cf06a5fbb36f433e637da8729b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafb3494b149dff96ed8d1acb770ab52f5"><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__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5">netconn_gethostbyname_addrtype</a> (const char *name, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, u8_t dns_addrtype)</td></tr>
+<tr class="separator:gafb3494b149dff96ed8d1acb770ab52f5"><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>Sequential API External module </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a28430d1d86733f1bf98dc31305c42104"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a28430d1d86733f1bf98dc31305c42104">&#9670;&nbsp;</a></span>netconn_getaddr()</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> netconn_getaddr </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>local</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get the local or remote IP address and port of a netconn. For RAW netconns, this returns the protocol instead of a port!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn to query </td></tr>
+    <tr><td class="paramname">addr</td><td>a pointer to which to save the IP address </td></tr>
+    <tr><td class="paramname">port</td><td>a pointer to which to save the port (or protocol for RAW) </td></tr>
+    <tr><td class="paramname">local</td><td>1 to get the local IP address, 0 to get the remote one </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_CONN for invalid connections ERR_OK if the information was retrieved </dd></dl>
+
+</div>
+</div>
+<a id="ad0a0434e5ff08bb350740cb840e2aca8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad0a0434e5ff08bb350740cb840e2aca8">&#9670;&nbsp;</a></span>netconn_new_with_proto_and_callback()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetconn.html">netconn</a>* netconn_new_with_proto_and_callback </td>
+          <td>(</td>
+          <td class="paramtype">enum <a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a>&#160;</td>
+          <td class="paramname"><em>t</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="api_8h.html#a3e130339f00202b3ab714af502163a2d">netconn_callback</a>&#160;</td>
+          <td class="paramname"><em>callback</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create a new netconn (of a specific type) that has a callback function. The corresponding pcb is also created.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">t</td><td>the type of 'connection' to create (</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd>enum <a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a>) </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">proto</td><td>the IP protocol for RAW IP pcbs </td></tr>
+    <tr><td class="paramname">callback</td><td>a function to call on status changes (RX available, TX'ed) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a newly allocated struct netconn or NULL on memory error </dd></dl>
+
+</div>
+</div>
+<a id="a805a90b546c5a149f04782351633979b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a805a90b546c5a149f04782351633979b">&#9670;&nbsp;</a></span>netconn_recv_udp_raw_netbuf()</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> netconn_recv_udp_raw_netbuf </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetbuf.html">netbuf</a> **&#160;</td>
+          <td class="paramname"><em>new_buf</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Receive data (in form of a netbuf) from a UDP or RAW netconn</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn from which to receive data </td></tr>
+    <tr><td class="paramname">new_buf</td><td>pointer where a new netbuf is stored when received data </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if data has been received, an error code otherwise (timeout, memory error or another error) ERR_ARG if conn is not a UDP/RAW netconn </dd></dl>
+
+</div>
+</div>
+<a id="a505c3b8e400babf9681e09c945b7f421"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a505c3b8e400babf9681e09c945b7f421">&#9670;&nbsp;</a></span>netconn_recv_udp_raw_netbuf_flags()</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> netconn_recv_udp_raw_netbuf_flags </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetbuf.html">netbuf</a> **&#160;</td>
+          <td class="paramname"><em>new_buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>apiflags</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Receive data (in form of a netbuf) from a UDP or RAW netconn</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn from which to receive data </td></tr>
+    <tr><td class="paramname">new_buf</td><td>pointer where a new netbuf is stored when received data </td></tr>
+    <tr><td class="paramname">apiflags</td><td>flags that control function behaviour. For now only:<ul>
+<li>NETCONN_DONTBLOCK: only read data that is available now, don't wait for more data </li>
+</ul>
+</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if data has been received, an error code otherwise (timeout, memory error or another error) ERR_ARG if conn is not a UDP/RAW netconn </dd></dl>
+
+</div>
+</div>
+<a id="a992b4fe8a855fd94861738f7260d0a32"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a992b4fe8a855fd94861738f7260d0a32">&#9670;&nbsp;</a></span>netconn_write_vectors_partly()</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> netconn_write_vectors_partly </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetvector.html">netvector</a> *&#160;</td>
+          <td class="paramname"><em>vectors</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>vectorcnt</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>apiflags</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t *&#160;</td>
+          <td class="paramname"><em>bytes_written</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send vectorized data atomically over a TCP netconn.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the TCP netconn over which to send data </td></tr>
+    <tr><td class="paramname">vectors</td><td>array of vectors containing data to send </td></tr>
+    <tr><td class="paramname">vectorcnt</td><td>number of vectors in the array </td></tr>
+    <tr><td class="paramname">apiflags</td><td>combination of following flags :<ul>
+<li>NETCONN_COPY: data will be copied into memory belonging to the stack</li>
+<li>NETCONN_MORE: for TCP connection, PSH flag will be set on last segment sent</li>
+<li>NETCONN_DONTBLOCK: only write the data if all data can be written at once </li>
+</ul>
+</td></tr>
+    <tr><td class="paramname">bytes_written</td><td>pointer to a location that receives the number of written bytes </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if data was sent, any other err_t on error </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_da61e3e9a357748887e3ca8d7c5a0c16.html">api</a></li><li class="navelem"><a class="el" href="api__lib_8c.html">api_lib.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/api__lib_8c.js b/doc/doxygen/output/html/api__lib_8c.js
new file mode 100644
index 0000000..3deb4e6
--- /dev/null
+++ b/doc/doxygen/output/html/api__lib_8c.js
@@ -0,0 +1,28 @@
+var api__lib_8c =
+[
+    [ "netconn_accept", "group__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69", null ],
+    [ "netconn_bind", "group__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230", null ],
+    [ "netconn_bind_if", "group__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5", null ],
+    [ "netconn_close", "group__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624", null ],
+    [ "netconn_connect", "group__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77", null ],
+    [ "netconn_delete", "group__netconn__common.html#gab411221f912a6d9e4c82ac3963989403", null ],
+    [ "netconn_disconnect", "group__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402", null ],
+    [ "netconn_err", "group__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4", null ],
+    [ "netconn_getaddr", "api__lib_8c.html#a28430d1d86733f1bf98dc31305c42104", null ],
+    [ "netconn_gethostbyname_addrtype", "group__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5", null ],
+    [ "netconn_join_leave_group", "group__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed", null ],
+    [ "netconn_join_leave_group_netif", "group__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b", null ],
+    [ "netconn_listen_with_backlog", "group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d", null ],
+    [ "netconn_new_with_proto_and_callback", "api__lib_8c.html#ad0a0434e5ff08bb350740cb840e2aca8", null ],
+    [ "netconn_prepare_delete", "group__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0", null ],
+    [ "netconn_recv", "group__netconn__common.html#ga50490bab058f4e740798beffcf48cabf", null ],
+    [ "netconn_recv_tcp_pbuf", "group__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490", null ],
+    [ "netconn_recv_tcp_pbuf_flags", "group__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294", null ],
+    [ "netconn_recv_udp_raw_netbuf", "api__lib_8c.html#a805a90b546c5a149f04782351633979b", null ],
+    [ "netconn_recv_udp_raw_netbuf_flags", "api__lib_8c.html#a505c3b8e400babf9681e09c945b7f421", null ],
+    [ "netconn_send", "group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238", null ],
+    [ "netconn_sendto", "group__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c", null ],
+    [ "netconn_shutdown", "group__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63", null ],
+    [ "netconn_write_partly", "group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf", null ],
+    [ "netconn_write_vectors_partly", "api__lib_8c.html#a992b4fe8a855fd94861738f7260d0a32", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/api__msg_8c.html b/doc/doxygen/output/html/api__msg_8c.html
new file mode 100644
index 0000000..e3942ac
--- /dev/null
+++ b/doc/doxygen/output/html/api__msg_8c.html
@@ -0,0 +1,626 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/api/api_msg.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('api__msg_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">api_msg.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 &quot;<a class="el" href="api__msg_8h.html">lwip/priv/api_msg.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.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="udp_8h.html">lwip/udp.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="raw_8h.html">lwip/raw.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="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="mld6_8h.html">lwip/mld6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tcpip__priv_8h.html">lwip/priv/tcpip_priv.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:abc6e1a4f8dd4640ab00eae4bbfdb7236"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#abc6e1a4f8dd4640ab00eae4bbfdb7236">lwip_netconn_do_newconn</a> (void *m)</td></tr>
+<tr class="separator:abc6e1a4f8dd4640ab00eae4bbfdb7236"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a919865fa64270a3e4cb719ddff2fead9"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#a919865fa64270a3e4cb719ddff2fead9">netconn_alloc</a> (enum <a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a> t, <a class="el" href="api_8h.html#a3e130339f00202b3ab714af502163a2d">netconn_callback</a> callback)</td></tr>
+<tr class="separator:a919865fa64270a3e4cb719ddff2fead9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a875b82ad129bdec1c6f2c21cbeedc48b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#a875b82ad129bdec1c6f2c21cbeedc48b">netconn_free</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn)</td></tr>
+<tr class="separator:a875b82ad129bdec1c6f2c21cbeedc48b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9e77da8492e93d570bc1ec37f3c91d59"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#a9e77da8492e93d570bc1ec37f3c91d59">lwip_netconn_do_delconn</a> (void *m)</td></tr>
+<tr class="separator:a9e77da8492e93d570bc1ec37f3c91d59"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa8e265922cda9f7fd54bf39e4ecf3768"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#aa8e265922cda9f7fd54bf39e4ecf3768">lwip_netconn_do_bind</a> (void *m)</td></tr>
+<tr class="separator:aa8e265922cda9f7fd54bf39e4ecf3768"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af4fed475f06818552ffefc8a1eda6605"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#af4fed475f06818552ffefc8a1eda6605">lwip_netconn_do_bind_if</a> (void *m)</td></tr>
+<tr class="separator:af4fed475f06818552ffefc8a1eda6605"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6f18f57eeda7b0596110930e696f9902"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#a6f18f57eeda7b0596110930e696f9902">lwip_netconn_do_connect</a> (void *m)</td></tr>
+<tr class="separator:a6f18f57eeda7b0596110930e696f9902"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adec8a5ddbcbdacba099c630c8310d34a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#adec8a5ddbcbdacba099c630c8310d34a">lwip_netconn_do_disconnect</a> (void *m)</td></tr>
+<tr class="separator:adec8a5ddbcbdacba099c630c8310d34a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa7d753d86818bfd77c1d73dab8dc943f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#aa7d753d86818bfd77c1d73dab8dc943f">lwip_netconn_do_listen</a> (void *m)</td></tr>
+<tr class="separator:aa7d753d86818bfd77c1d73dab8dc943f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac714bdd3d57e34f0a6517a469d80df6c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#ac714bdd3d57e34f0a6517a469d80df6c">lwip_netconn_do_send</a> (void *m)</td></tr>
+<tr class="separator:ac714bdd3d57e34f0a6517a469d80df6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab6ae6036baf5c8fef22228ceb5e3ff9f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#ab6ae6036baf5c8fef22228ceb5e3ff9f">lwip_netconn_do_recv</a> (void *m)</td></tr>
+<tr class="separator:ab6ae6036baf5c8fef22228ceb5e3ff9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc455a5f63fa3bc85022e34861a2fea5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#afc455a5f63fa3bc85022e34861a2fea5">lwip_netconn_do_accepted</a> (void *m)</td></tr>
+<tr class="separator:afc455a5f63fa3bc85022e34861a2fea5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aca4545a471ead1bc673ea93fe85f7e5c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#aca4545a471ead1bc673ea93fe85f7e5c">lwip_netconn_do_write</a> (void *m)</td></tr>
+<tr class="separator:aca4545a471ead1bc673ea93fe85f7e5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af33f432db6e3f111d4ee5876089e4163"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#af33f432db6e3f111d4ee5876089e4163">lwip_netconn_do_getaddr</a> (void *m)</td></tr>
+<tr class="separator:af33f432db6e3f111d4ee5876089e4163"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff73e0fcdc13c7cb97a4bfbd71a4347d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#aff73e0fcdc13c7cb97a4bfbd71a4347d">lwip_netconn_do_close</a> (void *m)</td></tr>
+<tr class="separator:aff73e0fcdc13c7cb97a4bfbd71a4347d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7402b52416828906a5679828cce37546"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#a7402b52416828906a5679828cce37546">lwip_netconn_do_join_leave_group</a> (void *m)</td></tr>
+<tr class="separator:a7402b52416828906a5679828cce37546"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aacc47257c0a5aa5eb107da0cfc699722"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#aacc47257c0a5aa5eb107da0cfc699722">lwip_netconn_do_join_leave_group_netif</a> (void *m)</td></tr>
+<tr class="separator:aacc47257c0a5aa5eb107da0cfc699722"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd3802b2f12e27928ccc0f759b887d61"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html#afd3802b2f12e27928ccc0f759b887d61">lwip_netconn_do_gethostbyname</a> (void *arg)</td></tr>
+<tr class="separator:afd3802b2f12e27928ccc0f759b887d61"><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>Sequential API Internal module </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="afc455a5f63fa3bc85022e34861a2fea5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afc455a5f63fa3bc85022e34861a2fea5">&#9670;&nbsp;</a></span>lwip_netconn_do_accepted()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_accepted </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Indicate that a TCP pcb has been accepted Called from netconn_accept</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aa8e265922cda9f7fd54bf39e4ecf3768"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa8e265922cda9f7fd54bf39e4ecf3768">&#9670;&nbsp;</a></span>lwip_netconn_do_bind()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_bind </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Bind a pcb contained in a netconn Called from netconn_bind.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection and containing the IP address and port to bind to </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="af4fed475f06818552ffefc8a1eda6605"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af4fed475f06818552ffefc8a1eda6605">&#9670;&nbsp;</a></span>lwip_netconn_do_bind_if()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_bind_if </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Bind a pcb contained in a netconn to an interface Called from netconn_bind_if.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection and containing the IP address and port to bind to </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aff73e0fcdc13c7cb97a4bfbd71a4347d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aff73e0fcdc13c7cb97a4bfbd71a4347d">&#9670;&nbsp;</a></span>lwip_netconn_do_close()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_close </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Close or half-shutdown a TCP pcb contained in a netconn Called from netconn_close In contrast to closing sockets, the netconn is not deallocated.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a6f18f57eeda7b0596110930e696f9902"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6f18f57eeda7b0596110930e696f9902">&#9670;&nbsp;</a></span>lwip_netconn_do_connect()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_connect </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Connect a pcb contained inside a netconn Called from netconn_connect.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection and containing the IP address and port to connect to </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a9e77da8492e93d570bc1ec37f3c91d59"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9e77da8492e93d570bc1ec37f3c91d59">&#9670;&nbsp;</a></span>lwip_netconn_do_delconn()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_delconn </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Delete the pcb inside a netconn. Called from netconn_delete.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="adec8a5ddbcbdacba099c630c8310d34a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adec8a5ddbcbdacba099c630c8310d34a">&#9670;&nbsp;</a></span>lwip_netconn_do_disconnect()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_disconnect </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Disconnect a pcb contained inside a netconn Only used for UDP netconns. Called from netconn_disconnect.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection to disconnect </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="af33f432db6e3f111d4ee5876089e4163"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af33f432db6e3f111d4ee5876089e4163">&#9670;&nbsp;</a></span>lwip_netconn_do_getaddr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_getaddr </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return a connection's local or remote address Called from netconn_getaddr</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="afd3802b2f12e27928ccc0f759b887d61"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afd3802b2f12e27928ccc0f759b887d61">&#9670;&nbsp;</a></span>lwip_netconn_do_gethostbyname()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_gethostbyname </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Execute a DNS query Called from netconn_gethostbyname</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>the <a class="el" href="structdns__api__msg.html">dns_api_msg</a> pointing to the query </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a7402b52416828906a5679828cce37546"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7402b52416828906a5679828cce37546">&#9670;&nbsp;</a></span>lwip_netconn_do_join_leave_group()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_join_leave_group </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Join multicast groups for UDP netconns. Called from netconn_join_leave_group</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aacc47257c0a5aa5eb107da0cfc699722"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aacc47257c0a5aa5eb107da0cfc699722">&#9670;&nbsp;</a></span>lwip_netconn_do_join_leave_group_netif()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_join_leave_group_netif </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Join multicast groups for UDP netconns. Called from netconn_join_leave_group_netif</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aa7d753d86818bfd77c1d73dab8dc943f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa7d753d86818bfd77c1d73dab8dc943f">&#9670;&nbsp;</a></span>lwip_netconn_do_listen()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_listen </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set a TCP pcb contained in a netconn into listen mode Called from netconn_listen.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="abc6e1a4f8dd4640ab00eae4bbfdb7236"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abc6e1a4f8dd4640ab00eae4bbfdb7236">&#9670;&nbsp;</a></span>lwip_netconn_do_newconn()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_newconn </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create a new pcb of a specific type inside a netconn. Called from netconn_new_with_proto_and_callback.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> describing the connection type </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab6ae6036baf5c8fef22228ceb5e3ff9f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab6ae6036baf5c8fef22228ceb5e3ff9f">&#9670;&nbsp;</a></span>lwip_netconn_do_recv()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_recv </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Indicate data has been received from a TCP pcb contained in a netconn Called from netconn_recv</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ac714bdd3d57e34f0a6517a469d80df6c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac714bdd3d57e34f0a6517a469d80df6c">&#9670;&nbsp;</a></span>lwip_netconn_do_send()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_send </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send some data on a RAW or UDP pcb contained in a netconn Called from netconn_send</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aca4545a471ead1bc673ea93fe85f7e5c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aca4545a471ead1bc673ea93fe85f7e5c">&#9670;&nbsp;</a></span>lwip_netconn_do_write()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_write </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send some data on a TCP pcb contained in a netconn Called from netconn_write</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a919865fa64270a3e4cb719ddff2fead9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a919865fa64270a3e4cb719ddff2fead9">&#9670;&nbsp;</a></span>netconn_alloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetconn.html">netconn</a>* netconn_alloc </td>
+          <td>(</td>
+          <td class="paramtype">enum <a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a>&#160;</td>
+          <td class="paramname"><em>t</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="api_8h.html#a3e130339f00202b3ab714af502163a2d">netconn_callback</a>&#160;</td>
+          <td class="paramname"><em>callback</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create a new netconn (of a specific type) that has a callback function. The corresponding pcb is NOT created!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">t</td><td>the type of 'connection' to create (</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd>enum <a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a>) </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">callback</td><td>a function to call on status changes (RX available, TX'ed) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a newly allocated struct netconn or NULL on memory error </dd></dl>
+
+</div>
+</div>
+<a id="a875b82ad129bdec1c6f2c21cbeedc48b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a875b82ad129bdec1c6f2c21cbeedc48b">&#9670;&nbsp;</a></span>netconn_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netconn_free </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Delete a netconn and all its resources. The pcb is NOT freed (since we might not be in the right thread context do this).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn to free </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_da61e3e9a357748887e3ca8d7c5a0c16.html">api</a></li><li class="navelem"><a class="el" href="api__msg_8c.html">api_msg.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/api__msg_8c.js b/doc/doxygen/output/html/api__msg_8c.js
new file mode 100644
index 0000000..7c4c093
--- /dev/null
+++ b/doc/doxygen/output/html/api__msg_8c.js
@@ -0,0 +1,21 @@
+var api__msg_8c =
+[
+    [ "lwip_netconn_do_accepted", "api__msg_8c.html#afc455a5f63fa3bc85022e34861a2fea5", null ],
+    [ "lwip_netconn_do_bind", "api__msg_8c.html#aa8e265922cda9f7fd54bf39e4ecf3768", null ],
+    [ "lwip_netconn_do_bind_if", "api__msg_8c.html#af4fed475f06818552ffefc8a1eda6605", null ],
+    [ "lwip_netconn_do_close", "api__msg_8c.html#aff73e0fcdc13c7cb97a4bfbd71a4347d", null ],
+    [ "lwip_netconn_do_connect", "api__msg_8c.html#a6f18f57eeda7b0596110930e696f9902", null ],
+    [ "lwip_netconn_do_delconn", "api__msg_8c.html#a9e77da8492e93d570bc1ec37f3c91d59", null ],
+    [ "lwip_netconn_do_disconnect", "api__msg_8c.html#adec8a5ddbcbdacba099c630c8310d34a", null ],
+    [ "lwip_netconn_do_getaddr", "api__msg_8c.html#af33f432db6e3f111d4ee5876089e4163", null ],
+    [ "lwip_netconn_do_gethostbyname", "api__msg_8c.html#afd3802b2f12e27928ccc0f759b887d61", null ],
+    [ "lwip_netconn_do_join_leave_group", "api__msg_8c.html#a7402b52416828906a5679828cce37546", null ],
+    [ "lwip_netconn_do_join_leave_group_netif", "api__msg_8c.html#aacc47257c0a5aa5eb107da0cfc699722", null ],
+    [ "lwip_netconn_do_listen", "api__msg_8c.html#aa7d753d86818bfd77c1d73dab8dc943f", null ],
+    [ "lwip_netconn_do_newconn", "api__msg_8c.html#abc6e1a4f8dd4640ab00eae4bbfdb7236", null ],
+    [ "lwip_netconn_do_recv", "api__msg_8c.html#ab6ae6036baf5c8fef22228ceb5e3ff9f", null ],
+    [ "lwip_netconn_do_send", "api__msg_8c.html#ac714bdd3d57e34f0a6517a469d80df6c", null ],
+    [ "lwip_netconn_do_write", "api__msg_8c.html#aca4545a471ead1bc673ea93fe85f7e5c", null ],
+    [ "netconn_alloc", "api__msg_8c.html#a919865fa64270a3e4cb719ddff2fead9", null ],
+    [ "netconn_free", "api__msg_8c.html#a875b82ad129bdec1c6f2c21cbeedc48b", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/api__msg_8h.html b/doc/doxygen/output/html/api__msg_8h.html
new file mode 100644
index 0000000..2f188e0
--- /dev/null
+++ b/doc/doxygen/output/html/api__msg_8h.html
@@ -0,0 +1,629 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/priv/api_msg.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('api__msg_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">api_msg.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="arch_8h.html">lwip/arch.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="err_8h.html">lwip/err.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="igmp_8h.html">lwip/igmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="api_8h.html">lwip/api.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tcpip__priv_8h.html">lwip/priv/tcpip_priv.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structapi__msg.html">api_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="structdns__api__msg.html">dns_api_msg</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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:abc6e1a4f8dd4640ab00eae4bbfdb7236"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#abc6e1a4f8dd4640ab00eae4bbfdb7236">lwip_netconn_do_newconn</a> (void *m)</td></tr>
+<tr class="separator:abc6e1a4f8dd4640ab00eae4bbfdb7236"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9e77da8492e93d570bc1ec37f3c91d59"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#a9e77da8492e93d570bc1ec37f3c91d59">lwip_netconn_do_delconn</a> (void *m)</td></tr>
+<tr class="separator:a9e77da8492e93d570bc1ec37f3c91d59"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa8e265922cda9f7fd54bf39e4ecf3768"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#aa8e265922cda9f7fd54bf39e4ecf3768">lwip_netconn_do_bind</a> (void *m)</td></tr>
+<tr class="separator:aa8e265922cda9f7fd54bf39e4ecf3768"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af4fed475f06818552ffefc8a1eda6605"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#af4fed475f06818552ffefc8a1eda6605">lwip_netconn_do_bind_if</a> (void *m)</td></tr>
+<tr class="separator:af4fed475f06818552ffefc8a1eda6605"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6f18f57eeda7b0596110930e696f9902"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#a6f18f57eeda7b0596110930e696f9902">lwip_netconn_do_connect</a> (void *m)</td></tr>
+<tr class="separator:a6f18f57eeda7b0596110930e696f9902"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adec8a5ddbcbdacba099c630c8310d34a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#adec8a5ddbcbdacba099c630c8310d34a">lwip_netconn_do_disconnect</a> (void *m)</td></tr>
+<tr class="separator:adec8a5ddbcbdacba099c630c8310d34a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa7d753d86818bfd77c1d73dab8dc943f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#aa7d753d86818bfd77c1d73dab8dc943f">lwip_netconn_do_listen</a> (void *m)</td></tr>
+<tr class="separator:aa7d753d86818bfd77c1d73dab8dc943f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac714bdd3d57e34f0a6517a469d80df6c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#ac714bdd3d57e34f0a6517a469d80df6c">lwip_netconn_do_send</a> (void *m)</td></tr>
+<tr class="separator:ac714bdd3d57e34f0a6517a469d80df6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab6ae6036baf5c8fef22228ceb5e3ff9f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#ab6ae6036baf5c8fef22228ceb5e3ff9f">lwip_netconn_do_recv</a> (void *m)</td></tr>
+<tr class="separator:ab6ae6036baf5c8fef22228ceb5e3ff9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc455a5f63fa3bc85022e34861a2fea5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#afc455a5f63fa3bc85022e34861a2fea5">lwip_netconn_do_accepted</a> (void *m)</td></tr>
+<tr class="separator:afc455a5f63fa3bc85022e34861a2fea5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aca4545a471ead1bc673ea93fe85f7e5c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#aca4545a471ead1bc673ea93fe85f7e5c">lwip_netconn_do_write</a> (void *m)</td></tr>
+<tr class="separator:aca4545a471ead1bc673ea93fe85f7e5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af33f432db6e3f111d4ee5876089e4163"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#af33f432db6e3f111d4ee5876089e4163">lwip_netconn_do_getaddr</a> (void *m)</td></tr>
+<tr class="separator:af33f432db6e3f111d4ee5876089e4163"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff73e0fcdc13c7cb97a4bfbd71a4347d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#aff73e0fcdc13c7cb97a4bfbd71a4347d">lwip_netconn_do_close</a> (void *m)</td></tr>
+<tr class="separator:aff73e0fcdc13c7cb97a4bfbd71a4347d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7402b52416828906a5679828cce37546"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#a7402b52416828906a5679828cce37546">lwip_netconn_do_join_leave_group</a> (void *m)</td></tr>
+<tr class="separator:a7402b52416828906a5679828cce37546"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aacc47257c0a5aa5eb107da0cfc699722"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#aacc47257c0a5aa5eb107da0cfc699722">lwip_netconn_do_join_leave_group_netif</a> (void *m)</td></tr>
+<tr class="separator:aacc47257c0a5aa5eb107da0cfc699722"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd3802b2f12e27928ccc0f759b887d61"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#afd3802b2f12e27928ccc0f759b887d61">lwip_netconn_do_gethostbyname</a> (void *arg)</td></tr>
+<tr class="separator:afd3802b2f12e27928ccc0f759b887d61"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a919865fa64270a3e4cb719ddff2fead9"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#a919865fa64270a3e4cb719ddff2fead9">netconn_alloc</a> (enum <a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a> t, <a class="el" href="api_8h.html#a3e130339f00202b3ab714af502163a2d">netconn_callback</a> callback)</td></tr>
+<tr class="separator:a919865fa64270a3e4cb719ddff2fead9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a875b82ad129bdec1c6f2c21cbeedc48b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html#a875b82ad129bdec1c6f2c21cbeedc48b">netconn_free</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn)</td></tr>
+<tr class="separator:a875b82ad129bdec1c6f2c21cbeedc48b"><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>netconn API lwIP internal implementations (do not use in application code) </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="afc455a5f63fa3bc85022e34861a2fea5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afc455a5f63fa3bc85022e34861a2fea5">&#9670;&nbsp;</a></span>lwip_netconn_do_accepted()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_accepted </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Indicate that a TCP pcb has been accepted Called from netconn_accept</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aa8e265922cda9f7fd54bf39e4ecf3768"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa8e265922cda9f7fd54bf39e4ecf3768">&#9670;&nbsp;</a></span>lwip_netconn_do_bind()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_bind </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Bind a pcb contained in a netconn Called from netconn_bind.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection and containing the IP address and port to bind to </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="af4fed475f06818552ffefc8a1eda6605"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af4fed475f06818552ffefc8a1eda6605">&#9670;&nbsp;</a></span>lwip_netconn_do_bind_if()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_bind_if </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Bind a pcb contained in a netconn to an interface Called from netconn_bind_if.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection and containing the IP address and port to bind to </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aff73e0fcdc13c7cb97a4bfbd71a4347d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aff73e0fcdc13c7cb97a4bfbd71a4347d">&#9670;&nbsp;</a></span>lwip_netconn_do_close()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_close </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Close or half-shutdown a TCP pcb contained in a netconn Called from netconn_close In contrast to closing sockets, the netconn is not deallocated.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a6f18f57eeda7b0596110930e696f9902"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6f18f57eeda7b0596110930e696f9902">&#9670;&nbsp;</a></span>lwip_netconn_do_connect()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_connect </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Connect a pcb contained inside a netconn Called from netconn_connect.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection and containing the IP address and port to connect to </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a9e77da8492e93d570bc1ec37f3c91d59"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9e77da8492e93d570bc1ec37f3c91d59">&#9670;&nbsp;</a></span>lwip_netconn_do_delconn()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_delconn </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Delete the pcb inside a netconn. Called from netconn_delete.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="adec8a5ddbcbdacba099c630c8310d34a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adec8a5ddbcbdacba099c630c8310d34a">&#9670;&nbsp;</a></span>lwip_netconn_do_disconnect()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_disconnect </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Disconnect a pcb contained inside a netconn Only used for UDP netconns. Called from netconn_disconnect.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection to disconnect </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="af33f432db6e3f111d4ee5876089e4163"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af33f432db6e3f111d4ee5876089e4163">&#9670;&nbsp;</a></span>lwip_netconn_do_getaddr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_getaddr </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return a connection's local or remote address Called from netconn_getaddr</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="afd3802b2f12e27928ccc0f759b887d61"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afd3802b2f12e27928ccc0f759b887d61">&#9670;&nbsp;</a></span>lwip_netconn_do_gethostbyname()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_gethostbyname </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Execute a DNS query Called from netconn_gethostbyname</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>the <a class="el" href="structdns__api__msg.html">dns_api_msg</a> pointing to the query </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a7402b52416828906a5679828cce37546"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7402b52416828906a5679828cce37546">&#9670;&nbsp;</a></span>lwip_netconn_do_join_leave_group()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_join_leave_group </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Join multicast groups for UDP netconns. Called from netconn_join_leave_group</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aacc47257c0a5aa5eb107da0cfc699722"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aacc47257c0a5aa5eb107da0cfc699722">&#9670;&nbsp;</a></span>lwip_netconn_do_join_leave_group_netif()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_join_leave_group_netif </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Join multicast groups for UDP netconns. Called from netconn_join_leave_group_netif</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aa7d753d86818bfd77c1d73dab8dc943f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa7d753d86818bfd77c1d73dab8dc943f">&#9670;&nbsp;</a></span>lwip_netconn_do_listen()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_listen </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set a TCP pcb contained in a netconn into listen mode Called from netconn_listen.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="abc6e1a4f8dd4640ab00eae4bbfdb7236"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abc6e1a4f8dd4640ab00eae4bbfdb7236">&#9670;&nbsp;</a></span>lwip_netconn_do_newconn()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_newconn </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create a new pcb of a specific type inside a netconn. Called from netconn_new_with_proto_and_callback.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> describing the connection type </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab6ae6036baf5c8fef22228ceb5e3ff9f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab6ae6036baf5c8fef22228ceb5e3ff9f">&#9670;&nbsp;</a></span>lwip_netconn_do_recv()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_recv </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Indicate data has been received from a TCP pcb contained in a netconn Called from netconn_recv</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ac714bdd3d57e34f0a6517a469d80df6c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac714bdd3d57e34f0a6517a469d80df6c">&#9670;&nbsp;</a></span>lwip_netconn_do_send()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_send </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send some data on a RAW or UDP pcb contained in a netconn Called from netconn_send</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aca4545a471ead1bc673ea93fe85f7e5c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aca4545a471ead1bc673ea93fe85f7e5c">&#9670;&nbsp;</a></span>lwip_netconn_do_write()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_netconn_do_write </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send some data on a TCP pcb contained in a netconn Called from netconn_write</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the <a class="el" href="structapi__msg.html">api_msg</a> pointing to the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a919865fa64270a3e4cb719ddff2fead9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a919865fa64270a3e4cb719ddff2fead9">&#9670;&nbsp;</a></span>netconn_alloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetconn.html">netconn</a>* netconn_alloc </td>
+          <td>(</td>
+          <td class="paramtype">enum <a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a>&#160;</td>
+          <td class="paramname"><em>t</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="api_8h.html#a3e130339f00202b3ab714af502163a2d">netconn_callback</a>&#160;</td>
+          <td class="paramname"><em>callback</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create a new netconn (of a specific type) that has a callback function. The corresponding pcb is NOT created!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">t</td><td>the type of 'connection' to create (</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd>enum <a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a>) </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">callback</td><td>a function to call on status changes (RX available, TX'ed) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a newly allocated struct netconn or NULL on memory error </dd></dl>
+
+</div>
+</div>
+<a id="a875b82ad129bdec1c6f2c21cbeedc48b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a875b82ad129bdec1c6f2c21cbeedc48b">&#9670;&nbsp;</a></span>netconn_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netconn_free </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Delete a netconn and all its resources. The pcb is NOT freed (since we might not be in the right thread context do this).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn to free </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_460c501b2432fc107adcb38111835e48.html">priv</a></li><li class="navelem"><a class="el" href="api__msg_8h.html">api_msg.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/api__msg_8h.js b/doc/doxygen/output/html/api__msg_8h.js
new file mode 100644
index 0000000..61db976
--- /dev/null
+++ b/doc/doxygen/output/html/api__msg_8h.js
@@ -0,0 +1,23 @@
+var api__msg_8h =
+[
+    [ "api_msg", "structapi__msg.html", "structapi__msg" ],
+    [ "dns_api_msg", "structdns__api__msg.html", "structdns__api__msg" ],
+    [ "lwip_netconn_do_accepted", "api__msg_8h.html#afc455a5f63fa3bc85022e34861a2fea5", null ],
+    [ "lwip_netconn_do_bind", "api__msg_8h.html#aa8e265922cda9f7fd54bf39e4ecf3768", null ],
+    [ "lwip_netconn_do_bind_if", "api__msg_8h.html#af4fed475f06818552ffefc8a1eda6605", null ],
+    [ "lwip_netconn_do_close", "api__msg_8h.html#aff73e0fcdc13c7cb97a4bfbd71a4347d", null ],
+    [ "lwip_netconn_do_connect", "api__msg_8h.html#a6f18f57eeda7b0596110930e696f9902", null ],
+    [ "lwip_netconn_do_delconn", "api__msg_8h.html#a9e77da8492e93d570bc1ec37f3c91d59", null ],
+    [ "lwip_netconn_do_disconnect", "api__msg_8h.html#adec8a5ddbcbdacba099c630c8310d34a", null ],
+    [ "lwip_netconn_do_getaddr", "api__msg_8h.html#af33f432db6e3f111d4ee5876089e4163", null ],
+    [ "lwip_netconn_do_gethostbyname", "api__msg_8h.html#afd3802b2f12e27928ccc0f759b887d61", null ],
+    [ "lwip_netconn_do_join_leave_group", "api__msg_8h.html#a7402b52416828906a5679828cce37546", null ],
+    [ "lwip_netconn_do_join_leave_group_netif", "api__msg_8h.html#aacc47257c0a5aa5eb107da0cfc699722", null ],
+    [ "lwip_netconn_do_listen", "api__msg_8h.html#aa7d753d86818bfd77c1d73dab8dc943f", null ],
+    [ "lwip_netconn_do_newconn", "api__msg_8h.html#abc6e1a4f8dd4640ab00eae4bbfdb7236", null ],
+    [ "lwip_netconn_do_recv", "api__msg_8h.html#ab6ae6036baf5c8fef22228ceb5e3ff9f", null ],
+    [ "lwip_netconn_do_send", "api__msg_8h.html#ac714bdd3d57e34f0a6517a469d80df6c", null ],
+    [ "lwip_netconn_do_write", "api__msg_8h.html#aca4545a471ead1bc673ea93fe85f7e5c", null ],
+    [ "netconn_alloc", "api__msg_8h.html#a919865fa64270a3e4cb719ddff2fead9", null ],
+    [ "netconn_free", "api__msg_8h.html#a875b82ad129bdec1c6f2c21cbeedc48b", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/apps_2snmp_8h.html b/doc/doxygen/output/html/apps_2snmp_8h.html
new file mode 100644
index 0000000..9690568
--- /dev/null
+++ b/doc/doxygen/output/html/apps_2snmp_8h.html
@@ -0,0 +1,281 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/snmp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('apps_2snmp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">snmp.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_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="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structsnmp__varbind.html">snmp_varbind</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ae9310bbe1948b3c3bc64c073d4621019"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apps_2snmp_8h.html#ae9310bbe1948b3c3bc64c073d4621019">SNMP_GENTRAP_COLDSTART</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ae9310bbe1948b3c3bc64c073d4621019"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9a2e5824deab50e639b01181307a0926"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apps_2snmp_8h.html#a9a2e5824deab50e639b01181307a0926">SNMP_GENTRAP_WARMSTART</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:a9a2e5824deab50e639b01181307a0926"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1856efbe83199f456c34a4e5139dfb16"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apps_2snmp_8h.html#a1856efbe83199f456c34a4e5139dfb16">SNMP_GENTRAP_LINKDOWN</a>&#160;&#160;&#160;2</td></tr>
+<tr class="separator:a1856efbe83199f456c34a4e5139dfb16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afa665cdc02ccd5ee9fe0c4cb1b792186"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apps_2snmp_8h.html#afa665cdc02ccd5ee9fe0c4cb1b792186">SNMP_GENTRAP_LINKUP</a>&#160;&#160;&#160;3</td></tr>
+<tr class="separator:afa665cdc02ccd5ee9fe0c4cb1b792186"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaf312d8bdbeed2c02560321ab24a022f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apps_2snmp_8h.html#aaf312d8bdbeed2c02560321ab24a022f">SNMP_GENTRAP_AUTH_FAILURE</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:aaf312d8bdbeed2c02560321ab24a022f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac1cd822650d9ac66d0333a5ad600cfee"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apps_2snmp_8h.html#ac1cd822650d9ac66d0333a5ad600cfee">SNMP_GENTRAP_EGP_NEIGHBOR_LOSS</a>&#160;&#160;&#160;5</td></tr>
+<tr class="separator:ac1cd822650d9ac66d0333a5ad600cfee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3691cecfa911baa52ccf6054022ba43"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apps_2snmp_8h.html#ab3691cecfa911baa52ccf6054022ba43">SNMP_GENTRAP_ENTERPRISE_SPECIFIC</a>&#160;&#160;&#160;6</td></tr>
+<tr class="separator:ab3691cecfa911baa52ccf6054022ba43"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga4d88f2fc7655280384131d543e0d83e5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5">snmp_init</a> (void)</td></tr>
+<tr class="separator:ga4d88f2fc7655280384131d543e0d83e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga29c76474971f25d038fd486447c70e21"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#ga29c76474971f25d038fd486447c70e21">snmp_set_mibs</a> (const struct <a class="el" href="structsnmp__mib.html">snmp_mib</a> **mibs, u8_t num_mibs)</td></tr>
+<tr class="separator:ga29c76474971f25d038fd486447c70e21"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacc71ac857bf9215f06a624dda09abe3a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a">snmp_set_device_enterprise_oid</a> (const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *device_enterprise_oid)</td></tr>
+<tr class="separator:gacc71ac857bf9215f06a624dda09abe3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4dff82dda2553b9554a9f98561852a50"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#ga4dff82dda2553b9554a9f98561852a50">snmp_get_device_enterprise_oid</a> (void)</td></tr>
+<tr class="separator:ga4dff82dda2553b9554a9f98561852a50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab101505be59778cf0f2f1ac40bcf3f32"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32">snmp_trap_dst_enable</a> (u8_t dst_idx, u8_t enable)</td></tr>
+<tr class="separator:gab101505be59778cf0f2f1ac40bcf3f32"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga15e4afbf80ed2260850842e6608c6d86"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86">snmp_trap_dst_ip_set</a> (u8_t dst_idx, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dst)</td></tr>
+<tr class="separator:ga15e4afbf80ed2260850842e6608c6d86"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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"><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: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"><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:gacf277cbca915275190426aeef4cfb103"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#gacf277cbca915275190426aeef4cfb103">snmp_get_community</a> (void)</td></tr>
+<tr class="separator:gacf277cbca915275190426aeef4cfb103"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaba31b6f1816661df5a3b7f2076ee6ec0"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#gaba31b6f1816661df5a3b7f2076ee6ec0">snmp_get_community_write</a> (void)</td></tr>
+<tr class="separator:gaba31b6f1816661df5a3b7f2076ee6ec0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafdd3299e145f53cc826cc11a469f8409"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#gafdd3299e145f53cc826cc11a469f8409">snmp_get_community_trap</a> (void)</td></tr>
+<tr class="separator:gafdd3299e145f53cc826cc11a469f8409"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga30cc587a260757fdb2b81d462f430ef1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1">snmp_set_community</a> (const char *const community)</td></tr>
+<tr class="separator:ga30cc587a260757fdb2b81d462f430ef1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga341461766863cff46a44e5f431f2da01"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#ga341461766863cff46a44e5f431f2da01">snmp_set_community_write</a> (const char *const community)</td></tr>
+<tr class="separator:ga341461766863cff46a44e5f431f2da01"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5631711f357b6610be7e93b1c6d87760"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760">snmp_set_community_trap</a> (const char *const community)</td></tr>
+<tr class="separator:ga5631711f357b6610be7e93b1c6d87760"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa8a49d1a6a207740ba44e27b5bbc22be"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be">snmp_coldstart_trap</a> (void)</td></tr>
+<tr class="separator:gaa8a49d1a6a207740ba44e27b5bbc22be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SNMP server main API - start and basic configuration </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="aaf312d8bdbeed2c02560321ab24a022f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaf312d8bdbeed2c02560321ab24a022f">&#9670;&nbsp;</a></span>SNMP_GENTRAP_AUTH_FAILURE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_GENTRAP_AUTH_FAILURE&#160;&#160;&#160;4</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Generic trap: authentication failure </p>
+
+</div>
+</div>
+<a id="ae9310bbe1948b3c3bc64c073d4621019"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae9310bbe1948b3c3bc64c073d4621019">&#9670;&nbsp;</a></span>SNMP_GENTRAP_COLDSTART</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_GENTRAP_COLDSTART&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Generic trap: cold start </p>
+
+</div>
+</div>
+<a id="ac1cd822650d9ac66d0333a5ad600cfee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac1cd822650d9ac66d0333a5ad600cfee">&#9670;&nbsp;</a></span>SNMP_GENTRAP_EGP_NEIGHBOR_LOSS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_GENTRAP_EGP_NEIGHBOR_LOSS&#160;&#160;&#160;5</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Generic trap: EGP neighbor lost </p>
+
+</div>
+</div>
+<a id="ab3691cecfa911baa52ccf6054022ba43"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab3691cecfa911baa52ccf6054022ba43">&#9670;&nbsp;</a></span>SNMP_GENTRAP_ENTERPRISE_SPECIFIC</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_GENTRAP_ENTERPRISE_SPECIFIC&#160;&#160;&#160;6</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Generic trap: enterprise specific </p>
+
+</div>
+</div>
+<a id="a1856efbe83199f456c34a4e5139dfb16"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1856efbe83199f456c34a4e5139dfb16">&#9670;&nbsp;</a></span>SNMP_GENTRAP_LINKDOWN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_GENTRAP_LINKDOWN&#160;&#160;&#160;2</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Generic trap: link down </p>
+
+</div>
+</div>
+<a id="afa665cdc02ccd5ee9fe0c4cb1b792186"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afa665cdc02ccd5ee9fe0c4cb1b792186">&#9670;&nbsp;</a></span>SNMP_GENTRAP_LINKUP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_GENTRAP_LINKUP&#160;&#160;&#160;3</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Generic trap: link up </p>
+
+</div>
+</div>
+<a id="a9a2e5824deab50e639b01181307a0926"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9a2e5824deab50e639b01181307a0926">&#9670;&nbsp;</a></span>SNMP_GENTRAP_WARMSTART</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_GENTRAP_WARMSTART&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Generic trap: warm start </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="dir_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="apps_2snmp_8h.html">snmp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/apps_2snmp_8h.js b/doc/doxygen/output/html/apps_2snmp_8h.js
new file mode 100644
index 0000000..7ccc3d7
--- /dev/null
+++ b/doc/doxygen/output/html/apps_2snmp_8h.js
@@ -0,0 +1,31 @@
+var apps_2snmp_8h =
+[
+    [ "snmp_varbind", "structsnmp__varbind.html", "structsnmp__varbind" ],
+    [ "SNMP_GENTRAP_AUTH_FAILURE", "apps_2snmp_8h.html#aaf312d8bdbeed2c02560321ab24a022f", null ],
+    [ "SNMP_GENTRAP_COLDSTART", "apps_2snmp_8h.html#ae9310bbe1948b3c3bc64c073d4621019", null ],
+    [ "SNMP_GENTRAP_EGP_NEIGHBOR_LOSS", "apps_2snmp_8h.html#ac1cd822650d9ac66d0333a5ad600cfee", null ],
+    [ "SNMP_GENTRAP_ENTERPRISE_SPECIFIC", "apps_2snmp_8h.html#ab3691cecfa911baa52ccf6054022ba43", null ],
+    [ "SNMP_GENTRAP_LINKDOWN", "apps_2snmp_8h.html#a1856efbe83199f456c34a4e5139dfb16", null ],
+    [ "SNMP_GENTRAP_LINKUP", "apps_2snmp_8h.html#afa665cdc02ccd5ee9fe0c4cb1b792186", null ],
+    [ "SNMP_GENTRAP_WARMSTART", "apps_2snmp_8h.html#a9a2e5824deab50e639b01181307a0926", null ],
+    [ "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_get_community", "group__snmp__core.html#gacf277cbca915275190426aeef4cfb103", null ],
+    [ "snmp_get_community_trap", "group__snmp__traps.html#gafdd3299e145f53cc826cc11a469f8409", null ],
+    [ "snmp_get_community_write", "group__snmp__core.html#gaba31b6f1816661df5a3b7f2076ee6ec0", null ],
+    [ "snmp_get_device_enterprise_oid", "group__snmp__core.html#ga4dff82dda2553b9554a9f98561852a50", null ],
+    [ "snmp_init", "group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5", null ],
+    [ "snmp_send_trap", "group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd", 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_device_enterprise_oid", "group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a", 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 ],
+    [ "snmp_trap_dst_ip_set", "group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/arch_8h.html b/doc/doxygen/output/html/arch_8h.html
new file mode 100644
index 0000000..187f97b
--- /dev/null
+++ b/doc/doxygen/output/html/arch_8h.html
@@ -0,0 +1,168 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/arch.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('arch_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">arch.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;arch/cc.h&quot;</code><br />
+<code>#include &lt;stdio.h&gt;</code><br />
+<code>#include &lt;stdlib.h&gt;</code><br />
+<code>#include &lt;stddef.h&gt;</code><br />
+<code>#include &lt;stdint.h&gt;</code><br />
+<code>#include &lt;inttypes.h&gt;</code><br />
+<code>#include &lt;limits.h&gt;</code><br />
+<code>#include &lt;ctype.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga1771b7fb65ee640524d0052f229768c3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga1771b7fb65ee640524d0052f229768c3">BYTE_ORDER</a>&#160;&#160;&#160;LITTLE_ENDIAN</td></tr>
+<tr class="separator:ga1771b7fb65ee640524d0052f229768c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga77370c377781ee7489e30eaf772ea05a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a">LWIP_RAND</a>()&#160;&#160;&#160;((u32_t)rand())</td></tr>
+<tr class="separator:ga77370c377781ee7489e30eaf772ea05a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaccef167be13a500ce30036030a9b142b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gaccef167be13a500ce30036030a9b142b">LWIP_PLATFORM_DIAG</a>(x)&#160;&#160;&#160;do {printf x;} while(0)</td></tr>
+<tr class="separator:gaccef167be13a500ce30036030a9b142b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7e8bcd0282525704d6dd596bdd1b47d0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga7e8bcd0282525704d6dd596bdd1b47d0">LWIP_PLATFORM_ASSERT</a>(x)</td></tr>
+<tr class="separator:ga7e8bcd0282525704d6dd596bdd1b47d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga53954d507c09e521ec0d44a2450bb89d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga53954d507c09e521ec0d44a2450bb89d">LWIP_NO_STDDEF_H</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga53954d507c09e521ec0d44a2450bb89d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga122c754db96ecad23bc6f4541d6360c1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga122c754db96ecad23bc6f4541d6360c1">LWIP_NO_STDINT_H</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga122c754db96ecad23bc6f4541d6360c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5bf52d6f2729d0c8afd365f69d7d4373"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga5bf52d6f2729d0c8afd365f69d7d4373">LWIP_NO_INTTYPES_H</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga5bf52d6f2729d0c8afd365f69d7d4373"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gade9c8513419a799cd78a07ae894bb805"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gade9c8513419a799cd78a07ae894bb805">LWIP_NO_LIMITS_H</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gade9c8513419a799cd78a07ae894bb805"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6871ce1e92ae09cdad39a9b230a3a800"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga6871ce1e92ae09cdad39a9b230a3a800">LWIP_NO_CTYPE_H</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga6871ce1e92ae09cdad39a9b230a3a800"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa0dd3f76dd9a837feaac61fedc0dbe72"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72">LWIP_CONST_CAST</a>(target_type,  val)&#160;&#160;&#160;((target_type)((ptrdiff_t)val))</td></tr>
+<tr class="separator:gaa0dd3f76dd9a837feaac61fedc0dbe72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaade87973d72135b0b3afccfff4f62eb8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gaade87973d72135b0b3afccfff4f62eb8">LWIP_ALIGNMENT_CAST</a>(target_type,  val)&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72">LWIP_CONST_CAST</a>(target_type, val)</td></tr>
+<tr class="separator:gaade87973d72135b0b3afccfff4f62eb8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga683e5c35d3263fe3145e6a6bc546604a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga683e5c35d3263fe3145e6a6bc546604a">LWIP_PTR_NUMERIC_CAST</a>(target_type,  val)&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72">LWIP_CONST_CAST</a>(target_type, val)</td></tr>
+<tr class="separator:ga683e5c35d3263fe3145e6a6bc546604a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4488578f18ad1a76e4fa8bc288c51446"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga4488578f18ad1a76e4fa8bc288c51446">LWIP_PACKED_CAST</a>(target_type,  val)&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72">LWIP_CONST_CAST</a>(target_type, val)</td></tr>
+<tr class="separator:ga4488578f18ad1a76e4fa8bc288c51446"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga651bb349041669fe717b19f127ef16c0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga651bb349041669fe717b19f127ef16c0">LWIP_DECLARE_MEMORY_ALIGNED</a>(variable_name,  size)&#160;&#160;&#160;u8_t variable_name[<a class="el" href="group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e">LWIP_MEM_ALIGN_BUFFER</a>(size)]</td></tr>
+<tr class="separator:ga651bb349041669fe717b19f127ef16c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaef204be511fd32f681b55abc08e9ae18"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18">LWIP_MEM_ALIGN_SIZE</a>(size)&#160;&#160;&#160;(((size) + <a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a> - 1U) &amp; ~(MEM_ALIGNMENT-1U))</td></tr>
+<tr class="separator:gaef204be511fd32f681b55abc08e9ae18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga25591dcb72fccc7b5dc46fbc1959694e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e">LWIP_MEM_ALIGN_BUFFER</a>(size)&#160;&#160;&#160;(((size) + <a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a> - 1U))</td></tr>
+<tr class="separator:ga25591dcb72fccc7b5dc46fbc1959694e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa8e8724eb1c220cbbb90de9e175ce1dc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gaa8e8724eb1c220cbbb90de9e175ce1dc">LWIP_MEM_ALIGN</a>(addr)&#160;&#160;&#160;((void *)(((mem_ptr_t)(addr) + <a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a> - 1) &amp; ~(mem_ptr_t)(<a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a>-1)))</td></tr>
+<tr class="separator:gaa8e8724eb1c220cbbb90de9e175ce1dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga73199061891adf1b912d20835c7d5e96"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga73199061891adf1b912d20835c7d5e96">PACK_STRUCT_BEGIN</a></td></tr>
+<tr class="separator:ga73199061891adf1b912d20835c7d5e96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga465fef70f294e21cbf4ea51fc342f20e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga465fef70f294e21cbf4ea51fc342f20e">PACK_STRUCT_END</a></td></tr>
+<tr class="separator:ga465fef70f294e21cbf4ea51fc342f20e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga33623da05bb55497534c3dc26ebebeb2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga33623da05bb55497534c3dc26ebebeb2">PACK_STRUCT_STRUCT</a></td></tr>
+<tr class="separator:ga33623da05bb55497534c3dc26ebebeb2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaab0b988124e37a978d9a88e7c1c778e0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gaab0b988124e37a978d9a88e7c1c778e0">PACK_STRUCT_FIELD</a>(x)&#160;&#160;&#160;x</td></tr>
+<tr class="separator:gaab0b988124e37a978d9a88e7c1c778e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa8f75e4117374c2d09fbda5566e40b62"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gaa8f75e4117374c2d09fbda5566e40b62">PACK_STRUCT_FLD_8</a>(x)&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaab0b988124e37a978d9a88e7c1c778e0">PACK_STRUCT_FIELD</a>(x)</td></tr>
+<tr class="separator:gaa8f75e4117374c2d09fbda5566e40b62"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacc89e224363eb0ebca24b64d925c3cb7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gacc89e224363eb0ebca24b64d925c3cb7">PACK_STRUCT_FLD_S</a>(x)&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaab0b988124e37a978d9a88e7c1c778e0">PACK_STRUCT_FIELD</a>(x)</td></tr>
+<tr class="separator:gacc89e224363eb0ebca24b64d925c3cb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga57b90d36d8bea3798a5d1815945fd8ef"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga57b90d36d8bea3798a5d1815945fd8ef">PACK_STRUCT_USE_INCLUDES</a></td></tr>
+<tr class="separator:ga57b90d36d8bea3798a5d1815945fd8ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga70624a5deb8b9199406372a7f3603ecf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga70624a5deb8b9199406372a7f3603ecf">LWIP_UNUSED_ARG</a>(x)&#160;&#160;&#160;(void)x</td></tr>
+<tr class="separator:ga70624a5deb8b9199406372a7f3603ecf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8e2cba4c97dd38f4d517ed21cf109ade"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga8e2cba4c97dd38f4d517ed21cf109ade">LWIP_PROVIDE_ERRNO</a></td></tr>
+<tr class="separator:ga8e2cba4c97dd38f4d517ed21cf109ade"><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>Support for different processor and compiler architectures </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="arch_8h.html">arch.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/arch_8h.js b/doc/doxygen/output/html/arch_8h.js
new file mode 100644
index 0000000..e79fac1
--- /dev/null
+++ b/doc/doxygen/output/html/arch_8h.js
@@ -0,0 +1,29 @@
+var arch_8h =
+[
+    [ "BYTE_ORDER", "group__compiler__abstraction.html#ga1771b7fb65ee640524d0052f229768c3", null ],
+    [ "LWIP_ALIGNMENT_CAST", "group__compiler__abstraction.html#gaade87973d72135b0b3afccfff4f62eb8", null ],
+    [ "LWIP_CONST_CAST", "group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72", null ],
+    [ "LWIP_DECLARE_MEMORY_ALIGNED", "group__compiler__abstraction.html#ga651bb349041669fe717b19f127ef16c0", null ],
+    [ "LWIP_MEM_ALIGN", "group__compiler__abstraction.html#gaa8e8724eb1c220cbbb90de9e175ce1dc", null ],
+    [ "LWIP_MEM_ALIGN_BUFFER", "group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e", null ],
+    [ "LWIP_MEM_ALIGN_SIZE", "group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18", null ],
+    [ "LWIP_NO_CTYPE_H", "group__compiler__abstraction.html#ga6871ce1e92ae09cdad39a9b230a3a800", null ],
+    [ "LWIP_NO_INTTYPES_H", "group__compiler__abstraction.html#ga5bf52d6f2729d0c8afd365f69d7d4373", null ],
+    [ "LWIP_NO_LIMITS_H", "group__compiler__abstraction.html#gade9c8513419a799cd78a07ae894bb805", null ],
+    [ "LWIP_NO_STDDEF_H", "group__compiler__abstraction.html#ga53954d507c09e521ec0d44a2450bb89d", null ],
+    [ "LWIP_NO_STDINT_H", "group__compiler__abstraction.html#ga122c754db96ecad23bc6f4541d6360c1", null ],
+    [ "LWIP_PACKED_CAST", "group__compiler__abstraction.html#ga4488578f18ad1a76e4fa8bc288c51446", null ],
+    [ "LWIP_PLATFORM_ASSERT", "group__compiler__abstraction.html#ga7e8bcd0282525704d6dd596bdd1b47d0", null ],
+    [ "LWIP_PLATFORM_DIAG", "group__compiler__abstraction.html#gaccef167be13a500ce30036030a9b142b", null ],
+    [ "LWIP_PROVIDE_ERRNO", "group__compiler__abstraction.html#ga8e2cba4c97dd38f4d517ed21cf109ade", null ],
+    [ "LWIP_PTR_NUMERIC_CAST", "group__compiler__abstraction.html#ga683e5c35d3263fe3145e6a6bc546604a", null ],
+    [ "LWIP_RAND", "group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a", null ],
+    [ "LWIP_UNUSED_ARG", "group__compiler__abstraction.html#ga70624a5deb8b9199406372a7f3603ecf", null ],
+    [ "PACK_STRUCT_BEGIN", "group__compiler__abstraction.html#ga73199061891adf1b912d20835c7d5e96", null ],
+    [ "PACK_STRUCT_END", "group__compiler__abstraction.html#ga465fef70f294e21cbf4ea51fc342f20e", null ],
+    [ "PACK_STRUCT_FIELD", "group__compiler__abstraction.html#gaab0b988124e37a978d9a88e7c1c778e0", null ],
+    [ "PACK_STRUCT_FLD_8", "group__compiler__abstraction.html#gaa8f75e4117374c2d09fbda5566e40b62", null ],
+    [ "PACK_STRUCT_FLD_S", "group__compiler__abstraction.html#gacc89e224363eb0ebca24b64d925c3cb7", null ],
+    [ "PACK_STRUCT_STRUCT", "group__compiler__abstraction.html#ga33623da05bb55497534c3dc26ebebeb2", null ],
+    [ "PACK_STRUCT_USE_INCLUDES", "group__compiler__abstraction.html#ga57b90d36d8bea3798a5d1815945fd8ef", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/autoip_8c.html b/doc/doxygen/output/html/autoip_8c.html
new file mode 100644
index 0000000..4c97ade
--- /dev/null
+++ b/doc/doxygen/output/html/autoip_8c.html
@@ -0,0 +1,285 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv4/autoip.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('autoip_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">autoip.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 &quot;<a class="el" href="mem_8h.html">lwip/mem.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="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="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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a634535156cc1a8cf9f04d3d5c74f8a59"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="autoip_8c.html#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"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="autoip_8c.html#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">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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: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"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="autoip_8c.html#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: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"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="autoip_8c.html#a746fc1d7db1bf1617afae166c9d92c2d">autoip_tmr</a> (void)</td></tr>
+<tr class="separator:a746fc1d7db1bf1617afae166c9d92c2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acaf2793325c60dc4531c21a3fd55c16e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="autoip_8c.html#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"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="autoip_8c.html#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>
+</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>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="acec75069f6e6ecbe200c5691e56ecd43"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acec75069f6e6ecbe200c5691e56ecd43">&#9670;&nbsp;</a></span>LWIP_AUTOIP_CREATE_SEED_ADDR</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_AUTOIP_CREATE_SEED_ADDR</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><a class="code" href="def_8c.html#a14f94347a5b9b9e3602705b75b7ae524">lwip_htonl</a>(AUTOIP_RANGE_START + ((u32_t)(((u8_t)(<a class="code" href="structnetif.html">netif</a>-&gt;<a class="code" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">hwaddr</a>[4])) | \</div><div class="line">                 ((u32_t)((u8_t)(<a class="code" href="structnetif.html">netif</a>-&gt;<a class="code" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">hwaddr</a>[5]))) &lt;&lt; 8)))</div><div class="ttc" id="structnetif_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="def_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="structnetif_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>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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a634535156cc1a8cf9f04d3d5c74f8a59">&#9670;&nbsp;</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">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></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" href="structnetif.html">netif</a>-&gt;<a class="code" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">hwaddr</a>[5]) &amp; 0xff) &lt;&lt; 24) | \</div><div class="line">                                   ((u32_t)((<a class="code" href="structnetif.html">netif</a>-&gt;<a class="code" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">hwaddr</a>[3]) &amp; 0xff) &lt;&lt; 16) | \</div><div class="line">                                   ((u32_t)((<a class="code" href="structnetif.html">netif</a>-&gt;<a class="code" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">hwaddr</a>[2]) &amp; 0xff) &lt;&lt; 8) | \</div><div class="line">                                   ((u32_t)((<a class="code" href="structnetif.html">netif</a>-&gt;<a class="code" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">hwaddr</a>[4]) &amp; 0xff))) + \</div><div class="line">                                   (netif_autoip_data(<a class="code" href="structnetif.html">netif</a>)? netif_autoip_data(<a class="code" href="structnetif.html">netif</a>)-&gt;tried_llipaddr : 0))</div><div class="ttc" id="structnetif_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="structnetif_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>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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acaf2793325c60dc4531c21a3fd55c16e">&#9670;&nbsp;</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> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structetharp__hdr.html">etharp_hdr</a> *&#160;</td>
+          <td class="paramname"><em>hdr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a11df7a20d52680cd8c1c18fba2b91e9e">&#9670;&nbsp;</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>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></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>
+
+</div>
+</div>
+<a id="a1b4f0c53da17395d9de92a85708a1bb9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1b4f0c53da17395d9de92a85708a1bb9">&#9670;&nbsp;</a></span>autoip_supplied_address()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <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> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>check if AutoIP supplied netif-&gt;<a class="el" href="structip__addr.html">ip_addr</a></p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the netif to check </td></tr>
+  </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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a746fc1d7db1bf1617afae166c9d92c2d">&#9670;&nbsp;</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&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Has to be called in loop every AUTOIP_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="autoip_8c.html">autoip.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/autoip_8c.js b/doc/doxygen/output/html/autoip_8c.js
new file mode 100644
index 0000000..5d43343
--- /dev/null
+++ b/doc/doxygen/output/html/autoip_8c.js
@@ -0,0 +1,12 @@
+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_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 ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/autoip_8h.html b/doc/doxygen/output/html/autoip_8h.html
new file mode 100644
index 0000000..8d5d92c
--- /dev/null
+++ b/doc/doxygen/output/html/autoip_8h.html
@@ -0,0 +1,276 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/autoip.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('autoip_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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-->
+<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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a8986919a452ab77eec9a199ff6668e92"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="autoip_8h.html#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"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="autoip_8h.html#aaeb4b778fce078bee84144ab50916b15">autoip_remove_struct</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;do { (<a class="el" href="structnetif.html">netif</a>)-&gt;<a class="el" href="structautoip.html">autoip</a> = NULL; } while (0)</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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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: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"><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"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="autoip_8h.html#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"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="autoip_8h.html#a746fc1d7db1bf1617afae166c9d92c2d">autoip_tmr</a> (void)</td></tr>
+<tr class="separator:a746fc1d7db1bf1617afae166c9d92c2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a11df7a20d52680cd8c1c18fba2b91e9e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="autoip_8h.html#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"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="autoip_8h.html#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>
+</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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaeb4b778fce078bee84144ab50916b15">&#9670;&nbsp;</a></span>autoip_remove_struct</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define autoip_remove_struct</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td>&#160;&#160;&#160;do { (<a class="el" href="structnetif.html">netif</a>)-&gt;<a class="el" href="structautoip.html">autoip</a> = NULL; } while (0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8986919a452ab77eec9a199ff6668e92">&#9670;&nbsp;</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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acaf2793325c60dc4531c21a3fd55c16e">&#9670;&nbsp;</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> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structetharp__hdr.html">etharp_hdr</a> *&#160;</td>
+          <td class="paramname"><em>hdr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a11df7a20d52680cd8c1c18fba2b91e9e">&#9670;&nbsp;</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>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></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>
+
+</div>
+</div>
+<a id="a1b4f0c53da17395d9de92a85708a1bb9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1b4f0c53da17395d9de92a85708a1bb9">&#9670;&nbsp;</a></span>autoip_supplied_address()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <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> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>check if AutoIP supplied netif-&gt;<a class="el" href="structip__addr.html">ip_addr</a></p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the netif to check </td></tr>
+  </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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a746fc1d7db1bf1617afae166c9d92c2d">&#9670;&nbsp;</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&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Has to be called in loop every AUTOIP_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="autoip_8h.html">autoip.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/autoip_8h.js b/doc/doxygen/output/html/autoip_8h.js
new file mode 100644
index 0000000..121e938
--- /dev/null
+++ b/doc/doxygen/output/html/autoip_8h.js
@@ -0,0 +1,13 @@
+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_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 ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/bridgeif_8c.html b/doc/doxygen/output/html/bridgeif_8c.html
new file mode 100644
index 0000000..9dc363f
--- /dev/null
+++ b/doc/doxygen/output/html/bridgeif_8c.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/netif/bridgeif.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('bridgeif_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">bridgeif.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="bridgeif_8h.html">netif/bridgeif.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="sys_8h.html">lwip/sys.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="ethip6_8h.html">lwip/ethip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp_8h.html">lwip/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="timeouts_8h.html">lwip/timeouts.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gad20fea2657431d4a0905be80cb0b4666"><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__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666">bridgeif_fdb_add</a> (struct <a class="el" href="structnetif.html">netif</a> *bridgeif, const struct <a class="el" href="structeth__addr.html">eth_addr</a> *addr, bridgeif_portmask_t ports)</td></tr>
+<tr class="separator:gad20fea2657431d4a0905be80cb0b4666"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga79349b1e9d0f944e8abad5a6cfb1c8e8"><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__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8">bridgeif_fdb_remove</a> (struct <a class="el" href="structnetif.html">netif</a> *bridgeif, const struct <a class="el" href="structeth__addr.html">eth_addr</a> *addr)</td></tr>
+<tr class="separator:ga79349b1e9d0f944e8abad5a6cfb1c8e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga23cc2c5f8fccefc470093840cc53727c"><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__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c">bridgeif_init</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga23cc2c5f8fccefc470093840cc53727c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga51b7d1af22f7023aabd8502aadf77c77"><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__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77">bridgeif_add_port</a> (struct <a class="el" href="structnetif.html">netif</a> *bridgeif, struct <a class="el" href="structnetif.html">netif</a> *portif)</td></tr>
+<tr class="separator:ga51b7d1af22f7023aabd8502aadf77c77"><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>lwIP netif implementing an IEEE 802.1D MAC Bridge </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_900e6f7ff90690cb8edb53323dd38d80.html">netif</a></li><li class="navelem"><a class="el" href="bridgeif_8c.html">bridgeif.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/bridgeif_8c.js b/doc/doxygen/output/html/bridgeif_8c.js
new file mode 100644
index 0000000..c1611fa
--- /dev/null
+++ b/doc/doxygen/output/html/bridgeif_8c.js
@@ -0,0 +1,7 @@
+var bridgeif_8c =
+[
+    [ "bridgeif_add_port", "group__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77", null ],
+    [ "bridgeif_fdb_add", "group__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666", null ],
+    [ "bridgeif_fdb_remove", "group__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8", null ],
+    [ "bridgeif_init", "group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/bridgeif_8h.html b/doc/doxygen/output/html/bridgeif_8h.html
new file mode 100644
index 0000000..4bd0be1
--- /dev/null
+++ b/doc/doxygen/output/html/bridgeif_8h.html
@@ -0,0 +1,146 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/netif/bridgeif.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('bridgeif_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">bridgeif.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="bridgeif__opts_8h.html">netif/bridgeif_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="lwip_2prot_2ethernet_8h.html">lwip/prot/ethernet.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tcpip_8h.html">lwip/tcpip.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structbridgeif__initdata__s.html">bridgeif_initdata_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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga3d41c7905b61aef3a3b8c61b3af7879f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif.html#ga3d41c7905b61aef3a3b8c61b3af7879f">BRIDGEIF_INITDATA1</a>(max_ports,  max_fdb_dynamic_entries,  max_fdb_static_entries,  ethaddr)&#160;&#160;&#160;{ethaddr, max_ports, max_fdb_dynamic_entries, max_fdb_static_entries}</td></tr>
+<tr class="separator:ga3d41c7905b61aef3a3b8c61b3af7879f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaaeb47fbf1dd6c30cb502343fa0d0741"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif.html#gaaaeb47fbf1dd6c30cb502343fa0d0741">BRIDGEIF_INITDATA2</a>(max_ports,  max_fdb_dynamic_entries,  max_fdb_static_entries,  e0,  e1,  e2,  e3,  e4,  e5)&#160;&#160;&#160;{{e0, e1, e2, e3, e4, e5}, max_ports, max_fdb_dynamic_entries, max_fdb_static_entries}</td></tr>
+<tr class="separator:gaaaeb47fbf1dd6c30cb502343fa0d0741"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gac47f8ce66bc6dad5dd9829467f93a1bb"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structbridgeif__initdata__s.html">bridgeif_initdata_s</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif.html#gac47f8ce66bc6dad5dd9829467f93a1bb">bridgeif_initdata_t</a></td></tr>
+<tr class="separator:gac47f8ce66bc6dad5dd9829467f93a1bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga23cc2c5f8fccefc470093840cc53727c"><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__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c">bridgeif_init</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga23cc2c5f8fccefc470093840cc53727c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga51b7d1af22f7023aabd8502aadf77c77"><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__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77">bridgeif_add_port</a> (struct <a class="el" href="structnetif.html">netif</a> *bridgeif, struct <a class="el" href="structnetif.html">netif</a> *portif)</td></tr>
+<tr class="separator:ga51b7d1af22f7023aabd8502aadf77c77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad20fea2657431d4a0905be80cb0b4666"><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__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666">bridgeif_fdb_add</a> (struct <a class="el" href="structnetif.html">netif</a> *bridgeif, const struct <a class="el" href="structeth__addr.html">eth_addr</a> *addr, bridgeif_portmask_t ports)</td></tr>
+<tr class="separator:gad20fea2657431d4a0905be80cb0b4666"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga79349b1e9d0f944e8abad5a6cfb1c8e8"><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__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8">bridgeif_fdb_remove</a> (struct <a class="el" href="structnetif.html">netif</a> *bridgeif, const struct <a class="el" href="structeth__addr.html">eth_addr</a> *addr)</td></tr>
+<tr class="separator:ga79349b1e9d0f944e8abad5a6cfb1c8e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad912bfd3ce8e24d0eb48b7dc9de07c39"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39">bridgeif_fdb_update_src</a> (void *fdb_ptr, struct <a class="el" href="structeth__addr.html">eth_addr</a> *src_addr, u8_t port_idx)</td></tr>
+<tr class="separator:gad912bfd3ce8e24d0eb48b7dc9de07c39"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga616fb7404be5da79d8092b4a14976750"><td class="memItemLeft" align="right" valign="top">bridgeif_portmask_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__fdb.html#ga616fb7404be5da79d8092b4a14976750">bridgeif_fdb_get_dst_ports</a> (void *fdb_ptr, struct <a class="el" href="structeth__addr.html">eth_addr</a> *dst_addr)</td></tr>
+<tr class="separator:ga616fb7404be5da79d8092b4a14976750"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf7935226ee7f99f964bf0135b6cb9ca0"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__fdb.html#gaf7935226ee7f99f964bf0135b6cb9ca0">bridgeif_fdb_init</a> (u16_t max_fdb_entries)</td></tr>
+<tr class="separator:gaf7935226ee7f99f964bf0135b6cb9ca0"><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>lwIP netif implementing an IEEE 802.1D MAC Bridge </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_c9a67764bf8a12cf6b427bb859cbcd0b.html">netif</a></li><li class="navelem"><a class="el" href="bridgeif_8h.html">bridgeif.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/bridgeif_8h.js b/doc/doxygen/output/html/bridgeif_8h.js
new file mode 100644
index 0000000..143396c
--- /dev/null
+++ b/doc/doxygen/output/html/bridgeif_8h.js
@@ -0,0 +1,13 @@
+var bridgeif_8h =
+[
+    [ "BRIDGEIF_INITDATA1", "group__bridgeif.html#ga3d41c7905b61aef3a3b8c61b3af7879f", null ],
+    [ "BRIDGEIF_INITDATA2", "group__bridgeif.html#gaaaeb47fbf1dd6c30cb502343fa0d0741", null ],
+    [ "bridgeif_initdata_t", "group__bridgeif.html#gac47f8ce66bc6dad5dd9829467f93a1bb", null ],
+    [ "bridgeif_add_port", "group__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77", null ],
+    [ "bridgeif_fdb_add", "group__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666", null ],
+    [ "bridgeif_fdb_get_dst_ports", "group__bridgeif__fdb.html#ga616fb7404be5da79d8092b4a14976750", null ],
+    [ "bridgeif_fdb_init", "group__bridgeif__fdb.html#gaf7935226ee7f99f964bf0135b6cb9ca0", null ],
+    [ "bridgeif_fdb_remove", "group__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8", null ],
+    [ "bridgeif_fdb_update_src", "group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39", null ],
+    [ "bridgeif_init", "group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/bridgeif__fdb_8c.html b/doc/doxygen/output/html/bridgeif__fdb_8c.html
new file mode 100644
index 0000000..33ede2a
--- /dev/null
+++ b/doc/doxygen/output/html/bridgeif__fdb_8c.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/netif/bridgeif_fdb.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('bridgeif__fdb_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">bridgeif_fdb.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="bridgeif_8h.html">netif/bridgeif.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="mem_8h.html">lwip/mem.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="timeouts_8h.html">lwip/timeouts.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gad912bfd3ce8e24d0eb48b7dc9de07c39"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39">bridgeif_fdb_update_src</a> (void *fdb_ptr, struct <a class="el" href="structeth__addr.html">eth_addr</a> *src_addr, u8_t port_idx)</td></tr>
+<tr class="separator:gad912bfd3ce8e24d0eb48b7dc9de07c39"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga616fb7404be5da79d8092b4a14976750"><td class="memItemLeft" align="right" valign="top">bridgeif_portmask_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__fdb.html#ga616fb7404be5da79d8092b4a14976750">bridgeif_fdb_get_dst_ports</a> (void *fdb_ptr, struct <a class="el" href="structeth__addr.html">eth_addr</a> *dst_addr)</td></tr>
+<tr class="separator:ga616fb7404be5da79d8092b4a14976750"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf7935226ee7f99f964bf0135b6cb9ca0"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__fdb.html#gaf7935226ee7f99f964bf0135b6cb9ca0">bridgeif_fdb_init</a> (u16_t max_fdb_entries)</td></tr>
+<tr class="separator:gaf7935226ee7f99f964bf0135b6cb9ca0"><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>lwIP netif implementing an FDB for IEEE 802.1D MAC Bridge </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_900e6f7ff90690cb8edb53323dd38d80.html">netif</a></li><li class="navelem"><a class="el" href="bridgeif__fdb_8c.html">bridgeif_fdb.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/bridgeif__fdb_8c.js b/doc/doxygen/output/html/bridgeif__fdb_8c.js
new file mode 100644
index 0000000..77e2d92
--- /dev/null
+++ b/doc/doxygen/output/html/bridgeif__fdb_8c.js
@@ -0,0 +1,6 @@
+var bridgeif__fdb_8c =
+[
+    [ "bridgeif_fdb_get_dst_ports", "group__bridgeif__fdb.html#ga616fb7404be5da79d8092b4a14976750", null ],
+    [ "bridgeif_fdb_init", "group__bridgeif__fdb.html#gaf7935226ee7f99f964bf0135b6cb9ca0", null ],
+    [ "bridgeif_fdb_update_src", "group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/bridgeif__opts_8h.html b/doc/doxygen/output/html/bridgeif__opts_8h.html
new file mode 100644
index 0000000..05f91b1
--- /dev/null
+++ b/doc/doxygen/output/html/bridgeif__opts_8h.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/netif/bridgeif_opts.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('bridgeif__opts_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">bridgeif_opts.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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga5aed5cd9b01ba1345b47845cd04ca30d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__opts.html#ga5aed5cd9b01ba1345b47845cd04ca30d">BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b">NO_SYS</a></td></tr>
+<tr class="separator:ga5aed5cd9b01ba1345b47845cd04ca30d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6fe03b84359150b7dea3dfca942b6414"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__opts.html#ga6fe03b84359150b7dea3dfca942b6414">BRIDGEIF_MAX_PORTS</a>&#160;&#160;&#160;7</td></tr>
+<tr class="separator:ga6fe03b84359150b7dea3dfca942b6414"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaab45e20e9b09a98217994082968cec73"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__opts.html#gaab45e20e9b09a98217994082968cec73">BRIDGEIF_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gaab45e20e9b09a98217994082968cec73"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga72e389f592470dc50288a68f3db70730"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__opts.html#ga72e389f592470dc50288a68f3db70730">BRIDGEIF_FDB_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga72e389f592470dc50288a68f3db70730"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac456e97b1b0e9a57449596a2b229763a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__opts.html#gac456e97b1b0e9a57449596a2b229763a">BRIDGEIF_FW_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gac456e97b1b0e9a57449596a2b229763a"><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>lwIP netif implementing an IEEE 802.1D MAC Bridge </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_c9a67764bf8a12cf6b427bb859cbcd0b.html">netif</a></li><li class="navelem"><a class="el" href="bridgeif__opts_8h.html">bridgeif_opts.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/bridgeif__opts_8h.js b/doc/doxygen/output/html/bridgeif__opts_8h.js
new file mode 100644
index 0000000..4321688
--- /dev/null
+++ b/doc/doxygen/output/html/bridgeif__opts_8h.js
@@ -0,0 +1,8 @@
+var bridgeif__opts_8h =
+[
+    [ "BRIDGEIF_DEBUG", "group__bridgeif__opts.html#gaab45e20e9b09a98217994082968cec73", null ],
+    [ "BRIDGEIF_FDB_DEBUG", "group__bridgeif__opts.html#ga72e389f592470dc50288a68f3db70730", null ],
+    [ "BRIDGEIF_FW_DEBUG", "group__bridgeif__opts.html#gac456e97b1b0e9a57449596a2b229763a", null ],
+    [ "BRIDGEIF_MAX_PORTS", "group__bridgeif__opts.html#ga6fe03b84359150b7dea3dfca942b6414", null ],
+    [ "BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT", "group__bridgeif__opts.html#ga5aed5cd9b01ba1345b47845cd04ca30d", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/bugs.html b/doc/doxygen/output/html/bugs.html
new file mode 100644
index 0000000..542190c
--- /dev/null
+++ b/doc/doxygen/output/html/bugs.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Reporting bugs</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('bugs.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">Reporting bugs </div>  </div>
+</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>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/changelog.html b/doc/doxygen/output/html/changelog.html
new file mode 100644
index 0000000..e53dfb9
--- /dev/null
+++ b/doc/doxygen/output/html/changelog.html
@@ -0,0 +1,4657 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Changelog</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('changelog.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">Changelog </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><h2>2.1.0 </h2>
+<ul>
+<li>Support TLS via new <a class="el" href="group__altcp__api.html">Application layered TCP Introduction</a> connection API (https, smtps, mqtt over TLS)</li>
+<li>Switch to cmake as the main build system (Makefile file lists are still maintained for now)</li>
+<li>Improve IPv6 support: support address scopes, support stateless DHCPv6, bugfixes</li>
+<li>Add debug helper asserts to ensure threading/locking requirements are met</li>
+<li>Add <a class="el" href="group__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a">sys_mbox_trypost_fromisr()</a> and <a class="el" href="group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666">tcpip_callbackmsg_trycallback_fromisr()</a> (for FreeRTOS, mainly)</li>
+<li>socket API: support <a class="el" href="group__socket.html#ga80ae38841b0e64e60618cd8bf857f617">poll()</a>, <a class="el" href="group__socket.html#gaad99bea090b1fe4743234fcee15a5d28">sendmsg()</a> and <a class="el" href="group__socket.html#gaecfc7d524105e52604829c66ced752b8">recvmsg()</a>; fix problems on close</li>
+</ul>
+<h2>Detailed Changelog </h2>
+<pre class="fragment">HISTORY
+ * These are only the most important changes. For a full list, use git log:
+   http://git.savannah.nongnu.org/cgit/lwip.git
+
+(git master)
+
+  * [Enter new changes just after this line - do not remove this line]
+
+(STABLE-2.1.2):
+
+  ++ Bugfixes:
+
+  2018-11-21: Jens Nielsen
+  * netbiosns.c: fix expecting too large packet (bug #55069)
+
+  2018-11-19: Dirk Ziegelmeier
+  * smtp.c: fix compiling with strict C compatibility because of strnlen (bug #55034)
+
+  2018-11-12: Simon Goldschmidt
+  * tcp.c: fix overflow check in tcp_recved triggering invalid assertion (bug #55015)
+
+  2018-11-12: Simon Goldschmidt
+  * tcp.c: fix a bug in sending RST segments (sent from port 0)
+
+(STABLE-2.1.1):
+
+  ++ Bugfixes:
+
+  2018-11-01: Joan Lledó
+  * sockets.c: fix bad assertion in lwip_poll_dec_sockets_used() (bug #54933)
+
+  2018-11-01: Dirk Ziegelmeier
+  * ip4.c: don't send 127.* to default netif (bug #54670)
+
+  2018-10-23: David Girault
+  * altcp_tls_mbedtls.c: fix use-after free (bug #54774)
+
+  2018-10-23: Ognjen Bjelica, Dirk Ziegelmeier
+  * snmp_scalar.c: Avoid NULL pointer dereference (bug #54886)
+
+  2018-10-23: Simon Goldschmidt
+  * Fix missing standard includes in multiple files
+
+  2018-10-17: Ivan Warren
+  * def.h: fix casting htonX and ntohX to u16_t (bug #54850)
+
+  2018-10-12: Simon Goldschmidt
+  * Revert "tcp_abandon: no need to buffer pcb-&gt;local_port" (fix that source port was 0 for RST
+    called when aborting a connection)
+
+  2018-10-11: Jonas Rabenstein
+  * tcp.c: tcp_recved: check for overflow and warn about too big values (patch #9699)              
+
+  2018-10-06: Joan Lledó
+  * sockets.c: alloc_socket(): Check for LWIP_SOCKET_POLL when setting select-
+    related variables (patch #9696)
+
+  2018-10-04: Spencer
+  * tcp.c: Update prev pointer when skipping entries in tcp_slowtmr (patch #9694)
+
+  2018-09-27: Martine Lenders
+  * lowpan6.c: Fix IEEE 802.15.4 address setting (bug #54749)
+
+(STABLE-2.1.0):
+
+  ++ New features:
+
+  2018-06-17: Simon Goldschmidt
+  * lwiperf: implemented iPerf client mode
+
+  2018-04-23: Dirk Ziegelmeier
+  * added cmake build files
+
+  2018-03-04: Ray Abram
+  * netbios responder: respond to '*' queries
+
+  2018-02-23: Benjamin Aigner
+  * 6lowpan: add 6lowpan-over-BLE netif (based on existing 6lowpan netif)
+
+  2018-02-22: Simon Goldschmidt
+  * ipv6: add support for stateless DHCPv6 (to get DNS servers in SLAAC nets)
+
+  2018-02-16: Simon Goldschmidt
+  * add raw API http(s) client (with proxy support)
+
+  2018-02-01: Simon Goldschmidt
+  * tcp: add hooks to implement additional socket options
+
+  2018-02-01: Simon Goldschmidt
+  * tcp: add hooks to implement tcp md5 signatures or similar (see contrib/addons for an example)
+
+  2018-01-05: Simon Goldschmidt
+  * Added sys_mbox_trypost_fromisr() and tcpip_callbackmsg_trycallback_fromisr()
+    These can be used to post preallocated messages from an ISR to the tcpip thread
+    (e.g. when using FreeRTOS)
+
+  2018-01-02: Dirk Ziegelmeier
+  * task #14780: Add debug helper asserts to ensure threading/locking requirements are met
+
+  2017-11-21: Simon Goldschmidt
+  * task #14600: tcp_alloc(): kill TF_CLOSEPEND connections before other ESTABLISHED
+
+  2017-11-21: Simon Goldschmidt
+  * makefsdata: added option "-ssi:&lt;filename&gt;" to control SSI tag checking/insertion
+    through a list of filenames, not by checking the file extension at runtime
+
+  2017-11-20: Joel Cunningham
+  * netconn: add LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE to use external DNS resolver (patch #9427)
+
+  2017-11-14: Joel Cunningham
+  * netifapi: Add thread safe ARP cache APIs (task #14724)
+
+  2017-11-06: Axel Lin
+  * TCP: kill existing connections with a LOWER priority than the one currently being opened.
+    Previous implementations also kill existing connections of the SAME priority.
+
+  2017-09-21: Kalle Olavi Niemitalo
+  * sockets: add poll() implementation (patch #9450)
+
+  2017-09-10: Joel Cunningham
+  * sockets: add readv() implementation (task #14610)
+
+  2017-08-04: Simon Goldschmidt
+  * Clean up DHCP a bit: no need keep msg_out and msg_in as members in struct
+    dhcp - they are used in a call stack only (p_out and options_out_len as well)
+
+  2017-08-04: Simon Goldschmidt
+  * pbuf: split pbuf_header(s16_t) into pbuf_add_header(size_t) and
+    pbuf_remove_header(size_t)
+
+  2017-07-20: Douglas
+  * sys: deprecate sys_arch_sem_wait and sys_arch_mbox_fetch returning the
+    time waited rather they are now defined to return != SYS_ARCH_TIMEOUT
+    on success.
+
+  2017-07-03: Jakub Schmidtke
+  * tcp: added support for sending TCP SACKs
+
+  2017-06-20: Joel Cunningham
+  * netconn/netdb: added core locking support to netconn_gethostbyname (task #14523)
+
+  2017-04-25: Simon Goldschmidt
+  * dhcp: added two hooks for adding and parsing user defined DHCP options
+
+  2017-04-25: Joel Cunningham
+  * sockets: added recvmsg for UDP (together with CMSG and IP_PKTINFO) (task #14247)
+
+  2017-04-20: Joel Cunningham
+  * tcp: added Appropriate Byte Counting support (task #14128)
+
+  2017-04-11: Simon Goldschmidt
+  * netconn/sockets: remove fatal error handling, fix asynchronous error handling,
+    ensure data before RST can be received
+
+  2017-03-30: Simon Goldschmidt
+  * added "application layered TCP" connection API (altcp) for seamless integration
+    of TLS or proxy connections
+
+  2017-03-09: Simon Goldschmidt
+  * sockets: add recvmsg for TCP
+
+  2017-03-02: Joel Cunningham
+  * netconn/sockets: vectorize netconn_write for TCP, treating a vectored I/O write
+    atomically in regards to TCP segmentation (patch #8882)
+
+  2017-03-02: Simon Goldschmidt
+  * netconn: added nonblocking accept/recv to netconn API (task #14396)
+
+  2017-02-28: Simon Goldschmidt
+  * Added LWIP_SINGLE_NETIF for small targets with only one netif
+
+  2017-02-10: David van Moolenbroek
+  * Implement UDP and RAW multicast support for IPv6 (core API, not netconn/sockets)
+
+  2017-02-04: David van Moolenbroek
+  * IPv6 scopes support
+
+  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
+    - Add raw_sendto_if_src()
+    - Support IP_HDRINCL socket option
+
+  ++ Bugfixes:
+
+  2018-06-19: Simon Goldschmidt
+  * tcp: fix RTO timer not working if link is down
+
+  2018-06-15: Sylvain Rochet
+  * ppp: multiple smaller bugfixes
+
+  2018-05-17: Simon Goldschmidt
+  * etharp: arp table can now be bigger than 127 entries
+
+  2018-04-25: Jens Nielsen
+  * tftp server: correctly handle retransmissions
+
+  2018-04-18: Simon Goldschmidt
+  sockets: fix race conditions when closing full-duplex sockets
+
+  2018-03-09: Simon Goldschmidt
+  * 6lowpan: fix to work against contiki; added ZigBee encapsulation netif for tests
+
+  2018-02-04: Simon Goldschmidt
+  * sockets: fix inconsistencies on close (inconsistent error codes, double FIN)
+
+  2018-01-05: Dirk Ziegelmeier
+  * Fix bug #52748: the bug in timeouts.c by reimplementing timer logic to use
+    absolute instead of relative timeout values
+
+  2017-12-31: Dirk Ziegelmeier
+  * Fix bug #52704: DHCP and bad OFFER: Stop timeout only if offer is accepted
+
+  2017-11-08: Joel Cunningham
+  * netif: ensure link and admin states are up in issue reports (bug #52353)
+
+  2017-09-12: David Lockyer
+  * select: allocate select_cb from memp for LWIP_MPU_COMPATIBLE = 1 (bug #51990)
+
+  2017-09-11: Simon Goldschmidt
+  * tcp_in.c: fix bug #51937 (leaking tcp_pcbs on passive close with unacked data)
+
+  2017-08-11: Joel Cunningham
+  * lwip_itoa: fix converting the number 0 (previously converted to '\0') (bug #51729)
+
+  2017-08-08: Dirk Ziegelmeier
+  * ip4_route_src: parameter order is reversed: ip4_route_src(dest, src) -&gt; ip4_route_src(src, dest)
+    to make parameter order consistent with other ip*_route*() functions
+    Same also applies to LWIP_HOOK_IP4_ROUTE_SRC() parameter order.
+
+  2017-08-04: Joel Cunningham
+  * tcp: re-work persist timer to fully close window (details in bug #50837)
+
+  2017-07-26: Simon Goldschmidt
+  * snmp_msg.c: fix bug #51578 (SNMP failed to decode some values on non 32bit platforms)
+
+  2017-07-20: Simon Goldschmidt
+  * compatibility headers: moved from 'src/include/posix' to 'src/include/compat/posix',
+    'src/include/compat/stdc' etc.
+
+  2017-05-09: Joel Cunningham
+  * tcp: add zero-window probe timeout (bug #50837)
+
+  2017-04-11: Simon Goldschmidt
+  * sockets.c: task #14420 (Remove sys_sem_signal from inside SYS_ARCH_PROTECT
+    crit section) done for LWIP_TCPIP_CORE_LOCKING==1
+
+  2017-02-24: Simon Goldschmidt
+  * sockets.c: fixed close race conditions in lwip_select (for LWIP_NETCONN_FULLDUPLEX)
+
+  2017-02-24: Simon Goldschmidt
+  * sockets.c: fixed that select ignored invalid/not open sockets in the fd_sets (bug #50392)
+
+  2017-01-11: David van Moolenbroek
+  * Lots of IPv6 related fixes and improvements
+
+(STABLE-2.0.3)
+
+  ++ Bugfixes:
+
+  2017-09-11: Simon Goldschmidt
+  * tcp_in.c: fix bug #51937 (leaking tcp_pcbs on passive close with unacked data)
+
+  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
+
+  2017-03-23: Dirk Ziegelmeier
+  * dhcp.h: fix bug #50618 (dhcp_remove_struct() macro does not work)
+
+(STABLE-2.0.2)
+
+  ++ New features:
+
+  2017-02-10: Dirk Ziegelmeier
+  * Implement task #14367: Hooks need a better place to be defined:
+    We now have a #define for a header file name that is #included in every .c
+    file that provides hooks.
+
+  2017-02-10: Simon Goldschmidt
+  * tcp_close does not fail on memory error (instead, FIN is sent from tcp_tmr)
+
+  ++ Bugfixes:
+
+  2017-03-08
+  * tcp: do not keep sending SYNs when getting ACKs
+
+  2017-03-08: Joel Cunningham
+  * tcp: Initialize ssthresh to TCP_SND_BUF (bug #50476)
+
+  2017-03-01: Simon Goldschmidt
+  * httpd: LWIP_HTTPD_POST_MANUAL_WND: fixed double-free when httpd_post_data_recved
+    is called nested from httpd_post_receive_data() (bug #50424)
+
+  2017-02-28: David van Moolenbroek/Simon Goldschmidt
+  * tcp: fixed bug #50418: LWIP_EVENT_API: fix invalid calbacks for SYN_RCVD pcb
+
+  2017-02-17: Simon Goldschmidt
+  * dns: Improved DNS_LOCAL_HOSTLIST interface (bug #50325)
+
+  2017-02-16: Simon Goldschmidt
+  * LWIP_NETCONN_FULLDUPLEX: fixed shutdown during write (bug #50274)
+
+  2017-02-13: Simon Goldschmidt/Dirk Ziegelmeier
+  * For tiny targtes, LWIP_RAND is optional (fix compile time checks)
+
+  2017-02-10: Simon Goldschmidt
+  * tcp: Fixed bug #47485 (tcp_close() should not fail on memory error) by retrying
+    to send FIN from tcp_fasttmr
+
+  2017-02-09: Simon Goldschmidt
+  * sockets: Fixed bug #44032 (LWIP_NETCONN_FULLDUPLEX: select might work on
+    invalid/reused socket) by not allowing to reallocate a socket that has
+    "select_waiting != 0"
+
+  2017-02-09: Simon Goldschmidt
+  * httpd: Fixed bug #50059 (httpd LWIP_HTTPD_SUPPORT_11_KEEPALIVE vs.
+    LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED)
+
+  2017-02-08: Dirk Ziegelmeier
+  * Rename "IPv6 mapped IPv4 addresses" to their correct name from RFC4191:
+    "IPv4-mapped IPv6 address"
+
+  2017-02-08: Luc Revardel
+  * mld6.c: Fix bug #50220 (mld6_leavegroup does not send ICMP6_TYPE_MLD, even
+    if last reporter)
+
+  2017-02-08: David van Moolenbroek
+  * ip6.c: Patch #9250: fix source substitution in ip6_output_if()
+
+  2017-02-08: Simon Goldschmidt
+  * tcp_out.c: Fixed bug #50090 (last_unsent-&gt;oversize_left can become wrong value
+    in tcp_write error path)
+
+  2017-02-02: Dirk Ziegelmeier
+  * Fix bug #50206: UDP Netconn bind to IP6_ADDR_ANY fails
+
+  2017-01-18: Dirk Ziegelmeier
+  * Fix zero-copy RX, see bug bug #50064. PBUF_REFs were not supported as ARP requests.
+
+  2017-01-15: Axel Lin, Dirk Ziegelmeier
+  * minor bug fixes in mqtt
+
+  2017-01-11: Knut Andre Tidemann
+  * sockets/netconn: fix broken default ICMPv6 handling of checksums
+
+(STABLE-2.0.1)
+
+  ++ New features:
+
+  2016-12-31: Simon Goldschmidt
+  * tcp.h/.c: added function tcp_listen_with_backlog_and_err() to get the error
+    reason when listening fails (bug #49861)
+
+  2016-12-20: Erik Andersen
+  * Add MQTT client
+
+  2016-12-14: Jan Breuer:
+  * opt.h, ndc.h/.c: add support for RDNSS option (as per RFC 6106)
+
+  2016-12-14: David van Moolenbroek
+  * opt.h, nd6.c: Added LWIP_HOOK_ND6_GET_GW()
+
+  2016-12-09: Dirk Ziegelmeier
+  * ip6_frag.c: Implemented support for LWIP_NETIF_TX_SINGLE_PBUF
+
+  2016-12-09: Simon Goldschmidt
+  * dns.c: added one-shot multicast DNS queries
+
+  2016-11-24: Ambroz Bizjak, David van Moolenbroek
+  * tcp_out.c: Optimize passing contiguous nocopy buffers to tcp_write (bug #46290)
+
+  2016-11-16: Dirk Ziegelmeier
+  * sockets.c: added support for IPv6 mapped IPv4 addresses
+
+  ++ Bugfixes:
+
+  2016-12-16: Thomas Mueller
+  * api_lib.c: fixed race condition in return value of netconn_gethostbyname()
+    (and thus also lwip_gethostbyname/_r() and lwip_getaddrinfo())
+
+  2016-12-15: David van Moolenbroek
+  * opt.h, tcp: added LWIP_HOOK_TCP_ISN() to implement less predictable initial
+    sequence numbers (see contrib/addons/tcp_isn for an example implementation)
+
+  2016-12-05: Dirk Ziegelmeier
+  * fixed compiling with IPv4 disabled (IPv6 only case)
+
+  2016-11-28: Simon Goldschmidt
+  * api_lib.c: fixed bug #49725 (send-timeout: netconn_write() can return
+    ERR_OK without all bytes being written)
+
+  2016-11-28: Ambroz Bizjak
+  * tcpi_in.c: fixed bug #49717 (window size in received SYN and SYN-ACK
+    assumed scaled)
+
+  2016-11-25: Simon Goldschmidt
+  * dhcp.c: fixed bug #49676 (Possible endless loop when parsing dhcp options)
+
+  2016-11-23: Dirk Ziegelmeier
+  * udp.c: fixed bug #49662: multicast traffic is now only received on a UDP PCB
+   (and therefore on a UDP socket/netconn) when the PCB is bound to IP_ADDR_ANY
+
+  2016-11-16: Dirk Ziegelmeier
+  * *: Fixed dual-stack behaviour, IPv6 mapped IPv4 support in socket API
+
+  2016-11-14: Joel Cunningham
+  * tcp_out.c: fixed bug #49533 (start persist timer when unsent seg can't fit
+    in window) 
+
+  2016-11-16: Roberto Barbieri Carrera
+  * autoip.c: fixed bug #49610 (sometimes AutoIP fails to reuse the same address)
+
+  2016-11-11: Dirk Ziegelmeier
+  * sockets.c: fixed bug #49578 (dropping multicast membership does not work
+    with LWIP_SOCKET_OFFSET)
+
+(STABLE-2.0.0)
+
+  ++ New features:
+
+  2016-07-27: Simon Goldschmidt
+  * opt.h, timeouts.h/.c: added LWIP_TIMERS_CUSTOM to override the default
+    implementation of timeouts
+
+  2016-07-xx: Dirk Ziegelmeier
+  * Large overhaul of doxygen documentation
+
+  2016-04-05: Simon Goldschmidt
+  * timers.h/.c: prepare for overriding current timeout implementation: all
+    stack-internal caclic timers are avaliable in the lwip_cyclic_timers array
+
+  2016-03-23: Simon Goldschmidt
+  * tcp: call accept-callback with ERR_MEM when allocating a pcb fails on
+    passive open to inform the application about this error
+    ATTENTION: applications have to handle NULL pcb in accept callback!
+
+  2016-02-22: Ivan Delamer
+  * Initial 6LoWPAN support
+
+  2016-02-XX to 2016-03-XX: Dirk Ziegelmeier
+  * Cleanup TCPIP thread sync methods in a way that it is possibe to use them
+    in arbitrary code that needs things to be done in TCPIP thread. Used to
+    decouple netconn, netif, ppp and 6LoWPAN from LWIP core.
+
+  2016-02-XX: Dirk Ziegelmeier
+  * Implement dual-stack support in RAW, UDP and TCP. Add new IP address
+    type IPADDR_ANY_TYPE for this. Netconn/Socket API: Dual-stack is
+    automatically supported when an IPv6 netconn/socket is created.
+
+  2015-12-26: Martin Hentschel and Dirk Ziegelmeier
+  * Rewrite SNMP agent. SNMPv2c + MIB compiler.
+
+  2015-11-12: Dirk Ziegelmeier
+  * Decouple SNMP stack from lwIP core and move stack to apps/ directory.
+    Breaking change: Users have to call snmp_init() now!
+
+  2015-11-12: Dirk Ziegelmeier
+  * Implement possibility to declare private memory pools. This is useful to
+    decouple some apps from the core (SNMP stack) or make contrib app usage
+    simpler (httpserver_raw)
+
+  2015-10-09: Simon Goldschmidt
+  * started to move "private" header files containing implementation details to
+    "lwip/priv/" include directory to seperate the API from the implementation.
+
+  2015-10-07: Simon Goldschmidt
+  * added sntp client as first "supported" application layer protocol implementation
+    added 'apps' folder
+
+  2015-09-30: Dirk Ziegelmeier
+  * snmp_structs.h, mib_structs.c, mib2.c: snmp: fixed ugly inheritance
+    implementation by aggregating the "base class" (struct mib_node) in all
+    derived node classes to get more type-safe code
+
+  2015-09-23: Simon Goldschmidt
+  * netif.h/.c, nd6.c: task #13729: Convert netif addresses (IPv4 &amp; IPv6) to
+    ip_addr_t (so they can be used without conversion/temporary storage)
+
+  2015-09-08: Dirk Ziegelmeier
+  * snmp: Separate mib2 counter/table callbacks from snmp agent. This both cleans
+    up the code and should allow integration of a 3rd party agent/mib2. Simple
+    counters are kept in MIB2_STATS, tree/table change function prototypes moved to
+    snmp_mib2.h.
+
+  2015-09-03: Simon Goldschmidt
+  * opt.h, dns.h/.c: DNS/IPv6: added support for AAAA records
+
+  2015-09-01: Simon Goldschmidt
+  * task #12178: hardware checksum capabilities can be configured per netif
+   (use NETIF_SET_CHECKSUM_CTRL() in your netif's init function)
+
+  2015-08-30: Simon Goldschmidt
+  * PBUF_REF with "custom" pbufs is now supported for RX pbufs (see pcapif in
+    contrib for an example, LWIP_SUPPORT_CUSTOM_PBUF is required)
+
+  2015-08-30: Simon Goldschmidt
+  * support IPv4 source based routing: define LWIP_HOOK_IP4_ROUTE_SRC to point
+    to a routing function
+
+  2015-08-05: Simon Goldschmidt
+  * many files: allow multicast socket options IP_MULTICAST_TTL, IP_MULTICAST_IF
+    and IP_MULTICAST_LOOP to be used without IGMP
+
+  2015-04-24: Simon Goldschmidt
+  * dhcp.h/c, autoip.h/.c: added functions dhcp/autoip_supplied_address() to
+    check for the source of address assignment (replacement for NETIF_FLAG_DHCP)
+
+  2015-04-10: Simon Goldschmidt
+  * many files: task #13480: added LWIP_IPV4 define - IPv4 can be disabled,
+    leaving an IPv6-only stack
+
+  2015-04-09: Simon Goldschmidt
+  * nearly all files: task #12722 (improve IPv4/v6 address handling): renamed
+    ip_addr_t to ip4_addr_t, renamed ipX_addr_t to ip_addr_t and added IP
+    version; ip_addr_t is used for all generic IP addresses for the API,
+    ip(4/6)_addr_t are only used internally or when initializing netifs or when
+    calling version-related functions
+
+  2015-03-24: Simon Goldschmidt
+  * opt.h, ip4_addr.h, ip4.c, ip6.c: loopif is not required for loopback traffic
+    any more but passed through any netif (ENABLE_LOOPBACK has to be enabled)
+
+  2015-03-23: Simon Goldschmidt
+  * opt.h, etharp.c: with ETHARP_TABLE_MATCH_NETIF== 1, duplicate (Auto)-IP
+    addresses on multiple netifs should now be working correctly (if correctly
+    addressed by routing, that is)
+
+  2015-03-23: Simon Goldschmidt
+  * etharp.c: Stable etharp entries that are about to expire are now refreshed
+    using unicast to prevent unnecessary broadcast. Only if no answer is received
+    after 15 seconds, broadcast is used.
+
+  2015-03-06: Philip Gladstone
+  * netif.h/.c: patch #8359 (Provide utility function to add an IPv6 address to
+    an interface)
+
+  2015-03-05: Simon Goldschmidt
+  * netif.c, ip4.c, dhcp.c, autoip.c: fixed bug #37068 (netif up/down handling
+    is unclear): correclty separated administrative status of a netif (up/down)
+    from 'valid address' status
+    ATTENTION: netif_set_up() now always has to be called, even when dhcp/autoip
+    is used!
+
+  2015-02-26: patch by TabascoEye
+  * netif.c, udp.h/.c: fixed bug #40753 (re-bind UDP pcbs on change of IP address)
+
+  2015-02-22: chrysn, Simon Goldschmidt
+  * *.*: Changed nearly all functions taking 'ip(X)_addr_t' pointer to take
+    const pointers (changed user callbacks: raw_recv_fn, udp_recv_fn; changed
+    port callbacks: netif_output_fn, netif_igmp_mac_filter_fn)
+
+  2015-02-19: Ivan Delamer
+  * netif.h, dhcp.c: Removed unused netif flag for DHCP. The preferred way to evaluate
+    if DHCP is active is through netif-&gt;dhcp field.
+
+  2015-02-19: Ivan Delamer
+  * netif.h, slipif.c, ppp.c: Removed unused netif flag for point to point connections
+
+  2015-02-18: Simon Goldschmidt
+  * api_lib.c: fixed bug #37958 "netconn API doesn't handle correctly
+    connections half-closed by peer"
+
+  2015-02-18: Simon Goldschmidt
+  * tcp.c: tcp_alloc() prefers killing CLOSING/LAST_ACK over active connections
+    (see bug #39565)
+
+  2015-02-16: Claudius Zingerli, Sergio Caprile
+  * opt.h, dhcp.h/.c: patch #8361 "Add support for NTP option in DHCP"
+
+  2015-02-14: Simon Goldschmidt
+  * opt.h, snmp*: added support for write-access community and dedicated
+    community for sending traps
+
+  2015-02-13: Simon Goldschmidt
+  * opt.h, memp.c: added hook LWIP_HOOK_MEMP_AVAILABLE() to get informed when
+    a memp pool was empty and an item is now available
+
+  2015-02-13: Simon Goldschmidt
+  * opt.h, pbuf.h/.c, etharp.c: Added the option PBUF_LINK_ENCAPSULATION_HLEN to
+    allocate additional header space for TX on netifs requiring additional headers
+
+  2015-02-12: chrysn
+  * timers.h/.c: introduce sys_timeouts_sleeptime (returns the time left before
+    the next timeout is due, for NO_SYS==1)
+
+  2015-02-11: Nick van Ijzendoorn
+  * opt.h, sockets.h/c: patch #7702 "Include ability to increase the socket number
+    with defined offset"
+
+  2015-02-11: Frederick Baksik
+  * opt.h, def.h, others: patch #8423 "arch/perf.h" should be made an optional item
+
+  2015-02-11: Simon Goldschmidt
+  * api_msg.c, opt.h: started to implement fullduplex sockets/netconns
+    (note that this is highly unstable yet!)
+
+  2015-01-17: Simon Goldschmidt
+  * api: allow enabling socket API without (public) netconn API - netconn API is
+    still used by sockets, but keeping it private (static) should allow better
+    compiler optimizations
+
+  2015-01-16: Simon Goldschmidt
+  * tcp_in.c: fixed bug #20506 "Initial congestion window is very small" again
+    by implementing the calculation formula from RFC3390
+
+  2014-12-10: Simon Goldschmidt
+  * api: added option LWIP_NETCONN_SEM_PER_THREAD to use a semaphore per thread
+    instead of using one per netconn and per select call
+
+  2014-12-08: Simon Goldschmidt
+  * ip6.h: fixed bug #43778: IPv6 header version not set on 16-bit platform
+    (macro IP6H_VTCFL_SET())
+
+  2014-12-08: Simon Goldschmidt
+  * icmp.c, ip4.c, pbuf.c, udp.c, pbuf.h: task #11472 Support PBUF_REF for RX
+    (IPv6 and IPv4/v6 reassembly might not work yet)
+
+  2014-11-06: Simon Goldschmidt
+  * sockets.c/.h, init.c: lwip_socket_init() is not needed any more
+    -&gt; compatibility define
+
+  2014-09-16: Simon Goldschmidt
+  * dns.c, opt.h: reduced ram usage by parsing DNS responses in place
+
+  2014-09-16: Simon Goldschmidt
+  * pbuf.h/.c: added pbuf_take_at() and pbuf_put_at()
+
+  2014-09-15: Simon Goldschmidt
+  * dns.c: added source port randomization to make the DNS client more robust
+    (see bug #43144)
+
+  2013-09-02: Simon Goldschmidt
+  * arch.h and many other files: added optional macros PACK_STRUCT_FLD_8() and
+    PACK_STRUCT_FLD_S() to prevent gcc 4 from warning about struct members that
+    do not need packing
+
+  2013-08-19: Simon Goldschmidt
+  * netif.h: bug #42998: made NETIF_MAX_HWADDR_LEN overridable for some special
+    networks
+
+  2013-03-17: Simon Goldschmidt (patch by Ghobad Emadi)
+  * opt.h, etharp.c: Added LWIP_HOOK_ETHARP_GET_GW to implement IPv4 routing with
+    multiple gateways
+
+  2013-04-20: Fatih Asici
+  * opt.h, etharp.h/.c: patch #7993: Added support for transmitting packets
+    with VLAN headers via hook function LWIP_HOOK_VLAN_SET and to check them
+    via hook function LWIP_HOOK_VLAN_CHECK
+
+  2014-02-20: Simon Goldschmidt (based on patch by Artem Pisarenko)
+  * patch #7885: modification of api modules to support FreeRTOS-MPU
+    (don't pass stack-pointers to other threads)
+
+  2014-02-05: Simon Goldschmidt (patch by "xtian" and "alex_ab")
+  * patch #6537/#7858: TCP window scaling support
+
+  2014-01-17: Jiri Engelthaler
+  * icmp, icmp6, opt.h: patch #8027: Completed HW checksuming for IPv4 and
+    IPv6 ICMP's
+
+  2012-08-22: Sylvain Rochet
+  * New PPP stack for lwIP, developed in ppp-new branch.
+    Based from pppd 2.4.5, released 2009-11-17, with huge changes to match
+    code size and memory requirements for embedded devices, including:
+    - Gluing together the previous low-level PPP code in lwIP to pppd 2.4.5, which
+      is more or less what pppd sys-* files are, so that we get something working
+      using the unix port.
+    - Merged some patchs from lwIP Git repository which add interesting features
+      or fix bugs.
+    - Merged some patchs from Debian pppd package which add interesting features
+      or fix bugs.
+    - Ported PPP timeout handling to the lwIP timers system
+    - Disabled all the PPP code using filesystem access, replaced in necessary cases
+      to configuration variables.
+    - Disabled all the PPP code forking processes.
+    - Removed IPX support, lwIP does not support IPX.
+    - Ported and improved random module from the previous PPP port.
+    - Removed samba TDB (file-driven database) usage, because it needs a filesystem.
+    - MS-CHAP required a DES implementation, we added the latest PolarSSL DES
+      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. 
+    - 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.
+    - Added macro definition PAP_SUPPORT to make PAP support optional.
+    - Cleared all Linux syscall calls.
+    - Disabled demand support using a macro, so that it can be ported later.
+    - Disabled ECP support using a macro, so that it can be ported later.
+    - Disabled CCP support using a macro, so that it can be ported later.
+    - Disabled CBCP support using a macro, so that it can be ported later.
+    - Disabled LQR support using a macro, so that it can be ported later.
+    - Print packet debug feature optional, through PRINTPKT_SUPPORT
+    - Removed POSIX signal usage.
+    - Fully ported PPPoS code from the previous port.
+    - Fully ported PPPoE code from the previous port.
+    - Fully ported VJ compression protocol code from the previous port.
+    - Removed all malloc()/free() use from PPP, replaced by stack usage or PBUF.
+    - Disabled PPP server support using a macro, so that it can be ported later.
+    - Switched all PPP debug to lwIP debug system.
+    - Created PPP Control Block (PPP PCB), removed PPP unit integer everywhere,
+      removed all global variables everywhere, did everything necessary for
+      the PPP stack to support more than one PPP session (pppd only support
+      one session per process).
+    - Removed the statically allocated output buffer, now using PBUF.
+    - Improved structure size of all PPP modules, deep analyze of code to reduce
+      variables size to the bare minimum. Switched all boolean type (char type in
+      most architecture) to compiler generated bitfields.
+    - Added PPP IPv6 support, glued lwIP IPv6 support to PPP.
+    - Now using a persistent netif interface which can then be used in lwIP
+      functions requiring a netif.
+    - Now initializing PPP in lwip_init() function.
+    - Reworked completely the PPP state machine, so that we don't end up in
+      anymore in inconsistent state, especially with PPPoE.
+    - Improved the way we handle PPP reconnection after disconnect, cleaning
+      everything required so that we start the PPP connection again from a
+      clean state.
+    - Added PPP holdoff support, allow the lwIP user to wait a little bit before
+      reconnecting, prevents connection flood, especially when using PPPoL2TP.
+    - Added PPPoL2TP LAC support (a.k.a. UDP tunnels), adding a VPN client
+      feature to lwIP, L2TP being a widely used tunnel protocol.
+    - Switched all used PPP types to lwIP types (u8t, u16t, u32t, ...)
+    - Added PPP API "sequential" thread-safe API, based from NETIFAPI.
+
+  2011-07-21: Simon Goldschmidt
+  * sockets.c, opt.h: (bug #30185): added LWIP_FIONREAD_LINUXMODE that makes
+    ioctl/FIONREAD return the size of the next pending datagram.
+
+  2011-05-25: Simon Goldschmidt
+  * again nearly the whole stack, renamed ip.c to ip4.c, ip_addr.c to ip4_addr.c,
+    combined ipv4/ipv6 inet_chksum.c, added ip.h, ip_addr.h: Combined IPv4
+    and IPv6 code where possible, added defines to access IPv4/IPv6 in non-IP
+    code so that the code is more readable.
+
+  2011-05-17: Patch by Ivan Delamer (only checked in by Simon Goldschmidt)
+  * nearly the whole stack: Finally, we got decent IPv6 support, big thanks to
+    Ivan! (this is work in progress: we're just post release anyway :-)
+
+
+  ++ Bugfixes:
+
+  2016-08-23: Simon Goldschmidt
+  * etharp: removed ETHARP_TRUST_IP_MAC since it is insecure and we don't need
+    it any more after implementing unicast ARP renewal towards arp entry timeout
+
+  2016-07-20: Simon Goldschmidt
+  * memp.h/.c: fixed bug #48442 (memp stats don't work for MEMP_MEM_MALLOC)
+
+  2016-07-21: Simon Goldschmidt (patch by Ambroz Bizjak)
+  * tcp_in.c, tcp_out.c: fixed bug #48543 (TCP sent callback may prematurely
+    report sent data when only part of a segment is acked) and don't include
+    SYN/FIN in snd_buf counter
+
+  2016-07-19: Simon Goldschmidt
+  * etharp.c: fixed bug #48477 (ARP input packet might update static entry)
+
+  2016-07-11: Simon Goldschmidt
+  * tcp_in.c: fixed bug #48476 (TCP sent callback called wrongly due to picking
+    up old pcb-&gt;acked
+
+  2016-06-30: Simon Goldschmidt (original patch by Fabian Koch)
+  * tcp_in.c: fixed bug #48170 (Vulnerable to TCP RST spoofing)
+
+  2016-05-20: Dirk Ziegelmeier
+  * sntp.h/.c: Fix return value of sntp_getserver() call to return a pointer
+
+  2016-04-05: Simon Goldschmidt (patch by Philip Gladstone)
+  * udp.c: patch #8358: allow more combinations of listening PCB for IPv6
+
+  2016-04-05: Simon Goldschmidt
+  * netconn/socket API: fixed bug# 43739 (Accept not reporting errors about
+    aborted connections): netconn_accept() returns ERR_ABRT (sockets: ECONNABORTED)
+    for aborted connections, ERR_CLSD (sockets: EINVAL) if the listening netconn
+    is closed, which better seems to follow the standard.
+
+  2016-03-23: Florent Matignon
+  * dhcp.c: fixed bug #38203: DHCP options are not recorded in all DHCP ack messages
+
+  2016-03-22: Simon Goldschmidt
+  * tcp: changed accept handling to be done internally: the application does not
+    have to call tcp_accepted() any more. Instead, when delaying accept (e.g. sockets
+    do), call tcp_backlog_delayed()/tcp_backlog_accepted() (fixes bug #46696)
+
+  2016-03-22: Simon Goldschmidt
+  * dns.c: ignore dns response parsing errors, only abort resolving for correct
+    responses or error responses from correct server (bug #47459)
+
+  2016-03-17: Simon Goldschmidt
+  * api_msg.c: fixed bug #47448 (netconn/socket leak if RST is received during close)
+
+  2016-03-17: Joel Cunningham
+  * api_msg.c: don't fail closing a socket/netconn when failing to allocate the
+    FIN segment; blocking the calling thread for a while is better than risking
+    leaking a netconn/socket (see bug #46701)
+
+  2016-03-16: Joel Cunningham
+  * tcp_out.c: reset rto timer on fast retransmission
+
+  2016-03-16: Deomid Ryabkov
+  * tcp_out.c: fixed bug #46384 Segment size calculation bug with MSS != TCP_MSS
+
+  2016-03-05: Simon Goldschmidt
+  * err.h/.c, sockets.c: ERR_IF is not necessarily a fatal error
+
+  2015-11-19: fix by Kerem Hadimli
+  * sockets.c: fixed bug #46471: lwip_accept() leaks socket descriptors if new
+    netconn was already closed because of peer behavior
+
+  2015-11-12: fix by Valery Ushakov
+  * tcp_in.c: fixed bug #46365 tcp_accept_null() should call tcp_abort()
+
+  2015-10-02: Dirk Ziegelmeier/Simon Goldschmidt
+  * snmp: cleaned up snmp structs API (fixed race conditions from bug #46089,
+    reduce ram/rom usage of tables): incompatible change for private MIBs
+
+  2015-09-30: Simon Goldschmidt
+  * ip4_addr.c: fixed bug #46072: ip4addr_aton() does not check the number range
+    of all address parts
+
+  2015-08-28: Simon Goldschmidt
+  * tcp.c, tcp_in.c: fixed bug #44023: TCP ssthresh value is unclear: ssthresh
+    is set to the full send window for active open, too, and is updated once
+    after SYN to ensure the correct send window is used
+
+  2015-08-28: Simon Goldschmidt
+  * tcp: fixed bug #45559: Window scaling casts u32_t to u16_t without checks
+
+  2015-08-26: Simon Goldschmidt
+  * ip6_frag.h/.c: fixed bug bug #41009: IPv6 reassembly broken on 64-bit platforms:
+    define IPV6_FRAG_COPYHEADER==1 on these platforms to copy the IPv6 header
+    instead of referencing it, which gives more room for struct ip6_reass_helper
+
+  2015-08-25: Simon Goldschmidt
+  * sockets.c: fixed bug #45827: recvfrom: TCP window is updated with MSG_PEEK
+
+  2015-08-20: Manoj Kumar
+  * snmp_msg.h, msg_in.c: fixed bug #43790: Sending octet string of Length &gt;255
+    from SNMP agent
+
+  2015-08-19: Jens Nielsen
+  * icmp.c, ip4.c, tcp_in.c, udp.c, raw.c: fixed bug #45120: Broadcast &amp; multiple
+    interfaces handling
+
+  2015-08-19: Simon Goldschmidt (patch by "Sandra")
+  * dns.c: fixed bug #45004: dns response without answer might be discarded
+
+  2015-08-18: Chrysn
+  * timers.c: patch #8704 fix sys_timeouts_sleeptime function
+
+  2015-07-01: Erik Ekman
+  * puf.c: fixed bug #45454 (pbuf_take_at() skips write and returns OK if offset
+    is at start of pbuf in chain)
+
+  2015-05-19: Simon Goldschmidt
+  * dhcp.h/.c: fixed bugs #45140 and #45141 (dhcp was not stopped correctly after
+    fixing bug #38204)
+
+  2015-03-21: Simon Goldschmidt (patch by Homyak)
+  * tcp_in.c: fixed bug #44766 (LWIP_WND_SCALE: tcphdr-&gt;wnd was not scaled in
+    two places)
+
+  2015-03-21: Simon Goldschmidt
+  * tcp_impl.h, tcp.c, tcp_in.c: fixed bug #41318 (Bad memory ref in tcp_input()
+    after tcp_close())
+
+  2015-03-21: Simon Goldschmidt
+  * tcp_in.c: fixed bug #38468 (tcp_sent() not called on half-open connection for
+    data ACKed with the same ack as FIN)
+
+  2015-03-21: Simon Goldschmidt (patch by Christoffer Lind)
+  * dhcp.h/.c: fixed bug #38204 (DHCP lease time not handled correctly)
+
+  2015-03-20: Simon Goldschmidt
+  * dhcp.c: fixed bug #38714 (Missing option and client address in DHCPRELEASE message)
+
+  2015-03-19: Simon Goldschmidt
+  * api.h, tcpip.h, api_lib.c, api_msg.c: fixed race conditions in assigning
+    netconn-&gt;last_err (fixed bugs #38121 and #37676)
+
+  2015-03-09: Simon Goldschmidt
+  * ip4.c: fixed the IPv4 part of bug #43904 (ip_route() must detect linkup status)
+
+  2015-03-04: Simon Goldschmidt
+  * nd6.c: fixed bug #43784 (a host should send at least one Router Solicitation)
+
+  2015-03-04: Valery Ushakov
+  * ip6.c: fixed bug #41094 (Byte-order bug in IPv6 fragmentation header test)
+
+  2015-03-04: Zach Smith
+  * nd6.c: fixed bug #38153 (nd6_input() byte order issues)
+
+  2015-02-26: Simon Goldschmidt
+  * netif.c, tcp.h/.c: fixed bug #44378 (TCP connections are not aborted on netif
+    remove)
+
+  2015-02-25: Simon Goldschmidt
+  * ip4.c, etharp.c: fixed bug #40177 (System hangs when dealing with corrupted
+    packets), implemented task #12357 (Ensure that malicious packets don't
+    assert-fail): improved some pbuf_header calls to not assert-fail.
+
+  2015-02-25: patch by Joel Cunningham
+  * udp.h/.c, sockets.c: fixed bug #43028 (IP_MULTICAST_TTL affects unicast
+    datagrams)
+
+  2015-02-25: patch by Greg Renda
+  * ip4_frag.c: fixed bug #38210 (ip reassembly while remove oldest datagram)
+
+  2015-02-25: Simon Goldschmidt
+  * sockets.c: fixed bug #38165 (socket with mulicast): ensure igmp membership
+    are dropped when socket (not netconn!) is closed.
+
+  2015-02-25: Simon Goldschmidt
+  * ip4.h/.c, udp.c: fixed bug #38061 (wrong multicast routing in IPv4) by
+    adding an optional default netif for multicast routing
+
+  2015-02-25: Simon Goldschmidt
+  * netconn API: fixed that netconn_connect still used message passing for
+    LWIP_TCPIP_CORE_LOCKING==1
+
+  2015-02-22: patch by Jens Nielsen
+  * icmp.c: fixed bug #38803 (Source address in broadcast ping reply)
+
+  2015-02-22: Simon Goldschmidt
+  * udp.h, sockets.c: added proper accessor functions for pcb-&gt;multicast_ip
+    (previously used by get/setsockopt only)
+
+  2015-02-18: Simon Goldschmidt
+  * sockets.c: Fixed select not reporting received FIN as 'readable' in certain
+    rare cases (bug #43779: select(), close(), and TCP retransmission error)
+
+  2015-02-17: Simon Goldschmidt
+  * err.h, sockets.c, api_msg.c: fixed bug #38853 "connect() use a wrong errno":
+    return ERR_ALREADY/EALRADY during connect, ERR_ISCONN/EISCONN when already
+    connected
+
+  2015-02-17: Simon Goldschmidt
+  * tcp_impl.h, tcp_out.c, tcp.c, api_msg.c: fixed bug #37614 "Errors from
+    ipX_output are not processed". Now tcp_output(_segment) checks for the return
+    value of ipX_output and does not try to send more on error. A netif driver
+    can call tcp_txnow() (from tcpip_thread!) to try to send again if TX buffers
+    are available again.
+
+  2015-02-14: patches by Freddie Chopin
+  * snmp*: made community writable, fixed some const pointers
+
+  2015-02-13: Simon Goldschmidt
+  * msg_in.c: fixed bug #22070 "MIB_OBJECT_WRITE_ONLY not implemented in SNMP"
+
+  2015-02-12: Simon Goldschmidt
+  * ip.h, ip4.c, ip6.c: fixed bug #36403 "ip4_input() and ip6_input() always pass
+    inp to higher layers": now the accepting netif is passed up, but the input
+    netif is available through ip_current_input_netif() if required.
+
+  2015-02-11: patch by hichard
+  * tcpip.c: fixed bug #43094 "The function tcpip_input() forget to handle IPv6"
+
+  2015-02-10: Simon Goldschmidt
+  * netconn API: fixed that netconn_close/netconn_delete still used message passing
+    for LWIP_TCPIP_CORE_LOCKING==1
+
+  2015-02-10: Simon Goldschmidt
+  * netconn/socket api: fixed bug #44225 "closing TCP socket should time out
+    eventually", implemented task #6930 "Implement SO_LINGER": closing TCP sockets
+    times out after 20 seconds or after the configured SND_TIMEOUT or depending
+    on the linger settings.
+
+  2015-01-27: Simon Goldschmidt
+  * api_msg.c: fixed that SHUT_RD followed by SHUT_WR was different to SHUT_RDWR,
+    fixed return value of lwip_netconn_do_close on unconnected netconns
+
+  2015-01-17: Simon Goldschmidt
+  * sockets.c: fixed bug #43361 select() crashes with stale FDs
+
+  2015-01-17: Simon Goldschmidt
+  * sockets.c/.h, memp_std.h: fixed bug #40788 "lwip_setsockopt_internal() crashes"
+    by rewriting set/getsockopt functions to combine checks with the actual code
+    and add more NULL checks; this also fixes that CORE_LOCKING used message
+    passing for set/getsockopt.
+
+  2014-12-19: Simon Goldschmidt
+  * opt.h, dhcp.h/.c: prevent dhcp from starting when netif link is down (only
+    when LWIP_DHCP_CHECK_LINK_UP==1, which is disabled by default for
+    compatibility reasons)
+
+  2014-12-17: Simon Goldschmidt
+  * tcp_out.c: fixed bug #43840 Checksum error for TCP_CHECKSUM_ON_COPY==1 for
+    no-copy data with odd length
+
+  2014-12-10: Simon Goldschmidt
+  * sockets.c, tcp.c, others: fixed bug #43797 set/getsockopt: SO_SNDTIMEO/SO_RCVTIMEO
+    take int as option but should take timeval (LWIP_SO_SNDRCVTIMEO_STANDARD==0 can
+    be used to revert to the old 'winsock' style behaviour)
+    Fixed implementation of SO_ACCEPTCONN to just look at the pcb state
+
+  2014-12-09: Simon Goldschmidt
+  * ip4.c: fixed bug #43596 IGMP queries from 0.0.0.0 are discarded
+
+  2014-10-21: Simon Goldschmidt (patch by Joel Cunningham and Albert Huitsing)
+  * sockts.c: fixed bugs #41495 Possible threading issue in select() and #43278
+    event_callback() handle context switch when calling sys_sem_signal()
+
+  2014-10-21: Simon Goldschmidt
+  * api_msg.c: fixed bug #38219 Assert on TCP netconn_write with sndtimeout set
+
+  2014-09-16: Kevin Cernekee
+  * dns.c: patch #8480 Fix handling of dns_seqno wraparound
+
+  2014-09-16: Simon Goldschmidt
+  * tcp_out.c: fixed bug #43192 tcp_enqueue_flags() should not check TCP_SND_QUEUELEN
+    when sending FIN
+
+  2014-09-03: Simon Goldschmidt
+  * msg_in.c: fixed bug #39355 SNMP Memory Leak in case of error
+
+  2014-09-02: Simon Goldschmidt
+  * err.h/.c, sockets.c, api_msg.c: fixed bug #43110 call getpeername() before
+    listen() will cause a error
+
+  2014-09-02: Simon Goldschmidt
+  * sockets.c: fixed bug #42117 lwip_fcntl does not set errno
+
+  2014-09-02: Simon Goldschmidt
+  * tcp.c: fixed bug #42299 tcp_abort() leaves freed pcb on tcp_bound_pcbs list
+
+  2014-08-20: Simon Goldschmidt
+  * dns.c: fixed bug #42987 lwIP is vulnerable to DNS cache poisoning due to
+    non-randomized TXIDs
+
+  2014-06-03: Simon Goldschmidt
+  * tcp_impl.h, tcp_in.c: fixed bug #37969 SYN packet dropped as short packet in
+    tcp_input function
+
+  2014-05-20: Simon Goldschmidt
+  * tcp_out.c: fixed bug #37184 tcp_write problem for pcbs in the SYN_SENT state
+
+  2014-05-19: Simon Goldschmidt
+  * *.h: Fixed bug #35874 reserved identifier violation (removed leading underscores
+    from header include guards)
+
+  2014-04-08: Simon Goldschmidt
+  * tcp.c: Fixed bug #36167 tcp server crash when client closes (maximum window)
+
+  2014-04-06: Simon Goldschmidt
+  * tcp_in.c: Fixed bug #36210 lwIP does not elicit an empty ACK when received
+    unacceptable ACK
+
+  2014-04-06: Simon Goldschmidt
+  * dhcp.c, ip4.c/.h, ip6.c/.h, udp.c/.h, ip.h: Fixed bug #41787 DHCP Discovery
+    is invalid when an IP is set to thet netif.
+
+  2014-03-14: Simon Goldschmidt
+  * tcp_out.c: Fixed bug #36153 TCP Cheksum error if LWIP_CHECKSUM_ON_COPY=1
+
+  2014-03-11: Simon Goldschmidt (patch by Mason)
+  * opt.h, sockets.c: fixed bug #35928 BSD sockets functions must set errno for
+    POSIX-compliance
+
+  2014-02-27: Simon Goldschmidt
+  * dhcp.c: fixed bug #40303 DHCP xid renewed when sending a DHCPREQUEST
+
+  2014-02-27: Simon Goldschmidt
+  * raw.c: fixed bug #41680 raw socket can not receive IPv6 packet when
+    IP_SOF_BROADCAST_RECV==1
+
+  2014-02-27: Simon Goldschmidt
+  * api_msg.c, sockets.c: fixed bug #38404 getpeeraddr returns success on
+    unconnected/listening TCP sockets
+
+  2014-02-27: Simon Goldschmidt
+  * sockets.c: fixed bug #41729 Some socket functions return Exyz instead of -1
+
+  2014-02-25: Simon Goldschmidt
+  * ip4.c: fixed bug #39514 ip_route() may return an IPv6-only interface
+
+  2014-02-25: Simon Goldschmidt, patch by Fatih Asici
+  * pbuf.c: fixed bug #39356 Wrong increment in pbuf_memfind()
+
+  2014-02-25: Simon Goldschmidt
+  * netif.c/.h, udp.c: fixed bug #39225 udp.c uses netif_matches_ip6_addr() incorrectly;
+    renamed function netif_matches_ip6_addr() to netif_get_ip6_addr_match()
+
+  2014-02-25: Simon Goldschmidt
+  * igmp.c: fixed bug #39145 IGMP membership report for 224.0.0.1
+
+  2014-02-22: Simon Goldschmidt (patch by Amir Shalem)
+  * etharp.c, opt.h: fixed bug #34681 Limit ARP queue length by ARP_QUEUE_LEN (=3)
+
+  2014-02-22: Simon Goldschmidt (patch by Amir Shalem)
+  * etharp.h/.c: fixed bug #34682 Limit ARP request flood for unresolved entry
+
+  2014-02-20: Simon Goldschmidt
+  * tcp_out.c: fixed bug #39683 Assertion "seg-&gt;tcphdr not aligned" failed with
+    MEM_ALIGNMENT = 8
+
+  2014-02-20: Simon Goldschmidt
+  * sockets.c: fixed bug #39882 No function shall set errno to 0
+
+  2014-02-20: Simon Goldschmidt
+  * mib_structs.c: fixed bug #40050 SNMP problem with MIB arrays &gt; 255
+
+  2014-02-20: Simon Goldschmidt
+  * api.h, sockets.c: fixed bug #41499 netconn::recv_avail can overflow
+
+  2014-01-08: Stathis Voukelatos
+  * memp_std.h: patch #7928 Fixed size calculation in MALLOC memory pool
+    creation macro
+
+  2014-01-18: Brian Fahs
+  * tcp_out.c: patch #8237: tcp_rexmit_rto fails to update pcb-&gt;unsent_oversize
+    when necessary
+
+  2014-01-17: Grant Erickson, Jay Logue, Simon Goldschmidt
+  * ipv6.c, netif.c: patch #7913 Enable Support for IPv6 Loopback
+
+  2014-01-16: Stathis Voukelatos
+  * netif.c: patch #7902 Fixed netif_poll() operation when LWIP_LOOPBACK_MAX_PBUFS &gt; 0
+
+  2014-01-14: "Freddie Chopin"
+  * snmp.h, mib2.c: fixed constness and spelling of sysdescr
+
+  2014-01-14: Simon Goldschmidt (patch by Thomas Faber)
+  * tcpip.c: patch #8241: Fix implicit declaration of ip_input with
+    LWIP_TCPIP_CORE_LOCKING_INPUT disabled
+
+  2014-01-14: chrysn
+  * timers.c: patch #8244 make timeouts usable reliably from outside of the
+    timeout routine
+
+  2014-01-10: Simon Goldschmidt
+  * ip_frag.c, ip6_frag.c: fixed bug #41041 Potential use-after-free in IPv6 reassembly
+
+  2014-01-10: Simon Goldschmidt
+  * memp.c: fixed bug #41188 Alignment error in memp_init() when MEMP_SEPARATE_POOLS==1
+
+  2014-01-10: Simon Goldschmidt
+  * tcp.c: fixed bug #39898 tcp_fasttmr() possible lock due to infinte queue process loop
+
+  2013-06-29: Simon Goldschmidt
+  * inet.h, sockets.h: partially fixed bug #37585: IPv6 compatibility (in socket structs)
+
+  2013-06-29: Simon Goldschmidt
+  * inet6.h: bug #37585/task #12600: fixed struct in6_addr.s6_addr to conform to spec
+
+  2013-04-24: patch by Liam &lt;morepork&gt;
+  * api_msg.c: patch #8008 Fix a potential null pointer dereference in assert
+
+  2013-04-24: Simon Goldschmidt
+  * igmp.c: fixed possible division by zero
+
+  2013-04-24: Simon Goldschmidt
+  * ip6.h, some ipv6 C files: fixed bug #38526 Coverity: Recursive Header Inclusion in ip6.h
+
+  2013-04-24: Simon Goldschmidt (patch by Emil Ljungdahl):
+  * netif.c: fixed bug #38586 netif_loop_output() "deadlocks"
+
+  2013-01-15: Simon Goldschmidt
+  * ip4.c: fixed bug #37665 ip_canforward operates on address in wrong byte order
+
+  2013-01-15: Simon Goldschmidt
+  * pbuf.h: fixed bug #38097 pbuf_free_ooseq() warning
+
+  2013-01-14: Simon Goldschmidt
+  * dns.c: fixed bug #37705 Possible memory corruption in DNS query
+
+  2013-01-11: Simon Goldschmidt
+  * raw.c: fixed bug #38066 Raw pcbs can alter packet without eating it
+
+  2012-08-22: Simon Goldschmidt
+  * memp.c: fixed bug #37166: memp_sanity check loops itself
+
+  2012-08-13: Simon Goldschmidt
+  * dhcp.c: fixed bug #36645: Calling dhcp_release before dhcp_start
+    dereferences NULL
+
+  2012-08-13: Simon Goldschmidt
+  * msg_out.c: fixed bug #36840 snmp_send_trap() NULL de-reference if traps
+    configured but no interfaces available
+
+  2012-08-13: Simon Goldschmidt
+  * dns.c: fixed bug #36899 DNS TTL 0 is cached for a long time
+
+  2012-05-11: Simon Goldschmidt (patch by Marty)
+  * memp.c: fixed bug #36412: memp.c does not compile when
+    MEMP_OVERFLOW_CHECK &gt; zero and MEMP_SEPARATE_POOLS == 1
+
+  2012-05-03: Simon Goldschmidt (patch by Sylvain Rochet)
+  * ppp.c: fixed bug #36283 (PPP struct used on header size computation and
+    not packed)
+
+  2012-05-03: Simon Goldschmidt (patch by David Empson)
+  * ppp.c: fixed bug #36388 (PPP: checksum-only in last pbuf leads to pbuf with
+    zero length)
+
+  2012-03-25: Simon Goldschmidt
+  * api_msg.c: Fixed bug #35817: do_connect() invalidly signals op_completed
+    for UDP/RAW with LWIP_TCPIP_CORE_LOCKING==1
+
+  2012-03-25: Simon Goldschmidt
+  * api_msg.h, api_lib.c, api_msg.c, netifapi.c: fixed bug #35931: Name space
+    pollution in api_msg.c and netifapi.c
+
+  2011-08-24: Simon Goldschmidt
+  * inet6.h: fixed bug #34124 struct in6_addr does not conform to the standard
+
+
+
+(STABLE-1.4.1)
+
+  ++ New features:
+
+  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
+
+  2011-12-17: Simon Goldschmidt
+  * ip.h: implemented API functions to access so_options of IP pcbs (UDP, TCP, RAW)
+    (fixes bug #35061)
+
+  2011-09-27: Simon Goldschmidt
+  * opt.h, tcp.c, tcp_in.c: Implemented limiting data on ooseq queue (task #9989)
+    (define TCP_OOSEQ_MAX_BYTES / TCP_OOSEQ_MAX_PBUFS in lwipopts.h)
+
+  2011-09-21: Simon Goldschmidt
+  * opt.h, api.h, api_lib.c, api_msg.h/.c, sockets.c: Implemented timeout on
+    send (TCP only, bug #33820)
+
+  2011-09-21: Simon Goldschmidt
+  * init.c: Converted runtime-sanity-checks into compile-time checks that can
+    be disabled (since runtime checks can often not be seen on embedded targets)
+
+  2011-09-11: Simon Goldschmidt
+  * ppp.h, ppp_impl.h: splitted ppp.h to an internal and external header file
+    to get a clear separation of which functions an application or port may use
+    (task #11281)
+
+ 2011-09-11: Simon Goldschmidt
+  * opt.h, tcp_impl.h, tcp.c, udp.h/.c: Added a config option to randomize
+    initial local TCP/UDP ports (so that different port ranges are used after
+    a reboot; bug #33818; this one added tcp_init/udp_init functions again)
+
+  2011-09-03: Simon Goldschmidt
+  * dhcp.c: DHCP uses LWIP_RAND() for xid's (bug #30302)
+
+  2011-08-24: Simon Goldschmidt
+  * opt.h, netif.h/.c: added netif remove callback (bug #32397)
+
+  2011-07-26: Simon Goldschmidt
+  * etharp.c: ETHARP_SUPPORT_VLAN: add support for an external VLAN filter
+    function instead of only checking for one VLAN (define ETHARP_VLAN_CHECK_FN)
+
+  2011-07-21: Simon Goldschmidt (patch by hanhui)
+  * ip4.c, etharp.c, pbuf.h: bug #33634 ip_forward() have a faulty behaviour:
+    Added pbuf flags to mark incoming packets as link-layer broadcast/multicast.
+    Also added code to allow ip_forward() to forward non-broadcast packets to
+    the input netif (set IP_FORWARD_ALLOW_TX_ON_RX_NETIF==1).
+
+  2011-06-26: Simon Goldschmidt (patch by Cameron Gutman)
+  * tcp.c, tcp_out.c: bug #33604: added some more asserts to check that
+    pcb-&gt;state != LISTEN
+
+   2011-05-14: Simon Goldschmidt (patch by Stéphane Lesage)
+  * tcpip.c/.h: patch #7449 allow tcpip callback from interrupt with static
+    memory message
+
+
+  ++ Bugfixes:
+
+  2012-09-26: Simon Goldschmidt
+  * api_msg.c: fixed bug #37405 'err_tcp()' uses already freed 'netconn' object
+
+  2012-09-26: patch by Henrik Persson
+  * dhcp.c: patch #7843 Fix corner case with dhcp timeouts
+
+  2012-09-26: patch by Henrik Persson
+  * dhcp.c: patch #7840 Segfault in dhcp_parse_reply if no end marker in dhcp packet
+
+  2012-08-22: Simon Goldschmidt
+  * memp.c: fixed bug #37166: memp_sanity check loops itself
+
+  2012-05-08: Simon Goldschmidt
+  * tcp_out.c: fixed bug: #36380 unsent_oversize mismatch in 1.4.1RC1 (this was
+    a debug-check issue only)
+
+  2012-03-27: Simon Goldschmidt
+  * vj.c: fixed bug #35756 header length calculation problem in ppp/vj.c
+
+  2012-03-27: Simon Goldschmidt (patch by Mason)
+  * tcp_out.c: fixed bug #35945: SYN packet should provide the recv MSS not the
+    send MSS
+
+  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
+
+  2012-02-23: Simon Goldschmidt
+  * etharp.c: fixed bug #35595: Impossible to send broadcast without a gateway
+    (introduced when fixing bug# 33551)
+
+  2012-02-16: Simon Goldschmidt
+  * ppp.c: fixed pbuf leak when PPP session is aborted through pppSigHUP()
+    (bug #35541: PPP Memory Leak)
+
+  2012-02-16: Simon Goldschmidt
+  * etharp.c: fixed bug #35531: Impossible to send multicast without a gateway
+    (introduced when fixing bug# 33551)
+
+  2012-02-16: Simon Goldschmidt (patch by Stéphane Lesage)
+  * msg_in.c, msg_out.c: fixed bug #35536 SNMP: error too big response is malformed
+
+  2012-02-15: Simon Goldschmidt
+  * init.c: fixed bug #35537: MEMP_NUM_* sanity checks should be disabled with
+    MEMP_MEM_MALLOC==1
+
+  2012-02-12: Simon Goldschmidt
+  * tcp.h, tcp_in.c, tcp_out.c: partly fixed bug #25882: TCP hangs on
+    MSS &gt; pcb-&gt;snd_wnd (by not creating segments bigger than half the window)
+
+  2012-02-11: Simon Goldschmidt
+  * tcp.c: fixed bug #35435: No pcb state check before adding it to time-wait
+    queue while closing
+
+  2012-01-22: Simon Goldschmidt
+  * tcp.c, tcp_in.c: fixed bug #35305: pcb may be freed too early on shutdown(WR)
+
+  2012-01-21: Simon Goldschmidt
+  * tcp.c: fixed bug #34636: FIN_WAIT_2 - Incorrect shutdown of TCP pcb
+
+  2012-01-20: Simon Goldschmidt
+  * dhcp.c: fixed bug #35151: DHCP asserts on incoming option lengths
+
+ 2012-01-20: Simon Goldschmidt
+  * pbuf.c: fixed bug #35291: NULL pointer in pbuf_copy
+
+  2011-11-25: Simon Goldschmidt
+  * tcp.h/.c, tcp_impl.h, tcp_in.c: fixed bug #31177: tcp timers can corrupt
+    tcp_active_pcbs in some cases
+
+  2011-11-23: Simon Goldschmidt
+  * sys.c: fixed bug #34884: sys_msleep() body needs to be surrounded with
+    '#ifndef sys_msleep'
+
+  2011-11-22: Simon Goldschmidt
+  * netif.c, etharp.h/.c: fixed bug #34684: Clear the arp table cache when
+    netif is brought down
+
+  2011-10-28: Simon Goldschmidt
+  * tcp_in.c: fixed bug #34638: Dead code in tcp_receive - pcb-&gt;dupacks
+
+  2011-10-23: Simon Goldschmidt
+  * mem.c: fixed bug #34429: possible memory corruption with
+    LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT set to 1
+
+  2011-10-18: Simon Goldschmidt
+  * arch.h, netdb.c: fixed bug #34592: lwip_gethostbyname_r uses nonstandard
+    error value
+
+  2011-10-18: Simon Goldschmidt
+  * opt.h: fixed default values of TCP_SNDLOWAT and TCP_SNDQUEUELOWAT for small
+    windows (bug #34176 select after non-blocking send times out)
+
+  2011-10-18: Simon Goldschmidt
+  * tcp_impl.h, tcp_out.c: fixed bug #34587: TCP_BUILD_MSS_OPTION doesn't
+    consider netif-&gt;mtu, causes slow network
+
+  2011-10-18: Simon Goldschmidt
+  * sockets.c: fixed bug #34581 missing parentheses in udplite sockets code
+
+  2011-10-18: Simon Goldschmidt
+  * sockets.h: fixed bug #34580 fcntl() is missing in LWIP_COMPAT_SOCKETS
+
+  2011-10-17: Simon Goldschmidt
+  * api_msg.c: fixed bug #34569: shutdown(SHUT_WR) crashes netconn/socket api
+
+  2011-10-13: Simon Goldschmidt
+  * tcp_in.c, tcp_out.c: fixed bug #34517 (persist timer is started although no
+    zero window is received) by starting the persist timer when a zero window is
+    received, not when we have more data queued for sending than fits into the
+    window
+
+  2011-10-13: Simon Goldschmidt
+  * def.h, timers.c: fixed bug #34541: LWIP_U32_DIFF is unnecessarily complex
+
+  2011-10-13: Simon Goldschmidt
+  * sockets.c, api_lib.c: fixed bug #34540: compiler error when CORE_LOCKING is
+    used and not all protocols are enabled
+
+  2011-10-12: Simon Goldschmidt
+  * pbuf.c: fixed bug #34534: Error in sending fragmented IP if MEM_ALIGNMENT &gt; 4
+
+  2011-10-09: Simon Goldschmidt
+  * tcp_out.c: fixed bug #34426: tcp_zero_window_probe() transmits incorrect
+    byte value when pcb-&gt;unacked != NULL
+
+  2011-10-09: Simon Goldschmidt
+  * ip4.c: fixed bug #34447 LWIP_IP_ACCEPT_UDP_PORT(dst_port) wrong
+
+  2011-09-27: Simon Goldschmidt
+  * tcp_in.c, tcp_out.c: Reset pcb-&gt;unsent_oversize in 2 more places...
+
+  2011-09-27: Simon Goldschmidt
+  * tcp_in.c: fixed bug #28288: Data after FIN in oos queue
+
+  2011-09-27: Simon Goldschmidt
+  * dhcp.c: fixed bug #34406 dhcp_option_hostname() can overflow the pbuf
+
+  2011-09-24: Simon Goldschmidt
+  * mem.h: fixed bug #34377 MEM_SIZE_F is not defined if MEM_LIBC_MALLOC==1
+
+  2011-09-23: Simon Goldschmidt
+  * pbuf.h, tcp.c, tcp_in.c: fixed bug #33871: rejecting TCP_EVENT_RECV() for
+    the last packet including FIN can lose data
+
+  2011-09-22: Simon Goldschmidt
+  * tcp_impl.h: fixed bug #34355: nagle does not take snd_buf/snd_queuelen into
+    account
+
+  2011-09-21: Simon Goldschmidt
+  * opt.h: fixed default value of TCP_SND_BUF to not violate the sanity checks
+    in init.c
+
+  2011-09-20: Simon Goldschmidt
+  * timers.c: fixed bug #34337 (possible NULL pointer in sys_check_timeouts)
+
+  2011-09-11: Simon Goldschmidt
+  * tcp_out.c: use pcb-&gt;mss instead of TCP_MSS for preallocate mss-sized pbufs
+    (bug #34019)
+
+  2011-09-09: Simon Goldschmidt
+  * udp.c: fixed bug #34072: UDP broadcast is received from wrong UDP pcb if
+    udp port matches
+
+  2011-09-03: Simon Goldschmidt
+  * tcp_in.c: fixed bug #33952 PUSH flag in incoming packet is lost when packet
+    is aggregated and sent to application
+
+  2011-09-01: Simon Goldschmidt
+  * opt.h: fixed bug #31809 LWIP_EVENT_API in opts.h is inconsistent compared
+    to other options
+
+  2011-09-01: Simon Goldschmidt
+  * tcp_in.c: fixed bug #34111 RST for ACK to listening pcb has wrong seqno
+
+  2011-08-24: Simon Goldschmidt
+  * api_msg.c, sockets.c: fixed bug #33956 Wrong error returned when calling
+    accept() on UDP connections
+
+  2011-08-24: Simon Goldschmidt
+  * sockets.h: fixed bug #34057 socklen_t should be a typedef
+
+  2011-08-24: Simon Goldschmidt
+  * pbuf.c: fixed bug #34112 Odd check in pbuf_alloced_custom (typo)
+
+  2011-08-24: Simon Goldschmidt
+  * dhcp.c: fixed bug #34122 dhcp: hostname can overflow
+
+  2011-08-24: Simon Goldschmidt
+  * netif.c: fixed bug #34121 netif_add/netif_set_ipaddr fail on NULL ipaddr
+
+  2011-08-22: Simon Goldschmidt
+  * tcp_out.c: fixed bug #33962 TF_FIN not always set after FIN is sent. (This
+    merely prevents nagle from not transmitting fast after closing.)
+
+  2011-07-22: Simon Goldschmidt
+  * api_lib.c, api_msg.c, sockets.c, api.h: fixed bug #31084 (socket API returns
+    always EMSGSIZE on non-blocking sockets if data size &gt; send buffers) -&gt; now
+    lwip_send() sends as much as possible for non-blocking sockets
+
+  2011-07-22: Simon Goldschmidt
+  * pbuf.c/.h, timers.c: freeing ooseq pbufs when the pbuf pool is empty implemented
+    for NO_SYS==1: when not using sys_check_timeouts(), call PBUF_CHECK_FREE_OOSEQ()
+    at regular intervals from main level.
+
+  2011-07-21: Simon Goldschmidt
+  * etharp.c: fixed bug #33551 (ARP entries may time out although in use) by
+    sending an ARP request when an ARP entry is used in the last minute before
+    it would time out.
+
+  2011-07-04: Simon Goldschmidt
+  * sys_arch.txt: Fixed documentation after changing sys arch prototypes for 1.4.0.
+
+  2011-06-26: Simon Goldschmidt
+  * tcp.c: fixed bug #31723 (tcp_kill_prio() kills pcbs with the same prio) by
+    updating its documentation only.
+
+ 2011-06-26: Simon Goldschmidt
+  * mem.c: fixed bug #33545: With MEM_USE_POOLS==1, mem_malloc can return an
+    unaligned pointer.
+
+  2011-06-26: Simon Goldschmidt
+  * mem.c: fixed bug #33544 "warning in mem.c in lwip 1.4.0 with NO_SYS=1"
+
+   2011-05-25: Simon Goldschmidt
+  * tcp.c: fixed bug #33398 (pointless conversion when checking TCP port range)
+
+
+
+(STABLE-1.4.0)
+
+  ++ New features:
+
+  2011-03-27: Simon Goldschmidt
+  * tcp_impl.h, tcp_in.c, tcp_out.c: Removed 'dataptr' from 'struct tcp_seg' and
+    calculate it in tcp_zero_window_probe (the only place where it was used).
+
+  2010-11-21: Simon Goldschmidt
+  * dhcp.c/.h: Added a function to deallocate the struct dhcp from a netif
+    (fixes bug #31525).
+
+  2010-07-12: Simon Goldschmidt (patch by Stephane Lesage)
+  * ip.c, udp.c/.h, pbuf.h, sockets.c: task #10495: Added support for
+    IP_MULTICAST_LOOP at socket- and raw-API level.
+
+  2010-06-16: Simon Goldschmidt
+  * ip.c: Added an optional define (LWIP_IP_ACCEPT_UDP_PORT) that can allow
+    link-layer-addressed UDP traffic to be received while a netif is down (just
+    like DHCP during configuration)
+
+  2010-05-22: Simon Goldschmidt
+  * many many files: bug #27352: removed packing from ip_addr_t, the packed
+    version is now only used in protocol headers. Added global storage for
+    current src/dest IP address while in input functions.
+
+  2010-05-16: Simon Goldschmidt
+  * def.h: task #10391: Add preprocessor-macros for compile-time htonl
+    calculation (and use them throughout the stack where applicable)
+
+  2010-05-16: Simon Goldschmidt
+  * opt.h, memp_std.h, memp.c, ppp_oe.h/.c: PPPoE now uses its own MEMP pool
+    instead of the heap (moved struct pppoe_softc from ppp_oe.c to ppp_oe.h)
+
+  2010-05-16: Simon Goldschmidt
+  * opt.h, memp_std.h, dns.h/.c: DNS_LOCAL_HOSTLIST_IS_DYNAMIC uses its own
+    MEMP pool instead of the heap
+
+  2010-05-13: Simon Goldschmidt
+  * tcp.c, udp.c: task #6995: Implement SO_REUSEADDR (correctly), added
+    new option SO_REUSE_RXTOALL to pass received UDP broadcast/multicast
+    packets to more than one pcb.
+
+  2010-05-02: Simon Goldschmidt
+  * netbuf.h/.c, sockets.c, api_msg.c: use checksum-on-copy for sending
+    UDP data for LWIP_NETIF_TX_SINGLE_PBUF==1
+
+  2010-04-30: Simon Goldschmidt
+  * udp.h/.c, pbuf.h/.c: task #6849: added udp_send(_to/_if) functions that
+    take a precalculated checksum, added pbuf_fill_chksum() to copy data
+    into a pbuf and at the same time calculating the checksum for that data
+
+  2010-04-29: Simon Goldschmidt
+  * ip_addr.h, etharp.h/.c, autoip.c: Create overridable macros for copying
+    2-byte-aligned IP addresses and MAC addresses
+
+  2010-04-28: Patch by Bill Auerbach
+  * ip.c: Inline generating IP checksum to save a function call
+
+  2010-04-14: Simon Goldschmidt
+  * tcpip.h/.c, timers.c: Added an overridable define to get informed when the
+    tcpip_thread processes messages or timeouts to implement a watchdog.
+
+  2010-03-28: Simon Goldschmidt
+  * ip_frag.c: create a new (contiguous) PBUF_RAM for every outgoing
+    fragment if LWIP_NETIF_TX_SINGLE_PBUF==1
+
+  2010-03-27: Simon Goldschmidt
+  * etharp.c: Speedup TX by moving code from find_entry to etharp_output/
+    etharp_query to prevent unnecessary function calls (inspired by
+    patch #7135).
+
+  2010-03-20: Simon Goldschmidt
+  * opt.h, tcpip.c/.h: Added an option to disable tcpip_(un)timeout code
+    since the linker cannot do this automatically to save space.
+
+  2010-03-20: Simon Goldschmidt
+  * opt.h, etharp.c/.h: Added support for static ARP table entries
+
+  2010-03-14: Simon Goldschmidt
+  * tcp_impl.h, tcp_out.c, inet_chksum.h/.c: task #6849: Calculate checksum
+    when creating TCP segments, not when (re-)transmitting them.
+
+  2010-03-07: Simon Goldschmidt
+  * sockets.c: bug #28775 (select/event_callback: only check select_cb_list
+    on change) plus use SYS_LIGHTWEIGHT_PROT to protect the select code.
+    This should speed up receiving data on sockets as the select code in
+    event_callback is only executed when select is waiting.
+
+  2010-03-06: Simon Goldschmidt
+  * tcp_out.c: task #7013 (Create option to have all packets delivered to
+    netif-&gt;output in one piece): Always copy to try to create single pbufs
+    in tcp_write.
+
+  2010-03-06: Simon Goldschmidt
+  * api.h, api_lib.c, sockets.c: task #10167 (sockets: speed up TCP recv
+    by not allocating a netbuf): added function netconn_recv_tcp_pbuf()
+    for tcp netconns to receive pbufs, not netbufs; use that function
+    for tcp sockets.
+
+  2010-03-05: Jakob Ole Stoklundsen / Simon Goldschmidt
+  * opt.h, tcp.h, tcp_impl.h, tcp.c, tcp_in.c, tcp_out.c: task #7040:
+    Work on tcp_enqueue: Don't waste memory when chaining segments,
+    added option TCP_OVERSIZE to prevent creating many small pbufs when
+    calling tcp_write with many small blocks of data. Instead, pbufs are
+    allocated larger than needed and the space is used for later calls to
+    tcp_write.
+
+  2010-02-21: Simon Goldschmidt
+  * stats.c/.h: Added const char* name to mem- and memp-stats for easier
+    debugging.
+
+  2010-02-21: Simon Goldschmidt
+  * tcp.h (and usages), added tcp_impl.h: Splitted API and internal
+    implementation of tcp to make API usage cleare to application programmers
+
+  2010-02-14: Simon Goldschmidt/Stephane Lesage
+  * ip_addr.h: Improved some defines working on ip addresses, added faster
+    macro to copy addresses that cannot be NULL
+
+  2010-02-13: Simon Goldschmidt
+  * api.h, api_lib.c, api_msg.c, sockets.c: task #7865 (implement non-
+    blocking send operation)
+
+  2010-02-12: Simon Goldschmidt
+  * sockets.c/.h: Added a minimal version of posix fctl() to have a
+    standardised way to set O_NONBLOCK for nonblocking sockets.
+
+  2010-02-12: Simon Goldschmidt
+  * dhcp.c/.h, autoip.c/.h: task #10139 (Prefer statically allocated
+    memory): added autoip_set_struct() and dhcp_set_struct() to let autoip
+    and dhcp work with user-allocated structs instead of callin mem_malloc
+
+  2010-02-12: Simon Goldschmidt/Jeff Barber
+  * tcp.c/h: patch #6865 (SO_REUSEADDR for TCP): if pcb.so_options has
+    SOF_REUSEADDR set, allow binding to endpoint in TIME_WAIT
+
+  2010-02-12: Simon Goldschmidt
+  * sys layer: task #10139 (Prefer statically allocated memory): converted
+    mbox and semaphore functions to take pointers to sys_mbox_t/sys_sem_t;
+    converted sys_mbox_new/sys_sem_new to take pointers and return err_t;
+    task #7212: Add Mutex concept in sys_arch (define LWIP_COMPAT_MUTEX
+    to let sys.h use binary semaphores instead of mutexes - as before)
+
+  2010-02-09: Simon Goldschmidt (Simon Kallweit)
+  * timers.c/.h: Added function sys_restart_timeouts() from patch #7085
+    (Restart system timeout handling)
+
+  2010-02-09: Simon Goldschmidt
+  * netif.c/.h, removed loopif.c/.h: task #10153 (Integrate loopif into
+    netif.c) - loopif does not have to be created by the port any more,
+    just define LWIP_HAVE_LOOPIF to 1.
+
+  2010-02-08: Simon Goldschmidt
+  * inet.h, ip_addr.c/.h: Added reentrant versions of inet_ntoa/ipaddr_ntoa
+    inet_ntoa_r/ipaddr_ntoa_r
+
+  2010-02-08: Simon Goldschmidt
+  * netif.h: Added netif_s/get_igmp_mac_filter() macros
+
+  2010-02-05: Simon Goldschmidt
+  * netif.h: Added function-like macros to get/set the hostname on a netif
+
+  2010-02-04: Simon Goldschmidt
+  * nearly every file: Replaced struct ip_addr by typedef ip_addr_t to
+    make changing the actual implementation behind the typedef easier.
+
+  2010-02-01: Simon Goldschmidt
+  * opt.h, memp_std.h, dns.h, netdb.c, memp.c: Let netdb use a memp pool
+    for allocating memory when getaddrinfo() is called.
+
+  2010-01-31: Simon Goldschmidt
+  * dhcp.h, dhcp.c: Reworked the code that parses DHCP options: parse
+    them once instead of parsing for every option. This also removes
+    the need for mem_malloc from dhcp_recv and makes it possible to
+    correctly retrieve the BOOTP file.
+
+  2010-01-30: simon Goldschmidt
+  * sockets.c: Use SYS_LIGHTWEIGHT_PROT instead of a semaphore to protect
+    the sockets array.
+
+  2010-01-29: Simon Goldschmidt (patch by Laura Garrett)
+  * api.h, api_msg.c, sockets.c: Added except set support in select
+    (patch #6860)
+
+  2010-01-29: Simon Goldschmidt (patch by Laura Garrett)
+  * api.h, sockets.h, err.h, api_lib.c, api_msg.c, sockets.c, err.c:
+    Add non-blocking support for connect (partly from patch #6860),
+    plus many cleanups in socket &amp; netconn API.
+
+  2010-01-27: Simon Goldschmidt
+  * opt.h, tcp.h, init.c, api_msg.c: Added TCP_SNDQUEUELOWAT corresponding
+    to TCP_SNDLOWAT and added tcp_sndqueuelen() - this fixes bug #28605
+
+  2010-01-26: Simon Goldschmidt
+  * snmp: Use memp pools for snmp instead of the heap; added 4 new pools.
+
+  2010-01-14: Simon Goldschmidt
+  * ppp.c/.h: Fixed bug #27856: PPP: Set netif link- and status-callback
+    by adding ppp_set_netif_statuscallback()/ppp_set_netif_linkcallback()
+
+  2010-01-13: Simon Goldschmidt
+  * mem.c: The heap now may be moved to user-defined memory by defining
+    LWIP_RAM_HEAP_POINTER as a void pointer to that memory's address
+    (patch #6966 and bug #26133)
+
+  2010-01-10: Simon Goldschmidt (Bill Auerbach)
+  * opt.h, memp.c: patch #6822 (Add option to place memory pools in
+    separate arrays)
+
+  2010-01-10: Simon Goldschmidt
+  * init.c, igmp.c: patch #6463 (IGMP - Adding Random Delay): added define
+    LWIP_RAND() for lwip-wide randomization (to be defined in cc.h)
+
+  2009-12-31: Simon Goldschmidt
+  * tcpip.c, init.c, memp.c, sys.c, memp_std.h, sys.h, tcpip.h
+    added timers.c/.h: Separated timer implementation from semaphore/mbox
+    implementation, moved timer implementation to timers.c/.h, timers are
+    now only called from tcpip_thread or by explicitly checking them.
+    (TASK#7235)
+
+  2009-12-27: Simon Goldschmidt
+  * opt.h, etharp.h/.c, init.c, tcpip.c: Added an additional option
+    LWIP_ETHERNET to support ethernet without ARP (necessary for pure PPPoE)
+
+
+  ++ Bugfixes:
+
+  2011-04-20: Simon Goldschmidt
+  * sys_arch.txt: sys_arch_timeouts() is not needed any more.
+
+  2011-04-13: Simon Goldschmidt
+  * tcp.c, udp.c: Fixed bug #33048 (Bad range for IP source port numbers) by
+    using ports in the IANA private/dynamic range (49152 through 65535).
+
+  2011-03-29: Simon Goldschmidt, patch by Emil Lhungdahl:
+  * etharp.h/.c: Fixed broken VLAN support.
+
+  2011-03-27: Simon Goldschmidt
+  * tcp.c: Fixed bug #32926 (TCP_RMV(&amp;tcp_bound_pcbs) is called on unbound tcp
+    pcbs) by checking if the pcb was bound (local_port != 0).
+
+  2011-03-27: Simon Goldschmidt
+  * ppp.c: Fixed bug #32280 (ppp: a pbuf is freed twice)
+
+  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
+    route.
+
+  2011-03-22: Simon Goldschmidt
+  * ppp.c: Fixed bug #32648 (PPP code crashes when terminating a link) by only
+    calling sio_read_abort() if the file descriptor is valid.
+
+  2011-03-14: Simon Goldschmidt
+  * err.h/.c, sockets.c, api_msg.c: fixed bug #31748 (Calling non-blocking connect
+    more than once can render a socket useless) since it mainly involves changing
+    "FATAL" classification of error codes: ERR_USE and ERR_ISCONN just aren't fatal.
+
+  2011-03-13: Simon Goldschmidt
+  * sockets.c: fixed bug #32769 (ESHUTDOWN is linux-specific) by fixing
+    err_to_errno_table (ERR_CLSD: ENOTCONN instead of ESHUTDOWN), ERR_ISCONN:
+    use EALRADY instead of -1
+
+  2011-03-13: Simon Goldschmidt
+  * api_lib.c: netconn_accept: return ERR_ABRT instead of ERR_CLSD if the
+    connection has been aborted by err_tcp (since this is not a normal closing
+    procedure).
+
+  2011-03-13: Simon Goldschmidt
+  * tcp.c: tcp_bind: return ERR_VAL instead of ERR_ISCONN when trying to bind
+    with pcb-&gt;state != CLOSED
+
+  2011-02-17: Simon Goldschmidt
+  * rawapi.txt: Fixed bug #32561 tcp_poll argument definition out-of-order in
+    documentation
+
+  2011-02-17: Simon Goldschmidt
+  * many files: Added missing U/UL modifiers to fix 16-bit-arch portability.
+
+  2011-01-24: Simon Goldschmidt
+  * sockets.c: Fixed bug #31741: lwip_select seems to have threading problems
+
+  2010-12-02: Simon Goldschmidt
+  * err.h: Fixed ERR_IS_FATAL so that ERR_WOULDBLOCK is not fatal.
+
+  2010-11-23: Simon Goldschmidt
+  * api.h, api_lib.c, api_msg.c, sockets.c: netconn.recv_avail is only used for
+    LWIP_SO_RCVBUF and ioctl/FIONREAD.
+
+  2010-11-23: Simon Goldschmidt
+  * etharp.c: Fixed bug #31720: ARP-queueing: RFC 1122 recommends to queue at
+    least 1 packet -&gt; ARP_QUEUEING==0 now queues the most recent packet.
+
+  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.
+
+  2010-11-22: Simon Goldschmidt
+  * etharp.c: Fixed bug #31722: IP packets sent with an AutoIP source addr
+    must be sent link-local
+
+  2010-11-22: Simon Goldschmidt
+  * timers.c: patch #7329: tcp_timer_needed prototype was ifdef'ed out for
+    LWIP_TIMERS==0
+
+  2010-11-20: Simon Goldschmidt
+  * sockets.c: Fixed bug #31170: lwip_setsockopt() does not set socket number
+
+  2010-11-20: Simon Goldschmidt
+  * sockets.h: Fixed bug #31304: Changed SHUT_RD, SHUT_WR and SHUT_RDWR to
+    resemble other stacks.
+
+  2010-11-20: Simon Goldschmidt
+  * dns.c: Fixed bug #31535: TCP_SND_QUEUELEN must be at least 2 or else
+    no-copy TCP writes will never succeed.
+
+  2010-11-20: Simon Goldschmidt
+  * dns.c: Fixed bug #31701: Error return value from dns_gethostbyname() does
+    not match documentation: return ERR_ARG instead of ERR_VAL if not
+    initialized or wrong argument.
+
+  2010-10-20: Simon Goldschmidt
+  * sockets.h: Fixed bug #31385: sizeof(struct sockaddr) is 30 but should be 16
+
+  2010-10-05: Simon Goldschmidt
+  * dhcp.c: Once again fixed #30038: DHCP/AutoIP cooperation failed when
+    replugging the network cable after an AutoIP address was assigned.
+
+  2010-08-10: Simon Goldschmidt
+  * tcp.c: Fixed bug #30728: tcp_new_port() did not check listen pcbs
+
+  2010-08-03: Simon Goldschmidt
+  * udp.c, raw.c: Don't chain empty pbufs when sending them (fixes bug #30625)
+
+  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 
+
+  2010-07-10: Simon Goldschmidt
+  * ip.c: Fixed bug #30402: CHECKSUM_GEN_IP_INLINE does not add IP options
+
+  2010-06-30: Simon Goldschmidt
+  * api_msg.c: fixed bug #30300 (shutdown parameter was not initialized in
+    netconn_delete)
+
+  2010-06-28: Kieran Mansley
+  * timers.c remove unportable printing of C function pointers
+
+  2010-06-24: Simon Goldschmidt
+  * init.c, timers.c/.h, opt.h, memp_std.h: From patch #7221: added flag
+    NO_SYS_NO_TIMERS to drop timer support for NO_SYS==1 for easier upgrading
+
+  2010-06-24: Simon Goldschmidt
+  * api(_lib).c/.h, api_msg.c/.h, sockets.c/.h: Fixed bug #10088: Correctly
+    implemented shutdown at socket level.
+
+  2010-06-21: Simon Goldschmidt
+  * pbuf.c/.h, ip_frag.c/.h, opt.h, memp_std.h: Fixed bug #29361 (ip_frag has
+    problems with zero-copy DMA MACs) by adding custom pbufs and implementing
+    custom pbufs that reference other (original) pbufs. Additionally set
+    IP_FRAG_USES_STATIC_BUF=0 as default to be on the safe side.
+
+  2010-06-15: Simon Goldschmidt
+  * dhcp.c: Fixed bug #29970: DHCP endian issue parsing option responses
+
+  2010-06-14: Simon Goldschmidt
+  * autoip.c: Fixed bug #30039: AutoIP does not reuse previous addresses
+
+  2010-06-12: Simon Goldschmidt
+  * dhcp.c: Fixed bug #30038: dhcp_network_changed doesn't reset AUTOIP coop
+    state
+
+  2010-05-17: Simon Goldschmidt
+  * netdb.c: Correctly NULL-terminate h_addr_list
+
+  2010-05-16: Simon Goldschmidt
+  * def.h/.c: changed the semantics of LWIP_PREFIX_BYTEORDER_FUNCS to prevent
+    "symbol already defined" i.e. when linking to winsock
+
+  2010-05-05: Simon Goldschmidt
+  * def.h, timers.c: Fixed bug #29769 (sys_check_timeouts: sys_now() may
+    overflow)
+
+  2010-04-21: Simon Goldschmidt
+  * api_msg.c: Fixed bug #29617 (sometime cause stall on delete listening
+    connection)
+
+  2010-03-28: Luca Ceresoli
+  * ip_addr.c/.h: patch #7143: Add a few missing const qualifiers
+
+  2010-03-27: Luca Ceresoli
+  * mib2.c: patch #7130: remove meaningless const qualifiers
+
+  2010-03-26: Simon Goldschmidt
+  * tcp_out.c: Make LWIP_NETIF_TX_SINGLE_PBUF work for TCP, too
+
+  2010-03-26: Simon Goldschmidt
+  * various files: Fixed compiling with different options disabled (TCP/UDP),
+    triggered by bug #29345; don't allocate acceptmbox if LWIP_TCP is disabled
+
+  2010-03-25: Simon Goldschmidt
+  * sockets.c: Fixed bug #29332: lwip_select() processes readset incorrectly
+
+  2010-03-25: Simon Goldschmidt
+  * tcp_in.c, test_tcp_oos.c: Fixed bug #29080: Correctly handle remote side
+    overrunning our rcv_wnd in ooseq case.
+
+  2010-03-22: Simon Goldschmidt
+  * tcp.c: tcp_listen() did not copy the pcb's prio.
+
+  2010-03-19: Simon Goldschmidt
+  * snmp_msg.c: Fixed bug #29256: SNMP Trap address was not correctly set
+
+  2010-03-14: Simon Goldschmidt
+  * opt.h, etharp.h: Fixed bug #29148 (Incorrect PBUF_POOL_BUFSIZE for ports
+    where ETH_PAD_SIZE &gt; 0) by moving definition of ETH_PAD_SIZE to opt.h
+    and basing PBUF_LINK_HLEN on it.
+
+  2010-03-08: Simon Goldschmidt
+  * netif.c, ipv4/ip.c: task #10241 (AutoIP: don't break existing connections
+    when assiging routable address): when checking incoming packets and
+    aborting existing connection on address change, filter out link-local
+    addresses.
+
+  2010-03-06: Simon Goldschmidt
+  * sockets.c: Fixed LWIP_NETIF_TX_SINGLE_PBUF for LWIP_TCPIP_CORE_LOCKING
+
+  2010-03-06: Simon Goldschmidt
+  * ipv4/ip.c: Don't try to forward link-local addresses
+
+  2010-03-06: Simon Goldschmidt
+  * etharp.c: Fixed bug #29087: etharp: don't send packets for LinkLocal-
+    addresses to gw
+
+  2010-03-05: Simon Goldschmidt
+  * dhcp.c: Fixed bug #29072: Correctly set ciaddr based on message-type
+    and state.
+
+  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.    
+
+  2010-02-21: Simon Goldschmidt
+  * opt.h, mem.h, dns.c: task #10140: Remove DNS_USES_STATIC_BUF (keep
+    the implementation of DNS_USES_STATIC_BUF==1)
+
+  2010-02-20: Simon Goldschmidt
+  * tcp.h, tcp.c, tcp_in.c, tcp_out.c: Task #10088: Correctly implement
+    close() vs. shutdown(). Now the application does not get any more
+    recv callbacks after calling tcp_close(). Added tcp_shutdown().
+
+  2010-02-19: Simon Goldschmidt
+  * mem.c/.h, pbuf.c: Renamed mem_realloc() to mem_trim() to prevent
+    confusion with realloc()
+
+  2010-02-15: Simon Goldschmidt/Stephane Lesage
+  * netif.c/.h: Link status does not depend on LWIP_NETIF_LINK_CALLBACK
+    (fixes bug #28899)
+
+  2010-02-14: Simon Goldschmidt
+  * netif.c: Fixed bug #28877 (Duplicate ARP gratuitous packet with
+    LWIP_NETIF_LINK_CALLBACK set on) by only sending if both link- and
+    admin-status of a netif are up
+
+  2010-02-14: Simon Goldschmidt
+  * opt.h: Disable ETHARP_TRUST_IP_MAC by default since it slows down packet
+    reception and is not really necessary
+
+  2010-02-14: Simon Goldschmidt
+  * etharp.c/.h: Fixed ARP input processing: only add a new entry if a
+    request was directed as us (RFC 826, Packet Reception), otherwise
+    only update existing entries; internalized some functions
+
+  2010-02-14: Simon Goldschmidt
+  * netif.h, etharp.c, tcpip.c: Fixed bug #28183 (ARP and TCP/IP cannot be
+    disabled on netif used for PPPoE) by adding a new netif flag
+    (NETIF_FLAG_ETHERNET) that tells the stack the device is an ethernet
+    device but prevents usage of ARP (so that ethernet_input can be used
+    for PPPoE).
+
+  2010-02-12: Simon Goldschmidt
+  * netif.c: netif_set_link_up/down: only do something if the link state
+    actually changes
+
+  2010-02-12: Simon Goldschmidt/Stephane Lesage
+  * api_msg.c: Fixed bug #28865 (Cannot close socket/netconn in non-blocking
+    connect)
+
+  2010-02-12: Simon Goldschmidt
+  * mem.h: Fixed bug #28866 (mem_realloc function defined in mem.h)
+
+  2010-02-09: Simon Goldschmidt
+  * api_lib.c, api_msg.c, sockets.c, api.h, api_msg.h: Fixed bug #22110
+   (recv() makes receive window update for data that wasn't received by
+    application)
+
+  2010-02-09: Simon Goldschmidt/Stephane Lesage
+  * sockets.c: Fixed bug #28853 (lwip_recvfrom() returns 0 on receive time-out
+    or any netconn_recv() error)
+
+  2010-02-09: Simon Goldschmidt
+  * ppp.c: task #10154 (PPP: Update snmp in/out counters for tx/rx packets)
+
+  2010-02-09: Simon Goldschmidt
+  * netif.c: For loopback packets, adjust the stats- and snmp-counters
+    for the loopback netif.
+
+  2010-02-08: Simon Goldschmidt
+  * igmp.c/.h, ip.h: Moved most defines from igmp.h to igmp.c for clarity
+    since they are not used anywhere else.
+
+  2010-02-08: Simon Goldschmidt (Stéphane Lesage)
+  * igmp.c, igmp.h, stats.c, stats.h: Improved IGMP stats
+    (patch from bug #28798)
+
+  2010-02-08: Simon Goldschmidt (Stéphane Lesage)
+  * igmp.c: Fixed bug #28798 (Error in "Max Response Time" processing) and
+    another bug when LWIP_RAND() returns zero.
+
+  2010-02-04: Simon Goldschmidt
+  * nearly every file: Use macros defined in ip_addr.h (some of them new)
+    to work with IP addresses (preparation for bug #27352 - Change ip_addr
+    from struct to typedef (u32_t) - and better code).
+
+  2010-01-31: Simon Goldschmidt
+  * netif.c: Don't call the link-callback from netif_set_up/down() since
+    this invalidly retriggers DHCP.
+
+  2010-01-29: Simon Goldschmidt
+  * ip_addr.h, inet.h, def.h, inet.c, def.c, more: Cleanly separate the
+    portability file inet.h and its contents from the stack: moved htonX-
+    functions to def.h (and the new def.c - they are not ipv4 dependent),
+    let inet.h depend on ip_addr.h and not the other way round.
+    This fixes bug #28732.
+
+  2010-01-28: Kieran Mansley
+  * tcp.c: Ensure ssthresh &gt;= 2*MSS
+
+  2010-01-27: Simon Goldschmidt
+  * tcp.h, tcp.c, tcp_in.c: Fixed bug #27871: Calling tcp_abort() in recv
+    callback can lead to accessing unallocated memory. As a consequence,
+    ERR_ABRT means the application has called tcp_abort()!
+
+  2010-01-25: Simon Goldschmidt
+  * snmp_structs.h, msg_in.c: Partly fixed bug #22070 (MIB_OBJECT_WRITE_ONLY
+    not implemented in SNMP): write-only or not-accessible are still
+    returned by getnext (though not by get)
+
+  2010-01-24: Simon Goldschmidt
+  * snmp: Renamed the private mib node from 'private' to 'mib_private' to
+    not use reserved C/C++ keywords
+
+  2010-01-23: Simon Goldschmidt
+  * sockets.c: Fixed bug #28716: select() returns 0 after waiting for less
+    than 1 ms
+
+  2010-01-21: Simon Goldschmidt
+  * tcp.c, api_msg.c: Fixed bug #28651 (tcp_connect: no callbacks called
+    if tcp_enqueue fails) both in raw- and netconn-API
+
+  2010-01-19: Simon Goldschmidt
+  * api_msg.c: Fixed bug #27316: netconn: Possible deadlock in err_tcp
+
+  2010-01-18: Iordan Neshev/Simon Goldschmidt
+  * src/netif/ppp: reorganised PPP sourcecode to 2.3.11 including some
+    bugfix backports from 2.4.x.
+
+  2010-01-18: Simon Goldschmidt
+  * mem.c: Fixed bug #28679: mem_realloc calculates mem_stats wrong
+
+  2010-01-17: Simon Goldschmidt
+  * api_lib.c, api_msg.c, (api_msg.h, api.h, sockets.c, tcpip.c):
+    task #10102: "netconn: clean up conn-&gt;err threading issues" by adding
+    error return value to struct api_msg_msg
+
+  2010-01-17: Simon Goldschmidt
+  * api.h, api_lib.c, sockets.c: Changed netconn_recv() and netconn_accept()
+    to return err_t (bugs #27709 and #28087)
+
+  2010-01-14: Simon Goldschmidt
+  * ...: Use typedef for function prototypes throughout the stack.
+
+  2010-01-13: Simon Goldschmidt
+  * api_msg.h/.c, api_lib.c: Fixed bug #26672 (close connection when receive
+    window = 0) by correctly draining recvmbox/acceptmbox
+
+  2010-01-11: Simon Goldschmidt
+  * pap.c: Fixed bug #13315 (PPP PAP authentication can result in
+    erroneous callbacks) by copying the code from recent pppd
+
+  2010-01-10: Simon Goldschmidt
+  * raw.c: Fixed bug #28506 (raw_bind should filter received packets)
+
+  2010-01-10: Simon Goldschmidt
+  * tcp.h/.c: bug #28127 (remove call to tcp_output() from tcp_ack(_now)())
+
+  2010-01-08: Simon Goldschmidt
+  * sockets.c: Fixed bug #28519 (lwip_recvfrom bug with len &gt; 65535)
+
+  2010-01-08: Simon Goldschmidt
+  * dns.c: Copy hostname for DNS_LOCAL_HOSTLIST_IS_DYNAMIC==1 since string
+    passed to dns_local_addhost() might be volatile
+
+  2010-01-07: Simon Goldschmidt
+  * timers.c, tcp.h: Call tcp_timer_needed() with NO_SYS==1, too
+
+  2010-01-06: Simon Goldschmidt
+  * netdb.h: Fixed bug #28496: missing include guards in netdb.h
+
+  2009-12-31: Simon Goldschmidt
+  * many ppp files: Reorganised PPP source code from ucip structure to pppd
+    structure to easily compare our code against the pppd code (around v2.3.1)
+
+  2009-12-27: Simon Goldschmidt
+  * tcp_in.c: Another fix for bug #28241 (ooseq processing) and adapted
+    unit test
+
+
+(STABLE-1.3.2)
+
+  ++ New features:
+
+  2009-10-27 Simon Goldschmidt/Stephan Lesage
+  * netifapi.c/.h: Added netifapi_netif_set_addr()
+
+  2009-10-07 Simon Goldschmidt/Fabian Koch
+  * api_msg.c, netbuf.c/.h, opt.h: patch #6888: Patch for UDP Netbufs to
+    support dest-addr and dest-port (optional: LWIP_NETBUF_RECVINFO)
+
+  2009-08-26 Simon Goldschmidt/Simon Kallweit
+  * slipif.c/.h: bug #26397: SLIP polling support
+
+  2009-08-25 Simon Goldschmidt
+  * opt.h, etharp.h/.c: task #9033: Support IEEE 802.1q tagged frame (VLAN),
+    New configuration options ETHARP_SUPPORT_VLAN and ETHARP_VLAN_CHECK.
+
+  2009-08-25 Simon Goldschmidt
+  * ip_addr.h, netdb.c: patch #6900: added define ip_ntoa(struct ip_addr*)
+
+  2009-08-24 Jakob Stoklund Olesen
+  * autoip.c, dhcp.c, netif.c: patch #6725: Teach AutoIP and DHCP to respond
+    to netif_set_link_up().
+
+  2009-08-23 Simon Goldschmidt
+  * tcp.h/.c: Added function tcp_debug_state_str() to convert a tcp state
+    to a human-readable string.
+
+  ++ Bugfixes:
+
+  2009-12-24: Kieran Mansley
+  * tcp_in.c Apply patches from Oleg Tyshev to improve OOS processing
+    (BUG#28241)
+
+  2009-12-06: Simon Goldschmidt
+  * ppp.h/.c: Fixed bug #27079 (Yet another leak in PPP): outpacket_buf can
+    be statically allocated (like in ucip)
+
+  2009-12-04: Simon Goldschmidt (patch by Ioardan Neshev)
+  * pap.c: patch #6969: PPP: missing PAP authentication UNTIMEOUT
+
+  2009-12-03: Simon Goldschmidt
+  * tcp.h, tcp_in.c, tcp_out.c: Fixed bug #28106: dup ack for fast retransmit
+    could have non-zero length
+
+  2009-12-02: Simon Goldschmidt
+  * tcp_in.c: Fixed bug #27904: TCP sends too many ACKs: delay resetting
+    tcp_input_pcb until after calling the pcb's callbacks
+
+  2009-11-29: Simon Goldschmidt
+  * tcp_in.c: Fixed bug #28054: Two segments with FIN flag on the out-of-
+    sequence queue, also fixed PBUF_POOL leak in the out-of-sequence code
+
+  2009-11-29: Simon Goldschmidt
+  * pbuf.c: Fixed bug #28064: pbuf_alloc(PBUF_POOL) is not thread-safe by
+    queueing a call into tcpip_thread to free ooseq-bufs if the pool is empty
+
+  2009-11-26: Simon Goldschmidt
+  * tcp.h: Fixed bug #28098: Nagle can prevent fast retransmit from sending
+    segment
+
+  2009-11-26: Simon Goldschmidt
+  * tcp.h, sockets.c: Fixed bug #28099: API required to disable Nagle
+    algorithm at PCB level
+
+  2009-11-22: Simon Goldschmidt
+  * tcp_out.c: Fixed bug #27905: FIN isn't combined with data on unsent
+
+  2009-11-22: Simon Goldschmidt (suggested by Bill Auerbach)
+  * tcp.c: tcp_alloc: prevent increasing stats.err for MEMP_TCP_PCB when
+    reusing time-wait pcb
+
+  2009-11-20: Simon Goldschmidt (patch by Albert Bartel)
+  * sockets.c: Fixed bug #28062: Data received directly after accepting
+    does not wake up select
+
+  2009-11-11: Simon Goldschmidt
+  * netdb.h: Fixed bug #27994: incorrect define for freeaddrinfo(addrinfo)
+
+  2009-10-30: Simon Goldschmidt
+  * opt.h: Increased default value for TCP_MSS to 536, updated default
+    value for TCP_WND to 4*TCP_MSS to keep delayed ACK working.
+
+  2009-10-28: Kieran Mansley
+  * tcp_in.c, tcp_out.c, tcp.h: re-work the fast retransmission code
+    to follow algorithm from TCP/IP Illustrated
+
+  2009-10-27: Kieran Mansley
+  * tcp_in.c: fix BUG#27445: grow cwnd with every duplicate ACK
+
+  2009-10-25: Simon Goldschmidt
+  * tcp.h: bug-fix in the TCP_EVENT_RECV macro (has to call tcp_recved if
+    pcb-&gt;recv is NULL to keep rcv_wnd correct)
+
+  2009-10-25: Simon Goldschmidt
+  * tcp_in.c: Fixed bug #26251: RST process in TIME_WAIT TCP state
+
+  2009-10-23: Simon Goldschmidt (David Empson)
+  * tcp.c: Fixed bug #27783: Silly window avoidance for small window sizes
+
+  2009-10-21: Simon Goldschmidt
+  * tcp_in.c: Fixed bug #27215: TCP sent() callback gives leading and
+    trailing 1 byte len (SYN/FIN)
+
+  2009-10-21: Simon Goldschmidt
+  * tcp_out.c: Fixed bug #27315: zero window probe and FIN
+
+  2009-10-19: Simon Goldschmidt
+  * dhcp.c/.h: Minor code simplification (don't store received pbuf, change
+    conditional code to assert where applicable), check pbuf length before
+    testing for valid reply
+
+  2009-10-19: Simon Goldschmidt
+  * dhcp.c: Removed most calls to udp_connect since they aren't necessary
+    when using udp_sendto_if() - always stay connected to IP_ADDR_ANY.
+
+  2009-10-16: Simon Goldschmidt
+  * ip.c: Fixed bug #27390: Source IP check in ip_input() causes it to drop
+    valid DHCP packets -&gt; allow 0.0.0.0 as source address when LWIP_DHCP is
+    enabled
+
+  2009-10-15: Simon Goldschmidt (Oleg Tyshev)
+  * tcp_in.c: Fixed bug #27329: dupacks by unidirectional data transmit
+
+  2009-10-15: Simon Goldschmidt
+  * api_lib.c: Fixed bug #27709: conn-&gt;err race condition on netconn_recv()
+    timeout
+
+  2009-10-15: Simon Goldschmidt
+  * autoip.c: Fixed bug #27704: autoip starts with wrong address
+    LWIP_AUTOIP_CREATE_SEED_ADDR() returned address in host byte order instead
+    of network byte order
+
+  2009-10-11 Simon Goldschmidt (Jörg Kesten)
+  * tcp_out.c: Fixed bug #27504: tcp_enqueue wrongly concatenates segments
+    which are not consecutive when retransmitting unacked segments
+
+  2009-10-09 Simon Goldschmidt
+  * opt.h: Fixed default values of some stats to only be enabled if used
+    Fixes bug #27338: sys_stats is defined when NO_SYS = 1
+
+  2009-08-30 Simon Goldschmidt
+  * ip.c: Fixed bug bug #27345: "ip_frag() does not use the LWIP_NETIF_LOOPBACK
+    function" by checking for loopback before calling ip_frag
+
+  2009-08-25 Simon Goldschmidt
+  * dhcp.c: fixed invalid dependency to etharp_query if DHCP_DOES_ARP_CHECK==0
+
+  2009-08-23 Simon Goldschmidt
+  * ppp.c: bug #27078: Possible memory leak in pppInit()
+
+  2009-08-23 Simon Goldschmidt
+  * netdb.c, dns.c: bug #26657: DNS, if host name is "localhost", result
+    is error.
+
+  2009-08-23 Simon Goldschmidt
+  * opt.h, init.c: bug #26649: TCP fails when TCP_MSS &gt; TCP_SND_BUF
+    Fixed wrong parenthesis, added check in init.c
+
+  2009-08-23 Simon Goldschmidt
+  * ppp.c: bug #27266: wait-state debug message in pppMain occurs every ms
+
+  2009-08-23 Simon Goldschmidt
+  * many ppp files: bug #27267: Added include to string.h where needed
+
+  2009-08-23 Simon Goldschmidt
+  * tcp.h: patch #6843: tcp.h macro optimization patch (for little endian)
+
+
+(STABLE-1.3.1)
+
+  ++ New features:
+
+  2009-05-10 Simon Goldschmidt
+  * opt.h, sockets.c, pbuf.c, netbuf.h, pbuf.h: task #7013: Added option
+    LWIP_NETIF_TX_SINGLE_PBUF to try to create transmit packets from only
+    one pbuf to help MACs that don't support scatter-gather DMA.
+
+  2009-05-09 Simon Goldschmidt
+  * icmp.h, icmp.c: Shrinked ICMP code, added option to NOT check icoming
+    ECHO pbuf for size (just use it): LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
+
+  2009-05-05 Simon Goldschmidt, Jakob Stoklund Olesen
+  * ip.h, ip.c: Added ip_current_netif() &amp; ip_current_header() to receive
+    extended info about the currently received packet.
+
+  2009-04-27 Simon Goldschmidt
+  * sys.h: Made SYS_LIGHTWEIGHT_PROT and sys_now() work with NO_SYS=1
+
+  2009-04-25 Simon Goldschmidt
+  * mem.c, opt.h: Added option MEM_USE_POOLS_TRY_BIGGER_POOL to try the next
+    bigger malloc pool if one is empty (only usable with MEM_USE_POOLS).
+
+  2009-04-21 Simon Goldschmidt
+  * dns.c, init.c, dns.h, opt.h: task #7507, patch #6786: DNS supports static
+    hosts table. New configuration options DNS_LOCAL_HOSTLIST and
+    DNS_LOCAL_HOSTLIST_IS_DYNAMIC. Also, DNS_LOOKUP_LOCAL_EXTERN() can be defined
+    as an external function for lookup.
+
+  2009-04-15 Simon Goldschmidt
+  * dhcp.c: patch #6763: Global DHCP XID can be redefined to something more unique
+
+  2009-03-31 Kieran Mansley
+  * tcp.c, tcp_out.c, tcp_in.c, sys.h, tcp.h, opts.h: add support for
+    TCP timestamp options, off by default.  Rework tcp_enqueue() to
+    take option flags rather than specified option data
+
+  2009-02-18 Simon Goldschmidt
+  * cc.h: Added printf formatter for size_t: SZT_F
+
+  2009-02-16 Simon Goldschmidt (patch by Rishi Khan)
+  * icmp.c, opt.h: patch #6539: (configurable) response to broadcast- and multicast
+    pings
+
+  2009-02-12 Simon Goldschmidt
+  * init.h: Added LWIP_VERSION to get the current version of the stack
+
+  2009-02-11 Simon Goldschmidt (suggested by Gottfried Spitaler)
+  * opt.h, memp.h/.c: added MEMP_MEM_MALLOC to use mem_malloc/mem_free instead
+    of the pool allocator (can save code size with MEM_LIBC_MALLOC if libc-malloc
+    is otherwise used)
+
+  2009-01-28 Jonathan Larmour (suggested by Bill Bauerbach)
+  * ipv4/inet_chksum.c, ipv4/lwip/inet_chksum.h: inet_chksum_pseudo_partial()
+  is only used by UDPLITE at present, so conditionalise it.
+
+  2008-12-03 Simon Goldschmidt (base on patch from Luca Ceresoli)
+  * autoip.c: checked in (slightly modified) patch #6683: Customizable AUTOIP
+    "seed" address. This should reduce AUTOIP conflicts if
+    LWIP_AUTOIP_CREATE_SEED_ADDR is overridden.
+
+  2008-10-02 Jonathan Larmour and Rishi Khan
+  * sockets.c (lwip_accept): Return EWOULDBLOCK if would block on non-blocking
+    socket.
+
+  2008-06-30 Simon Goldschmidt
+  * mem.c, opt.h, stats.h: fixed bug #21433: Calling mem_free/pbuf_free from
+    interrupt context isn't safe: LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT allows
+    mem_free to run between mem_malloc iterations. Added illegal counter for
+    mem stats.
+
+  2008-06-27 Simon Goldschmidt
+  * stats.h/.c, some other files: patch #6483: stats module improvement:
+    Added defines to display each module's statistic individually, added stats
+    defines for MEM, MEMP and SYS modules, removed (unused) rexmit counter.
+
+  2008-06-17 Simon Goldschmidt
+  * err.h: patch #6459: Made err_t overridable to use a more efficient type
+    (define LWIP_ERR_T in cc.h)
+
+  2008-06-17 Simon Goldschmidt
+  * slipif.c: patch #6480: Added a configuration option for slipif for symmetry
+    to loopif
+
+  2008-06-17 Simon Goldschmidt (patch by Luca Ceresoli)
+  * netif.c, loopif.c, ip.c, netif.h, loopif.h, opt.h: Checked in slightly
+    modified version of patch # 6370: Moved loopif code to netif.c so that
+    loopback traffic is supported on all netifs (all local IPs).
+    Added option to limit loopback packets for each netifs.
+
+
+  ++ Bugfixes:
+  2009-08-12 Kieran Mansley
+  * tcp_in.c, tcp.c: Fix bug #27209: handle trimming of segments when
+    out of window or out of order properly
+
+  2009-08-12 Kieran Mansley
+  * tcp_in.c: Fix bug #27199: use snd_wl2 instead of snd_wl1
+
+  2009-07-28 Simon Goldschmidt
+  * mem.h: Fixed bug #27105: "realloc() cannot replace mem_realloc()"s
+
+  2009-07-27 Kieran Mansley
+  * api.h api_msg.h netdb.h sockets.h: add missing #include directives
+
+  2009-07-09 Kieran Mansley
+  * api_msg.c, sockets.c, api.h: BUG23240 use signed counters for
+    recv_avail and don't increment counters until message successfully
+    sent to mbox
+
+  2009-06-25 Kieran Mansley
+  * api_msg.c api.h: BUG26722: initialise netconn write variables 
+    in netconn_alloc
+
+  2009-06-25 Kieran Mansley
+  * tcp.h: BUG26879: set ret value in TCP_EVENT macros when function is not set
+
+  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 
+    as in the RFCs.
+
+  2009-05-12 Simon Goldschmidt
+  * etharp.h, etharp.c, netif.c: fixed bug #26507: "Gratuitous ARP depends on
+    arp_table / uses etharp_query" by adding etharp_gratuitous()
+
+  2009-05-12 Simon Goldschmidt
+  * ip.h, ip.c, igmp.c: bug #26487: Added ip_output_if_opt that can add IP options
+    to the IP header (used by igmp_ip_output_if)
+
+  2009-05-06 Simon Goldschmidt
+  * inet_chksum.c: On little endian architectures, use LWIP_PLATFORM_HTONS (if
+    defined) for SWAP_BYTES_IN_WORD to speed up checksumming.
+
+  2009-05-05 Simon Goldschmidt
+  * sockets.c: bug #26405: Prematurely released semaphore causes lwip_select()
+    to crash
+
+  2009-05-04 Simon Goldschmidt
+  * init.c: snmp was not initialized in lwip_init()
+
+  2009-05-04 Frédéric Bernon
+  * dhcp.c, netbios.c: Changes if IP_SOF_BROADCAST is enabled.
+
+  2009-05-03 Simon Goldschmidt
+  * tcp.h: bug #26349: Nagle algorithm doesn't send although segment is full
+    (and unsent-&gt;next == NULL)
+
+  2009-05-02 Simon Goldschmidt
+  * tcpip.h, tcpip.c: fixed tcpip_untimeout (does not need the time, broken after
+    1.3.0 in CVS only) - fixes compilation of ppp_oe.c
+
+  2009-05-02 Simon Goldschmidt
+  * msg_in.c: fixed bug #25636: SNMPSET value is ignored for integer fields
+
+  2009-05-01 Simon Goldschmidt
+  * pap.c: bug #21680: PPP upap_rauthnak() drops legal NAK packets
+
+  2009-05-01 Simon Goldschmidt
+  * ppp.c: bug #24228: Memory corruption with PPP and DHCP
+
+  2009-04-29 Frédéric Bernon
+  * raw.c, udp.c, init.c, opt.h, ip.h, sockets.h: bug #26309: Implement the
+    SO(F)_BROADCAST filter for all API layers. Avoid the unindented reception
+    of broadcast packets even when this option wasn't set. Port maintainers
+    which want to enable this filter have to set IP_SOF_BROADCAST=1 in opt.h.
+    If you want this option also filter broadcast on recv operations, you also
+    have to set IP_SOF_BROADCAST_RECV=1 in opt.h.
+
+  2009-04-28 Simon Goldschmidt, Jakob Stoklund Olesen
+  * dhcp.c: patch #6721, bugs #25575, #25576: Some small fixes to DHCP and
+    DHCP/AUTOIP cooperation
+
+  2009-04-25 Simon Goldschmidt, Oleg Tyshev
+  * tcp_out.c: bug #24212: Deadlocked tcp_retransmit due to exceeded pcb-&gt;cwnd
+    Fixed by sorting the unsent and unacked queues (segments are inserted at the
+    right place in tcp_output and tcp_rexmit).
+
+  2009-04-25 Simon Goldschmidt
+  * memp.c, mem.c, memp.h, mem_std.h: bug #26213 "Problem with memory allocation
+    when debugging": memp_sizes contained the wrong sizes (including sanity
+    regions); memp pools for MEM_USE_POOLS were too small
+
+  2009-04-24 Simon Goldschmidt, Frédéric Bernon
+  * inet.c: patch #6765: Fix a small problem with the last changes (incorrect
+    behavior, with with ip address string not ended by a '\0', a space or a
+    end of line)
+
+  2009-04-19 Simon Goldschmidt
+  * rawapi.txt: Fixed bug #26069: Corrected documentation: if tcp_connect fails,
+    pcb-&gt;err is called, not pcb-&gt;connected (with an error code).
+
+  2009-04-19 Simon Goldschmidt
+  * tcp_out.c: Fixed bug #26236: "TCP options (timestamp) don't work with
+    no-copy-tcpwrite": deallocate option data, only concat segments with same flags
+
+  2009-04-19 Simon Goldschmidt
+  * tcp_out.c: Fixed bug #25094: "Zero-length pbuf" (options are now allocated
+    in the header pbuf, not the data pbuf)
+
+  2009-04-18 Simon Goldschmidt
+  * api_msg.c: fixed bug #25695: Segmentation fault in do_writemore()
+
+  2009-04-15 Simon Goldschmidt
+  * sockets.c: tried to fix bug #23559: lwip_recvfrom problem with tcp
+
+  2009-04-15 Simon Goldschmidt
+  * dhcp.c: task #9192: mem_free of dhcp-&gt;options_in and dhcp-&gt;msg_in
+
+  2009-04-15 Simon Goldschmidt
+  * ip.c, ip6.c, tcp_out.c, ip.h: patch #6808: Add a utility function
+    ip_hinted_output() (for smaller code mainly)
+
+  2009-04-15 Simon Goldschmidt
+  * inet.c: patch #6765: Supporting new line characters in inet_aton()
+
+  2009-04-15 Simon Goldschmidt
+  * dhcp.c: patch #6764: DHCP rebind and renew did not send hostnam option;
+    Converted constant OPTION_MAX_MSG_SIZE to netif-&gt;mtu, check if netif-&gt;mtu
+    is big enough in dhcp_start
+
+  2009-04-15 Simon Goldschmidt
+  * netbuf.c: bug #26027: netbuf_chain resulted in pbuf memory leak
+
+  2009-04-15 Simon Goldschmidt
+  * sockets.c, ppp.c: bug #25763: corrected 4 occurrences of SMEMCPY to MEMCPY
+
+  2009-04-15 Simon Goldschmidt
+  * sockets.c: bug #26121: set_errno can be overridden
+
+  2009-04-09 Kieran Mansley (patch from Luca Ceresoli &lt;lucaceresoli&gt;)
+  * init.c, opt.h: Patch#6774 TCP_QUEUE_OOSEQ breaks compilation when
+    LWIP_TCP==0
+
+  2009-04-09 Kieran Mansley (patch from Roy Lee &lt;roylee17&gt;)
+  * tcp.h: Patch#6802 Add do-while-clauses to those function like
+    macros in tcp.h
+
+  2009-03-31 Kieran Mansley
+  * tcp.c, tcp_in.c, tcp_out.c, tcp.h, opt.h: Rework the way window
+    updates are calculated and sent (BUG20515)
+
+  * tcp_in.c: cope with SYN packets received during established states,
+    and retransmission of initial SYN.
+
+  * tcp_out.c: set push bit correctly when tcp segments are merged
+
+  2009-03-27 Kieran Mansley
+  * tcp_out.c set window correctly on probes (correcting change made
+    yesterday)
+
+  2009-03-26 Kieran Mansley
+  * 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 
+    (bug #20779)
+
+  2009-02-18 Simon Goldschmidt (Jonathan Larmour and Bill Auerbach)
+  * ip_frag.c: patch #6528: the buffer used for IP_FRAG_USES_STATIC_BUF could be
+    too small depending on MEM_ALIGNMENT
+
+  2009-02-16 Simon Goldschmidt
+  * sockets.h/.c, api_*.h/.c: fixed arguments of socket functions to match the standard;
+    converted size argument of netconn_write to 'size_t'
+
+  2009-02-16 Simon Goldschmidt
+  * tcp.h, tcp.c: fixed bug #24440: TCP connection close problem on 64-bit host
+    by moving accept callback function pointer to TCP_PCB_COMMON
+
+  2009-02-12 Simon Goldschmidt
+  * dhcp.c: fixed bug #25345 (DHCPDECLINE is sent with "Maximum message size"
+    option)
+
+  2009-02-11 Simon Goldschmidt
+  * dhcp.c: fixed bug #24480 (releasing old udp_pdb and pbuf in dhcp_start)
+
+  2009-02-11 Simon Goldschmidt
+  * opt.h, api_msg.c: added configurable default valud for netconn-&gt;recv_bufsize:
+    RECV_BUFSIZE_DEFAULT (fixes bug #23726: pbuf pool exhaustion on slow recv())
+
+  2009-02-10 Simon Goldschmidt
+  * tcp.c: fixed bug #25467: Listen backlog is not reset on timeout in SYN_RCVD:
+    Accepts_pending is decrease on a corresponding listen pcb when a connection
+    in state SYN_RCVD is close.
+
+  2009-01-28 Jonathan Larmour
+  * pbuf.c: reclaim pbufs from TCP out-of-sequence segments if we run
+    out of pool pbufs.
+
+  2008-12-19 Simon Goldschmidt
+  * 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
+    port uses deleted netbuf.
+
+  2008-10-18 Simon Goldschmidt
+  * tcp_in.c: fixed bug ##24596: Vulnerability on faulty TCP options length
+    in tcp_parseopt
+
+  2008-10-15 Simon Goldschmidt
+  * ip_frag.c: fixed bug #24517: IP reassembly crashes on unaligned IP headers
+    by packing the struct ip_reass_helper.
+
+  2008-10-03 David Woodhouse, Jonathan Larmour
+  * etharp.c (etharp_arp_input): Fix type aliasing problem copying ip address.
+
+  2008-10-02 Jonathan Larmour
+  * dns.c: Hard-code structure sizes, to avoid issues on some compilers where
+    padding is included.
+
+  2008-09-30 Jonathan Larmour
+  * sockets.c (lwip_accept): check addr isn't NULL. If it's valid, do an
+    assertion check that addrlen isn't NULL.
+
+  2008-09-30 Jonathan Larmour
+  * tcp.c: Fix bug #24227, wrong error message in tcp_bind.
+
+  2008-08-26 Simon Goldschmidt
+  * inet.h, ip_addr.h: fixed bug #24132: Cross-dependency between ip_addr.h and
+    inet.h -&gt; moved declaration of struct in_addr from ip_addr.h to inet.h
+
+  2008-08-14 Simon Goldschmidt
+  * api_msg.c: fixed bug #23847: do_close_internal references freed memory (when
+    tcp_close returns != ERR_OK)
+
+  2008-07-08 Frédéric Bernon
+  * stats.h: Fix some build bugs introduced with patch #6483 (missing some parameters
+    in macros, mainly if MEM_STATS=0 and MEMP_STATS=0).
+
+  2008-06-24 Jonathan Larmour
+  * tcp_in.c: Fix for bug #23693 as suggested by Art R. Ensure cseg is unused
+    if tcp_seg_copy fails.
+
+  2008-06-17 Simon Goldschmidt
+  * inet_chksum.c: Checked in some ideas of patch #6460 (loop optimizations)
+    and created defines for swapping bytes and folding u32 to u16.
+
+  2008-05-30 Kieran Mansley
+  * tcp_in.c Remove redundant "if" statement, and use real rcv_wnd
+    rather than rcv_ann_wnd when deciding if packets are in-window.
+    Contributed by &lt;arasmussen@consultant.datasys.swri.edu&gt;
+
+  2008-05-30 Kieran Mansley
+  * mem.h: Fix BUG#23254.  Change macro definition of mem_* to allow
+    passing as function pointers when MEM_LIBC_MALLOC is defined.
+
+  2008-05-09 Jonathan Larmour
+  * err.h, err.c, sockets.c: Fix bug #23119: Reorder timeout error code to
+    stop it being treated as a fatal error.
+
+  2008-04-15 Simon Goldschmidt
+  * dhcp.c: fixed bug #22804: dhcp_stop doesn't clear NETIF_FLAG_DHCP
+    (flag now cleared)
+
+  2008-03-27 Simon Goldschmidt
+  * mem.c, tcpip.c, tcpip.h, opt.h: fixed bug #21433 (Calling mem_free/pbuf_free
+    from interrupt context isn't safe): set LWIP_USE_HEAP_FROM_INTERRUPT to 1
+    in lwipopts.h or use pbuf_free_callback(p)/mem_free_callback(m) to free pbufs
+    or heap memory from interrupt context
+
+  2008-03-26 Simon Goldschmidt
+  * tcp_in.c, tcp.c: fixed bug #22249: division by zero could occur if a remote
+    host sent a zero mss as TCP option.
+
+
+(STABLE-1.3.0)
+
+  ++ New features:
+
+  2008-03-10 Jonathan Larmour
+  * inet_chksum.c: Allow choice of one of the sample algorithms to be
+    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_CALCULATE_EFF_SEND_MSS to have coherent TCP options names.
+
+  2008-01-14 Frédéric Bernon
+  * rawapi.txt, api_msg.c, tcp.c, tcp_in.c, tcp.h: changes for task #7675 "Enable
+    to refuse data on a TCP_EVENT_RECV call". Important, behavior changes for the
+    tcp_recv callback (see rawapi.txt).
+
+  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
+    "Add return value to sys_mbox_post".
+
+  2008-01-12 Frédéric Bernon
+  * api_msg.c, opt.h: replace DEFAULT_RECVMBOX_SIZE per DEFAULT_TCP_RECVMBOX_SIZE,
+    DEFAULT_UDP_RECVMBOX_SIZE and DEFAULT_RAW_RECVMBOX_SIZE (to optimize queues
+    sizes), like suggested for the task #7490 "Add return value to sys_mbox_post".
+
+  2008-01-10 Frédéric Bernon
+  * tcpip.h, tcpip.c: add tcpip_callback_with_block function for the task #7490
+    "Add return value to sys_mbox_post". tcpip_callback is always defined as
+    "blocking" ("block" parameter = 1).
+
+  2008-01-10 Frédéric Bernon
+  * tcpip.h, tcpip.c, api.h, api_lib.c, api_msg.c, sockets.c: replace the field
+    netconn::mbox (sys_mbox_t) per netconn::sem (sys_sem_t) for the task #7490
+    "Add return value to sys_mbox_post".
+
+  2008-01-05 Frédéric Bernon
+  * sys_arch.txt, api.h, api_lib.c, api_msg.h, api_msg.c, tcpip.c, sys.h, opt.h:
+    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 
+    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.
+    This new function is used in tcpip_input (so, can be called in an interrupt
+    context since the function is not blocking), and in recv_udp and recv_raw.
+
+  2008-01-04 Frédéric Bernon, Simon Goldschmidt, Jonathan Larmour
+  * rawapi.txt, api.h, api_lib.c, api_msg.h, api_msg.c, sockets.c, tcp.h, tcp.c,
+    tcp_in.c, init.c, opt.h: rename backlog options with TCP_ prefix, limit the
+    "backlog" parameter in an u8_t, 0 is interpreted as "smallest queue", add
+    documentation in the rawapi.txt file.
+
+  2007-12-31 Kieran Mansley (based on patch from Per-Henrik Lundbolm)
+  * tcp.c, tcp_in.c, tcp_out.c, tcp.h: Add TCP persist timer
+
+  2007-12-31 Frédéric Bernon, Luca Ceresoli
+  * autoip.c, etharp.c: ip_addr.h: Integrate patch #6348: "Broadcast ARP packets
+    in autoip". The change in etharp_raw could be removed, since all calls to
+    etharp_raw use ethbroadcast for the "ethdst_addr" parameter. But it could be
+    wrong in the future.
+
+  2007-12-30 Frédéric Bernon, Tom Evans
+  * ip.c: Fix bug #21846 "LwIP doesn't appear to perform any IP Source Address
+    Filtering" reported by Tom Evans.
+
+  2007-12-21 Frédéric Bernon, Simon Goldschmidt, Jonathan Larmour
+  * tcp.h, opt.h, api.h, api_msg.h, tcp.c, tcp_in.c, api_lib.c, api_msg.c,
+    sockets.c, init.c: task #7252: Implement TCP listen backlog: Warning: raw API
+    applications have to call 'tcp_accepted(pcb)' in their accept callback to
+    keep accepting new connections.
+
+  2007-12-13 Frédéric Bernon
+  * api_msg.c, err.h, err.c, sockets.c, dns.c, dns.h: replace "enum dns_result"
+    by err_t type. Add a new err_t code "ERR_INPROGRESS".
+
+  2007-12-12 Frédéric Bernon
+  * dns.h, dns.c, opt.h: move DNS options to the "right" place. Most visibles
+    are the one which have ram usage.
+
+  2007-12-05 Frédéric Bernon
+  * netdb.c: add a LWIP_DNS_API_HOSTENT_STORAGE option to decide to use a static
+    set of variables (=0) or a local one (=1). In this last case, 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.
+
+  2007-12-03 Simon Goldschmidt
+  * ip.c: ip_input: check if a packet is for inp first before checking all other
+    netifs on netif_list (speeds up packet receiving in most cases)
+
+  2007-11-30 Simon Goldschmidt
+  * udp.c, raw.c: task #7497: Sort lists (pcb, netif, ...) for faster access
+    UDP: move a (connected) pcb selected for input to the front of the list of
+    pcbs so that it is found faster next time. Same for RAW pcbs that have eaten
+    a packet.
+
+  2007-11-28 Simon Goldschmidt
+  * etharp.c, stats.c, stats.h, opt.h: Introduced ETHARP_STATS
+
+  2007-11-25 Simon Goldschmidt
+  * dhcp.c: dhcp_unfold_reply() uses pbuf_copy_partial instead of its own copy
+    algorithm.
+
+  2007-11-24 Simon Goldschmidt
+  * netdb.h, netdb.c, sockets.h/.c: Moved lwip_gethostbyname from sockets.c
+    to the new file netdb.c; included lwip_getaddrinfo.
+
+  2007-11-21 Simon Goldschmidt
+  * tcp.h, opt.h, tcp.c, tcp_in.c: implemented calculating the effective send-mss
+    based on the MTU of the netif used to send. Enabled by default. Disable by
+    setting LWIP_CALCULATE_EFF_SEND_MSS to 0. This fixes bug #21492.
+
+  2007-11-19 Frédéric Bernon
+  * api_msg.c, dns.h, dns.c: Implement DNS_DOES_NAME_CHECK option (check if name
+    received match the name query), implement DNS_USES_STATIC_BUF (the place where
+    copy dns payload to parse the response), return an error if there is no place
+    for a new query, and fix some minor problems.
+
+  2007-11-16 Simon Goldschmidt
+  * new files: ipv4/inet.c, ipv4/inet_chksum.c, ipv6/inet6.c
+    removed files: core/inet.c, core/inet6.c
+    Moved inet files into ipv4/ipv6 directory; splitted inet.c/inet.h into
+    inet and chksum part; changed includes in all lwIP files as appropriate
+
+  2007-11-16 Simon Goldschmidt
+  * api.h, api_msg.h, api_lib.c, api_msg.c, socket.h, socket.c: Added sequential
+    dns resolver function for netconn api (netconn_gethostbyname) and socket api
+    (gethostbyname/gethostbyname_r).
+
+  2007-11-15 Jim Pettinato, Frédéric Bernon
+  * opt.h, init.c, tcpip.c, dhcp.c, dns.h, dns.c: add DNS client for simple name
+    requests with RAW api interface. Initialization is done in lwip_init() with
+    build time options. DNS timer is added in tcpip_thread context. DHCP can set
+    DNS server ip addresses when options are received. You need to set LWIP_DNS=1
+    in your lwipopts.h file (LWIP_DNS=0 in opt.h). DNS_DEBUG can be set to get
+    some traces with LWIP_DEBUGF. Sanity check have been added. There is a "todo"
+    list with points to improve.
+
+  2007-11-06 Simon Goldschmidt
+  * opt.h, mib2.c: Patch #6215: added ifAdminStatus write support (if explicitly
+    enabled by defining SNMP_SAFE_REQUESTS to 0); added code to check link status
+    for ifOperStatus if LWIP_NETIF_LINK_CALLBACK is defined.
+
+  2007-11-06 Simon Goldschmidt
+  * api.h, api_msg.h and dependent files: Task #7410: Removed the need to include
+    core header files in api.h (ip/tcp/udp/raw.h) to hide the internal
+    implementation from netconn api applications.
+
+  2007-11-03 Frédéric Bernon
+  * api.h, api_lib.c, api_msg.c, sockets.c, opt.h: add SO_RCVBUF option for UDP &amp;
+    RAW netconn. You need to set LWIP_SO_RCVBUF=1 in your lwipopts.h (it's disabled
+    by default). Netconn API users can use the netconn_recv_bufsize macro to access
+    it. This is a first release which have to be improve for TCP. Note it used the
+    netconn::recv_avail which need to be more "thread-safe" (note there is already
+    the problem for FIONREAD with lwip_ioctl/ioctlsocket).
+
+  2007-11-01 Frédéric Bernon, Marc Chaland
+  * sockets.h, sockets.c, api.h, api_lib.c, api_msg.h, api_msg.c, tcp.h, tcp_out.c:
+    Integrate "patch #6250 : MSG_MORE flag for send". MSG_MORE is used at socket api
+    layer, NETCONN_MORE at netconn api layer, and TCP_WRITE_FLAG_MORE at raw api
+    layer. This option enable to delayed TCP PUSH flag on multiple "write" calls.
+    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 
+    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.
+
+  2007-10-08 Simon Goldschmidt
+  * many files: Changed initialization: many init functions are not needed any
+    more since we now rely on the compiler initializing global and static
+    variables to zero!
+
+  2007-10-06 Simon Goldschmidt
+  * ip_frag.c, memp.c, mib2.c, ip_frag.h, memp_std.h, opt.h: Changed IP_REASSEMBLY
+    to enqueue the received pbufs so that multiple packets can be reassembled
+    simultaneously and no static reassembly buffer is needed.
+
+  2007-10-05 Simon Goldschmidt
+  * tcpip.c, etharp.h, etharp.c: moved ethernet_input from tcpip.c to etharp.c so
+    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 
+    common function to reduce a little bit the footprint (for all functions using
+    only the "netif" parameter).
+
+  2007-10-03 Frédéric Bernon
+  * netifapi.h, netifapi.c: add functions netifapi_netif_set_up, netifapi_netif_set_down,
+    netifapi_autoip_start and netifapi_autoip_stop. Use a common function to reduce
+    a little bit the footprint (for all functions using only the "netif" parameter).
+
+  2007-09-15 Frédéric Bernon
+  * udp.h, udp.c, sockets.c: Changes for "#20503 IGMP Improvement". Add IP_MULTICAST_IF
+    option in socket API, and a new field "multicast_ip" in "struct udp_pcb" (for
+    netconn and raw API users), only if LWIP_IGMP=1. Add getsockopt processing for
+    IP_MULTICAST_TTL and IP_MULTICAST_IF.
+
+  2007-09-10 Frédéric Bernon
+  * snmp.h, mib2.c: enable to remove SNMP timer (which consumne several cycles
+    even when it's not necessary). snmp_agent.txt tell to call snmp_inc_sysuptime()
+    each 10ms (but, it's intrusive if you use sys_timeout feature). Now, you can
+    decide to call snmp_add_sysuptime(100) each 1000ms (which is bigger "step", but
+    call to a lower frequency). Or, you can decide to not call snmp_inc_sysuptime()
+    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 
+    snmp_get_sysuptime).
+
+  2007-09-09 Frédéric Bernon, Bill Florac
+  * igmp.h, igmp.c, netif.h, netif.c, ip.c: To enable to have interfaces with IGMP,
+    and others without it, there is a new NETIF_FLAG_IGMP flag to set in netif-&gt;flags
+    if you want IGMP on an interface. igmp_stop() is now called inside netif_remove().
+    igmp_report_groups() is now called inside netif_set_link_up() (need to have
+    LWIP_NETIF_LINK_CALLBACK=1) to resend reports once the link is up (avoid to wait
+    the next query message to receive the matching multicast streams).
+
+  2007-09-08 Frédéric Bernon
+  * sockets.c, ip.h, api.h, tcp.h: declare a "struct ip_pcb" which only contains
+    IP_PCB. Add in the netconn's "pcb" union a "struct ip_pcb *ip;" (no size change).
+    Use this new field to access to common pcb fields (ttl, tos, so_options, etc...).
+    Enable to access to these fields with LWIP_TCP=0.
+
+  2007-09-05 Frédéric Bernon
+  * udp.c, ipv4/icmp.c, ipv4/ip.c, ipv6/icmp.c, ipv6/ip6.c, ipv4/icmp.h,
+    ipv6/icmp.h, opt.h: Integrate "task #7272 : LWIP_ICMP option". The new option
+    LWIP_ICMP enable/disable ICMP module inside the IP stack (enable per default).
+    Be careful, disabling ICMP make your product non-compliant to RFC1122, but
+    help to reduce footprint, and to reduce "visibility" on the Internet.
+
+  2007-09-05 Frédéric Bernon, Bill Florac
+  * opt.h, sys.h, tcpip.c, slipif.c, ppp.c, sys_arch.txt: Change parameters list
+    for sys_thread_new (see "task #7252 : Create sys_thread_new_ex()"). Two new
+    parameters have to be provided: a task name, and a task stack size. For this
+    one, since it's platform dependant, you could define the best one for you in
+    your lwipopts.h. For port maintainers, you can just add these new parameters
+    in your sys_arch.c file, and but it's not mandatory, use them in your OS
+    specific functions.
+
+  2007-09-05 Frédéric Bernon
+  * inet.c, autoip.c, msg_in.c, msg_out.c, init.c: Move some build time checkings
+    inside init.c for task #7142 "Sanity check user-configurable values".
+
+  2007-09-04 Frédéric Bernon, Bill Florac
+  * igmp.h, igmp.c, memp_std.h, memp.c, init.c, opt.h: Replace mem_malloc call by
+    memp_malloc, and use a new MEMP_NUM_IGMP_GROUP option (see opt.h to define the
+    value). It will avoid potential fragmentation problems, use a counter to know
+    how many times a group is used on an netif, and free it when all applications
+    leave it. MEMP_NUM_IGMP_GROUP got 8 as default value (and init.c got a sanity
+    check if LWIP_IGMP!=0).
+
+  2007-09-03 Frédéric Bernon
+  * igmp.h, igmp.c, sockets.c, api_msg.c: Changes for "#20503 IGMP Improvement".
+    Initialize igmp_mac_filter to NULL in netif_add (this field should be set in
+    the netif's "init" function). Use the "imr_interface" field (for socket layer)
+    and/or the "interface" field (for netconn layer), for join/leave operations.
+    The igmp_join/leavegroup first parameter change from a netif to an ipaddr.
+    This field could be a netif's ipaddr, or "any" (same meaning than ip_addr_isany).
+
+  2007-08-30 Frédéric Bernon
+  * Add netbuf.h, netbuf.c, Change api.h, api_lib.c: #7249 "Split netbuf functions
+    from api/api_lib". Now netbuf API is independant of netconn, and can be used
+    with other API (application based on raw API, or future "socket2" API). Ports
+    maintainers just have to add src/api/netbuf.c in their makefile/projects.
+
+  2007-08-30 Frédéric Bernon, Jonathan Larmour
+  * init.c: Add first version of lwip_sanity_check for task #7142 "Sanity check
+    user-configurable values".
+
+  2007-08-29 Frédéric Bernon
+  * igmp.h, igmp.c, tcpip.c, init.c, netif.c: change igmp_init and add igmp_start.
+    igmp_start is call inside netif_add. Now, igmp initialization is in the same
+    spirit than the others modules. Modify some IGMP debug traces.
+
+  2007-08-29 Frédéric Bernon
+  * Add init.h, init.c, Change opt.h, tcpip.c: Task  #7213 "Add a lwip_init function"
+    Add lwip_init function to regroup all modules initializations, and to provide
+    a place to add code for task #7142 "Sanity check user-configurable values".
+    Ports maintainers should remove direct initializations calls from their code,
+    and add init.c in their makefiles. Note that lwip_init() function is called
+    inside tcpip_init, but can also be used by raw api users since all calls are
+    disabled when matching options are disabled. Also note that their is new options
+    in opt.h, you should configure in your lwipopts.h (they are enabled per default).
+
+  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). 
+
+  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".
+    Add a netif_is_link_up() function if LWIP_NETIF_LINK_CALLBACK option is set.
+
+  2007-08-22 Frédéric Bernon
+  * netif.h, netif.c, opt.h: Rename LWIP_NETIF_CALLBACK in LWIP_NETIF_STATUS_CALLBACK
+    to be coherent with new LWIP_NETIF_LINK_CALLBACK option before next release.
+
+  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 
+    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 
+    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.
+
+  2007-08-16 Marc Boucher
+  * api_msg.c: Initialize newconn-&gt;state to NETCONN_NONE in accept_function;
+    otherwise it was left to NETCONN_CLOSE and sent_tcp() could prematurely
+    close the connection.
+
+  2007-08-16 Marc Boucher
+  * sockets.c: lwip_accept(): check netconn_peer() error return.
+
+  2007-08-16 Marc Boucher
+  * mem.c, mem.h: Added mem_calloc().
+
+  2007-08-16 Marc Boucher
+  * tcpip.c, tcpip.h memp.c, memp.h: Added distinct memp (MEMP_TCPIP_MSG_INPKT)
+    for input packets to prevent floods from consuming all of MEMP_TCPIP_MSG
+    and starving other message types.
+    Renamed MEMP_TCPIP_MSG to MEMP_TCPIP_MSG_API
+
+  2007-08-16 Marc Boucher
+  * pbuf.c, pbuf.h, etharp.c, tcp_in.c, sockets.c: Split pbuf flags in pbuf
+    type and flgs (later renamed to flags).
+    Use enum pbuf_flag as pbuf_type.  Renumber PBUF_FLAG_*.
+    Improved lwip_recvfrom().  TCP push now propagated.
+
+  2007-08-16 Marc Boucher
+  * ethernetif.c, contrib/ports/various: ethbroadcast now a shared global
+    provided by etharp.
+
+  2007-08-16 Marc Boucher
+  * ppp_oe.c ppp_oe.h, auth.c chap.c fsm.c lcp.c ppp.c ppp.h,
+    etharp.c ethernetif.c, etharp.h, opt.h tcpip.h, tcpip.c:
+    Added PPPoE support and various PPP improvements.
+
+  2007-07-25 Simon Goldschmidt
+  * api_lib.c, ip_frag.c, pbuf.c, api.h, pbuf.h: Introduced pbuf_copy_partial,
+    making netbuf_copy_partial use this function.
+
+  2007-07-25 Simon Goldschmidt
+  * tcp_in.c: Fix bug #20506: Slow start / initial congestion window starts with
+    2 * mss (instead of 1 * mss previously) to comply with some newer RFCs and
+    other stacks.
+
+  2007-07-13 Jared Grubb (integrated by Frédéric Bernon)
+  * opt.h, netif.h, netif.c, ethernetif.c: Add new configuration option to add
+    a link callback in the netif struct, and functions to handle it. Be carefull
+    for port maintainers to add the NETIF_FLAG_LINK_UP flag (like in ethernetif.c)
+    if you want to be sure to be compatible with future changes...
+
+  2007-06-30 Frédéric Bernon
+  * sockets.h, sockets.c: Implement MSG_PEEK flag for recv/recvfrom functions.
+
+  2007-06-21 Simon Goldschmidt
+  * etharp.h, etharp.c: Combined etharp_request with etharp_raw for both
+    LWIP_AUTOIP =0 and =1 to remove redundant code.
+
+  2007-06-21 Simon Goldschmidt
+  * mem.c, memp.c, mem.h, memp.h, opt.h: task #6863: Introduced the option
+    MEM_USE_POOLS to use 4 pools with different sized elements instead of a
+    heap. This both prevents memory fragmentation and gives a higher speed
+    at the cost of more memory consumption. Turned off by default.
+
+  2007-06-21 Simon Goldschmidt
+  * api_lib.c, api_msg.c, api.h, api_msg.h: Converted the length argument of
+    netconn_write (and therefore also api_msg_msg.msg.w.len) from u16_t into
+    int to be able to send a bigger buffer than 64K with one time (mainly
+    used from lwip_send).
+
+  2007-06-21 Simon Goldschmidt
+  * tcp.h, api_msg.c: Moved the nagle algorithm from netconn_write/do_write
+    into a define (tcp_output_nagle) in tcp.h to provide it to raw api users, too.
+
+  2007-06-21 Simon Goldschmidt
+  * api.h, api_lib.c, api_msg.c: Fixed bug #20021: Moved sendbuf-processing in
+    netconn_write from api_lib.c to api_msg.c to also prevent multiple context-
+    changes on low memory or empty send-buffer.
+
+  2007-06-18 Simon Goldschmidt
+  * etharp.c, etharp.h: Changed etharp to use a defined hardware address length
+    of 6 to avoid loading netif-&gt;hwaddr_len every time (since this file is only
+    used for ethernet and struct eth_addr already had a defined length of 6).
+
+  2007-06-17 Simon Goldschmidt
+  * sockets.c, sockets.h: Implemented socket options SO_NO_CHECK for UDP sockets
+    to disable UDP checksum generation on transmit.
+
+  2007-06-13 Frédéric Bernon, Simon Goldschmidt
+  * debug.h, api_msg.c: change LWIP_ERROR to use it to check errors like invalid
+    pointers or parameters, and let the possibility to redefined it in cc.h. Use
+    this macro to check "conn" parameter in api_msg.c functions.
+
+  2007-06-11 Simon Goldschmidt
+  * sockets.c, sockets.h: Added UDP lite support for sockets
+
+  2007-06-10 Simon Goldschmidt
+  * udp.h, opt.h, api_msg.c, ip.c, udp.c: Included switch LWIP_UDPLITE (enabled
+    by default) to switch off UDP-Lite support if not needed (reduces udp.c code
+    size)
+
+  2007-06-09 Dominik Spies (integrated by Frédéric Bernon)
+  * autoip.h, autoip.c, dhcp.h, dhcp.c, netif.h, netif.c, etharp.h, etharp.c, opt.h:
+    AutoIP implementation available for IPv4, with new options LWIP_AUTOIP and
+    LWIP_DHCP_AUTOIP_COOP if you want to cooperate with DHCP. Some tips to adapt
+    (see TODO mark in the source code).
+
+  2007-06-09 Simon Goldschmidt
+  * etharp.h, etharp.c, ethernetif.c: Modified order of parameters for
+    etharp_output() to match netif-&gt;output so etharp_output() can be used
+    directly as netif-&gt;output to save one function call.
+
+  2007-06-08 Simon Goldschmidt
+  * netif.h, ethernetif.c, slipif.c, loopif.c: Added define
+    NETIF_INIT_SNMP(netif, type, speed) to initialize per-netif snmp variables,
+    added initialization of those to ethernetif, slipif and loopif.
+
+  2007-05-18 Simon Goldschmidt
+  * opt.h, ip_frag.c, ip_frag.h, ip.c: Added option IP_FRAG_USES_STATIC_BUF
+    (defaulting to off for now) that can be set to 0 to send fragmented
+    packets by passing PBUF_REFs down the stack.
+
+  2007-05-23 Frédéric Bernon
+  * api_lib.c: Implement SO_RCVTIMEO for accept and recv on TCP
+    connections, such present in patch #5959.
+
+  2007-05-23 Frédéric Bernon
+  * api.h, api_lib.c, api_msg.c, sockets.c: group the different NETCONN_UDPxxx
+    code in only one part...
+
+  2007-05-18 Simon Goldschmidt
+  * opt.h, memp.h, memp.c: Added option MEMP_OVERFLOW_CHECK to check for memp
+    elements to overflow. This is achieved by adding some bytes before and after
+    each pool element (increasing their size, of course), filling them with a
+    prominent value and checking them on freeing the element.
+    Set it to 2 to also check every element in every pool each time memp_malloc()
+    or memp_free() is called (slower but more helpful).
+
+  2007-05-10 Simon Goldschmidt
+  * opt.h, memp.h, memp.c, pbuf.c (see task #6831): use a new memp pool for
+    PBUF_POOL pbufs instead of the old pool implementation in pbuf.c to reduce
+    code size.
+
+  2007-05-11 Frédéric Bernon
+  * sockets.c, api_lib.c, api_msg.h, api_msg.c, netifapi.h, netifapi.c, tcpip.c:
+    Include a function pointer instead of a table index in the message to reduce
+    footprint. Disable some part of lwip_send and lwip_sendto if some options are
+    not set (LWIP_TCP, LWIP_UDP, LWIP_RAW).
+
+  2007-05-10 Simon Goldschmidt
+  * *.h (except netif/ppp/*.h): Included patch #5448: include '#ifdef __cplusplus
+    \ extern "C" {' in all header files. Now you can write your application using
+    the lwIP stack in C++ and simply #include the core files. Note I have left
+    out the netif/ppp/*h header files for now, since I don't know which files are
+    included by applications and which are for internal use only.
+
+  2007-05-09 Simon Goldschmidt
+  * opt.h, *.c/*.h: Included patch #5920: Create define to override C-library
+    memcpy. 2 Defines are created: MEMCPY() for normal memcpy, SMEMCPY() for
+    situations where some compilers might inline the copy and save a function
+    call. Also replaced all calls to memcpy() with calls to (S)MEMCPY().
+
+  2007-05-08 Simon Goldschmidt
+  * mem.h: If MEM_LIBC_MALLOC==1, allow the defines (e.g. mem_malloc() -&gt; malloc())
+    to be overriden in case the C-library malloc implementation is not protected
+    against concurrent access.
+
+  2007-05-04 Simon Goldschmidt (Atte Kojo)
+  * etharp.c: Introduced fast one-entry-cache to speed up ARP lookup when sending
+    multiple packets to the same host.
+
+  2007-05-04 Frédéric Bernon, Jonathan Larmour
+  * sockets.c, api.h, api_lib.c, api_msg.h, api_msg.c: Fix bug #19162 "lwip_sento: a possible
+    to corrupt remote addr/port connection state". Reduce problems "not enought memory" with
+    netbuf (if we receive lot of datagrams). Improve lwip_sendto (only one exchange between
+    sockets api and api_msg which run in tcpip_thread context). Add netconn_sento function.
+    Warning, if you directly access to "fromaddr" &amp; "fromport" field from netbuf struct,
+    these fields are now renamed "addr" &amp; "port".
+
+  2007-04-11 Jonathan Larmour
+  * sys.h, api_lib.c: Provide new sys_mbox_tryfetch function. Require ports to provide new
+    sys_arch_mbox_tryfetch function to get a message if one is there, otherwise return
+    with SYS_MBOX_EMPTY. sys_arch_mbox_tryfetch can be implemented as a function-like macro
+    by the port in sys_arch.h if desired.
+
+  2007-04-06 Frédéric Bernon, Simon Goldschmidt
+  * opt.h, tcpip.h, tcpip.c, netifapi.h, netifapi.c: New configuration option LWIP_NETIF_API
+    allow to use thread-safe functions to add/remove netif in list, and to start/stop dhcp
+    clients, using new functions from netifapi.h. Disable as default (no port change to do).
+
+  2007-04-05 Frédéric Bernon
+  * sockets.c: remplace ENOBUFS errors on alloc_socket by ENFILE to be more BSD compliant.
+
+  2007-04-04 Simon Goldschmidt
+  * arch.h, api_msg.c, dhcp.c, msg_in.c, sockets.c: Introduced #define LWIP_UNUSED_ARG(x)
+    use this for and architecture-independent form to tell the compiler you intentionally
+    are not using this variable. Can be overriden in cc.h.
+
+  2007-03-28 Frédéric Bernon
+  * opt.h, netif.h, dhcp.h, dhcp.c: New configuration option LWIP_NETIF_HOSTNAME allow to
+    define a hostname in netif struct (this is just a pointer, so, you can use a hardcoded
+    string, point on one of your's ethernetif field, or alloc a string you will free yourself).
+    It will be used by DHCP to register a client hostname, but can also be use when you call
+    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 
+    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 
+    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 
+    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). 
+    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 
+    filter per all network interfaces. Declare a new function in netif to enable to
+    control the MAC filter (to reduce lwIP traffic processing).
+
+  2007-03-11 Frédéric Bernon
+  * tcp.h, tcp.c, sockets.c, tcp_out.c, tcp_in.c, opt.h: Keepalive values can
+    be configured at run time with LWIP_TCP_KEEPALIVE, but don't change this
+    unless you know what you're doing (default are RFC1122 compliant). Note
+    that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set in seconds.
+
+  2007-03-08 Frédéric Bernon
+  * tcp.h: Keepalive values can be configured at compile time, but don't change
+    this unless you know what you're doing (default are RFC1122 compliant).
+
+  2007-03-08 Frédéric Bernon
+  * sockets.c, api.h, api_lib.c, tcpip.c, sys.h, sys.c, err.c, opt.h:
+    Implement LWIP_SO_RCVTIMEO configuration option to enable/disable SO_RCVTIMEO
+    on UDP sockets/netconn.
+
+  2007-03-08 Simon Goldschmidt
+  * 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: 
+    Implement SO_RCVTIMEO on UDP sockets/netconn.
+
+  2007-02-28 Kieran Mansley (based on patch from Simon Goldschmidt)
+  * api_lib.c, tcpip.c, memp.c, memp.h: make API msg structs allocated
+    on the stack and remove the API msg type from memp
+
+  2007-02-26 Jonathan Larmour (based on patch from Simon Goldschmidt)
+  * sockets.h, sockets.c: Move socket initialization to new
+    lwip_socket_init() function.
+    NOTE: this changes the API with ports. Ports will have to be
+    updated to call lwip_socket_init() now.
+
+  2007-02-26 Jonathan Larmour (based on patch from Simon Goldschmidt)
+  * api_lib.c: Use memcpy in netbuf_copy_partial.
+
+
+  ++ Bug fixes:
+
+  2008-03-17 Frédéric Bernon, Ed Kerekes
+  * igmp.h, igmp.c: Fix bug #22613 "IGMP iphdr problem" (could have
+    some problems to fill the IP header on some targets, use now the
+    ip.h macros to do it).
+
+  2008-03-13 Frédéric Bernon
+  * sockets.c: Fix bug #22435 "lwip_recvfrom with TCP break;". Using
+    (lwip_)recvfrom with valid "from" and "fromlen" parameters, on a
+    TCP connection caused a crash. Note that using (lwip_)recvfrom
+    like this is a bit slow and that using (lwip)getpeername is the
+    good lwip way to do it (so, using recv is faster on tcp sockets).
+
+  2008-03-12 Frédéric Bernon, Jonathan Larmour
+  * api_msg.c, contrib/apps/ping.c: Fix bug #22530 "api_msg.c's
+    recv_raw() does not consume data", and the ping sample (with
+    LWIP_SOCKET=1, the code did the wrong supposition that lwip_recvfrom
+    returned the IP payload, without the IP header).
+
+  2008-03-04 Jonathan Larmour
+  * mem.c, stats.c, mem.h: apply patch #6414 to avoid compiler errors
+  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) 
+  * Numerous small compiler error/warning fixes from contributions to
+    mailing list after 1.3.0 release candidate made.
+
+  2008-01-25 Cui hengbin (integrated by Frédéric Bernon)
+  * dns.c: Fix bug #22108 "DNS problem" caused by unaligned structures.
+
+  2008-01-15 Kieran Mansley
+  * tcp_out.c: BUG20511.  Modify persist timer to start when we are
+    prevented from sending by a small send window, not just a zero
+    send window.
+
+  2008-01-09 Jonathan Larmour
+  * opt.h, ip.c: Rename IP_OPTIONS define to IP_OPTIONS_ALLOWED to avoid
+    conflict with Linux system headers.
+
+  2008-01-06 Jonathan Larmour
+  * dhcp.c: fix bug #19927: "DHCP NACK problem" by clearing any existing set IP
+    address entirely on receiving a DHCPNAK, and restarting discovery.
+
+  2007-12-21 Simon Goldschmidt
+  * sys.h, api_lib.c, api_msg.c, sockets.c: fix bug #21698: "netconn-&gt;recv_avail
+    is not protected" by using new macros for interlocked access to modify/test
+    netconn-&gt;recv_avail.
+
+  2007-12-20 Kieran Mansley (based on patch from Oleg Tyshev)
+  * tcp_in.c: fix bug# 21535 (nrtx not reset correctly in SYN_SENT state)
+
+  2007-12-20 Kieran Mansley (based on patch from Per-Henrik Lundbolm)
+  * tcp.c, tcp_in.c, tcp_out.c, tcp.h: fix bug #20199 (better handling
+    of silly window avoidance and prevent lwIP from shrinking the window)
+
+  2007-12-04 Simon Goldschmidt
+  * tcp.c, tcp_in.c: fix bug #21699 (segment leak in ooseq processing when last
+    data packet was lost): add assert that all segment lists are empty in
+    tcp_pcb_remove before setting pcb to CLOSED state; don't directly set CLOSED
+    state from LAST_ACK in tcp_process
+
+  2007-12-02 Simon Goldschmidt
+  * sockets.h: fix bug #21654: exclude definition of struct timeval from #ifndef FD_SET
+    If including &lt;sys/time.h&gt; for system-struct timeval, LWIP_TIMEVAL_PRIVATE now
+    has to be set to 0 in lwipopts.h
+
+  2007-12-02 Simon Goldschmidt
+  * api_msg.c, api_lib.c: fix bug #21656 (recvmbox problem in netconn API): always
+    allocate a recvmbox in netconn_new_with_proto_and_callback. For a tcp-listen
+    netconn, this recvmbox is later freed and a new mbox is allocated for acceptmbox.
+    This is a fix for thread-safety and allocates all items needed for a netconn
+    when the netconn is created.
+
+  2007-11-30 Simon Goldschmidt
+  * udp.c: first attempt to fix bug #21655 (DHCP doesn't work reliably with multiple
+    netifs): if LWIP_DHCP is enabled, UDP packets to DHCP_CLIENT_PORT are passed
+    to netif-&gt;dhcp-&gt;pcb only (if that exists) and not to any other pcb for the same
+    port (only solution to let UDP pcbs 'bind' to a netif instead of an IP address)
+
+  2007-11-27 Simon Goldschmidt
+  * ip.c: fixed bug #21643 (udp_send/raw_send don't fail if netif is down) by
+    letting ip_route only use netifs that are up.
+
+  2007-11-27 Simon Goldschmidt
+  * err.h, api_lib.c, api_msg.c, sockets.c: Changed error handling: ERR_MEM, ERR_BUF
+    and ERR_RTE are seen as non-fatal, all other errors are fatal. netconns and
+    sockets block most operations once they have seen a fatal error.
+
+  2007-11-27 Simon Goldschmidt
+  * udp.h, udp.c, dhcp.c: Implemented new function udp_sendto_if which takes the
+    netif to send as an argument (to be able to send on netifs that are down).
+
+  2007-11-26 Simon Goldschmidt
+  * tcp_in.c: Fixed bug #21582: pcb-&gt;acked accounting can be wrong when ACKs
+    arrive out-of-order
+
+  2007-11-21 Simon Goldschmidt
+  * tcp.h, tcp_out.c, api_msg.c: Fixed bug #20287: tcp_output_nagle sends too early
+    Fixed the nagle algorithm; nagle now also works for all raw API applications
+    and has to be explicitly disabled with 'tcp_pcb-&gt;flags |= TF_NODELAY'
+
+  2007-11-12 Frédéric Bernon
+  * sockets.c, api.h, api_lib.c, api_msg.h, api_msg.c: Fixed bug #20900. Now, most
+    of the netconn_peer and netconn_addr processing is done inside tcpip_thread
+    context in do_getaddr.
+
+  2007-11-10 Simon Goldschmidt
+  * etharp.c: Fixed bug: assert fired when MEMP_ARP_QUEUE was empty (which can
+    happen any time). Now the packet simply isn't enqueued when out of memory.
+
+  2007-11-01 Simon Goldschmidt
+  * tcp.c, tcp_in.c: Fixed bug #21494: The send mss (pcb-&gt;mss) is set to 536 (or
+    TCP_MSS if that is smaller) as long as no MSS option is received from the
+    remote host.
+
+  2007-11-01 Simon Goldschmidt
+  * tcp.h, tcp.c, tcp_in.c: Fixed bug #21491: The MSS option sent (with SYN)
+    is now based on TCP_MSS instead of pcb-&gt;mss (on passive open now effectively
+    sending our configured TCP_MSS instead of the one received).
+
+  2007-11-01 Simon Goldschmidt
+  * tcp_in.c: Fixed bug #21181: On active open, the initial congestion window was
+    calculated based on the configured TCP_MSS, not on the MSS option received
+    with SYN+ACK.
+
+  2007-10-09 Simon Goldschmidt
+  * udp.c, inet.c, inet.h: Fixed UDPLite: send: Checksum was always generated too
+    short and also was generated wrong if checksum coverage != tot_len;
+    receive: checksum was calculated wrong if checksum coverage != tot_len
+
+  2007-10-08 Simon Goldschmidt
+  * mem.c: lfree was not updated in mem_realloc!
+
+  2007-10-07 Frédéric Bernon
+  * sockets.c, api.h, api_lib.c: First step to fix "bug #20900 : Potential
+    crash error problem with netconn_peer &amp; netconn_addr". VERY IMPORTANT:
+    this change cause an API breakage for netconn_addr, since a parameter
+    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 
+    netconn_peer &amp; netconn_addr have the same parameters).
+
+  2007-09-20 Simon Goldschmidt
+  * tcp.c: Fixed bug #21080 (tcp_bind without check pcbs in TIME_WAIT state)
+    by checking  tcp_tw_pcbs also
+
+  2007-09-19 Simon Goldschmidt
+  * icmp.c: Fixed bug #21107 (didn't reset IP TTL in ICMP echo replies)
+
+  2007-09-15 Mike Kleshov
+  * mem.c: Fixed bug #21077 (inaccuracy in calculation of lwip_stat.mem.used)
+
+  2007-09-06 Frédéric Bernon
+  * several-files: replace some #include "arch/cc.h" by "lwip/arch.h", or simply remove
+    it as long as "lwip/opt.h" is included before (this one include "lwip/debug.h" which
+    already include "lwip/arch.h"). Like that, default defines are provided by "lwip/arch.h"
+    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, 
+    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 
+    are considered like IP packets (payload pointing to iphdr).
+
+  2007-08-27 Frédéric Bernon
+  * api.h, api_lib.c, api_msg.c: First fix for "bug #20900 : Potential crash error
+    problem with netconn_peer &amp; netconn_addr". Introduce NETCONN_LISTEN netconn_state
+    and remove obsolete ones (NETCONN_RECV &amp; NETCONN_ACCEPT).
+
+  2007-08-24 Kieran Mansley
+  * inet.c Modify (acc &gt;&gt; 16) test to ((acc &gt;&gt; 16) != 0) to help buggy
+    compiler (Paradigm C++)
+
+  2007-08-09 Frédéric Bernon, Bill Florac
+  * stats.h, stats.c, igmp.h, igmp.c, opt.h: Fix for bug #20503 : IGMP Improvement.
+    Introduce IGMP_STATS to centralize statistics management.
+
+  2007-08-09 Frédéric Bernon, Bill Florac
+  * udp.c: Fix for bug #20503 : IGMP Improvement. Enable to receive a multicast
+    packet on a udp pcb binded on an netif's IP address, and not on "any".
+
+  2007-08-09 Frédéric Bernon, Bill Florac
+  * igmp.h, igmp.c, ip.c: Fix minor changes from bug #20503 : IGMP Improvement.
+    This is mainly on using lookup/lookfor, and some coding styles...
+
+  2007-07-26 Frédéric Bernon (and "thedoctor")
+  * igmp.c: Fix bug #20595 to accept IGMPv3 "Query" messages.
+
+  2007-07-25 Simon Goldschmidt
+  * api_msg.c, tcp.c: Another fix for bug #20021: by not returning an error if
+    tcp_output fails in tcp_close, the code in do_close_internal gets simpler
+    (tcp_output is called again later from tcp timers).
+
+  2007-07-25 Simon Goldschmidt
+  * ip_frag.c: Fixed bug #20429: use the new pbuf_copy_partial instead of the old
+    copy_from_pbuf, which illegally modified the given pbuf.
+
+  2007-07-25 Simon Goldschmidt
+  * tcp_out.c: tcp_enqueue: pcb-&gt;snd_queuelen didn't work for chaine PBUF_RAMs:
+    changed snd_queuelen++ to snd_queuelen += pbuf_clen(p).
+
+  2007-07-24 Simon Goldschmidt
+  * api_msg.c, tcp.c: Fix bug #20480: Check the pcb passed to tcp_listen() for the
+    correct state (must be CLOSED).
+
+  2007-07-13 Thomas Taranowski (commited by Jared Grubb)
+  * memp.c: Fix bug #20478: memp_malloc returned NULL+MEMP_SIZE on failed
+    allocation. It now returns NULL.
+
+  2007-07-13 Frédéric Bernon
+  * api_msg.c: Fix bug #20318: api_msg "recv" callbacks don't call pbuf_free in
+    all error cases.
+
+  2007-07-13 Frédéric Bernon
+  * api_msg.c: Fix bug #20315: possible memory leak problem if tcp_listen failed,
+    because current code doesn't follow rawapi.txt documentation.
+
+  2007-07-13 Kieran Mansley
+  * src/core/tcp_in.c Apply patch#5741 from Oleg Tyshev to fix bug in
+    out of sequence processing of received packets
+
+  2007-07-03 Simon Goldschmidt
+  * nearly-all-files: Added assertions where PBUF_RAM pbufs are used and an
+    assumption is made that this pbuf is in one piece (i.e. not chained). These
+    assumptions clash with the possibility of converting to fully pool-based
+    pbuf implementations, where PBUF_RAM pbufs might be chained.
+
+  2007-07-03 Simon Goldschmidt
+  * api.h, api_lib.c, api_msg.c: Final fix for bug #20021 and some other problems
+    when closing tcp netconns: removed conn-&gt;sem, less context switches when
+    closing, both netconn_close and netconn_delete should safely close tcp
+    connections.
+
+  2007-07-02 Simon Goldschmidt
+  * ipv4/ip.h, ipv6/ip.h, opt.h, netif.h, etharp.h, ipv4/ip.c, netif.c, raw.c,
+    tcp_out.c, udp.c, etharp.c: Added option LWIP_NETIF_HWADDRHINT (default=off)
+    to cache ARP table indices with each pcb instead of single-entry cache for
+    the complete stack.
+
+  2007-07-02 Simon Goldschmidt
+  * tcp.h, tcp.c, tcp_in.c, tcp_out.c: Added some ASSERTS and casts to prevent
+    warnings when assigning to smaller types.
+
+  2007-06-28 Simon Goldschmidt
+  * tcp_out.c: Added check to prevent tcp_pcb-&gt;snd_queuelen from overflowing.
+
+  2007-06-28 Simon Goldschmidt
+  * tcp.h: Fixed bug #20287: Fixed nagle algorithm (sending was done too early if
+    a segment contained chained pbufs)
+
+  2007-06-28 Frédéric Bernon
+  * autoip.c: replace most of rand() calls by a macro LWIP_AUTOIP_RAND which compute
+    a "pseudo-random" value based on netif's MAC and some autoip fields. It's always
+    possible to define this macro in your own lwipopts.h to always use C library's
+    rand(). Note that autoip_create_rand_addr doesn't use this macro.
+
+  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...) 
+
+  2007-06-26 Simon Goldschmidt
+  * udp.h: Fixed bug #20259: struct udp_hdr was lacking the packin defines.
+
+  2007-06-25 Simon Goldschmidt
+  * udp.c: Fixed bug #20253: icmp_dest_unreach was called with a wrong p-&gt;payload
+    for udp packets with no matching pcb.
+
+  2007-06-25 Simon Goldschmidt
+  * udp.c: Fixed bug #20220: UDP PCB search in udp_input(): a non-local match
+    could get udp input packets if the remote side matched.
+
+  2007-06-13 Simon Goldschmidt
+  * netif.c: Fixed bug #20180 (TCP pcbs listening on IP_ADDR_ANY could get
+    changed in netif_set_ipaddr if previous netif-&gt;ip_addr.addr was 0.
+
+  2007-06-13 Simon Goldschmidt
+  * api_msg.c: pcb_new sets conn-&gt;err if protocol is not implemented
+    -&gt; netconn_new_..() does not allocate a new connection for unsupported
+    protocols.
+
+  2007-06-13 Frédéric Bernon, Simon Goldschmidt
+  * api_lib.c: change return expression in netconn_addr and netconn_peer, because
+    conn-&gt;err was reset to ERR_OK without any reasons (and error was lost)...
+
+  2007-06-13 Frédéric Bernon, Matthias Weisser
+  * opt.h, mem.h, mem.c, memp.c, pbuf.c, ip_frag.c, vj.c: Fix bug #20162. Rename
+    MEM_ALIGN in LWIP_MEM_ALIGN and MEM_ALIGN_SIZE in LWIP_MEM_ALIGN_SIZE to avoid
+    some macro names collision with some OS macros.
+
+  2007-06-11 Simon Goldschmidt
+  * udp.c: UDP Lite: corrected the use of chksum_len (based on RFC3828: if it's 0,
+    create checksum over the complete packet. On RX, if it's &lt; 8 (and not 0),
+    discard the packet. Also removed the duplicate 'udphdr-&gt;chksum = 0' for both
+    UDP &amp; UDP Lite.
+
+  2007-06-11 Srinivas Gollakota &amp; Oleg Tyshev
+  * tcp_out.c: Fix for bug #20075 : "A problem with keep-alive timer and TCP flags"
+    where TCP flags wasn't initialized in tcp_keepalive.
+
+  2007-06-03 Simon Goldschmidt
+  * udp.c: udp_input(): Input pbuf was not freed if pcb had no recv function
+    registered, p-&gt;payload was modified without modifying p-&gt;len if sending
+    icmp_dest_unreach() (had no negative effect but was definitively wrong).
+
+  2007-06-03 Simon Goldschmidt
+  * icmp.c: Corrected bug #19937: For responding to an icmp echo request, icmp
+    re-used the input pbuf even if that didn't have enough space to include the
+    link headers. Now the space is tested and a new pbuf is allocated for the
+    echo response packet if the echo request pbuf isn't big enough.
+
+  2007-06-01 Simon Goldschmidt
+  * sockets.c: Checked in patch #5914: Moved sockopt processing into tcpip_thread.
+
+  2007-05-23 Frédéric Bernon
+  * api_lib.c, sockets.c: Fixed bug #5958 for netconn_listen (acceptmbox only
+    allocated by do_listen if success) and netconn_accept errors handling. In
+    most of api_lib functions, we replace some errors checkings like "if (conn==NULL)"
+    by ASSERT, except for netconn_delete.
+
+  2007-05-23 Frédéric Bernon
+  * api_lib.c: Fixed bug #5957 "Safe-thread problem inside netconn_recv" to return
+    an error code if it's impossible to fetch a pbuf on a TCP connection (and not
+    directly close the recvmbox).
+
+  2007-05-22 Simon Goldschmidt
+  * tcp.c: Fixed bug #1895 (tcp_bind not correct) by introducing a list of
+    bound but unconnected (and non-listening) tcp_pcbs.
+
+  2007-05-22 Frédéric Bernon
+  * sys.h, sys.c, api_lib.c, tcpip.c: remove sys_mbox_fetch_timeout() (was only
+    used for LWIP_SO_RCVTIMEO option) and use sys_arch_mbox_fetch() instead of
+    sys_mbox_fetch() in api files. Now, users SHOULD NOT use internal lwIP features
+    like "sys_timeout" in their application threads.
+
+  2007-05-22 Frédéric Bernon
+  * api.h, api_lib.c, api_msg.h, api_msg.c: change the struct api_msg_msg to see
+    which parameters are used by which do_xxx function, and to avoid "misusing"
+    parameters (patch #5938).
+
+  2007-05-22 Simon Goldschmidt
+  * api_lib.c, api_msg.c, raw.c, api.h, api_msg.h, raw.h: Included patch #5938:
+    changed raw_pcb.protocol from u16_t to u8_t since for IPv4 and IPv6, proto
+    is only 8 bits wide. This affects the api, as there, the protocol was
+    u16_t, too.
+
+  2007-05-18 Simon Goldschmidt
+  * memp.c: addition to patch #5913: smaller pointer was returned but
+    memp_memory was the same size -&gt; did not save memory.
+
+  2007-05-16 Simon Goldschmidt
+  * loopif.c, slipif.c: Fix bug #19729: free pbuf if netif-&gt;input() returns
+    != ERR_OK.
+
+  2007-05-16 Simon Goldschmidt
+  * api_msg.c, udp.c: If a udp_pcb has a local_ip set, check if it is the same
+    as the one of the netif used for sending to prevent sending from old
+    addresses after a netif address gets changed (partly fixes bug #3168).
+
+  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 
+    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).
+
+  2007-05-16 Simon Goldschmidt
+  * mem.c, memp.c: Removed semaphores from memp, changed sys_sem_wait calls
+    into sys_arch_sem_wait calls to prevent timers from running while waiting
+    for the heap. This fixes bug #19167.
+
+  2007-05-13 Simon Goldschmidt
+  * tcp.h, sockets.h, sockets.c: Fixed bug from patch #5865 by moving the defines
+    for socket options (lwip_set/-getsockopt) used with level IPPROTO_TCP from
+    tcp.h to sockets.h.
+
+  2007-05-07 Simon Goldschmidt
+  * mem.c: Another attempt to fix bug #17922.
+
+  2007-05-04 Simon Goldschmidt
+  * pbuf.c, pbuf.h, etharp.c: Further update to ARP queueing: Changed pbuf_copy()
+    implementation so that it can be reused (don't allocate the target
+    pbuf inside pbuf_copy()).
+
+  2007-05-04 Simon Goldschmidt
+  * memp.c: checked in patch #5913: in memp_malloc() we can return memp as mem
+    to save a little RAM (next pointer of memp is not used while not in pool).
+
+  2007-05-03 "maq"
+  * sockets.c: Fix ioctl FIONREAD when some data remains from last recv.
+    (patch #3574).
+
+  2007-04-23 Simon Goldschmidt
+  * loopif.c, loopif.h, opt.h, src/netif/FILES: fix bug #2595: "loopif results
+    in NULL reference for incoming TCP packets". Loopif has to be configured
+    (using LWIP_LOOPIF_MULTITHREADING) to directly call netif-&gt;input()
+    (multithreading environments, e.g. netif-&gt;input() = tcpip_input()) or
+    putting packets on a list that is fed to the stack by calling loopif_poll()
+    (single-thread / NO_SYS / polling environment where e.g.
+    netif-&gt;input() = ip_input).
+
+  2007-04-17 Jonathan Larmour
+  * pbuf.c: Use s32_t in pbuf_realloc(), as an s16_t can't reliably hold
+    the difference between two u16_t's.
+  * sockets.h: FD_SETSIZE needs to match number of sockets, which is
+    MEMP_NUM_NETCONN in sockets.c right now.
+
+  2007-04-12 Jonathan Larmour
+  * icmp.c: Reset IP header TTL in ICMP ECHO responses (bug #19580).
+
+  2007-04-12 Kieran Mansley
+  * tcp.c, tcp_in.c, tcp_out.c, tcp.h: Modify way the retransmission
+    timer is reset to fix bug#19434, with help from Oleg Tyshev.
+
+  2007-04-11 Simon Goldschmidt
+  * etharp.c, pbuf.c, pbuf.h: 3rd fix for bug #11400 (arp-queuing): More pbufs than
+    previously thought need to be copied (everything but PBUF_ROM!). Cleaned up
+    pbuf.c: removed functions no needed any more (by etharp).
+
+  2007-04-11 Kieran Mansley
+  * inet.c, ip_addr.h, sockets.h, sys.h, tcp.h: Apply patch #5745: Fix
+    "Constant is long" warnings with 16bit compilers.  Contributed by
+    avatar@mmlab.cse.yzu.edu.tw
+
+  2007-04-05 Frédéric Bernon, Jonathan Larmour
+  * api_msg.c: Fix bug #16830: "err_tcp() posts to connection mailbox when no pend on
+    the mailbox is active". Now, the post is only done during a connect, and do_send,
+    do_write and do_join_leave_group don't do anything if a previous error was signaled.
+
+  2007-04-03 Frédéric Bernon
+  * ip.c: Don't set the IP_DF ("Don't fragment") flag in the IP header in IP output
+    packets. See patch #5834.
+
+  2007-03-30 Frédéric Bernon
+  * api_msg.c: add a "pcb_new" helper function to avoid redundant code, and to add
+    missing  pcb allocations checking (in do_bind, and for each raw_new). Fix style.
+
+  2007-03-30 Frédéric Bernon
+  * most of files: prefix all debug.h define with "LWIP_" to avoid any conflict with
+    others environment defines (these were too "generic").
+
+  2007-03-28 Frédéric Bernon
+  * api.h, api_lib.c, sockets.c: netbuf_ref doesn't check its internal pbuf_alloc call
+    result and can cause a crash. lwip_send now check netbuf_ref result.
+
+  2007-03-28 Simon Goldschmidt
+  * sockets.c Remove "#include &lt;errno.h&gt;" from sockets.c to avoid multiple
+    definition of macros (in errno.h and lwip/arch.h) if LWIP_PROVIDE_ERRNO is
+    defined. This is the way it should have been already (looking at
+    doc/sys_arch.txt)
+
+  2007-03-28 Kieran Mansley
+  * opt.h Change default PBUF_POOL_BUFSIZE (again) to accomodate default MSS +
+    IP and TCP headers *and* physical link headers
+
+  2007-03-26 Frédéric Bernon (based on patch from Dmitry Potapov)
+  * api_lib.c: patch for netconn_write(), fixes a possible race condition which cause
+    to send some garbage. It is not a definitive solution, but the patch does solve
+    the problem for most cases.
+
+  2007-03-22 Frédéric Bernon
+  * api_msg.h, api_msg.c: Remove obsolete API_MSG_ACCEPT and do_accept (never used).
+
+  2007-03-22 Frédéric Bernon
+  * api_lib.c: somes resources couldn't be freed if there was errors during
+    netconn_new_with_proto_and_callback.
+
+  2007-03-22 Frédéric Bernon
+  * ethernetif.c: update netif-&gt;input calls to check return value. In older ports,
+    it's a good idea to upgrade them, even if before, there could be another problem
+    (access to an uninitialized mailbox).
+
+  2007-03-21 Simon Goldschmidt
+  * sockets.c: fixed bug #5067 (essentialy a signed/unsigned warning fixed
+    by casting to unsigned).
+
+  2007-03-21 Frédéric Bernon
+  * api_lib.c, api_msg.c, tcpip.c: integrate sys_mbox_fetch(conn-&gt;mbox, NULL) calls from
+    api_lib.c to tcpip.c's tcpip_apimsg(). Now, use a local variable and not a
+    dynamic one from memp to send tcpip_msg to tcpip_thread in a synchrone call.
+    Free tcpip_msg from tcpip_apimsg is not done in tcpip_thread. This give a
+    faster and more reliable communication between api_lib and tcpip.
+
+  2007-03-21 Frédéric Bernon
+  * opt.h: Add LWIP_NETIF_CALLBACK (to avoid compiler warning) and set it to 0.
+
+  2007-03-21 Frédéric Bernon
+  * api_msg.c, igmp.c, igmp.h: Fix C++ style comments
+
+  2007-03-21 Kieran Mansley
+  * opt.h Change default PBUF_POOL_BUFSIZE to accomodate default MSS +
+    IP and TCP headers
+
+  2007-03-21 Kieran Mansley
+  * Fix all uses of pbuf_header to check the return value.  In some
+    cases just assert if it fails as I'm not sure how to fix them, but
+    this is no worse than before when they would carry on regardless
+    of the failure.
+
+  2007-03-21 Kieran Mansley
+  * sockets.c, igmp.c, igmp.h, memp.h: Fix C++ style comments and
+    comment out missing header include in icmp.c
+
+  2007-03-20 Frédéric Bernon
+  * memp.h, stats.c: Fix stats_display function where memp_names table wasn't
+    synchronized with memp.h.
+
+  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 
+    network interfaces. Also fix a compiler warning.
+
+  2007-03-20 Kieran Mansley
+  * udp.c: Only try and use pbuf_header() to make space for headers if
+    not a ROM or REF pbuf.
+
+  2007-03-19 Frédéric Bernon
+  * api_msg.h, api_msg.c, tcpip.h, tcpip.c: Add return types to tcpip_apimsg()
+    and api_msg_post().
+
+  2007-03-19 Frédéric Bernon
+  * Remove unimplemented "memp_realloc" function from memp.h.
+
+  2007-03-11 Simon Goldschmidt
+  * pbuf.c: checked in patch #5796: pbuf_alloc: len field claculation caused
+    memory corruption.
+
+  2007-03-11 Simon Goldschmidt (based on patch from Dmitry Potapov)
+  * api_lib.c, sockets.c, api.h, api_msg.h, sockets.h: Fixed bug #19251
+    (missing `const' qualifier in socket functions), to get more compatible to
+    standard POSIX sockets.
+
+  2007-03-11 Frédéric Bernon (based on patch from Dmitry Potapov)
+  * sockets.c: Add asserts inside bind, connect and sendto to check input
+    parameters. Remove excessive set_errno() calls after get_socket(), because
+    errno is set inside of get_socket(). Move last sock_set_errno() inside
+    lwip_close.
+
+  2007-03-09 Simon Goldschmidt
+  * memp.c: Fixed bug #11400: New etharp queueing introduced bug: memp_memory
+    was allocated too small.
+
+  2007-03-06 Simon Goldschmidt
+  * tcpip.c: Initialize dhcp timers in tcpip_thread (if LWIP_DHCP) to protect
+    the stack from concurrent access.
+
+  2007-03-06 Frédéric Bernon, Dmitry Potapov
+  * tcpip.c, ip_frag.c, ethernetif.c: Fix some build problems, and a redundancy
+    call to "lwip_stats.link.recv++;" in low_level_input() &amp; ethernetif_input().
+
+  2007-03-06 Simon Goldschmidt
+  * ip_frag.c, ip_frag.h: Reduce code size: don't include code in those files
+    if IP_FRAG == 0 and IP_REASSEMBLY == 0
+
+  2007-03-06 Frédéric Bernon, Simon Goldschmidt
+  * opt.h, ip_frag.h, tcpip.h, tcpip.c, ethernetif.c: add new configuration
+    option named ETHARP_TCPIP_ETHINPUT, which enable the new tcpip_ethinput.
+    Allow to do ARP processing for incoming packets inside tcpip_thread
+    (protecting ARP layer against concurrent access). You can also disable
+    old code using tcp_input with new define ETHARP_TCPIP_INPUT set to 0.
+    Older ports have to use tcpip_ethinput.
+
+  2007-03-06 Simon Goldschmidt (based on patch from Dmitry Potapov)
+  * err.h, err.c: fixed compiler warning "initialization dircards qualifiers
+    from pointer target type"
+
+  2007-03-05 Frédéric Bernon
+  * opt.h, sockets.h: add new configuration options (LWIP_POSIX_SOCKETS_IO_NAMES,
+    ETHARP_TRUST_IP_MAC, review SO_REUSE)
+
+  2007-03-04 Frédéric Bernon
+  * api_msg.c: Remove some compiler warnings : parameter "pcb" was never
+    referenced.
+
+  2007-03-04 Frédéric Bernon
+  * api_lib.c: Fix "[patch #5764] api_lib.c cleanup: after patch #5687" (from
+    Dmitry Potapov).
+    The api_msg struct stay on the stack (not moved to netconn struct).
+
+  2007-03-04 Simon Goldschmidt (based on patch from Dmitry Potapov)
+  * pbuf.c: Fix BUG#19168 - pbuf_free can cause deadlock (if
+    SYS_LIGHTWEIGHT_PROT=1 &amp; freeing PBUF_RAM when mem_sem is not available)
+    Also fixed cast warning in pbuf_alloc()
+
+  2007-03-04 Simon Goldschmidt
+  * etharp.c, etharp.h, memp.c, memp.h, opt.h: Fix BUG#11400 - don't corrupt
+    existing pbuf chain when enqueuing multiple pbufs to a pending ARP request
+
+  2007-03-03 Frédéric Bernon
+  * udp.c: remove obsolete line "static struct udp_pcb *pcb_cache = NULL;"
+    It is static, and never used in udp.c except udp_init().
+
+  2007-03-02 Simon Goldschmidt
+  * tcpip.c: Moved call to ip_init(), udp_init() and tcp_init() from
+    tcpip_thread() to tcpip_init(). This way, raw API connections can be
+    initialized before tcpip_thread is running (e.g. before OS is started)
+
+  2007-03-02 Frédéric Bernon
+  * rawapi.txt: Fix documentation mismatch with etharp.h about etharp_tmr's call
+    interval.
+
+  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 
+  * sockets.c: Fix BUG#19161 - ensure milliseconds timeout is non-zero
+    when supplied timeout is also non-zero 
+
+(STABLE-1.2.0)
+
+  2006-12-05 Leon Woestenberg
+  * CHANGELOG: Mention STABLE-1.2.0 release.
+
+  ++ New features:
+
+  2006-12-01 Christiaan Simons
+  * mem.h, opt.h: Added MEM_LIBC_MALLOC option.
+    Note this is a workaround. Currently I have no other options left.
+
+  2006-10-26 Christiaan Simons (accepted patch by Jonathan Larmour)
+  * ipv4/ip_frag.c: rename MAX_MTU to IP_FRAG_MAX_MTU and move define
+    to include/lwip/opt.h.
+  * ipv4/lwip/ip_frag.h: Remove unused IP_REASS_INTERVAL.
+    Move IP_REASS_MAXAGE and IP_REASS_BUFSIZE to include/lwip/opt.h.
+  * opt.h: Add above new options.
+
+  2006-08-18 Christiaan Simons
+  * tcp_{in,out}.c: added SNMP counters.
+  * ipv4/ip.c: added SNMP counters.
+  * ipv4/ip_frag.c: added SNMP counters.
+
+  2006-08-08 Christiaan Simons
+  * etharp.{c,h}: added etharp_find_addr() to read
+    (stable) ethernet/IP address pair from ARP table
+
+  2006-07-14 Christiaan Simons
+  * mib_structs.c: added
+  * include/lwip/snmp_structs.h: added
+  * netif.{c,h}, netif/ethernetif.c: added SNMP statistics to netif struct
+
+  2006-07-06 Christiaan Simons
+  * snmp/asn1_{enc,dec}.c added
+  * snmp/mib2.c added
+  * snmp/msg_{in,out}.c added
+  * include/lwip/snmp_asn1.h added
+  * include/lwip/snmp_msg.h added
+  * doc/snmp_agent.txt added
+
+  2006-03-29 Christiaan Simons
+  * inet.c, inet.h: Added platform byteswap support.
+    Added LWIP_PLATFORM_BYTESWAP define (defaults to 0) and
+    optional LWIP_PLATFORM_HTONS(), LWIP_PLATFORM_HTONL() macros.
+
+  ++ Bug fixes:
+
+  2006-11-30 Christiaan Simons
+  * dhcp.c: Fixed false triggers of request_timeout.
+
+  2006-11-28 Christiaan Simons
+  * netif.c: In netif_add() fixed missing clear of ip_addr, netmask, gw and flags.
+
+  2006-10-11 Christiaan Simons
+  * api_lib.c etharp.c, ip.c, memp.c, stats.c, sys.{c,h} tcp.h:
+    Partially accepted patch #5449 for ANSI C compatibility / build fixes.
+  * ipv4/lwip/ip.h ipv6/lwip/ip.h: Corrected UDP-Lite protocol
+    identifier from 170 to 136 (bug #17574).
+
+  2006-10-10 Christiaan Simons
+  * api_msg.c: Fixed Nagle algorithm as reported by Bob Grice.
+
+  2006-08-17 Christiaan Simons
+  * udp.c: Fixed bug #17200, added check for broadcast
+    destinations for PCBs bound to a unicast address.
+
+  2006-08-07 Christiaan Simons
+  * api_msg.c: Flushing TCP output in do_close() (bug #15926).
+
+  2006-06-27 Christiaan Simons
+  * api_msg.c: Applied patch for cold case (bug #11135).
+    In accept_function() ensure newconn-&gt;callback is always initialized.
+
+  2006-06-15 Christiaan Simons
+  * mem.h: added MEM_SIZE_F alias to fix an ancient cold case (bug #1748),
+    facilitate printing of mem_size_t and u16_t statistics.
+
+  2006-06-14 Christiaan Simons
+  * api_msg.c: Applied patch #5146 to handle allocation failures
+    in accept() by Kevin Lawson.
+
+  2006-05-26 Christiaan Simons
+  * 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)
+
+  2006-03-03  Christiaan Simons
+  * ipv4/ip_frag.c: Added bound-checking assertions on ip_reassbitmap
+    access and added pbuf_alloc() return value checks.
+
+  2006-01-01  Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+  * tcp_{in,out}.c, tcp_out.c: Removed 'even sndbuf' fix in TCP, which is
+    now handled by the checksum routine properly.
+
+  2006-02-27  Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+   * pbuf.c: Fix alignment; pbuf_init() would not work unless
+     pbuf_pool_memory[] was properly aligned. (Patch by Curt McDowell.)
+
+  2005-12-20  Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+  * tcp.c: Remove PCBs which stay in LAST_ACK state too long. Patch
+    submitted by Mitrani Hiroshi.
+
+  2005-12-15  Christiaan Simons
+  * inet.c: Disabled the added summing routine to preserve code space.
+
+  2005-12-14  Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+  * tcp_in.c: Duplicate FIN ACK race condition fix by Kelvin Lawson.
+    Added Curt McDowell's optimized checksumming routine for future
+    inclusion. Need to create test case for unaliged, aligned, odd,
+    even length combination of cases on various endianess machines.
+
+  2005-12-09  Christiaan Simons
+  * inet.c: Rewrote standard checksum routine in proper portable C.
+
+  2005-11-25  Christiaan Simons
+  * udp.c tcp.c: Removed SO_REUSE hack. Should reside in socket code only.
+  * *.c: introduced cc.h LWIP_DEBUG formatters matching the u16_t, s16_t,
+    u32_t, s32_t typedefs. This solves most debug word-length assumes.
+
+  2005-07-17 Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+  * inet.c: Fixed unaligned 16-bit access in the standard checksum
+    routine by Peter Jolasson.
+  * slipif.c: Fixed implementation assumption of single-pbuf datagrams.
+
+  2005-02-04 Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+  * tcp_out.c: Fixed uninitialized 'queue' referenced in memerr branch.
+  * tcp_{out|in}.c: Applied patch fixing unaligned access.
+
+  2005-01-04 Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+  * pbuf.c: Fixed missing semicolon after LWIP_DEBUG statement.
+
+  2005-01-03 Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+  * udp.c: UDP pcb-&gt;recv() was called even when it was NULL.
+
+(STABLE-1_1_0)
+
+  2004-12-28 Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+  * etharp.*: Disabled multiple packets on the ARP queue.
+    This clashes with TCP queueing.
+
+  2004-11-28 Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+  * etharp.*: Fixed race condition from ARP request to ARP timeout.
+    Halved the ARP period, doubled the period counts.
+    ETHARP_MAX_PENDING now should be at least 2. This prevents
+    the counter from reaching 0 right away (which would allow
+    too little time for ARP responses to be received).
+
+  2004-11-25 Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+  * 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_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.)
+  * ipv4/ip_addr.h: Renamed ip_addr_maskcmp() to _netcmp() as we are
+    comparing network addresses (identifiers), not the network masks
+    themselves.
+  * ipv4/ip_addr.c: ip_addr_isbroadcast() now checks that the given
+    IP address actually belongs to the network of the given interface.
+
+  2004-11-24 Kieran Mansley &lt;kjm25@cam.ac.uk&gt;
+  * tcp.c: Increment pcb-&gt;snd_buf when ACK is received in SYN_SENT state.
+
+(STABLE-1_1_0-RC1)
+
+  2004-10-16 Kieran Mansley &lt;kjm25@cam.ac.uk&gt;
+  * tcp.c: Add code to tcp_recved() to send an ACK (window update) immediately,
+    even if one is already pending, if the rcv_wnd is above a threshold
+    (currently TCP_WND/2). This avoids waiting for a timer to expire to send a
+    delayed ACK in order to open the window if the stack is only receiving data.
+
+  2004-09-12 Kieran Mansley &lt;kjm25@cam.ac.uk&gt;
+  * tcp*.*: Retransmit time-out handling improvement by Sam Jansen.
+
+  2004-08-20 Tony Mountifield &lt;tony@softins.co.uk&gt;
+  * etharp.c: Make sure the first pbuf queued on an ARP entry
+    is properly ref counted.
+
+  2004-07-27 Tony Mountifield &lt;tony@softins.co.uk&gt;
+  * debug.h: Added (int) cast in LWIP_DEBUGF() to avoid compiler
+    warnings about comparison.
+  * pbuf.c: Stopped compiler complaining of empty if statement
+    when LWIP_DEBUGF() empty.  Closed an unclosed comment.
+  * tcp.c: Stopped compiler complaining of empty if statement
+    when LWIP_DEBUGF() empty.
+  * ip.h Corrected IPH_TOS() macro: returns a byte, so doesn't need htons().
+  * inet.c: Added a couple of casts to quiet the compiler.
+    No need to test isascii(c) before isdigit(c) or isxdigit(c).
+
+  2004-07-22 Tony Mountifield &lt;tony@softins.co.uk&gt;
+  * inet.c: Made data types consistent in inet_ntoa().
+    Added casts for return values of checksum routines, to pacify compiler.
+  * ip_frag.c, tcp_out.c, sockets.c, pbuf.c
+    Small corrections to some debugging statements, to pacify compiler.
+
+  2004-07-21 Tony Mountifield &lt;tony@softins.co.uk&gt;
+  * etharp.c: Removed spurious semicolon and added missing end-of-comment.
+  * ethernetif.c Updated low_level_output() to match prototype for
+    netif-&gt;linkoutput and changed low_level_input() similarly for consistency.
+  * api_msg.c: Changed recv_raw() from int to u8_t, to match prototype
+    of raw_recv() in raw.h and so avoid compiler error.
+  * sockets.c: Added trivial (int) cast to keep compiler happier.
+  * ip.c, netif.c Changed debug statements to use the tidier ip4_addrN() macros.
+
+(STABLE-1_0_0)
+
+  ++ Changes:
+
+  2004-07-05 Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+  * sockets.*: Restructured LWIP_PRIVATE_TIMEVAL. Make sure
+    your cc.h file defines this either 1 or 0. If non-defined,
+    defaults to 1.
+  * .c: Added &lt;string.h&gt; and &lt;errno.h&gt; includes where used.
+  * etharp.c: Made some array indices unsigned.
+
+  2004-06-27 Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+  * netif.*: Added netif_set_up()/down().
+  * dhcp.c: Changes to restart program flow.
+
+  2004-05-07 Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+  * etharp.c: In find_entry(), instead of a list traversal per candidate, do a
+    single-pass lookup for different candidates. Should exploit locality.
+
+  2004-04-29 Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+  * tcp*.c: Cleaned up source comment documentation for Doxygen processing.
+  * opt.h: ETHARP_ALWAYS_INSERT option removed to comply with ARP RFC.
+  * etharp.c: update_arp_entry() only adds new ARP entries when adviced to by
+    the caller. This deprecates the ETHARP_ALWAYS_INSERT overrule option.
+
+  ++ Bug fixes:
+
+  2004-04-27 Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+  * etharp.c: Applied patch of bug #8708 by Toni Mountifield with a solution
+    suggested by Timmy Brolin. Fix for 32-bit processors that cannot access
+    non-aligned 32-bit words, such as soms 32-bit TCP/IP header fields. Fix
+    is to prefix the 14-bit Ethernet headers with two padding bytes.
+
+  2004-04-23 Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+  * ip_addr.c: Fix in the ip_addr_isbroadcast() check.
+  * etharp.c: Fixed the case where the packet that initiates the ARP request
+    is not queued, and gets lost. Fixed the case where the packets destination
+    address is already known; we now always queue the packet and perform an ARP
+    request.
+
+(STABLE-0_7_0)
+
+  ++ Bug fixes:
+
+  * Fixed TCP bug for SYN_SENT to ESTABLISHED state transition.
+  * Fixed TCP bug in dequeueing of FIN from out of order segment queue.
+  * Fixed two possible NULL references in rare cases.
+
+(STABLE-0_6_6)
+
+  ++ Bug fixes:
+
+  * Fixed DHCP which did not include the IP address in DECLINE messages.
+
+  ++ Changes:
+
+  * etharp.c has been hauled over a bit.
+
+(STABLE-0_6_5)
+
+  ++ Bug fixes:
+
+  * Fixed TCP bug induced by bad window resizing with unidirectional TCP traffic.
+  * Packets sent from ARP queue had invalid source hardware address.
+
+  ++ Changes:
+
+  * Pass-by ARP requests do now update the cache.
+
+  ++ New features:
+
+  * No longer dependent on ctype.h.
+  * New socket options.
+  * Raw IP pcb support.
+
+(STABLE-0_6_4)
+
+  ++ Bug fixes:
+
+  * Some debug formatters and casts fixed.
+  * Numereous fixes in PPP.
+
+  ++ Changes:
+
+  * DEBUGF now is LWIP_DEBUGF
+  * pbuf_dechain() has been re-enabled.
+  * Mentioned the changed use of CVS branches in README.
+
+(STABLE-0_6_3)
+
+  ++ Bug fixes:
+
+  * Fixed pool pbuf memory leak in pbuf_alloc().
+    Occured if not enough PBUF_POOL pbufs for a packet pbuf chain.
+    Reported by Savin Zlobec.
+
+  * PBUF_POOL chains had their tot_len field not set for non-first
+    pbufs. Fixed in pbuf_alloc().
+
+  ++ New features:
+
+  * Added PPP stack contributed by Marc Boucher
+
+  ++ Changes:
+
+  * Now drops short packets for ICMP/UDP/TCP protocols. More robust.
+
+  * ARP queueuing now queues the latest packet instead of the first.
+    This is the RFC recommended behaviour, but can be overridden in
+    lwipopts.h.
+
+(0.6.2)
+
+  ++ Bugfixes:
+
+  * TCP has been fixed to deal with the new use of the pbuf-&gt;ref
+    counter.
+
+  * DHCP dhcp_inform() crash bug fixed.
+
+  ++ Changes:
+
+  * Removed pbuf_pool_free_cache and pbuf_pool_alloc_cache. Also removed
+    pbuf_refresh(). This has sped up pbuf pool operations considerably.
+    Implemented by David Haas.
+
+(0.6.1)
+
+  ++ New features:
+
+  * The packet buffer implementation has been enhanced to support
+    zero-copy and copy-on-demand for packet buffers which have their
+    payloads in application-managed memory.
+    Implemented by David Haas.
+
+    Use PBUF_REF to make a pbuf refer to RAM. lwIP will use zero-copy
+    if an outgoing packet can be directly sent on the link, or perform
+    a copy-on-demand when necessary.
+
+    The application can safely assume the packet is sent, and the RAM
+    is available to the application directly after calling udp_send()
+    or similar function.
+
+  ++ Bugfixes:
+
+  * ARP_QUEUEING should now correctly work for all cases, including
+    PBUF_REF.
+    Implemented by Leon Woestenberg.
+
+  ++ Changes:
+
+  * IP_ADDR_ANY is no longer a NULL pointer. Instead, it is a pointer
+    to a '0.0.0.0' IP address.
+
+  * The packet buffer implementation is changed. The pbuf-&gt;ref counter
+    meaning has changed, and several pbuf functions have been
+    adapted accordingly.
+
+  * netif drivers have to be changed to set the hardware address length field
+    that must be initialized correctly by the driver (hint: 6 for Ethernet MAC).
+    See the contrib/ports/c16x cs8900 driver as a driver example.
+
+  * netif's have a dhcp field that must be initialized to NULL by the driver.
+    See the contrib/ports/c16x cs8900 driver as a driver example.
+
+(0.5.x) This file has been unmaintained up to 0.6.1. All changes are
+  logged in CVS but have not been explained here.
+
+(0.5.3) Changes since version 0.5.2
+
+  ++ Bugfixes:
+
+  * memp_malloc(MEMP_API_MSG) could fail with multiple application
+    threads because it wasn't protected by semaphores.
+
+  ++ Other changes:
+
+  * struct ip_addr now packed.
+
+  * The name of the time variable in arp.c has been changed to ctime
+    to avoid conflicts with the time() function.
+
+(0.5.2) Changes since version 0.5.1
+
+  ++ New features:
+
+  * A new TCP function, tcp_tmr(), now handles both TCP timers.
+
+  ++ Bugfixes:
+
+  * A bug in tcp_parseopt() could cause the stack to hang because of a
+    malformed TCP option.
+
+  * The address of new connections in the accept() function in the BSD
+    socket library was not handled correctly.
+
+  * pbuf_dechain() did not update the -&gt;tot_len field of the tail.
+
+  * Aborted TCP connections were not handled correctly in all
+    situations.
+
+  ++ Other changes:
+
+  * All protocol header structs are now packed.
+
+  * The -&gt;len field in the tcp_seg structure now counts the actual
+    amount of data, and does not add one for SYN and FIN segments.
+
+(0.5.1) Changes since version 0.5.0
+
+  ++ New features:
+
+  * Possible to run as a user process under Linux.
+
+  * Preliminary support for cross platform packed structs.
+
+  * ARP timer now implemented.
+
+  ++ Bugfixes:
+
+  * TCP output queue length was badly initialized when opening
+    connections.
+
+  * TCP delayed ACKs were not sent correctly.
+
+  * Explicit initialization of BSS segment variables.
+
+  * read() in BSD socket library could drop data.
+
+  * Problems with memory alignment.
+
+  * Situations when all TCP buffers were used could lead to
+    starvation.
+
+  * TCP MSS option wasn't parsed correctly.
+
+  * Problems with UDP checksum calculation.
+
+  * IP multicast address tests had endianess problems.
+
+  * ARP requests had wrong destination hardware address.
+
+  ++ Other changes:
+
+  * struct eth_addr changed from u16_t[3] array to u8_t[6].
+
+  * A -&gt;linkoutput() member was added to struct netif.
+
+  * TCP and UDP -&gt;dest_* struct members where changed to -&gt;remote_*.
+
+  * ntoh* macros are now null definitions for big endian CPUs.
+
+(0.5.0) Changes since version 0.4.2
+
+  ++ New features:
+
+  * Redesigned operating system emulation layer to make porting easier.
+
+  * Better control over TCP output buffers.
+
+  * Documenation added.
+
+  ++ Bugfixes:
+
+  * Locking issues in buffer management.
+
+  * Bugfixes in the sequential API.
+
+  * IP forwarding could cause memory leakage. This has been fixed.
+
+  ++ Other changes:
+
+  * Directory structure somewhat changed; the core/ tree has been
+    collapsed.
+
+(0.4.2) Changes since version 0.4.1
+
+  ++ New features:
+
+  * Experimental ARP implementation added.
+
+  * Skeleton Ethernet driver added.
+
+  * Experimental BSD socket API library added.
+
+  ++ Bugfixes:
+
+  * In very intense situations, memory leakage could occur. This has
+    been fixed.
+
+  ++ Other changes:
+
+  * Variables named "data" and "code" have been renamed in order to
+    avoid name conflicts in certain compilers.
+
+  * Variable++ have in appliciable cases been translated to ++variable
+    since some compilers generate better code in the latter case.
+
+(0.4.1) Changes since version 0.4
+
+  ++ New features:
+
+  * TCP: Connection attempts time out earlier than data
+    transmissions. Nagle algorithm implemented. Push flag set on the
+    last segment in a burst.
+
+  * UDP: experimental support for UDP-Lite extensions.
+
+  ++ Bugfixes:
+
+  * TCP: out of order segments were in some cases handled incorrectly,
+    and this has now been fixed. Delayed acknowledgements was broken
+    in 0.4, has now been fixed. Binding to an address that is in use
+    now results in an error. Reset connections sometimes hung an
+    application; this has been fixed.
+
+  * Checksum calculation sometimes failed for chained pbufs with odd
+    lengths. This has been fixed.
+
+  * API: a lot of bug fixes in the API. The UDP API has been improved
+    and tested. Error reporting and handling has been
+    improved. Logical flaws and race conditions for incoming TCP
+    connections has been found and removed.
+
+  * Memory manager: alignment issues. Reallocating memory sometimes
+    failed, this has been fixed.
+
+  * Generic library: bcopy was flawed and has been fixed.
+
+  ++ Other changes:
+
+  * API: all datatypes has been changed from generic ones such as
+    ints, to specified ones such as u16_t. Functions that return
+    errors now have the correct type (err_t).
+
+  * General: A lot of code cleaned up and debugging code removed. Many
+    portability issues have been fixed.
+
+  * The license was changed; the advertising clause was removed.
+
+  * C64 port added.
+
+  * Thanks: Huge thanks go to Dagan Galarneau, Horst Garnetzke, Petri
+    Kosunen, Mikael Caleres, and Frits Wilmink for reporting and
+    fixing bugs!
+
+(0.4) Changes since version 0.3.1
+
+  * Memory management has been radically changed; instead of
+    allocating memory from a shared heap, memory for objects that are
+    rapidly allocated and deallocated is now kept in pools. Allocation
+    and deallocation from those memory pools is very fast. The shared
+    heap is still present but is used less frequently.
+
+  * The memory, memory pool, and packet buffer subsystems now support
+    4-, 2-, or 1-byte alignment.
+
+  * "Out of memory" situations are handled in a more robust way.
+
+  * Stack usage has been reduced.
+
+  * Easier configuration of lwIP parameters such as memory usage,
+    TTLs, statistics gathering, etc. All configuration parameters are
+    now kept in a single header file "lwipopts.h".
+
+  * The directory structure has been changed slightly so that all
+    architecture specific files are kept under the src/arch
+    hierarchy.
+
+  * Error propagation has been improved, both in the protocol modules
+    and in the API.
+
+  * The code for the RTXC architecture has been implemented, tested
+    and put to use.
+
+  * Bugs have been found and corrected in the TCP, UDP, IP, API, and
+    the Internet checksum modules.
+
+  * Bugs related to porting between a 32-bit and a 16-bit architecture
+    have been found and corrected.
+
+  * The license has been changed slightly to conform more with the
+    original BSD license, including the advertisement clause.
+
+(0.3.1) Changes since version 0.3
+
+  * Fix of a fatal bug in the buffer management. Pbufs with allocated
+    RAM never returned the RAM when the pbuf was deallocated.
+
+  * TCP congestion control, window updates and retransmissions did not
+    work correctly. This has now been fixed.
+
+  * Bugfixes in the API.
+
+(0.3) Changes since version 0.2
+
+  * New and improved directory structure. All include files are now
+    kept in a dedicated include/ directory.
+
+  * The API now has proper error handling. A new function,
+    netconn_err(), now returns an error code for the connection in
+    case of errors.
+
+  * Improvements in the memory management subsystem. The system now
+    keeps a pointer to the lowest free memory block. A new function,
+    mem_malloc2() tries to allocate memory once, and if it fails tries
+    to free some memory and retry the allocation.
+
+  * Much testing has been done with limited memory
+    configurations. lwIP now does a better job when overloaded.
+
+  * Some bugfixes and improvements to the buffer (pbuf) subsystem.
+
+  * Many bugfixes in the TCP code:
+
+    - Fixed a bug in tcp_close().
+
+    - The TCP receive window was incorrectly closed when out of
+      sequence segments was received. This has been fixed.
+
+    - Connections are now timed-out of the FIN-WAIT-2 state.
+
+    - The initial congestion window could in some cases be too
+      large. This has been fixed.
+
+    - The retransmission queue could in some cases be screwed up. This
+      has been fixed.
+
+    - TCP RST flag now handled correctly.
+
+    - Out of sequence data was in some cases never delivered to the
+      application. This has been fixed.
+
+    - Retransmitted segments now contain the correct acknowledgment
+      number and advertised window.
+
+    - TCP retransmission timeout backoffs are not correctly computed
+      (ala BSD). After a number of retransmissions, TCP now gives up
+      the connection.
+
+  * TCP connections now are kept on three lists, one for active
+    connections, one for listening connections, and one for
+    connections that are in TIME-WAIT. This greatly speeds up the fast
+    timeout processing for sending delayed ACKs.
+
+  * TCP now provides proper feedback to the application when a
+    connection has been successfully set up.
+
+  * More comments have been added to the code. The code has also been
+    somewhat cleaned up.
+
+(0.2) Initial public release.
+</pre> </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/classes.html b/doc/doxygen/output/html/classes.html
new file mode 100644
index 0000000..26372f0
--- /dev/null
+++ b/doc/doxygen/output/html/classes.html
@@ -0,0 +1,154 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Structure Index</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('classes.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">Data Structure Index</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="qindex"><a class="qindex" href="#letter__">_</a>&#160;|&#160;<a class="qindex" href="#letter_a">a</a>&#160;|&#160;<a class="qindex" href="#letter_b">b</a>&#160;|&#160;<a class="qindex" href="#letter_d">d</a>&#160;|&#160;<a class="qindex" href="#letter_e">e</a>&#160;|&#160;<a class="qindex" href="#letter_g">g</a>&#160;|&#160;<a class="qindex" href="#letter_i">i</a>&#160;|&#160;<a class="qindex" href="#letter_l">l</a>&#160;|&#160;<a class="qindex" href="#letter_m">m</a>&#160;|&#160;<a class="qindex" href="#letter_n">n</a>&#160;|&#160;<a class="qindex" href="#letter_p">p</a>&#160;|&#160;<a class="qindex" href="#letter_r">r</a>&#160;|&#160;<a class="qindex" href="#letter_s">s</a>&#160;|&#160;<a class="qindex" href="#letter_t">t</a>&#160;|&#160;<a class="qindex" href="#letter_u">u</a>&#160;|&#160;<a class="qindex" href="#letter_z">z</a></div>
+<table class="classindex">
+<tr><td rowspan="2" valign="bottom"><a name="letter__"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;_&#160;&#160;</div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_i"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;i&#160;&#160;</div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_m"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;m&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="structpbuf__custom.html">pbuf_custom</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsntp__server.html">sntp_server</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structpbuf__custom__ref.html">pbuf_custom_ref</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsntp__time.html">sntp_time</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="struct__lwiperf__settings.html">_lwiperf_settings</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structicmp6__echo__hdr.html">icmp6_echo_hdr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structmdns__host.html">mdns_host</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structpbuf__rom.html">pbuf_rom</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsntp__timestamps.html">sntp_timestamps</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="struct__lwiperf__state__tcp.html">_lwiperf_state_tcp</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structicmp6__hdr.html">icmp6_hdr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structmdns__outpacket.html">mdns_outpacket</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_r"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;r&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="unionsockaddr__aligned.html">sockaddr_aligned</a>&#160;&#160;&#160;</td></tr>
+<tr><td rowspan="2" valign="bottom"><a name="letter_a"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;a&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="structicmp__echo__hdr.html">icmp_echo_hdr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structmdns__packet.html">mdns_packet</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structstats__.html">stats_</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structieee__802154__hdr.html">ieee_802154_hdr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structmdns__rr__info.html">mdns_rr_info</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structraw__pcb.html">raw_pcb</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structstats__igmp.html">stats_igmp</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structaltcp__allocator__s.html">altcp_allocator_s</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structigmp__group.html">igmp_group</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structmdns__service.html">mdns_service</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structredirect__header.html">redirect_header</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structstats__mem.html">stats_mem</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structapi__msg.html">api_msg</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structigmp__msg.html">igmp_msg</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structmem.html">mem</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structrs__header.html">rs_header</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structstats__mib2.html">stats_mib2</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structautoip.html">autoip</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structip4__addr.html">ip4_addr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structmemp__desc.html">memp_desc</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_s"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;s&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="structstats__mib2__netif__ctrs.html">stats_mib2_netif_ctrs</a>&#160;&#160;&#160;</td></tr>
+<tr><td rowspan="2" valign="bottom"><a name="letter_b"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;b&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="structip4__addr__packed.html">ip4_addr_packed</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structmld__group.html">mld_group</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structstats__proto.html">stats_proto</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structip4__addr__wordaligned.html">ip4_addr_wordaligned</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structmld__header.html">mld_header</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsmtp__send__request.html">smtp_send_request</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structstats__sys.html">stats_sys</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structbridgeif__initdata__s.html">bridgeif_initdata_s</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structip6__addr.html">ip6_addr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structmqtt__client__s.html">mqtt_client_s</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsmtp__session.html">smtp_session</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structstats__syselem.html">stats_syselem</a>&#160;&#160;&#160;</td></tr>
+<tr><td rowspan="2" valign="bottom"><a name="letter_d"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;d&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="structip6__addr__packed.html">ip6_addr_packed</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structmqtt__connect__client__info__t.html">mqtt_connect_client_info_t</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsnmp__leaf__node.html">snmp_leaf_node</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structnetif__ext__callback__args__t_1_1status__changed__s.html">netif_ext_callback_args_t::status_changed_s</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structip6__hdr.html">ip6_hdr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structmqtt__request__t.html">mqtt_request_t</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsnmp__mib.html">snmp_mib</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_t"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;t&#160;&#160;</div></td></tr></table>
+</td></tr>
+<tr><td valign="top"><a class="el" href="structdhcp6__msg.html">dhcp6_msg</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structip6__reass__helper.html">ip6_reass_helper</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structmqtt__ringbuf__t.html">mqtt_ringbuf_t</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsnmp__next__oid__state.html">snmp_next_oid_state</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structdhcp__msg.html">dhcp_msg</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structip6__reassdata.html">ip6_reassdata</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_n"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;n&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="structsnmp__node.html">snmp_node</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structt_c_g_i.html">tCGI</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structdns__answer.html">dns_answer</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structip__addr.html">ip_addr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsnmp__node__instance.html">snmp_node_instance</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structtcp__ext__arg__callbacks.html">tcp_ext_arg_callbacks</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structdns__api__msg.html">dns_api_msg</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structip__globals.html">ip_globals</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structna__header.html">na_header</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structtcp__pcb.html">tcp_pcb</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structdns__hdr.html">dns_hdr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structip__reass__helper.html">ip_reass_helper</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structnd6__neighbor__cache__entry.html">nd6_neighbor_cache_entry</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsnmp__oid__range.html">snmp_oid_range</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structtcp__pcb__listen.html">tcp_pcb_listen</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structdns__query.html">dns_query</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structip__reassdata.html">ip_reassdata</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structnd6__q__entry.html">nd6_q_entry</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsnmp__scalar__array__node.html">snmp_scalar_array_node</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structtftp__context.html">tftp_context</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structdns__req__entry.html">dns_req_entry</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structnetif__ext__callback__args__t_1_1ipv4__changed__s.html">netif_ext_callback_args_t::ipv4_changed_s</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structnetbios__answer.html">netbios_answer</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsnmp__scalar__array__node__def.html">snmp_scalar_array_node_def</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structthreadsync__data.html">threadsync_data</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structdns__table__entry.html">dns_table_entry</a>&#160;&#160;&#160;</td><td valign="top"><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>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structnetbios__hdr.html">netbios_hdr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsnmp__scalar__node.html">snmp_scalar_node</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_u"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;u&#160;&#160;</div></td></tr></table>
+</td></tr>
+<tr><td rowspan="2" valign="bottom"><a name="letter_e"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;e&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__set__s.html">netif_ext_callback_args_t::ipv6_set_s</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structnetbios__name__hdr.html">netbios_name_hdr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsnmp__table__col__def.html">snmp_table_col_def</a>&#160;&#160;&#160;</td></tr>
+<tr><td rowspan="2" valign="bottom"><a name="letter_l"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;l&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="structnetbios__question__hdr.html">netbios_question_hdr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsnmp__table__node.html">snmp_table_node</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structudp__pcb.html">udp_pcb</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structeth__addr.html">eth_addr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structnetbios__resp.html">netbios_resp</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsnmp__table__simple__node.html">snmp_table_simple_node</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_z"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;z&#160;&#160;</div></td></tr></table>
+</td></tr>
+<tr><td valign="top"><a class="el" href="structeth__hdr.html">eth_hdr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structnetif__ext__callback__args__t_1_1link__changed__s.html">netif_ext_callback_args_t::link_changed_s</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structnetbuf.html">netbuf</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsnmp__threadsync__instance.html">snmp_threadsync_instance</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structeth__vlan__hdr.html">eth_vlan_hdr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structlowpan6__ieee802154__data.html">lowpan6_ieee802154_data</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structnetconn.html">netconn</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsnmp__threadsync__node.html">snmp_threadsync_node</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structzepif__init.html">zepif_init</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structetharp__hdr.html">etharp_hdr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structlowpan6__link__addr.html">lowpan6_link_addr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structnetif.html">netif</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsnmp__tree__node.html">snmp_tree_node</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="structetharp__q__entry.html">etharp_q_entry</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structlowpan6__reass__helper.html">lowpan6_reass_helper</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="unionnetif__ext__callback__args__t.html">netif_ext_callback_args_t</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsnmp__varbind.html">snmp_varbind</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td rowspan="2" valign="bottom"><a name="letter_g"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;g&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="structlwip__cyclic__timer.html">lwip_cyclic_timer</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structnetvector.html">netvector</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsnmp__varbind__len.html">snmp_varbind_len</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="structlwip__select__cb.html">lwip_select_cb</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structns__header.html">ns_header</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="unionsnmp__variant__value.html">snmp_variant_value</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="structgethostbyname__r__helper.html">gethostbyname_r_helper</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structlwip__sock.html">lwip_sock</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_p"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;p&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="structsntp__msg.html">sntp_msg</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td></td><td></td><td></td><td></td></tr>
+<tr><td></td><td></td><td valign="top"><a class="el" href="structpbuf.html">pbuf</a>&#160;&#160;&#160;</td><td></td><td></td></tr>
+<tr><td></td><td></td><td></td><td></td><td></td></tr>
+</table>
+<div class="qindex"><a class="qindex" href="#letter__">_</a>&#160;|&#160;<a class="qindex" href="#letter_a">a</a>&#160;|&#160;<a class="qindex" href="#letter_b">b</a>&#160;|&#160;<a class="qindex" href="#letter_d">d</a>&#160;|&#160;<a class="qindex" href="#letter_e">e</a>&#160;|&#160;<a class="qindex" href="#letter_g">g</a>&#160;|&#160;<a class="qindex" href="#letter_i">i</a>&#160;|&#160;<a class="qindex" href="#letter_l">l</a>&#160;|&#160;<a class="qindex" href="#letter_m">m</a>&#160;|&#160;<a class="qindex" href="#letter_n">n</a>&#160;|&#160;<a class="qindex" href="#letter_p">p</a>&#160;|&#160;<a class="qindex" href="#letter_r">r</a>&#160;|&#160;<a class="qindex" href="#letter_s">s</a>&#160;|&#160;<a class="qindex" href="#letter_t">t</a>&#160;|&#160;<a class="qindex" href="#letter_u">u</a>&#160;|&#160;<a class="qindex" href="#letter_z">z</a></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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </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
new file mode 100644
index 0000000..9cbab5b
--- /dev/null
+++ b/doc/doxygen/output/html/compat_2posix_2arpa_2inet_8h.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/compat/posix/arpa/inet.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('compat_2posix_2arpa_2inet_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">inet.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="sockets_8h.html">lwip/sockets.h</a>&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is a posix wrapper for <a class="el" href="sockets_8h.html">lwip/sockets.h</a>. </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_1e445e767c368c70d58af8a0b7552719.html">compat</a></li><li class="navelem"><a class="el" href="dir_fe219fca207b878205c0dd92278d118b.html">posix</a></li><li class="navelem"><a class="el" href="dir_6b1b06896a870ebfb9c854c4c71f4ff5.html">arpa</a></li><li class="navelem"><a class="el" href="compat_2posix_2arpa_2inet_8h.html">inet.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/compat_2posix_2netdb_8h.html b/doc/doxygen/output/html/compat_2posix_2netdb_8h.html
new file mode 100644
index 0000000..efd6fab
--- /dev/null
+++ b/doc/doxygen/output/html/compat_2posix_2netdb_8h.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/compat/posix/netdb.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('compat_2posix_2netdb_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">netdb.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="lwip_2netdb_8h.html">lwip/netdb.h</a>&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is a posix wrapper for <a class="el" href="lwip_2netdb_8h.html">lwip/netdb.h</a>. </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_1e445e767c368c70d58af8a0b7552719.html">compat</a></li><li class="navelem"><a class="el" href="dir_fe219fca207b878205c0dd92278d118b.html">posix</a></li><li class="navelem"><a class="el" href="compat_2posix_2netdb_8h.html">netdb.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/compat_2stdc_2errno_8h.html b/doc/doxygen/output/html/compat_2stdc_2errno_8h.html
new file mode 100644
index 0000000..631f430
--- /dev/null
+++ b/doc/doxygen/output/html/compat_2stdc_2errno_8h.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/compat/stdc/errno.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('compat_2stdc_2errno_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">errno.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="lwip_2errno_8h.html">lwip/errno.h</a>&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is a posix/stdc wrapper for <a class="el" href="lwip_2errno_8h.html">lwip/errno.h</a>. </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_1e445e767c368c70d58af8a0b7552719.html">compat</a></li><li class="navelem"><a class="el" href="dir_b42baff89a1adc9a57da7decb1835b6b.html">stdc</a></li><li class="navelem"><a class="el" href="compat_2stdc_2errno_8h.html">errno.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/contrib.html b/doc/doxygen/output/html/contrib.html
new file mode 100644
index 0000000..3a73990
--- /dev/null
+++ b/doc/doxygen/output/html/contrib.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: How to contribute to lwIP</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('contrib.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">How to contribute to lwIP </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><pre class="fragment">1 Introduction
+
+This document describes some guidelines for people participating
+in lwIP development.
+
+2 How to contribute to lwIP
+
+Here is a short list of suggestions to anybody working with lwIP and 
+trying to contribute bug reports, fixes, enhancements, platform ports etc.
+First of all as you may already know lwIP is a volunteer project so feedback
+to fixes or questions might often come late. Hopefully the bug and patch tracking 
+features of Savannah help us not lose users' input.
+
+2.1 Source code style:
+
+1. do not use tabs.
+2. indentation is two spaces per level (i.e. per tab).
+3. end debug messages with a trailing newline (\n).
+4. one space between keyword and opening bracket.
+5. no space between function and opening bracket.
+6. one space and no newline before opening curly braces of a block.
+7. closing curly brace on a single line.
+8. spaces surrounding assignment and comparisons.
+9. don't initialize static and/or global variables to zero, the compiler takes care of that.
+10. use current source code style as further reference.
+
+2.2 Source code documentation style:
+
+1. JavaDoc compliant and Doxygen compatible.
+2. Function documentation above functions in .c files, not .h files.
+   (This forces you to synchronize documentation and implementation.)
+3. Use current documentation style as further reference.
+ 
+2.3 Bug reports and patches:
+
+1. Make sure you are reporting bugs or send patches against the latest
+   sources. (From the latest release and/or the current Git sources.)
+2. If you think you found a bug make sure it's not already filed in the
+   bugtracker at Savannah.
+3. If you have a fix put the patch on Savannah. If it is a patch that affects
+   both core and arch specific stuff please separate them so that the core can
+   be applied separately while leaving the other patch 'open'. The preferred way
+   is to NOT touch archs you can't test and let maintainers take care of them.
+   This is a good way to see if they are used at all - the same goes for unix
+   netifs except tapif.
+4. Do not file a bug and post a fix to it to the patch area. Either a bug report
+   or a patch will be enough.
+   If you correct an existing bug then attach the patch to the bug rather than creating a new entry in the patch area.
+5. Patches should be specific to a single change or to related changes. Do not mix bugfixes with spelling and other
+   trivial fixes unless the bugfix is trivial too. Do not reorganize code and rename identifiers in the same patch you
+   change behaviour if not necessary. A patch is easier to read and understand if it's to the point and short than
+   if it's not to the point and long :) so the chances for it to be applied are greater. 
+
+2.4 Platform porters:
+
+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.
+</pre> </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/debug_8h.html b/doc/doxygen/output/html/debug_8h.html
new file mode 100644
index 0000000..73891ab
--- /dev/null
+++ b/doc/doxygen/output/html/debug_8h.html
@@ -0,0 +1,153 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/debug.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('debug_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">debug.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="opt_8h.html">lwip/opt.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga71b7787802abbfc2218fb1f39f948a41"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__assertions.html#ga71b7787802abbfc2218fb1f39f948a41">LWIP_NOASSERT</a></td></tr>
+<tr class="separator:ga71b7787802abbfc2218fb1f39f948a41"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a957d947c94fda9b85d4aee0aab72952a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#a957d947c94fda9b85d4aee0aab72952a">LWIP_DEBUG</a></td></tr>
+<tr class="separator:a957d947c94fda9b85d4aee0aab72952a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr><td colspan="2"><div class="groupHeader">Debug level (LWIP_DBG_MIN_LEVEL)</div></td></tr>
+<tr class="memitem:ga8ebaeb006b43f55897f3196b3617dc87"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#ga8ebaeb006b43f55897f3196b3617dc87">LWIP_DBG_LEVEL_ALL</a>&#160;&#160;&#160;0x00</td></tr>
+<tr class="separator:ga8ebaeb006b43f55897f3196b3617dc87"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga77c491e468bf7d9a1bc48430c1866a96"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#ga77c491e468bf7d9a1bc48430c1866a96">LWIP_DBG_LEVEL_WARNING</a>&#160;&#160;&#160;0x01</td></tr>
+<tr class="separator:ga77c491e468bf7d9a1bc48430c1866a96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0269bdc51f1e8a5ecf9af72c6e1c996c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#ga0269bdc51f1e8a5ecf9af72c6e1c996c">LWIP_DBG_LEVEL_SERIOUS</a>&#160;&#160;&#160;0x02</td></tr>
+<tr class="separator:ga0269bdc51f1e8a5ecf9af72c6e1c996c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaab41143277cd38047b6660d90e9cec3b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#gaab41143277cd38047b6660d90e9cec3b">LWIP_DBG_LEVEL_SEVERE</a>&#160;&#160;&#160;0x03</td></tr>
+<tr class="separator:gaab41143277cd38047b6660d90e9cec3b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr><td colspan="2"><div class="groupHeader">Enable/disable debug messages completely (LWIP_DBG_TYPES_ON)</div></td></tr>
+<tr class="memitem:ga9e31b7cbbc8f46af8e62b548079acd4e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#ga9e31b7cbbc8f46af8e62b548079acd4e">LWIP_DBG_ON</a>&#160;&#160;&#160;0x80U</td></tr>
+<tr class="separator:ga9e31b7cbbc8f46af8e62b548079acd4e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadab1cdc3f45939a3a5c9a3d7e04987e1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a>&#160;&#160;&#160;0x00U</td></tr>
+<tr class="separator:gadab1cdc3f45939a3a5c9a3d7e04987e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr><td colspan="2"><div class="groupHeader">Debug message types (LWIP_DBG_TYPES_ON)</div></td></tr>
+<tr class="memitem:ga988147559b78642ac881815b66023646"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#ga988147559b78642ac881815b66023646">LWIP_DBG_TRACE</a>&#160;&#160;&#160;0x40U</td></tr>
+<tr class="separator:ga988147559b78642ac881815b66023646"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga511ee3deb3240635f5ec6a1709c6d741"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#ga511ee3deb3240635f5ec6a1709c6d741">LWIP_DBG_STATE</a>&#160;&#160;&#160;0x20U</td></tr>
+<tr class="separator:ga511ee3deb3240635f5ec6a1709c6d741"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7d44d1804fa5e747aed86816e2a6cae0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#ga7d44d1804fa5e747aed86816e2a6cae0">LWIP_DBG_FRESH</a>&#160;&#160;&#160;0x10U</td></tr>
+<tr class="separator:ga7d44d1804fa5e747aed86816e2a6cae0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab0a296414983155b30ad51871606b90f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#gab0a296414983155b30ad51871606b90f">LWIP_DBG_HALT</a>&#160;&#160;&#160;0x08U</td></tr>
+<tr class="separator:gab0a296414983155b30ad51871606b90f"><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>Debug messages infrastructure </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a957d947c94fda9b85d4aee0aab72952a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a957d947c94fda9b85d4aee0aab72952a">&#9670;&nbsp;</a></span>LWIP_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DEBUG</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Enable debug message printing, but only if debug message type is enabled AND is of correct type AND is at least LWIP_DBG_LEVEL. </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="debug_8h.html">debug.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/debug_8h.js b/doc/doxygen/output/html/debug_8h.js
new file mode 100644
index 0000000..9c99139
--- /dev/null
+++ b/doc/doxygen/output/html/debug_8h.js
@@ -0,0 +1,15 @@
+var debug_8h =
+[
+    [ "LWIP_DBG_FRESH", "group__debugging__levels.html#ga7d44d1804fa5e747aed86816e2a6cae0", null ],
+    [ "LWIP_DBG_HALT", "group__debugging__levels.html#gab0a296414983155b30ad51871606b90f", null ],
+    [ "LWIP_DBG_LEVEL_ALL", "group__debugging__levels.html#ga8ebaeb006b43f55897f3196b3617dc87", null ],
+    [ "LWIP_DBG_LEVEL_SERIOUS", "group__debugging__levels.html#ga0269bdc51f1e8a5ecf9af72c6e1c996c", null ],
+    [ "LWIP_DBG_LEVEL_SEVERE", "group__debugging__levels.html#gaab41143277cd38047b6660d90e9cec3b", null ],
+    [ "LWIP_DBG_LEVEL_WARNING", "group__debugging__levels.html#ga77c491e468bf7d9a1bc48430c1866a96", null ],
+    [ "LWIP_DBG_OFF", "group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1", null ],
+    [ "LWIP_DBG_ON", "group__debugging__levels.html#ga9e31b7cbbc8f46af8e62b548079acd4e", null ],
+    [ "LWIP_DBG_STATE", "group__debugging__levels.html#ga511ee3deb3240635f5ec6a1709c6d741", null ],
+    [ "LWIP_DBG_TRACE", "group__debugging__levels.html#ga988147559b78642ac881815b66023646", null ],
+    [ "LWIP_DEBUG", "debug_8h.html#a957d947c94fda9b85d4aee0aab72952a", null ],
+    [ "LWIP_NOASSERT", "group__lwip__assertions.html#ga71b7787802abbfc2218fb1f39f948a41", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/def_8c.html b/doc/doxygen/output/html/def_8c.html
new file mode 100644
index 0000000..aee03c3
--- /dev/null
+++ b/doc/doxygen/output/html/def_8c.html
@@ -0,0 +1,180 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/def.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('def_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">def.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 &quot;<a class="el" href="def_8h.html">lwip/def.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad637280639de4066392e6b5614fa3e56"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="def_8c.html#ad637280639de4066392e6b5614fa3e56">lwip_htons</a> (u16_t n)</td></tr>
+<tr class="separator:ad637280639de4066392e6b5614fa3e56"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a14f94347a5b9b9e3602705b75b7ae524"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="def_8c.html#a14f94347a5b9b9e3602705b75b7ae524">lwip_htonl</a> (u32_t n)</td></tr>
+<tr class="separator:a14f94347a5b9b9e3602705b75b7ae524"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaeece028198cdaea2f0d2f1d691752c02"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__nonstandard.html#gaeece028198cdaea2f0d2f1d691752c02">lwip_strnstr</a> (const char *buffer, const char *token, size_t n)</td></tr>
+<tr class="separator:gaeece028198cdaea2f0d2f1d691752c02"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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>
+<tr class="separator:ga997dcc49451121d4ed755b33bc7bd26a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf15b4fbaaae5bb7f6da4301f3f979284"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284">lwip_itoa</a> (char *result, size_t bufsize, int number)</td></tr>
+<tr class="separator:gaf15b4fbaaae5bb7f6da4301f3f979284"><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>Common functions used throughout the stack.</p>
+<p>These are reference implementations of the byte swapping functions. Again with the aim of being simple, correct and fully portable. Byte swapping is the second thing you would want to optimize. You will need to port it to your architecture and in your cc.h:</p>
+<p>#define lwip_htons(x) your_htons #define lwip_htonl(x) your_htonl</p>
+<p>Note lwip_ntohs() and lwip_ntohl() are merely references to the htonx counterparts.</p>
+<p>If you #define them to htons() and htonl(), you should #define LWIP_DONT_PROVIDE_BYTEORDER_FUNCTIONS to prevent lwIP from defining htonx/ntohx compatibility macros. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a14f94347a5b9b9e3602705b75b7ae524"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a14f94347a5b9b9e3602705b75b7ae524">&#9670;&nbsp;</a></span>lwip_htonl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t lwip_htonl </td>
+          <td>(</td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>n</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert an u32_t from host- to network byte order.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">n</td><td>u32_t in host byte order </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>n in network byte order </dd></dl>
+
+</div>
+</div>
+<a id="ad637280639de4066392e6b5614fa3e56"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad637280639de4066392e6b5614fa3e56">&#9670;&nbsp;</a></span>lwip_htons()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t lwip_htons </td>
+          <td>(</td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>n</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert an u16_t from host- to network byte order.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">n</td><td>u16_t in host byte order </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>n in network byte order </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_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li><li class="navelem"><a class="el" href="def_8c.html">def.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/def_8c.js b/doc/doxygen/output/html/def_8c.js
new file mode 100644
index 0000000..874d028
--- /dev/null
+++ b/doc/doxygen/output/html/def_8c.js
@@ -0,0 +1,9 @@
+var def_8c =
+[
+    [ "lwip_htonl", "def_8c.html#a14f94347a5b9b9e3602705b75b7ae524", null ],
+    [ "lwip_htons", "def_8c.html#ad637280639de4066392e6b5614fa3e56", null ],
+    [ "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_strnstr", "group__sys__nonstandard.html#gaeece028198cdaea2f0d2f1d691752c02", 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
new file mode 100644
index 0000000..e4c851e
--- /dev/null
+++ b/doc/doxygen/output/html/def_8h.html
@@ -0,0 +1,223 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/def.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('def_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">def.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="opt_8h.html">lwip/opt.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:acf56d3da92a0a7a8a62a617e793e948c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="def_8h.html#acf56d3da92a0a7a8a62a617e793e948c">LWIP_MAKEU32</a>(a,  b,  c,  d)</td></tr>
+<tr class="separator:acf56d3da92a0a7a8a62a617e793e948c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac49eb25570806fb51c329d4f86302cc2"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="def_8h.html#ac49eb25570806fb51c329d4f86302cc2">lwip_htons</a> (u16_t x)</td></tr>
+<tr class="separator:ac49eb25570806fb51c329d4f86302cc2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a95e391e860b519b4f4f5c4979c9c9a37"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a> (u32_t x)</td></tr>
+<tr class="separator:a95e391e860b519b4f4f5c4979c9c9a37"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf15b4fbaaae5bb7f6da4301f3f979284"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284">lwip_itoa</a> (char *result, size_t bufsize, int number)</td></tr>
+<tr class="separator:gaf15b4fbaaae5bb7f6da4301f3f979284"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="separator:ga997dcc49451121d4ed755b33bc7bd26a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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:gaeece028198cdaea2f0d2f1d691752c02"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__nonstandard.html#gaeece028198cdaea2f0d2f1d691752c02">lwip_strnstr</a> (const char *buffer, const char *token, size_t n)</td></tr>
+<tr class="separator:gaeece028198cdaea2f0d2f1d691752c02"><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>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="acf56d3da92a0a7a8a62a617e793e948c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acf56d3da92a0a7a8a62a617e793e948c">&#9670;&nbsp;</a></span>LWIP_MAKEU32</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_MAKEU32</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">a, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">b, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">d&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(((u32_t)((a) &amp; 0xff) &lt;&lt; 24) | \</div><div class="line">                               ((u32_t)((b) &amp; 0xff) &lt;&lt; 16) | \</div><div class="line">                               ((u32_t)((c) &amp; 0xff) &lt;&lt; 8)  | \</div><div class="line">                                (u32_t)((d) &amp; 0xff))</div></div><!-- fragment --><p>Create u32_t value from bytes </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a95e391e860b519b4f4f5c4979c9c9a37"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a95e391e860b519b4f4f5c4979c9c9a37">&#9670;&nbsp;</a></span>lwip_htonl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t lwip_htonl </td>
+          <td>(</td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>n</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert an u32_t from host- to network byte order.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">n</td><td>u32_t in host byte order </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>n in network byte order </dd></dl>
+
+</div>
+</div>
+<a id="ac49eb25570806fb51c329d4f86302cc2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac49eb25570806fb51c329d4f86302cc2">&#9670;&nbsp;</a></span>lwip_htons()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t lwip_htons </td>
+          <td>(</td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>n</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert an u16_t from host- to network byte order.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">n</td><td>u16_t in host byte order </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>n in network byte order </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="def_8h.html">def.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/def_8h.js b/doc/doxygen/output/html/def_8h.js
new file mode 100644
index 0000000..b3c7426
--- /dev/null
+++ b/doc/doxygen/output/html/def_8h.js
@@ -0,0 +1,10 @@
+var def_8h =
+[
+    [ "LWIP_MAKEU32", "def_8h.html#acf56d3da92a0a7a8a62a617e793e948c", null ],
+    [ "lwip_htonl", "def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37", null ],
+    [ "lwip_htons", "def_8h.html#ac49eb25570806fb51c329d4f86302cc2", null ],
+    [ "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_strnstr", "group__sys__nonstandard.html#gaeece028198cdaea2f0d2f1d691752c02", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/deprecated.html b/doc/doxygen/output/html/deprecated.html
new file mode 100644
index 0000000..b1db74c
--- /dev/null
+++ b/doc/doxygen/output/html/deprecated.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Deprecated List</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('deprecated.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">Deprecated List </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><dl class="reflist">
+<dt><a class="anchor" id="_deprecated000001"></a>Global <a class="el" href="group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4">dhcp_release</a>  (struct netif *netif)</dt>
+<dd>Use <a class="el" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp_release_and_stop()</a> instead.  </dd>
+<dt><a class="anchor" id="_deprecated000002"></a>Global <a class="el" href="group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312">dhcp_stop</a>  (struct netif *netif)</dt>
+<dd>Use <a class="el" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp_release_and_stop()</a> instead.  </dd>
+<dt><a class="anchor" id="_deprecated000004"></a>Global <a class="el" href="group__netifapi__dhcp4.html#ga5aeaee24c11128df90a56fe091c9d409">netifapi_dhcp_release</a>  (n)</dt>
+<dd>Use <a class="el" href="group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134">netifapi_dhcp_release_and_stop()</a> instead.  </dd>
+<dt><a class="anchor" id="_deprecated000003"></a>Global <a class="el" href="group__netifapi__dhcp4.html#ga2322c0d0e3eb6c1097d6f3942905dbd5">netifapi_dhcp_stop</a>  (n)</dt>
+<dd>Use <a class="el" href="group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134">netifapi_dhcp_release_and_stop()</a> instead.  </dd>
+<dt><a class="anchor" id="_deprecated000005"></a>Global <a class="el" href="group__lwip__os.html#gacd0a865623921ada2dd08962eb82c9df">tcpip_callback_with_block</a>  (function, ctx, block)</dt>
+<dd>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><!-- 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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dhcp6_8c.html b/doc/doxygen/output/html/dhcp6_8c.html
new file mode 100644
index 0000000..4bd6d6b
--- /dev/null
+++ b/doc/doxygen/output/html/dhcp6_8c.html
@@ -0,0 +1,228 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv6/dhcp6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dhcp6_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">dhcp6.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 &quot;<a class="el" href="dhcp6_8h.html">lwip/dhcp6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2dhcp6_8h.html">lwip/prot/dhcp6.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="udp_8h.html">lwip/udp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="dns_8h.html">lwip/dns.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;path/to/my/lwip_hooks.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ac4c519a2e10067f277d6b09e60919e9a"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp6_8c.html#ac4c519a2e10067f277d6b09e60919e9a">dhcp6_option_idx</a> </td></tr>
+<tr class="separator:ac4c519a2e10067f277d6b09e60919e9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga5cdf4082c8a4ee6bf0cb874c0eaa8453"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453">dhcp6_set_struct</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct dhcp6 *dhcp6)</td></tr>
+<tr class="separator:ga5cdf4082c8a4ee6bf0cb874c0eaa8453"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacb7042000509fb21e8d2758e235d6dde"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde">dhcp6_cleanup</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gacb7042000509fb21e8d2758e235d6dde"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa9e972fcd1d648ca5f02334b1591b619"><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__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619">dhcp6_enable_stateful</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gaa9e972fcd1d648ca5f02334b1591b619"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf3349463541e673fec33843eb019b18c"><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__dhcp6.html#gaf3349463541e673fec33843eb019b18c">dhcp6_enable_stateless</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gaf3349463541e673fec33843eb019b18c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadd0c783a85a410f75b37a3d922ad60d2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2">dhcp6_disable</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gadd0c783a85a410f75b37a3d922ad60d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0f47aac3c04c84a7143fa6925e9fdba"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp6_8c.html#af0f47aac3c04c84a7143fa6925e9fdba">dhcp6_nd6_ra_trigger</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t managed_addr_config, u8_t other_config)</td></tr>
+<tr class="separator:af0f47aac3c04c84a7143fa6925e9fdba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5289027cb2b166d08bc55b7ed2d4756d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp6_8c.html#a5289027cb2b166d08bc55b7ed2d4756d">dhcp6_tmr</a> (void)</td></tr>
+<tr class="separator:a5289027cb2b166d08bc55b7ed2d4756d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:abcce06f078da4b03265d20c0bc1bdce0"><td class="memItemLeft" align="right" valign="top">struct dhcp6_option_info&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp6_8c.html#abcce06f078da4b03265d20c0bc1bdce0">dhcp6_rx_options</a> [DHCP6_OPTION_IDX_MAX]</td></tr>
+<tr class="separator:abcce06f078da4b03265d20c0bc1bdce0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="ac4c519a2e10067f277d6b09e60919e9a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac4c519a2e10067f277d6b09e60919e9a">&#9670;&nbsp;</a></span>dhcp6_option_idx</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="dhcp6_8c.html#ac4c519a2e10067f277d6b09e60919e9a">dhcp6_option_idx</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Option handling: options are parsed in dhcp6_parse_reply and saved in an array where other functions can load them from. This might be moved into the struct dhcp6 (not necessarily since lwIP is single-threaded and the array is only used while in recv callback). </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="af0f47aac3c04c84a7143fa6925e9fdba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af0f47aac3c04c84a7143fa6925e9fdba">&#9670;&nbsp;</a></span>dhcp6_nd6_ra_trigger()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp6_nd6_ra_trigger </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>managed_addr_config</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>other_config</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </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>
+
+</div>
+</div>
+<a id="a5289027cb2b166d08bc55b7ed2d4756d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5289027cb2b166d08bc55b7ed2d4756d">&#9670;&nbsp;</a></span>dhcp6_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp6_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DHCPv6 timeout handling (this function must be called every 500ms, see <a class="el" href="dhcp6_8h.html#afdd69327dc7d9f5cc4f029d706f60c8f">DHCP6_TIMER_MSECS</a>).</p>
+<p>A DHCPv6 server is expected to respond within a short period of time. This timer checks whether an outstanding DHCPv6 request is timed out. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="abcce06f078da4b03265d20c0bc1bdce0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abcce06f078da4b03265d20c0bc1bdce0">&#9670;&nbsp;</a></span>dhcp6_rx_options</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct dhcp6_option_info dhcp6_rx_options[DHCP6_OPTION_IDX_MAX]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Holds the decoded option info, only valid while in dhcp6_recv. </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_da9c6f43d3cd00be3de224bac907a425.html">ipv6</a></li><li class="navelem"><a class="el" href="dhcp6_8c.html">dhcp6.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dhcp6_8c.js b/doc/doxygen/output/html/dhcp6_8c.js
new file mode 100644
index 0000000..8029691
--- /dev/null
+++ b/doc/doxygen/output/html/dhcp6_8c.js
@@ -0,0 +1,12 @@
+var dhcp6_8c =
+[
+    [ "dhcp6_option_idx", "dhcp6_8c.html#ac4c519a2e10067f277d6b09e60919e9a", null ],
+    [ "dhcp6_cleanup", "group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde", null ],
+    [ "dhcp6_disable", "group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2", null ],
+    [ "dhcp6_enable_stateful", "group__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619", null ],
+    [ "dhcp6_enable_stateless", "group__dhcp6.html#gaf3349463541e673fec33843eb019b18c", null ],
+    [ "dhcp6_nd6_ra_trigger", "dhcp6_8c.html#af0f47aac3c04c84a7143fa6925e9fdba", null ],
+    [ "dhcp6_set_struct", "group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453", null ],
+    [ "dhcp6_tmr", "dhcp6_8c.html#a5289027cb2b166d08bc55b7ed2d4756d", null ],
+    [ "dhcp6_rx_options", "dhcp6_8c.html#abcce06f078da4b03265d20c0bc1bdce0", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dhcp6_8h.html b/doc/doxygen/output/html/dhcp6_8h.html
new file mode 100644
index 0000000..51d422d
--- /dev/null
+++ b/doc/doxygen/output/html/dhcp6_8h.html
@@ -0,0 +1,224 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/dhcp6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dhcp6_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">dhcp6.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="err_8h.html">lwip/err.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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:afdd69327dc7d9f5cc4f029d706f60c8f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp6_8h.html#afdd69327dc7d9f5cc4f029d706f60c8f">DHCP6_TIMER_MSECS</a>&#160;&#160;&#160;500</td></tr>
+<tr class="separator:afdd69327dc7d9f5cc4f029d706f60c8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a76941ddba22fe00dfc47d2f339f7aca3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp6_8h.html#a76941ddba22fe00dfc47d2f339f7aca3">dhcp6_remove_struct</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;<a class="el" href="group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f">netif_set_client_data</a>(<a class="el" href="structnetif.html">netif</a>, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, NULL)</td></tr>
+<tr class="separator:a76941ddba22fe00dfc47d2f339f7aca3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga5cdf4082c8a4ee6bf0cb874c0eaa8453"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453">dhcp6_set_struct</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct dhcp6 *dhcp6)</td></tr>
+<tr class="separator:ga5cdf4082c8a4ee6bf0cb874c0eaa8453"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacb7042000509fb21e8d2758e235d6dde"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde">dhcp6_cleanup</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gacb7042000509fb21e8d2758e235d6dde"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa9e972fcd1d648ca5f02334b1591b619"><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__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619">dhcp6_enable_stateful</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gaa9e972fcd1d648ca5f02334b1591b619"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf3349463541e673fec33843eb019b18c"><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__dhcp6.html#gaf3349463541e673fec33843eb019b18c">dhcp6_enable_stateless</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gaf3349463541e673fec33843eb019b18c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadd0c783a85a410f75b37a3d922ad60d2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2">dhcp6_disable</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gadd0c783a85a410f75b37a3d922ad60d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5289027cb2b166d08bc55b7ed2d4756d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp6_8h.html#a5289027cb2b166d08bc55b7ed2d4756d">dhcp6_tmr</a> (void)</td></tr>
+<tr class="separator:a5289027cb2b166d08bc55b7ed2d4756d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0f47aac3c04c84a7143fa6925e9fdba"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp6_8h.html#af0f47aac3c04c84a7143fa6925e9fdba">dhcp6_nd6_ra_trigger</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t managed_addr_config, u8_t other_config)</td></tr>
+<tr class="separator:af0f47aac3c04c84a7143fa6925e9fdba"><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>DHCPv6 client: IPv6 address autoconfiguration as per RFC 3315 (stateful DHCPv6) and RFC 3736 (stateless DHCPv6). </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a76941ddba22fe00dfc47d2f339f7aca3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a76941ddba22fe00dfc47d2f339f7aca3">&#9670;&nbsp;</a></span>dhcp6_remove_struct</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define dhcp6_remove_struct</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f">netif_set_client_data</a>(<a class="el" href="structnetif.html">netif</a>, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, NULL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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>
+</div>
+<a id="afdd69327dc7d9f5cc4f029d706f60c8f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afdd69327dc7d9f5cc4f029d706f60c8f">&#9670;&nbsp;</a></span>DHCP6_TIMER_MSECS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DHCP6_TIMER_MSECS&#160;&#160;&#160;500</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>period (in milliseconds) of the application calling <a class="el" href="dhcp6_8h.html#a5289027cb2b166d08bc55b7ed2d4756d">dhcp6_tmr()</a> </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="af0f47aac3c04c84a7143fa6925e9fdba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af0f47aac3c04c84a7143fa6925e9fdba">&#9670;&nbsp;</a></span>dhcp6_nd6_ra_trigger()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp6_nd6_ra_trigger </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>managed_addr_config</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>other_config</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </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>
+
+</div>
+</div>
+<a id="a5289027cb2b166d08bc55b7ed2d4756d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5289027cb2b166d08bc55b7ed2d4756d">&#9670;&nbsp;</a></span>dhcp6_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp6_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DHCPv6 timeout handling (this function must be called every 500ms, see <a class="el" href="dhcp6_8h.html#afdd69327dc7d9f5cc4f029d706f60c8f">DHCP6_TIMER_MSECS</a>).</p>
+<p>A DHCPv6 server is expected to respond within a short period of time. This timer checks whether an outstanding DHCPv6 request is timed out. </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="dhcp6_8h.html">dhcp6.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dhcp6_8h.js b/doc/doxygen/output/html/dhcp6_8h.js
new file mode 100644
index 0000000..854309e
--- /dev/null
+++ b/doc/doxygen/output/html/dhcp6_8h.js
@@ -0,0 +1,12 @@
+var dhcp6_8h =
+[
+    [ "dhcp6_remove_struct", "dhcp6_8h.html#a76941ddba22fe00dfc47d2f339f7aca3", null ],
+    [ "DHCP6_TIMER_MSECS", "dhcp6_8h.html#afdd69327dc7d9f5cc4f029d706f60c8f", null ],
+    [ "dhcp6_cleanup", "group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde", null ],
+    [ "dhcp6_disable", "group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2", null ],
+    [ "dhcp6_enable_stateful", "group__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619", null ],
+    [ "dhcp6_enable_stateless", "group__dhcp6.html#gaf3349463541e673fec33843eb019b18c", null ],
+    [ "dhcp6_nd6_ra_trigger", "dhcp6_8h.html#af0f47aac3c04c84a7143fa6925e9fdba", null ],
+    [ "dhcp6_set_struct", "group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453", null ],
+    [ "dhcp6_tmr", "dhcp6_8h.html#a5289027cb2b166d08bc55b7ed2d4756d", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dhcp_8c.html b/doc/doxygen/output/html/dhcp_8c.html
new file mode 100644
index 0000000..68eb46f
--- /dev/null
+++ b/doc/doxygen/output/html/dhcp_8c.html
@@ -0,0 +1,392 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv4/dhcp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dhcp_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <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>
+  <div class="headertitle">
+<div class="title">dhcp.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 &quot;<a class="el" href="stats_8h.html">lwip/stats.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="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="netif_8h.html">lwip/netif.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="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="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 />
+<code>#include &quot;<a class="el" href="iana_8h.html">lwip/prot/iana.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;path/to/my/lwip_hooks.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ad6de9c5120654454a330bf5de53c4835"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8c.html#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"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8c.html#a63e9ec4517b80d8576f218d905e31a9b">DHCP_MAX_MSG_LEN</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;(<a class="el" href="structnetif.html">netif</a>-&gt;mtu)</td></tr>
+<tr class="separator:a63e9ec4517b80d8576f218d905e31a9b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa52c2b64ef42fbad84a3bcd58052caab"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8c.html#aa52c2b64ef42fbad84a3bcd58052caab">DHCP_MIN_REPLY_LEN</a>&#160;&#160;&#160;44</td></tr>
+<tr class="separator:aa52c2b64ef42fbad84a3bcd58052caab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:a8c3b584d223b995b48613ad96cb776a0"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8c.html#a8c3b584d223b995b48613ad96cb776a0">dhcp_option_idx</a> </td></tr>
+<tr class="separator:a8c3b584d223b995b48613ad96cb776a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad7480883d64f3d6f083c8aa933b5e3cb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8c.html#ad7480883d64f3d6f083c8aa933b5e3cb">dhcp_coarse_tmr</a> (void)</td></tr>
+<tr class="separator:ad7480883d64f3d6f083c8aa933b5e3cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a601d97faa24fa7289244bb452f052045"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8c.html#a601d97faa24fa7289244bb452f052045">dhcp_fine_tmr</a> (void)</td></tr>
+<tr class="separator:a601d97faa24fa7289244bb452f052045"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="separator:ga43812097832716a462c660eb59cc1bf8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga292a1b0c0c288ec508108a3fba473e64"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64">dhcp_cleanup</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga292a1b0c0c288ec508108a3fba473e64"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0c50968d9811aa2aa67fadc0885d744f"><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#ga0c50968d9811aa2aa67fadc0885d744f">dhcp_start</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga0c50968d9811aa2aa67fadc0885d744f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8c.html#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"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8c.html#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: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"><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>
+<tr class="separator:gaf7cd42b9f220446b6a597d3474da6ece"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf92f7afb58252f82a749064602974bd4"><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#gaf92f7afb58252f82a749064602974bd4">dhcp_release</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gaf92f7afb58252f82a749064602974bd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga93f6bf21086dc9b10c0bec4676f97312"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312">dhcp_stop</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga93f6bf21086dc9b10c0bec4676f97312"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae24a2529372218327ab9cb6592041c85"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8c.html#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 name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a5abd232496063bddcbc6692c0e8f9c1f"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8c.html#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"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8c.html#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="ad6de9c5120654454a330bf5de53c4835"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad6de9c5120654454a330bf5de53c4835">&#9670;&nbsp;</a></span>DHCP_CREATE_RAND_XID</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DHCP_CREATE_RAND_XID&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DHCP_CREATE_RAND_XID: if this is set to 1, the xid is created using <a class="el" href="group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a">LWIP_RAND()</a> (this overrides DHCP_GLOBAL_XID) </p>
+
+</div>
+</div>
+<a id="a63e9ec4517b80d8576f218d905e31a9b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a63e9ec4517b80d8576f218d905e31a9b">&#9670;&nbsp;</a></span>DHCP_MAX_MSG_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DHCP_MAX_MSG_LEN</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td>&#160;&#160;&#160;(<a class="el" href="structnetif.html">netif</a>-&gt;mtu)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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>
+</div>
+<a id="aa52c2b64ef42fbad84a3bcd58052caab"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa52c2b64ef42fbad84a3bcd58052caab">&#9670;&nbsp;</a></span>DHCP_MIN_REPLY_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DHCP_MIN_REPLY_LEN&#160;&#160;&#160;44</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Minimum length for reply before packet is parsed </p>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="a8c3b584d223b995b48613ad96cb776a0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8c3b584d223b995b48613ad96cb776a0">&#9670;&nbsp;</a></span>dhcp_option_idx</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="dhcp_8c.html#a8c3b584d223b995b48613ad96cb776a0">dhcp_option_idx</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Option handling: options are parsed in dhcp_parse_reply and saved in an array where other functions can load them from. This might be moved into the struct dhcp (not necessarily since lwIP is single-threaded and the array is only used while in recv callback). </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1fc0a94e0b94f13c5d302018f7ecb535"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1fc0a94e0b94f13c5d302018f7ecb535">&#9670;&nbsp;</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> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad7480883d64f3d6f083c8aa933b5e3cb">&#9670;&nbsp;</a></span>dhcp_coarse_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp_coarse_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The DHCP timer that checks for lease renewal/rebind timeouts. Must be called once a minute (see <a class="el" href="dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e">DHCP_COARSE_TIMER_SECS</a>). </p>
+
+</div>
+</div>
+<a id="a601d97faa24fa7289244bb452f052045"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a601d97faa24fa7289244bb452f052045">&#9670;&nbsp;</a></span>dhcp_fine_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp_fine_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DHCP transaction timeout handling (this function must be called every 500ms, see <a class="el" href="dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f">DHCP_FINE_TIMER_MSECS</a>).</p>
+<p>A DHCP server is expected to respond within a short period of time. This timer checks whether an outstanding DHCP request is timed out. </p>
+
+</div>
+</div>
+<a id="a04f3824720223c439165243527906002"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a04f3824720223c439165243527906002">&#9670;&nbsp;</a></span>dhcp_network_changed()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp_network_changed </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Handle a possible change in the network configuration.</p>
+<p>This enters the REBOOTING state to verify that the currently bound address is still valid. </p>
+
+</div>
+</div>
+<a id="ae24a2529372218327ab9cb6592041c85"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae24a2529372218327ab9cb6592041c85">&#9670;&nbsp;</a></span>dhcp_supplied_address()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t dhcp_supplied_address </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>check if DHCP supplied netif-&gt;<a class="el" href="structip__addr.html">ip_addr</a></p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the netif to check </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if DHCP supplied netif-&gt;<a class="el" href="structip__addr.html">ip_addr</a> (states BOUND or RENEWING), 0 otherwise </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="a058b71e1d26b3758b29d16d9f892c8cc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a058b71e1d26b3758b29d16d9f892c8cc">&#9670;&nbsp;</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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5abd232496063bddcbc6692c0e8f9c1f">&#9670;&nbsp;</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 -->
+<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="dhcp_8c.html">dhcp.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dhcp_8c.js b/doc/doxygen/output/html/dhcp_8c.js
new file mode 100644
index 0000000..6f8fbfa
--- /dev/null
+++ b/doc/doxygen/output/html/dhcp_8c.js
@@ -0,0 +1,22 @@
+var dhcp_8c =
+[
+    [ "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 ],
+    [ "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_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 ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dhcp_8h.html b/doc/doxygen/output/html/dhcp_8h.html
new file mode 100644
index 0000000..9bcdcfc
--- /dev/null
+++ b/doc/doxygen/output/html/dhcp_8h.html
@@ -0,0 +1,336 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/dhcp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dhcp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">dhcp.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="udp_8h.html">lwip/udp.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a3751cc5daa0875d415ebacd8ad675f1e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e">DHCP_COARSE_TIMER_SECS</a>&#160;&#160;&#160;60</td></tr>
+<tr class="separator:a3751cc5daa0875d415ebacd8ad675f1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad84b8f4deec421bbf6fd85e8fae047d6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8h.html#ad84b8f4deec421bbf6fd85e8fae047d6">DHCP_COARSE_TIMER_MSECS</a>&#160;&#160;&#160;(<a class="el" href="dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e">DHCP_COARSE_TIMER_SECS</a> * 1000UL)</td></tr>
+<tr class="separator:ad84b8f4deec421bbf6fd85e8fae047d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7a26209f52eebe8ded457ae141df403f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f">DHCP_FINE_TIMER_MSECS</a>&#160;&#160;&#160;500</td></tr>
+<tr class="separator:a7a26209f52eebe8ded457ae141df403f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa92284faa099dac4331c1fc0b997dabc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8h.html#aa92284faa099dac4331c1fc0b997dabc">dhcp_remove_struct</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;<a class="el" href="group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f">netif_set_client_data</a>(<a class="el" href="structnetif.html">netif</a>, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP, NULL)</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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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>
+<tr class="separator:ga43812097832716a462c660eb59cc1bf8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga292a1b0c0c288ec508108a3fba473e64"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64">dhcp_cleanup</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga292a1b0c0c288ec508108a3fba473e64"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0c50968d9811aa2aa67fadc0885d744f"><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#ga0c50968d9811aa2aa67fadc0885d744f">dhcp_start</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga0c50968d9811aa2aa67fadc0885d744f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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:gaf92f7afb58252f82a749064602974bd4"><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#gaf92f7afb58252f82a749064602974bd4">dhcp_release</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gaf92f7afb58252f82a749064602974bd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga93f6bf21086dc9b10c0bec4676f97312"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312">dhcp_stop</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga93f6bf21086dc9b10c0bec4676f97312"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="separator:gaf7cd42b9f220446b6a597d3474da6ece"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8h.html#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"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8h.html#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:ae24a2529372218327ab9cb6592041c85"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8h.html#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"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8h.html#ad7480883d64f3d6f083c8aa933b5e3cb">dhcp_coarse_tmr</a> (void)</td></tr>
+<tr class="separator:ad7480883d64f3d6f083c8aa933b5e3cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a601d97faa24fa7289244bb452f052045"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8h.html#a601d97faa24fa7289244bb452f052045">dhcp_fine_tmr</a> (void)</td></tr>
+<tr class="separator:a601d97faa24fa7289244bb452f052045"><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>DHCP client API </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ad84b8f4deec421bbf6fd85e8fae047d6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad84b8f4deec421bbf6fd85e8fae047d6">&#9670;&nbsp;</a></span>DHCP_COARSE_TIMER_MSECS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DHCP_COARSE_TIMER_MSECS&#160;&#160;&#160;(<a class="el" href="dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e">DHCP_COARSE_TIMER_SECS</a> * 1000UL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>period (in milliseconds) of the application calling <a class="el" href="dhcp_8h.html#ad7480883d64f3d6f083c8aa933b5e3cb">dhcp_coarse_tmr()</a> </p>
+
+</div>
+</div>
+<a id="a3751cc5daa0875d415ebacd8ad675f1e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3751cc5daa0875d415ebacd8ad675f1e">&#9670;&nbsp;</a></span>DHCP_COARSE_TIMER_SECS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DHCP_COARSE_TIMER_SECS&#160;&#160;&#160;60</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>period (in seconds) of the application calling <a class="el" href="dhcp_8h.html#ad7480883d64f3d6f083c8aa933b5e3cb">dhcp_coarse_tmr()</a> </p>
+
+</div>
+</div>
+<a id="a7a26209f52eebe8ded457ae141df403f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7a26209f52eebe8ded457ae141df403f">&#9670;&nbsp;</a></span>DHCP_FINE_TIMER_MSECS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DHCP_FINE_TIMER_MSECS&#160;&#160;&#160;500</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>period (in milliseconds) of the application calling <a class="el" href="dhcp_8h.html#a601d97faa24fa7289244bb452f052045">dhcp_fine_tmr()</a> </p>
+
+</div>
+</div>
+<a id="aa92284faa099dac4331c1fc0b997dabc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa92284faa099dac4331c1fc0b997dabc">&#9670;&nbsp;</a></span>dhcp_remove_struct</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define dhcp_remove_struct</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f">netif_set_client_data</a>(<a class="el" href="structnetif.html">netif</a>, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP, NULL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1fc0a94e0b94f13c5d302018f7ecb535">&#9670;&nbsp;</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> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad7480883d64f3d6f083c8aa933b5e3cb">&#9670;&nbsp;</a></span>dhcp_coarse_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp_coarse_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The DHCP timer that checks for lease renewal/rebind timeouts. Must be called once a minute (see <a class="el" href="dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e">DHCP_COARSE_TIMER_SECS</a>). </p>
+
+</div>
+</div>
+<a id="a601d97faa24fa7289244bb452f052045"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a601d97faa24fa7289244bb452f052045">&#9670;&nbsp;</a></span>dhcp_fine_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp_fine_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DHCP transaction timeout handling (this function must be called every 500ms, see <a class="el" href="dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f">DHCP_FINE_TIMER_MSECS</a>).</p>
+<p>A DHCP server is expected to respond within a short period of time. This timer checks whether an outstanding DHCP request is timed out. </p>
+
+</div>
+</div>
+<a id="a04f3824720223c439165243527906002"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a04f3824720223c439165243527906002">&#9670;&nbsp;</a></span>dhcp_network_changed()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp_network_changed </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Handle a possible change in the network configuration.</p>
+<p>This enters the REBOOTING state to verify that the currently bound address is still valid. </p>
+
+</div>
+</div>
+<a id="ae24a2529372218327ab9cb6592041c85"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae24a2529372218327ab9cb6592041c85">&#9670;&nbsp;</a></span>dhcp_supplied_address()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t dhcp_supplied_address </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>check if DHCP supplied netif-&gt;<a class="el" href="structip__addr.html">ip_addr</a></p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the netif to check </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if DHCP supplied netif-&gt;<a class="el" href="structip__addr.html">ip_addr</a> (states BOUND or RENEWING), 0 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="dhcp_8h.html">dhcp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dhcp_8h.js b/doc/doxygen/output/html/dhcp_8h.js
new file mode 100644
index 0000000..363994c
--- /dev/null
+++ b/doc/doxygen/output/html/dhcp_8h.js
@@ -0,0 +1,20 @@
+var dhcp_8h =
+[
+    [ "DHCP_COARSE_TIMER_MSECS", "dhcp_8h.html#ad84b8f4deec421bbf6fd85e8fae047d6", null ],
+    [ "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_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_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_8h.html#ae24a2529372218327ab9cb6592041c85", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_04f2ecc425faf0d475a3caf484e551f3.html b/doc/doxygen/output/html/dir_04f2ecc425faf0d475a3caf484e551f3.html
new file mode 100644
index 0000000..2e88c6d
--- /dev/null
+++ b/doc/doxygen/output/html/dir_04f2ecc425faf0d475a3caf484e551f3.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: doc/doxygen Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_04f2ecc425faf0d475a3caf484e551f3.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">doxygen Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+</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_e68e8157741866f444e17edd764ebbae.html">doc</a></li><li class="navelem"><a class="el" href="dir_04f2ecc425faf0d475a3caf484e551f3.html">doxygen</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_149963277126306875d8bfe8322084f3.html b/doc/doxygen/output/html/dir_149963277126306875d8bfe8322084f3.html
new file mode 100644
index 0000000..f1092d6
--- /dev/null
+++ b/doc/doxygen/output/html/dir_149963277126306875d8bfe8322084f3.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/smtp Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_149963277126306875d8bfe8322084f3.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">smtp Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:smtp_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="smtp_8c.html">smtp.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_149963277126306875d8bfe8322084f3.html">smtp</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_149963277126306875d8bfe8322084f3.js b/doc/doxygen/output/html/dir_149963277126306875d8bfe8322084f3.js
new file mode 100644
index 0000000..753972f
--- /dev/null
+++ b/doc/doxygen/output/html/dir_149963277126306875d8bfe8322084f3.js
@@ -0,0 +1,4 @@
+var dir_149963277126306875d8bfe8322084f3 =
+[
+    [ "smtp.c", "smtp_8c.html", "smtp_8c" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_1cb496c74bbaf54ecc99133e1c434e0c.html b/doc/doxygen/output/html/dir_1cb496c74bbaf54ecc99133e1c434e0c.html
new file mode 100644
index 0000000..5c62376
--- /dev/null
+++ b/doc/doxygen/output/html/dir_1cb496c74bbaf54ecc99133e1c434e0c.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/altcp_tls Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_1cb496c74bbaf54ecc99133e1c434e0c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">altcp_tls Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:altcp__tls__mbedtls_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__tls__mbedtls_8c.html">altcp_tls_mbedtls.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:altcp__tls__mbedtls__mem_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__tls__mbedtls__mem_8c.html">altcp_tls_mbedtls_mem.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:altcp__tls__mbedtls__mem_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__tls__mbedtls__mem_8h.html">altcp_tls_mbedtls_mem.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:altcp__tls__mbedtls__structs_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__tls__mbedtls__structs_8h.html">altcp_tls_mbedtls_structs.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_1cb496c74bbaf54ecc99133e1c434e0c.html">altcp_tls</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_1cb496c74bbaf54ecc99133e1c434e0c.js b/doc/doxygen/output/html/dir_1cb496c74bbaf54ecc99133e1c434e0c.js
new file mode 100644
index 0000000..8c2bd56
--- /dev/null
+++ b/doc/doxygen/output/html/dir_1cb496c74bbaf54ecc99133e1c434e0c.js
@@ -0,0 +1,7 @@
+var dir_1cb496c74bbaf54ecc99133e1c434e0c =
+[
+    [ "altcp_tls_mbedtls.c", "altcp__tls__mbedtls_8c.html", null ],
+    [ "altcp_tls_mbedtls_mem.c", "altcp__tls__mbedtls__mem_8c.html", null ],
+    [ "altcp_tls_mbedtls_mem.h", "altcp__tls__mbedtls__mem_8h.html", null ],
+    [ "altcp_tls_mbedtls_structs.h", "altcp__tls__mbedtls__structs_8h.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_1e445e767c368c70d58af8a0b7552719.html b/doc/doxygen/output/html/dir_1e445e767c368c70d58af8a0b7552719.html
new file mode 100644
index 0000000..474ef1c
--- /dev/null
+++ b/doc/doxygen/output/html/dir_1e445e767c368c70d58af8a0b7552719.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/compat Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_1e445e767c368c70d58af8a0b7552719.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">compat Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+</table>
+</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_1e445e767c368c70d58af8a0b7552719.html">compat</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_1e445e767c368c70d58af8a0b7552719.js b/doc/doxygen/output/html/dir_1e445e767c368c70d58af8a0b7552719.js
new file mode 100644
index 0000000..cfaf50d
--- /dev/null
+++ b/doc/doxygen/output/html/dir_1e445e767c368c70d58af8a0b7552719.js
@@ -0,0 +1,5 @@
+var dir_1e445e767c368c70d58af8a0b7552719 =
+[
+    [ "posix", "dir_fe219fca207b878205c0dd92278d118b.html", "dir_fe219fca207b878205c0dd92278d118b" ],
+    [ "stdc", "dir_b42baff89a1adc9a57da7decb1835b6b.html", "dir_b42baff89a1adc9a57da7decb1835b6b" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_34adf996f92d0eef72c45a7167a966e6.html b/doc/doxygen/output/html/dir_34adf996f92d0eef72c45a7167a966e6.html
new file mode 100644
index 0000000..205cf14
--- /dev/null
+++ b/doc/doxygen/output/html/dir_34adf996f92d0eef72c45a7167a966e6.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/http Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_34adf996f92d0eef72c45a7167a966e6.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">http Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:altcp__proxyconnect_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__proxyconnect_8c.html">altcp_proxyconnect.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:http__client_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="http__client_8c.html">http_client.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:httpd_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="httpd_8c.html">httpd.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_34adf996f92d0eef72c45a7167a966e6.html">http</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_34adf996f92d0eef72c45a7167a966e6.js b/doc/doxygen/output/html/dir_34adf996f92d0eef72c45a7167a966e6.js
new file mode 100644
index 0000000..5912bcb
--- /dev/null
+++ b/doc/doxygen/output/html/dir_34adf996f92d0eef72c45a7167a966e6.js
@@ -0,0 +1,6 @@
+var dir_34adf996f92d0eef72c45a7167a966e6 =
+[
+    [ "altcp_proxyconnect.c", "altcp__proxyconnect_8c.html", "altcp__proxyconnect_8c" ],
+    [ "http_client.c", "http__client_8c.html", "http__client_8c" ],
+    [ "httpd.c", "httpd_8c.html", "httpd_8c" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_403e202f99dba154c685be932a8e0c34.html b/doc/doxygen/output/html/dir_403e202f99dba154c685be932a8e0c34.html
new file mode 100644
index 0000000..350c34b
--- /dev/null
+++ b/doc/doxygen/output/html/dir_403e202f99dba154c685be932a8e0c34.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/tftp Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_403e202f99dba154c685be932a8e0c34.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">tftp Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:tftp__server_8c"><td class="memItemLeft" align="right" valign="top">file &#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="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_403e202f99dba154c685be932a8e0c34.js b/doc/doxygen/output/html/dir_403e202f99dba154c685be932a8e0c34.js
new file mode 100644
index 0000000..0a3919e
--- /dev/null
+++ b/doc/doxygen/output/html/dir_403e202f99dba154c685be932a8e0c34.js
@@ -0,0 +1,4 @@
+var dir_403e202f99dba154c685be932a8e0c34 =
+[
+    [ "tftp_server.c", "tftp__server_8c.html", "tftp__server_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
new file mode 100644
index 0000000..b865075
--- /dev/null
+++ b/doc/doxygen/output/html/dir_439fcb6f68ea6a3dc0078b338960fd8f.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/netif/ppp Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_439fcb6f68ea6a3dc0078b338960fd8f.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">ppp Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:pppol2tp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pppol2tp_8h.html">pppol2tp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:pppos_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pppos_8h.html">pppos.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_c9a67764bf8a12cf6b427bb859cbcd0b.html">netif</a></li><li class="navelem"><a class="el" href="dir_439fcb6f68ea6a3dc0078b338960fd8f.html">ppp</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_439fcb6f68ea6a3dc0078b338960fd8f.js b/doc/doxygen/output/html/dir_439fcb6f68ea6a3dc0078b338960fd8f.js
new file mode 100644
index 0000000..dc5deeb
--- /dev/null
+++ b/doc/doxygen/output/html/dir_439fcb6f68ea6a3dc0078b338960fd8f.js
@@ -0,0 +1,5 @@
+var dir_439fcb6f68ea6a3dc0078b338960fd8f =
+[
+    [ "pppol2tp.h", "pppol2tp_8h.html", null ],
+    [ "pppos.h", "pppos_8h.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_460c501b2432fc107adcb38111835e48.html b/doc/doxygen/output/html/dir_460c501b2432fc107adcb38111835e48.html
new file mode 100644
index 0000000..091f57d
--- /dev/null
+++ b/doc/doxygen/output/html/dir_460c501b2432fc107adcb38111835e48.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/priv Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_460c501b2432fc107adcb38111835e48.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">priv Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:altcp__priv_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__priv_8h.html">altcp_priv.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:api__msg_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8h.html">api_msg.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mem__priv_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mem__priv_8h.html">mem_priv.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:memp__priv_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="memp__priv_8h.html">memp_priv.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:memp__std_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="memp__std_8h.html">memp_std.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:nd6__priv_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6__priv_8h.html">nd6_priv.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:raw__priv_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="raw__priv_8h.html">raw_priv.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:sockets__priv_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sockets__priv_8h.html">sockets_priv.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tcp__priv_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html">tcp_priv.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tcpip__priv_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcpip__priv_8h.html">tcpip_priv.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_460c501b2432fc107adcb38111835e48.html">priv</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_460c501b2432fc107adcb38111835e48.js b/doc/doxygen/output/html/dir_460c501b2432fc107adcb38111835e48.js
new file mode 100644
index 0000000..ab81bc5
--- /dev/null
+++ b/doc/doxygen/output/html/dir_460c501b2432fc107adcb38111835e48.js
@@ -0,0 +1,13 @@
+var dir_460c501b2432fc107adcb38111835e48 =
+[
+    [ "altcp_priv.h", "altcp__priv_8h.html", "altcp__priv_8h" ],
+    [ "api_msg.h", "api__msg_8h.html", "api__msg_8h" ],
+    [ "mem_priv.h", "mem__priv_8h.html", null ],
+    [ "memp_priv.h", "memp__priv_8h.html", "memp__priv_8h" ],
+    [ "memp_std.h", "memp__std_8h.html", null ],
+    [ "nd6_priv.h", "nd6__priv_8h.html", "nd6__priv_8h" ],
+    [ "raw_priv.h", "raw__priv_8h.html", "raw__priv_8h" ],
+    [ "sockets_priv.h", "sockets__priv_8h.html", "sockets__priv_8h" ],
+    [ "tcp_priv.h", "tcp__priv_8h.html", "tcp__priv_8h" ],
+    [ "tcpip_priv.h", "tcpip__priv_8h.html", "tcpip__priv_8h" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_4b846c6b6971d2800eff93d75504accd.html b/doc/doxygen/output/html/dir_4b846c6b6971d2800eff93d75504accd.html
new file mode 100644
index 0000000..315d288
--- /dev/null
+++ b/doc/doxygen/output/html/dir_4b846c6b6971d2800eff93d75504accd.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/lwiperf Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_4b846c6b6971d2800eff93d75504accd.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">lwiperf Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:lwiperf_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwiperf_8c.html">lwiperf.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_4b846c6b6971d2800eff93d75504accd.html">lwiperf</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_4b846c6b6971d2800eff93d75504accd.js b/doc/doxygen/output/html/dir_4b846c6b6971d2800eff93d75504accd.js
new file mode 100644
index 0000000..5969f93
--- /dev/null
+++ b/doc/doxygen/output/html/dir_4b846c6b6971d2800eff93d75504accd.js
@@ -0,0 +1,4 @@
+var dir_4b846c6b6971d2800eff93d75504accd =
+[
+    [ "lwiperf.c", "lwiperf_8c.html", "lwiperf_8c" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_4e6b3cf33a61b6caac9c8ac30c866f37.html b/doc/doxygen/output/html/dir_4e6b3cf33a61b6caac9c8ac30c866f37.html
new file mode 100644
index 0000000..7f75e3a
--- /dev/null
+++ b/doc/doxygen/output/html/dir_4e6b3cf33a61b6caac9c8ac30c866f37.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_4e6b3cf33a61b6caac9c8ac30c866f37.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">lwip Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:altcp_8h"><td class="memItemLeft" align="right" valign="top">file &#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:altcp__tcp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__tcp_8h.html">altcp_tcp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:altcp__tls_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__tls_8h.html">altcp_tls.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:api_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api_8h.html">api.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:arch_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="arch_8h.html">arch.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:autoip_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="autoip_8h.html">autoip.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:debug_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html">debug.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:def_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="def_8h.html">def.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dhcp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8h.html">dhcp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dhcp6_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp6_8h.html">dhcp6.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dns_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dns_8h.html">dns.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:err_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="err_8h.html">err.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lwip_2errno_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2errno_8h.html">errno.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lwip_2etharp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2etharp_8h.html">etharp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ethip6_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ethip6_8h.html">ethip6.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:icmp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp_8h.html">icmp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:icmp6_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp6_8h.html">icmp6.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:if__api_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="if__api_8h.html">if_api.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:igmp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="igmp_8h.html">igmp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lwip_2inet_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2inet_8h.html">inet.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:inet__chksum_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="inet__chksum_8h.html">inet_chksum.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:init_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="init_8h.html">init.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ip_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html">ip.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ip4_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4_8h.html">ip4.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ip4__addr_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html">ip4_addr.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ip4__frag_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__frag_8h.html">ip4_frag.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ip6_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6_8h.html">ip6.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ip6__addr_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html">ip6_addr.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ip6__frag_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__frag_8h.html">ip6_frag.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ip6__zone_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__zone_8h.html">ip6_zone.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ip__addr_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip__addr_8h.html">ip_addr.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mem_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mem_8h.html">mem.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:memp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="memp_8h.html">memp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mld6_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mld6_8h.html">mld6.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:nd6_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8h.html">nd6.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:netbuf_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netbuf_8h.html">netbuf.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lwip_2netdb_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2netdb_8h.html">netdb.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:netif_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html">netif.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:netifapi_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netifapi_8h.html">netifapi.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:opt_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="opt_8h.html">opt.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:pbuf_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html">pbuf.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:raw_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="raw_8h.html">raw.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp_8h.html">snmp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:sockets_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sockets_8h.html">sockets.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:stats_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stats_8h.html">stats.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:sys_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sys_8h.html">sys.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tcp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8h.html">tcp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tcpbase_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcpbase_8h.html">tcpbase.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tcpip_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcpip_8h.html">tcpip.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:timeouts_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8h.html">timeouts.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:udp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="udp_8h.html">udp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_4e6b3cf33a61b6caac9c8ac30c866f37.js b/doc/doxygen/output/html/dir_4e6b3cf33a61b6caac9c8ac30c866f37.js
new file mode 100644
index 0000000..1d449c9
--- /dev/null
+++ b/doc/doxygen/output/html/dir_4e6b3cf33a61b6caac9c8ac30c866f37.js
@@ -0,0 +1,57 @@
+var dir_4e6b3cf33a61b6caac9c8ac30c866f37 =
+[
+    [ "apps", "dir_f9284811ac594eafdc3134d5f8b945cb.html", "dir_f9284811ac594eafdc3134d5f8b945cb" ],
+    [ "priv", "dir_460c501b2432fc107adcb38111835e48.html", "dir_460c501b2432fc107adcb38111835e48" ],
+    [ "prot", "dir_fa0f2b7ac208069fc8d28c28af349d8d.html", "dir_fa0f2b7ac208069fc8d28c28af349d8d" ],
+    [ "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" ],
+    [ "api.h", "api_8h.html", "api_8h" ],
+    [ "arch.h", "arch_8h.html", "arch_8h" ],
+    [ "autoip.h", "autoip_8h.html", "autoip_8h" ],
+    [ "debug.h", "debug_8h.html", "debug_8h" ],
+    [ "def.h", "def_8h.html", "def_8h" ],
+    [ "dhcp.h", "dhcp_8h.html", "dhcp_8h" ],
+    [ "dhcp6.h", "dhcp6_8h.html", "dhcp6_8h" ],
+    [ "dns.h", "dns_8h.html", "dns_8h" ],
+    [ "err.h", "err_8h.html", "err_8h" ],
+    [ "errno.h", "lwip_2errno_8h.html", null ],
+    [ "etharp.h", "lwip_2etharp_8h.html", "lwip_2etharp_8h" ],
+    [ "ethip6.h", "ethip6_8h.html", "ethip6_8h" ],
+    [ "icmp.h", "icmp_8h.html", "icmp_8h" ],
+    [ "icmp6.h", "icmp6_8h.html", "icmp6_8h" ],
+    [ "if_api.h", "if__api_8h.html", "if__api_8h" ],
+    [ "igmp.h", "igmp_8h.html", "igmp_8h" ],
+    [ "inet.h", "lwip_2inet_8h.html", "lwip_2inet_8h" ],
+    [ "inet_chksum.h", "inet__chksum_8h.html", "inet__chksum_8h" ],
+    [ "init.h", "init_8h.html", "init_8h" ],
+    [ "ip.h", "ip_8h.html", "ip_8h" ],
+    [ "ip4.h", "ip4_8h.html", "ip4_8h" ],
+    [ "ip4_addr.h", "ip4__addr_8h.html", "ip4__addr_8h" ],
+    [ "ip4_frag.h", "ip4__frag_8h.html", "ip4__frag_8h" ],
+    [ "ip6.h", "ip6_8h.html", "ip6_8h" ],
+    [ "ip6_addr.h", "ip6__addr_8h.html", "ip6__addr_8h" ],
+    [ "ip6_frag.h", "ip6__frag_8h.html", "ip6__frag_8h" ],
+    [ "ip6_zone.h", "ip6__zone_8h.html", "ip6__zone_8h" ],
+    [ "ip_addr.h", "ip__addr_8h.html", "ip__addr_8h" ],
+    [ "mem.h", "mem_8h.html", "mem_8h" ],
+    [ "memp.h", "memp_8h.html", "memp_8h" ],
+    [ "mld6.h", "mld6_8h.html", "mld6_8h" ],
+    [ "nd6.h", "nd6_8h.html", "nd6_8h" ],
+    [ "netbuf.h", "netbuf_8h.html", "netbuf_8h" ],
+    [ "netdb.h", "lwip_2netdb_8h.html", "lwip_2netdb_8h" ],
+    [ "netif.h", "netif_8h.html", "netif_8h" ],
+    [ "netifapi.h", "netifapi_8h.html", "netifapi_8h" ],
+    [ "opt.h", "opt_8h.html", "opt_8h" ],
+    [ "pbuf.h", "pbuf_8h.html", "pbuf_8h" ],
+    [ "raw.h", "raw_8h.html", "raw_8h" ],
+    [ "snmp.h", "snmp_8h.html", "snmp_8h" ],
+    [ "sockets.h", "sockets_8h.html", "sockets_8h" ],
+    [ "stats.h", "stats_8h.html", "stats_8h" ],
+    [ "sys.h", "sys_8h.html", "sys_8h" ],
+    [ "tcp.h", "tcp_8h.html", "tcp_8h" ],
+    [ "tcpbase.h", "tcpbase_8h.html", null ],
+    [ "tcpip.h", "tcpip_8h.html", "tcpip_8h" ],
+    [ "timeouts.h", "timeouts_8h.html", "timeouts_8h" ],
+    [ "udp.h", "udp_8h.html", "udp_8h" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_53adf0b982dc8545998aae3f283a5a58.html b/doc/doxygen/output/html/dir_53adf0b982dc8545998aae3f283a5a58.html
new file mode 100644
index 0000000..0f7e917
--- /dev/null
+++ b/doc/doxygen/output/html/dir_53adf0b982dc8545998aae3f283a5a58.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_53adf0b982dc8545998aae3f283a5a58.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">apps Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+</table>
+</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="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_53adf0b982dc8545998aae3f283a5a58.js b/doc/doxygen/output/html/dir_53adf0b982dc8545998aae3f283a5a58.js
new file mode 100644
index 0000000..c6c6cfa
--- /dev/null
+++ b/doc/doxygen/output/html/dir_53adf0b982dc8545998aae3f283a5a58.js
@@ -0,0 +1,13 @@
+var dir_53adf0b982dc8545998aae3f283a5a58 =
+[
+    [ "altcp_tls", "dir_1cb496c74bbaf54ecc99133e1c434e0c.html", "dir_1cb496c74bbaf54ecc99133e1c434e0c" ],
+    [ "http", "dir_34adf996f92d0eef72c45a7167a966e6.html", "dir_34adf996f92d0eef72c45a7167a966e6" ],
+    [ "lwiperf", "dir_4b846c6b6971d2800eff93d75504accd.html", "dir_4b846c6b6971d2800eff93d75504accd" ],
+    [ "mdns", "dir_febe3a637907666e8b25366ae60efc0b.html", "dir_febe3a637907666e8b25366ae60efc0b" ],
+    [ "mqtt", "dir_dfacd4b005f6a743295cd1d76eff7420.html", "dir_dfacd4b005f6a743295cd1d76eff7420" ],
+    [ "netbiosns", "dir_56d2b6ddbb44630b0fd661af6321f9c4.html", "dir_56d2b6ddbb44630b0fd661af6321f9c4" ],
+    [ "smtp", "dir_149963277126306875d8bfe8322084f3.html", "dir_149963277126306875d8bfe8322084f3" ],
+    [ "snmp", "dir_fb3f7e43f39ddb210bd1444e66d055f1.html", "dir_fb3f7e43f39ddb210bd1444e66d055f1" ],
+    [ "sntp", "dir_e7856a6aeaebbc124e80ad9550aedba4.html", "dir_e7856a6aeaebbc124e80ad9550aedba4" ],
+    [ "tftp", "dir_403e202f99dba154c685be932a8e0c34.html", "dir_403e202f99dba154c685be932a8e0c34" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_56d2b6ddbb44630b0fd661af6321f9c4.html b/doc/doxygen/output/html/dir_56d2b6ddbb44630b0fd661af6321f9c4.html
new file mode 100644
index 0000000..990d356
--- /dev/null
+++ b/doc/doxygen/output/html/dir_56d2b6ddbb44630b0fd661af6321f9c4.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/netbiosns Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_56d2b6ddbb44630b0fd661af6321f9c4.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">netbiosns Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:netbiosns_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netbiosns_8c.html">netbiosns.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_56d2b6ddbb44630b0fd661af6321f9c4.html">netbiosns</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_56d2b6ddbb44630b0fd661af6321f9c4.js b/doc/doxygen/output/html/dir_56d2b6ddbb44630b0fd661af6321f9c4.js
new file mode 100644
index 0000000..3712596
--- /dev/null
+++ b/doc/doxygen/output/html/dir_56d2b6ddbb44630b0fd661af6321f9c4.js
@@ -0,0 +1,4 @@
+var dir_56d2b6ddbb44630b0fd661af6321f9c4 =
+[
+    [ "netbiosns.c", "netbiosns_8c.html", "netbiosns_8c" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/doc/doxygen/output/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
new file mode 100644
index 0000000..b949a90
--- /dev/null
+++ b/doc/doxygen/output/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_68267d1309a1af8e8297ef4c3efbcdba.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">src Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_53adf0b982dc8545998aae3f283a5a58"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_53adf0b982dc8545998aae3f283a5a58.html">apps</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_b0856f6b0d80ccb263b2f415c91f9e17"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_68267d1309a1af8e8297ef4c3efbcdba.js b/doc/doxygen/output/html/dir_68267d1309a1af8e8297ef4c3efbcdba.js
new file mode 100644
index 0000000..045319a
--- /dev/null
+++ b/doc/doxygen/output/html/dir_68267d1309a1af8e8297ef4c3efbcdba.js
@@ -0,0 +1,8 @@
+var dir_68267d1309a1af8e8297ef4c3efbcdba =
+[
+    [ "api", "dir_da61e3e9a357748887e3ca8d7c5a0c16.html", "dir_da61e3e9a357748887e3ca8d7c5a0c16" ],
+    [ "apps", "dir_53adf0b982dc8545998aae3f283a5a58.html", "dir_53adf0b982dc8545998aae3f283a5a58" ],
+    [ "core", "dir_aebb8dcc11953d78e620bbef0b9e2183.html", "dir_aebb8dcc11953d78e620bbef0b9e2183" ],
+    [ "include", "dir_b0856f6b0d80ccb263b2f415c91f9e17.html", "dir_b0856f6b0d80ccb263b2f415c91f9e17" ],
+    [ "netif", "dir_900e6f7ff90690cb8edb53323dd38d80.html", "dir_900e6f7ff90690cb8edb53323dd38d80" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_6aa605ad180e7b166767bf4f86888ab5.html b/doc/doxygen/output/html/dir_6aa605ad180e7b166767bf4f86888ab5.html
new file mode 100644
index 0000000..a98e392
--- /dev/null
+++ b/doc/doxygen/output/html/dir_6aa605ad180e7b166767bf4f86888ab5.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/netif/ppp Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_6aa605ad180e7b166767bf4f86888ab5.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">ppp Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:pppapi_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pppapi_8c.html">pppapi.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:pppol2tp_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pppol2tp_8c.html">pppol2tp.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:pppos_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pppos_8c.html">pppos.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_900e6f7ff90690cb8edb53323dd38d80.html">netif</a></li><li class="navelem"><a class="el" href="dir_6aa605ad180e7b166767bf4f86888ab5.html">ppp</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_6aa605ad180e7b166767bf4f86888ab5.js b/doc/doxygen/output/html/dir_6aa605ad180e7b166767bf4f86888ab5.js
new file mode 100644
index 0000000..84e27c3
--- /dev/null
+++ b/doc/doxygen/output/html/dir_6aa605ad180e7b166767bf4f86888ab5.js
@@ -0,0 +1,6 @@
+var dir_6aa605ad180e7b166767bf4f86888ab5 =
+[
+    [ "pppapi.c", "pppapi_8c.html", null ],
+    [ "pppol2tp.c", "pppol2tp_8c.html", null ],
+    [ "pppos.c", "pppos_8c.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_6b1b06896a870ebfb9c854c4c71f4ff5.html b/doc/doxygen/output/html/dir_6b1b06896a870ebfb9c854c4c71f4ff5.html
new file mode 100644
index 0000000..f61b83d
--- /dev/null
+++ b/doc/doxygen/output/html/dir_6b1b06896a870ebfb9c854c4c71f4ff5.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/compat/posix/arpa Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_6b1b06896a870ebfb9c854c4c71f4ff5.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">arpa Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:compat_2posix_2arpa_2inet_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="compat_2posix_2arpa_2inet_8h.html">inet.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_1e445e767c368c70d58af8a0b7552719.html">compat</a></li><li class="navelem"><a class="el" href="dir_fe219fca207b878205c0dd92278d118b.html">posix</a></li><li class="navelem"><a class="el" href="dir_6b1b06896a870ebfb9c854c4c71f4ff5.html">arpa</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_6b1b06896a870ebfb9c854c4c71f4ff5.js b/doc/doxygen/output/html/dir_6b1b06896a870ebfb9c854c4c71f4ff5.js
new file mode 100644
index 0000000..874cb59
--- /dev/null
+++ b/doc/doxygen/output/html/dir_6b1b06896a870ebfb9c854c4c71f4ff5.js
@@ -0,0 +1,4 @@
+var dir_6b1b06896a870ebfb9c854c4c71f4ff5 =
+[
+    [ "inet.h", "compat_2posix_2arpa_2inet_8h.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_8da39adb2a11af660bdd7075b7323870.html b/doc/doxygen/output/html/dir_8da39adb2a11af660bdd7075b7323870.html
new file mode 100644
index 0000000..83e1b8a
--- /dev/null
+++ b/doc/doxygen/output/html/dir_8da39adb2a11af660bdd7075b7323870.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/compat/posix/sys Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_8da39adb2a11af660bdd7075b7323870.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">sys Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:socket_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socket_8h.html">socket.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_1e445e767c368c70d58af8a0b7552719.html">compat</a></li><li class="navelem"><a class="el" href="dir_fe219fca207b878205c0dd92278d118b.html">posix</a></li><li class="navelem"><a class="el" href="dir_8da39adb2a11af660bdd7075b7323870.html">sys</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_8da39adb2a11af660bdd7075b7323870.js b/doc/doxygen/output/html/dir_8da39adb2a11af660bdd7075b7323870.js
new file mode 100644
index 0000000..7696c4b
--- /dev/null
+++ b/doc/doxygen/output/html/dir_8da39adb2a11af660bdd7075b7323870.js
@@ -0,0 +1,4 @@
+var dir_8da39adb2a11af660bdd7075b7323870 =
+[
+    [ "socket.h", "socket_8h.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_900e6f7ff90690cb8edb53323dd38d80.html b/doc/doxygen/output/html/dir_900e6f7ff90690cb8edb53323dd38d80.html
new file mode 100644
index 0000000..bd0988d
--- /dev/null
+++ b/doc/doxygen/output/html/dir_900e6f7ff90690cb8edb53323dd38d80.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/netif Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_900e6f7ff90690cb8edb53323dd38d80.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">netif Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:bridgeif_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bridgeif_8c.html">bridgeif.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:bridgeif__fdb_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bridgeif__fdb_8c.html">bridgeif_fdb.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ethernet_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ethernet_8c.html">ethernet.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lowpan6_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6_8c.html">lowpan6.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lowpan6__ble_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6__ble_8c.html">lowpan6_ble.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lowpan6__common_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6__common_8c.html">lowpan6_common.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:slipif_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="slipif_8c.html">slipif.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:zepif_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zepif_8c.html">zepif.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_900e6f7ff90690cb8edb53323dd38d80.html">netif</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_900e6f7ff90690cb8edb53323dd38d80.js b/doc/doxygen/output/html/dir_900e6f7ff90690cb8edb53323dd38d80.js
new file mode 100644
index 0000000..6156e99
--- /dev/null
+++ b/doc/doxygen/output/html/dir_900e6f7ff90690cb8edb53323dd38d80.js
@@ -0,0 +1,12 @@
+var dir_900e6f7ff90690cb8edb53323dd38d80 =
+[
+    [ "ppp", "dir_6aa605ad180e7b166767bf4f86888ab5.html", "dir_6aa605ad180e7b166767bf4f86888ab5" ],
+    [ "bridgeif.c", "bridgeif_8c.html", "bridgeif_8c" ],
+    [ "bridgeif_fdb.c", "bridgeif__fdb_8c.html", "bridgeif__fdb_8c" ],
+    [ "ethernet.c", "ethernet_8c.html", "ethernet_8c" ],
+    [ "lowpan6.c", "lowpan6_8c.html", "lowpan6_8c" ],
+    [ "lowpan6_ble.c", "lowpan6__ble_8c.html", "lowpan6__ble_8c" ],
+    [ "lowpan6_common.c", "lowpan6__common_8c.html", null ],
+    [ "slipif.c", "slipif_8c.html", "slipif_8c" ],
+    [ "zepif.c", "zepif_8c.html", "zepif_8c" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_a32e111ee6805cfc63488fd2d37f2390.html b/doc/doxygen/output/html/dir_a32e111ee6805cfc63488fd2d37f2390.html
new file mode 100644
index 0000000..5324c3e
--- /dev/null
+++ b/doc/doxygen/output/html/dir_a32e111ee6805cfc63488fd2d37f2390.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv4 Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_a32e111ee6805cfc63488fd2d37f2390.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">ipv4 Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:autoip_8c"><td class="memItemLeft" align="right" valign="top">file &#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:dhcp_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8c.html">dhcp.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:etharp_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="etharp_8c.html">etharp.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:icmp_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp_8c.html">icmp.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:igmp_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="igmp_8c.html">igmp.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ip4_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4_8c.html">ip4.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ip4__addr_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8c.html">ip4_addr.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ip4__frag_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__frag_8c.html">ip4_frag.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_a32e111ee6805cfc63488fd2d37f2390.js b/doc/doxygen/output/html/dir_a32e111ee6805cfc63488fd2d37f2390.js
new file mode 100644
index 0000000..a5862b3
--- /dev/null
+++ b/doc/doxygen/output/html/dir_a32e111ee6805cfc63488fd2d37f2390.js
@@ -0,0 +1,11 @@
+var dir_a32e111ee6805cfc63488fd2d37f2390 =
+[
+    [ "autoip.c", "autoip_8c.html", "autoip_8c" ],
+    [ "dhcp.c", "dhcp_8c.html", "dhcp_8c" ],
+    [ "etharp.c", "etharp_8c.html", "etharp_8c" ],
+    [ "icmp.c", "icmp_8c.html", "icmp_8c" ],
+    [ "igmp.c", "igmp_8c.html", "igmp_8c" ],
+    [ "ip4.c", "ip4_8c.html", "ip4_8c" ],
+    [ "ip4_addr.c", "ip4__addr_8c.html", "ip4__addr_8c" ],
+    [ "ip4_frag.c", "ip4__frag_8c.html", "ip4__frag_8c" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_a840c1e301b5b5eb1d549b1f600a8505.html b/doc/doxygen/output/html/dir_a840c1e301b5b5eb1d549b1f600a8505.html
new file mode 100644
index 0000000..2dcdb9e
--- /dev/null
+++ b/doc/doxygen/output/html/dir_a840c1e301b5b5eb1d549b1f600a8505.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/http/makefsdata Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_a840c1e301b5b5eb1d549b1f600a8505.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">makefsdata Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+</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_34adf996f92d0eef72c45a7167a966e6.html">http</a></li><li class="navelem"><a class="el" href="dir_a840c1e301b5b5eb1d549b1f600a8505.html">makefsdata</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_aebb8dcc11953d78e620bbef0b9e2183.html b/doc/doxygen/output/html/dir_aebb8dcc11953d78e620bbef0b9e2183.html
new file mode 100644
index 0000000..9f8e8ae
--- /dev/null
+++ b/doc/doxygen/output/html/dir_aebb8dcc11953d78e620bbef0b9e2183.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_aebb8dcc11953d78e620bbef0b9e2183.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">core Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:altcp_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp_8c.html">altcp.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:altcp__alloc_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__alloc_8c.html">altcp_alloc.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:altcp__tcp_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__tcp_8c.html">altcp_tcp.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:def_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="def_8c.html">def.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dns_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dns_8c.html">dns.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:inet__chksum_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="inet__chksum_8c.html">inet_chksum.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:init_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="init_8c.html">init.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ip_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8c.html">ip.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mem_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mem_8c.html">mem.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:memp_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="memp_8c.html">memp.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:netif_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8c.html">netif.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:pbuf_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8c.html">pbuf.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:raw_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="raw_8c.html">raw.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:stats_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stats_8c.html">stats.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:sys_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sys_8c.html">sys.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tcp_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html">tcp.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tcp__in_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__in_8c.html">tcp_in.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tcp__out_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__out_8c.html">tcp_out.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:timeouts_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8c.html">timeouts.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:udp_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="udp_8c.html">udp.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_aebb8dcc11953d78e620bbef0b9e2183.js b/doc/doxygen/output/html/dir_aebb8dcc11953d78e620bbef0b9e2183.js
new file mode 100644
index 0000000..fd15415
--- /dev/null
+++ b/doc/doxygen/output/html/dir_aebb8dcc11953d78e620bbef0b9e2183.js
@@ -0,0 +1,25 @@
+var dir_aebb8dcc11953d78e620bbef0b9e2183 =
+[
+    [ "ipv4", "dir_a32e111ee6805cfc63488fd2d37f2390.html", "dir_a32e111ee6805cfc63488fd2d37f2390" ],
+    [ "ipv6", "dir_da9c6f43d3cd00be3de224bac907a425.html", "dir_da9c6f43d3cd00be3de224bac907a425" ],
+    [ "altcp.c", "altcp_8c.html", "altcp_8c" ],
+    [ "altcp_alloc.c", "altcp__alloc_8c.html", "altcp__alloc_8c" ],
+    [ "altcp_tcp.c", "altcp__tcp_8c.html", "altcp__tcp_8c" ],
+    [ "def.c", "def_8c.html", "def_8c" ],
+    [ "dns.c", "dns_8c.html", "dns_8c" ],
+    [ "inet_chksum.c", "inet__chksum_8c.html", "inet__chksum_8c" ],
+    [ "init.c", "init_8c.html", "init_8c" ],
+    [ "ip.c", "ip_8c.html", "ip_8c" ],
+    [ "mem.c", "mem_8c.html", "mem_8c" ],
+    [ "memp.c", "memp_8c.html", "memp_8c" ],
+    [ "netif.c", "netif_8c.html", "netif_8c" ],
+    [ "pbuf.c", "pbuf_8c.html", "pbuf_8c" ],
+    [ "raw.c", "raw_8c.html", "raw_8c" ],
+    [ "stats.c", "stats_8c.html", "stats_8c" ],
+    [ "sys.c", "sys_8c.html", "sys_8c" ],
+    [ "tcp.c", "tcp_8c.html", "tcp_8c" ],
+    [ "tcp_in.c", "tcp__in_8c.html", "tcp__in_8c" ],
+    [ "tcp_out.c", "tcp__out_8c.html", "tcp__out_8c" ],
+    [ "timeouts.c", "timeouts_8c.html", "timeouts_8c" ],
+    [ "udp.c", "udp_8c.html", "udp_8c" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.html b/doc/doxygen/output/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.html
new file mode 100644
index 0000000..3259bf9
--- /dev/null
+++ b/doc/doxygen/output/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_b0856f6b0d80ccb263b2f415c91f9e17.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">include Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_1e445e767c368c70d58af8a0b7552719"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_1e445e767c368c70d58af8a0b7552719.html">compat</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.js b/doc/doxygen/output/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.js
new file mode 100644
index 0000000..cfb7251
--- /dev/null
+++ b/doc/doxygen/output/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.js
@@ -0,0 +1,6 @@
+var dir_b0856f6b0d80ccb263b2f415c91f9e17 =
+[
+    [ "compat", "dir_1e445e767c368c70d58af8a0b7552719.html", "dir_1e445e767c368c70d58af8a0b7552719" ],
+    [ "lwip", "dir_4e6b3cf33a61b6caac9c8ac30c866f37.html", "dir_4e6b3cf33a61b6caac9c8ac30c866f37" ],
+    [ "netif", "dir_c9a67764bf8a12cf6b427bb859cbcd0b.html", "dir_c9a67764bf8a12cf6b427bb859cbcd0b" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_b42baff89a1adc9a57da7decb1835b6b.html b/doc/doxygen/output/html/dir_b42baff89a1adc9a57da7decb1835b6b.html
new file mode 100644
index 0000000..69ed319
--- /dev/null
+++ b/doc/doxygen/output/html/dir_b42baff89a1adc9a57da7decb1835b6b.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/compat/stdc Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_b42baff89a1adc9a57da7decb1835b6b.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">stdc Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:compat_2stdc_2errno_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="compat_2stdc_2errno_8h.html">errno.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_1e445e767c368c70d58af8a0b7552719.html">compat</a></li><li class="navelem"><a class="el" href="dir_b42baff89a1adc9a57da7decb1835b6b.html">stdc</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_b42baff89a1adc9a57da7decb1835b6b.js b/doc/doxygen/output/html/dir_b42baff89a1adc9a57da7decb1835b6b.js
new file mode 100644
index 0000000..a25505e
--- /dev/null
+++ b/doc/doxygen/output/html/dir_b42baff89a1adc9a57da7decb1835b6b.js
@@ -0,0 +1,4 @@
+var dir_b42baff89a1adc9a57da7decb1835b6b =
+[
+    [ "errno.h", "compat_2stdc_2errno_8h.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_c62aba36f6630fea5cd7fe1c941850d4.html b/doc/doxygen/output/html/dir_c62aba36f6630fea5cd7fe1c941850d4.html
new file mode 100644
index 0000000..87ab071
--- /dev/null
+++ b/doc/doxygen/output/html/dir_c62aba36f6630fea5cd7fe1c941850d4.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/compat/posix/net Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_c62aba36f6630fea5cd7fe1c941850d4.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">net Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:if_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="if_8h.html">if.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_1e445e767c368c70d58af8a0b7552719.html">compat</a></li><li class="navelem"><a class="el" href="dir_fe219fca207b878205c0dd92278d118b.html">posix</a></li><li class="navelem"><a class="el" href="dir_c62aba36f6630fea5cd7fe1c941850d4.html">net</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_c62aba36f6630fea5cd7fe1c941850d4.js b/doc/doxygen/output/html/dir_c62aba36f6630fea5cd7fe1c941850d4.js
new file mode 100644
index 0000000..54a3ba1
--- /dev/null
+++ b/doc/doxygen/output/html/dir_c62aba36f6630fea5cd7fe1c941850d4.js
@@ -0,0 +1,4 @@
+var dir_c62aba36f6630fea5cd7fe1c941850d4 =
+[
+    [ "if.h", "if_8h.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_c9a67764bf8a12cf6b427bb859cbcd0b.html b/doc/doxygen/output/html/dir_c9a67764bf8a12cf6b427bb859cbcd0b.html
new file mode 100644
index 0000000..efd4f7e
--- /dev/null
+++ b/doc/doxygen/output/html/dir_c9a67764bf8a12cf6b427bb859cbcd0b.html
@@ -0,0 +1,127 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/netif Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_c9a67764bf8a12cf6b427bb859cbcd0b.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">netif Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:bridgeif_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bridgeif_8h.html">bridgeif.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:bridgeif__opts_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bridgeif__opts_8h.html">bridgeif_opts.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:netif_2ethernet_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_2ethernet_8h.html">ethernet.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ieee802154_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ieee802154_8h.html">ieee802154.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lowpan6_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6_8h.html">lowpan6.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lowpan6__ble_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6__ble_8h.html">lowpan6_ble.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lowpan6__common_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6__common_8h.html">lowpan6_common.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lowpan6__opts_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6__opts_8h.html">lowpan6_opts.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:slipif_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="slipif_8h.html">slipif.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:zepif_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zepif_8h.html">zepif.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_c9a67764bf8a12cf6b427bb859cbcd0b.html">netif</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_c9a67764bf8a12cf6b427bb859cbcd0b.js b/doc/doxygen/output/html/dir_c9a67764bf8a12cf6b427bb859cbcd0b.js
new file mode 100644
index 0000000..4cfdb4f
--- /dev/null
+++ b/doc/doxygen/output/html/dir_c9a67764bf8a12cf6b427bb859cbcd0b.js
@@ -0,0 +1,14 @@
+var dir_c9a67764bf8a12cf6b427bb859cbcd0b =
+[
+    [ "ppp", "dir_439fcb6f68ea6a3dc0078b338960fd8f.html", "dir_439fcb6f68ea6a3dc0078b338960fd8f" ],
+    [ "bridgeif.h", "bridgeif_8h.html", "bridgeif_8h" ],
+    [ "bridgeif_opts.h", "bridgeif__opts_8h.html", "bridgeif__opts_8h" ],
+    [ "ethernet.h", "netif_2ethernet_8h.html", "netif_2ethernet_8h" ],
+    [ "ieee802154.h", "ieee802154_8h.html", "ieee802154_8h" ],
+    [ "lowpan6.h", "lowpan6_8h.html", "lowpan6_8h" ],
+    [ "lowpan6_ble.h", "lowpan6__ble_8h.html", "lowpan6__ble_8h" ],
+    [ "lowpan6_common.h", "lowpan6__common_8h.html", "lowpan6__common_8h" ],
+    [ "lowpan6_opts.h", "lowpan6__opts_8h.html", "lowpan6__opts_8h" ],
+    [ "slipif.h", "slipif_8h.html", "slipif_8h" ],
+    [ "zepif.h", "zepif_8h.html", "zepif_8h" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_da61e3e9a357748887e3ca8d7c5a0c16.html b/doc/doxygen/output/html/dir_da61e3e9a357748887e3ca8d7c5a0c16.html
new file mode 100644
index 0000000..eb9f956
--- /dev/null
+++ b/doc/doxygen/output/html/dir_da61e3e9a357748887e3ca8d7c5a0c16.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/api Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_da61e3e9a357748887e3ca8d7c5a0c16.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">api Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:api__lib_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__lib_8c.html">api_lib.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:api__msg_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="api__msg_8c.html">api_msg.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:err_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="err_8c.html">err.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:if__api_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="if__api_8c.html">if_api.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:netbuf_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netbuf_8c.html">netbuf.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:netdb_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netdb_8c.html">netdb.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:netifapi_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netifapi_8c.html">netifapi.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:sockets_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sockets_8c.html">sockets.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tcpip_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcpip_8c.html">tcpip.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_da61e3e9a357748887e3ca8d7c5a0c16.html">api</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_da61e3e9a357748887e3ca8d7c5a0c16.js b/doc/doxygen/output/html/dir_da61e3e9a357748887e3ca8d7c5a0c16.js
new file mode 100644
index 0000000..e4dcbf9
--- /dev/null
+++ b/doc/doxygen/output/html/dir_da61e3e9a357748887e3ca8d7c5a0c16.js
@@ -0,0 +1,12 @@
+var dir_da61e3e9a357748887e3ca8d7c5a0c16 =
+[
+    [ "api_lib.c", "api__lib_8c.html", "api__lib_8c" ],
+    [ "api_msg.c", "api__msg_8c.html", "api__msg_8c" ],
+    [ "err.c", "err_8c.html", null ],
+    [ "if_api.c", "if__api_8c.html", "if__api_8c" ],
+    [ "netbuf.c", "netbuf_8c.html", "netbuf_8c" ],
+    [ "netdb.c", "netdb_8c.html", "netdb_8c" ],
+    [ "netifapi.c", "netifapi_8c.html", "netifapi_8c" ],
+    [ "sockets.c", "sockets_8c.html", "sockets_8c" ],
+    [ "tcpip.c", "tcpip_8c.html", "tcpip_8c" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_da9c6f43d3cd00be3de224bac907a425.html b/doc/doxygen/output/html/dir_da9c6f43d3cd00be3de224bac907a425.html
new file mode 100644
index 0000000..96f2b6c
--- /dev/null
+++ b/doc/doxygen/output/html/dir_da9c6f43d3cd00be3de224bac907a425.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv6 Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_da9c6f43d3cd00be3de224bac907a425.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">ipv6 Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:dhcp6_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp6_8c.html">dhcp6.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ethip6_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ethip6_8c.html">ethip6.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:icmp6_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp6_8c.html">icmp6.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:inet6_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="inet6_8c.html">inet6.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ip6_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6_8c.html">ip6.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ip6__addr_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8c.html">ip6_addr.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ip6__frag_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__frag_8c.html">ip6_frag.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mld6_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mld6_8c.html">mld6.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:nd6_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8c.html">nd6.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_da9c6f43d3cd00be3de224bac907a425.html">ipv6</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_da9c6f43d3cd00be3de224bac907a425.js b/doc/doxygen/output/html/dir_da9c6f43d3cd00be3de224bac907a425.js
new file mode 100644
index 0000000..a284878
--- /dev/null
+++ b/doc/doxygen/output/html/dir_da9c6f43d3cd00be3de224bac907a425.js
@@ -0,0 +1,12 @@
+var dir_da9c6f43d3cd00be3de224bac907a425 =
+[
+    [ "dhcp6.c", "dhcp6_8c.html", "dhcp6_8c" ],
+    [ "ethip6.c", "ethip6_8c.html", "ethip6_8c" ],
+    [ "icmp6.c", "icmp6_8c.html", "icmp6_8c" ],
+    [ "inet6.c", "inet6_8c.html", "inet6_8c" ],
+    [ "ip6.c", "ip6_8c.html", "ip6_8c" ],
+    [ "ip6_addr.c", "ip6__addr_8c.html", "ip6__addr_8c" ],
+    [ "ip6_frag.c", "ip6__frag_8c.html", "ip6__frag_8c" ],
+    [ "mld6.c", "mld6_8c.html", "mld6_8c" ],
+    [ "nd6.c", "nd6_8c.html", "nd6_8c" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_dfacd4b005f6a743295cd1d76eff7420.html b/doc/doxygen/output/html/dir_dfacd4b005f6a743295cd1d76eff7420.html
new file mode 100644
index 0000000..3c92371
--- /dev/null
+++ b/doc/doxygen/output/html/dir_dfacd4b005f6a743295cd1d76eff7420.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/mqtt Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_dfacd4b005f6a743295cd1d76eff7420.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">mqtt Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:mqtt_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mqtt_8c.html">mqtt.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_dfacd4b005f6a743295cd1d76eff7420.html">mqtt</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_dfacd4b005f6a743295cd1d76eff7420.js b/doc/doxygen/output/html/dir_dfacd4b005f6a743295cd1d76eff7420.js
new file mode 100644
index 0000000..db5186d
--- /dev/null
+++ b/doc/doxygen/output/html/dir_dfacd4b005f6a743295cd1d76eff7420.js
@@ -0,0 +1,4 @@
+var dir_dfacd4b005f6a743295cd1d76eff7420 =
+[
+    [ "mqtt.c", "mqtt_8c.html", "mqtt_8c" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_e68e8157741866f444e17edd764ebbae.html b/doc/doxygen/output/html/dir_e68e8157741866f444e17edd764ebbae.html
new file mode 100644
index 0000000..68a3bc2
--- /dev/null
+++ b/doc/doxygen/output/html/dir_e68e8157741866f444e17edd764ebbae.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: doc Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_e68e8157741866f444e17edd764ebbae.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">doc Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+</table>
+</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_e68e8157741866f444e17edd764ebbae.html">doc</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_e7856a6aeaebbc124e80ad9550aedba4.html b/doc/doxygen/output/html/dir_e7856a6aeaebbc124e80ad9550aedba4.html
new file mode 100644
index 0000000..d84c606
--- /dev/null
+++ b/doc/doxygen/output/html/dir_e7856a6aeaebbc124e80ad9550aedba4.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/sntp Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_e7856a6aeaebbc124e80ad9550aedba4.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">sntp Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:sntp_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sntp_8c.html">sntp.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_e7856a6aeaebbc124e80ad9550aedba4.html">sntp</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_e7856a6aeaebbc124e80ad9550aedba4.js b/doc/doxygen/output/html/dir_e7856a6aeaebbc124e80ad9550aedba4.js
new file mode 100644
index 0000000..e9d4516
--- /dev/null
+++ b/doc/doxygen/output/html/dir_e7856a6aeaebbc124e80ad9550aedba4.js
@@ -0,0 +1,4 @@
+var dir_e7856a6aeaebbc124e80ad9550aedba4 =
+[
+    [ "sntp.c", "sntp_8c.html", "sntp_8c" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_ed91d3856030f1b493eca503ef5b96f9.html b/doc/doxygen/output/html/dir_ed91d3856030f1b493eca503ef5b96f9.html
new file mode 100644
index 0000000..4ee8050
--- /dev/null
+++ b/doc/doxygen/output/html/dir_ed91d3856030f1b493eca503ef5b96f9.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/netif/ppp/polarssl Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_ed91d3856030f1b493eca503ef5b96f9.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">polarssl Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+</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_900e6f7ff90690cb8edb53323dd38d80.html">netif</a></li><li class="navelem"><a class="el" href="dir_6aa605ad180e7b166767bf4f86888ab5.html">ppp</a></li><li class="navelem"><a class="el" href="dir_ed91d3856030f1b493eca503ef5b96f9.html">polarssl</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_f9284811ac594eafdc3134d5f8b945cb.html b/doc/doxygen/output/html/dir_f9284811ac594eafdc3134d5f8b945cb.html
new file mode 100644
index 0000000..a74b8f6
--- /dev/null
+++ b/doc/doxygen/output/html/dir_f9284811ac594eafdc3134d5f8b945cb.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_f9284811ac594eafdc3134d5f8b945cb.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">apps Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:altcp__proxyconnect_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__proxyconnect_8h.html">altcp_proxyconnect.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:altcp__tls__mbedtls__opts_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__tls__mbedtls__opts_8h.html">altcp_tls_mbedtls_opts.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:http__client_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="http__client_8h.html">http_client.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:httpd_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="httpd_8h.html">httpd.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:httpd__opts_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="httpd__opts_8h.html">httpd_opts.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lwiperf_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwiperf_8h.html">lwiperf.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mdns_8h"><td class="memItemLeft" align="right" valign="top">file &#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:mdns__opts_8h"><td class="memItemLeft" align="right" valign="top">file &#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:mdns__priv_8h"><td class="memItemLeft" align="right" valign="top">file &#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:mqtt_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mqtt_8h.html">mqtt.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mqtt__opts_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mqtt__opts_8h.html">mqtt_opts.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mqtt__priv_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mqtt__priv_8h.html">mqtt_priv.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:netbiosns_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netbiosns_8h.html">netbiosns.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:netbiosns__opts_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netbiosns__opts_8h.html">netbiosns_opts.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:apps_2snmp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apps_2snmp_8h.html">snmp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__core_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html">snmp_core.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__mib2_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__mib2_8h.html">snmp_mib2.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__opts_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__opts_8h.html">snmp_opts.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__scalar_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__scalar_8h.html">snmp_scalar.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__table_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__table_8h.html">snmp_table.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__threadsync_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__threadsync_8h.html">snmp_threadsync.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmpv3_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmpv3_8h.html">snmpv3.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:sntp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sntp_8h.html">sntp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:sntp__opts_8h"><td class="memItemLeft" align="right" valign="top">file &#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:tftp__opts_8h"><td class="memItemLeft" align="right" valign="top">file &#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:tftp__server_8h"><td class="memItemLeft" align="right" valign="top">file &#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 -->
+</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="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_f9284811ac594eafdc3134d5f8b945cb.js b/doc/doxygen/output/html/dir_f9284811ac594eafdc3134d5f8b945cb.js
new file mode 100644
index 0000000..b4e1725
--- /dev/null
+++ b/doc/doxygen/output/html/dir_f9284811ac594eafdc3134d5f8b945cb.js
@@ -0,0 +1,33 @@
+var dir_f9284811ac594eafdc3134d5f8b945cb =
+[
+    [ "altcp_proxyconnect.h", "altcp__proxyconnect_8h.html", "altcp__proxyconnect_8h" ],
+    [ "altcp_tls_mbedtls_opts.h", "altcp__tls__mbedtls__opts_8h.html", "altcp__tls__mbedtls__opts_8h" ],
+    [ "http_client.h", "http__client_8h.html", "http__client_8h" ],
+    [ "httpd.h", "httpd_8h.html", "httpd_8h" ],
+    [ "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_opts.h", "mdns__opts_8h.html", "mdns__opts_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" ],
+    [ "mqtt_priv.h", "mqtt__priv_8h.html", [
+      [ "mqtt_request_t", "structmqtt__request__t.html", "structmqtt__request__t" ],
+      [ "mqtt_ringbuf_t", "structmqtt__ringbuf__t.html", null ],
+      [ "mqtt_client_s", "structmqtt__client__s.html", "structmqtt__client__s" ]
+    ] ],
+    [ "netbiosns.h", "netbiosns_8h.html", "netbiosns_8h" ],
+    [ "netbiosns_opts.h", "netbiosns__opts_8h.html", "netbiosns__opts_8h" ],
+    [ "snmp.h", "apps_2snmp_8h.html", "apps_2snmp_8h" ],
+    [ "snmp_core.h", "snmp__core_8h.html", "snmp__core_8h" ],
+    [ "snmp_mib2.h", "snmp__mib2_8h.html", "snmp__mib2_8h" ],
+    [ "snmp_opts.h", "snmp__opts_8h.html", "snmp__opts_8h" ],
+    [ "snmp_scalar.h", "snmp__scalar_8h.html", "snmp__scalar_8h" ],
+    [ "snmp_table.h", "snmp__table_8h.html", "snmp__table_8h" ],
+    [ "snmp_threadsync.h", "snmp__threadsync_8h.html", "snmp__threadsync_8h" ],
+    [ "snmpv3.h", "snmpv3_8h.html", null ],
+    [ "sntp.h", "sntp_8h.html", "sntp_8h" ],
+    [ "sntp_opts.h", "sntp__opts_8h.html", "sntp__opts_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
new file mode 100644
index 0000000..21cbf8e
--- /dev/null
+++ b/doc/doxygen/output/html/dir_fa0f2b7ac208069fc8d28c28af349d8d.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_fa0f2b7ac208069fc8d28c28af349d8d.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">prot Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:prot_2autoip_8h"><td class="memItemLeft" align="right" valign="top">file &#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:prot_2dhcp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2dhcp_8h.html">dhcp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:prot_2dhcp6_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2dhcp6_8h.html">dhcp6.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:prot_2dns_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2dns_8h.html">dns.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lwip_2prot_2etharp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2prot_2etharp_8h.html">etharp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lwip_2prot_2ethernet_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2prot_2ethernet_8h.html">ethernet.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:iana_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="iana_8h.html">iana.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:prot_2icmp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2icmp_8h.html">icmp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:prot_2icmp6_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2icmp6_8h.html">icmp6.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ieee_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ieee_8h.html">ieee.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:prot_2igmp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2igmp_8h.html">igmp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:prot_2ip_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2ip_8h.html">ip.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:prot_2ip4_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2ip4_8h.html">ip4.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:prot_2ip6_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2ip6_8h.html">ip6.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:prot_2mld6_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2mld6_8h.html">mld6.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:prot_2nd6_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2nd6_8h.html">nd6.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:prot_2tcp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2tcp_8h.html">tcp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:prot_2udp_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2udp_8h.html">udp.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_fa0f2b7ac208069fc8d28c28af349d8d.js b/doc/doxygen/output/html/dir_fa0f2b7ac208069fc8d28c28af349d8d.js
new file mode 100644
index 0000000..7d908c5
--- /dev/null
+++ b/doc/doxygen/output/html/dir_fa0f2b7ac208069fc8d28c28af349d8d.js
@@ -0,0 +1,21 @@
+var dir_fa0f2b7ac208069fc8d28c28af349d8d =
+[
+    [ "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" ],
+    [ "dns.h", "prot_2dns_8h.html", "prot_2dns_8h" ],
+    [ "etharp.h", "lwip_2prot_2etharp_8h.html", "lwip_2prot_2etharp_8h" ],
+    [ "ethernet.h", "lwip_2prot_2ethernet_8h.html", "lwip_2prot_2ethernet_8h" ],
+    [ "iana.h", "iana_8h.html", "iana_8h" ],
+    [ "icmp.h", "prot_2icmp_8h.html", "prot_2icmp_8h" ],
+    [ "icmp6.h", "prot_2icmp6_8h.html", "prot_2icmp6_8h" ],
+    [ "ieee.h", "ieee_8h.html", "ieee_8h" ],
+    [ "igmp.h", "prot_2igmp_8h.html", "prot_2igmp_8h" ],
+    [ "ip.h", "prot_2ip_8h.html", "prot_2ip_8h" ],
+    [ "ip4.h", "prot_2ip4_8h.html", "prot_2ip4_8h" ],
+    [ "ip6.h", "prot_2ip6_8h.html", "prot_2ip6_8h" ],
+    [ "mld6.h", "prot_2mld6_8h.html", "prot_2mld6_8h" ],
+    [ "nd6.h", "prot_2nd6_8h.html", "prot_2nd6_8h" ],
+    [ "tcp.h", "prot_2tcp_8h.html", null ],
+    [ "udp.h", "prot_2udp_8h.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_fb3f7e43f39ddb210bd1444e66d055f1.html b/doc/doxygen/output/html/dir_fb3f7e43f39ddb210bd1444e66d055f1.html
new file mode 100644
index 0000000..e69a774
--- /dev/null
+++ b/doc/doxygen/output/html/dir_fb3f7e43f39ddb210bd1444e66d055f1.html
@@ -0,0 +1,152 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_fb3f7e43f39ddb210bd1444e66d055f1.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:snmp__asn1_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__asn1_8c.html">snmp_asn1.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__asn1_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__asn1_8h.html">snmp_asn1.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__core_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html">snmp_core.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__mib2_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__mib2_8c.html">snmp_mib2.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__mib2__icmp_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__mib2__icmp_8c.html">snmp_mib2_icmp.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__mib2__interfaces_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__mib2__interfaces_8c.html">snmp_mib2_interfaces.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__mib2__ip_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__mib2__ip_8c.html">snmp_mib2_ip.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__mib2__snmp_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__mib2__snmp_8c.html">snmp_mib2_snmp.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__mib2__system_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__mib2__system_8c.html">snmp_mib2_system.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__mib2__tcp_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__mib2__tcp_8c.html">snmp_mib2_tcp.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__mib2__udp_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__mib2__udp_8c.html">snmp_mib2_udp.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__msg_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__msg_8c.html">snmp_msg.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__msg_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__msg_8h.html">snmp_msg.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__netconn_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__netconn_8c.html">snmp_netconn.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__pbuf__stream_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__pbuf__stream_8c.html">snmp_pbuf_stream.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__pbuf__stream_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__pbuf__stream_8h.html">snmp_pbuf_stream.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__raw_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__raw_8c.html">snmp_raw.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__scalar_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__scalar_8c.html">snmp_scalar.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__table_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__table_8c.html">snmp_table.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__threadsync_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__threadsync_8c.html">snmp_threadsync.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmp__traps_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__traps_8c.html">snmp_traps.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmpv3_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmpv3_8c.html">snmpv3.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmpv3__mbedtls_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmpv3__mbedtls_8c.html">snmpv3_mbedtls.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:snmpv3__priv_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmpv3__priv_8h.html">snmpv3_priv.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_fb3f7e43f39ddb210bd1444e66d055f1.js b/doc/doxygen/output/html/dir_fb3f7e43f39ddb210bd1444e66d055f1.js
new file mode 100644
index 0000000..d8a9107
--- /dev/null
+++ b/doc/doxygen/output/html/dir_fb3f7e43f39ddb210bd1444e66d055f1.js
@@ -0,0 +1,27 @@
+var dir_fb3f7e43f39ddb210bd1444e66d055f1 =
+[
+    [ "snmp_asn1.c", "snmp__asn1_8c.html", "snmp__asn1_8c" ],
+    [ "snmp_asn1.h", "snmp__asn1_8h.html", "snmp__asn1_8h" ],
+    [ "snmp_core.c", "snmp__core_8c.html", "snmp__core_8c" ],
+    [ "snmp_mib2.c", "snmp__mib2_8c.html", null ],
+    [ "snmp_mib2_icmp.c", "snmp__mib2__icmp_8c.html", null ],
+    [ "snmp_mib2_interfaces.c", "snmp__mib2__interfaces_8c.html", null ],
+    [ "snmp_mib2_ip.c", "snmp__mib2__ip_8c.html", null ],
+    [ "snmp_mib2_snmp.c", "snmp__mib2__snmp_8c.html", null ],
+    [ "snmp_mib2_system.c", "snmp__mib2__system_8c.html", "snmp__mib2__system_8c" ],
+    [ "snmp_mib2_tcp.c", "snmp__mib2__tcp_8c.html", null ],
+    [ "snmp_mib2_udp.c", "snmp__mib2__udp_8c.html", null ],
+    [ "snmp_msg.c", "snmp__msg_8c.html", "snmp__msg_8c" ],
+    [ "snmp_msg.h", "snmp__msg_8h.html", "snmp__msg_8h" ],
+    [ "snmp_netconn.c", "snmp__netconn_8c.html", "snmp__netconn_8c" ],
+    [ "snmp_pbuf_stream.c", "snmp__pbuf__stream_8c.html", null ],
+    [ "snmp_pbuf_stream.h", "snmp__pbuf__stream_8h.html", null ],
+    [ "snmp_raw.c", "snmp__raw_8c.html", "snmp__raw_8c" ],
+    [ "snmp_scalar.c", "snmp__scalar_8c.html", null ],
+    [ "snmp_table.c", "snmp__table_8c.html", null ],
+    [ "snmp_threadsync.c", "snmp__threadsync_8c.html", "snmp__threadsync_8c" ],
+    [ "snmp_traps.c", "snmp__traps_8c.html", "snmp__traps_8c" ],
+    [ "snmpv3.c", "snmpv3_8c.html", null ],
+    [ "snmpv3_mbedtls.c", "snmpv3__mbedtls_8c.html", null ],
+    [ "snmpv3_priv.h", "snmpv3__priv_8h.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_fe219fca207b878205c0dd92278d118b.html b/doc/doxygen/output/html/dir_fe219fca207b878205c0dd92278d118b.html
new file mode 100644
index 0000000..632f2bd
--- /dev/null
+++ b/doc/doxygen/output/html/dir_fe219fca207b878205c0dd92278d118b.html
@@ -0,0 +1,109 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/compat/posix Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_fe219fca207b878205c0dd92278d118b.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">posix Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:compat_2posix_2netdb_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="compat_2posix_2netdb_8h.html">netdb.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</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_1e445e767c368c70d58af8a0b7552719.html">compat</a></li><li class="navelem"><a class="el" href="dir_fe219fca207b878205c0dd92278d118b.html">posix</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_fe219fca207b878205c0dd92278d118b.js b/doc/doxygen/output/html/dir_fe219fca207b878205c0dd92278d118b.js
new file mode 100644
index 0000000..e4dae3f
--- /dev/null
+++ b/doc/doxygen/output/html/dir_fe219fca207b878205c0dd92278d118b.js
@@ -0,0 +1,7 @@
+var dir_fe219fca207b878205c0dd92278d118b =
+[
+    [ "arpa", "dir_6b1b06896a870ebfb9c854c4c71f4ff5.html", "dir_6b1b06896a870ebfb9c854c4c71f4ff5" ],
+    [ "net", "dir_c62aba36f6630fea5cd7fe1c941850d4.html", "dir_c62aba36f6630fea5cd7fe1c941850d4" ],
+    [ "sys", "dir_8da39adb2a11af660bdd7075b7323870.html", "dir_8da39adb2a11af660bdd7075b7323870" ],
+    [ "netdb.h", "compat_2posix_2netdb_8h.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_febe3a637907666e8b25366ae60efc0b.html b/doc/doxygen/output/html/dir_febe3a637907666e8b25366ae60efc0b.html
new file mode 100644
index 0000000..645287e
--- /dev/null
+++ b/doc/doxygen/output/html/dir_febe3a637907666e8b25366ae60efc0b.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/mdns Directory 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dir_febe3a637907666e8b25366ae60efc0b.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">mdns Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:mdns_8c"><td class="memItemLeft" align="right" valign="top">file &#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>
+</table>
+</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="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dir_febe3a637907666e8b25366ae60efc0b.js b/doc/doxygen/output/html/dir_febe3a637907666e8b25366ae60efc0b.js
new file mode 100644
index 0000000..bf303bb
--- /dev/null
+++ b/doc/doxygen/output/html/dir_febe3a637907666e8b25366ae60efc0b.js
@@ -0,0 +1,4 @@
+var dir_febe3a637907666e8b25366ae60efc0b =
+[
+    [ "mdns.c", "mdns_8c.html", "mdns_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
new file mode 100644
index 0000000..629f997
--- /dev/null
+++ b/doc/doxygen/output/html/dns_8c.html
@@ -0,0 +1,239 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/dns.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dns_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">dns.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 &quot;<a class="el" href="def_8h.html">lwip/def.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="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="dns_8h.html">lwip/dns.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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structdns__query.html">dns_query</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="structdns__answer.html">dns_answer</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="structdns__table__entry.html">dns_table_entry</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="structdns__req__entry.html">dns_req_entry</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a9209c204996270af5cfdfd6e391267a1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dns_8c.html#a9209c204996270af5cfdfd6e391267a1">DNS_RAND_TXID</a>&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a">LWIP_RAND</a></td></tr>
+<tr class="separator:a9209c204996270af5cfdfd6e391267a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97f3b0c56aeee091fdf2f07faf864ce0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dns_8c.html#a97f3b0c56aeee091fdf2f07faf864ce0">DNS_PORT_ALLOWED</a>(port)&#160;&#160;&#160;((port) &gt;= 1024)</td></tr>
+<tr class="separator:a97f3b0c56aeee091fdf2f07faf864ce0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7f5553dc4a0d2bf99ba1282a86df31e2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dns_8c.html#a7f5553dc4a0d2bf99ba1282a86df31e2">DNS_MAX_TTL</a>&#160;&#160;&#160;604800</td></tr>
+<tr class="separator:a7f5553dc4a0d2bf99ba1282a86df31e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:adb31c3b6180773bd11f914c327f209cf"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dns_8c.html#adb31c3b6180773bd11f914c327f209cf">dns_init</a> (void)</td></tr>
+<tr class="separator:adb31c3b6180773bd11f914c327f209cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf66c5d8273f83cdc2cdd8911fb68d584"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584">dns_setserver</a> (u8_t numdns, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dnsserver)</td></tr>
+<tr class="separator:gaf66c5d8273f83cdc2cdd8911fb68d584"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad02111a6b26b93f1c3580d5f41a59af3"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dns.html#gad02111a6b26b93f1c3580d5f41a59af3">dns_getserver</a> (u8_t numdns)</td></tr>
+<tr class="separator:gad02111a6b26b93f1c3580d5f41a59af3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9389f374ec66488aa4f42a652583f533"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dns_8c.html#a9389f374ec66488aa4f42a652583f533">dns_tmr</a> (void)</td></tr>
+<tr class="separator:a9389f374ec66488aa4f42a652583f533"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1e040ec38166dc9bfcc3473aab0c799f"><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__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f">dns_gethostbyname</a> (const char *hostname, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, <a class="el" href="dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae">dns_found_callback</a> found, void *callback_arg)</td></tr>
+<tr class="separator:ga1e040ec38166dc9bfcc3473aab0c799f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae84449f60dca6b863142daca8e03ce79"><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__dns.html#gae84449f60dca6b863142daca8e03ce79">dns_gethostbyname_addrtype</a> (const char *hostname, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, <a class="el" href="dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae">dns_found_callback</a> found, void *callback_arg, u8_t dns_addrtype)</td></tr>
+<tr class="separator:gae84449f60dca6b863142daca8e03ce79"><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>DNS - host name to IP address resolver. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a7f5553dc4a0d2bf99ba1282a86df31e2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7f5553dc4a0d2bf99ba1282a86df31e2">&#9670;&nbsp;</a></span>DNS_MAX_TTL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DNS_MAX_TTL&#160;&#160;&#160;604800</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DNS resource record max. TTL (one week as default) </p>
+
+</div>
+</div>
+<a id="a97f3b0c56aeee091fdf2f07faf864ce0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a97f3b0c56aeee091fdf2f07faf864ce0">&#9670;&nbsp;</a></span>DNS_PORT_ALLOWED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DNS_PORT_ALLOWED</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">port</td><td>)</td>
+          <td>&#160;&#160;&#160;((port) &gt;= 1024)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Limits the source port to be &gt;= 1024 by default </p>
+
+</div>
+</div>
+<a id="a9209c204996270af5cfdfd6e391267a1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9209c204996270af5cfdfd6e391267a1">&#9670;&nbsp;</a></span>DNS_RAND_TXID</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DNS_RAND_TXID&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a">LWIP_RAND</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Random generator function to create random TXIDs and source ports for queries </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="adb31c3b6180773bd11f914c327f209cf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adb31c3b6180773bd11f914c327f209cf">&#9670;&nbsp;</a></span>dns_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dns_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize the resolver: set up the UDP pcb and configure the default server (if DNS_SERVER_ADDRESS is set). </p>
+
+</div>
+</div>
+<a id="a9389f374ec66488aa4f42a652583f533"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9389f374ec66488aa4f42a652583f533">&#9670;&nbsp;</a></span>dns_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dns_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The DNS resolver client timer - handle retries and timeouts and should be called every DNS_TMR_INTERVAL milliseconds (every second by default). </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="dns_8c.html">dns.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dns_8c.js b/doc/doxygen/output/html/dns_8c.js
new file mode 100644
index 0000000..a885473
--- /dev/null
+++ b/doc/doxygen/output/html/dns_8c.js
@@ -0,0 +1,16 @@
+var dns_8c =
+[
+    [ "dns_query", "structdns__query.html", null ],
+    [ "dns_answer", "structdns__answer.html", null ],
+    [ "dns_table_entry", "structdns__table__entry.html", null ],
+    [ "dns_req_entry", "structdns__req__entry.html", null ],
+    [ "DNS_MAX_TTL", "dns_8c.html#a7f5553dc4a0d2bf99ba1282a86df31e2", null ],
+    [ "DNS_PORT_ALLOWED", "dns_8c.html#a97f3b0c56aeee091fdf2f07faf864ce0", null ],
+    [ "DNS_RAND_TXID", "dns_8c.html#a9209c204996270af5cfdfd6e391267a1", null ],
+    [ "dns_gethostbyname", "group__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f", null ],
+    [ "dns_gethostbyname_addrtype", "group__dns.html#gae84449f60dca6b863142daca8e03ce79", null ],
+    [ "dns_getserver", "group__dns.html#gad02111a6b26b93f1c3580d5f41a59af3", null ],
+    [ "dns_init", "dns_8c.html#adb31c3b6180773bd11f914c327f209cf", null ],
+    [ "dns_setserver", "group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584", null ],
+    [ "dns_tmr", "dns_8c.html#a9389f374ec66488aa4f42a652583f533", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dns_8h.html b/doc/doxygen/output/html/dns_8h.html
new file mode 100644
index 0000000..dc3c8f1
--- /dev/null
+++ b/doc/doxygen/output/html/dns_8h.html
@@ -0,0 +1,221 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/dns.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('dns_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">dns.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="ip__addr_8h.html">lwip/ip_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="err_8h.html">lwip/err.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a464a7435c4c00735af59033d2acd83bb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dns_8h.html#a464a7435c4c00735af59033d2acd83bb">DNS_TMR_INTERVAL</a>&#160;&#160;&#160;1000</td></tr>
+<tr class="separator:a464a7435c4c00735af59033d2acd83bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ab5a9dec5b22802f91876c53e99f427ae"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae">dns_found_callback</a>) (const char *name, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, void *callback_arg)</td></tr>
+<tr class="separator:ab5a9dec5b22802f91876c53e99f427ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:adb31c3b6180773bd11f914c327f209cf"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dns_8h.html#adb31c3b6180773bd11f914c327f209cf">dns_init</a> (void)</td></tr>
+<tr class="separator:adb31c3b6180773bd11f914c327f209cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9389f374ec66488aa4f42a652583f533"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dns_8h.html#a9389f374ec66488aa4f42a652583f533">dns_tmr</a> (void)</td></tr>
+<tr class="separator:a9389f374ec66488aa4f42a652583f533"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf66c5d8273f83cdc2cdd8911fb68d584"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584">dns_setserver</a> (u8_t numdns, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dnsserver)</td></tr>
+<tr class="separator:gaf66c5d8273f83cdc2cdd8911fb68d584"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad02111a6b26b93f1c3580d5f41a59af3"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dns.html#gad02111a6b26b93f1c3580d5f41a59af3">dns_getserver</a> (u8_t numdns)</td></tr>
+<tr class="separator:gad02111a6b26b93f1c3580d5f41a59af3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1e040ec38166dc9bfcc3473aab0c799f"><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__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f">dns_gethostbyname</a> (const char *hostname, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, <a class="el" href="dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae">dns_found_callback</a> found, void *callback_arg)</td></tr>
+<tr class="separator:ga1e040ec38166dc9bfcc3473aab0c799f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae84449f60dca6b863142daca8e03ce79"><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__dns.html#gae84449f60dca6b863142daca8e03ce79">dns_gethostbyname_addrtype</a> (const char *hostname, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, <a class="el" href="dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae">dns_found_callback</a> found, void *callback_arg, u8_t dns_addrtype)</td></tr>
+<tr class="separator:gae84449f60dca6b863142daca8e03ce79"><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>DNS API </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a464a7435c4c00735af59033d2acd83bb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a464a7435c4c00735af59033d2acd83bb">&#9670;&nbsp;</a></span>DNS_TMR_INTERVAL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DNS_TMR_INTERVAL&#160;&#160;&#160;1000</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>lwip DNS resolver header file.</p>
+<p>Author: Jim Pettinato April 2007</p>
+<p>ported from uIP resolv.c Copyright (c) 2002-2003, Adam Dunkels.</p>
+<p>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p><ol type="1">
+<li>Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</li>
+<li>Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</li>
+<li>The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission.</li>
+</ol>
+<p>THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.DNS timer period </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="ab5a9dec5b22802f91876c53e99f427ae"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab5a9dec5b22802f91876c53e99f427ae">&#9670;&nbsp;</a></span>dns_found_callback</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* dns_found_callback) (const char *name, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, void *callback_arg)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Callback which is invoked when a hostname is found. A function of this type must be implemented by the application using the DNS resolver. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">name</td><td>pointer to the name that was looked up. </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>pointer to an ip_addr_t containing the IP address of the hostname, or NULL if the name could not be found (or on any other error). </td></tr>
+    <tr><td class="paramname">callback_arg</td><td>a user-specified callback argument passed to dns_gethostbyname </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="adb31c3b6180773bd11f914c327f209cf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adb31c3b6180773bd11f914c327f209cf">&#9670;&nbsp;</a></span>dns_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dns_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize the resolver: set up the UDP pcb and configure the default server (if DNS_SERVER_ADDRESS is set). </p>
+
+</div>
+</div>
+<a id="a9389f374ec66488aa4f42a652583f533"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9389f374ec66488aa4f42a652583f533">&#9670;&nbsp;</a></span>dns_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dns_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The DNS resolver client timer - handle retries and timeouts and should be called every DNS_TMR_INTERVAL milliseconds (every second by default). </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="dns_8h.html">dns.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/dns_8h.js b/doc/doxygen/output/html/dns_8h.js
new file mode 100644
index 0000000..ee1699e
--- /dev/null
+++ b/doc/doxygen/output/html/dns_8h.js
@@ -0,0 +1,11 @@
+var dns_8h =
+[
+    [ "DNS_TMR_INTERVAL", "dns_8h.html#a464a7435c4c00735af59033d2acd83bb", null ],
+    [ "dns_found_callback", "dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae", null ],
+    [ "dns_gethostbyname", "group__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f", null ],
+    [ "dns_gethostbyname_addrtype", "group__dns.html#gae84449f60dca6b863142daca8e03ce79", null ],
+    [ "dns_getserver", "group__dns.html#gad02111a6b26b93f1c3580d5f41a59af3", null ],
+    [ "dns_init", "dns_8h.html#adb31c3b6180773bd11f914c327f209cf", null ],
+    [ "dns_setserver", "group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584", null ],
+    [ "dns_tmr", "dns_8h.html#a9389f374ec66488aa4f42a652583f533", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/doxygen.css b/doc/doxygen/output/html/doxygen.css
new file mode 100644
index 0000000..4f1ab91
--- /dev/null
+++ b/doc/doxygen/output/html/doxygen.css
@@ -0,0 +1,1596 @@
+/* The standard CSS for doxygen 1.8.13 */
+
+body, table, div, p, dl {
+	font: 400 14px/22px Roboto,sans-serif;
+}
+
+p.reference, p.definition {
+	font: 400 14px/22px Roboto,sans-serif;
+}
+
+/* @group Heading Levels */
+
+h1.groupheader {
+	font-size: 150%;
+}
+
+.title {
+	font: 400 14px/28px Roboto,sans-serif;
+	font-size: 150%;
+	font-weight: bold;
+	margin: 10px 2px;
+}
+
+h2.groupheader {
+	border-bottom: 1px solid #879ECB;
+	color: #354C7B;
+	font-size: 150%;
+	font-weight: normal;
+	margin-top: 1.75em;
+	padding-top: 8px;
+	padding-bottom: 4px;
+	width: 100%;
+}
+
+h3.groupheader {
+	font-size: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+	-webkit-transition: text-shadow 0.5s linear;
+	-moz-transition: text-shadow 0.5s linear;
+	-ms-transition: text-shadow 0.5s linear;
+	-o-transition: text-shadow 0.5s linear;
+	transition: text-shadow 0.5s linear;
+	margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+	text-shadow: 0 0 15px cyan;
+}
+
+dt {
+	font-weight: bold;
+}
+
+div.multicol {
+	-moz-column-gap: 1em;
+	-webkit-column-gap: 1em;
+	-moz-column-count: 3;
+	-webkit-column-count: 3;
+}
+
+p.startli, p.startdd {
+	margin-top: 2px;
+}
+
+p.starttd {
+	margin-top: 0px;
+}
+
+p.endli {
+	margin-bottom: 0px;
+}
+
+p.enddd {
+	margin-bottom: 4px;
+}
+
+p.endtd {
+	margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+	font-weight: bold;
+}
+
+span.legend {
+        font-size: 70%;
+        text-align: center;
+}
+
+h3.version {
+        font-size: 90%;
+        text-align: center;
+}
+
+div.qindex, div.navtab{
+	background-color: #EBEFF6;
+	border: 1px solid #A3B4D7;
+	text-align: center;
+}
+
+div.qindex, div.navpath {
+	width: 100%;
+	line-height: 140%;
+}
+
+div.navtab {
+	margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+	color: #3D578C;
+	font-weight: normal;
+	text-decoration: none;
+}
+
+.contents a:visited {
+	color: #4665A2;
+}
+
+a:hover {
+	text-decoration: underline;
+}
+
+a.qindex {
+	font-weight: bold;
+}
+
+a.qindexHL {
+	font-weight: bold;
+	background-color: #9CAFD4;
+	color: #ffffff;
+	border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+        color: #ffffff;
+}
+
+a.el {
+	font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited, a.line, a.line:visited {
+	color: #4665A2; 
+}
+
+a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
+	color: #4665A2; 
+}
+
+/* @end */
+
+dl.el {
+	margin-left: -1cm;
+}
+
+pre.fragment {
+        border: 1px solid #C4CFE5;
+        background-color: #FBFCFD;
+        padding: 4px 6px;
+        margin: 4px 8px 4px 2px;
+        overflow: auto;
+        word-wrap: break-word;
+        font-size:  9pt;
+        line-height: 125%;
+        font-family: monospace, fixed;
+        font-size: 105%;
+}
+
+div.fragment {
+        padding: 0px;
+        margin: 4px 8px 4px 2px;
+	background-color: #FBFCFD;
+	border: 1px solid #C4CFE5;
+}
+
+div.line {
+	font-family: monospace, fixed;
+        font-size: 13px;
+	min-height: 13px;
+	line-height: 1.0;
+	text-wrap: unrestricted;
+	white-space: -moz-pre-wrap; /* Moz */
+	white-space: -pre-wrap;     /* Opera 4-6 */
+	white-space: -o-pre-wrap;   /* Opera 7 */
+	white-space: pre-wrap;      /* CSS3  */
+	word-wrap: break-word;      /* IE 5.5+ */
+	text-indent: -53px;
+	padding-left: 53px;
+	padding-bottom: 0px;
+	margin: 0px;
+	-webkit-transition-property: background-color, box-shadow;
+	-webkit-transition-duration: 0.5s;
+	-moz-transition-property: background-color, box-shadow;
+	-moz-transition-duration: 0.5s;
+	-ms-transition-property: background-color, box-shadow;
+	-ms-transition-duration: 0.5s;
+	-o-transition-property: background-color, box-shadow;
+	-o-transition-duration: 0.5s;
+	transition-property: background-color, box-shadow;
+	transition-duration: 0.5s;
+}
+
+div.line:after {
+    content:"\000A";
+    white-space: pre;
+}
+
+div.line.glow {
+	background-color: cyan;
+	box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+	padding-right: 4px;
+	text-align: right;
+	border-right: 2px solid #0F0;
+	background-color: #E8E8E8;
+        white-space: pre;
+}
+span.lineno a {
+	background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+	background-color: #C8C8C8;
+}
+
+.lineno {
+	-webkit-touch-callout: none;
+	-webkit-user-select: none;
+	-khtml-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+}
+
+div.ah, span.ah {
+	background-color: black;
+	font-weight: bold;
+	color: #ffffff;
+	margin-bottom: 3px;
+	margin-top: 3px;
+	padding: 0.2em;
+	border: solid thin #333;
+	border-radius: 0.5em;
+	-webkit-border-radius: .5em;
+	-moz-border-radius: .5em;
+	box-shadow: 2px 2px 3px #999;
+	-webkit-box-shadow: 2px 2px 3px #999;
+	-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+	background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+	background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%);
+}
+
+div.classindex ul {
+        list-style: none;
+        padding-left: 0;
+}
+
+div.classindex span.ai {
+        display: inline-block;
+}
+
+div.groupHeader {
+	margin-left: 16px;
+	margin-top: 12px;
+	font-weight: bold;
+}
+
+div.groupText {
+	margin-left: 16px;
+	font-style: italic;
+}
+
+body {
+	background-color: white;
+	color: black;
+        margin: 0;
+}
+
+div.contents {
+	margin-top: 10px;
+	margin-left: 12px;
+	margin-right: 8px;
+}
+
+td.indexkey {
+	background-color: #EBEFF6;
+	font-weight: bold;
+	border: 1px solid #C4CFE5;
+	margin: 2px 0px 2px 0;
+	padding: 2px 10px;
+        white-space: nowrap;
+        vertical-align: top;
+}
+
+td.indexvalue {
+	background-color: #EBEFF6;
+	border: 1px solid #C4CFE5;
+	padding: 2px 10px;
+	margin: 2px 0px;
+}
+
+tr.memlist {
+	background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+	text-align: center;
+}
+
+img.formulaDsp {
+	
+}
+
+img.formulaInl {
+	vertical-align: middle;
+}
+
+div.center {
+	text-align: center;
+        margin-top: 0px;
+        margin-bottom: 0px;
+        padding: 0px;
+}
+
+div.center img {
+	border: 0px;
+}
+
+address.footer {
+	text-align: right;
+	padding-right: 12px;
+}
+
+img.footer {
+	border: 0px;
+	vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+	color: #008000
+}
+
+span.keywordtype {
+	color: #604020
+}
+
+span.keywordflow {
+	color: #e08000
+}
+
+span.comment {
+	color: #800000
+}
+
+span.preprocessor {
+	color: #806020
+}
+
+span.stringliteral {
+	color: #002080
+}
+
+span.charliteral {
+	color: #008080
+}
+
+span.vhdldigit { 
+	color: #ff00ff 
+}
+
+span.vhdlchar { 
+	color: #000000 
+}
+
+span.vhdlkeyword { 
+	color: #700070 
+}
+
+span.vhdllogic { 
+	color: #ff0000 
+}
+
+blockquote {
+        background-color: #F7F8FB;
+        border-left: 2px solid #9CAFD4;
+        margin: 0 24px 0 4px;
+        padding: 0 12px 0 16px;
+}
+
+/* @end */
+
+/*
+.search {
+	color: #003399;
+	font-weight: bold;
+}
+
+form.search {
+	margin-bottom: 0px;
+	margin-top: 0px;
+}
+
+input.search {
+	font-size: 75%;
+	color: #000080;
+	font-weight: normal;
+	background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+	font-size: 75%;
+}
+
+.dirtab {
+	padding: 4px;
+	border-collapse: collapse;
+	border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+	background: #EBEFF6;
+	font-weight: bold;
+}
+
+hr {
+	height: 0px;
+	border: none;
+	border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+	height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+	border-spacing: 0px;
+	padding: 0px;
+}
+
+.memberdecls td, .fieldtable tr {
+	-webkit-transition-property: background-color, box-shadow;
+	-webkit-transition-duration: 0.5s;
+	-moz-transition-property: background-color, box-shadow;
+	-moz-transition-duration: 0.5s;
+	-ms-transition-property: background-color, box-shadow;
+	-ms-transition-duration: 0.5s;
+	-o-transition-property: background-color, box-shadow;
+	-o-transition-duration: 0.5s;
+	transition-property: background-color, box-shadow;
+	transition-duration: 0.5s;
+}
+
+.memberdecls td.glow, .fieldtable tr.glow {
+	background-color: cyan;
+	box-shadow: 0 0 15px cyan;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+	background-color: #F9FAFC;
+	border: none;
+	margin: 4px;
+	padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+	padding: 0px 8px 4px 8px;
+	color: #555;
+}
+
+.memSeparator {
+        border-bottom: 1px solid #DEE4F0;
+        line-height: 1px;
+        margin: 0px;
+        padding: 0px;
+}
+
+.memItemLeft, .memTemplItemLeft {
+        white-space: nowrap;
+}
+
+.memItemRight {
+	width: 100%;
+}
+
+.memTemplParams {
+	color: #4665A2;
+        white-space: nowrap;
+	font-size: 80%;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtitle {
+	padding: 8px;
+	border-top: 1px solid #A8B8D9;
+	border-left: 1px solid #A8B8D9;
+	border-right: 1px solid #A8B8D9;
+	border-top-right-radius: 4px;
+	border-top-left-radius: 4px;
+	margin-bottom: -1px;
+	background-image: url('nav_f.png');
+	background-repeat: repeat-x;
+	background-color: #E2E8F2;
+	line-height: 1.25;
+	font-weight: 300;
+	float:left;
+}
+
+.permalink
+{
+        font-size: 65%;
+        display: inline-block;
+        vertical-align: middle;
+}
+
+.memtemplate {
+	font-size: 80%;
+	color: #4665A2;
+	font-weight: normal;
+	margin-left: 9px;
+}
+
+.memnav {
+	background-color: #EBEFF6;
+	border: 1px solid #A3B4D7;
+	text-align: center;
+	margin: 2px;
+	margin-right: 15px;
+	padding: 2px;
+}
+
+.mempage {
+	width: 100%;
+}
+
+.memitem {
+	padding: 0;
+	margin-bottom: 10px;
+	margin-right: 5px;
+        -webkit-transition: box-shadow 0.5s linear;
+        -moz-transition: box-shadow 0.5s linear;
+        -ms-transition: box-shadow 0.5s linear;
+        -o-transition: box-shadow 0.5s linear;
+        transition: box-shadow 0.5s linear;
+        display: table !important;
+        width: 100%;
+}
+
+.memitem.glow {
+         box-shadow: 0 0 15px cyan;
+}
+
+.memname {
+        font-weight: 400;
+        margin-left: 6px;
+}
+
+.memname td {
+	vertical-align: bottom;
+}
+
+.memproto, dl.reflist dt {
+        border-top: 1px solid #A8B8D9;
+        border-left: 1px solid #A8B8D9;
+        border-right: 1px solid #A8B8D9;
+        padding: 6px 0px 6px 0px;
+        color: #253555;
+        font-weight: bold;
+        text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+        background-color: #DFE5F1;
+        /* opera specific markup */
+        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        border-top-right-radius: 4px;
+        /* firefox specific markup */
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        -moz-border-radius-topright: 4px;
+        /* webkit specific markup */
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        -webkit-border-top-right-radius: 4px;
+
+}
+
+.overload {
+        font-family: "courier new",courier,monospace;
+	font-size: 65%;
+}
+
+.memdoc, dl.reflist dd {
+        border-bottom: 1px solid #A8B8D9;      
+        border-left: 1px solid #A8B8D9;      
+        border-right: 1px solid #A8B8D9; 
+        padding: 6px 10px 2px 10px;
+        background-color: #FBFCFD;
+        border-top-width: 0;
+        background-image:url('nav_g.png');
+        background-repeat:repeat-x;
+        background-color: #FFFFFF;
+        /* opera specific markup */
+        border-bottom-left-radius: 4px;
+        border-bottom-right-radius: 4px;
+        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        /* firefox specific markup */
+        -moz-border-radius-bottomleft: 4px;
+        -moz-border-radius-bottomright: 4px;
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        /* webkit specific markup */
+        -webkit-border-bottom-left-radius: 4px;
+        -webkit-border-bottom-right-radius: 4px;
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+dl.reflist dt {
+        padding: 5px;
+}
+
+dl.reflist dd {
+        margin: 0px 0px 10px 0px;
+        padding: 5px;
+}
+
+.paramkey {
+	text-align: right;
+}
+
+.paramtype {
+	white-space: nowrap;
+}
+
+.paramname {
+	color: #602020;
+	white-space: nowrap;
+}
+.paramname em {
+	font-style: normal;
+}
+.paramname code {
+        line-height: 14px;
+}
+
+.params, .retval, .exception, .tparams {
+        margin-left: 0px;
+        padding-left: 0px;
+}       
+
+.params .paramname, .retval .paramname {
+        font-weight: bold;
+        vertical-align: top;
+}
+        
+.params .paramtype {
+        font-style: italic;
+        vertical-align: top;
+}       
+        
+.params .paramdir {
+        font-family: "courier new",courier,monospace;
+        vertical-align: top;
+}
+
+table.mlabels {
+	border-spacing: 0px;
+}
+
+td.mlabels-left {
+	width: 100%;
+	padding: 0px;
+}
+
+td.mlabels-right {
+	vertical-align: bottom;
+	padding: 0px;
+	white-space: nowrap;
+}
+
+span.mlabels {
+        margin-left: 8px;
+}
+
+span.mlabel {
+        background-color: #728DC1;
+        border-top:1px solid #5373B4;
+        border-left:1px solid #5373B4;
+        border-right:1px solid #C4CFE5;
+        border-bottom:1px solid #C4CFE5;
+	text-shadow: none;
+	color: white;
+	margin-right: 4px;
+	padding: 2px 3px;
+	border-radius: 3px;
+	font-size: 7pt;
+	white-space: nowrap;
+	vertical-align: middle;
+}
+
+
+
+/* @end */
+
+/* these are for tree view inside a (index) page */
+
+div.directory {
+        margin: 10px 0px;
+        border-top: 1px solid #9CAFD4;
+        border-bottom: 1px solid #9CAFD4;
+        width: 100%;
+}
+
+.directory table {
+        border-collapse:collapse;
+}
+
+.directory td {
+        margin: 0px;
+        padding: 0px;
+	vertical-align: top;
+}
+
+.directory td.entry {
+        white-space: nowrap;
+        padding-right: 6px;
+	padding-top: 3px;
+}
+
+.directory td.entry a {
+        outline:none;
+}
+
+.directory td.entry a img {
+        border: none;
+}
+
+.directory td.desc {
+        width: 100%;
+        padding-left: 6px;
+	padding-right: 6px;
+	padding-top: 3px;
+	border-left: 1px solid rgba(0,0,0,0.05);
+}
+
+.directory tr.even {
+	padding-left: 6px;
+	background-color: #F7F8FB;
+}
+
+.directory img {
+	vertical-align: -30%;
+}
+
+.directory .levels {
+        white-space: nowrap;
+        width: 100%;
+        text-align: right;
+        font-size: 9pt;
+}
+
+.directory .levels span {
+        cursor: pointer;
+        padding-left: 2px;
+        padding-right: 2px;
+	color: #3D578C;
+}
+
+.arrow {
+    color: #9CAFD4;
+    -webkit-user-select: none;
+    -khtml-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+    cursor: pointer;
+    font-size: 80%;
+    display: inline-block;
+    width: 16px;
+    height: 22px;
+}
+
+.icon {
+    font-family: Arial, Helvetica;
+    font-weight: bold;
+    font-size: 12px;
+    height: 14px;
+    width: 16px;
+    display: inline-block;
+    background-color: #728DC1;
+    color: white;
+    text-align: center;
+    border-radius: 4px;
+    margin-left: 2px;
+    margin-right: 2px;
+}
+
+.icona {
+    width: 24px;
+    height: 22px;
+    display: inline-block;
+}
+
+.iconfopen {
+    width: 24px;
+    height: 18px;
+    margin-bottom: 4px;
+    background-image:url('folderopen.png');
+    background-position: 0px -4px;
+    background-repeat: repeat-y;
+    vertical-align:top;
+    display: inline-block;
+}
+
+.iconfclosed {
+    width: 24px;
+    height: 18px;
+    margin-bottom: 4px;
+    background-image:url('folderclosed.png');
+    background-position: 0px -4px;
+    background-repeat: repeat-y;
+    vertical-align:top;
+    display: inline-block;
+}
+
+.icondoc {
+    width: 24px;
+    height: 18px;
+    margin-bottom: 4px;
+    background-image:url('doc.png');
+    background-position: 0px -4px;
+    background-repeat: repeat-y;
+    vertical-align:top;
+    display: inline-block;
+}
+
+table.directory {
+    font: 400 14px Roboto,sans-serif;
+}
+
+/* @end */
+
+div.dynheader {
+        margin-top: 8px;
+	-webkit-touch-callout: none;
+	-webkit-user-select: none;
+	-khtml-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+}
+
+address {
+	font-style: normal;
+	color: #2A3D61;
+}
+
+table.doxtable caption {
+	caption-side: top;
+}
+
+table.doxtable {
+	border-collapse:collapse;
+        margin-top: 4px;
+        margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+	border: 1px solid #2D4068;
+	padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+	background-color: #374F7F;
+	color: #FFFFFF;
+	font-size: 110%;
+	padding-bottom: 4px;
+	padding-top: 5px;
+}
+
+table.fieldtable {
+        /*width: 100%;*/
+        margin-bottom: 10px;
+        border: 1px solid #A8B8D9;
+        border-spacing: 0px;
+        -moz-border-radius: 4px;
+        -webkit-border-radius: 4px;
+        border-radius: 4px;
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+        -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+        box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+        padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+        white-space: nowrap;
+        border-right: 1px solid #A8B8D9;
+        border-bottom: 1px solid #A8B8D9;
+        vertical-align: top;
+}
+
+.fieldtable td.fieldname {
+        padding-top: 3px;
+}
+
+.fieldtable td.fielddoc {
+        border-bottom: 1px solid #A8B8D9;
+        /*width: 100%;*/
+}
+
+.fieldtable td.fielddoc p:first-child {
+        margin-top: 0px;
+}       
+        
+.fieldtable td.fielddoc p:last-child {
+        margin-bottom: 2px;
+}
+
+.fieldtable tr:last-child td {
+        border-bottom: none;
+}
+
+.fieldtable th {
+        background-image:url('nav_f.png');
+        background-repeat:repeat-x;
+        background-color: #E2E8F2;
+        font-size: 90%;
+        color: #253555;
+        padding-bottom: 4px;
+        padding-top: 5px;
+        text-align:left;
+        font-weight: 400;
+        -moz-border-radius-topleft: 4px;
+        -moz-border-radius-topright: 4px;
+        -webkit-border-top-left-radius: 4px;
+        -webkit-border-top-right-radius: 4px;
+        border-top-left-radius: 4px;
+        border-top-right-radius: 4px;
+        border-bottom: 1px solid #A8B8D9;
+}
+
+
+.tabsearch {
+	top: 0px;
+	left: 10px;
+	height: 36px;
+	background-image: url('tab_b.png');
+	z-index: 101;
+	overflow: hidden;
+	font-size: 13px;
+}
+
+.navpath ul
+{
+	font-size: 11px;
+	background-image:url('tab_b.png');
+	background-repeat:repeat-x;
+	background-position: 0 -5px;
+	height:30px;
+	line-height:30px;
+	color:#8AA0CC;
+	border:solid 1px #C2CDE4;
+	overflow:hidden;
+	margin:0px;
+	padding:0px;
+}
+
+.navpath li
+{
+	list-style-type:none;
+	float:left;
+	padding-left:10px;
+	padding-right:15px;
+	background-image:url('bc_s.png');
+	background-repeat:no-repeat;
+	background-position:right;
+	color:#364D7C;
+}
+
+.navpath li.navelem a
+{
+	height:32px;
+	display:block;
+	text-decoration: none;
+	outline: none;
+	color: #283A5D;
+	font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+	text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+	text-decoration: none;        
+}
+
+.navpath li.navelem a:hover
+{
+	color:#6884BD;
+}
+
+.navpath li.footer
+{
+        list-style-type:none;
+        float:right;
+        padding-left:10px;
+        padding-right:15px;
+        background-image:none;
+        background-repeat:no-repeat;
+        background-position:right;
+        color:#364D7C;
+        font-size: 8pt;
+}
+
+
+div.summary
+{
+	float: right;
+	font-size: 8pt;
+	padding-right: 5px;
+	width: 50%;
+	text-align: right;
+}       
+
+div.summary a
+{
+	white-space: nowrap;
+}
+
+table.classindex
+{
+        margin: 10px;
+        white-space: nowrap;
+        margin-left: 3%;
+        margin-right: 3%;
+        width: 94%;
+        border: 0;
+        border-spacing: 0; 
+        padding: 0;
+}
+
+div.ingroups
+{
+	font-size: 8pt;
+	width: 50%;
+	text-align: left;
+}
+
+div.ingroups a
+{
+	white-space: nowrap;
+}
+
+div.header
+{
+        background-image:url('nav_h.png');
+        background-repeat:repeat-x;
+	background-color: #F9FAFC;
+	margin:  0px;
+	border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+	padding: 5px 5px 5px 10px;
+}
+
+dl
+{
+        padding: 0 0 0 10px;
+}
+
+/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */
+dl.section
+{
+	margin-left: 0px;
+	padding-left: 0px;
+}
+
+dl.note
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #D0C000;
+}
+
+dl.warning, dl.attention
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #00D000;
+}
+
+dl.deprecated
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #505050;
+}
+
+dl.todo
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #00C0E0;
+}
+
+dl.test
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #3030E0;
+}
+
+dl.bug
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #C08050;
+}
+
+dl.section dd {
+	margin-bottom: 6px;
+}
+
+
+#projectlogo
+{
+	text-align: center;
+	vertical-align: bottom;
+	border-collapse: separate;
+}
+ 
+#projectlogo img
+{ 
+	border: 0px none;
+}
+ 
+#projectalign
+{
+        vertical-align: middle;
+}
+
+#projectname
+{
+	font: 300% Tahoma, Arial,sans-serif;
+	margin: 0px;
+	padding: 2px 0px;
+}
+    
+#projectbrief
+{
+	font: 120% Tahoma, Arial,sans-serif;
+	margin: 0px;
+	padding: 0px;
+}
+
+#projectnumber
+{
+	font: 50% Tahoma, Arial,sans-serif;
+	margin: 0px;
+	padding: 0px;
+}
+
+#titlearea
+{
+	padding: 0px;
+	margin: 0px;
+	width: 100%;
+	border-bottom: 1px solid #5373B4;
+}
+
+.image
+{
+        text-align: center;
+}
+
+.dotgraph
+{
+        text-align: center;
+}
+
+.mscgraph
+{
+        text-align: center;
+}
+
+.plantumlgraph
+{
+        text-align: center;
+}
+
+.diagraph
+{
+        text-align: center;
+}
+
+.caption
+{
+	font-weight: bold;
+}
+
+div.zoom
+{
+	border: 1px solid #90A5CE;
+}
+
+dl.citelist {
+        margin-bottom:50px;
+}
+
+dl.citelist dt {
+        color:#334975;
+        float:left;
+        font-weight:bold;
+        margin-right:10px;
+        padding:5px;
+}
+
+dl.citelist dd {
+        margin:2px 0;
+        padding:5px 0;
+}
+
+div.toc {
+        padding: 14px 25px;
+        background-color: #F4F6FA;
+        border: 1px solid #D8DFEE;
+        border-radius: 7px 7px 7px 7px;
+        float: right;
+        height: auto;
+        margin: 0 8px 10px 10px;
+        width: 200px;
+}
+
+div.toc li {
+        background: url("bdwn.png") no-repeat scroll 0 5px transparent;
+        font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+        margin-top: 5px;
+        padding-left: 10px;
+        padding-top: 2px;
+}
+
+div.toc h3 {
+        font: bold 12px/1.2 Arial,FreeSans,sans-serif;
+	color: #4665A2;
+        border-bottom: 0 none;
+        margin: 0;
+}
+
+div.toc ul {
+        list-style: none outside none;
+        border: medium none;
+        padding: 0px;
+}       
+
+div.toc li.level1 {
+        margin-left: 0px;
+}
+
+div.toc li.level2 {
+        margin-left: 15px;
+}
+
+div.toc li.level3 {
+        margin-left: 30px;
+}
+
+div.toc li.level4 {
+        margin-left: 45px;
+}
+
+.inherit_header {
+        font-weight: bold;
+        color: gray;
+        cursor: pointer;
+	-webkit-touch-callout: none;
+	-webkit-user-select: none;
+	-khtml-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+}
+
+.inherit_header td {
+        padding: 6px 0px 2px 5px;
+}
+
+.inherit {
+        display: none;
+}
+
+tr.heading h2 {
+        margin-top: 12px;
+        margin-bottom: 4px;
+}
+
+/* tooltip related style info */
+
+.ttc {
+        position: absolute;
+        display: none;
+}
+
+#powerTip {
+	cursor: default;
+	white-space: nowrap;
+	background-color: white;
+	border: 1px solid gray;
+	border-radius: 4px 4px 4px 4px;
+	box-shadow: 1px 1px 7px gray;
+	display: none;
+	font-size: smaller;
+	max-width: 80%;
+	opacity: 0.9;
+	padding: 1ex 1em 1em;
+	position: absolute;
+	z-index: 2147483647;
+}
+
+#powerTip div.ttdoc {
+        color: grey;
+	font-style: italic;
+}
+
+#powerTip div.ttname a {
+        font-weight: bold;
+}
+
+#powerTip div.ttname {
+        font-weight: bold;
+}
+
+#powerTip div.ttdeci {
+        color: #006318;
+}
+
+#powerTip div {
+        margin: 0px;
+        padding: 0px;
+        font: 12px/16px Roboto,sans-serif;
+}
+
+#powerTip:before, #powerTip:after {
+	content: "";
+	position: absolute;
+	margin: 0px;
+}
+
+#powerTip.n:after,  #powerTip.n:before,
+#powerTip.s:after,  #powerTip.s:before,
+#powerTip.w:after,  #powerTip.w:before,
+#powerTip.e:after,  #powerTip.e:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.nw:after, #powerTip.nw:before,
+#powerTip.sw:after, #powerTip.sw:before {
+	border: solid transparent;
+	content: " ";
+	height: 0;
+	width: 0;
+	position: absolute;
+}
+
+#powerTip.n:after,  #powerTip.s:after,
+#powerTip.w:after,  #powerTip.e:after,
+#powerTip.nw:after, #powerTip.ne:after,
+#powerTip.sw:after, #powerTip.se:after {
+	border-color: rgba(255, 255, 255, 0);
+}
+
+#powerTip.n:before,  #powerTip.s:before,
+#powerTip.w:before,  #powerTip.e:before,
+#powerTip.nw:before, #powerTip.ne:before,
+#powerTip.sw:before, #powerTip.se:before {
+	border-color: rgba(128, 128, 128, 0);
+}
+
+#powerTip.n:after,  #powerTip.n:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.nw:after, #powerTip.nw:before {
+	top: 100%;
+}
+
+#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {
+	border-top-color: #ffffff;
+	border-width: 10px;
+	margin: 0px -10px;
+}
+#powerTip.n:before {
+	border-top-color: #808080;
+	border-width: 11px;
+	margin: 0px -11px;
+}
+#powerTip.n:after, #powerTip.n:before {
+	left: 50%;
+}
+
+#powerTip.nw:after, #powerTip.nw:before {
+	right: 14px;
+}
+
+#powerTip.ne:after, #powerTip.ne:before {
+	left: 14px;
+}
+
+#powerTip.s:after,  #powerTip.s:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.sw:after, #powerTip.sw:before {
+	bottom: 100%;
+}
+
+#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {
+	border-bottom-color: #ffffff;
+	border-width: 10px;
+	margin: 0px -10px;
+}
+
+#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {
+	border-bottom-color: #808080;
+	border-width: 11px;
+	margin: 0px -11px;
+}
+
+#powerTip.s:after, #powerTip.s:before {
+	left: 50%;
+}
+
+#powerTip.sw:after, #powerTip.sw:before {
+	right: 14px;
+}
+
+#powerTip.se:after, #powerTip.se:before {
+	left: 14px;
+}
+
+#powerTip.e:after, #powerTip.e:before {
+	left: 100%;
+}
+#powerTip.e:after {
+	border-left-color: #ffffff;
+	border-width: 10px;
+	top: 50%;
+	margin-top: -10px;
+}
+#powerTip.e:before {
+	border-left-color: #808080;
+	border-width: 11px;
+	top: 50%;
+	margin-top: -11px;
+}
+
+#powerTip.w:after, #powerTip.w:before {
+	right: 100%;
+}
+#powerTip.w:after {
+	border-right-color: #ffffff;
+	border-width: 10px;
+	top: 50%;
+	margin-top: -10px;
+}
+#powerTip.w:before {
+	border-right-color: #808080;
+	border-width: 11px;
+	top: 50%;
+	margin-top: -11px;
+}
+
+@media print
+{
+  #top { display: none; }
+  #side-nav { display: none; }
+  #nav-path { display: none; }
+  body { overflow:visible; }
+  h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+  .summary { display: none; }
+  .memitem { page-break-inside: avoid; }
+  #doc-content
+  {
+    margin-left:0 !important;
+    height:auto !important;
+    width:auto !important;
+    overflow:inherit;
+    display:inline;
+  }
+}
+
+/* @group Markdown */
+
+/*
+table.markdownTable {
+	border-collapse:collapse;
+        margin-top: 4px;
+        margin-bottom: 4px;
+}
+
+table.markdownTable td, table.markdownTable th {
+	border: 1px solid #2D4068;
+	padding: 3px 7px 2px;
+}
+
+table.markdownTableHead tr {
+}
+
+table.markdownTableBodyLeft td, table.markdownTable th {
+	border: 1px solid #2D4068;
+	padding: 3px 7px 2px;
+}
+
+th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone {
+	background-color: #374F7F;
+	color: #FFFFFF;
+	font-size: 110%;
+	padding-bottom: 4px;
+	padding-top: 5px;
+}
+
+th.markdownTableHeadLeft {
+	text-align: left
+}
+
+th.markdownTableHeadRight {
+	text-align: right
+}
+
+th.markdownTableHeadCenter {
+	text-align: center
+}
+*/
+
+table.markdownTable {
+	border-collapse:collapse;
+        margin-top: 4px;
+        margin-bottom: 4px;
+}
+
+table.markdownTable td, table.markdownTable th {
+	border: 1px solid #2D4068;
+	padding: 3px 7px 2px;
+}
+
+table.markdownTable tr {
+}
+
+th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone {
+	background-color: #374F7F;
+	color: #FFFFFF;
+	font-size: 110%;
+	padding-bottom: 4px;
+	padding-top: 5px;
+}
+
+th.markdownTableHeadLeft, td.markdownTableBodyLeft {
+	text-align: left
+}
+
+th.markdownTableHeadRight, td.markdownTableBodyRight {
+	text-align: right
+}
+
+th.markdownTableHeadCenter, td.markdownTableBodyCenter {
+	text-align: center
+}
+
+
+/* @end */
diff --git a/doc/doxygen/output/html/dynsections.js b/doc/doxygen/output/html/dynsections.js
new file mode 100644
index 0000000..85e1836
--- /dev/null
+++ b/doc/doxygen/output/html/dynsections.js
@@ -0,0 +1,97 @@
+function toggleVisibility(linkObj)
+{
+ var base = $(linkObj).attr('id');
+ var summary = $('#'+base+'-summary');
+ var content = $('#'+base+'-content');
+ var trigger = $('#'+base+'-trigger');
+ var src=$(trigger).attr('src');
+ if (content.is(':visible')===true) {
+   content.hide();
+   summary.show();
+   $(linkObj).addClass('closed').removeClass('opened');
+   $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+   content.show();
+   summary.hide();
+   $(linkObj).removeClass('closed').addClass('opened');
+   $(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
+ } 
+ return false;
+}
+
+function updateStripes()
+{
+  $('table.directory tr').
+       removeClass('even').filter(':visible:even').addClass('even');
+}
+
+function toggleLevel(level)
+{
+  $('table.directory tr').each(function() {
+    var l = this.id.split('_').length-1;
+    var i = $('#img'+this.id.substring(3));
+    var a = $('#arr'+this.id.substring(3));
+    if (l<level+1) {
+      i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
+      a.html('&#9660;');
+      $(this).show();
+    } else if (l==level+1) {
+      i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
+      a.html('&#9658;');
+      $(this).show();
+    } else {
+      $(this).hide();
+    }
+  });
+  updateStripes();
+}
+
+function toggleFolder(id)
+{
+  // the clicked row
+  var currentRow = $('#row_'+id);
+
+  // all rows after the clicked row
+  var rows = currentRow.nextAll("tr");
+
+  var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
+
+  // only match elements AFTER this one (can't hide elements before)
+  var childRows = rows.filter(function() { return this.id.match(re); });
+
+  // first row is visible we are HIDING
+  if (childRows.filter(':first').is(':visible')===true) {
+    // replace down arrow by right arrow for current row
+    var currentRowSpans = currentRow.find("span");
+    currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
+    currentRowSpans.filter(".arrow").html('&#9658;');
+    rows.filter("[id^=row_"+id+"]").hide(); // hide all children
+  } else { // we are SHOWING
+    // replace right arrow by down arrow for current row
+    var currentRowSpans = currentRow.find("span");
+    currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
+    currentRowSpans.filter(".arrow").html('&#9660;');
+    // replace down arrows by right arrows for child rows
+    var childRowsSpans = childRows.find("span");
+    childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
+    childRowsSpans.filter(".arrow").html('&#9658;');
+    childRows.show(); //show all children
+  }
+  updateStripes();
+}
+
+
+function toggleInherit(id)
+{
+  var rows = $('tr.inherit.'+id);
+  var img = $('tr.inherit_header.'+id+' img');
+  var src = $(img).attr('src');
+  if (rows.filter(':first').is(':visible')===true) {
+    rows.css('display','none');
+    $(img).attr('src',src.substring(0,src.length-8)+'closed.png');
+  } else {
+    rows.css('display','table-row'); // using show() causes jump in firefox
+    $(img).attr('src',src.substring(0,src.length-10)+'open.png');
+  }
+}
+
diff --git a/doc/doxygen/output/html/err_8c.html b/doc/doxygen/output/html/err_8c.html
new file mode 100644
index 0000000..70709ec
--- /dev/null
+++ b/doc/doxygen/output/html/err_8c.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/api/err.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('err_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">err.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="err_8h.html">lwip/err.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="sys_8h.html">lwip/sys.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="lwip_2errno_8h.html">lwip/errno.h</a>&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Error Management module </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_da61e3e9a357748887e3ca8d7c5a0c16.html">api</a></li><li class="navelem"><a class="el" href="err_8c.html">err.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/err_8h.html b/doc/doxygen/output/html/err_8h.html
new file mode 100644
index 0000000..d4526d5
--- /dev/null
+++ b/doc/doxygen/output/html/err_8h.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/err.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('err_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#enum-members">Enumerations</a>  </div>
+  <div class="headertitle">
+<div class="title">err.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="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gaf02d9da80fd66b4f986d2c53d7231ddb"><td class="memItemLeft" align="right" valign="top">typedef s8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a></td></tr>
+<tr class="separator:gaf02d9da80fd66b4f986d2c53d7231ddb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:gae2e66c7d13afc90ffecd6151680fbadc"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__infrastructure__errors.html#gae2e66c7d13afc90ffecd6151680fbadc">err_enum_t</a> { <br />
+&#160;&#160;<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb">ERR_OK</a> = 0, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaaaeafdbf3aecc46864daa3cd829c7e05">ERR_MEM</a> = -1, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca05c91366f1b5203a5db9a241b415cd63">ERR_BUF</a> = -2, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcac568baeb6407ef5e2630084ccbc34be8">ERR_TIMEOUT</a> = -3, 
+<br />
+&#160;&#160;<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca9448893187313c0c5a502ca9a9ad1c2a">ERR_RTE</a> = -4, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca13e1dd0edca8a27b6abdf1524bde7929">ERR_INPROGRESS</a> = -5, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa9a1c5a6fdeed0aad7fe41d538482bbd">ERR_VAL</a> = -6, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab9dcf89d46668b072192278fb907b7ad">ERR_WOULDBLOCK</a> = -7, 
+<br />
+&#160;&#160;<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca4ebdc2aa1dbd75f927845733a3fb1f8b">ERR_USE</a> = -8, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcae6f9c1e4c18ca844f7934307d4cc30e5">ERR_ALREADY</a> = -9, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca8543e1d6422fed7b318d97e08dcbaa33">ERR_ISCONN</a> = -10, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab0036c51817b5200bfe8157cc4115b27">ERR_CONN</a> = -11, 
+<br />
+&#160;&#160;<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca7d61d90449ae6788575e8e46d5d3bbc6">ERR_IF</a> = -12, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaf316b2c5eee4079820f7100849115142">ERR_ABRT</a> = -13, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca759030525f1768a23dc086a5fd45b4e5">ERR_RST</a> = -14, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa5176d9fecf8ec43d3bc49f4e6c3f7f5">ERR_CLSD</a> = -15, 
+<br />
+&#160;&#160;<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab508ce0ebdf3ca735208b00a80a45c91">ERR_ARG</a> = -16
+<br />
+ }</td></tr>
+<tr class="separator:gae2e66c7d13afc90ffecd6151680fbadc"><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>lwIP Error codes </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="err_8h.html">err.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/err_8h.js b/doc/doxygen/output/html/err_8h.js
new file mode 100644
index 0000000..9bf70ea
--- /dev/null
+++ b/doc/doxygen/output/html/err_8h.js
@@ -0,0 +1,23 @@
+var err_8h =
+[
+    [ "err_t", "group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb", null ],
+    [ "err_enum_t", "group__infrastructure__errors.html#gae2e66c7d13afc90ffecd6151680fbadc", [
+      [ "ERR_OK", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb", null ],
+      [ "ERR_MEM", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaaaeafdbf3aecc46864daa3cd829c7e05", null ],
+      [ "ERR_BUF", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca05c91366f1b5203a5db9a241b415cd63", null ],
+      [ "ERR_TIMEOUT", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcac568baeb6407ef5e2630084ccbc34be8", null ],
+      [ "ERR_RTE", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca9448893187313c0c5a502ca9a9ad1c2a", null ],
+      [ "ERR_INPROGRESS", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca13e1dd0edca8a27b6abdf1524bde7929", null ],
+      [ "ERR_VAL", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa9a1c5a6fdeed0aad7fe41d538482bbd", null ],
+      [ "ERR_WOULDBLOCK", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab9dcf89d46668b072192278fb907b7ad", null ],
+      [ "ERR_USE", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca4ebdc2aa1dbd75f927845733a3fb1f8b", null ],
+      [ "ERR_ALREADY", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcae6f9c1e4c18ca844f7934307d4cc30e5", null ],
+      [ "ERR_ISCONN", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca8543e1d6422fed7b318d97e08dcbaa33", null ],
+      [ "ERR_CONN", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab0036c51817b5200bfe8157cc4115b27", null ],
+      [ "ERR_IF", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca7d61d90449ae6788575e8e46d5d3bbc6", null ],
+      [ "ERR_ABRT", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaf316b2c5eee4079820f7100849115142", null ],
+      [ "ERR_RST", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca759030525f1768a23dc086a5fd45b4e5", null ],
+      [ "ERR_CLSD", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa5176d9fecf8ec43d3bc49f4e6c3f7f5", null ],
+      [ "ERR_ARG", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab508ce0ebdf3ca735208b00a80a45c91", null ]
+    ] ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/etharp_8c.html b/doc/doxygen/output/html/etharp_8c.html
new file mode 100644
index 0000000..0c0f333
--- /dev/null
+++ b/doc/doxygen/output/html/etharp_8c.html
@@ -0,0 +1,542 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv4/etharp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('etharp_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">etharp.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 &quot;<a class="el" href="lwip_2etharp_8h.html">lwip/etharp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<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="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 />
+<code>#include &quot;path/to/my/lwip_hooks.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ac71515a6f140b25de49e9bf432b2bb2a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="etharp_8c.html#ac71515a6f140b25de49e9bf432b2bb2a">ARP_AGE_REREQUEST_USED_UNICAST</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__arp.html#ga741a0710dc126ed3ae9e305472df3432">ARP_MAXAGE</a> - 30)</td></tr>
+<tr class="separator:ac71515a6f140b25de49e9bf432b2bb2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0a03fea13e060da5a53a10a75a96def9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="etharp_8c.html#a0a03fea13e060da5a53a10a75a96def9">ARP_MAXPENDING</a>&#160;&#160;&#160;5</td></tr>
+<tr class="separator:a0a03fea13e060da5a53a10a75a96def9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96f8787ca623e704da1d32ca7dd6d6d9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="etharp_8c.html#a96f8787ca623e704da1d32ca7dd6d6d9">ETHARP_FLAG_TRY_HARD</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:a96f8787ca623e704da1d32ca7dd6d6d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ae95dee9363e6d3417298e07380b2d383"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="etharp_8c.html#ae95dee9363e6d3417298e07380b2d383">etharp_state</a> </td></tr>
+<tr class="separator:ae95dee9363e6d3417298e07380b2d383"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a654f4dad71f7e2bc4820094648f37a26"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="etharp_8c.html#a654f4dad71f7e2bc4820094648f37a26">etharp_tmr</a> (void)</td></tr>
+<tr class="separator:a654f4dad71f7e2bc4820094648f37a26"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae94677a2a5f3698276027c7475f6ca05"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="etharp_8c.html#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:a0f8ca87c5472fa165763c8c38b76174c"><td class="memItemLeft" align="right" valign="top">ssize_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="etharp_8c.html#a0f8ca87c5472fa165763c8c38b76174c">etharp_find_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, struct <a class="el" href="structeth__addr.html">eth_addr</a> **eth_ret, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> **ip_ret)</td></tr>
+<tr class="separator:a0f8ca87c5472fa165763c8c38b76174c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab93df7ccb26496100d45137541e863c8"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="etharp_8c.html#ab93df7ccb26496100d45137541e863c8">etharp_get_entry</a> (size_t i, <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> **ipaddr, struct <a class="el" href="structnetif.html">netif</a> **<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structeth__addr.html">eth_addr</a> **eth_ret)</td></tr>
+<tr class="separator:ab93df7ccb26496100d45137541e863c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a540a5506979693ef9ac4496db9bfa7d6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="etharp_8c.html#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>
+<tr class="memitem:a19258c75a3778b6ed0c82f63a419502d"><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="etharp_8c.html#a19258c75a3778b6ed0c82f63a419502d">etharp_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="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr)</td></tr>
+<tr class="separator:a19258c75a3778b6ed0c82f63a419502d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae180772e31346a0afeb707ad172dd19c"><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="etharp_8c.html#ae180772e31346a0afeb707ad172dd19c">etharp_query</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, struct <a class="el" href="structpbuf.html">pbuf</a> *q)</td></tr>
+<tr class="separator:ae180772e31346a0afeb707ad172dd19c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="etharp_8c.html#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>
+</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>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ac71515a6f140b25de49e9bf432b2bb2a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac71515a6f140b25de49e9bf432b2bb2a">&#9670;&nbsp;</a></span>ARP_AGE_REREQUEST_USED_UNICAST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ARP_AGE_REREQUEST_USED_UNICAST&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__arp.html#ga741a0710dc126ed3ae9e305472df3432">ARP_MAXAGE</a> - 30)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Re-request a used ARP entry 1 minute before it would expire to prevent breaking a steadily used connection because the ARP entry timed out. </p>
+
+</div>
+</div>
+<a id="a0a03fea13e060da5a53a10a75a96def9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0a03fea13e060da5a53a10a75a96def9">&#9670;&nbsp;</a></span>ARP_MAXPENDING</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ARP_MAXPENDING&#160;&#160;&#160;5</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>the time an ARP entry stays pending after first request, for ARP_TMR_INTERVAL = 1000, this is 10 seconds. </p>
+
+</div>
+</div>
+<a id="a96f8787ca623e704da1d32ca7dd6d6d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a96f8787ca623e704da1d32ca7dd6d6d9">&#9670;&nbsp;</a></span>ETHARP_FLAG_TRY_HARD</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ETHARP_FLAG_TRY_HARD&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Try hard to create a new entry - we want the IP address to appear in the cache (even if this means removing an active entry or so). </p>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="ae95dee9363e6d3417298e07380b2d383"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae95dee9363e6d3417298e07380b2d383">&#9670;&nbsp;</a></span>etharp_state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="etharp_8c.html#ae95dee9363e6d3417298e07380b2d383">etharp_state</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ARP states </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ae94677a2a5f3698276027c7475f6ca05"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae94677a2a5f3698276027c7475f6ca05">&#9670;&nbsp;</a></span>etharp_cleanup_netif()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void etharp_cleanup_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Remove all ARP table entries of the specified netif.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>points to a network interface </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a0f8ca87c5472fa165763c8c38b76174c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0f8ca87c5472fa165763c8c38b76174c">&#9670;&nbsp;</a></span>etharp_find_addr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">ssize_t etharp_find_addr </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structeth__addr.html">eth_addr</a> **&#160;</td>
+          <td class="paramname"><em>eth_ret</em>, </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> **&#160;</td>
+          <td class="paramname"><em>ip_ret</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Finds (stable) ethernet/IP address pair from ARP table using interface and IP address index. </p><dl class="section note"><dt>Note</dt><dd>the addresses in the ARP table are in network order!</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>points to interface index </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>points to the (network order) IP address index </td></tr>
+    <tr><td class="paramname">eth_ret</td><td>points to return pointer </td></tr>
+    <tr><td class="paramname">ip_ret</td><td>points to return pointer </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>table index if found, -1 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ab93df7ccb26496100d45137541e863c8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab93df7ccb26496100d45137541e863c8">&#9670;&nbsp;</a></span>etharp_get_entry()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int etharp_get_entry </td>
+          <td>(</td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>i</em>, </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> **&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> **&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structeth__addr.html">eth_addr</a> **&#160;</td>
+          <td class="paramname"><em>eth_ret</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Possibility to iterate over stable ARP table entries</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i</td><td>entry number, 0 to ARP_TABLE_SIZE </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>return value: IP address </td></tr>
+    <tr><td class="paramname">netif</td><td>return value: points to interface </td></tr>
+    <tr><td class="paramname">eth_ret</td><td>return value: ETH address </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 on valid index, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a540a5506979693ef9ac4496db9bfa7d6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a540a5506979693ef9ac4496db9bfa7d6">&#9670;&nbsp;</a></span>etharp_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void etharp_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Responds to ARP requests to us. Upon ARP replies to us, add entry to cache send out queued IP packets. Updates cache with snooped address pairs.</p>
+<p>Should be called for incoming ARP packets. The pbuf in the argument is freed by this function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>The ARP packet that arrived on netif. Is freed by this function. </td></tr>
+    <tr><td class="paramname">netif</td><td>The lwIP network interface on which the ARP packet pbuf arrived.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf_free()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a19258c75a3778b6ed0c82f63a419502d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a19258c75a3778b6ed0c82f63a419502d">&#9670;&nbsp;</a></span>etharp_output()</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_output </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>q</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Resolve and fill-in Ethernet address header for outgoing IP packet.</p>
+<p>For IP multicast and broadcast, corresponding Ethernet addresses are selected and the packet is transmitted on the link.</p>
+<p>For unicast addresses, the packet is submitted to <a class="el" href="etharp_8c.html#ae180772e31346a0afeb707ad172dd19c">etharp_query()</a>. In case the IP address is outside the local network, the IP address of the gateway is used.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The lwIP network interface which the IP packet will be sent on. </td></tr>
+    <tr><td class="paramname">q</td><td>The <a class="el" href="structpbuf.html">pbuf(s)</a> containing the IP packet to be sent. </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>The IP address of the packet destination.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><ul>
+<li>ERR_RTE No route to destination (no gateway to external networks), or the return type of either <a class="el" href="etharp_8c.html#ae180772e31346a0afeb707ad172dd19c">etharp_query()</a> or <a class="el" href="group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778">ethernet_output()</a>. </li>
+</ul>
+</dd></dl>
+
+</div>
+</div>
+<a id="ae180772e31346a0afeb707ad172dd19c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae180772e31346a0afeb707ad172dd19c">&#9670;&nbsp;</a></span>etharp_query()</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_query </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>q</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an ARP request for the given IP address and/or queue a packet.</p>
+<p>If the IP address was not yet in the cache, a pending ARP cache entry is added and an ARP request is sent for the given address. The packet is queued on this entry.</p>
+<p>If the IP address was already pending in the cache, a new ARP request is sent for the given address. The packet is queued on this entry.</p>
+<p>If the IP address was already stable in the cache, and a packet is given, it is directly sent and no ARP request is sent out.</p>
+<p>If the IP address was already stable in the cache, and no packet is given, an ARP request is sent out.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The lwIP network interface on which ipaddr must be queried for. </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>The IP address to be resolved. </td></tr>
+    <tr><td class="paramname">q</td><td>If non-NULL, a pbuf that must be delivered to the IP address. q is not freed by this function.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>q must only be ONE packet, not a packet queue!</dd></dl>
+<dl class="section return"><dt>Returns</dt><dd><ul>
+<li>ERR_BUF Could not make room for Ethernet header.</li>
+<li>ERR_MEM Hardware address unknown, and no more ARP entries available to query for address or queue the packet.</li>
+<li>ERR_MEM Could not queue packet due to memory shortage.</li>
+<li>ERR_RTE No route to destination (no gateway to external networks).</li>
+<li>ERR_ARG Non-unicast address given, those will not appear in ARP cache. </li>
+</ul>
+</dd></dl>
+
+</div>
+</div>
+<a id="a3e56faced96841e615f88dd57d1b2b15"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3e56faced96841e615f88dd57d1b2b15">&#9670;&nbsp;</a></span>etharp_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> etharp_request </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an ARP request packet asking for ipaddr.</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 for which to ask </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="a654f4dad71f7e2bc4820094648f37a26"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a654f4dad71f7e2bc4820094648f37a26">&#9670;&nbsp;</a></span>etharp_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void etharp_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Clears expired entries in the ARP table.</p>
+<p>This function should be called every ARP_TMR_INTERVAL milliseconds (1 second), in order to expire entries in the ARP table. </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="etharp_8c.html">etharp.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/etharp_8c.js b/doc/doxygen/output/html/etharp_8c.js
new file mode 100644
index 0000000..51ea008
--- /dev/null
+++ b/doc/doxygen/output/html/etharp_8c.js
@@ -0,0 +1,15 @@
+var etharp_8c =
+[
+    [ "ARP_AGE_REREQUEST_USED_UNICAST", "etharp_8c.html#ac71515a6f140b25de49e9bf432b2bb2a", null ],
+    [ "ARP_MAXPENDING", "etharp_8c.html#a0a03fea13e060da5a53a10a75a96def9", null ],
+    [ "ETHARP_FLAG_TRY_HARD", "etharp_8c.html#a96f8787ca623e704da1d32ca7dd6d6d9", null ],
+    [ "etharp_state", "etharp_8c.html#ae95dee9363e6d3417298e07380b2d383", 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 ],
+    [ "etharp_input", "etharp_8c.html#a540a5506979693ef9ac4496db9bfa7d6", null ],
+    [ "etharp_output", "etharp_8c.html#a19258c75a3778b6ed0c82f63a419502d", null ],
+    [ "etharp_query", "etharp_8c.html#ae180772e31346a0afeb707ad172dd19c", null ],
+    [ "etharp_request", "etharp_8c.html#a3e56faced96841e615f88dd57d1b2b15", null ],
+    [ "etharp_tmr", "etharp_8c.html#a654f4dad71f7e2bc4820094648f37a26", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ethernet_8c.html b/doc/doxygen/output/html/ethernet_8c.html
new file mode 100644
index 0000000..55c5b31
--- /dev/null
+++ b/doc/doxygen/output/html/ethernet_8c.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/netif/ethernet.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ethernet_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">ethernet.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 &quot;<a class="el" href="netif_2ethernet_8h.html">netif/ethernet.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="stats_8h.html">lwip/stats.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="ip_8h.html">lwip/ip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp_8h.html">lwip/snmp.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;netif/ppp/ppp_opts.h&quot;</code><br />
+<code>#include &quot;path/to/my/lwip_hooks.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga6a10c58b82c56d02c48b3cfa2c2494ff"><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__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff">ethernet_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:ga6a10c58b82c56d02c48b3cfa2c2494ff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac9cad5802bfa3d885f13d2ba0f40b778"><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__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778">ethernet_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> *p, const struct <a class="el" href="structeth__addr.html">eth_addr</a> *src, const struct <a class="el" href="structeth__addr.html">eth_addr</a> *dst, u16_t eth_type)</td></tr>
+<tr class="separator:gac9cad5802bfa3d885f13d2ba0f40b778"><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>Ethernet common functions </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_900e6f7ff90690cb8edb53323dd38d80.html">netif</a></li><li class="navelem"><a class="el" href="ethernet_8c.html">ethernet.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ethernet_8c.js b/doc/doxygen/output/html/ethernet_8c.js
new file mode 100644
index 0000000..f03ec89
--- /dev/null
+++ b/doc/doxygen/output/html/ethernet_8c.js
@@ -0,0 +1,5 @@
+var ethernet_8c =
+[
+    [ "ethernet_input", "group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff", null ],
+    [ "ethernet_output", "group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ethip6_8c.html b/doc/doxygen/output/html/ethip6_8c.html
new file mode 100644
index 0000000..f93d1a7
--- /dev/null
+++ b/doc/doxygen/output/html/ethip6_8c.html
@@ -0,0 +1,172 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv6/ethip6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ethip6_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">ethip6.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 &quot;<a class="el" href="ethip6_8h.html">lwip/ethip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="nd6_8h.html">lwip/nd6.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="ip6_8h.html">lwip/ip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="inet__chksum_8h.html">lwip/inet_chksum.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="icmp6_8h.html">lwip/icmp6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="lwip_2prot_2ethernet_8h.html">lwip/prot/ethernet.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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab5326546d33174f91f1fb0cc6d398bfd"><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="ethip6_8c.html#ab5326546d33174f91f1fb0cc6d398bfd">ethip6_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>
+<tr class="separator:ab5326546d33174f91f1fb0cc6d398bfd"><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>Ethernet output for IPv6. Uses ND tables for link-layer addressing. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ab5326546d33174f91f1fb0cc6d398bfd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab5326546d33174f91f1fb0cc6d398bfd">&#9670;&nbsp;</a></span>ethip6_output()</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> ethip6_output </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>q</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ip6addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Resolve and fill-in Ethernet address header for outgoing IPv6 packet.</p>
+<p>For IPv6 multicast, corresponding Ethernet addresses are selected and the packet is transmitted on the link.</p>
+<p>For unicast addresses, ask the ND6 module what to do. It will either let us send the the packet right away, or queue the packet for later itself, unless an error occurs.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The lwIP network interface which the IP packet will be sent on. </td></tr>
+    <tr><td class="paramname">q</td><td>The <a class="el" href="structpbuf.html">pbuf(s)</a> containing the IP packet to be sent. </td></tr>
+    <tr><td class="paramname">ip6addr</td><td>The IP address of the packet destination.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><ul>
+<li>ERR_OK or the return value of <a class="el" href="nd6_8h.html#ae447c204ebbf71e6ebbc5ed727a73eb9">nd6_get_next_hop_addr_or_queue</a>. </li>
+</ul>
+</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_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li><li class="navelem"><a class="el" href="dir_da9c6f43d3cd00be3de224bac907a425.html">ipv6</a></li><li class="navelem"><a class="el" href="ethip6_8c.html">ethip6.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ethip6_8c.js b/doc/doxygen/output/html/ethip6_8c.js
new file mode 100644
index 0000000..31b402a
--- /dev/null
+++ b/doc/doxygen/output/html/ethip6_8c.js
@@ -0,0 +1,4 @@
+var ethip6_8c =
+[
+    [ "ethip6_output", "ethip6_8c.html#ab5326546d33174f91f1fb0cc6d398bfd", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ethip6_8h.html b/doc/doxygen/output/html/ethip6_8h.html
new file mode 100644
index 0000000..9946060
--- /dev/null
+++ b/doc/doxygen/output/html/ethip6_8h.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/ethip6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ethip6_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">ethip6.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="pbuf_8h.html">lwip/pbuf.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6_8h.html">lwip/ip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab5326546d33174f91f1fb0cc6d398bfd"><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="ethip6_8h.html#ab5326546d33174f91f1fb0cc6d398bfd">ethip6_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>
+<tr class="separator:ab5326546d33174f91f1fb0cc6d398bfd"><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>Ethernet output for IPv6. Uses ND tables for link-layer addressing. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ab5326546d33174f91f1fb0cc6d398bfd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab5326546d33174f91f1fb0cc6d398bfd">&#9670;&nbsp;</a></span>ethip6_output()</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> ethip6_output </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>q</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ip6addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Resolve and fill-in Ethernet address header for outgoing IPv6 packet.</p>
+<p>For IPv6 multicast, corresponding Ethernet addresses are selected and the packet is transmitted on the link.</p>
+<p>For unicast addresses, ask the ND6 module what to do. It will either let us send the the packet right away, or queue the packet for later itself, unless an error occurs.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The lwIP network interface which the IP packet will be sent on. </td></tr>
+    <tr><td class="paramname">q</td><td>The <a class="el" href="structpbuf.html">pbuf(s)</a> containing the IP packet to be sent. </td></tr>
+    <tr><td class="paramname">ip6addr</td><td>The IP address of the packet destination.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><ul>
+<li>ERR_OK or the return value of <a class="el" href="nd6_8h.html#ae447c204ebbf71e6ebbc5ed727a73eb9">nd6_get_next_hop_addr_or_queue</a>. </li>
+</ul>
+</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="ethip6_8h.html">ethip6.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ethip6_8h.js b/doc/doxygen/output/html/ethip6_8h.js
new file mode 100644
index 0000000..fb07029
--- /dev/null
+++ b/doc/doxygen/output/html/ethip6_8h.js
@@ -0,0 +1,4 @@
+var ethip6_8h =
+[
+    [ "ethip6_output", "ethip6_8h.html#ab5326546d33174f91f1fb0cc6d398bfd", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/files.html b/doc/doxygen/output/html/files.html
new file mode 100644
index 0000000..ea6af13
--- /dev/null
+++ b/doc/doxygen/output/html/files.html
@@ -0,0 +1,351 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: File List</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('files.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">File List</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all documented files with brief descriptions:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span><span onclick="javascript:toggleLevel(4);">4</span><span onclick="javascript:toggleLevel(5);">5</span><span onclick="javascript:toggleLevel(6);">6</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><span id="img_0_" class="iconfopen" onclick="toggleFolder('0_')">&#160;</span><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html" target="_self">src</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_0_" class="arrow" onclick="toggleFolder('0_0_')">&#9660;</span><span id="img_0_0_" class="iconfopen" onclick="toggleFolder('0_0_')">&#160;</span><a class="el" href="dir_da61e3e9a357748887e3ca8d7c5a0c16.html" target="_self">api</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="api__lib_8c.html" target="_self">api_lib.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_1_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="api__msg_8c.html" target="_self">api_msg.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_2_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="err_8c.html" target="_self">err.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_3_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="if__api_8c.html" target="_self">if_api.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_4_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="netbuf_8c.html" target="_self">netbuf.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_5_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="netdb_8c.html" target="_self">netdb.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_6_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="netifapi_8c.html" target="_self">netifapi.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_7_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="sockets_8c.html" target="_self">sockets.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_8_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tcpip_8c.html" target="_self">tcpip.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_1_" class="arrow" onclick="toggleFolder('0_1_')">&#9660;</span><span id="img_0_1_" class="iconfopen" onclick="toggleFolder('0_1_')">&#160;</span><a class="el" href="dir_53adf0b982dc8545998aae3f283a5a58.html" target="_self">apps</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_1_0_" class="arrow" onclick="toggleFolder('0_1_0_')">&#9658;</span><span id="img_0_1_0_" class="iconfclosed" onclick="toggleFolder('0_1_0_')">&#160;</span><a class="el" href="dir_1cb496c74bbaf54ecc99133e1c434e0c.html" target="_self">altcp_tls</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_0_0_" 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__mbedtls_8c.html" target="_self">altcp_tls_mbedtls.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_0_1_" 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__mbedtls__mem_8c.html" target="_self">altcp_tls_mbedtls_mem.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_0_2_" 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__mbedtls__mem_8h.html" target="_self">altcp_tls_mbedtls_mem.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_0_3_" 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__mbedtls__structs_8h.html" target="_self">altcp_tls_mbedtls_structs.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_1_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_1_1_" class="arrow" onclick="toggleFolder('0_1_1_')">&#9658;</span><span id="img_0_1_1_" class="iconfclosed" onclick="toggleFolder('0_1_1_')">&#160;</span><a class="el" href="dir_34adf996f92d0eef72c45a7167a966e6.html" target="_self">http</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_1_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="altcp__proxyconnect_8c.html" target="_self">altcp_proxyconnect.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_1_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="http__client_8c.html" target="_self">http_client.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_1_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="httpd_8c.html" target="_self">httpd.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_1_2_" class="arrow" onclick="toggleFolder('0_1_2_')">&#9658;</span><span id="img_0_1_2_" class="iconfclosed" onclick="toggleFolder('0_1_2_')">&#160;</span><a class="el" href="dir_4b846c6b6971d2800eff93d75504accd.html" target="_self">lwiperf</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_2_0_" 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_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_1_3_" class="arrow" onclick="toggleFolder('0_1_3_')">&#9658;</span><span id="img_0_1_3_" class="iconfclosed" onclick="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_4_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_1_4_" class="arrow" onclick="toggleFolder('0_1_4_')">&#9658;</span><span id="img_0_1_4_" class="iconfclosed" onclick="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_" 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_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_1_5_" class="arrow" onclick="toggleFolder('0_1_5_')">&#9658;</span><span id="img_0_1_5_" class="iconfclosed" onclick="toggleFolder('0_1_5_')">&#160;</span><a class="el" href="dir_56d2b6ddbb44630b0fd661af6321f9c4.html" target="_self">netbiosns</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_5_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="netbiosns_8c.html" target="_self">netbiosns.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_6_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_1_6_" class="arrow" onclick="toggleFolder('0_1_6_')">&#9658;</span><span id="img_0_1_6_" class="iconfclosed" onclick="toggleFolder('0_1_6_')">&#160;</span><a class="el" href="dir_149963277126306875d8bfe8322084f3.html" target="_self">smtp</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_6_0_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="smtp_8c.html" target="_self">smtp.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_1_7_" class="arrow" onclick="toggleFolder('0_1_7_')">&#9658;</span><span id="img_0_1_7_" class="iconfclosed" onclick="toggleFolder('0_1_7_')">&#160;</span><a class="el" href="dir_fb3f7e43f39ddb210bd1444e66d055f1.html" target="_self">snmp</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__asn1_8c.html" target="_self">snmp_asn1.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__asn1_8h.html" target="_self">snmp_asn1.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__core_8c.html" target="_self">snmp_core.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__mib2_8c.html" target="_self">snmp_mib2.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__mib2__icmp_8c.html" target="_self">snmp_mib2_icmp.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__mib2__interfaces_8c.html" target="_self">snmp_mib2_interfaces.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__mib2__ip_8c.html" target="_self">snmp_mib2_ip.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__mib2__snmp_8c.html" target="_self">snmp_mib2_snmp.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__mib2__system_8c.html" target="_self">snmp_mib2_system.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__mib2__tcp_8c.html" target="_self">snmp_mib2_tcp.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__mib2__udp_8c.html" target="_self">snmp_mib2_udp.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__msg_8c.html" target="_self">snmp_msg.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__msg_8h.html" target="_self">snmp_msg.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__netconn_8c.html" target="_self">snmp_netconn.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__pbuf__stream_8c.html" target="_self">snmp_pbuf_stream.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__pbuf__stream_8h.html" target="_self">snmp_pbuf_stream.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__raw_8c.html" target="_self">snmp_raw.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__scalar_8c.html" target="_self">snmp_scalar.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__table_8c.html" target="_self">snmp_table.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__threadsync_8c.html" target="_self">snmp_threadsync.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmp__traps_8c.html" target="_self">snmp_traps.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmpv3_8c.html" target="_self">snmpv3.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmpv3__mbedtls_8c.html" target="_self">snmpv3_mbedtls.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_7_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="snmpv3__priv_8h.html" target="_self">snmpv3_priv.h</a></td><td class="desc"></td></tr>
+<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="toggleFolder('0_1_8_')">&#9658;</span><span id="img_0_1_8_" class="iconfclosed" onclick="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_" 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_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_1_9_" class="arrow" onclick="toggleFolder('0_1_9_')">&#9658;</span><span id="img_0_1_9_" class="iconfclosed" onclick="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_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_2_" class="arrow" onclick="toggleFolder('0_2_')">&#9660;</span><span id="img_0_2_" class="iconfopen" onclick="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_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_2_0_" class="arrow" onclick="toggleFolder('0_2_0_')">&#9658;</span><span id="img_0_2_0_" class="iconfclosed" onclick="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_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_2_1_" class="arrow" onclick="toggleFolder('0_2_1_')">&#9658;</span><span id="img_0_2_1_" class="iconfclosed" onclick="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_" 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_" 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>
+<tr id="row_0_2_1_2_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="icmp6_8c.html" target="_self">icmp6.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_1_3_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="inet6_8c.html" target="_self">inet6.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_1_4_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip6_8c.html" target="_self">ip6.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_1_5_" 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_8c.html" target="_self">ip6_addr.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_1_6_" 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_8c.html" target="_self">ip6_frag.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_1_7_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mld6_8c.html" target="_self">mld6.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_1_8_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="nd6_8c.html" target="_self">nd6.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_2_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="altcp_8c.html" target="_self">altcp.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_3_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="altcp__alloc_8c.html" target="_self">altcp_alloc.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_4_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="altcp__tcp_8c.html" target="_self">altcp_tcp.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_5_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="def_8c.html" target="_self">def.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_6_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="dns_8c.html" target="_self">dns.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_7_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="inet__chksum_8c.html" target="_self">inet_chksum.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_8_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="init_8c.html" target="_self">init.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_9_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip_8c.html" target="_self">ip.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_10_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mem_8c.html" target="_self">mem.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_11_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="memp_8c.html" target="_self">memp.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_12_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="netif_8c.html" target="_self">netif.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_13_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="pbuf_8c.html" target="_self">pbuf.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_14_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="raw_8c.html" target="_self">raw.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_15_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="stats_8c.html" target="_self">stats.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_16_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="sys_8c.html" target="_self">sys.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_17_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tcp_8c.html" target="_self">tcp.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_18_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tcp__in_8c.html" target="_self">tcp_in.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_19_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tcp__out_8c.html" target="_self">tcp_out.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_20_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="timeouts_8c.html" target="_self">timeouts.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_21_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="udp_8c.html" target="_self">udp.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_3_" class="arrow" onclick="toggleFolder('0_3_')">&#9660;</span><span id="img_0_3_" class="iconfopen" onclick="toggleFolder('0_3_')">&#160;</span><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html" target="_self">include</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_3_0_" class="arrow" onclick="toggleFolder('0_3_0_')">&#9658;</span><span id="img_0_3_0_" class="iconfclosed" onclick="toggleFolder('0_3_0_')">&#160;</span><a class="el" href="dir_1e445e767c368c70d58af8a0b7552719.html" target="_self">compat</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_0_0_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span id="arr_0_3_0_0_" class="arrow" onclick="toggleFolder('0_3_0_0_')">&#9658;</span><span id="img_0_3_0_0_" class="iconfclosed" onclick="toggleFolder('0_3_0_0_')">&#160;</span><a class="el" href="dir_fe219fca207b878205c0dd92278d118b.html" target="_self">posix</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_0_0_0_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span id="arr_0_3_0_0_0_" class="arrow" onclick="toggleFolder('0_3_0_0_0_')">&#9658;</span><span id="img_0_3_0_0_0_" class="iconfclosed" onclick="toggleFolder('0_3_0_0_0_')">&#160;</span><a class="el" href="dir_6b1b06896a870ebfb9c854c4c71f4ff5.html" target="_self">arpa</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_0_0_0_0_" style="display:none;"><td class="entry"><span style="width:96px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="compat_2posix_2arpa_2inet_8h.html" target="_self">inet.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_0_0_1_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span id="arr_0_3_0_0_1_" class="arrow" onclick="toggleFolder('0_3_0_0_1_')">&#9658;</span><span id="img_0_3_0_0_1_" class="iconfclosed" onclick="toggleFolder('0_3_0_0_1_')">&#160;</span><a class="el" href="dir_c62aba36f6630fea5cd7fe1c941850d4.html" target="_self">net</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_0_0_1_0_" style="display:none;"><td class="entry"><span style="width:96px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="if_8h.html" target="_self">if.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_0_0_2_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span id="arr_0_3_0_0_2_" class="arrow" onclick="toggleFolder('0_3_0_0_2_')">&#9658;</span><span id="img_0_3_0_0_2_" class="iconfclosed" onclick="toggleFolder('0_3_0_0_2_')">&#160;</span><a class="el" href="dir_8da39adb2a11af660bdd7075b7323870.html" target="_self">sys</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_0_0_2_0_" style="display:none;"><td class="entry"><span style="width:96px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="socket_8h.html" target="_self">socket.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_0_0_3_" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="compat_2posix_2netdb_8h.html" target="_self">netdb.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_0_1_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span id="arr_0_3_0_1_" class="arrow" onclick="toggleFolder('0_3_0_1_')">&#9658;</span><span id="img_0_3_0_1_" class="iconfclosed" onclick="toggleFolder('0_3_0_1_')">&#160;</span><a class="el" href="dir_b42baff89a1adc9a57da7decb1835b6b.html" target="_self">stdc</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_0_1_0_" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="compat_2stdc_2errno_8h.html" target="_self">errno.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_3_1_" class="arrow" onclick="toggleFolder('0_3_1_')">&#9658;</span><span id="img_0_3_1_" class="iconfclosed" onclick="toggleFolder('0_3_1_')">&#160;</span><a class="el" href="dir_4e6b3cf33a61b6caac9c8ac30c866f37.html" target="_self">lwip</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span id="arr_0_3_1_0_" class="arrow" onclick="toggleFolder('0_3_1_0_')">&#9658;</span><span id="img_0_3_1_0_" class="iconfclosed" onclick="toggleFolder('0_3_1_0_')">&#160;</span><a class="el" href="dir_f9284811ac594eafdc3134d5f8b945cb.html" target="_self">apps</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_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__proxyconnect_8h.html" target="_self">altcp_proxyconnect.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_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="altcp__tls__mbedtls__opts_8h.html" target="_self">altcp_tls_mbedtls_opts.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_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="http__client_8h.html" target="_self">http_client.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_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="httpd_8h.html" target="_self">httpd.h</a></td><td class="desc"></td></tr>
+<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_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="toggleFolder('0_3_1_1_')">&#9658;</span><span id="img_0_3_1_1_" class="iconfclosed" onclick="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>
+<tr id="row_0_3_1_1_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="mem__priv_8h.html" target="_self">mem_priv.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_1_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="memp__priv_8h.html" target="_self">memp_priv.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_1_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="memp__std_8h.html" target="_self">memp_std.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_1_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="nd6__priv_8h.html" target="_self">nd6_priv.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_1_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="raw__priv_8h.html" target="_self">raw_priv.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_1_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="sockets__priv_8h.html" target="_self">sockets_priv.h</a></td><td class="desc"></td></tr>
+<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="toggleFolder('0_3_1_2_')">&#9658;</span><span id="img_0_3_1_2_" class="iconfclosed" onclick="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_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_3_2_" class="arrow" onclick="toggleFolder('0_3_2_')">&#9658;</span><span id="img_0_3_2_" class="iconfclosed" onclick="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_" 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="toggleFolder('0_3_2_0_')">&#9658;</span><span id="img_0_3_2_0_" class="iconfclosed" onclick="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_" 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>
+<tr id="row_0_3_2_0_1_" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="pppos_8h.html" target="_self">pppos.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_2_1_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="bridgeif_8h.html" target="_self">bridgeif.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_2_2_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="bridgeif__opts_8h.html" target="_self">bridgeif_opts.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_2_3_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="netif_2ethernet_8h.html" target="_self">ethernet.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_2_4_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ieee802154_8h.html" target="_self">ieee802154.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_2_5_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lowpan6_8h.html" target="_self">lowpan6.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_2_6_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lowpan6__ble_8h.html" target="_self">lowpan6_ble.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_2_7_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lowpan6__common_8h.html" target="_self">lowpan6_common.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_2_8_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lowpan6__opts_8h.html" target="_self">lowpan6_opts.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_2_9_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="slipif_8h.html" target="_self">slipif.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_2_10_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="zepif_8h.html" target="_self">zepif.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_4_" class="arrow" onclick="toggleFolder('0_4_')">&#9660;</span><span id="img_0_4_" class="iconfopen" onclick="toggleFolder('0_4_')">&#160;</span><a class="el" href="dir_900e6f7ff90690cb8edb53323dd38d80.html" target="_self">netif</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_4_0_" class="arrow" onclick="toggleFolder('0_4_0_')">&#9658;</span><span id="img_0_4_0_" class="iconfclosed" onclick="toggleFolder('0_4_0_')">&#160;</span><a class="el" href="dir_6aa605ad180e7b166767bf4f86888ab5.html" target="_self">ppp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_0_0_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="pppapi_8c.html" target="_self">pppapi.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_0_1_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="pppol2tp_8c.html" target="_self">pppol2tp.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_0_2_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="pppos_8c.html" target="_self">pppos.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_1_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="bridgeif_8c.html" target="_self">bridgeif.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_2_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="bridgeif__fdb_8c.html" target="_self">bridgeif_fdb.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_3_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ethernet_8c.html" target="_self">ethernet.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_4_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lowpan6_8c.html" target="_self">lowpan6.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_5_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lowpan6__ble_8c.html" target="_self">lowpan6_ble.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_6_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lowpan6__common_8c.html" target="_self">lowpan6_common.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_7_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="slipif_8c.html" target="_self">slipif.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_8_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="zepif_8c.html" target="_self">zepif.c</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/files.js b/doc/doxygen/output/html/files.js
new file mode 100644
index 0000000..04b0a8e
--- /dev/null
+++ b/doc/doxygen/output/html/files.js
@@ -0,0 +1,4 @@
+var files =
+[
+    [ "src", "dir_68267d1309a1af8e8297ef4c3efbcdba.html", "dir_68267d1309a1af8e8297ef4c3efbcdba" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/functions.html b/doc/doxygen/output/html/functions.html
new file mode 100644
index 0000000..d66f720
--- /dev/null
+++ b/doc/doxygen/output/html/functions.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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__"></a>- _ -</h3><ul>
+<li>_hoplim
+: <a class="el" href="structip6__hdr.html#af9cbfa5fa280a7a982a1c6268fa13a5a">ip6_hdr</a>
+</li>
+<li>_nexth
+: <a class="el" href="structip6__hdr.html#abe3d612d4570864c922e18ed838292f6">ip6_hdr</a>
+</li>
+<li>_plen
+: <a class="el" href="structip6__hdr.html#a9d225109d601ae8b34bab6ca3528fa94">ip6_hdr</a>
+</li>
+<li>_v_tc_fl
+: <a class="el" href="structip6__hdr.html#ad3b638f503a3f7e7724cf4c7b2c0a0b5">ip6_hdr</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_a.html b/doc/doxygen/output/html/functions_a.html
new file mode 100644
index 0000000..88526fd
--- /dev/null
+++ b/doc/doxygen/output/html/functions_a.html
@@ -0,0 +1,153 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_a.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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_a"></a>- a -</h3><ul>
+<li>acceptmbox
+: <a class="el" href="structnetconn.html#a9b59188f300828d2b5814e27ab27cad0">netconn</a>
+</li>
+<li>access
+: <a class="el" href="structsnmp__node__instance.html#a4af17d17a971f1d11a186e6e1fc4411c">snmp_node_instance</a>
+</li>
+<li>ad
+: <a class="el" href="structapi__msg.html#a36dedcbd9ecca67043a8e1d1e715be94">api_msg</a>
+</li>
+<li>additional
+: <a class="el" href="structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce">mdns_outpacket</a>
+</li>
+<li>addr
+: <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
+: <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
+: <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
+: <a class="el" href="structaltcp__allocator__s.html#aaf07ebf181a11d0320381ef46d40e687">altcp_allocator_s</a>
+</li>
+<li>answer_name
+: <a class="el" href="structnetbios__answer.html#abf746cd54add594216ddc3683c741406">netbios_answer</a>
+</li>
+<li>answer_name_flags
+: <a class="el" href="structnetbios__answer.html#a2729b7249e3d23309624cb19fa0dbfc4">netbios_answer</a>
+</li>
+<li>answers
+: <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
+: <a class="el" href="structmdns__packet.html#a56ba495a1458a21982e65d746468849d">mdns_packet</a>
+</li>
+<li>arg
+: <a class="el" href="structaltcp__allocator__s.html#a8d8aa48e9a105e9d25ad4b90d259d0b1">altcp_allocator_s</a>
+</li>
+<li>asn1_type
+: <a class="el" href="structsnmp__node__instance.html#af51206e0912a8402c395dcf3b623f8b9">snmp_node_instance</a>
+</li>
+<li>auth_plain
+: <a class="el" href="structsmtp__session.html#a9da4e424e22892fae51987665eca85a9">smtp_session</a>
+</li>
+<li>auth_plain_len
+: <a class="el" href="structsmtp__session.html#a003dfd03ac58252b575a7c965e532461">smtp_session</a>
+</li>
+<li>authoritative
+: <a class="el" href="structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035">mdns_outpacket</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_b.html b/doc/doxygen/output/html/functions_b.html
new file mode 100644
index 0000000..fd19750
--- /dev/null
+++ b/doc/doxygen/output/html/functions_b.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_b.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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_b"></a>- b -</h3><ul>
+<li>b
+: <a class="el" href="structapi__msg.html#ab0abd60527e96cc24c2c20c835cdac05">api_msg</a>
+</li>
+<li>base
+: <a class="el" href="structmemp__desc.html#a9aec58adcbcd88167247296ca4346558">memp_desc</a>
+</li>
+<li>bc
+: <a class="el" href="structapi__msg.html#a1705127c6cd22c2c6dbbcc59834e41e0">api_msg</a>
+</li>
+<li>body
+: <a class="el" href="structsmtp__session.html#a7bb4bf5cc209e073341b56845e5cbd49">smtp_session</a>
+</li>
+<li>body_len
+: <a class="el" href="structsmtp__session.html#a0da8b775ddfe5f8891464037a6b4bb4d">smtp_session</a>
+</li>
+<li>body_sent
+: <a class="el" href="structsmtp__session.html#a5893c61d863b4846a81d8a4bbcaebb5b">smtp_session</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_c.html b/doc/doxygen/output/html/functions_c.html
new file mode 100644
index 0000000..ee1e23d
--- /dev/null
+++ b/doc/doxygen/output/html/functions_c.html
@@ -0,0 +1,169 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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"></a>- c -</h3><ul>
+<li>cache_flush
+: <a class="el" href="structmdns__outpacket.html#a9bd0fd91dda48baa2938dddd747d3195">mdns_outpacket</a>
+</li>
+<li>callback
+: <a class="el" href="structnetconn.html#abe796060bb06e585333ca9a87862b624">netconn</a>
+</li>
+<li>callback_arg
+: <a class="el" href="structsmtp__session.html#af0544df7a935a092d825d8f2380f970f">smtp_session</a>
+</li>
+<li>callback_fn
+: <a class="el" href="structsmtp__session.html#a24c13d621e18311a613ab68b856a7f7b">smtp_session</a>
+</li>
+<li>cb
+: <a class="el" href="structmqtt__request__t.html#a32a4b14b0b8b5b8ce8db1074e53f4a79">mqtt_request_t</a>
+</li>
+<li>chksum_len_rx
+: <a class="el" href="structudp__pcb.html#a5e2833df51760c83c6032608eb5d0d4d">udp_pcb</a>
+</li>
+<li>client_id
+: <a class="el" href="structmqtt__connect__client__info__t.html#ad35f7850df21f001d5c5ffaa1a18c05a">mqtt_connect_client_info_t</a>
+</li>
+<li>client_pass
+: <a class="el" href="structmqtt__connect__client__info__t.html#a8f68efe91c5311418151256c96102d4b">mqtt_connect_client_info_t</a>
+</li>
+<li>client_user
+: <a class="el" href="structmqtt__connect__client__info__t.html#aec961673d5c3e8dc853c91f30d9333b5">mqtt_connect_client_info_t</a>
+</li>
+<li>close
+: <a class="el" href="structtftp__context.html#ae9181c57d1cf89bc263f7671e5630a65">tftp_context</a>
+</li>
+<li>conn
+: <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
+: <a class="el" href="structmqtt__client__s.html#af4a07c1079e2e2a336f1939d8b9677e6">mqtt_client_s</a>
+</li>
+<li>connect_arg
+: <a class="el" href="structmqtt__client__s.html#ae6d53359ec6d70533dab7c0d2717ce1a">mqtt_client_s</a>
+</li>
+<li>current_input_netif
+: <a class="el" href="structip__globals.html#a7da899c663b1d560b61d92ba6d544701">ip_globals</a>
+</li>
+<li>current_ip4_header
+: <a class="el" href="structip__globals.html#a2e810f97cf3e8e855e3baafc3be8c0d4">ip_globals</a>
+</li>
+<li>current_ip6_header
+: <a class="el" href="structip__globals.html#aa5cfc3ac29dc746a4cbe844206b0ed41">ip_globals</a>
+</li>
+<li>current_ip_header_tot_len
+: <a class="el" href="structip__globals.html#a17004526e6f1a164c0bab01aeac5e34a">ip_globals</a>
+</li>
+<li>current_iphdr_dest
+: <a class="el" href="structip__globals.html#a0b4e54250c692c638408de54593d2aa1">ip_globals</a>
+</li>
+<li>current_iphdr_src
+: <a class="el" href="structip__globals.html#a04d85a3dc2c417050b3e088fa58a74b0">ip_globals</a>
+</li>
+<li>current_msg
+: <a class="el" href="structnetconn.html#a49ba09038b2f2563fd3a38e38f8b8ab9">netconn</a>
+</li>
+<li>current_netif
+: <a class="el" href="structip__globals.html#a7803dc5950d143e4433a0df689989bab">ip_globals</a>
+</li>
+<li>custom_free_function
+: <a class="el" href="structpbuf__custom.html#af614d17874746cbbf778dc4ca9eac2e9">pbuf_custom</a>
+</li>
+<li>cyclic_tick
+: <a class="el" href="structmqtt__client__s.html#a6274ba2eb2fe6afa970b1c8a650d8cef">mqtt_client_s</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_d.html b/doc/doxygen/output/html/functions_d.html
new file mode 100644
index 0000000..37b24c7
--- /dev/null
+++ b/doc/doxygen/output/html/functions_d.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_d.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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_d"></a>- d -</h3><ul>
+<li>data_cb
+: <a class="el" href="structmqtt__client__s.html#a26dc9112351c042594a41703197925a7">mqtt_client_s</a>
+</li>
+<li>dest_addr
+: <a class="el" href="structmdns__outpacket.html#a1fdc90b48d8cf1fc24895f0c7a5798e4">mdns_outpacket</a>
+</li>
+<li>destination_address
+: <a class="el" href="structieee__802154__hdr.html#a87ce59d2804cacc5a58411c8b6c47f33">ieee_802154_hdr</a>
+</li>
+<li>destination_pan_id
+: <a class="el" href="structieee__802154__hdr.html#ac1ad9159d3bb70b1a7223060c6c81efd">ieee_802154_hdr</a>
+</li>
+<li>destroy
+: <a class="el" href="structtcp__ext__arg__callbacks.html#ace586d5d376b42465927a4fd8688c24b">tcp_ext_arg_callbacks</a>
+</li>
+<li>dns_addrtype
+: <a class="el" href="structdns__api__msg.html#afb2536a6c342bed4c4ad9d75982f7493">dns_api_msg</a>
+</li>
+<li>dns_ttl
+: <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
+: <a class="el" href="structmdns__outpacket.html#aee97e98c4869aa63ffe348d38d87221f">mdns_outpacket</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_dup.js b/doc/doxygen/output/html/functions_dup.js
new file mode 100644
index 0000000..e111509
--- /dev/null
+++ b/doc/doxygen/output/html/functions_dup.js
@@ -0,0 +1,28 @@
+var functions_dup =
+[
+    [ "_", "functions.html", null ],
+    [ "a", "functions_a.html", null ],
+    [ "b", "functions_b.html", null ],
+    [ "c", "functions_c.html", null ],
+    [ "d", "functions_d.html", null ],
+    [ "e", "functions_e.html", null ],
+    [ "f", "functions_f.html", null ],
+    [ "g", "functions_g.html", null ],
+    [ "h", "functions_h.html", null ],
+    [ "i", "functions_i.html", null ],
+    [ "j", "functions_j.html", null ],
+    [ "k", "functions_k.html", null ],
+    [ "l", "functions_l.html", null ],
+    [ "m", "functions_m.html", null ],
+    [ "n", "functions_n.html", null ],
+    [ "o", "functions_o.html", null ],
+    [ "p", "functions_p.html", null ],
+    [ "q", "functions_q.html", null ],
+    [ "r", "functions_r.html", null ],
+    [ "s", "functions_s.html", null ],
+    [ "t", "functions_t.html", null ],
+    [ "u", "functions_u.html", null ],
+    [ "v", "functions_v.html", null ],
+    [ "w", "functions_w.html", null ],
+    [ "z", "functions_z.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/functions_e.html b/doc/doxygen/output/html/functions_e.html
new file mode 100644
index 0000000..7fcd2d2
--- /dev/null
+++ b/doc/doxygen/output/html/functions_e.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_e.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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_e"></a>- e -</h3><ul>
+<li>err
+: <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
+: <a class="el" href="structlwip__sock.html#a9245a7ab9471bfb6fac94c66d26fba5e">lwip_sock</a>
+</li>
+<li>ethaddr
+: <a class="el" href="structbridgeif__initdata__s.html#a8e0048db5e021f5d79411492dc9330bc">bridgeif_initdata_s</a>
+</li>
+<li>etharp
+: <a class="el" href="structstats__.html#aa52547cb08dc828927494dc485bb69f3">stats_</a>
+</li>
+<li>exceptset
+: <a class="el" href="structlwip__select__cb.html#a2a1e68993ed887fca326d1373ea6caed">lwip_select_cb</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_f.html b/doc/doxygen/output/html/functions_f.html
new file mode 100644
index 0000000..54a71be
--- /dev/null
+++ b/doc/doxygen/output/html/functions_f.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_f.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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"></a>- f -</h3><ul>
+<li>flags
+: <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
+: <a class="el" href="structieee__802154__hdr.html#a1d1e2cef0e0c1b1e1fd02a8a5f07fb10">ieee_802154_hdr</a>
+</li>
+<li>from
+: <a class="el" href="structsmtp__session.html#a8dc4651c67618e33c56dc66790bc12ee">smtp_session</a>
+</li>
+<li>from_len
+: <a class="el" href="structsmtp__session.html#a191b09e7142414a671da82fece888e65">smtp_session</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_g.html b/doc/doxygen/output/html/functions_g.html
new file mode 100644
index 0000000..785540b
--- /dev/null
+++ b/doc/doxygen/output/html/functions_g.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_g.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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_g"></a>- g -</h3><ul>
+<li>get_value
+: <a class="el" href="structsnmp__node__instance.html#a17aa954aa34672f4a399bf0d91c0a649">snmp_node_instance</a>
+, <a class="el" href="structsnmp__table__node.html#ac65c57e29faa456a9a710185109fe272">snmp_table_node</a>
+</li>
+<li>group_address
+: <a class="el" href="structigmp__group.html#ae26e6041f865880bf46cd21b6f9af854">igmp_group</a>
+, <a class="el" href="structmld__group.html#a781abf78d835627ded1202166b44b88e">mld_group</a>
+</li>
+<li>group_state
+: <a class="el" href="structigmp__group.html#add0d24f719ad4b598abad254689ad911">igmp_group</a>
+, <a class="el" href="structmld__group.html#ae9cfd3f126257aa3aff4a24e05c04059">mld_group</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_h.html b/doc/doxygen/output/html/functions_h.html
new file mode 100644
index 0000000..d8d5b59
--- /dev/null
+++ b/doc/doxygen/output/html/functions_h.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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_h"></a>- h -</h3><ul>
+<li>hwaddr
+: <a class="el" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">netif</a>
+</li>
+<li>hwaddr_len
+: <a class="el" href="structnetif.html#afe1181561cb16241f3cb5ed01e567d42">netif</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_i.html b/doc/doxygen/output/html/functions_i.html
new file mode 100644
index 0000000..a0e4a78
--- /dev/null
+++ b/doc/doxygen/output/html/functions_i.html
@@ -0,0 +1,186 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_i.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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_i"></a>- i -</h3><ul>
+<li>icmp
+: <a class="el" href="structstats__.html#a10bc430163b0e6db91338aded5b7019a">stats_</a>
+</li>
+<li>icmp6
+: <a class="el" href="structstats__.html#a25a6b5940e32d53a066aa1bbc2028c03">stats_</a>
+</li>
+<li>ieee_802154_pan_id
+: <a class="el" href="structlowpan6__ieee802154__data.html#a017fc6f447215e4b65955ee7b1ed798f">lowpan6_ieee802154_data</a>
+</li>
+<li>if_idx
+: <a class="el" href="structpbuf.html#a6a58e90efbb4751608e9a1fdbd91e697">pbuf</a>
+</li>
+<li>ifindiscards
+: <a class="el" href="structstats__mib2__netif__ctrs.html#a4a767e6b835d5ad2f9b73751de2b0947">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifinerrors
+: <a class="el" href="structstats__mib2__netif__ctrs.html#afda1a14dc79bb65a33f97f9fb467ec1d">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifinnucastpkts
+: <a class="el" href="structstats__mib2__netif__ctrs.html#a111f08290b3c6944108237cefba066dd">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifinoctets
+: <a class="el" href="structstats__mib2__netif__ctrs.html#a7e9ddf9b4a17748a9d3f041c1d24ba8e">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifinucastpkts
+: <a class="el" href="structstats__mib2__netif__ctrs.html#a9ed42d6329a9616669ba21789fa001d8">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifinunknownprotos
+: <a class="el" href="structstats__mib2__netif__ctrs.html#ac34eb01b42f22b1e49ca7c9734e737aa">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifoutdiscards
+: <a class="el" href="structstats__mib2__netif__ctrs.html#a3a2aec508fd4466ca8bab10d8dc2c842">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifouterrors
+: <a class="el" href="structstats__mib2__netif__ctrs.html#a91b60bb78759c9b655a74bb4fae3346e">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifoutnucastpkts
+: <a class="el" href="structstats__mib2__netif__ctrs.html#afd3264670c39cc0d721a35cb6650f8d7">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifoutoctets
+: <a class="el" href="structstats__mib2__netif__ctrs.html#a24151d13a55452518e5f7832f48bd5a7">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifoutucastpkts
+: <a class="el" href="structstats__mib2__netif__ctrs.html#a24aba9660a2951027b23d4118b57c471">stats_mib2_netif_ctrs</a>
+</li>
+<li>igmp
+: <a class="el" href="structstats__.html#a877e369c2abef97f13492faa838e2271">stats_</a>
+</li>
+<li>igmp_mac_filter
+: <a class="el" href="structnetif.html#ae64e56581bf0f136601f24c5395c19f0">netif</a>
+</li>
+<li>inpub_pkt_id
+: <a class="el" href="structmqtt__client__s.html#a6c81d0dd14e786222425ea04fd060824">mqtt_client_s</a>
+</li>
+<li>input
+: <a class="el" href="structnetif.html#a8fe4f1b7b0d710216287da9615164a5c">netif</a>
+</li>
+<li>instance_oid
+: <a class="el" href="structsnmp__node__instance.html#aedb358729c310c8e5b391dd256726a23">snmp_node_instance</a>
+</li>
+<li>ip
+: <a class="el" href="structstats__.html#a40f5b637d083896a07a3482ede23b7ed">stats_</a>
+</li>
+<li>ip6
+: <a class="el" href="structstats__.html#afc0942a5bc26735cf059099636b85336">stats_</a>
+</li>
+<li>ip6_addr
+: <a class="el" href="structnetif.html#ab7ef575d4ab398a182bc6e592f4d53a4">netif</a>
+</li>
+<li>ip6_addr_state
+: <a class="el" href="structnetif.html#a54e81344084e9840a51cc4abab3b059b">netif</a>
+</li>
+<li>ip6_addr_valid_life
+: <a class="el" href="structnetif.html#a26f6e26d4a54c998716c10b7b85c8230">netif</a>
+</li>
+<li>ip6_autoconfig_enabled
+: <a class="el" href="structnetif.html#ad98bafb7733b40ef898e53d91fbfa20f">netif</a>
+</li>
+<li>ip6_frag
+: <a class="el" href="structstats__.html#a7373df7bc44bb9913a42c0bc7b3039cf">stats_</a>
+</li>
+<li>ip_addr
+: <a class="el" href="structnetif.html#a9776aaee37ea8f07b9ddc0f8b4e7e866">netif</a>
+</li>
+<li>ip_frag
+: <a class="el" href="structstats__.html#a81fcccf03ab0d4e31423f39d0c880302">stats_</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_j.html b/doc/doxygen/output/html/functions_j.html
new file mode 100644
index 0000000..dd37de2
--- /dev/null
+++ b/doc/doxygen/output/html/functions_j.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_j.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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"></a>- j -</h3><ul>
+<li>jl
+: <a class="el" href="structapi__msg.html#a6387bddb309c218ac0ccc5ef6d7a033e">api_msg</a>
+</li>
+<li>jumpers
+: <a class="el" href="structnetbios__answer.html#a69cd3e8b8265531a7ce3e5cbd4911683">netbios_answer</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_k.html b/doc/doxygen/output/html/functions_k.html
new file mode 100644
index 0000000..2f22947
--- /dev/null
+++ b/doc/doxygen/output/html/functions_k.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_k.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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_k"></a>- k -</h3><ul>
+<li>keep_alive
+: <a class="el" href="structmqtt__connect__client__info__t.html#ac80262a7456812e9eefffd8c3b9ac21a">mqtt_connect_client_info_t</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_l.html b/doc/doxygen/output/html/functions_l.html
new file mode 100644
index 0000000..cfc212a
--- /dev/null
+++ b/doc/doxygen/output/html/functions_l.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_l.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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_l"></a>- l -</h3><ul>
+<li>last_reporter_flag
+: <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
+: <a class="el" href="structautoip.html#a2f51d8cde73e20d6e0ae3ec8053afb55">autoip</a>
+</li>
+<li>lastdata
+: <a class="el" href="structlwip__sock.html#aa487ac16b7e5b6a2a618b7b5060247e1">lwip_sock</a>
+</li>
+<li>legacy_query
+: <a class="el" href="structmdns__outpacket.html#aff8c520bffa87c78e0ee2440571bbd65">mdns_outpacket</a>
+</li>
+<li>len
+: <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
+: <a class="el" href="structnetconn.html#a25ed06d944da0b0b9e7db5265be3fa3d">netconn</a>
+</li>
+<li>link
+: <a class="el" href="structstats__.html#a67759c9b0059bf569f9f771df23924eb">stats_</a>
+</li>
+<li>link_callback
+: <a class="el" href="structnetif.html#a4388cfadc8b4e9a9c1c93ce777bc3673">netif</a>
+</li>
+<li>link_speed
+: <a class="el" href="structnetif.html#a908452e854180941054ed89f52bb8094">netif</a>
+</li>
+<li>link_type
+: <a class="el" href="structnetif.html#ad0ee2a2169e384a2977ece2c471e0062">netif</a>
+</li>
+<li>linkoutput
+: <a class="el" href="structnetif.html#acaaac9b415a7be73eb8a287c8ed18a8d">netif</a>
+</li>
+<li>llipaddr
+: <a class="el" href="structautoip.html#a13b5da8a86839b4cd9bd9f5400ac9dc7">autoip</a>
+</li>
+<li>local_ip
+: <a class="el" href="structtcp__pcb.html#a0c4f101d55debee0d8fad86a7eb4f76f">tcp_pcb</a>
+, <a class="el" href="structtcp__pcb__listen.html#a8a4f7b0551a0c6926a08ea5b6b3d5987">tcp_pcb_listen</a>
+, <a class="el" href="structudp__pcb.html#a6160ea5e52f0d33e51b16b853ea1cd63">udp_pcb</a>
+</li>
+<li>local_port
+: <a class="el" href="structudp__pcb.html#a8cc805631142eefc5593ae8ba3302d7c">udp_pcb</a>
+</li>
+<li>lowpan6_context
+: <a class="el" href="structlowpan6__ieee802154__data.html#a190c9c06dfe1075abb7399f99553b507">lowpan6_ieee802154_data</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_m.html b/doc/doxygen/output/html/functions_m.html
new file mode 100644
index 0000000..b6bb77e
--- /dev/null
+++ b/doc/doxygen/output/html/functions_m.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_m.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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_m"></a>- m -</h3><ul>
+<li>max_fdb_dynamic_entries
+: <a class="el" href="structbridgeif__initdata__s.html#aeb312c2e698513c6416d5c8459ad622f">bridgeif_initdata_s</a>
+</li>
+<li>max_fdb_static_entries
+: <a class="el" href="structbridgeif__initdata__s.html#a210915aa1b0436ccabc7e8d9fd3c3fe6">bridgeif_initdata_s</a>
+</li>
+<li>max_number_of_pending_sessions
+: <a class="el" href="structnetbios__answer.html#a58aba600ed34b7c689606c296ef57c8c">netbios_answer</a>
+</li>
+<li>max_ports
+: <a class="el" href="structbridgeif__initdata__s.html#a0e0bb6a885967b5fcfef09a8f0adc63f">bridgeif_initdata_s</a>
+</li>
+<li>max_total_number_of_command_blocks
+: <a class="el" href="structnetbios__answer.html#a9cf85c173fe0d99c1c4e7e09aaeed9b8">netbios_answer</a>
+</li>
+<li>max_total_sessions_possible
+: <a class="el" href="structnetbios__answer.html#a0069c9ae014881298828660787fa945e">netbios_answer</a>
+</li>
+<li>mcast_ifindex
+: <a class="el" href="structraw__pcb.html#a5124a21e1523c774bd76c0eabc7c7ca8">raw_pcb</a>
+, <a class="el" href="structudp__pcb.html#ac80ae56333b88cea08bfa3563b0dd3cd">udp_pcb</a>
+</li>
+<li>mcast_ip4
+: <a class="el" href="structudp__pcb.html#a1c32c7ebd76898cf8f1227c10d34dbe0">udp_pcb</a>
+</li>
+<li>mcast_ttl
+: <a class="el" href="structraw__pcb.html#a2ecc77e919de9bb552d1c70e771e2cad">raw_pcb</a>
+, <a class="el" href="structudp__pcb.html#aaab9255f7f1186aef12d45c9bb90d3f4">udp_pcb</a>
+</li>
+<li>mem
+: <a class="el" href="structstats__.html#a656444f95080c6a3d474f73a6fcd9b1c">stats_</a>
+</li>
+<li>memp
+: <a class="el" href="structstats__.html#aa75d6b389e94b0f619b5db0daaf569fc">stats_</a>
+</li>
+<li>mib2
+: <a class="el" href="structstats__.html#ac001c065c56c26c3952b19b9ce0d5832">stats_</a>
+</li>
+<li>mib2_counters
+: <a class="el" href="structnetif.html#ab32cbe1851154fd020bac4be558f5fd5">netif</a>
+</li>
+<li>mld6
+: <a class="el" href="structstats__.html#ab0ad1d07dff25cd3e4a8e5be607497f8">stats_</a>
+</li>
+<li>mld_mac_filter
+: <a class="el" href="structnetif.html#abc67963ff9f574e98ef9c50138a3e470">netif</a>
+</li>
+<li>msg
+: <a class="el" href="structapi__msg.html#aef71459b5251d796434f741ca630d528">api_msg</a>
+</li>
+<li>msg_idx
+: <a class="el" href="structmqtt__client__s.html#aae7bd1da3461efef9616934feb166aa5">mqtt_client_s</a>
+</li>
+<li>mtu
+: <a class="el" href="structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48">netif</a>
+</li>
+<li>mtu6
+: <a class="el" href="structnetif.html#acd78fca5dad6468605f38e327b3a5e72">netif</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_n.html b/doc/doxygen/output/html/functions_n.html
new file mode 100644
index 0000000..0cdf9c5
--- /dev/null
+++ b/doc/doxygen/output/html/functions_n.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_n.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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"></a>- n -</h3><ul>
+<li>n
+: <a class="el" href="structapi__msg.html#adbbfc2baa8088b31fc722365237e5807">api_msg</a>
+</li>
+<li>name
+: <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>name_size
+: <a class="el" href="structnetbios__answer.html#a5828dc04e01a1f7b734019db428fd46d">netbios_answer</a>
+</li>
+<li>nd6
+: <a class="el" href="structstats__.html#ab348a3a4b593b05d7df1293a06af8adf">stats_</a>
+</li>
+<li>netif
+: <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
+: <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>node
+: <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
+: <a class="el" href="structsnmp__node.html#a1af8e20a688943a419b307bf123b1851">snmp_node</a>
+</li>
+<li>num
+: <a class="el" href="structmemp__desc.html#a2c32db78e565b8812ca0e20fe929a8a7">memp_desc</a>
+, <a class="el" href="structnetif.html#ab7ef01e505dd2feb781fe86756b1c973">netif</a>
+</li>
+<li>number_of_alignment_errors
+: <a class="el" href="structnetbios__answer.html#ab4f9ff63bd5529418c07762506189ad2">netbios_answer</a>
+</li>
+<li>number_of_collisions
+: <a class="el" href="structnetbios__answer.html#a45b7aec200434d3aaabc3ea6ebc46c1e">netbios_answer</a>
+</li>
+<li>number_of_crcs
+: <a class="el" href="structnetbios__answer.html#ab23a11db86a170b46aa8f8af434534d8">netbios_answer</a>
+</li>
+<li>number_of_free_command_blocks
+: <a class="el" href="structnetbios__answer.html#af41cbffb0ac6a9db3305b3fc64646219">netbios_answer</a>
+</li>
+<li>number_of_good_receives
+: <a class="el" href="structnetbios__answer.html#a0eab7dbe733cc50f515126649de596ea">netbios_answer</a>
+</li>
+<li>number_of_good_sends
+: <a class="el" href="structnetbios__answer.html#aa6088bca2a59ffcd077a474330511abd">netbios_answer</a>
+</li>
+<li>number_of_names
+: <a class="el" href="structnetbios__answer.html#ac4a95ccabbb945c9470e0cfd470be491">netbios_answer</a>
+</li>
+<li>number_of_no_resource_condition
+: <a class="el" href="structnetbios__answer.html#a62946dd0f27e9f9b9f295dcde4d3ea42">netbios_answer</a>
+</li>
+<li>number_of_pending_sessions
+: <a class="el" href="structnetbios__answer.html#a66098747155d5bd56f1c92aa8da10c1d">netbios_answer</a>
+</li>
+<li>number_of_retransmits
+: <a class="el" href="structnetbios__answer.html#ab175ad0f89102b3b3f81a41b5a72b321">netbios_answer</a>
+</li>
+<li>number_of_send_aborts
+: <a class="el" href="structnetbios__answer.html#a1560e3864a0821acea9410e8c1d21408">netbios_answer</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_o.html b/doc/doxygen/output/html/functions_o.html
new file mode 100644
index 0000000..0c7acc5
--- /dev/null
+++ b/doc/doxygen/output/html/functions_o.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_o.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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_o"></a>- o -</h3><ul>
+<li>offset
+: <a class="el" href="structapi__msg.html#a4bd9382dd42b18120803e246a0203353">api_msg</a>
+</li>
+<li>oid
+: <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
+: <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
+: <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>op_completed
+: <a class="el" href="structnetconn.html#a982506698a59f185ff3f16d1675ea4ae">netconn</a>
+</li>
+<li>open
+: <a class="el" href="structtftp__context.html#ae70d64e8e20328cc492d766506df4cba">tftp_context</a>
+</li>
+<li>original
+: <a class="el" href="structpbuf__custom__ref.html#a135a1476908337d8073241fd7f68fa1d">pbuf_custom_ref</a>
+</li>
+<li>output
+: <a class="el" href="structmqtt__client__s.html#a667c1dc7a6008055b63877acb06f333c">mqtt_client_s</a>
+, <a class="el" href="structnetif.html#a8e1dcfe65db487feecd244355f39215e">netif</a>
+</li>
+<li>output_ip6
+: <a class="el" href="structnetif.html#ac38383379cff22c402156fec71c19617">netif</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_p.html b/doc/doxygen/output/html/functions_p.html
new file mode 100644
index 0000000..9c00519
--- /dev/null
+++ b/doc/doxygen/output/html/functions_p.html
@@ -0,0 +1,164 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_p.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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_p"></a>- p -</h3><ul>
+<li>parse_offset
+: <a class="el" href="structmdns__packet.html#a4c3c3a28ac113b3ee40d5cf07d851f68">mdns_packet</a>
+</li>
+<li>pass
+: <a class="el" href="structsmtp__session.html#a7a5a3c00378ce076ce70236525afd431">smtp_session</a>
+</li>
+<li>passive_open
+: <a class="el" href="structtcp__ext__arg__callbacks.html#a86b5816e8285378813963d09272b050a">tcp_ext_arg_callbacks</a>
+</li>
+<li>payload
+: <a class="el" href="structpbuf.html#a8d32dc3e964369d4eec638fc37fbc460">pbuf</a>
+, <a class="el" href="structpbuf__rom.html#a5cd0dcc590038629644ad775d76230a1">pbuf_rom</a>
+</li>
+<li>pbuf
+: <a class="el" href="structmdns__outpacket.html#a83d4504736f2bf315fc8b712c6a446e9">mdns_outpacket</a>
+, <a class="el" href="structmdns__packet.html#a2ec02a67fd82f0df695e94745eddaf45">mdns_packet</a>
+, <a class="el" href="structpbuf__custom.html#a100e338f13464e76b46896647b962ed8">pbuf_custom</a>
+</li>
+<li>pc
+: <a class="el" href="structpbuf__custom__ref.html#af5884b6a7031d73406cb9596a51382b7">pbuf_custom_ref</a>
+</li>
+<li>pcb
+: <a class="el" href="structnetconn.html#a2af6773c9f6ee91e7f462dd8acc07de6">netconn</a>
+</li>
+<li>pend_req_queue
+: <a class="el" href="structmqtt__client__s.html#a1897eeefe64f9e2d2d953adca858f439">mqtt_client_s</a>
+</li>
+<li>pending_err
+: <a class="el" href="structnetconn.html#a2a54e90fa370cf0df46dfd0b97f1cce7">netconn</a>
+</li>
+<li>period_of_statistics
+: <a class="el" href="structnetbios__answer.html#a31ec9ea28b5801b9bb5f1b240d3412de">netbios_answer</a>
+</li>
+<li>pkt_id
+: <a class="el" href="structmqtt__request__t.html#af2dc3cd85cdad25b9b3e1534ecc0cb58">mqtt_request_t</a>
+</li>
+<li>pkt_id_seq
+: <a class="el" href="structmqtt__client__s.html#ab4100f6e0867c212d5923f10024f2e32">mqtt_client_s</a>
+</li>
+<li>poll_fds
+: <a class="el" href="structlwip__select__cb.html#ae39fc1bef3938380d15085e0141639de">lwip_select_cb</a>
+</li>
+<li>poll_nfds
+: <a class="el" href="structlwip__select__cb.html#a39c4980c261380481f79af2b536ebfba">lwip_select_cb</a>
+</li>
+<li>port
+: <a class="el" href="structmdns__service.html#abbf317cde8fb7ba8d834ad9746dd780c">mdns_service</a>
+</li>
+<li>prev
+: <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
+: <a class="el" href="structmdns__host.html#ac8f6e3c6e1251bf73f043e489c840922">mdns_host</a>
+</li>
+<li>probing_state
+: <a class="el" href="structmdns__host.html#af9ced31c35de6a281e5b13f01e5aae61">mdns_host</a>
+</li>
+<li>proto
+: <a class="el" href="structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d">mdns_service</a>
+</li>
+<li>ptr
+: <a class="el" href="structnetvector.html#a523362737ea7764f9aaa73a050a0b983">netvector</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_q.html b/doc/doxygen/output/html/functions_q.html
new file mode 100644
index 0000000..1267836
--- /dev/null
+++ b/doc/doxygen/output/html/functions_q.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_q.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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_q"></a>- q -</h3><ul>
+<li>q
+: <a class="el" href="structnd6__neighbor__cache__entry.html#a830674446a45eb200d38a45fbdd5c5df">nd6_neighbor_cache_entry</a>
+</li>
+<li>query_name
+: <a class="el" href="structnetbios__answer.html#aa024ce7e0e233c42393f5c3c378d3f9b">netbios_answer</a>
+</li>
+<li>questions
+: <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
+: <a class="el" href="structmdns__packet.html#afdb9c14dd0c915119b8adb584381a437">mdns_packet</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_r.html b/doc/doxygen/output/html/functions_r.html
new file mode 100644
index 0000000..91db0ec
--- /dev/null
+++ b/doc/doxygen/output/html/functions_r.html
@@ -0,0 +1,154 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_r.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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"></a>- r -</h3><ul>
+<li>r
+: <a class="el" href="structapi__msg.html#aebd72e07e711e7135294563b82c98cdf">api_msg</a>
+</li>
+<li>rcvevent
+: <a class="el" href="structlwip__sock.html#af40d67cbaef4318d26e560988b6e1b3a">lwip_sock</a>
+</li>
+<li>reachability
+: <a class="el" href="structsntp__server.html#a2e9283bb8f94930fd2a2c3f24fc4b40d">sntp_server</a>
+</li>
+<li>read
+: <a class="el" href="structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c">tftp_context</a>
+</li>
+<li>readset
+: <a class="el" href="structlwip__select__cb.html#a8694a2ce0dd5f91be84056982b96978e">lwip_select_cb</a>
+</li>
+<li>reass_list
+: <a class="el" href="structlowpan6__ieee802154__data.html#a8c33e7a2026e6e93a2085f3d14378d35">lowpan6_ieee802154_data</a>
+</li>
+<li>recv
+: <a class="el" href="structraw__pcb.html#a963b023239ad97c05536046ed7058a10">raw_pcb</a>
+, <a class="el" href="structudp__pcb.html#ac05dee75a3d6666267f7e626c2ec56a8">udp_pcb</a>
+</li>
+<li>recv_arg
+: <a class="el" href="structudp__pcb.html#a11e4c40b8868aa40d923756a60598cab">udp_pcb</a>
+</li>
+<li>recv_avail
+: <a class="el" href="structnetconn.html#a05b15a28b0803bea3729b1da2047541e">netconn</a>
+</li>
+<li>recv_bufsize
+: <a class="el" href="structnetconn.html#a6febc9717418ddba16f16e988061cfac">netconn</a>
+</li>
+<li>recv_unicast
+: <a class="el" href="structmdns__packet.html#a8659b4f582be0df84b6ae91308737377">mdns_packet</a>
+</li>
+<li>recvmbox
+: <a class="el" href="structnetconn.html#a9f2bf6a3865b6a22a8a71ec2f3e770da">netconn</a>
+</li>
+<li>ref
+: <a class="el" href="structpbuf.html#a62fe38eb0cf31027dc1fb9cbe7b55ba7">pbuf</a>
+</li>
+<li>reference
+: <a class="el" href="structsnmp__node__instance.html#a55f53419cd5b369b771153ca2598ebc5">snmp_node_instance</a>
+</li>
+<li>reference_len
+: <a class="el" href="structsnmp__node__instance.html#ad289957b34b4e55915fa79f37c4d9d54">snmp_node_instance</a>
+</li>
+<li>release_instance
+: <a class="el" href="structsnmp__node__instance.html#a20a256c54fab19a455ecf6deff76c6de">snmp_node_instance</a>
+</li>
+<li>remove_callback
+: <a class="el" href="structnetif.html#ae06deb532ead2e3009ba4e58aae6ca07">netif</a>
+</li>
+<li>rs_count
+: <a class="el" href="structnetif.html#a9c1f9f28bde60aa868bc3296bee7b1b6">netif</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_s.html b/doc/doxygen/output/html/functions_s.html
new file mode 100644
index 0000000..d22b9b1
--- /dev/null
+++ b/doc/doxygen/output/html/functions_s.html
@@ -0,0 +1,185 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_s.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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"></a>- s -</h3><ul>
+<li>sd
+: <a class="el" href="structapi__msg.html#ad5e8bf133bc5ba4c78822af297330ce4">api_msg</a>
+</li>
+<li>select_waiting
+: <a class="el" href="structlwip__sock.html#aadbcf5ec3d50631d8821200163d88d38">lwip_sock</a>
+</li>
+<li>sem
+: <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
+: <a class="el" href="structlwip__select__cb.html#a1c00f1159e9e8eb7cca02c497605cd99">lwip_select_cb</a>
+</li>
+<li>send_timeout
+: <a class="el" href="structnetconn.html#a44e55724482b8e447134f5ba4f01551a">netconn</a>
+</li>
+<li>sendevent
+: <a class="el" href="structlwip__sock.html#a7e282776681ea4b7bd389950a8a64fa8">lwip_sock</a>
+</li>
+<li>sent_num
+: <a class="el" href="structautoip.html#a9d3e3bab2f12b7c7283177fbf039fb25">autoip</a>
+</li>
+<li>sequence_number
+: <a class="el" href="structieee__802154__hdr.html#a870001205f5a3ce45ce0b2f323275869">ieee_802154_hdr</a>
+</li>
+<li>service
+: <a class="el" href="structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad">mdns_service</a>
+</li>
+<li>services
+: <a class="el" href="structmdns__host.html#a750c31340c22e51375e4dc3e6e94f2ed">mdns_host</a>
+</li>
+<li>session_data_packet_size
+: <a class="el" href="structnetbios__answer.html#abec38f20bb460ddc2d6e8c9b9208608c">netbios_answer</a>
+</li>
+<li>set_test
+: <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
+: <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
+: <a class="el" href="structmemp__desc.html#a1688d2bdd5a7b77700e1fa627f025ba3">memp_desc</a>
+</li>
+<li>socket
+: <a class="el" href="structnetconn.html#ac8e05eb65774665e364a3dcf0f139b36">netconn</a>
+</li>
+<li>source_addr
+: <a class="el" href="structmdns__packet.html#aaa64cc21495dc6bb76ed9125904dd07a">mdns_packet</a>
+</li>
+<li>source_address
+: <a class="el" href="structieee__802154__hdr.html#aa96c037381583756e79bc6ecede27937">ieee_802154_hdr</a>
+</li>
+<li>source_pan_id
+: <a class="el" href="structieee__802154__hdr.html#ab67fc612a7fd7dcaf46401e4719fa2b2">ieee_802154_hdr</a>
+</li>
+<li>src
+: <a class="el" href="structip6__hdr.html#af0df3214134f29827c27e66b2970c6ef">ip6_hdr</a>
+</li>
+<li>state
+: <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>static_data
+: <a class="el" href="structsmtp__send__request.html#a4d517ae8b29caa4f0b371923379d9ef4">smtp_send_request</a>
+</li>
+<li>stats
+: <a class="el" href="structmemp__desc.html#a05cb67eb408e4736cc0f5e32b5db7500">memp_desc</a>
+</li>
+<li>status_callback
+: <a class="el" href="structnetif.html#a1513e81d02557d2a950e965f18b53a45">netif</a>
+</li>
+<li>subject
+: <a class="el" href="structsmtp__session.html#ab8240801e229ee260f3feeaa270520c7">smtp_session</a>
+</li>
+<li>subject_len
+: <a class="el" href="structsmtp__session.html#aea48a6edd3ede02b26882c7b8d72646c">smtp_session</a>
+</li>
+<li>sys
+: <a class="el" href="structstats__.html#a317123da6c92aa9d2fa40e8060357035">stats_</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_t.html b/doc/doxygen/output/html/functions_t.html
new file mode 100644
index 0000000..c7488ba
--- /dev/null
+++ b/doc/doxygen/output/html/functions_t.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_t.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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_t"></a>- t -</h3><ul>
+<li>tab
+: <a class="el" href="structmemp__desc.html#a9d6b758ce5c3b47a67a7568d38fb3926">memp_desc</a>
+</li>
+<li>tcp
+: <a class="el" href="structstats__.html#a32ef1aaa427d62a5c7890de0ac23fe86">stats_</a>
+</li>
+<li>test_result
+: <a class="el" href="structnetbios__answer.html#a91116fe26c8050ee166053f377b40c7f">netbios_answer</a>
+</li>
+<li>timeout_diff
+: <a class="el" href="structmqtt__request__t.html#a65a7292669bc1f2d9df8f30bbcd77073">mqtt_request_t</a>
+</li>
+<li>timer
+: <a class="el" href="structigmp__group.html#a8e2227e486652603fcd7f88681d4c75b">igmp_group</a>
+, <a class="el" href="structmld__group.html#a21f31e845cb11d2aca4ae7120736f69a">mld_group</a>
+, <a class="el" href="structsmtp__session.html#a5884425cb5ce964d8383b29cc20208d7">smtp_session</a>
+</li>
+<li>tls_config
+: <a class="el" href="structmqtt__connect__client__info__t.html#a45987acc116de5d27fff6856778e55b4">mqtt_connect_client_info_t</a>
+</li>
+<li>to
+: <a class="el" href="structsmtp__session.html#a70b3753bc70e65f779279c246617faea">smtp_session</a>
+</li>
+<li>to_len
+: <a class="el" href="structsmtp__session.html#a66b8e1dd314976788e9ac9a81f59a402">smtp_session</a>
+</li>
+<li>tot_len
+: <a class="el" href="structpbuf.html#a5259e7ec29bab9c0999b64f2e86b411f">pbuf</a>
+</li>
+<li>total_number_of_command_blocks
+: <a class="el" href="structnetbios__answer.html#a4c7ea5d1839fd27232877880e43485a2">netbios_answer</a>
+</li>
+<li>tried_llipaddr
+: <a class="el" href="structautoip.html#a472f3d18c07b3df024a0cde8f4ffa853">autoip</a>
+</li>
+<li>ts
+: <a class="el" href="structnetif.html#a1bb4e3aed6e0fd4b6b31ee82d806f971">netif</a>
+</li>
+<li>ttw
+: <a class="el" href="structautoip.html#a7510d9a2961ea7c28ebfcde6390284bf">autoip</a>
+</li>
+<li>tx_buf
+: <a class="el" href="structsmtp__session.html#a42cedb495f7423b9e28979ce1e460c61">smtp_session</a>
+</li>
+<li>tx_datagram_tag
+: <a class="el" href="structlowpan6__ieee802154__data.html#a64560b289f86efe1d39ece603cd14b5c">lowpan6_ieee802154_data</a>
+</li>
+<li>tx_frame_seq_num
+: <a class="el" href="structlowpan6__ieee802154__data.html#ad9cd994385c4d1d8ef0a22686c17720c">lowpan6_ieee802154_data</a>
+</li>
+<li>tx_id
+: <a class="el" href="structmdns__outpacket.html#ac470f02a9f332f18e027437dc293d348">mdns_outpacket</a>
+, <a class="el" href="structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00">mdns_packet</a>
+</li>
+<li>txt_fn
+: <a class="el" href="structmdns__service.html#a79bc4946c96a3b2d0713bc0897c4bd9c">mdns_service</a>
+</li>
+<li>txtdata
+: <a class="el" href="structmdns__service.html#a35daff90a18d19b14f23fa02df424f94">mdns_service</a>
+</li>
+<li>type
+: <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>
+<li>type_internal
+: <a class="el" href="structpbuf.html#a61a26ac8393dc9e549016b86c2cf5131">pbuf</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_u.html b/doc/doxygen/output/html/functions_u.html
new file mode 100644
index 0000000..994b222
--- /dev/null
+++ b/doc/doxygen/output/html/functions_u.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_u.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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_u"></a>- u -</h3><ul>
+<li>udp
+: <a class="el" href="structstats__.html#a626e03d4bded6480582789cfd17d4063">stats_</a>
+</li>
+<li>unicast_reply
+: <a class="el" href="structmdns__outpacket.html#a68255725575af086a3afa76bc5c8e64d">mdns_outpacket</a>
+</li>
+<li>unit_id
+: <a class="el" href="structnetbios__answer.html#aeed6aa8ba4f8bb107d141b3b3d0a1787">netbios_answer</a>
+</li>
+<li>use
+: <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
+: <a class="el" href="structmem.html#aa76b6a39425617435978dce903f0d456">mem</a>
+</li>
+<li>username
+: <a class="el" href="structsmtp__session.html#a568e3def9d0ec54e3c079f577717a6bb">smtp_session</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_v.html b/doc/doxygen/output/html/functions_v.html
new file mode 100644
index 0000000..1c4019c
--- /dev/null
+++ b/doc/doxygen/output/html/functions_v.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_v.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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_v"></a>- v -</h3><ul>
+<li>value
+: <a class="el" href="structsnmp__varbind.html#a328227d7ae188a0a2feb95f8000aac45">snmp_varbind</a>
+</li>
+<li>value_len
+: <a class="el" href="structsnmp__varbind.html#ab094577fac6c7cc16ad666c9970cdb85">snmp_varbind</a>
+</li>
+<li>vector
+: <a class="el" href="structapi__msg.html#a1ceb9822ba49ba439e30d98492593612">api_msg</a>
+</li>
+<li>vector_cnt
+: <a class="el" href="structapi__msg.html#ab6f14157a3e6735b69a569249d3286a2">api_msg</a>
+</li>
+<li>vector_off
+: <a class="el" href="structapi__msg.html#a6896ae78ebddefdf2d8358ab5f21f444">api_msg</a>
+</li>
+<li>version_number
+: <a class="el" href="structnetbios__answer.html#a151dce0f0bf626b2a54fbb75775237ba">netbios_answer</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars.html b/doc/doxygen/output/html/functions_vars.html
new file mode 100644
index 0000000..81ffa0b
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index__"></a>- _ -</h3><ul>
+<li>_hoplim
+: <a class="el" href="structip6__hdr.html#af9cbfa5fa280a7a982a1c6268fa13a5a">ip6_hdr</a>
+</li>
+<li>_nexth
+: <a class="el" href="structip6__hdr.html#abe3d612d4570864c922e18ed838292f6">ip6_hdr</a>
+</li>
+<li>_plen
+: <a class="el" href="structip6__hdr.html#a9d225109d601ae8b34bab6ca3528fa94">ip6_hdr</a>
+</li>
+<li>_v_tc_fl
+: <a class="el" href="structip6__hdr.html#ad3b638f503a3f7e7724cf4c7b2c0a0b5">ip6_hdr</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars.js b/doc/doxygen/output/html/functions_vars.js
new file mode 100644
index 0000000..fb72348
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars.js
@@ -0,0 +1,28 @@
+var functions_vars =
+[
+    [ "_", "functions_vars.html", null ],
+    [ "a", "functions_vars_a.html", null ],
+    [ "b", "functions_vars_b.html", null ],
+    [ "c", "functions_vars_c.html", null ],
+    [ "d", "functions_vars_d.html", null ],
+    [ "e", "functions_vars_e.html", null ],
+    [ "f", "functions_vars_f.html", null ],
+    [ "g", "functions_vars_g.html", null ],
+    [ "h", "functions_vars_h.html", null ],
+    [ "i", "functions_vars_i.html", null ],
+    [ "j", "functions_vars_j.html", null ],
+    [ "k", "functions_vars_k.html", null ],
+    [ "l", "functions_vars_l.html", null ],
+    [ "m", "functions_vars_m.html", null ],
+    [ "n", "functions_vars_n.html", null ],
+    [ "o", "functions_vars_o.html", null ],
+    [ "p", "functions_vars_p.html", null ],
+    [ "q", "functions_vars_q.html", null ],
+    [ "r", "functions_vars_r.html", null ],
+    [ "s", "functions_vars_s.html", null ],
+    [ "t", "functions_vars_t.html", null ],
+    [ "u", "functions_vars_u.html", null ],
+    [ "v", "functions_vars_v.html", null ],
+    [ "w", "functions_vars_w.html", null ],
+    [ "z", "functions_vars_z.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/functions_vars_a.html b/doc/doxygen/output/html/functions_vars_a.html
new file mode 100644
index 0000000..b30a446
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_a.html
@@ -0,0 +1,153 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_a.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_a"></a>- a -</h3><ul>
+<li>acceptmbox
+: <a class="el" href="structnetconn.html#a9b59188f300828d2b5814e27ab27cad0">netconn</a>
+</li>
+<li>access
+: <a class="el" href="structsnmp__node__instance.html#a4af17d17a971f1d11a186e6e1fc4411c">snmp_node_instance</a>
+</li>
+<li>ad
+: <a class="el" href="structapi__msg.html#a36dedcbd9ecca67043a8e1d1e715be94">api_msg</a>
+</li>
+<li>additional
+: <a class="el" href="structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce">mdns_outpacket</a>
+</li>
+<li>addr
+: <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
+: <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
+: <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
+: <a class="el" href="structaltcp__allocator__s.html#aaf07ebf181a11d0320381ef46d40e687">altcp_allocator_s</a>
+</li>
+<li>answer_name
+: <a class="el" href="structnetbios__answer.html#abf746cd54add594216ddc3683c741406">netbios_answer</a>
+</li>
+<li>answer_name_flags
+: <a class="el" href="structnetbios__answer.html#a2729b7249e3d23309624cb19fa0dbfc4">netbios_answer</a>
+</li>
+<li>answers
+: <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
+: <a class="el" href="structmdns__packet.html#a56ba495a1458a21982e65d746468849d">mdns_packet</a>
+</li>
+<li>arg
+: <a class="el" href="structaltcp__allocator__s.html#a8d8aa48e9a105e9d25ad4b90d259d0b1">altcp_allocator_s</a>
+</li>
+<li>asn1_type
+: <a class="el" href="structsnmp__node__instance.html#af51206e0912a8402c395dcf3b623f8b9">snmp_node_instance</a>
+</li>
+<li>auth_plain
+: <a class="el" href="structsmtp__session.html#a9da4e424e22892fae51987665eca85a9">smtp_session</a>
+</li>
+<li>auth_plain_len
+: <a class="el" href="structsmtp__session.html#a003dfd03ac58252b575a7c965e532461">smtp_session</a>
+</li>
+<li>authoritative
+: <a class="el" href="structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035">mdns_outpacket</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_b.html b/doc/doxygen/output/html/functions_vars_b.html
new file mode 100644
index 0000000..ce95540
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_b.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_b.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_b"></a>- b -</h3><ul>
+<li>b
+: <a class="el" href="structapi__msg.html#ab0abd60527e96cc24c2c20c835cdac05">api_msg</a>
+</li>
+<li>base
+: <a class="el" href="structmemp__desc.html#a9aec58adcbcd88167247296ca4346558">memp_desc</a>
+</li>
+<li>bc
+: <a class="el" href="structapi__msg.html#a1705127c6cd22c2c6dbbcc59834e41e0">api_msg</a>
+</li>
+<li>body
+: <a class="el" href="structsmtp__session.html#a7bb4bf5cc209e073341b56845e5cbd49">smtp_session</a>
+</li>
+<li>body_len
+: <a class="el" href="structsmtp__session.html#a0da8b775ddfe5f8891464037a6b4bb4d">smtp_session</a>
+</li>
+<li>body_sent
+: <a class="el" href="structsmtp__session.html#a5893c61d863b4846a81d8a4bbcaebb5b">smtp_session</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_c.html b/doc/doxygen/output/html/functions_vars_c.html
new file mode 100644
index 0000000..1cc4e7d
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_c.html
@@ -0,0 +1,169 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_c"></a>- c -</h3><ul>
+<li>cache_flush
+: <a class="el" href="structmdns__outpacket.html#a9bd0fd91dda48baa2938dddd747d3195">mdns_outpacket</a>
+</li>
+<li>callback
+: <a class="el" href="structnetconn.html#abe796060bb06e585333ca9a87862b624">netconn</a>
+</li>
+<li>callback_arg
+: <a class="el" href="structsmtp__session.html#af0544df7a935a092d825d8f2380f970f">smtp_session</a>
+</li>
+<li>callback_fn
+: <a class="el" href="structsmtp__session.html#a24c13d621e18311a613ab68b856a7f7b">smtp_session</a>
+</li>
+<li>cb
+: <a class="el" href="structmqtt__request__t.html#a32a4b14b0b8b5b8ce8db1074e53f4a79">mqtt_request_t</a>
+</li>
+<li>chksum_len_rx
+: <a class="el" href="structudp__pcb.html#a5e2833df51760c83c6032608eb5d0d4d">udp_pcb</a>
+</li>
+<li>client_id
+: <a class="el" href="structmqtt__connect__client__info__t.html#ad35f7850df21f001d5c5ffaa1a18c05a">mqtt_connect_client_info_t</a>
+</li>
+<li>client_pass
+: <a class="el" href="structmqtt__connect__client__info__t.html#a8f68efe91c5311418151256c96102d4b">mqtt_connect_client_info_t</a>
+</li>
+<li>client_user
+: <a class="el" href="structmqtt__connect__client__info__t.html#aec961673d5c3e8dc853c91f30d9333b5">mqtt_connect_client_info_t</a>
+</li>
+<li>close
+: <a class="el" href="structtftp__context.html#ae9181c57d1cf89bc263f7671e5630a65">tftp_context</a>
+</li>
+<li>conn
+: <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
+: <a class="el" href="structmqtt__client__s.html#af4a07c1079e2e2a336f1939d8b9677e6">mqtt_client_s</a>
+</li>
+<li>connect_arg
+: <a class="el" href="structmqtt__client__s.html#ae6d53359ec6d70533dab7c0d2717ce1a">mqtt_client_s</a>
+</li>
+<li>current_input_netif
+: <a class="el" href="structip__globals.html#a7da899c663b1d560b61d92ba6d544701">ip_globals</a>
+</li>
+<li>current_ip4_header
+: <a class="el" href="structip__globals.html#a2e810f97cf3e8e855e3baafc3be8c0d4">ip_globals</a>
+</li>
+<li>current_ip6_header
+: <a class="el" href="structip__globals.html#aa5cfc3ac29dc746a4cbe844206b0ed41">ip_globals</a>
+</li>
+<li>current_ip_header_tot_len
+: <a class="el" href="structip__globals.html#a17004526e6f1a164c0bab01aeac5e34a">ip_globals</a>
+</li>
+<li>current_iphdr_dest
+: <a class="el" href="structip__globals.html#a0b4e54250c692c638408de54593d2aa1">ip_globals</a>
+</li>
+<li>current_iphdr_src
+: <a class="el" href="structip__globals.html#a04d85a3dc2c417050b3e088fa58a74b0">ip_globals</a>
+</li>
+<li>current_msg
+: <a class="el" href="structnetconn.html#a49ba09038b2f2563fd3a38e38f8b8ab9">netconn</a>
+</li>
+<li>current_netif
+: <a class="el" href="structip__globals.html#a7803dc5950d143e4433a0df689989bab">ip_globals</a>
+</li>
+<li>custom_free_function
+: <a class="el" href="structpbuf__custom.html#af614d17874746cbbf778dc4ca9eac2e9">pbuf_custom</a>
+</li>
+<li>cyclic_tick
+: <a class="el" href="structmqtt__client__s.html#a6274ba2eb2fe6afa970b1c8a650d8cef">mqtt_client_s</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_d.html b/doc/doxygen/output/html/functions_vars_d.html
new file mode 100644
index 0000000..0564f15
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_d.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_d.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>data_cb
+: <a class="el" href="structmqtt__client__s.html#a26dc9112351c042594a41703197925a7">mqtt_client_s</a>
+</li>
+<li>dest_addr
+: <a class="el" href="structmdns__outpacket.html#a1fdc90b48d8cf1fc24895f0c7a5798e4">mdns_outpacket</a>
+</li>
+<li>destination_address
+: <a class="el" href="structieee__802154__hdr.html#a87ce59d2804cacc5a58411c8b6c47f33">ieee_802154_hdr</a>
+</li>
+<li>destination_pan_id
+: <a class="el" href="structieee__802154__hdr.html#ac1ad9159d3bb70b1a7223060c6c81efd">ieee_802154_hdr</a>
+</li>
+<li>destroy
+: <a class="el" href="structtcp__ext__arg__callbacks.html#ace586d5d376b42465927a4fd8688c24b">tcp_ext_arg_callbacks</a>
+</li>
+<li>dns_addrtype
+: <a class="el" href="structdns__api__msg.html#afb2536a6c342bed4c4ad9d75982f7493">dns_api_msg</a>
+</li>
+<li>dns_ttl
+: <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
+: <a class="el" href="structmdns__outpacket.html#aee97e98c4869aa63ffe348d38d87221f">mdns_outpacket</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_e.html b/doc/doxygen/output/html/functions_vars_e.html
new file mode 100644
index 0000000..f05a84d
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_e.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_e.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_e"></a>- e -</h3><ul>
+<li>err
+: <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
+: <a class="el" href="structlwip__sock.html#a9245a7ab9471bfb6fac94c66d26fba5e">lwip_sock</a>
+</li>
+<li>ethaddr
+: <a class="el" href="structbridgeif__initdata__s.html#a8e0048db5e021f5d79411492dc9330bc">bridgeif_initdata_s</a>
+</li>
+<li>etharp
+: <a class="el" href="structstats__.html#aa52547cb08dc828927494dc485bb69f3">stats_</a>
+</li>
+<li>exceptset
+: <a class="el" href="structlwip__select__cb.html#a2a1e68993ed887fca326d1373ea6caed">lwip_select_cb</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_f.html b/doc/doxygen/output/html/functions_vars_f.html
new file mode 100644
index 0000000..aad5020
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_f.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_f.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_f"></a>- f -</h3><ul>
+<li>flags
+: <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
+: <a class="el" href="structieee__802154__hdr.html#a1d1e2cef0e0c1b1e1fd02a8a5f07fb10">ieee_802154_hdr</a>
+</li>
+<li>from
+: <a class="el" href="structsmtp__session.html#a8dc4651c67618e33c56dc66790bc12ee">smtp_session</a>
+</li>
+<li>from_len
+: <a class="el" href="structsmtp__session.html#a191b09e7142414a671da82fece888e65">smtp_session</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_g.html b/doc/doxygen/output/html/functions_vars_g.html
new file mode 100644
index 0000000..5d716b6
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_g.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_g.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_g"></a>- g -</h3><ul>
+<li>get_value
+: <a class="el" href="structsnmp__node__instance.html#a17aa954aa34672f4a399bf0d91c0a649">snmp_node_instance</a>
+, <a class="el" href="structsnmp__table__node.html#ac65c57e29faa456a9a710185109fe272">snmp_table_node</a>
+</li>
+<li>group_address
+: <a class="el" href="structigmp__group.html#ae26e6041f865880bf46cd21b6f9af854">igmp_group</a>
+, <a class="el" href="structmld__group.html#a781abf78d835627ded1202166b44b88e">mld_group</a>
+</li>
+<li>group_state
+: <a class="el" href="structigmp__group.html#add0d24f719ad4b598abad254689ad911">igmp_group</a>
+, <a class="el" href="structmld__group.html#ae9cfd3f126257aa3aff4a24e05c04059">mld_group</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_h.html b/doc/doxygen/output/html/functions_vars_h.html
new file mode 100644
index 0000000..bf7a314
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_h.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_h"></a>- h -</h3><ul>
+<li>hwaddr
+: <a class="el" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">netif</a>
+</li>
+<li>hwaddr_len
+: <a class="el" href="structnetif.html#afe1181561cb16241f3cb5ed01e567d42">netif</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_i.html b/doc/doxygen/output/html/functions_vars_i.html
new file mode 100644
index 0000000..dc7ad50
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_i.html
@@ -0,0 +1,186 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_i.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>icmp
+: <a class="el" href="structstats__.html#a10bc430163b0e6db91338aded5b7019a">stats_</a>
+</li>
+<li>icmp6
+: <a class="el" href="structstats__.html#a25a6b5940e32d53a066aa1bbc2028c03">stats_</a>
+</li>
+<li>ieee_802154_pan_id
+: <a class="el" href="structlowpan6__ieee802154__data.html#a017fc6f447215e4b65955ee7b1ed798f">lowpan6_ieee802154_data</a>
+</li>
+<li>if_idx
+: <a class="el" href="structpbuf.html#a6a58e90efbb4751608e9a1fdbd91e697">pbuf</a>
+</li>
+<li>ifindiscards
+: <a class="el" href="structstats__mib2__netif__ctrs.html#a4a767e6b835d5ad2f9b73751de2b0947">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifinerrors
+: <a class="el" href="structstats__mib2__netif__ctrs.html#afda1a14dc79bb65a33f97f9fb467ec1d">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifinnucastpkts
+: <a class="el" href="structstats__mib2__netif__ctrs.html#a111f08290b3c6944108237cefba066dd">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifinoctets
+: <a class="el" href="structstats__mib2__netif__ctrs.html#a7e9ddf9b4a17748a9d3f041c1d24ba8e">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifinucastpkts
+: <a class="el" href="structstats__mib2__netif__ctrs.html#a9ed42d6329a9616669ba21789fa001d8">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifinunknownprotos
+: <a class="el" href="structstats__mib2__netif__ctrs.html#ac34eb01b42f22b1e49ca7c9734e737aa">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifoutdiscards
+: <a class="el" href="structstats__mib2__netif__ctrs.html#a3a2aec508fd4466ca8bab10d8dc2c842">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifouterrors
+: <a class="el" href="structstats__mib2__netif__ctrs.html#a91b60bb78759c9b655a74bb4fae3346e">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifoutnucastpkts
+: <a class="el" href="structstats__mib2__netif__ctrs.html#afd3264670c39cc0d721a35cb6650f8d7">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifoutoctets
+: <a class="el" href="structstats__mib2__netif__ctrs.html#a24151d13a55452518e5f7832f48bd5a7">stats_mib2_netif_ctrs</a>
+</li>
+<li>ifoutucastpkts
+: <a class="el" href="structstats__mib2__netif__ctrs.html#a24aba9660a2951027b23d4118b57c471">stats_mib2_netif_ctrs</a>
+</li>
+<li>igmp
+: <a class="el" href="structstats__.html#a877e369c2abef97f13492faa838e2271">stats_</a>
+</li>
+<li>igmp_mac_filter
+: <a class="el" href="structnetif.html#ae64e56581bf0f136601f24c5395c19f0">netif</a>
+</li>
+<li>inpub_pkt_id
+: <a class="el" href="structmqtt__client__s.html#a6c81d0dd14e786222425ea04fd060824">mqtt_client_s</a>
+</li>
+<li>input
+: <a class="el" href="structnetif.html#a8fe4f1b7b0d710216287da9615164a5c">netif</a>
+</li>
+<li>instance_oid
+: <a class="el" href="structsnmp__node__instance.html#aedb358729c310c8e5b391dd256726a23">snmp_node_instance</a>
+</li>
+<li>ip
+: <a class="el" href="structstats__.html#a40f5b637d083896a07a3482ede23b7ed">stats_</a>
+</li>
+<li>ip6
+: <a class="el" href="structstats__.html#afc0942a5bc26735cf059099636b85336">stats_</a>
+</li>
+<li>ip6_addr
+: <a class="el" href="structnetif.html#ab7ef575d4ab398a182bc6e592f4d53a4">netif</a>
+</li>
+<li>ip6_addr_state
+: <a class="el" href="structnetif.html#a54e81344084e9840a51cc4abab3b059b">netif</a>
+</li>
+<li>ip6_addr_valid_life
+: <a class="el" href="structnetif.html#a26f6e26d4a54c998716c10b7b85c8230">netif</a>
+</li>
+<li>ip6_autoconfig_enabled
+: <a class="el" href="structnetif.html#ad98bafb7733b40ef898e53d91fbfa20f">netif</a>
+</li>
+<li>ip6_frag
+: <a class="el" href="structstats__.html#a7373df7bc44bb9913a42c0bc7b3039cf">stats_</a>
+</li>
+<li>ip_addr
+: <a class="el" href="structnetif.html#a9776aaee37ea8f07b9ddc0f8b4e7e866">netif</a>
+</li>
+<li>ip_frag
+: <a class="el" href="structstats__.html#a81fcccf03ab0d4e31423f39d0c880302">stats_</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_j.html b/doc/doxygen/output/html/functions_vars_j.html
new file mode 100644
index 0000000..5162871
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_j.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_j.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_j"></a>- j -</h3><ul>
+<li>jl
+: <a class="el" href="structapi__msg.html#a6387bddb309c218ac0ccc5ef6d7a033e">api_msg</a>
+</li>
+<li>jumpers
+: <a class="el" href="structnetbios__answer.html#a69cd3e8b8265531a7ce3e5cbd4911683">netbios_answer</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_k.html b/doc/doxygen/output/html/functions_vars_k.html
new file mode 100644
index 0000000..8f797c1
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_k.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_k.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_k"></a>- k -</h3><ul>
+<li>keep_alive
+: <a class="el" href="structmqtt__connect__client__info__t.html#ac80262a7456812e9eefffd8c3b9ac21a">mqtt_connect_client_info_t</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_l.html b/doc/doxygen/output/html/functions_vars_l.html
new file mode 100644
index 0000000..a2da34b
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_l.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_l.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_l"></a>- l -</h3><ul>
+<li>last_reporter_flag
+: <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
+: <a class="el" href="structautoip.html#a2f51d8cde73e20d6e0ae3ec8053afb55">autoip</a>
+</li>
+<li>lastdata
+: <a class="el" href="structlwip__sock.html#aa487ac16b7e5b6a2a618b7b5060247e1">lwip_sock</a>
+</li>
+<li>legacy_query
+: <a class="el" href="structmdns__outpacket.html#aff8c520bffa87c78e0ee2440571bbd65">mdns_outpacket</a>
+</li>
+<li>len
+: <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
+: <a class="el" href="structnetconn.html#a25ed06d944da0b0b9e7db5265be3fa3d">netconn</a>
+</li>
+<li>link
+: <a class="el" href="structstats__.html#a67759c9b0059bf569f9f771df23924eb">stats_</a>
+</li>
+<li>link_callback
+: <a class="el" href="structnetif.html#a4388cfadc8b4e9a9c1c93ce777bc3673">netif</a>
+</li>
+<li>link_speed
+: <a class="el" href="structnetif.html#a908452e854180941054ed89f52bb8094">netif</a>
+</li>
+<li>link_type
+: <a class="el" href="structnetif.html#ad0ee2a2169e384a2977ece2c471e0062">netif</a>
+</li>
+<li>linkoutput
+: <a class="el" href="structnetif.html#acaaac9b415a7be73eb8a287c8ed18a8d">netif</a>
+</li>
+<li>llipaddr
+: <a class="el" href="structautoip.html#a13b5da8a86839b4cd9bd9f5400ac9dc7">autoip</a>
+</li>
+<li>local_ip
+: <a class="el" href="structtcp__pcb.html#a0c4f101d55debee0d8fad86a7eb4f76f">tcp_pcb</a>
+, <a class="el" href="structtcp__pcb__listen.html#a8a4f7b0551a0c6926a08ea5b6b3d5987">tcp_pcb_listen</a>
+, <a class="el" href="structudp__pcb.html#a6160ea5e52f0d33e51b16b853ea1cd63">udp_pcb</a>
+</li>
+<li>local_port
+: <a class="el" href="structudp__pcb.html#a8cc805631142eefc5593ae8ba3302d7c">udp_pcb</a>
+</li>
+<li>lowpan6_context
+: <a class="el" href="structlowpan6__ieee802154__data.html#a190c9c06dfe1075abb7399f99553b507">lowpan6_ieee802154_data</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_m.html b/doc/doxygen/output/html/functions_vars_m.html
new file mode 100644
index 0000000..95e0968
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_m.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_m.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_m"></a>- m -</h3><ul>
+<li>max_fdb_dynamic_entries
+: <a class="el" href="structbridgeif__initdata__s.html#aeb312c2e698513c6416d5c8459ad622f">bridgeif_initdata_s</a>
+</li>
+<li>max_fdb_static_entries
+: <a class="el" href="structbridgeif__initdata__s.html#a210915aa1b0436ccabc7e8d9fd3c3fe6">bridgeif_initdata_s</a>
+</li>
+<li>max_number_of_pending_sessions
+: <a class="el" href="structnetbios__answer.html#a58aba600ed34b7c689606c296ef57c8c">netbios_answer</a>
+</li>
+<li>max_ports
+: <a class="el" href="structbridgeif__initdata__s.html#a0e0bb6a885967b5fcfef09a8f0adc63f">bridgeif_initdata_s</a>
+</li>
+<li>max_total_number_of_command_blocks
+: <a class="el" href="structnetbios__answer.html#a9cf85c173fe0d99c1c4e7e09aaeed9b8">netbios_answer</a>
+</li>
+<li>max_total_sessions_possible
+: <a class="el" href="structnetbios__answer.html#a0069c9ae014881298828660787fa945e">netbios_answer</a>
+</li>
+<li>mcast_ifindex
+: <a class="el" href="structraw__pcb.html#a5124a21e1523c774bd76c0eabc7c7ca8">raw_pcb</a>
+, <a class="el" href="structudp__pcb.html#ac80ae56333b88cea08bfa3563b0dd3cd">udp_pcb</a>
+</li>
+<li>mcast_ip4
+: <a class="el" href="structudp__pcb.html#a1c32c7ebd76898cf8f1227c10d34dbe0">udp_pcb</a>
+</li>
+<li>mcast_ttl
+: <a class="el" href="structraw__pcb.html#a2ecc77e919de9bb552d1c70e771e2cad">raw_pcb</a>
+, <a class="el" href="structudp__pcb.html#aaab9255f7f1186aef12d45c9bb90d3f4">udp_pcb</a>
+</li>
+<li>mem
+: <a class="el" href="structstats__.html#a656444f95080c6a3d474f73a6fcd9b1c">stats_</a>
+</li>
+<li>memp
+: <a class="el" href="structstats__.html#aa75d6b389e94b0f619b5db0daaf569fc">stats_</a>
+</li>
+<li>mib2
+: <a class="el" href="structstats__.html#ac001c065c56c26c3952b19b9ce0d5832">stats_</a>
+</li>
+<li>mib2_counters
+: <a class="el" href="structnetif.html#ab32cbe1851154fd020bac4be558f5fd5">netif</a>
+</li>
+<li>mld6
+: <a class="el" href="structstats__.html#ab0ad1d07dff25cd3e4a8e5be607497f8">stats_</a>
+</li>
+<li>mld_mac_filter
+: <a class="el" href="structnetif.html#abc67963ff9f574e98ef9c50138a3e470">netif</a>
+</li>
+<li>msg
+: <a class="el" href="structapi__msg.html#aef71459b5251d796434f741ca630d528">api_msg</a>
+</li>
+<li>msg_idx
+: <a class="el" href="structmqtt__client__s.html#aae7bd1da3461efef9616934feb166aa5">mqtt_client_s</a>
+</li>
+<li>mtu
+: <a class="el" href="structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48">netif</a>
+</li>
+<li>mtu6
+: <a class="el" href="structnetif.html#acd78fca5dad6468605f38e327b3a5e72">netif</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_n.html b/doc/doxygen/output/html/functions_vars_n.html
new file mode 100644
index 0000000..a41ac72
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_n.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_n.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>n
+: <a class="el" href="structapi__msg.html#adbbfc2baa8088b31fc722365237e5807">api_msg</a>
+</li>
+<li>name
+: <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>name_size
+: <a class="el" href="structnetbios__answer.html#a5828dc04e01a1f7b734019db428fd46d">netbios_answer</a>
+</li>
+<li>nd6
+: <a class="el" href="structstats__.html#ab348a3a4b593b05d7df1293a06af8adf">stats_</a>
+</li>
+<li>netif
+: <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
+: <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>node
+: <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
+: <a class="el" href="structsnmp__node.html#a1af8e20a688943a419b307bf123b1851">snmp_node</a>
+</li>
+<li>num
+: <a class="el" href="structmemp__desc.html#a2c32db78e565b8812ca0e20fe929a8a7">memp_desc</a>
+, <a class="el" href="structnetif.html#ab7ef01e505dd2feb781fe86756b1c973">netif</a>
+</li>
+<li>number_of_alignment_errors
+: <a class="el" href="structnetbios__answer.html#ab4f9ff63bd5529418c07762506189ad2">netbios_answer</a>
+</li>
+<li>number_of_collisions
+: <a class="el" href="structnetbios__answer.html#a45b7aec200434d3aaabc3ea6ebc46c1e">netbios_answer</a>
+</li>
+<li>number_of_crcs
+: <a class="el" href="structnetbios__answer.html#ab23a11db86a170b46aa8f8af434534d8">netbios_answer</a>
+</li>
+<li>number_of_free_command_blocks
+: <a class="el" href="structnetbios__answer.html#af41cbffb0ac6a9db3305b3fc64646219">netbios_answer</a>
+</li>
+<li>number_of_good_receives
+: <a class="el" href="structnetbios__answer.html#a0eab7dbe733cc50f515126649de596ea">netbios_answer</a>
+</li>
+<li>number_of_good_sends
+: <a class="el" href="structnetbios__answer.html#aa6088bca2a59ffcd077a474330511abd">netbios_answer</a>
+</li>
+<li>number_of_names
+: <a class="el" href="structnetbios__answer.html#ac4a95ccabbb945c9470e0cfd470be491">netbios_answer</a>
+</li>
+<li>number_of_no_resource_condition
+: <a class="el" href="structnetbios__answer.html#a62946dd0f27e9f9b9f295dcde4d3ea42">netbios_answer</a>
+</li>
+<li>number_of_pending_sessions
+: <a class="el" href="structnetbios__answer.html#a66098747155d5bd56f1c92aa8da10c1d">netbios_answer</a>
+</li>
+<li>number_of_retransmits
+: <a class="el" href="structnetbios__answer.html#ab175ad0f89102b3b3f81a41b5a72b321">netbios_answer</a>
+</li>
+<li>number_of_send_aborts
+: <a class="el" href="structnetbios__answer.html#a1560e3864a0821acea9410e8c1d21408">netbios_answer</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_o.html b/doc/doxygen/output/html/functions_vars_o.html
new file mode 100644
index 0000000..bb8f620
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_o.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_o.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_o"></a>- o -</h3><ul>
+<li>offset
+: <a class="el" href="structapi__msg.html#a4bd9382dd42b18120803e246a0203353">api_msg</a>
+</li>
+<li>oid
+: <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
+: <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
+: <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>op_completed
+: <a class="el" href="structnetconn.html#a982506698a59f185ff3f16d1675ea4ae">netconn</a>
+</li>
+<li>open
+: <a class="el" href="structtftp__context.html#ae70d64e8e20328cc492d766506df4cba">tftp_context</a>
+</li>
+<li>original
+: <a class="el" href="structpbuf__custom__ref.html#a135a1476908337d8073241fd7f68fa1d">pbuf_custom_ref</a>
+</li>
+<li>output
+: <a class="el" href="structmqtt__client__s.html#a667c1dc7a6008055b63877acb06f333c">mqtt_client_s</a>
+, <a class="el" href="structnetif.html#a8e1dcfe65db487feecd244355f39215e">netif</a>
+</li>
+<li>output_ip6
+: <a class="el" href="structnetif.html#ac38383379cff22c402156fec71c19617">netif</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_p.html b/doc/doxygen/output/html/functions_vars_p.html
new file mode 100644
index 0000000..a167b44
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_p.html
@@ -0,0 +1,164 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_p.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>parse_offset
+: <a class="el" href="structmdns__packet.html#a4c3c3a28ac113b3ee40d5cf07d851f68">mdns_packet</a>
+</li>
+<li>pass
+: <a class="el" href="structsmtp__session.html#a7a5a3c00378ce076ce70236525afd431">smtp_session</a>
+</li>
+<li>passive_open
+: <a class="el" href="structtcp__ext__arg__callbacks.html#a86b5816e8285378813963d09272b050a">tcp_ext_arg_callbacks</a>
+</li>
+<li>payload
+: <a class="el" href="structpbuf.html#a8d32dc3e964369d4eec638fc37fbc460">pbuf</a>
+, <a class="el" href="structpbuf__rom.html#a5cd0dcc590038629644ad775d76230a1">pbuf_rom</a>
+</li>
+<li>pbuf
+: <a class="el" href="structmdns__outpacket.html#a83d4504736f2bf315fc8b712c6a446e9">mdns_outpacket</a>
+, <a class="el" href="structmdns__packet.html#a2ec02a67fd82f0df695e94745eddaf45">mdns_packet</a>
+, <a class="el" href="structpbuf__custom.html#a100e338f13464e76b46896647b962ed8">pbuf_custom</a>
+</li>
+<li>pc
+: <a class="el" href="structpbuf__custom__ref.html#af5884b6a7031d73406cb9596a51382b7">pbuf_custom_ref</a>
+</li>
+<li>pcb
+: <a class="el" href="structnetconn.html#a2af6773c9f6ee91e7f462dd8acc07de6">netconn</a>
+</li>
+<li>pend_req_queue
+: <a class="el" href="structmqtt__client__s.html#a1897eeefe64f9e2d2d953adca858f439">mqtt_client_s</a>
+</li>
+<li>pending_err
+: <a class="el" href="structnetconn.html#a2a54e90fa370cf0df46dfd0b97f1cce7">netconn</a>
+</li>
+<li>period_of_statistics
+: <a class="el" href="structnetbios__answer.html#a31ec9ea28b5801b9bb5f1b240d3412de">netbios_answer</a>
+</li>
+<li>pkt_id
+: <a class="el" href="structmqtt__request__t.html#af2dc3cd85cdad25b9b3e1534ecc0cb58">mqtt_request_t</a>
+</li>
+<li>pkt_id_seq
+: <a class="el" href="structmqtt__client__s.html#ab4100f6e0867c212d5923f10024f2e32">mqtt_client_s</a>
+</li>
+<li>poll_fds
+: <a class="el" href="structlwip__select__cb.html#ae39fc1bef3938380d15085e0141639de">lwip_select_cb</a>
+</li>
+<li>poll_nfds
+: <a class="el" href="structlwip__select__cb.html#a39c4980c261380481f79af2b536ebfba">lwip_select_cb</a>
+</li>
+<li>port
+: <a class="el" href="structmdns__service.html#abbf317cde8fb7ba8d834ad9746dd780c">mdns_service</a>
+</li>
+<li>prev
+: <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
+: <a class="el" href="structmdns__host.html#ac8f6e3c6e1251bf73f043e489c840922">mdns_host</a>
+</li>
+<li>probing_state
+: <a class="el" href="structmdns__host.html#af9ced31c35de6a281e5b13f01e5aae61">mdns_host</a>
+</li>
+<li>proto
+: <a class="el" href="structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d">mdns_service</a>
+</li>
+<li>ptr
+: <a class="el" href="structnetvector.html#a523362737ea7764f9aaa73a050a0b983">netvector</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_q.html b/doc/doxygen/output/html/functions_vars_q.html
new file mode 100644
index 0000000..3f433a8
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_q.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_q.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_q"></a>- q -</h3><ul>
+<li>q
+: <a class="el" href="structnd6__neighbor__cache__entry.html#a830674446a45eb200d38a45fbdd5c5df">nd6_neighbor_cache_entry</a>
+</li>
+<li>query_name
+: <a class="el" href="structnetbios__answer.html#aa024ce7e0e233c42393f5c3c378d3f9b">netbios_answer</a>
+</li>
+<li>questions
+: <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
+: <a class="el" href="structmdns__packet.html#afdb9c14dd0c915119b8adb584381a437">mdns_packet</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_r.html b/doc/doxygen/output/html/functions_vars_r.html
new file mode 100644
index 0000000..ffd0999
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_r.html
@@ -0,0 +1,154 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_r.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_r"></a>- r -</h3><ul>
+<li>r
+: <a class="el" href="structapi__msg.html#aebd72e07e711e7135294563b82c98cdf">api_msg</a>
+</li>
+<li>rcvevent
+: <a class="el" href="structlwip__sock.html#af40d67cbaef4318d26e560988b6e1b3a">lwip_sock</a>
+</li>
+<li>reachability
+: <a class="el" href="structsntp__server.html#a2e9283bb8f94930fd2a2c3f24fc4b40d">sntp_server</a>
+</li>
+<li>read
+: <a class="el" href="structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c">tftp_context</a>
+</li>
+<li>readset
+: <a class="el" href="structlwip__select__cb.html#a8694a2ce0dd5f91be84056982b96978e">lwip_select_cb</a>
+</li>
+<li>reass_list
+: <a class="el" href="structlowpan6__ieee802154__data.html#a8c33e7a2026e6e93a2085f3d14378d35">lowpan6_ieee802154_data</a>
+</li>
+<li>recv
+: <a class="el" href="structraw__pcb.html#a963b023239ad97c05536046ed7058a10">raw_pcb</a>
+, <a class="el" href="structudp__pcb.html#ac05dee75a3d6666267f7e626c2ec56a8">udp_pcb</a>
+</li>
+<li>recv_arg
+: <a class="el" href="structudp__pcb.html#a11e4c40b8868aa40d923756a60598cab">udp_pcb</a>
+</li>
+<li>recv_avail
+: <a class="el" href="structnetconn.html#a05b15a28b0803bea3729b1da2047541e">netconn</a>
+</li>
+<li>recv_bufsize
+: <a class="el" href="structnetconn.html#a6febc9717418ddba16f16e988061cfac">netconn</a>
+</li>
+<li>recv_unicast
+: <a class="el" href="structmdns__packet.html#a8659b4f582be0df84b6ae91308737377">mdns_packet</a>
+</li>
+<li>recvmbox
+: <a class="el" href="structnetconn.html#a9f2bf6a3865b6a22a8a71ec2f3e770da">netconn</a>
+</li>
+<li>ref
+: <a class="el" href="structpbuf.html#a62fe38eb0cf31027dc1fb9cbe7b55ba7">pbuf</a>
+</li>
+<li>reference
+: <a class="el" href="structsnmp__node__instance.html#a55f53419cd5b369b771153ca2598ebc5">snmp_node_instance</a>
+</li>
+<li>reference_len
+: <a class="el" href="structsnmp__node__instance.html#ad289957b34b4e55915fa79f37c4d9d54">snmp_node_instance</a>
+</li>
+<li>release_instance
+: <a class="el" href="structsnmp__node__instance.html#a20a256c54fab19a455ecf6deff76c6de">snmp_node_instance</a>
+</li>
+<li>remove_callback
+: <a class="el" href="structnetif.html#ae06deb532ead2e3009ba4e58aae6ca07">netif</a>
+</li>
+<li>rs_count
+: <a class="el" href="structnetif.html#a9c1f9f28bde60aa868bc3296bee7b1b6">netif</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_s.html b/doc/doxygen/output/html/functions_vars_s.html
new file mode 100644
index 0000000..77a9572
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_s.html
@@ -0,0 +1,185 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_s.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>sd
+: <a class="el" href="structapi__msg.html#ad5e8bf133bc5ba4c78822af297330ce4">api_msg</a>
+</li>
+<li>select_waiting
+: <a class="el" href="structlwip__sock.html#aadbcf5ec3d50631d8821200163d88d38">lwip_sock</a>
+</li>
+<li>sem
+: <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
+: <a class="el" href="structlwip__select__cb.html#a1c00f1159e9e8eb7cca02c497605cd99">lwip_select_cb</a>
+</li>
+<li>send_timeout
+: <a class="el" href="structnetconn.html#a44e55724482b8e447134f5ba4f01551a">netconn</a>
+</li>
+<li>sendevent
+: <a class="el" href="structlwip__sock.html#a7e282776681ea4b7bd389950a8a64fa8">lwip_sock</a>
+</li>
+<li>sent_num
+: <a class="el" href="structautoip.html#a9d3e3bab2f12b7c7283177fbf039fb25">autoip</a>
+</li>
+<li>sequence_number
+: <a class="el" href="structieee__802154__hdr.html#a870001205f5a3ce45ce0b2f323275869">ieee_802154_hdr</a>
+</li>
+<li>service
+: <a class="el" href="structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad">mdns_service</a>
+</li>
+<li>services
+: <a class="el" href="structmdns__host.html#a750c31340c22e51375e4dc3e6e94f2ed">mdns_host</a>
+</li>
+<li>session_data_packet_size
+: <a class="el" href="structnetbios__answer.html#abec38f20bb460ddc2d6e8c9b9208608c">netbios_answer</a>
+</li>
+<li>set_test
+: <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
+: <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
+: <a class="el" href="structmemp__desc.html#a1688d2bdd5a7b77700e1fa627f025ba3">memp_desc</a>
+</li>
+<li>socket
+: <a class="el" href="structnetconn.html#ac8e05eb65774665e364a3dcf0f139b36">netconn</a>
+</li>
+<li>source_addr
+: <a class="el" href="structmdns__packet.html#aaa64cc21495dc6bb76ed9125904dd07a">mdns_packet</a>
+</li>
+<li>source_address
+: <a class="el" href="structieee__802154__hdr.html#aa96c037381583756e79bc6ecede27937">ieee_802154_hdr</a>
+</li>
+<li>source_pan_id
+: <a class="el" href="structieee__802154__hdr.html#ab67fc612a7fd7dcaf46401e4719fa2b2">ieee_802154_hdr</a>
+</li>
+<li>src
+: <a class="el" href="structip6__hdr.html#af0df3214134f29827c27e66b2970c6ef">ip6_hdr</a>
+</li>
+<li>state
+: <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>static_data
+: <a class="el" href="structsmtp__send__request.html#a4d517ae8b29caa4f0b371923379d9ef4">smtp_send_request</a>
+</li>
+<li>stats
+: <a class="el" href="structmemp__desc.html#a05cb67eb408e4736cc0f5e32b5db7500">memp_desc</a>
+</li>
+<li>status_callback
+: <a class="el" href="structnetif.html#a1513e81d02557d2a950e965f18b53a45">netif</a>
+</li>
+<li>subject
+: <a class="el" href="structsmtp__session.html#ab8240801e229ee260f3feeaa270520c7">smtp_session</a>
+</li>
+<li>subject_len
+: <a class="el" href="structsmtp__session.html#aea48a6edd3ede02b26882c7b8d72646c">smtp_session</a>
+</li>
+<li>sys
+: <a class="el" href="structstats__.html#a317123da6c92aa9d2fa40e8060357035">stats_</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_t.html b/doc/doxygen/output/html/functions_vars_t.html
new file mode 100644
index 0000000..b37fd9f
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_t.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_t.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_t"></a>- t -</h3><ul>
+<li>tab
+: <a class="el" href="structmemp__desc.html#a9d6b758ce5c3b47a67a7568d38fb3926">memp_desc</a>
+</li>
+<li>tcp
+: <a class="el" href="structstats__.html#a32ef1aaa427d62a5c7890de0ac23fe86">stats_</a>
+</li>
+<li>test_result
+: <a class="el" href="structnetbios__answer.html#a91116fe26c8050ee166053f377b40c7f">netbios_answer</a>
+</li>
+<li>timeout_diff
+: <a class="el" href="structmqtt__request__t.html#a65a7292669bc1f2d9df8f30bbcd77073">mqtt_request_t</a>
+</li>
+<li>timer
+: <a class="el" href="structigmp__group.html#a8e2227e486652603fcd7f88681d4c75b">igmp_group</a>
+, <a class="el" href="structmld__group.html#a21f31e845cb11d2aca4ae7120736f69a">mld_group</a>
+, <a class="el" href="structsmtp__session.html#a5884425cb5ce964d8383b29cc20208d7">smtp_session</a>
+</li>
+<li>tls_config
+: <a class="el" href="structmqtt__connect__client__info__t.html#a45987acc116de5d27fff6856778e55b4">mqtt_connect_client_info_t</a>
+</li>
+<li>to
+: <a class="el" href="structsmtp__session.html#a70b3753bc70e65f779279c246617faea">smtp_session</a>
+</li>
+<li>to_len
+: <a class="el" href="structsmtp__session.html#a66b8e1dd314976788e9ac9a81f59a402">smtp_session</a>
+</li>
+<li>tot_len
+: <a class="el" href="structpbuf.html#a5259e7ec29bab9c0999b64f2e86b411f">pbuf</a>
+</li>
+<li>total_number_of_command_blocks
+: <a class="el" href="structnetbios__answer.html#a4c7ea5d1839fd27232877880e43485a2">netbios_answer</a>
+</li>
+<li>tried_llipaddr
+: <a class="el" href="structautoip.html#a472f3d18c07b3df024a0cde8f4ffa853">autoip</a>
+</li>
+<li>ts
+: <a class="el" href="structnetif.html#a1bb4e3aed6e0fd4b6b31ee82d806f971">netif</a>
+</li>
+<li>ttw
+: <a class="el" href="structautoip.html#a7510d9a2961ea7c28ebfcde6390284bf">autoip</a>
+</li>
+<li>tx_buf
+: <a class="el" href="structsmtp__session.html#a42cedb495f7423b9e28979ce1e460c61">smtp_session</a>
+</li>
+<li>tx_datagram_tag
+: <a class="el" href="structlowpan6__ieee802154__data.html#a64560b289f86efe1d39ece603cd14b5c">lowpan6_ieee802154_data</a>
+</li>
+<li>tx_frame_seq_num
+: <a class="el" href="structlowpan6__ieee802154__data.html#ad9cd994385c4d1d8ef0a22686c17720c">lowpan6_ieee802154_data</a>
+</li>
+<li>tx_id
+: <a class="el" href="structmdns__outpacket.html#ac470f02a9f332f18e027437dc293d348">mdns_outpacket</a>
+, <a class="el" href="structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00">mdns_packet</a>
+</li>
+<li>txt_fn
+: <a class="el" href="structmdns__service.html#a79bc4946c96a3b2d0713bc0897c4bd9c">mdns_service</a>
+</li>
+<li>txtdata
+: <a class="el" href="structmdns__service.html#a35daff90a18d19b14f23fa02df424f94">mdns_service</a>
+</li>
+<li>type
+: <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>
+<li>type_internal
+: <a class="el" href="structpbuf.html#a61a26ac8393dc9e549016b86c2cf5131">pbuf</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_u.html b/doc/doxygen/output/html/functions_vars_u.html
new file mode 100644
index 0000000..513670f
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_u.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_u.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_u"></a>- u -</h3><ul>
+<li>udp
+: <a class="el" href="structstats__.html#a626e03d4bded6480582789cfd17d4063">stats_</a>
+</li>
+<li>unicast_reply
+: <a class="el" href="structmdns__outpacket.html#a68255725575af086a3afa76bc5c8e64d">mdns_outpacket</a>
+</li>
+<li>unit_id
+: <a class="el" href="structnetbios__answer.html#aeed6aa8ba4f8bb107d141b3b3d0a1787">netbios_answer</a>
+</li>
+<li>use
+: <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
+: <a class="el" href="structmem.html#aa76b6a39425617435978dce903f0d456">mem</a>
+</li>
+<li>username
+: <a class="el" href="structsmtp__session.html#a568e3def9d0ec54e3c079f577717a6bb">smtp_session</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_v.html b/doc/doxygen/output/html/functions_vars_v.html
new file mode 100644
index 0000000..6251249
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_v.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_v.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_v"></a>- v -</h3><ul>
+<li>value
+: <a class="el" href="structsnmp__varbind.html#a328227d7ae188a0a2feb95f8000aac45">snmp_varbind</a>
+</li>
+<li>value_len
+: <a class="el" href="structsnmp__varbind.html#ab094577fac6c7cc16ad666c9970cdb85">snmp_varbind</a>
+</li>
+<li>vector
+: <a class="el" href="structapi__msg.html#a1ceb9822ba49ba439e30d98492593612">api_msg</a>
+</li>
+<li>vector_cnt
+: <a class="el" href="structapi__msg.html#ab6f14157a3e6735b69a569249d3286a2">api_msg</a>
+</li>
+<li>vector_off
+: <a class="el" href="structapi__msg.html#a6896ae78ebddefdf2d8358ab5f21f444">api_msg</a>
+</li>
+<li>version_number
+: <a class="el" href="structnetbios__answer.html#a151dce0f0bf626b2a54fbb75775237ba">netbios_answer</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_w.html b/doc/doxygen/output/html/functions_vars_w.html
new file mode 100644
index 0000000..8ab1d18
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_w.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_w.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_w"></a>- w -</h3><ul>
+<li>w
+: <a class="el" href="structapi__msg.html#a8a71456d1199d10af5c1d8760cc0ce73">api_msg</a>
+</li>
+<li>will_msg
+: <a class="el" href="structmqtt__connect__client__info__t.html#a925fcebd15555afdc0820e196e2fd3a7">mqtt_connect_client_info_t</a>
+</li>
+<li>will_qos
+: <a class="el" href="structmqtt__connect__client__info__t.html#a07954934f4fecf54fa190997848229d9">mqtt_connect_client_info_t</a>
+</li>
+<li>will_retain
+: <a class="el" href="structmqtt__connect__client__info__t.html#a49c10873f44d7534140a63eef2a6a4e3">mqtt_connect_client_info_t</a>
+</li>
+<li>will_topic
+: <a class="el" href="structmqtt__connect__client__info__t.html#a32e77415460752ba0484eb3ba0faf0c8">mqtt_connect_client_info_t</a>
+</li>
+<li>write
+: <a class="el" href="structtftp__context.html#a9e6e4ec803ec9597822923369701754d">tftp_context</a>
+</li>
+<li>write_offset
+: <a class="el" href="structmdns__outpacket.html#a8ead21e392b21c3e872c0cab874cdcf5">mdns_outpacket</a>
+</li>
+<li>writeset
+: <a class="el" href="structlwip__select__cb.html#aa89638b1c2c6b2c88030560861aba04c">lwip_select_cb</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_vars_z.html b/doc/doxygen/output/html/functions_vars_z.html
new file mode 100644
index 0000000..7e047e9
--- /dev/null
+++ b/doc/doxygen/output/html/functions_vars_z.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields - Variables</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_vars_z.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_z"></a>- z -</h3><ul>
+<li>zep_dst_ip_addr
+: <a class="el" href="structzepif__init.html#a851efb99a973348f1064a31b97ce779d">zepif_init</a>
+</li>
+<li>zep_dst_udp_port
+: <a class="el" href="structzepif__init.html#a86c6229ed3010158e601666afe91a286">zepif_init</a>
+</li>
+<li>zep_netif
+: <a class="el" href="structzepif__init.html#a3d97bf90b6bd4dd8258a3b1caf7890e3">zepif_init</a>
+</li>
+<li>zep_src_ip_addr
+: <a class="el" href="structzepif__init.html#adbe989f1f5cba623d742187def36f02c">zepif_init</a>
+</li>
+<li>zep_src_udp_port
+: <a class="el" href="structzepif__init.html#ad739032585841b126b4c0eab5899d40f">zepif_init</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_w.html b/doc/doxygen/output/html/functions_w.html
new file mode 100644
index 0000000..88f0ffc
--- /dev/null
+++ b/doc/doxygen/output/html/functions_w.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_w.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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"></a>- w -</h3><ul>
+<li>w
+: <a class="el" href="structapi__msg.html#a8a71456d1199d10af5c1d8760cc0ce73">api_msg</a>
+</li>
+<li>will_msg
+: <a class="el" href="structmqtt__connect__client__info__t.html#a925fcebd15555afdc0820e196e2fd3a7">mqtt_connect_client_info_t</a>
+</li>
+<li>will_qos
+: <a class="el" href="structmqtt__connect__client__info__t.html#a07954934f4fecf54fa190997848229d9">mqtt_connect_client_info_t</a>
+</li>
+<li>will_retain
+: <a class="el" href="structmqtt__connect__client__info__t.html#a49c10873f44d7534140a63eef2a6a4e3">mqtt_connect_client_info_t</a>
+</li>
+<li>will_topic
+: <a class="el" href="structmqtt__connect__client__info__t.html#a32e77415460752ba0484eb3ba0faf0c8">mqtt_connect_client_info_t</a>
+</li>
+<li>write
+: <a class="el" href="structtftp__context.html#a9e6e4ec803ec9597822923369701754d">tftp_context</a>
+</li>
+<li>write_offset
+: <a class="el" href="structmdns__outpacket.html#a8ead21e392b21c3e872c0cab874cdcf5">mdns_outpacket</a>
+</li>
+<li>writeset
+: <a class="el" href="structlwip__select__cb.html#aa89638b1c2c6b2c88030560861aba04c">lwip_select_cb</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/functions_z.html b/doc/doxygen/output/html/functions_z.html
new file mode 100644
index 0000000..e0476a0
--- /dev/null
+++ b/doc/doxygen/output/html/functions_z.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Data Fields</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('functions_z.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<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_z"></a>- z -</h3><ul>
+<li>zep_dst_ip_addr
+: <a class="el" href="structzepif__init.html#a851efb99a973348f1064a31b97ce779d">zepif_init</a>
+</li>
+<li>zep_dst_udp_port
+: <a class="el" href="structzepif__init.html#a86c6229ed3010158e601666afe91a286">zepif_init</a>
+</li>
+<li>zep_netif
+: <a class="el" href="structzepif__init.html#a3d97bf90b6bd4dd8258a3b1caf7890e3">zepif_init</a>
+</li>
+<li>zep_src_ip_addr
+: <a class="el" href="structzepif__init.html#adbe989f1f5cba623d742187def36f02c">zepif_init</a>
+</li>
+<li>zep_src_udp_port
+: <a class="el" href="structzepif__init.html#ad739032585841b126b4c0eab5899d40f">zepif_init</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals.html b/doc/doxygen/output/html/globals.html
new file mode 100644
index 0000000..b9c6981
--- /dev/null
+++ b/doc/doxygen/output/html/globals.html
@@ -0,0 +1,326 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_a"></a>- a -</h3><ul>
+<li>accept
+: <a class="el" href="group__socket.html#gade2b17671b5a4b18e941fbf7e1060310">sockets.h</a>
+</li>
+<li>altcp_abort()
+: <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()
+: <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()
+: <a class="el" href="altcp_8c.html#a6a99f8757c18fbc9b9f30925afbcf4c2">altcp.c</a>
+, <a class="el" href="altcp__priv_8h.html#a6a99f8757c18fbc9b9f30925afbcf4c2">altcp_priv.h</a>
+</li>
+<li>altcp_allocator_t
+: <a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp.h</a>
+</li>
+<li>altcp_arg()
+: <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()
+: <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()
+: <a class="el" href="group__altcp.html#ga4329798afdf3709c789a2ee060ee3993">altcp.c</a>
+, <a class="el" href="group__altcp.html#ga4329798afdf3709c789a2ee060ee3993">altcp.h</a>
+</li>
+<li>altcp_connect()
+: <a class="el" href="group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492">altcp.h</a>
+, <a class="el" href="group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492">altcp.c</a>
+</li>
+<li>altcp_err()
+: <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()
+: <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
+: <a class="el" href="group__altcp.html#ga96c22e15230b5216b3a95dc9e2ca42c8">altcp.h</a>
+</li>
+<li>altcp_listen_with_backlog_and_err()
+: <a class="el" href="group__altcp.html#gac69722b86b1198916f2527fb9f132c2b">altcp.c</a>
+, <a class="el" href="group__altcp.html#gac69722b86b1198916f2527fb9f132c2b">altcp.h</a>
+</li>
+<li>ALTCP_MBEDTLS_DEBUG
+: <a class="el" href="altcp__tls__mbedtls__opts_8h.html#a7727456eeb0b3311213936413d238989">altcp_tls_mbedtls_opts.h</a>
+</li>
+<li>ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS
+: <a class="el" href="altcp__tls__mbedtls__opts_8h.html#a6acb28346f87b2310fc00ec1fccba2b6">altcp_tls_mbedtls_opts.h</a>
+</li>
+<li>altcp_mss()
+: <a class="el" href="group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08">altcp.c</a>
+, <a class="el" href="group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08">altcp.h</a>
+</li>
+<li>altcp_new()
+: <a class="el" href="group__altcp.html#ga86843287b0ad0099c067817cfb7aa336">altcp.c</a>
+, <a class="el" href="group__altcp.html#ga86843287b0ad0099c067817cfb7aa336">altcp.h</a>
+</li>
+<li>altcp_new_ip6()
+: <a class="el" href="group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1">altcp.c</a>
+, <a class="el" href="group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1">altcp.h</a>
+</li>
+<li>altcp_new_ip_type()
+: <a class="el" href="group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21">altcp.c</a>
+, <a class="el" href="group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21">altcp.h</a>
+</li>
+<li>altcp_output()
+: <a class="el" href="group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6">altcp.c</a>
+, <a class="el" href="group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6">altcp.h</a>
+</li>
+<li>altcp_poll()
+: <a class="el" href="group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0">altcp.c</a>
+, <a class="el" href="group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0">altcp.h</a>
+</li>
+<li>altcp_proxyconnect_alloc()
+: <a class="el" href="altcp__proxyconnect_8c.html#a3d3af45390467ceeaa064b7e28dd43a9">altcp_proxyconnect.c</a>
+, <a class="el" href="altcp__proxyconnect_8h.html#a3d3af45390467ceeaa064b7e28dd43a9">altcp_proxyconnect.h</a>
+</li>
+<li>ALTCP_PROXYCONNECT_CLIENT_AGENT
+: <a class="el" href="altcp__proxyconnect_8c.html#a344227f22aa1b58f7ed737a2d4f4636f">altcp_proxyconnect.c</a>
+</li>
+<li>altcp_proxyconnect_new()
+: <a class="el" href="altcp__proxyconnect_8c.html#ae774782064a92d0f58ce07b57a5360d1">altcp_proxyconnect.c</a>
+, <a class="el" href="altcp__proxyconnect_8h.html#ae774782064a92d0f58ce07b57a5360d1">altcp_proxyconnect.h</a>
+</li>
+<li>altcp_proxyconnect_new_tcp()
+: <a class="el" href="altcp__proxyconnect_8c.html#a24e122d2bc2c0b9f86074c1e8d5ccfe4">altcp_proxyconnect.c</a>
+, <a class="el" href="altcp__proxyconnect_8h.html#a24e122d2bc2c0b9f86074c1e8d5ccfe4">altcp_proxyconnect.h</a>
+</li>
+<li>altcp_proxyconnect_tls_alloc()
+: <a class="el" href="altcp__proxyconnect_8c.html#a5ff49bcd035847a8915f18deef4172a9">altcp_proxyconnect.c</a>
+, <a class="el" href="altcp__proxyconnect_8h.html#a5ff49bcd035847a8915f18deef4172a9">altcp_proxyconnect.h</a>
+</li>
+<li>altcp_recv()
+: <a class="el" href="group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71">altcp.c</a>
+, <a class="el" href="group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71">altcp.h</a>
+</li>
+<li>altcp_recved()
+: <a class="el" href="group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83">altcp.c</a>
+, <a class="el" href="group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83">altcp.h</a>
+</li>
+<li>altcp_sent()
+: <a class="el" href="group__altcp.html#gab2b228c77c827fb14bfc513171c79f47">altcp.c</a>
+, <a class="el" href="group__altcp.html#gab2b228c77c827fb14bfc513171c79f47">altcp.h</a>
+</li>
+<li>altcp_setprio()
+: <a class="el" href="group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5">altcp.c</a>
+, <a class="el" href="group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5">altcp.h</a>
+</li>
+<li>altcp_shutdown()
+: <a class="el" href="group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319">altcp.c</a>
+, <a class="el" href="group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319">altcp.h</a>
+</li>
+<li>altcp_sndbuf()
+: <a class="el" href="group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c">altcp.c</a>
+, <a class="el" href="group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c">altcp.h</a>
+</li>
+<li>altcp_sndqueuelen()
+: <a class="el" href="group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5">altcp.c</a>
+, <a class="el" href="group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5">altcp.h</a>
+</li>
+<li>altcp_tcp_alloc()
+: <a class="el" href="altcp__tcp_8c.html#a211215e43cb40bd204a20c34316b7caa">altcp_tcp.c</a>
+, <a class="el" href="altcp__tcp_8h.html#a211215e43cb40bd204a20c34316b7caa">altcp_tcp.h</a>
+</li>
+<li>altcp_tls_alloc()
+: <a class="el" href="group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391">altcp_tls.h</a>
+, <a class="el" href="group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391">altcp_alloc.c</a>
+</li>
+<li>altcp_tls_context()
+: <a class="el" href="group__altcp__tls.html#gabc1741530d5089c3093889416430bc76">altcp_tls.h</a>
+</li>
+<li>altcp_tls_create_config_client()
+: <a class="el" href="group__altcp__tls.html#ga2b249447e10c8599b6d723d403086c35">altcp_tls.h</a>
+</li>
+<li>altcp_tls_create_config_client_2wayauth()
+: <a class="el" href="group__altcp__tls.html#ga7352a4600fee89e167541cf0776c01fb">altcp_tls.h</a>
+</li>
+<li>altcp_tls_create_config_server_privkey_cert()
+: <a class="el" href="group__altcp__tls.html#ga700dc0320e93cea337673e7d4295e161">altcp_tls.h</a>
+</li>
+<li>altcp_tls_free_config()
+: <a class="el" href="group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145">altcp_tls.h</a>
+</li>
+<li>altcp_tls_new()
+: <a class="el" href="group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a">altcp_alloc.c</a>
+, <a class="el" href="group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a">altcp_tls.h</a>
+</li>
+<li>altcp_tls_wrap()
+: <a class="el" href="group__altcp__tls.html#gab874adb7f87984c0520bd032c2108c47">altcp_tls.h</a>
+</li>
+<li>altcp_write()
+: <a class="el" href="group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d">altcp.h</a>
+, <a class="el" href="group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d">altcp.c</a>
+</li>
+<li>API_EVENT
+: <a class="el" href="api_8h.html#a3ce590f58be8f60dbde361920863b26d">api.h</a>
+</li>
+<li>API_LIB_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga671009550216f7dc03e67ba5751e3160">opt.h</a>
+</li>
+<li>API_MSG_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga4279d7ff9f986b2ff3eb068bb012b697">opt.h</a>
+</li>
+<li>ARP_AGE_REREQUEST_USED_UNICAST
+: <a class="el" href="etharp_8c.html#ac71515a6f140b25de49e9bf432b2bb2a">etharp.c</a>
+</li>
+<li>ARP_MAXAGE
+: <a class="el" href="group__lwip__opts__arp.html#ga741a0710dc126ed3ae9e305472df3432">opt.h</a>
+</li>
+<li>ARP_MAXPENDING
+: <a class="el" href="etharp_8c.html#a0a03fea13e060da5a53a10a75a96def9">etharp.c</a>
+</li>
+<li>ARP_QUEUE_LEN
+: <a class="el" href="group__lwip__opts__arp.html#ga29f41a6ebdbb23f46688d381b3609fd1">opt.h</a>
+</li>
+<li>ARP_QUEUEING
+: <a class="el" href="group__lwip__opts__arp.html#ga75837814536af29b6102508588d0ab58">opt.h</a>
+</li>
+<li>ARP_TABLE_SIZE
+: <a class="el" href="group__lwip__opts__arp.html#ga924936a814564dbdb0bc950d255a83b9">opt.h</a>
+</li>
+<li>ARP_TMR_INTERVAL
+: <a class="el" href="lwip_2etharp_8h.html#aaa3d8ed1eb1129f518345e37b38cfc37">etharp.h</a>
+</li>
+<li>autoip_arp_reply()
+: <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
+: <a class="el" href="group__lwip__opts__debugmsg.html#gafaee522e7f32d81022215e1805e303a5">opt.h</a>
+</li>
+<li>autoip_network_changed()
+: <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
+: <a class="el" href="autoip_8h.html#aaeb4b778fce078bee84144ab50916b15">autoip.h</a>
+</li>
+<li>autoip_set_struct()
+: <a class="el" href="group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90">autoip.h</a>
+, <a class="el" href="group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90">autoip.c</a>
+</li>
+<li>autoip_start()
+: <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()
+: <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()
+: <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()
+: <a class="el" href="autoip_8h.html#a746fc1d7db1bf1617afae166c9d92c2d">autoip.h</a>
+, <a class="el" href="autoip_8c.html#a746fc1d7db1bf1617afae166c9d92c2d">autoip.c</a>
+</li>
+<li>AUTOIP_TMR_INTERVAL
+: <a class="el" href="autoip_8h.html#a8986919a452ab77eec9a199ff6668e92">autoip.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_b.html b/doc/doxygen/output/html/globals_b.html
new file mode 100644
index 0000000..f57d562
--- /dev/null
+++ b/doc/doxygen/output/html/globals_b.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_b.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_b"></a>- b -</h3><ul>
+<li>bind
+: <a class="el" href="group__socket.html#ga4a88bb849aa7203b24bb245a193997a6">sockets.h</a>
+</li>
+<li>ble_addr_to_eui64()
+: <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>bridgeif_add_port()
+: <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
+: <a class="el" href="group__bridgeif__opts.html#gaab45e20e9b09a98217994082968cec73">bridgeif_opts.h</a>
+</li>
+<li>bridgeif_fdb_add()
+: <a class="el" href="group__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666">bridgeif.c</a>
+, <a class="el" href="group__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666">bridgeif.h</a>
+</li>
+<li>BRIDGEIF_FDB_DEBUG
+: <a class="el" href="group__bridgeif__opts.html#ga72e389f592470dc50288a68f3db70730">bridgeif_opts.h</a>
+</li>
+<li>bridgeif_fdb_get_dst_ports()
+: <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>
+<li>bridgeif_fdb_init()
+: <a class="el" href="group__bridgeif__fdb.html#gaf7935226ee7f99f964bf0135b6cb9ca0">bridgeif.h</a>
+, <a class="el" href="group__bridgeif__fdb.html#gaf7935226ee7f99f964bf0135b6cb9ca0">bridgeif_fdb.c</a>
+</li>
+<li>bridgeif_fdb_remove()
+: <a class="el" href="group__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8">bridgeif.c</a>
+, <a class="el" href="group__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8">bridgeif.h</a>
+</li>
+<li>bridgeif_fdb_update_src()
+: <a class="el" href="group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39">bridgeif.h</a>
+, <a class="el" href="group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39">bridgeif_fdb.c</a>
+</li>
+<li>BRIDGEIF_FW_DEBUG
+: <a class="el" href="group__bridgeif__opts.html#gac456e97b1b0e9a57449596a2b229763a">bridgeif_opts.h</a>
+</li>
+<li>bridgeif_init()
+: <a class="el" href="group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c">bridgeif.h</a>
+, <a class="el" href="group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c">bridgeif.c</a>
+</li>
+<li>BRIDGEIF_INITDATA1
+: <a class="el" href="group__bridgeif.html#ga3d41c7905b61aef3a3b8c61b3af7879f">bridgeif.h</a>
+</li>
+<li>BRIDGEIF_INITDATA2
+: <a class="el" href="group__bridgeif.html#gaaaeb47fbf1dd6c30cb502343fa0d0741">bridgeif.h</a>
+</li>
+<li>bridgeif_initdata_t
+: <a class="el" href="group__bridgeif.html#gac47f8ce66bc6dad5dd9829467f93a1bb">bridgeif.h</a>
+</li>
+<li>BRIDGEIF_MAX_PORTS
+: <a class="el" href="group__bridgeif__opts.html#ga6fe03b84359150b7dea3dfca942b6414">bridgeif_opts.h</a>
+</li>
+<li>BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT
+: <a class="el" href="group__bridgeif__opts.html#ga5aed5cd9b01ba1345b47845cd04ca30d">bridgeif_opts.h</a>
+</li>
+<li>BYTE_ORDER
+: <a class="el" href="group__compiler__abstraction.html#ga1771b7fb65ee640524d0052f229768c3">arch.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_c.html b/doc/doxygen/output/html/globals_c.html
new file mode 100644
index 0000000..1837822
--- /dev/null
+++ b/doc/doxygen/output/html/globals_c.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_c"></a>- c -</h3><ul>
+<li>CHECKSUM_CHECK_ICMP
+: <a class="el" href="group__lwip__opts__checksum.html#ga79807171be8c20b69a5cd8de83566d25">opt.h</a>
+</li>
+<li>CHECKSUM_CHECK_ICMP6
+: <a class="el" href="group__lwip__opts__checksum.html#gaf466a10b093489910a773fd1cec74c2d">opt.h</a>
+</li>
+<li>CHECKSUM_CHECK_IP
+: <a class="el" href="group__lwip__opts__checksum.html#ga005b1b9988b84a2cb844144cef22c11e">opt.h</a>
+</li>
+<li>CHECKSUM_CHECK_TCP
+: <a class="el" href="group__lwip__opts__checksum.html#gab676cc29571b7ffda12336482ad97699">opt.h</a>
+</li>
+<li>CHECKSUM_CHECK_UDP
+: <a class="el" href="group__lwip__opts__checksum.html#ga6747f7b72abe544fd4dc184cc7fcad37">opt.h</a>
+</li>
+<li>CHECKSUM_GEN_ICMP
+: <a class="el" href="group__lwip__opts__checksum.html#ga2291ec5bec0a551545da6d5f9f9316b2">opt.h</a>
+</li>
+<li>CHECKSUM_GEN_ICMP6
+: <a class="el" href="group__lwip__opts__checksum.html#ga7cd47a55af03b1048c5a4a5fe0e76013">opt.h</a>
+</li>
+<li>CHECKSUM_GEN_IP
+: <a class="el" href="group__lwip__opts__checksum.html#ga8ddad81fc26268a13b35091781da2265">opt.h</a>
+</li>
+<li>CHECKSUM_GEN_TCP
+: <a class="el" href="group__lwip__opts__checksum.html#ga800069963cc4552b99235237c22f00bb">opt.h</a>
+</li>
+<li>CHECKSUM_GEN_UDP
+: <a class="el" href="group__lwip__opts__checksum.html#ga98d460f8c2baed8bf62d5473831c0b2c">opt.h</a>
+</li>
+<li>close
+: <a class="el" href="group__socket.html#ga4ef17e85ec4d3acdcee5ce23f8ed93c4">sockets.h</a>
+</li>
+<li>closesocket
+: <a class="el" href="group__socket.html#ga5a3eb971b466278ada4f7f87399a537c">sockets.h</a>
+</li>
+<li>connect
+: <a class="el" href="group__socket.html#gae3d13671f622e17c17317c9a16dfd0ee">sockets.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_d.html b/doc/doxygen/output/html/globals_d.html
new file mode 100644
index 0000000..98e1044
--- /dev/null
+++ b/doc/doxygen/output/html/globals_d.html
@@ -0,0 +1,329 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_d.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_d"></a>- d -</h3><ul>
+<li>DEFAULT_ACCEPTMBOX_SIZE
+: <a class="el" href="group__lwip__opts__thread.html#ga5d5a6e04abe2ec233c7acdb09f992461">opt.h</a>
+</li>
+<li>DEFAULT_RAW_RECVMBOX_SIZE
+: <a class="el" href="group__lwip__opts__thread.html#ga4ef8f046c957750056131310a1580df7">opt.h</a>
+</li>
+<li>DEFAULT_TCP_RECVMBOX_SIZE
+: <a class="el" href="group__lwip__opts__thread.html#ga1bd172938b9c8ba63156fcafc87e83c7">opt.h</a>
+</li>
+<li>DEFAULT_THREAD_NAME
+: <a class="el" href="group__lwip__opts__thread.html#gaca13123a5c8271558353e04123957616">opt.h</a>
+</li>
+<li>DEFAULT_THREAD_PRIO
+: <a class="el" href="group__lwip__opts__thread.html#ga3d8715b1fdd0449d6c214e4a40108456">opt.h</a>
+</li>
+<li>DEFAULT_THREAD_STACKSIZE
+: <a class="el" href="group__lwip__opts__thread.html#ga7f93dfeaed4021061959f822def602cb">opt.h</a>
+</li>
+<li>DEFAULT_UDP_RECVMBOX_SIZE
+: <a class="el" href="group__lwip__opts__thread.html#ga09fe785559b3f0cf108da4440489e335">opt.h</a>
+</li>
+<li>dhcp6_cleanup()
+: <a class="el" href="group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde">dhcp6.c</a>
+, <a class="el" href="group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde">dhcp6.h</a>
+</li>
+<li>DHCP6_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gacfc11be8b3bf6bb55e3e5c39ea8802d1">opt.h</a>
+</li>
+<li>dhcp6_disable()
+: <a class="el" href="group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2">dhcp6.c</a>
+, <a class="el" href="group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2">dhcp6.h</a>
+</li>
+<li>DHCP6_DUID_LLT
+: <a class="el" href="prot_2dhcp6_8h.html#afe33f98cb94e0f18892a41502cf54e36">dhcp6.h</a>
+</li>
+<li>dhcp6_enable_stateful()
+: <a class="el" href="group__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619">dhcp6.c</a>
+, <a class="el" href="group__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619">dhcp6.h</a>
+</li>
+<li>dhcp6_enable_stateless()
+: <a class="el" href="group__dhcp6.html#gaf3349463541e673fec33843eb019b18c">dhcp6.c</a>
+, <a class="el" href="group__dhcp6.html#gaf3349463541e673fec33843eb019b18c">dhcp6.h</a>
+</li>
+<li>dhcp6_nd6_ra_trigger()
+: <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_option_idx
+: <a class="el" href="dhcp6_8c.html#ac4c519a2e10067f277d6b09e60919e9a">dhcp6.c</a>
+</li>
+<li>dhcp6_remove_struct
+: <a class="el" href="dhcp6_8h.html#a76941ddba22fe00dfc47d2f339f7aca3">dhcp6.h</a>
+</li>
+<li>dhcp6_rx_options
+: <a class="el" href="dhcp6_8c.html#abcce06f078da4b03265d20c0bc1bdce0">dhcp6.c</a>
+</li>
+<li>dhcp6_set_struct()
+: <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_STATUS_SUCCESS
+: <a class="el" href="prot_2dhcp6_8h.html#a878a7734e159826e82e958fe3a5ca175">dhcp6.h</a>
+</li>
+<li>DHCP6_TIMER_MSECS
+: <a class="el" href="dhcp6_8h.html#afdd69327dc7d9f5cc4f029d706f60c8f">dhcp6.h</a>
+</li>
+<li>dhcp6_tmr()
+: <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()
+: <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()
+: <a class="el" href="group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64">dhcp.h</a>
+, <a class="el" href="group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64">dhcp.c</a>
+</li>
+<li>DHCP_COARSE_TIMER_MSECS
+: <a class="el" href="dhcp_8h.html#ad84b8f4deec421bbf6fd85e8fae047d6">dhcp.h</a>
+</li>
+<li>DHCP_COARSE_TIMER_SECS
+: <a class="el" href="dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e">dhcp.h</a>
+</li>
+<li>dhcp_coarse_tmr()
+: <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
+: <a class="el" href="dhcp_8c.html#ad6de9c5120654454a330bf5de53c4835">dhcp.c</a>
+</li>
+<li>DHCP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga97927ceecabcdb5f41735bf372a05cee">opt.h</a>
+</li>
+<li>DHCP_DOES_ARP_CHECK
+: <a class="el" href="group__lwip__opts__dhcp.html#gab2d91de7b2fce879b0a213682e1b0b69">opt.h</a>
+</li>
+<li>DHCP_FINE_TIMER_MSECS
+: <a class="el" href="dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f">dhcp.h</a>
+</li>
+<li>dhcp_fine_tmr()
+: <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()
+: <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
+: <a class="el" href="dhcp_8c.html#a63e9ec4517b80d8576f218d905e31a9b">dhcp.c</a>
+</li>
+<li>DHCP_MIN_REPLY_LEN
+: <a class="el" href="dhcp_8c.html#aa52c2b64ef42fbad84a3bcd58052caab">dhcp.c</a>
+</li>
+<li>dhcp_network_changed()
+: <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_option_idx
+: <a class="el" href="dhcp_8c.html#a8c3b584d223b995b48613ad96cb776a0">dhcp.c</a>
+</li>
+<li>DHCP_OPTIONS_LEN
+: <a class="el" href="prot_2dhcp_8h.html#ae99d4be0d03f6f9c8f02f63abde91a06">dhcp.h</a>
+</li>
+<li>dhcp_release()
+: <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()
+: <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
+: <a class="el" href="dhcp_8h.html#aa92284faa099dac4331c1fc0b997dabc">dhcp.h</a>
+</li>
+<li>dhcp_renew()
+: <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
+: <a class="el" href="dhcp_8c.html#a058b71e1d26b3758b29d16d9f892c8cc">dhcp.c</a>
+</li>
+<li>dhcp_rx_options_val
+: <a class="el" href="dhcp_8c.html#a5abd232496063bddcbc6692c0e8f9c1f">dhcp.c</a>
+</li>
+<li>dhcp_set_struct()
+: <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()
+: <a class="el" href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp.h</a>
+, <a class="el" href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp.c</a>
+</li>
+<li>dhcp_stop()
+: <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()
+: <a class="el" href="dhcp_8c.html#ae24a2529372218327ab9cb6592041c85">dhcp.c</a>
+, <a class="el" href="dhcp_8h.html#ae24a2529372218327ab9cb6592041c85">dhcp.h</a>
+</li>
+<li>DNS_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gaba55da2352c99d813767913e5e36be1f">opt.h</a>
+</li>
+<li>DNS_DOES_NAME_CHECK
+: <a class="el" href="group__lwip__opts__dns.html#ga07ffd8e9106dae3b65347bd03811a4b6">opt.h</a>
+</li>
+<li>dns_found_callback
+: <a class="el" href="dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae">dns.h</a>
+</li>
+<li>dns_gethostbyname()
+: <a class="el" href="group__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f">dns.h</a>
+, <a class="el" href="group__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f">dns.c</a>
+</li>
+<li>dns_gethostbyname_addrtype()
+: <a class="el" href="group__dns.html#gae84449f60dca6b863142daca8e03ce79">dns.h</a>
+, <a class="el" href="group__dns.html#gae84449f60dca6b863142daca8e03ce79">dns.c</a>
+</li>
+<li>dns_getserver()
+: <a class="el" href="group__dns.html#gad02111a6b26b93f1c3580d5f41a59af3">dns.h</a>
+, <a class="el" href="group__dns.html#gad02111a6b26b93f1c3580d5f41a59af3">dns.c</a>
+</li>
+<li>dns_init()
+: <a class="el" href="dns_8c.html#adb31c3b6180773bd11f914c327f209cf">dns.c</a>
+, <a class="el" href="dns_8h.html#adb31c3b6180773bd11f914c327f209cf">dns.h</a>
+</li>
+<li>DNS_LOCAL_HOSTLIST
+: <a class="el" href="group__lwip__opts__dns.html#gacba1ac491c1b47b98dfbd0d5c1662659">opt.h</a>
+</li>
+<li>DNS_LOCAL_HOSTLIST_IS_DYNAMIC
+: <a class="el" href="group__lwip__opts__dns.html#ga8235a5fb0a1c1cceeee670cf95612ba8">opt.h</a>
+</li>
+<li>DNS_MAX_NAME_LENGTH
+: <a class="el" href="group__lwip__opts__dns.html#ga3b01c79902063c170ef57deb72f56124">opt.h</a>
+</li>
+<li>DNS_MAX_RETRIES
+: <a class="el" href="group__lwip__opts__dns.html#gaab73c241189335435f3f662aa6a00dba">opt.h</a>
+</li>
+<li>DNS_MAX_SERVERS
+: <a class="el" href="group__lwip__opts__dns.html#ga9f9881c887a8aceb9765820c2dbdf292">opt.h</a>
+</li>
+<li>DNS_MAX_TTL
+: <a class="el" href="dns_8c.html#a7f5553dc4a0d2bf99ba1282a86df31e2">dns.c</a>
+</li>
+<li>DNS_MQUERY_PORT
+: <a class="el" href="prot_2dns_8h.html#a62d67af5ac6c6b3f98a6566a42564276">dns.h</a>
+</li>
+<li>DNS_PORT_ALLOWED
+: <a class="el" href="dns_8c.html#a97f3b0c56aeee091fdf2f07faf864ce0">dns.c</a>
+</li>
+<li>DNS_RAND_TXID
+: <a class="el" href="dns_8c.html#a9209c204996270af5cfdfd6e391267a1">dns.c</a>
+</li>
+<li>DNS_SERVER_PORT
+: <a class="el" href="prot_2dns_8h.html#a9266b48706648ecf0625a3e651095317">dns.h</a>
+</li>
+<li>dns_setserver()
+: <a class="el" href="group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584">dns.c</a>
+, <a class="el" href="group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584">dns.h</a>
+</li>
+<li>DNS_TABLE_SIZE
+: <a class="el" href="group__lwip__opts__dns.html#ga2384e76c1acdf969d883f3de08d340f7">opt.h</a>
+</li>
+<li>dns_tmr()
+: <a class="el" href="dns_8h.html#a9389f374ec66488aa4f42a652583f533">dns.h</a>
+, <a class="el" href="dns_8c.html#a9389f374ec66488aa4f42a652583f533">dns.c</a>
+</li>
+<li>DNS_TMR_INTERVAL
+: <a class="el" href="dns_8h.html#a464a7435c4c00735af59033d2acd83bb">dns.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs.html b/doc/doxygen/output/html/globals_defs.html
new file mode 100644
index 0000000..5ddf29e
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs.html
@@ -0,0 +1,153 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_a"></a>- a -</h3><ul>
+<li>accept
+: <a class="el" href="group__socket.html#gade2b17671b5a4b18e941fbf7e1060310">sockets.h</a>
+</li>
+<li>altcp_listen
+: <a class="el" href="group__altcp.html#ga96c22e15230b5216b3a95dc9e2ca42c8">altcp.h</a>
+</li>
+<li>ALTCP_MBEDTLS_DEBUG
+: <a class="el" href="altcp__tls__mbedtls__opts_8h.html#a7727456eeb0b3311213936413d238989">altcp_tls_mbedtls_opts.h</a>
+</li>
+<li>ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS
+: <a class="el" href="altcp__tls__mbedtls__opts_8h.html#a6acb28346f87b2310fc00ec1fccba2b6">altcp_tls_mbedtls_opts.h</a>
+</li>
+<li>ALTCP_PROXYCONNECT_CLIENT_AGENT
+: <a class="el" href="altcp__proxyconnect_8c.html#a344227f22aa1b58f7ed737a2d4f4636f">altcp_proxyconnect.c</a>
+</li>
+<li>API_EVENT
+: <a class="el" href="api_8h.html#a3ce590f58be8f60dbde361920863b26d">api.h</a>
+</li>
+<li>API_LIB_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga671009550216f7dc03e67ba5751e3160">opt.h</a>
+</li>
+<li>API_MSG_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga4279d7ff9f986b2ff3eb068bb012b697">opt.h</a>
+</li>
+<li>ARP_AGE_REREQUEST_USED_UNICAST
+: <a class="el" href="etharp_8c.html#ac71515a6f140b25de49e9bf432b2bb2a">etharp.c</a>
+</li>
+<li>ARP_MAXAGE
+: <a class="el" href="group__lwip__opts__arp.html#ga741a0710dc126ed3ae9e305472df3432">opt.h</a>
+</li>
+<li>ARP_MAXPENDING
+: <a class="el" href="etharp_8c.html#a0a03fea13e060da5a53a10a75a96def9">etharp.c</a>
+</li>
+<li>ARP_QUEUE_LEN
+: <a class="el" href="group__lwip__opts__arp.html#ga29f41a6ebdbb23f46688d381b3609fd1">opt.h</a>
+</li>
+<li>ARP_QUEUEING
+: <a class="el" href="group__lwip__opts__arp.html#ga75837814536af29b6102508588d0ab58">opt.h</a>
+</li>
+<li>ARP_TABLE_SIZE
+: <a class="el" href="group__lwip__opts__arp.html#ga924936a814564dbdb0bc950d255a83b9">opt.h</a>
+</li>
+<li>ARP_TMR_INTERVAL
+: <a class="el" href="lwip_2etharp_8h.html#aaa3d8ed1eb1129f518345e37b38cfc37">etharp.h</a>
+</li>
+<li>AUTOIP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gafaee522e7f32d81022215e1805e303a5">opt.h</a>
+</li>
+<li>autoip_remove_struct
+: <a class="el" href="autoip_8h.html#aaeb4b778fce078bee84144ab50916b15">autoip.h</a>
+</li>
+<li>AUTOIP_TMR_INTERVAL
+: <a class="el" href="autoip_8h.html#a8986919a452ab77eec9a199ff6668e92">autoip.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs.js b/doc/doxygen/output/html/globals_defs.js
new file mode 100644
index 0000000..3e5a545
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs.js
@@ -0,0 +1,22 @@
+var globals_defs =
+[
+    [ "a", "globals_defs.html", null ],
+    [ "b", "globals_defs_b.html", null ],
+    [ "c", "globals_defs_c.html", null ],
+    [ "d", "globals_defs_d.html", null ],
+    [ "e", "globals_defs_e.html", null ],
+    [ "f", "globals_defs_f.html", null ],
+    [ "g", "globals_defs_g.html", null ],
+    [ "h", "globals_defs_h.html", null ],
+    [ "i", "globals_defs_i.html", null ],
+    [ "l", "globals_defs_l.html", null ],
+    [ "m", "globals_defs_m.html", null ],
+    [ "n", "globals_defs_n.html", null ],
+    [ "p", "globals_defs_p.html", null ],
+    [ "r", "globals_defs_r.html", null ],
+    [ "s", "globals_defs_s.html", null ],
+    [ "t", "globals_defs_t.html", null ],
+    [ "u", "globals_defs_u.html", null ],
+    [ "w", "globals_defs_w.html", null ],
+    [ "z", "globals_defs_z.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/globals_defs_b.html b/doc/doxygen/output/html/globals_defs_b.html
new file mode 100644
index 0000000..6d4377d
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_b.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_b.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_b"></a>- b -</h3><ul>
+<li>bind
+: <a class="el" href="group__socket.html#ga4a88bb849aa7203b24bb245a193997a6">sockets.h</a>
+</li>
+<li>BRIDGEIF_DEBUG
+: <a class="el" href="group__bridgeif__opts.html#gaab45e20e9b09a98217994082968cec73">bridgeif_opts.h</a>
+</li>
+<li>BRIDGEIF_FDB_DEBUG
+: <a class="el" href="group__bridgeif__opts.html#ga72e389f592470dc50288a68f3db70730">bridgeif_opts.h</a>
+</li>
+<li>BRIDGEIF_FW_DEBUG
+: <a class="el" href="group__bridgeif__opts.html#gac456e97b1b0e9a57449596a2b229763a">bridgeif_opts.h</a>
+</li>
+<li>BRIDGEIF_INITDATA1
+: <a class="el" href="group__bridgeif.html#ga3d41c7905b61aef3a3b8c61b3af7879f">bridgeif.h</a>
+</li>
+<li>BRIDGEIF_INITDATA2
+: <a class="el" href="group__bridgeif.html#gaaaeb47fbf1dd6c30cb502343fa0d0741">bridgeif.h</a>
+</li>
+<li>BRIDGEIF_MAX_PORTS
+: <a class="el" href="group__bridgeif__opts.html#ga6fe03b84359150b7dea3dfca942b6414">bridgeif_opts.h</a>
+</li>
+<li>BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT
+: <a class="el" href="group__bridgeif__opts.html#ga5aed5cd9b01ba1345b47845cd04ca30d">bridgeif_opts.h</a>
+</li>
+<li>BYTE_ORDER
+: <a class="el" href="group__compiler__abstraction.html#ga1771b7fb65ee640524d0052f229768c3">arch.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs_c.html b/doc/doxygen/output/html/globals_defs_c.html
new file mode 100644
index 0000000..436e7a4
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_c.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_c"></a>- c -</h3><ul>
+<li>CHECKSUM_CHECK_ICMP
+: <a class="el" href="group__lwip__opts__checksum.html#ga79807171be8c20b69a5cd8de83566d25">opt.h</a>
+</li>
+<li>CHECKSUM_CHECK_ICMP6
+: <a class="el" href="group__lwip__opts__checksum.html#gaf466a10b093489910a773fd1cec74c2d">opt.h</a>
+</li>
+<li>CHECKSUM_CHECK_IP
+: <a class="el" href="group__lwip__opts__checksum.html#ga005b1b9988b84a2cb844144cef22c11e">opt.h</a>
+</li>
+<li>CHECKSUM_CHECK_TCP
+: <a class="el" href="group__lwip__opts__checksum.html#gab676cc29571b7ffda12336482ad97699">opt.h</a>
+</li>
+<li>CHECKSUM_CHECK_UDP
+: <a class="el" href="group__lwip__opts__checksum.html#ga6747f7b72abe544fd4dc184cc7fcad37">opt.h</a>
+</li>
+<li>CHECKSUM_GEN_ICMP
+: <a class="el" href="group__lwip__opts__checksum.html#ga2291ec5bec0a551545da6d5f9f9316b2">opt.h</a>
+</li>
+<li>CHECKSUM_GEN_ICMP6
+: <a class="el" href="group__lwip__opts__checksum.html#ga7cd47a55af03b1048c5a4a5fe0e76013">opt.h</a>
+</li>
+<li>CHECKSUM_GEN_IP
+: <a class="el" href="group__lwip__opts__checksum.html#ga8ddad81fc26268a13b35091781da2265">opt.h</a>
+</li>
+<li>CHECKSUM_GEN_TCP
+: <a class="el" href="group__lwip__opts__checksum.html#ga800069963cc4552b99235237c22f00bb">opt.h</a>
+</li>
+<li>CHECKSUM_GEN_UDP
+: <a class="el" href="group__lwip__opts__checksum.html#ga98d460f8c2baed8bf62d5473831c0b2c">opt.h</a>
+</li>
+<li>close
+: <a class="el" href="group__socket.html#ga4ef17e85ec4d3acdcee5ce23f8ed93c4">sockets.h</a>
+</li>
+<li>closesocket
+: <a class="el" href="group__socket.html#ga5a3eb971b466278ada4f7f87399a537c">sockets.h</a>
+</li>
+<li>connect
+: <a class="el" href="group__socket.html#gae3d13671f622e17c17317c9a16dfd0ee">sockets.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs_d.html b/doc/doxygen/output/html/globals_defs_d.html
new file mode 100644
index 0000000..bac41d5
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_d.html
@@ -0,0 +1,207 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_d.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>DEFAULT_ACCEPTMBOX_SIZE
+: <a class="el" href="group__lwip__opts__thread.html#ga5d5a6e04abe2ec233c7acdb09f992461">opt.h</a>
+</li>
+<li>DEFAULT_RAW_RECVMBOX_SIZE
+: <a class="el" href="group__lwip__opts__thread.html#ga4ef8f046c957750056131310a1580df7">opt.h</a>
+</li>
+<li>DEFAULT_TCP_RECVMBOX_SIZE
+: <a class="el" href="group__lwip__opts__thread.html#ga1bd172938b9c8ba63156fcafc87e83c7">opt.h</a>
+</li>
+<li>DEFAULT_THREAD_NAME
+: <a class="el" href="group__lwip__opts__thread.html#gaca13123a5c8271558353e04123957616">opt.h</a>
+</li>
+<li>DEFAULT_THREAD_PRIO
+: <a class="el" href="group__lwip__opts__thread.html#ga3d8715b1fdd0449d6c214e4a40108456">opt.h</a>
+</li>
+<li>DEFAULT_THREAD_STACKSIZE
+: <a class="el" href="group__lwip__opts__thread.html#ga7f93dfeaed4021061959f822def602cb">opt.h</a>
+</li>
+<li>DEFAULT_UDP_RECVMBOX_SIZE
+: <a class="el" href="group__lwip__opts__thread.html#ga09fe785559b3f0cf108da4440489e335">opt.h</a>
+</li>
+<li>DHCP6_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gacfc11be8b3bf6bb55e3e5c39ea8802d1">opt.h</a>
+</li>
+<li>DHCP6_DUID_LLT
+: <a class="el" href="prot_2dhcp6_8h.html#afe33f98cb94e0f18892a41502cf54e36">dhcp6.h</a>
+</li>
+<li>dhcp6_remove_struct
+: <a class="el" href="dhcp6_8h.html#a76941ddba22fe00dfc47d2f339f7aca3">dhcp6.h</a>
+</li>
+<li>DHCP6_STATUS_SUCCESS
+: <a class="el" href="prot_2dhcp6_8h.html#a878a7734e159826e82e958fe3a5ca175">dhcp6.h</a>
+</li>
+<li>DHCP6_TIMER_MSECS
+: <a class="el" href="dhcp6_8h.html#afdd69327dc7d9f5cc4f029d706f60c8f">dhcp6.h</a>
+</li>
+<li>DHCP_COARSE_TIMER_MSECS
+: <a class="el" href="dhcp_8h.html#ad84b8f4deec421bbf6fd85e8fae047d6">dhcp.h</a>
+</li>
+<li>DHCP_COARSE_TIMER_SECS
+: <a class="el" href="dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e">dhcp.h</a>
+</li>
+<li>DHCP_CREATE_RAND_XID
+: <a class="el" href="dhcp_8c.html#ad6de9c5120654454a330bf5de53c4835">dhcp.c</a>
+</li>
+<li>DHCP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga97927ceecabcdb5f41735bf372a05cee">opt.h</a>
+</li>
+<li>DHCP_DOES_ARP_CHECK
+: <a class="el" href="group__lwip__opts__dhcp.html#gab2d91de7b2fce879b0a213682e1b0b69">opt.h</a>
+</li>
+<li>DHCP_FINE_TIMER_MSECS
+: <a class="el" href="dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f">dhcp.h</a>
+</li>
+<li>DHCP_MAX_MSG_LEN
+: <a class="el" href="dhcp_8c.html#a63e9ec4517b80d8576f218d905e31a9b">dhcp.c</a>
+</li>
+<li>DHCP_MIN_REPLY_LEN
+: <a class="el" href="dhcp_8c.html#aa52c2b64ef42fbad84a3bcd58052caab">dhcp.c</a>
+</li>
+<li>DHCP_OPTIONS_LEN
+: <a class="el" href="prot_2dhcp_8h.html#ae99d4be0d03f6f9c8f02f63abde91a06">dhcp.h</a>
+</li>
+<li>dhcp_remove_struct
+: <a class="el" href="dhcp_8h.html#aa92284faa099dac4331c1fc0b997dabc">dhcp.h</a>
+</li>
+<li>DNS_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gaba55da2352c99d813767913e5e36be1f">opt.h</a>
+</li>
+<li>DNS_DOES_NAME_CHECK
+: <a class="el" href="group__lwip__opts__dns.html#ga07ffd8e9106dae3b65347bd03811a4b6">opt.h</a>
+</li>
+<li>DNS_LOCAL_HOSTLIST
+: <a class="el" href="group__lwip__opts__dns.html#gacba1ac491c1b47b98dfbd0d5c1662659">opt.h</a>
+</li>
+<li>DNS_LOCAL_HOSTLIST_IS_DYNAMIC
+: <a class="el" href="group__lwip__opts__dns.html#ga8235a5fb0a1c1cceeee670cf95612ba8">opt.h</a>
+</li>
+<li>DNS_MAX_NAME_LENGTH
+: <a class="el" href="group__lwip__opts__dns.html#ga3b01c79902063c170ef57deb72f56124">opt.h</a>
+</li>
+<li>DNS_MAX_RETRIES
+: <a class="el" href="group__lwip__opts__dns.html#gaab73c241189335435f3f662aa6a00dba">opt.h</a>
+</li>
+<li>DNS_MAX_SERVERS
+: <a class="el" href="group__lwip__opts__dns.html#ga9f9881c887a8aceb9765820c2dbdf292">opt.h</a>
+</li>
+<li>DNS_MAX_TTL
+: <a class="el" href="dns_8c.html#a7f5553dc4a0d2bf99ba1282a86df31e2">dns.c</a>
+</li>
+<li>DNS_MQUERY_PORT
+: <a class="el" href="prot_2dns_8h.html#a62d67af5ac6c6b3f98a6566a42564276">dns.h</a>
+</li>
+<li>DNS_PORT_ALLOWED
+: <a class="el" href="dns_8c.html#a97f3b0c56aeee091fdf2f07faf864ce0">dns.c</a>
+</li>
+<li>DNS_RAND_TXID
+: <a class="el" href="dns_8c.html#a9209c204996270af5cfdfd6e391267a1">dns.c</a>
+</li>
+<li>DNS_SERVER_PORT
+: <a class="el" href="prot_2dns_8h.html#a9266b48706648ecf0625a3e651095317">dns.h</a>
+</li>
+<li>DNS_TABLE_SIZE
+: <a class="el" href="group__lwip__opts__dns.html#ga2384e76c1acdf969d883f3de08d340f7">opt.h</a>
+</li>
+<li>DNS_TMR_INTERVAL
+: <a class="el" href="dns_8h.html#a464a7435c4c00735af59033d2acd83bb">dns.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs_e.html b/doc/doxygen/output/html/globals_defs_e.html
new file mode 100644
index 0000000..14fd1d4
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_e.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_e.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_e"></a>- e -</h3><ul>
+<li>EAI_NONAME
+: <a class="el" href="lwip_2netdb_8h.html#a0bb00f48d6ba1e8c55b7d85c8e3a19a7">netdb.h</a>
+</li>
+<li>ETH_ADDR
+: <a class="el" href="lwip_2prot_2ethernet_8h.html#a19c72ce98569e0fb55948a7587d704ee">ethernet.h</a>
+</li>
+<li>ETH_PAD_SIZE
+: <a class="el" href="group__lwip__opts__arp.html#gad7fa3b356ca7e603e848b069c4cc6276">opt.h</a>
+</li>
+<li>ETHARP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gabff5d1e0b334f5b45bd2b8bbb675411e">opt.h</a>
+</li>
+<li>ETHARP_FLAG_TRY_HARD
+: <a class="el" href="etharp_8c.html#a96f8787ca623e704da1d32ca7dd6d6d9">etharp.c</a>
+</li>
+<li>etharp_gratuitous
+: <a class="el" href="lwip_2etharp_8h.html#a83947dea159baf3420922084072e631e">etharp.h</a>
+</li>
+<li>ETHARP_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga3a8359abf4fff8ffdc449e5007f93275">opt.h</a>
+</li>
+<li>ETHARP_SUPPORT_STATIC_ENTRIES
+: <a class="el" href="group__lwip__opts__arp.html#ga4675829464156f3d665f4de171c212d7">opt.h</a>
+</li>
+<li>ETHARP_SUPPORT_VLAN
+: <a class="el" href="group__lwip__opts__arp.html#ga70ce0ecf56cf5fab000134e66d863f90">opt.h</a>
+</li>
+<li>ETHARP_TABLE_MATCH_NETIF
+: <a class="el" href="group__lwip__opts__arp.html#ga2f762eee309a545650f80fc8dcc19084">opt.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs_f.html b/doc/doxygen/output/html/globals_defs_f.html
new file mode 100644
index 0000000..766f999
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_f.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_f.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_f"></a>- f -</h3><ul>
+<li>fcntl
+: <a class="el" href="group__socket.html#gaaa2b0e00cab161fcc4b31ee0d06e7eb3">sockets.h</a>
+</li>
+<li>FOLD_U32T
+: <a class="el" href="inet__chksum_8h.html#a6ffe83b4bdd1784a0671ee4778966a01">inet_chksum.h</a>
+</li>
+<li>freeaddrinfo
+: <a class="el" href="group__netdbapi.html#gab28cd3049bcf6e2bc3a71e968a64a92d">netdb.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs_g.html b/doc/doxygen/output/html/globals_defs_g.html
new file mode 100644
index 0000000..00f4bef
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_g.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_g.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_g"></a>- g -</h3><ul>
+<li>getaddrinfo
+: <a class="el" href="group__netdbapi.html#ga558191530d91c101621b49e43bd5bbf5">netdb.h</a>
+</li>
+<li>gethostbyname
+: <a class="el" href="group__netdbapi.html#ga39746b4b096060ca3e8c6ee7a7560b1d">netdb.h</a>
+</li>
+<li>gethostbyname_r
+: <a class="el" href="group__netdbapi.html#ga76204a4d646dba393f88aa9b0980fc07">netdb.h</a>
+</li>
+<li>getpeername
+: <a class="el" href="group__socket.html#ga33bf1b7f5b11de02d0db32531cd940b8">sockets.h</a>
+</li>
+<li>getsockname
+: <a class="el" href="group__socket.html#gab096fb7dbc3f84be1699a87dce980f2f">sockets.h</a>
+</li>
+<li>getsockopt
+: <a class="el" href="group__socket.html#gad2de02b35dbbf2334d1befb137ede821">sockets.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs_h.html b/doc/doxygen/output/html/globals_defs_h.html
new file mode 100644
index 0000000..dbd0f93
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_h.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_h"></a>- h -</h3><ul>
+<li>HOSTENT_STORAGE
+: <a class="el" href="netdb_8c.html#acfc1e988534c0e497599b904739f92fe">netdb.c</a>
+</li>
+<li>HTTP_DEFAULT_PORT
+: <a class="el" href="group__httpc.html#ga1f192f3009865e9f9a3cd83609c866c2">http_client.h</a>
+</li>
+<li>HTTP_IS_DATA_VOLATILE
+: <a class="el" href="httpd_8c.html#aa93d60e8af23b915b5b9652ff71e1300">httpd.c</a>
+</li>
+<li>HTTP_IS_HDR_VOLATILE
+: <a class="el" href="httpd_8c.html#af281bc4a762d56243e0b85dd4197174a">httpd.c</a>
+</li>
+<li>HTTP_IS_TAG_VOLATILE
+: <a class="el" href="group__httpd__opts.html#ga662e88120b507426374dd8ebbd54a048">httpd_opts.h</a>
+</li>
+<li>HTTPC_CLIENT_AGENT
+: <a class="el" href="http__client_8c.html#aeda6122d341b879ba8b0fb2df834276a">http_client.c</a>
+</li>
+<li>HTTPC_DEBUG
+: <a class="el" href="http__client_8c.html#a32d4c0e6e42327e21fb59dabdc152dd1">http_client.c</a>
+</li>
+<li>HTTPC_DEBUG_REQUEST
+: <a class="el" href="http__client_8c.html#ad2ec42c8e7adaef67266a5bd12c4ad2a">http_client.c</a>
+</li>
+<li>HTTPD_DEBUG_TIMING
+: <a class="el" href="group__httpd__opts.html#ga5f2642874f930798d975b1f7a6d2e1da">httpd_opts.h</a>
+</li>
+<li>HTTPD_ENABLE_HTTPS
+: <a class="el" href="group__httpd__opts.html#ga64dc2a10b1c2ec886e698fe9008e51e2">httpd_opts.h</a>
+</li>
+<li>HTTPD_FSDATA_FILE
+: <a class="el" href="group__httpd__opts.html#gad68e8e06ea4c2be1b3508e813a49f7cc">httpd_opts.h</a>
+</li>
+<li>HTTPD_MAX_RETRIES
+: <a class="el" href="group__httpd__opts.html#gad92e78e19fd3ab2af42750e83ed73fd5">httpd_opts.h</a>
+</li>
+<li>HTTPD_POLL_INTERVAL
+: <a class="el" href="group__httpd__opts.html#gacc3e7667baa2cfafd23de2b152df7a63">httpd_opts.h</a>
+</li>
+<li>HTTPD_PRECALCULATED_CHECKSUM
+: <a class="el" href="group__httpd__opts.html#ga6e5de8515c89af12277e4cb011165103">httpd_opts.h</a>
+</li>
+<li>HTTPD_SERVER_AGENT
+: <a class="el" href="group__httpd__opts.html#gafb2115e763ed3163a3e204a0ba53edb9">httpd_opts.h</a>
+</li>
+<li>HTTPD_SERVER_PORT
+: <a class="el" href="group__httpd__opts.html#ga2b058c5d1bd67e5d7cb260166e3ace50">httpd_opts.h</a>
+</li>
+<li>HTTPD_SERVER_PORT_HTTPS
+: <a class="el" href="group__httpd__opts.html#gaffe653b08bf5ba25b276c655f6813441">httpd_opts.h</a>
+</li>
+<li>HTTPD_SSI_TAG_UNKNOWN
+: <a class="el" href="httpd_8h.html#aeb00bcd99ec9627b108832f0b58891ca">httpd.h</a>
+</li>
+<li>HTTPD_TCP_PRIO
+: <a class="el" href="group__httpd__opts.html#gaabd1f6319d04b8d5f2c93270794d5182">httpd_opts.h</a>
+</li>
+<li>HTTPD_USE_MEM_POOL
+: <a class="el" href="group__httpd__opts.html#gabb13219495a813fceaafa954a238a924">httpd_opts.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs_i.html b/doc/doxygen/output/html/globals_defs_i.html
new file mode 100644
index 0000000..528fe48
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_i.html
@@ -0,0 +1,629 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_i.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>ICMP6_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga714006cd5c5b0eb333159d0f677616a0">opt.h</a>
+</li>
+<li>ICMP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga9595904a1cb9bfe0b9b1d958abdc923a">opt.h</a>
+</li>
+<li>ICMP_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga472ad3f6da741f5b287d66ad3051242b">opt.h</a>
+</li>
+<li>ICMP_TTL
+: <a class="el" href="group__lwip__opts__icmp.html#gae1533f2bc39a5843989909555f6ce0cf">opt.h</a>
+</li>
+<li>IGMP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga8da07508ee75704362d45eee3eb857fa">opt.h</a>
+</li>
+<li>IGMP_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga4d12af1356b9fd60717984be51e27740">opt.h</a>
+</li>
+<li>IN6ADDR_ANY_INIT
+: <a class="el" href="lwip_2inet_8h.html#a1de876a356ee05a2e9427b741f99f49c">inet.h</a>
+</li>
+<li>IN6ADDR_LOOPBACK_INIT
+: <a class="el" href="lwip_2inet_8h.html#a5562c81af19ee5988ddc5a5c6153cf37">inet.h</a>
+</li>
+<li>INADDR_ANY
+: <a class="el" href="lwip_2inet_8h.html#a5d1940045dc2e7de552f3d4ff13a74ab">inet.h</a>
+</li>
+<li>INADDR_BROADCAST
+: <a class="el" href="lwip_2inet_8h.html#a4a725f61ded23ce8a7dff8e82ed51986">inet.h</a>
+</li>
+<li>INADDR_LOOPBACK
+: <a class="el" href="lwip_2inet_8h.html#ae1ac25d7797666cff6d01d6c795c2378">inet.h</a>
+</li>
+<li>INADDR_NONE
+: <a class="el" href="lwip_2inet_8h.html#a3d2472d6cf31b73eeb829110dd0fffea">inet.h</a>
+</li>
+<li>INET_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga78140cbe70258a65cb5c9e381843e4f3">opt.h</a>
+</li>
+<li>inet_ntop
+: <a class="el" href="group__socket.html#gaa40bf11abb409097e68aa3a6982eb52b">sockets.h</a>
+</li>
+<li>inet_pton
+: <a class="el" href="group__socket.html#ga90d2b417d82e8da981c940a665324fd5">sockets.h</a>
+</li>
+<li>ioctl
+: <a class="el" href="group__socket.html#ga50a83956bc3a96e6274a21ec0d4d6338">sockets.h</a>
+</li>
+<li>ioctlsocket
+: <a class="el" href="group__socket.html#ga19e714443d0238cfd79b71059ec92378">sockets.h</a>
+</li>
+<li>ip4_2_ipv4_mapped_ipv6
+: <a class="el" href="group__ipaddr.html#gae5f26df8f5099f330ad1e506c74f06f7">ip_addr.h</a>
+</li>
+<li>IP4_ADDR
+: <a class="el" href="ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974">ip4_addr.h</a>
+</li>
+<li>IP4_ADDR_ANY
+: <a class="el" href="group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff">ip_addr.h</a>
+</li>
+<li>IP4_ADDR_ANY4
+: <a class="el" href="group__ip4addr.html#gaa3f65a42b68149e96e618600b2ca2e42">ip_addr.h</a>
+</li>
+<li>IP4_ADDR_BROADCAST
+: <a class="el" href="group__ip4addr.html#ga5efdf55ba72c2b1b5755b1fc6f559a1a">ip_addr.h</a>
+</li>
+<li>ip4_addr_copy
+: <a class="el" href="ip4__addr_8h.html#a2f4e9c339e897e6ca5cb4a2f1e8394d5">ip4_addr.h</a>
+</li>
+<li>ip4_addr_get_network
+: <a class="el" href="ip4__addr_8h.html#a81658cb05ba504d13ee860e82dc444e9">ip4_addr.h</a>
+</li>
+<li>ip4_addr_get_u32
+: <a class="el" href="ip4__addr_8h.html#ad50d93464bbbda199b585c54869a3a4b">ip4_addr.h</a>
+</li>
+<li>ip4_addr_isloopback
+: <a class="el" href="ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051">ip4_addr.h</a>
+</li>
+<li>ip4_addr_netcmp
+: <a class="el" href="ip4__addr_8h.html#afd43f6ceb2df8d50c84509ad1059f514">ip4_addr.h</a>
+</li>
+<li>ip4_addr_set
+: <a class="el" href="ip4__addr_8h.html#a33a17a8d2025ce3715db835534868e88">ip4_addr.h</a>
+</li>
+<li>ip4_addr_set_any
+: <a class="el" href="ip4__addr_8h.html#afaaed3762ce8e9de14fcf73b19964567">ip4_addr.h</a>
+</li>
+<li>ip4_addr_set_hton
+: <a class="el" href="ip4__addr_8h.html#a901850ec90b01b9bf6baf69561aa465a">ip4_addr.h</a>
+</li>
+<li>ip4_addr_set_loopback
+: <a class="el" href="ip4__addr_8h.html#a5c7eae50a387987a7f56c29c74255c3c">ip4_addr.h</a>
+</li>
+<li>ip4_addr_set_u32
+: <a class="el" href="ip4__addr_8h.html#aeb39f58b38435f89219c8ccb509eb520">ip4_addr.h</a>
+</li>
+<li>ip4_addr_set_zero
+: <a class="el" href="ip4__addr_8h.html#a973b6ad98e037fc45f1e11d29cda99ea">ip4_addr.h</a>
+</li>
+<li>ip4_current_dest_addr
+: <a class="el" href="ip_8h.html#a2833c8d59910dd7c0e87ab3bb174e720">ip.h</a>
+</li>
+<li>ip4_current_header
+: <a class="el" href="ip_8h.html#a3ce482b7e08282effd670001198ecd87">ip.h</a>
+</li>
+<li>ip4_current_src_addr
+: <a class="el" href="ip_8h.html#ad2a62f96b9431a79f0258dc13058b160">ip.h</a>
+</li>
+<li>IP6_ADDR
+: <a class="el" href="ip6__addr_8h.html#a30c92254d6abe631de6a5accfd491bc3">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_ANY
+: <a class="el" href="group__ip6addr.html#ga5181d2cb6b9254eb5ad4137f7b3635a0">ip_addr.h</a>
+</li>
+<li>IP6_ADDR_ANY6
+: <a class="el" href="group__ip6addr.html#ga953cdd2592764ba2e6e021aea350ad43">ip_addr.h</a>
+</li>
+<li>ip6_addr_assign_zone
+: <a class="el" href="group__ip6__zones.html#ga1040a3d67498a1ef617bda8d9e0ba3a5">ip6_zone.h</a>
+</li>
+<li>IP6_ADDR_BLOCK1
+: <a class="el" href="ip6__addr_8h.html#ae258ebfa66d18c8c428bf3d8fd0f969c">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_BLOCK2
+: <a class="el" href="ip6__addr_8h.html#a9193137423b6b936d25c2e6cf33b4921">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_BLOCK3
+: <a class="el" href="ip6__addr_8h.html#a6466b1c0edd03d6a5986dcc79f7d8bb6">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_BLOCK4
+: <a class="el" href="ip6__addr_8h.html#a2a5d7de341ce708b7145ad4d72652c71">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_BLOCK5
+: <a class="el" href="ip6__addr_8h.html#a56a11cfaa169389c319f8bd027ac524c">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_BLOCK6
+: <a class="el" href="ip6__addr_8h.html#a116d7c5c8bf8531b27f8a9fa98e728c3">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_BLOCK7
+: <a class="el" href="ip6__addr_8h.html#ab87bee320ecc0e923931ee6f49802deb">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_BLOCK8
+: <a class="el" href="ip6__addr_8h.html#af3d1f9876bf256ec964bd3809d7ed1b4">ip6_addr.h</a>
+</li>
+<li>ip6_addr_clear_zone
+: <a class="el" href="group__ip6__zones.html#gae0249db6cd2687f2dbc445e7778d37ad">ip6_zone.h</a>
+</li>
+<li>ip6_addr_cmp
+: <a class="el" href="ip6__addr_8h.html#aea8d4c4134abff1c76bc997a91163fe1">ip6_addr.h</a>
+</li>
+<li>ip6_addr_cmp_packed
+: <a class="el" href="ip6__addr_8h.html#a11fe84789e3f039b3f71009e802946a8">ip6_addr.h</a>
+</li>
+<li>ip6_addr_cmp_zone
+: <a class="el" href="group__ip6__zones.html#gacbb8e1a7505d9772181defa0e75b8da9">ip6_zone.h</a>
+</li>
+<li>ip6_addr_cmp_zoneless
+: <a class="el" href="ip6__addr_8h.html#ad0fc088972d395839a7ad75d3dab8322">ip6_addr.h</a>
+</li>
+<li>ip6_addr_copy
+: <a class="el" href="ip6__addr_8h.html#a7b17e85a46bd8368ce27fc644e058073">ip6_addr.h</a>
+</li>
+<li>ip6_addr_copy_from_packed
+: <a class="el" href="ip6__addr_8h.html#a05575d46c233ffb13fb03a3a2c8a16b3">ip6_addr.h</a>
+</li>
+<li>ip6_addr_copy_to_packed
+: <a class="el" href="ip6__addr_8h.html#a6c46d12fa7d36c47b629d0ccdefa114b">ip6_addr.h</a>
+</li>
+<li>ip6_addr_copy_zone
+: <a class="el" href="group__ip6__zones.html#ga7347729485d837bcff85ae4731bbf5c4">ip6_zone.h</a>
+</li>
+<li>ip6_addr_equals_zone
+: <a class="el" href="group__ip6__zones.html#gaeead8379cc3fd4c257be0bb654994a8f">ip6_zone.h</a>
+</li>
+<li>ip6_addr_has_scope
+: <a class="el" href="group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90">ip6_zone.h</a>
+</li>
+<li>ip6_addr_has_zone
+: <a class="el" href="group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78">ip6_zone.h</a>
+</li>
+<li>ip6_addr_lacks_zone
+: <a class="el" href="group__ip6__zones.html#gad963bf3e9695ba898271e314975f5c97">ip6_zone.h</a>
+</li>
+<li>ip6_addr_netcmp
+: <a class="el" href="ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2">ip6_addr.h</a>
+</li>
+<li>ip6_addr_netcmp_zoneless
+: <a class="el" href="ip6__addr_8h.html#acc1622ab895680da0a3b6e5e56070342">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_PART
+: <a class="el" href="ip6__addr_8h.html#a1d78feeb50aec8f2c07d840829f49ddd">ip6_addr.h</a>
+</li>
+<li>ip6_addr_select_zone
+: <a class="el" href="group__ip6__zones.html#gac83f3e7c8d65d3c784bffc9dec29b70c">ip6_zone.h</a>
+</li>
+<li>ip6_addr_set
+: <a class="el" href="ip6__addr_8h.html#aa7b4ba4202b5f64dee605fe159e9c3ad">ip6_addr.h</a>
+</li>
+<li>ip6_addr_set_any
+: <a class="el" href="ip6__addr_8h.html#ae2d1ce50ec6dbee890e2f8ae64abdf6b">ip6_addr.h</a>
+</li>
+<li>ip6_addr_set_hton
+: <a class="el" href="ip6__addr_8h.html#ad636c27d56d1b3deca9f780bc173d3c2">ip6_addr.h</a>
+</li>
+<li>ip6_addr_set_loopback
+: <a class="el" href="ip6__addr_8h.html#a02f5271e922f34a09153ce84839ad292">ip6_addr.h</a>
+</li>
+<li>ip6_addr_set_zero
+: <a class="el" href="ip6__addr_8h.html#af696d3b81f4cb9c40ece912de73ed53c">ip6_addr.h</a>
+</li>
+<li>ip6_addr_set_zone
+: <a class="el" href="group__ip6__zones.html#ga213310b303dd050da7856d67da72abd6">ip6_zone.h</a>
+</li>
+<li>ip6_addr_test_zone
+: <a class="el" href="group__ip6__zones.html#gac3ec5f94e1cd62b1237efca3723dc06e">ip6_zone.h</a>
+</li>
+<li>ip6_addr_zone
+: <a class="el" href="group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634">ip6_zone.h</a>
+</li>
+<li>ip6_current_dest_addr
+: <a class="el" href="ip_8h.html#a176525c2192d37ee9eaeba8012c5d9c0">ip.h</a>
+</li>
+<li>ip6_current_header
+: <a class="el" href="ip_8h.html#af9bf74750c9d7a219ee88d240300fe69">ip.h</a>
+</li>
+<li>ip6_current_src_addr
+: <a class="el" href="ip_8h.html#ac40a9e4a21ecf5bb39813bb6ca5bb245">ip.h</a>
+</li>
+<li>IP6_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gac2f9726756b78d4d7c425b0422a776ce">opt.h</a>
+</li>
+<li>IP6_FRAG_STATS
+: <a class="el" href="group__lwip__opts__stats.html#gaaa08a181c11ff8b471549e8f52c9939b">opt.h</a>
+</li>
+<li>IP6_NO_ZONE
+: <a class="el" href="group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb">ip6_zone.h</a>
+</li>
+<li>IP6_REASS_TMR_INTERVAL
+: <a class="el" href="ip6__frag_8h.html#ad0730ee4db9fbebdf071bb33d75698a2">ip6_frag.h</a>
+</li>
+<li>IP6_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga6a211b787c97bce3af4273b29c95d9c2">opt.h</a>
+</li>
+<li>ip_2_ip4
+: <a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_addr.h</a>
+</li>
+<li>ip_2_ip6
+: <a class="el" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_addr.h</a>
+</li>
+<li>IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT
+: <a class="el" href="ip4_8c.html#a185c7d6380711847105430931692b267">ip4.c</a>
+</li>
+<li>IP_ADDR4
+: <a class="el" href="group__ip4addr.html#gadd2203c6cbfb6de8c2d9ce5bbfb2bd2a">ip_addr.h</a>
+</li>
+<li>IP_ADDR6
+: <a class="el" href="group__ip6addr.html#ga9ee53b601b89dcb517496ba0bccf9bd0">ip_addr.h</a>
+</li>
+<li>IP_ADDR6_HOST
+: <a class="el" href="group__ip6addr.html#gabfb1ce44d6a8791336bf3ac06aa086ca">ip_addr.h</a>
+</li>
+<li>IP_ADDR_ANY
+: <a class="el" href="group__ip4addr.html#ga3e5e67b7292b156034560fef2202776c">ip_addr.h</a>
+</li>
+<li>IP_ADDR_BROADCAST
+: <a class="el" href="group__ip4addr.html#gad546955e48dada78b552375b873f6986">ip_addr.h</a>
+</li>
+<li>ip_addr_cmp
+: <a class="el" href="group__ipaddr.html#ga008c9c92d770cc030ea054e6b259835a">ip_addr.h</a>
+</li>
+<li>ip_addr_cmp_zoneless
+: <a class="el" href="group__ipaddr.html#gadb66f6d5fa926ed4b0e69db58dffcbe4">ip_addr.h</a>
+</li>
+<li>ip_addr_copy
+: <a class="el" href="group__ipaddr.html#ga77a933975db287f6aa5c2e70249ba18f">ip_addr.h</a>
+</li>
+<li>ip_addr_copy_from_ip4
+: <a class="el" href="group__ip4addr.html#gaef063b2e975dae7ecf398770b04b14af">ip_addr.h</a>
+</li>
+<li>ip_addr_copy_from_ip6
+: <a class="el" href="group__ip6addr.html#gabe6f7908ce8a91dc587e2ebc2172e651">ip_addr.h</a>
+</li>
+<li>ip_addr_copy_from_ip6_packed
+: <a class="el" href="group__ip6addr.html#ga130ca0907497831677c130dbb3289e1e">ip_addr.h</a>
+</li>
+<li>ip_addr_get_ip4_u32
+: <a class="el" href="group__ip4addr.html#ga09c62e8a3bf599aa7f335e0ad0820e85">ip_addr.h</a>
+</li>
+<li>ip_addr_get_network
+: <a class="el" href="group__ipaddr.html#gab5c5540ea05227bdd9207a47304bb2c1">ip_addr.h</a>
+</li>
+<li>ip_addr_isany
+: <a class="el" href="group__ipaddr.html#ga279118890e6a90aa740051fb8b0cc5f4">ip_addr.h</a>
+</li>
+<li>ip_addr_isany_val
+: <a class="el" href="group__ipaddr.html#gacd8f5aa151cff966fd28368b85f38c05">ip_addr.h</a>
+</li>
+<li>ip_addr_isbroadcast
+: <a class="el" href="group__ipaddr.html#gaa3345706e3aa8b32dd630c195b053e75">ip_addr.h</a>
+</li>
+<li>ip_addr_islinklocal
+: <a class="el" href="group__ipaddr.html#ga33bc079baaf513a9a7381b9531a1f653">ip_addr.h</a>
+</li>
+<li>ip_addr_isloopback
+: <a class="el" href="group__ipaddr.html#ga0fc8bf6662809274750868683b3a422e">ip_addr.h</a>
+</li>
+<li>ip_addr_ismulticast
+: <a class="el" href="group__ipaddr.html#ga2170d3ee13dd22722222228e7b1c5752">ip_addr.h</a>
+</li>
+<li>ip_addr_netcmp
+: <a class="el" href="group__ipaddr.html#ga3a2123f0bbf6fe843c8542e349c680eb">ip_addr.h</a>
+</li>
+<li>ip_addr_set
+: <a class="el" href="group__ipaddr.html#ga40db7feae2b92f7a7a01d65a85b06e18">ip_addr.h</a>
+</li>
+<li>ip_addr_set_any
+: <a class="el" href="group__ipaddr.html#ga8853fce54b1816dca3af90b48677e673">ip_addr.h</a>
+</li>
+<li>ip_addr_set_any_val
+: <a class="el" href="group__ipaddr.html#ga93c7bf3f7487495472aa0f9b5fc25d1a">ip_addr.h</a>
+</li>
+<li>ip_addr_set_hton
+: <a class="el" href="group__ipaddr.html#ga3528798be1d2f1ec6a6bccd35694edce">ip_addr.h</a>
+</li>
+<li>ip_addr_set_ip4_u32
+: <a class="el" href="group__ip4addr.html#ga971516589980428bf51f37cefa4ddf66">ip_addr.h</a>
+</li>
+<li>ip_addr_set_ip4_u32_val
+: <a class="el" href="group__ip4addr.html#ga624b5010ccc04cc3d0de2acce44f1c9e">ip_addr.h</a>
+</li>
+<li>ip_addr_set_ipaddr
+: <a class="el" href="group__ipaddr.html#gaea5e4795598bc33fa2db1773c8e6fbac">ip_addr.h</a>
+</li>
+<li>ip_addr_set_loopback
+: <a class="el" href="group__ipaddr.html#ga8f9d56ac85cd87338a1823e4a58ba1da">ip_addr.h</a>
+</li>
+<li>ip_addr_set_loopback_val
+: <a class="el" href="group__ipaddr.html#gac1c5f897bbee217771b1a6ba18733042">ip_addr.h</a>
+</li>
+<li>ip_addr_set_zero
+: <a class="el" href="group__ipaddr.html#gaae7edb585c062ae03bfbd3af7bf671bc">ip_addr.h</a>
+</li>
+<li>ip_addr_set_zero_ip4
+: <a class="el" href="ip__addr_8h.html#aecb93d575e65f835f1045a4e87e70ed9">ip_addr.h</a>
+</li>
+<li>ip_addr_set_zero_ip6
+: <a class="el" href="group__ip6addr.html#gafb3a0e5241683aff573e195f31ba8845">ip_addr.h</a>
+</li>
+<li>IP_ANY_TYPE
+: <a class="el" href="group__ipaddr.html#gabe43b154533b73585c4e58f568370ede">ip_addr.h</a>
+</li>
+<li>ip_current_dest_addr
+: <a class="el" href="ip_8h.html#a9135977868017c3deeec86b525e13997">ip.h</a>
+</li>
+<li>ip_current_header_proto
+: <a class="el" href="ip_8h.html#af27c43c23b59d68a8463cd5ad035b20f">ip.h</a>
+</li>
+<li>ip_current_header_tot_len
+: <a class="el" href="ip_8h.html#a2ca15ea285a10982294378cd7b8e83e2">ip.h</a>
+</li>
+<li>ip_current_input_netif
+: <a class="el" href="ip_8h.html#ae214afa9d3f1b26fc8d538436b8fa3c4">ip.h</a>
+</li>
+<li>ip_current_is_v6
+: <a class="el" href="ip_8h.html#abc56623d434a204298a4e98352af1c9d">ip.h</a>
+</li>
+<li>ip_current_netif
+: <a class="el" href="ip_8h.html#aabecef3c7653a9767c79245c44fcab9f">ip.h</a>
+</li>
+<li>ip_current_src_addr
+: <a class="el" href="ip_8h.html#a4e35b7692c228c98e738892f0a215647">ip.h</a>
+</li>
+<li>IP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga5d3348778951e7bc5cd397c6575eef3a">opt.h</a>
+</li>
+<li>IP_DEFAULT_TTL
+: <a class="el" href="group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411">opt.h</a>
+</li>
+<li>IP_FORWARD
+: <a class="el" href="group__lwip__opts__ipv4.html#ga881d32ff5ee02af01f758953f1b51d59">opt.h</a>
+</li>
+<li>IP_FORWARD_ALLOW_TX_ON_RX_NETIF
+: <a class="el" href="group__lwip__opts__ipv4.html#ga9e761df07c4e93901858741d4771dbc7">opt.h</a>
+</li>
+<li>IP_FRAG
+: <a class="el" href="group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4">opt.h</a>
+</li>
+<li>ip_get_option
+: <a class="el" href="ip_8h.html#a26e077f52de4a97ff89c02415c084518">ip.h</a>
+</li>
+<li>IP_HDR_GET_VERSION
+: <a class="el" href="prot_2ip_8h.html#afc29766fb0707c63b64568c5fa44a374">ip.h</a>
+</li>
+<li>IP_IS_ANY_TYPE_VAL
+: <a class="el" href="group__ipaddr.html#ga83b17dbf7d1faf5c8f8c20b039db8bb8">ip_addr.h</a>
+</li>
+<li>IP_IS_V4
+: <a class="el" href="group__ip4addr.html#gabee5dab2191bb0f3355d7f30d1496f24">ip_addr.h</a>
+</li>
+<li>IP_IS_V4_VAL
+: <a class="el" href="group__ip4addr.html#gab1a059f07bd9c50aa58447d963b823a1">ip_addr.h</a>
+</li>
+<li>IP_IS_V6
+: <a class="el" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">ip_addr.h</a>
+</li>
+<li>IP_IS_V6_VAL
+: <a class="el" href="group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d">ip_addr.h</a>
+</li>
+<li>ip_netif_get_local_ip
+: <a class="el" href="group__ip.html#ga4a4b9439c91eeec719692dfe10f14af0">ip.h</a>
+</li>
+<li>ip_next_header_ptr
+: <a class="el" href="ip_8h.html#a68d25b5924b768cbf2f1a78bbabfce26">ip.h</a>
+</li>
+<li>ip_ntoa
+: <a class="el" href="ip4__addr_8h.html#a2b2230516e7911dfacc9b87644ba30f1">ip4_addr.h</a>
+</li>
+<li>IP_OPTIONS_ALLOWED
+: <a class="el" href="group__lwip__opts__ipv4.html#gaa956b0167c37a2265b55e2d0204a3933">opt.h</a>
+</li>
+<li>IP_OPTIONS_SEND
+: <a class="el" href="ip4_8h.html#a516aa115f61c368cbe74fae2da2c6824">ip4.h</a>
+</li>
+<li>ip_output
+: <a class="el" href="group__ip.html#gaf056aa43789c2964f091f8349bb83730">ip.h</a>
+</li>
+<li>ip_output_hinted
+: <a class="el" href="ip_8h.html#accbc01f37dd426a66de41693a5450207">ip.h</a>
+</li>
+<li>ip_output_if
+: <a class="el" href="group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250">ip.h</a>
+</li>
+<li>ip_output_if_hdrincl
+: <a class="el" href="ip_8h.html#aac608b92f8f226c3574d6bb855f12496">ip.h</a>
+</li>
+<li>ip_output_if_src
+: <a class="el" href="group__ip.html#gab9d45f846f796bd6ce1e0c780c392765">ip.h</a>
+</li>
+<li>IP_PCB
+: <a class="el" href="ip_8h.html#a8bdf4b5f674375e76cdd968826d80e53">ip.h</a>
+</li>
+<li>IP_REASS_CHECK_OVERLAP
+: <a class="el" href="ip6__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe">ip6_frag.c</a>
+, <a class="el" href="ip4__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe">ip4_frag.c</a>
+</li>
+<li>IP_REASS_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33">opt.h</a>
+</li>
+<li>IP_REASS_FREE_OLDEST
+: <a class="el" href="ip6__frag_8c.html#a510934accf149433bdcf683993e79080">ip6_frag.c</a>
+, <a class="el" href="ip4__frag_8c.html#a510934accf149433bdcf683993e79080">ip4_frag.c</a>
+</li>
+<li>IP_REASS_MAX_PBUFS
+: <a class="el" href="group__lwip__opts__ipv4.html#ga29084a46d7d4be30e8029d356bca0394">opt.h</a>
+</li>
+<li>IP_REASS_MAXAGE
+: <a class="el" href="group__lwip__opts__ipv4.html#gad41122bd0b5485a18a4415c8f953727b">opt.h</a>
+</li>
+<li>IP_REASSEMBLY
+: <a class="el" href="group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69">opt.h</a>
+</li>
+<li>ip_reset_option
+: <a class="el" href="ip_8h.html#a441c63f00c4b0cb69fc34ca6b55307cc">ip.h</a>
+</li>
+<li>ip_route
+: <a class="el" href="group__ip.html#ga0fa3afc2c00aea346889b476650adee3">ip.h</a>
+</li>
+<li>ip_set_option
+: <a class="el" href="ip_8h.html#a13f48cf825c7f074dc05bea54e9d6a93">ip.h</a>
+</li>
+<li>IP_SOF_BROADCAST
+: <a class="el" href="group__lwip__opts__ipv4.html#ga0b2c993fd940f5774108298933310384">opt.h</a>
+</li>
+<li>IP_SOF_BROADCAST_RECV
+: <a class="el" href="group__lwip__opts__ipv4.html#ga0f1fbf42d3344bf87cd056d48ddca3db">opt.h</a>
+</li>
+<li>IP_STATS
+: <a class="el" href="group__lwip__opts__stats.html#gaf50575a4895e26ea2c01d1f2269487be">opt.h</a>
+</li>
+<li>IPADDR4_INIT
+: <a class="el" href="group__ip4addr.html#ga1eaffd17b4b3c56cc91a6d516e18118f">ip_addr.h</a>
+</li>
+<li>IPADDR4_INIT_BYTES
+: <a class="el" href="group__ip4addr.html#ga55cc3896c46564bd2941ee5806fe1e11">ip_addr.h</a>
+</li>
+<li>IPADDR6_INIT
+: <a class="el" href="group__ip6addr.html#ga1266e500b1db0b7cdc4b269cace49746">ip_addr.h</a>
+</li>
+<li>IPADDR6_INIT_HOST
+: <a class="el" href="group__ip6addr.html#gadaff748da2b808995993dd3db5420f08">ip_addr.h</a>
+</li>
+<li>IPADDR6_ZONE_INIT
+: <a class="el" href="group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9">ip6_zone.h</a>
+</li>
+<li>IPADDR_ANY
+: <a class="el" href="ip4__addr_8h.html#ad6ed0d622d61ecd6edd606e3b564f0a2">ip4_addr.h</a>
+</li>
+<li>IPADDR_ANY_TYPE_INIT
+: <a class="el" href="group__ipaddr.html#ga23b580930c0eb1d0fdeba2b109c077a5">ip_addr.h</a>
+</li>
+<li>IPADDR_BROADCAST
+: <a class="el" href="ip4__addr_8h.html#ac661fca7e7d25e5cd379b811a767c29a">ip4_addr.h</a>
+</li>
+<li>IPADDR_LOOPBACK
+: <a class="el" href="ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e">ip4_addr.h</a>
+</li>
+<li>IPADDR_NONE
+: <a class="el" href="ip4__addr_8h.html#abc4b2e3531c4992f2ae4b8c0f9751544">ip4_addr.h</a>
+</li>
+<li>IPADDR_STRLEN_MAX
+: <a class="el" href="group__ipaddr.html#ga8619278bcbf705844f584f36972fc758">ip_addr.h</a>
+</li>
+<li>IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T
+: <a class="el" href="lwip_2prot_2etharp_8h.html#a7dff02ff186f844b731cecbe614b7419">etharp.h</a>
+</li>
+<li>IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T
+: <a class="el" href="lwip_2prot_2etharp_8h.html#a94f1c2a6ad7cecdfe759c0490ba7f030">etharp.h</a>
+</li>
+<li>IPFRAG_STATS
+: <a class="el" href="group__lwip__opts__stats.html#gac9a4fbb46df3c0f479a334d0e34fb74f">opt.h</a>
+</li>
+<li>IPV6_CUSTOM_SCOPES
+: <a class="el" href="group__ip6__zones.html#gae677a65970f4b667156b256dd9a4924b">ip6_zone.h</a>
+</li>
+<li>IPV6_FRAG_COPYHEADER
+: <a class="el" href="ip6__frag_8h.html#a151e742cf7f0e5c3a08f31db0370cea7">ip6_frag.h</a>
+</li>
+<li>IPV6_REASS_MAXAGE
+: <a class="el" href="group__lwip__opts__ipv6.html#ga8adc0b7dbedd279387a21588f0e2c969">opt.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs_l.html b/doc/doxygen/output/html/globals_defs_l.html
new file mode 100644
index 0000000..b985a50
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_l.html
@@ -0,0 +1,876 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_l.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_l"></a>- l -</h3><ul>
+<li>LINK_STATS
+: <a class="el" href="group__lwip__opts__stats.html#gae58b452782d0327ae728192686c5a84a">opt.h</a>
+</li>
+<li>listen
+: <a class="el" href="group__socket.html#gae6e6de5a20bed9fc7078f0e6c9c4aca4">sockets.h</a>
+</li>
+<li>LL_IP4_MULTICAST_ADDR_0
+: <a class="el" href="lwip_2prot_2ethernet_8h.html#afaf6cbccf9477c3505660e3a17860e07">ethernet.h</a>
+</li>
+<li>LL_IP6_MULTICAST_ADDR_0
+: <a class="el" href="lwip_2prot_2ethernet_8h.html#a8ebe93c6ad2d743e6c952539257679b6">ethernet.h</a>
+</li>
+<li>LOCK_TCPIP_CORE
+: <a class="el" href="tcpip_8h.html#a4700525e737fc025fea4887b172e0c95">tcpip.h</a>
+</li>
+<li>LOWPAN6_TMR_INTERVAL
+: <a class="el" href="lowpan6_8h.html#aa258ae16a937c40333c8f97a7f236797">lowpan6.h</a>
+</li>
+<li>LWIP_6LOWPAN_802154_HW_CRC
+: <a class="el" href="lowpan6__opts_8h.html#ae5bb9b8d695caec08930073edc7c6175">lowpan6_opts.h</a>
+</li>
+<li>LWIP_6LOWPAN_CALC_CRC
+: <a class="el" href="lowpan6__opts_8h.html#ad20840e31a0a6eeec8666e4d4a979f43">lowpan6_opts.h</a>
+</li>
+<li>LWIP_6LOWPAN_INFER_SHORT_ADDRESS
+: <a class="el" href="lowpan6__opts_8h.html#a6a542cd72a6270b7231b8b93f8041207">lowpan6_opts.h</a>
+</li>
+<li>LWIP_6LOWPAN_IPHC
+: <a class="el" href="lowpan6__opts_8h.html#a0f178a86d02e0ba4168cafe3de5f3afa">lowpan6_opts.h</a>
+</li>
+<li>LWIP_6LOWPAN_NUM_CONTEXTS
+: <a class="el" href="lowpan6__opts_8h.html#a4ffa89f39abf93cc599f78c5a8bb0a4a">lowpan6_opts.h</a>
+</li>
+<li>LWIP_ALIGNMENT_CAST
+: <a class="el" href="group__compiler__abstraction.html#gaade87973d72135b0b3afccfff4f62eb8">arch.h</a>
+</li>
+<li>LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
+: <a class="el" href="group__lwip__opts__mem.html#ga0a3ef6098813c103e5aba07da76e15e2">opt.h</a>
+</li>
+<li>LWIP_ALTCP
+: <a class="el" href="group__lwip__opts__tcp.html#ga26dee0e5d9c51b1dda0adad29c770a77">opt.h</a>
+</li>
+<li>LWIP_ALTCP_TLS
+: <a class="el" href="group__lwip__opts__tcp.html#gab03ba0306cf0a99ccce3d100142f60c8">opt.h</a>
+</li>
+<li>LWIP_ALTCP_TLS_MBEDTLS
+: <a class="el" href="altcp__tls__mbedtls__opts_8h.html#ac8dbfe10a4a9a64c1e2c62ea97e48639">altcp_tls_mbedtls_opts.h</a>
+</li>
+<li>LWIP_ARP
+: <a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">opt.h</a>
+</li>
+<li>LWIP_ARP_FILTER_NETIF
+: <a class="el" href="netif_2ethernet_8h.html#a1ecae0406a3b714c02b632379f26a365">ethernet.h</a>
+</li>
+<li>LWIP_ASSERT_CORE_LOCKED
+: <a class="el" href="group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75">opt.h</a>
+</li>
+<li>LWIP_AUTOIP
+: <a class="el" href="group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069">opt.h</a>
+</li>
+<li>LWIP_AUTOIP_CREATE_SEED_ADDR
+: <a class="el" href="autoip_8c.html#acec75069f6e6ecbe200c5691e56ecd43">autoip.c</a>
+</li>
+<li>LWIP_AUTOIP_RAND
+: <a class="el" href="autoip_8c.html#a634535156cc1a8cf9f04d3d5c74f8a59">autoip.c</a>
+</li>
+<li>LWIP_BROADCAST_PING
+: <a class="el" href="group__lwip__opts__icmp.html#ga8088cb56d1a84fe554b11bc15d84b2b9">opt.h</a>
+</li>
+<li>LWIP_CHECKSUM_CTRL_PER_NETIF
+: <a class="el" href="group__lwip__opts__checksum.html#ga3ecc5246a0c6ca5aed56c2d7899c1004">opt.h</a>
+</li>
+<li>LWIP_CHECKSUM_ON_COPY
+: <a class="el" href="group__lwip__opts__checksum.html#ga9f60183f0442bdbeefd6b395c6647613">opt.h</a>
+</li>
+<li>LWIP_COMPAT_MUTEX
+: <a class="el" href="sys_8h.html#a7bada49634cd3b28b28bdcedd763a1e6">sys.h</a>
+</li>
+<li>LWIP_COMPAT_SOCKETS
+: <a class="el" href="group__lwip__opts__socket.html#gafed2811f031822ec5afa1ee211fb7447">opt.h</a>
+</li>
+<li>LWIP_CONST_CAST
+: <a class="el" href="group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72">arch.h</a>
+</li>
+<li>LWIP_DBG_FRESH
+: <a class="el" href="group__debugging__levels.html#ga7d44d1804fa5e747aed86816e2a6cae0">debug.h</a>
+</li>
+<li>LWIP_DBG_HALT
+: <a class="el" href="group__debugging__levels.html#gab0a296414983155b30ad51871606b90f">debug.h</a>
+</li>
+<li>LWIP_DBG_LEVEL_ALL
+: <a class="el" href="group__debugging__levels.html#ga8ebaeb006b43f55897f3196b3617dc87">debug.h</a>
+</li>
+<li>LWIP_DBG_LEVEL_SERIOUS
+: <a class="el" href="group__debugging__levels.html#ga0269bdc51f1e8a5ecf9af72c6e1c996c">debug.h</a>
+</li>
+<li>LWIP_DBG_LEVEL_SEVERE
+: <a class="el" href="group__debugging__levels.html#gaab41143277cd38047b6660d90e9cec3b">debug.h</a>
+</li>
+<li>LWIP_DBG_LEVEL_WARNING
+: <a class="el" href="group__debugging__levels.html#ga77c491e468bf7d9a1bc48430c1866a96">debug.h</a>
+</li>
+<li>LWIP_DBG_MIN_LEVEL
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga2043f599515774f8e571ba185dbcb9e7">opt.h</a>
+</li>
+<li>LWIP_DBG_OFF
+: <a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">debug.h</a>
+</li>
+<li>LWIP_DBG_ON
+: <a class="el" href="group__debugging__levels.html#ga9e31b7cbbc8f46af8e62b548079acd4e">debug.h</a>
+</li>
+<li>LWIP_DBG_STATE
+: <a class="el" href="group__debugging__levels.html#ga511ee3deb3240635f5ec6a1709c6d741">debug.h</a>
+</li>
+<li>LWIP_DBG_TRACE
+: <a class="el" href="group__debugging__levels.html#ga988147559b78642ac881815b66023646">debug.h</a>
+</li>
+<li>LWIP_DBG_TYPES_ON
+: <a class="el" href="group__lwip__opts__debugmsg.html#gac095d0e53f5eb5b326b2cccfd071d93d">opt.h</a>
+</li>
+<li>LWIP_DEBUG
+: <a class="el" href="debug_8h.html#a957d947c94fda9b85d4aee0aab72952a">debug.h</a>
+</li>
+<li>LWIP_DECLARE_MEMORY_ALIGNED
+: <a class="el" href="group__compiler__abstraction.html#ga651bb349041669fe717b19f127ef16c0">arch.h</a>
+</li>
+<li>LWIP_DHCP
+: <a class="el" href="group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9">opt.h</a>
+</li>
+<li>LWIP_DHCP6_GET_NTP_SRV
+: <a class="el" href="group__lwip__opts__dhcpv6.html#ga5d08f76a7472daa7bcfe17343243bd77">opt.h</a>
+</li>
+<li>LWIP_DHCP6_MAX_DNS_SERVERS
+: <a class="el" href="group__lwip__opts__dhcpv6.html#ga92c3bc242ad20a5f398c45d332864a29">opt.h</a>
+</li>
+<li>LWIP_DHCP6_MAX_NTP_SERVERS
+: <a class="el" href="group__lwip__opts__dhcpv6.html#gaf3ac8e15d7a67429a02bc2317e16bcfe">opt.h</a>
+</li>
+<li>LWIP_DHCP_AUTOIP_COOP
+: <a class="el" href="group__lwip__opts__autoip.html#ga1a91e18dbb9777bc6e3963f52cb5f9fe">opt.h</a>
+</li>
+<li>LWIP_DHCP_AUTOIP_COOP_TRIES
+: <a class="el" href="group__lwip__opts__autoip.html#ga4ff3f941b4c71a04b0c30fbee5b198c2">opt.h</a>
+</li>
+<li>LWIP_DHCP_BOOTP_FILE
+: <a class="el" href="group__lwip__opts__dhcp.html#ga3c2983cbd228011dd3e18cb417e7e423">opt.h</a>
+</li>
+<li>LWIP_DHCP_GET_NTP_SRV
+: <a class="el" href="group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83">opt.h</a>
+</li>
+<li>LWIP_DHCP_MAX_DNS_SERVERS
+: <a class="el" href="group__lwip__opts__dhcp.html#ga60ccc20fbb08be24b5d5f599dd47a6a6">opt.h</a>
+</li>
+<li>LWIP_DHCP_MAX_NTP_SERVERS
+: <a class="el" href="group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2">opt.h</a>
+</li>
+<li>LWIP_DNS
+: <a class="el" href="group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646">opt.h</a>
+</li>
+<li>LWIP_DNS_API_HOSTENT_STORAGE
+: <a class="el" href="netdb_8c.html#a768ab8ead892d6454709680340cd070e">netdb.c</a>
+</li>
+<li>LWIP_DNS_SECURE
+: <a class="el" href="group__lwip__opts__dns.html#ga8979c30dfbfde609d5139f80aabdfcc5">opt.h</a>
+</li>
+<li>LWIP_DNS_SUPPORT_MDNS_QUERIES
+: <a class="el" href="group__lwip__opts__dns.html#gafcbde5706a70ace562bd1f7d2d6f77cb">opt.h</a>
+</li>
+<li>LWIP_ETHERNET
+: <a class="el" href="group__lwip__opts__arp.html#ga30e02dc217cc2995d0fd241d510c904f">opt.h</a>
+</li>
+<li>LWIP_EVENT_API
+: <a class="el" href="group__lwip__opts__tcp.html#ga39f76e811117155be8525bb386ecddb7">opt.h</a>
+</li>
+<li>LWIP_FIONREAD_LINUXMODE
+: <a class="el" href="group__lwip__opts__socket.html#ga0543eea2abe390d0bdc843c33debd762">opt.h</a>
+</li>
+<li>LWIP_HAVE_LOOPIF
+: <a class="el" href="group__lwip__opts__loop.html#gaa2b1f736373cd896e212644aa453fbaf">opt.h</a>
+</li>
+<li>LWIP_HOOK_DHCP6_APPEND_OPTIONS
+: <a class="el" href="group__lwip__opts__hooks.html#ga4068b3313e32f711ba016215fc2c886a">opt.h</a>
+</li>
+<li>LWIP_HOOK_DHCP_APPEND_OPTIONS
+: <a class="el" href="group__lwip__opts__hooks.html#ga40e6c9aba06e66e5df1b4ca18329f9b4">opt.h</a>
+</li>
+<li>LWIP_HOOK_DHCP_PARSE_OPTION
+: <a class="el" href="group__lwip__opts__hooks.html#gafbbbc574863c0f88988936bd1434f2d2">opt.h</a>
+</li>
+<li>LWIP_HOOK_ETHARP_GET_GW
+: <a class="el" href="group__lwip__opts__hooks.html#ga2b76f127325fd5ca8b80077a4b6160b1">opt.h</a>
+</li>
+<li>LWIP_HOOK_FILENAME
+: <a class="el" href="group__lwip__opts__hooks.html#ga11ac9d637cb6afc0a32e8da7f51d0c0d">opt.h</a>
+</li>
+<li>LWIP_HOOK_IP4_CANFORWARD
+: <a class="el" href="group__lwip__opts__hooks.html#gaed848a98dbb5c8856a27e379986ea70d">opt.h</a>
+</li>
+<li>LWIP_HOOK_IP4_INPUT
+: <a class="el" href="group__lwip__opts__hooks.html#ga9124237c28e2f18f3b28d5be09e9ccb6">opt.h</a>
+</li>
+<li>LWIP_HOOK_IP4_ROUTE
+: <a class="el" href="group__lwip__opts__hooks.html#ga5d1061ad722a73012a28dbaf0f169b70">opt.h</a>
+</li>
+<li>LWIP_HOOK_IP4_ROUTE_SRC
+: <a class="el" href="group__lwip__opts__hooks.html#gaa410d9cbe1d4fa4c8a7f49af7b501024">opt.h</a>
+</li>
+<li>LWIP_HOOK_IP6_INPUT
+: <a class="el" href="group__lwip__opts__hooks.html#gaccbdd3d0250f7176dcd799ca06007f20">opt.h</a>
+</li>
+<li>LWIP_HOOK_IP6_ROUTE
+: <a class="el" href="group__lwip__opts__hooks.html#ga8245a4bc7ffb172e3bf32276f9d126ce">opt.h</a>
+</li>
+<li>LWIP_HOOK_MEMP_AVAILABLE
+: <a class="el" href="group__lwip__opts__hooks.html#ga13e90672158221b40f8b12bf9d8b721f">opt.h</a>
+</li>
+<li>LWIP_HOOK_ND6_GET_GW
+: <a class="el" href="group__lwip__opts__hooks.html#ga287544c3d74bc2a2d645bddbbc4fbdd0">opt.h</a>
+</li>
+<li>LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE
+: <a class="el" href="group__lwip__opts__hooks.html#gae35e4b7374868dc748b12dedb8f807e5">opt.h</a>
+</li>
+<li>LWIP_HOOK_SOCKETS_GETSOCKOPT
+: <a class="el" href="group__lwip__opts__hooks.html#gabdaeb09ac9f441934e21a087544a1af1">opt.h</a>
+</li>
+<li>LWIP_HOOK_SOCKETS_SETSOCKOPT
+: <a class="el" href="group__lwip__opts__hooks.html#ga14ea9210c09da4dd33bc85bd8a01b48a">opt.h</a>
+</li>
+<li>LWIP_HOOK_TCP_INPACKET_PCB
+: <a class="el" href="group__lwip__opts__hooks.html#gabed8b1cda4aba2d108fa62cdd74895a2">opt.h</a>
+</li>
+<li>LWIP_HOOK_TCP_ISN
+: <a class="el" href="group__lwip__opts__hooks.html#ga078d203053911cf3af178392700386a4">opt.h</a>
+</li>
+<li>LWIP_HOOK_TCP_OUT_ADD_TCPOPTS
+: <a class="el" href="group__lwip__opts__hooks.html#ga0ef31b749307b63c06633645d4de21f0">opt.h</a>
+</li>
+<li>LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH
+: <a class="el" href="group__lwip__opts__hooks.html#ga31c0694abe4eedf3ff039b7073c2293f">opt.h</a>
+</li>
+<li>LWIP_HOOK_UNKNOWN_ETH_PROTOCOL
+: <a class="el" href="group__lwip__opts__hooks.html#ga6cc92f5101dd7a0420e18e1f2101abf4">opt.h</a>
+</li>
+<li>LWIP_HOOK_VLAN_CHECK
+: <a class="el" href="group__lwip__opts__hooks.html#ga2f020543772368f8f4355f50f24c86a9">opt.h</a>
+</li>
+<li>LWIP_HOOK_VLAN_SET
+: <a class="el" href="group__lwip__opts__hooks.html#ga2b6e450b4934b95df9b9a9d2b9a4d57e">opt.h</a>
+</li>
+<li>LWIP_HTTPC_HAVE_FILE_IO
+: <a class="el" href="group__httpc.html#ga055b9a8bf8f4e2c18c621471773fa66c">http_client.h</a>
+</li>
+<li>LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR
+: <a class="el" href="group__httpd__opts.html#ga0ff20ebc4ab50d4aa6151c3241dacb3a">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_CGI
+: <a class="el" href="group__httpd__opts.html#gafb28f7c5fee75f013a199d427452372c">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_CGI_SSI
+: <a class="el" href="group__httpd__opts.html#gad3960bf65731bd0f1341867664afe860">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_CUSTOM_FILES
+: <a class="el" href="group__httpd__opts.html#gadadb70f5663cdf004bf879e3b5d326bd">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_DYNAMIC_FILE_READ
+: <a class="el" href="group__httpd__opts.html#ga1ee8d7c975c7e3d1c9d9dd9b43660c79">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_DYNAMIC_HEADERS
+: <a class="el" href="group__httpd__opts.html#ga75932fc5eeb9abeddfdaf8413574c6d7">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_FILE_STATE
+: <a class="el" href="group__httpd__opts.html#gaedd0fa3d356170d8ca3557acb410fd7c">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_FS_ASYNC_READ
+: <a class="el" href="group__httpd__opts.html#ga51cb673cb5cc362acc409f23c1e0a331">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED
+: <a class="el" href="group__httpd__opts.html#ga0d5074965efd40786182287895feb691">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_MAX_REQ_LENGTH
+: <a class="el" href="group__httpd__opts.html#ga30dc71c59f3904df7daaf293f74f91f8">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_MAX_REQUEST_URI_LEN
+: <a class="el" href="group__httpd__opts.html#gaca4ef53e7a9abbd8d4bd8bc1ba7b486a">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI
+: <a class="el" href="group__httpd__opts.html#ga82a030ce2ecdcf741b02b7be41c012b3">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN
+: <a class="el" href="group__httpd__opts.html#gaa27f7c5450392d10aeed033ca878cce3">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_REQ_BUFSIZE
+: <a class="el" href="group__httpd__opts.html#ga8dbe61a35228da0e7365a088197191b8">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_REQ_QUEUELEN
+: <a class="el" href="group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SSI
+: <a class="el" href="group__httpd__opts.html#gacb70e0cdd30a940f8bce681c6cc63949">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SSI_BY_FILE_EXTENSION
+: <a class="el" href="group__httpd__opts.html#gaba2d4cfe4c1f5bdbe37b339084a7d466">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SSI_INCLUDE_TAG
+: <a class="el" href="group__httpd__opts.html#ga975961a6d22d1a077118fb85dfec809a">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SSI_MULTIPART
+: <a class="el" href="group__httpd__opts.html#ga3167d52d20cf90857e2c809b92458bf0">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SSI_RAW
+: <a class="el" href="group__httpd__opts.html#ga520858778b84d4d2fa125294c0f119e5">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SUPPORT_11_KEEPALIVE
+: <a class="el" href="group__httpd__opts.html#ga6f78487bc829f7f98274f1264020045e">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SUPPORT_EXTSTATUS
+: <a class="el" href="group__httpd__opts.html#ga85ebddbc4236b1e31bfa68fa163f9b07">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SUPPORT_POST
+: <a class="el" href="group__httpd__opts.html#gacbea06ce33933e3ef2f2f1834a21cc2c">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SUPPORT_REQUESTLIST
+: <a class="el" href="group__httpd__opts.html#ga0bd0f9a89423fb3bbfea4e4c6141ae43">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SUPPORT_V09
+: <a class="el" href="group__httpd__opts.html#ga7a8f4ab787b6fb8482c8a36c9fd0c7dd">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_TIMING
+: <a class="el" href="group__httpd__opts.html#ga054db3f080715942967969c6ae30bb6a">httpd_opts.h</a>
+</li>
+<li>LWIP_ICMP
+: <a class="el" href="group__lwip__opts__icmp.html#gae4d45345c3ab8e5a355fda1d8d24fca6">opt.h</a>
+</li>
+<li>LWIP_ICMP6
+: <a class="el" href="group__lwip__opts__icmp6.html#ga65ac8bcbad242cba3a2b557e1574b21f">opt.h</a>
+</li>
+<li>LWIP_ICMP6_DATASIZE
+: <a class="el" href="group__lwip__opts__icmp6.html#gaa88c55e37e5d7b865b91a9399313bbbf">opt.h</a>
+</li>
+<li>LWIP_ICMP6_HL
+: <a class="el" href="group__lwip__opts__icmp6.html#ga82193577b4045e1ac1533c4341a2bd79">opt.h</a>
+</li>
+<li>LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
+: <a class="el" href="icmp_8c.html#a6b9fd6be0a7dcf301bc86b9e96e3857e">icmp.c</a>
+</li>
+<li>LWIP_IGMP
+: <a class="el" href="group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923">opt.h</a>
+</li>
+<li>LWIP_INLINE_IP_CHKSUM
+: <a class="el" href="ip4_8c.html#a9652ce304f893f6245c6ba9daea0a30f">ip4.c</a>
+</li>
+<li>LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX
+: <a class="el" href="ip_8h.html#a355679dba1c0d8ef07ce3abcd28e3063">ip.h</a>
+</li>
+<li>LWIP_IPV4
+: <a class="el" href="group__lwip__opts__ipv4.html#ga429e811a80ebb5157e14a854870c4410">opt.h</a>
+</li>
+<li>LWIP_IPV6
+: <a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">opt.h</a>
+</li>
+<li>LWIP_IPV6_ADDRESS_LIFETIMES
+: <a class="el" href="group__lwip__opts__ipv6.html#ga2c0127fca1073ad3f0a1e53f00ea8858">opt.h</a>
+</li>
+<li>LWIP_IPV6_AUTOCONFIG
+: <a class="el" href="group__lwip__opts__ipv6.html#ga580039bf2baf49fcb9e504e5d2b40a03">opt.h</a>
+</li>
+<li>LWIP_IPV6_DHCP6
+: <a class="el" href="group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6">opt.h</a>
+</li>
+<li>LWIP_IPV6_DHCP6_STATEFUL
+: <a class="el" href="group__lwip__opts__dhcpv6.html#ga3fc9dbe8feae61621cac4952ac28e155">opt.h</a>
+</li>
+<li>LWIP_IPV6_DHCP6_STATELESS
+: <a class="el" href="group__lwip__opts__dhcpv6.html#ga8d6bab14d580d2136430319aab6d7930">opt.h</a>
+</li>
+<li>LWIP_IPV6_DUP_DETECT_ATTEMPTS
+: <a class="el" href="group__lwip__opts__ipv6.html#gad8489522d34f37e42b4001bab3781bcb">opt.h</a>
+</li>
+<li>LWIP_IPV6_FORWARD
+: <a class="el" href="group__lwip__opts__ipv6.html#gac96c5802de6c75dd62ab38cff6d16a32">opt.h</a>
+</li>
+<li>LWIP_IPV6_FRAG
+: <a class="el" href="group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3">opt.h</a>
+</li>
+<li>LWIP_IPV6_MLD
+: <a class="el" href="group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528">opt.h</a>
+</li>
+<li>LWIP_IPV6_NUM_ADDRESSES
+: <a class="el" href="group__lwip__opts__ipv6.html#ga16c1b672604bfb0a66a6aeeb854589d3">opt.h</a>
+</li>
+<li>LWIP_IPV6_REASS
+: <a class="el" href="group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864">opt.h</a>
+</li>
+<li>LWIP_IPV6_SCOPES
+: <a class="el" href="group__lwip__opts__ipv6.html#ga91d1e630059df3b3a296e2b6ff7aead5">opt.h</a>
+</li>
+<li>LWIP_IPV6_SCOPES_DEBUG
+: <a class="el" href="group__lwip__opts__ipv6.html#ga623ef29d27d98fb7be8732730a5ddf4b">opt.h</a>
+</li>
+<li>LWIP_IPV6_SEND_ROUTER_SOLICIT
+: <a class="el" href="group__lwip__opts__ipv6.html#ga273ed2e1a4e6a43713a0e4a06a34ee5c">opt.h</a>
+</li>
+<li>LWIP_LOOPBACK_MAX_PBUFS
+: <a class="el" href="group__lwip__opts__loop.html#gaacc3ad5d0a771d45fb0a3e3a09b1dbea">opt.h</a>
+</li>
+<li>LWIP_LOOPIF_MULTICAST
+: <a class="el" href="group__lwip__opts__loop.html#ga10a878b390c2fbe421d82502001c7300">opt.h</a>
+</li>
+<li>LWIP_LOWPAN6_802154_DEBUG
+: <a class="el" href="lowpan6__opts_8h.html#acf9a44be56d5dca9e45f644571d66f58">lowpan6_opts.h</a>
+</li>
+<li>LWIP_LOWPAN6_DEBUG
+: <a class="el" href="lowpan6__opts_8h.html#ae90ebb32999c6df5cc83705e133e1754">lowpan6_opts.h</a>
+</li>
+<li>LWIP_LOWPAN6_DECOMPRESSION_DEBUG
+: <a class="el" href="lowpan6__opts_8h.html#a7f4db0bd3dbe36a19efbd24cd8b7fcf0">lowpan6_opts.h</a>
+</li>
+<li>LWIP_LOWPAN6_IP_COMPRESSED_DEBUG
+: <a class="el" href="lowpan6__opts_8h.html#a231bc758484376dfd2ded6931c462df8">lowpan6_opts.h</a>
+</li>
+<li>LWIP_MAKEU32
+: <a class="el" href="def_8h.html#acf56d3da92a0a7a8a62a617e793e948c">def.h</a>
+</li>
+<li>LWIP_MARK_TCPIP_THREAD
+: <a class="el" href="group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e">opt.h</a>
+</li>
+<li>LWIP_MEM_ALIGN
+: <a class="el" href="group__compiler__abstraction.html#gaa8e8724eb1c220cbbb90de9e175ce1dc">arch.h</a>
+</li>
+<li>LWIP_MEM_ALIGN_BUFFER
+: <a class="el" href="group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e">arch.h</a>
+</li>
+<li>LWIP_MEM_ALIGN_SIZE
+: <a class="el" href="group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18">arch.h</a>
+</li>
+<li>LWIP_MEMPOOL_ALLOC
+: <a class="el" href="group__mempool.html#ga5e2498f6c17746c1fe7153de5f7f275a">memp.h</a>
+</li>
+<li>LWIP_MEMPOOL_DECLARE
+: <a class="el" href="group__mempool.html#ga5b1fb3ce7942432d87cc948b1c5ed6cb">memp.h</a>
+</li>
+<li>LWIP_MEMPOOL_FREE
+: <a class="el" href="group__mempool.html#gaa43d114dd702fbd8f1db18474ea93a04">memp.h</a>
+</li>
+<li>LWIP_MEMPOOL_INIT
+: <a class="el" href="group__mempool.html#ga60b51c06d276f525b35d8b7abd4dcb41">memp.h</a>
+</li>
+<li>LWIP_MEMPOOL_PROTOTYPE
+: <a class="el" href="group__mempool.html#ga92fc8c29d0e2654f2a2ecc43b2b7fb13">memp.h</a>
+</li>
+<li>LWIP_MIB2_CALLBACKS
+: <a class="el" href="group__lwip__opts__mib2.html#gad84d6a781880cec19a1ef4b2339fea29">opt.h</a>
+</li>
+<li>LWIP_MPU_COMPATIBLE
+: <a class="el" href="group__lwip__opts__lock.html#gae9afcefa5d233372abb9413188dd98c9">opt.h</a>
+</li>
+<li>LWIP_MULTICAST_PING
+: <a class="el" href="group__lwip__opts__icmp.html#gaf77baf0a83b04312eab4c006ef229661">opt.h</a>
+</li>
+<li>LWIP_MULTICAST_TX_OPTIONS
+: <a class="el" href="group__lwip__opts__multicast.html#gab8d7d53247cc62caa76f54b2c5a5df30">opt.h</a>
+</li>
+<li>LWIP_ND6_ALLOW_RA_UPDATES
+: <a class="el" href="group__lwip__opts__nd6.html#gad35d10353ac7c7d2c8d4b83788cdc6d9">opt.h</a>
+</li>
+<li>LWIP_ND6_DELAY_FIRST_PROBE_TIME
+: <a class="el" href="group__lwip__opts__nd6.html#ga315bd6d4a9d185766dfc3253cd9d7715">opt.h</a>
+</li>
+<li>LWIP_ND6_MAX_ANYCAST_DELAY_TIME
+: <a class="el" href="group__lwip__opts__nd6.html#ga960b8973df083fad53ae0eaa79f8c4df">opt.h</a>
+</li>
+<li>LWIP_ND6_MAX_MULTICAST_SOLICIT
+: <a class="el" href="group__lwip__opts__nd6.html#ga980909018aed54adc10dd68be3572b30">opt.h</a>
+</li>
+<li>LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT
+: <a class="el" href="group__lwip__opts__nd6.html#ga86ab0cac87cdc7aeff09384ddbaaba2a">opt.h</a>
+</li>
+<li>LWIP_ND6_MAX_UNICAST_SOLICIT
+: <a class="el" href="group__lwip__opts__nd6.html#gafa6f4c2d2c259ab0895fa03a6f08c691">opt.h</a>
+</li>
+<li>LWIP_ND6_NUM_DESTINATIONS
+: <a class="el" href="group__lwip__opts__nd6.html#gacad118b1ae886e80137a1d4f0fb19672">opt.h</a>
+</li>
+<li>LWIP_ND6_NUM_NEIGHBORS
+: <a class="el" href="group__lwip__opts__nd6.html#gab2fe15bdb4e0a41f295eb5577b11ad16">opt.h</a>
+</li>
+<li>LWIP_ND6_NUM_PREFIXES
+: <a class="el" href="group__lwip__opts__nd6.html#gad9cc576b5951f1b5e1c2b0d0bb831d9a">opt.h</a>
+</li>
+<li>LWIP_ND6_NUM_ROUTERS
+: <a class="el" href="group__lwip__opts__nd6.html#ga75e81a96148f266c8fad8c0bcab2f36a">opt.h</a>
+</li>
+<li>LWIP_ND6_QUEUEING
+: <a class="el" href="group__lwip__opts__nd6.html#ga0757a3c1b5d1563ad2d77228e1d8a60f">opt.h</a>
+</li>
+<li>LWIP_ND6_RDNSS_MAX_DNS_SERVERS
+: <a class="el" href="group__lwip__opts__nd6.html#gaea4d829c0b52cc6cc28925eee89a7429">opt.h</a>
+</li>
+<li>LWIP_ND6_REACHABLE_TIME
+: <a class="el" href="group__lwip__opts__nd6.html#ga269db9d61cdfc2fd3bc7b12c56261c74">opt.h</a>
+</li>
+<li>LWIP_ND6_RETRANS_TIMER
+: <a class="el" href="group__lwip__opts__nd6.html#ga461abcbeef1d236d1f3201827dd28ad9">opt.h</a>
+</li>
+<li>LWIP_ND6_TCP_REACHABILITY_HINTS
+: <a class="el" href="group__lwip__opts__nd6.html#ga9d7cb6fd447ef0f6726f565e2c7509c4">opt.h</a>
+</li>
+<li>LWIP_NETBIOS_RESPOND_NAME_QUERY
+: <a class="el" href="group__netbiosns__opts.html#gaa9dec8fc3dee5e72fbe9b854437bce84">netbiosns_opts.h</a>
+</li>
+<li>LWIP_NETBUF_RECVINFO
+: <a class="el" href="group__lwip__opts__udp.html#ga72021505969c5ce29e972486d7794baa">opt.h</a>
+</li>
+<li>LWIP_NETCONN
+: <a class="el" href="group__lwip__opts__netconn.html#ga478041b8544461258f6961bf0f3c1a77">opt.h</a>
+</li>
+<li>LWIP_NETCONN_FULLDUPLEX
+: <a class="el" href="group__lwip__opts__netconn.html#ga7bfe8487a3abffdd9d6730977d22c406">opt.h</a>
+</li>
+<li>LWIP_NETCONN_SEM_PER_THREAD
+: <a class="el" href="group__lwip__opts__netconn.html#ga2543345adf7d2c307df78a54ac2ba8c4">opt.h</a>
+</li>
+<li>LWIP_NETIF_API
+: <a class="el" href="group__lwip__opts__netif.html#gadd45fb65f2d0e6de5a0d14ff9e101b77">opt.h</a>
+</li>
+<li>LWIP_NETIF_EXT_STATUS_CALLBACK
+: <a class="el" href="group__lwip__opts__netif.html#ga090482867ba04d442ab5b8ad745c0e1e">opt.h</a>
+</li>
+<li>LWIP_NETIF_HOSTNAME
+: <a class="el" href="group__lwip__opts__netif.html#gaa714dbfa66822ec4c6111bdb8cf753c1">opt.h</a>
+</li>
+<li>LWIP_NETIF_HWADDRHINT
+: <a class="el" href="group__lwip__opts__netif.html#gad1d5e878d94b56ba687cef69be936ad9">opt.h</a>
+</li>
+<li>LWIP_NETIF_LINK_CALLBACK
+: <a class="el" href="group__lwip__opts__netif.html#ga1a446932dd927cc4136ba654c13bb97b">opt.h</a>
+</li>
+<li>LWIP_NETIF_LOOPBACK
+: <a class="el" href="group__lwip__opts__loop.html#ga724a0ea765d5a47d026d529725f31c01">opt.h</a>
+</li>
+<li>LWIP_NETIF_LOOPBACK_MULTITHREADING
+: <a class="el" href="group__lwip__opts__loop.html#gaa28d13ddd5281b1912276991e7ea58c5">opt.h</a>
+</li>
+<li>LWIP_NETIF_REMOVE_CALLBACK
+: <a class="el" href="group__lwip__opts__netif.html#ga9c942c2e9655b06d4f73c630d30f60bf">opt.h</a>
+</li>
+<li>LWIP_NETIF_STATUS_CALLBACK
+: <a class="el" href="group__lwip__opts__netif.html#gaffb97d89516c38d3fcb9e44e5d707f36">opt.h</a>
+</li>
+<li>LWIP_NETIF_TX_SINGLE_PBUF
+: <a class="el" href="group__lwip__opts__netif.html#gabafb9f64a80e51b56c0abbcfc1f7e04e">opt.h</a>
+</li>
+<li>LWIP_NO_CTYPE_H
+: <a class="el" href="group__compiler__abstraction.html#ga6871ce1e92ae09cdad39a9b230a3a800">arch.h</a>
+</li>
+<li>LWIP_NO_INTTYPES_H
+: <a class="el" href="group__compiler__abstraction.html#ga5bf52d6f2729d0c8afd365f69d7d4373">arch.h</a>
+</li>
+<li>LWIP_NO_LIMITS_H
+: <a class="el" href="group__compiler__abstraction.html#gade9c8513419a799cd78a07ae894bb805">arch.h</a>
+</li>
+<li>LWIP_NO_STDDEF_H
+: <a class="el" href="group__compiler__abstraction.html#ga53954d507c09e521ec0d44a2450bb89d">arch.h</a>
+</li>
+<li>LWIP_NO_STDINT_H
+: <a class="el" href="group__compiler__abstraction.html#ga122c754db96ecad23bc6f4541d6360c1">arch.h</a>
+</li>
+<li>LWIP_NOASSERT
+: <a class="el" href="group__lwip__assertions.html#ga71b7787802abbfc2218fb1f39f948a41">debug.h</a>
+</li>
+<li>LWIP_NSC_IPV4_ADDRESS_CHANGED
+: <a class="el" href="netif_8h.html#aeb4e790199b02469aa04c044ef5cfa32">netif.h</a>
+</li>
+<li>LWIP_NSC_IPV4_GATEWAY_CHANGED
+: <a class="el" href="netif_8h.html#a22400d2202581b4a7273cded712adf49">netif.h</a>
+</li>
+<li>LWIP_NSC_IPV4_NETMASK_CHANGED
+: <a class="el" href="netif_8h.html#ad747072771a887443ab33f90a12077d4">netif.h</a>
+</li>
+<li>LWIP_NSC_IPV4_SETTINGS_CHANGED
+: <a class="el" href="netif_8h.html#a4ff19a6f3045f65d0397d30b6609660a">netif.h</a>
+</li>
+<li>LWIP_NSC_IPV6_ADDR_STATE_CHANGED
+: <a class="el" href="netif_8h.html#a0d70fe11cac43c8fa35827b8e607ccf6">netif.h</a>
+</li>
+<li>LWIP_NSC_IPV6_SET
+: <a class="el" href="netif_8h.html#a8fb4317a77ee2e3848be80db15618666">netif.h</a>
+</li>
+<li>LWIP_NSC_LINK_CHANGED
+: <a class="el" href="netif_8h.html#a5ad7308195c0581680dd62fb148501cd">netif.h</a>
+</li>
+<li>LWIP_NSC_NETIF_ADDED
+: <a class="el" href="netif_8h.html#adbfecb47897cfe63d4f6366c1fed23b2">netif.h</a>
+</li>
+<li>LWIP_NSC_NETIF_REMOVED
+: <a class="el" href="netif_8h.html#ae8e2dc87c19a03d481ae37bcf7ced5c9">netif.h</a>
+</li>
+<li>LWIP_NSC_STATUS_CHANGED
+: <a class="el" href="netif_8h.html#a6f406ee3ab60e8a4f27ae2483c96b8e2">netif.h</a>
+</li>
+<li>LWIP_NUM_NETIF_CLIENT_DATA
+: <a class="el" href="group__lwip__opts__netif.html#ga94a35212616f9a9aae5c98741612b936">opt.h</a>
+</li>
+<li>LWIP_NUM_SYS_TIMEOUT_INTERNAL
+: <a class="el" href="group__lwip__opts__memp.html#ga87a05debb46ff82093d0e6dc1aad8804">opt.h</a>
+</li>
+<li>LWIP_PACKED_CAST
+: <a class="el" href="group__compiler__abstraction.html#ga4488578f18ad1a76e4fa8bc288c51446">arch.h</a>
+</li>
+<li>LWIP_PBUF_REF_T
+: <a class="el" href="group__lwip__opts__pbuf.html#gaaefb80d6bf9257c0f4322c36e1272c38">opt.h</a>
+</li>
+<li>LWIP_PERF
+: <a class="el" href="group__lwip__opts__perf.html#ga44acd95b33e2d58a74455279721298de">opt.h</a>
+</li>
+<li>LWIP_PLATFORM_ASSERT
+: <a class="el" href="group__compiler__abstraction.html#ga7e8bcd0282525704d6dd596bdd1b47d0">arch.h</a>
+</li>
+<li>LWIP_PLATFORM_DIAG
+: <a class="el" href="group__compiler__abstraction.html#gaccef167be13a500ce30036030a9b142b">arch.h</a>
+</li>
+<li>LWIP_POSIX_SOCKETS_IO_NAMES
+: <a class="el" href="group__lwip__opts__socket.html#ga484c38ab08f60d5b3335d23d31f9a402">opt.h</a>
+</li>
+<li>LWIP_PROVIDE_ERRNO
+: <a class="el" href="group__compiler__abstraction.html#ga8e2cba4c97dd38f4d517ed21cf109ade">arch.h</a>
+</li>
+<li>LWIP_PTR_NUMERIC_CAST
+: <a class="el" href="group__compiler__abstraction.html#ga683e5c35d3263fe3145e6a6bc546604a">arch.h</a>
+</li>
+<li>LWIP_RAND
+: <a class="el" href="group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a">arch.h</a>
+</li>
+<li>LWIP_RAW
+: <a class="el" href="group__lwip__opts__raw.html#gaca452be5cb05d9666f8f57e582c39221">opt.h</a>
+</li>
+<li>LWIP_RC_DEVELOPMENT
+: <a class="el" href="group__lwip__version.html#ga9ca69b1a453eb72efd0bbda333f2a33b">init.h</a>
+</li>
+<li>LWIP_RC_RELEASE
+: <a class="el" href="group__lwip__version.html#ga375ee868e76ed7c458cdf249387bd469">init.h</a>
+</li>
+<li>LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG
+: <a class="el" href="lowpan6__opts_8h.html#a5b7a3e204d2edde5552ca3c8694419c1">lowpan6_opts.h</a>
+</li>
+<li>LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS
+: <a class="el" href="lowpan6__opts_8h.html#af4a4d962af3439b111a8e72e5eeaccf8">lowpan6_opts.h</a>
+</li>
+<li>LWIP_SINGLE_NETIF
+: <a class="el" href="group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be">opt.h</a>
+</li>
+<li>LWIP_SNMP
+: <a class="el" href="group__snmp__opts.html#gaf4900859dc53f19f5f67cc34e48ad68c">snmp_opts.h</a>
+</li>
+<li>LWIP_SNMP_V3
+: <a class="el" href="snmp__opts_8h.html#a1fe0e120f979ed400f649019edcefe2b">snmp_opts.h</a>
+</li>
+<li>LWIP_SO_LINGER
+: <a class="el" href="group__lwip__opts__socket.html#gaa91292d5d014dc1c6f1c1f4166269a1d">opt.h</a>
+</li>
+<li>LWIP_SO_RCVBUF
+: <a class="el" href="group__lwip__opts__socket.html#ga06390cebcf4d13d3d47a11365e5fcd28">opt.h</a>
+</li>
+<li>LWIP_SO_RCVTIMEO
+: <a class="el" href="group__lwip__opts__socket.html#ga91af3ade95b20b9a60c65ed0380fa0ed">opt.h</a>
+</li>
+<li>LWIP_SO_SNDRCVTIMEO_NONSTANDARD
+: <a class="el" href="group__lwip__opts__socket.html#ga5b115bacb569763d8a3889a12229e942">opt.h</a>
+</li>
+<li>LWIP_SO_SNDTIMEO
+: <a class="el" href="group__lwip__opts__socket.html#ga1162cb685f202d9b21c11344b8209a58">opt.h</a>
+</li>
+<li>LWIP_SOCKET
+: <a class="el" href="group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f">opt.h</a>
+</li>
+<li>LWIP_SOCKET_OFFSET
+: <a class="el" href="group__lwip__opts__socket.html#gad0197c845fbb44c920b272f0fef3b57e">opt.h</a>
+</li>
+<li>LWIP_SOCKET_POLL
+: <a class="el" href="group__lwip__opts__socket.html#ga6c14d705e3321429683f24de9f5a7200">opt.h</a>
+</li>
+<li>LWIP_SOCKET_SELECT
+: <a class="el" href="group__lwip__opts__socket.html#ga68417078b71b0be9735256f52933dcdb">opt.h</a>
+</li>
+<li>LWIP_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga542b58734cc01902c5e099f6efdc5f1b">opt.h</a>
+</li>
+<li>LWIP_STATS_DISPLAY
+: <a class="el" href="group__lwip__opts__stats.html#gacdc38ed58d1900b5d3d109a65be1c3d1">opt.h</a>
+</li>
+<li>LWIP_SUPPORT_CUSTOM_PBUF
+: <a class="el" href="pbuf_8h.html#a64174c5169b48dc17674324afd9c63b9">pbuf.h</a>
+</li>
+<li>LWIP_TCP
+: <a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">opt.h</a>
+</li>
+<li>LWIP_TCP_CALC_INITIAL_CWND
+: <a class="el" href="tcp__in_8c.html#aea174f2c6ca4cb0ad270dd8d0faf0c84">tcp_in.c</a>
+</li>
+<li>LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT
+: <a class="el" href="group__lwip__opts__socket.html#ga3e7498d5d2921f0df3792de72f384d36">opt.h</a>
+</li>
+<li>LWIP_TCP_KEEPALIVE
+: <a class="el" href="group__lwip__opts__socket.html#ga8b9369ab260f032686a81c77c5b4db77">opt.h</a>
+</li>
+<li>LWIP_TCP_MAX_SACK_NUM
+: <a class="el" href="group__lwip__opts__tcp.html#gaaac0e9f559a8e3c251f3504cebcf44dc">opt.h</a>
+</li>
+<li>LWIP_TCP_PCB_NUM_EXT_ARGS
+: <a class="el" href="group__lwip__opts__tcp.html#ga40b1cdad52eaa91a3f5c242fc92ee223">opt.h</a>
+</li>
+<li>LWIP_TCP_SACK_OUT
+: <a class="el" href="group__lwip__opts__tcp.html#gaf1b6a015d29fea67b906c276e1e8314f">opt.h</a>
+</li>
+<li>LWIP_TCP_TIMESTAMPS
+: <a class="el" href="group__lwip__opts__tcp.html#ga249bc450bb818cf2ef3cf1472ff354fd">opt.h</a>
+</li>
+<li>LWIP_TCPIP_CORE_LOCKING
+: <a class="el" href="group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011">opt.h</a>
+</li>
+<li>LWIP_TCPIP_CORE_LOCKING_INPUT
+: <a class="el" href="group__lwip__opts__lock.html#ga351beb1c06affe49e717bc9f76c66acf">opt.h</a>
+</li>
+<li>LWIP_TCPIP_THREAD_ALIVE
+: <a class="el" href="group__lwip__opts__thread.html#ga8b99d75d9e0a0868567d10c8522915bb">opt.h</a>
+</li>
+<li>LWIP_TCPIP_TIMEOUT
+: <a class="el" href="group__lwip__opts__netconn.html#ga1cd8d15a42262a0defaedabed126ea99">opt.h</a>
+</li>
+<li>LWIP_TIMERS
+: <a class="el" href="group__lwip__opts__timers.html#ga25a41610055f91cbd0960256240b8f2c">opt.h</a>
+</li>
+<li>LWIP_TIMERS_CUSTOM
+: <a class="el" href="group__lwip__opts__timers.html#gaff0ea56f3e3d8e86c49b50557bc13815">opt.h</a>
+</li>
+<li>LWIP_TIMEVAL_PRIVATE
+: <a class="el" href="sockets_8h.html#aaffd64f6887883ec6401e6bb684c40fa">sockets.h</a>
+</li>
+<li>LWIP_UDP
+: <a class="el" href="group__lwip__opts__udp.html#gab6030e96e72df649d2650fd32d7a67b3">opt.h</a>
+</li>
+<li>LWIP_UDPLITE
+: <a class="el" href="group__lwip__opts__udp.html#ga35731bc5f337943e474a15c1cd538a61">opt.h</a>
+</li>
+<li>LWIP_UNUSED_ARG
+: <a class="el" href="group__compiler__abstraction.html#ga70624a5deb8b9199406372a7f3603ecf">arch.h</a>
+</li>
+<li>LWIP_VERSION
+: <a class="el" href="group__lwip__version.html#ga0a0d322fad0a67aa5b8f1b8c9dfcfe59">init.h</a>
+</li>
+<li>LWIP_VERSION_MAJOR
+: <a class="el" href="group__lwip__version.html#ga4308c06ef36496e00c798d96d7d03246">init.h</a>
+</li>
+<li>LWIP_VERSION_MINOR
+: <a class="el" href="group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034">init.h</a>
+</li>
+<li>LWIP_VERSION_RC
+: <a class="el" href="group__lwip__version.html#gac1dc92d8f453a98560de7e2e00a221a1">init.h</a>
+</li>
+<li>LWIP_VERSION_REVISION
+: <a class="el" href="group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50">init.h</a>
+</li>
+<li>LWIP_VERSION_STRING
+: <a class="el" href="group__lwip__version.html#gab47e87bc38eef94486db402813183ba7">init.h</a>
+</li>
+<li>LWIP_WND_SCALE
+: <a class="el" href="group__lwip__opts__tcp.html#ga88dbbfeeeb41b129fdc8235fc08bb530">opt.h</a>
+</li>
+<li>LWIPERF_CHECK_RX_DATA
+: <a class="el" href="lwiperf_8c.html#af51dcfc53fe575411c26e18963f1b902">lwiperf.c</a>
+</li>
+<li>LWIPERF_SERVER_IP_TYPE
+: <a class="el" href="lwiperf_8c.html#a1351e47d0bdb7d0fe0efaf9f1b2b0f7a">lwiperf.c</a>
+</li>
+<li>LWIPERF_TCP_MAX_IDLE_SEC
+: <a class="el" href="lwiperf_8c.html#a646d7e0b37c5cefdd6eef38a3fba4673">lwiperf.c</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs_m.html b/doc/doxygen/output/html/globals_defs_m.html
new file mode 100644
index 0000000..6a60519
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_m.html
@@ -0,0 +1,306 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_m.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_m"></a>- m -</h3><ul>
+<li>MDNS_DEBUG
+: <a class="el" href="group__mdns__opts.html#ga53a97502efdcf1214cab4078f93a6dc9">mdns_opts.h</a>
+</li>
+<li>MDNS_MAX_SERVICES
+: <a class="el" href="group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6">mdns_opts.h</a>
+</li>
+<li>mdns_resp_netif_settings_changed
+: <a class="el" href="group__mdns.html#gab2edba12d5cad1949f7ca040ae12beec">mdns.h</a>
+</li>
+<li>MDNS_RESP_USENETIF_EXTCALLBACK
+: <a class="el" href="group__mdns__opts.html#ga172e579cd09a1db51cf224319c012396">mdns_opts.h</a>
+</li>
+<li>MEM_ALIGNMENT
+: <a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">opt.h</a>
+</li>
+<li>MEM_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga2d7bc380695eeedb1af50c3808613afe">opt.h</a>
+</li>
+<li>MEM_LIBC_MALLOC
+: <a class="el" href="group__lwip__opts__mem.html#ga4ef345cc270912bd2230b1c5ec51dfc8">opt.h</a>
+</li>
+<li>MEM_OVERFLOW_CHECK
+: <a class="el" href="group__lwip__opts__mem.html#gae331a198bd06100b90ea020cd5f07f4e">opt.h</a>
+</li>
+<li>MEM_SANITY_CHECK
+: <a class="el" href="group__lwip__opts__mem.html#ga90b17afabb93986a162c327ed30bb4d3">opt.h</a>
+</li>
+<li>MEM_SIZE
+: <a class="el" href="group__lwip__opts__mem.html#ga2dcf8c45f945dd0c4301a94700f2112c">opt.h</a>
+</li>
+<li>MEM_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga61ec04a08c4fde690d10819e582656a7">opt.h</a>
+</li>
+<li>MEM_USE_POOLS
+: <a class="el" href="group__lwip__opts__mem.html#gaddca3141bc7037241769eb152b6f89ba">opt.h</a>
+</li>
+<li>MEM_USE_POOLS_TRY_BIGGER_POOL
+: <a class="el" href="group__lwip__opts__mem.html#gaba8be68e8fd0716b723ce4569ed89f82">opt.h</a>
+</li>
+<li>MEMCPY
+: <a class="el" href="group__lwip__opts__memcpy.html#gaa1dd57a66b6de8c0593e9e3e8d1411f6">opt.h</a>
+</li>
+<li>MEMMOVE
+: <a class="el" href="group__lwip__opts__memcpy.html#ga0e00bb235da5557fcbc049f732503863">opt.h</a>
+</li>
+<li>MEMP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gad80231923f7a808d49eba5ec57d63616">opt.h</a>
+</li>
+<li>MEMP_MEM_INIT
+: <a class="el" href="group__lwip__opts__mem.html#gaa2f25586972d1cbc1ff0dcdc6f15a1b0">opt.h</a>
+</li>
+<li>MEMP_MEM_MALLOC
+: <a class="el" href="group__lwip__opts__mem.html#gae93af697d27bbcefa6a28052d90f2f38">opt.h</a>
+</li>
+<li>MEMP_NUM_ALTCP_PCB
+: <a class="el" href="group__lwip__opts__memp.html#ga24f6737ee990990b81b0d16ef6e0dffd">opt.h</a>
+</li>
+<li>MEMP_NUM_API_MSG
+: <a class="el" href="group__lwip__opts__memp.html#ga5a95abf3610c56e7c23cb035eb9c3444">opt.h</a>
+</li>
+<li>MEMP_NUM_ARP_QUEUE
+: <a class="el" href="group__lwip__opts__memp.html#ga087b00ea20a7edebcad33a1a1353a5d7">opt.h</a>
+</li>
+<li>MEMP_NUM_DNS_API_MSG
+: <a class="el" href="group__lwip__opts__memp.html#ga3b1f228c598529c62895ad04ff294980">opt.h</a>
+</li>
+<li>MEMP_NUM_FRAG_PBUF
+: <a class="el" href="group__lwip__opts__memp.html#ga1f66051a654dcd7a4e19bc6aff240630">opt.h</a>
+</li>
+<li>MEMP_NUM_IGMP_GROUP
+: <a class="el" href="group__lwip__opts__memp.html#gab648ff95d8ffa4216b95f82a568a5d9a">opt.h</a>
+</li>
+<li>MEMP_NUM_LOCALHOSTLIST
+: <a class="el" href="group__lwip__opts__memp.html#gaa9b0f949da12cbe8fe5f7aefc30290e0">opt.h</a>
+</li>
+<li>MEMP_NUM_MLD6_GROUP
+: <a class="el" href="group__lwip__opts__mld6.html#ga89e92d8de8898696e797f13fdd169494">opt.h</a>
+</li>
+<li>MEMP_NUM_ND6_QUEUE
+: <a class="el" href="group__lwip__opts__nd6.html#gabfaf3d92d51e2a9d70c8360af2611fb2">opt.h</a>
+</li>
+<li>MEMP_NUM_NETBUF
+: <a class="el" href="group__lwip__opts__memp.html#ga5d99df65869ac101ed6a611fc85016be">opt.h</a>
+</li>
+<li>MEMP_NUM_NETCONN
+: <a class="el" href="group__lwip__opts__memp.html#gacb40bd726b7e15593b20a628d298f456">opt.h</a>
+</li>
+<li>MEMP_NUM_NETDB
+: <a class="el" href="group__lwip__opts__memp.html#ga293bc22b60bf3f8e2520f60a88370e7a">opt.h</a>
+</li>
+<li>MEMP_NUM_NETIFAPI_MSG
+: <a class="el" href="group__lwip__opts__memp.html#gadd5a973b98068ce9318ea2f96b5fa14c">opt.h</a>
+</li>
+<li>MEMP_NUM_PBUF
+: <a class="el" href="group__lwip__opts__memp.html#ga92b30aed958ec59334d936d4ca725418">opt.h</a>
+</li>
+<li>MEMP_NUM_RAW_PCB
+: <a class="el" href="group__lwip__opts__memp.html#ga379bf92ed322cda54cb701337421e0d3">opt.h</a>
+</li>
+<li>MEMP_NUM_REASSDATA
+: <a class="el" href="group__lwip__opts__memp.html#ga169436c5860253b90e25bdba9fdcac86">opt.h</a>
+</li>
+<li>MEMP_NUM_SELECT_CB
+: <a class="el" href="group__lwip__opts__memp.html#ga8e136f5811e6652c6c5d2fcf596f0893">opt.h</a>
+</li>
+<li>MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA
+: <a class="el" href="group__lwip__opts__memp.html#gacf9782dd26bf8a655044dc041a9de948">opt.h</a>
+</li>
+<li>MEMP_NUM_SYS_TIMEOUT
+: <a class="el" href="group__lwip__opts__memp.html#ga4afbdca581a58d57bc7a81118a95327e">opt.h</a>
+</li>
+<li>MEMP_NUM_TCP_PCB
+: <a class="el" href="group__lwip__opts__memp.html#ga73beecc19cfbc3114768f9b32b2cd70e">opt.h</a>
+</li>
+<li>MEMP_NUM_TCP_PCB_LISTEN
+: <a class="el" href="group__lwip__opts__memp.html#ga04fba6a249123513271dccb4ec26aa5a">opt.h</a>
+</li>
+<li>MEMP_NUM_TCP_SEG
+: <a class="el" href="group__lwip__opts__memp.html#gaa35fb3a1a76661e3ffb9722a57092de3">opt.h</a>
+</li>
+<li>MEMP_NUM_TCPIP_MSG_API
+: <a class="el" href="group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c">opt.h</a>
+</li>
+<li>MEMP_NUM_TCPIP_MSG_INPKT
+: <a class="el" href="group__lwip__opts__memp.html#gab089a7088439e726c3801ba9e249d831">opt.h</a>
+</li>
+<li>MEMP_NUM_UDP_PCB
+: <a class="el" href="group__lwip__opts__memp.html#ga2c416da481ab09bd1ba257b75a0707eb">opt.h</a>
+</li>
+<li>MEMP_OVERFLOW_CHECK
+: <a class="el" href="group__lwip__opts__mem.html#ga27fdd01194a42fc41a7716b72cdb49e3">opt.h</a>
+</li>
+<li>MEMP_SANITY_CHECK
+: <a class="el" href="group__lwip__opts__mem.html#ga0838947193e222a9f46b582e01e5beff">opt.h</a>
+</li>
+<li>MEMP_STATS
+: <a class="el" href="group__lwip__opts__stats.html#gab8c2430be0e567a7499a95454aaa6041">opt.h</a>
+</li>
+<li>MEMP_USE_CUSTOM_POOLS
+: <a class="el" href="group__lwip__opts__mem.html#ga69de593b8ffd4f1c249f03e48e11983b">opt.h</a>
+</li>
+<li>MIB2_COPY_SYSUPTIME_TO
+: <a class="el" href="snmp_8h.html#abe6b270482ca9af07c029f3136d8ec9c">snmp.h</a>
+</li>
+<li>MIB2_INIT_NETIF
+: <a class="el" href="group__netif__mib2.html#ga5be1b8cba1d67bf6e7f8851ec91b10f0">snmp.h</a>
+</li>
+<li>MIB2_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga5b01047eeb149a0b0ffe33d760d8370f">opt.h</a>
+</li>
+<li>MIB2_STATS_NETIF_ADD
+: <a class="el" href="group__netif__mib2.html#ga05641438775014b7e13b9e55eba48bed">snmp.h</a>
+</li>
+<li>MIB2_STATS_NETIF_INC
+: <a class="el" href="group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f">snmp.h</a>
+</li>
+<li>MIN_REQ_LEN
+: <a class="el" href="httpd_8c.html#aa8e2f3e13ac1fcacd85c558d6e40e40a">httpd.c</a>
+</li>
+<li>MIN_SIZE
+: <a class="el" href="mem_8c.html#a278694c2333c9826f21ddd2c2d220f66">mem.c</a>
+</li>
+<li>MLD6_STATS
+: <a class="el" href="group__lwip__opts__stats.html#gaf263df10b63b38201cae3d2dd5fb0b9e">opt.h</a>
+</li>
+<li>MQTT_CONNECT_TIMOUT
+: <a class="el" href="group__mqtt__opts.html#gac5d0580d1caf57dac1cb56662e5d9f7b">mqtt_opts.h</a>
+</li>
+<li>MQTT_CTL_PACKET_TYPE
+: <a class="el" href="mqtt_8c.html#a45c57ebd31832f1c128d847067c4688b">mqtt.c</a>
+</li>
+<li>MQTT_CYCLIC_TIMER_INTERVAL
+: <a class="el" href="group__mqtt__opts.html#ga1d89fda808c7047eab7a67d3785aea8e">mqtt_opts.h</a>
+</li>
+<li>MQTT_DEBUG
+: <a class="el" href="mqtt_8c.html#a99c325e06cc17ee24e09dab251606f9d">mqtt.c</a>
+</li>
+<li>MQTT_OUTPUT_RINGBUF_SIZE
+: <a class="el" href="group__mqtt__opts.html#ga70627bafaffa071875cee9edc38d942b">mqtt_opts.h</a>
+</li>
+<li>MQTT_PORT
+: <a class="el" href="group__mqtt.html#gaa8632baff6bbb5004385998918f1e6bd">mqtt.h</a>
+</li>
+<li>MQTT_REQ_MAX_IN_FLIGHT
+: <a class="el" href="group__mqtt__opts.html#gae82460b35de2291e9661e440c3458e8f">mqtt_opts.h</a>
+</li>
+<li>MQTT_REQ_TIMEOUT
+: <a class="el" href="group__mqtt__opts.html#ga262639f2b45f6e064fb53156396d6d0a">mqtt_opts.h</a>
+</li>
+<li>mqtt_ringbuf_free
+: <a class="el" href="mqtt_8c.html#afba101fbf26b556c869060d3d013c8fa">mqtt.c</a>
+</li>
+<li>mqtt_ringbuf_linear_read_length
+: <a class="el" href="mqtt_8c.html#ad82b4039213ab3f1d9e4bcd3aa0c88a3">mqtt.c</a>
+</li>
+<li>mqtt_subscribe
+: <a class="el" href="group__mqtt.html#ga83d6a6d811b201a74d793bc1b5d4e029">mqtt.h</a>
+</li>
+<li>MQTT_TLS_PORT
+: <a class="el" href="group__mqtt.html#ga6610174f17b9ecbcf2bc66a4fd5a6b0f">mqtt.h</a>
+</li>
+<li>mqtt_unsubscribe
+: <a class="el" href="group__mqtt.html#ga0f133ef09cbe56c46ebe2cc21afccf3f">mqtt.h</a>
+</li>
+<li>MQTT_VAR_HEADER_BUFFER_LEN
+: <a class="el" href="group__mqtt__opts.html#ga8275ef78a85fb14c3ac1423c70e45805">mqtt_opts.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs_n.html b/doc/doxygen/output/html/globals_defs_n.html
new file mode 100644
index 0000000..4a074f0
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_n.html
@@ -0,0 +1,339 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_n.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>ND6_OPTION_TYPE_MTU
+: <a class="el" href="prot_2nd6_8h.html#aab6c15c9bea51fbdcc660f718bb403a8">nd6.h</a>
+</li>
+<li>ND6_OPTION_TYPE_PREFIX_INFO
+: <a class="el" href="prot_2nd6_8h.html#a0225d4c8911efdbdbc2b40de208906c2">nd6.h</a>
+</li>
+<li>ND6_OPTION_TYPE_RDNSS
+: <a class="el" href="prot_2nd6_8h.html#a3188b9704a8ca598f54b87c3db73272e">nd6.h</a>
+</li>
+<li>ND6_OPTION_TYPE_REDIR_HDR
+: <a class="el" href="prot_2nd6_8h.html#aeaa575c1a66ccaa2dc62ff2c0bd71619">nd6.h</a>
+</li>
+<li>ND6_OPTION_TYPE_ROUTE_INFO
+: <a class="el" href="prot_2nd6_8h.html#aff2e03766ee1fa15263c4aeda5097d28">nd6.h</a>
+</li>
+<li>ND6_OPTION_TYPE_SOURCE_LLADDR
+: <a class="el" href="prot_2nd6_8h.html#a68ce8550a20cd30093d6e79e1ca51842">nd6.h</a>
+</li>
+<li>ND6_RA_FLAG_MANAGED_ADDR_CONFIG
+: <a class="el" href="prot_2nd6_8h.html#a7fb1b330719d83b7525374f4beca51bc">nd6.h</a>
+</li>
+<li>ND6_RTR_SOLICITATION_INTERVAL
+: <a class="el" href="nd6_8h.html#a2fec65c0785551bad3a282ddee4062ac">nd6.h</a>
+</li>
+<li>ND6_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga753161114df60299a28d51c092c756cf">opt.h</a>
+</li>
+<li>ND6_TMR_INTERVAL
+: <a class="el" href="nd6_8h.html#a3250c1e32713635d588cf25865ebed56">nd6.h</a>
+</li>
+<li>NETB_HFLAG_RESPONSE
+: <a class="el" href="netbiosns_8c.html#af09685abf1739c802bc8772b35b7fb1c">netbiosns.c</a>
+</li>
+<li>NETB_NFLAG_UNIQUE
+: <a class="el" href="netbiosns_8c.html#ae00d45caef5a670e3aedde2788b3f212">netbiosns.c</a>
+</li>
+<li>NETBIOS_LWIP_NAME
+: <a class="el" href="group__netbiosns__opts.html#ga468c2ae67a79ce082ee585a438f7373b">netbiosns_opts.h</a>
+</li>
+<li>NETBIOS_NAME_LEN
+: <a class="el" href="netbiosns_8c.html#a4b83658c5bbb9ac90aca4351086a9a00">netbiosns.c</a>
+</li>
+<li>NETBIOS_NAME_TTL
+: <a class="el" href="netbiosns_8c.html#a35d43ea3290f6412e45598b610f03cf1">netbiosns.c</a>
+</li>
+<li>NETBUF_FLAG_CHKSUM
+: <a class="el" href="netbuf_8h.html#ab75db64a9e84eb67a382c30e382d417c">netbuf.h</a>
+</li>
+<li>NETBUF_FLAG_DESTADDR
+: <a class="el" href="netbuf_8h.html#ab38abb4213df4c00b9b3ab844322a090">netbuf.h</a>
+</li>
+<li>netconn_addr
+: <a class="el" href="group__netconn__common.html#ga37ec33522cfc26fa57251c33e4cebb3e">api.h</a>
+</li>
+<li>NETCONN_FIN_RX_PENDING
+: <a class="el" href="api_8h.html#a24d62a2a03ba421fcf2bdce1ea89b949">api.h</a>
+</li>
+<li>NETCONN_FLAG_CHECK_WRITESPACE
+: <a class="el" href="api_8h.html#a9d791955a4256a0589a3844e4e6f0f9c">api.h</a>
+</li>
+<li>NETCONN_FLAG_IN_NONBLOCKING_CONNECT
+: <a class="el" href="api_8h.html#a70bb861ee643b60ee402fd48f581f58d">api.h</a>
+</li>
+<li>NETCONN_FLAG_IPV6_V6ONLY
+: <a class="el" href="api_8h.html#a60892e4eb139f10157847fea4266bf5b">api.h</a>
+</li>
+<li>NETCONN_FLAG_MBOXCLOSED
+: <a class="el" href="api_8h.html#af77be7590d3712259e78103c1dddf63f">api.h</a>
+</li>
+<li>NETCONN_FLAG_NON_BLOCKING
+: <a class="el" href="api_8h.html#abee57aa0ba63e35742d411bc5224900a">api.h</a>
+</li>
+<li>netconn_get_ipv6only
+: <a class="el" href="group__netconn__common.html#gaf001c7d5fbf97c04eb1d9ac7d14c9c31">api.h</a>
+</li>
+<li>netconn_get_recvbufsize
+: <a class="el" href="api_8h.html#ac0298c287dc3823047c378c014ff1eb0">api.h</a>
+</li>
+<li>netconn_get_sendtimeout
+: <a class="el" href="api_8h.html#a7d6e84458eec796b0b0ce1bb247f323f">api.h</a>
+</li>
+<li>netconn_is_nonblocking
+: <a class="el" href="api_8h.html#a5789f0030b895b40625a74deb5a1092f">api.h</a>
+</li>
+<li>netconn_listen
+: <a class="el" href="group__netconn__tcp.html#ga43e3f4c2169dec0f666c502e490416b7">api.h</a>
+</li>
+<li>netconn_new
+: <a class="el" href="group__netconn__common.html#gab2bd1d5e633e14e428cfc0ca908d5e0c">api.h</a>
+</li>
+<li>netconn_peer
+: <a class="el" href="group__netconn__common.html#ga1065e769f2276270722a7700182077bc">api.h</a>
+</li>
+<li>netconn_set_ipv6only
+: <a class="el" href="group__netconn__common.html#gae56911e2d92bebf43d73e116530e41f1">api.h</a>
+</li>
+<li>netconn_set_nonblocking
+: <a class="el" href="api_8h.html#a6a578dd5b55e4457e0d23574ec9c55bb">api.h</a>
+</li>
+<li>netconn_set_recvbufsize
+: <a class="el" href="api_8h.html#a04785274634a5b504c760731c2e70725">api.h</a>
+</li>
+<li>netconn_set_sendtimeout
+: <a class="el" href="api_8h.html#a3ce3ad9f660e99b11fec20cafaf8f016">api.h</a>
+</li>
+<li>netconn_type
+: <a class="el" href="api_8h.html#a62cd17ad03bb2817cb0c419e1c9790b1">api.h</a>
+</li>
+<li>netconn_write
+: <a class="el" href="group__netconn__tcp.html#gafea5e9b90770a7c6cd0762ceb65e5b46">api.h</a>
+</li>
+<li>NETIF_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga2dfad02b075a7f9a8791a66fe40864a4">opt.h</a>
+</li>
+<li>NETIF_FLAG_BROADCAST
+: <a class="el" href="group__netif__flags.html#gaef64fe15c82bc7b235366923e517104e">netif.h</a>
+</li>
+<li>NETIF_FLAG_ETHARP
+: <a class="el" href="group__netif__flags.html#ga92448dc510bc8d700c09e5c971ef0676">netif.h</a>
+</li>
+<li>NETIF_FLAG_ETHERNET
+: <a class="el" href="group__netif__flags.html#ga76ad9d0cf9f029df0ab2a998c64040dc">netif.h</a>
+</li>
+<li>NETIF_FLAG_IGMP
+: <a class="el" href="group__netif__flags.html#gac9493b923d733c73f6006d9714826558">netif.h</a>
+</li>
+<li>NETIF_FLAG_LINK_UP
+: <a class="el" href="group__netif__flags.html#ga75f5a2b9276c93e3bd18a568459fd2d8">netif.h</a>
+</li>
+<li>NETIF_FLAG_MLD6
+: <a class="el" href="group__netif__flags.html#gab14fbe1447d2fdbdf5abc87f51eb6508">netif.h</a>
+</li>
+<li>NETIF_FLAG_UP
+: <a class="el" href="group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e">netif.h</a>
+</li>
+<li>netif_get_client_data
+: <a class="el" href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif.h</a>
+</li>
+<li>netif_get_hostname
+: <a class="el" href="group__netif.html#ga5a378ba73e60cd1e5235474f0db22978">netif.h</a>
+</li>
+<li>netif_igmp_data
+: <a class="el" href="group__igmp.html#gad990dfc5ed8b644c16cc578c876e588d">igmp.h</a>
+</li>
+<li>netif_ip4_addr
+: <a class="el" href="group__netif__ip4.html#gac9b6e63b5dd2968fe0a4813f3eefb55d">netif.h</a>
+</li>
+<li>netif_ip4_gw
+: <a class="el" href="group__netif__ip4.html#ga86d69faf416765b7f8faf60a43cc50da">netif.h</a>
+</li>
+<li>netif_ip4_netmask
+: <a class="el" href="group__netif__ip4.html#ga952d1436f2428b92fc8197bcf2f8fca3">netif.h</a>
+</li>
+<li>netif_ip6_addr
+: <a class="el" href="group__netif__ip6.html#ga7ec0623f1a858a0cdb187beaa89df365">netif.h</a>
+</li>
+<li>netif_ip_addr4
+: <a class="el" href="group__netif__ip4.html#ga54179a2f3b7cc35b23ee8d692d8d8022">netif.h</a>
+</li>
+<li>netif_ip_addr6
+: <a class="el" href="group__netif__ip6.html#gae424e336fe9f013b30d4065fd35c91ee">netif.h</a>
+</li>
+<li>netif_ip_gw4
+: <a class="el" href="group__netif__ip4.html#ga7ea95478e000701423b7f6316e575a2a">netif.h</a>
+</li>
+<li>netif_ip_netmask4
+: <a class="el" href="group__netif__ip4.html#ga58518602f388d2640985a01a312f0a51">netif.h</a>
+</li>
+<li>netif_is_link_up
+: <a class="el" href="netif_8h.html#a780be4c3fa9f7f2534f7865666c3a1b8">netif.h</a>
+</li>
+<li>netif_is_up
+: <a class="el" href="group__netif.html#ga94a4c24c988afc0a577387730f303b19">netif.h</a>
+</li>
+<li>NETIF_MAX_HWADDR_LEN
+: <a class="el" href="netif_8h.html#ab887a8ec553de1be1d04cf2961c63c41">netif.h</a>
+</li>
+<li>netif_mld6_data
+: <a class="el" href="group__mld6.html#ga02a2259082f22c5989a3c929be95e641">mld6.h</a>
+</li>
+<li>NETIF_NAMESIZE
+: <a class="el" href="netif_8h.html#a302f24fbfe883ee4840ffc71f267ae2a">netif.h</a>
+</li>
+<li>netif_set_client_data
+: <a class="el" href="group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f">netif.h</a>
+</li>
+<li>netif_set_hostname
+: <a class="el" href="group__netif.html#ga5e5d2c6fa5566a24dd848f3a2c7c957f">netif.h</a>
+</li>
+<li>netif_set_igmp_mac_filter
+: <a class="el" href="group__netif.html#ga3428b3f8195249c6cd8704a4db46b401">netif.h</a>
+</li>
+<li>netif_set_mld_mac_filter
+: <a class="el" href="group__netif.html#ga97f30bb5542e4c07d3b32e3c754e104c">netif.h</a>
+</li>
+<li>netifapi_autoip_start
+: <a class="el" href="group__netifapi__autoip.html#gaca26bae2a21e0732a7599df14f880af2">netifapi.h</a>
+</li>
+<li>netifapi_autoip_stop
+: <a class="el" href="group__netifapi__autoip.html#gae604f96907a52557e4ebd1bd5d80071d">netifapi.h</a>
+</li>
+<li>netifapi_dhcp_inform
+: <a class="el" href="group__netifapi__dhcp4.html#ga29108975e9aa6463b9a574de961317e0">netifapi.h</a>
+</li>
+<li>netifapi_dhcp_release
+: <a class="el" href="group__netifapi__dhcp4.html#ga5aeaee24c11128df90a56fe091c9d409">netifapi.h</a>
+</li>
+<li>netifapi_dhcp_release_and_stop
+: <a class="el" href="group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134">netifapi.h</a>
+</li>
+<li>netifapi_dhcp_renew
+: <a class="el" href="group__netifapi__dhcp4.html#ga642390e5efa53ad3095e01331c6a936b">netifapi.h</a>
+</li>
+<li>netifapi_dhcp_start
+: <a class="el" href="group__netifapi__dhcp4.html#gae64d13afc6e3b0f21aae04b66d0e3765">netifapi.h</a>
+</li>
+<li>netifapi_dhcp_stop
+: <a class="el" href="group__netifapi__dhcp4.html#ga2322c0d0e3eb6c1097d6f3942905dbd5">netifapi.h</a>
+</li>
+<li>netifapi_netif_remove
+: <a class="el" href="group__netifapi__netif.html#ga0e3f522b900a0ba04421c4587e790373">netifapi.h</a>
+</li>
+<li>netifapi_netif_set_default
+: <a class="el" href="group__netifapi__netif.html#ga862d6cfa5d36b2c36d7b1671e8d95ccf">netifapi.h</a>
+</li>
+<li>netifapi_netif_set_down
+: <a class="el" href="group__netifapi__netif.html#ga22c02edde32743ccfd41924da0601a16">netifapi.h</a>
+</li>
+<li>netifapi_netif_set_link_down
+: <a class="el" href="group__netifapi__netif.html#ga2a9694804743f5466c4ecc400b7f07e4">netifapi.h</a>
+</li>
+<li>netifapi_netif_set_link_up
+: <a class="el" href="group__netifapi__netif.html#gac054a60a32447019913d34da63924853">netifapi.h</a>
+</li>
+<li>netifapi_netif_set_up
+: <a class="el" href="group__netifapi__netif.html#ga6ce735fe79efe1739e53b7f0e975ac76">netifapi.h</a>
+</li>
+<li>NO_SYS
+: <a class="el" href="group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b">opt.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs_p.html b/doc/doxygen/output/html/globals_defs_p.html
new file mode 100644
index 0000000..4b07b9c
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_p.html
@@ -0,0 +1,183 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_p.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>PACK_STRUCT_BEGIN
+: <a class="el" href="group__compiler__abstraction.html#ga73199061891adf1b912d20835c7d5e96">arch.h</a>
+</li>
+<li>PACK_STRUCT_END
+: <a class="el" href="group__compiler__abstraction.html#ga465fef70f294e21cbf4ea51fc342f20e">arch.h</a>
+</li>
+<li>PACK_STRUCT_FIELD
+: <a class="el" href="group__compiler__abstraction.html#gaab0b988124e37a978d9a88e7c1c778e0">arch.h</a>
+</li>
+<li>PACK_STRUCT_FLD_8
+: <a class="el" href="group__compiler__abstraction.html#gaa8f75e4117374c2d09fbda5566e40b62">arch.h</a>
+</li>
+<li>PACK_STRUCT_FLD_S
+: <a class="el" href="group__compiler__abstraction.html#gacc89e224363eb0ebca24b64d925c3cb7">arch.h</a>
+</li>
+<li>PACK_STRUCT_STRUCT
+: <a class="el" href="group__compiler__abstraction.html#ga33623da05bb55497534c3dc26ebebeb2">arch.h</a>
+</li>
+<li>PACK_STRUCT_USE_INCLUDES
+: <a class="el" href="group__compiler__abstraction.html#ga57b90d36d8bea3798a5d1815945fd8ef">arch.h</a>
+</li>
+<li>PBUF_ALLOC_FLAG_DATA_CONTIGUOUS
+: <a class="el" href="pbuf_8h.html#a426883d928f8f3e8fd066e616159d78f">pbuf.h</a>
+</li>
+<li>PBUF_ALLOC_FLAG_RX
+: <a class="el" href="pbuf_8h.html#a567a0dfa01b0e5540f9416a200ed163f">pbuf.h</a>
+</li>
+<li>PBUF_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga5c3d44a0ec3bb8bd66f776c70d5c6a6c">opt.h</a>
+</li>
+<li>PBUF_FLAG_IS_CUSTOM
+: <a class="el" href="pbuf_8h.html#af78a7e1815dc0e31884d095b666d997f">pbuf.h</a>
+</li>
+<li>PBUF_FLAG_LLBCAST
+: <a class="el" href="pbuf_8h.html#a6772c16662bbb78597399add086500c0">pbuf.h</a>
+</li>
+<li>PBUF_FLAG_LLMCAST
+: <a class="el" href="pbuf_8h.html#ac0d56cde47aca24ef410d730d7c89887">pbuf.h</a>
+</li>
+<li>PBUF_FLAG_MCASTLOOP
+: <a class="el" href="pbuf_8h.html#ab8ad153151a8c157335d9c0cedc007e6">pbuf.h</a>
+</li>
+<li>PBUF_FLAG_PUSH
+: <a class="el" href="pbuf_8h.html#a018a6499e357f8a1373321f802a82930">pbuf.h</a>
+</li>
+<li>PBUF_FLAG_TCP_FIN
+: <a class="el" href="pbuf_8h.html#a36a915aa2f6a188baa2862881407971e">pbuf.h</a>
+</li>
+<li>PBUF_LINK_ENCAPSULATION_HLEN
+: <a class="el" href="group__lwip__opts__pbuf.html#ga6e1ba1875ae5168a17b53d83597bc1de">opt.h</a>
+</li>
+<li>PBUF_LINK_HLEN
+: <a class="el" href="group__lwip__opts__pbuf.html#ga35998a3d56af9940e6a80bb372597685">opt.h</a>
+</li>
+<li>PBUF_NEEDS_COPY
+: <a class="el" href="group__pbuf.html#ga894d91d811fd986f3cc3da828fa7beb3">pbuf.h</a>
+</li>
+<li>PBUF_POOL_BUFSIZE
+: <a class="el" href="group__lwip__opts__pbuf.html#gae61f4491d56e805e79b79eb5d35a00e5">opt.h</a>
+</li>
+<li>PBUF_POOL_FREE_OOSEQ
+: <a class="el" href="pbuf_8h.html#ac54b0f161128a32c7419c33b893a5106">pbuf.h</a>
+</li>
+<li>PBUF_POOL_SIZE
+: <a class="el" href="group__lwip__opts__memp.html#ga50eaadc4cad0716410332691e382c38a">opt.h</a>
+</li>
+<li>PBUF_TYPE_ALLOC_SRC_MASK
+: <a class="el" href="pbuf_8h.html#a97d4db8e0f127f61af0016c184c865ca">pbuf.h</a>
+</li>
+<li>PBUF_TYPE_ALLOC_SRC_MASK_APP_MAX
+: <a class="el" href="pbuf_8h.html#aad686ef346759a221abdb45f64649816">pbuf.h</a>
+</li>
+<li>PBUF_TYPE_ALLOC_SRC_MASK_APP_MIN
+: <a class="el" href="pbuf_8h.html#aa1f62ba9dc5d462e67e33c4be64c601a">pbuf.h</a>
+</li>
+<li>PBUF_TYPE_FLAG_DATA_VOLATILE
+: <a class="el" href="pbuf_8h.html#a02789ca67766def65000b58f7fe7d03b">pbuf.h</a>
+</li>
+<li>PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS
+: <a class="el" href="pbuf_8h.html#a49ab2c0662378f268ed8209bd54aaedf">pbuf.h</a>
+</li>
+<li>poll
+: <a class="el" href="group__socket.html#ga80ae38841b0e64e60618cd8bf857f617">sockets.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </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
new file mode 100644
index 0000000..e628287
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_r.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_r.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_r"></a>- r -</h3><ul>
+<li>RAW_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gaf0551bef83c0fc1baa57cf339d220e25">opt.h</a>
+</li>
+<li>RAW_TTL
+: <a class="el" href="group__lwip__opts__raw.html#ga36e3ffa66073ca0d27d11c422778249c">opt.h</a>
+</li>
+<li>read
+: <a class="el" href="group__socket.html#ga822040573319cf87bfe6758d511be57f">sockets.h</a>
+</li>
+<li>readv
+: <a class="el" href="group__socket.html#ga86788b3c690d38699fdbaea523ddec9d">sockets.h</a>
+</li>
+<li>recv
+: <a class="el" href="group__socket.html#gadd7ae45df7c005619eb1126542231e9b">sockets.h</a>
+</li>
+<li>RECV_BUFSIZE_DEFAULT
+: <a class="el" href="group__lwip__opts__socket.html#ga5dbd0a61f30ae6c6bfbda635095f138d">opt.h</a>
+</li>
+<li>recvfrom
+: <a class="el" href="group__socket.html#ga5e5f7bcda6562bae815e188ea1a81ecd">sockets.h</a>
+</li>
+<li>recvmsg
+: <a class="el" href="group__socket.html#gaecfc7d524105e52604829c66ced752b8">sockets.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs_s.html b/doc/doxygen/output/html/globals_defs_s.html
new file mode 100644
index 0000000..8029596
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_s.html
@@ -0,0 +1,375 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_s.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>select
+: <a class="el" href="group__socket.html#gac332b9b9b2cd877a6189ef838de49e33">sockets.h</a>
+</li>
+<li>SELWAIT_T
+: <a class="el" href="sockets__priv_8h.html#a8f4d240733a9261c668fc66dc4ce8196">sockets_priv.h</a>
+</li>
+<li>send
+: <a class="el" href="group__socket.html#ga19024690fdfd3512d24dcaa9b80d24ed">sockets.h</a>
+</li>
+<li>sendmsg
+: <a class="el" href="group__socket.html#gaad99bea090b1fe4743234fcee15a5d28">sockets.h</a>
+</li>
+<li>sendto
+: <a class="el" href="group__socket.html#gaaa17499d76ef421821fe72fd29fe38f7">sockets.h</a>
+</li>
+<li>setsockopt
+: <a class="el" href="group__socket.html#ga115d74cd1953e7bafc2e34157c697df1">sockets.h</a>
+</li>
+<li>shutdown
+: <a class="el" href="group__socket.html#ga7d832f77cfad97cf901640f243c6e682">sockets.h</a>
+</li>
+<li>SLIP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gab986f95183559d8678c6d80969b01857">opt.h</a>
+</li>
+<li>SLIP_MAX_SIZE
+: <a class="el" href="slipif_8c.html#accf448f9dabb0f33ef46b40355691cab">slipif.c</a>
+</li>
+<li>SLIP_RX_QUEUE
+: <a class="el" href="slipif_8h.html#a37ce8613535232db02bfd9ae9b51c668">slipif.h</a>
+</li>
+<li>SLIP_SIO_SPEED
+: <a class="el" href="slipif_8c.html#a2a9e9ed81732a6794a9b9a712f75a1cc">slipif.c</a>
+</li>
+<li>SLIP_USE_RX_THREAD
+: <a class="el" href="slipif_8h.html#a198967c11f79cffc32192710294e8826">slipif.h</a>
+</li>
+<li>SLIPIF_THREAD_NAME
+: <a class="el" href="group__lwip__opts__thread.html#gae9cd260c56472324a2f0ee5f9597a675">opt.h</a>
+</li>
+<li>SLIPIF_THREAD_PRIO
+: <a class="el" href="group__lwip__opts__thread.html#gab1b9fc2efcbf1f804bfd0191bc019c4e">opt.h</a>
+</li>
+<li>SLIPIF_THREAD_STACKSIZE
+: <a class="el" href="group__lwip__opts__thread.html#gae8ab54a25007ce997bbab6289815e258">opt.h</a>
+</li>
+<li>SMEMCPY
+: <a class="el" href="group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec">opt.h</a>
+</li>
+<li>SMTP_POLL_INTERVAL
+: <a class="el" href="smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e">smtp.c</a>
+</li>
+<li>SMTP_TIMEOUT
+: <a class="el" href="smtp_8c.html#a6029851c4f71d98b00d6c49a17ea9ef6">smtp.c</a>
+</li>
+<li>SMTP_TIMEOUT_DATABLOCK
+: <a class="el" href="smtp_8c.html#ad853ab316a3b866b87c0454053febfe3">smtp.c</a>
+</li>
+<li>SMTP_TIMEOUT_DATATERM
+: <a class="el" href="smtp_8c.html#a73855e673457f748b6bcba49aab9b035">smtp.c</a>
+</li>
+<li>SNMP_COMMUNITY
+: <a class="el" href="group__snmp__opts.html#ga316c1e1f06f0c7ca56589563809e64db">snmp_opts.h</a>
+</li>
+<li>SNMP_COMMUNITY_TRAP
+: <a class="el" href="group__snmp__opts.html#gaaefc9dda5f8e5c296018a463cdbac39b">snmp_opts.h</a>
+</li>
+<li>SNMP_COMMUNITY_WRITE
+: <a class="el" href="group__snmp__opts.html#gafb9414dc7a33978b62a3a9838b659464">snmp_opts.h</a>
+</li>
+<li>SNMP_CREATE_THREAD_SYNC_NODE
+: <a class="el" href="snmp__threadsync_8h.html#a1971c27c8addf1c426abd1abac54c8d2">snmp_threadsync.h</a>
+</li>
+<li>SNMP_DEBUG
+: <a class="el" href="group__snmp__opts.html#gac041000361342f51ad5ee5d8f6254e02">snmp_opts.h</a>
+</li>
+<li>SNMP_DEVICE_ENTERPRISE_OID
+: <a class="el" href="group__snmp__opts.html#ga09118b734e85df152af098744e888b34">snmp_opts.h</a>
+</li>
+<li>SNMP_DEVICE_ENTERPRISE_OID_LEN
+: <a class="el" href="group__snmp__opts.html#ga9e39ba5308f5c7ac5296c7d05fdfa97f">snmp_opts.h</a>
+</li>
+<li>SNMP_GENTRAP_AUTH_FAILURE
+: <a class="el" href="apps_2snmp_8h.html#aaf312d8bdbeed2c02560321ab24a022f">snmp.h</a>
+</li>
+<li>SNMP_GENTRAP_COLDSTART
+: <a class="el" href="apps_2snmp_8h.html#ae9310bbe1948b3c3bc64c073d4621019">snmp.h</a>
+</li>
+<li>SNMP_GENTRAP_EGP_NEIGHBOR_LOSS
+: <a class="el" href="apps_2snmp_8h.html#ac1cd822650d9ac66d0333a5ad600cfee">snmp.h</a>
+</li>
+<li>SNMP_GENTRAP_ENTERPRISE_SPECIFIC
+: <a class="el" href="apps_2snmp_8h.html#ab3691cecfa911baa52ccf6054022ba43">snmp.h</a>
+</li>
+<li>SNMP_GENTRAP_LINKDOWN
+: <a class="el" href="apps_2snmp_8h.html#a1856efbe83199f456c34a4e5139dfb16">snmp.h</a>
+</li>
+<li>SNMP_GENTRAP_LINKUP
+: <a class="el" href="apps_2snmp_8h.html#afa665cdc02ccd5ee9fe0c4cb1b792186">snmp.h</a>
+</li>
+<li>SNMP_GENTRAP_WARMSTART
+: <a class="el" href="apps_2snmp_8h.html#a9a2e5824deab50e639b01181307a0926">snmp.h</a>
+</li>
+<li>SNMP_LWIP_ENTERPRISE_OID
+: <a class="el" href="group__snmp__opts.html#ga868bfef6efe05515c86291137a633479">snmp_opts.h</a>
+</li>
+<li>SNMP_LWIP_GETBULK_MAX_REPETITIONS
+: <a class="el" href="group__snmp__opts.html#ga5a24152aa5f3c2837b9a3145aa3c59f3">snmp_opts.h</a>
+</li>
+<li>SNMP_LWIP_MIB2
+: <a class="el" href="group__snmp__opts.html#gaab667d48f48ee89f8bdbc7f134e6037d">snmp_opts.h</a>
+</li>
+<li>SNMP_LWIP_MIB2_SYSCONTACT
+: <a class="el" href="group__snmp__opts.html#ga1a57501c615b630d363e0af1a504e683">snmp_opts.h</a>
+</li>
+<li>SNMP_LWIP_MIB2_SYSDESC
+: <a class="el" href="group__snmp__opts.html#gae93a105b421a2ca91e862da5087cec73">snmp_opts.h</a>
+</li>
+<li>SNMP_LWIP_MIB2_SYSLOCATION
+: <a class="el" href="group__snmp__opts.html#ga311cec98c8f7e4851d325fffe96cf8d9">snmp_opts.h</a>
+</li>
+<li>SNMP_LWIP_MIB2_SYSNAME
+: <a class="el" href="group__snmp__opts.html#ga80ba46f9517a51b5477f13082b2bcf98">snmp_opts.h</a>
+</li>
+<li>SNMP_MAX_COMMUNITY_STR_LEN
+: <a class="el" href="group__snmp__opts.html#ga0e98b58159a77688f87f9f50479177fd">snmp_opts.h</a>
+</li>
+<li>SNMP_MAX_OBJ_ID_LEN
+: <a class="el" href="group__snmp__opts.html#ga3ad9d293f90e3c885c4e3263a9064a41">snmp_opts.h</a>
+</li>
+<li>SNMP_MAX_OCTET_STRING_LEN
+: <a class="el" href="group__snmp__opts.html#gae50cdd09697aa54a8b9f26432ac55ac2">snmp_opts.h</a>
+</li>
+<li>SNMP_MAX_VALUE_SIZE
+: <a class="el" href="group__snmp__opts.html#gafb4362575bc50476a7401a1ed14787f0">snmp_opts.h</a>
+</li>
+<li>SNMP_MIB_DEBUG
+: <a class="el" href="group__snmp__opts.html#gac12240265db443eaf9d31d187e586c16">snmp_opts.h</a>
+</li>
+<li>SNMP_MIN_VALUE_SIZE
+: <a class="el" href="group__snmp__opts.html#gac815d0dbe576299546ac612e7eaf3f90">snmp_opts.h</a>
+</li>
+<li>SNMP_NODE_TREE
+: <a class="el" href="snmp__core_8h.html#a9ee3aad9305fdd883abb37822be81b72">snmp_core.h</a>
+</li>
+<li>SNMP_SAFE_REQUESTS
+: <a class="el" href="group__snmp__opts.html#ga95e39047b9bcb385780b06b35af49261">snmp_opts.h</a>
+</li>
+<li>SNMP_STACK_SIZE
+: <a class="el" href="group__snmp__opts.html#ga0dcacdccc61216c6773943ad3fd31242">snmp_opts.h</a>
+</li>
+<li>SNMP_THREAD_PRIO
+: <a class="el" href="group__snmp__opts.html#gad9bce0d9c05ed4607d72de7b75f2a80b">snmp_opts.h</a>
+</li>
+<li>SNMP_TRAP_DESTINATIONS
+: <a class="el" href="group__snmp__opts.html#ga692343b0cc555c302fd713003d4f8a08">snmp_opts.h</a>
+</li>
+<li>SNMP_USE_NETCONN
+: <a class="el" href="group__snmp__opts.html#gaf02e8b4b69e99df784e9953401477078">snmp_opts.h</a>
+</li>
+<li>SNMP_USE_RAW
+: <a class="el" href="group__snmp__opts.html#ga8c93f4260af2eb3c50d4bc603f716f1f">snmp_opts.h</a>
+</li>
+<li>SNTP_CHECK_RESPONSE
+: <a class="el" href="group__sntp__opts.html#ga7d4e12d90912d486e64f289d7f3ca446">sntp_opts.h</a>
+</li>
+<li>SNTP_COMP_ROUNDTRIP
+: <a class="el" href="group__sntp__opts.html#ga1e21781705d3549a305339fd7fca63e7">sntp_opts.h</a>
+</li>
+<li>SNTP_DEBUG
+: <a class="el" href="group__sntp__opts.html#ga25c6f9c14c17e218d110d826b09f8d91">sntp_opts.h</a>
+</li>
+<li>SNTP_FRAC_TO_US
+: <a class="el" href="sntp_8c.html#aebe74c93643ac9b8c8a9c7d223192c8f">sntp.c</a>
+</li>
+<li>SNTP_GET_SERVERS_FROM_DHCP
+: <a class="el" href="group__sntp__opts.html#ga961a61eef942ab5378cff1e3742b3ade">sntp_opts.h</a>
+</li>
+<li>SNTP_GET_SYSTEM_TIME
+: <a class="el" href="group__sntp__opts.html#gab0ea385479a5c5c8c173f165ded2fb63">sntp_opts.h</a>
+</li>
+<li>SNTP_MAX_SERVERS
+: <a class="el" href="group__sntp__opts.html#ga5d9dc0827f402849f5c18d44e311dbc2">sntp_opts.h</a>
+</li>
+<li>SNTP_MONITOR_SERVER_REACHABILITY
+: <a class="el" href="group__sntp__opts.html#ga5782f21ef24ebddd5ba2ce9a889094e3">sntp_opts.h</a>
+</li>
+<li>SNTP_PORT
+: <a class="el" href="group__sntp__opts.html#gacbee62c27f54371fc2c5259a834a0f9b">sntp_opts.h</a>
+</li>
+<li>SNTP_RECV_TIMEOUT
+: <a class="el" href="group__sntp__opts.html#ga44cf26b9b19832d88599244711a12d08">sntp_opts.h</a>
+</li>
+<li>SNTP_RETRY_TIMEOUT
+: <a class="el" href="group__sntp__opts.html#ga86d651d8eb07687208308deef95a23ba">sntp_opts.h</a>
+</li>
+<li>SNTP_RETRY_TIMEOUT_EXP
+: <a class="el" href="group__sntp__opts.html#gafdb7e98f608cc429188d7dac356614c2">sntp_opts.h</a>
+</li>
+<li>SNTP_RETRY_TIMEOUT_MAX
+: <a class="el" href="group__sntp__opts.html#gafde10b3ed7cb4bb2cd2c4daa389db699">sntp_opts.h</a>
+</li>
+<li>SNTP_SERVER_DNS
+: <a class="el" href="group__sntp__opts.html#gaef477c145ae404d77188b26b79b6996f">sntp_opts.h</a>
+</li>
+<li>SNTP_SET_SYSTEM_TIME
+: <a class="el" href="group__sntp__opts.html#gafe340b98c52dedcbc041267fe13b2da6">sntp_opts.h</a>
+</li>
+<li>SNTP_STARTUP_DELAY
+: <a class="el" href="group__sntp__opts.html#ga22017d43da7d4bf8d42e786b4ced4dfa">sntp_opts.h</a>
+</li>
+<li>SNTP_STARTUP_DELAY_FUNC
+: <a class="el" href="group__sntp__opts.html#gae082c2f3044d500ca5e1be1d4928de75">sntp_opts.h</a>
+</li>
+<li>SNTP_UPDATE_DELAY
+: <a class="el" href="group__sntp__opts.html#ga9232c56443115be05a2f852eba21979c">sntp_opts.h</a>
+</li>
+<li>SO_REUSE
+: <a class="el" href="group__lwip__opts__socket.html#gaf3822feed320cf8439b083ee525e4942">opt.h</a>
+</li>
+<li>SO_REUSE_RXTOALL
+: <a class="el" href="group__lwip__opts__socket.html#gae9395d83af89002343e5782130f52f44">opt.h</a>
+</li>
+<li>socket
+: <a class="el" href="group__socket.html#ga862d8f4070c66dddb979540ce9ba6a83">sockets.h</a>
+</li>
+<li>SOCKETS_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga509594f3ba7d8b1356628b50b55a0934">opt.h</a>
+</li>
+<li>SWAP_BYTES_IN_WORD
+: <a class="el" href="inet__chksum_8h.html#a0196bd603262882d16b5264b52eafe18">inet_chksum.h</a>
+</li>
+<li>SYS_ARCH_DECL_PROTECT
+: <a class="el" href="group__sys__prot.html#ga945395fa326214fc9736487242710a90">sys.h</a>
+</li>
+<li>SYS_ARCH_PROTECT
+: <a class="el" href="group__sys__prot.html#ga3d0e48feafd378e9c26c64567ecd8bab">sys.h</a>
+</li>
+<li>SYS_ARCH_TIMEOUT
+: <a class="el" href="sys_8h.html#ac1495030a8ab5e1f3c89e42ced527c5b">sys.h</a>
+</li>
+<li>SYS_ARCH_UNPROTECT
+: <a class="el" href="group__sys__prot.html#ga2f48e97047945642ddeb27e65bf4ffe2">sys.h</a>
+</li>
+<li>SYS_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga2960ae20008f05da8cc0714f36365642">opt.h</a>
+</li>
+<li>SYS_LIGHTWEIGHT_PROT
+: <a class="el" href="group__lwip__opts__lock.html#gae85efb3a5fcf8585c94b3c2669978959">opt.h</a>
+</li>
+<li>SYS_MBOX_EMPTY
+: <a class="el" href="sys_8h.html#ab0571e67edca0132b144106e9b319ef9">sys.h</a>
+</li>
+<li>sys_mbox_set_invalid_val
+: <a class="el" href="sys_8h.html#ae293feebb61d36f2db99be53702b8203">sys.h</a>
+</li>
+<li>sys_mbox_tryfetch
+: <a class="el" href="sys_8h.html#ab7841780b31ba9c0a39a440aad1fca13">sys.h</a>
+</li>
+<li>sys_mbox_valid_val
+: <a class="el" href="sys_8h.html#aae82640d0bdbeec7b9b6511b3f8d99cb">sys.h</a>
+</li>
+<li>sys_sem_set_invalid_val
+: <a class="el" href="sys_8h.html#a2556e570f6973a6f4d57d0e76ef190d8">sys.h</a>
+</li>
+<li>sys_sem_valid_val
+: <a class="el" href="sys_8h.html#a9e8ad541356786936f23ab83b8f550cc">sys.h</a>
+</li>
+<li>sys_sem_wait
+: <a class="el" href="sys_8h.html#a84e7e4bc00255aee84e6e7289a985703">sys.h</a>
+</li>
+<li>SYS_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga0173549afa76553583e5a02c6a791218">opt.h</a>
+</li>
+<li>SYS_TIMEOUTS_SLEEPTIME_INFINITE
+: <a class="el" href="timeouts_8h.html#a9e2b2593e709ff54c7e3c0b003f6f1b0">timeouts.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs_t.html b/doc/doxygen/output/html/globals_defs_t.html
new file mode 100644
index 0000000..24b6e1a
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_t.html
@@ -0,0 +1,267 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_t.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_t"></a>- t -</h3><ul>
+<li>TCP_BUILD_MSS_OPTION
+: <a class="el" href="tcp__priv_8h.html#abdc99c343efc6c81abf60bb62b361dd8">tcp_priv.h</a>
+</li>
+<li>TCP_CALCULATE_EFF_SEND_MSS
+: <a class="el" href="group__lwip__opts__tcp.html#gac04b84d32251ac558f0c3a8af85ba3a5">opt.h</a>
+</li>
+<li>TCP_CHECKSUM_ON_COPY
+: <a class="el" href="tcp__priv_8h.html#aea0c47b916a8a25f82d2063335033aee">tcp_priv.h</a>
+</li>
+<li>TCP_CHECKSUM_ON_COPY_SANITY_CHECK
+: <a class="el" href="tcp__out_8c.html#a25d7e9081baa5c84f2ebd34b0eb4169b">tcp_out.c</a>
+</li>
+<li>TCP_CWND_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga66df03d8192cd978d3321a9d68bf5411">opt.h</a>
+</li>
+<li>TCP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga4f43bb8a430c7a52a1ad5086d3f2803c">opt.h</a>
+</li>
+<li>TCP_DEFAULT_LISTEN_BACKLOG
+: <a class="el" href="group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf">opt.h</a>
+</li>
+<li>tcp_do_output_nagle
+: <a class="el" href="tcp__priv_8h.html#afbd7a2997e3a3b7569efc3298e2e409f">tcp_priv.h</a>
+</li>
+<li>TCP_FR_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga5895bee26e8e1a0b89d597e0f2580b23">opt.h</a>
+</li>
+<li>TCP_INPUT_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gaf51dc2563536de56470146749f715ba8">opt.h</a>
+</li>
+<li>tcp_listen
+: <a class="el" href="group__tcp__raw.html#ga6b2a4efb1fc15d7d85cb71cb2a1d1066">tcp.h</a>
+</li>
+<li>TCP_LISTEN_BACKLOG
+: <a class="el" href="group__lwip__opts__tcp.html#ga98b23e7cbd3281915c50a485cb61899d">opt.h</a>
+</li>
+<li>TCP_MAXRTX
+: <a class="el" href="group__lwip__opts__tcp.html#ga0dee0911197855bdf19ef79778c241a6">opt.h</a>
+</li>
+<li>TCP_MSS
+: <a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">opt.h</a>
+</li>
+<li>tcp_mss
+: <a class="el" href="group__tcp__raw.html#gab0b45a01dcd461e5b8df2a1d9ddda134">tcp.h</a>
+</li>
+<li>tcp_nagle_disable
+: <a class="el" href="group__tcp__raw.html#ga5b5c0093efff4466bda06d45f12a4633">tcp.h</a>
+</li>
+<li>tcp_nagle_disabled
+: <a class="el" href="group__tcp__raw.html#ga9398061411b4af900160233aa3b1a286">tcp.h</a>
+</li>
+<li>tcp_nagle_enable
+: <a class="el" href="group__tcp__raw.html#ga9dfcdb8a05533b07dca91cf7e784f88f">tcp.h</a>
+</li>
+<li>TCP_OOSEQ_MAX_BYTES
+: <a class="el" href="group__lwip__opts__tcp.html#ga9d6d3219bb5fc0bc760a64114de13c25">opt.h</a>
+</li>
+<li>TCP_OOSEQ_MAX_PBUFS
+: <a class="el" href="group__lwip__opts__tcp.html#ga1f57d3859c4556f785708e5dc440617e">opt.h</a>
+</li>
+<li>TCP_OUTPUT_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga9f70601fdc1feee490772bf7fcdb74fb">opt.h</a>
+</li>
+<li>TCP_OVERSIZE
+: <a class="el" href="group__lwip__opts__tcp.html#ga5648e2580bb55c0efdfbebcf3bad1eef">opt.h</a>
+</li>
+<li>TCP_OVERSIZE_CALC_LENGTH
+: <a class="el" href="tcp__out_8c.html#aa2ef22d2384225a1b5fee187411cc129">tcp_out.c</a>
+</li>
+<li>TCP_OVERSIZE_DBGCHECK
+: <a class="el" href="tcp__priv_8h.html#a178a6e9966d03c3326b9e0568666bb69">tcp_priv.h</a>
+</li>
+<li>TCP_PCB_COMMON
+: <a class="el" href="tcp_8h.html#a874630045102fc5f1442704a790c8bb8">tcp.h</a>
+</li>
+<li>TCP_QLEN_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gae7980c7f8eb45cd411bf410ff0a3fc55">opt.h</a>
+</li>
+<li>TCP_QUEUE_OOSEQ
+: <a class="el" href="group__lwip__opts__tcp.html#ga89ffd0d7d1529bdb26bfbad267d0ad75">opt.h</a>
+</li>
+<li>TCP_RST_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga37596f7bbb9b7663826244ba54486679">opt.h</a>
+</li>
+<li>TCP_RTO_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gad6e52e37415d0d0cbe4931a28f5a9662">opt.h</a>
+</li>
+<li>TCP_SND_BUF
+: <a class="el" href="group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd">opt.h</a>
+</li>
+<li>TCP_SND_QUEUELEN
+: <a class="el" href="group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904">opt.h</a>
+</li>
+<li>tcp_sndbuf
+: <a class="el" href="group__tcp__raw.html#gad1a95f09deb49cd7341d35527d6d3e2f">tcp.h</a>
+</li>
+<li>TCP_SNDLOWAT
+: <a class="el" href="group__lwip__opts__tcp.html#gae5c9866d7cd463ac7b36792182145aec">opt.h</a>
+</li>
+<li>tcp_sndqueuelen
+: <a class="el" href="group__tcp__raw.html#ga53ee4364718e84dc42cb1e0179deb1f4">tcp.h</a>
+</li>
+<li>TCP_SNDQUEUELOWAT
+: <a class="el" href="group__lwip__opts__tcp.html#ga75659867592a6b01c198532ed1b65698">opt.h</a>
+</li>
+<li>TCP_STATS
+: <a class="el" href="group__lwip__opts__stats.html#gaa02ec5c5bc0edebe418680c54d044f58">opt.h</a>
+</li>
+<li>TCP_SYNMAXRTX
+: <a class="el" href="group__lwip__opts__tcp.html#ga50b434a8541a4813f7b27f576c05d1b6">opt.h</a>
+</li>
+<li>TCP_TTL
+: <a class="el" href="group__lwip__opts__tcp.html#gacd5b25ea81d2894790d25da5393cdab4">opt.h</a>
+</li>
+<li>TCP_WND
+: <a class="el" href="group__lwip__opts__tcp.html#ga7f535a6efb5cdf86c3210e35ece1d6a7">opt.h</a>
+</li>
+<li>TCP_WND_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga3704f433e947d6342da77c74e33627e1">opt.h</a>
+</li>
+<li>TCP_WND_UPDATE_THRESHOLD
+: <a class="el" href="group__lwip__opts__tcp.html#ga5d45732ba3a8438b141096d86e07ef8d">opt.h</a>
+</li>
+<li>tcpip_callback_with_block
+: <a class="el" href="group__lwip__os.html#gacd0a865623921ada2dd08962eb82c9df">tcpip.h</a>
+</li>
+<li>TCPIP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga52d6c83451936c3de3b0338d4a3f921f">opt.h</a>
+</li>
+<li>TCPIP_MBOX_SIZE
+: <a class="el" href="group__lwip__opts__thread.html#ga8cf210ad4e4bf616860a45fbd140fd06">opt.h</a>
+</li>
+<li>TCPIP_THREAD_NAME
+: <a class="el" href="group__lwip__opts__thread.html#ga405e604e4328e1feb878c6fe1798a587">opt.h</a>
+</li>
+<li>TCPIP_THREAD_PRIO
+: <a class="el" href="group__lwip__opts__thread.html#ga42b2c7a3042d7c3efd00f367f5837435">opt.h</a>
+</li>
+<li>TCPIP_THREAD_STACKSIZE
+: <a class="el" href="group__lwip__opts__thread.html#gaa02b84eafa0c8b09b158b97c96d79db0">opt.h</a>
+</li>
+<li>TF_RESET
+: <a class="el" href="tcp__priv_8h.html#ac9dbdaeac3e25f5badf3a763a1b0b990">tcp_priv.h</a>
+</li>
+<li>TFTP_DEBUG
+: <a class="el" href="group__tftp__opts.html#ga2dd54a1d0c3006527b8a7a8604b81981">tftp_opts.h</a>
+</li>
+<li>TFTP_MAX_FILENAME_LEN
+: <a class="el" href="group__tftp__opts.html#ga8e975900b4397313f1a649ff76a3063b">tftp_opts.h</a>
+</li>
+<li>TFTP_MAX_MODE_LEN
+: <a class="el" href="group__tftp__opts.html#gaa8a449c25e37be757f5efccd422c9055">tftp_opts.h</a>
+</li>
+<li>TFTP_MAX_RETRIES
+: <a class="el" href="group__tftp__opts.html#ga6a01757ad942eb602e8a87e2be42d313">tftp_opts.h</a>
+</li>
+<li>TFTP_PORT
+: <a class="el" href="group__tftp__opts.html#gad9230620a5d3bb87a7ac280ff99875d1">tftp_opts.h</a>
+</li>
+<li>TFTP_TIMEOUT_MSECS
+: <a class="el" href="group__tftp__opts.html#ga36986e5465dc2ccb6184fc57f9a37d63">tftp_opts.h</a>
+</li>
+<li>TFTP_TIMER_MSECS
+: <a class="el" href="group__tftp__opts.html#ga3e6caacb3f4d43f780b2d68ffe4258ea">tftp_opts.h</a>
+</li>
+<li>TIMERS_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga24a6644ba9cc82665a7bf209b3870c15">opt.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs_u.html b/doc/doxygen/output/html/globals_defs_u.html
new file mode 100644
index 0000000..f26c41a
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_u.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_u.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_u"></a>- u -</h3><ul>
+<li>UDP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga0393f312c5475a1c649b39ef9cfcaad4">opt.h</a>
+</li>
+<li>UDP_STATS
+: <a class="el" href="group__lwip__opts__stats.html#gaef64b11bf71f0d6d5bafaf6092462276">opt.h</a>
+</li>
+<li>UDP_TTL
+: <a class="el" href="group__lwip__opts__udp.html#ga97908a317bcba89174b5d1ccbdca0096">opt.h</a>
+</li>
+<li>UNLOCK_TCPIP_CORE
+: <a class="el" href="tcpip_8h.html#a915effea029b9c4891e1ec635eb1826d">tcpip.h</a>
+</li>
+<li>unmap_ipv4_mapped_ipv6
+: <a class="el" href="group__ipaddr.html#ga66b5a64b12128e3716bcf04ff91b5a57">ip_addr.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs_w.html b/doc/doxygen/output/html/globals_defs_w.html
new file mode 100644
index 0000000..eb20ba4
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_w.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_w.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_w"></a>- w -</h3><ul>
+<li>write
+: <a class="el" href="group__socket.html#ga0a651eb5fb5e6127f5e5153ce2251f3d">sockets.h</a>
+</li>
+<li>writev
+: <a class="el" href="group__socket.html#ga697fd916a65a10b4dcb54b8199346fee">sockets.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs_z.html b/doc/doxygen/output/html/globals_defs_z.html
new file mode 100644
index 0000000..648dd13
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_z.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_defs_z.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_z"></a>- z -</h3><ul>
+<li>ZEPIF_LOOPBACK
+: <a class="el" href="zepif_8c.html#a8cae594e71cf385076f7bda166729dcd">zepif.c</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_dup.js b/doc/doxygen/output/html/globals_dup.js
new file mode 100644
index 0000000..1c26625
--- /dev/null
+++ b/doc/doxygen/output/html/globals_dup.js
@@ -0,0 +1,22 @@
+var globals_dup =
+[
+    [ "a", "globals.html", null ],
+    [ "b", "globals_b.html", null ],
+    [ "c", "globals_c.html", null ],
+    [ "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 ],
+    [ "r", "globals_r.html", null ],
+    [ "s", "globals_s.html", null ],
+    [ "t", "globals_t.html", null ],
+    [ "u", "globals_u.html", null ],
+    [ "w", "globals_w.html", null ],
+    [ "z", "globals_z.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/globals_e.html b/doc/doxygen/output/html/globals_e.html
new file mode 100644
index 0000000..cca1e30
--- /dev/null
+++ b/doc/doxygen/output/html/globals_e.html
@@ -0,0 +1,288 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_e.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_e"></a>- e -</h3><ul>
+<li>EAI_NONAME
+: <a class="el" href="lwip_2netdb_8h.html#a0bb00f48d6ba1e8c55b7d85c8e3a19a7">netdb.h</a>
+</li>
+<li>ehttpc_result
+: <a class="el" href="group__httpc.html#ga49e34884b272b1e0ddae8da46c31d9a3">http_client.h</a>
+</li>
+<li>ERR_ABRT
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaf316b2c5eee4079820f7100849115142">err.h</a>
+</li>
+<li>ERR_ALREADY
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcae6f9c1e4c18ca844f7934307d4cc30e5">err.h</a>
+</li>
+<li>ERR_ARG
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab508ce0ebdf3ca735208b00a80a45c91">err.h</a>
+</li>
+<li>ERR_BUF
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca05c91366f1b5203a5db9a241b415cd63">err.h</a>
+</li>
+<li>ERR_CLSD
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa5176d9fecf8ec43d3bc49f4e6c3f7f5">err.h</a>
+</li>
+<li>ERR_CONN
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab0036c51817b5200bfe8157cc4115b27">err.h</a>
+</li>
+<li>err_enum_t
+: <a class="el" href="group__infrastructure__errors.html#gae2e66c7d13afc90ffecd6151680fbadc">err.h</a>
+</li>
+<li>ERR_IF
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca7d61d90449ae6788575e8e46d5d3bbc6">err.h</a>
+</li>
+<li>ERR_INPROGRESS
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca13e1dd0edca8a27b6abdf1524bde7929">err.h</a>
+</li>
+<li>ERR_ISCONN
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca8543e1d6422fed7b318d97e08dcbaa33">err.h</a>
+</li>
+<li>ERR_MEM
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaaaeafdbf3aecc46864daa3cd829c7e05">err.h</a>
+</li>
+<li>ERR_OK
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb">err.h</a>
+</li>
+<li>ERR_RST
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca759030525f1768a23dc086a5fd45b4e5">err.h</a>
+</li>
+<li>ERR_RTE
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca9448893187313c0c5a502ca9a9ad1c2a">err.h</a>
+</li>
+<li>err_t
+: <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err.h</a>
+</li>
+<li>ERR_TIMEOUT
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcac568baeb6407ef5e2630084ccbc34be8">err.h</a>
+</li>
+<li>ERR_USE
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca4ebdc2aa1dbd75f927845733a3fb1f8b">err.h</a>
+</li>
+<li>ERR_VAL
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa9a1c5a6fdeed0aad7fe41d538482bbd">err.h</a>
+</li>
+<li>ERR_WOULDBLOCK
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab9dcf89d46668b072192278fb907b7ad">err.h</a>
+</li>
+<li>ETH_ADDR
+: <a class="el" href="lwip_2prot_2ethernet_8h.html#a19c72ce98569e0fb55948a7587d704ee">ethernet.h</a>
+</li>
+<li>ETH_PAD_SIZE
+: <a class="el" href="group__lwip__opts__arp.html#gad7fa3b356ca7e603e848b069c4cc6276">opt.h</a>
+</li>
+<li>etharp_cleanup_netif()
+: <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
+: <a class="el" href="group__lwip__opts__debugmsg.html#gabff5d1e0b334f5b45bd2b8bbb675411e">opt.h</a>
+</li>
+<li>etharp_find_addr()
+: <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_FLAG_TRY_HARD
+: <a class="el" href="etharp_8c.html#a96f8787ca623e704da1d32ca7dd6d6d9">etharp.c</a>
+</li>
+<li>etharp_get_entry()
+: <a class="el" href="etharp_8c.html#ab93df7ccb26496100d45137541e863c8">etharp.c</a>
+, <a class="el" href="lwip_2etharp_8h.html#ab93df7ccb26496100d45137541e863c8">etharp.h</a>
+</li>
+<li>etharp_gratuitous
+: <a class="el" href="lwip_2etharp_8h.html#a83947dea159baf3420922084072e631e">etharp.h</a>
+</li>
+<li>etharp_input()
+: <a class="el" href="etharp_8c.html#a540a5506979693ef9ac4496db9bfa7d6">etharp.c</a>
+, <a class="el" href="lwip_2etharp_8h.html#a540a5506979693ef9ac4496db9bfa7d6">etharp.h</a>
+</li>
+<li>etharp_output()
+: <a class="el" href="etharp_8c.html#a19258c75a3778b6ed0c82f63a419502d">etharp.c</a>
+, <a class="el" href="lwip_2etharp_8h.html#a19258c75a3778b6ed0c82f63a419502d">etharp.h</a>
+</li>
+<li>etharp_query()
+: <a class="el" href="etharp_8c.html#ae180772e31346a0afeb707ad172dd19c">etharp.c</a>
+, <a class="el" href="lwip_2etharp_8h.html#ae180772e31346a0afeb707ad172dd19c">etharp.h</a>
+</li>
+<li>etharp_request()
+: <a class="el" href="etharp_8c.html#a3e56faced96841e615f88dd57d1b2b15">etharp.c</a>
+, <a class="el" href="lwip_2etharp_8h.html#a3e56faced96841e615f88dd57d1b2b15">etharp.h</a>
+</li>
+<li>etharp_state
+: <a class="el" href="etharp_8c.html#ae95dee9363e6d3417298e07380b2d383">etharp.c</a>
+</li>
+<li>ETHARP_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga3a8359abf4fff8ffdc449e5007f93275">opt.h</a>
+</li>
+<li>ETHARP_SUPPORT_STATIC_ENTRIES
+: <a class="el" href="group__lwip__opts__arp.html#ga4675829464156f3d665f4de171c212d7">opt.h</a>
+</li>
+<li>ETHARP_SUPPORT_VLAN
+: <a class="el" href="group__lwip__opts__arp.html#ga70ce0ecf56cf5fab000134e66d863f90">opt.h</a>
+</li>
+<li>ETHARP_TABLE_MATCH_NETIF
+: <a class="el" href="group__lwip__opts__arp.html#ga2f762eee309a545650f80fc8dcc19084">opt.h</a>
+</li>
+<li>etharp_tmr()
+: <a class="el" href="etharp_8c.html#a654f4dad71f7e2bc4820094648f37a26">etharp.c</a>
+, <a class="el" href="lwip_2etharp_8h.html#a654f4dad71f7e2bc4820094648f37a26">etharp.h</a>
+</li>
+<li>ethernet_input()
+: <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()
+: <a class="el" href="group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778">ethernet.c</a>
+, <a class="el" href="group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778">ethernet.h</a>
+</li>
+<li>ethip6_output()
+: <a class="el" href="ethip6_8c.html#ab5326546d33174f91f1fb0cc6d398bfd">ethip6.c</a>
+, <a class="el" href="ethip6_8h.html#ab5326546d33174f91f1fb0cc6d398bfd">ethip6.h</a>
+</li>
+<li>ETHTYPE_ARP
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a41217db03576ea59c44b28b248c39be5">ieee.h</a>
+</li>
+<li>ETHTYPE_ETHERCAT
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a5085a5fd5f9c9506124e93ea43ad2d7c">ieee.h</a>
+</li>
+<li>ETHTYPE_IP
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ac95756b20fde70b868ef4185dd221c79">ieee.h</a>
+</li>
+<li>ETHTYPE_IPV6
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aab26004eed559217be5dd466a79b1383">ieee.h</a>
+</li>
+<li>ETHTYPE_JUMBO
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a2511e8a31961bd742363b11b274b9dd1">ieee.h</a>
+</li>
+<li>ETHTYPE_LLDP
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a02eab0dd87f222a2d555ca38b1b8afcc">ieee.h</a>
+</li>
+<li>ETHTYPE_MRP
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad36caec44d8db59ff433a8bd3e92ad3e">ieee.h</a>
+</li>
+<li>ETHTYPE_PPPOE
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a8c0e8f68b90134eb4f1f17d3d2eb6f8c">ieee.h</a>
+</li>
+<li>ETHTYPE_PPPOEDISC
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a58c6f40d7cc3edb9455762938f3f6569">ieee.h</a>
+</li>
+<li>ETHTYPE_PROFINET
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a889eb8f716238d16ee3408f16a5cf19d">ieee.h</a>
+</li>
+<li>ETHTYPE_PTP
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aa3e9e834eef932d073028e28eb8793dc">ieee.h</a>
+</li>
+<li>ETHTYPE_QINQ
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a39a18006412cbb57536535bd9d378394">ieee.h</a>
+</li>
+<li>ETHTYPE_RARP
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a14292184cb41b279249319896d0e2b1f">ieee.h</a>
+</li>
+<li>ETHTYPE_SERCOS
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ab93419f8edf5692e91629ab92fce8a14">ieee.h</a>
+</li>
+<li>ETHTYPE_VLAN
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad8f84826d52d92ac24a477d1f03e7903">ieee.h</a>
+</li>
+<li>ETHTYPE_WOL
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a530a30feb9b87fd993da2bf83776cf9b">ieee.h</a>
+</li>
+<li>eui64_to_ble_addr()
+: <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>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_enum.html b/doc/doxygen/output/html/globals_enum.html
new file mode 100644
index 0000000..d6d524c
--- /dev/null
+++ b/doc/doxygen/output/html/globals_enum.html
@@ -0,0 +1,239 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_enum.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>dhcp6_option_idx
+: <a class="el" href="dhcp6_8c.html#ac4c519a2e10067f277d6b09e60919e9a">dhcp6.c</a>
+</li>
+<li>dhcp_option_idx
+: <a class="el" href="dhcp_8c.html#a8c3b584d223b995b48613ad96cb776a0">dhcp.c</a>
+</li>
+</ul>
+
+
+<h3><a id="index_e"></a>- e -</h3><ul>
+<li>ehttpc_result
+: <a class="el" href="group__httpc.html#ga49e34884b272b1e0ddae8da46c31d9a3">http_client.h</a>
+</li>
+<li>err_enum_t
+: <a class="el" href="group__infrastructure__errors.html#gae2e66c7d13afc90ffecd6151680fbadc">err.h</a>
+</li>
+<li>etharp_state
+: <a class="el" href="etharp_8c.html#ae95dee9363e6d3417298e07380b2d383">etharp.c</a>
+</li>
+</ul>
+
+
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>icmp6_dur_code
+: <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccf">icmp6.h</a>
+</li>
+<li>icmp6_pp_code
+: <a class="el" href="prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023">icmp6.h</a>
+</li>
+<li>icmp6_te_code
+: <a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e">icmp6.h</a>
+</li>
+<li>icmp6_type
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858">icmp6.h</a>
+</li>
+<li>icmp_dur_type
+: <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5">icmp.h</a>
+</li>
+<li>icmp_te_type
+: <a class="el" href="icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324a">icmp.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_l"></a>- l -</h3><ul>
+<li>lwip_iana_hwtype
+: <a class="el" href="group__iana.html#ga3d2bbfcb56c8adf3be8c8d12868cecfe">iana.h</a>
+</li>
+<li>lwip_iana_port_number
+: <a class="el" href="group__iana.html#gac9396d90585e49e9a287179bf5aa9ba0">iana.h</a>
+</li>
+<li>lwip_ieee_eth_type
+: <a class="el" href="group__ieee.html#gab3a7b97666b100584972d158acbbd1f4">ieee.h</a>
+</li>
+<li>lwip_ip_addr_type
+: <a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">ip_addr.h</a>
+</li>
+<li>lwip_ipv6_scope_type
+: <a class="el" href="group__ip6__zones.html#ga1993c4b6a297b6e92d80a9ce46ddedfe">ip6_zone.h</a>
+</li>
+<li>lwip_pollscan_opts
+: <a class="el" href="sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9">sockets.c</a>
+</li>
+<li>lwiperf_client_type
+: <a class="el" href="lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76c">lwiperf.h</a>
+</li>
+<li>lwiperf_report_type
+: <a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6">lwiperf.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_m"></a>- m -</h3><ul>
+<li>memp_t
+: <a class="el" href="memp_8h.html#a85a164b1f7764951cc685ea525114e57">memp.h</a>
+</li>
+<li>mqtt_connect_flag
+: <a class="el" href="mqtt_8c.html#a4f6c42ed730546ff755e3bb99989dd12">mqtt.c</a>
+</li>
+<li>mqtt_connection_status_t
+: <a class="el" href="group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d">mqtt.h</a>
+</li>
+<li>mqtt_message_type
+: <a class="el" href="mqtt_8c.html#ac243cf15beb51b2206e36da86c2f95f1">mqtt.c</a>
+</li>
+</ul>
+
+
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>netconn_evt
+: <a class="el" href="api_8h.html#af722260882d14c49afb765293ffb0155">api.h</a>
+</li>
+<li>netconn_igmp
+: <a class="el" href="api_8h.html#a5c6ded2c082de1536019b197a0a912db">api.h</a>
+</li>
+<li>netconn_state
+: <a class="el" href="api_8h.html#a2c6c9c1869f443c5ec7b31180a44fada">api.h</a>
+</li>
+<li>netconn_type
+: <a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">api.h</a>
+</li>
+<li>netif_mac_filter_action
+: <a class="el" href="netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0">netif.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>pbuf_layer
+: <a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf.h</a>
+</li>
+<li>pbuf_type
+: <a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_r"></a>- r -</h3><ul>
+<li>raw_input_state
+: <a class="el" href="raw__priv_8h.html#a2580ec946c4196127888d5405257866b">raw_priv.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>smtp_session_state
+: <a class="el" href="smtp_8c.html#a04947fff2d3a3803e6c716aecc7f2bae">smtp.c</a>
+</li>
+<li>snmp_access_t
+: <a class="el" href="snmp__core_8h.html#ad5a33687d1a6fcf970266b41b0633760">snmp_core.h</a>
+</li>
+<li>snmp_err_t
+: <a class="el" href="snmp__core_8h.html#abaa9cdad345ad93da515d31625a54589">snmp_core.h</a>
+</li>
+<li>snmp_ifType
+: <a class="el" href="group__netif__mib2.html#ga15378b8dcd2a9dc2985142d864a767ba">snmp.h</a>
+</li>
+<li>snmp_table_column_data_type_t
+: <a class="el" href="snmp__table_8h.html#af9b59f3ba7dccf338fe6e5bc1c4b1db5">snmp_table.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_eval.html b/doc/doxygen/output/html/globals_eval.html
new file mode 100644
index 0000000..ca3c092
--- /dev/null
+++ b/doc/doxygen/output/html/globals_eval.html
@@ -0,0 +1,567 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_eval.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_e"></a>- e -</h3><ul>
+<li>ERR_ABRT
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaf316b2c5eee4079820f7100849115142">err.h</a>
+</li>
+<li>ERR_ALREADY
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcae6f9c1e4c18ca844f7934307d4cc30e5">err.h</a>
+</li>
+<li>ERR_ARG
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab508ce0ebdf3ca735208b00a80a45c91">err.h</a>
+</li>
+<li>ERR_BUF
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca05c91366f1b5203a5db9a241b415cd63">err.h</a>
+</li>
+<li>ERR_CLSD
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa5176d9fecf8ec43d3bc49f4e6c3f7f5">err.h</a>
+</li>
+<li>ERR_CONN
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab0036c51817b5200bfe8157cc4115b27">err.h</a>
+</li>
+<li>ERR_IF
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca7d61d90449ae6788575e8e46d5d3bbc6">err.h</a>
+</li>
+<li>ERR_INPROGRESS
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca13e1dd0edca8a27b6abdf1524bde7929">err.h</a>
+</li>
+<li>ERR_ISCONN
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca8543e1d6422fed7b318d97e08dcbaa33">err.h</a>
+</li>
+<li>ERR_MEM
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaaaeafdbf3aecc46864daa3cd829c7e05">err.h</a>
+</li>
+<li>ERR_OK
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb">err.h</a>
+</li>
+<li>ERR_RST
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca759030525f1768a23dc086a5fd45b4e5">err.h</a>
+</li>
+<li>ERR_RTE
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca9448893187313c0c5a502ca9a9ad1c2a">err.h</a>
+</li>
+<li>ERR_TIMEOUT
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcac568baeb6407ef5e2630084ccbc34be8">err.h</a>
+</li>
+<li>ERR_USE
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca4ebdc2aa1dbd75f927845733a3fb1f8b">err.h</a>
+</li>
+<li>ERR_VAL
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa9a1c5a6fdeed0aad7fe41d538482bbd">err.h</a>
+</li>
+<li>ERR_WOULDBLOCK
+: <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab9dcf89d46668b072192278fb907b7ad">err.h</a>
+</li>
+<li>ETHTYPE_ARP
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a41217db03576ea59c44b28b248c39be5">ieee.h</a>
+</li>
+<li>ETHTYPE_ETHERCAT
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a5085a5fd5f9c9506124e93ea43ad2d7c">ieee.h</a>
+</li>
+<li>ETHTYPE_IP
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ac95756b20fde70b868ef4185dd221c79">ieee.h</a>
+</li>
+<li>ETHTYPE_IPV6
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aab26004eed559217be5dd466a79b1383">ieee.h</a>
+</li>
+<li>ETHTYPE_JUMBO
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a2511e8a31961bd742363b11b274b9dd1">ieee.h</a>
+</li>
+<li>ETHTYPE_LLDP
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a02eab0dd87f222a2d555ca38b1b8afcc">ieee.h</a>
+</li>
+<li>ETHTYPE_MRP
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad36caec44d8db59ff433a8bd3e92ad3e">ieee.h</a>
+</li>
+<li>ETHTYPE_PPPOE
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a8c0e8f68b90134eb4f1f17d3d2eb6f8c">ieee.h</a>
+</li>
+<li>ETHTYPE_PPPOEDISC
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a58c6f40d7cc3edb9455762938f3f6569">ieee.h</a>
+</li>
+<li>ETHTYPE_PROFINET
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a889eb8f716238d16ee3408f16a5cf19d">ieee.h</a>
+</li>
+<li>ETHTYPE_PTP
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aa3e9e834eef932d073028e28eb8793dc">ieee.h</a>
+</li>
+<li>ETHTYPE_QINQ
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a39a18006412cbb57536535bd9d378394">ieee.h</a>
+</li>
+<li>ETHTYPE_RARP
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a14292184cb41b279249319896d0e2b1f">ieee.h</a>
+</li>
+<li>ETHTYPE_SERCOS
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ab93419f8edf5692e91629ab92fce8a14">ieee.h</a>
+</li>
+<li>ETHTYPE_VLAN
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad8f84826d52d92ac24a477d1f03e7903">ieee.h</a>
+</li>
+<li>ETHTYPE_WOL
+: <a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a530a30feb9b87fd993da2bf83776cf9b">ieee.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_h"></a>- h -</h3><ul>
+<li>HTTPC_RESULT_ERR_CLOSED
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a89a6700abb14dd7cab9b4e0fd66e5fd6">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_ERR_CONNECT
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ab866d5433b4c4593c80b756d434e1d09">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_ERR_CONTENT_LEN
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a6c8a4195834e1997a498a03bb47bb096">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_ERR_HOSTNAME
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ae04714f90692c122e6c85e06083dbc6d">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_ERR_MEM
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a49972833ec01c7a10dee734c7c69ed62">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_ERR_SVR_RESP
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3aaa023a6f8069c02c87a826ba323c54b8">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_ERR_TIMEOUT
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a8e6c597f88335b31e6a8b078a32fde33">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_ERR_UNKNOWN
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a5026187026abd1d242333ba6ff69ddbd">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_LOCAL_ABORT
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3adf4e45365923c16b6a6879bde5f60867">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_OK
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3af3173d4d272c9c0b5a5c9b5b027e3659">http_client.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>ICMP6_DUR_ADDRESS
+: <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa789ef8158d8750b0fa5a14ec9ecaa23a">icmp6.h</a>
+</li>
+<li>ICMP6_DUR_NO_ROUTE
+: <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa695bb4d92f32b504a9483ff137235a78">icmp6.h</a>
+</li>
+<li>ICMP6_DUR_POLICY
+: <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfac3c255282e0b49b5bbb3cd8f435bb763">icmp6.h</a>
+</li>
+<li>ICMP6_DUR_PORT
+: <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa28cc924ec6eaa761acb76ccef4adcba0">icmp6.h</a>
+</li>
+<li>ICMP6_DUR_PROHIBITED
+: <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa251961b990d0fbaf2c643f047c4f2532">icmp6.h</a>
+</li>
+<li>ICMP6_DUR_REJECT_ROUTE
+: <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa2aeed278149fb071a34beec89df03b5c">icmp6.h</a>
+</li>
+<li>ICMP6_DUR_SCOPE
+: <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfabdb01a67c61da588872f5799ef75aa6e">icmp6.h</a>
+</li>
+<li>ICMP6_PP_FIELD
+: <a class="el" href="prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a4aa4a79306a69fd4f60ad445cde4c2a9">icmp6.h</a>
+</li>
+<li>ICMP6_PP_HEADER
+: <a class="el" href="prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023acbcc58901e2345ffc31df4098de60ff8">icmp6.h</a>
+</li>
+<li>ICMP6_PP_OPTION
+: <a class="el" href="prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a53884832d00d3c8f8de62cfdb4646932">icmp6.h</a>
+</li>
+<li>ICMP6_TE_FRAG
+: <a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eaec493420d61c80a21981b1aa32befe1f">icmp6.h</a>
+</li>
+<li>ICMP6_TE_HL
+: <a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eacccbb5e776df1b35af4149e593240880">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_DUR
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aad9d4f207459e4bbd0c33a25adf6fdd7">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_EREP
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac6b91695c06bfc7fb2360310d7b8e78a">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_EREQ
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae649aa45c97b885f28771688957528a3">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_MLD
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a04228a1d11f9f88bd165f3430188bfe7">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_MLQ
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ad9794ae12b9ca196cc4fafaf6d834375">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_MLR
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a906dd689f0aa9b4796f49f299d4e3eb0">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_MRA
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a29281016d3bb58e3bfd90417bbce7aa0">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_MRS
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a425f4e64a7d1570228adbbe450650ab4">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_MRT
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afb12a9d774f53deb15ec23041548f6fc">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_NA
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1f99d333f425c28d3840e029cc9c46f3">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_NS
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0d8d8717c6c34053d1101932c23929fe">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_PE1
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac7020c08a7b03ae2a198e4a8dcd31bd4">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_PE2
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aed14d280e5911098af914a94bd3ab22b">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_PE3
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a9c9c358ebd5eb683a66819fd9ecf98c6">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_PE4
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858af8ebe97c4f68b54c9ef0c43e98211df5">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_PP
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a63114feac8140031b74424d4a7cf6b26">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_PTB
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1d52ef5024a5822bd622bcb0b9da323d">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_RA
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae4ae04be7df3a2cce614af0a5cdae951">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_RD
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0f6702d62de5f873e0afe7431d878207">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_RS
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a670d95494c9282f646ac442d81d9a780">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_RSV_ERR
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858abe61415e020b996220337f0cd002a28f">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_RSV_INF
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a2c12d3244d837bd243ea647ec530600d">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_TE
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afae9848904bc4b4b4aa716a7a9a2d7fe">icmp6.h</a>
+</li>
+<li>ICMP_DUR_FRAG
+: <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a8be2bc49d42aa1a6ee1da93a8700ef5f">icmp.h</a>
+</li>
+<li>ICMP_DUR_HOST
+: <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a648ab915a76dfb7b9568e94de00da1e7">icmp.h</a>
+</li>
+<li>ICMP_DUR_NET
+: <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3cc3714544e123bdef2eadb1a4d320e3">icmp.h</a>
+</li>
+<li>ICMP_DUR_PORT
+: <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5ac973dd9b04e094043ccc4cf875ef5644">icmp.h</a>
+</li>
+<li>ICMP_DUR_PROTO
+: <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3c7bbd13b613990413ef167017dfbcef">icmp.h</a>
+</li>
+<li>ICMP_DUR_SR
+: <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5af63296fc25f79e56946a56a8da132c13">icmp.h</a>
+</li>
+<li>ICMP_TE_FRAG
+: <a class="el" href="icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa4d351874c3e2d4a4cf46569df28cd796">icmp.h</a>
+</li>
+<li>ICMP_TE_TTL
+: <a class="el" href="icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa827a1f8705826a6cc3c22e2571acf02c">icmp.h</a>
+</li>
+<li>IP6_MULTICAST
+: <a class="el" href="group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfea70cda997b66f3e120e925c5a41904809">ip6_zone.h</a>
+</li>
+<li>IP6_UNICAST
+: <a class="el" href="group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0">ip6_zone.h</a>
+</li>
+<li>IP6_UNKNOWN
+: <a class="el" href="group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8">ip6_zone.h</a>
+</li>
+<li>IPADDR_TYPE_ANY
+: <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e">ip_addr.h</a>
+</li>
+<li>IPADDR_TYPE_V4
+: <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">ip_addr.h</a>
+</li>
+<li>IPADDR_TYPE_V6
+: <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">ip_addr.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_l"></a>- l -</h3><ul>
+<li>LWIP_IANA_HWTYPE_ETHERNET
+: <a class="el" href="group__iana.html#gga3d2bbfcb56c8adf3be8c8d12868cecfea89e82e6ac55811bb26fe66ec029f2a0c">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_DHCP_CLIENT
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a9fcae1f16758e1ac35dab343fc897f40">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_DHCP_SERVER
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ac70ae96c985cf3660e26aa496094916d">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_HTTP
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_HTTPS
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_MDNS
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a839da325f45916d7b27d53d5e5e97dc6">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_MQTT
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_NETBIOS
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae1cf6eaab024b31aff5bf407d38e0ede">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_SECURE_MQTT
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_SMTP
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae2645895203ca3c54005afad053a813c">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_SMTPS
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a88f8872246977c6e24c617266ada1a3b">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_SNMP
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aeb10a37f0c48e053b138f65b843c45d3">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_SNMP_TRAP
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aff60c0d3e8eca210b7e4faca3491f4a8">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_SNTP
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_TFTP
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050">iana.h</a>
+</li>
+<li>LWIP_POLLSCAN_CLEAR
+: <a class="el" href="sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9aa9a8fe3199d00016f1f5ad639e1b28f7">sockets.c</a>
+</li>
+<li>LWIP_POLLSCAN_DEC_WAIT
+: <a class="el" href="sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9a6c1eefa3e29a39b923c4b522eb1b3eb1">sockets.c</a>
+</li>
+<li>LWIP_POLLSCAN_INC_WAIT
+: <a class="el" href="sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9ab6511d3104f70c18fb4bd80f24cb867d">sockets.c</a>
+</li>
+<li>LWIPERF_CLIENT
+: <a class="el" href="lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cae1862655ebaaea2e7e0261dff0173110">lwiperf.h</a>
+</li>
+<li>LWIPERF_DUAL
+: <a class="el" href="lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cab0381feca6655968e7380622e7a63ede">lwiperf.h</a>
+</li>
+<li>LWIPERF_TCP_ABORTED_LOCAL
+: <a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6abee2bf6da51a0845c15ac52b280203cb">lwiperf.h</a>
+</li>
+<li>LWIPERF_TCP_ABORTED_LOCAL_DATAERROR
+: <a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6adda7e5dbaf1e04eb04ec0fd2b05584a5">lwiperf.h</a>
+</li>
+<li>LWIPERF_TCP_ABORTED_LOCAL_TXERROR
+: <a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a3d4e1f5742d80aeafb6b22aa74d93e40">lwiperf.h</a>
+</li>
+<li>LWIPERF_TCP_ABORTED_REMOTE
+: <a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6ae664c0f987584f07fb0f6f8896aada0d">lwiperf.h</a>
+</li>
+<li>LWIPERF_TCP_DONE_CLIENT
+: <a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a4f9bde0cad305eaab25d2c1d0196677b">lwiperf.h</a>
+</li>
+<li>LWIPERF_TCP_DONE_SERVER
+: <a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6aa52255236ad2983346311ce7f28210e5">lwiperf.h</a>
+</li>
+<li>LWIPERF_TRADEOFF
+: <a class="el" href="lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76caccdab7ee6e1b0981861e66f0755f7964">lwiperf.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_m"></a>- m -</h3><ul>
+<li>MQTT_CONNECT_ACCEPTED
+: <a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da074dc1d289b8e8d4aad91f6a2cb93dc1">mqtt.h</a>
+</li>
+<li>MQTT_CONNECT_DISCONNECTED
+: <a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da321f5ce31b173f235de1a517fcfd00dd">mqtt.h</a>
+</li>
+<li>MQTT_CONNECT_REFUSED_IDENTIFIER
+: <a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da28ffe49b0175adaa2b9a27cb4873224a">mqtt.h</a>
+</li>
+<li>MQTT_CONNECT_REFUSED_NOT_AUTHORIZED_
+: <a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dafc4888158dd6ee84269a5f0bfdc12b17">mqtt.h</a>
+</li>
+<li>MQTT_CONNECT_REFUSED_PROTOCOL_VERSION
+: <a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da41f8aa97142be337cb639f94d9145190">mqtt.h</a>
+</li>
+<li>MQTT_CONNECT_REFUSED_SERVER
+: <a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a">mqtt.h</a>
+</li>
+<li>MQTT_CONNECT_REFUSED_USERNAME_PASS
+: <a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da290cf9037054c42022cc864cfade896a">mqtt.h</a>
+</li>
+<li>MQTT_CONNECT_TIMEOUT
+: <a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62">mqtt.h</a>
+</li>
+<li>MQTT_DATA_FLAG_LAST
+: <a class="el" href="group__mqtt.html#gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f">mqtt.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>NETCONN_RAW
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a0d828a7e9c1614d4cae56602b09f39e9">api.h</a>
+</li>
+<li>NETCONN_TCP
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a75d14318b91af7a452230189f47e5e1a">api.h</a>
+</li>
+<li>NETCONN_TCP_IPV6
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91ae7efa7c4e50b7b381531a2136cd5a013">api.h</a>
+</li>
+<li>NETCONN_UDP
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a6b8ec191d69f7e639f4ab40779069636">api.h</a>
+</li>
+<li>NETCONN_UDP_IPV6
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a34ee1c89f6705462590a4fe2c9772d9e">api.h</a>
+</li>
+<li>NETCONN_UDPLITE
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a655e1625cc7e6a93f1e3d2646f56a1e4">api.h</a>
+</li>
+<li>NETCONN_UDPLITE_IPV6
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91aa9cabc9d90606b5c5939fcc02ac588c7">api.h</a>
+</li>
+<li>NETCONN_UDPNOCHKSUM
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a7e0c3f566b3d4321b36b711b6b1ad6de">api.h</a>
+</li>
+<li>NETCONN_UDPNOCHKSUM_IPV6
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a2c7f548d26f6c411f084b6c59247b60e">api.h</a>
+</li>
+<li>NETIF_ADD_MAC_FILTER
+: <a class="el" href="netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a4186fbaf94be956ea1a3b02cd1cccb1f">netif.h</a>
+</li>
+<li>NETIF_DEL_MAC_FILTER
+: <a class="el" href="netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a7ad3406353906deb4e64ebeed349e07e">netif.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>PBUF_IP
+: <a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfafcc1e506061ba69dfa142eb6b3da5f13">pbuf.h</a>
+</li>
+<li>PBUF_LINK
+: <a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfab4de441e737330558b609a990cd17346">pbuf.h</a>
+</li>
+<li>PBUF_POOL
+: <a class="el" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbae969347127387b9b59a23ccd24b76d21">pbuf.h</a>
+</li>
+<li>PBUF_RAM
+: <a class="el" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac5e9f28455bca98944a030d4b84ecfab">pbuf.h</a>
+</li>
+<li>PBUF_RAW
+: <a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba">pbuf.h</a>
+</li>
+<li>PBUF_RAW_TX
+: <a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa0ff039585f05f9208bcb66c2d37783e2">pbuf.h</a>
+</li>
+<li>PBUF_REF
+: <a class="el" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac9b6ba960fdea6f2e8f35c8313b77e4e">pbuf.h</a>
+</li>
+<li>PBUF_ROM
+: <a class="el" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac120b0fe39efe35bb682e4aa3b82e2c9">pbuf.h</a>
+</li>
+<li>PBUF_TRANSPORT
+: <a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa2ded3594a3977f8bf9cf09552be327b5">pbuf.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_f.html b/doc/doxygen/output/html/globals_f.html
new file mode 100644
index 0000000..cba84f4
--- /dev/null
+++ b/doc/doxygen/output/html/globals_f.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_f.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_f"></a>- f -</h3><ul>
+<li>fcntl
+: <a class="el" href="group__socket.html#gaaa2b0e00cab161fcc4b31ee0d06e7eb3">sockets.h</a>
+</li>
+<li>FOLD_U32T
+: <a class="el" href="inet__chksum_8h.html#a6ffe83b4bdd1784a0671ee4778966a01">inet_chksum.h</a>
+</li>
+<li>freeaddrinfo
+: <a class="el" href="group__netdbapi.html#gab28cd3049bcf6e2bc3a71e968a64a92d">netdb.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_func.html b/doc/doxygen/output/html/globals_func.html
new file mode 100644
index 0000000..48cc755
--- /dev/null
+++ b/doc/doxygen/output/html/globals_func.html
@@ -0,0 +1,269 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_func.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_a"></a>- a -</h3><ul>
+<li>altcp_abort()
+: <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()
+: <a class="el" href="group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9">altcp.h</a>
+, <a class="el" href="group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9">altcp.c</a>
+</li>
+<li>altcp_alloc()
+: <a class="el" href="altcp_8c.html#a6a99f8757c18fbc9b9f30925afbcf4c2">altcp.c</a>
+, <a class="el" href="altcp__priv_8h.html#a6a99f8757c18fbc9b9f30925afbcf4c2">altcp_priv.h</a>
+</li>
+<li>altcp_arg()
+: <a class="el" href="group__altcp.html#ga197a33af038556a04d8f27c7033d771f">altcp.h</a>
+, <a class="el" href="group__altcp.html#ga197a33af038556a04d8f27c7033d771f">altcp.c</a>
+</li>
+<li>altcp_bind()
+: <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()
+: <a class="el" href="group__altcp.html#ga4329798afdf3709c789a2ee060ee3993">altcp.c</a>
+, <a class="el" href="group__altcp.html#ga4329798afdf3709c789a2ee060ee3993">altcp.h</a>
+</li>
+<li>altcp_connect()
+: <a class="el" href="group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492">altcp.c</a>
+, <a class="el" href="group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492">altcp.h</a>
+</li>
+<li>altcp_err()
+: <a class="el" href="group__altcp.html#gadc76a1f3b2448559dc87da1b33291644">altcp.h</a>
+, <a class="el" href="group__altcp.html#gadc76a1f3b2448559dc87da1b33291644">altcp.c</a>
+</li>
+<li>altcp_free()
+: <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()
+: <a class="el" href="group__altcp.html#gac69722b86b1198916f2527fb9f132c2b">altcp.c</a>
+, <a class="el" href="group__altcp.html#gac69722b86b1198916f2527fb9f132c2b">altcp.h</a>
+</li>
+<li>altcp_mss()
+: <a class="el" href="group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08">altcp.c</a>
+, <a class="el" href="group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08">altcp.h</a>
+</li>
+<li>altcp_new()
+: <a class="el" href="group__altcp.html#ga86843287b0ad0099c067817cfb7aa336">altcp.c</a>
+, <a class="el" href="group__altcp.html#ga86843287b0ad0099c067817cfb7aa336">altcp.h</a>
+</li>
+<li>altcp_new_ip6()
+: <a class="el" href="group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1">altcp.c</a>
+, <a class="el" href="group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1">altcp.h</a>
+</li>
+<li>altcp_new_ip_type()
+: <a class="el" href="group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21">altcp.c</a>
+, <a class="el" href="group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21">altcp.h</a>
+</li>
+<li>altcp_output()
+: <a class="el" href="group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6">altcp.c</a>
+, <a class="el" href="group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6">altcp.h</a>
+</li>
+<li>altcp_poll()
+: <a class="el" href="group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0">altcp.h</a>
+, <a class="el" href="group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0">altcp.c</a>
+</li>
+<li>altcp_proxyconnect_alloc()
+: <a class="el" href="altcp__proxyconnect_8c.html#a3d3af45390467ceeaa064b7e28dd43a9">altcp_proxyconnect.c</a>
+, <a class="el" href="altcp__proxyconnect_8h.html#a3d3af45390467ceeaa064b7e28dd43a9">altcp_proxyconnect.h</a>
+</li>
+<li>altcp_proxyconnect_new()
+: <a class="el" href="altcp__proxyconnect_8c.html#ae774782064a92d0f58ce07b57a5360d1">altcp_proxyconnect.c</a>
+, <a class="el" href="altcp__proxyconnect_8h.html#ae774782064a92d0f58ce07b57a5360d1">altcp_proxyconnect.h</a>
+</li>
+<li>altcp_proxyconnect_new_tcp()
+: <a class="el" href="altcp__proxyconnect_8c.html#a24e122d2bc2c0b9f86074c1e8d5ccfe4">altcp_proxyconnect.c</a>
+, <a class="el" href="altcp__proxyconnect_8h.html#a24e122d2bc2c0b9f86074c1e8d5ccfe4">altcp_proxyconnect.h</a>
+</li>
+<li>altcp_proxyconnect_tls_alloc()
+: <a class="el" href="altcp__proxyconnect_8c.html#a5ff49bcd035847a8915f18deef4172a9">altcp_proxyconnect.c</a>
+, <a class="el" href="altcp__proxyconnect_8h.html#a5ff49bcd035847a8915f18deef4172a9">altcp_proxyconnect.h</a>
+</li>
+<li>altcp_recv()
+: <a class="el" href="group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71">altcp.c</a>
+, <a class="el" href="group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71">altcp.h</a>
+</li>
+<li>altcp_recved()
+: <a class="el" href="group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83">altcp.c</a>
+, <a class="el" href="group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83">altcp.h</a>
+</li>
+<li>altcp_sent()
+: <a class="el" href="group__altcp.html#gab2b228c77c827fb14bfc513171c79f47">altcp.c</a>
+, <a class="el" href="group__altcp.html#gab2b228c77c827fb14bfc513171c79f47">altcp.h</a>
+</li>
+<li>altcp_setprio()
+: <a class="el" href="group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5">altcp.c</a>
+, <a class="el" href="group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5">altcp.h</a>
+</li>
+<li>altcp_shutdown()
+: <a class="el" href="group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319">altcp.c</a>
+, <a class="el" href="group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319">altcp.h</a>
+</li>
+<li>altcp_sndbuf()
+: <a class="el" href="group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c">altcp.c</a>
+, <a class="el" href="group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c">altcp.h</a>
+</li>
+<li>altcp_sndqueuelen()
+: <a class="el" href="group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5">altcp.c</a>
+, <a class="el" href="group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5">altcp.h</a>
+</li>
+<li>altcp_tcp_alloc()
+: <a class="el" href="altcp__tcp_8h.html#a211215e43cb40bd204a20c34316b7caa">altcp_tcp.h</a>
+, <a class="el" href="altcp__tcp_8c.html#a211215e43cb40bd204a20c34316b7caa">altcp_tcp.c</a>
+</li>
+<li>altcp_tls_alloc()
+: <a class="el" href="group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391">altcp_tls.h</a>
+, <a class="el" href="group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391">altcp_alloc.c</a>
+</li>
+<li>altcp_tls_context()
+: <a class="el" href="group__altcp__tls.html#gabc1741530d5089c3093889416430bc76">altcp_tls.h</a>
+</li>
+<li>altcp_tls_create_config_client()
+: <a class="el" href="group__altcp__tls.html#ga2b249447e10c8599b6d723d403086c35">altcp_tls.h</a>
+</li>
+<li>altcp_tls_create_config_client_2wayauth()
+: <a class="el" href="group__altcp__tls.html#ga7352a4600fee89e167541cf0776c01fb">altcp_tls.h</a>
+</li>
+<li>altcp_tls_create_config_server_privkey_cert()
+: <a class="el" href="group__altcp__tls.html#ga700dc0320e93cea337673e7d4295e161">altcp_tls.h</a>
+</li>
+<li>altcp_tls_free_config()
+: <a class="el" href="group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145">altcp_tls.h</a>
+</li>
+<li>altcp_tls_new()
+: <a class="el" href="group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a">altcp_alloc.c</a>
+, <a class="el" href="group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a">altcp_tls.h</a>
+</li>
+<li>altcp_tls_wrap()
+: <a class="el" href="group__altcp__tls.html#gab874adb7f87984c0520bd032c2108c47">altcp_tls.h</a>
+</li>
+<li>altcp_write()
+: <a class="el" href="group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d">altcp.h</a>
+, <a class="el" href="group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d">altcp.c</a>
+</li>
+<li>autoip_arp_reply()
+: <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()
+: <a class="el" href="autoip_8h.html#a11df7a20d52680cd8c1c18fba2b91e9e">autoip.h</a>
+, <a class="el" href="autoip_8c.html#a11df7a20d52680cd8c1c18fba2b91e9e">autoip.c</a>
+</li>
+<li>autoip_set_struct()
+: <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()
+: <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()
+: <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()
+: <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()
+: <a class="el" href="autoip_8c.html#a746fc1d7db1bf1617afae166c9d92c2d">autoip.c</a>
+, <a class="el" href="autoip_8h.html#a746fc1d7db1bf1617afae166c9d92c2d">autoip.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_func.js b/doc/doxygen/output/html/globals_func.js
new file mode 100644
index 0000000..adcb785
--- /dev/null
+++ b/doc/doxygen/output/html/globals_func.js
@@ -0,0 +1,18 @@
+var globals_func =
+[
+    [ "a", "globals_func.html", null ],
+    [ "b", "globals_func_b.html", null ],
+    [ "d", "globals_func_d.html", null ],
+    [ "e", "globals_func_e.html", null ],
+    [ "h", "globals_func_h.html", null ],
+    [ "i", "globals_func_i.html", null ],
+    [ "l", "globals_func_l.html", null ],
+    [ "m", "globals_func_m.html", null ],
+    [ "n", "globals_func_n.html", null ],
+    [ "p", "globals_func_p.html", null ],
+    [ "r", "globals_func_r.html", null ],
+    [ "s", "globals_func_s.html", null ],
+    [ "t", "globals_func_t.html", null ],
+    [ "u", "globals_func_u.html", null ],
+    [ "z", "globals_func_z.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/globals_func_b.html b/doc/doxygen/output/html/globals_func_b.html
new file mode 100644
index 0000000..cbda014
--- /dev/null
+++ b/doc/doxygen/output/html/globals_func_b.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_func_b.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_b"></a>- b -</h3><ul>
+<li>ble_addr_to_eui64()
+: <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>bridgeif_add_port()
+: <a class="el" href="group__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77">bridgeif.c</a>
+, <a class="el" href="group__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77">bridgeif.h</a>
+</li>
+<li>bridgeif_fdb_add()
+: <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()
+: <a class="el" href="group__bridgeif__fdb.html#ga616fb7404be5da79d8092b4a14976750">bridgeif_fdb.c</a>
+, <a class="el" href="group__bridgeif__fdb.html#ga616fb7404be5da79d8092b4a14976750">bridgeif.h</a>
+</li>
+<li>bridgeif_fdb_init()
+: <a class="el" href="group__bridgeif__fdb.html#gaf7935226ee7f99f964bf0135b6cb9ca0">bridgeif.h</a>
+, <a class="el" href="group__bridgeif__fdb.html#gaf7935226ee7f99f964bf0135b6cb9ca0">bridgeif_fdb.c</a>
+</li>
+<li>bridgeif_fdb_remove()
+: <a class="el" href="group__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8">bridgeif.h</a>
+, <a class="el" href="group__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8">bridgeif.c</a>
+</li>
+<li>bridgeif_fdb_update_src()
+: <a class="el" href="group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39">bridgeif.h</a>
+, <a class="el" href="group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39">bridgeif_fdb.c</a>
+</li>
+<li>bridgeif_init()
+: <a class="el" href="group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c">bridgeif.h</a>
+, <a class="el" href="group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c">bridgeif.c</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_func_d.html b/doc/doxygen/output/html/globals_func_d.html
new file mode 100644
index 0000000..4026eb6
--- /dev/null
+++ b/doc/doxygen/output/html/globals_func_d.html
@@ -0,0 +1,203 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_func_d.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>dhcp6_cleanup()
+: <a class="el" href="group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde">dhcp6.c</a>
+, <a class="el" href="group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde">dhcp6.h</a>
+</li>
+<li>dhcp6_disable()
+: <a class="el" href="group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2">dhcp6.h</a>
+, <a class="el" href="group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2">dhcp6.c</a>
+</li>
+<li>dhcp6_enable_stateful()
+: <a class="el" href="group__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619">dhcp6.c</a>
+, <a class="el" href="group__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619">dhcp6.h</a>
+</li>
+<li>dhcp6_enable_stateless()
+: <a class="el" href="group__dhcp6.html#gaf3349463541e673fec33843eb019b18c">dhcp6.h</a>
+, <a class="el" href="group__dhcp6.html#gaf3349463541e673fec33843eb019b18c">dhcp6.c</a>
+</li>
+<li>dhcp6_nd6_ra_trigger()
+: <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()
+: <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()
+: <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()
+: <a class="el" href="dhcp_8h.html#a1fc0a94e0b94f13c5d302018f7ecb535">dhcp.h</a>
+, <a class="el" href="dhcp_8c.html#a1fc0a94e0b94f13c5d302018f7ecb535">dhcp.c</a>
+</li>
+<li>dhcp_cleanup()
+: <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()
+: <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()
+: <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()
+: <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()
+: <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_release()
+: <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()
+: <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()
+: <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_set_struct()
+: <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()
+: <a class="el" href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp.h</a>
+, <a class="el" href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp.c</a>
+</li>
+<li>dhcp_stop()
+: <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()
+: <a class="el" href="dhcp_8h.html#ae24a2529372218327ab9cb6592041c85">dhcp.h</a>
+, <a class="el" href="dhcp_8c.html#ae24a2529372218327ab9cb6592041c85">dhcp.c</a>
+</li>
+<li>dns_gethostbyname()
+: <a class="el" href="group__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f">dns.h</a>
+, <a class="el" href="group__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f">dns.c</a>
+</li>
+<li>dns_gethostbyname_addrtype()
+: <a class="el" href="group__dns.html#gae84449f60dca6b863142daca8e03ce79">dns.c</a>
+, <a class="el" href="group__dns.html#gae84449f60dca6b863142daca8e03ce79">dns.h</a>
+</li>
+<li>dns_getserver()
+: <a class="el" href="group__dns.html#gad02111a6b26b93f1c3580d5f41a59af3">dns.c</a>
+, <a class="el" href="group__dns.html#gad02111a6b26b93f1c3580d5f41a59af3">dns.h</a>
+</li>
+<li>dns_init()
+: <a class="el" href="dns_8h.html#adb31c3b6180773bd11f914c327f209cf">dns.h</a>
+, <a class="el" href="dns_8c.html#adb31c3b6180773bd11f914c327f209cf">dns.c</a>
+</li>
+<li>dns_setserver()
+: <a class="el" href="group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584">dns.c</a>
+, <a class="el" href="group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584">dns.h</a>
+</li>
+<li>dns_tmr()
+: <a class="el" href="dns_8h.html#a9389f374ec66488aa4f42a652583f533">dns.h</a>
+, <a class="el" href="dns_8c.html#a9389f374ec66488aa4f42a652583f533">dns.c</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_func_e.html b/doc/doxygen/output/html/globals_func_e.html
new file mode 100644
index 0000000..e77c638
--- /dev/null
+++ b/doc/doxygen/output/html/globals_func_e.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_func_e.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_e"></a>- e -</h3><ul>
+<li>etharp_cleanup_netif()
+: <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()
+: <a class="el" href="lwip_2etharp_8h.html#a0f8ca87c5472fa165763c8c38b76174c">etharp.h</a>
+, <a class="el" href="etharp_8c.html#a0f8ca87c5472fa165763c8c38b76174c">etharp.c</a>
+</li>
+<li>etharp_get_entry()
+: <a class="el" href="etharp_8c.html#ab93df7ccb26496100d45137541e863c8">etharp.c</a>
+, <a class="el" href="lwip_2etharp_8h.html#ab93df7ccb26496100d45137541e863c8">etharp.h</a>
+</li>
+<li>etharp_input()
+: <a class="el" href="lwip_2etharp_8h.html#a540a5506979693ef9ac4496db9bfa7d6">etharp.h</a>
+, <a class="el" href="etharp_8c.html#a540a5506979693ef9ac4496db9bfa7d6">etharp.c</a>
+</li>
+<li>etharp_output()
+: <a class="el" href="etharp_8c.html#a19258c75a3778b6ed0c82f63a419502d">etharp.c</a>
+, <a class="el" href="lwip_2etharp_8h.html#a19258c75a3778b6ed0c82f63a419502d">etharp.h</a>
+</li>
+<li>etharp_query()
+: <a class="el" href="etharp_8c.html#ae180772e31346a0afeb707ad172dd19c">etharp.c</a>
+, <a class="el" href="lwip_2etharp_8h.html#ae180772e31346a0afeb707ad172dd19c">etharp.h</a>
+</li>
+<li>etharp_request()
+: <a class="el" href="etharp_8c.html#a3e56faced96841e615f88dd57d1b2b15">etharp.c</a>
+, <a class="el" href="lwip_2etharp_8h.html#a3e56faced96841e615f88dd57d1b2b15">etharp.h</a>
+</li>
+<li>etharp_tmr()
+: <a class="el" href="etharp_8c.html#a654f4dad71f7e2bc4820094648f37a26">etharp.c</a>
+, <a class="el" href="lwip_2etharp_8h.html#a654f4dad71f7e2bc4820094648f37a26">etharp.h</a>
+</li>
+<li>ethernet_input()
+: <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()
+: <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()
+: <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()
+: <a class="el" href="group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d">lowpan6_ble.c</a>
+, <a class="el" href="group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d">lowpan6_ble.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </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
new file mode 100644
index 0000000..4c0d11b
--- /dev/null
+++ b/doc/doxygen/output/html/globals_func_h.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_func_h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_h"></a>- h -</h3><ul>
+<li>http_set_cgi_handlers()
+: <a class="el" href="group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897">httpd.c</a>
+, <a class="el" href="group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897">httpd.h</a>
+</li>
+<li>http_set_ssi_handler()
+: <a class="el" href="group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c">httpd.h</a>
+, <a class="el" href="group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c">httpd.c</a>
+</li>
+<li>httpc_get_file()
+: <a class="el" href="group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b">http_client.c</a>
+, <a class="el" href="group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b">http_client.h</a>
+</li>
+<li>httpc_get_file_dns()
+: <a class="el" href="group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6">http_client.h</a>
+, <a class="el" href="group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6">http_client.c</a>
+</li>
+<li>httpd_init()
+: <a class="el" href="group__httpd.html#gac364305cee969a0be43c071722b136e6">httpd.c</a>
+, <a class="el" href="group__httpd.html#gac364305cee969a0be43c071722b136e6">httpd.h</a>
+</li>
+<li>httpd_inits()
+: <a class="el" href="group__httpd.html#gafaedb1911a83854b1e9835132db64409">httpd.c</a>
+, <a class="el" href="group__httpd.html#gafaedb1911a83854b1e9835132db64409">httpd.h</a>
+</li>
+<li>httpd_post_begin()
+: <a class="el" href="group__httpd.html#ga6cb33693ee8f0c054be82a968ceff582">httpd.h</a>
+</li>
+<li>httpd_post_data_recved()
+: <a class="el" href="group__httpd.html#gaca4357acf5c988b28123bc6f23540380">httpd.c</a>
+, <a class="el" href="group__httpd.html#gaca4357acf5c988b28123bc6f23540380">httpd.h</a>
+</li>
+<li>httpd_post_finished()
+: <a class="el" href="group__httpd.html#ga477473f7ead250fec71f1f8b9926fec5">httpd.h</a>
+</li>
+<li>httpd_post_receive_data()
+: <a class="el" href="group__httpd.html#ga461409c8813c2a82ba63fde987c0e537">httpd.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_func_i.html b/doc/doxygen/output/html/globals_func_i.html
new file mode 100644
index 0000000..72e09b4
--- /dev/null
+++ b/doc/doxygen/output/html/globals_func_i.html
@@ -0,0 +1,327 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_func_i.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>icmp6_dest_unreach()
+: <a class="el" href="icmp6_8c.html#ab480867394952904b5607d62315bdbac">icmp6.c</a>
+, <a class="el" href="icmp6_8h.html#ab480867394952904b5607d62315bdbac">icmp6.h</a>
+</li>
+<li>icmp6_input()
+: <a class="el" href="icmp6_8h.html#a94bec819e11f51c8088ca338f2e36c3d">icmp6.h</a>
+, <a class="el" href="icmp6_8c.html#a94bec819e11f51c8088ca338f2e36c3d">icmp6.c</a>
+</li>
+<li>icmp6_packet_too_big()
+: <a class="el" href="icmp6_8c.html#a3c0a84e0944263d92c9dc3ad094ffcb0">icmp6.c</a>
+, <a class="el" href="icmp6_8h.html#a3c0a84e0944263d92c9dc3ad094ffcb0">icmp6.h</a>
+</li>
+<li>icmp6_param_problem()
+: <a class="el" href="icmp6_8h.html#a6094fa333b2cbf1b1b062e72313ef146">icmp6.h</a>
+, <a class="el" href="icmp6_8c.html#a6094fa333b2cbf1b1b062e72313ef146">icmp6.c</a>
+</li>
+<li>icmp6_time_exceeded()
+: <a class="el" href="icmp6_8c.html#a358abb6555f6ca6b2b2b1412c9117bec">icmp6.c</a>
+, <a class="el" href="icmp6_8h.html#a358abb6555f6ca6b2b2b1412c9117bec">icmp6.h</a>
+</li>
+<li>icmp6_time_exceeded_with_addrs()
+: <a class="el" href="icmp6_8c.html#ad01e5bc4690a2c6aeb534237a5a9b593">icmp6.c</a>
+, <a class="el" href="icmp6_8h.html#ad01e5bc4690a2c6aeb534237a5a9b593">icmp6.h</a>
+</li>
+<li>icmp_dest_unreach()
+: <a class="el" href="icmp_8c.html#ae26c59eab4ce553964a0c9d43f534d06">icmp.c</a>
+, <a class="el" href="icmp_8h.html#ae26c59eab4ce553964a0c9d43f534d06">icmp.h</a>
+</li>
+<li>icmp_input()
+: <a class="el" href="icmp_8h.html#ac929e48a1dddf98050b73a2633fcaef1">icmp.h</a>
+, <a class="el" href="icmp_8c.html#ac929e48a1dddf98050b73a2633fcaef1">icmp.c</a>
+</li>
+<li>icmp_time_exceeded()
+: <a class="el" href="icmp_8c.html#a49723e5e11c4bbc86197e58fdca7c119">icmp.c</a>
+, <a class="el" href="icmp_8h.html#a49723e5e11c4bbc86197e58fdca7c119">icmp.h</a>
+</li>
+<li>igmp_init()
+: <a class="el" href="igmp_8c.html#aeb8103aa3091e35c966f0894fb54a2c8">igmp.c</a>
+, <a class="el" href="igmp_8h.html#aeb8103aa3091e35c966f0894fb54a2c8">igmp.h</a>
+</li>
+<li>igmp_input()
+: <a class="el" href="igmp_8c.html#a065685cc25f2cc50f0d9659f4b086e1a">igmp.c</a>
+, <a class="el" href="igmp_8h.html#a065685cc25f2cc50f0d9659f4b086e1a">igmp.h</a>
+</li>
+<li>igmp_joingroup()
+: <a class="el" href="group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6">igmp.c</a>
+, <a class="el" href="group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6">igmp.h</a>
+</li>
+<li>igmp_joingroup_netif()
+: <a class="el" href="group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6">igmp.c</a>
+, <a class="el" href="group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6">igmp.h</a>
+</li>
+<li>igmp_leavegroup()
+: <a class="el" href="group__igmp.html#ga21c572ba7481ca41eb873923a5346544">igmp.c</a>
+, <a class="el" href="group__igmp.html#ga21c572ba7481ca41eb873923a5346544">igmp.h</a>
+</li>
+<li>igmp_leavegroup_netif()
+: <a class="el" href="group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201">igmp.c</a>
+, <a class="el" href="group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201">igmp.h</a>
+</li>
+<li>igmp_lookfor_group()
+: <a class="el" href="igmp_8h.html#a8228ddd10aa3f2518b16815d82d73448">igmp.h</a>
+, <a class="el" href="igmp_8c.html#a8228ddd10aa3f2518b16815d82d73448">igmp.c</a>
+</li>
+<li>igmp_report_groups()
+: <a class="el" href="igmp_8c.html#af06eeba0e984aab4a67a836eab577726">igmp.c</a>
+, <a class="el" href="igmp_8h.html#af06eeba0e984aab4a67a836eab577726">igmp.h</a>
+</li>
+<li>igmp_start()
+: <a class="el" href="igmp_8c.html#aac0fe91a589ba90b3f76e69cebf264f6">igmp.c</a>
+, <a class="el" href="igmp_8h.html#aac0fe91a589ba90b3f76e69cebf264f6">igmp.h</a>
+</li>
+<li>igmp_stop()
+: <a class="el" href="igmp_8c.html#afc19bd532855a64c021be08172065f84">igmp.c</a>
+, <a class="el" href="igmp_8h.html#afc19bd532855a64c021be08172065f84">igmp.h</a>
+</li>
+<li>igmp_tmr()
+: <a class="el" href="igmp_8c.html#a4418a22d37098f05d0c2fcfe288d0ca1">igmp.c</a>
+, <a class="el" href="igmp_8h.html#a4418a22d37098f05d0c2fcfe288d0ca1">igmp.h</a>
+</li>
+<li>inet_chksum_pbuf()
+: <a class="el" href="inet__chksum_8c.html#ab35967a50418358e194e8f80fdc3c865">inet_chksum.c</a>
+, <a class="el" href="inet__chksum_8h.html#ab35967a50418358e194e8f80fdc3c865">inet_chksum.h</a>
+</li>
+<li>ip4_addr_isbroadcast_u32()
+: <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_netmask_valid()
+: <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_frag()
+: <a class="el" href="ip4__frag_8c.html#a70872fd4c7aefec6b4eef0707e1a371c">ip4_frag.c</a>
+, <a class="el" href="ip4__frag_8h.html#a70872fd4c7aefec6b4eef0707e1a371c">ip4_frag.h</a>
+</li>
+<li>ip4_input()
+: <a class="el" href="ip4_8c.html#aff1f784c9f05f3d79cc1a921d840501b">ip4.c</a>
+, <a class="el" href="ip4_8h.html#aff1f784c9f05f3d79cc1a921d840501b">ip4.h</a>
+</li>
+<li>ip4_output()
+: <a class="el" href="ip4_8c.html#ac87d296205eb5ac04058e609672d4ba8">ip4.c</a>
+, <a class="el" href="ip4_8h.html#ac87d296205eb5ac04058e609672d4ba8">ip4.h</a>
+</li>
+<li>ip4_output_if()
+: <a class="el" href="ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917">ip4.c</a>
+, <a class="el" href="ip4_8h.html#ab220bc4ce4f48bdbba447358b3594917">ip4.h</a>
+</li>
+<li>ip4_output_if_opt()
+: <a class="el" href="ip4_8c.html#a0d912e400875396792a12ea443ecc1cf">ip4.c</a>
+, <a class="el" href="ip4_8h.html#a0d912e400875396792a12ea443ecc1cf">ip4.h</a>
+</li>
+<li>ip4_output_if_opt_src()
+: <a class="el" href="ip4_8c.html#accd56b095730de4ad56728bfcb349940">ip4.c</a>
+, <a class="el" href="ip4_8h.html#accd56b095730de4ad56728bfcb349940">ip4.h</a>
+</li>
+<li>ip4_output_if_src()
+: <a class="el" href="ip4_8c.html#a2943d118873e9eb1d8296e04a6740db7">ip4.c</a>
+, <a class="el" href="ip4_8h.html#a2943d118873e9eb1d8296e04a6740db7">ip4.h</a>
+</li>
+<li>ip4_reass()
+: <a class="el" href="ip4__frag_8c.html#a7debaa6366c0db4270d4f03219c75c05">ip4_frag.c</a>
+, <a class="el" href="ip4__frag_8h.html#a7debaa6366c0db4270d4f03219c75c05">ip4_frag.h</a>
+</li>
+<li>ip4_route()
+: <a class="el" href="ip4_8h.html#ac659f675356cfc1d4d13884946347e47">ip4.h</a>
+, <a class="el" href="ip4_8c.html#ac659f675356cfc1d4d13884946347e47">ip4.c</a>
+</li>
+<li>ip4_route_src()
+: <a class="el" href="ip4_8c.html#ab615a9ca8fdd99e697f52506fc440fba">ip4.c</a>
+, <a class="el" href="ip4_8h.html#ab615a9ca8fdd99e697f52506fc440fba">ip4.h</a>
+</li>
+<li>ip4_set_default_multicast_netif()
+: <a class="el" href="group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420">ip4.c</a>
+, <a class="el" href="group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420">ip4.h</a>
+</li>
+<li>ip4addr_aton()
+: <a class="el" href="ip4__addr_8c.html#af66de98501e92c66714d58119b6d9e1a">ip4_addr.c</a>
+, <a class="el" href="ip4__addr_8h.html#af66de98501e92c66714d58119b6d9e1a">ip4_addr.h</a>
+</li>
+<li>ip4addr_ntoa()
+: <a class="el" href="ip4__addr_8h.html#a28620fdd443c5c98d15e5890cbd9059c">ip4_addr.h</a>
+, <a class="el" href="ip4__addr_8c.html#a28620fdd443c5c98d15e5890cbd9059c">ip4_addr.c</a>
+</li>
+<li>ip4addr_ntoa_r()
+: <a class="el" href="ip4__addr_8c.html#a3825d5b4786c207af971ceb287f101fd">ip4_addr.c</a>
+, <a class="el" href="ip4__addr_8h.html#a3825d5b4786c207af971ceb287f101fd">ip4_addr.h</a>
+</li>
+<li>ip6_chksum_pseudo()
+: <a class="el" href="inet__chksum_8h.html#a102544bca5912c78649e25a45a7d0a88">inet_chksum.h</a>
+, <a class="el" href="inet__chksum_8c.html#a102544bca5912c78649e25a45a7d0a88">inet_chksum.c</a>
+</li>
+<li>ip6_chksum_pseudo_partial()
+: <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_frag()
+: <a class="el" href="ip6__frag_8c.html#a3ef87acbc615d5eb015104f83bbe7d37">ip6_frag.c</a>
+, <a class="el" href="ip6__frag_8h.html#a3ef87acbc615d5eb015104f83bbe7d37">ip6_frag.h</a>
+</li>
+<li>ip6_input()
+: <a class="el" href="ip6_8h.html#a6bbbae5ea37a82c746dba2feb1abd094">ip6.h</a>
+, <a class="el" href="ip6_8c.html#a6bbbae5ea37a82c746dba2feb1abd094">ip6.c</a>
+</li>
+<li>ip6_options_add_hbh_ra()
+: <a class="el" href="ip6_8c.html#a7a8d47200bb6ccbec329be8f0979853e">ip6.c</a>
+, <a class="el" href="ip6_8h.html#a7a8d47200bb6ccbec329be8f0979853e">ip6.h</a>
+</li>
+<li>ip6_output()
+: <a class="el" href="ip6_8c.html#aec695e64536ac744e616c997deb84cda">ip6.c</a>
+, <a class="el" href="ip6_8h.html#aec695e64536ac744e616c997deb84cda">ip6.h</a>
+</li>
+<li>ip6_output_if()
+: <a class="el" href="ip6_8h.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4">ip6.h</a>
+, <a class="el" href="ip6_8c.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4">ip6.c</a>
+</li>
+<li>ip6_output_if_src()
+: <a class="el" href="ip6_8h.html#a58bd3c9ce332731fac82b89c77be4f56">ip6.h</a>
+, <a class="el" href="ip6_8c.html#a58bd3c9ce332731fac82b89c77be4f56">ip6.c</a>
+</li>
+<li>ip6_reass()
+: <a class="el" href="ip6__frag_8h.html#adbd666d01adcbbbc5966938f02025b7c">ip6_frag.h</a>
+, <a class="el" href="ip6__frag_8c.html#adbd666d01adcbbbc5966938f02025b7c">ip6_frag.c</a>
+</li>
+<li>ip6_route()
+: <a class="el" href="ip6_8c.html#a1153bd9e8c45847282105ab6379e6e70">ip6.c</a>
+, <a class="el" href="ip6_8h.html#a1153bd9e8c45847282105ab6379e6e70">ip6.h</a>
+</li>
+<li>ip6_select_source_address()
+: <a class="el" href="group__ip6.html#ga540ad82e2af4c4709f1852e63c36706a">ip6.h</a>
+, <a class="el" href="group__ip6.html#ga540ad82e2af4c4709f1852e63c36706a">ip6.c</a>
+</li>
+<li>ip6addr_aton()
+: <a class="el" href="ip6__addr_8h.html#a3f555ae302eb056f28f6cb266a27036e">ip6_addr.h</a>
+, <a class="el" href="ip6__addr_8c.html#a3f555ae302eb056f28f6cb266a27036e">ip6_addr.c</a>
+</li>
+<li>ip6addr_ntoa()
+: <a class="el" href="ip6__addr_8h.html#adba4443e6629583d48e1d1c7c21a977e">ip6_addr.h</a>
+, <a class="el" href="ip6__addr_8c.html#adba4443e6629583d48e1d1c7c21a977e">ip6_addr.c</a>
+</li>
+<li>ip6addr_ntoa_r()
+: <a class="el" href="ip6__addr_8c.html#a64d442f35f34c43121bf91cfea2e77a2">ip6_addr.c</a>
+, <a class="el" href="ip6__addr_8h.html#a64d442f35f34c43121bf91cfea2e77a2">ip6_addr.h</a>
+</li>
+<li>ip_input()
+: <a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip.c</a>
+, <a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip.h</a>
+</li>
+<li>ip_reass_tmr()
+: <a class="el" href="ip4__frag_8h.html#abc7017eb20983f372e81de7376ebec88">ip4_frag.h</a>
+, <a class="el" href="ip4__frag_8c.html#abc7017eb20983f372e81de7376ebec88">ip4_frag.c</a>
+</li>
+<li>ipaddr_addr()
+: <a class="el" href="ip4__addr_8h.html#a2c05f9138da41115978409e547df9670">ip4_addr.h</a>
+, <a class="el" href="ip4__addr_8c.html#a2c05f9138da41115978409e547df9670">ip4_addr.c</a>
+</li>
+<li>ipaddr_aton()
+: <a class="el" href="group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151">ip_addr.h</a>
+, <a class="el" href="group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151">ip.c</a>
+</li>
+<li>ipaddr_ntoa()
+: <a class="el" href="group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1">ip_addr.h</a>
+, <a class="el" href="group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1">ip.c</a>
+</li>
+<li>ipaddr_ntoa_r()
+: <a class="el" href="group__ipaddr.html#ga3684dabc0cae597ffb5b51d41f1d886f">ip.c</a>
+, <a class="el" href="group__ipaddr.html#ga3684dabc0cae597ffb5b51d41f1d886f">ip_addr.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_func_l.html b/doc/doxygen/output/html/globals_func_l.html
new file mode 100644
index 0000000..1ed7ff0
--- /dev/null
+++ b/doc/doxygen/output/html/globals_func_l.html
@@ -0,0 +1,283 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_func_l.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_l"></a>- l -</h3><ul>
+<li>lowpan6_calc_crc()
+: <a class="el" href="lowpan6_8h.html#ab33dc87f30aeda871845854511de9931">lowpan6.h</a>
+, <a class="el" href="lowpan6_8c.html#ab33dc87f30aeda871845854511de9931">lowpan6.c</a>
+</li>
+<li>lowpan6_input()
+: <a class="el" href="group__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7">lowpan6.c</a>
+, <a class="el" href="group__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7">lowpan6.h</a>
+</li>
+<li>lowpan6_output()
+: <a class="el" href="group__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b">lowpan6.h</a>
+, <a class="el" href="group__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b">lowpan6.c</a>
+</li>
+<li>lowpan6_set_context()
+: <a class="el" href="group__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94">lowpan6.c</a>
+, <a class="el" href="group__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94">lowpan6.h</a>
+</li>
+<li>lowpan6_set_pan_id()
+: <a class="el" href="group__sixlowpan.html#gade00524e85d37a3521ea85359f801df3">lowpan6.h</a>
+, <a class="el" href="group__sixlowpan.html#gade00524e85d37a3521ea85359f801df3">lowpan6.c</a>
+</li>
+<li>lowpan6_set_short_addr()
+: <a class="el" href="group__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625">lowpan6.h</a>
+, <a class="el" href="group__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625">lowpan6.c</a>
+</li>
+<li>lowpan6_tmr()
+: <a class="el" href="lowpan6_8h.html#ac8c3a4612aeb23f65e55c18faf5ad7d7">lowpan6.h</a>
+, <a class="el" href="lowpan6_8c.html#ac8c3a4612aeb23f65e55c18faf5ad7d7">lowpan6.c</a>
+</li>
+<li>lwip_fcntl()
+: <a class="el" href="sockets_8h.html#ae84296093574ec746f8f88321356388f">sockets.h</a>
+, <a class="el" href="sockets_8c.html#ae84296093574ec746f8f88321356388f">sockets.c</a>
+</li>
+<li>lwip_freeaddrinfo()
+: <a class="el" href="netdb_8c.html#a7f65ff5982a0743849a644ef2cd15ef5">netdb.c</a>
+, <a class="el" href="lwip_2netdb_8h.html#a7f65ff5982a0743849a644ef2cd15ef5">netdb.h</a>
+</li>
+<li>lwip_getaddrinfo()
+: <a class="el" href="netdb_8c.html#af356989c172a51187e22b557f22d4165">netdb.c</a>
+, <a class="el" href="lwip_2netdb_8h.html#af356989c172a51187e22b557f22d4165">netdb.h</a>
+</li>
+<li>lwip_gethostbyname()
+: <a class="el" href="netdb_8c.html#a8adc6d35c068a073369edde71c678cbc">netdb.c</a>
+, <a class="el" href="lwip_2netdb_8h.html#a8adc6d35c068a073369edde71c678cbc">netdb.h</a>
+</li>
+<li>lwip_gethostbyname_r()
+: <a class="el" href="netdb_8c.html#afa229e90916f6c8d6308828f45351d2d">netdb.c</a>
+, <a class="el" href="lwip_2netdb_8h.html#afa229e90916f6c8d6308828f45351d2d">netdb.h</a>
+</li>
+<li>lwip_htonl()
+: <a class="el" href="def_8c.html#a14f94347a5b9b9e3602705b75b7ae524">def.c</a>
+, <a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">def.h</a>
+</li>
+<li>lwip_htons()
+: <a class="el" href="def_8c.html#ad637280639de4066392e6b5614fa3e56">def.c</a>
+, <a class="el" href="def_8h.html#ac49eb25570806fb51c329d4f86302cc2">def.h</a>
+</li>
+<li>lwip_if_indextoname()
+: <a class="el" href="group__if__api.html#gac68ad9ef70eb869525e0a1cc818f056b">if_api.c</a>
+, <a class="el" href="group__if__api.html#gac68ad9ef70eb869525e0a1cc818f056b">if_api.h</a>
+</li>
+<li>lwip_if_nametoindex()
+: <a class="el" href="group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be">if_api.h</a>
+, <a class="el" href="group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be">if_api.c</a>
+</li>
+<li>lwip_init()
+: <a class="el" href="group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9">init.c</a>
+, <a class="el" href="group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9">init.h</a>
+</li>
+<li>lwip_itoa()
+: <a class="el" href="group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284">def.c</a>
+, <a class="el" href="group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284">def.h</a>
+</li>
+<li>lwip_listen()
+: <a class="el" href="sockets_8c.html#abee6ee286147cf334a1ba19f19b2e08b">sockets.c</a>
+, <a class="el" href="sockets_8h.html#abee6ee286147cf334a1ba19f19b2e08b">sockets.h</a>
+</li>
+<li>lwip_netconn_do_accepted()
+: <a class="el" href="api__msg_8c.html#afc455a5f63fa3bc85022e34861a2fea5">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#afc455a5f63fa3bc85022e34861a2fea5">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_bind()
+: <a class="el" href="api__msg_8c.html#aa8e265922cda9f7fd54bf39e4ecf3768">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#aa8e265922cda9f7fd54bf39e4ecf3768">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_bind_if()
+: <a class="el" href="api__msg_8c.html#af4fed475f06818552ffefc8a1eda6605">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#af4fed475f06818552ffefc8a1eda6605">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_close()
+: <a class="el" href="api__msg_8c.html#aff73e0fcdc13c7cb97a4bfbd71a4347d">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#aff73e0fcdc13c7cb97a4bfbd71a4347d">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_connect()
+: <a class="el" href="api__msg_8c.html#a6f18f57eeda7b0596110930e696f9902">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#a6f18f57eeda7b0596110930e696f9902">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_delconn()
+: <a class="el" href="api__msg_8c.html#a9e77da8492e93d570bc1ec37f3c91d59">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#a9e77da8492e93d570bc1ec37f3c91d59">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_disconnect()
+: <a class="el" href="api__msg_8c.html#adec8a5ddbcbdacba099c630c8310d34a">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#adec8a5ddbcbdacba099c630c8310d34a">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_getaddr()
+: <a class="el" href="api__msg_8c.html#af33f432db6e3f111d4ee5876089e4163">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#af33f432db6e3f111d4ee5876089e4163">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_gethostbyname()
+: <a class="el" href="api__msg_8c.html#afd3802b2f12e27928ccc0f759b887d61">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#afd3802b2f12e27928ccc0f759b887d61">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_join_leave_group()
+: <a class="el" href="api__msg_8c.html#a7402b52416828906a5679828cce37546">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#a7402b52416828906a5679828cce37546">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_join_leave_group_netif()
+: <a class="el" href="api__msg_8c.html#aacc47257c0a5aa5eb107da0cfc699722">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#aacc47257c0a5aa5eb107da0cfc699722">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_listen()
+: <a class="el" href="api__msg_8c.html#aa7d753d86818bfd77c1d73dab8dc943f">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#aa7d753d86818bfd77c1d73dab8dc943f">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_newconn()
+: <a class="el" href="api__msg_8h.html#abc6e1a4f8dd4640ab00eae4bbfdb7236">api_msg.h</a>
+, <a class="el" href="api__msg_8c.html#abc6e1a4f8dd4640ab00eae4bbfdb7236">api_msg.c</a>
+</li>
+<li>lwip_netconn_do_recv()
+: <a class="el" href="api__msg_8c.html#ab6ae6036baf5c8fef22228ceb5e3ff9f">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#ab6ae6036baf5c8fef22228ceb5e3ff9f">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_send()
+: <a class="el" href="api__msg_8h.html#ac714bdd3d57e34f0a6517a469d80df6c">api_msg.h</a>
+, <a class="el" href="api__msg_8c.html#ac714bdd3d57e34f0a6517a469d80df6c">api_msg.c</a>
+</li>
+<li>lwip_netconn_do_write()
+: <a class="el" href="api__msg_8c.html#aca4545a471ead1bc673ea93fe85f7e5c">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#aca4545a471ead1bc673ea93fe85f7e5c">api_msg.h</a>
+</li>
+<li>lwip_shutdown()
+: <a class="el" href="sockets_8h.html#ade85c68b6673296c8fb67127b93fa4c1">sockets.h</a>
+, <a class="el" href="sockets_8c.html#ade85c68b6673296c8fb67127b93fa4c1">sockets.c</a>
+</li>
+<li>lwip_socket_thread_cleanup()
+: <a class="el" href="sockets_8h.html#ab8cd92b10dbe3fb33da03faed1ea98a7">sockets.h</a>
+, <a class="el" href="sockets_8c.html#ab8cd92b10dbe3fb33da03faed1ea98a7">sockets.c</a>
+</li>
+<li>lwip_socket_thread_init()
+: <a class="el" href="sockets_8h.html#a0a250b3b4d1827e3a3661327f5e80ae0">sockets.h</a>
+, <a class="el" href="sockets_8c.html#a0a250b3b4d1827e3a3661327f5e80ae0">sockets.c</a>
+</li>
+<li>lwip_stricmp()
+: <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()
+: <a class="el" href="group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a">def.h</a>
+, <a class="el" href="group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a">def.c</a>
+</li>
+<li>lwip_strnstr()
+: <a class="el" href="group__sys__nonstandard.html#gaeece028198cdaea2f0d2f1d691752c02">def.h</a>
+, <a class="el" href="group__sys__nonstandard.html#gaeece028198cdaea2f0d2f1d691752c02">def.c</a>
+</li>
+<li>lwiperf_abort()
+: <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()
+: <a class="el" href="group__iperf.html#gad8317f52289d8bb12a14627cd177a565">lwiperf.c</a>
+, <a class="el" href="group__iperf.html#gad8317f52289d8bb12a14627cd177a565">lwiperf.h</a>
+</li>
+<li>lwiperf_start_tcp_client_default()
+: <a class="el" href="group__iperf.html#ga85a487cf8ecbd0999382c9bff375d0da">lwiperf.h</a>
+, <a class="el" href="group__iperf.html#ga85a487cf8ecbd0999382c9bff375d0da">lwiperf.c</a>
+</li>
+<li>lwiperf_start_tcp_server()
+: <a class="el" href="group__iperf.html#gad97bf77057e7f96d6d8def812deea202">lwiperf.c</a>
+, <a class="el" href="group__iperf.html#gad97bf77057e7f96d6d8def812deea202">lwiperf.h</a>
+</li>
+<li>lwiperf_start_tcp_server_default()
+: <a class="el" href="group__iperf.html#gae1f30a02b86c4dd3d47810cd493baf26">lwiperf.h</a>
+, <a class="el" href="group__iperf.html#gae1f30a02b86c4dd3d47810cd493baf26">lwiperf.c</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_func_m.html b/doc/doxygen/output/html/globals_func_m.html
new file mode 100644
index 0000000..d7fd0cf
--- /dev/null
+++ b/doc/doxygen/output/html/globals_func_m.html
@@ -0,0 +1,275 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_func_m.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_m"></a>- m -</h3><ul>
+<li>mdns_compress_domain()
+: <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()
+: <a class="el" href="mdns__priv_8h.html#a17db69fa887515374452b945e959bbf9">mdns_priv.h</a>
+, <a class="el" href="mdns_8c.html#a17db69fa887515374452b945e959bbf9">mdns.c</a>
+</li>
+<li>mdns_domain_eq()
+: <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()
+: <a class="el" href="mdns__priv_8h.html#ab5f49d9356a76879e0e6a14eb0643b23">mdns_priv.h</a>
+, <a class="el" href="mdns_8c.html#ab5f49d9356a76879e0e6a14eb0643b23">mdns.c</a>
+</li>
+<li>mdns_resp_add_netif()
+: <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()
+: <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_resp_add_service_txtitem()
+: <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()
+: <a class="el" href="group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85">mdns.h</a>
+, <a class="el" href="group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85">mdns.c</a>
+</li>
+<li>mdns_resp_del_service()
+: <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_init()
+: <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_register_name_result_cb()
+: <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()
+: <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()
+: <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()
+: <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_restart()
+: <a class="el" href="group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a">mdns.c</a>
+, <a class="el" href="group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a">mdns.h</a>
+</li>
+<li>mem_calloc()
+: <a class="el" href="mem_8h.html#ab0bdc525971701883f2065e7fb257a24">mem.h</a>
+, <a class="el" href="mem_8c.html#ab0bdc525971701883f2065e7fb257a24">mem.c</a>
+</li>
+<li>mem_free()
+: <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()
+: <a class="el" href="tcpip_8c.html#a55b4de3765c6a37b3f2b26a11603771c">tcpip.c</a>
+, <a class="el" href="tcpip_8h.html#a55b4de3765c6a37b3f2b26a11603771c">tcpip.h</a>
+</li>
+<li>mem_init()
+: <a class="el" href="mem_8c.html#a44a136e3b70c36abb6f8dc060c778113">mem.c</a>
+, <a class="el" href="mem_8h.html#a44a136e3b70c36abb6f8dc060c778113">mem.h</a>
+</li>
+<li>mem_malloc()
+: <a class="el" href="mem_8c.html#af418ade27d91d41e6143dba2cc246b0f">mem.c</a>
+, <a class="el" href="mem_8h.html#a932aa40d85b14cb7331625e012d12335">mem.h</a>
+</li>
+<li>mem_trim()
+: <a class="el" href="mem_8c.html#a7e6b7f11bb50bead9b35515d9a517124">mem.c</a>
+, <a class="el" href="mem_8h.html#a5e39a108c44d8a72df0b30a117cb62e4">mem.h</a>
+</li>
+<li>memp_free()
+: <a class="el" href="memp_8c.html#aecd94926b7c2a0e23ae195f4ae97581f">memp.c</a>
+, <a class="el" href="memp_8h.html#aecd94926b7c2a0e23ae195f4ae97581f">memp.h</a>
+</li>
+<li>memp_free_pool()
+: <a class="el" href="memp_8c.html#a62f8c3c907743e34eee3cdac7fa1eaa5">memp.c</a>
+, <a class="el" href="memp__priv_8h.html#a62f8c3c907743e34eee3cdac7fa1eaa5">memp_priv.h</a>
+</li>
+<li>memp_init()
+: <a class="el" href="memp_8c.html#a9693e5b1ac2c6b9c0e7870522d45efa2">memp.c</a>
+, <a class="el" href="memp_8h.html#a9693e5b1ac2c6b9c0e7870522d45efa2">memp.h</a>
+</li>
+<li>memp_init_pool()
+: <a class="el" href="memp_8c.html#a6416303426d05526bed33f241fa6ecd7">memp.c</a>
+, <a class="el" href="memp__priv_8h.html#a6416303426d05526bed33f241fa6ecd7">memp_priv.h</a>
+</li>
+<li>memp_malloc()
+: <a class="el" href="memp_8c.html#a2b00593d086313c267b54a976bf67aa5">memp.c</a>
+, <a class="el" href="memp_8h.html#a2b00593d086313c267b54a976bf67aa5">memp.h</a>
+</li>
+<li>memp_malloc_pool()
+: <a class="el" href="memp_8c.html#a348c83ee972f1edf7296a1cdf1d75f22">memp.c</a>
+, <a class="el" href="memp__priv_8h.html#a348c83ee972f1edf7296a1cdf1d75f22">memp_priv.h</a>
+</li>
+<li>mld6_input()
+: <a class="el" href="mld6_8c.html#a7c190ca25432d466b28f607c3574a841">mld6.c</a>
+, <a class="el" href="mld6_8h.html#a7c190ca25432d466b28f607c3574a841">mld6.h</a>
+</li>
+<li>mld6_joingroup()
+: <a class="el" href="group__mld6.html#ga53560ab6e47163e4888070830bf912a8">mld6.c</a>
+, <a class="el" href="group__mld6.html#ga53560ab6e47163e4888070830bf912a8">mld6.h</a>
+</li>
+<li>mld6_joingroup_netif()
+: <a class="el" href="group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940">mld6.c</a>
+, <a class="el" href="group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940">mld6.h</a>
+</li>
+<li>mld6_leavegroup()
+: <a class="el" href="group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5">mld6.c</a>
+, <a class="el" href="group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5">mld6.h</a>
+</li>
+<li>mld6_leavegroup_netif()
+: <a class="el" href="group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22">mld6.h</a>
+, <a class="el" href="group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22">mld6.c</a>
+</li>
+<li>mld6_lookfor_group()
+: <a class="el" href="mld6_8c.html#ad2fbba6bc543dbf994961656d7431eb5">mld6.c</a>
+, <a class="el" href="mld6_8h.html#ad2fbba6bc543dbf994961656d7431eb5">mld6.h</a>
+</li>
+<li>mld6_report_groups()
+: <a class="el" href="mld6_8h.html#a2a08b95a7b3c82da05df1a3b50629686">mld6.h</a>
+, <a class="el" href="mld6_8c.html#a2a08b95a7b3c82da05df1a3b50629686">mld6.c</a>
+</li>
+<li>mld6_stop()
+: <a class="el" href="mld6_8c.html#ab7197d123f21a8863b56cc3871fd5198">mld6.c</a>
+, <a class="el" href="mld6_8h.html#ab7197d123f21a8863b56cc3871fd5198">mld6.h</a>
+</li>
+<li>mld6_tmr()
+: <a class="el" href="mld6_8h.html#a4ddb496d0a6a466df5665dbed8bd6274">mld6.h</a>
+, <a class="el" href="mld6_8c.html#a4ddb496d0a6a466df5665dbed8bd6274">mld6.c</a>
+</li>
+<li>mqtt_client_connect()
+: <a class="el" href="group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0">mqtt.c</a>
+, <a class="el" href="group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0">mqtt.h</a>
+</li>
+<li>mqtt_client_free()
+: <a class="el" href="group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882">mqtt.c</a>
+, <a class="el" href="group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882">mqtt.h</a>
+</li>
+<li>mqtt_client_is_connected()
+: <a class="el" href="group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5">mqtt.h</a>
+, <a class="el" href="group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5">mqtt.c</a>
+</li>
+<li>mqtt_client_new()
+: <a class="el" href="group__mqtt.html#gae7e19e236eb6122c8c39e93db6f5f53f">mqtt.h</a>
+, <a class="el" href="group__mqtt.html#gae7e19e236eb6122c8c39e93db6f5f53f">mqtt.c</a>
+</li>
+<li>mqtt_disconnect()
+: <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_publish()
+: <a class="el" href="group__mqtt.html#gade9850d716e81fde572cb012be795d2f">mqtt.c</a>
+, <a class="el" href="group__mqtt.html#gade9850d716e81fde572cb012be795d2f">mqtt.h</a>
+</li>
+<li>mqtt_set_inpub_callback()
+: <a class="el" href="group__mqtt.html#gafdfa0e65b217e92835d35858924565cf">mqtt.h</a>
+, <a class="el" href="group__mqtt.html#gafdfa0e65b217e92835d35858924565cf">mqtt.c</a>
+</li>
+<li>mqtt_sub_unsub()
+: <a class="el" href="group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103">mqtt.c</a>
+, <a class="el" href="group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103">mqtt.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_func_n.html b/doc/doxygen/output/html/globals_func_n.html
new file mode 100644
index 0000000..1707fa0
--- /dev/null
+++ b/doc/doxygen/output/html/globals_func_n.html
@@ -0,0 +1,445 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_func_n.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>nd6_adjust_mld_membership()
+: <a class="el" href="nd6_8c.html#a27224542b8ffab81c2ed9f47752bb51e">nd6.c</a>
+, <a class="el" href="nd6_8h.html#a27224542b8ffab81c2ed9f47752bb51e">nd6.h</a>
+</li>
+<li>nd6_cleanup_netif()
+: <a class="el" href="nd6_8h.html#a84f9f52cab7ae37b4dd343536156dc73">nd6.h</a>
+, <a class="el" href="nd6_8c.html#a84f9f52cab7ae37b4dd343536156dc73">nd6.c</a>
+</li>
+<li>nd6_clear_destination_cache()
+: <a class="el" href="nd6_8c.html#a64d7956cf2b0d45025b02661f3f62377">nd6.c</a>
+, <a class="el" href="nd6_8h.html#a64d7956cf2b0d45025b02661f3f62377">nd6.h</a>
+</li>
+<li>nd6_find_route()
+: <a class="el" href="nd6_8h.html#ac5ce11eaecfb486c322641427f47cffe">nd6.h</a>
+, <a class="el" href="nd6_8c.html#ac5ce11eaecfb486c322641427f47cffe">nd6.c</a>
+</li>
+<li>nd6_get_destination_mtu()
+: <a class="el" href="nd6_8c.html#af226438f4f9b4aa7c3a2bbdf3c1e948c">nd6.c</a>
+, <a class="el" href="nd6_8h.html#af226438f4f9b4aa7c3a2bbdf3c1e948c">nd6.h</a>
+</li>
+<li>nd6_get_next_hop_addr_or_queue()
+: <a class="el" href="nd6_8c.html#ae447c204ebbf71e6ebbc5ed727a73eb9">nd6.c</a>
+, <a class="el" href="nd6_8h.html#ae447c204ebbf71e6ebbc5ed727a73eb9">nd6.h</a>
+</li>
+<li>nd6_input()
+: <a class="el" href="nd6_8c.html#abbb92837e715be0e7d99513a84995831">nd6.c</a>
+, <a class="el" href="nd6_8h.html#abbb92837e715be0e7d99513a84995831">nd6.h</a>
+</li>
+<li>nd6_reachability_hint()
+: <a class="el" href="nd6_8h.html#a4959990cae26a3996f638ec996f046df">nd6.h</a>
+, <a class="el" href="nd6_8c.html#a4959990cae26a3996f638ec996f046df">nd6.c</a>
+</li>
+<li>nd6_restart_netif()
+: <a class="el" href="nd6_8c.html#a73d3192204da20be193e3c00c4a0cb54">nd6.c</a>
+, <a class="el" href="nd6_8h.html#a73d3192204da20be193e3c00c4a0cb54">nd6.h</a>
+</li>
+<li>nd6_tmr()
+: <a class="el" href="nd6_8c.html#a754781b509e69c35a7a4ee7e380399fe">nd6.c</a>
+, <a class="el" href="nd6_8h.html#a754781b509e69c35a7a4ee7e380399fe">nd6.h</a>
+</li>
+<li>netbiosns_init()
+: <a class="el" href="group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b">netbiosns.c</a>
+, <a class="el" href="group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b">netbiosns.h</a>
+</li>
+<li>netbiosns_stop()
+: <a class="el" href="group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806">netbiosns.c</a>
+, <a class="el" href="group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806">netbiosns.h</a>
+</li>
+<li>netbuf_alloc()
+: <a class="el" href="group__netbuf.html#ga0b831b80d3aa64938abdbfb6d89eaac0">netbuf.c</a>
+, <a class="el" href="group__netbuf.html#ga0b831b80d3aa64938abdbfb6d89eaac0">netbuf.h</a>
+</li>
+<li>netbuf_chain()
+: <a class="el" href="group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602">netbuf.c</a>
+, <a class="el" href="group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602">netbuf.h</a>
+</li>
+<li>netbuf_data()
+: <a class="el" href="group__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01">netbuf.c</a>
+, <a class="el" href="group__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01">netbuf.h</a>
+</li>
+<li>netbuf_delete()
+: <a class="el" href="group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d">netbuf.h</a>
+, <a class="el" href="group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d">netbuf.c</a>
+</li>
+<li>netbuf_first()
+: <a class="el" href="group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51">netbuf.c</a>
+, <a class="el" href="group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51">netbuf.h</a>
+</li>
+<li>netbuf_free()
+: <a class="el" href="group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b">netbuf.c</a>
+, <a class="el" href="group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b">netbuf.h</a>
+</li>
+<li>netbuf_new()
+: <a class="el" href="group__netbuf.html#gaaba704cd963e35e71145de9f5112991d">netbuf.c</a>
+, <a class="el" href="group__netbuf.html#gaaba704cd963e35e71145de9f5112991d">netbuf.h</a>
+</li>
+<li>netbuf_next()
+: <a class="el" href="group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715">netbuf.c</a>
+, <a class="el" href="group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715">netbuf.h</a>
+</li>
+<li>netbuf_ref()
+: <a class="el" href="group__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2">netbuf.c</a>
+, <a class="el" href="group__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2">netbuf.h</a>
+</li>
+<li>netconn_accept()
+: <a class="el" href="group__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69">api_lib.c</a>
+, <a class="el" href="group__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69">api.h</a>
+</li>
+<li>netconn_alloc()
+: <a class="el" href="api__msg_8c.html#a919865fa64270a3e4cb719ddff2fead9">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#a919865fa64270a3e4cb719ddff2fead9">api_msg.h</a>
+</li>
+<li>netconn_bind()
+: <a class="el" href="group__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230">api_lib.c</a>
+, <a class="el" href="group__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230">api.h</a>
+</li>
+<li>netconn_bind_if()
+: <a class="el" href="group__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5">api_lib.c</a>
+, <a class="el" href="group__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5">api.h</a>
+</li>
+<li>netconn_close()
+: <a class="el" href="group__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624">api_lib.c</a>
+, <a class="el" href="group__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624">api.h</a>
+</li>
+<li>netconn_connect()
+: <a class="el" href="group__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77">api_lib.c</a>
+, <a class="el" href="group__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77">api.h</a>
+</li>
+<li>netconn_delete()
+: <a class="el" href="group__netconn__common.html#gab411221f912a6d9e4c82ac3963989403">api_lib.c</a>
+, <a class="el" href="group__netconn__common.html#gab411221f912a6d9e4c82ac3963989403">api.h</a>
+</li>
+<li>netconn_disconnect()
+: <a class="el" href="group__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402">api_lib.c</a>
+, <a class="el" href="group__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402">api.h</a>
+</li>
+<li>netconn_err()
+: <a class="el" href="group__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4">api_lib.c</a>
+, <a class="el" href="group__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4">api.h</a>
+</li>
+<li>netconn_free()
+: <a class="el" href="api__msg_8c.html#a875b82ad129bdec1c6f2c21cbeedc48b">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#a875b82ad129bdec1c6f2c21cbeedc48b">api_msg.h</a>
+</li>
+<li>netconn_getaddr()
+: <a class="el" href="api_8h.html#a28430d1d86733f1bf98dc31305c42104">api.h</a>
+, <a class="el" href="api__lib_8c.html#a28430d1d86733f1bf98dc31305c42104">api_lib.c</a>
+</li>
+<li>netconn_gethostbyname_addrtype()
+: <a class="el" href="group__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5">api_lib.c</a>
+, <a class="el" href="group__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5">api.h</a>
+</li>
+<li>netconn_join_leave_group()
+: <a class="el" href="group__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed">api_lib.c</a>
+, <a class="el" href="group__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed">api.h</a>
+</li>
+<li>netconn_join_leave_group_netif()
+: <a class="el" href="group__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b">api_lib.c</a>
+, <a class="el" href="group__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b">api.h</a>
+</li>
+<li>netconn_listen_with_backlog()
+: <a class="el" href="group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d">api_lib.c</a>
+, <a class="el" href="group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d">api.h</a>
+</li>
+<li>netconn_new_with_proto_and_callback()
+: <a class="el" href="api__lib_8c.html#ad0a0434e5ff08bb350740cb840e2aca8">api_lib.c</a>
+, <a class="el" href="api_8h.html#ad0a0434e5ff08bb350740cb840e2aca8">api.h</a>
+</li>
+<li>netconn_prepare_delete()
+: <a class="el" href="group__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0">api_lib.c</a>
+, <a class="el" href="group__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0">api.h</a>
+</li>
+<li>netconn_recv()
+: <a class="el" href="group__netconn__common.html#ga50490bab058f4e740798beffcf48cabf">api_lib.c</a>
+, <a class="el" href="group__netconn__common.html#ga50490bab058f4e740798beffcf48cabf">api.h</a>
+</li>
+<li>netconn_recv_tcp_pbuf()
+: <a class="el" href="group__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490">api_lib.c</a>
+, <a class="el" href="group__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490">api.h</a>
+</li>
+<li>netconn_recv_tcp_pbuf_flags()
+: <a class="el" href="group__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294">api_lib.c</a>
+, <a class="el" href="group__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294">api.h</a>
+</li>
+<li>netconn_recv_udp_raw_netbuf()
+: <a class="el" href="api__lib_8c.html#a805a90b546c5a149f04782351633979b">api_lib.c</a>
+, <a class="el" href="api_8h.html#a805a90b546c5a149f04782351633979b">api.h</a>
+</li>
+<li>netconn_recv_udp_raw_netbuf_flags()
+: <a class="el" href="api__lib_8c.html#a505c3b8e400babf9681e09c945b7f421">api_lib.c</a>
+, <a class="el" href="api_8h.html#a505c3b8e400babf9681e09c945b7f421">api.h</a>
+</li>
+<li>netconn_send()
+: <a class="el" href="group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238">api_lib.c</a>
+, <a class="el" href="group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238">api.h</a>
+</li>
+<li>netconn_sendto()
+: <a class="el" href="group__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c">api_lib.c</a>
+, <a class="el" href="group__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c">api.h</a>
+</li>
+<li>netconn_shutdown()
+: <a class="el" href="group__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63">api_lib.c</a>
+, <a class="el" href="group__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63">api.h</a>
+</li>
+<li>netconn_write_partly()
+: <a class="el" href="group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf">api_lib.c</a>
+, <a class="el" href="group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf">api.h</a>
+</li>
+<li>netconn_write_vectors_partly()
+: <a class="el" href="api__lib_8c.html#a992b4fe8a855fd94861738f7260d0a32">api_lib.c</a>
+, <a class="el" href="api_8h.html#a992b4fe8a855fd94861738f7260d0a32">api.h</a>
+</li>
+<li>netif_add()
+: <a class="el" href="group__netif.html#gade5498543e74067f28cc6bef0209e3be">netif.c</a>
+, <a class="el" href="group__netif.html#gade5498543e74067f28cc6bef0209e3be">netif.h</a>
+</li>
+<li>netif_add_ext_callback()
+: <a class="el" href="group__netif.html#ga3efc2b72f75936d50708247420c9d1d9">netif.c</a>
+, <a class="el" href="group__netif.html#ga3efc2b72f75936d50708247420c9d1d9">netif.h</a>
+</li>
+<li>netif_add_ip6_address()
+: <a class="el" href="group__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327">netif.c</a>
+, <a class="el" href="group__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327">netif.h</a>
+</li>
+<li>netif_add_noaddr()
+: <a class="el" href="group__netif.html#gac20150ac754ff1f88afeaa33be3552a4">netif.c</a>
+, <a class="el" href="group__netif.html#gac20150ac754ff1f88afeaa33be3552a4">netif.h</a>
+</li>
+<li>netif_alloc_client_data_id()
+: <a class="el" href="group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978">netif.c</a>
+, <a class="el" href="group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978">netif.h</a>
+</li>
+<li>netif_create_ip6_linklocal_address()
+: <a class="el" href="group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9">netif.c</a>
+, <a class="el" href="group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9">netif.h</a>
+</li>
+<li>netif_find()
+: <a class="el" href="group__netif.html#ga69c93a139e8a1f6ef4e3d076a2897def">netif.c</a>
+, <a class="el" href="group__netif.html#ga69c93a139e8a1f6ef4e3d076a2897def">netif.h</a>
+</li>
+<li>netif_get_by_index()
+: <a class="el" href="group__netif.html#gae4df885347c800a5486d3bf25981300e">netif.c</a>
+, <a class="el" href="group__netif.html#gae4df885347c800a5486d3bf25981300e">netif.h</a>
+</li>
+<li>netif_get_ip6_addr_match()
+: <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_index_to_name()
+: <a class="el" href="group__netif.html#ga3ff104d083914e87a7805a0b90a85755">netif.h</a>
+, <a class="el" href="group__netif.html#ga3ff104d083914e87a7805a0b90a85755">netif.c</a>
+</li>
+<li>netif_input()
+: <a class="el" href="group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385">netif.c</a>
+, <a class="el" href="group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385">netif.h</a>
+</li>
+<li>netif_invoke_ext_callback()
+: <a class="el" href="netif_8c.html#a75b5298b1c3c3794747d78a4ce95d81c">netif.c</a>
+, <a class="el" href="netif_8h.html#a75b5298b1c3c3794747d78a4ce95d81c">netif.h</a>
+</li>
+<li>netif_ip6_addr_set()
+: <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()
+: <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()
+: <a class="el" href="group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2">netif.h</a>
+, <a class="el" href="group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2">netif.c</a>
+</li>
+<li>netif_name_to_index()
+: <a class="el" href="group__netif.html#gac763a1f647fb9e8af4254418e813a6ae">netif.h</a>
+, <a class="el" href="group__netif.html#gac763a1f647fb9e8af4254418e813a6ae">netif.c</a>
+</li>
+<li>netif_poll()
+: <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()
+: <a class="el" href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979">netif.h</a>
+, <a class="el" href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979">netif.c</a>
+</li>
+<li>netif_remove_ext_callback()
+: <a class="el" href="group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716">netif.h</a>
+, <a class="el" href="group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716">netif.c</a>
+</li>
+<li>netif_set_addr()
+: <a class="el" href="group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1">netif.h</a>
+, <a class="el" href="group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1">netif.c</a>
+</li>
+<li>netif_set_default()
+: <a class="el" href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif.h</a>
+, <a class="el" href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif.c</a>
+</li>
+<li>netif_set_down()
+: <a class="el" href="group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf">netif.h</a>
+, <a class="el" href="group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf">netif.c</a>
+</li>
+<li>netif_set_gw()
+: <a class="el" href="group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520">netif.h</a>
+, <a class="el" href="group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520">netif.c</a>
+</li>
+<li>netif_set_ipaddr()
+: <a class="el" href="group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca">netif.h</a>
+, <a class="el" href="group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca">netif.c</a>
+</li>
+<li>netif_set_link_callback()
+: <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()
+: <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()
+: <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_netmask()
+: <a class="el" href="group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53">netif.h</a>
+, <a class="el" href="group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53">netif.c</a>
+</li>
+<li>netif_set_remove_callback()
+: <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()
+: <a class="el" href="group__netif.html#gadc8787b23ac0ee023979cbadf87813d4">netif.h</a>
+, <a class="el" href="group__netif.html#gadc8787b23ac0ee023979cbadf87813d4">netif.c</a>
+</li>
+<li>netif_set_up()
+: <a class="el" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif.h</a>
+, <a class="el" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif.c</a>
+</li>
+<li>netif_to_num()
+: <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()
+: <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()
+: <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_netif_add()
+: <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()
+: <a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi.h</a>
+, <a class="el" href="netifapi_8c.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi.c</a>
+</li>
+<li>netifapi_netif_index_to_name()
+: <a class="el" href="group__netifapi__netif.html#gab7914d77d0a89fd6c31048feb0bdafb6">netifapi.c</a>
+</li>
+<li>netifapi_netif_name_to_index()
+: <a class="el" href="group__netifapi__netif.html#gad4a821182d01eafa4ca258f958fcb089">netifapi.c</a>
+</li>
+<li>netifapi_netif_set_addr()
+: <a class="el" href="group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973">netifapi.c</a>
+, <a class="el" href="group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973">netifapi.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_func_p.html b/doc/doxygen/output/html/globals_func_p.html
new file mode 100644
index 0000000..8f45454
--- /dev/null
+++ b/doc/doxygen/output/html/globals_func_p.html
@@ -0,0 +1,223 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_func_p.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>pbuf_add_header()
+: <a class="el" href="pbuf_8c.html#a32dc14bd88dcafa25e627ab18e801815">pbuf.c</a>
+, <a class="el" href="pbuf_8h.html#a32dc14bd88dcafa25e627ab18e801815">pbuf.h</a>
+</li>
+<li>pbuf_add_header_force()
+: <a class="el" href="pbuf_8h.html#ad4ef8c5fbbd1447db04f8f73923e7dee">pbuf.h</a>
+, <a class="el" href="pbuf_8c.html#ad4ef8c5fbbd1447db04f8f73923e7dee">pbuf.c</a>
+</li>
+<li>pbuf_alloc()
+: <a class="el" href="group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47">pbuf.h</a>
+</li>
+<li>pbuf_alloc_reference()
+: <a class="el" href="group__pbuf.html#ga4caa46c6d560d9d0da2be845bc9c2fab">pbuf.h</a>
+, <a class="el" href="group__pbuf.html#ga4caa46c6d560d9d0da2be845bc9c2fab">pbuf.c</a>
+</li>
+<li>pbuf_alloced_custom()
+: <a class="el" href="group__pbuf.html#ga90fa2bbf6ea4a263ee8f7b77c75683c2">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#ga90fa2bbf6ea4a263ee8f7b77c75683c2">pbuf.h</a>
+</li>
+<li>pbuf_cat()
+: <a class="el" href="group__pbuf.html#ga82429084fe29015509c9b4a072707cd4">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#ga82429084fe29015509c9b4a072707cd4">pbuf.h</a>
+</li>
+<li>pbuf_chain()
+: <a class="el" href="group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891">pbuf.h</a>
+</li>
+<li>pbuf_clen()
+: <a class="el" href="pbuf_8h.html#a5df7ac5ae59012fe9aeddba375a72190">pbuf.h</a>
+, <a class="el" href="pbuf_8c.html#a5df7ac5ae59012fe9aeddba375a72190">pbuf.c</a>
+</li>
+<li>pbuf_clone()
+: <a class="el" href="group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0">pbuf.h</a>
+</li>
+<li>pbuf_coalesce()
+: <a class="el" href="group__pbuf.html#ga54ac7b116c6f53c704cbf74f35a8b35c">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#ga54ac7b116c6f53c704cbf74f35a8b35c">pbuf.h</a>
+</li>
+<li>pbuf_copy()
+: <a class="el" href="group__pbuf.html#gaba88511dee3df4b631fde691f421320d">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#gaba88511dee3df4b631fde691f421320d">pbuf.h</a>
+</li>
+<li>pbuf_copy_partial()
+: <a class="el" href="group__pbuf.html#gac2f1f58fd36042e82af46f5015720899">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#gac2f1f58fd36042e82af46f5015720899">pbuf.h</a>
+</li>
+<li>pbuf_dechain()
+: <a class="el" href="pbuf_8c.html#abf3d29c4f43986b4cb5eb314d5b9729d">pbuf.c</a>
+, <a class="el" href="pbuf_8h.html#abf3d29c4f43986b4cb5eb314d5b9729d">pbuf.h</a>
+</li>
+<li>pbuf_free()
+: <a class="el" href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf.h</a>
+</li>
+<li>pbuf_free_callback()
+: <a class="el" href="tcpip_8c.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c">tcpip.c</a>
+, <a class="el" href="tcpip_8h.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c">tcpip.h</a>
+</li>
+<li>pbuf_free_header()
+: <a class="el" href="pbuf_8h.html#a25a3b8edc783896b03819a966d00845e">pbuf.h</a>
+, <a class="el" href="pbuf_8c.html#a25a3b8edc783896b03819a966d00845e">pbuf.c</a>
+</li>
+<li>pbuf_get_at()
+: <a class="el" href="group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6">pbuf.h</a>
+</li>
+<li>pbuf_get_contiguous()
+: <a class="el" href="group__pbuf.html#gad0357ae0be17b2aacd0c301cdc86fc39">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#gad0357ae0be17b2aacd0c301cdc86fc39">pbuf.h</a>
+</li>
+<li>pbuf_header()
+: <a class="el" href="pbuf_8c.html#a0f81deff4a0e6e8e0ff161a7b9871449">pbuf.c</a>
+, <a class="el" href="pbuf_8h.html#aaa17c1951cf2d207b6adfd3947d91f00">pbuf.h</a>
+</li>
+<li>pbuf_header_force()
+: <a class="el" href="pbuf_8h.html#a27480c41c34021d4417691d327163626">pbuf.h</a>
+, <a class="el" href="pbuf_8c.html#ad0e64d6fbc423593461063da97da9ce6">pbuf.c</a>
+</li>
+<li>pbuf_memcmp()
+: <a class="el" href="group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974">pbuf.h</a>
+</li>
+<li>pbuf_memfind()
+: <a class="el" href="group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448">pbuf.h</a>
+</li>
+<li>pbuf_put_at()
+: <a class="el" href="group__pbuf.html#gaf76863707dc02993eae116574b1ea03f">pbuf.h</a>
+, <a class="el" href="group__pbuf.html#gaf76863707dc02993eae116574b1ea03f">pbuf.c</a>
+</li>
+<li>pbuf_realloc()
+: <a class="el" href="group__pbuf.html#ga50abfe830a33a1a47a562febee66015d">pbuf.h</a>
+, <a class="el" href="group__pbuf.html#ga50abfe830a33a1a47a562febee66015d">pbuf.c</a>
+</li>
+<li>pbuf_ref()
+: <a class="el" href="group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e">pbuf.h</a>
+, <a class="el" href="group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e">pbuf.c</a>
+</li>
+<li>pbuf_remove_header()
+: <a class="el" href="pbuf_8h.html#ab65da7cd8f7449b3b2e57d7fa1a74ef4">pbuf.h</a>
+, <a class="el" href="pbuf_8c.html#aca0cd8b3f08fbb5e35bc91a663083cc1">pbuf.c</a>
+</li>
+<li>pbuf_skip()
+: <a class="el" href="group__pbuf.html#ga6a961522d81f0327aaf4d4ee6d96c583">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#ga6a961522d81f0327aaf4d4ee6d96c583">pbuf.h</a>
+</li>
+<li>pbuf_strstr()
+: <a class="el" href="pbuf_8c.html#a9ba3f7b705309ceadb147692fd5a1c7d">pbuf.c</a>
+, <a class="el" href="pbuf_8h.html#a9ba3f7b705309ceadb147692fd5a1c7d">pbuf.h</a>
+</li>
+<li>pbuf_take()
+: <a class="el" href="group__pbuf.html#gad1e31e370271335b197272af2724ca85">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#gad1e31e370271335b197272af2724ca85">pbuf.h</a>
+</li>
+<li>pbuf_take_at()
+: <a class="el" href="group__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44">pbuf.h</a>
+</li>
+<li>pbuf_try_get_at()
+: <a class="el" href="group__pbuf.html#ga839f342803b0cf89049744124c5a98ad">pbuf.h</a>
+, <a class="el" href="group__pbuf.html#ga839f342803b0cf89049744124c5a98ad">pbuf.c</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_func_r.html b/doc/doxygen/output/html/globals_func_r.html
new file mode 100644
index 0000000..53299b7
--- /dev/null
+++ b/doc/doxygen/output/html/globals_func_r.html
@@ -0,0 +1,183 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_func_r.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_r"></a>- r -</h3><ul>
+<li>raw_bind()
+: <a class="el" href="group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4">raw.c</a>
+, <a class="el" href="group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4">raw.h</a>
+</li>
+<li>raw_bind_netif()
+: <a class="el" href="group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a">raw.h</a>
+, <a class="el" href="group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a">raw.c</a>
+</li>
+<li>raw_connect()
+: <a class="el" href="group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168">raw.c</a>
+, <a class="el" href="group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168">raw.h</a>
+</li>
+<li>raw_disconnect()
+: <a class="el" href="group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef">raw.h</a>
+, <a class="el" href="group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef">raw.c</a>
+</li>
+<li>raw_input()
+: <a class="el" href="raw_8c.html#a03c4582d9ecf687e1f31d597c7889553">raw.c</a>
+, <a class="el" href="raw__priv_8h.html#a03c4582d9ecf687e1f31d597c7889553">raw_priv.h</a>
+</li>
+<li>raw_netif_ip_addr_changed()
+: <a class="el" href="raw_8c.html#a61dc42f18e34800643000e48be6543ab">raw.c</a>
+, <a class="el" href="raw__priv_8h.html#a61dc42f18e34800643000e48be6543ab">raw_priv.h</a>
+</li>
+<li>raw_new()
+: <a class="el" href="group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f">raw.c</a>
+, <a class="el" href="group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f">raw.h</a>
+</li>
+<li>raw_new_ip_type()
+: <a class="el" href="group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11">raw.h</a>
+, <a class="el" href="group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11">raw.c</a>
+</li>
+<li>raw_recv()
+: <a class="el" href="group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426">raw.c</a>
+, <a class="el" href="group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426">raw.h</a>
+</li>
+<li>raw_remove()
+: <a class="el" href="group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16">raw.c</a>
+, <a class="el" href="group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16">raw.h</a>
+</li>
+<li>raw_send()
+: <a class="el" href="group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d">raw.c</a>
+, <a class="el" href="group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d">raw.h</a>
+</li>
+<li>raw_sendto()
+: <a class="el" href="group__raw__raw.html#ga09427456070fb610cc7795d23dedc159">raw.c</a>
+, <a class="el" href="group__raw__raw.html#ga09427456070fb610cc7795d23dedc159">raw.h</a>
+</li>
+<li>raw_sendto_if_src()
+: <a class="el" href="group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1">raw.c</a>
+, <a class="el" href="group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1">raw.h</a>
+</li>
+<li>rfc7668_if_init()
+: <a class="el" href="group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde">lowpan6_ble.h</a>
+, <a class="el" href="group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde">lowpan6_ble.c</a>
+</li>
+<li>rfc7668_input()
+: <a class="el" href="group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197">lowpan6_ble.h</a>
+, <a class="el" href="group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197">lowpan6_ble.c</a>
+</li>
+<li>rfc7668_output()
+: <a class="el" href="group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0">lowpan6_ble.c</a>
+, <a class="el" href="group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0">lowpan6_ble.h</a>
+</li>
+<li>rfc7668_set_context()
+: <a class="el" href="group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e">lowpan6_ble.h</a>
+, <a class="el" href="group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e">lowpan6_ble.c</a>
+</li>
+<li>rfc7668_set_local_addr_eui64()
+: <a class="el" href="lowpan6__ble_8h.html#a9c5b721f6fb28b4c999baab56a65d8e2">lowpan6_ble.h</a>
+, <a class="el" href="lowpan6__ble_8c.html#a9c5b721f6fb28b4c999baab56a65d8e2">lowpan6_ble.c</a>
+</li>
+<li>rfc7668_set_local_addr_mac48()
+: <a class="el" href="lowpan6__ble_8h.html#a53d4e8096dd714f94c69d67a6cd49ac2">lowpan6_ble.h</a>
+, <a class="el" href="lowpan6__ble_8c.html#a53d4e8096dd714f94c69d67a6cd49ac2">lowpan6_ble.c</a>
+</li>
+<li>rfc7668_set_peer_addr_eui64()
+: <a class="el" href="lowpan6__ble_8h.html#a01b797f4fde59dfb803f0299e6a49593">lowpan6_ble.h</a>
+, <a class="el" href="lowpan6__ble_8c.html#a01b797f4fde59dfb803f0299e6a49593">lowpan6_ble.c</a>
+</li>
+<li>rfc7668_set_peer_addr_mac48()
+: <a class="el" href="lowpan6__ble_8h.html#a437b9f9e85be644bd7b939413e3c81d0">lowpan6_ble.h</a>
+, <a class="el" href="lowpan6__ble_8c.html#a437b9f9e85be644bd7b939413e3c81d0">lowpan6_ble.c</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_func_s.html b/doc/doxygen/output/html/globals_func_s.html
new file mode 100644
index 0000000..b96f1bc
--- /dev/null
+++ b/doc/doxygen/output/html/globals_func_s.html
@@ -0,0 +1,534 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_func_s.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>slipif_init()
+: <a class="el" href="group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3">slipif.h</a>
+, <a class="el" href="group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3">slipif.c</a>
+</li>
+<li>slipif_poll()
+: <a class="el" href="group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6">slipif.c</a>
+, <a class="el" href="group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6">slipif.h</a>
+</li>
+<li>slipif_process_rxqueue()
+: <a class="el" href="group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946">slipif.h</a>
+, <a class="el" href="group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946">slipif.c</a>
+</li>
+<li>slipif_received_byte()
+: <a class="el" href="group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3">slipif.c</a>
+, <a class="el" href="group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3">slipif.h</a>
+</li>
+<li>slipif_received_bytes()
+: <a class="el" href="group__slipif.html#gabbee48569a513c90fe154632038eb6d6">slipif.h</a>
+, <a class="el" href="group__slipif.html#gabbee48569a513c90fe154632038eb6d6">slipif.c</a>
+</li>
+<li>smtp_send_mail()
+: <a class="el" href="group__smtp.html#gae43119480c4146df9eeff7ae80c767f7">smtp.c</a>
+</li>
+<li>smtp_send_mail_int()
+: <a class="el" href="group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243">smtp.c</a>
+</li>
+<li>smtp_send_mail_static()
+: <a class="el" href="group__smtp.html#ga06f6582701def2a62582373bb0be5788">smtp.c</a>
+</li>
+<li>smtp_set_auth()
+: <a class="el" href="group__smtp.html#ga79567a5a75e048a6b8addb5b038fc899">smtp.c</a>
+</li>
+<li>smtp_set_server_addr()
+: <a class="el" href="group__smtp.html#ga1ccf4305461ec16cf41599341ec54983">smtp.c</a>
+</li>
+<li>smtp_set_server_port()
+: <a class="el" href="group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f">smtp.c</a>
+</li>
+<li>smtp_set_tls_config()
+: <a class="el" href="group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e">smtp.c</a>
+</li>
+<li>snmp_ans1_enc_tlv()
+: <a class="el" href="snmp__asn1_8c.html#af8e905a214936995d235789f359cf015">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#af8e905a214936995d235789f359cf015">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_dec_oid()
+: <a class="el" href="snmp__asn1_8c.html#a8bb84ec51c46a890b7ced016043b2908">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#a8bb84ec51c46a890b7ced016043b2908">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_dec_raw()
+: <a class="el" href="snmp__asn1_8c.html#a31055a35285214ea0d4ad60c64c2f73e">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#a31055a35285214ea0d4ad60c64c2f73e">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_dec_s32t()
+: <a class="el" href="snmp__asn1_8c.html#a51d36daf2935c246eb55fb749581e2bb">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#a51d36daf2935c246eb55fb749581e2bb">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_dec_tlv()
+: <a class="el" href="snmp__asn1_8c.html#a7e3f63b155b06f7ade627060b55e4496">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#a7e3f63b155b06f7ade627060b55e4496">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_dec_u32t()
+: <a class="el" href="snmp__asn1_8c.html#ac04e08c19c40cfc3333a181018887a51">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#ac04e08c19c40cfc3333a181018887a51">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_enc_length_cnt()
+: <a class="el" href="snmp__asn1_8c.html#a20343aef4524459a2b45704e18ef520d">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#a20343aef4524459a2b45704e18ef520d">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_enc_oid()
+: <a class="el" href="snmp__asn1_8c.html#aa71260abd46fc2f682874016896fe218">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#aa71260abd46fc2f682874016896fe218">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_enc_oid_cnt()
+: <a class="el" href="snmp__asn1_8c.html#ab6fd58c1b41cb98117f00a11db7d226f">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#ab6fd58c1b41cb98117f00a11db7d226f">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_enc_raw()
+: <a class="el" href="snmp__asn1_8c.html#a167b707051bbbeafea14eeca72449ac6">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#a167b707051bbbeafea14eeca72449ac6">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_enc_s32t()
+: <a class="el" href="snmp__asn1_8c.html#a25b3fe21becd08260ec56bef9299d3c6">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#a25b3fe21becd08260ec56bef9299d3c6">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_enc_s32t_cnt()
+: <a class="el" href="snmp__asn1_8c.html#a8c74914532f1e0c219dfb1977fd0c22f">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#a8c74914532f1e0c219dfb1977fd0c22f">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_enc_u32t()
+: <a class="el" href="snmp__asn1_8c.html#aa54b4ee3c58ef66721df96fd8b1f66b2">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#aa54b4ee3c58ef66721df96fd8b1f66b2">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_enc_u32t_cnt()
+: <a class="el" href="snmp__asn1_8c.html#a58965e0305884d550786440c84119ad4">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#a58965e0305884d550786440c84119ad4">snmp_asn1.h</a>
+</li>
+<li>snmp_authfail_trap()
+: <a class="el" href="group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee">snmp_traps.c</a>
+, <a class="el" href="group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee">snmp.h</a>
+</li>
+<li>snmp_coldstart_trap()
+: <a class="el" href="group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be">snmp_traps.c</a>
+, <a class="el" href="group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be">snmp.h</a>
+</li>
+<li>snmp_decode_bits()
+: <a class="el" href="snmp__core_8c.html#ad3ab34b13bb9fcc757c8d366fe520fdc">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#ad3ab34b13bb9fcc757c8d366fe520fdc">snmp_core.h</a>
+</li>
+<li>snmp_encode_bits()
+: <a class="el" href="snmp__core_8c.html#ae6f5d0c38a7ec164a67fa55c87f1de03">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#ae6f5d0c38a7ec164a67fa55c87f1de03">snmp_core.h</a>
+</li>
+<li>snmp_get_auth_traps_enabled()
+: <a class="el" href="group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7">snmp_traps.c</a>
+, <a class="el" href="group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7">snmp.h</a>
+</li>
+<li>snmp_get_community()
+: <a class="el" href="group__snmp__core.html#gacf277cbca915275190426aeef4cfb103">snmp_msg.c</a>
+, <a class="el" href="group__snmp__core.html#gacf277cbca915275190426aeef4cfb103">snmp.h</a>
+</li>
+<li>snmp_get_community_trap()
+: <a class="el" href="group__snmp__traps.html#gafdd3299e145f53cc826cc11a469f8409">snmp_msg.c</a>
+, <a class="el" href="group__snmp__traps.html#gafdd3299e145f53cc826cc11a469f8409">snmp.h</a>
+</li>
+<li>snmp_get_community_write()
+: <a class="el" href="group__snmp__core.html#gaba31b6f1816661df5a3b7f2076ee6ec0">snmp_msg.c</a>
+, <a class="el" href="group__snmp__core.html#gaba31b6f1816661df5a3b7f2076ee6ec0">snmp.h</a>
+</li>
+<li>snmp_get_device_enterprise_oid()
+: <a class="el" href="group__snmp__core.html#ga4dff82dda2553b9554a9f98561852a50">snmp_core.c</a>
+, <a class="el" href="group__snmp__core.html#ga4dff82dda2553b9554a9f98561852a50">snmp.h</a>
+</li>
+<li>snmp_init()
+: <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()
+: <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>
+<li>snmp_ip6_to_oid()
+: <a class="el" href="snmp__core_8c.html#af1f327eef86765cce0253c94ec3c5ce9">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#af1f327eef86765cce0253c94ec3c5ce9">snmp_core.h</a>
+</li>
+<li>snmp_ip_port_to_oid()
+: <a class="el" href="snmp__core_8c.html#a53b01262de3d1c52faf88dd4bb702a27">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a53b01262de3d1c52faf88dd4bb702a27">snmp_core.h</a>
+</li>
+<li>snmp_ip_to_oid()
+: <a class="el" href="snmp__core_8c.html#a909ed1b0da526a0acdf6fa57a06f351e">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a909ed1b0da526a0acdf6fa57a06f351e">snmp_core.h</a>
+</li>
+<li>snmp_mib2_set_syscontact()
+: <a class="el" href="group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e">snmp_mib2_system.c</a>
+, <a class="el" href="group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e">snmp_mib2.h</a>
+</li>
+<li>snmp_mib2_set_syscontact_readonly()
+: <a class="el" href="group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a">snmp_mib2_system.c</a>
+, <a class="el" href="group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a">snmp_mib2.h</a>
+</li>
+<li>snmp_mib2_set_sysdescr()
+: <a class="el" href="group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc">snmp_mib2_system.c</a>
+, <a class="el" href="group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc">snmp_mib2.h</a>
+</li>
+<li>snmp_mib2_set_syslocation()
+: <a class="el" href="group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2">snmp_mib2_system.c</a>
+, <a class="el" href="group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2">snmp_mib2.h</a>
+</li>
+<li>snmp_mib2_set_syslocation_readonly()
+: <a class="el" href="group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267">snmp_mib2_system.c</a>
+, <a class="el" href="group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267">snmp_mib2.h</a>
+</li>
+<li>snmp_mib2_set_sysname()
+: <a class="el" href="group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7">snmp_mib2_system.c</a>
+, <a class="el" href="group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7">snmp_mib2.h</a>
+</li>
+<li>snmp_mib2_set_sysname_readonly()
+: <a class="el" href="group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5">snmp_mib2_system.c</a>
+, <a class="el" href="group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5">snmp_mib2.h</a>
+</li>
+<li>snmp_mib_tree_resolve_exact()
+: <a class="el" href="snmp__core_8c.html#af42d6d2732a92017a43b83a07609fd1a">snmp_core.c</a>
+</li>
+<li>snmp_next_oid_check()
+: <a class="el" href="snmp__core_8c.html#a18126b2b13f267306c27e851e9379983">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a18126b2b13f267306c27e851e9379983">snmp_core.h</a>
+</li>
+<li>snmp_next_oid_init()
+: <a class="el" href="snmp__core_8c.html#a8074765d5c2b809561f032d35e59e213">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a8074765d5c2b809561f032d35e59e213">snmp_core.h</a>
+</li>
+<li>snmp_next_oid_precheck()
+: <a class="el" href="snmp__core_8c.html#a9768ecf81f01880dbf1cc1933bd9e60a">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a9768ecf81f01880dbf1cc1933bd9e60a">snmp_core.h</a>
+</li>
+<li>snmp_oid_append()
+: <a class="el" href="snmp__core_8c.html#a5aa6c8dbfc93235b160afaf3a40c1c93">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a5aa6c8dbfc93235b160afaf3a40c1c93">snmp_core.h</a>
+</li>
+<li>snmp_oid_assign()
+: <a class="el" href="snmp__core_8c.html#a41fd5e854d809499e28c66b4918481a6">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a41fd5e854d809499e28c66b4918481a6">snmp_core.h</a>
+</li>
+<li>snmp_oid_combine()
+: <a class="el" href="snmp__core_8c.html#a6edcb88d8162544333bcede301cf0904">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a6edcb88d8162544333bcede301cf0904">snmp_core.h</a>
+</li>
+<li>snmp_oid_compare()
+: <a class="el" href="snmp__core_8c.html#af041ab415e8063097c79be2b892174f8">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#af041ab415e8063097c79be2b892174f8">snmp_core.h</a>
+</li>
+<li>snmp_oid_equal()
+: <a class="el" href="snmp__core_8c.html#ac2b6821b3d4a25033433fc25ffd74c9e">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#ac2b6821b3d4a25033433fc25ffd74c9e">snmp_core.h</a>
+</li>
+<li>snmp_oid_in_range()
+: <a class="el" href="snmp__core_8c.html#a5275903be5948b1c28bfadb365823504">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a5275903be5948b1c28bfadb365823504">snmp_core.h</a>
+</li>
+<li>snmp_oid_prefix()
+: <a class="el" href="snmp__core_8c.html#a32256b37b211b4f59d8f114cee364f39">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a32256b37b211b4f59d8f114cee364f39">snmp_core.h</a>
+</li>
+<li>snmp_oid_to_ip()
+: <a class="el" href="snmp__core_8c.html#a66aac86af921cd8aecb95eb252eb3e84">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a66aac86af921cd8aecb95eb252eb3e84">snmp_core.h</a>
+</li>
+<li>snmp_oid_to_ip4()
+: <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()
+: <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()
+: <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()
+: <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_trap_generic()
+: <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()
+: <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()
+: <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()
+: <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()
+: <a class="el" href="group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760">snmp.h</a>
+, <a class="el" href="group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760">snmp_msg.c</a>
+</li>
+<li>snmp_set_community_write()
+: <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_device_enterprise_oid()
+: <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_mibs()
+: <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()
+: <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()
+: <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>
+<li>snmp_trap_dst_enable()
+: <a class="el" href="group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32">snmp_traps.c</a>
+, <a class="el" href="group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32">snmp.h</a>
+</li>
+<li>snmp_trap_dst_ip_set()
+: <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()
+: <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()
+: <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_getoperatingmode()
+: <a class="el" href="group__sntp.html#gae66404a551d5cef420cf844a71356fae">sntp.h</a>
+, <a class="el" href="group__sntp.html#gae66404a551d5cef420cf844a71356fae">sntp.c</a>
+</li>
+<li>sntp_getreachability()
+: <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()
+: <a class="el" href="group__sntp.html#ga2a28523cb9f2b5b025a4818bc2c1afc1">sntp.h</a>
+, <a class="el" href="group__sntp.html#ga2a28523cb9f2b5b025a4818bc2c1afc1">sntp.c</a>
+</li>
+<li>sntp_init()
+: <a class="el" href="group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba">sntp.h</a>
+, <a class="el" href="group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba">sntp.c</a>
+</li>
+<li>sntp_setoperatingmode()
+: <a class="el" href="group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120">sntp.h</a>
+, <a class="el" href="group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120">sntp.c</a>
+</li>
+<li>sntp_setserver()
+: <a class="el" href="group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a">sntp.c</a>
+, <a class="el" href="group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a">sntp.h</a>
+</li>
+<li>sntp_stop()
+: <a class="el" href="group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488">sntp.h</a>
+, <a class="el" href="group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488">sntp.c</a>
+</li>
+<li>stats_init()
+: <a class="el" href="stats_8c.html#aeaa149d6c0445b22e944a063e0884d0d">stats.c</a>
+, <a class="el" href="stats_8h.html#aeaa149d6c0445b22e944a063e0884d0d">stats.h</a>
+</li>
+<li>sys_arch_mbox_fetch()
+: <a class="el" href="group__sys__mbox.html#ga6464cd77cf6799bd8b3d6c840166a2e8">sys.h</a>
+</li>
+<li>sys_arch_mbox_tryfetch()
+: <a class="el" href="group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c">sys.h</a>
+</li>
+<li>sys_arch_sem_wait()
+: <a class="el" href="group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f">sys.h</a>
+</li>
+<li>sys_check_timeouts()
+: <a class="el" href="group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883">timeouts.c</a>
+, <a class="el" href="group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883">timeouts.h</a>
+</li>
+<li>sys_init()
+: <a class="el" href="group__sys__misc.html#gaf411a8bc6b7ed4b0af9114e10c959448">sys.h</a>
+</li>
+<li>sys_jiffies()
+: <a class="el" href="sys_8h.html#ac89f307e8b360eaf821b461a4f26753a">sys.h</a>
+</li>
+<li>sys_mbox_free()
+: <a class="el" href="group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f">sys.h</a>
+</li>
+<li>sys_mbox_new()
+: <a class="el" href="group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc">sys.h</a>
+</li>
+<li>sys_mbox_post()
+: <a class="el" href="group__sys__mbox.html#ga9d068386a3c53dd01b8af99c3ef77555">sys.h</a>
+</li>
+<li>sys_mbox_set_invalid()
+: <a class="el" href="group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172">sys.h</a>
+</li>
+<li>sys_mbox_trypost()
+: <a class="el" href="group__sys__mbox.html#gaa36345e48a49d67cbb0878cd4cbd2195">sys.h</a>
+</li>
+<li>sys_mbox_trypost_fromisr()
+: <a class="el" href="group__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a">sys.h</a>
+</li>
+<li>sys_mbox_valid()
+: <a class="el" href="group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d">sys.h</a>
+</li>
+<li>sys_msleep()
+: <a class="el" href="group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e">sys.c</a>
+, <a class="el" href="group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e">sys.h</a>
+</li>
+<li>sys_mutex_free()
+: <a class="el" href="group__sys__mutex.html#ga16336ce68b741e98204102ca4bc84dd9">sys.h</a>
+</li>
+<li>sys_mutex_lock()
+: <a class="el" href="group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a">sys.h</a>
+</li>
+<li>sys_mutex_new()
+: <a class="el" href="group__sys__mutex.html#ga38e7dae1fd88b338eb1cd97f110f3897">sys.h</a>
+</li>
+<li>sys_mutex_set_invalid()
+: <a class="el" href="group__sys__mutex.html#ga3f392725971dc837aa56dd7e45fa7ca8">sys.h</a>
+</li>
+<li>sys_mutex_unlock()
+: <a class="el" href="group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb">sys.h</a>
+</li>
+<li>sys_mutex_valid()
+: <a class="el" href="group__sys__mutex.html#gaebe83ba90a6d9c23cdb3eb5d49562c4a">sys.h</a>
+</li>
+<li>sys_now()
+: <a class="el" href="group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199">sys.h</a>
+</li>
+<li>sys_restart_timeouts()
+: <a class="el" href="timeouts_8h.html#a6913959cf264dbe876b7e7c4db1cc13e">timeouts.h</a>
+, <a class="el" href="timeouts_8c.html#a6913959cf264dbe876b7e7c4db1cc13e">timeouts.c</a>
+</li>
+<li>sys_sem_free()
+: <a class="el" href="group__sys__sem.html#ga83b781f96c30e915c752065a757da283">sys.h</a>
+</li>
+<li>sys_sem_new()
+: <a class="el" href="group__sys__sem.html#gaf99da9e34a71855285c535183133dfde">sys.h</a>
+</li>
+<li>sys_sem_set_invalid()
+: <a class="el" href="group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33">sys.h</a>
+</li>
+<li>sys_sem_signal()
+: <a class="el" href="group__sys__sem.html#gaaf800273061fcc3f8200fd4e1b9ca875">sys.h</a>
+</li>
+<li>sys_sem_valid()
+: <a class="el" href="group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4">sys.h</a>
+</li>
+<li>sys_thread_new()
+: <a class="el" href="group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a">sys.h</a>
+</li>
+<li>sys_timeout()
+: <a class="el" href="timeouts_8h.html#a8deed391626ec8b5423998e33782d7a8">timeouts.h</a>
+, <a class="el" href="timeouts_8c.html#a8deed391626ec8b5423998e33782d7a8">timeouts.c</a>
+</li>
+<li>sys_timeouts_init()
+: <a class="el" href="timeouts_8c.html#a60f42f167f496f6f740c8df48f4dd26c">timeouts.c</a>
+, <a class="el" href="timeouts_8h.html#a60f42f167f496f6f740c8df48f4dd26c">timeouts.h</a>
+</li>
+<li>sys_timeouts_sleeptime()
+: <a class="el" href="timeouts_8h.html#aa9971a14a5810cfeb1efd7104cde6664">timeouts.h</a>
+, <a class="el" href="timeouts_8c.html#aa9971a14a5810cfeb1efd7104cde6664">timeouts.c</a>
+</li>
+<li>sys_untimeout()
+: <a class="el" href="timeouts_8h.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6">timeouts.h</a>
+, <a class="el" href="timeouts_8c.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6">timeouts.c</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_func_t.html b/doc/doxygen/output/html/globals_func_t.html
new file mode 100644
index 0000000..5d8e216
--- /dev/null
+++ b/doc/doxygen/output/html/globals_func_t.html
@@ -0,0 +1,399 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_func_t.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_t"></a>- t -</h3><ul>
+<li>tcp_abandon()
+: <a class="el" href="tcp_8c.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe">tcp_priv.h</a>
+</li>
+<li>tcp_abort()
+: <a class="el" href="group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61">tcp.h</a>
+, <a class="el" href="group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61">tcp.c</a>
+</li>
+<li>tcp_accept()
+: <a class="el" href="group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62">tcp.h</a>
+</li>
+<li>tcp_alloc()
+: <a class="el" href="tcp__priv_8h.html#a1dd6830a42b3c464b5a72f62ae312d0a">tcp_priv.h</a>
+, <a class="el" href="tcp_8c.html#a1dd6830a42b3c464b5a72f62ae312d0a">tcp.c</a>
+</li>
+<li>tcp_arg()
+: <a class="el" href="group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6">tcp.h</a>
+</li>
+<li>tcp_backlog_accepted()
+: <a class="el" href="group__tcp__raw.html#ga619154658137a23839ca3b94882131ca">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#ga619154658137a23839ca3b94882131ca">tcp.h</a>
+</li>
+<li>tcp_backlog_delayed()
+: <a class="el" href="group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8">tcp.h</a>
+</li>
+<li>tcp_bind()
+: <a class="el" href="group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee">tcp.h</a>
+, <a class="el" href="group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee">tcp.c</a>
+</li>
+<li>tcp_bind_netif()
+: <a class="el" href="group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f">tcp.h</a>
+</li>
+<li>tcp_close()
+: <a class="el" href="group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623">tcp.h</a>
+</li>
+<li>tcp_connect()
+: <a class="el" href="group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012">tcp.h</a>
+</li>
+<li>tcp_eff_send_mss_netif()
+: <a class="el" href="tcp_8c.html#a08a3b5396c40f32dd8b21e7d63b3e1b3">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a08a3b5396c40f32dd8b21e7d63b3e1b3">tcp_priv.h</a>
+</li>
+<li>tcp_enqueue_flags()
+: <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()
+: <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()
+: <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()
+: <a class="el" href="group__tcp__raw__extargs.html#gaa8ac7a74407cb3e0e01a30314805f990">tcp.h</a>
+, <a class="el" href="group__tcp__raw__extargs.html#gaa8ac7a74407cb3e0e01a30314805f990">tcp.c</a>
+</li>
+<li>tcp_ext_arg_invoke_callbacks_passive_open()
+: <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()
+: <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()
+: <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_fasttmr()
+: <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()
+: <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()
+: <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>
+<li>tcp_input()
+: <a class="el" href="tcp__in_8c.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5">tcp_in.c</a>
+, <a class="el" href="tcp__priv_8h.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5">tcp_priv.h</a>
+</li>
+<li>tcp_keepalive()
+: <a class="el" href="tcp__out_8c.html#a0d8bb5fc8522515aa35d305774cc5332">tcp_out.c</a>
+, <a class="el" href="tcp__priv_8h.html#a0d8bb5fc8522515aa35d305774cc5332">tcp_priv.h</a>
+</li>
+<li>tcp_listen_with_backlog()
+: <a class="el" href="group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338">tcp.h</a>
+</li>
+<li>tcp_listen_with_backlog_and_err()
+: <a class="el" href="group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436">tcp.h</a>
+</li>
+<li>tcp_netif_ip_addr_changed()
+: <a class="el" href="tcp_8c.html#a4d0c2d1ad02134c79fc72fe95ee2a703">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a4d0c2d1ad02134c79fc72fe95ee2a703">tcp_priv.h</a>
+</li>
+<li>tcp_new()
+: <a class="el" href="group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943">tcp.h</a>
+</li>
+<li>tcp_new_ip_type()
+: <a class="el" href="group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937">tcp.h</a>
+</li>
+<li>tcp_next_iss()
+: <a class="el" href="tcp_8c.html#afd5dc2fa74855a84b2da642ba31059ea">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#afd5dc2fa74855a84b2da642ba31059ea">tcp_priv.h</a>
+</li>
+<li>tcp_output()
+: <a class="el" href="group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f">tcp_out.c</a>
+, <a class="el" href="group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f">tcp.h</a>
+</li>
+<li>tcp_pcb_purge()
+: <a class="el" href="tcp__priv_8h.html#a44fc672b9d14a65e61040707c45302ba">tcp_priv.h</a>
+, <a class="el" href="tcp_8c.html#a44fc672b9d14a65e61040707c45302ba">tcp.c</a>
+</li>
+<li>tcp_pcb_remove()
+: <a class="el" href="tcp_8c.html#aaaef096f6a03bf5b778329bb66ee06f6">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#aaaef096f6a03bf5b778329bb66ee06f6">tcp_priv.h</a>
+</li>
+<li>tcp_poll()
+: <a class="el" href="group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5">tcp.h</a>
+</li>
+<li>tcp_process_refused_data()
+: <a class="el" href="tcp_8c.html#a0075b56ad4b0eca7c9d439cf150e1973">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a0075b56ad4b0eca7c9d439cf150e1973">tcp_priv.h</a>
+</li>
+<li>tcp_recv()
+: <a class="el" href="group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0">tcp.h</a>
+</li>
+<li>tcp_recv_null()
+: <a class="el" href="tcp_8c.html#a0cb3f604fc8d20870d8cab291da5701c">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a0cb3f604fc8d20870d8cab291da5701c">tcp_priv.h</a>
+</li>
+<li>tcp_recved()
+: <a class="el" href="group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44">tcp.h</a>
+</li>
+<li>tcp_rexmit()
+: <a class="el" href="tcp__out_8c.html#af75fefe4fe509845be156d6e424eb6f1">tcp_out.c</a>
+, <a class="el" href="tcp__priv_8h.html#af75fefe4fe509845be156d6e424eb6f1">tcp_priv.h</a>
+</li>
+<li>tcp_rexmit_fast()
+: <a class="el" href="tcp__out_8c.html#adb6ee7b4d59f125cc8bfac3bb5ca3937">tcp_out.c</a>
+, <a class="el" href="tcp__priv_8h.html#adb6ee7b4d59f125cc8bfac3bb5ca3937">tcp_priv.h</a>
+</li>
+<li>tcp_rexmit_rto()
+: <a class="el" href="tcp__out_8c.html#ab5ef9c8ab4629eb721987ae316b9f30f">tcp_out.c</a>
+, <a class="el" href="tcp__priv_8h.html#ab5ef9c8ab4629eb721987ae316b9f30f">tcp_priv.h</a>
+</li>
+<li>tcp_rexmit_rto_commit()
+: <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()
+: <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()
+: <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_seg_copy()
+: <a class="el" href="tcp_8c.html#a569d79451d2570e4ef406775725ef6ef">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a569d79451d2570e4ef406775725ef6ef">tcp_priv.h</a>
+</li>
+<li>tcp_seg_free()
+: <a class="el" href="tcp__priv_8h.html#ac6283651b26f74dba2444159aee88b20">tcp_priv.h</a>
+, <a class="el" href="tcp_8c.html#ac6283651b26f74dba2444159aee88b20">tcp.c</a>
+</li>
+<li>tcp_segs_free()
+: <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()
+: <a class="el" href="tcp__priv_8h.html#aefde3e34b2cc8df9654986484c44a996">tcp_priv.h</a>
+, <a class="el" href="tcp__out_8c.html#aefde3e34b2cc8df9654986484c44a996">tcp_out.c</a>
+</li>
+<li>tcp_send_fin()
+: <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()
+: <a class="el" href="group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808">tcp.h</a>
+, <a class="el" href="group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808">tcp.c</a>
+</li>
+<li>tcp_setprio()
+: <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_shutdown()
+: <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()
+: <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()
+: <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>
+<li>tcp_timer_needed()
+: <a class="el" href="tcp__priv_8h.html#a8181bc316fdf61b85f787c5cadfcd249">tcp_priv.h</a>
+, <a class="el" href="timeouts_8c.html#a8181bc316fdf61b85f787c5cadfcd249">timeouts.c</a>
+</li>
+<li>tcp_tmr()
+: <a class="el" href="tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a3846a756b13214ed88ea47d0ff8279eb">tcp_priv.h</a>
+</li>
+<li>tcp_txnow()
+: <a class="el" href="tcp_8c.html#a5ae0268e59fda0665fdd08c6e77ec547">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a5ae0268e59fda0665fdd08c6e77ec547">tcp_priv.h</a>
+</li>
+<li>tcp_update_rcv_ann_wnd()
+: <a class="el" href="tcp_8c.html#a6d2c254b779db4e517cb34e41301588d">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a6d2c254b779db4e517cb34e41301588d">tcp_priv.h</a>
+</li>
+<li>tcp_write()
+: <a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp.h</a>
+, <a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp_out.c</a>
+</li>
+<li>tcp_zero_window_probe()
+: <a class="el" href="tcp__out_8c.html#a6c20490aa45c771c38ce8ad3031cbdf6">tcp_out.c</a>
+, <a class="el" href="tcp__priv_8h.html#a6c20490aa45c771c38ce8ad3031cbdf6">tcp_priv.h</a>
+</li>
+<li>tcpip_6lowpan_input()
+: <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()
+: <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()
+: <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_callbackmsg_delete()
+: <a class="el" href="group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd">tcpip.h</a>
+, <a class="el" href="group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd">tcpip.c</a>
+</li>
+<li>tcpip_callbackmsg_new()
+: <a class="el" href="group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac">tcpip.c</a>
+, <a class="el" href="group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac">tcpip.h</a>
+</li>
+<li>tcpip_callbackmsg_trycallback()
+: <a class="el" href="group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8">tcpip.h</a>
+, <a class="el" href="group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8">tcpip.c</a>
+</li>
+<li>tcpip_callbackmsg_trycallback_fromisr()
+: <a class="el" href="group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666">tcpip.h</a>
+, <a class="el" href="group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666">tcpip.c</a>
+</li>
+<li>tcpip_init()
+: <a class="el" href="group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db">tcpip.h</a>
+, <a class="el" href="group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db">tcpip.c</a>
+</li>
+<li>tcpip_inpkt()
+: <a class="el" href="tcpip_8h.html#a93043b3c66dbe4a15a60299c6199d102">tcpip.h</a>
+, <a class="el" href="tcpip_8c.html#a93043b3c66dbe4a15a60299c6199d102">tcpip.c</a>
+</li>
+<li>tcpip_input()
+: <a class="el" href="group__lwip__os.html#gae510f195171bed8499ae94e264a92717">tcpip.h</a>
+, <a class="el" href="group__lwip__os.html#gae510f195171bed8499ae94e264a92717">tcpip.c</a>
+</li>
+<li>tcpip_rfc7668_input()
+: <a class="el" href="lowpan6__ble_8c.html#a6ae90ad69f5d901eb44cf87b9120cd9a">lowpan6_ble.c</a>
+, <a class="el" href="lowpan6__ble_8h.html#a6ae90ad69f5d901eb44cf87b9120cd9a">lowpan6_ble.h</a>
+</li>
+<li>tcpip_send_msg_wait_sem()
+: <a class="el" href="tcpip__priv_8h.html#a12bdf37eddcd72c4178e3ea7d370395d">tcpip_priv.h</a>
+, <a class="el" href="tcpip_8c.html#a12bdf37eddcd72c4178e3ea7d370395d">tcpip.c</a>
+</li>
+<li>tcpip_try_callback()
+: <a class="el" href="group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip.h</a>
+, <a class="el" href="group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip.c</a>
+</li>
+<li>tftp_cleanup()
+: <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()
+: <a class="el" href="group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3">tftp_server.h</a>
+, <a class="el" href="group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3">tftp_server.c</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_func_u.html b/doc/doxygen/output/html/globals_func_u.html
new file mode 100644
index 0000000..d681374
--- /dev/null
+++ b/doc/doxygen/output/html/globals_func_u.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_func_u.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_u"></a>- u -</h3><ul>
+<li>udp_bind()
+: <a class="el" href="group__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e">udp.c</a>
+, <a class="el" href="group__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e">udp.h</a>
+</li>
+<li>udp_bind_netif()
+: <a class="el" href="group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8">udp.h</a>
+, <a class="el" href="group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8">udp.c</a>
+</li>
+<li>udp_connect()
+: <a class="el" href="group__udp__raw.html#ga83625967670477aa254643129a53971b">udp.c</a>
+, <a class="el" href="group__udp__raw.html#ga83625967670477aa254643129a53971b">udp.h</a>
+</li>
+<li>udp_disconnect()
+: <a class="el" href="group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc">udp.h</a>
+, <a class="el" href="group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc">udp.c</a>
+</li>
+<li>udp_init()
+: <a class="el" href="udp_8c.html#ae7f7431ce99333577d7b82b26619309e">udp.c</a>
+, <a class="el" href="udp_8h.html#ae7f7431ce99333577d7b82b26619309e">udp.h</a>
+</li>
+<li>udp_input()
+: <a class="el" href="udp_8c.html#a7b338a5515606bd51976fbc5bcec9611">udp.c</a>
+, <a class="el" href="udp_8h.html#a7b338a5515606bd51976fbc5bcec9611">udp.h</a>
+</li>
+<li>udp_netif_ip_addr_changed()
+: <a class="el" href="udp_8c.html#ab857f86a0b15d02b864292b161b2c3fc">udp.c</a>
+, <a class="el" href="udp_8h.html#ab857f86a0b15d02b864292b161b2c3fc">udp.h</a>
+</li>
+<li>udp_new()
+: <a class="el" href="group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209">udp.h</a>
+, <a class="el" href="group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209">udp.c</a>
+</li>
+<li>udp_new_ip_type()
+: <a class="el" href="group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88">udp.c</a>
+, <a class="el" href="group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88">udp.h</a>
+</li>
+<li>udp_recv()
+: <a class="el" href="group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027">udp.h</a>
+, <a class="el" href="group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027">udp.c</a>
+</li>
+<li>udp_remove()
+: <a class="el" href="group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646">udp.c</a>
+, <a class="el" href="group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646">udp.h</a>
+</li>
+<li>udp_send()
+: <a class="el" href="group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc">udp.c</a>
+, <a class="el" href="group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc">udp.h</a>
+</li>
+<li>udp_sendto()
+: <a class="el" href="group__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743">udp.c</a>
+, <a class="el" href="group__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743">udp.h</a>
+</li>
+<li>udp_sendto_if()
+: <a class="el" href="group__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142">udp.h</a>
+, <a class="el" href="group__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142">udp.c</a>
+</li>
+<li>udp_sendto_if_src()
+: <a class="el" href="group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7">udp.c</a>
+, <a class="el" href="group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7">udp.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_func_z.html b/doc/doxygen/output/html/globals_func_z.html
new file mode 100644
index 0000000..f5234d3
--- /dev/null
+++ b/doc/doxygen/output/html/globals_func_z.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_func_z.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_z"></a>- z -</h3><ul>
+<li>zepif_init()
+: <a class="el" href="group__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004">zepif.h</a>
+, <a class="el" href="group__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004">zepif.c</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_g.html b/doc/doxygen/output/html/globals_g.html
new file mode 100644
index 0000000..22dcff2
--- /dev/null
+++ b/doc/doxygen/output/html/globals_g.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_g.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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"></a>- g -</h3><ul>
+<li>getaddrinfo
+: <a class="el" href="group__netdbapi.html#ga558191530d91c101621b49e43bd5bbf5">netdb.h</a>
+</li>
+<li>gethostbyname
+: <a class="el" href="group__netdbapi.html#ga39746b4b096060ca3e8c6ee7a7560b1d">netdb.h</a>
+</li>
+<li>gethostbyname_r
+: <a class="el" href="group__netdbapi.html#ga76204a4d646dba393f88aa9b0980fc07">netdb.h</a>
+</li>
+<li>getpeername
+: <a class="el" href="group__socket.html#ga33bf1b7f5b11de02d0db32531cd940b8">sockets.h</a>
+</li>
+<li>getsockname
+: <a class="el" href="group__socket.html#gab096fb7dbc3f84be1699a87dce980f2f">sockets.h</a>
+</li>
+<li>getsockopt
+: <a class="el" href="group__socket.html#gad2de02b35dbbf2334d1befb137ede821">sockets.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_h.html b/doc/doxygen/output/html/globals_h.html
new file mode 100644
index 0000000..0da2bda
--- /dev/null
+++ b/doc/doxygen/output/html/globals_h.html
@@ -0,0 +1,239 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_h"></a>- h -</h3><ul>
+<li>h_errno
+: <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
+: <a class="el" href="netdb_8c.html#acfc1e988534c0e497599b904739f92fe">netdb.c</a>
+</li>
+<li>HTTP_DEFAULT_PORT
+: <a class="el" href="group__httpc.html#ga1f192f3009865e9f9a3cd83609c866c2">http_client.h</a>
+</li>
+<li>HTTP_IS_DATA_VOLATILE
+: <a class="el" href="httpd_8c.html#aa93d60e8af23b915b5b9652ff71e1300">httpd.c</a>
+</li>
+<li>HTTP_IS_HDR_VOLATILE
+: <a class="el" href="httpd_8c.html#af281bc4a762d56243e0b85dd4197174a">httpd.c</a>
+</li>
+<li>HTTP_IS_TAG_VOLATILE
+: <a class="el" href="group__httpd__opts.html#ga662e88120b507426374dd8ebbd54a048">httpd_opts.h</a>
+</li>
+<li>http_set_cgi_handlers()
+: <a class="el" href="group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897">httpd.c</a>
+, <a class="el" href="group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897">httpd.h</a>
+</li>
+<li>http_set_ssi_handler()
+: <a class="el" href="group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c">httpd.c</a>
+, <a class="el" href="group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c">httpd.h</a>
+</li>
+<li>HTTPC_CLIENT_AGENT
+: <a class="el" href="http__client_8c.html#aeda6122d341b879ba8b0fb2df834276a">http_client.c</a>
+</li>
+<li>HTTPC_DEBUG
+: <a class="el" href="http__client_8c.html#a32d4c0e6e42327e21fb59dabdc152dd1">http_client.c</a>
+</li>
+<li>HTTPC_DEBUG_REQUEST
+: <a class="el" href="http__client_8c.html#ad2ec42c8e7adaef67266a5bd12c4ad2a">http_client.c</a>
+</li>
+<li>httpc_get_file()
+: <a class="el" href="group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b">http_client.h</a>
+, <a class="el" href="group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b">http_client.c</a>
+</li>
+<li>httpc_get_file_dns()
+: <a class="el" href="group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6">http_client.c</a>
+, <a class="el" href="group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6">http_client.h</a>
+</li>
+<li>httpc_headers_done_fn
+: <a class="el" href="group__httpc.html#ga1e5b62519d6592c89ed3edfabd917472">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_ERR_CLOSED
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a89a6700abb14dd7cab9b4e0fd66e5fd6">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_ERR_CONNECT
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ab866d5433b4c4593c80b756d434e1d09">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_ERR_CONTENT_LEN
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a6c8a4195834e1997a498a03bb47bb096">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_ERR_HOSTNAME
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ae04714f90692c122e6c85e06083dbc6d">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_ERR_MEM
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a49972833ec01c7a10dee734c7c69ed62">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_ERR_SVR_RESP
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3aaa023a6f8069c02c87a826ba323c54b8">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_ERR_TIMEOUT
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a8e6c597f88335b31e6a8b078a32fde33">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_ERR_UNKNOWN
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a5026187026abd1d242333ba6ff69ddbd">http_client.h</a>
+</li>
+<li>httpc_result_fn
+: <a class="el" href="group__httpc.html#ga0452eb8007dbb5f139ec992e58e560dd">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_LOCAL_ABORT
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3adf4e45365923c16b6a6879bde5f60867">http_client.h</a>
+</li>
+<li>HTTPC_RESULT_OK
+: <a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3af3173d4d272c9c0b5a5c9b5b027e3659">http_client.h</a>
+</li>
+<li>httpc_result_t
+: <a class="el" href="group__httpc.html#gac6713454283bff8e1187849e8d4bda18">http_client.h</a>
+</li>
+<li>HTTPD_DEBUG_TIMING
+: <a class="el" href="group__httpd__opts.html#ga5f2642874f930798d975b1f7a6d2e1da">httpd_opts.h</a>
+</li>
+<li>HTTPD_ENABLE_HTTPS
+: <a class="el" href="group__httpd__opts.html#ga64dc2a10b1c2ec886e698fe9008e51e2">httpd_opts.h</a>
+</li>
+<li>HTTPD_FSDATA_FILE
+: <a class="el" href="group__httpd__opts.html#gad68e8e06ea4c2be1b3508e813a49f7cc">httpd_opts.h</a>
+</li>
+<li>httpd_init()
+: <a class="el" href="group__httpd.html#gac364305cee969a0be43c071722b136e6">httpd.h</a>
+, <a class="el" href="group__httpd.html#gac364305cee969a0be43c071722b136e6">httpd.c</a>
+</li>
+<li>httpd_inits()
+: <a class="el" href="group__httpd.html#gafaedb1911a83854b1e9835132db64409">httpd.c</a>
+, <a class="el" href="group__httpd.html#gafaedb1911a83854b1e9835132db64409">httpd.h</a>
+</li>
+<li>HTTPD_MAX_RETRIES
+: <a class="el" href="group__httpd__opts.html#gad92e78e19fd3ab2af42750e83ed73fd5">httpd_opts.h</a>
+</li>
+<li>HTTPD_POLL_INTERVAL
+: <a class="el" href="group__httpd__opts.html#gacc3e7667baa2cfafd23de2b152df7a63">httpd_opts.h</a>
+</li>
+<li>httpd_post_begin()
+: <a class="el" href="group__httpd.html#ga6cb33693ee8f0c054be82a968ceff582">httpd.h</a>
+</li>
+<li>httpd_post_data_recved()
+: <a class="el" href="group__httpd.html#gaca4357acf5c988b28123bc6f23540380">httpd.h</a>
+, <a class="el" href="group__httpd.html#gaca4357acf5c988b28123bc6f23540380">httpd.c</a>
+</li>
+<li>httpd_post_finished()
+: <a class="el" href="group__httpd.html#ga477473f7ead250fec71f1f8b9926fec5">httpd.h</a>
+</li>
+<li>httpd_post_receive_data()
+: <a class="el" href="group__httpd.html#ga461409c8813c2a82ba63fde987c0e537">httpd.h</a>
+</li>
+<li>HTTPD_PRECALCULATED_CHECKSUM
+: <a class="el" href="group__httpd__opts.html#ga6e5de8515c89af12277e4cb011165103">httpd_opts.h</a>
+</li>
+<li>HTTPD_SERVER_AGENT
+: <a class="el" href="group__httpd__opts.html#gafb2115e763ed3163a3e204a0ba53edb9">httpd_opts.h</a>
+</li>
+<li>HTTPD_SERVER_PORT
+: <a class="el" href="group__httpd__opts.html#ga2b058c5d1bd67e5d7cb260166e3ace50">httpd_opts.h</a>
+</li>
+<li>HTTPD_SERVER_PORT_HTTPS
+: <a class="el" href="group__httpd__opts.html#gaffe653b08bf5ba25b276c655f6813441">httpd_opts.h</a>
+</li>
+<li>HTTPD_SSI_TAG_UNKNOWN
+: <a class="el" href="httpd_8h.html#aeb00bcd99ec9627b108832f0b58891ca">httpd.h</a>
+</li>
+<li>HTTPD_TCP_PRIO
+: <a class="el" href="group__httpd__opts.html#gaabd1f6319d04b8d5f2c93270794d5182">httpd_opts.h</a>
+</li>
+<li>HTTPD_USE_MEM_POOL
+: <a class="el" href="group__httpd__opts.html#gabb13219495a813fceaafa954a238a924">httpd_opts.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_i.html b/doc/doxygen/output/html/globals_i.html
new file mode 100644
index 0000000..8e8af5d
--- /dev/null
+++ b/doc/doxygen/output/html/globals_i.html
@@ -0,0 +1,1039 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_i.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_i"></a>- i -</h3><ul>
+<li>icmp6_dest_unreach()
+: <a class="el" href="icmp6_8c.html#ab480867394952904b5607d62315bdbac">icmp6.c</a>
+, <a class="el" href="icmp6_8h.html#ab480867394952904b5607d62315bdbac">icmp6.h</a>
+</li>
+<li>ICMP6_DUR_ADDRESS
+: <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa789ef8158d8750b0fa5a14ec9ecaa23a">icmp6.h</a>
+</li>
+<li>icmp6_dur_code
+: <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccf">icmp6.h</a>
+</li>
+<li>ICMP6_DUR_NO_ROUTE
+: <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa695bb4d92f32b504a9483ff137235a78">icmp6.h</a>
+</li>
+<li>ICMP6_DUR_POLICY
+: <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfac3c255282e0b49b5bbb3cd8f435bb763">icmp6.h</a>
+</li>
+<li>ICMP6_DUR_PORT
+: <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa28cc924ec6eaa761acb76ccef4adcba0">icmp6.h</a>
+</li>
+<li>ICMP6_DUR_PROHIBITED
+: <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa251961b990d0fbaf2c643f047c4f2532">icmp6.h</a>
+</li>
+<li>ICMP6_DUR_REJECT_ROUTE
+: <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa2aeed278149fb071a34beec89df03b5c">icmp6.h</a>
+</li>
+<li>ICMP6_DUR_SCOPE
+: <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfabdb01a67c61da588872f5799ef75aa6e">icmp6.h</a>
+</li>
+<li>icmp6_input()
+: <a class="el" href="icmp6_8c.html#a94bec819e11f51c8088ca338f2e36c3d">icmp6.c</a>
+, <a class="el" href="icmp6_8h.html#a94bec819e11f51c8088ca338f2e36c3d">icmp6.h</a>
+</li>
+<li>icmp6_packet_too_big()
+: <a class="el" href="icmp6_8c.html#a3c0a84e0944263d92c9dc3ad094ffcb0">icmp6.c</a>
+, <a class="el" href="icmp6_8h.html#a3c0a84e0944263d92c9dc3ad094ffcb0">icmp6.h</a>
+</li>
+<li>icmp6_param_problem()
+: <a class="el" href="icmp6_8h.html#a6094fa333b2cbf1b1b062e72313ef146">icmp6.h</a>
+, <a class="el" href="icmp6_8c.html#a6094fa333b2cbf1b1b062e72313ef146">icmp6.c</a>
+</li>
+<li>icmp6_pp_code
+: <a class="el" href="prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023">icmp6.h</a>
+</li>
+<li>ICMP6_PP_FIELD
+: <a class="el" href="prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a4aa4a79306a69fd4f60ad445cde4c2a9">icmp6.h</a>
+</li>
+<li>ICMP6_PP_HEADER
+: <a class="el" href="prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023acbcc58901e2345ffc31df4098de60ff8">icmp6.h</a>
+</li>
+<li>ICMP6_PP_OPTION
+: <a class="el" href="prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a53884832d00d3c8f8de62cfdb4646932">icmp6.h</a>
+</li>
+<li>ICMP6_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga714006cd5c5b0eb333159d0f677616a0">opt.h</a>
+</li>
+<li>icmp6_te_code
+: <a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e">icmp6.h</a>
+</li>
+<li>ICMP6_TE_FRAG
+: <a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eaec493420d61c80a21981b1aa32befe1f">icmp6.h</a>
+</li>
+<li>ICMP6_TE_HL
+: <a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eacccbb5e776df1b35af4149e593240880">icmp6.h</a>
+</li>
+<li>icmp6_time_exceeded()
+: <a class="el" href="icmp6_8c.html#a358abb6555f6ca6b2b2b1412c9117bec">icmp6.c</a>
+, <a class="el" href="icmp6_8h.html#a358abb6555f6ca6b2b2b1412c9117bec">icmp6.h</a>
+</li>
+<li>icmp6_time_exceeded_with_addrs()
+: <a class="el" href="icmp6_8c.html#ad01e5bc4690a2c6aeb534237a5a9b593">icmp6.c</a>
+, <a class="el" href="icmp6_8h.html#ad01e5bc4690a2c6aeb534237a5a9b593">icmp6.h</a>
+</li>
+<li>icmp6_type
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_DUR
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aad9d4f207459e4bbd0c33a25adf6fdd7">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_EREP
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac6b91695c06bfc7fb2360310d7b8e78a">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_EREQ
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae649aa45c97b885f28771688957528a3">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_MLD
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a04228a1d11f9f88bd165f3430188bfe7">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_MLQ
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ad9794ae12b9ca196cc4fafaf6d834375">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_MLR
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a906dd689f0aa9b4796f49f299d4e3eb0">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_MRA
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a29281016d3bb58e3bfd90417bbce7aa0">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_MRS
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a425f4e64a7d1570228adbbe450650ab4">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_MRT
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afb12a9d774f53deb15ec23041548f6fc">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_NA
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1f99d333f425c28d3840e029cc9c46f3">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_NS
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0d8d8717c6c34053d1101932c23929fe">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_PE1
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac7020c08a7b03ae2a198e4a8dcd31bd4">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_PE2
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aed14d280e5911098af914a94bd3ab22b">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_PE3
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a9c9c358ebd5eb683a66819fd9ecf98c6">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_PE4
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858af8ebe97c4f68b54c9ef0c43e98211df5">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_PP
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a63114feac8140031b74424d4a7cf6b26">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_PTB
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1d52ef5024a5822bd622bcb0b9da323d">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_RA
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae4ae04be7df3a2cce614af0a5cdae951">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_RD
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0f6702d62de5f873e0afe7431d878207">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_RS
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a670d95494c9282f646ac442d81d9a780">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_RSV_ERR
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858abe61415e020b996220337f0cd002a28f">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_RSV_INF
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a2c12d3244d837bd243ea647ec530600d">icmp6.h</a>
+</li>
+<li>ICMP6_TYPE_TE
+: <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afae9848904bc4b4b4aa716a7a9a2d7fe">icmp6.h</a>
+</li>
+<li>ICMP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga9595904a1cb9bfe0b9b1d958abdc923a">opt.h</a>
+</li>
+<li>icmp_dest_unreach()
+: <a class="el" href="icmp_8c.html#ae26c59eab4ce553964a0c9d43f534d06">icmp.c</a>
+, <a class="el" href="icmp_8h.html#ae26c59eab4ce553964a0c9d43f534d06">icmp.h</a>
+</li>
+<li>ICMP_DUR_FRAG
+: <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a8be2bc49d42aa1a6ee1da93a8700ef5f">icmp.h</a>
+</li>
+<li>ICMP_DUR_HOST
+: <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a648ab915a76dfb7b9568e94de00da1e7">icmp.h</a>
+</li>
+<li>ICMP_DUR_NET
+: <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3cc3714544e123bdef2eadb1a4d320e3">icmp.h</a>
+</li>
+<li>ICMP_DUR_PORT
+: <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5ac973dd9b04e094043ccc4cf875ef5644">icmp.h</a>
+</li>
+<li>ICMP_DUR_PROTO
+: <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3c7bbd13b613990413ef167017dfbcef">icmp.h</a>
+</li>
+<li>ICMP_DUR_SR
+: <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5af63296fc25f79e56946a56a8da132c13">icmp.h</a>
+</li>
+<li>icmp_dur_type
+: <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5">icmp.h</a>
+</li>
+<li>icmp_input()
+: <a class="el" href="icmp_8h.html#ac929e48a1dddf98050b73a2633fcaef1">icmp.h</a>
+, <a class="el" href="icmp_8c.html#ac929e48a1dddf98050b73a2633fcaef1">icmp.c</a>
+</li>
+<li>ICMP_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga472ad3f6da741f5b287d66ad3051242b">opt.h</a>
+</li>
+<li>ICMP_TE_FRAG
+: <a class="el" href="icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa4d351874c3e2d4a4cf46569df28cd796">icmp.h</a>
+</li>
+<li>ICMP_TE_TTL
+: <a class="el" href="icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa827a1f8705826a6cc3c22e2571acf02c">icmp.h</a>
+</li>
+<li>icmp_te_type
+: <a class="el" href="icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324a">icmp.h</a>
+</li>
+<li>icmp_time_exceeded()
+: <a class="el" href="icmp_8c.html#a49723e5e11c4bbc86197e58fdca7c119">icmp.c</a>
+, <a class="el" href="icmp_8h.html#a49723e5e11c4bbc86197e58fdca7c119">icmp.h</a>
+</li>
+<li>ICMP_TTL
+: <a class="el" href="group__lwip__opts__icmp.html#gae1533f2bc39a5843989909555f6ce0cf">opt.h</a>
+</li>
+<li>IGMP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga8da07508ee75704362d45eee3eb857fa">opt.h</a>
+</li>
+<li>igmp_init()
+: <a class="el" href="igmp_8c.html#aeb8103aa3091e35c966f0894fb54a2c8">igmp.c</a>
+, <a class="el" href="igmp_8h.html#aeb8103aa3091e35c966f0894fb54a2c8">igmp.h</a>
+</li>
+<li>igmp_input()
+: <a class="el" href="igmp_8c.html#a065685cc25f2cc50f0d9659f4b086e1a">igmp.c</a>
+, <a class="el" href="igmp_8h.html#a065685cc25f2cc50f0d9659f4b086e1a">igmp.h</a>
+</li>
+<li>igmp_joingroup()
+: <a class="el" href="group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6">igmp.c</a>
+, <a class="el" href="group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6">igmp.h</a>
+</li>
+<li>igmp_joingroup_netif()
+: <a class="el" href="group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6">igmp.c</a>
+, <a class="el" href="group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6">igmp.h</a>
+</li>
+<li>igmp_leavegroup()
+: <a class="el" href="group__igmp.html#ga21c572ba7481ca41eb873923a5346544">igmp.c</a>
+, <a class="el" href="group__igmp.html#ga21c572ba7481ca41eb873923a5346544">igmp.h</a>
+</li>
+<li>igmp_leavegroup_netif()
+: <a class="el" href="group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201">igmp.c</a>
+, <a class="el" href="group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201">igmp.h</a>
+</li>
+<li>igmp_lookfor_group()
+: <a class="el" href="igmp_8c.html#a8228ddd10aa3f2518b16815d82d73448">igmp.c</a>
+, <a class="el" href="igmp_8h.html#a8228ddd10aa3f2518b16815d82d73448">igmp.h</a>
+</li>
+<li>igmp_report_groups()
+: <a class="el" href="igmp_8c.html#af06eeba0e984aab4a67a836eab577726">igmp.c</a>
+, <a class="el" href="igmp_8h.html#af06eeba0e984aab4a67a836eab577726">igmp.h</a>
+</li>
+<li>igmp_start()
+: <a class="el" href="igmp_8c.html#aac0fe91a589ba90b3f76e69cebf264f6">igmp.c</a>
+, <a class="el" href="igmp_8h.html#aac0fe91a589ba90b3f76e69cebf264f6">igmp.h</a>
+</li>
+<li>IGMP_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga4d12af1356b9fd60717984be51e27740">opt.h</a>
+</li>
+<li>igmp_stop()
+: <a class="el" href="igmp_8c.html#afc19bd532855a64c021be08172065f84">igmp.c</a>
+, <a class="el" href="igmp_8h.html#afc19bd532855a64c021be08172065f84">igmp.h</a>
+</li>
+<li>igmp_tmr()
+: <a class="el" href="igmp_8c.html#a4418a22d37098f05d0c2fcfe288d0ca1">igmp.c</a>
+, <a class="el" href="igmp_8h.html#a4418a22d37098f05d0c2fcfe288d0ca1">igmp.h</a>
+</li>
+<li>in6addr_any
+: <a class="el" href="inet6_8c.html#af8c97553060738d9edd6bfeab13ef7c3">inet6.c</a>
+, <a class="el" href="lwip_2inet_8h.html#af8c97553060738d9edd6bfeab13ef7c3">inet.h</a>
+</li>
+<li>IN6ADDR_ANY_INIT
+: <a class="el" href="lwip_2inet_8h.html#a1de876a356ee05a2e9427b741f99f49c">inet.h</a>
+</li>
+<li>IN6ADDR_LOOPBACK_INIT
+: <a class="el" href="lwip_2inet_8h.html#a5562c81af19ee5988ddc5a5c6153cf37">inet.h</a>
+</li>
+<li>INADDR_ANY
+: <a class="el" href="lwip_2inet_8h.html#a5d1940045dc2e7de552f3d4ff13a74ab">inet.h</a>
+</li>
+<li>INADDR_BROADCAST
+: <a class="el" href="lwip_2inet_8h.html#a4a725f61ded23ce8a7dff8e82ed51986">inet.h</a>
+</li>
+<li>INADDR_LOOPBACK
+: <a class="el" href="lwip_2inet_8h.html#ae1ac25d7797666cff6d01d6c795c2378">inet.h</a>
+</li>
+<li>INADDR_NONE
+: <a class="el" href="lwip_2inet_8h.html#a3d2472d6cf31b73eeb829110dd0fffea">inet.h</a>
+</li>
+<li>inet_chksum_pbuf()
+: <a class="el" href="inet__chksum_8c.html#ab35967a50418358e194e8f80fdc3c865">inet_chksum.c</a>
+, <a class="el" href="inet__chksum_8h.html#ab35967a50418358e194e8f80fdc3c865">inet_chksum.h</a>
+</li>
+<li>INET_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga78140cbe70258a65cb5c9e381843e4f3">opt.h</a>
+</li>
+<li>inet_ntop
+: <a class="el" href="group__socket.html#gaa40bf11abb409097e68aa3a6982eb52b">sockets.h</a>
+</li>
+<li>inet_pton
+: <a class="el" href="group__socket.html#ga90d2b417d82e8da981c940a665324fd5">sockets.h</a>
+</li>
+<li>ioctl
+: <a class="el" href="group__socket.html#ga50a83956bc3a96e6274a21ec0d4d6338">sockets.h</a>
+</li>
+<li>ioctlsocket
+: <a class="el" href="group__socket.html#ga19e714443d0238cfd79b71059ec92378">sockets.h</a>
+</li>
+<li>ip4_2_ipv4_mapped_ipv6
+: <a class="el" href="group__ipaddr.html#gae5f26df8f5099f330ad1e506c74f06f7">ip_addr.h</a>
+</li>
+<li>IP4_ADDR
+: <a class="el" href="ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974">ip4_addr.h</a>
+</li>
+<li>IP4_ADDR_ANY
+: <a class="el" href="group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff">ip_addr.h</a>
+</li>
+<li>IP4_ADDR_ANY4
+: <a class="el" href="group__ip4addr.html#gaa3f65a42b68149e96e618600b2ca2e42">ip_addr.h</a>
+</li>
+<li>IP4_ADDR_BROADCAST
+: <a class="el" href="group__ip4addr.html#ga5efdf55ba72c2b1b5755b1fc6f559a1a">ip_addr.h</a>
+</li>
+<li>ip4_addr_copy
+: <a class="el" href="ip4__addr_8h.html#a2f4e9c339e897e6ca5cb4a2f1e8394d5">ip4_addr.h</a>
+</li>
+<li>ip4_addr_get_network
+: <a class="el" href="ip4__addr_8h.html#a81658cb05ba504d13ee860e82dc444e9">ip4_addr.h</a>
+</li>
+<li>ip4_addr_get_u32
+: <a class="el" href="ip4__addr_8h.html#ad50d93464bbbda199b585c54869a3a4b">ip4_addr.h</a>
+</li>
+<li>ip4_addr_isbroadcast_u32()
+: <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
+: <a class="el" href="ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051">ip4_addr.h</a>
+</li>
+<li>ip4_addr_netcmp
+: <a class="el" href="ip4__addr_8h.html#afd43f6ceb2df8d50c84509ad1059f514">ip4_addr.h</a>
+</li>
+<li>ip4_addr_netmask_valid()
+: <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
+: <a class="el" href="ip4__addr_8h.html#a33a17a8d2025ce3715db835534868e88">ip4_addr.h</a>
+</li>
+<li>ip4_addr_set_any
+: <a class="el" href="ip4__addr_8h.html#afaaed3762ce8e9de14fcf73b19964567">ip4_addr.h</a>
+</li>
+<li>ip4_addr_set_hton
+: <a class="el" href="ip4__addr_8h.html#a901850ec90b01b9bf6baf69561aa465a">ip4_addr.h</a>
+</li>
+<li>ip4_addr_set_loopback
+: <a class="el" href="ip4__addr_8h.html#a5c7eae50a387987a7f56c29c74255c3c">ip4_addr.h</a>
+</li>
+<li>ip4_addr_set_u32
+: <a class="el" href="ip4__addr_8h.html#aeb39f58b38435f89219c8ccb509eb520">ip4_addr.h</a>
+</li>
+<li>ip4_addr_set_zero
+: <a class="el" href="ip4__addr_8h.html#a973b6ad98e037fc45f1e11d29cda99ea">ip4_addr.h</a>
+</li>
+<li>ip4_addr_t
+: <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr.h</a>
+</li>
+<li>ip4_current_dest_addr
+: <a class="el" href="ip_8h.html#a2833c8d59910dd7c0e87ab3bb174e720">ip.h</a>
+</li>
+<li>ip4_current_header
+: <a class="el" href="ip_8h.html#a3ce482b7e08282effd670001198ecd87">ip.h</a>
+</li>
+<li>ip4_current_src_addr
+: <a class="el" href="ip_8h.html#ad2a62f96b9431a79f0258dc13058b160">ip.h</a>
+</li>
+<li>ip4_frag()
+: <a class="el" href="ip4__frag_8c.html#a70872fd4c7aefec6b4eef0707e1a371c">ip4_frag.c</a>
+, <a class="el" href="ip4__frag_8h.html#a70872fd4c7aefec6b4eef0707e1a371c">ip4_frag.h</a>
+</li>
+<li>ip4_input()
+: <a class="el" href="ip4_8c.html#aff1f784c9f05f3d79cc1a921d840501b">ip4.c</a>
+, <a class="el" href="ip4_8h.html#aff1f784c9f05f3d79cc1a921d840501b">ip4.h</a>
+</li>
+<li>ip4_output()
+: <a class="el" href="ip4_8c.html#ac87d296205eb5ac04058e609672d4ba8">ip4.c</a>
+, <a class="el" href="ip4_8h.html#ac87d296205eb5ac04058e609672d4ba8">ip4.h</a>
+</li>
+<li>ip4_output_if()
+: <a class="el" href="ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917">ip4.c</a>
+, <a class="el" href="ip4_8h.html#ab220bc4ce4f48bdbba447358b3594917">ip4.h</a>
+</li>
+<li>ip4_output_if_opt()
+: <a class="el" href="ip4_8c.html#a0d912e400875396792a12ea443ecc1cf">ip4.c</a>
+, <a class="el" href="ip4_8h.html#a0d912e400875396792a12ea443ecc1cf">ip4.h</a>
+</li>
+<li>ip4_output_if_opt_src()
+: <a class="el" href="ip4_8c.html#accd56b095730de4ad56728bfcb349940">ip4.c</a>
+, <a class="el" href="ip4_8h.html#accd56b095730de4ad56728bfcb349940">ip4.h</a>
+</li>
+<li>ip4_output_if_src()
+: <a class="el" href="ip4_8c.html#a2943d118873e9eb1d8296e04a6740db7">ip4.c</a>
+, <a class="el" href="ip4_8h.html#a2943d118873e9eb1d8296e04a6740db7">ip4.h</a>
+</li>
+<li>ip4_reass()
+: <a class="el" href="ip4__frag_8c.html#a7debaa6366c0db4270d4f03219c75c05">ip4_frag.c</a>
+, <a class="el" href="ip4__frag_8h.html#a7debaa6366c0db4270d4f03219c75c05">ip4_frag.h</a>
+</li>
+<li>ip4_route()
+: <a class="el" href="ip4_8c.html#ac659f675356cfc1d4d13884946347e47">ip4.c</a>
+, <a class="el" href="ip4_8h.html#ac659f675356cfc1d4d13884946347e47">ip4.h</a>
+</li>
+<li>ip4_route_src()
+: <a class="el" href="ip4_8c.html#ab615a9ca8fdd99e697f52506fc440fba">ip4.c</a>
+, <a class="el" href="ip4_8h.html#ab615a9ca8fdd99e697f52506fc440fba">ip4.h</a>
+</li>
+<li>ip4_set_default_multicast_netif()
+: <a class="el" href="group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420">ip4.c</a>
+, <a class="el" href="group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420">ip4.h</a>
+</li>
+<li>ip4addr_aton()
+: <a class="el" href="ip4__addr_8c.html#af66de98501e92c66714d58119b6d9e1a">ip4_addr.c</a>
+, <a class="el" href="ip4__addr_8h.html#af66de98501e92c66714d58119b6d9e1a">ip4_addr.h</a>
+</li>
+<li>ip4addr_ntoa()
+: <a class="el" href="ip4__addr_8c.html#a28620fdd443c5c98d15e5890cbd9059c">ip4_addr.c</a>
+, <a class="el" href="ip4__addr_8h.html#a28620fdd443c5c98d15e5890cbd9059c">ip4_addr.h</a>
+</li>
+<li>ip4addr_ntoa_r()
+: <a class="el" href="ip4__addr_8c.html#a3825d5b4786c207af971ceb287f101fd">ip4_addr.c</a>
+, <a class="el" href="ip4__addr_8h.html#a3825d5b4786c207af971ceb287f101fd">ip4_addr.h</a>
+</li>
+<li>IP6_ADDR
+: <a class="el" href="ip6__addr_8h.html#a30c92254d6abe631de6a5accfd491bc3">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_ANY
+: <a class="el" href="group__ip6addr.html#ga5181d2cb6b9254eb5ad4137f7b3635a0">ip_addr.h</a>
+</li>
+<li>IP6_ADDR_ANY6
+: <a class="el" href="group__ip6addr.html#ga953cdd2592764ba2e6e021aea350ad43">ip_addr.h</a>
+</li>
+<li>ip6_addr_assign_zone
+: <a class="el" href="group__ip6__zones.html#ga1040a3d67498a1ef617bda8d9e0ba3a5">ip6_zone.h</a>
+</li>
+<li>IP6_ADDR_BLOCK1
+: <a class="el" href="ip6__addr_8h.html#ae258ebfa66d18c8c428bf3d8fd0f969c">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_BLOCK2
+: <a class="el" href="ip6__addr_8h.html#a9193137423b6b936d25c2e6cf33b4921">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_BLOCK3
+: <a class="el" href="ip6__addr_8h.html#a6466b1c0edd03d6a5986dcc79f7d8bb6">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_BLOCK4
+: <a class="el" href="ip6__addr_8h.html#a2a5d7de341ce708b7145ad4d72652c71">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_BLOCK5
+: <a class="el" href="ip6__addr_8h.html#a56a11cfaa169389c319f8bd027ac524c">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_BLOCK6
+: <a class="el" href="ip6__addr_8h.html#a116d7c5c8bf8531b27f8a9fa98e728c3">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_BLOCK7
+: <a class="el" href="ip6__addr_8h.html#ab87bee320ecc0e923931ee6f49802deb">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_BLOCK8
+: <a class="el" href="ip6__addr_8h.html#af3d1f9876bf256ec964bd3809d7ed1b4">ip6_addr.h</a>
+</li>
+<li>ip6_addr_clear_zone
+: <a class="el" href="group__ip6__zones.html#gae0249db6cd2687f2dbc445e7778d37ad">ip6_zone.h</a>
+</li>
+<li>ip6_addr_cmp
+: <a class="el" href="ip6__addr_8h.html#aea8d4c4134abff1c76bc997a91163fe1">ip6_addr.h</a>
+</li>
+<li>ip6_addr_cmp_packed
+: <a class="el" href="ip6__addr_8h.html#a11fe84789e3f039b3f71009e802946a8">ip6_addr.h</a>
+</li>
+<li>ip6_addr_cmp_zone
+: <a class="el" href="group__ip6__zones.html#gacbb8e1a7505d9772181defa0e75b8da9">ip6_zone.h</a>
+</li>
+<li>ip6_addr_cmp_zoneless
+: <a class="el" href="ip6__addr_8h.html#ad0fc088972d395839a7ad75d3dab8322">ip6_addr.h</a>
+</li>
+<li>ip6_addr_copy
+: <a class="el" href="ip6__addr_8h.html#a7b17e85a46bd8368ce27fc644e058073">ip6_addr.h</a>
+</li>
+<li>ip6_addr_copy_from_packed
+: <a class="el" href="ip6__addr_8h.html#a05575d46c233ffb13fb03a3a2c8a16b3">ip6_addr.h</a>
+</li>
+<li>ip6_addr_copy_to_packed
+: <a class="el" href="ip6__addr_8h.html#a6c46d12fa7d36c47b629d0ccdefa114b">ip6_addr.h</a>
+</li>
+<li>ip6_addr_copy_zone
+: <a class="el" href="group__ip6__zones.html#ga7347729485d837bcff85ae4731bbf5c4">ip6_zone.h</a>
+</li>
+<li>ip6_addr_equals_zone
+: <a class="el" href="group__ip6__zones.html#gaeead8379cc3fd4c257be0bb654994a8f">ip6_zone.h</a>
+</li>
+<li>ip6_addr_has_scope
+: <a class="el" href="group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90">ip6_zone.h</a>
+</li>
+<li>ip6_addr_has_zone
+: <a class="el" href="group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78">ip6_zone.h</a>
+</li>
+<li>ip6_addr_lacks_zone
+: <a class="el" href="group__ip6__zones.html#gad963bf3e9695ba898271e314975f5c97">ip6_zone.h</a>
+</li>
+<li>ip6_addr_netcmp
+: <a class="el" href="ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2">ip6_addr.h</a>
+</li>
+<li>ip6_addr_netcmp_zoneless
+: <a class="el" href="ip6__addr_8h.html#acc1622ab895680da0a3b6e5e56070342">ip6_addr.h</a>
+</li>
+<li>IP6_ADDR_PART
+: <a class="el" href="ip6__addr_8h.html#a1d78feeb50aec8f2c07d840829f49ddd">ip6_addr.h</a>
+</li>
+<li>ip6_addr_select_zone
+: <a class="el" href="group__ip6__zones.html#gac83f3e7c8d65d3c784bffc9dec29b70c">ip6_zone.h</a>
+</li>
+<li>ip6_addr_set
+: <a class="el" href="ip6__addr_8h.html#aa7b4ba4202b5f64dee605fe159e9c3ad">ip6_addr.h</a>
+</li>
+<li>ip6_addr_set_any
+: <a class="el" href="ip6__addr_8h.html#ae2d1ce50ec6dbee890e2f8ae64abdf6b">ip6_addr.h</a>
+</li>
+<li>ip6_addr_set_hton
+: <a class="el" href="ip6__addr_8h.html#ad636c27d56d1b3deca9f780bc173d3c2">ip6_addr.h</a>
+</li>
+<li>ip6_addr_set_loopback
+: <a class="el" href="ip6__addr_8h.html#a02f5271e922f34a09153ce84839ad292">ip6_addr.h</a>
+</li>
+<li>ip6_addr_set_zero
+: <a class="el" href="ip6__addr_8h.html#af696d3b81f4cb9c40ece912de73ed53c">ip6_addr.h</a>
+</li>
+<li>ip6_addr_set_zone
+: <a class="el" href="group__ip6__zones.html#ga213310b303dd050da7856d67da72abd6">ip6_zone.h</a>
+</li>
+<li>ip6_addr_t
+: <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr.h</a>
+</li>
+<li>ip6_addr_test_zone
+: <a class="el" href="group__ip6__zones.html#gac3ec5f94e1cd62b1237efca3723dc06e">ip6_zone.h</a>
+</li>
+<li>ip6_addr_zone
+: <a class="el" href="group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634">ip6_zone.h</a>
+</li>
+<li>ip6_chksum_pseudo()
+: <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()
+: <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
+: <a class="el" href="ip_8h.html#a176525c2192d37ee9eaeba8012c5d9c0">ip.h</a>
+</li>
+<li>ip6_current_header
+: <a class="el" href="ip_8h.html#af9bf74750c9d7a219ee88d240300fe69">ip.h</a>
+</li>
+<li>ip6_current_src_addr
+: <a class="el" href="ip_8h.html#ac40a9e4a21ecf5bb39813bb6ca5bb245">ip.h</a>
+</li>
+<li>IP6_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gac2f9726756b78d4d7c425b0422a776ce">opt.h</a>
+</li>
+<li>ip6_frag()
+: <a class="el" href="ip6__frag_8c.html#a3ef87acbc615d5eb015104f83bbe7d37">ip6_frag.c</a>
+, <a class="el" href="ip6__frag_8h.html#a3ef87acbc615d5eb015104f83bbe7d37">ip6_frag.h</a>
+</li>
+<li>IP6_FRAG_STATS
+: <a class="el" href="group__lwip__opts__stats.html#gaaa08a181c11ff8b471549e8f52c9939b">opt.h</a>
+</li>
+<li>ip6_input()
+: <a class="el" href="ip6_8c.html#a6bbbae5ea37a82c746dba2feb1abd094">ip6.c</a>
+, <a class="el" href="ip6_8h.html#a6bbbae5ea37a82c746dba2feb1abd094">ip6.h</a>
+</li>
+<li>IP6_MULTICAST
+: <a class="el" href="group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfea70cda997b66f3e120e925c5a41904809">ip6_zone.h</a>
+</li>
+<li>IP6_NO_ZONE
+: <a class="el" href="group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb">ip6_zone.h</a>
+</li>
+<li>ip6_options_add_hbh_ra()
+: <a class="el" href="ip6_8c.html#a7a8d47200bb6ccbec329be8f0979853e">ip6.c</a>
+, <a class="el" href="ip6_8h.html#a7a8d47200bb6ccbec329be8f0979853e">ip6.h</a>
+</li>
+<li>ip6_output()
+: <a class="el" href="ip6_8h.html#aec695e64536ac744e616c997deb84cda">ip6.h</a>
+, <a class="el" href="ip6_8c.html#aec695e64536ac744e616c997deb84cda">ip6.c</a>
+</li>
+<li>ip6_output_if()
+: <a class="el" href="ip6_8c.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4">ip6.c</a>
+, <a class="el" href="ip6_8h.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4">ip6.h</a>
+</li>
+<li>ip6_output_if_src()
+: <a class="el" href="ip6_8h.html#a58bd3c9ce332731fac82b89c77be4f56">ip6.h</a>
+, <a class="el" href="ip6_8c.html#a58bd3c9ce332731fac82b89c77be4f56">ip6.c</a>
+</li>
+<li>ip6_reass()
+: <a class="el" href="ip6__frag_8c.html#adbd666d01adcbbbc5966938f02025b7c">ip6_frag.c</a>
+, <a class="el" href="ip6__frag_8h.html#adbd666d01adcbbbc5966938f02025b7c">ip6_frag.h</a>
+</li>
+<li>IP6_REASS_TMR_INTERVAL
+: <a class="el" href="ip6__frag_8h.html#ad0730ee4db9fbebdf071bb33d75698a2">ip6_frag.h</a>
+</li>
+<li>ip6_route()
+: <a class="el" href="ip6_8c.html#a1153bd9e8c45847282105ab6379e6e70">ip6.c</a>
+, <a class="el" href="ip6_8h.html#a1153bd9e8c45847282105ab6379e6e70">ip6.h</a>
+</li>
+<li>ip6_select_source_address()
+: <a class="el" href="group__ip6.html#ga540ad82e2af4c4709f1852e63c36706a">ip6.c</a>
+, <a class="el" href="group__ip6.html#ga540ad82e2af4c4709f1852e63c36706a">ip6.h</a>
+</li>
+<li>IP6_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga6a211b787c97bce3af4273b29c95d9c2">opt.h</a>
+</li>
+<li>IP6_UNICAST
+: <a class="el" href="group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0">ip6_zone.h</a>
+</li>
+<li>IP6_UNKNOWN
+: <a class="el" href="group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8">ip6_zone.h</a>
+</li>
+<li>ip6addr_aton()
+: <a class="el" href="ip6__addr_8c.html#a3f555ae302eb056f28f6cb266a27036e">ip6_addr.c</a>
+, <a class="el" href="ip6__addr_8h.html#a3f555ae302eb056f28f6cb266a27036e">ip6_addr.h</a>
+</li>
+<li>ip6addr_ntoa()
+: <a class="el" href="ip6__addr_8c.html#adba4443e6629583d48e1d1c7c21a977e">ip6_addr.c</a>
+, <a class="el" href="ip6__addr_8h.html#adba4443e6629583d48e1d1c7c21a977e">ip6_addr.h</a>
+</li>
+<li>ip6addr_ntoa_r()
+: <a class="el" href="ip6__addr_8c.html#a64d442f35f34c43121bf91cfea2e77a2">ip6_addr.c</a>
+, <a class="el" href="ip6__addr_8h.html#a64d442f35f34c43121bf91cfea2e77a2">ip6_addr.h</a>
+</li>
+<li>ip_2_ip4
+: <a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_addr.h</a>
+</li>
+<li>ip_2_ip6
+: <a class="el" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_addr.h</a>
+</li>
+<li>IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT
+: <a class="el" href="ip4_8c.html#a185c7d6380711847105430931692b267">ip4.c</a>
+</li>
+<li>IP_ADDR4
+: <a class="el" href="group__ip4addr.html#gadd2203c6cbfb6de8c2d9ce5bbfb2bd2a">ip_addr.h</a>
+</li>
+<li>IP_ADDR6
+: <a class="el" href="group__ip6addr.html#ga9ee53b601b89dcb517496ba0bccf9bd0">ip_addr.h</a>
+</li>
+<li>IP_ADDR6_HOST
+: <a class="el" href="group__ip6addr.html#gabfb1ce44d6a8791336bf3ac06aa086ca">ip_addr.h</a>
+</li>
+<li>IP_ADDR_ANY
+: <a class="el" href="group__ip4addr.html#ga3e5e67b7292b156034560fef2202776c">ip_addr.h</a>
+</li>
+<li>IP_ADDR_BROADCAST
+: <a class="el" href="group__ip4addr.html#gad546955e48dada78b552375b873f6986">ip_addr.h</a>
+</li>
+<li>ip_addr_cmp
+: <a class="el" href="group__ipaddr.html#ga008c9c92d770cc030ea054e6b259835a">ip_addr.h</a>
+</li>
+<li>ip_addr_cmp_zoneless
+: <a class="el" href="group__ipaddr.html#gadb66f6d5fa926ed4b0e69db58dffcbe4">ip_addr.h</a>
+</li>
+<li>ip_addr_copy
+: <a class="el" href="group__ipaddr.html#ga77a933975db287f6aa5c2e70249ba18f">ip_addr.h</a>
+</li>
+<li>ip_addr_copy_from_ip4
+: <a class="el" href="group__ip4addr.html#gaef063b2e975dae7ecf398770b04b14af">ip_addr.h</a>
+</li>
+<li>ip_addr_copy_from_ip6
+: <a class="el" href="group__ip6addr.html#gabe6f7908ce8a91dc587e2ebc2172e651">ip_addr.h</a>
+</li>
+<li>ip_addr_copy_from_ip6_packed
+: <a class="el" href="group__ip6addr.html#ga130ca0907497831677c130dbb3289e1e">ip_addr.h</a>
+</li>
+<li>ip_addr_get_ip4_u32
+: <a class="el" href="group__ip4addr.html#ga09c62e8a3bf599aa7f335e0ad0820e85">ip_addr.h</a>
+</li>
+<li>ip_addr_get_network
+: <a class="el" href="group__ipaddr.html#gab5c5540ea05227bdd9207a47304bb2c1">ip_addr.h</a>
+</li>
+<li>ip_addr_isany
+: <a class="el" href="group__ipaddr.html#ga279118890e6a90aa740051fb8b0cc5f4">ip_addr.h</a>
+</li>
+<li>ip_addr_isany_val
+: <a class="el" href="group__ipaddr.html#gacd8f5aa151cff966fd28368b85f38c05">ip_addr.h</a>
+</li>
+<li>ip_addr_isbroadcast
+: <a class="el" href="group__ipaddr.html#gaa3345706e3aa8b32dd630c195b053e75">ip_addr.h</a>
+</li>
+<li>ip_addr_islinklocal
+: <a class="el" href="group__ipaddr.html#ga33bc079baaf513a9a7381b9531a1f653">ip_addr.h</a>
+</li>
+<li>ip_addr_isloopback
+: <a class="el" href="group__ipaddr.html#ga0fc8bf6662809274750868683b3a422e">ip_addr.h</a>
+</li>
+<li>ip_addr_ismulticast
+: <a class="el" href="group__ipaddr.html#ga2170d3ee13dd22722222228e7b1c5752">ip_addr.h</a>
+</li>
+<li>ip_addr_netcmp
+: <a class="el" href="group__ipaddr.html#ga3a2123f0bbf6fe843c8542e349c680eb">ip_addr.h</a>
+</li>
+<li>ip_addr_set
+: <a class="el" href="group__ipaddr.html#ga40db7feae2b92f7a7a01d65a85b06e18">ip_addr.h</a>
+</li>
+<li>ip_addr_set_any
+: <a class="el" href="group__ipaddr.html#ga8853fce54b1816dca3af90b48677e673">ip_addr.h</a>
+</li>
+<li>ip_addr_set_any_val
+: <a class="el" href="group__ipaddr.html#ga93c7bf3f7487495472aa0f9b5fc25d1a">ip_addr.h</a>
+</li>
+<li>ip_addr_set_hton
+: <a class="el" href="group__ipaddr.html#ga3528798be1d2f1ec6a6bccd35694edce">ip_addr.h</a>
+</li>
+<li>ip_addr_set_ip4_u32
+: <a class="el" href="group__ip4addr.html#ga971516589980428bf51f37cefa4ddf66">ip_addr.h</a>
+</li>
+<li>ip_addr_set_ip4_u32_val
+: <a class="el" href="group__ip4addr.html#ga624b5010ccc04cc3d0de2acce44f1c9e">ip_addr.h</a>
+</li>
+<li>ip_addr_set_ipaddr
+: <a class="el" href="group__ipaddr.html#gaea5e4795598bc33fa2db1773c8e6fbac">ip_addr.h</a>
+</li>
+<li>ip_addr_set_loopback
+: <a class="el" href="group__ipaddr.html#ga8f9d56ac85cd87338a1823e4a58ba1da">ip_addr.h</a>
+</li>
+<li>ip_addr_set_loopback_val
+: <a class="el" href="group__ipaddr.html#gac1c5f897bbee217771b1a6ba18733042">ip_addr.h</a>
+</li>
+<li>ip_addr_set_zero
+: <a class="el" href="group__ipaddr.html#gaae7edb585c062ae03bfbd3af7bf671bc">ip_addr.h</a>
+</li>
+<li>ip_addr_set_zero_ip4
+: <a class="el" href="ip__addr_8h.html#aecb93d575e65f835f1045a4e87e70ed9">ip_addr.h</a>
+</li>
+<li>ip_addr_set_zero_ip6
+: <a class="el" href="group__ip6addr.html#gafb3a0e5241683aff573e195f31ba8845">ip_addr.h</a>
+</li>
+<li>ip_addr_t
+: <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr.h</a>
+</li>
+<li>IP_ANY_TYPE
+: <a class="el" href="group__ipaddr.html#gabe43b154533b73585c4e58f568370ede">ip_addr.h</a>
+</li>
+<li>ip_current_dest_addr
+: <a class="el" href="ip_8h.html#a9135977868017c3deeec86b525e13997">ip.h</a>
+</li>
+<li>ip_current_header_proto
+: <a class="el" href="ip_8h.html#af27c43c23b59d68a8463cd5ad035b20f">ip.h</a>
+</li>
+<li>ip_current_header_tot_len
+: <a class="el" href="ip_8h.html#a2ca15ea285a10982294378cd7b8e83e2">ip.h</a>
+</li>
+<li>ip_current_input_netif
+: <a class="el" href="ip_8h.html#ae214afa9d3f1b26fc8d538436b8fa3c4">ip.h</a>
+</li>
+<li>ip_current_is_v6
+: <a class="el" href="ip_8h.html#abc56623d434a204298a4e98352af1c9d">ip.h</a>
+</li>
+<li>ip_current_netif
+: <a class="el" href="ip_8h.html#aabecef3c7653a9767c79245c44fcab9f">ip.h</a>
+</li>
+<li>ip_current_src_addr
+: <a class="el" href="ip_8h.html#a4e35b7692c228c98e738892f0a215647">ip.h</a>
+</li>
+<li>ip_data
+: <a class="el" href="ip_8c.html#ac944fb6564f181bc90bc7c2b8b00d94c">ip.c</a>
+, <a class="el" href="ip_8h.html#ac944fb6564f181bc90bc7c2b8b00d94c">ip.h</a>
+</li>
+<li>IP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga5d3348778951e7bc5cd397c6575eef3a">opt.h</a>
+</li>
+<li>IP_DEFAULT_TTL
+: <a class="el" href="group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411">opt.h</a>
+</li>
+<li>IP_FORWARD
+: <a class="el" href="group__lwip__opts__ipv4.html#ga881d32ff5ee02af01f758953f1b51d59">opt.h</a>
+</li>
+<li>IP_FORWARD_ALLOW_TX_ON_RX_NETIF
+: <a class="el" href="group__lwip__opts__ipv4.html#ga9e761df07c4e93901858741d4771dbc7">opt.h</a>
+</li>
+<li>IP_FRAG
+: <a class="el" href="group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4">opt.h</a>
+</li>
+<li>ip_get_option
+: <a class="el" href="ip_8h.html#a26e077f52de4a97ff89c02415c084518">ip.h</a>
+</li>
+<li>IP_HDR_GET_VERSION
+: <a class="el" href="prot_2ip_8h.html#afc29766fb0707c63b64568c5fa44a374">ip.h</a>
+</li>
+<li>ip_input()
+: <a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip.h</a>
+, <a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip.c</a>
+</li>
+<li>IP_IS_ANY_TYPE_VAL
+: <a class="el" href="group__ipaddr.html#ga83b17dbf7d1faf5c8f8c20b039db8bb8">ip_addr.h</a>
+</li>
+<li>IP_IS_V4
+: <a class="el" href="group__ip4addr.html#gabee5dab2191bb0f3355d7f30d1496f24">ip_addr.h</a>
+</li>
+<li>IP_IS_V4_VAL
+: <a class="el" href="group__ip4addr.html#gab1a059f07bd9c50aa58447d963b823a1">ip_addr.h</a>
+</li>
+<li>IP_IS_V6
+: <a class="el" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">ip_addr.h</a>
+</li>
+<li>IP_IS_V6_VAL
+: <a class="el" href="group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d">ip_addr.h</a>
+</li>
+<li>ip_netif_get_local_ip
+: <a class="el" href="group__ip.html#ga4a4b9439c91eeec719692dfe10f14af0">ip.h</a>
+</li>
+<li>ip_next_header_ptr
+: <a class="el" href="ip_8h.html#a68d25b5924b768cbf2f1a78bbabfce26">ip.h</a>
+</li>
+<li>ip_ntoa
+: <a class="el" href="ip4__addr_8h.html#a2b2230516e7911dfacc9b87644ba30f1">ip4_addr.h</a>
+</li>
+<li>IP_OPTIONS_ALLOWED
+: <a class="el" href="group__lwip__opts__ipv4.html#gaa956b0167c37a2265b55e2d0204a3933">opt.h</a>
+</li>
+<li>IP_OPTIONS_SEND
+: <a class="el" href="ip4_8h.html#a516aa115f61c368cbe74fae2da2c6824">ip4.h</a>
+</li>
+<li>ip_output
+: <a class="el" href="group__ip.html#gaf056aa43789c2964f091f8349bb83730">ip.h</a>
+</li>
+<li>ip_output_hinted
+: <a class="el" href="ip_8h.html#accbc01f37dd426a66de41693a5450207">ip.h</a>
+</li>
+<li>ip_output_if
+: <a class="el" href="group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250">ip.h</a>
+</li>
+<li>ip_output_if_hdrincl
+: <a class="el" href="ip_8h.html#aac608b92f8f226c3574d6bb855f12496">ip.h</a>
+</li>
+<li>ip_output_if_src
+: <a class="el" href="group__ip.html#gab9d45f846f796bd6ce1e0c780c392765">ip.h</a>
+</li>
+<li>IP_PCB
+: <a class="el" href="ip_8h.html#a8bdf4b5f674375e76cdd968826d80e53">ip.h</a>
+</li>
+<li>IP_REASS_CHECK_OVERLAP
+: <a class="el" href="ip6__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe">ip6_frag.c</a>
+, <a class="el" href="ip4__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe">ip4_frag.c</a>
+</li>
+<li>IP_REASS_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33">opt.h</a>
+</li>
+<li>IP_REASS_FREE_OLDEST
+: <a class="el" href="ip6__frag_8c.html#a510934accf149433bdcf683993e79080">ip6_frag.c</a>
+, <a class="el" href="ip4__frag_8c.html#a510934accf149433bdcf683993e79080">ip4_frag.c</a>
+</li>
+<li>IP_REASS_MAX_PBUFS
+: <a class="el" href="group__lwip__opts__ipv4.html#ga29084a46d7d4be30e8029d356bca0394">opt.h</a>
+</li>
+<li>IP_REASS_MAXAGE
+: <a class="el" href="group__lwip__opts__ipv4.html#gad41122bd0b5485a18a4415c8f953727b">opt.h</a>
+</li>
+<li>ip_reass_tmr()
+: <a class="el" href="ip4__frag_8h.html#abc7017eb20983f372e81de7376ebec88">ip4_frag.h</a>
+, <a class="el" href="ip4__frag_8c.html#abc7017eb20983f372e81de7376ebec88">ip4_frag.c</a>
+</li>
+<li>IP_REASSEMBLY
+: <a class="el" href="group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69">opt.h</a>
+</li>
+<li>ip_reset_option
+: <a class="el" href="ip_8h.html#a441c63f00c4b0cb69fc34ca6b55307cc">ip.h</a>
+</li>
+<li>ip_route
+: <a class="el" href="group__ip.html#ga0fa3afc2c00aea346889b476650adee3">ip.h</a>
+</li>
+<li>ip_set_option
+: <a class="el" href="ip_8h.html#a13f48cf825c7f074dc05bea54e9d6a93">ip.h</a>
+</li>
+<li>IP_SOF_BROADCAST
+: <a class="el" href="group__lwip__opts__ipv4.html#ga0b2c993fd940f5774108298933310384">opt.h</a>
+</li>
+<li>IP_SOF_BROADCAST_RECV
+: <a class="el" href="group__lwip__opts__ipv4.html#ga0f1fbf42d3344bf87cd056d48ddca3db">opt.h</a>
+</li>
+<li>IP_STATS
+: <a class="el" href="group__lwip__opts__stats.html#gaf50575a4895e26ea2c01d1f2269487be">opt.h</a>
+</li>
+<li>IPADDR4_INIT
+: <a class="el" href="group__ip4addr.html#ga1eaffd17b4b3c56cc91a6d516e18118f">ip_addr.h</a>
+</li>
+<li>IPADDR4_INIT_BYTES
+: <a class="el" href="group__ip4addr.html#ga55cc3896c46564bd2941ee5806fe1e11">ip_addr.h</a>
+</li>
+<li>IPADDR6_INIT
+: <a class="el" href="group__ip6addr.html#ga1266e500b1db0b7cdc4b269cace49746">ip_addr.h</a>
+</li>
+<li>IPADDR6_INIT_HOST
+: <a class="el" href="group__ip6addr.html#gadaff748da2b808995993dd3db5420f08">ip_addr.h</a>
+</li>
+<li>IPADDR6_ZONE_INIT
+: <a class="el" href="group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9">ip6_zone.h</a>
+</li>
+<li>ipaddr_addr()
+: <a class="el" href="ip4__addr_8c.html#a2c05f9138da41115978409e547df9670">ip4_addr.c</a>
+, <a class="el" href="ip4__addr_8h.html#a2c05f9138da41115978409e547df9670">ip4_addr.h</a>
+</li>
+<li>IPADDR_ANY
+: <a class="el" href="ip4__addr_8h.html#ad6ed0d622d61ecd6edd606e3b564f0a2">ip4_addr.h</a>
+</li>
+<li>IPADDR_ANY_TYPE_INIT
+: <a class="el" href="group__ipaddr.html#ga23b580930c0eb1d0fdeba2b109c077a5">ip_addr.h</a>
+</li>
+<li>ipaddr_aton()
+: <a class="el" href="group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151">ip.c</a>
+, <a class="el" href="group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151">ip_addr.h</a>
+</li>
+<li>IPADDR_BROADCAST
+: <a class="el" href="ip4__addr_8h.html#ac661fca7e7d25e5cd379b811a767c29a">ip4_addr.h</a>
+</li>
+<li>IPADDR_LOOPBACK
+: <a class="el" href="ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e">ip4_addr.h</a>
+</li>
+<li>IPADDR_NONE
+: <a class="el" href="ip4__addr_8h.html#abc4b2e3531c4992f2ae4b8c0f9751544">ip4_addr.h</a>
+</li>
+<li>ipaddr_ntoa()
+: <a class="el" href="group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1">ip.c</a>
+, <a class="el" href="group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1">ip_addr.h</a>
+</li>
+<li>ipaddr_ntoa_r()
+: <a class="el" href="group__ipaddr.html#ga3684dabc0cae597ffb5b51d41f1d886f">ip_addr.h</a>
+, <a class="el" href="group__ipaddr.html#ga3684dabc0cae597ffb5b51d41f1d886f">ip.c</a>
+</li>
+<li>IPADDR_STRLEN_MAX
+: <a class="el" href="group__ipaddr.html#ga8619278bcbf705844f584f36972fc758">ip_addr.h</a>
+</li>
+<li>IPADDR_TYPE_ANY
+: <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e">ip_addr.h</a>
+</li>
+<li>IPADDR_TYPE_V4
+: <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">ip_addr.h</a>
+</li>
+<li>IPADDR_TYPE_V6
+: <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">ip_addr.h</a>
+</li>
+<li>IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T
+: <a class="el" href="lwip_2prot_2etharp_8h.html#a7dff02ff186f844b731cecbe614b7419">etharp.h</a>
+</li>
+<li>IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T
+: <a class="el" href="lwip_2prot_2etharp_8h.html#a94f1c2a6ad7cecdfe759c0490ba7f030">etharp.h</a>
+</li>
+<li>IPFRAG_STATS
+: <a class="el" href="group__lwip__opts__stats.html#gac9a4fbb46df3c0f479a334d0e34fb74f">opt.h</a>
+</li>
+<li>IPV6_CUSTOM_SCOPES
+: <a class="el" href="group__ip6__zones.html#gae677a65970f4b667156b256dd9a4924b">ip6_zone.h</a>
+</li>
+<li>IPV6_FRAG_COPYHEADER
+: <a class="el" href="ip6__frag_8h.html#a151e742cf7f0e5c3a08f31db0370cea7">ip6_frag.h</a>
+</li>
+<li>IPV6_REASS_MAXAGE
+: <a class="el" href="group__lwip__opts__ipv6.html#ga8adc0b7dbedd279387a21588f0e2c969">opt.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_l.html b/doc/doxygen/output/html/globals_l.html
new file mode 100644
index 0000000..9423432
--- /dev/null
+++ b/doc/doxygen/output/html/globals_l.html
@@ -0,0 +1,1196 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_l.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_l"></a>- l -</h3><ul>
+<li>LINK_STATS
+: <a class="el" href="group__lwip__opts__stats.html#gae58b452782d0327ae728192686c5a84a">opt.h</a>
+</li>
+<li>listen
+: <a class="el" href="group__socket.html#gae6e6de5a20bed9fc7078f0e6c9c4aca4">sockets.h</a>
+</li>
+<li>LL_IP4_MULTICAST_ADDR_0
+: <a class="el" href="lwip_2prot_2ethernet_8h.html#afaf6cbccf9477c3505660e3a17860e07">ethernet.h</a>
+</li>
+<li>LL_IP6_MULTICAST_ADDR_0
+: <a class="el" href="lwip_2prot_2ethernet_8h.html#a8ebe93c6ad2d743e6c952539257679b6">ethernet.h</a>
+</li>
+<li>LOCK_TCPIP_CORE
+: <a class="el" href="tcpip_8h.html#a4700525e737fc025fea4887b172e0c95">tcpip.h</a>
+</li>
+<li>lock_tcpip_core
+: <a class="el" href="tcpip_8c.html#acd7be2108e9a47fd8f1ab0a49f76241d">tcpip.c</a>
+, <a class="el" href="tcpip_8h.html#acd7be2108e9a47fd8f1ab0a49f76241d">tcpip.h</a>
+</li>
+<li>lowpan6_calc_crc()
+: <a class="el" href="lowpan6_8h.html#ab33dc87f30aeda871845854511de9931">lowpan6.h</a>
+, <a class="el" href="lowpan6_8c.html#ab33dc87f30aeda871845854511de9931">lowpan6.c</a>
+</li>
+<li>lowpan6_input()
+: <a class="el" href="group__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7">lowpan6.h</a>
+, <a class="el" href="group__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7">lowpan6.c</a>
+</li>
+<li>lowpan6_output()
+: <a class="el" href="group__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b">lowpan6.h</a>
+, <a class="el" href="group__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b">lowpan6.c</a>
+</li>
+<li>lowpan6_set_context()
+: <a class="el" href="group__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94">lowpan6.h</a>
+, <a class="el" href="group__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94">lowpan6.c</a>
+</li>
+<li>lowpan6_set_pan_id()
+: <a class="el" href="group__sixlowpan.html#gade00524e85d37a3521ea85359f801df3">lowpan6.h</a>
+, <a class="el" href="group__sixlowpan.html#gade00524e85d37a3521ea85359f801df3">lowpan6.c</a>
+</li>
+<li>lowpan6_set_short_addr()
+: <a class="el" href="group__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625">lowpan6.h</a>
+, <a class="el" href="group__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625">lowpan6.c</a>
+</li>
+<li>lowpan6_tmr()
+: <a class="el" href="lowpan6_8h.html#ac8c3a4612aeb23f65e55c18faf5ad7d7">lowpan6.h</a>
+, <a class="el" href="lowpan6_8c.html#ac8c3a4612aeb23f65e55c18faf5ad7d7">lowpan6.c</a>
+</li>
+<li>LOWPAN6_TMR_INTERVAL
+: <a class="el" href="lowpan6_8h.html#aa258ae16a937c40333c8f97a7f236797">lowpan6.h</a>
+</li>
+<li>LWIP_6LOWPAN_802154_HW_CRC
+: <a class="el" href="lowpan6__opts_8h.html#ae5bb9b8d695caec08930073edc7c6175">lowpan6_opts.h</a>
+</li>
+<li>LWIP_6LOWPAN_CALC_CRC
+: <a class="el" href="lowpan6__opts_8h.html#ad20840e31a0a6eeec8666e4d4a979f43">lowpan6_opts.h</a>
+</li>
+<li>LWIP_6LOWPAN_INFER_SHORT_ADDRESS
+: <a class="el" href="lowpan6__opts_8h.html#a6a542cd72a6270b7231b8b93f8041207">lowpan6_opts.h</a>
+</li>
+<li>LWIP_6LOWPAN_IPHC
+: <a class="el" href="lowpan6__opts_8h.html#a0f178a86d02e0ba4168cafe3de5f3afa">lowpan6_opts.h</a>
+</li>
+<li>LWIP_6LOWPAN_NUM_CONTEXTS
+: <a class="el" href="lowpan6__opts_8h.html#a4ffa89f39abf93cc599f78c5a8bb0a4a">lowpan6_opts.h</a>
+</li>
+<li>LWIP_ALIGNMENT_CAST
+: <a class="el" href="group__compiler__abstraction.html#gaade87973d72135b0b3afccfff4f62eb8">arch.h</a>
+</li>
+<li>LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
+: <a class="el" href="group__lwip__opts__mem.html#ga0a3ef6098813c103e5aba07da76e15e2">opt.h</a>
+</li>
+<li>LWIP_ALTCP
+: <a class="el" href="group__lwip__opts__tcp.html#ga26dee0e5d9c51b1dda0adad29c770a77">opt.h</a>
+</li>
+<li>LWIP_ALTCP_TLS
+: <a class="el" href="group__lwip__opts__tcp.html#gab03ba0306cf0a99ccce3d100142f60c8">opt.h</a>
+</li>
+<li>LWIP_ALTCP_TLS_MBEDTLS
+: <a class="el" href="altcp__tls__mbedtls__opts_8h.html#ac8dbfe10a4a9a64c1e2c62ea97e48639">altcp_tls_mbedtls_opts.h</a>
+</li>
+<li>LWIP_ARP
+: <a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">opt.h</a>
+</li>
+<li>LWIP_ARP_FILTER_NETIF
+: <a class="el" href="netif_2ethernet_8h.html#a1ecae0406a3b714c02b632379f26a365">ethernet.h</a>
+</li>
+<li>LWIP_ASSERT_CORE_LOCKED
+: <a class="el" href="group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75">opt.h</a>
+</li>
+<li>LWIP_AUTOIP
+: <a class="el" href="group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069">opt.h</a>
+</li>
+<li>LWIP_AUTOIP_CREATE_SEED_ADDR
+: <a class="el" href="autoip_8c.html#acec75069f6e6ecbe200c5691e56ecd43">autoip.c</a>
+</li>
+<li>LWIP_AUTOIP_RAND
+: <a class="el" href="autoip_8c.html#a634535156cc1a8cf9f04d3d5c74f8a59">autoip.c</a>
+</li>
+<li>LWIP_BROADCAST_PING
+: <a class="el" href="group__lwip__opts__icmp.html#ga8088cb56d1a84fe554b11bc15d84b2b9">opt.h</a>
+</li>
+<li>LWIP_CHECKSUM_CTRL_PER_NETIF
+: <a class="el" href="group__lwip__opts__checksum.html#ga3ecc5246a0c6ca5aed56c2d7899c1004">opt.h</a>
+</li>
+<li>LWIP_CHECKSUM_ON_COPY
+: <a class="el" href="group__lwip__opts__checksum.html#ga9f60183f0442bdbeefd6b395c6647613">opt.h</a>
+</li>
+<li>LWIP_COMPAT_MUTEX
+: <a class="el" href="sys_8h.html#a7bada49634cd3b28b28bdcedd763a1e6">sys.h</a>
+</li>
+<li>LWIP_COMPAT_SOCKETS
+: <a class="el" href="group__lwip__opts__socket.html#gafed2811f031822ec5afa1ee211fb7447">opt.h</a>
+</li>
+<li>LWIP_CONST_CAST
+: <a class="el" href="group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72">arch.h</a>
+</li>
+<li>lwip_cyclic_timer_handler
+: <a class="el" href="timeouts_8h.html#a985c5d366b62bd179195e093ffcb7ecd">timeouts.h</a>
+</li>
+<li>lwip_cyclic_timers
+: <a class="el" href="timeouts_8c.html#addc06ab816f051a0fe6f280972eed142">timeouts.c</a>
+, <a class="el" href="timeouts_8h.html#addc06ab816f051a0fe6f280972eed142">timeouts.h</a>
+</li>
+<li>LWIP_DBG_FRESH
+: <a class="el" href="group__debugging__levels.html#ga7d44d1804fa5e747aed86816e2a6cae0">debug.h</a>
+</li>
+<li>LWIP_DBG_HALT
+: <a class="el" href="group__debugging__levels.html#gab0a296414983155b30ad51871606b90f">debug.h</a>
+</li>
+<li>LWIP_DBG_LEVEL_ALL
+: <a class="el" href="group__debugging__levels.html#ga8ebaeb006b43f55897f3196b3617dc87">debug.h</a>
+</li>
+<li>LWIP_DBG_LEVEL_SERIOUS
+: <a class="el" href="group__debugging__levels.html#ga0269bdc51f1e8a5ecf9af72c6e1c996c">debug.h</a>
+</li>
+<li>LWIP_DBG_LEVEL_SEVERE
+: <a class="el" href="group__debugging__levels.html#gaab41143277cd38047b6660d90e9cec3b">debug.h</a>
+</li>
+<li>LWIP_DBG_LEVEL_WARNING
+: <a class="el" href="group__debugging__levels.html#ga77c491e468bf7d9a1bc48430c1866a96">debug.h</a>
+</li>
+<li>LWIP_DBG_MIN_LEVEL
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga2043f599515774f8e571ba185dbcb9e7">opt.h</a>
+</li>
+<li>LWIP_DBG_OFF
+: <a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">debug.h</a>
+</li>
+<li>LWIP_DBG_ON
+: <a class="el" href="group__debugging__levels.html#ga9e31b7cbbc8f46af8e62b548079acd4e">debug.h</a>
+</li>
+<li>LWIP_DBG_STATE
+: <a class="el" href="group__debugging__levels.html#ga511ee3deb3240635f5ec6a1709c6d741">debug.h</a>
+</li>
+<li>LWIP_DBG_TRACE
+: <a class="el" href="group__debugging__levels.html#ga988147559b78642ac881815b66023646">debug.h</a>
+</li>
+<li>LWIP_DBG_TYPES_ON
+: <a class="el" href="group__lwip__opts__debugmsg.html#gac095d0e53f5eb5b326b2cccfd071d93d">opt.h</a>
+</li>
+<li>LWIP_DEBUG
+: <a class="el" href="debug_8h.html#a957d947c94fda9b85d4aee0aab72952a">debug.h</a>
+</li>
+<li>LWIP_DECLARE_MEMORY_ALIGNED
+: <a class="el" href="group__compiler__abstraction.html#ga651bb349041669fe717b19f127ef16c0">arch.h</a>
+</li>
+<li>LWIP_DHCP
+: <a class="el" href="group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9">opt.h</a>
+</li>
+<li>LWIP_DHCP6_GET_NTP_SRV
+: <a class="el" href="group__lwip__opts__dhcpv6.html#ga5d08f76a7472daa7bcfe17343243bd77">opt.h</a>
+</li>
+<li>LWIP_DHCP6_MAX_DNS_SERVERS
+: <a class="el" href="group__lwip__opts__dhcpv6.html#ga92c3bc242ad20a5f398c45d332864a29">opt.h</a>
+</li>
+<li>LWIP_DHCP6_MAX_NTP_SERVERS
+: <a class="el" href="group__lwip__opts__dhcpv6.html#gaf3ac8e15d7a67429a02bc2317e16bcfe">opt.h</a>
+</li>
+<li>LWIP_DHCP_AUTOIP_COOP
+: <a class="el" href="group__lwip__opts__autoip.html#ga1a91e18dbb9777bc6e3963f52cb5f9fe">opt.h</a>
+</li>
+<li>LWIP_DHCP_AUTOIP_COOP_TRIES
+: <a class="el" href="group__lwip__opts__autoip.html#ga4ff3f941b4c71a04b0c30fbee5b198c2">opt.h</a>
+</li>
+<li>LWIP_DHCP_BOOTP_FILE
+: <a class="el" href="group__lwip__opts__dhcp.html#ga3c2983cbd228011dd3e18cb417e7e423">opt.h</a>
+</li>
+<li>LWIP_DHCP_GET_NTP_SRV
+: <a class="el" href="group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83">opt.h</a>
+</li>
+<li>LWIP_DHCP_MAX_DNS_SERVERS
+: <a class="el" href="group__lwip__opts__dhcp.html#ga60ccc20fbb08be24b5d5f599dd47a6a6">opt.h</a>
+</li>
+<li>LWIP_DHCP_MAX_NTP_SERVERS
+: <a class="el" href="group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2">opt.h</a>
+</li>
+<li>LWIP_DNS
+: <a class="el" href="group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646">opt.h</a>
+</li>
+<li>LWIP_DNS_API_HOSTENT_STORAGE
+: <a class="el" href="netdb_8c.html#a768ab8ead892d6454709680340cd070e">netdb.c</a>
+</li>
+<li>LWIP_DNS_SECURE
+: <a class="el" href="group__lwip__opts__dns.html#ga8979c30dfbfde609d5139f80aabdfcc5">opt.h</a>
+</li>
+<li>LWIP_DNS_SUPPORT_MDNS_QUERIES
+: <a class="el" href="group__lwip__opts__dns.html#gafcbde5706a70ace562bd1f7d2d6f77cb">opt.h</a>
+</li>
+<li>LWIP_ETHERNET
+: <a class="el" href="group__lwip__opts__arp.html#ga30e02dc217cc2995d0fd241d510c904f">opt.h</a>
+</li>
+<li>LWIP_EVENT_API
+: <a class="el" href="group__lwip__opts__tcp.html#ga39f76e811117155be8525bb386ecddb7">opt.h</a>
+</li>
+<li>lwip_fcntl()
+: <a class="el" href="sockets_8c.html#ae84296093574ec746f8f88321356388f">sockets.c</a>
+, <a class="el" href="sockets_8h.html#ae84296093574ec746f8f88321356388f">sockets.h</a>
+</li>
+<li>LWIP_FIONREAD_LINUXMODE
+: <a class="el" href="group__lwip__opts__socket.html#ga0543eea2abe390d0bdc843c33debd762">opt.h</a>
+</li>
+<li>lwip_freeaddrinfo()
+: <a class="el" href="netdb_8c.html#a7f65ff5982a0743849a644ef2cd15ef5">netdb.c</a>
+, <a class="el" href="lwip_2netdb_8h.html#a7f65ff5982a0743849a644ef2cd15ef5">netdb.h</a>
+</li>
+<li>lwip_getaddrinfo()
+: <a class="el" href="netdb_8c.html#af356989c172a51187e22b557f22d4165">netdb.c</a>
+, <a class="el" href="lwip_2netdb_8h.html#af356989c172a51187e22b557f22d4165">netdb.h</a>
+</li>
+<li>lwip_gethostbyname()
+: <a class="el" href="netdb_8c.html#a8adc6d35c068a073369edde71c678cbc">netdb.c</a>
+, <a class="el" href="lwip_2netdb_8h.html#a8adc6d35c068a073369edde71c678cbc">netdb.h</a>
+</li>
+<li>lwip_gethostbyname_r()
+: <a class="el" href="netdb_8c.html#afa229e90916f6c8d6308828f45351d2d">netdb.c</a>
+, <a class="el" href="lwip_2netdb_8h.html#afa229e90916f6c8d6308828f45351d2d">netdb.h</a>
+</li>
+<li>LWIP_HAVE_LOOPIF
+: <a class="el" href="group__lwip__opts__loop.html#gaa2b1f736373cd896e212644aa453fbaf">opt.h</a>
+</li>
+<li>LWIP_HOOK_DHCP6_APPEND_OPTIONS
+: <a class="el" href="group__lwip__opts__hooks.html#ga4068b3313e32f711ba016215fc2c886a">opt.h</a>
+</li>
+<li>LWIP_HOOK_DHCP_APPEND_OPTIONS
+: <a class="el" href="group__lwip__opts__hooks.html#ga40e6c9aba06e66e5df1b4ca18329f9b4">opt.h</a>
+</li>
+<li>LWIP_HOOK_DHCP_PARSE_OPTION
+: <a class="el" href="group__lwip__opts__hooks.html#gafbbbc574863c0f88988936bd1434f2d2">opt.h</a>
+</li>
+<li>LWIP_HOOK_ETHARP_GET_GW
+: <a class="el" href="group__lwip__opts__hooks.html#ga2b76f127325fd5ca8b80077a4b6160b1">opt.h</a>
+</li>
+<li>LWIP_HOOK_FILENAME
+: <a class="el" href="group__lwip__opts__hooks.html#ga11ac9d637cb6afc0a32e8da7f51d0c0d">opt.h</a>
+</li>
+<li>LWIP_HOOK_IP4_CANFORWARD
+: <a class="el" href="group__lwip__opts__hooks.html#gaed848a98dbb5c8856a27e379986ea70d">opt.h</a>
+</li>
+<li>LWIP_HOOK_IP4_INPUT
+: <a class="el" href="group__lwip__opts__hooks.html#ga9124237c28e2f18f3b28d5be09e9ccb6">opt.h</a>
+</li>
+<li>LWIP_HOOK_IP4_ROUTE
+: <a class="el" href="group__lwip__opts__hooks.html#ga5d1061ad722a73012a28dbaf0f169b70">opt.h</a>
+</li>
+<li>LWIP_HOOK_IP4_ROUTE_SRC
+: <a class="el" href="group__lwip__opts__hooks.html#gaa410d9cbe1d4fa4c8a7f49af7b501024">opt.h</a>
+</li>
+<li>LWIP_HOOK_IP6_INPUT
+: <a class="el" href="group__lwip__opts__hooks.html#gaccbdd3d0250f7176dcd799ca06007f20">opt.h</a>
+</li>
+<li>LWIP_HOOK_IP6_ROUTE
+: <a class="el" href="group__lwip__opts__hooks.html#ga8245a4bc7ffb172e3bf32276f9d126ce">opt.h</a>
+</li>
+<li>LWIP_HOOK_MEMP_AVAILABLE
+: <a class="el" href="group__lwip__opts__hooks.html#ga13e90672158221b40f8b12bf9d8b721f">opt.h</a>
+</li>
+<li>LWIP_HOOK_ND6_GET_GW
+: <a class="el" href="group__lwip__opts__hooks.html#ga287544c3d74bc2a2d645bddbbc4fbdd0">opt.h</a>
+</li>
+<li>LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE
+: <a class="el" href="group__lwip__opts__hooks.html#gae35e4b7374868dc748b12dedb8f807e5">opt.h</a>
+</li>
+<li>LWIP_HOOK_SOCKETS_GETSOCKOPT
+: <a class="el" href="group__lwip__opts__hooks.html#gabdaeb09ac9f441934e21a087544a1af1">opt.h</a>
+</li>
+<li>LWIP_HOOK_SOCKETS_SETSOCKOPT
+: <a class="el" href="group__lwip__opts__hooks.html#ga14ea9210c09da4dd33bc85bd8a01b48a">opt.h</a>
+</li>
+<li>LWIP_HOOK_TCP_INPACKET_PCB
+: <a class="el" href="group__lwip__opts__hooks.html#gabed8b1cda4aba2d108fa62cdd74895a2">opt.h</a>
+</li>
+<li>LWIP_HOOK_TCP_ISN
+: <a class="el" href="group__lwip__opts__hooks.html#ga078d203053911cf3af178392700386a4">opt.h</a>
+</li>
+<li>LWIP_HOOK_TCP_OUT_ADD_TCPOPTS
+: <a class="el" href="group__lwip__opts__hooks.html#ga0ef31b749307b63c06633645d4de21f0">opt.h</a>
+</li>
+<li>LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH
+: <a class="el" href="group__lwip__opts__hooks.html#ga31c0694abe4eedf3ff039b7073c2293f">opt.h</a>
+</li>
+<li>LWIP_HOOK_UNKNOWN_ETH_PROTOCOL
+: <a class="el" href="group__lwip__opts__hooks.html#ga6cc92f5101dd7a0420e18e1f2101abf4">opt.h</a>
+</li>
+<li>LWIP_HOOK_VLAN_CHECK
+: <a class="el" href="group__lwip__opts__hooks.html#ga2f020543772368f8f4355f50f24c86a9">opt.h</a>
+</li>
+<li>LWIP_HOOK_VLAN_SET
+: <a class="el" href="group__lwip__opts__hooks.html#ga2b6e450b4934b95df9b9a9d2b9a4d57e">opt.h</a>
+</li>
+<li>lwip_htonl()
+: <a class="el" href="def_8c.html#a14f94347a5b9b9e3602705b75b7ae524">def.c</a>
+, <a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">def.h</a>
+</li>
+<li>lwip_htons()
+: <a class="el" href="def_8c.html#ad637280639de4066392e6b5614fa3e56">def.c</a>
+, <a class="el" href="def_8h.html#ac49eb25570806fb51c329d4f86302cc2">def.h</a>
+</li>
+<li>LWIP_HTTPC_HAVE_FILE_IO
+: <a class="el" href="group__httpc.html#ga055b9a8bf8f4e2c18c621471773fa66c">http_client.h</a>
+</li>
+<li>LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR
+: <a class="el" href="group__httpd__opts.html#ga0ff20ebc4ab50d4aa6151c3241dacb3a">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_CGI
+: <a class="el" href="group__httpd__opts.html#gafb28f7c5fee75f013a199d427452372c">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_CGI_SSI
+: <a class="el" href="group__httpd__opts.html#gad3960bf65731bd0f1341867664afe860">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_CUSTOM_FILES
+: <a class="el" href="group__httpd__opts.html#gadadb70f5663cdf004bf879e3b5d326bd">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_DYNAMIC_FILE_READ
+: <a class="el" href="group__httpd__opts.html#ga1ee8d7c975c7e3d1c9d9dd9b43660c79">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_DYNAMIC_HEADERS
+: <a class="el" href="group__httpd__opts.html#ga75932fc5eeb9abeddfdaf8413574c6d7">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_FILE_STATE
+: <a class="el" href="group__httpd__opts.html#gaedd0fa3d356170d8ca3557acb410fd7c">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_FS_ASYNC_READ
+: <a class="el" href="group__httpd__opts.html#ga51cb673cb5cc362acc409f23c1e0a331">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED
+: <a class="el" href="group__httpd__opts.html#ga0d5074965efd40786182287895feb691">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_MAX_REQ_LENGTH
+: <a class="el" href="group__httpd__opts.html#ga30dc71c59f3904df7daaf293f74f91f8">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_MAX_REQUEST_URI_LEN
+: <a class="el" href="group__httpd__opts.html#gaca4ef53e7a9abbd8d4bd8bc1ba7b486a">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI
+: <a class="el" href="group__httpd__opts.html#ga82a030ce2ecdcf741b02b7be41c012b3">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN
+: <a class="el" href="group__httpd__opts.html#gaa27f7c5450392d10aeed033ca878cce3">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_REQ_BUFSIZE
+: <a class="el" href="group__httpd__opts.html#ga8dbe61a35228da0e7365a088197191b8">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_REQ_QUEUELEN
+: <a class="el" href="group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SSI
+: <a class="el" href="group__httpd__opts.html#gacb70e0cdd30a940f8bce681c6cc63949">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SSI_BY_FILE_EXTENSION
+: <a class="el" href="group__httpd__opts.html#gaba2d4cfe4c1f5bdbe37b339084a7d466">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SSI_INCLUDE_TAG
+: <a class="el" href="group__httpd__opts.html#ga975961a6d22d1a077118fb85dfec809a">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SSI_MULTIPART
+: <a class="el" href="group__httpd__opts.html#ga3167d52d20cf90857e2c809b92458bf0">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SSI_RAW
+: <a class="el" href="group__httpd__opts.html#ga520858778b84d4d2fa125294c0f119e5">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SUPPORT_11_KEEPALIVE
+: <a class="el" href="group__httpd__opts.html#ga6f78487bc829f7f98274f1264020045e">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SUPPORT_EXTSTATUS
+: <a class="el" href="group__httpd__opts.html#ga85ebddbc4236b1e31bfa68fa163f9b07">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SUPPORT_POST
+: <a class="el" href="group__httpd__opts.html#gacbea06ce33933e3ef2f2f1834a21cc2c">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SUPPORT_REQUESTLIST
+: <a class="el" href="group__httpd__opts.html#ga0bd0f9a89423fb3bbfea4e4c6141ae43">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_SUPPORT_V09
+: <a class="el" href="group__httpd__opts.html#ga7a8f4ab787b6fb8482c8a36c9fd0c7dd">httpd_opts.h</a>
+</li>
+<li>LWIP_HTTPD_TIMING
+: <a class="el" href="group__httpd__opts.html#ga054db3f080715942967969c6ae30bb6a">httpd_opts.h</a>
+</li>
+<li>lwip_iana_hwtype
+: <a class="el" href="group__iana.html#ga3d2bbfcb56c8adf3be8c8d12868cecfe">iana.h</a>
+</li>
+<li>LWIP_IANA_HWTYPE_ETHERNET
+: <a class="el" href="group__iana.html#gga3d2bbfcb56c8adf3be8c8d12868cecfea89e82e6ac55811bb26fe66ec029f2a0c">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_DHCP_CLIENT
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a9fcae1f16758e1ac35dab343fc897f40">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_DHCP_SERVER
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ac70ae96c985cf3660e26aa496094916d">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_HTTP
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_HTTPS
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_MDNS
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a839da325f45916d7b27d53d5e5e97dc6">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_MQTT
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_NETBIOS
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae1cf6eaab024b31aff5bf407d38e0ede">iana.h</a>
+</li>
+<li>lwip_iana_port_number
+: <a class="el" href="group__iana.html#gac9396d90585e49e9a287179bf5aa9ba0">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_SECURE_MQTT
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_SMTP
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae2645895203ca3c54005afad053a813c">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_SMTPS
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a88f8872246977c6e24c617266ada1a3b">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_SNMP
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aeb10a37f0c48e053b138f65b843c45d3">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_SNMP_TRAP
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aff60c0d3e8eca210b7e4faca3491f4a8">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_SNTP
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb">iana.h</a>
+</li>
+<li>LWIP_IANA_PORT_TFTP
+: <a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050">iana.h</a>
+</li>
+<li>LWIP_ICMP
+: <a class="el" href="group__lwip__opts__icmp.html#gae4d45345c3ab8e5a355fda1d8d24fca6">opt.h</a>
+</li>
+<li>LWIP_ICMP6
+: <a class="el" href="group__lwip__opts__icmp6.html#ga65ac8bcbad242cba3a2b557e1574b21f">opt.h</a>
+</li>
+<li>LWIP_ICMP6_DATASIZE
+: <a class="el" href="group__lwip__opts__icmp6.html#gaa88c55e37e5d7b865b91a9399313bbbf">opt.h</a>
+</li>
+<li>LWIP_ICMP6_HL
+: <a class="el" href="group__lwip__opts__icmp6.html#ga82193577b4045e1ac1533c4341a2bd79">opt.h</a>
+</li>
+<li>LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
+: <a class="el" href="icmp_8c.html#a6b9fd6be0a7dcf301bc86b9e96e3857e">icmp.c</a>
+</li>
+<li>lwip_ieee_eth_type
+: <a class="el" href="group__ieee.html#gab3a7b97666b100584972d158acbbd1f4">ieee.h</a>
+</li>
+<li>lwip_if_indextoname()
+: <a class="el" href="group__if__api.html#gac68ad9ef70eb869525e0a1cc818f056b">if_api.c</a>
+, <a class="el" href="group__if__api.html#gac68ad9ef70eb869525e0a1cc818f056b">if_api.h</a>
+</li>
+<li>lwip_if_nametoindex()
+: <a class="el" href="group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be">if_api.c</a>
+, <a class="el" href="group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be">if_api.h</a>
+</li>
+<li>LWIP_IGMP
+: <a class="el" href="group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923">opt.h</a>
+</li>
+<li>lwip_init()
+: <a class="el" href="group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9">init.c</a>
+, <a class="el" href="group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9">init.h</a>
+</li>
+<li>LWIP_INLINE_IP_CHKSUM
+: <a class="el" href="ip4_8c.html#a9652ce304f893f6245c6ba9daea0a30f">ip4.c</a>
+</li>
+<li>lwip_ip_addr_type
+: <a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">ip_addr.h</a>
+</li>
+<li>LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX
+: <a class="el" href="ip_8h.html#a355679dba1c0d8ef07ce3abcd28e3063">ip.h</a>
+</li>
+<li>LWIP_IPV4
+: <a class="el" href="group__lwip__opts__ipv4.html#ga429e811a80ebb5157e14a854870c4410">opt.h</a>
+</li>
+<li>LWIP_IPV6
+: <a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">opt.h</a>
+</li>
+<li>LWIP_IPV6_ADDRESS_LIFETIMES
+: <a class="el" href="group__lwip__opts__ipv6.html#ga2c0127fca1073ad3f0a1e53f00ea8858">opt.h</a>
+</li>
+<li>LWIP_IPV6_AUTOCONFIG
+: <a class="el" href="group__lwip__opts__ipv6.html#ga580039bf2baf49fcb9e504e5d2b40a03">opt.h</a>
+</li>
+<li>LWIP_IPV6_DHCP6
+: <a class="el" href="group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6">opt.h</a>
+</li>
+<li>LWIP_IPV6_DHCP6_STATEFUL
+: <a class="el" href="group__lwip__opts__dhcpv6.html#ga3fc9dbe8feae61621cac4952ac28e155">opt.h</a>
+</li>
+<li>LWIP_IPV6_DHCP6_STATELESS
+: <a class="el" href="group__lwip__opts__dhcpv6.html#ga8d6bab14d580d2136430319aab6d7930">opt.h</a>
+</li>
+<li>LWIP_IPV6_DUP_DETECT_ATTEMPTS
+: <a class="el" href="group__lwip__opts__ipv6.html#gad8489522d34f37e42b4001bab3781bcb">opt.h</a>
+</li>
+<li>LWIP_IPV6_FORWARD
+: <a class="el" href="group__lwip__opts__ipv6.html#gac96c5802de6c75dd62ab38cff6d16a32">opt.h</a>
+</li>
+<li>LWIP_IPV6_FRAG
+: <a class="el" href="group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3">opt.h</a>
+</li>
+<li>LWIP_IPV6_MLD
+: <a class="el" href="group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528">opt.h</a>
+</li>
+<li>LWIP_IPV6_NUM_ADDRESSES
+: <a class="el" href="group__lwip__opts__ipv6.html#ga16c1b672604bfb0a66a6aeeb854589d3">opt.h</a>
+</li>
+<li>LWIP_IPV6_REASS
+: <a class="el" href="group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864">opt.h</a>
+</li>
+<li>lwip_ipv6_scope_type
+: <a class="el" href="group__ip6__zones.html#ga1993c4b6a297b6e92d80a9ce46ddedfe">ip6_zone.h</a>
+</li>
+<li>LWIP_IPV6_SCOPES
+: <a class="el" href="group__lwip__opts__ipv6.html#ga91d1e630059df3b3a296e2b6ff7aead5">opt.h</a>
+</li>
+<li>LWIP_IPV6_SCOPES_DEBUG
+: <a class="el" href="group__lwip__opts__ipv6.html#ga623ef29d27d98fb7be8732730a5ddf4b">opt.h</a>
+</li>
+<li>LWIP_IPV6_SEND_ROUTER_SOLICIT
+: <a class="el" href="group__lwip__opts__ipv6.html#ga273ed2e1a4e6a43713a0e4a06a34ee5c">opt.h</a>
+</li>
+<li>lwip_itoa()
+: <a class="el" href="group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284">def.c</a>
+, <a class="el" href="group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284">def.h</a>
+</li>
+<li>lwip_listen()
+: <a class="el" href="sockets_8c.html#abee6ee286147cf334a1ba19f19b2e08b">sockets.c</a>
+, <a class="el" href="sockets_8h.html#abee6ee286147cf334a1ba19f19b2e08b">sockets.h</a>
+</li>
+<li>LWIP_LOOPBACK_MAX_PBUFS
+: <a class="el" href="group__lwip__opts__loop.html#gaacc3ad5d0a771d45fb0a3e3a09b1dbea">opt.h</a>
+</li>
+<li>LWIP_LOOPIF_MULTICAST
+: <a class="el" href="group__lwip__opts__loop.html#ga10a878b390c2fbe421d82502001c7300">opt.h</a>
+</li>
+<li>LWIP_LOWPAN6_802154_DEBUG
+: <a class="el" href="lowpan6__opts_8h.html#acf9a44be56d5dca9e45f644571d66f58">lowpan6_opts.h</a>
+</li>
+<li>LWIP_LOWPAN6_DEBUG
+: <a class="el" href="lowpan6__opts_8h.html#ae90ebb32999c6df5cc83705e133e1754">lowpan6_opts.h</a>
+</li>
+<li>LWIP_LOWPAN6_DECOMPRESSION_DEBUG
+: <a class="el" href="lowpan6__opts_8h.html#a7f4db0bd3dbe36a19efbd24cd8b7fcf0">lowpan6_opts.h</a>
+</li>
+<li>LWIP_LOWPAN6_IP_COMPRESSED_DEBUG
+: <a class="el" href="lowpan6__opts_8h.html#a231bc758484376dfd2ded6931c462df8">lowpan6_opts.h</a>
+</li>
+<li>LWIP_MAKEU32
+: <a class="el" href="def_8h.html#acf56d3da92a0a7a8a62a617e793e948c">def.h</a>
+</li>
+<li>LWIP_MARK_TCPIP_THREAD
+: <a class="el" href="group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e">opt.h</a>
+</li>
+<li>LWIP_MEM_ALIGN
+: <a class="el" href="group__compiler__abstraction.html#gaa8e8724eb1c220cbbb90de9e175ce1dc">arch.h</a>
+</li>
+<li>LWIP_MEM_ALIGN_BUFFER
+: <a class="el" href="group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e">arch.h</a>
+</li>
+<li>LWIP_MEM_ALIGN_SIZE
+: <a class="el" href="group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18">arch.h</a>
+</li>
+<li>LWIP_MEMPOOL_ALLOC
+: <a class="el" href="group__mempool.html#ga5e2498f6c17746c1fe7153de5f7f275a">memp.h</a>
+</li>
+<li>LWIP_MEMPOOL_DECLARE
+: <a class="el" href="group__mempool.html#ga5b1fb3ce7942432d87cc948b1c5ed6cb">memp.h</a>
+</li>
+<li>LWIP_MEMPOOL_FREE
+: <a class="el" href="group__mempool.html#gaa43d114dd702fbd8f1db18474ea93a04">memp.h</a>
+</li>
+<li>LWIP_MEMPOOL_INIT
+: <a class="el" href="group__mempool.html#ga60b51c06d276f525b35d8b7abd4dcb41">memp.h</a>
+</li>
+<li>LWIP_MEMPOOL_PROTOTYPE
+: <a class="el" href="group__mempool.html#ga92fc8c29d0e2654f2a2ecc43b2b7fb13">memp.h</a>
+</li>
+<li>LWIP_MIB2_CALLBACKS
+: <a class="el" href="group__lwip__opts__mib2.html#gad84d6a781880cec19a1ef4b2339fea29">opt.h</a>
+</li>
+<li>LWIP_MPU_COMPATIBLE
+: <a class="el" href="group__lwip__opts__lock.html#gae9afcefa5d233372abb9413188dd98c9">opt.h</a>
+</li>
+<li>LWIP_MULTICAST_PING
+: <a class="el" href="group__lwip__opts__icmp.html#gaf77baf0a83b04312eab4c006ef229661">opt.h</a>
+</li>
+<li>LWIP_MULTICAST_TX_OPTIONS
+: <a class="el" href="group__lwip__opts__multicast.html#gab8d7d53247cc62caa76f54b2c5a5df30">opt.h</a>
+</li>
+<li>LWIP_ND6_ALLOW_RA_UPDATES
+: <a class="el" href="group__lwip__opts__nd6.html#gad35d10353ac7c7d2c8d4b83788cdc6d9">opt.h</a>
+</li>
+<li>LWIP_ND6_DELAY_FIRST_PROBE_TIME
+: <a class="el" href="group__lwip__opts__nd6.html#ga315bd6d4a9d185766dfc3253cd9d7715">opt.h</a>
+</li>
+<li>LWIP_ND6_MAX_ANYCAST_DELAY_TIME
+: <a class="el" href="group__lwip__opts__nd6.html#ga960b8973df083fad53ae0eaa79f8c4df">opt.h</a>
+</li>
+<li>LWIP_ND6_MAX_MULTICAST_SOLICIT
+: <a class="el" href="group__lwip__opts__nd6.html#ga980909018aed54adc10dd68be3572b30">opt.h</a>
+</li>
+<li>LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT
+: <a class="el" href="group__lwip__opts__nd6.html#ga86ab0cac87cdc7aeff09384ddbaaba2a">opt.h</a>
+</li>
+<li>LWIP_ND6_MAX_UNICAST_SOLICIT
+: <a class="el" href="group__lwip__opts__nd6.html#gafa6f4c2d2c259ab0895fa03a6f08c691">opt.h</a>
+</li>
+<li>LWIP_ND6_NUM_DESTINATIONS
+: <a class="el" href="group__lwip__opts__nd6.html#gacad118b1ae886e80137a1d4f0fb19672">opt.h</a>
+</li>
+<li>LWIP_ND6_NUM_NEIGHBORS
+: <a class="el" href="group__lwip__opts__nd6.html#gab2fe15bdb4e0a41f295eb5577b11ad16">opt.h</a>
+</li>
+<li>LWIP_ND6_NUM_PREFIXES
+: <a class="el" href="group__lwip__opts__nd6.html#gad9cc576b5951f1b5e1c2b0d0bb831d9a">opt.h</a>
+</li>
+<li>LWIP_ND6_NUM_ROUTERS
+: <a class="el" href="group__lwip__opts__nd6.html#ga75e81a96148f266c8fad8c0bcab2f36a">opt.h</a>
+</li>
+<li>LWIP_ND6_QUEUEING
+: <a class="el" href="group__lwip__opts__nd6.html#ga0757a3c1b5d1563ad2d77228e1d8a60f">opt.h</a>
+</li>
+<li>LWIP_ND6_RDNSS_MAX_DNS_SERVERS
+: <a class="el" href="group__lwip__opts__nd6.html#gaea4d829c0b52cc6cc28925eee89a7429">opt.h</a>
+</li>
+<li>LWIP_ND6_REACHABLE_TIME
+: <a class="el" href="group__lwip__opts__nd6.html#ga269db9d61cdfc2fd3bc7b12c56261c74">opt.h</a>
+</li>
+<li>LWIP_ND6_RETRANS_TIMER
+: <a class="el" href="group__lwip__opts__nd6.html#ga461abcbeef1d236d1f3201827dd28ad9">opt.h</a>
+</li>
+<li>LWIP_ND6_TCP_REACHABILITY_HINTS
+: <a class="el" href="group__lwip__opts__nd6.html#ga9d7cb6fd447ef0f6726f565e2c7509c4">opt.h</a>
+</li>
+<li>LWIP_NETBIOS_RESPOND_NAME_QUERY
+: <a class="el" href="group__netbiosns__opts.html#gaa9dec8fc3dee5e72fbe9b854437bce84">netbiosns_opts.h</a>
+</li>
+<li>LWIP_NETBUF_RECVINFO
+: <a class="el" href="group__lwip__opts__udp.html#ga72021505969c5ce29e972486d7794baa">opt.h</a>
+</li>
+<li>LWIP_NETCONN
+: <a class="el" href="group__lwip__opts__netconn.html#ga478041b8544461258f6961bf0f3c1a77">opt.h</a>
+</li>
+<li>lwip_netconn_do_accepted()
+: <a class="el" href="api__msg_8c.html#afc455a5f63fa3bc85022e34861a2fea5">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#afc455a5f63fa3bc85022e34861a2fea5">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_bind()
+: <a class="el" href="api__msg_8h.html#aa8e265922cda9f7fd54bf39e4ecf3768">api_msg.h</a>
+, <a class="el" href="api__msg_8c.html#aa8e265922cda9f7fd54bf39e4ecf3768">api_msg.c</a>
+</li>
+<li>lwip_netconn_do_bind_if()
+: <a class="el" href="api__msg_8c.html#af4fed475f06818552ffefc8a1eda6605">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#af4fed475f06818552ffefc8a1eda6605">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_close()
+: <a class="el" href="api__msg_8c.html#aff73e0fcdc13c7cb97a4bfbd71a4347d">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#aff73e0fcdc13c7cb97a4bfbd71a4347d">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_connect()
+: <a class="el" href="api__msg_8c.html#a6f18f57eeda7b0596110930e696f9902">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#a6f18f57eeda7b0596110930e696f9902">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_delconn()
+: <a class="el" href="api__msg_8h.html#a9e77da8492e93d570bc1ec37f3c91d59">api_msg.h</a>
+, <a class="el" href="api__msg_8c.html#a9e77da8492e93d570bc1ec37f3c91d59">api_msg.c</a>
+</li>
+<li>lwip_netconn_do_disconnect()
+: <a class="el" href="api__msg_8c.html#adec8a5ddbcbdacba099c630c8310d34a">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#adec8a5ddbcbdacba099c630c8310d34a">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_getaddr()
+: <a class="el" href="api__msg_8h.html#af33f432db6e3f111d4ee5876089e4163">api_msg.h</a>
+, <a class="el" href="api__msg_8c.html#af33f432db6e3f111d4ee5876089e4163">api_msg.c</a>
+</li>
+<li>lwip_netconn_do_gethostbyname()
+: <a class="el" href="api__msg_8c.html#afd3802b2f12e27928ccc0f759b887d61">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#afd3802b2f12e27928ccc0f759b887d61">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_join_leave_group()
+: <a class="el" href="api__msg_8h.html#a7402b52416828906a5679828cce37546">api_msg.h</a>
+, <a class="el" href="api__msg_8c.html#a7402b52416828906a5679828cce37546">api_msg.c</a>
+</li>
+<li>lwip_netconn_do_join_leave_group_netif()
+: <a class="el" href="api__msg_8c.html#aacc47257c0a5aa5eb107da0cfc699722">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#aacc47257c0a5aa5eb107da0cfc699722">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_listen()
+: <a class="el" href="api__msg_8c.html#aa7d753d86818bfd77c1d73dab8dc943f">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#aa7d753d86818bfd77c1d73dab8dc943f">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_newconn()
+: <a class="el" href="api__msg_8c.html#abc6e1a4f8dd4640ab00eae4bbfdb7236">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#abc6e1a4f8dd4640ab00eae4bbfdb7236">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_recv()
+: <a class="el" href="api__msg_8c.html#ab6ae6036baf5c8fef22228ceb5e3ff9f">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#ab6ae6036baf5c8fef22228ceb5e3ff9f">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_send()
+: <a class="el" href="api__msg_8c.html#ac714bdd3d57e34f0a6517a469d80df6c">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#ac714bdd3d57e34f0a6517a469d80df6c">api_msg.h</a>
+</li>
+<li>lwip_netconn_do_write()
+: <a class="el" href="api__msg_8c.html#aca4545a471ead1bc673ea93fe85f7e5c">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#aca4545a471ead1bc673ea93fe85f7e5c">api_msg.h</a>
+</li>
+<li>LWIP_NETCONN_FULLDUPLEX
+: <a class="el" href="group__lwip__opts__netconn.html#ga7bfe8487a3abffdd9d6730977d22c406">opt.h</a>
+</li>
+<li>LWIP_NETCONN_SEM_PER_THREAD
+: <a class="el" href="group__lwip__opts__netconn.html#ga2543345adf7d2c307df78a54ac2ba8c4">opt.h</a>
+</li>
+<li>LWIP_NETIF_API
+: <a class="el" href="group__lwip__opts__netif.html#gadd45fb65f2d0e6de5a0d14ff9e101b77">opt.h</a>
+</li>
+<li>LWIP_NETIF_EXT_STATUS_CALLBACK
+: <a class="el" href="group__lwip__opts__netif.html#ga090482867ba04d442ab5b8ad745c0e1e">opt.h</a>
+</li>
+<li>LWIP_NETIF_HOSTNAME
+: <a class="el" href="group__lwip__opts__netif.html#gaa714dbfa66822ec4c6111bdb8cf753c1">opt.h</a>
+</li>
+<li>LWIP_NETIF_HWADDRHINT
+: <a class="el" href="group__lwip__opts__netif.html#gad1d5e878d94b56ba687cef69be936ad9">opt.h</a>
+</li>
+<li>LWIP_NETIF_LINK_CALLBACK
+: <a class="el" href="group__lwip__opts__netif.html#ga1a446932dd927cc4136ba654c13bb97b">opt.h</a>
+</li>
+<li>LWIP_NETIF_LOOPBACK
+: <a class="el" href="group__lwip__opts__loop.html#ga724a0ea765d5a47d026d529725f31c01">opt.h</a>
+</li>
+<li>LWIP_NETIF_LOOPBACK_MULTITHREADING
+: <a class="el" href="group__lwip__opts__loop.html#gaa28d13ddd5281b1912276991e7ea58c5">opt.h</a>
+</li>
+<li>LWIP_NETIF_REMOVE_CALLBACK
+: <a class="el" href="group__lwip__opts__netif.html#ga9c942c2e9655b06d4f73c630d30f60bf">opt.h</a>
+</li>
+<li>LWIP_NETIF_STATUS_CALLBACK
+: <a class="el" href="group__lwip__opts__netif.html#gaffb97d89516c38d3fcb9e44e5d707f36">opt.h</a>
+</li>
+<li>LWIP_NETIF_TX_SINGLE_PBUF
+: <a class="el" href="group__lwip__opts__netif.html#gabafb9f64a80e51b56c0abbcfc1f7e04e">opt.h</a>
+</li>
+<li>LWIP_NO_CTYPE_H
+: <a class="el" href="group__compiler__abstraction.html#ga6871ce1e92ae09cdad39a9b230a3a800">arch.h</a>
+</li>
+<li>LWIP_NO_INTTYPES_H
+: <a class="el" href="group__compiler__abstraction.html#ga5bf52d6f2729d0c8afd365f69d7d4373">arch.h</a>
+</li>
+<li>LWIP_NO_LIMITS_H
+: <a class="el" href="group__compiler__abstraction.html#gade9c8513419a799cd78a07ae894bb805">arch.h</a>
+</li>
+<li>LWIP_NO_STDDEF_H
+: <a class="el" href="group__compiler__abstraction.html#ga53954d507c09e521ec0d44a2450bb89d">arch.h</a>
+</li>
+<li>LWIP_NO_STDINT_H
+: <a class="el" href="group__compiler__abstraction.html#ga122c754db96ecad23bc6f4541d6360c1">arch.h</a>
+</li>
+<li>LWIP_NOASSERT
+: <a class="el" href="group__lwip__assertions.html#ga71b7787802abbfc2218fb1f39f948a41">debug.h</a>
+</li>
+<li>LWIP_NSC_IPV4_ADDRESS_CHANGED
+: <a class="el" href="netif_8h.html#aeb4e790199b02469aa04c044ef5cfa32">netif.h</a>
+</li>
+<li>LWIP_NSC_IPV4_GATEWAY_CHANGED
+: <a class="el" href="netif_8h.html#a22400d2202581b4a7273cded712adf49">netif.h</a>
+</li>
+<li>LWIP_NSC_IPV4_NETMASK_CHANGED
+: <a class="el" href="netif_8h.html#ad747072771a887443ab33f90a12077d4">netif.h</a>
+</li>
+<li>LWIP_NSC_IPV4_SETTINGS_CHANGED
+: <a class="el" href="netif_8h.html#a4ff19a6f3045f65d0397d30b6609660a">netif.h</a>
+</li>
+<li>LWIP_NSC_IPV6_ADDR_STATE_CHANGED
+: <a class="el" href="netif_8h.html#a0d70fe11cac43c8fa35827b8e607ccf6">netif.h</a>
+</li>
+<li>LWIP_NSC_IPV6_SET
+: <a class="el" href="netif_8h.html#a8fb4317a77ee2e3848be80db15618666">netif.h</a>
+</li>
+<li>LWIP_NSC_LINK_CHANGED
+: <a class="el" href="netif_8h.html#a5ad7308195c0581680dd62fb148501cd">netif.h</a>
+</li>
+<li>LWIP_NSC_NETIF_ADDED
+: <a class="el" href="netif_8h.html#adbfecb47897cfe63d4f6366c1fed23b2">netif.h</a>
+</li>
+<li>LWIP_NSC_NETIF_REMOVED
+: <a class="el" href="netif_8h.html#ae8e2dc87c19a03d481ae37bcf7ced5c9">netif.h</a>
+</li>
+<li>LWIP_NSC_STATUS_CHANGED
+: <a class="el" href="netif_8h.html#a6f406ee3ab60e8a4f27ae2483c96b8e2">netif.h</a>
+</li>
+<li>lwip_num_cyclic_timers
+: <a class="el" href="timeouts_8c.html#a9d01f287a19f20b073d3a1c306ecbfcd">timeouts.c</a>
+, <a class="el" href="timeouts_8h.html#a9d01f287a19f20b073d3a1c306ecbfcd">timeouts.h</a>
+</li>
+<li>LWIP_NUM_NETIF_CLIENT_DATA
+: <a class="el" href="group__lwip__opts__netif.html#ga94a35212616f9a9aae5c98741612b936">opt.h</a>
+</li>
+<li>LWIP_NUM_SYS_TIMEOUT_INTERNAL
+: <a class="el" href="group__lwip__opts__memp.html#ga87a05debb46ff82093d0e6dc1aad8804">opt.h</a>
+</li>
+<li>LWIP_PACKED_CAST
+: <a class="el" href="group__compiler__abstraction.html#ga4488578f18ad1a76e4fa8bc288c51446">arch.h</a>
+</li>
+<li>LWIP_PBUF_REF_T
+: <a class="el" href="group__lwip__opts__pbuf.html#gaaefb80d6bf9257c0f4322c36e1272c38">opt.h</a>
+</li>
+<li>LWIP_PERF
+: <a class="el" href="group__lwip__opts__perf.html#ga44acd95b33e2d58a74455279721298de">opt.h</a>
+</li>
+<li>LWIP_PLATFORM_ASSERT
+: <a class="el" href="group__compiler__abstraction.html#ga7e8bcd0282525704d6dd596bdd1b47d0">arch.h</a>
+</li>
+<li>LWIP_PLATFORM_DIAG
+: <a class="el" href="group__compiler__abstraction.html#gaccef167be13a500ce30036030a9b142b">arch.h</a>
+</li>
+<li>LWIP_POLLSCAN_CLEAR
+: <a class="el" href="sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9aa9a8fe3199d00016f1f5ad639e1b28f7">sockets.c</a>
+</li>
+<li>LWIP_POLLSCAN_DEC_WAIT
+: <a class="el" href="sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9a6c1eefa3e29a39b923c4b522eb1b3eb1">sockets.c</a>
+</li>
+<li>LWIP_POLLSCAN_INC_WAIT
+: <a class="el" href="sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9ab6511d3104f70c18fb4bd80f24cb867d">sockets.c</a>
+</li>
+<li>lwip_pollscan_opts
+: <a class="el" href="sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9">sockets.c</a>
+</li>
+<li>LWIP_POSIX_SOCKETS_IO_NAMES
+: <a class="el" href="group__lwip__opts__socket.html#ga484c38ab08f60d5b3335d23d31f9a402">opt.h</a>
+</li>
+<li>LWIP_PROVIDE_ERRNO
+: <a class="el" href="group__compiler__abstraction.html#ga8e2cba4c97dd38f4d517ed21cf109ade">arch.h</a>
+</li>
+<li>LWIP_PTR_NUMERIC_CAST
+: <a class="el" href="group__compiler__abstraction.html#ga683e5c35d3263fe3145e6a6bc546604a">arch.h</a>
+</li>
+<li>LWIP_RAND
+: <a class="el" href="group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a">arch.h</a>
+</li>
+<li>LWIP_RAW
+: <a class="el" href="group__lwip__opts__raw.html#gaca452be5cb05d9666f8f57e582c39221">opt.h</a>
+</li>
+<li>LWIP_RC_DEVELOPMENT
+: <a class="el" href="group__lwip__version.html#ga9ca69b1a453eb72efd0bbda333f2a33b">init.h</a>
+</li>
+<li>LWIP_RC_RELEASE
+: <a class="el" href="group__lwip__version.html#ga375ee868e76ed7c458cdf249387bd469">init.h</a>
+</li>
+<li>LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG
+: <a class="el" href="lowpan6__opts_8h.html#a5b7a3e204d2edde5552ca3c8694419c1">lowpan6_opts.h</a>
+</li>
+<li>LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS
+: <a class="el" href="lowpan6__opts_8h.html#af4a4d962af3439b111a8e72e5eeaccf8">lowpan6_opts.h</a>
+</li>
+<li>lwip_shutdown()
+: <a class="el" href="sockets_8c.html#ade85c68b6673296c8fb67127b93fa4c1">sockets.c</a>
+, <a class="el" href="sockets_8h.html#ade85c68b6673296c8fb67127b93fa4c1">sockets.h</a>
+</li>
+<li>LWIP_SINGLE_NETIF
+: <a class="el" href="group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be">opt.h</a>
+</li>
+<li>LWIP_SNMP
+: <a class="el" href="group__snmp__opts.html#gaf4900859dc53f19f5f67cc34e48ad68c">snmp_opts.h</a>
+</li>
+<li>LWIP_SNMP_V3
+: <a class="el" href="snmp__opts_8h.html#a1fe0e120f979ed400f649019edcefe2b">snmp_opts.h</a>
+</li>
+<li>LWIP_SO_LINGER
+: <a class="el" href="group__lwip__opts__socket.html#gaa91292d5d014dc1c6f1c1f4166269a1d">opt.h</a>
+</li>
+<li>LWIP_SO_RCVBUF
+: <a class="el" href="group__lwip__opts__socket.html#ga06390cebcf4d13d3d47a11365e5fcd28">opt.h</a>
+</li>
+<li>LWIP_SO_RCVTIMEO
+: <a class="el" href="group__lwip__opts__socket.html#ga91af3ade95b20b9a60c65ed0380fa0ed">opt.h</a>
+</li>
+<li>LWIP_SO_SNDRCVTIMEO_NONSTANDARD
+: <a class="el" href="group__lwip__opts__socket.html#ga5b115bacb569763d8a3889a12229e942">opt.h</a>
+</li>
+<li>LWIP_SO_SNDTIMEO
+: <a class="el" href="group__lwip__opts__socket.html#ga1162cb685f202d9b21c11344b8209a58">opt.h</a>
+</li>
+<li>LWIP_SOCKET
+: <a class="el" href="group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f">opt.h</a>
+</li>
+<li>LWIP_SOCKET_OFFSET
+: <a class="el" href="group__lwip__opts__socket.html#gad0197c845fbb44c920b272f0fef3b57e">opt.h</a>
+</li>
+<li>LWIP_SOCKET_POLL
+: <a class="el" href="group__lwip__opts__socket.html#ga6c14d705e3321429683f24de9f5a7200">opt.h</a>
+</li>
+<li>LWIP_SOCKET_SELECT
+: <a class="el" href="group__lwip__opts__socket.html#ga68417078b71b0be9735256f52933dcdb">opt.h</a>
+</li>
+<li>lwip_socket_thread_cleanup()
+: <a class="el" href="sockets_8h.html#ab8cd92b10dbe3fb33da03faed1ea98a7">sockets.h</a>
+, <a class="el" href="sockets_8c.html#ab8cd92b10dbe3fb33da03faed1ea98a7">sockets.c</a>
+</li>
+<li>lwip_socket_thread_init()
+: <a class="el" href="sockets_8h.html#a0a250b3b4d1827e3a3661327f5e80ae0">sockets.h</a>
+, <a class="el" href="sockets_8c.html#a0a250b3b4d1827e3a3661327f5e80ae0">sockets.c</a>
+</li>
+<li>lwip_stats
+: <a class="el" href="stats_8h.html#a614735db0145db9ba944ede600d1d19b">stats.h</a>
+, <a class="el" href="stats_8c.html#a614735db0145db9ba944ede600d1d19b">stats.c</a>
+</li>
+<li>LWIP_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga542b58734cc01902c5e099f6efdc5f1b">opt.h</a>
+</li>
+<li>LWIP_STATS_DISPLAY
+: <a class="el" href="group__lwip__opts__stats.html#gacdc38ed58d1900b5d3d109a65be1c3d1">opt.h</a>
+</li>
+<li>lwip_stricmp()
+: <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()
+: <a class="el" href="group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a">def.h</a>
+, <a class="el" href="group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a">def.c</a>
+</li>
+<li>lwip_strnstr()
+: <a class="el" href="group__sys__nonstandard.html#gaeece028198cdaea2f0d2f1d691752c02">def.h</a>
+, <a class="el" href="group__sys__nonstandard.html#gaeece028198cdaea2f0d2f1d691752c02">def.c</a>
+</li>
+<li>LWIP_SUPPORT_CUSTOM_PBUF
+: <a class="el" href="pbuf_8h.html#a64174c5169b48dc17674324afd9c63b9">pbuf.h</a>
+</li>
+<li>LWIP_TCP
+: <a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">opt.h</a>
+</li>
+<li>LWIP_TCP_CALC_INITIAL_CWND
+: <a class="el" href="tcp__in_8c.html#aea174f2c6ca4cb0ad270dd8d0faf0c84">tcp_in.c</a>
+</li>
+<li>LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT
+: <a class="el" href="group__lwip__opts__socket.html#ga3e7498d5d2921f0df3792de72f384d36">opt.h</a>
+</li>
+<li>LWIP_TCP_KEEPALIVE
+: <a class="el" href="group__lwip__opts__socket.html#ga8b9369ab260f032686a81c77c5b4db77">opt.h</a>
+</li>
+<li>LWIP_TCP_MAX_SACK_NUM
+: <a class="el" href="group__lwip__opts__tcp.html#gaaac0e9f559a8e3c251f3504cebcf44dc">opt.h</a>
+</li>
+<li>LWIP_TCP_PCB_NUM_EXT_ARGS
+: <a class="el" href="group__lwip__opts__tcp.html#ga40b1cdad52eaa91a3f5c242fc92ee223">opt.h</a>
+</li>
+<li>LWIP_TCP_SACK_OUT
+: <a class="el" href="group__lwip__opts__tcp.html#gaf1b6a015d29fea67b906c276e1e8314f">opt.h</a>
+</li>
+<li>LWIP_TCP_TIMESTAMPS
+: <a class="el" href="group__lwip__opts__tcp.html#ga249bc450bb818cf2ef3cf1472ff354fd">opt.h</a>
+</li>
+<li>LWIP_TCPIP_CORE_LOCKING
+: <a class="el" href="group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011">opt.h</a>
+</li>
+<li>LWIP_TCPIP_CORE_LOCKING_INPUT
+: <a class="el" href="group__lwip__opts__lock.html#ga351beb1c06affe49e717bc9f76c66acf">opt.h</a>
+</li>
+<li>LWIP_TCPIP_THREAD_ALIVE
+: <a class="el" href="group__lwip__opts__thread.html#ga8b99d75d9e0a0868567d10c8522915bb">opt.h</a>
+</li>
+<li>LWIP_TCPIP_TIMEOUT
+: <a class="el" href="group__lwip__opts__netconn.html#ga1cd8d15a42262a0defaedabed126ea99">opt.h</a>
+</li>
+<li>lwip_thread_fn
+: <a class="el" href="sys_8h.html#ae30a77bf6bd69bfcc5f235eaad54f2b9">sys.h</a>
+</li>
+<li>LWIP_TIMERS
+: <a class="el" href="group__lwip__opts__timers.html#ga25a41610055f91cbd0960256240b8f2c">opt.h</a>
+</li>
+<li>LWIP_TIMERS_CUSTOM
+: <a class="el" href="group__lwip__opts__timers.html#gaff0ea56f3e3d8e86c49b50557bc13815">opt.h</a>
+</li>
+<li>LWIP_TIMEVAL_PRIVATE
+: <a class="el" href="sockets_8h.html#aaffd64f6887883ec6401e6bb684c40fa">sockets.h</a>
+</li>
+<li>LWIP_UDP
+: <a class="el" href="group__lwip__opts__udp.html#gab6030e96e72df649d2650fd32d7a67b3">opt.h</a>
+</li>
+<li>LWIP_UDPLITE
+: <a class="el" href="group__lwip__opts__udp.html#ga35731bc5f337943e474a15c1cd538a61">opt.h</a>
+</li>
+<li>LWIP_UNUSED_ARG
+: <a class="el" href="group__compiler__abstraction.html#ga70624a5deb8b9199406372a7f3603ecf">arch.h</a>
+</li>
+<li>LWIP_VERSION
+: <a class="el" href="group__lwip__version.html#ga0a0d322fad0a67aa5b8f1b8c9dfcfe59">init.h</a>
+</li>
+<li>LWIP_VERSION_MAJOR
+: <a class="el" href="group__lwip__version.html#ga4308c06ef36496e00c798d96d7d03246">init.h</a>
+</li>
+<li>LWIP_VERSION_MINOR
+: <a class="el" href="group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034">init.h</a>
+</li>
+<li>LWIP_VERSION_RC
+: <a class="el" href="group__lwip__version.html#gac1dc92d8f453a98560de7e2e00a221a1">init.h</a>
+</li>
+<li>LWIP_VERSION_REVISION
+: <a class="el" href="group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50">init.h</a>
+</li>
+<li>LWIP_VERSION_STRING
+: <a class="el" href="group__lwip__version.html#gab47e87bc38eef94486db402813183ba7">init.h</a>
+</li>
+<li>LWIP_WND_SCALE
+: <a class="el" href="group__lwip__opts__tcp.html#ga88dbbfeeeb41b129fdc8235fc08bb530">opt.h</a>
+</li>
+<li>lwiperf_abort()
+: <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_CHECK_RX_DATA
+: <a class="el" href="lwiperf_8c.html#af51dcfc53fe575411c26e18963f1b902">lwiperf.c</a>
+</li>
+<li>LWIPERF_CLIENT
+: <a class="el" href="lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cae1862655ebaaea2e7e0261dff0173110">lwiperf.h</a>
+</li>
+<li>lwiperf_client_type
+: <a class="el" href="lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76c">lwiperf.h</a>
+</li>
+<li>LWIPERF_DUAL
+: <a class="el" href="lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cab0381feca6655968e7380622e7a63ede">lwiperf.h</a>
+</li>
+<li>lwiperf_report_fn
+: <a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf.h</a>
+</li>
+<li>lwiperf_report_type
+: <a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6">lwiperf.h</a>
+</li>
+<li>LWIPERF_SERVER_IP_TYPE
+: <a class="el" href="lwiperf_8c.html#a1351e47d0bdb7d0fe0efaf9f1b2b0f7a">lwiperf.c</a>
+</li>
+<li>lwiperf_settings_t
+: <a class="el" href="lwiperf_8c.html#a4a794a0c1a90b889d54b1dacbce923f4">lwiperf.c</a>
+</li>
+<li>lwiperf_start_tcp_client()
+: <a class="el" href="group__iperf.html#gad8317f52289d8bb12a14627cd177a565">lwiperf.c</a>
+, <a class="el" href="group__iperf.html#gad8317f52289d8bb12a14627cd177a565">lwiperf.h</a>
+</li>
+<li>lwiperf_start_tcp_client_default()
+: <a class="el" href="group__iperf.html#ga85a487cf8ecbd0999382c9bff375d0da">lwiperf.h</a>
+, <a class="el" href="group__iperf.html#ga85a487cf8ecbd0999382c9bff375d0da">lwiperf.c</a>
+</li>
+<li>lwiperf_start_tcp_server()
+: <a class="el" href="group__iperf.html#gad97bf77057e7f96d6d8def812deea202">lwiperf.c</a>
+, <a class="el" href="group__iperf.html#gad97bf77057e7f96d6d8def812deea202">lwiperf.h</a>
+</li>
+<li>lwiperf_start_tcp_server_default()
+: <a class="el" href="group__iperf.html#gae1f30a02b86c4dd3d47810cd493baf26">lwiperf.c</a>
+, <a class="el" href="group__iperf.html#gae1f30a02b86c4dd3d47810cd493baf26">lwiperf.h</a>
+</li>
+<li>lwiperf_state_tcp_t
+: <a class="el" href="lwiperf_8c.html#a06db7abdf1d4864ca2b367d9c89e3e2d">lwiperf.c</a>
+</li>
+<li>LWIPERF_TCP_ABORTED_LOCAL
+: <a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6abee2bf6da51a0845c15ac52b280203cb">lwiperf.h</a>
+</li>
+<li>LWIPERF_TCP_ABORTED_LOCAL_DATAERROR
+: <a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6adda7e5dbaf1e04eb04ec0fd2b05584a5">lwiperf.h</a>
+</li>
+<li>LWIPERF_TCP_ABORTED_LOCAL_TXERROR
+: <a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a3d4e1f5742d80aeafb6b22aa74d93e40">lwiperf.h</a>
+</li>
+<li>LWIPERF_TCP_ABORTED_REMOTE
+: <a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6ae664c0f987584f07fb0f6f8896aada0d">lwiperf.h</a>
+</li>
+<li>LWIPERF_TCP_DONE_CLIENT
+: <a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a4f9bde0cad305eaab25d2c1d0196677b">lwiperf.h</a>
+</li>
+<li>LWIPERF_TCP_DONE_SERVER
+: <a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6aa52255236ad2983346311ce7f28210e5">lwiperf.h</a>
+</li>
+<li>LWIPERF_TCP_MAX_IDLE_SEC
+: <a class="el" href="lwiperf_8c.html#a646d7e0b37c5cefdd6eef38a3fba4673">lwiperf.c</a>
+</li>
+<li>LWIPERF_TRADEOFF
+: <a class="el" href="lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76caccdab7ee6e1b0981861e66f0755f7964">lwiperf.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_m.html b/doc/doxygen/output/html/globals_m.html
new file mode 100644
index 0000000..17bc001
--- /dev/null
+++ b/doc/doxygen/output/html/globals_m.html
@@ -0,0 +1,536 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_m.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_m"></a>- m -</h3><ul>
+<li>mdns_compress_domain()
+: <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_DEBUG
+: <a class="el" href="group__mdns__opts.html#ga53a97502efdcf1214cab4078f93a6dc9">mdns_opts.h</a>
+</li>
+<li>mdns_domain_add_label()
+: <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()
+: <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_MAX_SERVICES
+: <a class="el" href="group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6">mdns_opts.h</a>
+</li>
+<li>mdns_name_result_cb_t
+: <a class="el" href="mdns_8h.html#a19f12d7092de6fe90d5843e4ef8d4536">mdns.h</a>
+</li>
+<li>mdns_readname()
+: <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()
+: <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()
+: <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_resp_add_service_txtitem()
+: <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()
+: <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()
+: <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_init()
+: <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_settings_changed
+: <a class="el" href="group__mdns.html#gab2edba12d5cad1949f7ca040ae12beec">mdns.h</a>
+</li>
+<li>mdns_resp_register_name_result_cb()
+: <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()
+: <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()
+: <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()
+: <a class="el" href="group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9">mdns.h</a>
+, <a class="el" href="group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9">mdns.c</a>
+</li>
+<li>mdns_resp_restart()
+: <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_USENETIF_EXTCALLBACK
+: <a class="el" href="group__mdns__opts.html#ga172e579cd09a1db51cf224319c012396">mdns_opts.h</a>
+</li>
+<li>MEM_ALIGNMENT
+: <a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">opt.h</a>
+</li>
+<li>mem_calloc()
+: <a class="el" href="mem_8c.html#ab0bdc525971701883f2065e7fb257a24">mem.c</a>
+, <a class="el" href="mem_8h.html#ab0bdc525971701883f2065e7fb257a24">mem.h</a>
+</li>
+<li>MEM_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga2d7bc380695eeedb1af50c3808613afe">opt.h</a>
+</li>
+<li>mem_free()
+: <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()
+: <a class="el" href="tcpip_8c.html#a55b4de3765c6a37b3f2b26a11603771c">tcpip.c</a>
+, <a class="el" href="tcpip_8h.html#a55b4de3765c6a37b3f2b26a11603771c">tcpip.h</a>
+</li>
+<li>mem_init()
+: <a class="el" href="mem_8c.html#a44a136e3b70c36abb6f8dc060c778113">mem.c</a>
+, <a class="el" href="mem_8h.html#a44a136e3b70c36abb6f8dc060c778113">mem.h</a>
+</li>
+<li>MEM_LIBC_MALLOC
+: <a class="el" href="group__lwip__opts__mem.html#ga4ef345cc270912bd2230b1c5ec51dfc8">opt.h</a>
+</li>
+<li>mem_malloc()
+: <a class="el" href="mem_8c.html#af418ade27d91d41e6143dba2cc246b0f">mem.c</a>
+, <a class="el" href="mem_8h.html#a932aa40d85b14cb7331625e012d12335">mem.h</a>
+</li>
+<li>MEM_OVERFLOW_CHECK
+: <a class="el" href="group__lwip__opts__mem.html#gae331a198bd06100b90ea020cd5f07f4e">opt.h</a>
+</li>
+<li>MEM_SANITY_CHECK
+: <a class="el" href="group__lwip__opts__mem.html#ga90b17afabb93986a162c327ed30bb4d3">opt.h</a>
+</li>
+<li>MEM_SIZE
+: <a class="el" href="group__lwip__opts__mem.html#ga2dcf8c45f945dd0c4301a94700f2112c">opt.h</a>
+</li>
+<li>MEM_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga61ec04a08c4fde690d10819e582656a7">opt.h</a>
+</li>
+<li>mem_trim()
+: <a class="el" href="mem_8c.html#a7e6b7f11bb50bead9b35515d9a517124">mem.c</a>
+, <a class="el" href="mem_8h.html#a5e39a108c44d8a72df0b30a117cb62e4">mem.h</a>
+</li>
+<li>MEM_USE_POOLS
+: <a class="el" href="group__lwip__opts__mem.html#gaddca3141bc7037241769eb152b6f89ba">opt.h</a>
+</li>
+<li>MEM_USE_POOLS_TRY_BIGGER_POOL
+: <a class="el" href="group__lwip__opts__mem.html#gaba8be68e8fd0716b723ce4569ed89f82">opt.h</a>
+</li>
+<li>MEMCPY
+: <a class="el" href="group__lwip__opts__memcpy.html#gaa1dd57a66b6de8c0593e9e3e8d1411f6">opt.h</a>
+</li>
+<li>MEMMOVE
+: <a class="el" href="group__lwip__opts__memcpy.html#ga0e00bb235da5557fcbc049f732503863">opt.h</a>
+</li>
+<li>MEMP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gad80231923f7a808d49eba5ec57d63616">opt.h</a>
+</li>
+<li>memp_free()
+: <a class="el" href="memp_8c.html#aecd94926b7c2a0e23ae195f4ae97581f">memp.c</a>
+, <a class="el" href="memp_8h.html#aecd94926b7c2a0e23ae195f4ae97581f">memp.h</a>
+</li>
+<li>memp_free_pool()
+: <a class="el" href="memp_8c.html#a62f8c3c907743e34eee3cdac7fa1eaa5">memp.c</a>
+, <a class="el" href="memp__priv_8h.html#a62f8c3c907743e34eee3cdac7fa1eaa5">memp_priv.h</a>
+</li>
+<li>memp_init()
+: <a class="el" href="memp_8c.html#a9693e5b1ac2c6b9c0e7870522d45efa2">memp.c</a>
+, <a class="el" href="memp_8h.html#a9693e5b1ac2c6b9c0e7870522d45efa2">memp.h</a>
+</li>
+<li>memp_init_pool()
+: <a class="el" href="memp_8c.html#a6416303426d05526bed33f241fa6ecd7">memp.c</a>
+, <a class="el" href="memp__priv_8h.html#a6416303426d05526bed33f241fa6ecd7">memp_priv.h</a>
+</li>
+<li>memp_malloc()
+: <a class="el" href="memp_8c.html#a2b00593d086313c267b54a976bf67aa5">memp.c</a>
+, <a class="el" href="memp_8h.html#a2b00593d086313c267b54a976bf67aa5">memp.h</a>
+</li>
+<li>memp_malloc_pool()
+: <a class="el" href="memp_8c.html#a348c83ee972f1edf7296a1cdf1d75f22">memp.c</a>
+, <a class="el" href="memp__priv_8h.html#a348c83ee972f1edf7296a1cdf1d75f22">memp_priv.h</a>
+</li>
+<li>MEMP_MEM_INIT
+: <a class="el" href="group__lwip__opts__mem.html#gaa2f25586972d1cbc1ff0dcdc6f15a1b0">opt.h</a>
+</li>
+<li>MEMP_MEM_MALLOC
+: <a class="el" href="group__lwip__opts__mem.html#gae93af697d27bbcefa6a28052d90f2f38">opt.h</a>
+</li>
+<li>MEMP_NUM_ALTCP_PCB
+: <a class="el" href="group__lwip__opts__memp.html#ga24f6737ee990990b81b0d16ef6e0dffd">opt.h</a>
+</li>
+<li>MEMP_NUM_API_MSG
+: <a class="el" href="group__lwip__opts__memp.html#ga5a95abf3610c56e7c23cb035eb9c3444">opt.h</a>
+</li>
+<li>MEMP_NUM_ARP_QUEUE
+: <a class="el" href="group__lwip__opts__memp.html#ga087b00ea20a7edebcad33a1a1353a5d7">opt.h</a>
+</li>
+<li>MEMP_NUM_DNS_API_MSG
+: <a class="el" href="group__lwip__opts__memp.html#ga3b1f228c598529c62895ad04ff294980">opt.h</a>
+</li>
+<li>MEMP_NUM_FRAG_PBUF
+: <a class="el" href="group__lwip__opts__memp.html#ga1f66051a654dcd7a4e19bc6aff240630">opt.h</a>
+</li>
+<li>MEMP_NUM_IGMP_GROUP
+: <a class="el" href="group__lwip__opts__memp.html#gab648ff95d8ffa4216b95f82a568a5d9a">opt.h</a>
+</li>
+<li>MEMP_NUM_LOCALHOSTLIST
+: <a class="el" href="group__lwip__opts__memp.html#gaa9b0f949da12cbe8fe5f7aefc30290e0">opt.h</a>
+</li>
+<li>MEMP_NUM_MLD6_GROUP
+: <a class="el" href="group__lwip__opts__mld6.html#ga89e92d8de8898696e797f13fdd169494">opt.h</a>
+</li>
+<li>MEMP_NUM_ND6_QUEUE
+: <a class="el" href="group__lwip__opts__nd6.html#gabfaf3d92d51e2a9d70c8360af2611fb2">opt.h</a>
+</li>
+<li>MEMP_NUM_NETBUF
+: <a class="el" href="group__lwip__opts__memp.html#ga5d99df65869ac101ed6a611fc85016be">opt.h</a>
+</li>
+<li>MEMP_NUM_NETCONN
+: <a class="el" href="group__lwip__opts__memp.html#gacb40bd726b7e15593b20a628d298f456">opt.h</a>
+</li>
+<li>MEMP_NUM_NETDB
+: <a class="el" href="group__lwip__opts__memp.html#ga293bc22b60bf3f8e2520f60a88370e7a">opt.h</a>
+</li>
+<li>MEMP_NUM_NETIFAPI_MSG
+: <a class="el" href="group__lwip__opts__memp.html#gadd5a973b98068ce9318ea2f96b5fa14c">opt.h</a>
+</li>
+<li>MEMP_NUM_PBUF
+: <a class="el" href="group__lwip__opts__memp.html#ga92b30aed958ec59334d936d4ca725418">opt.h</a>
+</li>
+<li>MEMP_NUM_RAW_PCB
+: <a class="el" href="group__lwip__opts__memp.html#ga379bf92ed322cda54cb701337421e0d3">opt.h</a>
+</li>
+<li>MEMP_NUM_REASSDATA
+: <a class="el" href="group__lwip__opts__memp.html#ga169436c5860253b90e25bdba9fdcac86">opt.h</a>
+</li>
+<li>MEMP_NUM_SELECT_CB
+: <a class="el" href="group__lwip__opts__memp.html#ga8e136f5811e6652c6c5d2fcf596f0893">opt.h</a>
+</li>
+<li>MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA
+: <a class="el" href="group__lwip__opts__memp.html#gacf9782dd26bf8a655044dc041a9de948">opt.h</a>
+</li>
+<li>MEMP_NUM_SYS_TIMEOUT
+: <a class="el" href="group__lwip__opts__memp.html#ga4afbdca581a58d57bc7a81118a95327e">opt.h</a>
+</li>
+<li>MEMP_NUM_TCP_PCB
+: <a class="el" href="group__lwip__opts__memp.html#ga73beecc19cfbc3114768f9b32b2cd70e">opt.h</a>
+</li>
+<li>MEMP_NUM_TCP_PCB_LISTEN
+: <a class="el" href="group__lwip__opts__memp.html#ga04fba6a249123513271dccb4ec26aa5a">opt.h</a>
+</li>
+<li>MEMP_NUM_TCP_SEG
+: <a class="el" href="group__lwip__opts__memp.html#gaa35fb3a1a76661e3ffb9722a57092de3">opt.h</a>
+</li>
+<li>MEMP_NUM_TCPIP_MSG_API
+: <a class="el" href="group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c">opt.h</a>
+</li>
+<li>MEMP_NUM_TCPIP_MSG_INPKT
+: <a class="el" href="group__lwip__opts__memp.html#gab089a7088439e726c3801ba9e249d831">opt.h</a>
+</li>
+<li>MEMP_NUM_UDP_PCB
+: <a class="el" href="group__lwip__opts__memp.html#ga2c416da481ab09bd1ba257b75a0707eb">opt.h</a>
+</li>
+<li>MEMP_OVERFLOW_CHECK
+: <a class="el" href="group__lwip__opts__mem.html#ga27fdd01194a42fc41a7716b72cdb49e3">opt.h</a>
+</li>
+<li>MEMP_SANITY_CHECK
+: <a class="el" href="group__lwip__opts__mem.html#ga0838947193e222a9f46b582e01e5beff">opt.h</a>
+</li>
+<li>MEMP_STATS
+: <a class="el" href="group__lwip__opts__stats.html#gab8c2430be0e567a7499a95454aaa6041">opt.h</a>
+</li>
+<li>memp_t
+: <a class="el" href="memp_8h.html#a85a164b1f7764951cc685ea525114e57">memp.h</a>
+</li>
+<li>MEMP_USE_CUSTOM_POOLS
+: <a class="el" href="group__lwip__opts__mem.html#ga69de593b8ffd4f1c249f03e48e11983b">opt.h</a>
+</li>
+<li>MIB2_COPY_SYSUPTIME_TO
+: <a class="el" href="snmp_8h.html#abe6b270482ca9af07c029f3136d8ec9c">snmp.h</a>
+</li>
+<li>MIB2_INIT_NETIF
+: <a class="el" href="group__netif__mib2.html#ga5be1b8cba1d67bf6e7f8851ec91b10f0">snmp.h</a>
+</li>
+<li>MIB2_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga5b01047eeb149a0b0ffe33d760d8370f">opt.h</a>
+</li>
+<li>MIB2_STATS_NETIF_ADD
+: <a class="el" href="group__netif__mib2.html#ga05641438775014b7e13b9e55eba48bed">snmp.h</a>
+</li>
+<li>MIB2_STATS_NETIF_INC
+: <a class="el" href="group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f">snmp.h</a>
+</li>
+<li>MIN_REQ_LEN
+: <a class="el" href="httpd_8c.html#aa8e2f3e13ac1fcacd85c558d6e40e40a">httpd.c</a>
+</li>
+<li>MIN_SIZE
+: <a class="el" href="mem_8c.html#a278694c2333c9826f21ddd2c2d220f66">mem.c</a>
+</li>
+<li>mld6_input()
+: <a class="el" href="mld6_8c.html#a7c190ca25432d466b28f607c3574a841">mld6.c</a>
+, <a class="el" href="mld6_8h.html#a7c190ca25432d466b28f607c3574a841">mld6.h</a>
+</li>
+<li>mld6_joingroup()
+: <a class="el" href="group__mld6.html#ga53560ab6e47163e4888070830bf912a8">mld6.c</a>
+, <a class="el" href="group__mld6.html#ga53560ab6e47163e4888070830bf912a8">mld6.h</a>
+</li>
+<li>mld6_joingroup_netif()
+: <a class="el" href="group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940">mld6.c</a>
+, <a class="el" href="group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940">mld6.h</a>
+</li>
+<li>mld6_leavegroup()
+: <a class="el" href="group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5">mld6.c</a>
+, <a class="el" href="group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5">mld6.h</a>
+</li>
+<li>mld6_leavegroup_netif()
+: <a class="el" href="group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22">mld6.c</a>
+, <a class="el" href="group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22">mld6.h</a>
+</li>
+<li>mld6_lookfor_group()
+: <a class="el" href="mld6_8h.html#ad2fbba6bc543dbf994961656d7431eb5">mld6.h</a>
+, <a class="el" href="mld6_8c.html#ad2fbba6bc543dbf994961656d7431eb5">mld6.c</a>
+</li>
+<li>mld6_report_groups()
+: <a class="el" href="mld6_8c.html#a2a08b95a7b3c82da05df1a3b50629686">mld6.c</a>
+, <a class="el" href="mld6_8h.html#a2a08b95a7b3c82da05df1a3b50629686">mld6.h</a>
+</li>
+<li>MLD6_STATS
+: <a class="el" href="group__lwip__opts__stats.html#gaf263df10b63b38201cae3d2dd5fb0b9e">opt.h</a>
+</li>
+<li>mld6_stop()
+: <a class="el" href="mld6_8c.html#ab7197d123f21a8863b56cc3871fd5198">mld6.c</a>
+, <a class="el" href="mld6_8h.html#ab7197d123f21a8863b56cc3871fd5198">mld6.h</a>
+</li>
+<li>mld6_tmr()
+: <a class="el" href="mld6_8c.html#a4ddb496d0a6a466df5665dbed8bd6274">mld6.c</a>
+, <a class="el" href="mld6_8h.html#a4ddb496d0a6a466df5665dbed8bd6274">mld6.h</a>
+</li>
+<li>mqtt_client_connect()
+: <a class="el" href="group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0">mqtt.c</a>
+, <a class="el" href="group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0">mqtt.h</a>
+</li>
+<li>mqtt_client_free()
+: <a class="el" href="group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882">mqtt.c</a>
+, <a class="el" href="group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882">mqtt.h</a>
+</li>
+<li>mqtt_client_is_connected()
+: <a class="el" href="group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5">mqtt.h</a>
+, <a class="el" href="group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5">mqtt.c</a>
+</li>
+<li>mqtt_client_new()
+: <a class="el" href="group__mqtt.html#gae7e19e236eb6122c8c39e93db6f5f53f">mqtt.c</a>
+, <a class="el" href="group__mqtt.html#gae7e19e236eb6122c8c39e93db6f5f53f">mqtt.h</a>
+</li>
+<li>MQTT_CONNECT_ACCEPTED
+: <a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da074dc1d289b8e8d4aad91f6a2cb93dc1">mqtt.h</a>
+</li>
+<li>MQTT_CONNECT_DISCONNECTED
+: <a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da321f5ce31b173f235de1a517fcfd00dd">mqtt.h</a>
+</li>
+<li>mqtt_connect_flag
+: <a class="el" href="mqtt_8c.html#a4f6c42ed730546ff755e3bb99989dd12">mqtt.c</a>
+</li>
+<li>MQTT_CONNECT_REFUSED_IDENTIFIER
+: <a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da28ffe49b0175adaa2b9a27cb4873224a">mqtt.h</a>
+</li>
+<li>MQTT_CONNECT_REFUSED_NOT_AUTHORIZED_
+: <a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dafc4888158dd6ee84269a5f0bfdc12b17">mqtt.h</a>
+</li>
+<li>MQTT_CONNECT_REFUSED_PROTOCOL_VERSION
+: <a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da41f8aa97142be337cb639f94d9145190">mqtt.h</a>
+</li>
+<li>MQTT_CONNECT_REFUSED_SERVER
+: <a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a">mqtt.h</a>
+</li>
+<li>MQTT_CONNECT_REFUSED_USERNAME_PASS
+: <a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da290cf9037054c42022cc864cfade896a">mqtt.h</a>
+</li>
+<li>MQTT_CONNECT_TIMEOUT
+: <a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62">mqtt.h</a>
+</li>
+<li>MQTT_CONNECT_TIMOUT
+: <a class="el" href="group__mqtt__opts.html#gac5d0580d1caf57dac1cb56662e5d9f7b">mqtt_opts.h</a>
+</li>
+<li>mqtt_connection_cb_t
+: <a class="el" href="group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f">mqtt.h</a>
+</li>
+<li>mqtt_connection_status_t
+: <a class="el" href="group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d">mqtt.h</a>
+</li>
+<li>MQTT_CTL_PACKET_TYPE
+: <a class="el" href="mqtt_8c.html#a45c57ebd31832f1c128d847067c4688b">mqtt.c</a>
+</li>
+<li>MQTT_CYCLIC_TIMER_INTERVAL
+: <a class="el" href="group__mqtt__opts.html#ga1d89fda808c7047eab7a67d3785aea8e">mqtt_opts.h</a>
+</li>
+<li>MQTT_DATA_FLAG_LAST
+: <a class="el" href="group__mqtt.html#gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f">mqtt.h</a>
+</li>
+<li>MQTT_DEBUG
+: <a class="el" href="mqtt_8c.html#a99c325e06cc17ee24e09dab251606f9d">mqtt.c</a>
+</li>
+<li>mqtt_disconnect()
+: <a class="el" href="group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6">mqtt.h</a>
+, <a class="el" href="group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6">mqtt.c</a>
+</li>
+<li>mqtt_incoming_data_cb_t
+: <a class="el" href="group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81">mqtt.h</a>
+</li>
+<li>mqtt_incoming_publish_cb_t
+: <a class="el" href="group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29">mqtt.h</a>
+</li>
+<li>mqtt_message_type
+: <a class="el" href="mqtt_8c.html#ac243cf15beb51b2206e36da86c2f95f1">mqtt.c</a>
+</li>
+<li>MQTT_OUTPUT_RINGBUF_SIZE
+: <a class="el" href="group__mqtt__opts.html#ga70627bafaffa071875cee9edc38d942b">mqtt_opts.h</a>
+</li>
+<li>MQTT_PORT
+: <a class="el" href="group__mqtt.html#gaa8632baff6bbb5004385998918f1e6bd">mqtt.h</a>
+</li>
+<li>mqtt_publish()
+: <a class="el" href="group__mqtt.html#gade9850d716e81fde572cb012be795d2f">mqtt.c</a>
+, <a class="el" href="group__mqtt.html#gade9850d716e81fde572cb012be795d2f">mqtt.h</a>
+</li>
+<li>MQTT_REQ_MAX_IN_FLIGHT
+: <a class="el" href="group__mqtt__opts.html#gae82460b35de2291e9661e440c3458e8f">mqtt_opts.h</a>
+</li>
+<li>MQTT_REQ_TIMEOUT
+: <a class="el" href="group__mqtt__opts.html#ga262639f2b45f6e064fb53156396d6d0a">mqtt_opts.h</a>
+</li>
+<li>mqtt_request_cb_t
+: <a class="el" href="group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd">mqtt.h</a>
+</li>
+<li>mqtt_ringbuf_free
+: <a class="el" href="mqtt_8c.html#afba101fbf26b556c869060d3d013c8fa">mqtt.c</a>
+</li>
+<li>mqtt_ringbuf_linear_read_length
+: <a class="el" href="mqtt_8c.html#ad82b4039213ab3f1d9e4bcd3aa0c88a3">mqtt.c</a>
+</li>
+<li>mqtt_set_inpub_callback()
+: <a class="el" href="group__mqtt.html#gafdfa0e65b217e92835d35858924565cf">mqtt.c</a>
+, <a class="el" href="group__mqtt.html#gafdfa0e65b217e92835d35858924565cf">mqtt.h</a>
+</li>
+<li>mqtt_sub_unsub()
+: <a class="el" href="group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103">mqtt.c</a>
+, <a class="el" href="group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103">mqtt.h</a>
+</li>
+<li>mqtt_subscribe
+: <a class="el" href="group__mqtt.html#ga83d6a6d811b201a74d793bc1b5d4e029">mqtt.h</a>
+</li>
+<li>MQTT_TLS_PORT
+: <a class="el" href="group__mqtt.html#ga6610174f17b9ecbcf2bc66a4fd5a6b0f">mqtt.h</a>
+</li>
+<li>mqtt_unsubscribe
+: <a class="el" href="group__mqtt.html#ga0f133ef09cbe56c46ebe2cc21afccf3f">mqtt.h</a>
+</li>
+<li>MQTT_VAR_HEADER_BUFFER_LEN
+: <a class="el" href="group__mqtt__opts.html#ga8275ef78a85fb14c3ac1423c70e45805">mqtt_opts.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_n.html b/doc/doxygen/output/html/globals_n.html
new file mode 100644
index 0000000..1918402
--- /dev/null
+++ b/doc/doxygen/output/html/globals_n.html
@@ -0,0 +1,771 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_n.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_n"></a>- n -</h3><ul>
+<li>nd6_adjust_mld_membership()
+: <a class="el" href="nd6_8c.html#a27224542b8ffab81c2ed9f47752bb51e">nd6.c</a>
+, <a class="el" href="nd6_8h.html#a27224542b8ffab81c2ed9f47752bb51e">nd6.h</a>
+</li>
+<li>nd6_cleanup_netif()
+: <a class="el" href="nd6_8h.html#a84f9f52cab7ae37b4dd343536156dc73">nd6.h</a>
+, <a class="el" href="nd6_8c.html#a84f9f52cab7ae37b4dd343536156dc73">nd6.c</a>
+</li>
+<li>nd6_clear_destination_cache()
+: <a class="el" href="nd6_8c.html#a64d7956cf2b0d45025b02661f3f62377">nd6.c</a>
+, <a class="el" href="nd6_8h.html#a64d7956cf2b0d45025b02661f3f62377">nd6.h</a>
+</li>
+<li>nd6_find_route()
+: <a class="el" href="nd6_8h.html#ac5ce11eaecfb486c322641427f47cffe">nd6.h</a>
+, <a class="el" href="nd6_8c.html#ac5ce11eaecfb486c322641427f47cffe">nd6.c</a>
+</li>
+<li>nd6_get_destination_mtu()
+: <a class="el" href="nd6_8c.html#af226438f4f9b4aa7c3a2bbdf3c1e948c">nd6.c</a>
+, <a class="el" href="nd6_8h.html#af226438f4f9b4aa7c3a2bbdf3c1e948c">nd6.h</a>
+</li>
+<li>nd6_get_next_hop_addr_or_queue()
+: <a class="el" href="nd6_8c.html#ae447c204ebbf71e6ebbc5ed727a73eb9">nd6.c</a>
+, <a class="el" href="nd6_8h.html#ae447c204ebbf71e6ebbc5ed727a73eb9">nd6.h</a>
+</li>
+<li>nd6_input()
+: <a class="el" href="nd6_8c.html#abbb92837e715be0e7d99513a84995831">nd6.c</a>
+, <a class="el" href="nd6_8h.html#abbb92837e715be0e7d99513a84995831">nd6.h</a>
+</li>
+<li>ND6_OPTION_TYPE_MTU
+: <a class="el" href="prot_2nd6_8h.html#aab6c15c9bea51fbdcc660f718bb403a8">nd6.h</a>
+</li>
+<li>ND6_OPTION_TYPE_PREFIX_INFO
+: <a class="el" href="prot_2nd6_8h.html#a0225d4c8911efdbdbc2b40de208906c2">nd6.h</a>
+</li>
+<li>ND6_OPTION_TYPE_RDNSS
+: <a class="el" href="prot_2nd6_8h.html#a3188b9704a8ca598f54b87c3db73272e">nd6.h</a>
+</li>
+<li>ND6_OPTION_TYPE_REDIR_HDR
+: <a class="el" href="prot_2nd6_8h.html#aeaa575c1a66ccaa2dc62ff2c0bd71619">nd6.h</a>
+</li>
+<li>ND6_OPTION_TYPE_ROUTE_INFO
+: <a class="el" href="prot_2nd6_8h.html#aff2e03766ee1fa15263c4aeda5097d28">nd6.h</a>
+</li>
+<li>ND6_OPTION_TYPE_SOURCE_LLADDR
+: <a class="el" href="prot_2nd6_8h.html#a68ce8550a20cd30093d6e79e1ca51842">nd6.h</a>
+</li>
+<li>ND6_RA_FLAG_MANAGED_ADDR_CONFIG
+: <a class="el" href="prot_2nd6_8h.html#a7fb1b330719d83b7525374f4beca51bc">nd6.h</a>
+</li>
+<li>nd6_reachability_hint()
+: <a class="el" href="nd6_8c.html#a4959990cae26a3996f638ec996f046df">nd6.c</a>
+, <a class="el" href="nd6_8h.html#a4959990cae26a3996f638ec996f046df">nd6.h</a>
+</li>
+<li>nd6_restart_netif()
+: <a class="el" href="nd6_8c.html#a73d3192204da20be193e3c00c4a0cb54">nd6.c</a>
+, <a class="el" href="nd6_8h.html#a73d3192204da20be193e3c00c4a0cb54">nd6.h</a>
+</li>
+<li>ND6_RTR_SOLICITATION_INTERVAL
+: <a class="el" href="nd6_8h.html#a2fec65c0785551bad3a282ddee4062ac">nd6.h</a>
+</li>
+<li>ND6_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga753161114df60299a28d51c092c756cf">opt.h</a>
+</li>
+<li>nd6_tmr()
+: <a class="el" href="nd6_8c.html#a754781b509e69c35a7a4ee7e380399fe">nd6.c</a>
+, <a class="el" href="nd6_8h.html#a754781b509e69c35a7a4ee7e380399fe">nd6.h</a>
+</li>
+<li>ND6_TMR_INTERVAL
+: <a class="el" href="nd6_8h.html#a3250c1e32713635d588cf25865ebed56">nd6.h</a>
+</li>
+<li>NETB_HFLAG_RESPONSE
+: <a class="el" href="netbiosns_8c.html#af09685abf1739c802bc8772b35b7fb1c">netbiosns.c</a>
+</li>
+<li>NETB_NFLAG_UNIQUE
+: <a class="el" href="netbiosns_8c.html#ae00d45caef5a670e3aedde2788b3f212">netbiosns.c</a>
+</li>
+<li>NETBIOS_LWIP_NAME
+: <a class="el" href="group__netbiosns__opts.html#ga468c2ae67a79ce082ee585a438f7373b">netbiosns_opts.h</a>
+</li>
+<li>NETBIOS_NAME_LEN
+: <a class="el" href="netbiosns_8c.html#a4b83658c5bbb9ac90aca4351086a9a00">netbiosns.c</a>
+</li>
+<li>NETBIOS_NAME_TTL
+: <a class="el" href="netbiosns_8c.html#a35d43ea3290f6412e45598b610f03cf1">netbiosns.c</a>
+</li>
+<li>netbiosns_init()
+: <a class="el" href="group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b">netbiosns.c</a>
+, <a class="el" href="group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b">netbiosns.h</a>
+</li>
+<li>netbiosns_stop()
+: <a class="el" href="group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806">netbiosns.c</a>
+, <a class="el" href="group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806">netbiosns.h</a>
+</li>
+<li>netbuf_alloc()
+: <a class="el" href="group__netbuf.html#ga0b831b80d3aa64938abdbfb6d89eaac0">netbuf.c</a>
+, <a class="el" href="group__netbuf.html#ga0b831b80d3aa64938abdbfb6d89eaac0">netbuf.h</a>
+</li>
+<li>netbuf_chain()
+: <a class="el" href="group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602">netbuf.c</a>
+, <a class="el" href="group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602">netbuf.h</a>
+</li>
+<li>netbuf_data()
+: <a class="el" href="group__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01">netbuf.c</a>
+, <a class="el" href="group__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01">netbuf.h</a>
+</li>
+<li>netbuf_delete()
+: <a class="el" href="group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d">netbuf.c</a>
+, <a class="el" href="group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d">netbuf.h</a>
+</li>
+<li>netbuf_first()
+: <a class="el" href="group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51">netbuf.c</a>
+, <a class="el" href="group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51">netbuf.h</a>
+</li>
+<li>NETBUF_FLAG_CHKSUM
+: <a class="el" href="netbuf_8h.html#ab75db64a9e84eb67a382c30e382d417c">netbuf.h</a>
+</li>
+<li>NETBUF_FLAG_DESTADDR
+: <a class="el" href="netbuf_8h.html#ab38abb4213df4c00b9b3ab844322a090">netbuf.h</a>
+</li>
+<li>netbuf_free()
+: <a class="el" href="group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b">netbuf.c</a>
+, <a class="el" href="group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b">netbuf.h</a>
+</li>
+<li>netbuf_new()
+: <a class="el" href="group__netbuf.html#gaaba704cd963e35e71145de9f5112991d">netbuf.c</a>
+, <a class="el" href="group__netbuf.html#gaaba704cd963e35e71145de9f5112991d">netbuf.h</a>
+</li>
+<li>netbuf_next()
+: <a class="el" href="group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715">netbuf.c</a>
+, <a class="el" href="group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715">netbuf.h</a>
+</li>
+<li>netbuf_ref()
+: <a class="el" href="group__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2">netbuf.c</a>
+, <a class="el" href="group__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2">netbuf.h</a>
+</li>
+<li>netconn_accept()
+: <a class="el" href="group__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69">api_lib.c</a>
+, <a class="el" href="group__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69">api.h</a>
+</li>
+<li>netconn_addr
+: <a class="el" href="group__netconn__common.html#ga37ec33522cfc26fa57251c33e4cebb3e">api.h</a>
+</li>
+<li>netconn_alloc()
+: <a class="el" href="api__msg_8h.html#a919865fa64270a3e4cb719ddff2fead9">api_msg.h</a>
+, <a class="el" href="api__msg_8c.html#a919865fa64270a3e4cb719ddff2fead9">api_msg.c</a>
+</li>
+<li>netconn_bind()
+: <a class="el" href="group__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230">api_lib.c</a>
+, <a class="el" href="group__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230">api.h</a>
+</li>
+<li>netconn_bind_if()
+: <a class="el" href="group__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5">api_lib.c</a>
+, <a class="el" href="group__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5">api.h</a>
+</li>
+<li>netconn_callback
+: <a class="el" href="api_8h.html#a3e130339f00202b3ab714af502163a2d">api.h</a>
+</li>
+<li>netconn_close()
+: <a class="el" href="group__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624">api_lib.c</a>
+, <a class="el" href="group__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624">api.h</a>
+</li>
+<li>netconn_connect()
+: <a class="el" href="group__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77">api_lib.c</a>
+, <a class="el" href="group__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77">api.h</a>
+</li>
+<li>netconn_delete()
+: <a class="el" href="group__netconn__common.html#gab411221f912a6d9e4c82ac3963989403">api_lib.c</a>
+, <a class="el" href="group__netconn__common.html#gab411221f912a6d9e4c82ac3963989403">api.h</a>
+</li>
+<li>netconn_disconnect()
+: <a class="el" href="group__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402">api_lib.c</a>
+, <a class="el" href="group__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402">api.h</a>
+</li>
+<li>netconn_err()
+: <a class="el" href="group__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4">api_lib.c</a>
+, <a class="el" href="group__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4">api.h</a>
+</li>
+<li>netconn_evt
+: <a class="el" href="api_8h.html#af722260882d14c49afb765293ffb0155">api.h</a>
+</li>
+<li>NETCONN_FIN_RX_PENDING
+: <a class="el" href="api_8h.html#a24d62a2a03ba421fcf2bdce1ea89b949">api.h</a>
+</li>
+<li>NETCONN_FLAG_CHECK_WRITESPACE
+: <a class="el" href="api_8h.html#a9d791955a4256a0589a3844e4e6f0f9c">api.h</a>
+</li>
+<li>NETCONN_FLAG_IN_NONBLOCKING_CONNECT
+: <a class="el" href="api_8h.html#a70bb861ee643b60ee402fd48f581f58d">api.h</a>
+</li>
+<li>NETCONN_FLAG_IPV6_V6ONLY
+: <a class="el" href="api_8h.html#a60892e4eb139f10157847fea4266bf5b">api.h</a>
+</li>
+<li>NETCONN_FLAG_MBOXCLOSED
+: <a class="el" href="api_8h.html#af77be7590d3712259e78103c1dddf63f">api.h</a>
+</li>
+<li>NETCONN_FLAG_NON_BLOCKING
+: <a class="el" href="api_8h.html#abee57aa0ba63e35742d411bc5224900a">api.h</a>
+</li>
+<li>netconn_free()
+: <a class="el" href="api__msg_8c.html#a875b82ad129bdec1c6f2c21cbeedc48b">api_msg.c</a>
+, <a class="el" href="api__msg_8h.html#a875b82ad129bdec1c6f2c21cbeedc48b">api_msg.h</a>
+</li>
+<li>netconn_get_ipv6only
+: <a class="el" href="group__netconn__common.html#gaf001c7d5fbf97c04eb1d9ac7d14c9c31">api.h</a>
+</li>
+<li>netconn_get_recvbufsize
+: <a class="el" href="api_8h.html#ac0298c287dc3823047c378c014ff1eb0">api.h</a>
+</li>
+<li>netconn_get_sendtimeout
+: <a class="el" href="api_8h.html#a7d6e84458eec796b0b0ce1bb247f323f">api.h</a>
+</li>
+<li>netconn_getaddr()
+: <a class="el" href="api__lib_8c.html#a28430d1d86733f1bf98dc31305c42104">api_lib.c</a>
+, <a class="el" href="api_8h.html#a28430d1d86733f1bf98dc31305c42104">api.h</a>
+</li>
+<li>netconn_gethostbyname_addrtype()
+: <a class="el" href="group__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5">api_lib.c</a>
+, <a class="el" href="group__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5">api.h</a>
+</li>
+<li>netconn_igmp
+: <a class="el" href="api_8h.html#a5c6ded2c082de1536019b197a0a912db">api.h</a>
+</li>
+<li>netconn_is_nonblocking
+: <a class="el" href="api_8h.html#a5789f0030b895b40625a74deb5a1092f">api.h</a>
+</li>
+<li>netconn_join_leave_group()
+: <a class="el" href="group__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed">api_lib.c</a>
+, <a class="el" href="group__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed">api.h</a>
+</li>
+<li>netconn_join_leave_group_netif()
+: <a class="el" href="group__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b">api_lib.c</a>
+, <a class="el" href="group__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b">api.h</a>
+</li>
+<li>netconn_listen
+: <a class="el" href="group__netconn__tcp.html#ga43e3f4c2169dec0f666c502e490416b7">api.h</a>
+</li>
+<li>netconn_listen_with_backlog()
+: <a class="el" href="group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d">api_lib.c</a>
+, <a class="el" href="group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d">api.h</a>
+</li>
+<li>netconn_new
+: <a class="el" href="group__netconn__common.html#gab2bd1d5e633e14e428cfc0ca908d5e0c">api.h</a>
+</li>
+<li>netconn_new_with_proto_and_callback()
+: <a class="el" href="api__lib_8c.html#ad0a0434e5ff08bb350740cb840e2aca8">api_lib.c</a>
+, <a class="el" href="api_8h.html#ad0a0434e5ff08bb350740cb840e2aca8">api.h</a>
+</li>
+<li>netconn_peer
+: <a class="el" href="group__netconn__common.html#ga1065e769f2276270722a7700182077bc">api.h</a>
+</li>
+<li>netconn_prepare_delete()
+: <a class="el" href="group__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0">api_lib.c</a>
+, <a class="el" href="group__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0">api.h</a>
+</li>
+<li>NETCONN_RAW
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a0d828a7e9c1614d4cae56602b09f39e9">api.h</a>
+</li>
+<li>netconn_recv()
+: <a class="el" href="group__netconn__common.html#ga50490bab058f4e740798beffcf48cabf">api_lib.c</a>
+, <a class="el" href="group__netconn__common.html#ga50490bab058f4e740798beffcf48cabf">api.h</a>
+</li>
+<li>netconn_recv_tcp_pbuf()
+: <a class="el" href="group__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490">api_lib.c</a>
+, <a class="el" href="group__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490">api.h</a>
+</li>
+<li>netconn_recv_tcp_pbuf_flags()
+: <a class="el" href="group__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294">api_lib.c</a>
+, <a class="el" href="group__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294">api.h</a>
+</li>
+<li>netconn_recv_udp_raw_netbuf()
+: <a class="el" href="api__lib_8c.html#a805a90b546c5a149f04782351633979b">api_lib.c</a>
+, <a class="el" href="api_8h.html#a805a90b546c5a149f04782351633979b">api.h</a>
+</li>
+<li>netconn_recv_udp_raw_netbuf_flags()
+: <a class="el" href="api__lib_8c.html#a505c3b8e400babf9681e09c945b7f421">api_lib.c</a>
+, <a class="el" href="api_8h.html#a505c3b8e400babf9681e09c945b7f421">api.h</a>
+</li>
+<li>netconn_send()
+: <a class="el" href="group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238">api_lib.c</a>
+, <a class="el" href="group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238">api.h</a>
+</li>
+<li>netconn_sendto()
+: <a class="el" href="group__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c">api_lib.c</a>
+, <a class="el" href="group__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c">api.h</a>
+</li>
+<li>netconn_set_ipv6only
+: <a class="el" href="group__netconn__common.html#gae56911e2d92bebf43d73e116530e41f1">api.h</a>
+</li>
+<li>netconn_set_nonblocking
+: <a class="el" href="api_8h.html#a6a578dd5b55e4457e0d23574ec9c55bb">api.h</a>
+</li>
+<li>netconn_set_recvbufsize
+: <a class="el" href="api_8h.html#a04785274634a5b504c760731c2e70725">api.h</a>
+</li>
+<li>netconn_set_sendtimeout
+: <a class="el" href="api_8h.html#a3ce3ad9f660e99b11fec20cafaf8f016">api.h</a>
+</li>
+<li>netconn_shutdown()
+: <a class="el" href="group__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63">api_lib.c</a>
+, <a class="el" href="group__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63">api.h</a>
+</li>
+<li>netconn_state
+: <a class="el" href="api_8h.html#a2c6c9c1869f443c5ec7b31180a44fada">api.h</a>
+</li>
+<li>NETCONN_TCP
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a75d14318b91af7a452230189f47e5e1a">api.h</a>
+</li>
+<li>NETCONN_TCP_IPV6
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91ae7efa7c4e50b7b381531a2136cd5a013">api.h</a>
+</li>
+<li>netconn_type
+: <a class="el" href="api_8h.html#a62cd17ad03bb2817cb0c419e1c9790b1">api.h</a>
+</li>
+<li>NETCONN_UDP
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a6b8ec191d69f7e639f4ab40779069636">api.h</a>
+</li>
+<li>NETCONN_UDP_IPV6
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a34ee1c89f6705462590a4fe2c9772d9e">api.h</a>
+</li>
+<li>NETCONN_UDPLITE
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a655e1625cc7e6a93f1e3d2646f56a1e4">api.h</a>
+</li>
+<li>NETCONN_UDPLITE_IPV6
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91aa9cabc9d90606b5c5939fcc02ac588c7">api.h</a>
+</li>
+<li>NETCONN_UDPNOCHKSUM
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a7e0c3f566b3d4321b36b711b6b1ad6de">api.h</a>
+</li>
+<li>NETCONN_UDPNOCHKSUM_IPV6
+: <a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a2c7f548d26f6c411f084b6c59247b60e">api.h</a>
+</li>
+<li>netconn_write
+: <a class="el" href="group__netconn__tcp.html#gafea5e9b90770a7c6cd0762ceb65e5b46">api.h</a>
+</li>
+<li>netconn_write_partly()
+: <a class="el" href="group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf">api_lib.c</a>
+, <a class="el" href="group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf">api.h</a>
+</li>
+<li>netconn_write_vectors_partly()
+: <a class="el" href="api__lib_8c.html#a992b4fe8a855fd94861738f7260d0a32">api_lib.c</a>
+, <a class="el" href="api_8h.html#a992b4fe8a855fd94861738f7260d0a32">api.h</a>
+</li>
+<li>netif_add()
+: <a class="el" href="group__netif.html#gade5498543e74067f28cc6bef0209e3be">netif.c</a>
+, <a class="el" href="group__netif.html#gade5498543e74067f28cc6bef0209e3be">netif.h</a>
+</li>
+<li>netif_add_ext_callback()
+: <a class="el" href="group__netif.html#ga3efc2b72f75936d50708247420c9d1d9">netif.h</a>
+, <a class="el" href="group__netif.html#ga3efc2b72f75936d50708247420c9d1d9">netif.c</a>
+</li>
+<li>netif_add_ip6_address()
+: <a class="el" href="group__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327">netif.c</a>
+, <a class="el" href="group__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327">netif.h</a>
+</li>
+<li>NETIF_ADD_MAC_FILTER
+: <a class="el" href="netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a4186fbaf94be956ea1a3b02cd1cccb1f">netif.h</a>
+</li>
+<li>netif_add_noaddr()
+: <a class="el" href="group__netif.html#gac20150ac754ff1f88afeaa33be3552a4">netif.c</a>
+, <a class="el" href="group__netif.html#gac20150ac754ff1f88afeaa33be3552a4">netif.h</a>
+</li>
+<li>netif_alloc_client_data_id()
+: <a class="el" href="group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978">netif.c</a>
+, <a class="el" href="group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978">netif.h</a>
+</li>
+<li>netif_create_ip6_linklocal_address()
+: <a class="el" href="group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9">netif.h</a>
+, <a class="el" href="group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9">netif.c</a>
+</li>
+<li>NETIF_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga2dfad02b075a7f9a8791a66fe40864a4">opt.h</a>
+</li>
+<li>netif_default
+: <a class="el" href="netif_8c.html#a3d0925cbce550ed461907aee816713ba">netif.c</a>
+, <a class="el" href="netif_8h.html#a3d0925cbce550ed461907aee816713ba">netif.h</a>
+</li>
+<li>NETIF_DEL_MAC_FILTER
+: <a class="el" href="netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a7ad3406353906deb4e64ebeed349e07e">netif.h</a>
+</li>
+<li>netif_ext_callback_fn
+: <a class="el" href="group__netif.html#ga5ee213cea065424c89c66f138c008da1">netif.h</a>
+</li>
+<li>netif_find()
+: <a class="el" href="group__netif.html#ga69c93a139e8a1f6ef4e3d076a2897def">netif.c</a>
+, <a class="el" href="group__netif.html#ga69c93a139e8a1f6ef4e3d076a2897def">netif.h</a>
+</li>
+<li>NETIF_FLAG_BROADCAST
+: <a class="el" href="group__netif__flags.html#gaef64fe15c82bc7b235366923e517104e">netif.h</a>
+</li>
+<li>NETIF_FLAG_ETHARP
+: <a class="el" href="group__netif__flags.html#ga92448dc510bc8d700c09e5c971ef0676">netif.h</a>
+</li>
+<li>NETIF_FLAG_ETHERNET
+: <a class="el" href="group__netif__flags.html#ga76ad9d0cf9f029df0ab2a998c64040dc">netif.h</a>
+</li>
+<li>NETIF_FLAG_IGMP
+: <a class="el" href="group__netif__flags.html#gac9493b923d733c73f6006d9714826558">netif.h</a>
+</li>
+<li>NETIF_FLAG_LINK_UP
+: <a class="el" href="group__netif__flags.html#ga75f5a2b9276c93e3bd18a568459fd2d8">netif.h</a>
+</li>
+<li>NETIF_FLAG_MLD6
+: <a class="el" href="group__netif__flags.html#gab14fbe1447d2fdbdf5abc87f51eb6508">netif.h</a>
+</li>
+<li>NETIF_FLAG_UP
+: <a class="el" href="group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e">netif.h</a>
+</li>
+<li>netif_get_by_index()
+: <a class="el" href="group__netif.html#gae4df885347c800a5486d3bf25981300e">netif.h</a>
+, <a class="el" href="group__netif.html#gae4df885347c800a5486d3bf25981300e">netif.c</a>
+</li>
+<li>netif_get_client_data
+: <a class="el" href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif.h</a>
+</li>
+<li>netif_get_hostname
+: <a class="el" href="group__netif.html#ga5a378ba73e60cd1e5235474f0db22978">netif.h</a>
+</li>
+<li>netif_get_ip6_addr_match()
+: <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_igmp_data
+: <a class="el" href="group__igmp.html#gad990dfc5ed8b644c16cc578c876e588d">igmp.h</a>
+</li>
+<li>netif_igmp_mac_filter_fn
+: <a class="el" href="netif_8h.html#a71cad3277efe29191eef3348f4bf21f7">netif.h</a>
+</li>
+<li>netif_index_to_name()
+: <a class="el" href="group__netif.html#ga3ff104d083914e87a7805a0b90a85755">netif.h</a>
+, <a class="el" href="group__netif.html#ga3ff104d083914e87a7805a0b90a85755">netif.c</a>
+</li>
+<li>netif_init_fn
+: <a class="el" href="netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5">netif.h</a>
+</li>
+<li>netif_input()
+: <a class="el" href="group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385">netif.c</a>
+, <a class="el" href="group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385">netif.h</a>
+</li>
+<li>netif_input_fn
+: <a class="el" href="netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e">netif.h</a>
+</li>
+<li>netif_invoke_ext_callback()
+: <a class="el" href="netif_8c.html#a75b5298b1c3c3794747d78a4ce95d81c">netif.c</a>
+, <a class="el" href="netif_8h.html#a75b5298b1c3c3794747d78a4ce95d81c">netif.h</a>
+</li>
+<li>netif_ip4_addr
+: <a class="el" href="group__netif__ip4.html#gac9b6e63b5dd2968fe0a4813f3eefb55d">netif.h</a>
+</li>
+<li>netif_ip4_gw
+: <a class="el" href="group__netif__ip4.html#ga86d69faf416765b7f8faf60a43cc50da">netif.h</a>
+</li>
+<li>netif_ip4_netmask
+: <a class="el" href="group__netif__ip4.html#ga952d1436f2428b92fc8197bcf2f8fca3">netif.h</a>
+</li>
+<li>netif_ip6_addr
+: <a class="el" href="group__netif__ip6.html#ga7ec0623f1a858a0cdb187beaa89df365">netif.h</a>
+</li>
+<li>netif_ip6_addr_set()
+: <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()
+: <a class="el" href="group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f">netif.h</a>
+, <a class="el" href="group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f">netif.c</a>
+</li>
+<li>netif_ip_addr4
+: <a class="el" href="group__netif__ip4.html#ga54179a2f3b7cc35b23ee8d692d8d8022">netif.h</a>
+</li>
+<li>netif_ip_addr6
+: <a class="el" href="group__netif__ip6.html#gae424e336fe9f013b30d4065fd35c91ee">netif.h</a>
+</li>
+<li>netif_ip_gw4
+: <a class="el" href="group__netif__ip4.html#ga7ea95478e000701423b7f6316e575a2a">netif.h</a>
+</li>
+<li>netif_ip_netmask4
+: <a class="el" href="group__netif__ip4.html#ga58518602f388d2640985a01a312f0a51">netif.h</a>
+</li>
+<li>netif_is_link_up
+: <a class="el" href="netif_8h.html#a780be4c3fa9f7f2534f7865666c3a1b8">netif.h</a>
+</li>
+<li>netif_is_up
+: <a class="el" href="group__netif.html#ga94a4c24c988afc0a577387730f303b19">netif.h</a>
+</li>
+<li>netif_linkoutput_fn
+: <a class="el" href="netif_8h.html#ab75e9d808bc1b788bea84213e6a111ed">netif.h</a>
+</li>
+<li>netif_list
+: <a class="el" href="netif_8h.html#a1c8141eaa98f6dc6dfddbb23a706656c">netif.h</a>
+, <a class="el" href="netif_8c.html#a1c8141eaa98f6dc6dfddbb23a706656c">netif.c</a>
+</li>
+<li>netif_loop_output()
+: <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
+: <a class="el" href="netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0">netif.h</a>
+</li>
+<li>NETIF_MAX_HWADDR_LEN
+: <a class="el" href="netif_8h.html#ab887a8ec553de1be1d04cf2961c63c41">netif.h</a>
+</li>
+<li>netif_mld6_data
+: <a class="el" href="group__mld6.html#ga02a2259082f22c5989a3c929be95e641">mld6.h</a>
+</li>
+<li>netif_mld_mac_filter_fn
+: <a class="el" href="netif_8h.html#af2ed0716122b65e7feb43e0dd99ae468">netif.h</a>
+</li>
+<li>netif_name_to_index()
+: <a class="el" href="group__netif.html#gac763a1f647fb9e8af4254418e813a6ae">netif.h</a>
+, <a class="el" href="group__netif.html#gac763a1f647fb9e8af4254418e813a6ae">netif.c</a>
+</li>
+<li>NETIF_NAMESIZE
+: <a class="el" href="netif_8h.html#a302f24fbfe883ee4840ffc71f267ae2a">netif.h</a>
+</li>
+<li>netif_nsc_reason_t
+: <a class="el" href="group__netif.html#gab2b9387389513a02027c62e246723808">netif.h</a>
+</li>
+<li>netif_output_fn
+: <a class="el" href="netif_8h.html#a7b4893aa2ed8c606a0cd7aa932fe5067">netif.h</a>
+</li>
+<li>netif_output_ip6_fn
+: <a class="el" href="netif_8h.html#a343a5b14136a51957d552527384674b3">netif.h</a>
+</li>
+<li>netif_poll()
+: <a class="el" href="netif_8h.html#a0fbaed78253d21e1b54e65651da3e327">netif.h</a>
+, <a class="el" href="netif_8c.html#a0fbaed78253d21e1b54e65651da3e327">netif.c</a>
+</li>
+<li>netif_remove()
+: <a class="el" href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979">netif.c</a>
+, <a class="el" href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979">netif.h</a>
+</li>
+<li>netif_remove_ext_callback()
+: <a class="el" href="group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716">netif.c</a>
+, <a class="el" href="group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716">netif.h</a>
+</li>
+<li>netif_set_addr()
+: <a class="el" href="group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1">netif.c</a>
+, <a class="el" href="group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1">netif.h</a>
+</li>
+<li>netif_set_client_data
+: <a class="el" href="group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f">netif.h</a>
+</li>
+<li>netif_set_default()
+: <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()
+: <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()
+: <a class="el" href="group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520">netif.h</a>
+, <a class="el" href="group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520">netif.c</a>
+</li>
+<li>netif_set_hostname
+: <a class="el" href="group__netif.html#ga5e5d2c6fa5566a24dd848f3a2c7c957f">netif.h</a>
+</li>
+<li>netif_set_igmp_mac_filter
+: <a class="el" href="group__netif.html#ga3428b3f8195249c6cd8704a4db46b401">netif.h</a>
+</li>
+<li>netif_set_ipaddr()
+: <a class="el" href="group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca">netif.h</a>
+, <a class="el" href="group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca">netif.c</a>
+</li>
+<li>netif_set_link_callback()
+: <a class="el" href="group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4">netif.h</a>
+, <a class="el" href="group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4">netif.c</a>
+</li>
+<li>netif_set_link_down()
+: <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()
+: <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
+: <a class="el" href="group__netif.html#ga97f30bb5542e4c07d3b32e3c754e104c">netif.h</a>
+</li>
+<li>netif_set_netmask()
+: <a class="el" href="group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53">netif.h</a>
+, <a class="el" href="group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53">netif.c</a>
+</li>
+<li>netif_set_remove_callback()
+: <a class="el" href="group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce">netif.h</a>
+, <a class="el" href="group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce">netif.c</a>
+</li>
+<li>netif_set_status_callback()
+: <a class="el" href="group__netif.html#gadc8787b23ac0ee023979cbadf87813d4">netif.h</a>
+, <a class="el" href="group__netif.html#gadc8787b23ac0ee023979cbadf87813d4">netif.c</a>
+</li>
+<li>netif_set_up()
+: <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
+: <a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif.h</a>
+</li>
+<li>netif_to_num()
+: <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()
+: <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()
+: <a class="el" href="netifapi_8h.html#a037c3d05c19b4d467b6ce06eb4639ee8">netifapi.h</a>
+, <a class="el" href="netifapi_8c.html#a037c3d05c19b4d467b6ce06eb4639ee8">netifapi.c</a>
+</li>
+<li>netifapi_autoip_start
+: <a class="el" href="group__netifapi__autoip.html#gaca26bae2a21e0732a7599df14f880af2">netifapi.h</a>
+</li>
+<li>netifapi_autoip_stop
+: <a class="el" href="group__netifapi__autoip.html#gae604f96907a52557e4ebd1bd5d80071d">netifapi.h</a>
+</li>
+<li>netifapi_dhcp_inform
+: <a class="el" href="group__netifapi__dhcp4.html#ga29108975e9aa6463b9a574de961317e0">netifapi.h</a>
+</li>
+<li>netifapi_dhcp_release
+: <a class="el" href="group__netifapi__dhcp4.html#ga5aeaee24c11128df90a56fe091c9d409">netifapi.h</a>
+</li>
+<li>netifapi_dhcp_release_and_stop
+: <a class="el" href="group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134">netifapi.h</a>
+</li>
+<li>netifapi_dhcp_renew
+: <a class="el" href="group__netifapi__dhcp4.html#ga642390e5efa53ad3095e01331c6a936b">netifapi.h</a>
+</li>
+<li>netifapi_dhcp_start
+: <a class="el" href="group__netifapi__dhcp4.html#gae64d13afc6e3b0f21aae04b66d0e3765">netifapi.h</a>
+</li>
+<li>netifapi_dhcp_stop
+: <a class="el" href="group__netifapi__dhcp4.html#ga2322c0d0e3eb6c1097d6f3942905dbd5">netifapi.h</a>
+</li>
+<li>netifapi_netif_add()
+: <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()
+: <a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi.h</a>
+, <a class="el" href="netifapi_8c.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi.c</a>
+</li>
+<li>netifapi_netif_index_to_name()
+: <a class="el" href="group__netifapi__netif.html#gab7914d77d0a89fd6c31048feb0bdafb6">netifapi.c</a>
+</li>
+<li>netifapi_netif_name_to_index()
+: <a class="el" href="group__netifapi__netif.html#gad4a821182d01eafa4ca258f958fcb089">netifapi.c</a>
+</li>
+<li>netifapi_netif_remove
+: <a class="el" href="group__netifapi__netif.html#ga0e3f522b900a0ba04421c4587e790373">netifapi.h</a>
+</li>
+<li>netifapi_netif_set_addr()
+: <a class="el" href="group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973">netifapi.h</a>
+, <a class="el" href="group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973">netifapi.c</a>
+</li>
+<li>netifapi_netif_set_default
+: <a class="el" href="group__netifapi__netif.html#ga862d6cfa5d36b2c36d7b1671e8d95ccf">netifapi.h</a>
+</li>
+<li>netifapi_netif_set_down
+: <a class="el" href="group__netifapi__netif.html#ga22c02edde32743ccfd41924da0601a16">netifapi.h</a>
+</li>
+<li>netifapi_netif_set_link_down
+: <a class="el" href="group__netifapi__netif.html#ga2a9694804743f5466c4ecc400b7f07e4">netifapi.h</a>
+</li>
+<li>netifapi_netif_set_link_up
+: <a class="el" href="group__netifapi__netif.html#gac054a60a32447019913d34da63924853">netifapi.h</a>
+</li>
+<li>netifapi_netif_set_up
+: <a class="el" href="group__netifapi__netif.html#ga6ce735fe79efe1739e53b7f0e975ac76">netifapi.h</a>
+</li>
+<li>NO_SYS
+: <a class="el" href="group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b">opt.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_p.html b/doc/doxygen/output/html/globals_p.html
new file mode 100644
index 0000000..e29e0fc
--- /dev/null
+++ b/doc/doxygen/output/html/globals_p.html
@@ -0,0 +1,345 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_p.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_p"></a>- p -</h3><ul>
+<li>PACK_STRUCT_BEGIN
+: <a class="el" href="group__compiler__abstraction.html#ga73199061891adf1b912d20835c7d5e96">arch.h</a>
+</li>
+<li>PACK_STRUCT_END
+: <a class="el" href="group__compiler__abstraction.html#ga465fef70f294e21cbf4ea51fc342f20e">arch.h</a>
+</li>
+<li>PACK_STRUCT_FIELD
+: <a class="el" href="group__compiler__abstraction.html#gaab0b988124e37a978d9a88e7c1c778e0">arch.h</a>
+</li>
+<li>PACK_STRUCT_FLD_8
+: <a class="el" href="group__compiler__abstraction.html#gaa8f75e4117374c2d09fbda5566e40b62">arch.h</a>
+</li>
+<li>PACK_STRUCT_FLD_S
+: <a class="el" href="group__compiler__abstraction.html#gacc89e224363eb0ebca24b64d925c3cb7">arch.h</a>
+</li>
+<li>PACK_STRUCT_STRUCT
+: <a class="el" href="group__compiler__abstraction.html#ga33623da05bb55497534c3dc26ebebeb2">arch.h</a>
+</li>
+<li>PACK_STRUCT_USE_INCLUDES
+: <a class="el" href="group__compiler__abstraction.html#ga57b90d36d8bea3798a5d1815945fd8ef">arch.h</a>
+</li>
+<li>pbuf_add_header()
+: <a class="el" href="pbuf_8c.html#a32dc14bd88dcafa25e627ab18e801815">pbuf.c</a>
+, <a class="el" href="pbuf_8h.html#a32dc14bd88dcafa25e627ab18e801815">pbuf.h</a>
+</li>
+<li>pbuf_add_header_force()
+: <a class="el" href="pbuf_8c.html#ad4ef8c5fbbd1447db04f8f73923e7dee">pbuf.c</a>
+, <a class="el" href="pbuf_8h.html#ad4ef8c5fbbd1447db04f8f73923e7dee">pbuf.h</a>
+</li>
+<li>pbuf_alloc()
+: <a class="el" href="group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47">pbuf.h</a>
+</li>
+<li>PBUF_ALLOC_FLAG_DATA_CONTIGUOUS
+: <a class="el" href="pbuf_8h.html#a426883d928f8f3e8fd066e616159d78f">pbuf.h</a>
+</li>
+<li>PBUF_ALLOC_FLAG_RX
+: <a class="el" href="pbuf_8h.html#a567a0dfa01b0e5540f9416a200ed163f">pbuf.h</a>
+</li>
+<li>pbuf_alloc_reference()
+: <a class="el" href="group__pbuf.html#ga4caa46c6d560d9d0da2be845bc9c2fab">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#ga4caa46c6d560d9d0da2be845bc9c2fab">pbuf.h</a>
+</li>
+<li>pbuf_alloced_custom()
+: <a class="el" href="group__pbuf.html#ga90fa2bbf6ea4a263ee8f7b77c75683c2">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#ga90fa2bbf6ea4a263ee8f7b77c75683c2">pbuf.h</a>
+</li>
+<li>pbuf_cat()
+: <a class="el" href="group__pbuf.html#ga82429084fe29015509c9b4a072707cd4">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#ga82429084fe29015509c9b4a072707cd4">pbuf.h</a>
+</li>
+<li>pbuf_chain()
+: <a class="el" href="group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891">pbuf.h</a>
+</li>
+<li>pbuf_clen()
+: <a class="el" href="pbuf_8c.html#a5df7ac5ae59012fe9aeddba375a72190">pbuf.c</a>
+, <a class="el" href="pbuf_8h.html#a5df7ac5ae59012fe9aeddba375a72190">pbuf.h</a>
+</li>
+<li>pbuf_clone()
+: <a class="el" href="group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0">pbuf.h</a>
+</li>
+<li>pbuf_coalesce()
+: <a class="el" href="group__pbuf.html#ga54ac7b116c6f53c704cbf74f35a8b35c">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#ga54ac7b116c6f53c704cbf74f35a8b35c">pbuf.h</a>
+</li>
+<li>pbuf_copy()
+: <a class="el" href="group__pbuf.html#gaba88511dee3df4b631fde691f421320d">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#gaba88511dee3df4b631fde691f421320d">pbuf.h</a>
+</li>
+<li>pbuf_copy_partial()
+: <a class="el" href="group__pbuf.html#gac2f1f58fd36042e82af46f5015720899">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#gac2f1f58fd36042e82af46f5015720899">pbuf.h</a>
+</li>
+<li>PBUF_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga5c3d44a0ec3bb8bd66f776c70d5c6a6c">opt.h</a>
+</li>
+<li>pbuf_dechain()
+: <a class="el" href="pbuf_8c.html#abf3d29c4f43986b4cb5eb314d5b9729d">pbuf.c</a>
+, <a class="el" href="pbuf_8h.html#abf3d29c4f43986b4cb5eb314d5b9729d">pbuf.h</a>
+</li>
+<li>PBUF_FLAG_IS_CUSTOM
+: <a class="el" href="pbuf_8h.html#af78a7e1815dc0e31884d095b666d997f">pbuf.h</a>
+</li>
+<li>PBUF_FLAG_LLBCAST
+: <a class="el" href="pbuf_8h.html#a6772c16662bbb78597399add086500c0">pbuf.h</a>
+</li>
+<li>PBUF_FLAG_LLMCAST
+: <a class="el" href="pbuf_8h.html#ac0d56cde47aca24ef410d730d7c89887">pbuf.h</a>
+</li>
+<li>PBUF_FLAG_MCASTLOOP
+: <a class="el" href="pbuf_8h.html#ab8ad153151a8c157335d9c0cedc007e6">pbuf.h</a>
+</li>
+<li>PBUF_FLAG_PUSH
+: <a class="el" href="pbuf_8h.html#a018a6499e357f8a1373321f802a82930">pbuf.h</a>
+</li>
+<li>PBUF_FLAG_TCP_FIN
+: <a class="el" href="pbuf_8h.html#a36a915aa2f6a188baa2862881407971e">pbuf.h</a>
+</li>
+<li>pbuf_free()
+: <a class="el" href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf.h</a>
+</li>
+<li>pbuf_free_callback()
+: <a class="el" href="tcpip_8c.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c">tcpip.c</a>
+, <a class="el" href="tcpip_8h.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c">tcpip.h</a>
+</li>
+<li>pbuf_free_custom_fn
+: <a class="el" href="pbuf_8h.html#a6d285ce1d910f25e511c8c38532a1dce">pbuf.h</a>
+</li>
+<li>pbuf_free_header()
+: <a class="el" href="pbuf_8c.html#a25a3b8edc783896b03819a966d00845e">pbuf.c</a>
+, <a class="el" href="pbuf_8h.html#a25a3b8edc783896b03819a966d00845e">pbuf.h</a>
+</li>
+<li>pbuf_get_at()
+: <a class="el" href="group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6">pbuf.h</a>
+</li>
+<li>pbuf_get_contiguous()
+: <a class="el" href="group__pbuf.html#gad0357ae0be17b2aacd0c301cdc86fc39">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#gad0357ae0be17b2aacd0c301cdc86fc39">pbuf.h</a>
+</li>
+<li>pbuf_header()
+: <a class="el" href="pbuf_8h.html#aaa17c1951cf2d207b6adfd3947d91f00">pbuf.h</a>
+, <a class="el" href="pbuf_8c.html#a0f81deff4a0e6e8e0ff161a7b9871449">pbuf.c</a>
+</li>
+<li>pbuf_header_force()
+: <a class="el" href="pbuf_8c.html#ad0e64d6fbc423593461063da97da9ce6">pbuf.c</a>
+, <a class="el" href="pbuf_8h.html#a27480c41c34021d4417691d327163626">pbuf.h</a>
+</li>
+<li>PBUF_IP
+: <a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfafcc1e506061ba69dfa142eb6b3da5f13">pbuf.h</a>
+</li>
+<li>pbuf_layer
+: <a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf.h</a>
+</li>
+<li>PBUF_LINK
+: <a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfab4de441e737330558b609a990cd17346">pbuf.h</a>
+</li>
+<li>PBUF_LINK_ENCAPSULATION_HLEN
+: <a class="el" href="group__lwip__opts__pbuf.html#ga6e1ba1875ae5168a17b53d83597bc1de">opt.h</a>
+</li>
+<li>PBUF_LINK_HLEN
+: <a class="el" href="group__lwip__opts__pbuf.html#ga35998a3d56af9940e6a80bb372597685">opt.h</a>
+</li>
+<li>pbuf_memcmp()
+: <a class="el" href="group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974">pbuf.h</a>
+, <a class="el" href="group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974">pbuf.c</a>
+</li>
+<li>pbuf_memfind()
+: <a class="el" href="group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448">pbuf.h</a>
+</li>
+<li>PBUF_NEEDS_COPY
+: <a class="el" href="group__pbuf.html#ga894d91d811fd986f3cc3da828fa7beb3">pbuf.h</a>
+</li>
+<li>PBUF_POOL
+: <a class="el" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbae969347127387b9b59a23ccd24b76d21">pbuf.h</a>
+</li>
+<li>PBUF_POOL_BUFSIZE
+: <a class="el" href="group__lwip__opts__pbuf.html#gae61f4491d56e805e79b79eb5d35a00e5">opt.h</a>
+</li>
+<li>PBUF_POOL_FREE_OOSEQ
+: <a class="el" href="pbuf_8h.html#ac54b0f161128a32c7419c33b893a5106">pbuf.h</a>
+</li>
+<li>PBUF_POOL_SIZE
+: <a class="el" href="group__lwip__opts__memp.html#ga50eaadc4cad0716410332691e382c38a">opt.h</a>
+</li>
+<li>pbuf_put_at()
+: <a class="el" href="group__pbuf.html#gaf76863707dc02993eae116574b1ea03f">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#gaf76863707dc02993eae116574b1ea03f">pbuf.h</a>
+</li>
+<li>PBUF_RAM
+: <a class="el" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac5e9f28455bca98944a030d4b84ecfab">pbuf.h</a>
+</li>
+<li>PBUF_RAW
+: <a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba">pbuf.h</a>
+</li>
+<li>PBUF_RAW_TX
+: <a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa0ff039585f05f9208bcb66c2d37783e2">pbuf.h</a>
+</li>
+<li>pbuf_realloc()
+: <a class="el" href="group__pbuf.html#ga50abfe830a33a1a47a562febee66015d">pbuf.h</a>
+, <a class="el" href="group__pbuf.html#ga50abfe830a33a1a47a562febee66015d">pbuf.c</a>
+</li>
+<li>pbuf_ref()
+: <a class="el" href="group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e">pbuf.h</a>
+</li>
+<li>PBUF_REF
+: <a class="el" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac9b6ba960fdea6f2e8f35c8313b77e4e">pbuf.h</a>
+</li>
+<li>pbuf_ref()
+: <a class="el" href="group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e">pbuf.c</a>
+</li>
+<li>pbuf_remove_header()
+: <a class="el" href="pbuf_8c.html#aca0cd8b3f08fbb5e35bc91a663083cc1">pbuf.c</a>
+, <a class="el" href="pbuf_8h.html#ab65da7cd8f7449b3b2e57d7fa1a74ef4">pbuf.h</a>
+</li>
+<li>PBUF_ROM
+: <a class="el" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac120b0fe39efe35bb682e4aa3b82e2c9">pbuf.h</a>
+</li>
+<li>pbuf_skip()
+: <a class="el" href="group__pbuf.html#ga6a961522d81f0327aaf4d4ee6d96c583">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#ga6a961522d81f0327aaf4d4ee6d96c583">pbuf.h</a>
+</li>
+<li>pbuf_strstr()
+: <a class="el" href="pbuf_8c.html#a9ba3f7b705309ceadb147692fd5a1c7d">pbuf.c</a>
+, <a class="el" href="pbuf_8h.html#a9ba3f7b705309ceadb147692fd5a1c7d">pbuf.h</a>
+</li>
+<li>pbuf_take()
+: <a class="el" href="group__pbuf.html#gad1e31e370271335b197272af2724ca85">pbuf.h</a>
+, <a class="el" href="group__pbuf.html#gad1e31e370271335b197272af2724ca85">pbuf.c</a>
+</li>
+<li>pbuf_take_at()
+: <a class="el" href="group__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44">pbuf.c</a>
+, <a class="el" href="group__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44">pbuf.h</a>
+</li>
+<li>PBUF_TRANSPORT
+: <a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa2ded3594a3977f8bf9cf09552be327b5">pbuf.h</a>
+</li>
+<li>pbuf_try_get_at()
+: <a class="el" href="group__pbuf.html#ga839f342803b0cf89049744124c5a98ad">pbuf.h</a>
+, <a class="el" href="group__pbuf.html#ga839f342803b0cf89049744124c5a98ad">pbuf.c</a>
+</li>
+<li>pbuf_type
+: <a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf.h</a>
+</li>
+<li>PBUF_TYPE_ALLOC_SRC_MASK
+: <a class="el" href="pbuf_8h.html#a97d4db8e0f127f61af0016c184c865ca">pbuf.h</a>
+</li>
+<li>PBUF_TYPE_ALLOC_SRC_MASK_APP_MAX
+: <a class="el" href="pbuf_8h.html#aad686ef346759a221abdb45f64649816">pbuf.h</a>
+</li>
+<li>PBUF_TYPE_ALLOC_SRC_MASK_APP_MIN
+: <a class="el" href="pbuf_8h.html#aa1f62ba9dc5d462e67e33c4be64c601a">pbuf.h</a>
+</li>
+<li>PBUF_TYPE_FLAG_DATA_VOLATILE
+: <a class="el" href="pbuf_8h.html#a02789ca67766def65000b58f7fe7d03b">pbuf.h</a>
+</li>
+<li>PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS
+: <a class="el" href="pbuf_8h.html#a49ab2c0662378f268ed8209bd54aaedf">pbuf.h</a>
+</li>
+<li>poll
+: <a class="el" href="group__socket.html#ga80ae38841b0e64e60618cd8bf857f617">sockets.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_r.html b/doc/doxygen/output/html/globals_r.html
new file mode 100644
index 0000000..d532005
--- /dev/null
+++ b/doc/doxygen/output/html/globals_r.html
@@ -0,0 +1,219 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_r.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_r"></a>- r -</h3><ul>
+<li>ram_heap
+: <a class="el" href="mem_8c.html#a6da602f2bbf1d555556f9260b3b8ad5f">mem.c</a>
+</li>
+<li>raw_bind()
+: <a class="el" href="group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4">raw.c</a>
+, <a class="el" href="group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4">raw.h</a>
+</li>
+<li>raw_bind_netif()
+: <a class="el" href="group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a">raw.c</a>
+, <a class="el" href="group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a">raw.h</a>
+</li>
+<li>raw_connect()
+: <a class="el" href="group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168">raw.c</a>
+, <a class="el" href="group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168">raw.h</a>
+</li>
+<li>RAW_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gaf0551bef83c0fc1baa57cf339d220e25">opt.h</a>
+</li>
+<li>raw_disconnect()
+: <a class="el" href="group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef">raw.c</a>
+, <a class="el" href="group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef">raw.h</a>
+</li>
+<li>raw_input()
+: <a class="el" href="raw_8c.html#a03c4582d9ecf687e1f31d597c7889553">raw.c</a>
+, <a class="el" href="raw__priv_8h.html#a03c4582d9ecf687e1f31d597c7889553">raw_priv.h</a>
+</li>
+<li>raw_input_state
+: <a class="el" href="raw__priv_8h.html#a2580ec946c4196127888d5405257866b">raw_priv.h</a>
+</li>
+<li>raw_input_state_t
+: <a class="el" href="raw__priv_8h.html#aebbdbaee89c38ad9c007a1d1a336e687">raw_priv.h</a>
+</li>
+<li>raw_netif_ip_addr_changed()
+: <a class="el" href="raw__priv_8h.html#a61dc42f18e34800643000e48be6543ab">raw_priv.h</a>
+, <a class="el" href="raw_8c.html#a61dc42f18e34800643000e48be6543ab">raw.c</a>
+</li>
+<li>raw_new()
+: <a class="el" href="group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f">raw.c</a>
+, <a class="el" href="group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f">raw.h</a>
+</li>
+<li>raw_new_ip_type()
+: <a class="el" href="group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11">raw.c</a>
+, <a class="el" href="group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11">raw.h</a>
+</li>
+<li>raw_recv()
+: <a class="el" href="group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426">raw.c</a>
+, <a class="el" href="group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426">raw.h</a>
+</li>
+<li>raw_recv_fn
+: <a class="el" href="raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd">raw.h</a>
+</li>
+<li>raw_remove()
+: <a class="el" href="group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16">raw.c</a>
+, <a class="el" href="group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16">raw.h</a>
+</li>
+<li>raw_send()
+: <a class="el" href="group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d">raw.c</a>
+, <a class="el" href="group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d">raw.h</a>
+</li>
+<li>raw_sendto()
+: <a class="el" href="group__raw__raw.html#ga09427456070fb610cc7795d23dedc159">raw.c</a>
+, <a class="el" href="group__raw__raw.html#ga09427456070fb610cc7795d23dedc159">raw.h</a>
+</li>
+<li>raw_sendto_if_src()
+: <a class="el" href="group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1">raw.h</a>
+, <a class="el" href="group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1">raw.c</a>
+</li>
+<li>RAW_TTL
+: <a class="el" href="group__lwip__opts__raw.html#ga36e3ffa66073ca0d27d11c422778249c">opt.h</a>
+</li>
+<li>read
+: <a class="el" href="group__socket.html#ga822040573319cf87bfe6758d511be57f">sockets.h</a>
+</li>
+<li>readv
+: <a class="el" href="group__socket.html#ga86788b3c690d38699fdbaea523ddec9d">sockets.h</a>
+</li>
+<li>recv
+: <a class="el" href="group__socket.html#gadd7ae45df7c005619eb1126542231e9b">sockets.h</a>
+</li>
+<li>RECV_BUFSIZE_DEFAULT
+: <a class="el" href="group__lwip__opts__socket.html#ga5dbd0a61f30ae6c6bfbda635095f138d">opt.h</a>
+</li>
+<li>recvfrom
+: <a class="el" href="group__socket.html#ga5e5f7bcda6562bae815e188ea1a81ecd">sockets.h</a>
+</li>
+<li>recvmsg
+: <a class="el" href="group__socket.html#gaecfc7d524105e52604829c66ced752b8">sockets.h</a>
+</li>
+<li>rfc7668_if_init()
+: <a class="el" href="group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde">lowpan6_ble.h</a>
+, <a class="el" href="group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde">lowpan6_ble.c</a>
+</li>
+<li>rfc7668_input()
+: <a class="el" href="group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197">lowpan6_ble.h</a>
+, <a class="el" href="group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197">lowpan6_ble.c</a>
+</li>
+<li>rfc7668_output()
+: <a class="el" href="group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0">lowpan6_ble.c</a>
+, <a class="el" href="group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0">lowpan6_ble.h</a>
+</li>
+<li>rfc7668_set_context()
+: <a class="el" href="group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e">lowpan6_ble.h</a>
+, <a class="el" href="group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e">lowpan6_ble.c</a>
+</li>
+<li>rfc7668_set_local_addr_eui64()
+: <a class="el" href="lowpan6__ble_8h.html#a9c5b721f6fb28b4c999baab56a65d8e2">lowpan6_ble.h</a>
+, <a class="el" href="lowpan6__ble_8c.html#a9c5b721f6fb28b4c999baab56a65d8e2">lowpan6_ble.c</a>
+</li>
+<li>rfc7668_set_local_addr_mac48()
+: <a class="el" href="lowpan6__ble_8h.html#a53d4e8096dd714f94c69d67a6cd49ac2">lowpan6_ble.h</a>
+, <a class="el" href="lowpan6__ble_8c.html#a53d4e8096dd714f94c69d67a6cd49ac2">lowpan6_ble.c</a>
+</li>
+<li>rfc7668_set_peer_addr_eui64()
+: <a class="el" href="lowpan6__ble_8h.html#a01b797f4fde59dfb803f0299e6a49593">lowpan6_ble.h</a>
+, <a class="el" href="lowpan6__ble_8c.html#a01b797f4fde59dfb803f0299e6a49593">lowpan6_ble.c</a>
+</li>
+<li>rfc7668_set_peer_addr_mac48()
+: <a class="el" href="lowpan6__ble_8h.html#a437b9f9e85be644bd7b939413e3c81d0">lowpan6_ble.h</a>
+, <a class="el" href="lowpan6__ble_8c.html#a437b9f9e85be644bd7b939413e3c81d0">lowpan6_ble.c</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_s.html b/doc/doxygen/output/html/globals_s.html
new file mode 100644
index 0000000..2b89369
--- /dev/null
+++ b/doc/doxygen/output/html/globals_s.html
@@ -0,0 +1,847 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_s.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_s"></a>- s -</h3><ul>
+<li>select
+: <a class="el" href="group__socket.html#gac332b9b9b2cd877a6189ef838de49e33">sockets.h</a>
+</li>
+<li>SELWAIT_T
+: <a class="el" href="sockets__priv_8h.html#a8f4d240733a9261c668fc66dc4ce8196">sockets_priv.h</a>
+</li>
+<li>send
+: <a class="el" href="group__socket.html#ga19024690fdfd3512d24dcaa9b80d24ed">sockets.h</a>
+</li>
+<li>sendmsg
+: <a class="el" href="group__socket.html#gaad99bea090b1fe4743234fcee15a5d28">sockets.h</a>
+</li>
+<li>sendto
+: <a class="el" href="group__socket.html#gaaa17499d76ef421821fe72fd29fe38f7">sockets.h</a>
+</li>
+<li>service_get_txt_fn_t
+: <a class="el" href="mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83">mdns.h</a>
+</li>
+<li>setsockopt
+: <a class="el" href="group__socket.html#ga115d74cd1953e7bafc2e34157c697df1">sockets.h</a>
+</li>
+<li>shutdown
+: <a class="el" href="group__socket.html#ga7d832f77cfad97cf901640f243c6e682">sockets.h</a>
+</li>
+<li>SLIP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gab986f95183559d8678c6d80969b01857">opt.h</a>
+</li>
+<li>SLIP_MAX_SIZE
+: <a class="el" href="slipif_8c.html#accf448f9dabb0f33ef46b40355691cab">slipif.c</a>
+</li>
+<li>SLIP_RX_QUEUE
+: <a class="el" href="slipif_8h.html#a37ce8613535232db02bfd9ae9b51c668">slipif.h</a>
+</li>
+<li>SLIP_SIO_SPEED
+: <a class="el" href="slipif_8c.html#a2a9e9ed81732a6794a9b9a712f75a1cc">slipif.c</a>
+</li>
+<li>SLIP_USE_RX_THREAD
+: <a class="el" href="slipif_8h.html#a198967c11f79cffc32192710294e8826">slipif.h</a>
+</li>
+<li>slipif_init()
+: <a class="el" href="group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3">slipif.h</a>
+, <a class="el" href="group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3">slipif.c</a>
+</li>
+<li>slipif_poll()
+: <a class="el" href="group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6">slipif.h</a>
+, <a class="el" href="group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6">slipif.c</a>
+</li>
+<li>slipif_process_rxqueue()
+: <a class="el" href="group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946">slipif.h</a>
+, <a class="el" href="group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946">slipif.c</a>
+</li>
+<li>slipif_received_byte()
+: <a class="el" href="group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3">slipif.h</a>
+, <a class="el" href="group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3">slipif.c</a>
+</li>
+<li>slipif_received_bytes()
+: <a class="el" href="group__slipif.html#gabbee48569a513c90fe154632038eb6d6">slipif.h</a>
+, <a class="el" href="group__slipif.html#gabbee48569a513c90fe154632038eb6d6">slipif.c</a>
+</li>
+<li>SLIPIF_THREAD_NAME
+: <a class="el" href="group__lwip__opts__thread.html#gae9cd260c56472324a2f0ee5f9597a675">opt.h</a>
+</li>
+<li>SLIPIF_THREAD_PRIO
+: <a class="el" href="group__lwip__opts__thread.html#gab1b9fc2efcbf1f804bfd0191bc019c4e">opt.h</a>
+</li>
+<li>SLIPIF_THREAD_STACKSIZE
+: <a class="el" href="group__lwip__opts__thread.html#gae8ab54a25007ce997bbab6289815e258">opt.h</a>
+</li>
+<li>SMEMCPY
+: <a class="el" href="group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec">opt.h</a>
+</li>
+<li>SMTP_POLL_INTERVAL
+: <a class="el" href="smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e">smtp.c</a>
+</li>
+<li>smtp_send_mail()
+: <a class="el" href="group__smtp.html#gae43119480c4146df9eeff7ae80c767f7">smtp.c</a>
+</li>
+<li>smtp_send_mail_int()
+: <a class="el" href="group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243">smtp.c</a>
+</li>
+<li>smtp_send_mail_static()
+: <a class="el" href="group__smtp.html#ga06f6582701def2a62582373bb0be5788">smtp.c</a>
+</li>
+<li>smtp_session_state
+: <a class="el" href="smtp_8c.html#a04947fff2d3a3803e6c716aecc7f2bae">smtp.c</a>
+</li>
+<li>smtp_set_auth()
+: <a class="el" href="group__smtp.html#ga79567a5a75e048a6b8addb5b038fc899">smtp.c</a>
+</li>
+<li>smtp_set_server_addr()
+: <a class="el" href="group__smtp.html#ga1ccf4305461ec16cf41599341ec54983">smtp.c</a>
+</li>
+<li>smtp_set_server_port()
+: <a class="el" href="group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f">smtp.c</a>
+</li>
+<li>smtp_set_tls_config()
+: <a class="el" href="group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e">smtp.c</a>
+</li>
+<li>SMTP_TIMEOUT
+: <a class="el" href="smtp_8c.html#a6029851c4f71d98b00d6c49a17ea9ef6">smtp.c</a>
+</li>
+<li>SMTP_TIMEOUT_DATABLOCK
+: <a class="el" href="smtp_8c.html#ad853ab316a3b866b87c0454053febfe3">smtp.c</a>
+</li>
+<li>SMTP_TIMEOUT_DATATERM
+: <a class="el" href="smtp_8c.html#a73855e673457f748b6bcba49aab9b035">smtp.c</a>
+</li>
+<li>snmp_access_t
+: <a class="el" href="snmp__core_8h.html#ad5a33687d1a6fcf970266b41b0633760">snmp_core.h</a>
+</li>
+<li>snmp_ans1_enc_tlv()
+: <a class="el" href="snmp__asn1_8c.html#af8e905a214936995d235789f359cf015">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#af8e905a214936995d235789f359cf015">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_dec_oid()
+: <a class="el" href="snmp__asn1_8c.html#a8bb84ec51c46a890b7ced016043b2908">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#a8bb84ec51c46a890b7ced016043b2908">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_dec_raw()
+: <a class="el" href="snmp__asn1_8c.html#a31055a35285214ea0d4ad60c64c2f73e">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#a31055a35285214ea0d4ad60c64c2f73e">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_dec_s32t()
+: <a class="el" href="snmp__asn1_8c.html#a51d36daf2935c246eb55fb749581e2bb">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#a51d36daf2935c246eb55fb749581e2bb">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_dec_tlv()
+: <a class="el" href="snmp__asn1_8c.html#a7e3f63b155b06f7ade627060b55e4496">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#a7e3f63b155b06f7ade627060b55e4496">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_dec_u32t()
+: <a class="el" href="snmp__asn1_8c.html#ac04e08c19c40cfc3333a181018887a51">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#ac04e08c19c40cfc3333a181018887a51">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_enc_length_cnt()
+: <a class="el" href="snmp__asn1_8c.html#a20343aef4524459a2b45704e18ef520d">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#a20343aef4524459a2b45704e18ef520d">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_enc_oid()
+: <a class="el" href="snmp__asn1_8c.html#aa71260abd46fc2f682874016896fe218">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#aa71260abd46fc2f682874016896fe218">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_enc_oid_cnt()
+: <a class="el" href="snmp__asn1_8c.html#ab6fd58c1b41cb98117f00a11db7d226f">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#ab6fd58c1b41cb98117f00a11db7d226f">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_enc_raw()
+: <a class="el" href="snmp__asn1_8c.html#a167b707051bbbeafea14eeca72449ac6">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#a167b707051bbbeafea14eeca72449ac6">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_enc_s32t()
+: <a class="el" href="snmp__asn1_8c.html#a25b3fe21becd08260ec56bef9299d3c6">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#a25b3fe21becd08260ec56bef9299d3c6">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_enc_s32t_cnt()
+: <a class="el" href="snmp__asn1_8h.html#a8c74914532f1e0c219dfb1977fd0c22f">snmp_asn1.h</a>
+, <a class="el" href="snmp__asn1_8c.html#a8c74914532f1e0c219dfb1977fd0c22f">snmp_asn1.c</a>
+</li>
+<li>snmp_asn1_enc_u32t()
+: <a class="el" href="snmp__asn1_8c.html#aa54b4ee3c58ef66721df96fd8b1f66b2">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#aa54b4ee3c58ef66721df96fd8b1f66b2">snmp_asn1.h</a>
+</li>
+<li>snmp_asn1_enc_u32t_cnt()
+: <a class="el" href="snmp__asn1_8c.html#a58965e0305884d550786440c84119ad4">snmp_asn1.c</a>
+, <a class="el" href="snmp__asn1_8h.html#a58965e0305884d550786440c84119ad4">snmp_asn1.h</a>
+</li>
+<li>snmp_authfail_trap()
+: <a class="el" href="group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee">snmp_traps.c</a>
+, <a class="el" href="group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee">snmp.h</a>
+</li>
+<li>snmp_coldstart_trap()
+: <a class="el" href="group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be">snmp_traps.c</a>
+, <a class="el" href="group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be">snmp.h</a>
+</li>
+<li>snmp_community
+: <a class="el" href="snmp__msg_8c.html#ac6f810ab812c44c6ca1df1fdf926a9f6">snmp_msg.c</a>
+, <a class="el" href="snmp__msg_8h.html#ac6f810ab812c44c6ca1df1fdf926a9f6">snmp_msg.h</a>
+</li>
+<li>SNMP_COMMUNITY
+: <a class="el" href="group__snmp__opts.html#ga316c1e1f06f0c7ca56589563809e64db">snmp_opts.h</a>
+</li>
+<li>snmp_community_trap
+: <a class="el" href="snmp__msg_8c.html#a2e2007343d9492b8e31d363d2c6ad79b">snmp_msg.c</a>
+, <a class="el" href="snmp__traps_8c.html#a2e2007343d9492b8e31d363d2c6ad79b">snmp_traps.c</a>
+</li>
+<li>SNMP_COMMUNITY_TRAP
+: <a class="el" href="group__snmp__opts.html#gaaefc9dda5f8e5c296018a463cdbac39b">snmp_opts.h</a>
+</li>
+<li>SNMP_COMMUNITY_WRITE
+: <a class="el" href="group__snmp__opts.html#gafb9414dc7a33978b62a3a9838b659464">snmp_opts.h</a>
+</li>
+<li>snmp_community_write
+: <a class="el" href="snmp__msg_8c.html#a2d77485bb0b640c8e5f569ca756d3b04">snmp_msg.c</a>
+, <a class="el" href="snmp__msg_8h.html#a2d77485bb0b640c8e5f569ca756d3b04">snmp_msg.h</a>
+</li>
+<li>SNMP_CREATE_THREAD_SYNC_NODE
+: <a class="el" href="snmp__threadsync_8h.html#a1971c27c8addf1c426abd1abac54c8d2">snmp_threadsync.h</a>
+</li>
+<li>SNMP_DEBUG
+: <a class="el" href="group__snmp__opts.html#gac041000361342f51ad5ee5d8f6254e02">snmp_opts.h</a>
+</li>
+<li>snmp_decode_bits()
+: <a class="el" href="snmp__core_8c.html#ad3ab34b13bb9fcc757c8d366fe520fdc">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#ad3ab34b13bb9fcc757c8d366fe520fdc">snmp_core.h</a>
+</li>
+<li>SNMP_DEVICE_ENTERPRISE_OID
+: <a class="el" href="group__snmp__opts.html#ga09118b734e85df152af098744e888b34">snmp_opts.h</a>
+</li>
+<li>SNMP_DEVICE_ENTERPRISE_OID_LEN
+: <a class="el" href="group__snmp__opts.html#ga9e39ba5308f5c7ac5296c7d05fdfa97f">snmp_opts.h</a>
+</li>
+<li>snmp_encode_bits()
+: <a class="el" href="snmp__core_8c.html#ae6f5d0c38a7ec164a67fa55c87f1de03">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#ae6f5d0c38a7ec164a67fa55c87f1de03">snmp_core.h</a>
+</li>
+<li>snmp_err_t
+: <a class="el" href="snmp__core_8h.html#abaa9cdad345ad93da515d31625a54589">snmp_core.h</a>
+</li>
+<li>SNMP_GENTRAP_AUTH_FAILURE
+: <a class="el" href="apps_2snmp_8h.html#aaf312d8bdbeed2c02560321ab24a022f">snmp.h</a>
+</li>
+<li>SNMP_GENTRAP_COLDSTART
+: <a class="el" href="apps_2snmp_8h.html#ae9310bbe1948b3c3bc64c073d4621019">snmp.h</a>
+</li>
+<li>SNMP_GENTRAP_EGP_NEIGHBOR_LOSS
+: <a class="el" href="apps_2snmp_8h.html#ac1cd822650d9ac66d0333a5ad600cfee">snmp.h</a>
+</li>
+<li>SNMP_GENTRAP_ENTERPRISE_SPECIFIC
+: <a class="el" href="apps_2snmp_8h.html#ab3691cecfa911baa52ccf6054022ba43">snmp.h</a>
+</li>
+<li>SNMP_GENTRAP_LINKDOWN
+: <a class="el" href="apps_2snmp_8h.html#a1856efbe83199f456c34a4e5139dfb16">snmp.h</a>
+</li>
+<li>SNMP_GENTRAP_LINKUP
+: <a class="el" href="apps_2snmp_8h.html#afa665cdc02ccd5ee9fe0c4cb1b792186">snmp.h</a>
+</li>
+<li>SNMP_GENTRAP_WARMSTART
+: <a class="el" href="apps_2snmp_8h.html#a9a2e5824deab50e639b01181307a0926">snmp.h</a>
+</li>
+<li>snmp_get_auth_traps_enabled()
+: <a class="el" href="group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7">snmp_traps.c</a>
+, <a class="el" href="group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7">snmp.h</a>
+</li>
+<li>snmp_get_community()
+: <a class="el" href="group__snmp__core.html#gacf277cbca915275190426aeef4cfb103">snmp_msg.c</a>
+, <a class="el" href="group__snmp__core.html#gacf277cbca915275190426aeef4cfb103">snmp.h</a>
+</li>
+<li>snmp_get_community_trap()
+: <a class="el" href="group__snmp__traps.html#gafdd3299e145f53cc826cc11a469f8409">snmp_msg.c</a>
+, <a class="el" href="group__snmp__traps.html#gafdd3299e145f53cc826cc11a469f8409">snmp.h</a>
+</li>
+<li>snmp_get_community_write()
+: <a class="el" href="group__snmp__core.html#gaba31b6f1816661df5a3b7f2076ee6ec0">snmp_msg.c</a>
+, <a class="el" href="group__snmp__core.html#gaba31b6f1816661df5a3b7f2076ee6ec0">snmp.h</a>
+</li>
+<li>snmp_get_device_enterprise_oid()
+: <a class="el" href="group__snmp__core.html#ga4dff82dda2553b9554a9f98561852a50">snmp_core.c</a>
+, <a class="el" href="group__snmp__core.html#ga4dff82dda2553b9554a9f98561852a50">snmp.h</a>
+</li>
+<li>snmp_ifType
+: <a class="el" href="group__netif__mib2.html#ga15378b8dcd2a9dc2985142d864a767ba">snmp.h</a>
+</li>
+<li>snmp_init()
+: <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()
+: <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>
+<li>snmp_ip6_to_oid()
+: <a class="el" href="snmp__core_8c.html#af1f327eef86765cce0253c94ec3c5ce9">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#af1f327eef86765cce0253c94ec3c5ce9">snmp_core.h</a>
+</li>
+<li>snmp_ip_port_to_oid()
+: <a class="el" href="snmp__core_8c.html#a53b01262de3d1c52faf88dd4bb702a27">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a53b01262de3d1c52faf88dd4bb702a27">snmp_core.h</a>
+</li>
+<li>snmp_ip_to_oid()
+: <a class="el" href="snmp__core_8c.html#a909ed1b0da526a0acdf6fa57a06f351e">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a909ed1b0da526a0acdf6fa57a06f351e">snmp_core.h</a>
+</li>
+<li>SNMP_LWIP_ENTERPRISE_OID
+: <a class="el" href="group__snmp__opts.html#ga868bfef6efe05515c86291137a633479">snmp_opts.h</a>
+</li>
+<li>SNMP_LWIP_GETBULK_MAX_REPETITIONS
+: <a class="el" href="group__snmp__opts.html#ga5a24152aa5f3c2837b9a3145aa3c59f3">snmp_opts.h</a>
+</li>
+<li>SNMP_LWIP_MIB2
+: <a class="el" href="group__snmp__opts.html#gaab667d48f48ee89f8bdbc7f134e6037d">snmp_opts.h</a>
+</li>
+<li>SNMP_LWIP_MIB2_SYSCONTACT
+: <a class="el" href="group__snmp__opts.html#ga1a57501c615b630d363e0af1a504e683">snmp_opts.h</a>
+</li>
+<li>SNMP_LWIP_MIB2_SYSDESC
+: <a class="el" href="group__snmp__opts.html#gae93a105b421a2ca91e862da5087cec73">snmp_opts.h</a>
+</li>
+<li>SNMP_LWIP_MIB2_SYSLOCATION
+: <a class="el" href="group__snmp__opts.html#ga311cec98c8f7e4851d325fffe96cf8d9">snmp_opts.h</a>
+</li>
+<li>SNMP_LWIP_MIB2_SYSNAME
+: <a class="el" href="group__snmp__opts.html#ga80ba46f9517a51b5477f13082b2bcf98">snmp_opts.h</a>
+</li>
+<li>SNMP_MAX_COMMUNITY_STR_LEN
+: <a class="el" href="group__snmp__opts.html#ga0e98b58159a77688f87f9f50479177fd">snmp_opts.h</a>
+</li>
+<li>SNMP_MAX_OBJ_ID_LEN
+: <a class="el" href="group__snmp__opts.html#ga3ad9d293f90e3c885c4e3263a9064a41">snmp_opts.h</a>
+</li>
+<li>SNMP_MAX_OCTET_STRING_LEN
+: <a class="el" href="group__snmp__opts.html#gae50cdd09697aa54a8b9f26432ac55ac2">snmp_opts.h</a>
+</li>
+<li>SNMP_MAX_VALUE_SIZE
+: <a class="el" href="group__snmp__opts.html#gafb4362575bc50476a7401a1ed14787f0">snmp_opts.h</a>
+</li>
+<li>snmp_mib2_set_syscontact()
+: <a class="el" href="group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e">snmp_mib2_system.c</a>
+, <a class="el" href="group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e">snmp_mib2.h</a>
+</li>
+<li>snmp_mib2_set_syscontact_readonly()
+: <a class="el" href="group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a">snmp_mib2_system.c</a>
+, <a class="el" href="group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a">snmp_mib2.h</a>
+</li>
+<li>snmp_mib2_set_sysdescr()
+: <a class="el" href="group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc">snmp_mib2_system.c</a>
+, <a class="el" href="group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc">snmp_mib2.h</a>
+</li>
+<li>snmp_mib2_set_syslocation()
+: <a class="el" href="group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2">snmp_mib2_system.c</a>
+, <a class="el" href="group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2">snmp_mib2.h</a>
+</li>
+<li>snmp_mib2_set_syslocation_readonly()
+: <a class="el" href="group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267">snmp_mib2_system.c</a>
+, <a class="el" href="group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267">snmp_mib2.h</a>
+</li>
+<li>snmp_mib2_set_sysname()
+: <a class="el" href="group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7">snmp_mib2_system.c</a>
+, <a class="el" href="group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7">snmp_mib2.h</a>
+</li>
+<li>snmp_mib2_set_sysname_readonly()
+: <a class="el" href="group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5">snmp_mib2_system.c</a>
+, <a class="el" href="group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5">snmp_mib2.h</a>
+</li>
+<li>SNMP_MIB_DEBUG
+: <a class="el" href="group__snmp__opts.html#gac12240265db443eaf9d31d187e586c16">snmp_opts.h</a>
+</li>
+<li>snmp_mib_tree_resolve_exact()
+: <a class="el" href="snmp__core_8c.html#af42d6d2732a92017a43b83a07609fd1a">snmp_core.c</a>
+</li>
+<li>SNMP_MIN_VALUE_SIZE
+: <a class="el" href="group__snmp__opts.html#gac815d0dbe576299546ac612e7eaf3f90">snmp_opts.h</a>
+</li>
+<li>snmp_next_oid_check()
+: <a class="el" href="snmp__core_8c.html#a18126b2b13f267306c27e851e9379983">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a18126b2b13f267306c27e851e9379983">snmp_core.h</a>
+</li>
+<li>snmp_next_oid_init()
+: <a class="el" href="snmp__core_8c.html#a8074765d5c2b809561f032d35e59e213">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a8074765d5c2b809561f032d35e59e213">snmp_core.h</a>
+</li>
+<li>snmp_next_oid_precheck()
+: <a class="el" href="snmp__core_8c.html#a9768ecf81f01880dbf1cc1933bd9e60a">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a9768ecf81f01880dbf1cc1933bd9e60a">snmp_core.h</a>
+</li>
+<li>SNMP_NODE_TREE
+: <a class="el" href="snmp__core_8h.html#a9ee3aad9305fdd883abb37822be81b72">snmp_core.h</a>
+</li>
+<li>snmp_oid_append()
+: <a class="el" href="snmp__core_8c.html#a5aa6c8dbfc93235b160afaf3a40c1c93">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a5aa6c8dbfc93235b160afaf3a40c1c93">snmp_core.h</a>
+</li>
+<li>snmp_oid_assign()
+: <a class="el" href="snmp__core_8c.html#a41fd5e854d809499e28c66b4918481a6">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a41fd5e854d809499e28c66b4918481a6">snmp_core.h</a>
+</li>
+<li>snmp_oid_combine()
+: <a class="el" href="snmp__core_8h.html#a6edcb88d8162544333bcede301cf0904">snmp_core.h</a>
+, <a class="el" href="snmp__core_8c.html#a6edcb88d8162544333bcede301cf0904">snmp_core.c</a>
+</li>
+<li>snmp_oid_compare()
+: <a class="el" href="snmp__core_8c.html#af041ab415e8063097c79be2b892174f8">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#af041ab415e8063097c79be2b892174f8">snmp_core.h</a>
+</li>
+<li>snmp_oid_equal()
+: <a class="el" href="snmp__core_8c.html#ac2b6821b3d4a25033433fc25ffd74c9e">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#ac2b6821b3d4a25033433fc25ffd74c9e">snmp_core.h</a>
+</li>
+<li>snmp_oid_in_range()
+: <a class="el" href="snmp__core_8c.html#a5275903be5948b1c28bfadb365823504">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a5275903be5948b1c28bfadb365823504">snmp_core.h</a>
+</li>
+<li>snmp_oid_prefix()
+: <a class="el" href="snmp__core_8h.html#a32256b37b211b4f59d8f114cee364f39">snmp_core.h</a>
+, <a class="el" href="snmp__core_8c.html#a32256b37b211b4f59d8f114cee364f39">snmp_core.c</a>
+</li>
+<li>snmp_oid_to_ip()
+: <a class="el" href="snmp__core_8c.html#a66aac86af921cd8aecb95eb252eb3e84">snmp_core.c</a>
+, <a class="el" href="snmp__core_8h.html#a66aac86af921cd8aecb95eb252eb3e84">snmp_core.h</a>
+</li>
+<li>snmp_oid_to_ip4()
+: <a class="el" href="snmp__core_8h.html#a095efcd4202782e57625d7b1afcdbf77">snmp_core.h</a>
+, <a class="el" href="snmp__core_8c.html#a095efcd4202782e57625d7b1afcdbf77">snmp_core.c</a>
+</li>
+<li>snmp_oid_to_ip6()
+: <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()
+: <a class="el" href="snmp__core_8h.html#a21f02b239cc9abae586f5ef92923e507">snmp_core.h</a>
+, <a class="el" href="snmp__core_8c.html#a21f02b239cc9abae586f5ef92923e507">snmp_core.c</a>
+</li>
+<li>SNMP_SAFE_REQUESTS
+: <a class="el" href="group__snmp__opts.html#ga95e39047b9bcb385780b06b35af49261">snmp_opts.h</a>
+</li>
+<li>snmp_send_trap()
+: <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_trap_generic()
+: <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()
+: <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()
+: <a class="el" href="group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c">snmp.h</a>
+, <a class="el" href="group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c">snmp_traps.c</a>
+</li>
+<li>snmp_set_community()
+: <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()
+: <a class="el" href="group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760">snmp.h</a>
+, <a class="el" href="group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760">snmp_msg.c</a>
+</li>
+<li>snmp_set_community_write()
+: <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_device_enterprise_oid()
+: <a class="el" href="group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a">snmp.h</a>
+, <a class="el" href="group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a">snmp_core.c</a>
+</li>
+<li>snmp_set_mibs()
+: <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()
+: <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
+: <a class="el" href="group__snmp__opts.html#ga0dcacdccc61216c6773943ad3fd31242">snmp_opts.h</a>
+</li>
+<li>snmp_table_column_data_type_t
+: <a class="el" href="snmp__table_8h.html#af9b59f3ba7dccf338fe6e5bc1c4b1db5">snmp_table.h</a>
+</li>
+<li>SNMP_THREAD_PRIO
+: <a class="el" href="group__snmp__opts.html#gad9bce0d9c05ed4607d72de7b75f2a80b">snmp_opts.h</a>
+</li>
+<li>snmp_threadsync_init()
+: <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>
+<li>SNMP_TRAP_DESTINATIONS
+: <a class="el" href="group__snmp__opts.html#ga692343b0cc555c302fd713003d4f8a08">snmp_opts.h</a>
+</li>
+<li>snmp_trap_dst_enable()
+: <a class="el" href="group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32">snmp.h</a>
+, <a class="el" href="group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32">snmp_traps.c</a>
+</li>
+<li>snmp_trap_dst_ip_set()
+: <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_traps_handle
+: <a class="el" href="snmp__traps_8c.html#ade16efa80e2c2a20236d3cb96b19c79a">snmp_traps.c</a>
+, <a class="el" href="snmp__msg_8h.html#ade16efa80e2c2a20236d3cb96b19c79a">snmp_msg.h</a>
+</li>
+<li>SNMP_USE_NETCONN
+: <a class="el" href="group__snmp__opts.html#gaf02e8b4b69e99df784e9953401477078">snmp_opts.h</a>
+</li>
+<li>SNMP_USE_RAW
+: <a class="el" href="group__snmp__opts.html#ga8c93f4260af2eb3c50d4bc603f716f1f">snmp_opts.h</a>
+</li>
+<li>snmp_varbind_length()
+: <a class="el" href="snmp__msg_8h.html#ac1f684dada963f68b71a04a702f28fe5">snmp_msg.h</a>
+, <a class="el" href="snmp__msg_8c.html#ac1f684dada963f68b71a04a702f28fe5">snmp_msg.c</a>
+</li>
+<li>SNTP_CHECK_RESPONSE
+: <a class="el" href="group__sntp__opts.html#ga7d4e12d90912d486e64f289d7f3ca446">sntp_opts.h</a>
+</li>
+<li>SNTP_COMP_ROUNDTRIP
+: <a class="el" href="group__sntp__opts.html#ga1e21781705d3549a305339fd7fca63e7">sntp_opts.h</a>
+</li>
+<li>SNTP_DEBUG
+: <a class="el" href="group__sntp__opts.html#ga25c6f9c14c17e218d110d826b09f8d91">sntp_opts.h</a>
+</li>
+<li>sntp_enabled()
+: <a class="el" href="group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5">sntp.h</a>
+, <a class="el" href="group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5">sntp.c</a>
+</li>
+<li>SNTP_FRAC_TO_US
+: <a class="el" href="sntp_8c.html#aebe74c93643ac9b8c8a9c7d223192c8f">sntp.c</a>
+</li>
+<li>SNTP_GET_SERVERS_FROM_DHCP
+: <a class="el" href="group__sntp__opts.html#ga961a61eef942ab5378cff1e3742b3ade">sntp_opts.h</a>
+</li>
+<li>SNTP_GET_SYSTEM_TIME
+: <a class="el" href="group__sntp__opts.html#gab0ea385479a5c5c8c173f165ded2fb63">sntp_opts.h</a>
+</li>
+<li>sntp_getoperatingmode()
+: <a class="el" href="group__sntp.html#gae66404a551d5cef420cf844a71356fae">sntp.h</a>
+, <a class="el" href="group__sntp.html#gae66404a551d5cef420cf844a71356fae">sntp.c</a>
+</li>
+<li>sntp_getreachability()
+: <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()
+: <a class="el" href="group__sntp.html#ga2a28523cb9f2b5b025a4818bc2c1afc1">sntp.c</a>
+, <a class="el" href="group__sntp.html#ga2a28523cb9f2b5b025a4818bc2c1afc1">sntp.h</a>
+</li>
+<li>sntp_init()
+: <a class="el" href="group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba">sntp.c</a>
+, <a class="el" href="group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba">sntp.h</a>
+</li>
+<li>SNTP_MAX_SERVERS
+: <a class="el" href="group__sntp__opts.html#ga5d9dc0827f402849f5c18d44e311dbc2">sntp_opts.h</a>
+</li>
+<li>SNTP_MONITOR_SERVER_REACHABILITY
+: <a class="el" href="group__sntp__opts.html#ga5782f21ef24ebddd5ba2ce9a889094e3">sntp_opts.h</a>
+</li>
+<li>SNTP_PORT
+: <a class="el" href="group__sntp__opts.html#gacbee62c27f54371fc2c5259a834a0f9b">sntp_opts.h</a>
+</li>
+<li>SNTP_RECV_TIMEOUT
+: <a class="el" href="group__sntp__opts.html#ga44cf26b9b19832d88599244711a12d08">sntp_opts.h</a>
+</li>
+<li>SNTP_RETRY_TIMEOUT
+: <a class="el" href="group__sntp__opts.html#ga86d651d8eb07687208308deef95a23ba">sntp_opts.h</a>
+</li>
+<li>SNTP_RETRY_TIMEOUT_EXP
+: <a class="el" href="group__sntp__opts.html#gafdb7e98f608cc429188d7dac356614c2">sntp_opts.h</a>
+</li>
+<li>SNTP_RETRY_TIMEOUT_MAX
+: <a class="el" href="group__sntp__opts.html#gafde10b3ed7cb4bb2cd2c4daa389db699">sntp_opts.h</a>
+</li>
+<li>SNTP_SERVER_DNS
+: <a class="el" href="group__sntp__opts.html#gaef477c145ae404d77188b26b79b6996f">sntp_opts.h</a>
+</li>
+<li>SNTP_SET_SYSTEM_TIME
+: <a class="el" href="group__sntp__opts.html#gafe340b98c52dedcbc041267fe13b2da6">sntp_opts.h</a>
+</li>
+<li>sntp_setoperatingmode()
+: <a class="el" href="group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120">sntp.c</a>
+, <a class="el" href="group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120">sntp.h</a>
+</li>
+<li>sntp_setserver()
+: <a class="el" href="group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a">sntp.c</a>
+, <a class="el" href="group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a">sntp.h</a>
+</li>
+<li>SNTP_STARTUP_DELAY
+: <a class="el" href="group__sntp__opts.html#ga22017d43da7d4bf8d42e786b4ced4dfa">sntp_opts.h</a>
+</li>
+<li>SNTP_STARTUP_DELAY_FUNC
+: <a class="el" href="group__sntp__opts.html#gae082c2f3044d500ca5e1be1d4928de75">sntp_opts.h</a>
+</li>
+<li>sntp_stop()
+: <a class="el" href="group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488">sntp.h</a>
+, <a class="el" href="group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488">sntp.c</a>
+</li>
+<li>SNTP_UPDATE_DELAY
+: <a class="el" href="group__sntp__opts.html#ga9232c56443115be05a2f852eba21979c">sntp_opts.h</a>
+</li>
+<li>SO_REUSE
+: <a class="el" href="group__lwip__opts__socket.html#gaf3822feed320cf8439b083ee525e4942">opt.h</a>
+</li>
+<li>SO_REUSE_RXTOALL
+: <a class="el" href="group__lwip__opts__socket.html#gae9395d83af89002343e5782130f52f44">opt.h</a>
+</li>
+<li>socket
+: <a class="el" href="group__socket.html#ga862d8f4070c66dddb979540ce9ba6a83">sockets.h</a>
+</li>
+<li>SOCKETS_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga509594f3ba7d8b1356628b50b55a0934">opt.h</a>
+</li>
+<li>stats_init()
+: <a class="el" href="stats_8h.html#aeaa149d6c0445b22e944a063e0884d0d">stats.h</a>
+, <a class="el" href="stats_8c.html#aeaa149d6c0445b22e944a063e0884d0d">stats.c</a>
+</li>
+<li>SWAP_BYTES_IN_WORD
+: <a class="el" href="inet__chksum_8h.html#a0196bd603262882d16b5264b52eafe18">inet_chksum.h</a>
+</li>
+<li>SYS_ARCH_DECL_PROTECT
+: <a class="el" href="group__sys__prot.html#ga945395fa326214fc9736487242710a90">sys.h</a>
+</li>
+<li>sys_arch_mbox_fetch()
+: <a class="el" href="group__sys__mbox.html#ga6464cd77cf6799bd8b3d6c840166a2e8">sys.h</a>
+</li>
+<li>sys_arch_mbox_tryfetch()
+: <a class="el" href="group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c">sys.h</a>
+</li>
+<li>SYS_ARCH_PROTECT
+: <a class="el" href="group__sys__prot.html#ga3d0e48feafd378e9c26c64567ecd8bab">sys.h</a>
+</li>
+<li>sys_arch_sem_wait()
+: <a class="el" href="group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f">sys.h</a>
+</li>
+<li>SYS_ARCH_TIMEOUT
+: <a class="el" href="sys_8h.html#ac1495030a8ab5e1f3c89e42ced527c5b">sys.h</a>
+</li>
+<li>SYS_ARCH_UNPROTECT
+: <a class="el" href="group__sys__prot.html#ga2f48e97047945642ddeb27e65bf4ffe2">sys.h</a>
+</li>
+<li>sys_check_timeouts()
+: <a class="el" href="group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883">timeouts.h</a>
+, <a class="el" href="group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883">timeouts.c</a>
+</li>
+<li>SYS_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga2960ae20008f05da8cc0714f36365642">opt.h</a>
+</li>
+<li>sys_init()
+: <a class="el" href="group__sys__misc.html#gaf411a8bc6b7ed4b0af9114e10c959448">sys.h</a>
+</li>
+<li>sys_jiffies()
+: <a class="el" href="sys_8h.html#ac89f307e8b360eaf821b461a4f26753a">sys.h</a>
+</li>
+<li>SYS_LIGHTWEIGHT_PROT
+: <a class="el" href="group__lwip__opts__lock.html#gae85efb3a5fcf8585c94b3c2669978959">opt.h</a>
+</li>
+<li>SYS_MBOX_EMPTY
+: <a class="el" href="sys_8h.html#ab0571e67edca0132b144106e9b319ef9">sys.h</a>
+</li>
+<li>sys_mbox_free()
+: <a class="el" href="group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f">sys.h</a>
+</li>
+<li>sys_mbox_new()
+: <a class="el" href="group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc">sys.h</a>
+</li>
+<li>sys_mbox_post()
+: <a class="el" href="group__sys__mbox.html#ga9d068386a3c53dd01b8af99c3ef77555">sys.h</a>
+</li>
+<li>sys_mbox_set_invalid()
+: <a class="el" href="group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172">sys.h</a>
+</li>
+<li>sys_mbox_set_invalid_val
+: <a class="el" href="sys_8h.html#ae293feebb61d36f2db99be53702b8203">sys.h</a>
+</li>
+<li>sys_mbox_tryfetch
+: <a class="el" href="sys_8h.html#ab7841780b31ba9c0a39a440aad1fca13">sys.h</a>
+</li>
+<li>sys_mbox_trypost()
+: <a class="el" href="group__sys__mbox.html#gaa36345e48a49d67cbb0878cd4cbd2195">sys.h</a>
+</li>
+<li>sys_mbox_trypost_fromisr()
+: <a class="el" href="group__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a">sys.h</a>
+</li>
+<li>sys_mbox_valid()
+: <a class="el" href="group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d">sys.h</a>
+</li>
+<li>sys_mbox_valid_val
+: <a class="el" href="sys_8h.html#aae82640d0bdbeec7b9b6511b3f8d99cb">sys.h</a>
+</li>
+<li>sys_msleep()
+: <a class="el" href="group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e">sys.c</a>
+, <a class="el" href="group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e">sys.h</a>
+</li>
+<li>sys_mutex_free()
+: <a class="el" href="group__sys__mutex.html#ga16336ce68b741e98204102ca4bc84dd9">sys.h</a>
+</li>
+<li>sys_mutex_lock()
+: <a class="el" href="group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a">sys.h</a>
+</li>
+<li>sys_mutex_new()
+: <a class="el" href="group__sys__mutex.html#ga38e7dae1fd88b338eb1cd97f110f3897">sys.h</a>
+</li>
+<li>sys_mutex_set_invalid()
+: <a class="el" href="group__sys__mutex.html#ga3f392725971dc837aa56dd7e45fa7ca8">sys.h</a>
+</li>
+<li>sys_mutex_unlock()
+: <a class="el" href="group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb">sys.h</a>
+</li>
+<li>sys_mutex_valid()
+: <a class="el" href="group__sys__mutex.html#gaebe83ba90a6d9c23cdb3eb5d49562c4a">sys.h</a>
+</li>
+<li>sys_now()
+: <a class="el" href="group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199">sys.h</a>
+</li>
+<li>sys_restart_timeouts()
+: <a class="el" href="timeouts_8c.html#a6913959cf264dbe876b7e7c4db1cc13e">timeouts.c</a>
+, <a class="el" href="timeouts_8h.html#a6913959cf264dbe876b7e7c4db1cc13e">timeouts.h</a>
+</li>
+<li>sys_sem_free()
+: <a class="el" href="group__sys__sem.html#ga83b781f96c30e915c752065a757da283">sys.h</a>
+</li>
+<li>sys_sem_new()
+: <a class="el" href="group__sys__sem.html#gaf99da9e34a71855285c535183133dfde">sys.h</a>
+</li>
+<li>sys_sem_set_invalid()
+: <a class="el" href="group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33">sys.h</a>
+</li>
+<li>sys_sem_set_invalid_val
+: <a class="el" href="sys_8h.html#a2556e570f6973a6f4d57d0e76ef190d8">sys.h</a>
+</li>
+<li>sys_sem_signal()
+: <a class="el" href="group__sys__sem.html#gaaf800273061fcc3f8200fd4e1b9ca875">sys.h</a>
+</li>
+<li>sys_sem_valid()
+: <a class="el" href="group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4">sys.h</a>
+</li>
+<li>sys_sem_valid_val
+: <a class="el" href="sys_8h.html#a9e8ad541356786936f23ab83b8f550cc">sys.h</a>
+</li>
+<li>sys_sem_wait
+: <a class="el" href="sys_8h.html#a84e7e4bc00255aee84e6e7289a985703">sys.h</a>
+</li>
+<li>SYS_STATS
+: <a class="el" href="group__lwip__opts__stats.html#ga0173549afa76553583e5a02c6a791218">opt.h</a>
+</li>
+<li>sys_thread_new()
+: <a class="el" href="group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a">sys.h</a>
+</li>
+<li>sys_timeout()
+: <a class="el" href="timeouts_8c.html#a8deed391626ec8b5423998e33782d7a8">timeouts.c</a>
+, <a class="el" href="timeouts_8h.html#a8deed391626ec8b5423998e33782d7a8">timeouts.h</a>
+</li>
+<li>sys_timeout_handler
+: <a class="el" href="timeouts_8h.html#a2ab5bb8173f492563f70a519011b0ac1">timeouts.h</a>
+</li>
+<li>sys_timeouts_init()
+: <a class="el" href="timeouts_8h.html#a60f42f167f496f6f740c8df48f4dd26c">timeouts.h</a>
+, <a class="el" href="timeouts_8c.html#a60f42f167f496f6f740c8df48f4dd26c">timeouts.c</a>
+</li>
+<li>sys_timeouts_sleeptime()
+: <a class="el" href="timeouts_8h.html#aa9971a14a5810cfeb1efd7104cde6664">timeouts.h</a>
+, <a class="el" href="timeouts_8c.html#aa9971a14a5810cfeb1efd7104cde6664">timeouts.c</a>
+</li>
+<li>SYS_TIMEOUTS_SLEEPTIME_INFINITE
+: <a class="el" href="timeouts_8h.html#a9e2b2593e709ff54c7e3c0b003f6f1b0">timeouts.h</a>
+</li>
+<li>sys_untimeout()
+: <a class="el" href="timeouts_8c.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6">timeouts.c</a>
+, <a class="el" href="timeouts_8h.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6">timeouts.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_t.html b/doc/doxygen/output/html/globals_t.html
new file mode 100644
index 0000000..c90863c
--- /dev/null
+++ b/doc/doxygen/output/html/globals_t.html
@@ -0,0 +1,623 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_t.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_t"></a>- t -</h3><ul>
+<li>tCGIHandler
+: <a class="el" href="group__httpd.html#gafe011a487c5e8d03a6b2f629e14e6b5c">httpd.h</a>
+</li>
+<li>tcp_abandon()
+: <a class="el" href="tcp_8c.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe">tcp_priv.h</a>
+</li>
+<li>tcp_abort()
+: <a class="el" href="group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61">tcp.h</a>
+</li>
+<li>tcp_accept()
+: <a class="el" href="group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62">tcp.h</a>
+</li>
+<li>tcp_accept_fn
+: <a class="el" href="tcp_8h.html#a00517abce6856d6c82f0efebdafb734d">tcp.h</a>
+</li>
+<li>tcp_active_pcbs
+: <a class="el" href="tcp_8c.html#a78c09dbae67ccc06b659d9f1a388f911">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a78c09dbae67ccc06b659d9f1a388f911">tcp_priv.h</a>
+</li>
+<li>tcp_alloc()
+: <a class="el" href="tcp_8c.html#a1dd6830a42b3c464b5a72f62ae312d0a">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a1dd6830a42b3c464b5a72f62ae312d0a">tcp_priv.h</a>
+</li>
+<li>tcp_arg()
+: <a class="el" href="group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6">tcp.h</a>
+</li>
+<li>tcp_backlog_accepted()
+: <a class="el" href="group__tcp__raw.html#ga619154658137a23839ca3b94882131ca">tcp.h</a>
+, <a class="el" href="group__tcp__raw.html#ga619154658137a23839ca3b94882131ca">tcp.c</a>
+</li>
+<li>tcp_backlog_delayed()
+: <a class="el" href="group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8">tcp.h</a>
+</li>
+<li>tcp_bind()
+: <a class="el" href="group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee">tcp.h</a>
+</li>
+<li>tcp_bind_netif()
+: <a class="el" href="group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f">tcp.h</a>
+</li>
+<li>tcp_bound_pcbs
+: <a class="el" href="tcp_8c.html#a1b42a7ac0fc173a42d575f86853d32a8">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a1b42a7ac0fc173a42d575f86853d32a8">tcp_priv.h</a>
+</li>
+<li>TCP_BUILD_MSS_OPTION
+: <a class="el" href="tcp__priv_8h.html#abdc99c343efc6c81abf60bb62b361dd8">tcp_priv.h</a>
+</li>
+<li>TCP_CALCULATE_EFF_SEND_MSS
+: <a class="el" href="group__lwip__opts__tcp.html#gac04b84d32251ac558f0c3a8af85ba3a5">opt.h</a>
+</li>
+<li>TCP_CHECKSUM_ON_COPY
+: <a class="el" href="tcp__priv_8h.html#aea0c47b916a8a25f82d2063335033aee">tcp_priv.h</a>
+</li>
+<li>TCP_CHECKSUM_ON_COPY_SANITY_CHECK
+: <a class="el" href="tcp__out_8c.html#a25d7e9081baa5c84f2ebd34b0eb4169b">tcp_out.c</a>
+</li>
+<li>tcp_close()
+: <a class="el" href="group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623">tcp.h</a>
+</li>
+<li>tcp_connect()
+: <a class="el" href="group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012">tcp.h</a>
+, <a class="el" href="group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012">tcp.c</a>
+</li>
+<li>tcp_connected_fn
+: <a class="el" href="tcp_8h.html#a939867106bd492caf2d85852fb7f6ae8">tcp.h</a>
+</li>
+<li>TCP_CWND_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga66df03d8192cd978d3321a9d68bf5411">opt.h</a>
+</li>
+<li>TCP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga4f43bb8a430c7a52a1ad5086d3f2803c">opt.h</a>
+</li>
+<li>TCP_DEFAULT_LISTEN_BACKLOG
+: <a class="el" href="group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf">opt.h</a>
+</li>
+<li>tcp_do_output_nagle
+: <a class="el" href="tcp__priv_8h.html#afbd7a2997e3a3b7569efc3298e2e409f">tcp_priv.h</a>
+</li>
+<li>tcp_eff_send_mss_netif()
+: <a class="el" href="tcp_8c.html#a08a3b5396c40f32dd8b21e7d63b3e1b3">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a08a3b5396c40f32dd8b21e7d63b3e1b3">tcp_priv.h</a>
+</li>
+<li>tcp_enqueue_flags()
+: <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()
+: <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
+: <a class="el" href="tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55">tcp.h</a>
+</li>
+<li>tcp_ext_arg_alloc_id()
+: <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()
+: <a class="el" href="group__tcp__raw__extargs.html#gaa8ac7a74407cb3e0e01a30314805f990">tcp.c</a>
+, <a class="el" href="group__tcp__raw__extargs.html#gaa8ac7a74407cb3e0e01a30314805f990">tcp.h</a>
+</li>
+<li>tcp_ext_arg_invoke_callbacks_passive_open()
+: <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()
+: <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()
+: <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_extarg_callback_passive_open_fn
+: <a class="el" href="tcp_8h.html#aba649c5bdf19d47e39643392b6d88588">tcp.h</a>
+</li>
+<li>tcp_extarg_callback_pcb_destroyed_fn
+: <a class="el" href="tcp_8h.html#a20881e537f5be7847d88fe2a0c8fd2cd">tcp.h</a>
+</li>
+<li>tcp_fasttmr()
+: <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_FR_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga5895bee26e8e1a0b89d597e0f2580b23">opt.h</a>
+</li>
+<li>tcp_free()
+: <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()
+: <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>
+<li>tcp_input()
+: <a class="el" href="tcp__in_8c.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5">tcp_in.c</a>
+, <a class="el" href="tcp__priv_8h.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5">tcp_priv.h</a>
+</li>
+<li>TCP_INPUT_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gaf51dc2563536de56470146749f715ba8">opt.h</a>
+</li>
+<li>tcp_keepalive()
+: <a class="el" href="tcp__out_8c.html#a0d8bb5fc8522515aa35d305774cc5332">tcp_out.c</a>
+, <a class="el" href="tcp__priv_8h.html#a0d8bb5fc8522515aa35d305774cc5332">tcp_priv.h</a>
+</li>
+<li>tcp_listen
+: <a class="el" href="group__tcp__raw.html#ga6b2a4efb1fc15d7d85cb71cb2a1d1066">tcp.h</a>
+</li>
+<li>TCP_LISTEN_BACKLOG
+: <a class="el" href="group__lwip__opts__tcp.html#ga98b23e7cbd3281915c50a485cb61899d">opt.h</a>
+</li>
+<li>tcp_listen_pcbs
+: <a class="el" href="tcp_8c.html#a96fe1350e510d4308ac9969ffb4c9c81">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a96fe1350e510d4308ac9969ffb4c9c81">tcp_priv.h</a>
+</li>
+<li>tcp_listen_with_backlog()
+: <a class="el" href="group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338">tcp.h</a>
+</li>
+<li>tcp_listen_with_backlog_and_err()
+: <a class="el" href="group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436">tcp.h</a>
+</li>
+<li>TCP_MAXRTX
+: <a class="el" href="group__lwip__opts__tcp.html#ga0dee0911197855bdf19ef79778c241a6">opt.h</a>
+</li>
+<li>TCP_MSS
+: <a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">opt.h</a>
+</li>
+<li>tcp_mss
+: <a class="el" href="group__tcp__raw.html#gab0b45a01dcd461e5b8df2a1d9ddda134">tcp.h</a>
+</li>
+<li>tcp_nagle_disable
+: <a class="el" href="group__tcp__raw.html#ga5b5c0093efff4466bda06d45f12a4633">tcp.h</a>
+</li>
+<li>tcp_nagle_disabled
+: <a class="el" href="group__tcp__raw.html#ga9398061411b4af900160233aa3b1a286">tcp.h</a>
+</li>
+<li>tcp_nagle_enable
+: <a class="el" href="group__tcp__raw.html#ga9dfcdb8a05533b07dca91cf7e784f88f">tcp.h</a>
+</li>
+<li>tcp_netif_ip_addr_changed()
+: <a class="el" href="tcp_8c.html#a4d0c2d1ad02134c79fc72fe95ee2a703">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a4d0c2d1ad02134c79fc72fe95ee2a703">tcp_priv.h</a>
+</li>
+<li>tcp_new()
+: <a class="el" href="group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943">tcp.h</a>
+</li>
+<li>tcp_new_ip_type()
+: <a class="el" href="group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937">tcp.h</a>
+</li>
+<li>tcp_next_iss()
+: <a class="el" href="tcp_8c.html#afd5dc2fa74855a84b2da642ba31059ea">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#afd5dc2fa74855a84b2da642ba31059ea">tcp_priv.h</a>
+</li>
+<li>TCP_OOSEQ_MAX_BYTES
+: <a class="el" href="group__lwip__opts__tcp.html#ga9d6d3219bb5fc0bc760a64114de13c25">opt.h</a>
+</li>
+<li>TCP_OOSEQ_MAX_PBUFS
+: <a class="el" href="group__lwip__opts__tcp.html#ga1f57d3859c4556f785708e5dc440617e">opt.h</a>
+</li>
+<li>tcp_output()
+: <a class="el" href="group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f">tcp_out.c</a>
+, <a class="el" href="group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f">tcp.h</a>
+</li>
+<li>TCP_OUTPUT_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga9f70601fdc1feee490772bf7fcdb74fb">opt.h</a>
+</li>
+<li>TCP_OVERSIZE
+: <a class="el" href="group__lwip__opts__tcp.html#ga5648e2580bb55c0efdfbebcf3bad1eef">opt.h</a>
+</li>
+<li>TCP_OVERSIZE_CALC_LENGTH
+: <a class="el" href="tcp__out_8c.html#aa2ef22d2384225a1b5fee187411cc129">tcp_out.c</a>
+</li>
+<li>TCP_OVERSIZE_DBGCHECK
+: <a class="el" href="tcp__priv_8h.html#a178a6e9966d03c3326b9e0568666bb69">tcp_priv.h</a>
+</li>
+<li>TCP_PCB_COMMON
+: <a class="el" href="tcp_8h.html#a874630045102fc5f1442704a790c8bb8">tcp.h</a>
+</li>
+<li>tcp_pcb_lists
+: <a class="el" href="tcp_8c.html#a51515507dec664e9d69a870e6b627610">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#af5e1079ab223e1cb27208c45e3c84df7">tcp_priv.h</a>
+</li>
+<li>tcp_pcb_purge()
+: <a class="el" href="tcp_8c.html#a44fc672b9d14a65e61040707c45302ba">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a44fc672b9d14a65e61040707c45302ba">tcp_priv.h</a>
+</li>
+<li>tcp_pcb_remove()
+: <a class="el" href="tcp_8c.html#aaaef096f6a03bf5b778329bb66ee06f6">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#aaaef096f6a03bf5b778329bb66ee06f6">tcp_priv.h</a>
+</li>
+<li>tcp_poll()
+: <a class="el" href="group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5">tcp.h</a>
+</li>
+<li>tcp_poll_fn
+: <a class="el" href="tcp_8h.html#a66deb97618a9cd9d57fca28c5245e073">tcp.h</a>
+</li>
+<li>tcp_process_refused_data()
+: <a class="el" href="tcp_8c.html#a0075b56ad4b0eca7c9d439cf150e1973">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a0075b56ad4b0eca7c9d439cf150e1973">tcp_priv.h</a>
+</li>
+<li>TCP_QLEN_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gae7980c7f8eb45cd411bf410ff0a3fc55">opt.h</a>
+</li>
+<li>TCP_QUEUE_OOSEQ
+: <a class="el" href="group__lwip__opts__tcp.html#ga89ffd0d7d1529bdb26bfbad267d0ad75">opt.h</a>
+</li>
+<li>tcp_recv()
+: <a class="el" href="group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0">tcp.c</a>
+, <a class="el" href="group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0">tcp.h</a>
+</li>
+<li>tcp_recv_fn
+: <a class="el" href="tcp_8h.html#a780cfac08b02c66948ab94ea974202e8">tcp.h</a>
+</li>
+<li>tcp_recv_null()
+: <a class="el" href="tcp_8c.html#a0cb3f604fc8d20870d8cab291da5701c">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a0cb3f604fc8d20870d8cab291da5701c">tcp_priv.h</a>
+</li>
+<li>tcp_recved()
+: <a class="el" href="group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44">tcp.h</a>
+, <a class="el" href="group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44">tcp.c</a>
+</li>
+<li>tcp_rexmit()
+: <a class="el" href="tcp__out_8c.html#af75fefe4fe509845be156d6e424eb6f1">tcp_out.c</a>
+, <a class="el" href="tcp__priv_8h.html#af75fefe4fe509845be156d6e424eb6f1">tcp_priv.h</a>
+</li>
+<li>tcp_rexmit_fast()
+: <a class="el" href="tcp__priv_8h.html#adb6ee7b4d59f125cc8bfac3bb5ca3937">tcp_priv.h</a>
+, <a class="el" href="tcp__out_8c.html#adb6ee7b4d59f125cc8bfac3bb5ca3937">tcp_out.c</a>
+</li>
+<li>tcp_rexmit_rto()
+: <a class="el" href="tcp__out_8c.html#ab5ef9c8ab4629eb721987ae316b9f30f">tcp_out.c</a>
+, <a class="el" href="tcp__priv_8h.html#ab5ef9c8ab4629eb721987ae316b9f30f">tcp_priv.h</a>
+</li>
+<li>tcp_rexmit_rto_commit()
+: <a class="el" href="tcp__priv_8h.html#a9ef9dc094e21bdf0779aed25ab0b08d4">tcp_priv.h</a>
+, <a class="el" href="tcp__out_8c.html#a9ef9dc094e21bdf0779aed25ab0b08d4">tcp_out.c</a>
+</li>
+<li>tcp_rexmit_rto_prepare()
+: <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()
+: <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
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga37596f7bbb9b7663826244ba54486679">opt.h</a>
+</li>
+<li>TCP_RTO_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#gad6e52e37415d0d0cbe4931a28f5a9662">opt.h</a>
+</li>
+<li>tcp_seg_copy()
+: <a class="el" href="tcp__priv_8h.html#a569d79451d2570e4ef406775725ef6ef">tcp_priv.h</a>
+, <a class="el" href="tcp_8c.html#a569d79451d2570e4ef406775725ef6ef">tcp.c</a>
+</li>
+<li>tcp_seg_free()
+: <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()
+: <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()
+: <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()
+: <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()
+: <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
+: <a class="el" href="tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18">tcp.h</a>
+</li>
+<li>tcp_setprio()
+: <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_shutdown()
+: <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()
+: <a class="el" href="tcp__priv_8h.html#a421fb42ef919018e14ae413adfee9905">tcp_priv.h</a>
+, <a class="el" href="tcp_8c.html#a421fb42ef919018e14ae413adfee9905">tcp.c</a>
+</li>
+<li>TCP_SND_BUF
+: <a class="el" href="group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd">opt.h</a>
+</li>
+<li>TCP_SND_QUEUELEN
+: <a class="el" href="group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904">opt.h</a>
+</li>
+<li>tcp_sndbuf
+: <a class="el" href="group__tcp__raw.html#gad1a95f09deb49cd7341d35527d6d3e2f">tcp.h</a>
+</li>
+<li>TCP_SNDLOWAT
+: <a class="el" href="group__lwip__opts__tcp.html#gae5c9866d7cd463ac7b36792182145aec">opt.h</a>
+</li>
+<li>tcp_sndqueuelen
+: <a class="el" href="group__tcp__raw.html#ga53ee4364718e84dc42cb1e0179deb1f4">tcp.h</a>
+</li>
+<li>TCP_SNDQUEUELOWAT
+: <a class="el" href="group__lwip__opts__tcp.html#ga75659867592a6b01c198532ed1b65698">opt.h</a>
+</li>
+<li>tcp_split_unsent_seg()
+: <a class="el" href="tcp__priv_8h.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5">tcp_priv.h</a>
+, <a class="el" href="tcp__out_8c.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5">tcp_out.c</a>
+</li>
+<li>TCP_STATS
+: <a class="el" href="group__lwip__opts__stats.html#gaa02ec5c5bc0edebe418680c54d044f58">opt.h</a>
+</li>
+<li>TCP_SYNMAXRTX
+: <a class="el" href="group__lwip__opts__tcp.html#ga50b434a8541a4813f7b27f576c05d1b6">opt.h</a>
+</li>
+<li>tcp_timer_needed()
+: <a class="el" href="tcp__priv_8h.html#a8181bc316fdf61b85f787c5cadfcd249">tcp_priv.h</a>
+, <a class="el" href="timeouts_8c.html#a8181bc316fdf61b85f787c5cadfcd249">timeouts.c</a>
+</li>
+<li>tcp_tmr()
+: <a class="el" href="tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a3846a756b13214ed88ea47d0ff8279eb">tcp_priv.h</a>
+</li>
+<li>TCP_TTL
+: <a class="el" href="group__lwip__opts__tcp.html#gacd5b25ea81d2894790d25da5393cdab4">opt.h</a>
+</li>
+<li>tcp_tw_pcbs
+: <a class="el" href="tcp_8c.html#a9a522a66c5e1f1a4e28fe7a672cc64e3">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a9a522a66c5e1f1a4e28fe7a672cc64e3">tcp_priv.h</a>
+</li>
+<li>tcp_txnow()
+: <a class="el" href="tcp_8c.html#a5ae0268e59fda0665fdd08c6e77ec547">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a5ae0268e59fda0665fdd08c6e77ec547">tcp_priv.h</a>
+</li>
+<li>tcp_update_rcv_ann_wnd()
+: <a class="el" href="tcp_8c.html#a6d2c254b779db4e517cb34e41301588d">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a6d2c254b779db4e517cb34e41301588d">tcp_priv.h</a>
+</li>
+<li>TCP_WND
+: <a class="el" href="group__lwip__opts__tcp.html#ga7f535a6efb5cdf86c3210e35ece1d6a7">opt.h</a>
+</li>
+<li>TCP_WND_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga3704f433e947d6342da77c74e33627e1">opt.h</a>
+</li>
+<li>TCP_WND_UPDATE_THRESHOLD
+: <a class="el" href="group__lwip__opts__tcp.html#ga5d45732ba3a8438b141096d86e07ef8d">opt.h</a>
+</li>
+<li>tcp_write()
+: <a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp.h</a>
+, <a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp_out.c</a>
+</li>
+<li>tcp_zero_window_probe()
+: <a class="el" href="tcp__priv_8h.html#a6c20490aa45c771c38ce8ad3031cbdf6">tcp_priv.h</a>
+, <a class="el" href="tcp__out_8c.html#a6c20490aa45c771c38ce8ad3031cbdf6">tcp_out.c</a>
+</li>
+<li>tcpip_6lowpan_input()
+: <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()
+: <a class="el" href="tcpip__priv_8h.html#a3d42b0c46607f91aedcc7745ed466b08">tcpip_priv.h</a>
+, <a class="el" href="tcpip_8c.html#a3d42b0c46607f91aedcc7745ed466b08">tcpip.c</a>
+</li>
+<li>tcpip_callback()
+: <a class="el" href="group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip.h</a>
+, <a class="el" href="group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip.c</a>
+</li>
+<li>tcpip_callback_fn
+: <a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip.h</a>
+</li>
+<li>tcpip_callback_with_block
+: <a class="el" href="group__lwip__os.html#gacd0a865623921ada2dd08962eb82c9df">tcpip.h</a>
+</li>
+<li>tcpip_callbackmsg_delete()
+: <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()
+: <a class="el" href="group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac">tcpip.h</a>
+, <a class="el" href="group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac">tcpip.c</a>
+</li>
+<li>tcpip_callbackmsg_trycallback()
+: <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>
+<li>tcpip_callbackmsg_trycallback_fromisr()
+: <a class="el" href="group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666">tcpip.c</a>
+, <a class="el" href="group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666">tcpip.h</a>
+</li>
+<li>TCPIP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga52d6c83451936c3de3b0338d4a3f921f">opt.h</a>
+</li>
+<li>tcpip_init()
+: <a class="el" href="group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db">tcpip.h</a>
+, <a class="el" href="group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db">tcpip.c</a>
+</li>
+<li>tcpip_init_done_fn
+: <a class="el" href="tcpip_8h.html#a5fe07216c441e27c3028bcac60fa0992">tcpip.h</a>
+</li>
+<li>tcpip_inpkt()
+: <a class="el" href="tcpip_8h.html#a93043b3c66dbe4a15a60299c6199d102">tcpip.h</a>
+, <a class="el" href="tcpip_8c.html#a93043b3c66dbe4a15a60299c6199d102">tcpip.c</a>
+</li>
+<li>tcpip_input()
+: <a class="el" href="group__lwip__os.html#gae510f195171bed8499ae94e264a92717">tcpip.h</a>
+, <a class="el" href="group__lwip__os.html#gae510f195171bed8499ae94e264a92717">tcpip.c</a>
+</li>
+<li>TCPIP_MBOX_SIZE
+: <a class="el" href="group__lwip__opts__thread.html#ga8cf210ad4e4bf616860a45fbd140fd06">opt.h</a>
+</li>
+<li>tcpip_rfc7668_input()
+: <a class="el" href="lowpan6__ble_8c.html#a6ae90ad69f5d901eb44cf87b9120cd9a">lowpan6_ble.c</a>
+, <a class="el" href="lowpan6__ble_8h.html#a6ae90ad69f5d901eb44cf87b9120cd9a">lowpan6_ble.h</a>
+</li>
+<li>tcpip_send_msg_wait_sem()
+: <a class="el" href="tcpip__priv_8h.html#a12bdf37eddcd72c4178e3ea7d370395d">tcpip_priv.h</a>
+, <a class="el" href="tcpip_8c.html#a12bdf37eddcd72c4178e3ea7d370395d">tcpip.c</a>
+</li>
+<li>TCPIP_THREAD_NAME
+: <a class="el" href="group__lwip__opts__thread.html#ga405e604e4328e1feb878c6fe1798a587">opt.h</a>
+</li>
+<li>TCPIP_THREAD_PRIO
+: <a class="el" href="group__lwip__opts__thread.html#ga42b2c7a3042d7c3efd00f367f5837435">opt.h</a>
+</li>
+<li>TCPIP_THREAD_STACKSIZE
+: <a class="el" href="group__lwip__opts__thread.html#gaa02b84eafa0c8b09b158b97c96d79db0">opt.h</a>
+</li>
+<li>tcpip_try_callback()
+: <a class="el" href="group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip.h</a>
+, <a class="el" href="group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip.c</a>
+</li>
+<li>TF_RESET
+: <a class="el" href="tcp__priv_8h.html#ac9dbdaeac3e25f5badf3a763a1b0b990">tcp_priv.h</a>
+</li>
+<li>tftp_cleanup()
+: <a class="el" href="group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec">tftp_server.h</a>
+, <a class="el" href="group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec">tftp_server.c</a>
+</li>
+<li>TFTP_DEBUG
+: <a class="el" href="group__tftp__opts.html#ga2dd54a1d0c3006527b8a7a8604b81981">tftp_opts.h</a>
+</li>
+<li>tftp_init()
+: <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_MAX_FILENAME_LEN
+: <a class="el" href="group__tftp__opts.html#ga8e975900b4397313f1a649ff76a3063b">tftp_opts.h</a>
+</li>
+<li>TFTP_MAX_MODE_LEN
+: <a class="el" href="group__tftp__opts.html#gaa8a449c25e37be757f5efccd422c9055">tftp_opts.h</a>
+</li>
+<li>TFTP_MAX_RETRIES
+: <a class="el" href="group__tftp__opts.html#ga6a01757ad942eb602e8a87e2be42d313">tftp_opts.h</a>
+</li>
+<li>TFTP_PORT
+: <a class="el" href="group__tftp__opts.html#gad9230620a5d3bb87a7ac280ff99875d1">tftp_opts.h</a>
+</li>
+<li>TFTP_TIMEOUT_MSECS
+: <a class="el" href="group__tftp__opts.html#ga36986e5465dc2ccb6184fc57f9a37d63">tftp_opts.h</a>
+</li>
+<li>TFTP_TIMER_MSECS
+: <a class="el" href="group__tftp__opts.html#ga3e6caacb3f4d43f780b2d68ffe4258ea">tftp_opts.h</a>
+</li>
+<li>TIMERS_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga24a6644ba9cc82665a7bf209b3870c15">opt.h</a>
+</li>
+<li>tSSIHandler
+: <a class="el" href="group__httpd.html#gaf88dacc4f18d299084cab75252001319">httpd.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_type.html b/doc/doxygen/output/html/globals_type.html
new file mode 100644
index 0000000..e30cd18
--- /dev/null
+++ b/doc/doxygen/output/html/globals_type.html
@@ -0,0 +1,298 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_type.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_a"></a>- a -</h3><ul>
+<li>altcp_allocator_t
+: <a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_b"></a>- b -</h3><ul>
+<li>bridgeif_initdata_t
+: <a class="el" href="group__bridgeif.html#gac47f8ce66bc6dad5dd9829467f93a1bb">bridgeif.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>dns_found_callback
+: <a class="el" href="dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae">dns.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_e"></a>- e -</h3><ul>
+<li>err_t
+: <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_h"></a>- h -</h3><ul>
+<li>httpc_headers_done_fn
+: <a class="el" href="group__httpc.html#ga1e5b62519d6592c89ed3edfabd917472">http_client.h</a>
+</li>
+<li>httpc_result_fn
+: <a class="el" href="group__httpc.html#ga0452eb8007dbb5f139ec992e58e560dd">http_client.h</a>
+</li>
+<li>httpc_result_t
+: <a class="el" href="group__httpc.html#gac6713454283bff8e1187849e8d4bda18">http_client.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>ip4_addr_t
+: <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr.h</a>
+</li>
+<li>ip6_addr_t
+: <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr.h</a>
+</li>
+<li>ip_addr_t
+: <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_l"></a>- l -</h3><ul>
+<li>lwip_cyclic_timer_handler
+: <a class="el" href="timeouts_8h.html#a985c5d366b62bd179195e093ffcb7ecd">timeouts.h</a>
+</li>
+<li>lwip_thread_fn
+: <a class="el" href="sys_8h.html#ae30a77bf6bd69bfcc5f235eaad54f2b9">sys.h</a>
+</li>
+<li>lwiperf_report_fn
+: <a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf.h</a>
+</li>
+<li>lwiperf_settings_t
+: <a class="el" href="lwiperf_8c.html#a4a794a0c1a90b889d54b1dacbce923f4">lwiperf.c</a>
+</li>
+<li>lwiperf_state_tcp_t
+: <a class="el" href="lwiperf_8c.html#a06db7abdf1d4864ca2b367d9c89e3e2d">lwiperf.c</a>
+</li>
+</ul>
+
+
+<h3><a id="index_m"></a>- m -</h3><ul>
+<li>mdns_name_result_cb_t
+: <a class="el" href="mdns_8h.html#a19f12d7092de6fe90d5843e4ef8d4536">mdns.h</a>
+</li>
+<li>mqtt_connection_cb_t
+: <a class="el" href="group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f">mqtt.h</a>
+</li>
+<li>mqtt_incoming_data_cb_t
+: <a class="el" href="group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81">mqtt.h</a>
+</li>
+<li>mqtt_incoming_publish_cb_t
+: <a class="el" href="group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29">mqtt.h</a>
+</li>
+<li>mqtt_request_cb_t
+: <a class="el" href="group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd">mqtt.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>netconn_callback
+: <a class="el" href="api_8h.html#a3e130339f00202b3ab714af502163a2d">api.h</a>
+</li>
+<li>netif_ext_callback_fn
+: <a class="el" href="group__netif.html#ga5ee213cea065424c89c66f138c008da1">netif.h</a>
+</li>
+<li>netif_igmp_mac_filter_fn
+: <a class="el" href="netif_8h.html#a71cad3277efe29191eef3348f4bf21f7">netif.h</a>
+</li>
+<li>netif_init_fn
+: <a class="el" href="netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5">netif.h</a>
+</li>
+<li>netif_input_fn
+: <a class="el" href="netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e">netif.h</a>
+</li>
+<li>netif_linkoutput_fn
+: <a class="el" href="netif_8h.html#ab75e9d808bc1b788bea84213e6a111ed">netif.h</a>
+</li>
+<li>netif_mld_mac_filter_fn
+: <a class="el" href="netif_8h.html#af2ed0716122b65e7feb43e0dd99ae468">netif.h</a>
+</li>
+<li>netif_nsc_reason_t
+: <a class="el" href="group__netif.html#gab2b9387389513a02027c62e246723808">netif.h</a>
+</li>
+<li>netif_output_fn
+: <a class="el" href="netif_8h.html#a7b4893aa2ed8c606a0cd7aa932fe5067">netif.h</a>
+</li>
+<li>netif_output_ip6_fn
+: <a class="el" href="netif_8h.html#a343a5b14136a51957d552527384674b3">netif.h</a>
+</li>
+<li>netif_status_callback_fn
+: <a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>pbuf_free_custom_fn
+: <a class="el" href="pbuf_8h.html#a6d285ce1d910f25e511c8c38532a1dce">pbuf.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_r"></a>- r -</h3><ul>
+<li>raw_input_state_t
+: <a class="el" href="raw__priv_8h.html#aebbdbaee89c38ad9c007a1d1a336e687">raw_priv.h</a>
+</li>
+<li>raw_recv_fn
+: <a class="el" href="raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd">raw.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>service_get_txt_fn_t
+: <a class="el" href="mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83">mdns.h</a>
+</li>
+<li>sys_timeout_handler
+: <a class="el" href="timeouts_8h.html#a2ab5bb8173f492563f70a519011b0ac1">timeouts.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_t"></a>- t -</h3><ul>
+<li>tCGIHandler
+: <a class="el" href="group__httpd.html#gafe011a487c5e8d03a6b2f629e14e6b5c">httpd.h</a>
+</li>
+<li>tcp_accept_fn
+: <a class="el" href="tcp_8h.html#a00517abce6856d6c82f0efebdafb734d">tcp.h</a>
+</li>
+<li>tcp_connected_fn
+: <a class="el" href="tcp_8h.html#a939867106bd492caf2d85852fb7f6ae8">tcp.h</a>
+</li>
+<li>tcp_err_fn
+: <a class="el" href="tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55">tcp.h</a>
+</li>
+<li>tcp_extarg_callback_passive_open_fn
+: <a class="el" href="tcp_8h.html#aba649c5bdf19d47e39643392b6d88588">tcp.h</a>
+</li>
+<li>tcp_extarg_callback_pcb_destroyed_fn
+: <a class="el" href="tcp_8h.html#a20881e537f5be7847d88fe2a0c8fd2cd">tcp.h</a>
+</li>
+<li>tcp_poll_fn
+: <a class="el" href="tcp_8h.html#a66deb97618a9cd9d57fca28c5245e073">tcp.h</a>
+</li>
+<li>tcp_recv_fn
+: <a class="el" href="tcp_8h.html#a780cfac08b02c66948ab94ea974202e8">tcp.h</a>
+</li>
+<li>tcp_sent_fn
+: <a class="el" href="tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18">tcp.h</a>
+</li>
+<li>tcpip_callback_fn
+: <a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip.h</a>
+</li>
+<li>tcpip_init_done_fn
+: <a class="el" href="tcpip_8h.html#a5fe07216c441e27c3028bcac60fa0992">tcpip.h</a>
+</li>
+<li>tSSIHandler
+: <a class="el" href="group__httpd.html#gaf88dacc4f18d299084cab75252001319">httpd.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_u"></a>- u -</h3><ul>
+<li>udp_recv_fn
+: <a class="el" href="udp_8h.html#af0ec7feb31acdb6e11b928f438c8a64b">udp.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_u.html b/doc/doxygen/output/html/globals_u.html
new file mode 100644
index 0000000..c0d81d0
--- /dev/null
+++ b/doc/doxygen/output/html/globals_u.html
@@ -0,0 +1,177 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_u.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_u"></a>- u -</h3><ul>
+<li>udp_bind()
+: <a class="el" href="group__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e">udp.c</a>
+, <a class="el" href="group__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e">udp.h</a>
+</li>
+<li>udp_bind_netif()
+: <a class="el" href="group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8">udp.h</a>
+, <a class="el" href="group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8">udp.c</a>
+</li>
+<li>udp_connect()
+: <a class="el" href="group__udp__raw.html#ga83625967670477aa254643129a53971b">udp.c</a>
+, <a class="el" href="group__udp__raw.html#ga83625967670477aa254643129a53971b">udp.h</a>
+</li>
+<li>UDP_DEBUG
+: <a class="el" href="group__lwip__opts__debugmsg.html#ga0393f312c5475a1c649b39ef9cfcaad4">opt.h</a>
+</li>
+<li>udp_disconnect()
+: <a class="el" href="group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc">udp.c</a>
+, <a class="el" href="group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc">udp.h</a>
+</li>
+<li>udp_init()
+: <a class="el" href="udp_8c.html#ae7f7431ce99333577d7b82b26619309e">udp.c</a>
+, <a class="el" href="udp_8h.html#ae7f7431ce99333577d7b82b26619309e">udp.h</a>
+</li>
+<li>udp_input()
+: <a class="el" href="udp_8c.html#a7b338a5515606bd51976fbc5bcec9611">udp.c</a>
+, <a class="el" href="udp_8h.html#a7b338a5515606bd51976fbc5bcec9611">udp.h</a>
+</li>
+<li>udp_netif_ip_addr_changed()
+: <a class="el" href="udp_8c.html#ab857f86a0b15d02b864292b161b2c3fc">udp.c</a>
+, <a class="el" href="udp_8h.html#ab857f86a0b15d02b864292b161b2c3fc">udp.h</a>
+</li>
+<li>udp_new()
+: <a class="el" href="group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209">udp.c</a>
+, <a class="el" href="group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209">udp.h</a>
+</li>
+<li>udp_new_ip_type()
+: <a class="el" href="group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88">udp.c</a>
+, <a class="el" href="group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88">udp.h</a>
+</li>
+<li>udp_recv()
+: <a class="el" href="group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027">udp.c</a>
+, <a class="el" href="group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027">udp.h</a>
+</li>
+<li>udp_recv_fn
+: <a class="el" href="udp_8h.html#af0ec7feb31acdb6e11b928f438c8a64b">udp.h</a>
+</li>
+<li>udp_remove()
+: <a class="el" href="group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646">udp.c</a>
+, <a class="el" href="group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646">udp.h</a>
+</li>
+<li>udp_send()
+: <a class="el" href="group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc">udp.c</a>
+, <a class="el" href="group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc">udp.h</a>
+</li>
+<li>udp_sendto()
+: <a class="el" href="group__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743">udp.c</a>
+, <a class="el" href="group__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743">udp.h</a>
+</li>
+<li>udp_sendto_if()
+: <a class="el" href="group__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142">udp.h</a>
+, <a class="el" href="group__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142">udp.c</a>
+</li>
+<li>udp_sendto_if_src()
+: <a class="el" href="group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7">udp.h</a>
+, <a class="el" href="group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7">udp.c</a>
+</li>
+<li>UDP_STATS
+: <a class="el" href="group__lwip__opts__stats.html#gaef64b11bf71f0d6d5bafaf6092462276">opt.h</a>
+</li>
+<li>UDP_TTL
+: <a class="el" href="group__lwip__opts__udp.html#ga97908a317bcba89174b5d1ccbdca0096">opt.h</a>
+</li>
+<li>UNLOCK_TCPIP_CORE
+: <a class="el" href="tcpip_8h.html#a915effea029b9c4891e1ec635eb1826d">tcpip.h</a>
+</li>
+<li>unmap_ipv4_mapped_ipv6
+: <a class="el" href="group__ipaddr.html#ga66b5a64b12128e3716bcf04ff91b5a57">ip_addr.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_vars.html b/doc/doxygen/output/html/globals_vars.html
new file mode 100644
index 0000000..cea5186
--- /dev/null
+++ b/doc/doxygen/output/html/globals_vars.html
@@ -0,0 +1,211 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_vars.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>dhcp6_rx_options
+: <a class="el" href="dhcp6_8c.html#abcce06f078da4b03265d20c0bc1bdce0">dhcp6.c</a>
+</li>
+<li>dhcp_rx_options_given
+: <a class="el" href="dhcp_8c.html#a058b71e1d26b3758b29d16d9f892c8cc">dhcp.c</a>
+</li>
+<li>dhcp_rx_options_val
+: <a class="el" href="dhcp_8c.html#a5abd232496063bddcbc6692c0e8f9c1f">dhcp.c</a>
+</li>
+</ul>
+
+
+<h3><a id="index_h"></a>- h -</h3><ul>
+<li>h_errno
+: <a class="el" href="netdb_8c.html#a2a1ce3f2040007303d36c0b682b5ac10">netdb.c</a>
+, <a class="el" href="lwip_2netdb_8h.html#a2a1ce3f2040007303d36c0b682b5ac10">netdb.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>in6addr_any
+: <a class="el" href="inet6_8c.html#af8c97553060738d9edd6bfeab13ef7c3">inet6.c</a>
+, <a class="el" href="lwip_2inet_8h.html#af8c97553060738d9edd6bfeab13ef7c3">inet.h</a>
+</li>
+<li>ip_data
+: <a class="el" href="ip_8c.html#ac944fb6564f181bc90bc7c2b8b00d94c">ip.c</a>
+, <a class="el" href="ip_8h.html#ac944fb6564f181bc90bc7c2b8b00d94c">ip.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_l"></a>- l -</h3><ul>
+<li>lock_tcpip_core
+: <a class="el" href="tcpip_8c.html#acd7be2108e9a47fd8f1ab0a49f76241d">tcpip.c</a>
+, <a class="el" href="tcpip_8h.html#acd7be2108e9a47fd8f1ab0a49f76241d">tcpip.h</a>
+</li>
+<li>lwip_cyclic_timers
+: <a class="el" href="timeouts_8c.html#addc06ab816f051a0fe6f280972eed142">timeouts.c</a>
+, <a class="el" href="timeouts_8h.html#addc06ab816f051a0fe6f280972eed142">timeouts.h</a>
+</li>
+<li>lwip_num_cyclic_timers
+: <a class="el" href="timeouts_8c.html#a9d01f287a19f20b073d3a1c306ecbfcd">timeouts.c</a>
+, <a class="el" href="timeouts_8h.html#a9d01f287a19f20b073d3a1c306ecbfcd">timeouts.h</a>
+</li>
+<li>lwip_stats
+: <a class="el" href="stats_8c.html#a614735db0145db9ba944ede600d1d19b">stats.c</a>
+, <a class="el" href="stats_8h.html#a614735db0145db9ba944ede600d1d19b">stats.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>netif_default
+: <a class="el" href="netif_8c.html#a3d0925cbce550ed461907aee816713ba">netif.c</a>
+, <a class="el" href="netif_8h.html#a3d0925cbce550ed461907aee816713ba">netif.h</a>
+</li>
+<li>netif_list
+: <a class="el" href="netif_8c.html#a1c8141eaa98f6dc6dfddbb23a706656c">netif.c</a>
+, <a class="el" href="netif_8h.html#a1c8141eaa98f6dc6dfddbb23a706656c">netif.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_r"></a>- r -</h3><ul>
+<li>ram_heap
+: <a class="el" href="mem_8c.html#a6da602f2bbf1d555556f9260b3b8ad5f">mem.c</a>
+</li>
+</ul>
+
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>snmp_community
+: <a class="el" href="snmp__msg_8c.html#ac6f810ab812c44c6ca1df1fdf926a9f6">snmp_msg.c</a>
+, <a class="el" href="snmp__msg_8h.html#ac6f810ab812c44c6ca1df1fdf926a9f6">snmp_msg.h</a>
+</li>
+<li>snmp_community_trap
+: <a class="el" href="snmp__msg_8c.html#a2e2007343d9492b8e31d363d2c6ad79b">snmp_msg.c</a>
+, <a class="el" href="snmp__traps_8c.html#a2e2007343d9492b8e31d363d2c6ad79b">snmp_traps.c</a>
+</li>
+<li>snmp_community_write
+: <a class="el" href="snmp__msg_8c.html#a2d77485bb0b640c8e5f569ca756d3b04">snmp_msg.c</a>
+, <a class="el" href="snmp__msg_8h.html#a2d77485bb0b640c8e5f569ca756d3b04">snmp_msg.h</a>
+</li>
+<li>snmp_traps_handle
+: <a class="el" href="snmp__msg_8h.html#ade16efa80e2c2a20236d3cb96b19c79a">snmp_msg.h</a>
+, <a class="el" href="snmp__traps_8c.html#ade16efa80e2c2a20236d3cb96b19c79a">snmp_traps.c</a>
+</li>
+</ul>
+
+
+<h3><a id="index_t"></a>- t -</h3><ul>
+<li>tcp_active_pcbs
+: <a class="el" href="tcp_8c.html#a78c09dbae67ccc06b659d9f1a388f911">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a78c09dbae67ccc06b659d9f1a388f911">tcp_priv.h</a>
+</li>
+<li>tcp_bound_pcbs
+: <a class="el" href="tcp_8c.html#a1b42a7ac0fc173a42d575f86853d32a8">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a1b42a7ac0fc173a42d575f86853d32a8">tcp_priv.h</a>
+</li>
+<li>tcp_listen_pcbs
+: <a class="el" href="tcp_8c.html#a96fe1350e510d4308ac9969ffb4c9c81">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a96fe1350e510d4308ac9969ffb4c9c81">tcp_priv.h</a>
+</li>
+<li>tcp_pcb_lists
+: <a class="el" href="tcp_8c.html#a51515507dec664e9d69a870e6b627610">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#af5e1079ab223e1cb27208c45e3c84df7">tcp_priv.h</a>
+</li>
+<li>tcp_tw_pcbs
+: <a class="el" href="tcp_8c.html#a9a522a66c5e1f1a4e28fe7a672cc64e3">tcp.c</a>
+, <a class="el" href="tcp__priv_8h.html#a9a522a66c5e1f1a4e28fe7a672cc64e3">tcp_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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_w.html b/doc/doxygen/output/html/globals_w.html
new file mode 100644
index 0000000..f37fea1
--- /dev/null
+++ b/doc/doxygen/output/html/globals_w.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_w.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_w"></a>- w -</h3><ul>
+<li>write
+: <a class="el" href="group__socket.html#ga0a651eb5fb5e6127f5e5153ce2251f3d">sockets.h</a>
+</li>
+<li>writev
+: <a class="el" href="group__socket.html#ga697fd916a65a10b4dcb54b8199346fee">sockets.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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_z.html b/doc/doxygen/output/html/globals_z.html
new file mode 100644
index 0000000..6ed5b11
--- /dev/null
+++ b/doc/doxygen/output/html/globals_z.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('globals_z.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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_z"></a>- z -</h3><ul>
+<li>zepif_init()
+: <a class="el" href="group__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004">zepif.h</a>
+, <a class="el" href="group__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004">zepif.c</a>
+</li>
+<li>ZEPIF_LOOPBACK
+: <a class="el" href="zepif_8c.html#a8cae594e71cf385076f7bda166729dcd">zepif.c</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__altcp.html b/doc/doxygen/output/html/group__altcp.html
new file mode 100644
index 0000000..431ac8e
--- /dev/null
+++ b/doc/doxygen/output/html/group__altcp.html
@@ -0,0 +1,824 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Application layered TCP Functions</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__altcp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</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="#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-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__altcp__tls"><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 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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga96c22e15230b5216b3a95dc9e2ca42c8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga96c22e15230b5216b3a95dc9e2ca42c8">altcp_listen</a>(conn)&#160;&#160;&#160;<a class="el" href="group__altcp.html#gac69722b86b1198916f2527fb9f132c2b">altcp_listen_with_backlog_and_err</a>(conn, <a class="el" href="group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf">TCP_DEFAULT_LISTEN_BACKLOG</a>, NULL)</td></tr>
+<tr class="separator:ga96c22e15230b5216b3a95dc9e2ca42c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga9ddf490e24b1472a96ab2b4cedd171f8"><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#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a></td></tr>
+<tr class="separator:ga9ddf490e24b1472a96ab2b4cedd171f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaa51a47bcb334b188c82a1b99db49f1f1"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1">altcp_new_ip6</a> (<a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a> *allocator)</td></tr>
+<tr class="separator:gaa51a47bcb334b188c82a1b99db49f1f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga86843287b0ad0099c067817cfb7aa336"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga86843287b0ad0099c067817cfb7aa336">altcp_new</a> (<a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a> *allocator)</td></tr>
+<tr class="separator:ga86843287b0ad0099c067817cfb7aa336"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab631f6f92d7f6c58d9db27b7b415bc21"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21">altcp_new_ip_type</a> (<a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a> *allocator, u8_t ip_type)</td></tr>
+<tr class="separator:gab631f6f92d7f6c58d9db27b7b415bc21"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="memitem:ga7c4cd0b1179a53b1a223936ba2270bf9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9">altcp_accept</a> (struct altcp_pcb *conn, altcp_accept_fn <a class="el" href="group__socket.html#gade2b17671b5a4b18e941fbf7e1060310">accept</a>)</td></tr>
+<tr class="separator:ga7c4cd0b1179a53b1a223936ba2270bf9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7f89221f9d65036d890b1e5bd9192a71"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71">altcp_recv</a> (struct altcp_pcb *conn, altcp_recv_fn <a class="el" href="group__socket.html#gadd7ae45df7c005619eb1126542231e9b">recv</a>)</td></tr>
+<tr class="separator:ga7f89221f9d65036d890b1e5bd9192a71"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab2b228c77c827fb14bfc513171c79f47"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gab2b228c77c827fb14bfc513171c79f47">altcp_sent</a> (struct altcp_pcb *conn, altcp_sent_fn sent)</td></tr>
+<tr class="separator:gab2b228c77c827fb14bfc513171c79f47"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga269beeaf7d8264b6ff02333bcc7c7ab0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0">altcp_poll</a> (struct altcp_pcb *conn, altcp_poll_fn <a class="el" href="group__socket.html#ga80ae38841b0e64e60618cd8bf857f617">poll</a>, u8_t interval)</td></tr>
+<tr class="separator:ga269beeaf7d8264b6ff02333bcc7c7ab0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadc76a1f3b2448559dc87da1b33291644"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gadc76a1f3b2448559dc87da1b33291644">altcp_err</a> (struct altcp_pcb *conn, altcp_err_fn err)</td></tr>
+<tr class="separator:gadc76a1f3b2448559dc87da1b33291644"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac086951cbfedaed0c36c5fb26b44ef83"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83">altcp_recved</a> (struct altcp_pcb *conn, u16_t len)</td></tr>
+<tr class="separator:gac086951cbfedaed0c36c5fb26b44ef83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga485b248680f73b9876d8674029c5157c"><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.html#ga485b248680f73b9876d8674029c5157c">altcp_bind</a> (struct altcp_pcb *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, u16_t port)</td></tr>
+<tr class="separator:ga485b248680f73b9876d8674029c5157c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafaf1d533e4e89dc249a3f931afa93492"><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.html#gafaf1d533e4e89dc249a3f931afa93492">altcp_connect</a> (struct altcp_pcb *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, u16_t port, altcp_connected_fn connected)</td></tr>
+<tr class="separator:gafaf1d533e4e89dc249a3f931afa93492"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac69722b86b1198916f2527fb9f132c2b"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gac69722b86b1198916f2527fb9f132c2b">altcp_listen_with_backlog_and_err</a> (struct altcp_pcb *conn, u8_t backlog, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> *err)</td></tr>
+<tr class="separator:gac69722b86b1198916f2527fb9f132c2b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7f6fab99fed448385a76b4a5100796ab"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab">altcp_abort</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:ga7f6fab99fed448385a76b4a5100796ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4329798afdf3709c789a2ee060ee3993"><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.html#ga4329798afdf3709c789a2ee060ee3993">altcp_close</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:ga4329798afdf3709c789a2ee060ee3993"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0c3172d0bfe452599e242ea2e4692319"><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.html#ga0c3172d0bfe452599e242ea2e4692319">altcp_shutdown</a> (struct altcp_pcb *conn, int shut_rx, int shut_tx)</td></tr>
+<tr class="separator:ga0c3172d0bfe452599e242ea2e4692319"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaad9a38396b127cfd778e253f20a97b8d"><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.html#gaad9a38396b127cfd778e253f20a97b8d">altcp_write</a> (struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags)</td></tr>
+<tr class="separator:gaad9a38396b127cfd778e253f20a97b8d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5d2370d3b671377d7e2c98ce2dc3cfc6"><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.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6">altcp_output</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:ga5d2370d3b671377d7e2c98ce2dc3cfc6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae7cfc8bd8e45c517a706afd5857fda08"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08">altcp_mss</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:gae7cfc8bd8e45c517a706afd5857fda08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab295cba0c1ded90fe044a8c37387a12c"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c">altcp_sndbuf</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:gab295cba0c1ded90fe044a8c37387a12c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga516a1bfbf38fc47cfd47852715c505c5"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5">altcp_sndqueuelen</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:ga516a1bfbf38fc47cfd47852715c505c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5040b0a4646bca718d3611ba7fa558c5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5">altcp_setprio</a> (struct altcp_pcb *conn, u8_t prio)</td></tr>
+<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>
+<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">Macro Definition Documentation</h2>
+<a id="ga96c22e15230b5216b3a95dc9e2ca42c8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga96c22e15230b5216b3a95dc9e2ca42c8">&#9670;&nbsp;</a></span>altcp_listen</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define altcp_listen</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">conn</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="group__altcp.html#gac69722b86b1198916f2527fb9f132c2b">altcp_listen_with_backlog_and_err</a>(conn, <a class="el" href="group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf">TCP_DEFAULT_LISTEN_BACKLOG</a>, NULL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="ga9ddf490e24b1472a96ab2b4cedd171f8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9ddf490e24b1472a96ab2b4cedd171f8">&#9670;&nbsp;</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="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga7f6fab99fed448385a76b4a5100796ab"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7f6fab99fed448385a76b4a5100796ab">&#9670;&nbsp;</a></span>altcp_abort()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void altcp_abort </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61">tcp_abort()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga7c4cd0b1179a53b1a223936ba2270bf9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7c4cd0b1179a53b1a223936ba2270bf9">&#9670;&nbsp;</a></span>altcp_accept()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void altcp_accept </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">altcp_accept_fn&#160;</td>
+          <td class="paramname"><em>accept</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62">tcp_accept()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga197a33af038556a04d8f27c7033d771f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga197a33af038556a04d8f27c7033d771f">&#9670;&nbsp;</a></span>altcp_arg()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void altcp_arg </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6">tcp_arg()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga485b248680f73b9876d8674029c5157c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga485b248680f73b9876d8674029c5157c">&#9670;&nbsp;</a></span>altcp_bind()</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_bind </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>port</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee">tcp_bind()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga4329798afdf3709c789a2ee060ee3993"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4329798afdf3709c789a2ee060ee3993">&#9670;&nbsp;</a></span>altcp_close()</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_close </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623">tcp_close()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gafaf1d533e4e89dc249a3f931afa93492"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafaf1d533e4e89dc249a3f931afa93492">&#9670;&nbsp;</a></span>altcp_connect()</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_connect </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">altcp_connected_fn&#160;</td>
+          <td class="paramname"><em>connected</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012">tcp_connect()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gadc76a1f3b2448559dc87da1b33291644"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadc76a1f3b2448559dc87da1b33291644">&#9670;&nbsp;</a></span>altcp_err()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void altcp_err </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">altcp_err_fn&#160;</td>
+          <td class="paramname"><em>err</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121">tcp_err()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gac69722b86b1198916f2527fb9f132c2b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac69722b86b1198916f2527fb9f132c2b">&#9670;&nbsp;</a></span>altcp_listen_with_backlog_and_err()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_listen_with_backlog_and_err </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>backlog</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> *&#160;</td>
+          <td class="paramname"><em>err</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436">tcp_listen_with_backlog_and_err()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gae7cfc8bd8e45c517a706afd5857fda08"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae7cfc8bd8e45c517a706afd5857fda08">&#9670;&nbsp;</a></span>altcp_mss()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t altcp_mss </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#gab0b45a01dcd461e5b8df2a1d9ddda134">tcp_mss()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga86843287b0ad0099c067817cfb7aa336"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga86843287b0ad0099c067817cfb7aa336">&#9670;&nbsp;</a></span>altcp_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_new </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>altcp_new: <a class="el" href="group__altcp.html#ga86843287b0ad0099c067817cfb7aa336">altcp_new</a> for IPv4 </p>
+
+</div>
+</div>
+<a id="gaa51a47bcb334b188c82a1b99db49f1f1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa51a47bcb334b188c82a1b99db49f1f1">&#9670;&nbsp;</a></span>altcp_new_ip6()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_new_ip6 </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>altcp_new_ip6: <a class="el" href="group__altcp.html#ga86843287b0ad0099c067817cfb7aa336">altcp_new</a> for IPv6 </p>
+
+</div>
+</div>
+<a id="gab631f6f92d7f6c58d9db27b7b415bc21"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab631f6f92d7f6c58d9db27b7b415bc21">&#9670;&nbsp;</a></span>altcp_new_ip_type()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_new_ip_type </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ip_type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>altcp_new_ip_type: called by applications to allocate a new pcb with the help of an allocator function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>allocator function and argument </td></tr>
+    <tr><td class="paramname">ip_type</td><td>IP version of the pcb (<a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">lwip_ip_addr_type</a>) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new altcp_pcb or NULL on error </dd></dl>
+
+</div>
+</div>
+<a id="ga5d2370d3b671377d7e2c98ce2dc3cfc6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5d2370d3b671377d7e2c98ce2dc3cfc6">&#9670;&nbsp;</a></span>altcp_output()</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_output </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f">tcp_output()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga269beeaf7d8264b6ff02333bcc7c7ab0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga269beeaf7d8264b6ff02333bcc7c7ab0">&#9670;&nbsp;</a></span>altcp_poll()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void altcp_poll </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">altcp_poll_fn&#160;</td>
+          <td class="paramname"><em>poll</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>interval</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5">tcp_poll()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga7f89221f9d65036d890b1e5bd9192a71"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7f89221f9d65036d890b1e5bd9192a71">&#9670;&nbsp;</a></span>altcp_recv()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void altcp_recv </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">altcp_recv_fn&#160;</td>
+          <td class="paramname"><em>recv</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0">tcp_recv()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gac086951cbfedaed0c36c5fb26b44ef83"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac086951cbfedaed0c36c5fb26b44ef83">&#9670;&nbsp;</a></span>altcp_recved()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void altcp_recved </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44">tcp_recved()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gab2b228c77c827fb14bfc513171c79f47"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab2b228c77c827fb14bfc513171c79f47">&#9670;&nbsp;</a></span>altcp_sent()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void altcp_sent </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">altcp_sent_fn&#160;</td>
+          <td class="paramname"><em>sent</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808">tcp_sent()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga5040b0a4646bca718d3611ba7fa558c5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5040b0a4646bca718d3611ba7fa558c5">&#9670;&nbsp;</a></span>altcp_setprio()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void altcp_setprio </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>prio</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </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>
+
+</div>
+</div>
+<a id="ga0c3172d0bfe452599e242ea2e4692319"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0c3172d0bfe452599e242ea2e4692319">&#9670;&nbsp;</a></span>altcp_shutdown()</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_shutdown </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>shut_rx</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>shut_tx</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd">tcp_shutdown()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gab295cba0c1ded90fe044a8c37387a12c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab295cba0c1ded90fe044a8c37387a12c">&#9670;&nbsp;</a></span>altcp_sndbuf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t altcp_sndbuf </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#gad1a95f09deb49cd7341d35527d6d3e2f">tcp_sndbuf()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga516a1bfbf38fc47cfd47852715c505c5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga516a1bfbf38fc47cfd47852715c505c5">&#9670;&nbsp;</a></span>altcp_sndqueuelen()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t altcp_sndqueuelen </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#ga53ee4364718e84dc42cb1e0179deb1f4">tcp_sndqueuelen()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gaad9a38396b127cfd778e253f20a97b8d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaad9a38396b127cfd778e253f20a97b8d">&#9670;&nbsp;</a></span>altcp_write()</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_write </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>dataptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>apiflags</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp_write()</a> </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__altcp.js b/doc/doxygen/output/html/group__altcp.js
new file mode 100644
index 0000000..4401fe2
--- /dev/null
+++ b/doc/doxygen/output/html/group__altcp.js
@@ -0,0 +1,32 @@
+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_listen", "group__altcp.html#ga96c22e15230b5216b3a95dc9e2ca42c8", null ],
+    [ "altcp_allocator_t", "group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8", null ],
+    [ "altcp_abort", "group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab", null ],
+    [ "altcp_accept", "group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9", null ],
+    [ "altcp_arg", "group__altcp.html#ga197a33af038556a04d8f27c7033d771f", null ],
+    [ "altcp_bind", "group__altcp.html#ga485b248680f73b9876d8674029c5157c", null ],
+    [ "altcp_close", "group__altcp.html#ga4329798afdf3709c789a2ee060ee3993", null ],
+    [ "altcp_connect", "group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492", null ],
+    [ "altcp_err", "group__altcp.html#gadc76a1f3b2448559dc87da1b33291644", null ],
+    [ "altcp_listen_with_backlog_and_err", "group__altcp.html#gac69722b86b1198916f2527fb9f132c2b", null ],
+    [ "altcp_mss", "group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08", null ],
+    [ "altcp_new", "group__altcp.html#ga86843287b0ad0099c067817cfb7aa336", null ],
+    [ "altcp_new_ip6", "group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1", null ],
+    [ "altcp_new_ip_type", "group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21", null ],
+    [ "altcp_output", "group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6", null ],
+    [ "altcp_poll", "group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0", null ],
+    [ "altcp_recv", "group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71", null ],
+    [ "altcp_recved", "group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83", null ],
+    [ "altcp_sent", "group__altcp.html#gab2b228c77c827fb14bfc513171c79f47", null ],
+    [ "altcp_setprio", "group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5", null ],
+    [ "altcp_shutdown", "group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319", null ],
+    [ "altcp_sndbuf", "group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c", null ],
+    [ "altcp_sndqueuelen", "group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5", null ],
+    [ "altcp_write", "group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__altcp__api.html b/doc/doxygen/output/html/group__altcp__api.html
new file mode 100644
index 0000000..369c52b
--- /dev/null
+++ b/doc/doxygen/output/html/group__altcp__api.html
@@ -0,0 +1,132 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Application layered TCP Introduction</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__altcp__api.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">Application layered TCP Introduction<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__altcp"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html">Application layered TCP Functions</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>
+<h2>Overview </h2>
+<p>altcp (application layered TCP connection API; to be used from TCPIP thread) is an abstraction layer that prevents applications linking hard against the <a class="el" href="tcp_8h.html">tcp.h</a> functions while providing the same functionality. It is used to e.g. add SSL/TLS (see LWIP_ALTCP_TLS) or proxy-connect support to an application written for the tcp callback API without that application knowing the protocol details.</p>
+<ul>
+<li>This interface mimics the tcp callback API to the application while preventing direct linking (much like virtual functions).</li>
+<li>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).</li>
+<li>This is achieved by simply including "lwip/altcp.h" instead of "lwip/tcp.h", replacing "struct tcp_pcb" with "struct altcp_pcb" and prefixing all functions with "altcp_" instead of "tcp_".</li>
+</ul>
+<p>With altcp support disabled (LWIP_ALTCP==0), applications written against the altcp API can still be compiled but are directly linked against the tcp.h callback API and then cannot use layered protocols. To minimize code changes in this case, the use of altcp_allocators is strongly suggested.</p>
+<h2>Usage </h2>
+<p>To make use of this API from an existing tcp raw API application:</p><ul>
+<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#ga86843287b0ad0099c067817cfb7aa336">altcp_new</a> (and <a class="el" href="group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21">altcp_new_ip_type</a>/<a class="el" href="group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1">altcp_new_ip6</a>) take an <a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">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#ga9ddf490e24b1472a96ab2b4cedd171f8">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#ga028316a8257cf8dcace9cd063de79c0a">altcp_tls_new</a> or <a class="el" href="group__altcp__tls.html#gab874adb7f87984c0520bd032c2108c47">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>
+</ul>
+<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" href="group__altcp__tls.html#ga2b249447e10c8599b6d723d403086c35">altcp_tls_create_config_client</a>(cert, <span class="keyword">sizeof</span>(cert));</div><div class="line"><a class="code" href="structaltcp__allocator__s.html">altcp_allocator_t</a> tls_allocator = {</div><div class="line">  <a class="code" href="group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391">altcp_tls_alloc</a>, conf</div><div class="line">};</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#ga700dc0320e93cea337673e7d4295e161">altcp_tls_create_config_server_privkey_cert</a> for servers and <a class="el" href="group__altcp__tls.html#ga2b249447e10c8599b6d723d403086c35">altcp_tls_create_config_client</a>/<a class="el" href="group__altcp__tls.html#ga7352a4600fee89e167541cf0776c01fb">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 -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__altcp__api.js b/doc/doxygen/output/html/group__altcp__api.js
new file mode 100644
index 0000000..24a8168
--- /dev/null
+++ b/doc/doxygen/output/html/group__altcp__api.js
@@ -0,0 +1,4 @@
+var group__altcp__api =
+[
+    [ "Application layered TCP Functions", "group__altcp.html", "group__altcp" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__altcp__tls.html b/doc/doxygen/output/html/group__altcp__tls.html
new file mode 100644
index 0000000..dc5f729
--- /dev/null
+++ b/doc/doxygen/output/html/group__altcp__tls.html
@@ -0,0 +1,399 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: TLS layer</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__altcp__tls.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">TLS layer<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">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga700dc0320e93cea337673e7d4295e161"><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#ga700dc0320e93cea337673e7d4295e161">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>
+<tr class="separator:ga700dc0320e93cea337673e7d4295e161"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2b249447e10c8599b6d723d403086c35"><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#ga2b249447e10c8599b6d723d403086c35">altcp_tls_create_config_client</a> (const u8_t *cert, size_t cert_len)</td></tr>
+<tr class="separator:ga2b249447e10c8599b6d723d403086c35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7352a4600fee89e167541cf0776c01fb"><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#ga7352a4600fee89e167541cf0776c01fb">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:ga7352a4600fee89e167541cf0776c01fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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:gab874adb7f87984c0520bd032c2108c47"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#gab874adb7f87984c0520bd032c2108c47">altcp_tls_wrap</a> (struct altcp_tls_config *config, struct altcp_pcb *inner_pcb)</td></tr>
+<tr class="separator:gab874adb7f87984c0520bd032c2108c47"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga028316a8257cf8dcace9cd063de79c0a"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a">altcp_tls_new</a> (struct altcp_tls_config *config, u8_t ip_type)</td></tr>
+<tr class="separator:ga028316a8257cf8dcace9cd063de79c0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga09e6ca8f144ee94ef21d7e5760aa4391"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391">altcp_tls_alloc</a> (void *arg, u8_t ip_type)</td></tr>
+<tr class="separator:ga09e6ca8f144ee94ef21d7e5760aa4391"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabc1741530d5089c3093889416430bc76"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#gabc1741530d5089c3093889416430bc76">altcp_tls_context</a> (struct altcp_pcb *conn)</td></tr>
+<tr class="separator:gabc1741530d5089c3093889416430bc76"><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>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga09e6ca8f144ee94ef21d7e5760aa4391"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga09e6ca8f144ee94ef21d7e5760aa4391">&#9670;&nbsp;</a></span>altcp_tls_alloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_tls_alloc </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ip_type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create new ALTCP_TLS layer pcb and its inner tcp pcb. Same as <a class="el" href="group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a">altcp_tls_new</a> but this allocator function fits to <a class="el" href="group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8">altcp_allocator_t</a> / <a class="el" href="group__altcp.html#ga86843287b0ad0099c067817cfb7aa336">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>
+
+</div>
+</div>
+<a id="gabc1741530d5089c3093889416430bc76"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabc1741530d5089c3093889416430bc76">&#9670;&nbsp;</a></span>altcp_tls_context()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* altcp_tls_context </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>conn</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return pointer to internal TLS context so application can tweak it. Real type depends on port (e.g. mbedtls) </p>
+
+</div>
+</div>
+<a id="ga2b249447e10c8599b6d723d403086c35"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2b249447e10c8599b6d723d403086c35">&#9670;&nbsp;</a></span>altcp_tls_create_config_client()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_tls_config* altcp_tls_create_config_client </td>
+          <td>(</td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>cert</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>cert_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create an ALTCP_TLS client configuration handle </p>
+
+</div>
+</div>
+<a id="ga7352a4600fee89e167541cf0776c01fb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7352a4600fee89e167541cf0776c01fb">&#9670;&nbsp;</a></span>altcp_tls_create_config_client_2wayauth()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_tls_config* altcp_tls_create_config_client_2wayauth </td>
+          <td>(</td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>ca</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>ca_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>privkey</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>privkey_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>privkey_pass</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>privkey_pass_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>cert</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>cert_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create an ALTCP_TLS client configuration handle with two-way server/client authentication </p>
+
+</div>
+</div>
+<a id="ga700dc0320e93cea337673e7d4295e161"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga700dc0320e93cea337673e7d4295e161">&#9670;&nbsp;</a></span>altcp_tls_create_config_server_privkey_cert()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_tls_config* altcp_tls_create_config_server_privkey_cert </td>
+          <td>(</td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>privkey</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>privkey_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>privkey_pass</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>privkey_pass_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>cert</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>cert_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create an ALTCP_TLS server configuration handle </p>
+
+</div>
+</div>
+<a id="ga8fb8a92fa3f84170050ddab2888b9145"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8fb8a92fa3f84170050ddab2888b9145">&#9670;&nbsp;</a></span>altcp_tls_free_config()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void altcp_tls_free_config </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_tls_config *&#160;</td>
+          <td class="paramname"><em>conf</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Free an ALTCP_TLS configuration handle </p>
+
+</div>
+</div>
+<a id="ga028316a8257cf8dcace9cd063de79c0a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga028316a8257cf8dcace9cd063de79c0a">&#9670;&nbsp;</a></span>altcp_tls_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_tls_new </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_tls_config *&#160;</td>
+          <td class="paramname"><em>config</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ip_type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create new ALTCP_TLS pcb and its inner tcp pcb</p>
+<p>This standard allocator function creates an altcp pcb for TLS over TCP </p>
+
+</div>
+</div>
+<a id="gab874adb7f87984c0520bd032c2108c47"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab874adb7f87984c0520bd032c2108c47">&#9670;&nbsp;</a></span>altcp_tls_wrap()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_pcb* altcp_tls_wrap </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_tls_config *&#160;</td>
+          <td class="paramname"><em>config</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct altcp_pcb *&#160;</td>
+          <td class="paramname"><em>inner_pcb</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create new ALTCP_TLS layer wrapping an existing pcb as inner connection (e.g. TLS over TCP) </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__altcp__tls.js b/doc/doxygen/output/html/group__altcp__tls.js
new file mode 100644
index 0000000..01dfb8f
--- /dev/null
+++ b/doc/doxygen/output/html/group__altcp__tls.js
@@ -0,0 +1,11 @@
+var group__altcp__tls =
+[
+    [ "altcp_tls_alloc", "group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391", null ],
+    [ "altcp_tls_context", "group__altcp__tls.html#gabc1741530d5089c3093889416430bc76", null ],
+    [ "altcp_tls_create_config_client", "group__altcp__tls.html#ga2b249447e10c8599b6d723d403086c35", null ],
+    [ "altcp_tls_create_config_client_2wayauth", "group__altcp__tls.html#ga7352a4600fee89e167541cf0776c01fb", null ],
+    [ "altcp_tls_create_config_server_privkey_cert", "group__altcp__tls.html#ga700dc0320e93cea337673e7d4295e161", null ],
+    [ "altcp_tls_free_config", "group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145", null ],
+    [ "altcp_tls_new", "group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a", null ],
+    [ "altcp_tls_wrap", "group__altcp__tls.html#gab874adb7f87984c0520bd032c2108c47", 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
new file mode 100644
index 0000000..1e816cd
--- /dev/null
+++ b/doc/doxygen/output/html/group__api.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: APIs</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__api.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">APIs</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__callbackstyle__api"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__callbackstyle__api.html">&quot;raw&quot; APIs</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__sequential__api"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sequential__api.html">Sequential-style APIs</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__socket"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html">Socket API</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>
+<p>lwIP provides three Application Program's Interfaces (APIs) for programs to use for communication with the TCP/IP code:</p><ul>
+<li>low-level "core" / "callback" or <a class="el" href="group__callbackstyle__api.html">"raw" APIs</a>.</li>
+<li>higher-level <a class="el" href="group__sequential__api.html">Sequential-style APIs</a>.</li>
+<li>BSD-style <a class="el" href="group__socket.html">Socket API</a>.</li>
+</ul>
+<p>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 code. The TCP/IP code and the application program both run in the same 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.</p>
+<p>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.</p>
+<p>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.</p>
+<p>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.</p>
+<p>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. </p>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__api.js b/doc/doxygen/output/html/group__api.js
new file mode 100644
index 0000000..1e806ab
--- /dev/null
+++ b/doc/doxygen/output/html/group__api.js
@@ -0,0 +1,6 @@
+var group__api =
+[
+    [ "\"raw\" APIs", "group__callbackstyle__api.html", "group__callbackstyle__api" ],
+    [ "Sequential-style APIs", "group__sequential__api.html", "group__sequential__api" ],
+    [ "Socket API", "group__socket.html", "group__socket" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__apps.html b/doc/doxygen/output/html/group__apps.html
new file mode 100644
index 0000000..7b2e203
--- /dev/null
+++ b/doc/doxygen/output/html/group__apps.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Applications</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__apps.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">Applications</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__httpc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpc.html">HTTP client</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__httpd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html">HTTP server</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__iperf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iperf.html">Iperf server</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__mdns"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html">MDNS</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__mqtt"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html">MQTT client</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__netbiosns"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbiosns.html">NETBIOS responder</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__smtp"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp.html">SMTP client</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__snmp"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp.html">SNMPv2c/v3 agent</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__sntp"><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:group__tftp"><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="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__apps.js b/doc/doxygen/output/html/group__apps.js
new file mode 100644
index 0000000..4614ed2
--- /dev/null
+++ b/doc/doxygen/output/html/group__apps.js
@@ -0,0 +1,13 @@
+var group__apps =
+[
+    [ "HTTP client", "group__httpc.html", "group__httpc" ],
+    [ "HTTP server", "group__httpd.html", "group__httpd" ],
+    [ "Iperf server", "group__iperf.html", "group__iperf" ],
+    [ "MDNS", "group__mdns.html", "group__mdns" ],
+    [ "MQTT client", "group__mqtt.html", "group__mqtt" ],
+    [ "NETBIOS responder", "group__netbiosns.html", "group__netbiosns" ],
+    [ "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" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__autoip.html b/doc/doxygen/output/html/group__autoip.html
new file mode 100644
index 0000000..c888c60
--- /dev/null
+++ b/doc/doxygen/output/html/group__autoip.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: AUTOIP</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__autoip.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">AUTOIP<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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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: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"><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>
+</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>Without DHCP:</p><ul>
+<li>Call <a class="el" href="group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8">autoip_start()</a> after <a class="el" href="group__netif.html#gade5498543e74067f28cc6bef0209e3be">netif_add()</a>.</li>
+</ul>
+<p>With DHCP:</p><ul>
+<li>define <a class="el" href="group__lwip__opts__autoip.html#ga1a91e18dbb9777bc6e3963f52cb5f9fe">LWIP_DHCP_AUTOIP_COOP</a> 1 in your lwipopts.h.</li>
+<li>Configure your DHCP Client.</li>
+</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="ga2122c0b2518b371559fef5ec1d2aed90"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2122c0b2518b371559fef5ec1d2aed90">&#9670;&nbsp;</a></span>autoip_set_struct()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void autoip_set_struct </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structautoip.html">autoip</a> *&#160;</td>
+          <td class="paramname"><em>autoip</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set a statically allocated struct autoip to work with. Using this prevents autoip_start to allocate it using mem_malloc.</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>
+    <tr><td class="paramname">autoip</td><td>(uninitialised) autoip struct allocated by the application </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga1461f5826ebefc050e0d63013818d1e8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1461f5826ebefc050e0d63013818d1e8">&#9670;&nbsp;</a></span>autoip_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> autoip_start </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Start AutoIP client</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface on which start the AutoIP client </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga58a4dce658dd1263e84eb982f62587d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga58a4dce658dd1263e84eb982f62587d4">&#9670;&nbsp;</a></span>autoip_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> autoip_stop </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Stop AutoIP client</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface on which stop the AutoIP client </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__autoip.js b/doc/doxygen/output/html/group__autoip.js
new file mode 100644
index 0000000..809179f
--- /dev/null
+++ b/doc/doxygen/output/html/group__autoip.js
@@ -0,0 +1,6 @@
+var group__autoip =
+[
+    [ "autoip_set_struct", "group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90", null ],
+    [ "autoip_start", "group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8", null ],
+    [ "autoip_stop", "group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__bridgeif.html b/doc/doxygen/output/html/group__bridgeif.html
new file mode 100644
index 0000000..58f4c3b
--- /dev/null
+++ b/doc/doxygen/output/html/group__bridgeif.html
@@ -0,0 +1,411 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: IEEE 802.1D bridge</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__bridgeif.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</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="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">IEEE 802.1D bridge<div class="ingroups"><a class="el" href="group__netifs.html">NETIFs</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__bridgeif__opts"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__opts.html">Options</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__bridgeif__fdb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__fdb.html">FDB example code</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 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="structbridgeif__initdata__s.html">bridgeif_initdata_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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga3d41c7905b61aef3a3b8c61b3af7879f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif.html#ga3d41c7905b61aef3a3b8c61b3af7879f">BRIDGEIF_INITDATA1</a>(max_ports,  max_fdb_dynamic_entries,  max_fdb_static_entries,  ethaddr)&#160;&#160;&#160;{ethaddr, max_ports, max_fdb_dynamic_entries, max_fdb_static_entries}</td></tr>
+<tr class="separator:ga3d41c7905b61aef3a3b8c61b3af7879f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaaeb47fbf1dd6c30cb502343fa0d0741"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif.html#gaaaeb47fbf1dd6c30cb502343fa0d0741">BRIDGEIF_INITDATA2</a>(max_ports,  max_fdb_dynamic_entries,  max_fdb_static_entries,  e0,  e1,  e2,  e3,  e4,  e5)&#160;&#160;&#160;{{e0, e1, e2, e3, e4, e5}, max_ports, max_fdb_dynamic_entries, max_fdb_static_entries}</td></tr>
+<tr class="separator:gaaaeb47fbf1dd6c30cb502343fa0d0741"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gac47f8ce66bc6dad5dd9829467f93a1bb"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structbridgeif__initdata__s.html">bridgeif_initdata_s</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif.html#gac47f8ce66bc6dad5dd9829467f93a1bb">bridgeif_initdata_t</a></td></tr>
+<tr class="separator:gac47f8ce66bc6dad5dd9829467f93a1bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gad20fea2657431d4a0905be80cb0b4666"><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__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666">bridgeif_fdb_add</a> (struct <a class="el" href="structnetif.html">netif</a> *bridgeif, const struct <a class="el" href="structeth__addr.html">eth_addr</a> *addr, bridgeif_portmask_t ports)</td></tr>
+<tr class="separator:gad20fea2657431d4a0905be80cb0b4666"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga79349b1e9d0f944e8abad5a6cfb1c8e8"><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__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8">bridgeif_fdb_remove</a> (struct <a class="el" href="structnetif.html">netif</a> *bridgeif, const struct <a class="el" href="structeth__addr.html">eth_addr</a> *addr)</td></tr>
+<tr class="separator:ga79349b1e9d0f944e8abad5a6cfb1c8e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga23cc2c5f8fccefc470093840cc53727c"><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__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c">bridgeif_init</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga23cc2c5f8fccefc470093840cc53727c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga51b7d1af22f7023aabd8502aadf77c77"><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__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77">bridgeif_add_port</a> (struct <a class="el" href="structnetif.html">netif</a> *bridgeif, struct <a class="el" href="structnetif.html">netif</a> *portif)</td></tr>
+<tr class="separator:ga51b7d1af22f7023aabd8502aadf77c77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>This file implements an IEEE 802.1D bridge by using a multilayer netif approach (one hardware-independent netif for the bridge that uses hardware netifs for its ports). On transmit, the bridge selects the outgoing port(s). On receive, the port netif calls into the bridge (via its netif-&gt;input function) and the bridge selects the port(s) (and/or its netif-&gt;input function) to pass the received pbuf to.</p>
+<p>Usage:</p><ul>
+<li>add the port netifs just like you would when using them as dedicated netif without a bridge<ul>
+<li>only NETIF_FLAG_ETHARP/NETIF_FLAG_ETHERNET netifs are supported as bridge ports</li>
+<li>add the bridge port netifs without IPv4 addresses (i.e. pass 'NULL, NULL, NULL')</li>
+<li>don't add IPv6 addresses to the port netifs!</li>
+</ul>
+</li>
+<li>set up the bridge configuration in a global variable of type 'bridgeif_initdata_t' that contains<ul>
+<li>the MAC address of the bridge</li>
+<li>some configuration options controlling the memory consumption (maximum number of ports and FDB entries)</li>
+<li>e.g. for a bridge MAC address 00-01-02-03-04-05, 2 bridge ports, 1024 FDB entries + 16 static MAC entries: bridgeif_initdata_t mybridge_initdata = <a class="el" href="group__bridgeif.html#ga3d41c7905b61aef3a3b8c61b3af7879f">BRIDGEIF_INITDATA1(2, 1024, 16, ETH_ADDR(0, 1, 2, 3, 4, 5))</a>;</li>
+</ul>
+</li>
+<li>add the bridge netif (with IPv4 config): struct netif bridge_netif; netif_add(&amp;bridge_netif, &amp;my_ip, &amp;my_netmask, &amp;my_gw, &amp;mybridge_initdata, bridgeif_init, tcpip_input); NOTE: the passed 'input' function depends on BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT setting, which controls where the forwarding is done (netif low level input context vs. tcpip_thread)</li>
+<li>set up all ports netifs and the bridge netif</li>
+<li>When adding a port netif, NETIF_FLAG_ETHARP flag will be removed from a port to prevent ETHARP working on that port netif (we only want one IP per bridge not per port).</li>
+<li>When adding a port netif, its input function is changed to call into the bridge.</li>
+</ul>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga3d41c7905b61aef3a3b8c61b3af7879f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3d41c7905b61aef3a3b8c61b3af7879f">&#9670;&nbsp;</a></span>BRIDGEIF_INITDATA1</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define BRIDGEIF_INITDATA1</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">max_ports, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">max_fdb_dynamic_entries, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">max_fdb_static_entries, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ethaddr&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;{ethaddr, max_ports, max_fdb_dynamic_entries, max_fdb_static_entries}</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Use this for constant initialization of a bridgeif_initdat_t (ethaddr must be passed as <a class="el" href="lwip_2prot_2ethernet_8h.html#a19c72ce98569e0fb55948a7587d704ee">ETH_ADDR()</a>) </p>
+
+</div>
+</div>
+<a id="gaaaeb47fbf1dd6c30cb502343fa0d0741"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaaaeb47fbf1dd6c30cb502343fa0d0741">&#9670;&nbsp;</a></span>BRIDGEIF_INITDATA2</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define BRIDGEIF_INITDATA2</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">max_ports, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">max_fdb_dynamic_entries, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">max_fdb_static_entries, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">e0, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">e1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">e2, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">e3, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">e4, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">e5&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;{{e0, e1, e2, e3, e4, e5}, max_ports, max_fdb_dynamic_entries, max_fdb_static_entries}</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Use this for constant initialization of a bridgeif_initdat_t (each byte of ethaddr must be passed) </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="gac47f8ce66bc6dad5dd9829467f93a1bb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac47f8ce66bc6dad5dd9829467f93a1bb">&#9670;&nbsp;</a></span>bridgeif_initdata_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structbridgeif__initdata__s.html">bridgeif_initdata_s</a>  <a class="el" href="group__bridgeif.html#gac47f8ce66bc6dad5dd9829467f93a1bb">bridgeif_initdata_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialisation data for <a class="el" href="group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c">bridgeif_init</a>. An instance of this type must be passed as parameter 'state' to <a class="el" href="group__netif.html#gade5498543e74067f28cc6bef0209e3be">netif_add</a> when the bridge is added. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga51b7d1af22f7023aabd8502aadf77c77"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga51b7d1af22f7023aabd8502aadf77c77">&#9670;&nbsp;</a></span>bridgeif_add_port()</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> bridgeif_add_port </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>bridgeif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>portif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add a port to the bridge </p>
+
+</div>
+</div>
+<a id="gad20fea2657431d4a0905be80cb0b4666"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad20fea2657431d4a0905be80cb0b4666">&#9670;&nbsp;</a></span>bridgeif_fdb_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> bridgeif_fdb_add </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>bridgeif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structeth__addr.html">eth_addr</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">bridgeif_portmask_t&#160;</td>
+          <td class="paramname"><em>ports</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add a static entry to the forwarding database. A static entry marks where frames to a specific eth address (unicast or group address) are forwarded. bits [0..(BRIDGEIF_MAX_PORTS-1)]: hw ports bit [BRIDGEIF_MAX_PORTS]: cpu port 0: drop </p>
+
+</div>
+</div>
+<a id="ga79349b1e9d0f944e8abad5a6cfb1c8e8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga79349b1e9d0f944e8abad5a6cfb1c8e8">&#9670;&nbsp;</a></span>bridgeif_fdb_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> bridgeif_fdb_remove </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>bridgeif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structeth__addr.html">eth_addr</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Remove a static entry from the forwarding database </p>
+
+</div>
+</div>
+<a id="ga23cc2c5f8fccefc470093840cc53727c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga23cc2c5f8fccefc470093840cc53727c">&#9670;&nbsp;</a></span>bridgeif_init()</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> bridgeif_init </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialization function passed to <a class="el" href="group__netif.html#gade5498543e74067f28cc6bef0209e3be">netif_add()</a>.</p>
+<p>ATTENTION: A pointer to a <a class="el" href="group__bridgeif.html#gac47f8ce66bc6dad5dd9829467f93a1bb">bridgeif_initdata_t</a> must be passed as 'state' to <a class="el" href="group__netif.html#gade5498543e74067f28cc6bef0209e3be">netif_add</a> when adding the bridge. I supplies MAC address and controls memory allocation (number of ports, FDB size).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the lwip network interface structure for this ethernetif </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the loopif is initialized ERR_MEM if private data couldn't be allocated any other err_t on error </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__bridgeif.js b/doc/doxygen/output/html/group__bridgeif.js
new file mode 100644
index 0000000..3f0a67f
--- /dev/null
+++ b/doc/doxygen/output/html/group__bridgeif.js
@@ -0,0 +1,18 @@
+var group__bridgeif =
+[
+    [ "Options", "group__bridgeif__opts.html", "group__bridgeif__opts" ],
+    [ "FDB example code", "group__bridgeif__fdb.html", "group__bridgeif__fdb" ],
+    [ "bridgeif_initdata_s", "structbridgeif__initdata__s.html", [
+      [ "ethaddr", "structbridgeif__initdata__s.html#a8e0048db5e021f5d79411492dc9330bc", null ],
+      [ "max_fdb_dynamic_entries", "structbridgeif__initdata__s.html#aeb312c2e698513c6416d5c8459ad622f", null ],
+      [ "max_fdb_static_entries", "structbridgeif__initdata__s.html#a210915aa1b0436ccabc7e8d9fd3c3fe6", null ],
+      [ "max_ports", "structbridgeif__initdata__s.html#a0e0bb6a885967b5fcfef09a8f0adc63f", null ]
+    ] ],
+    [ "BRIDGEIF_INITDATA1", "group__bridgeif.html#ga3d41c7905b61aef3a3b8c61b3af7879f", null ],
+    [ "BRIDGEIF_INITDATA2", "group__bridgeif.html#gaaaeb47fbf1dd6c30cb502343fa0d0741", null ],
+    [ "bridgeif_initdata_t", "group__bridgeif.html#gac47f8ce66bc6dad5dd9829467f93a1bb", null ],
+    [ "bridgeif_add_port", "group__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77", null ],
+    [ "bridgeif_fdb_add", "group__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666", null ],
+    [ "bridgeif_fdb_remove", "group__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8", null ],
+    [ "bridgeif_init", "group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__bridgeif__fdb.html b/doc/doxygen/output/html/group__bridgeif__fdb.html
new file mode 100644
index 0000000..f71cd20
--- /dev/null
+++ b/doc/doxygen/output/html/group__bridgeif__fdb.html
@@ -0,0 +1,198 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: FDB example code</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__bridgeif__fdb.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">FDB example code<div class="ingroups"><a class="el" href="group__netifs.html">NETIFs</a> &raquo; <a class="el" href="group__bridgeif.html">IEEE 802.1D bridge</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gad912bfd3ce8e24d0eb48b7dc9de07c39"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39">bridgeif_fdb_update_src</a> (void *fdb_ptr, struct <a class="el" href="structeth__addr.html">eth_addr</a> *src_addr, u8_t port_idx)</td></tr>
+<tr class="separator:gad912bfd3ce8e24d0eb48b7dc9de07c39"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga616fb7404be5da79d8092b4a14976750"><td class="memItemLeft" align="right" valign="top">bridgeif_portmask_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__fdb.html#ga616fb7404be5da79d8092b4a14976750">bridgeif_fdb_get_dst_ports</a> (void *fdb_ptr, struct <a class="el" href="structeth__addr.html">eth_addr</a> *dst_addr)</td></tr>
+<tr class="separator:ga616fb7404be5da79d8092b4a14976750"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf7935226ee7f99f964bf0135b6cb9ca0"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__fdb.html#gaf7935226ee7f99f964bf0135b6cb9ca0">bridgeif_fdb_init</a> (u16_t max_fdb_entries)</td></tr>
+<tr class="separator:gaf7935226ee7f99f964bf0135b6cb9ca0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>This file implements an example for an FDB (Forwarding DataBase) </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga616fb7404be5da79d8092b4a14976750"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga616fb7404be5da79d8092b4a14976750">&#9670;&nbsp;</a></span>bridgeif_fdb_get_dst_ports()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bridgeif_portmask_t bridgeif_fdb_get_dst_ports </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>fdb_ptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structeth__addr.html">eth_addr</a> *&#160;</td>
+          <td class="paramname"><em>dst_addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Walk our list of auto-learnt fdb entries and return a port to forward or BR_FLOOD if unknown </p>
+
+</div>
+</div>
+<a id="gaf7935226ee7f99f964bf0135b6cb9ca0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf7935226ee7f99f964bf0135b6cb9ca0">&#9670;&nbsp;</a></span>bridgeif_fdb_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* bridgeif_fdb_init </td>
+          <td>(</td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>max_fdb_entries</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Init our simple fdb list </p>
+
+</div>
+</div>
+<a id="gad912bfd3ce8e24d0eb48b7dc9de07c39"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad912bfd3ce8e24d0eb48b7dc9de07c39">&#9670;&nbsp;</a></span>bridgeif_fdb_update_src()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void bridgeif_fdb_update_src </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>fdb_ptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structeth__addr.html">eth_addr</a> *&#160;</td>
+          <td class="paramname"><em>src_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>port_idx</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A real simple and slow implementation of an auto-learning forwarding database that remembers known src mac addresses to know which port to send frames destined for that mac address.</p>
+<p>ATTENTION: This is meant as an example only, in real-world use, you should provide a better implementation :-) </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__bridgeif__fdb.js b/doc/doxygen/output/html/group__bridgeif__fdb.js
new file mode 100644
index 0000000..8693e90
--- /dev/null
+++ b/doc/doxygen/output/html/group__bridgeif__fdb.js
@@ -0,0 +1,6 @@
+var group__bridgeif__fdb =
+[
+    [ "bridgeif_fdb_get_dst_ports", "group__bridgeif__fdb.html#ga616fb7404be5da79d8092b4a14976750", null ],
+    [ "bridgeif_fdb_init", "group__bridgeif__fdb.html#gaf7935226ee7f99f964bf0135b6cb9ca0", null ],
+    [ "bridgeif_fdb_update_src", "group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__bridgeif__opts.html b/doc/doxygen/output/html/group__bridgeif__opts.html
new file mode 100644
index 0000000..f3b9a79
--- /dev/null
+++ b/doc/doxygen/output/html/group__bridgeif__opts.html
@@ -0,0 +1,192 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Options</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__bridgeif__opts.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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__netifs.html">NETIFs</a> &raquo; <a class="el" href="group__bridgeif.html">IEEE 802.1D bridge</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga5aed5cd9b01ba1345b47845cd04ca30d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__opts.html#ga5aed5cd9b01ba1345b47845cd04ca30d">BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b">NO_SYS</a></td></tr>
+<tr class="separator:ga5aed5cd9b01ba1345b47845cd04ca30d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6fe03b84359150b7dea3dfca942b6414"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__opts.html#ga6fe03b84359150b7dea3dfca942b6414">BRIDGEIF_MAX_PORTS</a>&#160;&#160;&#160;7</td></tr>
+<tr class="separator:ga6fe03b84359150b7dea3dfca942b6414"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaab45e20e9b09a98217994082968cec73"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__opts.html#gaab45e20e9b09a98217994082968cec73">BRIDGEIF_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gaab45e20e9b09a98217994082968cec73"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga72e389f592470dc50288a68f3db70730"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__opts.html#ga72e389f592470dc50288a68f3db70730">BRIDGEIF_FDB_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga72e389f592470dc50288a68f3db70730"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac456e97b1b0e9a57449596a2b229763a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif__opts.html#gac456e97b1b0e9a57449596a2b229763a">BRIDGEIF_FW_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gac456e97b1b0e9a57449596a2b229763a"><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="gaab45e20e9b09a98217994082968cec73"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaab45e20e9b09a98217994082968cec73">&#9670;&nbsp;</a></span>BRIDGEIF_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define BRIDGEIF_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>BRIDGEIF_DEBUG: Enable generic debugging in <a class="el" href="bridgeif_8c.html">bridgeif.c</a>. </p>
+
+</div>
+</div>
+<a id="ga72e389f592470dc50288a68f3db70730"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga72e389f592470dc50288a68f3db70730">&#9670;&nbsp;</a></span>BRIDGEIF_FDB_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define BRIDGEIF_FDB_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>BRIDGEIF_DEBUG: Enable FDB debugging in <a class="el" href="bridgeif_8c.html">bridgeif.c</a>. </p>
+
+</div>
+</div>
+<a id="gac456e97b1b0e9a57449596a2b229763a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac456e97b1b0e9a57449596a2b229763a">&#9670;&nbsp;</a></span>BRIDGEIF_FW_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define BRIDGEIF_FW_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>BRIDGEIF_DEBUG: Enable forwarding debugging in <a class="el" href="bridgeif_8c.html">bridgeif.c</a>. </p>
+
+</div>
+</div>
+<a id="ga6fe03b84359150b7dea3dfca942b6414"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6fe03b84359150b7dea3dfca942b6414">&#9670;&nbsp;</a></span>BRIDGEIF_MAX_PORTS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define BRIDGEIF_MAX_PORTS&#160;&#160;&#160;7</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>BRIDGEIF_MAX_PORTS: this is used to create a typedef used for forwarding bit-fields: the number of bits required is this + 1 (for the internal/cpu port) (63 is the maximum, resulting in an u64_t for the bit mask) ATTENTION: this controls the maximum number of the implementation only! The max. number of ports per bridge must still be passed via netif_add parameter! </p>
+
+</div>
+</div>
+<a id="ga5aed5cd9b01ba1345b47845cd04ca30d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5aed5cd9b01ba1345b47845cd04ca30d">&#9670;&nbsp;</a></span>BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT&#160;&#160;&#160;<a class="el" href="group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b">NO_SYS</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT==1: set port netif's 'input' function to call directly into bridgeif code and on top of that, directly call into the selected forwarding port's 'linkoutput' function. This means that the bridgeif input/output path is protected from concurrent access but as well, <em>all</em> bridge port netif's drivers must correctly handle concurrent access! == 0: get into tcpip_thread for every input packet (no multithreading) ATTENTION: as ==0 relies on <a class="el" href="tcpip_8h.html">tcpip.h</a>, the default depends on NO_SYS setting </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__bridgeif__opts.js b/doc/doxygen/output/html/group__bridgeif__opts.js
new file mode 100644
index 0000000..3797ba0
--- /dev/null
+++ b/doc/doxygen/output/html/group__bridgeif__opts.js
@@ -0,0 +1,8 @@
+var group__bridgeif__opts =
+[
+    [ "BRIDGEIF_DEBUG", "group__bridgeif__opts.html#gaab45e20e9b09a98217994082968cec73", null ],
+    [ "BRIDGEIF_FDB_DEBUG", "group__bridgeif__opts.html#ga72e389f592470dc50288a68f3db70730", null ],
+    [ "BRIDGEIF_FW_DEBUG", "group__bridgeif__opts.html#gac456e97b1b0e9a57449596a2b229763a", null ],
+    [ "BRIDGEIF_MAX_PORTS", "group__bridgeif__opts.html#ga6fe03b84359150b7dea3dfca942b6414", null ],
+    [ "BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT", "group__bridgeif__opts.html#ga5aed5cd9b01ba1345b47845cd04ca30d", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__callbackstyle__api.html b/doc/doxygen/output/html/group__callbackstyle__api.html
new file mode 100644
index 0000000..04ead62
--- /dev/null
+++ b/doc/doxygen/output/html/group__callbackstyle__api.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: &quot;raw&quot; APIs</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__callbackstyle__api.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">"raw" APIs<div class="ingroups"><a class="el" href="group__api.html">APIs</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__altcp__api"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__api.html">Application layered TCP Introduction</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__dns"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dns.html">DNS</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__ip"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip.html">IP</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__netif"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html">Network interface (NETIF)</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__raw__raw"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html">RAW</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__tcp__raw"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html">TCP</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__udp__raw"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__udp__raw.html">UDP</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__ethernet"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ethernet.html">Ethernet</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>
+<p>Non thread-safe APIs, callback style for maximum performance and minimum memory footprint. Program execution is driven by callbacks functions, which are then invoked by the lwIP core when activity related to that application occurs. A particular application may register to be notified via a callback function for events such as incoming data available, outgoing data sent, error notifications, poll timer expiration, connection closed, etc. An application can provide a callback function to perform processing for any or all of these events. Each callback is an ordinary C function that is called from within the TCP/IP code. Every callback function is passed the current TCP or UDP connection state as an argument. Also, in order to be able to keep program specific state, the callback functions are called with a program specified argument that is independent of the TCP/IP state. The raw API (sometimes called native API) is an event-driven API designed to be used without an operating system that implements zero-copy send and 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. </p>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__callbackstyle__api.js b/doc/doxygen/output/html/group__callbackstyle__api.js
new file mode 100644
index 0000000..639dec5
--- /dev/null
+++ b/doc/doxygen/output/html/group__callbackstyle__api.js
@@ -0,0 +1,11 @@
+var group__callbackstyle__api =
+[
+    [ "Application layered TCP Introduction", "group__altcp__api.html", "group__altcp__api" ],
+    [ "DNS", "group__dns.html", "group__dns" ],
+    [ "IP", "group__ip.html", "group__ip" ],
+    [ "Network interface (NETIF)", "group__netif.html", "group__netif" ],
+    [ "RAW", "group__raw__raw.html", "group__raw__raw" ],
+    [ "TCP", "group__tcp__raw.html", "group__tcp__raw" ],
+    [ "UDP", "group__udp__raw.html", "group__udp__raw" ],
+    [ "Ethernet", "group__ethernet.html", "group__ethernet" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__compiler__abstraction.html b/doc/doxygen/output/html/group__compiler__abstraction.html
new file mode 100644
index 0000000..e38c0ec
--- /dev/null
+++ b/doc/doxygen/output/html/group__compiler__abstraction.html
@@ -0,0 +1,681 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Compiler/platform abstraction</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__compiler__abstraction.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Compiler/platform abstraction<div class="ingroups"><a class="el" href="group__lwip.html">lwIP</a> &raquo; <a class="el" href="group__sys__layer.html">Porting (system abstraction layer)</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga1771b7fb65ee640524d0052f229768c3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga1771b7fb65ee640524d0052f229768c3">BYTE_ORDER</a>&#160;&#160;&#160;LITTLE_ENDIAN</td></tr>
+<tr class="separator:ga1771b7fb65ee640524d0052f229768c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga77370c377781ee7489e30eaf772ea05a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a">LWIP_RAND</a>()&#160;&#160;&#160;((u32_t)rand())</td></tr>
+<tr class="separator:ga77370c377781ee7489e30eaf772ea05a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaccef167be13a500ce30036030a9b142b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gaccef167be13a500ce30036030a9b142b">LWIP_PLATFORM_DIAG</a>(x)&#160;&#160;&#160;do {printf x;} while(0)</td></tr>
+<tr class="separator:gaccef167be13a500ce30036030a9b142b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7e8bcd0282525704d6dd596bdd1b47d0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga7e8bcd0282525704d6dd596bdd1b47d0">LWIP_PLATFORM_ASSERT</a>(x)</td></tr>
+<tr class="separator:ga7e8bcd0282525704d6dd596bdd1b47d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga53954d507c09e521ec0d44a2450bb89d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga53954d507c09e521ec0d44a2450bb89d">LWIP_NO_STDDEF_H</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga53954d507c09e521ec0d44a2450bb89d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga122c754db96ecad23bc6f4541d6360c1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga122c754db96ecad23bc6f4541d6360c1">LWIP_NO_STDINT_H</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga122c754db96ecad23bc6f4541d6360c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5bf52d6f2729d0c8afd365f69d7d4373"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga5bf52d6f2729d0c8afd365f69d7d4373">LWIP_NO_INTTYPES_H</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga5bf52d6f2729d0c8afd365f69d7d4373"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gade9c8513419a799cd78a07ae894bb805"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gade9c8513419a799cd78a07ae894bb805">LWIP_NO_LIMITS_H</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gade9c8513419a799cd78a07ae894bb805"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6871ce1e92ae09cdad39a9b230a3a800"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga6871ce1e92ae09cdad39a9b230a3a800">LWIP_NO_CTYPE_H</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga6871ce1e92ae09cdad39a9b230a3a800"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa0dd3f76dd9a837feaac61fedc0dbe72"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72">LWIP_CONST_CAST</a>(target_type,  val)&#160;&#160;&#160;((target_type)((ptrdiff_t)val))</td></tr>
+<tr class="separator:gaa0dd3f76dd9a837feaac61fedc0dbe72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaade87973d72135b0b3afccfff4f62eb8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gaade87973d72135b0b3afccfff4f62eb8">LWIP_ALIGNMENT_CAST</a>(target_type,  val)&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72">LWIP_CONST_CAST</a>(target_type, val)</td></tr>
+<tr class="separator:gaade87973d72135b0b3afccfff4f62eb8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga683e5c35d3263fe3145e6a6bc546604a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga683e5c35d3263fe3145e6a6bc546604a">LWIP_PTR_NUMERIC_CAST</a>(target_type,  val)&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72">LWIP_CONST_CAST</a>(target_type, val)</td></tr>
+<tr class="separator:ga683e5c35d3263fe3145e6a6bc546604a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4488578f18ad1a76e4fa8bc288c51446"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga4488578f18ad1a76e4fa8bc288c51446">LWIP_PACKED_CAST</a>(target_type,  val)&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72">LWIP_CONST_CAST</a>(target_type, val)</td></tr>
+<tr class="separator:ga4488578f18ad1a76e4fa8bc288c51446"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga651bb349041669fe717b19f127ef16c0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga651bb349041669fe717b19f127ef16c0">LWIP_DECLARE_MEMORY_ALIGNED</a>(variable_name,  size)&#160;&#160;&#160;u8_t variable_name[<a class="el" href="group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e">LWIP_MEM_ALIGN_BUFFER</a>(size)]</td></tr>
+<tr class="separator:ga651bb349041669fe717b19f127ef16c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaef204be511fd32f681b55abc08e9ae18"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18">LWIP_MEM_ALIGN_SIZE</a>(size)&#160;&#160;&#160;(((size) + <a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a> - 1U) &amp; ~(MEM_ALIGNMENT-1U))</td></tr>
+<tr class="separator:gaef204be511fd32f681b55abc08e9ae18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga25591dcb72fccc7b5dc46fbc1959694e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e">LWIP_MEM_ALIGN_BUFFER</a>(size)&#160;&#160;&#160;(((size) + <a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a> - 1U))</td></tr>
+<tr class="separator:ga25591dcb72fccc7b5dc46fbc1959694e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa8e8724eb1c220cbbb90de9e175ce1dc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gaa8e8724eb1c220cbbb90de9e175ce1dc">LWIP_MEM_ALIGN</a>(addr)&#160;&#160;&#160;((void *)(((mem_ptr_t)(addr) + <a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a> - 1) &amp; ~(mem_ptr_t)(<a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a>-1)))</td></tr>
+<tr class="separator:gaa8e8724eb1c220cbbb90de9e175ce1dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga73199061891adf1b912d20835c7d5e96"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga73199061891adf1b912d20835c7d5e96">PACK_STRUCT_BEGIN</a></td></tr>
+<tr class="separator:ga73199061891adf1b912d20835c7d5e96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga465fef70f294e21cbf4ea51fc342f20e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga465fef70f294e21cbf4ea51fc342f20e">PACK_STRUCT_END</a></td></tr>
+<tr class="separator:ga465fef70f294e21cbf4ea51fc342f20e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga33623da05bb55497534c3dc26ebebeb2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga33623da05bb55497534c3dc26ebebeb2">PACK_STRUCT_STRUCT</a></td></tr>
+<tr class="separator:ga33623da05bb55497534c3dc26ebebeb2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaab0b988124e37a978d9a88e7c1c778e0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gaab0b988124e37a978d9a88e7c1c778e0">PACK_STRUCT_FIELD</a>(x)&#160;&#160;&#160;x</td></tr>
+<tr class="separator:gaab0b988124e37a978d9a88e7c1c778e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa8f75e4117374c2d09fbda5566e40b62"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gaa8f75e4117374c2d09fbda5566e40b62">PACK_STRUCT_FLD_8</a>(x)&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaab0b988124e37a978d9a88e7c1c778e0">PACK_STRUCT_FIELD</a>(x)</td></tr>
+<tr class="separator:gaa8f75e4117374c2d09fbda5566e40b62"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacc89e224363eb0ebca24b64d925c3cb7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#gacc89e224363eb0ebca24b64d925c3cb7">PACK_STRUCT_FLD_S</a>(x)&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaab0b988124e37a978d9a88e7c1c778e0">PACK_STRUCT_FIELD</a>(x)</td></tr>
+<tr class="separator:gacc89e224363eb0ebca24b64d925c3cb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga57b90d36d8bea3798a5d1815945fd8ef"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga57b90d36d8bea3798a5d1815945fd8ef">PACK_STRUCT_USE_INCLUDES</a></td></tr>
+<tr class="separator:ga57b90d36d8bea3798a5d1815945fd8ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga70624a5deb8b9199406372a7f3603ecf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga70624a5deb8b9199406372a7f3603ecf">LWIP_UNUSED_ARG</a>(x)&#160;&#160;&#160;(void)x</td></tr>
+<tr class="separator:ga70624a5deb8b9199406372a7f3603ecf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8e2cba4c97dd38f4d517ed21cf109ade"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html#ga8e2cba4c97dd38f4d517ed21cf109ade">LWIP_PROVIDE_ERRNO</a></td></tr>
+<tr class="separator:ga8e2cba4c97dd38f4d517ed21cf109ade"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>All defines related to this section must not be placed in lwipopts.h, but in arch/cc.h! If the compiler does not provide memset() this file must include a definition of it, or include a file which defines it. These options cannot be #defined in lwipopts.h since they are not options of lwIP itself, but options of the lwIP port to your system. </p>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga1771b7fb65ee640524d0052f229768c3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1771b7fb65ee640524d0052f229768c3">&#9670;&nbsp;</a></span>BYTE_ORDER</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define BYTE_ORDER&#160;&#160;&#160;LITTLE_ENDIAN</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Define the byte order of the system. Needed for conversion of network data to host byte order. Allowed values: LITTLE_ENDIAN and BIG_ENDIAN </p>
+
+</div>
+</div>
+<a id="gaade87973d72135b0b3afccfff4f62eb8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaade87973d72135b0b3afccfff4f62eb8">&#9670;&nbsp;</a></span>LWIP_ALIGNMENT_CAST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ALIGNMENT_CAST</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">target_type, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">val&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72">LWIP_CONST_CAST</a>(target_type, val)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get rid of alignment cast warnings (GCC -Wcast-align) </p>
+
+</div>
+</div>
+<a id="gaa0dd3f76dd9a837feaac61fedc0dbe72"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa0dd3f76dd9a837feaac61fedc0dbe72">&#9670;&nbsp;</a></span>LWIP_CONST_CAST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_CONST_CAST</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">target_type, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">val&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((target_type)((ptrdiff_t)val))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>C++ const_cast&lt;target_type&gt;(val) equivalent to remove constness from a value (GCC -Wcast-qual) </p>
+
+</div>
+</div>
+<a id="ga651bb349041669fe717b19f127ef16c0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga651bb349041669fe717b19f127ef16c0">&#9670;&nbsp;</a></span>LWIP_DECLARE_MEMORY_ALIGNED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DECLARE_MEMORY_ALIGNED</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">variable_name, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">size&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;u8_t variable_name[<a class="el" href="group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e">LWIP_MEM_ALIGN_BUFFER</a>(size)]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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="group__compiler__abstraction.html#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="group__compiler__abstraction.html#ga651bb349041669fe717b19f127ef16c0">LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size)</a> u32_t variable_name[(size + sizeof(u32_t) - 1) / sizeof(u32_t)] </p>
+
+</div>
+</div>
+<a id="gaa8e8724eb1c220cbbb90de9e175ce1dc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa8e8724eb1c220cbbb90de9e175ce1dc">&#9670;&nbsp;</a></span>LWIP_MEM_ALIGN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_MEM_ALIGN</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addr</td><td>)</td>
+          <td>&#160;&#160;&#160;((void *)(((mem_ptr_t)(addr) + <a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a> - 1) &amp; ~(mem_ptr_t)(<a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a>-1)))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Align a memory pointer to the alignment defined by MEM_ALIGNMENT so that ADDR % MEM_ALIGNMENT == 0 </p>
+
+</div>
+</div>
+<a id="ga25591dcb72fccc7b5dc46fbc1959694e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga25591dcb72fccc7b5dc46fbc1959694e">&#9670;&nbsp;</a></span>LWIP_MEM_ALIGN_BUFFER</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_MEM_ALIGN_BUFFER</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">size</td><td>)</td>
+          <td>&#160;&#160;&#160;(((size) + <a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a> - 1U))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Calculate safe memory size for an aligned buffer when using an unaligned type as storage. This includes a safety-margin on (MEM_ALIGNMENT - 1) at the start (e.g. if buffer is u8_t[] and actual data will be u32_t*) </p>
+
+</div>
+</div>
+<a id="gaef204be511fd32f681b55abc08e9ae18"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaef204be511fd32f681b55abc08e9ae18">&#9670;&nbsp;</a></span>LWIP_MEM_ALIGN_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_MEM_ALIGN_SIZE</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">size</td><td>)</td>
+          <td>&#160;&#160;&#160;(((size) + <a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a> - 1U) &amp; ~(MEM_ALIGNMENT-1U))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Calculate memory size for an aligned buffer - returns the next highest multiple of MEM_ALIGNMENT (e.g. <a class="el" href="group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18">LWIP_MEM_ALIGN_SIZE(3)</a> and <a class="el" href="group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18">LWIP_MEM_ALIGN_SIZE(4)</a> will both yield 4 for MEM_ALIGNMENT == 4). </p>
+
+</div>
+</div>
+<a id="ga6871ce1e92ae09cdad39a9b230a3a800"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6871ce1e92ae09cdad39a9b230a3a800">&#9670;&nbsp;</a></span>LWIP_NO_CTYPE_H</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NO_CTYPE_H&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Define this to 1 in arch/cc.h of your port if your compiler does not provide the ctype.h header. If ctype.h is available, a few character functions are mapped to the appropriate functions (lwip_islower, lwip_isdigit...), if not, a private implementation is provided. </p>
+
+</div>
+</div>
+<a id="ga5bf52d6f2729d0c8afd365f69d7d4373"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5bf52d6f2729d0c8afd365f69d7d4373">&#9670;&nbsp;</a></span>LWIP_NO_INTTYPES_H</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NO_INTTYPES_H&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Define this to 1 in arch/cc.h of your port if your compiler does not provide the inttypes.h header. You need to define the format strings listed in <a class="el" href="arch_8h.html">lwip/arch.h</a> yourself in this case (X8_F, U16_F...). </p>
+
+</div>
+</div>
+<a id="gade9c8513419a799cd78a07ae894bb805"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gade9c8513419a799cd78a07ae894bb805">&#9670;&nbsp;</a></span>LWIP_NO_LIMITS_H</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NO_LIMITS_H&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Define this to 1 in arch/cc.h of your port if your compiler does not provide the limits.h header. You need to define the type limits yourself in this case (e.g. INT_MAX, SSIZE_MAX). </p>
+
+</div>
+</div>
+<a id="ga53954d507c09e521ec0d44a2450bb89d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga53954d507c09e521ec0d44a2450bb89d">&#9670;&nbsp;</a></span>LWIP_NO_STDDEF_H</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NO_STDDEF_H&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Define this to 1 in arch/cc.h of your port if you do not want to include stddef.h header to get size_t. You need to typedef size_t by yourself in this case. </p>
+
+</div>
+</div>
+<a id="ga122c754db96ecad23bc6f4541d6360c1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga122c754db96ecad23bc6f4541d6360c1">&#9670;&nbsp;</a></span>LWIP_NO_STDINT_H</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NO_STDINT_H&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Define this to 1 in arch/cc.h of your port if your compiler does not provide the stdint.h header. You need to typedef the generic types listed in <a class="el" href="arch_8h.html">lwip/arch.h</a> yourself in this case (u8_t, u16_t...). </p>
+
+</div>
+</div>
+<a id="ga4488578f18ad1a76e4fa8bc288c51446"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4488578f18ad1a76e4fa8bc288c51446">&#9670;&nbsp;</a></span>LWIP_PACKED_CAST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_PACKED_CAST</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">target_type, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">val&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72">LWIP_CONST_CAST</a>(target_type, val)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Avoid warnings/errors related to implicitly casting away packed attributes by doing a explicit cast </p>
+
+</div>
+</div>
+<a id="ga7e8bcd0282525704d6dd596bdd1b47d0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7e8bcd0282525704d6dd596bdd1b47d0">&#9670;&nbsp;</a></span>LWIP_PLATFORM_ASSERT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_PLATFORM_ASSERT</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">x</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> {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>
+
+</div>
+</div>
+<a id="gaccef167be13a500ce30036030a9b142b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaccef167be13a500ce30036030a9b142b">&#9670;&nbsp;</a></span>LWIP_PLATFORM_DIAG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_PLATFORM_DIAG</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">x</td><td>)</td>
+          <td>&#160;&#160;&#160;do {printf x;} while(0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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>
+
+</div>
+</div>
+<a id="ga8e2cba4c97dd38f4d517ed21cf109ade"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8e2cba4c97dd38f4d517ed21cf109ade">&#9670;&nbsp;</a></span>LWIP_PROVIDE_ERRNO</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_PROVIDE_ERRNO</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_PROVIDE_ERRNO==1: Let lwIP provide ERRNO values and the 'errno' variable. If this is disabled, cc.h must either define 'errno', include &lt;errno.h&gt;, define LWIP_ERRNO_STDINCLUDE to get &lt;errno.h&gt; included or define LWIP_ERRNO_INCLUDE to &lt;errno.h&gt; or equivalent. </p>
+
+</div>
+</div>
+<a id="ga683e5c35d3263fe3145e6a6bc546604a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga683e5c35d3263fe3145e6a6bc546604a">&#9670;&nbsp;</a></span>LWIP_PTR_NUMERIC_CAST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_PTR_NUMERIC_CAST</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">target_type, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">val&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72">LWIP_CONST_CAST</a>(target_type, val)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get rid of warnings related to pointer-to-numeric and vice-versa casts, e.g. "conversion from 'u8_t' to 'void *' of greater size" </p>
+
+</div>
+</div>
+<a id="ga77370c377781ee7489e30eaf772ea05a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga77370c377781ee7489e30eaf772ea05a">&#9670;&nbsp;</a></span>LWIP_RAND</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_RAND</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;((u32_t)rand())</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Define random number generator function of your system </p>
+
+</div>
+</div>
+<a id="ga70624a5deb8b9199406372a7f3603ecf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga70624a5deb8b9199406372a7f3603ecf">&#9670;&nbsp;</a></span>LWIP_UNUSED_ARG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_UNUSED_ARG</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">x</td><td>)</td>
+          <td>&#160;&#160;&#160;(void)x</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Eliminates compiler warning about unused arguments (GCC -Wextra -Wunused). </p>
+
+</div>
+</div>
+<a id="ga73199061891adf1b912d20835c7d5e96"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga73199061891adf1b912d20835c7d5e96">&#9670;&nbsp;</a></span>PACK_STRUCT_BEGIN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PACK_STRUCT_BEGIN</td>
+        </tr>
+      </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>
+
+</div>
+</div>
+<a id="ga465fef70f294e21cbf4ea51fc342f20e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga465fef70f294e21cbf4ea51fc342f20e">&#9670;&nbsp;</a></span>PACK_STRUCT_END</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PACK_STRUCT_END</td>
+        </tr>
+      </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>
+
+</div>
+</div>
+<a id="gaab0b988124e37a978d9a88e7c1c778e0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaab0b988124e37a978d9a88e7c1c778e0">&#9670;&nbsp;</a></span>PACK_STRUCT_FIELD</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PACK_STRUCT_FIELD</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">x</td><td>)</td>
+          <td>&#160;&#160;&#160;x</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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>
+
+</div>
+</div>
+<a id="gaa8f75e4117374c2d09fbda5566e40b62"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa8f75e4117374c2d09fbda5566e40b62">&#9670;&nbsp;</a></span>PACK_STRUCT_FLD_8</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PACK_STRUCT_FLD_8</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">x</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaab0b988124e37a978d9a88e7c1c778e0">PACK_STRUCT_FIELD</a>(x)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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>
+
+</div>
+</div>
+<a id="gacc89e224363eb0ebca24b64d925c3cb7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacc89e224363eb0ebca24b64d925c3cb7">&#9670;&nbsp;</a></span>PACK_STRUCT_FLD_S</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PACK_STRUCT_FLD_S</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">x</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaab0b988124e37a978d9a88e7c1c778e0">PACK_STRUCT_FIELD</a>(x)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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>
+
+</div>
+</div>
+<a id="ga33623da05bb55497534c3dc26ebebeb2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga33623da05bb55497534c3dc26ebebeb2">&#9670;&nbsp;</a></span>PACK_STRUCT_STRUCT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PACK_STRUCT_STRUCT</td>
+        </tr>
+      </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>
+
+</div>
+</div>
+<a id="ga57b90d36d8bea3798a5d1815945fd8ef"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga57b90d36d8bea3798a5d1815945fd8ef">&#9670;&nbsp;</a></span>PACK_STRUCT_USE_INCLUDES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PACK_STRUCT_USE_INCLUDES</td>
+        </tr>
+      </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>
+
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__compiler__abstraction.js b/doc/doxygen/output/html/group__compiler__abstraction.js
new file mode 100644
index 0000000..060a4d8
--- /dev/null
+++ b/doc/doxygen/output/html/group__compiler__abstraction.js
@@ -0,0 +1,29 @@
+var group__compiler__abstraction =
+[
+    [ "BYTE_ORDER", "group__compiler__abstraction.html#ga1771b7fb65ee640524d0052f229768c3", null ],
+    [ "LWIP_ALIGNMENT_CAST", "group__compiler__abstraction.html#gaade87973d72135b0b3afccfff4f62eb8", null ],
+    [ "LWIP_CONST_CAST", "group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72", null ],
+    [ "LWIP_DECLARE_MEMORY_ALIGNED", "group__compiler__abstraction.html#ga651bb349041669fe717b19f127ef16c0", null ],
+    [ "LWIP_MEM_ALIGN", "group__compiler__abstraction.html#gaa8e8724eb1c220cbbb90de9e175ce1dc", null ],
+    [ "LWIP_MEM_ALIGN_BUFFER", "group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e", null ],
+    [ "LWIP_MEM_ALIGN_SIZE", "group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18", null ],
+    [ "LWIP_NO_CTYPE_H", "group__compiler__abstraction.html#ga6871ce1e92ae09cdad39a9b230a3a800", null ],
+    [ "LWIP_NO_INTTYPES_H", "group__compiler__abstraction.html#ga5bf52d6f2729d0c8afd365f69d7d4373", null ],
+    [ "LWIP_NO_LIMITS_H", "group__compiler__abstraction.html#gade9c8513419a799cd78a07ae894bb805", null ],
+    [ "LWIP_NO_STDDEF_H", "group__compiler__abstraction.html#ga53954d507c09e521ec0d44a2450bb89d", null ],
+    [ "LWIP_NO_STDINT_H", "group__compiler__abstraction.html#ga122c754db96ecad23bc6f4541d6360c1", null ],
+    [ "LWIP_PACKED_CAST", "group__compiler__abstraction.html#ga4488578f18ad1a76e4fa8bc288c51446", null ],
+    [ "LWIP_PLATFORM_ASSERT", "group__compiler__abstraction.html#ga7e8bcd0282525704d6dd596bdd1b47d0", null ],
+    [ "LWIP_PLATFORM_DIAG", "group__compiler__abstraction.html#gaccef167be13a500ce30036030a9b142b", null ],
+    [ "LWIP_PROVIDE_ERRNO", "group__compiler__abstraction.html#ga8e2cba4c97dd38f4d517ed21cf109ade", null ],
+    [ "LWIP_PTR_NUMERIC_CAST", "group__compiler__abstraction.html#ga683e5c35d3263fe3145e6a6bc546604a", null ],
+    [ "LWIP_RAND", "group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a", null ],
+    [ "LWIP_UNUSED_ARG", "group__compiler__abstraction.html#ga70624a5deb8b9199406372a7f3603ecf", null ],
+    [ "PACK_STRUCT_BEGIN", "group__compiler__abstraction.html#ga73199061891adf1b912d20835c7d5e96", null ],
+    [ "PACK_STRUCT_END", "group__compiler__abstraction.html#ga465fef70f294e21cbf4ea51fc342f20e", null ],
+    [ "PACK_STRUCT_FIELD", "group__compiler__abstraction.html#gaab0b988124e37a978d9a88e7c1c778e0", null ],
+    [ "PACK_STRUCT_FLD_8", "group__compiler__abstraction.html#gaa8f75e4117374c2d09fbda5566e40b62", null ],
+    [ "PACK_STRUCT_FLD_S", "group__compiler__abstraction.html#gacc89e224363eb0ebca24b64d925c3cb7", null ],
+    [ "PACK_STRUCT_STRUCT", "group__compiler__abstraction.html#ga33623da05bb55497534c3dc26ebebeb2", null ],
+    [ "PACK_STRUCT_USE_INCLUDES", "group__compiler__abstraction.html#ga57b90d36d8bea3798a5d1815945fd8ef", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__debugging__levels.html b/doc/doxygen/output/html/group__debugging__levels.html
new file mode 100644
index 0000000..45bf558
--- /dev/null
+++ b/doc/doxygen/output/html/group__debugging__levels.html
@@ -0,0 +1,281 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: LWIP_DBG_MIN_LEVEL and LWIP_DBG_TYPES_ON values</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__debugging__levels.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">LWIP_DBG_MIN_LEVEL and LWIP_DBG_TYPES_ON values<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__debug.html">Debugging</a> &raquo; <a class="el" href="group__lwip__opts__debugmsg.html">Debug messages</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="member-group"></a>
+Debug level (LWIP_DBG_MIN_LEVEL)</h2></td></tr>
+<tr class="memitem:ga8ebaeb006b43f55897f3196b3617dc87"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#ga8ebaeb006b43f55897f3196b3617dc87">LWIP_DBG_LEVEL_ALL</a>&#160;&#160;&#160;0x00</td></tr>
+<tr class="separator:ga8ebaeb006b43f55897f3196b3617dc87"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga77c491e468bf7d9a1bc48430c1866a96"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#ga77c491e468bf7d9a1bc48430c1866a96">LWIP_DBG_LEVEL_WARNING</a>&#160;&#160;&#160;0x01</td></tr>
+<tr class="separator:ga77c491e468bf7d9a1bc48430c1866a96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0269bdc51f1e8a5ecf9af72c6e1c996c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#ga0269bdc51f1e8a5ecf9af72c6e1c996c">LWIP_DBG_LEVEL_SERIOUS</a>&#160;&#160;&#160;0x02</td></tr>
+<tr class="separator:ga0269bdc51f1e8a5ecf9af72c6e1c996c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaab41143277cd38047b6660d90e9cec3b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#gaab41143277cd38047b6660d90e9cec3b">LWIP_DBG_LEVEL_SEVERE</a>&#160;&#160;&#160;0x03</td></tr>
+<tr class="separator:gaab41143277cd38047b6660d90e9cec3b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="member-group"></a>
+Enable/disable debug messages completely (LWIP_DBG_TYPES_ON)</h2></td></tr>
+<tr class="memitem:ga9e31b7cbbc8f46af8e62b548079acd4e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#ga9e31b7cbbc8f46af8e62b548079acd4e">LWIP_DBG_ON</a>&#160;&#160;&#160;0x80U</td></tr>
+<tr class="separator:ga9e31b7cbbc8f46af8e62b548079acd4e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadab1cdc3f45939a3a5c9a3d7e04987e1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a>&#160;&#160;&#160;0x00U</td></tr>
+<tr class="separator:gadab1cdc3f45939a3a5c9a3d7e04987e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="member-group"></a>
+Debug message types (LWIP_DBG_TYPES_ON)</h2></td></tr>
+<tr class="memitem:ga988147559b78642ac881815b66023646"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#ga988147559b78642ac881815b66023646">LWIP_DBG_TRACE</a>&#160;&#160;&#160;0x40U</td></tr>
+<tr class="separator:ga988147559b78642ac881815b66023646"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga511ee3deb3240635f5ec6a1709c6d741"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#ga511ee3deb3240635f5ec6a1709c6d741">LWIP_DBG_STATE</a>&#160;&#160;&#160;0x20U</td></tr>
+<tr class="separator:ga511ee3deb3240635f5ec6a1709c6d741"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7d44d1804fa5e747aed86816e2a6cae0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#ga7d44d1804fa5e747aed86816e2a6cae0">LWIP_DBG_FRESH</a>&#160;&#160;&#160;0x10U</td></tr>
+<tr class="separator:ga7d44d1804fa5e747aed86816e2a6cae0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab0a296414983155b30ad51871606b90f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html#gab0a296414983155b30ad51871606b90f">LWIP_DBG_HALT</a>&#160;&#160;&#160;0x08U</td></tr>
+<tr class="separator:gab0a296414983155b30ad51871606b90f"><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="ga7d44d1804fa5e747aed86816e2a6cae0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7d44d1804fa5e747aed86816e2a6cae0">&#9670;&nbsp;</a></span>LWIP_DBG_FRESH</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DBG_FRESH&#160;&#160;&#160;0x10U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>flag for LWIP_DEBUGF indicating newly added code, not thoroughly tested yet </p>
+
+</div>
+</div>
+<a id="gab0a296414983155b30ad51871606b90f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab0a296414983155b30ad51871606b90f">&#9670;&nbsp;</a></span>LWIP_DBG_HALT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DBG_HALT&#160;&#160;&#160;0x08U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>flag for LWIP_DEBUGF to halt after printing this debug message </p>
+
+</div>
+</div>
+<a id="ga8ebaeb006b43f55897f3196b3617dc87"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8ebaeb006b43f55897f3196b3617dc87">&#9670;&nbsp;</a></span>LWIP_DBG_LEVEL_ALL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DBG_LEVEL_ALL&#160;&#160;&#160;0x00</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Debug level: ALL messages </p>
+
+</div>
+</div>
+<a id="ga0269bdc51f1e8a5ecf9af72c6e1c996c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0269bdc51f1e8a5ecf9af72c6e1c996c">&#9670;&nbsp;</a></span>LWIP_DBG_LEVEL_SERIOUS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DBG_LEVEL_SERIOUS&#160;&#160;&#160;0x02</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Debug level: Serious. memory allocation failures, ... </p>
+
+</div>
+</div>
+<a id="gaab41143277cd38047b6660d90e9cec3b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaab41143277cd38047b6660d90e9cec3b">&#9670;&nbsp;</a></span>LWIP_DBG_LEVEL_SEVERE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DBG_LEVEL_SEVERE&#160;&#160;&#160;0x03</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Debug level: Severe </p>
+
+</div>
+</div>
+<a id="ga77c491e468bf7d9a1bc48430c1866a96"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga77c491e468bf7d9a1bc48430c1866a96">&#9670;&nbsp;</a></span>LWIP_DBG_LEVEL_WARNING</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DBG_LEVEL_WARNING&#160;&#160;&#160;0x01</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Debug level: Warnings. bad checksums, dropped packets, ... </p>
+
+</div>
+</div>
+<a id="gadab1cdc3f45939a3a5c9a3d7e04987e1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadab1cdc3f45939a3a5c9a3d7e04987e1">&#9670;&nbsp;</a></span>LWIP_DBG_OFF</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DBG_OFF&#160;&#160;&#160;0x00U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>flag for LWIP_DEBUGF to disable that debug message </p>
+
+</div>
+</div>
+<a id="ga9e31b7cbbc8f46af8e62b548079acd4e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9e31b7cbbc8f46af8e62b548079acd4e">&#9670;&nbsp;</a></span>LWIP_DBG_ON</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DBG_ON&#160;&#160;&#160;0x80U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>flag for LWIP_DEBUGF to enable that debug message </p>
+
+</div>
+</div>
+<a id="ga511ee3deb3240635f5ec6a1709c6d741"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga511ee3deb3240635f5ec6a1709c6d741">&#9670;&nbsp;</a></span>LWIP_DBG_STATE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DBG_STATE&#160;&#160;&#160;0x20U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>flag for LWIP_DEBUGF indicating a state debug message (to follow module states) </p>
+
+</div>
+</div>
+<a id="ga988147559b78642ac881815b66023646"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga988147559b78642ac881815b66023646">&#9670;&nbsp;</a></span>LWIP_DBG_TRACE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DBG_TRACE&#160;&#160;&#160;0x40U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>flag for LWIP_DEBUGF indicating a tracing message (to follow program flow) </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__debugging__levels.js b/doc/doxygen/output/html/group__debugging__levels.js
new file mode 100644
index 0000000..386bcd4
--- /dev/null
+++ b/doc/doxygen/output/html/group__debugging__levels.js
@@ -0,0 +1,13 @@
+var group__debugging__levels =
+[
+    [ "LWIP_DBG_FRESH", "group__debugging__levels.html#ga7d44d1804fa5e747aed86816e2a6cae0", null ],
+    [ "LWIP_DBG_HALT", "group__debugging__levels.html#gab0a296414983155b30ad51871606b90f", null ],
+    [ "LWIP_DBG_LEVEL_ALL", "group__debugging__levels.html#ga8ebaeb006b43f55897f3196b3617dc87", null ],
+    [ "LWIP_DBG_LEVEL_SERIOUS", "group__debugging__levels.html#ga0269bdc51f1e8a5ecf9af72c6e1c996c", null ],
+    [ "LWIP_DBG_LEVEL_SEVERE", "group__debugging__levels.html#gaab41143277cd38047b6660d90e9cec3b", null ],
+    [ "LWIP_DBG_LEVEL_WARNING", "group__debugging__levels.html#ga77c491e468bf7d9a1bc48430c1866a96", null ],
+    [ "LWIP_DBG_OFF", "group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1", null ],
+    [ "LWIP_DBG_ON", "group__debugging__levels.html#ga9e31b7cbbc8f46af8e62b548079acd4e", null ],
+    [ "LWIP_DBG_STATE", "group__debugging__levels.html#ga511ee3deb3240635f5ec6a1709c6d741", null ],
+    [ "LWIP_DBG_TRACE", "group__debugging__levels.html#ga988147559b78642ac881815b66023646", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__dhcp4.html b/doc/doxygen/output/html/group__dhcp4.html
new file mode 100644
index 0000000..49ac6d4
--- /dev/null
+++ b/doc/doxygen/output/html/group__dhcp4.html
@@ -0,0 +1,339 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: DHCPv4</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__dhcp4.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">DHCPv4<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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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>
+<tr class="separator:ga43812097832716a462c660eb59cc1bf8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga292a1b0c0c288ec508108a3fba473e64"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64">dhcp_cleanup</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga292a1b0c0c288ec508108a3fba473e64"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0c50968d9811aa2aa67fadc0885d744f"><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#ga0c50968d9811aa2aa67fadc0885d744f">dhcp_start</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga0c50968d9811aa2aa67fadc0885d744f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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"><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>
+<tr class="separator:gaf7cd42b9f220446b6a597d3474da6ece"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf92f7afb58252f82a749064602974bd4"><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#gaf92f7afb58252f82a749064602974bd4">dhcp_release</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gaf92f7afb58252f82a749064602974bd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga93f6bf21086dc9b10c0bec4676f97312"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312">dhcp_stop</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga93f6bf21086dc9b10c0bec4676f97312"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>DHCP (IPv4) related functions This is a DHCP client for the lwIP TCP/IP stack. It aims to conform with RFC 2131 and RFC 2132.</p>
+<p>Options: <a class="el" href="dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e">DHCP_COARSE_TIMER_SECS</a> (recommended 60 which is a minute) <a class="el" href="dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f">DHCP_FINE_TIMER_MSECS</a> (recommended 500 which equals TCP coarse timer)</p>
+<p><a class="el" href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp_start()</a> starts a DHCP client instance which configures the interface by obtaining an IP address lease and maintaining it.</p>
+<p>Use <a class="el" href="group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4">dhcp_release()</a> to end the lease and use <a class="el" href="group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312">dhcp_stop()</a> to remove the DHCP client.</p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__lwip__opts__hooks.html#ga40e6c9aba06e66e5df1b4ca18329f9b4">LWIP_HOOK_DHCP_APPEND_OPTIONS</a> </dd>
+<dd>
+<a class="el" href="group__lwip__opts__hooks.html#gafbbbc574863c0f88988936bd1434f2d2">LWIP_HOOK_DHCP_PARSE_OPTION</a></dd>
+<dd>
+<a class="el" href="group__netifapi__dhcp4.html">DHCPv4</a> </dd></dl>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga292a1b0c0c288ec508108a3fba473e64"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga292a1b0c0c288ec508108a3fba473e64">&#9670;&nbsp;</a></span>dhcp_cleanup()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp_cleanup </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Removes a struct dhcp from a netif.</p>
+<p>ATTENTION: Only use this when not using <a class="el" href="group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8">dhcp_set_struct()</a> to allocate the struct dhcp since the memory is passed back to the heap.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the netif from which to remove the struct dhcp </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gabd7fcc7e0799e313885fc7fd9d4992ad"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabd7fcc7e0799e313885fc7fd9d4992ad">&#9670;&nbsp;</a></span>dhcp_inform()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp_inform </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Inform a DHCP server of our manual configuration.</p>
+<p>This informs DHCP servers of our fixed IP address configuration by sending an INFORM message. It does not involve DHCP address configuration, it is just here to be nice to the network.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The lwIP network interface </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gaf92f7afb58252f82a749064602974bd4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf92f7afb58252f82a749064602974bd4">&#9670;&nbsp;</a></span>dhcp_release()</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> dhcp_release </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function calls <a class="el" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp_release_and_stop()</a> internally. </p><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>Use <a class="el" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp_release_and_stop()</a> instead. </dd></dl>
+
+</div>
+</div>
+<a id="gaf7cd42b9f220446b6a597d3474da6ece"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf7cd42b9f220446b6a597d3474da6ece">&#9670;&nbsp;</a></span>dhcp_release_and_stop()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp_release_and_stop </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Release a DHCP lease and stop DHCP statemachine (and AUTOIP if LWIP_DHCP_AUTOIP_COOP).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga583eb8d58f5e96b7dea717948578a947"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga583eb8d58f5e96b7dea717948578a947">&#9670;&nbsp;</a></span>dhcp_renew()</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> dhcp_renew </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Renew an existing DHCP lease at the involved DHCP server.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface which must renew its lease </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga43812097832716a462c660eb59cc1bf8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga43812097832716a462c660eb59cc1bf8">&#9670;&nbsp;</a></span>dhcp_set_struct()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp_set_struct </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct dhcp *&#160;</td>
+          <td class="paramname"><em>dhcp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set a statically allocated struct dhcp to work with. Using this prevents dhcp_start to allocate it using mem_malloc.</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 dhcp </td></tr>
+    <tr><td class="paramname">dhcp</td><td>(uninitialised) dhcp struct allocated by the application </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga0c50968d9811aa2aa67fadc0885d744f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0c50968d9811aa2aa67fadc0885d744f">&#9670;&nbsp;</a></span>dhcp_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> dhcp_start </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Start DHCP negotiation for a network interface.</p>
+<p>If no DHCP client instance was attached to this interface, a new client is created first. If a DHCP client instance was already present, it restarts negotiation.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The lwIP network interface </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>lwIP error code<ul>
+<li>ERR_OK - No error</li>
+<li>ERR_MEM - Out of memory </li>
+</ul>
+</dd></dl>
+
+</div>
+</div>
+<a id="ga93f6bf21086dc9b10c0bec4676f97312"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga93f6bf21086dc9b10c0bec4676f97312">&#9670;&nbsp;</a></span>dhcp_stop()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp_stop </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function calls <a class="el" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp_release_and_stop()</a> internally. </p><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000002">Deprecated:</a></b></dt><dd>Use <a class="el" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp_release_and_stop()</a> instead. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__dhcp4.js b/doc/doxygen/output/html/group__dhcp4.js
new file mode 100644
index 0000000..d703d74
--- /dev/null
+++ b/doc/doxygen/output/html/group__dhcp4.js
@@ -0,0 +1,11 @@
+var group__dhcp4 =
+[
+    [ "dhcp_cleanup", "group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64", null ],
+    [ "dhcp_inform", "group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad", 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 ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__dhcp6.html b/doc/doxygen/output/html/group__dhcp6.html
new file mode 100644
index 0000000..7be9b43
--- /dev/null
+++ b/doc/doxygen/output/html/group__dhcp6.html
@@ -0,0 +1,251 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: DHCPv6</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__dhcp6.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">DHCPv6<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__ip6.html">IPv6</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga5cdf4082c8a4ee6bf0cb874c0eaa8453"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453">dhcp6_set_struct</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct dhcp6 *dhcp6)</td></tr>
+<tr class="separator:ga5cdf4082c8a4ee6bf0cb874c0eaa8453"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacb7042000509fb21e8d2758e235d6dde"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde">dhcp6_cleanup</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gacb7042000509fb21e8d2758e235d6dde"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa9e972fcd1d648ca5f02334b1591b619"><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__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619">dhcp6_enable_stateful</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gaa9e972fcd1d648ca5f02334b1591b619"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf3349463541e673fec33843eb019b18c"><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__dhcp6.html#gaf3349463541e673fec33843eb019b18c">dhcp6_enable_stateless</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gaf3349463541e673fec33843eb019b18c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadd0c783a85a410f75b37a3d922ad60d2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2">dhcp6_disable</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gadd0c783a85a410f75b37a3d922ad60d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>DHCPv6 client: IPv6 address autoconfiguration as per RFC 3315 (stateful DHCPv6) and RFC 3736 (stateless DHCPv6).</p>
+<p>For now, only stateless DHCPv6 is implemented!</p>
+<p>TODO:</p><ul>
+<li>enable/disable API to not always start when RA is received</li>
+<li>stateful DHCPv6 (for now, only stateless DHCPv6 for DNS and NTP servers works)</li>
+<li>create Client Identifier?</li>
+<li>only start requests if a valid local address is available on the netif</li>
+<li>only start information requests if required (not for every RA)</li>
+</ul>
+<p><a class="el" href="group__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619">dhcp6_enable_stateful()</a> enables stateful DHCPv6 for a netif (stateless disabled)<br />
+<a class="el" href="group__dhcp6.html#gaf3349463541e673fec33843eb019b18c">dhcp6_enable_stateless()</a> enables stateless DHCPv6 for a netif (stateful disabled)<br />
+<a class="el" href="group__dhcp6.html#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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacb7042000509fb21e8d2758e235d6dde">&#9670;&nbsp;</a></span>dhcp6_cleanup()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp6_cleanup </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Removes a struct dhcp6 from a netif.</p>
+<p>ATTENTION: Only use this when not using <a class="el" href="group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453">dhcp6_set_struct()</a> to allocate the struct dhcp6 since the memory is passed back to the heap.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the netif from which to remove the struct dhcp </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gadd0c783a85a410f75b37a3d922ad60d2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadd0c783a85a410f75b37a3d922ad60d2">&#9670;&nbsp;</a></span>dhcp6_disable()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp6_disable </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Disable stateful or stateless DHCPv6 on this netif Requests are sent on receipt of an RA message with the ND6_RA_FLAG_OTHER_CONFIG flag set. </p>
+
+</div>
+</div>
+<a id="gaa9e972fcd1d648ca5f02334b1591b619"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa9e972fcd1d648ca5f02334b1591b619">&#9670;&nbsp;</a></span>dhcp6_enable_stateful()</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> dhcp6_enable_stateful </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Enable stateful DHCPv6 on this netif Requests are sent on receipt of an RA message with the ND6_RA_FLAG_MANAGED_ADDR_CONFIG flag set.</p>
+<p>A struct dhcp6 will be allocated for this netif if not set via <a class="el" href="group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453">dhcp6_set_struct</a> before.</p>
+
+</div>
+</div>
+<a id="gaf3349463541e673fec33843eb019b18c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf3349463541e673fec33843eb019b18c">&#9670;&nbsp;</a></span>dhcp6_enable_stateless()</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> dhcp6_enable_stateless </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Enable stateless DHCPv6 on this netif Requests are sent on receipt of an RA message with the ND6_RA_FLAG_OTHER_CONFIG flag set.</p>
+<p>A struct dhcp6 will be allocated for this netif if not set via <a class="el" href="group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453">dhcp6_set_struct</a> before. </p>
+
+</div>
+</div>
+<a id="ga5cdf4082c8a4ee6bf0cb874c0eaa8453"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5cdf4082c8a4ee6bf0cb874c0eaa8453">&#9670;&nbsp;</a></span>dhcp6_set_struct()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dhcp6_set_struct </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct dhcp6 *&#160;</td>
+          <td class="paramname"><em>dhcp6</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set a statically allocated struct dhcp6 to work with. Using this prevents dhcp6_start to allocate it using mem_malloc.</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 dhcp </td></tr>
+    <tr><td class="paramname">dhcp6</td><td>(uninitialised) dhcp6 struct allocated by the application </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__dhcp6.js b/doc/doxygen/output/html/group__dhcp6.js
new file mode 100644
index 0000000..788e32f
--- /dev/null
+++ b/doc/doxygen/output/html/group__dhcp6.js
@@ -0,0 +1,8 @@
+var group__dhcp6 =
+[
+    [ "dhcp6_cleanup", "group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde", null ],
+    [ "dhcp6_disable", "group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2", null ],
+    [ "dhcp6_enable_stateful", "group__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619", null ],
+    [ "dhcp6_enable_stateless", "group__dhcp6.html#gaf3349463541e673fec33843eb019b18c", null ],
+    [ "dhcp6_set_struct", "group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__dns.html b/doc/doxygen/output/html/group__dns.html
new file mode 100644
index 0000000..50ee9ec
--- /dev/null
+++ b/doc/doxygen/output/html/group__dns.html
@@ -0,0 +1,305 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: DNS</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__dns.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">DNS<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaf66c5d8273f83cdc2cdd8911fb68d584"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584">dns_setserver</a> (u8_t numdns, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dnsserver)</td></tr>
+<tr class="separator:gaf66c5d8273f83cdc2cdd8911fb68d584"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad02111a6b26b93f1c3580d5f41a59af3"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dns.html#gad02111a6b26b93f1c3580d5f41a59af3">dns_getserver</a> (u8_t numdns)</td></tr>
+<tr class="separator:gad02111a6b26b93f1c3580d5f41a59af3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1e040ec38166dc9bfcc3473aab0c799f"><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__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f">dns_gethostbyname</a> (const char *hostname, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, <a class="el" href="dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae">dns_found_callback</a> found, void *callback_arg)</td></tr>
+<tr class="separator:ga1e040ec38166dc9bfcc3473aab0c799f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae84449f60dca6b863142daca8e03ce79"><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__dns.html#gae84449f60dca6b863142daca8e03ce79">dns_gethostbyname_addrtype</a> (const char *hostname, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, <a class="el" href="dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae">dns_found_callback</a> found, void *callback_arg, u8_t dns_addrtype)</td></tr>
+<tr class="separator:gae84449f60dca6b863142daca8e03ce79"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Implements a DNS host name to IP address resolver.</p>
+<p>The lwIP DNS resolver functions are used to lookup a host name and map it to a numerical IP address. It maintains a list of resolved hostnames that can be queried with the dns_lookup() function. New hostnames can be resolved using the <a class="el" href="structdns__query.html">dns_query()</a> function.</p>
+<p>The lwIP version of the resolver also adds a non-blocking version of <a class="el" href="group__netdbapi.html#ga39746b4b096060ca3e8c6ee7a7560b1d">gethostbyname()</a> that will work with a raw API application. This function checks for an IP address string first and converts it if it is valid. <a class="el" href="group__netdbapi.html#ga39746b4b096060ca3e8c6ee7a7560b1d">gethostbyname()</a> then does a dns_lookup() to see if the name is already in the table. If so, the IP is returned. If not, a query is issued and the function returns with a ERR_INPROGRESS status. The app using the dns client must then go into a waiting state.</p>
+<p>Once a hostname has been resolved (or found to be non-existent), the resolver code calls a specified callback function (which must be implemented by the module that uses the resolver).</p>
+<p>Multicast DNS queries are supported for names ending on ".local". However, only "One-Shot Multicast DNS Queries" are supported (RFC 6762 chapter 5.1), this is not a fully compliant implementation of continuous mDNS querying!</p>
+<p>All functions must be called from TCPIP thread.</p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__lwip__opts__dns.html#ga9f9881c887a8aceb9765820c2dbdf292">DNS_MAX_SERVERS</a> </dd>
+<dd>
+<a class="el" href="group__lwip__opts__dhcp.html#ga60ccc20fbb08be24b5d5f599dd47a6a6">LWIP_DHCP_MAX_DNS_SERVERS</a> </dd>
+<dd>
+<a class="el" href="group__netconn__common.html">Common functions</a> for thread-safe access. </dd></dl>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga1e040ec38166dc9bfcc3473aab0c799f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1e040ec38166dc9bfcc3473aab0c799f">&#9670;&nbsp;</a></span>dns_gethostbyname()</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> dns_gethostbyname </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>hostname</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae">dns_found_callback</a>&#160;</td>
+          <td class="paramname"><em>found</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>callback_arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Resolve a hostname (string) into an IP address. NON-BLOCKING callback version for use with raw API!!!</p>
+<p>Returns immediately with one of err_t return codes:</p><ul>
+<li>ERR_OK if hostname is a valid IP address string or the host name is already in the local names table.</li>
+<li>ERR_INPROGRESS enqueue a request to be sent to the DNS server for resolution if no errors are present.</li>
+<li>ERR_ARG: dns client not initialized or invalid hostname</li>
+</ul>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">hostname</td><td>the hostname that is to be queried </td></tr>
+    <tr><td class="paramname">addr</td><td>pointer to a ip_addr_t where to store the address if it is already cached in the dns_table (only valid if ERR_OK is returned!) </td></tr>
+    <tr><td class="paramname">found</td><td>a callback function to be called on success, failure or timeout (only if ERR_INPROGRESS is returned!) </td></tr>
+    <tr><td class="paramname">callback_arg</td><td>argument to pass to the callback function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a err_t return code. </dd></dl>
+
+</div>
+</div>
+<a id="gae84449f60dca6b863142daca8e03ce79"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae84449f60dca6b863142daca8e03ce79">&#9670;&nbsp;</a></span>dns_gethostbyname_addrtype()</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> dns_gethostbyname_addrtype </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>hostname</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae">dns_found_callback</a>&#160;</td>
+          <td class="paramname"><em>found</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>callback_arg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>dns_addrtype</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Like dns_gethostbyname, but returned address type can be controlled: </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">hostname</td><td>the hostname that is to be queried </td></tr>
+    <tr><td class="paramname">addr</td><td>pointer to a ip_addr_t where to store the address if it is already cached in the dns_table (only valid if ERR_OK is returned!) </td></tr>
+    <tr><td class="paramname">found</td><td>a callback function to be called on success, failure or timeout (only if ERR_INPROGRESS is returned!) </td></tr>
+    <tr><td class="paramname">callback_arg</td><td>argument to pass to the callback function </td></tr>
+    <tr><td class="paramname">dns_addrtype</td><td>- LWIP_DNS_ADDRTYPE_IPV4_IPV6: try to resolve IPv4 first, try IPv6 if IPv4 fails only<ul>
+<li>LWIP_DNS_ADDRTYPE_IPV6_IPV4: try to resolve IPv6 first, try IPv4 if IPv6 fails only</li>
+<li>LWIP_DNS_ADDRTYPE_IPV4: try to resolve IPv4 only</li>
+<li>LWIP_DNS_ADDRTYPE_IPV6: try to resolve IPv6 only </li>
+</ul>
+</td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gad02111a6b26b93f1c3580d5f41a59af3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad02111a6b26b93f1c3580d5f41a59af3">&#9670;&nbsp;</a></span>dns_getserver()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>* dns_getserver </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>numdns</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Obtain one of the currently configured DNS server.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">numdns</td><td>the index of the DNS server </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>IP address of the indexed DNS server or "ip_addr_any" if the DNS server has not been configured. </dd></dl>
+
+</div>
+</div>
+<a id="gaf66c5d8273f83cdc2cdd8911fb68d584"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf66c5d8273f83cdc2cdd8911fb68d584">&#9670;&nbsp;</a></span>dns_setserver()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void dns_setserver </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>numdns</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>dnsserver</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize one of the DNS servers.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">numdns</td><td>the index of the DNS server to set must be &lt; DNS_MAX_SERVERS </td></tr>
+    <tr><td class="paramname">dnsserver</td><td>IP address of the DNS server to set </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__dns.js b/doc/doxygen/output/html/group__dns.js
new file mode 100644
index 0000000..90e1a2b
--- /dev/null
+++ b/doc/doxygen/output/html/group__dns.js
@@ -0,0 +1,7 @@
+var group__dns =
+[
+    [ "dns_gethostbyname", "group__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f", null ],
+    [ "dns_gethostbyname_addrtype", "group__dns.html#gae84449f60dca6b863142daca8e03ce79", null ],
+    [ "dns_getserver", "group__dns.html#gad02111a6b26b93f1c3580d5f41a59af3", null ],
+    [ "dns_setserver", "group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__ethernet.html b/doc/doxygen/output/html/group__ethernet.html
new file mode 100644
index 0000000..f09ef5a
--- /dev/null
+++ b/doc/doxygen/output/html/group__ethernet.html
@@ -0,0 +1,168 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Ethernet</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__ethernet.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">Ethernet<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gac9cad5802bfa3d885f13d2ba0f40b778"><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__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778">ethernet_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> *p, const struct <a class="el" href="structeth__addr.html">eth_addr</a> *src, const struct <a class="el" href="structeth__addr.html">eth_addr</a> *dst, u16_t eth_type)</td></tr>
+<tr class="separator:gac9cad5802bfa3d885f13d2ba0f40b778"><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="gac9cad5802bfa3d885f13d2ba0f40b778"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac9cad5802bfa3d885f13d2ba0f40b778">&#9670;&nbsp;</a></span>ethernet_output()</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> ethernet_output </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structeth__addr.html">eth_addr</a> *&#160;</td>
+          <td class="paramname"><em>src</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structeth__addr.html">eth_addr</a> *&#160;</td>
+          <td class="paramname"><em>dst</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>eth_type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an ethernet packet on the network using netif-&gt;linkoutput(). The ethernet header is filled in before sending.</p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__lwip__opts__hooks.html#ga2b6e450b4934b95df9b9a9d2b9a4d57e">LWIP_HOOK_VLAN_SET</a></dd></dl>
+<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 packet </td></tr>
+    <tr><td class="paramname">p</td><td>the packet to send. pbuf layer must be <a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfab4de441e737330558b609a990cd17346">PBUF_LINK</a>. </td></tr>
+    <tr><td class="paramname">src</td><td>the source MAC address to be copied into the ethernet header </td></tr>
+    <tr><td class="paramname">dst</td><td>the destination MAC address to be copied into the ethernet header </td></tr>
+    <tr><td class="paramname">eth_type</td><td>ethernet type (<a class="el" href="group__ieee.html#gab3a7b97666b100584972d158acbbd1f4">lwip_ieee_eth_type</a>) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the packet was sent, any other err_t on failure </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__ethernet.js b/doc/doxygen/output/html/group__ethernet.js
new file mode 100644
index 0000000..6c4477f
--- /dev/null
+++ b/doc/doxygen/output/html/group__ethernet.js
@@ -0,0 +1,4 @@
+var group__ethernet =
+[
+    [ "ethernet_output", "group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__httpc.html b/doc/doxygen/output/html/group__httpc.html
new file mode 100644
index 0000000..ecb7656
--- /dev/null
+++ b/doc/doxygen/output/html/group__httpc.html
@@ -0,0 +1,429 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: HTTP client</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__httpc.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<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>
+  <div class="headertitle">
+<div class="title">HTTP client<div class="ingroups"><a class="el" href="group__apps.html">Applications</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga055b9a8bf8f4e2c18c621471773fa66c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpc.html#ga055b9a8bf8f4e2c18c621471773fa66c">LWIP_HTTPC_HAVE_FILE_IO</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga055b9a8bf8f4e2c18c621471773fa66c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1f192f3009865e9f9a3cd83609c866c2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpc.html#ga1f192f3009865e9f9a3cd83609c866c2">HTTP_DEFAULT_PORT</a>&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618">LWIP_IANA_PORT_HTTP</a></td></tr>
+<tr class="separator:ga1f192f3009865e9f9a3cd83609c866c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gac6713454283bff8e1187849e8d4bda18"><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="group__httpc.html#ga49e34884b272b1e0ddae8da46c31d9a3">ehttpc_result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpc.html#gac6713454283bff8e1187849e8d4bda18">httpc_result_t</a></td></tr>
+<tr class="separator:gac6713454283bff8e1187849e8d4bda18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0452eb8007dbb5f139ec992e58e560dd"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpc.html#ga0452eb8007dbb5f139ec992e58e560dd">httpc_result_fn</a>) (void *arg, <a class="el" href="group__httpc.html#gac6713454283bff8e1187849e8d4bda18">httpc_result_t</a> httpc_result, u32_t rx_content_len, u32_t srv_res, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> err)</td></tr>
+<tr class="separator:ga0452eb8007dbb5f139ec992e58e560dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1e5b62519d6592c89ed3edfabd917472"><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpc.html#ga1e5b62519d6592c89ed3edfabd917472">httpc_headers_done_fn</a>) (httpc_state_t *connection, void *arg, struct <a class="el" href="structpbuf.html">pbuf</a> *hdr, u16_t hdr_len, u32_t content_len)</td></tr>
+<tr class="separator:ga1e5b62519d6592c89ed3edfabd917472"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga49e34884b272b1e0ddae8da46c31d9a3"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpc.html#ga49e34884b272b1e0ddae8da46c31d9a3">ehttpc_result</a> { <br />
+&#160;&#160;<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3af3173d4d272c9c0b5a5c9b5b027e3659">HTTPC_RESULT_OK</a> = 0, 
+<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a5026187026abd1d242333ba6ff69ddbd">HTTPC_RESULT_ERR_UNKNOWN</a> = 1, 
+<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ab866d5433b4c4593c80b756d434e1d09">HTTPC_RESULT_ERR_CONNECT</a> = 2, 
+<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ae04714f90692c122e6c85e06083dbc6d">HTTPC_RESULT_ERR_HOSTNAME</a> = 3, 
+<br />
+&#160;&#160;<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a89a6700abb14dd7cab9b4e0fd66e5fd6">HTTPC_RESULT_ERR_CLOSED</a> = 4, 
+<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a8e6c597f88335b31e6a8b078a32fde33">HTTPC_RESULT_ERR_TIMEOUT</a> = 5, 
+<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3aaa023a6f8069c02c87a826ba323c54b8">HTTPC_RESULT_ERR_SVR_RESP</a> = 6, 
+<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a49972833ec01c7a10dee734c7c69ed62">HTTPC_RESULT_ERR_MEM</a> = 7, 
+<br />
+&#160;&#160;<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3adf4e45365923c16b6a6879bde5f60867">HTTPC_RESULT_LOCAL_ABORT</a> = 8, 
+<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a6c8a4195834e1997a498a03bb47bb096">HTTPC_RESULT_ERR_CONTENT_LEN</a> = 9
+<br />
+ }</td></tr>
+<tr class="separator:ga49e34884b272b1e0ddae8da46c31d9a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga6c961e52cec2d25b4b82b6910ebcfa1b"><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__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b">httpc_get_file</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *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)</td></tr>
+<tr class="separator:ga6c961e52cec2d25b4b82b6910ebcfa1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabd4ef2259885a93090733235cc0fa8d6"><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__httpc.html#gabd4ef2259885a93090733235cc0fa8d6">httpc_get_file_dns</a> (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)</td></tr>
+<tr class="separator:gabd4ef2259885a93090733235cc0fa8d6"><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="ga1f192f3009865e9f9a3cd83609c866c2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1f192f3009865e9f9a3cd83609c866c2">&#9670;&nbsp;</a></span>HTTP_DEFAULT_PORT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTP_DEFAULT_PORT&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618">LWIP_IANA_PORT_HTTP</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The default TCP port used for HTTP </p>
+
+</div>
+</div>
+<a id="ga055b9a8bf8f4e2c18c621471773fa66c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga055b9a8bf8f4e2c18c621471773fa66c">&#9670;&nbsp;</a></span>LWIP_HTTPC_HAVE_FILE_IO</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPC_HAVE_FILE_IO&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="ga1e5b62519d6592c89ed3edfabd917472"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1e5b62519d6592c89ed3edfabd917472">&#9670;&nbsp;</a></span>httpc_headers_done_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(* httpc_headers_done_fn) (httpc_state_t *connection, void *arg, struct <a class="el" href="structpbuf.html">pbuf</a> *hdr, u16_t hdr_len, u32_t content_len)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Prototype of http client callback: called when the headers are received</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">connection</td><td>http client connection </td></tr>
+    <tr><td class="paramname">arg</td><td>argument specified when initiating the request </td></tr>
+    <tr><td class="paramname">hdr</td><td>header <a class="el" href="structpbuf.html">pbuf(s)</a> (may contain data also) </td></tr>
+    <tr><td class="paramname">hdr_len</td><td>length of the heders in 'hdr' </td></tr>
+    <tr><td class="paramname">content_len</td><td>content length as received in the headers (-1 if not received) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>if != ERR_OK is returned, the connection is aborted </dd></dl>
+
+</div>
+</div>
+<a id="ga0452eb8007dbb5f139ec992e58e560dd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0452eb8007dbb5f139ec992e58e560dd">&#9670;&nbsp;</a></span>httpc_result_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* httpc_result_fn) (void *arg, <a class="el" href="group__httpc.html#gac6713454283bff8e1187849e8d4bda18">httpc_result_t</a> httpc_result, u32_t rx_content_len, u32_t srv_res, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> err)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Prototype of a http client callback function</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>argument specified when initiating the request </td></tr>
+    <tr><td class="paramname">httpc_result</td><td>result of the http transfer (see enum httpc_result_t) </td></tr>
+    <tr><td class="paramname">rx_content_len</td><td>number of bytes received (without headers) </td></tr>
+    <tr><td class="paramname">srv_res</td><td>this contains the http status code received (if any) </td></tr>
+    <tr><td class="paramname">err</td><td>an error returned by internal lwip functions, can help to specify the source of the error but must not necessarily be != ERR_OK </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gac6713454283bff8e1187849e8d4bda18"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac6713454283bff8e1187849e8d4bda18">&#9670;&nbsp;</a></span>httpc_result_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef enum <a class="el" href="group__httpc.html#ga49e34884b272b1e0ddae8da46c31d9a3">ehttpc_result</a>  <a class="el" href="group__httpc.html#gac6713454283bff8e1187849e8d4bda18">httpc_result_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>HTTP client result codes </p>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="ga49e34884b272b1e0ddae8da46c31d9a3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga49e34884b272b1e0ddae8da46c31d9a3">&#9670;&nbsp;</a></span>ehttpc_result</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__httpc.html#ga49e34884b272b1e0ddae8da46c31d9a3">ehttpc_result</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>HTTP client result codes </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="gga49e34884b272b1e0ddae8da46c31d9a3af3173d4d272c9c0b5a5c9b5b027e3659"></a>HTTPC_RESULT_OK&#160;</td><td class="fielddoc"><p>File successfully received </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga49e34884b272b1e0ddae8da46c31d9a3a5026187026abd1d242333ba6ff69ddbd"></a>HTTPC_RESULT_ERR_UNKNOWN&#160;</td><td class="fielddoc"><p>Unknown error </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga49e34884b272b1e0ddae8da46c31d9a3ab866d5433b4c4593c80b756d434e1d09"></a>HTTPC_RESULT_ERR_CONNECT&#160;</td><td class="fielddoc"><p>Connection to server failed </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga49e34884b272b1e0ddae8da46c31d9a3ae04714f90692c122e6c85e06083dbc6d"></a>HTTPC_RESULT_ERR_HOSTNAME&#160;</td><td class="fielddoc"><p>Failed to resolve server hostname </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga49e34884b272b1e0ddae8da46c31d9a3a89a6700abb14dd7cab9b4e0fd66e5fd6"></a>HTTPC_RESULT_ERR_CLOSED&#160;</td><td class="fielddoc"><p>Connection unexpectedly closed by remote server </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga49e34884b272b1e0ddae8da46c31d9a3a8e6c597f88335b31e6a8b078a32fde33"></a>HTTPC_RESULT_ERR_TIMEOUT&#160;</td><td class="fielddoc"><p>Connection timed out (server didn't respond in time) </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga49e34884b272b1e0ddae8da46c31d9a3aaa023a6f8069c02c87a826ba323c54b8"></a>HTTPC_RESULT_ERR_SVR_RESP&#160;</td><td class="fielddoc"><p>Server responded with an error code </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga49e34884b272b1e0ddae8da46c31d9a3a49972833ec01c7a10dee734c7c69ed62"></a>HTTPC_RESULT_ERR_MEM&#160;</td><td class="fielddoc"><p>Local memory error </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga49e34884b272b1e0ddae8da46c31d9a3adf4e45365923c16b6a6879bde5f60867"></a>HTTPC_RESULT_LOCAL_ABORT&#160;</td><td class="fielddoc"><p>Local abort </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga49e34884b272b1e0ddae8da46c31d9a3a6c8a4195834e1997a498a03bb47bb096"></a>HTTPC_RESULT_ERR_CONTENT_LEN&#160;</td><td class="fielddoc"><p>Content length mismatch </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga6c961e52cec2d25b4b82b6910ebcfa1b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6c961e52cec2d25b4b82b6910ebcfa1b">&#9670;&nbsp;</a></span>httpc_get_file()</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> httpc_get_file </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>server_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>uri</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const httpc_connection_t *&#160;</td>
+          <td class="paramname"><em>settings</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">altcp_recv_fn&#160;</td>
+          <td class="paramname"><em>recv_fn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>callback_arg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">httpc_state_t **&#160;</td>
+          <td class="paramname"><em>connection</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>HTTP client API: get a file by passing server IP address</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">server_addr</td><td>IP address of the server to connect </td></tr>
+    <tr><td class="paramname">port</td><td>tcp port of the server </td></tr>
+    <tr><td class="paramname">uri</td><td>uri to get from the server, remember leading "/"! </td></tr>
+    <tr><td class="paramname">settings</td><td>connection settings (callbacks, proxy, etc.) </td></tr>
+    <tr><td class="paramname">recv_fn</td><td>the http body (not the headers) are passed to this callback </td></tr>
+    <tr><td class="paramname">callback_arg</td><td>argument passed to all the callbacks </td></tr>
+    <tr><td class="paramname">connection</td><td>retreives the connection handle (to match in callbacks) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if starting the request succeeds (callback_fn will be called later) or an error code </dd></dl>
+
+</div>
+</div>
+<a id="gabd4ef2259885a93090733235cc0fa8d6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabd4ef2259885a93090733235cc0fa8d6">&#9670;&nbsp;</a></span>httpc_get_file_dns()</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> httpc_get_file_dns </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>server_name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>uri</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const httpc_connection_t *&#160;</td>
+          <td class="paramname"><em>settings</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">altcp_recv_fn&#160;</td>
+          <td class="paramname"><em>recv_fn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>callback_arg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">httpc_state_t **&#160;</td>
+          <td class="paramname"><em>connection</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>HTTP client API: get a file by passing server name as string (DNS name or IP address string)</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">server_name</td><td>server name as string (DNS name or IP address string) </td></tr>
+    <tr><td class="paramname">port</td><td>tcp port of the server </td></tr>
+    <tr><td class="paramname">uri</td><td>uri to get from the server, remember leading "/"! </td></tr>
+    <tr><td class="paramname">settings</td><td>connection settings (callbacks, proxy, etc.) </td></tr>
+    <tr><td class="paramname">recv_fn</td><td>the http body (not the headers) are passed to this callback </td></tr>
+    <tr><td class="paramname">callback_arg</td><td>argument passed to all the callbacks </td></tr>
+    <tr><td class="paramname">connection</td><td>retreives the connection handle (to match in callbacks) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if starting the request succeeds (callback_fn will be called later) or an error code </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__httpc.js b/doc/doxygen/output/html/group__httpc.js
new file mode 100644
index 0000000..f578f67
--- /dev/null
+++ b/doc/doxygen/output/html/group__httpc.js
@@ -0,0 +1,22 @@
+var group__httpc =
+[
+    [ "HTTP_DEFAULT_PORT", "group__httpc.html#ga1f192f3009865e9f9a3cd83609c866c2", null ],
+    [ "LWIP_HTTPC_HAVE_FILE_IO", "group__httpc.html#ga055b9a8bf8f4e2c18c621471773fa66c", null ],
+    [ "httpc_headers_done_fn", "group__httpc.html#ga1e5b62519d6592c89ed3edfabd917472", null ],
+    [ "httpc_result_fn", "group__httpc.html#ga0452eb8007dbb5f139ec992e58e560dd", null ],
+    [ "httpc_result_t", "group__httpc.html#gac6713454283bff8e1187849e8d4bda18", null ],
+    [ "ehttpc_result", "group__httpc.html#ga49e34884b272b1e0ddae8da46c31d9a3", [
+      [ "HTTPC_RESULT_OK", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3af3173d4d272c9c0b5a5c9b5b027e3659", null ],
+      [ "HTTPC_RESULT_ERR_UNKNOWN", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a5026187026abd1d242333ba6ff69ddbd", null ],
+      [ "HTTPC_RESULT_ERR_CONNECT", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ab866d5433b4c4593c80b756d434e1d09", null ],
+      [ "HTTPC_RESULT_ERR_HOSTNAME", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ae04714f90692c122e6c85e06083dbc6d", null ],
+      [ "HTTPC_RESULT_ERR_CLOSED", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a89a6700abb14dd7cab9b4e0fd66e5fd6", null ],
+      [ "HTTPC_RESULT_ERR_TIMEOUT", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a8e6c597f88335b31e6a8b078a32fde33", null ],
+      [ "HTTPC_RESULT_ERR_SVR_RESP", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3aaa023a6f8069c02c87a826ba323c54b8", null ],
+      [ "HTTPC_RESULT_ERR_MEM", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a49972833ec01c7a10dee734c7c69ed62", null ],
+      [ "HTTPC_RESULT_LOCAL_ABORT", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3adf4e45365923c16b6a6879bde5f60867", null ],
+      [ "HTTPC_RESULT_ERR_CONTENT_LEN", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a6c8a4195834e1997a498a03bb47bb096", null ]
+    ] ],
+    [ "httpc_get_file", "group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b", null ],
+    [ "httpc_get_file_dns", "group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__httpd.html b/doc/doxygen/output/html/group__httpd.html
new file mode 100644
index 0000000..222aff6
--- /dev/null
+++ b/doc/doxygen/output/html/group__httpd.html
@@ -0,0 +1,507 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: HTTP 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__httpd.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</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">HTTP server<div class="ingroups"><a class="el" href="group__apps.html">Applications</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__httpd__opts"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html">Options</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 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="structt_c_g_i.html">tCGI</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 name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gafe011a487c5e8d03a6b2f629e14e6b5c"><td class="memItemLeft" align="right" valign="top">typedef const char *(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#gafe011a487c5e8d03a6b2f629e14e6b5c">tCGIHandler</a>) (int iIndex, int iNumParams, char *pcParam[], char *pcValue[])</td></tr>
+<tr class="separator:gafe011a487c5e8d03a6b2f629e14e6b5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf88dacc4f18d299084cab75252001319"><td class="memItemLeft" align="right" valign="top">typedef u16_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#gaf88dacc4f18d299084cab75252001319">tSSIHandler</a>) (const char *ssi_tag_name, char *pcInsert, int iInsertLen)</td></tr>
+<tr class="separator:gaf88dacc4f18d299084cab75252001319"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaca4357acf5c988b28123bc6f23540380"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#gaca4357acf5c988b28123bc6f23540380">httpd_post_data_recved</a> (void *connection, u16_t recved_len)</td></tr>
+<tr class="separator:gaca4357acf5c988b28123bc6f23540380"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac364305cee969a0be43c071722b136e6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#gac364305cee969a0be43c071722b136e6">httpd_init</a> (void)</td></tr>
+<tr class="separator:gac364305cee969a0be43c071722b136e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafaedb1911a83854b1e9835132db64409"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#gafaedb1911a83854b1e9835132db64409">httpd_inits</a> (struct altcp_tls_config *conf)</td></tr>
+<tr class="separator:gafaedb1911a83854b1e9835132db64409"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8834ecb16d9a7d6c128bdf9514b7879c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c">http_set_ssi_handler</a> (<a class="el" href="group__httpd.html#gaf88dacc4f18d299084cab75252001319">tSSIHandler</a> ssi_handler, const char **tags, int num_tags)</td></tr>
+<tr class="separator:ga8834ecb16d9a7d6c128bdf9514b7879c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae1ec09532ff7fc622e1860727bf2c897"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897">http_set_cgi_handlers</a> (const <a class="el" href="structt_c_g_i.html">tCGI</a> *cgis, int num_handlers)</td></tr>
+<tr class="separator:gae1ec09532ff7fc622e1860727bf2c897"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6cb33693ee8f0c054be82a968ceff582"><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__httpd.html#ga6cb33693ee8f0c054be82a968ceff582">httpd_post_begin</a> (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)</td></tr>
+<tr class="separator:ga6cb33693ee8f0c054be82a968ceff582"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga461409c8813c2a82ba63fde987c0e537"><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__httpd.html#ga461409c8813c2a82ba63fde987c0e537">httpd_post_receive_data</a> (void *connection, struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:ga461409c8813c2a82ba63fde987c0e537"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga477473f7ead250fec71f1f8b9926fec5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#ga477473f7ead250fec71f1f8b9926fec5">httpd_post_finished</a> (void *connection, char *response_uri, u16_t response_uri_len)</td></tr>
+<tr class="separator:ga477473f7ead250fec71f1f8b9926fec5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>This httpd supports for a rudimentary server-side-include facility which will replace tags of the form in any file whose extension is .shtml, .shtm or .ssi with strings provided by an include handler whose pointer is provided to the module via function <a class="el" href="group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c">http_set_ssi_handler()</a>. Additionally, a simple common gateway interface (CGI) handling mechanism has been added to allow clients to hook functions to particular request URIs.</p>
+<p>To enable SSI support, define label LWIP_HTTPD_SSI in lwipopts.h. To enable CGI support, define label LWIP_HTTPD_CGI in lwipopts.h.</p>
+<p>By default, the server assumes that HTTP headers are already present in each file stored in the file system. By defining LWIP_HTTPD_DYNAMIC_HEADERS in lwipopts.h, this behavior can be changed such that the server inserts the headers automatically based on the extension of the file being served. If this mode is used, be careful to ensure that the file system image used does not already contain the header information.</p>
+<p>File system images without headers can be created using the makefsfile tool with the -h command line option.</p>
+<h2>Notes about valid SSI tags </h2>
+<p>The following assumptions are made about tags used in SSI markers:</p>
+<ol type="1">
+<li>No tag may contain '-' or whitespace characters within the tag name.</li>
+<li>Whitespace is allowed between the tag leadin "&lt;!--#" and the start of the tag name and between the tag name and the leadout string "--&gt;".</li>
+<li>The maximum tag name length is LWIP_HTTPD_MAX_TAG_NAME_LEN, currently 8 characters.</li>
+</ol>
+<h2>Notes on CGI usage </h2>
+<p>The simple CGI support offered here works with GET method requests only and can handle up to 16 parameters encoded into the URI. The handler function may not write directly to the HTTP output but must return a filename that the HTTP server will send to the browser as a response to the incoming CGI request.</p>
+<p>The list of supported file types is quite short, so if makefsdata complains about an unknown extension, make sure to add it (and its doctype) to the 'g_psHTTPHeaders' list. </p>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="gafe011a487c5e8d03a6b2f629e14e6b5c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafe011a487c5e8d03a6b2f629e14e6b5c">&#9670;&nbsp;</a></span>tCGIHandler</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const char*(* tCGIHandler) (int iIndex, int iNumParams, char *pcParam[], char *pcValue[])</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function pointer for a CGI script handler.</p>
+<p>This function is called each time the HTTPD server is asked for a file whose name was previously registered as a CGI function using a call to http_set_cgi_handlers. The iIndex parameter provides the index of the CGI within the cgis array passed to http_set_cgi_handlers. Parameters pcParam and pcValue provide access to the parameters provided along with the URI. iNumParams provides a count of the entries in the pcParam and pcValue arrays. Each entry in the pcParam array contains the name of a parameter with the corresponding entry in the pcValue array containing the value for that parameter. Note that pcParam may contain multiple elements with the same name if, for example, a multi-selection list control is used in the form generating the data.</p>
+<p>The function should return a pointer to a character string which is the path and filename of the response that is to be sent to the connected browser, for example "/thanks.htm" or "/response/error.ssi".</p>
+<p>The maximum number of parameters that will be passed to this function via iNumParams is defined by LWIP_HTTPD_MAX_CGI_PARAMETERS. Any parameters in the incoming HTTP request above this number will be discarded.</p>
+<p>Requests intended for use by this CGI mechanism must be sent using the GET method (which encodes all parameters within the URI rather than in a block later in the request). Attempts to use the POST method will result in the request being ignored. </p>
+
+</div>
+</div>
+<a id="gaf88dacc4f18d299084cab75252001319"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf88dacc4f18d299084cab75252001319">&#9670;&nbsp;</a></span>tSSIHandler</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef u16_t(* tSSIHandler) (const char *ssi_tag_name, char *pcInsert, int iInsertLen)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function pointer for the SSI tag handler callback.</p>
+<p>This function will be called each time the HTTPD server detects a tag of the form in files with extensions mentioned in the g_pcSSIExtensions array (currently .shtml, .shtm, .ssi, .xml, .json) where "name" appears as one of the tags supplied to http_set_ssi_handler in the tags array. The returned insert string, which will be appended after the the string "&lt;!--#name--&gt;" in file sent back to the client, should be written to pointer pcInsert. iInsertLen contains the size of the buffer pointed to by pcInsert. The iIndex parameter provides the zero-based index of the tag as found in the tags array and identifies the tag that is to be processed.</p>
+<p>The handler returns the number of characters written to pcInsert excluding any terminating NULL or HTTPD_SSI_TAG_UNKNOWN when tag is not recognized.</p>
+<p>Note that the behavior of this SSI mechanism is somewhat different from the "normal" SSI processing as found in, for example, the Apache web server. In this case, the inserted text is appended following the SSI tag rather than replacing the tag entirely. This allows for an implementation that does not require significant additional buffering of output data yet which will still offer usable SSI functionality. One downside to this approach is when attempting to use SSI within JavaScript. The SSI tag is structured to resemble an HTML comment but this syntax does not constitute a comment within JavaScript and, hence, leaving the tag in place will result in problems in these cases. In order to avoid these problems, define LWIP_HTTPD_SSI_INCLUDE_TAG as zero in your lwip options file, or use JavaScript style block comments in the form / * # name * / (without the spaces). </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gae1ec09532ff7fc622e1860727bf2c897"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae1ec09532ff7fc622e1860727bf2c897">&#9670;&nbsp;</a></span>http_set_cgi_handlers()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void http_set_cgi_handlers </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structt_c_g_i.html">tCGI</a> *&#160;</td>
+          <td class="paramname"><em>cgis</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>num_handlers</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set an array of CGI filenames/handler functions</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">cgis</td><td>an array of CGI filenames/handler functions </td></tr>
+    <tr><td class="paramname">num_handlers</td><td>number of elements in the 'cgis' array </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga8834ecb16d9a7d6c128bdf9514b7879c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8834ecb16d9a7d6c128bdf9514b7879c">&#9670;&nbsp;</a></span>http_set_ssi_handler()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void http_set_ssi_handler </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="group__httpd.html#gaf88dacc4f18d299084cab75252001319">tSSIHandler</a>&#160;</td>
+          <td class="paramname"><em>ssi_handler</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char **&#160;</td>
+          <td class="paramname"><em>tags</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>num_tags</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the SSI handler function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ssi_handler</td><td>the SSI handler function </td></tr>
+    <tr><td class="paramname">tags</td><td>an array of SSI tag strings to search for in SSI-enabled files </td></tr>
+    <tr><td class="paramname">num_tags</td><td>number of tags in the 'tags' array </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gac364305cee969a0be43c071722b136e6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac364305cee969a0be43c071722b136e6">&#9670;&nbsp;</a></span>httpd_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void httpd_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize the httpd: set up a listening PCB and bind it to the defined port </p>
+
+</div>
+</div>
+<a id="gafaedb1911a83854b1e9835132db64409"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafaedb1911a83854b1e9835132db64409">&#9670;&nbsp;</a></span>httpd_inits()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void httpd_inits </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_tls_config *&#160;</td>
+          <td class="paramname"><em>conf</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize the httpd: set up a listening PCB and bind it to the defined port. Also set up TLS connection handling (HTTPS). </p>
+
+</div>
+</div>
+<a id="ga6cb33693ee8f0c054be82a968ceff582"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6cb33693ee8f0c054be82a968ceff582">&#9670;&nbsp;</a></span>httpd_post_begin()</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> httpd_post_begin </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>connection</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>uri</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>http_request</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>http_request_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>content_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>response_uri</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>response_uri_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t *&#160;</td>
+          <td class="paramname"><em>post_auto_wnd</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called when a POST request has been received. The application can decide whether to accept it or not.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">connection</td><td>Unique connection identifier, valid until httpd_post_end is called. </td></tr>
+    <tr><td class="paramname">uri</td><td>The HTTP header URI receiving the POST request. </td></tr>
+    <tr><td class="paramname">http_request</td><td>The raw HTTP request (the first packet, normally). </td></tr>
+    <tr><td class="paramname">http_request_len</td><td>Size of 'http_request'. </td></tr>
+    <tr><td class="paramname">content_len</td><td>Content-Length from HTTP header. </td></tr>
+    <tr><td class="paramname">response_uri</td><td>Filename of response file, to be filled when denying the request </td></tr>
+    <tr><td class="paramname">response_uri_len</td><td>Size of the 'response_uri' buffer. </td></tr>
+    <tr><td class="paramname">post_auto_wnd</td><td>Set this to 0 to let the callback code handle window updates by calling 'httpd_post_data_recved' (to throttle rx speed) default is 1 (httpd handles window updates automatically) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK: Accept the POST request, data may be passed in another err_t: Deny the POST request, send back 'bad request'. </dd></dl>
+
+</div>
+</div>
+<a id="gaca4357acf5c988b28123bc6f23540380"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaca4357acf5c988b28123bc6f23540380">&#9670;&nbsp;</a></span>httpd_post_data_recved()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void httpd_post_data_recved </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>connection</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>recved_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A POST implementation can call this function to update the TCP window. This can be used to throttle data reception (e.g. when received data is programmed to flash and data is received faster than programmed).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">connection</td><td>A connection handle passed to httpd_post_begin for which httpd_post_finished has <em>NOT</em> been called yet! </td></tr>
+    <tr><td class="paramname">recved_len</td><td>Length of data received (for window update) </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga477473f7ead250fec71f1f8b9926fec5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga477473f7ead250fec71f1f8b9926fec5">&#9670;&nbsp;</a></span>httpd_post_finished()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void httpd_post_finished </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>connection</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>response_uri</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>response_uri_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called when all data is received or when the connection is closed. The application must return the filename/URI of a file to send in response to this POST request. If the response_uri buffer is untouched, a 404 response is returned.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">connection</td><td>Unique connection identifier. </td></tr>
+    <tr><td class="paramname">response_uri</td><td>Filename of response file, to be filled when denying the request </td></tr>
+    <tr><td class="paramname">response_uri_len</td><td>Size of the 'response_uri' buffer. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga461409c8813c2a82ba63fde987c0e537"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga461409c8813c2a82ba63fde987c0e537">&#9670;&nbsp;</a></span>httpd_post_receive_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> httpd_post_receive_data </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>connection</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called for each pbuf of data that has been received for a POST. ATTENTION: The application is responsible for freeing the pbufs passed in!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">connection</td><td>Unique connection identifier. </td></tr>
+    <tr><td class="paramname">p</td><td>Received data. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK: Data accepted. another err_t: Data denied, http_post_get_response_uri will be called. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__httpd.js b/doc/doxygen/output/html/group__httpd.js
new file mode 100644
index 0000000..163a9e6
--- /dev/null
+++ b/doc/doxygen/output/html/group__httpd.js
@@ -0,0 +1,15 @@
+var group__httpd =
+[
+    [ "Options", "group__httpd__opts.html", "group__httpd__opts" ],
+    [ "tCGI", "structt_c_g_i.html", null ],
+    [ "tCGIHandler", "group__httpd.html#gafe011a487c5e8d03a6b2f629e14e6b5c", null ],
+    [ "tSSIHandler", "group__httpd.html#gaf88dacc4f18d299084cab75252001319", null ],
+    [ "http_set_cgi_handlers", "group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897", null ],
+    [ "http_set_ssi_handler", "group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c", null ],
+    [ "httpd_init", "group__httpd.html#gac364305cee969a0be43c071722b136e6", null ],
+    [ "httpd_inits", "group__httpd.html#gafaedb1911a83854b1e9835132db64409", null ],
+    [ "httpd_post_begin", "group__httpd.html#ga6cb33693ee8f0c054be82a968ceff582", null ],
+    [ "httpd_post_data_recved", "group__httpd.html#gaca4357acf5c988b28123bc6f23540380", null ],
+    [ "httpd_post_finished", "group__httpd.html#ga477473f7ead250fec71f1f8b9926fec5", null ],
+    [ "httpd_post_receive_data", "group__httpd.html#ga461409c8813c2a82ba63fde987c0e537", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__httpd__opts.html b/doc/doxygen/output/html/group__httpd__opts.html
new file mode 100644
index 0000000..911dec0
--- /dev/null
+++ b/doc/doxygen/output/html/group__httpd__opts.html
@@ -0,0 +1,773 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Options</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__httpd__opts.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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__httpd.html">HTTP server</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gafb28f7c5fee75f013a199d427452372c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gafb28f7c5fee75f013a199d427452372c">LWIP_HTTPD_CGI</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gafb28f7c5fee75f013a199d427452372c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad3960bf65731bd0f1341867664afe860"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gad3960bf65731bd0f1341867664afe860">LWIP_HTTPD_CGI_SSI</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gad3960bf65731bd0f1341867664afe860"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacb70e0cdd30a940f8bce681c6cc63949"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gacb70e0cdd30a940f8bce681c6cc63949">LWIP_HTTPD_SSI</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gacb70e0cdd30a940f8bce681c6cc63949"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga520858778b84d4d2fa125294c0f119e5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga520858778b84d4d2fa125294c0f119e5">LWIP_HTTPD_SSI_RAW</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga520858778b84d4d2fa125294c0f119e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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"><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>
+<tr class="separator:ga3167d52d20cf90857e2c809b92458bf0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafb2115e763ed3163a3e204a0ba53edb9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gafb2115e763ed3163a3e204a0ba53edb9">HTTPD_SERVER_AGENT</a>&#160;&#160;&#160;&quot;lwIP/&quot; LWIP_VERSION_STRING &quot; (http://savannah.nongnu.org/projects/lwip)&quot;</td></tr>
+<tr class="separator:gafb2115e763ed3163a3e204a0ba53edb9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga75932fc5eeb9abeddfdaf8413574c6d7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga75932fc5eeb9abeddfdaf8413574c6d7">LWIP_HTTPD_DYNAMIC_HEADERS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga75932fc5eeb9abeddfdaf8413574c6d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabb13219495a813fceaafa954a238a924"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gabb13219495a813fceaafa954a238a924">HTTPD_USE_MEM_POOL</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gabb13219495a813fceaafa954a238a924"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2b058c5d1bd67e5d7cb260166e3ace50"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga2b058c5d1bd67e5d7cb260166e3ace50">HTTPD_SERVER_PORT</a>&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618">LWIP_IANA_PORT_HTTP</a></td></tr>
+<tr class="separator:ga2b058c5d1bd67e5d7cb260166e3ace50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaffe653b08bf5ba25b276c655f6813441"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gaffe653b08bf5ba25b276c655f6813441">HTTPD_SERVER_PORT_HTTPS</a>&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88">LWIP_IANA_PORT_HTTPS</a></td></tr>
+<tr class="separator:gaffe653b08bf5ba25b276c655f6813441"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga64dc2a10b1c2ec886e698fe9008e51e2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga64dc2a10b1c2ec886e698fe9008e51e2">HTTPD_ENABLE_HTTPS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga64dc2a10b1c2ec886e698fe9008e51e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad92e78e19fd3ab2af42750e83ed73fd5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gad92e78e19fd3ab2af42750e83ed73fd5">HTTPD_MAX_RETRIES</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:gad92e78e19fd3ab2af42750e83ed73fd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacc3e7667baa2cfafd23de2b152df7a63"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gacc3e7667baa2cfafd23de2b152df7a63">HTTPD_POLL_INTERVAL</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:gacc3e7667baa2cfafd23de2b152df7a63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaabd1f6319d04b8d5f2c93270794d5182"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gaabd1f6319d04b8d5f2c93270794d5182">HTTPD_TCP_PRIO</a>&#160;&#160;&#160;TCP_PRIO_MIN</td></tr>
+<tr class="separator:gaabd1f6319d04b8d5f2c93270794d5182"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga054db3f080715942967969c6ae30bb6a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga054db3f080715942967969c6ae30bb6a">LWIP_HTTPD_TIMING</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga054db3f080715942967969c6ae30bb6a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5f2642874f930798d975b1f7a6d2e1da"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga5f2642874f930798d975b1f7a6d2e1da">HTTPD_DEBUG_TIMING</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga5f2642874f930798d975b1f7a6d2e1da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga85ebddbc4236b1e31bfa68fa163f9b07"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga85ebddbc4236b1e31bfa68fa163f9b07">LWIP_HTTPD_SUPPORT_EXTSTATUS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga85ebddbc4236b1e31bfa68fa163f9b07"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7a8f4ab787b6fb8482c8a36c9fd0c7dd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga7a8f4ab787b6fb8482c8a36c9fd0c7dd">LWIP_HTTPD_SUPPORT_V09</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga7a8f4ab787b6fb8482c8a36c9fd0c7dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6f78487bc829f7f98274f1264020045e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga6f78487bc829f7f98274f1264020045e">LWIP_HTTPD_SUPPORT_11_KEEPALIVE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga6f78487bc829f7f98274f1264020045e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0bd0f9a89423fb3bbfea4e4c6141ae43"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga0bd0f9a89423fb3bbfea4e4c6141ae43">LWIP_HTTPD_SUPPORT_REQUESTLIST</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga0bd0f9a89423fb3bbfea4e4c6141ae43"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaef23f4e3525aa5dd0ecbce9b5e16d4e0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0">LWIP_HTTPD_REQ_QUEUELEN</a>&#160;&#160;&#160;5</td></tr>
+<tr class="separator:gaef23f4e3525aa5dd0ecbce9b5e16d4e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8dbe61a35228da0e7365a088197191b8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga8dbe61a35228da0e7365a088197191b8">LWIP_HTTPD_REQ_BUFSIZE</a>&#160;&#160;&#160;<a class="el" href="group__httpd__opts.html#ga30dc71c59f3904df7daaf293f74f91f8">LWIP_HTTPD_MAX_REQ_LENGTH</a></td></tr>
+<tr class="separator:ga8dbe61a35228da0e7365a088197191b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga30dc71c59f3904df7daaf293f74f91f8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga30dc71c59f3904df7daaf293f74f91f8">LWIP_HTTPD_MAX_REQ_LENGTH</a>&#160;&#160;&#160;LWIP_MIN(1023, (<a class="el" href="group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0">LWIP_HTTPD_REQ_QUEUELEN</a> * <a class="el" href="group__lwip__opts__pbuf.html#gae61f4491d56e805e79b79eb5d35a00e5">PBUF_POOL_BUFSIZE</a>))</td></tr>
+<tr class="separator:ga30dc71c59f3904df7daaf293f74f91f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaca4ef53e7a9abbd8d4bd8bc1ba7b486a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gaca4ef53e7a9abbd8d4bd8bc1ba7b486a">LWIP_HTTPD_MAX_REQUEST_URI_LEN</a>&#160;&#160;&#160;63</td></tr>
+<tr class="separator:gaca4ef53e7a9abbd8d4bd8bc1ba7b486a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa27f7c5450392d10aeed033ca878cce3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gaa27f7c5450392d10aeed033ca878cce3">LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN</a>&#160;&#160;&#160;63</td></tr>
+<tr class="separator:gaa27f7c5450392d10aeed033ca878cce3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga975961a6d22d1a077118fb85dfec809a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga975961a6d22d1a077118fb85dfec809a">LWIP_HTTPD_SSI_INCLUDE_TAG</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga975961a6d22d1a077118fb85dfec809a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0ff20ebc4ab50d4aa6151c3241dacb3a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga0ff20ebc4ab50d4aa6151c3241dacb3a">LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga0ff20ebc4ab50d4aa6151c3241dacb3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0d5074965efd40786182287895feb691"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga0d5074965efd40786182287895feb691">LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga0d5074965efd40786182287895feb691"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga82a030ce2ecdcf741b02b7be41c012b3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga82a030ce2ecdcf741b02b7be41c012b3">LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga82a030ce2ecdcf741b02b7be41c012b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga662e88120b507426374dd8ebbd54a048"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga662e88120b507426374dd8ebbd54a048">HTTP_IS_TAG_VOLATILE</a>(ptr)&#160;&#160;&#160;TCP_WRITE_FLAG_COPY</td></tr>
+<tr class="separator:ga662e88120b507426374dd8ebbd54a048"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadadb70f5663cdf004bf879e3b5d326bd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gadadb70f5663cdf004bf879e3b5d326bd">LWIP_HTTPD_CUSTOM_FILES</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gadadb70f5663cdf004bf879e3b5d326bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1ee8d7c975c7e3d1c9d9dd9b43660c79"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga1ee8d7c975c7e3d1c9d9dd9b43660c79">LWIP_HTTPD_DYNAMIC_FILE_READ</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga1ee8d7c975c7e3d1c9d9dd9b43660c79"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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"><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>
+<tr class="separator:ga51cb673cb5cc362acc409f23c1e0a331"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad68e8e06ea4c2be1b3508e813a49f7cc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gad68e8e06ea4c2be1b3508e813a49f7cc">HTTPD_FSDATA_FILE</a>&#160;&#160;&#160;&quot;fsdata.c&quot;</td></tr>
+<tr class="separator:gad68e8e06ea4c2be1b3508e813a49f7cc"><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="ga662e88120b507426374dd8ebbd54a048"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga662e88120b507426374dd8ebbd54a048">&#9670;&nbsp;</a></span>HTTP_IS_TAG_VOLATILE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTP_IS_TAG_VOLATILE</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ptr</td><td>)</td>
+          <td>&#160;&#160;&#160;TCP_WRITE_FLAG_COPY</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Default: Tags are sent from struct http_state and are therefore volatile </p>
+
+</div>
+</div>
+<a id="ga5f2642874f930798d975b1f7a6d2e1da"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5f2642874f930798d975b1f7a6d2e1da">&#9670;&nbsp;</a></span>HTTPD_DEBUG_TIMING</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTPD_DEBUG_TIMING&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to enable timing each file sent </p>
+
+</div>
+</div>
+<a id="ga64dc2a10b1c2ec886e698fe9008e51e2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga64dc2a10b1c2ec886e698fe9008e51e2">&#9670;&nbsp;</a></span>HTTPD_ENABLE_HTTPS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTPD_ENABLE_HTTPS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Enable https support? </p>
+
+</div>
+</div>
+<a id="gad68e8e06ea4c2be1b3508e813a49f7cc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad68e8e06ea4c2be1b3508e813a49f7cc">&#9670;&nbsp;</a></span>HTTPD_FSDATA_FILE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTPD_FSDATA_FILE&#160;&#160;&#160;&quot;fsdata.c&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Filename (including path) to use as FS data file </p>
+
+</div>
+</div>
+<a id="gad92e78e19fd3ab2af42750e83ed73fd5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad92e78e19fd3ab2af42750e83ed73fd5">&#9670;&nbsp;</a></span>HTTPD_MAX_RETRIES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTPD_MAX_RETRIES&#160;&#160;&#160;4</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Maximum retries before the connection is aborted/closed.</p><ul>
+<li>number of times pcb-&gt;poll is called -&gt; default is 4*500ms = 2s;</li>
+<li>reset when pcb-&gt;sent is called </li>
+</ul>
+
+</div>
+</div>
+<a id="gacc3e7667baa2cfafd23de2b152df7a63"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacc3e7667baa2cfafd23de2b152df7a63">&#9670;&nbsp;</a></span>HTTPD_POLL_INTERVAL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTPD_POLL_INTERVAL&#160;&#160;&#160;4</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The poll delay is X*500ms </p>
+
+</div>
+</div>
+<a id="ga6e5de8515c89af12277e4cb011165103"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6e5de8515c89af12277e4cb011165103">&#9670;&nbsp;</a></span>HTTPD_PRECALCULATED_CHECKSUM</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTPD_PRECALCULATED_CHECKSUM&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>HTTPD_PRECALCULATED_CHECKSUM==1: include precompiled checksums for predefined (MSS-sized) chunks of the files to prevent having to calculate the checksums at runtime. </p>
+
+</div>
+</div>
+<a id="gafb2115e763ed3163a3e204a0ba53edb9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafb2115e763ed3163a3e204a0ba53edb9">&#9670;&nbsp;</a></span>HTTPD_SERVER_AGENT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTPD_SERVER_AGENT&#160;&#160;&#160;&quot;lwIP/&quot; LWIP_VERSION_STRING &quot; (http://savannah.nongnu.org/projects/lwip)&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This string is passed in the HTTP header as "Server: " </p>
+
+</div>
+</div>
+<a id="ga2b058c5d1bd67e5d7cb260166e3ace50"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2b058c5d1bd67e5d7cb260166e3ace50">&#9670;&nbsp;</a></span>HTTPD_SERVER_PORT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTPD_SERVER_PORT&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618">LWIP_IANA_PORT_HTTP</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The server port for HTTPD to use </p>
+
+</div>
+</div>
+<a id="gaffe653b08bf5ba25b276c655f6813441"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaffe653b08bf5ba25b276c655f6813441">&#9670;&nbsp;</a></span>HTTPD_SERVER_PORT_HTTPS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTPD_SERVER_PORT_HTTPS&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88">LWIP_IANA_PORT_HTTPS</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The https server port for HTTPD to use </p>
+
+</div>
+</div>
+<a id="gaabd1f6319d04b8d5f2c93270794d5182"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaabd1f6319d04b8d5f2c93270794d5182">&#9670;&nbsp;</a></span>HTTPD_TCP_PRIO</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTPD_TCP_PRIO&#160;&#160;&#160;TCP_PRIO_MIN</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Priority for tcp pcbs created by HTTPD (very low by default). Lower priorities get killed first when running out of memory. </p>
+
+</div>
+</div>
+<a id="gabb13219495a813fceaafa954a238a924"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabb13219495a813fceaafa954a238a924">&#9670;&nbsp;</a></span>HTTPD_USE_MEM_POOL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTPD_USE_MEM_POOL&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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 the pool(s). </p>
+
+</div>
+</div>
+<a id="ga0ff20ebc4ab50d4aa6151c3241dacb3a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0ff20ebc4ab50d4aa6151c3241dacb3a">&#9670;&nbsp;</a></span>LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to call tcp_abort when tcp_close fails with memory error. This can be used to prevent consuming all memory in situations where the HTTP server has low priority compared to other communication. </p>
+
+</div>
+</div>
+<a id="gafb28f7c5fee75f013a199d427452372c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafb28f7c5fee75f013a199d427452372c">&#9670;&nbsp;</a></span>LWIP_HTTPD_CGI</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_CGI&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to support CGI (old style).</p>
+<p>This old style CGI support works by registering an array of URLs and associated CGI handler functions (<a class="el" href="group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897">http_set_cgi_handlers</a>). This list is scanned just before fs_open is called from request handling. The handler can return a new URL that is used internally by the httpd to load the returned page (passed to fs_open).</p>
+<p>Use this CGI type e.g. to execute specific actions and return a page that does not depend on the CGI parameters. </p>
+
+</div>
+</div>
+<a id="gad3960bf65731bd0f1341867664afe860"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad3960bf65731bd0f1341867664afe860">&#9670;&nbsp;</a></span>LWIP_HTTPD_CGI_SSI</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_CGI_SSI&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to support CGI (new style).</p>
+<p>This new style CGI support works by calling a global function (<a class="el" href="group__httpd.html#gafe011a487c5e8d03a6b2f629e14e6b5c">tCGIHandler</a>) for all URLs that are found. fs_open is called first and the URL can not be written by the CGI handler. Instead, this handler gets passed the http file state, an object where it can store information derived from the CGI URL or parameters. This file state is later passed to SSI, so the SSI code can return data depending on CGI input.</p>
+<p>Use this CGI handler if you want CGI information passed on to SSI. </p>
+
+</div>
+</div>
+<a id="gadadb70f5663cdf004bf879e3b5d326bd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadadb70f5663cdf004bf879e3b5d326bd">&#9670;&nbsp;</a></span>LWIP_HTTPD_CUSTOM_FILES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_CUSTOM_FILES&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 and provide the functions:</p><ul>
+<li>"int fs_open_custom(struct fs_file *file, const char *name)" Called first for every opened file to allow opening files that are not included in fsdata(_custom).c</li>
+<li>"void fs_close_custom(struct fs_file *file)" Called to free resources allocated by fs_open_custom(). </li>
+</ul>
+
+</div>
+</div>
+<a id="ga1ee8d7c975c7e3d1c9d9dd9b43660c79"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1ee8d7c975c7e3d1c9d9dd9b43660c79">&#9670;&nbsp;</a></span>LWIP_HTTPD_DYNAMIC_FILE_READ</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_DYNAMIC_FILE_READ&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to support fs_read() to dynamically read file data. Without this (default=off), only one-block files are supported, and the contents must be ready after fs_open(). </p>
+
+</div>
+</div>
+<a id="ga75932fc5eeb9abeddfdaf8413574c6d7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga75932fc5eeb9abeddfdaf8413574c6d7">&#9670;&nbsp;</a></span>LWIP_HTTPD_DYNAMIC_HEADERS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_DYNAMIC_HEADERS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 if you want to include code that creates HTTP headers at runtime. Default is off: HTTP headers are then created statically by the makefsdata tool. Static headers mean smaller code size, but the (readonly) fsdata will grow a bit as every file includes the HTTP header. </p>
+
+</div>
+</div>
+<a id="gaedd0fa3d356170d8ca3557acb410fd7c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaedd0fa3d356170d8ca3557acb410fd7c">&#9670;&nbsp;</a></span>LWIP_HTTPD_FILE_STATE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_FILE_STATE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to include an application state argument per file that is opened. This allows to keep a state per connection/file. </p>
+
+</div>
+</div>
+<a id="ga51cb673cb5cc362acc409f23c1e0a331"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga51cb673cb5cc362acc409f23c1e0a331">&#9670;&nbsp;</a></span>LWIP_HTTPD_FS_ASYNC_READ</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_FS_ASYNC_READ&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_HTTPD_FS_ASYNC_READ==1: support asynchronous read operations (fs_read_async returns FS_READ_DELAYED and calls a callback when finished). </p>
+
+</div>
+</div>
+<a id="ga0d5074965efd40786182287895feb691"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0d5074965efd40786182287895feb691">&#9670;&nbsp;</a></span>LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to kill the oldest connection when running out of memory for 'struct http_state' or 'struct http_ssi_state'. ATTENTION: This puts all connections on a linked list, so may be kind of slow. </p>
+
+</div>
+</div>
+<a id="ga30dc71c59f3904df7daaf293f74f91f8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga30dc71c59f3904df7daaf293f74f91f8">&#9670;&nbsp;</a></span>LWIP_HTTPD_MAX_REQ_LENGTH</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_MAX_REQ_LENGTH&#160;&#160;&#160;LWIP_MIN(1023, (<a class="el" href="group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0">LWIP_HTTPD_REQ_QUEUELEN</a> * <a class="el" href="group__lwip__opts__pbuf.html#gae61f4491d56e805e79b79eb5d35a00e5">PBUF_POOL_BUFSIZE</a>))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Defines the maximum length of a HTTP request line (up to the first CRLF, copied from pbuf into this a global buffer when pbuf- or packet-queues are received - otherwise the input pbuf is used directly) </p>
+
+</div>
+</div>
+<a id="gaca4ef53e7a9abbd8d4bd8bc1ba7b486a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaca4ef53e7a9abbd8d4bd8bc1ba7b486a">&#9670;&nbsp;</a></span>LWIP_HTTPD_MAX_REQUEST_URI_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_MAX_REQUEST_URI_LEN&#160;&#160;&#160;63</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This is the size of a static buffer used when URIs end with '/'. In this buffer, the directory requested is concatenated with all the configured default file names. Set to 0 to disable checking default filenames on non-root directories. </p>
+
+</div>
+</div>
+<a id="ga82a030ce2ecdcf741b02b7be41c012b3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga82a030ce2ecdcf741b02b7be41c012b3">&#9670;&nbsp;</a></span>LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to send URIs without extension without headers (who uses this at all??) </p>
+
+</div>
+</div>
+<a id="gaa27f7c5450392d10aeed033ca878cce3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa27f7c5450392d10aeed033ca878cce3">&#9670;&nbsp;</a></span>LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN&#160;&#160;&#160;63</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Maximum length of the filename to send as response to a POST request, filled in by the application when a POST is finished. </p>
+
+</div>
+</div>
+<a id="ga8dbe61a35228da0e7365a088197191b8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8dbe61a35228da0e7365a088197191b8">&#9670;&nbsp;</a></span>LWIP_HTTPD_REQ_BUFSIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_REQ_BUFSIZE&#160;&#160;&#160;<a class="el" href="group__httpd__opts.html#ga30dc71c59f3904df7daaf293f74f91f8">LWIP_HTTPD_MAX_REQ_LENGTH</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of (TCP payload-) bytes (in pbufs) to enqueue to parse and incoming request (up to the first double-newline) </p>
+
+</div>
+</div>
+<a id="gaef23f4e3525aa5dd0ecbce9b5e16d4e0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaef23f4e3525aa5dd0ecbce9b5e16d4e0">&#9670;&nbsp;</a></span>LWIP_HTTPD_REQ_QUEUELEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_REQ_QUEUELEN&#160;&#160;&#160;5</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of rx pbufs to enqueue to parse an incoming request (up to the first newline) </p>
+
+</div>
+</div>
+<a id="gacb70e0cdd30a940f8bce681c6cc63949"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacb70e0cdd30a940f8bce681c6cc63949">&#9670;&nbsp;</a></span>LWIP_HTTPD_SSI</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_SSI&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to support SSI (Server-Side-Includes)</p>
+<p>In contrast to other http servers, this only calls a preregistered callback function (</p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c">http_set_ssi_handler</a>) for each tag (in the format of ) encountered in SSI-enabled pages. SSI-enabled pages must have one of the predefined SSI-enabled file extensions. All files with one of these extensions are parsed when sent.</dd></dl>
+<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="group__httpd__opts.html#ga3167d52d20cf90857e2c809b92458bf0">LWIP_HTTPD_SSI_MULTIPART</a> can be used. </dd></dl>
+
+</div>
+</div>
+<a id="gaba2d4cfe4c1f5bdbe37b339084a7d466"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaba2d4cfe4c1f5bdbe37b339084a7d466">&#9670;&nbsp;</a></span>LWIP_HTTPD_SSI_BY_FILE_EXTENSION</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_SSI_BY_FILE_EXTENSION&#160;&#160;&#160;1</td>
+        </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>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="ga975961a6d22d1a077118fb85dfec809a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga975961a6d22d1a077118fb85dfec809a">&#9670;&nbsp;</a></span>LWIP_HTTPD_SSI_INCLUDE_TAG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_SSI_INCLUDE_TAG&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 0 to not send the SSI tag (default is on, so the tag will be sent in the HTML page </p>
+
+</div>
+</div>
+<a id="ga3167d52d20cf90857e2c809b92458bf0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3167d52d20cf90857e2c809b92458bf0">&#9670;&nbsp;</a></span>LWIP_HTTPD_SSI_MULTIPART</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_SSI_MULTIPART&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_HTTPD_SSI_MULTIPART==1: SSI handler function is called with 2 more arguments indicating a counter for insert string that are too long to be inserted at once: the SSI handler function must then set 'next_tag_part' which will be passed back to it in the next call. </p>
+
+</div>
+</div>
+<a id="ga520858778b84d4d2fa125294c0f119e5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga520858778b84d4d2fa125294c0f119e5">&#9670;&nbsp;</a></span>LWIP_HTTPD_SSI_RAW</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_SSI_RAW&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to implement an SSI tag handler callback that gets a const char* to the tag (instead of an index into a pre-registered array of known tags) If this is 0, the SSI handler callback function is only called pre-registered tags. </p>
+
+</div>
+</div>
+<a id="ga6f78487bc829f7f98274f1264020045e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6f78487bc829f7f98274f1264020045e">&#9670;&nbsp;</a></span>LWIP_HTTPD_SUPPORT_11_KEEPALIVE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_SUPPORT_11_KEEPALIVE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to enable HTTP/1.1 persistent connections. ATTENTION: If the generated file system includes HTTP headers, these must include the "Connection: keep-alive" header (pass argument "-11" to makefsdata). </p>
+
+</div>
+</div>
+<a id="ga85ebddbc4236b1e31bfa68fa163f9b07"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga85ebddbc4236b1e31bfa68fa163f9b07">&#9670;&nbsp;</a></span>LWIP_HTTPD_SUPPORT_EXTSTATUS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_SUPPORT_EXTSTATUS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to one to show error pages when parsing a request fails instead of simply closing the connection. </p>
+
+</div>
+</div>
+<a id="gacbea06ce33933e3ef2f2f1834a21cc2c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacbea06ce33933e3ef2f2f1834a21cc2c">&#9670;&nbsp;</a></span>LWIP_HTTPD_SUPPORT_POST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_SUPPORT_POST&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to support HTTP POST </p>
+
+</div>
+</div>
+<a id="ga0bd0f9a89423fb3bbfea4e4c6141ae43"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0bd0f9a89423fb3bbfea4e4c6141ae43">&#9670;&nbsp;</a></span>LWIP_HTTPD_SUPPORT_REQUESTLIST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_SUPPORT_REQUESTLIST&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to support HTTP request coming in in multiple packets/pbufs </p>
+
+</div>
+</div>
+<a id="ga7a8f4ab787b6fb8482c8a36c9fd0c7dd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7a8f4ab787b6fb8482c8a36c9fd0c7dd">&#9670;&nbsp;</a></span>LWIP_HTTPD_SUPPORT_V09</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_SUPPORT_V09&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 0 to drop support for HTTP/0.9 clients (to save some bytes) </p>
+
+</div>
+</div>
+<a id="ga054db3f080715942967969c6ae30bb6a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga054db3f080715942967969c6ae30bb6a">&#9670;&nbsp;</a></span>LWIP_HTTPD_TIMING</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_TIMING&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to enable timing each file sent </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__httpd__opts.js b/doc/doxygen/output/html/group__httpd__opts.js
new file mode 100644
index 0000000..1ec77f0
--- /dev/null
+++ b/doc/doxygen/output/html/group__httpd__opts.js
@@ -0,0 +1,41 @@
+var group__httpd__opts =
+[
+    [ "HTTP_IS_TAG_VOLATILE", "group__httpd__opts.html#ga662e88120b507426374dd8ebbd54a048", null ],
+    [ "HTTPD_DEBUG_TIMING", "group__httpd__opts.html#ga5f2642874f930798d975b1f7a6d2e1da", null ],
+    [ "HTTPD_ENABLE_HTTPS", "group__httpd__opts.html#ga64dc2a10b1c2ec886e698fe9008e51e2", null ],
+    [ "HTTPD_FSDATA_FILE", "group__httpd__opts.html#gad68e8e06ea4c2be1b3508e813a49f7cc", null ],
+    [ "HTTPD_MAX_RETRIES", "group__httpd__opts.html#gad92e78e19fd3ab2af42750e83ed73fd5", null ],
+    [ "HTTPD_POLL_INTERVAL", "group__httpd__opts.html#gacc3e7667baa2cfafd23de2b152df7a63", null ],
+    [ "HTTPD_PRECALCULATED_CHECKSUM", "group__httpd__opts.html#ga6e5de8515c89af12277e4cb011165103", null ],
+    [ "HTTPD_SERVER_AGENT", "group__httpd__opts.html#gafb2115e763ed3163a3e204a0ba53edb9", null ],
+    [ "HTTPD_SERVER_PORT", "group__httpd__opts.html#ga2b058c5d1bd67e5d7cb260166e3ace50", null ],
+    [ "HTTPD_SERVER_PORT_HTTPS", "group__httpd__opts.html#gaffe653b08bf5ba25b276c655f6813441", null ],
+    [ "HTTPD_TCP_PRIO", "group__httpd__opts.html#gaabd1f6319d04b8d5f2c93270794d5182", null ],
+    [ "HTTPD_USE_MEM_POOL", "group__httpd__opts.html#gabb13219495a813fceaafa954a238a924", null ],
+    [ "LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR", "group__httpd__opts.html#ga0ff20ebc4ab50d4aa6151c3241dacb3a", null ],
+    [ "LWIP_HTTPD_CGI", "group__httpd__opts.html#gafb28f7c5fee75f013a199d427452372c", null ],
+    [ "LWIP_HTTPD_CGI_SSI", "group__httpd__opts.html#gad3960bf65731bd0f1341867664afe860", null ],
+    [ "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_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 ],
+    [ "LWIP_HTTPD_MAX_REQ_LENGTH", "group__httpd__opts.html#ga30dc71c59f3904df7daaf293f74f91f8", null ],
+    [ "LWIP_HTTPD_MAX_REQUEST_URI_LEN", "group__httpd__opts.html#gaca4ef53e7a9abbd8d4bd8bc1ba7b486a", null ],
+    [ "LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI", "group__httpd__opts.html#ga82a030ce2ecdcf741b02b7be41c012b3", null ],
+    [ "LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN", "group__httpd__opts.html#gaa27f7c5450392d10aeed033ca878cce3", null ],
+    [ "LWIP_HTTPD_REQ_BUFSIZE", "group__httpd__opts.html#ga8dbe61a35228da0e7365a088197191b8", null ],
+    [ "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_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 ],
+    [ "LWIP_HTTPD_SUPPORT_11_KEEPALIVE", "group__httpd__opts.html#ga6f78487bc829f7f98274f1264020045e", null ],
+    [ "LWIP_HTTPD_SUPPORT_EXTSTATUS", "group__httpd__opts.html#ga85ebddbc4236b1e31bfa68fa163f9b07", null ],
+    [ "LWIP_HTTPD_SUPPORT_POST", "group__httpd__opts.html#gacbea06ce33933e3ef2f2f1834a21cc2c", null ],
+    [ "LWIP_HTTPD_SUPPORT_REQUESTLIST", "group__httpd__opts.html#ga0bd0f9a89423fb3bbfea4e4c6141ae43", null ],
+    [ "LWIP_HTTPD_SUPPORT_V09", "group__httpd__opts.html#ga7a8f4ab787b6fb8482c8a36c9fd0c7dd", null ],
+    [ "LWIP_HTTPD_TIMING", "group__httpd__opts.html#ga054db3f080715942967969c6ae30bb6a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__iana.html b/doc/doxygen/output/html/group__iana.html
new file mode 100644
index 0000000..0373640
--- /dev/null
+++ b/doc/doxygen/output/html/group__iana.html
@@ -0,0 +1,195 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: IANA assigned numbers</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__iana.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#enum-members">Enumerations</a>  </div>
+  <div class="headertitle">
+<div class="title">IANA assigned numbers<div class="ingroups"><a class="el" href="group__infrastructure.html">Infrastructure</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga3d2bbfcb56c8adf3be8c8d12868cecfe"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iana.html#ga3d2bbfcb56c8adf3be8c8d12868cecfe">lwip_iana_hwtype</a> { <a class="el" href="group__iana.html#gga3d2bbfcb56c8adf3be8c8d12868cecfea89e82e6ac55811bb26fe66ec029f2a0c">LWIP_IANA_HWTYPE_ETHERNET</a> = 1
+ }</td></tr>
+<tr class="separator:ga3d2bbfcb56c8adf3be8c8d12868cecfe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac9396d90585e49e9a287179bf5aa9ba0"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iana.html#gac9396d90585e49e9a287179bf5aa9ba0">lwip_iana_port_number</a> { <br />
+&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae2645895203ca3c54005afad053a813c">LWIP_IANA_PORT_SMTP</a> = 25, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ac70ae96c985cf3660e26aa496094916d">LWIP_IANA_PORT_DHCP_SERVER</a> = 67, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a9fcae1f16758e1ac35dab343fc897f40">LWIP_IANA_PORT_DHCP_CLIENT</a> = 68, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050">LWIP_IANA_PORT_TFTP</a> = 69, 
+<br />
+&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618">LWIP_IANA_PORT_HTTP</a> = 80, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb">LWIP_IANA_PORT_SNTP</a> = 123, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae1cf6eaab024b31aff5bf407d38e0ede">LWIP_IANA_PORT_NETBIOS</a> = 137, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aeb10a37f0c48e053b138f65b843c45d3">LWIP_IANA_PORT_SNMP</a> = 161, 
+<br />
+&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aff60c0d3e8eca210b7e4faca3491f4a8">LWIP_IANA_PORT_SNMP_TRAP</a> = 162, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88">LWIP_IANA_PORT_HTTPS</a> = 443, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a88f8872246977c6e24c617266ada1a3b">LWIP_IANA_PORT_SMTPS</a> = 465, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22">LWIP_IANA_PORT_MQTT</a> = 1883, 
+<br />
+&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a839da325f45916d7b27d53d5e5e97dc6">LWIP_IANA_PORT_MDNS</a> = 5353, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601">LWIP_IANA_PORT_SECURE_MQTT</a> = 8883
+<br />
+ }</td></tr>
+<tr class="separator:gac9396d90585e49e9a287179bf5aa9ba0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="ga3d2bbfcb56c8adf3be8c8d12868cecfe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3d2bbfcb56c8adf3be8c8d12868cecfe">&#9670;&nbsp;</a></span>lwip_iana_hwtype</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__iana.html#ga3d2bbfcb56c8adf3be8c8d12868cecfe">lwip_iana_hwtype</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Hardware types </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="gga3d2bbfcb56c8adf3be8c8d12868cecfea89e82e6ac55811bb26fe66ec029f2a0c"></a>LWIP_IANA_HWTYPE_ETHERNET&#160;</td><td class="fielddoc"><p>Ethernet </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<a id="gac9396d90585e49e9a287179bf5aa9ba0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac9396d90585e49e9a287179bf5aa9ba0">&#9670;&nbsp;</a></span>lwip_iana_port_number</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__iana.html#gac9396d90585e49e9a287179bf5aa9ba0">lwip_iana_port_number</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Port numbers <a href="https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt">https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt</a> </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="ggac9396d90585e49e9a287179bf5aa9ba0ae2645895203ca3c54005afad053a813c"></a>LWIP_IANA_PORT_SMTP&#160;</td><td class="fielddoc"><p>SMTP </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggac9396d90585e49e9a287179bf5aa9ba0ac70ae96c985cf3660e26aa496094916d"></a>LWIP_IANA_PORT_DHCP_SERVER&#160;</td><td class="fielddoc"><p>DHCP server </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggac9396d90585e49e9a287179bf5aa9ba0a9fcae1f16758e1ac35dab343fc897f40"></a>LWIP_IANA_PORT_DHCP_CLIENT&#160;</td><td class="fielddoc"><p>DHCP client </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050"></a>LWIP_IANA_PORT_TFTP&#160;</td><td class="fielddoc"><p>TFTP </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618"></a>LWIP_IANA_PORT_HTTP&#160;</td><td class="fielddoc"><p>HTTP </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb"></a>LWIP_IANA_PORT_SNTP&#160;</td><td class="fielddoc"><p>SNTP </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggac9396d90585e49e9a287179bf5aa9ba0ae1cf6eaab024b31aff5bf407d38e0ede"></a>LWIP_IANA_PORT_NETBIOS&#160;</td><td class="fielddoc"><p>NETBIOS </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggac9396d90585e49e9a287179bf5aa9ba0aeb10a37f0c48e053b138f65b843c45d3"></a>LWIP_IANA_PORT_SNMP&#160;</td><td class="fielddoc"><p>SNMP </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggac9396d90585e49e9a287179bf5aa9ba0aff60c0d3e8eca210b7e4faca3491f4a8"></a>LWIP_IANA_PORT_SNMP_TRAP&#160;</td><td class="fielddoc"><p>SNMP traps </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88"></a>LWIP_IANA_PORT_HTTPS&#160;</td><td class="fielddoc"><p>HTTPS </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggac9396d90585e49e9a287179bf5aa9ba0a88f8872246977c6e24c617266ada1a3b"></a>LWIP_IANA_PORT_SMTPS&#160;</td><td class="fielddoc"><p>SMTPS </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22"></a>LWIP_IANA_PORT_MQTT&#160;</td><td class="fielddoc"><p>MQTT </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggac9396d90585e49e9a287179bf5aa9ba0a839da325f45916d7b27d53d5e5e97dc6"></a>LWIP_IANA_PORT_MDNS&#160;</td><td class="fielddoc"><p>MDNS </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601"></a>LWIP_IANA_PORT_SECURE_MQTT&#160;</td><td class="fielddoc"><p>Secure MQTT </p>
+</td></tr>
+</table>
+
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__iana.js b/doc/doxygen/output/html/group__iana.js
new file mode 100644
index 0000000..0e15e7e
--- /dev/null
+++ b/doc/doxygen/output/html/group__iana.js
@@ -0,0 +1,22 @@
+var group__iana =
+[
+    [ "lwip_iana_hwtype", "group__iana.html#ga3d2bbfcb56c8adf3be8c8d12868cecfe", [
+      [ "LWIP_IANA_HWTYPE_ETHERNET", "group__iana.html#gga3d2bbfcb56c8adf3be8c8d12868cecfea89e82e6ac55811bb26fe66ec029f2a0c", null ]
+    ] ],
+    [ "lwip_iana_port_number", "group__iana.html#gac9396d90585e49e9a287179bf5aa9ba0", [
+      [ "LWIP_IANA_PORT_SMTP", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae2645895203ca3c54005afad053a813c", null ],
+      [ "LWIP_IANA_PORT_DHCP_SERVER", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ac70ae96c985cf3660e26aa496094916d", null ],
+      [ "LWIP_IANA_PORT_DHCP_CLIENT", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a9fcae1f16758e1ac35dab343fc897f40", null ],
+      [ "LWIP_IANA_PORT_TFTP", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050", null ],
+      [ "LWIP_IANA_PORT_HTTP", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618", null ],
+      [ "LWIP_IANA_PORT_SNTP", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb", null ],
+      [ "LWIP_IANA_PORT_NETBIOS", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae1cf6eaab024b31aff5bf407d38e0ede", null ],
+      [ "LWIP_IANA_PORT_SNMP", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aeb10a37f0c48e053b138f65b843c45d3", null ],
+      [ "LWIP_IANA_PORT_SNMP_TRAP", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aff60c0d3e8eca210b7e4faca3491f4a8", null ],
+      [ "LWIP_IANA_PORT_HTTPS", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88", null ],
+      [ "LWIP_IANA_PORT_SMTPS", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a88f8872246977c6e24c617266ada1a3b", null ],
+      [ "LWIP_IANA_PORT_MQTT", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22", null ],
+      [ "LWIP_IANA_PORT_MDNS", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a839da325f45916d7b27d53d5e5e97dc6", null ],
+      [ "LWIP_IANA_PORT_SECURE_MQTT", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601", null ]
+    ] ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__ieee.html b/doc/doxygen/output/html/group__ieee.html
new file mode 100644
index 0000000..50e6845
--- /dev/null
+++ b/doc/doxygen/output/html/group__ieee.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: IEEE assigned numbers</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__ieee.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#enum-members">Enumerations</a>  </div>
+  <div class="headertitle">
+<div class="title">IEEE assigned numbers<div class="ingroups"><a class="el" href="group__infrastructure.html">Infrastructure</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:gab3a7b97666b100584972d158acbbd1f4"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ieee.html#gab3a7b97666b100584972d158acbbd1f4">lwip_ieee_eth_type</a> { <br />
+&#160;&#160;<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ac95756b20fde70b868ef4185dd221c79">ETHTYPE_IP</a> = 0x0800U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a41217db03576ea59c44b28b248c39be5">ETHTYPE_ARP</a> = 0x0806U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a530a30feb9b87fd993da2bf83776cf9b">ETHTYPE_WOL</a> = 0x0842U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a14292184cb41b279249319896d0e2b1f">ETHTYPE_RARP</a> = 0x8035U, 
+<br />
+&#160;&#160;<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad8f84826d52d92ac24a477d1f03e7903">ETHTYPE_VLAN</a> = 0x8100U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aab26004eed559217be5dd466a79b1383">ETHTYPE_IPV6</a> = 0x86DDU, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a58c6f40d7cc3edb9455762938f3f6569">ETHTYPE_PPPOEDISC</a> = 0x8863U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a8c0e8f68b90134eb4f1f17d3d2eb6f8c">ETHTYPE_PPPOE</a> = 0x8864U, 
+<br />
+&#160;&#160;<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a2511e8a31961bd742363b11b274b9dd1">ETHTYPE_JUMBO</a> = 0x8870U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a889eb8f716238d16ee3408f16a5cf19d">ETHTYPE_PROFINET</a> = 0x8892U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a5085a5fd5f9c9506124e93ea43ad2d7c">ETHTYPE_ETHERCAT</a> = 0x88A4U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a02eab0dd87f222a2d555ca38b1b8afcc">ETHTYPE_LLDP</a> = 0x88CCU, 
+<br />
+&#160;&#160;<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ab93419f8edf5692e91629ab92fce8a14">ETHTYPE_SERCOS</a> = 0x88CDU, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad36caec44d8db59ff433a8bd3e92ad3e">ETHTYPE_MRP</a> = 0x88E3U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aa3e9e834eef932d073028e28eb8793dc">ETHTYPE_PTP</a> = 0x88F7U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a39a18006412cbb57536535bd9d378394">ETHTYPE_QINQ</a> = 0x9100U
+<br />
+ }</td></tr>
+<tr class="separator:gab3a7b97666b100584972d158acbbd1f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="gab3a7b97666b100584972d158acbbd1f4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab3a7b97666b100584972d158acbbd1f4">&#9670;&nbsp;</a></span>lwip_ieee_eth_type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__ieee.html#gab3a7b97666b100584972d158acbbd1f4">lwip_ieee_eth_type</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A list of often ethtypes (although lwIP does not use all of them). </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="ggab3a7b97666b100584972d158acbbd1f4ac95756b20fde70b868ef4185dd221c79"></a>ETHTYPE_IP&#160;</td><td class="fielddoc"><p>Internet protocol v4 </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab3a7b97666b100584972d158acbbd1f4a41217db03576ea59c44b28b248c39be5"></a>ETHTYPE_ARP&#160;</td><td class="fielddoc"><p>Address resolution protocol </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab3a7b97666b100584972d158acbbd1f4a530a30feb9b87fd993da2bf83776cf9b"></a>ETHTYPE_WOL&#160;</td><td class="fielddoc"><p>Wake on lan </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab3a7b97666b100584972d158acbbd1f4a14292184cb41b279249319896d0e2b1f"></a>ETHTYPE_RARP&#160;</td><td class="fielddoc"><p>RARP </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab3a7b97666b100584972d158acbbd1f4ad8f84826d52d92ac24a477d1f03e7903"></a>ETHTYPE_VLAN&#160;</td><td class="fielddoc"><p>Virtual local area network </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab3a7b97666b100584972d158acbbd1f4aab26004eed559217be5dd466a79b1383"></a>ETHTYPE_IPV6&#160;</td><td class="fielddoc"><p>Internet protocol v6 </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab3a7b97666b100584972d158acbbd1f4a58c6f40d7cc3edb9455762938f3f6569"></a>ETHTYPE_PPPOEDISC&#160;</td><td class="fielddoc"><p>PPP Over Ethernet Discovery Stage </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab3a7b97666b100584972d158acbbd1f4a8c0e8f68b90134eb4f1f17d3d2eb6f8c"></a>ETHTYPE_PPPOE&#160;</td><td class="fielddoc"><p>PPP Over Ethernet Session Stage </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab3a7b97666b100584972d158acbbd1f4a2511e8a31961bd742363b11b274b9dd1"></a>ETHTYPE_JUMBO&#160;</td><td class="fielddoc"><p>Jumbo Frames </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab3a7b97666b100584972d158acbbd1f4a889eb8f716238d16ee3408f16a5cf19d"></a>ETHTYPE_PROFINET&#160;</td><td class="fielddoc"><p>Process field network </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab3a7b97666b100584972d158acbbd1f4a5085a5fd5f9c9506124e93ea43ad2d7c"></a>ETHTYPE_ETHERCAT&#160;</td><td class="fielddoc"><p>Ethernet for control automation technology </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab3a7b97666b100584972d158acbbd1f4a02eab0dd87f222a2d555ca38b1b8afcc"></a>ETHTYPE_LLDP&#160;</td><td class="fielddoc"><p>Link layer discovery protocol </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab3a7b97666b100584972d158acbbd1f4ab93419f8edf5692e91629ab92fce8a14"></a>ETHTYPE_SERCOS&#160;</td><td class="fielddoc"><p>Serial real-time communication system </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab3a7b97666b100584972d158acbbd1f4ad36caec44d8db59ff433a8bd3e92ad3e"></a>ETHTYPE_MRP&#160;</td><td class="fielddoc"><p>Media redundancy protocol </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab3a7b97666b100584972d158acbbd1f4aa3e9e834eef932d073028e28eb8793dc"></a>ETHTYPE_PTP&#160;</td><td class="fielddoc"><p>Precision time protocol </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab3a7b97666b100584972d158acbbd1f4a39a18006412cbb57536535bd9d378394"></a>ETHTYPE_QINQ&#160;</td><td class="fielddoc"><p>Q-in-Q, 802.1ad </p>
+</td></tr>
+</table>
+
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__ieee.js b/doc/doxygen/output/html/group__ieee.js
new file mode 100644
index 0000000..5ca4fe4
--- /dev/null
+++ b/doc/doxygen/output/html/group__ieee.js
@@ -0,0 +1,21 @@
+var group__ieee =
+[
+    [ "lwip_ieee_eth_type", "group__ieee.html#gab3a7b97666b100584972d158acbbd1f4", [
+      [ "ETHTYPE_IP", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ac95756b20fde70b868ef4185dd221c79", null ],
+      [ "ETHTYPE_ARP", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a41217db03576ea59c44b28b248c39be5", null ],
+      [ "ETHTYPE_WOL", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a530a30feb9b87fd993da2bf83776cf9b", null ],
+      [ "ETHTYPE_RARP", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a14292184cb41b279249319896d0e2b1f", null ],
+      [ "ETHTYPE_VLAN", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad8f84826d52d92ac24a477d1f03e7903", null ],
+      [ "ETHTYPE_IPV6", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aab26004eed559217be5dd466a79b1383", null ],
+      [ "ETHTYPE_PPPOEDISC", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a58c6f40d7cc3edb9455762938f3f6569", null ],
+      [ "ETHTYPE_PPPOE", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a8c0e8f68b90134eb4f1f17d3d2eb6f8c", null ],
+      [ "ETHTYPE_JUMBO", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a2511e8a31961bd742363b11b274b9dd1", null ],
+      [ "ETHTYPE_PROFINET", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a889eb8f716238d16ee3408f16a5cf19d", null ],
+      [ "ETHTYPE_ETHERCAT", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a5085a5fd5f9c9506124e93ea43ad2d7c", null ],
+      [ "ETHTYPE_LLDP", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a02eab0dd87f222a2d555ca38b1b8afcc", null ],
+      [ "ETHTYPE_SERCOS", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ab93419f8edf5692e91629ab92fce8a14", null ],
+      [ "ETHTYPE_MRP", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad36caec44d8db59ff433a8bd3e92ad3e", null ],
+      [ "ETHTYPE_PTP", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aa3e9e834eef932d073028e28eb8793dc", null ],
+      [ "ETHTYPE_QINQ", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a39a18006412cbb57536535bd9d378394", null ]
+    ] ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__if__api.html b/doc/doxygen/output/html/group__if__api.html
new file mode 100644
index 0000000..5e8f05c
--- /dev/null
+++ b/doc/doxygen/output/html/group__if__api.html
@@ -0,0 +1,172 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Interface Identification API</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__if__api.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">Interface Identification API<div class="ingroups"><a class="el" href="group__api.html">APIs</a> &raquo; <a class="el" href="group__socket.html">Socket API</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gac68ad9ef70eb869525e0a1cc818f056b"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__if__api.html#gac68ad9ef70eb869525e0a1cc818f056b">lwip_if_indextoname</a> (unsigned int ifindex, char *ifname)</td></tr>
+<tr class="separator:gac68ad9ef70eb869525e0a1cc818f056b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga76d07962b9d19c3c6f578de780e2c3be"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be">lwip_if_nametoindex</a> (const char *ifname)</td></tr>
+<tr class="separator:ga76d07962b9d19c3c6f578de780e2c3be"><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="gac68ad9ef70eb869525e0a1cc818f056b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac68ad9ef70eb869525e0a1cc818f056b">&#9670;&nbsp;</a></span>lwip_if_indextoname()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* lwip_if_indextoname </td>
+          <td>(</td>
+          <td class="paramtype">unsigned int&#160;</td>
+          <td class="paramname"><em>ifindex</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>ifname</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Maps an interface index to its corresponding name. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ifindex</td><td>interface index </td></tr>
+    <tr><td class="paramname">ifname</td><td>shall point to a buffer of at least {IF_NAMESIZE} bytes </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>If ifindex is an interface index, then the function shall return the value supplied in ifname, which points to a buffer now containing the interface name. Otherwise, the function shall return a NULL pointer. </dd></dl>
+
+</div>
+</div>
+<a id="ga76d07962b9d19c3c6f578de780e2c3be"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga76d07962b9d19c3c6f578de780e2c3be">&#9670;&nbsp;</a></span>lwip_if_nametoindex()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">unsigned int lwip_if_nametoindex </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>ifname</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returs 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>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The corresponding index if ifname is the name of an interface; otherwise, zero. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__if__api.js b/doc/doxygen/output/html/group__if__api.js
new file mode 100644
index 0000000..d7ddb59
--- /dev/null
+++ b/doc/doxygen/output/html/group__if__api.js
@@ -0,0 +1,5 @@
+var group__if__api =
+[
+    [ "lwip_if_indextoname", "group__if__api.html#gac68ad9ef70eb869525e0a1cc818f056b", null ],
+    [ "lwip_if_nametoindex", "group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__igmp.html b/doc/doxygen/output/html/group__igmp.html
new file mode 100644
index 0000000..d8ca14d
--- /dev/null
+++ b/doc/doxygen/output/html/group__igmp.html
@@ -0,0 +1,290 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: IGMP</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__igmp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">IGMP<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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gad990dfc5ed8b644c16cc578c876e588d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__igmp.html#gad990dfc5ed8b644c16cc578c876e588d">netif_igmp_data</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;((struct <a class="el" href="structigmp__group.html">igmp_group</a> *)<a class="el" href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a>(<a class="el" href="structnetif.html">netif</a>, LWIP_NETIF_CLIENT_DATA_INDEX_IGMP))</td></tr>
+<tr class="separator:gad990dfc5ed8b644c16cc578c876e588d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gac989949e9cf84dbd08ab071854bd1ba6"><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__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6">igmp_joingroup</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ifaddr, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:gac989949e9cf84dbd08ab071854bd1ba6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7a6d36dd7b4c8a8c2790c0eac53b49d6"><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__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6">igmp_joingroup_netif</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> *groupaddr)</td></tr>
+<tr class="separator:ga7a6d36dd7b4c8a8c2790c0eac53b49d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga21c572ba7481ca41eb873923a5346544"><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__igmp.html#ga21c572ba7481ca41eb873923a5346544">igmp_leavegroup</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ifaddr, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:ga21c572ba7481ca41eb873923a5346544"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga651bec2a5f3a24766c52aa86a5d88201"><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__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201">igmp_leavegroup_netif</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> *groupaddr)</td></tr>
+<tr class="separator:ga651bec2a5f3a24766c52aa86a5d88201"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>To be called from TCPIP thread </p>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="gad990dfc5ed8b644c16cc578c876e588d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad990dfc5ed8b644c16cc578c876e588d">&#9670;&nbsp;</a></span>netif_igmp_data</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_igmp_data</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td>&#160;&#160;&#160;((struct <a class="el" href="structigmp__group.html">igmp_group</a> *)<a class="el" href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a>(<a class="el" href="structnetif.html">netif</a>, LWIP_NETIF_CLIENT_DATA_INDEX_IGMP))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gac989949e9cf84dbd08ab071854bd1ba6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac989949e9cf84dbd08ab071854bd1ba6">&#9670;&nbsp;</a></span>igmp_joingroup()</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> igmp_joingroup </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ifaddr</em>, </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> *&#160;</td>
+          <td class="paramname"><em>groupaddr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Join a group on one network interface.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ifaddr</td><td>ip address of the network interface which should join a new group </td></tr>
+    <tr><td class="paramname">groupaddr</td><td>the ip address of the group which to join </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if group was joined on the <a class="el" href="structnetif.html">netif(s)</a>, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ga7a6d36dd7b4c8a8c2790c0eac53b49d6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7a6d36dd7b4c8a8c2790c0eac53b49d6">&#9670;&nbsp;</a></span>igmp_joingroup_netif()</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> igmp_joingroup_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>groupaddr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Join a group on one network interface.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the network interface which should join a new group </td></tr>
+    <tr><td class="paramname">groupaddr</td><td>the ip address of the group which to join </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if group was joined on the netif, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ga21c572ba7481ca41eb873923a5346544"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga21c572ba7481ca41eb873923a5346544">&#9670;&nbsp;</a></span>igmp_leavegroup()</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> igmp_leavegroup </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ifaddr</em>, </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> *&#160;</td>
+          <td class="paramname"><em>groupaddr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Leave a group on one network interface.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ifaddr</td><td>ip address of the network interface which should leave a group </td></tr>
+    <tr><td class="paramname">groupaddr</td><td>the ip address of the group which to leave </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if group was left on the <a class="el" href="structnetif.html">netif(s)</a>, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ga651bec2a5f3a24766c52aa86a5d88201"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga651bec2a5f3a24766c52aa86a5d88201">&#9670;&nbsp;</a></span>igmp_leavegroup_netif()</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> igmp_leavegroup_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>groupaddr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Leave a group on one network interface.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the network interface which should leave a group </td></tr>
+    <tr><td class="paramname">groupaddr</td><td>the ip address of the group which to leave </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if group was left on the netif, 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="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__igmp.js b/doc/doxygen/output/html/group__igmp.js
new file mode 100644
index 0000000..f6e54a5
--- /dev/null
+++ b/doc/doxygen/output/html/group__igmp.js
@@ -0,0 +1,8 @@
+var group__igmp =
+[
+    [ "netif_igmp_data", "group__igmp.html#gad990dfc5ed8b644c16cc578c876e588d", null ],
+    [ "igmp_joingroup", "group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6", null ],
+    [ "igmp_joingroup_netif", "group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6", null ],
+    [ "igmp_leavegroup", "group__igmp.html#ga21c572ba7481ca41eb873923a5346544", null ],
+    [ "igmp_leavegroup_netif", "group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__infrastructure.html b/doc/doxygen/output/html/group__infrastructure.html
new file mode 100644
index 0000000..662c63f
--- /dev/null
+++ b/doc/doxygen/output/html/group__infrastructure.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Infrastructure</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__infrastructure.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">Infrastructure</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__ipaddr"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html">IP address handling</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__mempool"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mempool.html">Memory pools</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__pbuf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html">Packet buffers (PBUF)</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__infrastructure__errors"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__infrastructure__errors.html">Error codes</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__iana"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iana.html">IANA assigned numbers</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__ieee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ieee.html">IEEE assigned numbers</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>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__infrastructure.js b/doc/doxygen/output/html/group__infrastructure.js
new file mode 100644
index 0000000..c8488d3
--- /dev/null
+++ b/doc/doxygen/output/html/group__infrastructure.js
@@ -0,0 +1,9 @@
+var group__infrastructure =
+[
+    [ "IP address handling", "group__ipaddr.html", "group__ipaddr" ],
+    [ "Memory pools", "group__mempool.html", "group__mempool" ],
+    [ "Packet buffers (PBUF)", "group__pbuf.html", "group__pbuf" ],
+    [ "Error codes", "group__infrastructure__errors.html", "group__infrastructure__errors" ],
+    [ "IANA assigned numbers", "group__iana.html", "group__iana" ],
+    [ "IEEE assigned numbers", "group__ieee.html", "group__ieee" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__infrastructure__errors.html b/doc/doxygen/output/html/group__infrastructure__errors.html
new file mode 100644
index 0000000..e1ac0fd
--- /dev/null
+++ b/doc/doxygen/output/html/group__infrastructure__errors.html
@@ -0,0 +1,205 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Error codes</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__infrastructure__errors.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#enum-members">Enumerations</a>  </div>
+  <div class="headertitle">
+<div class="title">Error codes<div class="ingroups"><a class="el" href="group__infrastructure.html">Infrastructure</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gaf02d9da80fd66b4f986d2c53d7231ddb"><td class="memItemLeft" align="right" valign="top">typedef s8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a></td></tr>
+<tr class="separator:gaf02d9da80fd66b4f986d2c53d7231ddb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:gae2e66c7d13afc90ffecd6151680fbadc"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__infrastructure__errors.html#gae2e66c7d13afc90ffecd6151680fbadc">err_enum_t</a> { <br />
+&#160;&#160;<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb">ERR_OK</a> = 0, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaaaeafdbf3aecc46864daa3cd829c7e05">ERR_MEM</a> = -1, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca05c91366f1b5203a5db9a241b415cd63">ERR_BUF</a> = -2, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcac568baeb6407ef5e2630084ccbc34be8">ERR_TIMEOUT</a> = -3, 
+<br />
+&#160;&#160;<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca9448893187313c0c5a502ca9a9ad1c2a">ERR_RTE</a> = -4, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca13e1dd0edca8a27b6abdf1524bde7929">ERR_INPROGRESS</a> = -5, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa9a1c5a6fdeed0aad7fe41d538482bbd">ERR_VAL</a> = -6, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab9dcf89d46668b072192278fb907b7ad">ERR_WOULDBLOCK</a> = -7, 
+<br />
+&#160;&#160;<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca4ebdc2aa1dbd75f927845733a3fb1f8b">ERR_USE</a> = -8, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcae6f9c1e4c18ca844f7934307d4cc30e5">ERR_ALREADY</a> = -9, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca8543e1d6422fed7b318d97e08dcbaa33">ERR_ISCONN</a> = -10, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab0036c51817b5200bfe8157cc4115b27">ERR_CONN</a> = -11, 
+<br />
+&#160;&#160;<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca7d61d90449ae6788575e8e46d5d3bbc6">ERR_IF</a> = -12, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaf316b2c5eee4079820f7100849115142">ERR_ABRT</a> = -13, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca759030525f1768a23dc086a5fd45b4e5">ERR_RST</a> = -14, 
+<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa5176d9fecf8ec43d3bc49f4e6c3f7f5">ERR_CLSD</a> = -15, 
+<br />
+&#160;&#160;<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab508ce0ebdf3ca735208b00a80a45c91">ERR_ARG</a> = -16
+<br />
+ }</td></tr>
+<tr class="separator:gae2e66c7d13afc90ffecd6151680fbadc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="gaf02d9da80fd66b4f986d2c53d7231ddb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf02d9da80fd66b4f986d2c53d7231ddb">&#9670;&nbsp;</a></span>err_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef s8_t <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Define LWIP_ERR_T in cc.h if you want to use a different type for your platform (must be signed). </p>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="gae2e66c7d13afc90ffecd6151680fbadc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae2e66c7d13afc90ffecd6151680fbadc">&#9670;&nbsp;</a></span>err_enum_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__infrastructure__errors.html#gae2e66c7d13afc90ffecd6151680fbadc">err_enum_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Definitions for error constants. </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb"></a>ERR_OK&#160;</td><td class="fielddoc"><p>No error, everything OK. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggae2e66c7d13afc90ffecd6151680fbadcaaaeafdbf3aecc46864daa3cd829c7e05"></a>ERR_MEM&#160;</td><td class="fielddoc"><p>Out of memory error. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggae2e66c7d13afc90ffecd6151680fbadca05c91366f1b5203a5db9a241b415cd63"></a>ERR_BUF&#160;</td><td class="fielddoc"><p>Buffer error. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggae2e66c7d13afc90ffecd6151680fbadcac568baeb6407ef5e2630084ccbc34be8"></a>ERR_TIMEOUT&#160;</td><td class="fielddoc"><p>Timeout. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggae2e66c7d13afc90ffecd6151680fbadca9448893187313c0c5a502ca9a9ad1c2a"></a>ERR_RTE&#160;</td><td class="fielddoc"><p>Routing problem. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggae2e66c7d13afc90ffecd6151680fbadca13e1dd0edca8a27b6abdf1524bde7929"></a>ERR_INPROGRESS&#160;</td><td class="fielddoc"><p>Operation in progress </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggae2e66c7d13afc90ffecd6151680fbadcaa9a1c5a6fdeed0aad7fe41d538482bbd"></a>ERR_VAL&#160;</td><td class="fielddoc"><p>Illegal value. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggae2e66c7d13afc90ffecd6151680fbadcab9dcf89d46668b072192278fb907b7ad"></a>ERR_WOULDBLOCK&#160;</td><td class="fielddoc"><p>Operation would block. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggae2e66c7d13afc90ffecd6151680fbadca4ebdc2aa1dbd75f927845733a3fb1f8b"></a>ERR_USE&#160;</td><td class="fielddoc"><p>Address in use. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggae2e66c7d13afc90ffecd6151680fbadcae6f9c1e4c18ca844f7934307d4cc30e5"></a>ERR_ALREADY&#160;</td><td class="fielddoc"><p>Already connecting. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggae2e66c7d13afc90ffecd6151680fbadca8543e1d6422fed7b318d97e08dcbaa33"></a>ERR_ISCONN&#160;</td><td class="fielddoc"><p>Conn already established. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggae2e66c7d13afc90ffecd6151680fbadcab0036c51817b5200bfe8157cc4115b27"></a>ERR_CONN&#160;</td><td class="fielddoc"><p>Not connected. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggae2e66c7d13afc90ffecd6151680fbadca7d61d90449ae6788575e8e46d5d3bbc6"></a>ERR_IF&#160;</td><td class="fielddoc"><p>Low-level netif error </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggae2e66c7d13afc90ffecd6151680fbadcaf316b2c5eee4079820f7100849115142"></a>ERR_ABRT&#160;</td><td class="fielddoc"><p>Connection aborted. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggae2e66c7d13afc90ffecd6151680fbadca759030525f1768a23dc086a5fd45b4e5"></a>ERR_RST&#160;</td><td class="fielddoc"><p>Connection reset. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggae2e66c7d13afc90ffecd6151680fbadcaa5176d9fecf8ec43d3bc49f4e6c3f7f5"></a>ERR_CLSD&#160;</td><td class="fielddoc"><p>Connection closed. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggae2e66c7d13afc90ffecd6151680fbadcab508ce0ebdf3ca735208b00a80a45c91"></a>ERR_ARG&#160;</td><td class="fielddoc"><p>Illegal argument. </p>
+</td></tr>
+</table>
+
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__infrastructure__errors.js b/doc/doxygen/output/html/group__infrastructure__errors.js
new file mode 100644
index 0000000..bbeb9ad
--- /dev/null
+++ b/doc/doxygen/output/html/group__infrastructure__errors.js
@@ -0,0 +1,23 @@
+var group__infrastructure__errors =
+[
+    [ "err_t", "group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb", null ],
+    [ "err_enum_t", "group__infrastructure__errors.html#gae2e66c7d13afc90ffecd6151680fbadc", [
+      [ "ERR_OK", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb", null ],
+      [ "ERR_MEM", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaaaeafdbf3aecc46864daa3cd829c7e05", null ],
+      [ "ERR_BUF", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca05c91366f1b5203a5db9a241b415cd63", null ],
+      [ "ERR_TIMEOUT", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcac568baeb6407ef5e2630084ccbc34be8", null ],
+      [ "ERR_RTE", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca9448893187313c0c5a502ca9a9ad1c2a", null ],
+      [ "ERR_INPROGRESS", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca13e1dd0edca8a27b6abdf1524bde7929", null ],
+      [ "ERR_VAL", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa9a1c5a6fdeed0aad7fe41d538482bbd", null ],
+      [ "ERR_WOULDBLOCK", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab9dcf89d46668b072192278fb907b7ad", null ],
+      [ "ERR_USE", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca4ebdc2aa1dbd75f927845733a3fb1f8b", null ],
+      [ "ERR_ALREADY", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcae6f9c1e4c18ca844f7934307d4cc30e5", null ],
+      [ "ERR_ISCONN", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca8543e1d6422fed7b318d97e08dcbaa33", null ],
+      [ "ERR_CONN", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab0036c51817b5200bfe8157cc4115b27", null ],
+      [ "ERR_IF", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca7d61d90449ae6788575e8e46d5d3bbc6", null ],
+      [ "ERR_ABRT", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaf316b2c5eee4079820f7100849115142", null ],
+      [ "ERR_RST", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca759030525f1768a23dc086a5fd45b4e5", null ],
+      [ "ERR_CLSD", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa5176d9fecf8ec43d3bc49f4e6c3f7f5", null ],
+      [ "ERR_ARG", "group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab508ce0ebdf3ca735208b00a80a45c91", null ]
+    ] ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__ip.html b/doc/doxygen/output/html/group__ip.html
new file mode 100644
index 0000000..1612c9a
--- /dev/null
+++ b/doc/doxygen/output/html/group__ip.html
@@ -0,0 +1,375 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: IP</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__ip.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">IP<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__ip4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4.html">IPv4</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__ip6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6.html">IPv6</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gaf056aa43789c2964f091f8349bb83730"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip.html#gaf056aa43789c2964f091f8349bb83730">ip_output</a>(p,  src,  dest,  ttl,  tos,  proto)</td></tr>
+<tr class="separator:gaf056aa43789c2964f091f8349bb83730"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga51cd772c3f6fca7c0363dca1fce7b250"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250">ip_output_if</a>(p,  src,  dest,  ttl,  tos,  proto,  <a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga51cd772c3f6fca7c0363dca1fce7b250"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab9d45f846f796bd6ce1e0c780c392765"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip.html#gab9d45f846f796bd6ce1e0c780c392765">ip_output_if_src</a>(p,  src,  dest,  ttl,  tos,  proto,  <a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gab9d45f846f796bd6ce1e0c780c392765"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0fa3afc2c00aea346889b476650adee3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip.html#ga0fa3afc2c00aea346889b476650adee3">ip_route</a>(src,  dest)</td></tr>
+<tr class="separator:ga0fa3afc2c00aea346889b476650adee3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4a4b9439c91eeec719692dfe10f14af0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip.html#ga4a4b9439c91eeec719692dfe10f14af0">ip_netif_get_local_ip</a>(<a class="el" href="structnetif.html">netif</a>,  dest)</td></tr>
+<tr class="separator:ga4a4b9439c91eeec719692dfe10f14af0"><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="ga4a4b9439c91eeec719692dfe10f14af0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4a4b9439c91eeec719692dfe10f14af0">&#9670;&nbsp;</a></span>ip_netif_get_local_ip</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_netif_get_local_ip</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(<a class="code" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(dest) ? \</div><div class="line">        ip6_netif_get_local_ip(<a class="code" href="structnetif.html">netif</a>, <a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(dest)) : \</div><div class="line">        ip4_netif_get_local_ip(<a class="code" href="structnetif.html">netif</a>))</div><div class="ttc" id="group__ip6addr_html_ga9bac7e938757f1d24df2404e8b57cb7d"><div class="ttname"><a href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a></div><div class="ttdeci">#define IP_IS_V6(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:102</div></div>
+<div class="ttc" id="structnetif_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="group__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>Get netif for IP. </p>
+
+</div>
+</div>
+<a id="gaf056aa43789c2964f091f8349bb83730"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf056aa43789c2964f091f8349bb83730">&#9670;&nbsp;</a></span>ip_output</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_output</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">p, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ttl, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">tos, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">proto&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(<a class="code" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(dest) ? \</div><div class="line">        ip6_output(p, <a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(src), <a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(dest), ttl, tos, proto) : \</div><div class="line">        <a class="code" href="ip4_8c.html#ac87d296205eb5ac04058e609672d4ba8">ip4_output</a>(p, <a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(src), <a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(dest), ttl, tos, proto))</div><div class="ttc" id="group__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="group__ip6addr_html_ga9bac7e938757f1d24df2404e8b57cb7d"><div class="ttname"><a href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a></div><div class="ttdeci">#define IP_IS_V6(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:102</div></div>
+<div class="ttc" id="ip4_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="group__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>Output IP packet, netif is selected by source address </p>
+
+</div>
+</div>
+<a id="ga51cd772c3f6fca7c0363dca1fce7b250"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga51cd772c3f6fca7c0363dca1fce7b250">&#9670;&nbsp;</a></span>ip_output_if</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_output_if</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">p, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ttl, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">tos, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">proto, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(<a class="code" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(dest) ? \</div><div class="line">        ip6_output_if(p, <a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(src), <a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(dest), ttl, tos, proto, <a class="code" href="structnetif.html">netif</a>) : \</div><div class="line">        <a class="code" href="ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917">ip4_output_if</a>(p, <a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(src), <a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(dest), ttl, tos, proto, <a class="code" href="structnetif.html">netif</a>))</div><div class="ttc" id="group__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="group__ip6addr_html_ga9bac7e938757f1d24df2404e8b57cb7d"><div class="ttname"><a href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a></div><div class="ttdeci">#define IP_IS_V6(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:102</div></div>
+<div class="ttc" id="structnetif_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="ip4_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="group__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>Output IP packet to specified interface </p>
+
+</div>
+</div>
+<a id="gab9d45f846f796bd6ce1e0c780c392765"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab9d45f846f796bd6ce1e0c780c392765">&#9670;&nbsp;</a></span>ip_output_if_src</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_output_if_src</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">p, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ttl, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">tos, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">proto, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(<a class="code" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(dest) ? \</div><div class="line">        ip6_output_if_src(p, <a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(src), <a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(dest), ttl, tos, proto, <a class="code" href="structnetif.html">netif</a>) : \</div><div class="line">        <a class="code" href="ip4_8c.html#a2943d118873e9eb1d8296e04a6740db7">ip4_output_if_src</a>(p, <a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(src), <a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(dest), ttl, tos, proto, <a class="code" href="structnetif.html">netif</a>))</div><div class="ttc" id="group__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="group__ip6addr_html_ga9bac7e938757f1d24df2404e8b57cb7d"><div class="ttname"><a href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a></div><div class="ttdeci">#define IP_IS_V6(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:102</div></div>
+<div class="ttc" id="structnetif_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="ip4_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="group__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>Output IP packet to interface specifying source address </p>
+
+</div>
+</div>
+<a id="ga0fa3afc2c00aea346889b476650adee3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0fa3afc2c00aea346889b476650adee3">&#9670;&nbsp;</a></span>ip_route</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_route</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(<a class="code" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(dest) ? \</div><div class="line">        ip6_route(<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(src), <a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(dest)) : \</div><div class="line">        <a class="code" href="ip4_8c.html#ab615a9ca8fdd99e697f52506fc440fba">ip4_route_src</a>(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(src), <a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(dest)))</div><div class="ttc" id="group__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="group__ip6addr_html_ga9bac7e938757f1d24df2404e8b57cb7d"><div class="ttname"><a href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a></div><div class="ttdeci">#define IP_IS_V6(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:102</div></div>
+<div class="ttc" id="ip4_8c_html_ab615a9ca8fdd99e697f52506fc440fba"><div class="ttname"><a href="ip4_8c.html#ab615a9ca8fdd99e697f52506fc440fba">ip4_route_src</a></div><div class="ttdeci">struct netif * ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest)</div><div class="ttdef"><b>Definition:</b> ip4.c:129</div></div>
+<div class="ttc" id="group__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>Get netif for address combination. See <a class="el" href="ip6_8h.html#a1153bd9e8c45847282105ab6379e6e70">ip6_route</a> and <a class="el" href="ip4_8h.html#ac659f675356cfc1d4d13884946347e47">ip4_route</a> </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__ip.js b/doc/doxygen/output/html/group__ip.js
new file mode 100644
index 0000000..475d6c3
--- /dev/null
+++ b/doc/doxygen/output/html/group__ip.js
@@ -0,0 +1,10 @@
+var group__ip =
+[
+    [ "IPv4", "group__ip4.html", "group__ip4" ],
+    [ "IPv6", "group__ip6.html", "group__ip6" ],
+    [ "ip_netif_get_local_ip", "group__ip.html#ga4a4b9439c91eeec719692dfe10f14af0", null ],
+    [ "ip_output", "group__ip.html#gaf056aa43789c2964f091f8349bb83730", null ],
+    [ "ip_output_if", "group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250", null ],
+    [ "ip_output_if_src", "group__ip.html#gab9d45f846f796bd6ce1e0c780c392765", null ],
+    [ "ip_route", "group__ip.html#ga0fa3afc2c00aea346889b476650adee3", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__ip4.html b/doc/doxygen/output/html/group__ip4.html
new file mode 100644
index 0000000..193e4e1
--- /dev/null
+++ b/doc/doxygen/output/html/group__ip4.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: IPv4</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__ip4.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">IPv4<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__autoip"><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:group__dhcp4"><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>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__igmp"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__igmp.html">IGMP</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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga6ae67c86aa82dccac5df81d93de00420"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420">ip4_set_default_multicast_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *default_multicast_netif)</td></tr>
+<tr class="separator:ga6ae67c86aa82dccac5df81d93de00420"><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="ga6ae67c86aa82dccac5df81d93de00420"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6ae67c86aa82dccac5df81d93de00420">&#9670;&nbsp;</a></span>ip4_set_default_multicast_netif()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ip4_set_default_multicast_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>default_multicast_netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set a default netif for IPv4 multicast. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__ip4.js b/doc/doxygen/output/html/group__ip4.js
new file mode 100644
index 0000000..326b97b
--- /dev/null
+++ b/doc/doxygen/output/html/group__ip4.js
@@ -0,0 +1,7 @@
+var group__ip4 =
+[
+    [ "AUTOIP", "group__autoip.html", "group__autoip" ],
+    [ "DHCPv4", "group__dhcp4.html", "group__dhcp4" ],
+    [ "IGMP", "group__igmp.html", "group__igmp" ],
+    [ "ip4_set_default_multicast_netif", "group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__ip4addr.html b/doc/doxygen/output/html/group__ip4addr.html
new file mode 100644
index 0000000..fc42e6c
--- /dev/null
+++ b/doc/doxygen/output/html/group__ip4addr.html
@@ -0,0 +1,485 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: IPv4 only</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__ip4addr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">IPv4 only<div class="ingroups"><a class="el" href="group__infrastructure.html">Infrastructure</a> &raquo; <a class="el" href="group__ipaddr.html">IP address handling</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga1eaffd17b4b3c56cc91a6d516e18118f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#ga1eaffd17b4b3c56cc91a6d516e18118f">IPADDR4_INIT</a>(u32val)&#160;&#160;&#160;{ { { { u32val, 0ul, 0ul, 0ul } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_V4 }</td></tr>
+<tr class="separator:ga1eaffd17b4b3c56cc91a6d516e18118f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga55cc3896c46564bd2941ee5806fe1e11"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#ga55cc3896c46564bd2941ee5806fe1e11">IPADDR4_INIT_BYTES</a>(a,  b,  c,  d)&#160;&#160;&#160;<a class="el" href="group__ip4addr.html#ga1eaffd17b4b3c56cc91a6d516e18118f">IPADDR4_INIT</a>(PP_HTONL(<a class="el" href="def_8h.html#acf56d3da92a0a7a8a62a617e793e948c">LWIP_MAKEU32</a>(a,b,c,d)))</td></tr>
+<tr class="separator:ga55cc3896c46564bd2941ee5806fe1e11"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab1a059f07bd9c50aa58447d963b823a1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#gab1a059f07bd9c50aa58447d963b823a1">IP_IS_V4_VAL</a>(ipaddr)&#160;&#160;&#160;(IP_GET_TYPE(&amp;ipaddr) == <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a>)</td></tr>
+<tr class="separator:gab1a059f07bd9c50aa58447d963b823a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabee5dab2191bb0f3355d7f30d1496f24"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#gabee5dab2191bb0f3355d7f30d1496f24">IP_IS_V4</a>(ipaddr)&#160;&#160;&#160;(((ipaddr) == NULL) || <a class="el" href="group__ip4addr.html#gab1a059f07bd9c50aa58447d963b823a1">IP_IS_V4_VAL</a>(*(ipaddr)))</td></tr>
+<tr class="separator:gabee5dab2191bb0f3355d7f30d1496f24"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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)&#160;&#160;&#160;(&amp;((ipaddr)-&gt;u_addr.ip4))</td></tr>
+<tr class="separator:gad7268a496b7e3f872efecd859eba6f03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadd2203c6cbfb6de8c2d9ce5bbfb2bd2a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#gadd2203c6cbfb6de8c2d9ce5bbfb2bd2a">IP_ADDR4</a>(ipaddr,  a,  b,  c,  d)</td></tr>
+<tr class="separator:gadd2203c6cbfb6de8c2d9ce5bbfb2bd2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaef063b2e975dae7ecf398770b04b14af"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#gaef063b2e975dae7ecf398770b04b14af">ip_addr_copy_from_ip4</a>(dest,  src)</td></tr>
+<tr class="separator:gaef063b2e975dae7ecf398770b04b14af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga971516589980428bf51f37cefa4ddf66"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#ga971516589980428bf51f37cefa4ddf66">ip_addr_set_ip4_u32</a>(ipaddr,  val)</td></tr>
+<tr class="separator:ga971516589980428bf51f37cefa4ddf66"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga624b5010ccc04cc3d0de2acce44f1c9e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#ga624b5010ccc04cc3d0de2acce44f1c9e">ip_addr_set_ip4_u32_val</a>(ipaddr,  val)</td></tr>
+<tr class="separator:ga624b5010ccc04cc3d0de2acce44f1c9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga09c62e8a3bf599aa7f335e0ad0820e85"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#ga09c62e8a3bf599aa7f335e0ad0820e85">ip_addr_get_ip4_u32</a>(ipaddr)</td></tr>
+<tr class="separator:ga09c62e8a3bf599aa7f335e0ad0820e85"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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>
+<tr class="separator:gae920b6e81610a38cf9ada52118807eff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa3f65a42b68149e96e618600b2ca2e42"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#gaa3f65a42b68149e96e618600b2ca2e42">IP4_ADDR_ANY4</a>&#160;&#160;&#160;(<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;ip_addr_any))</td></tr>
+<tr class="separator:gaa3f65a42b68149e96e618600b2ca2e42"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad546955e48dada78b552375b873f6986"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#gad546955e48dada78b552375b873f6986">IP_ADDR_BROADCAST</a>&#160;&#160;&#160;(&amp;ip_addr_broadcast)</td></tr>
+<tr class="separator:gad546955e48dada78b552375b873f6986"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5efdf55ba72c2b1b5755b1fc6f559a1a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#ga5efdf55ba72c2b1b5755b1fc6f559a1a">IP4_ADDR_BROADCAST</a>&#160;&#160;&#160;(<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;ip_addr_broadcast))</td></tr>
+<tr class="separator:ga5efdf55ba72c2b1b5755b1fc6f559a1a"><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="gae920b6e81610a38cf9ada52118807eff"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae920b6e81610a38cf9ada52118807eff">&#9670;&nbsp;</a></span>IP4_ADDR_ANY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP4_ADDR_ANY&#160;&#160;&#160;(&amp;ip_addr_any)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Can be used as a fixed/const ip_addr_t for the IPv4 wildcard and the broadcast address </p>
+
+</div>
+</div>
+<a id="gaa3f65a42b68149e96e618600b2ca2e42"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa3f65a42b68149e96e618600b2ca2e42">&#9670;&nbsp;</a></span>IP4_ADDR_ANY4</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP4_ADDR_ANY4&#160;&#160;&#160;(<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;ip_addr_any))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Can be used as a fixed/const ip4_addr_t for the wildcard and the broadcast address </p>
+
+</div>
+</div>
+<a id="ga5efdf55ba72c2b1b5755b1fc6f559a1a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5efdf55ba72c2b1b5755b1fc6f559a1a">&#9670;&nbsp;</a></span>IP4_ADDR_BROADCAST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP4_ADDR_BROADCAST&#160;&#160;&#160;(<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;ip_addr_broadcast))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gad7268a496b7e3f872efecd859eba6f03"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad7268a496b7e3f872efecd859eba6f03">&#9670;&nbsp;</a></span>ip_2_ip4</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_2_ip4</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td>&#160;&#160;&#160;(&amp;((ipaddr)-&gt;u_addr.ip4))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert generic ip address to specific protocol version </p>
+
+</div>
+</div>
+<a id="gadd2203c6cbfb6de8c2d9ce5bbfb2bd2a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadd2203c6cbfb6de8c2d9ce5bbfb2bd2a">&#9670;&nbsp;</a></span>IP_ADDR4</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_ADDR4</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">a, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">b, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">d&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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" href="ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974">IP4_ADDR</a>(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(ipaddr),a,b,c,d); \</div><div class="line">                                           IP_SET_TYPE_VAL(*(ipaddr), <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a>); } <span class="keywordflow">while</span>(0)</div><div class="ttc" id="ip4__addr_8h_html_a58aee4166c466f9ac7035bf5cc9f9974"><div class="ttname"><a href="ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974">IP4_ADDR</a></div><div class="ttdeci">#define IP4_ADDR(ipaddr, a, b, c, d)</div><div class="ttdef"><b>Definition:</b> ip4_addr.h:104</div></div>
+<div class="ttc" id="group__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="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:56</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="ga3e5e67b7292b156034560fef2202776c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3e5e67b7292b156034560fef2202776c">&#9670;&nbsp;</a></span>IP_ADDR_ANY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_ADDR_ANY&#160;&#160;&#160;<a class="el" href="group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff">IP4_ADDR_ANY</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Can be used as a fixed/const ip_addr_t for the IP wildcard. Defined to <a class="el" href="group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff">IP4_ADDR_ANY</a> when IPv4 is enabled. Defined to <a class="el" href="group__ip6addr.html#ga5181d2cb6b9254eb5ad4137f7b3635a0">IP6_ADDR_ANY</a> in IPv6 only systems. Use this if you can handle IPv4 <em>AND</em> IPv6 addresses. Use <a class="el" href="group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff">IP4_ADDR_ANY</a> or <a class="el" href="group__ip6addr.html#ga5181d2cb6b9254eb5ad4137f7b3635a0">IP6_ADDR_ANY</a> when the IP type matters. </p>
+
+</div>
+</div>
+<a id="gad546955e48dada78b552375b873f6986"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad546955e48dada78b552375b873f6986">&#9670;&nbsp;</a></span>IP_ADDR_BROADCAST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_ADDR_BROADCAST&#160;&#160;&#160;(&amp;ip_addr_broadcast)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gaef063b2e975dae7ecf398770b04b14af"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaef063b2e975dae7ecf398770b04b14af">&#9670;&nbsp;</a></span>ip_addr_copy_from_ip4</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_copy_from_ip4</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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>{ \</div><div class="line">  ip4_addr_copy(*<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;(dest)), src); IP_SET_TYPE_VAL(dest, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a>); ip_clear_no4(&amp;dest); }<span class="keywordflow">while</span>(0)</div><div class="ttc" id="group__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="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:56</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="ga09c62e8a3bf599aa7f335e0ad0820e85"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga09c62e8a3bf599aa7f335e0ad0820e85">&#9670;&nbsp;</a></span>ip_addr_get_ip4_u32</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_get_ip4_u32</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(((ipaddr) &amp;&amp; <a class="code" href="group__ip4addr.html#gabee5dab2191bb0f3355d7f30d1496f24">IP_IS_V4</a>(ipaddr)) ? \</div><div class="line">  <a class="code" href="ip4__addr_8h.html#ad50d93464bbbda199b585c54869a3a4b">ip4_addr_get_u32</a>(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(ipaddr)) : 0)</div><div class="ttc" id="group__ip4addr_html_gabee5dab2191bb0f3355d7f30d1496f24"><div class="ttname"><a href="group__ip4addr.html#gabee5dab2191bb0f3355d7f30d1496f24">IP_IS_V4</a></div><div class="ttdeci">#define IP_IS_V4(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:100</div></div>
+<div class="ttc" id="ip4__addr_8h_html_ad50d93464bbbda199b585c54869a3a4b"><div class="ttname"><a href="ip4__addr_8h.html#ad50d93464bbbda199b585c54869a3a4b">ip4_addr_get_u32</a></div><div class="ttdeci">#define ip4_addr_get_u32(src_ipaddr)</div><div class="ttdef"><b>Definition:</b> ip4_addr.h:128</div></div>
+<div class="ttc" id="group__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><!-- fragment -->
+</div>
+</div>
+<a id="ga971516589980428bf51f37cefa4ddf66"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga971516589980428bf51f37cefa4ddf66">&#9670;&nbsp;</a></span>ip_addr_set_ip4_u32</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_set_ip4_u32</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">val&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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>{<span class="keywordflow">if</span>(ipaddr){<a class="code" href="ip4__addr_8h.html#aeb39f58b38435f89219c8ccb509eb520">ip4_addr_set_u32</a>(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(ipaddr), val); \</div><div class="line">  IP_SET_TYPE(ipaddr, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a>); ip_clear_no4(ipaddr); }}<span class="keywordflow">while</span>(0)</div><div class="ttc" id="group__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="ip4__addr_8h_html_aeb39f58b38435f89219c8ccb509eb520"><div class="ttname"><a href="ip4__addr_8h.html#aeb39f58b38435f89219c8ccb509eb520">ip4_addr_set_u32</a></div><div class="ttdeci">#define ip4_addr_set_u32(dest_ipaddr, src_u32)</div><div class="ttdef"><b>Definition:</b> ip4_addr.h:126</div></div>
+<div class="ttc" id="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:56</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="ga624b5010ccc04cc3d0de2acce44f1c9e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga624b5010ccc04cc3d0de2acce44f1c9e">&#9670;&nbsp;</a></span>ip_addr_set_ip4_u32_val</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_set_ip4_u32_val</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">val&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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" href="ip4__addr_8h.html#aeb39f58b38435f89219c8ccb509eb520">ip4_addr_set_u32</a>(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;(ipaddr)), val); \</div><div class="line">  IP_SET_TYPE_VAL(ipaddr, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a>); ip_clear_no4(&amp;ipaddr); }<span class="keywordflow">while</span>(0)</div><div class="ttc" id="group__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="ip4__addr_8h_html_aeb39f58b38435f89219c8ccb509eb520"><div class="ttname"><a href="ip4__addr_8h.html#aeb39f58b38435f89219c8ccb509eb520">ip4_addr_set_u32</a></div><div class="ttdeci">#define ip4_addr_set_u32(dest_ipaddr, src_u32)</div><div class="ttdef"><b>Definition:</b> ip4_addr.h:126</div></div>
+<div class="ttc" id="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:56</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="gabee5dab2191bb0f3355d7f30d1496f24"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabee5dab2191bb0f3355d7f30d1496f24">&#9670;&nbsp;</a></span>IP_IS_V4</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_IS_V4</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td>&#160;&#160;&#160;(((ipaddr) == NULL) || <a class="el" href="group__ip4addr.html#gab1a059f07bd9c50aa58447d963b823a1">IP_IS_V4_VAL</a>(*(ipaddr)))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gab1a059f07bd9c50aa58447d963b823a1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab1a059f07bd9c50aa58447d963b823a1">&#9670;&nbsp;</a></span>IP_IS_V4_VAL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_IS_V4_VAL</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td>&#160;&#160;&#160;(IP_GET_TYPE(&amp;ipaddr) == <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga1eaffd17b4b3c56cc91a6d516e18118f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1eaffd17b4b3c56cc91a6d516e18118f">&#9670;&nbsp;</a></span>IPADDR4_INIT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IPADDR4_INIT</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">u32val</td><td>)</td>
+          <td>&#160;&#160;&#160;{ { { { u32val, 0ul, 0ul, 0ul } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_V4 }</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga55cc3896c46564bd2941ee5806fe1e11"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga55cc3896c46564bd2941ee5806fe1e11">&#9670;&nbsp;</a></span>IPADDR4_INIT_BYTES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IPADDR4_INIT_BYTES</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">a, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">b, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">d&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="group__ip4addr.html#ga1eaffd17b4b3c56cc91a6d516e18118f">IPADDR4_INIT</a>(PP_HTONL(<a class="el" href="def_8h.html#acf56d3da92a0a7a8a62a617e793e948c">LWIP_MAKEU32</a>(a,b,c,d)))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__ip4addr.js b/doc/doxygen/output/html/group__ip4addr.js
new file mode 100644
index 0000000..4d5cea3
--- /dev/null
+++ b/doc/doxygen/output/html/group__ip4addr.js
@@ -0,0 +1,18 @@
+var group__ip4addr =
+[
+    [ "IP4_ADDR_ANY", "group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff", null ],
+    [ "IP4_ADDR_ANY4", "group__ip4addr.html#gaa3f65a42b68149e96e618600b2ca2e42", null ],
+    [ "IP4_ADDR_BROADCAST", "group__ip4addr.html#ga5efdf55ba72c2b1b5755b1fc6f559a1a", null ],
+    [ "ip_2_ip4", "group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03", null ],
+    [ "IP_ADDR4", "group__ip4addr.html#gadd2203c6cbfb6de8c2d9ce5bbfb2bd2a", null ],
+    [ "IP_ADDR_ANY", "group__ip4addr.html#ga3e5e67b7292b156034560fef2202776c", null ],
+    [ "IP_ADDR_BROADCAST", "group__ip4addr.html#gad546955e48dada78b552375b873f6986", null ],
+    [ "ip_addr_copy_from_ip4", "group__ip4addr.html#gaef063b2e975dae7ecf398770b04b14af", null ],
+    [ "ip_addr_get_ip4_u32", "group__ip4addr.html#ga09c62e8a3bf599aa7f335e0ad0820e85", null ],
+    [ "ip_addr_set_ip4_u32", "group__ip4addr.html#ga971516589980428bf51f37cefa4ddf66", null ],
+    [ "ip_addr_set_ip4_u32_val", "group__ip4addr.html#ga624b5010ccc04cc3d0de2acce44f1c9e", null ],
+    [ "IP_IS_V4", "group__ip4addr.html#gabee5dab2191bb0f3355d7f30d1496f24", null ],
+    [ "IP_IS_V4_VAL", "group__ip4addr.html#gab1a059f07bd9c50aa58447d963b823a1", null ],
+    [ "IPADDR4_INIT", "group__ip4addr.html#ga1eaffd17b4b3c56cc91a6d516e18118f", null ],
+    [ "IPADDR4_INIT_BYTES", "group__ip4addr.html#ga55cc3896c46564bd2941ee5806fe1e11", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__ip6.html b/doc/doxygen/output/html/group__ip6.html
new file mode 100644
index 0000000..2ddbb60
--- /dev/null
+++ b/doc/doxygen/output/html/group__ip6.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: IPv6</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__ip6.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">IPv6<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__dhcp6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp6.html">DHCPv6</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__mld6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mld6.html">MLD6</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__ip6__zones"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html">IPv6 Zones</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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga540ad82e2af4c4709f1852e63c36706a"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6.html#ga540ad82e2af4c4709f1852e63c36706a">ip6_select_source_address</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest)</td></tr>
+<tr class="separator:ga540ad82e2af4c4709f1852e63c36706a"><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="ga540ad82e2af4c4709f1852e63c36706a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga540ad82e2af4c4709f1852e63c36706a">&#9670;&nbsp;</a></span>ip6_select_source_address()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>* ip6_select_source_address </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Select the best IPv6 source address for a given destination IPv6 address.</p>
+<p>This implementation follows RFC 6724 Sec. 5 to the following extent:</p><ul>
+<li>Rules 1, 2, 3: fully implemented</li>
+<li>Rules 4, 5, 5.5: not applicable</li>
+<li>Rule 6: not implemented</li>
+<li>Rule 7: not applicable</li>
+<li>Rule 8: limited to "prefer /64 subnet match over non-match"</li>
+</ul>
+<p>For Rule 2, we deliberately deviate from RFC 6724 Sec. 3.1 by considering ULAs to be of smaller scope than global addresses, to avoid that a preferred ULA is picked over a deprecated global address when given a global address as destination, as that would likely result in broken two-way communication.</p>
+<p>As long as temporary addresses are not supported (as used in Rule 7), a proper implementation of Rule 8 would obviate the need to implement Rule 6.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the netif on which to send a packet </td></tr>
+    <tr><td class="paramname">dest</td><td>the destination we are trying to reach (possibly not properly zoned) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the most suitable source address to use, or NULL if no suitable source address is found </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__ip6.js b/doc/doxygen/output/html/group__ip6.js
new file mode 100644
index 0000000..ed8865c
--- /dev/null
+++ b/doc/doxygen/output/html/group__ip6.js
@@ -0,0 +1,7 @@
+var group__ip6 =
+[
+    [ "DHCPv6", "group__dhcp6.html", "group__dhcp6" ],
+    [ "MLD6", "group__mld6.html", "group__mld6" ],
+    [ "IPv6 Zones", "group__ip6__zones.html", "group__ip6__zones" ],
+    [ "ip6_select_source_address", "group__ip6.html#ga540ad82e2af4c4709f1852e63c36706a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__ip6__zones.html b/doc/doxygen/output/html/group__ip6__zones.html
new file mode 100644
index 0000000..5914091
--- /dev/null
+++ b/doc/doxygen/output/html/group__ip6__zones.html
@@ -0,0 +1,583 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: IPv6 Zones</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__ip6__zones.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#enum-members">Enumerations</a>  </div>
+  <div class="headertitle">
+<div class="title">IPv6 Zones<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__ip6.html">IPv6</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga2049167d1715b9a9cf2730e122c0d4fb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb">IP6_NO_ZONE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga2049167d1715b9a9cf2730e122c0d4fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa090e54f632c8512a7991307e011c1b9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9">IPADDR6_ZONE_INIT</a>&#160;&#160;&#160;, <a class="el" href="group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb">IP6_NO_ZONE</a></td></tr>
+<tr class="separator:gaa090e54f632c8512a7991307e011c1b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaee83e12649fa9706857c9ad8f9ef8634"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634">ip6_addr_zone</a>(ip6addr)&#160;&#160;&#160;((ip6addr)-&gt;zone)</td></tr>
+<tr class="separator:gaee83e12649fa9706857c9ad8f9ef8634"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8727c081b6a80992881d481d0680db78"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78">ip6_addr_has_zone</a>(ip6addr)&#160;&#160;&#160;(<a class="el" href="group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634">ip6_addr_zone</a>(ip6addr) != <a class="el" href="group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb">IP6_NO_ZONE</a>)</td></tr>
+<tr class="separator:ga8727c081b6a80992881d481d0680db78"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga213310b303dd050da7856d67da72abd6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#ga213310b303dd050da7856d67da72abd6">ip6_addr_set_zone</a>(ip6addr,  zone_idx)&#160;&#160;&#160;((ip6addr)-&gt;zone = (zone_idx))</td></tr>
+<tr class="separator:ga213310b303dd050da7856d67da72abd6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae0249db6cd2687f2dbc445e7778d37ad"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gae0249db6cd2687f2dbc445e7778d37ad">ip6_addr_clear_zone</a>(ip6addr)&#160;&#160;&#160;((ip6addr)-&gt;zone = <a class="el" href="group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb">IP6_NO_ZONE</a>)</td></tr>
+<tr class="separator:gae0249db6cd2687f2dbc445e7778d37ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7347729485d837bcff85ae4731bbf5c4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#ga7347729485d837bcff85ae4731bbf5c4">ip6_addr_copy_zone</a>(ip6addr1,  ip6addr2)&#160;&#160;&#160;((ip6addr1).zone = (ip6addr2).zone)</td></tr>
+<tr class="separator:ga7347729485d837bcff85ae4731bbf5c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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)&#160;&#160;&#160;((ip6addr)-&gt;zone == (zone_idx))</td></tr>
+<tr class="separator:gaeead8379cc3fd4c257be0bb654994a8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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)&#160;&#160;&#160;((ip6addr1)-&gt;zone == (ip6addr2)-&gt;zone)</td></tr>
+<tr class="separator:gacbb8e1a7505d9772181defa0e75b8da9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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>
+<tr class="separator:gaa5332bb3b70c1a9acba1bea3ea0ecb90"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1040a3d67498a1ef617bda8d9e0ba3a5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#ga1040a3d67498a1ef617bda8d9e0ba3a5">ip6_addr_assign_zone</a>(ip6addr,  type,  <a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga1040a3d67498a1ef617bda8d9e0ba3a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac3ec5f94e1cd62b1237efca3723dc06e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gac3ec5f94e1cd62b1237efca3723dc06e">ip6_addr_test_zone</a>(ip6addr,  <a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;(<a class="el" href="group__ip6__zones.html#gaeead8379cc3fd4c257be0bb654994a8f">ip6_addr_equals_zone</a>((ip6addr), netif_get_index(<a class="el" href="structnetif.html">netif</a>)))</td></tr>
+<tr class="separator:gac3ec5f94e1cd62b1237efca3723dc06e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad963bf3e9695ba898271e314975f5c97"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gad963bf3e9695ba898271e314975f5c97">ip6_addr_lacks_zone</a>(ip6addr,  type)&#160;&#160;&#160;(!<a class="el" href="group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78">ip6_addr_has_zone</a>(ip6addr) &amp;&amp; <a class="el" href="group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90">ip6_addr_has_scope</a>((ip6addr), (type)))</td></tr>
+<tr class="separator:gad963bf3e9695ba898271e314975f5c97"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac83f3e7c8d65d3c784bffc9dec29b70c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gac83f3e7c8d65d3c784bffc9dec29b70c">ip6_addr_select_zone</a>(dest,  src)</td></tr>
+<tr class="separator:gac83f3e7c8d65d3c784bffc9dec29b70c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga1993c4b6a297b6e92d80a9ce46ddedfe"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#ga1993c4b6a297b6e92d80a9ce46ddedfe">lwip_ipv6_scope_type</a> { <a class="el" href="group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8">IP6_UNKNOWN</a> = 0, 
+<a class="el" href="group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0">IP6_UNICAST</a> = 1, 
+<a class="el" href="group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfea70cda997b66f3e120e925c5a41904809">IP6_MULTICAST</a> = 2
+ }</td></tr>
+<tr class="separator:ga1993c4b6a297b6e92d80a9ce46ddedfe"><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="ga1040a3d67498a1ef617bda8d9e0ba3a5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1040a3d67498a1ef617bda8d9e0ba3a5">&#9670;&nbsp;</a></span>ip6_addr_assign_zone</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_assign_zone</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">type, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(<a class="code" href="group__ip6__zones.html#ga213310b303dd050da7856d67da72abd6">ip6_addr_set_zone</a>((ip6addr), \</div><div class="line">      <a class="code" href="group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90">ip6_addr_has_scope</a>((ip6addr), (type)) ? netif_get_index(<a class="code" href="structnetif.html">netif</a>) : 0))</div><div class="ttc" id="group__ip6__zones_html_gaa5332bb3b70c1a9acba1bea3ea0ecb90"><div class="ttname"><a href="group__ip6__zones.html#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="group__ip6__zones_html_ga213310b303dd050da7856d67da72abd6"><div class="ttname"><a href="group__ip6__zones.html#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="structnetif_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>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>
+  <table class="params">
+    <tr><td class="paramname">ip6addr</td><td>the IPv6 address; its address part is examined, and its zone index is assigned. </td></tr>
+    <tr><td class="paramname">type</td><td>address type; see <a class="el" href="group__ip6__zones.html#ga1993c4b6a297b6e92d80a9ce46ddedfe">lwip_ipv6_scope_type</a>. </td></tr>
+    <tr><td class="paramname">netif</td><td>the network interface (const). </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gae0249db6cd2687f2dbc445e7778d37ad"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae0249db6cd2687f2dbc445e7778d37ad">&#9670;&nbsp;</a></span>ip6_addr_clear_zone</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_clear_zone</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr</td><td>)</td>
+          <td>&#160;&#160;&#160;((ip6addr)-&gt;zone = <a class="el" href="group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb">IP6_NO_ZONE</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Clear the zone field of an IPv6 address, setting it to "no zone". </p>
+
+</div>
+</div>
+<a id="gacbb8e1a7505d9772181defa0e75b8da9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacbb8e1a7505d9772181defa0e75b8da9">&#9670;&nbsp;</a></span>ip6_addr_cmp_zone</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_cmp_zone</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr2&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((ip6addr1)-&gt;zone == (ip6addr2)-&gt;zone)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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="ga7347729485d837bcff85ae4731bbf5c4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7347729485d837bcff85ae4731bbf5c4">&#9670;&nbsp;</a></span>ip6_addr_copy_zone</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_copy_zone</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr2&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((ip6addr1).zone = (ip6addr2).zone)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Copy the zone field from the second IPv6 address to the first one. </p>
+
+</div>
+</div>
+<a id="gaeead8379cc3fd4c257be0bb654994a8f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaeead8379cc3fd4c257be0bb654994a8f">&#9670;&nbsp;</a></span>ip6_addr_equals_zone</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_equals_zone</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">zone_idx&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((ip6addr)-&gt;zone == (zone_idx))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Is the zone field of the given IPv6 address equal to the given zone index? (0/1) </p>
+
+</div>
+</div>
+<a id="gaa5332bb3b70c1a9acba1bea3ea0ecb90"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa5332bb3b70c1a9acba1bea3ea0ecb90">&#9670;&nbsp;</a></span>ip6_addr_has_scope</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_has_scope</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">type&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(ip6_addr_islinklocal(ip6addr) || (((type) != <a class="code" href="group__ip6__zones.html#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="group__ip6__zones_html_gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0"><div class="ttname"><a href="group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0">IP6_UNICAST</a></div><div class="ttdef"><b>Definition:</b> ip6_zone.h:141</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>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ip6addr</td><td>the IPv6 address (const); only its address part is examined. </td></tr>
+    <tr><td class="paramname">type</td><td>address type; see <a class="el" href="group__ip6__zones.html#ga1993c4b6a297b6e92d80a9ce46ddedfe">lwip_ipv6_scope_type</a>. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if the address has a constrained scope, 0 if it does not. </dd></dl>
+
+</div>
+</div>
+<a id="ga8727c081b6a80992881d481d0680db78"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8727c081b6a80992881d481d0680db78">&#9670;&nbsp;</a></span>ip6_addr_has_zone</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_has_zone</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr</td><td>)</td>
+          <td>&#160;&#160;&#160;(<a class="el" href="group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634">ip6_addr_zone</a>(ip6addr) != <a class="el" href="group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb">IP6_NO_ZONE</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Does the given IPv6 address have a zone set? (0/1) </p>
+
+</div>
+</div>
+<a id="gad963bf3e9695ba898271e314975f5c97"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad963bf3e9695ba898271e314975f5c97">&#9670;&nbsp;</a></span>ip6_addr_lacks_zone</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_lacks_zone</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">type&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;(!<a class="el" href="group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78">ip6_addr_has_zone</a>(ip6addr) &amp;&amp; <a class="el" href="group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90">ip6_addr_has_scope</a>((ip6addr), (type)))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Does the given IPv6 address have a scope, and as such should also have a zone to be meaningful, but does not actually have a zone? (0/1) </p>
+
+</div>
+</div>
+<a id="gac83f3e7c8d65d3c784bffc9dec29b70c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac83f3e7c8d65d3c784bffc9dec29b70c">&#9670;&nbsp;</a></span>ip6_addr_select_zone</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_select_zone</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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> { <span class="keyword">struct </span><a class="code" href="structnetif.html">netif</a> *selected_netif; \</div><div class="line">  selected_netif = <a class="code" href="ip6_8c.html#a1153bd9e8c45847282105ab6379e6e70">ip6_route</a>((src), (dest)); \</div><div class="line">  if (selected_netif != NULL) { \</div><div class="line">    ip6_addr_assign_zone((dest), <a class="code" href="group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8">IP6_UNKNOWN</a>, selected_netif); \</div><div class="line">  } } <span class="keywordflow">while</span> (0)</div><div class="ttc" id="structnetif_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="ip6_8c_html_a1153bd9e8c45847282105ab6379e6e70"><div class="ttname"><a href="ip6_8c.html#a1153bd9e8c45847282105ab6379e6e70">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 class="ttc" id="group__ip6__zones_html_gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8"><div class="ttname"><a href="group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8">IP6_UNKNOWN</a></div><div class="ttdef"><b>Definition:</b> ip6_zone.h:139</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>
+<p>It may be impossible to select a zone, e.g. if there are no netifs. In that case, the address's zone field will be left as is.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">dest</td><td>the IPv6 address for which to select and set a zone. </td></tr>
+    <tr><td class="paramname">src</td><td>source IPv6 address (const); may be equal to dest. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga213310b303dd050da7856d67da72abd6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga213310b303dd050da7856d67da72abd6">&#9670;&nbsp;</a></span>ip6_addr_set_zone</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_set_zone</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">zone_idx&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((ip6addr)-&gt;zone = (zone_idx))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the zone field of an IPv6 address to a particular value. </p>
+
+</div>
+</div>
+<a id="gac3ec5f94e1cd62b1237efca3723dc06e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac3ec5f94e1cd62b1237efca3723dc06e">&#9670;&nbsp;</a></span>ip6_addr_test_zone</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_test_zone</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;(<a class="el" href="group__ip6__zones.html#gaeead8379cc3fd4c257be0bb654994a8f">ip6_addr_equals_zone</a>((ip6addr), netif_get_index(<a class="el" href="structnetif.html">netif</a>)))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Test whether an IPv6 address is "zone-compatible" with a network interface. That is, test whether the network interface is part of the zone associated with the address. For efficiency, this macro is only ever called if the given address is either scoped or zoned, and thus, it need not test this. If an address is scoped but not zoned, or zoned and not scoped, it is considered not zone-compatible with any netif.</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, there is always only one matching netif for a specific zone index, but all call sites of this macro currently support multiple matching netifs as well (at no additional expense in the common case).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ip6addr</td><td>the IPv6 address (const). </td></tr>
+    <tr><td class="paramname">netif</td><td>the network interface (const). </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if the address is scope-compatible with the netif, 0 if not. </dd></dl>
+
+</div>
+</div>
+<a id="gaee83e12649fa9706857c9ad8f9ef8634"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaee83e12649fa9706857c9ad8f9ef8634">&#9670;&nbsp;</a></span>ip6_addr_zone</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_zone</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr</td><td>)</td>
+          <td>&#160;&#160;&#160;((ip6addr)-&gt;zone)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return the zone index of the given IPv6 address; possibly "no zone". </p>
+
+</div>
+</div>
+<a id="ga2049167d1715b9a9cf2730e122c0d4fb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2049167d1715b9a9cf2730e122c0d4fb">&#9670;&nbsp;</a></span>IP6_NO_ZONE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP6_NO_ZONE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Identifier for "no zone". </p>
+
+</div>
+</div>
+<a id="gaa090e54f632c8512a7991307e011c1b9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa090e54f632c8512a7991307e011c1b9">&#9670;&nbsp;</a></span>IPADDR6_ZONE_INIT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IPADDR6_ZONE_INIT&#160;&#160;&#160;, <a class="el" href="group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb">IP6_NO_ZONE</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Zone initializer for static IPv6 address initialization, including comma. </p>
+
+</div>
+</div>
+<a id="gae677a65970f4b667156b256dd9a4924b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae677a65970f4b667156b256dd9a4924b">&#9670;&nbsp;</a></span>IPV6_CUSTOM_SCOPES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IPV6_CUSTOM_SCOPES&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IPV6_CUSTOM_SCOPES: together, the following three macro definitions, <a class="el" href="group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90">ip6_addr_has_scope</a>, <a class="el" href="group__ip6__zones.html#ga1040a3d67498a1ef617bda8d9e0ba3a5">ip6_addr_assign_zone</a>, and <a class="el" href="group__ip6__zones.html#gac3ec5f94e1cd62b1237efca3723dc06e">ip6_addr_test_zone</a>, completely define the lwIP scoping policy. The definitions below implement the default policy from RFC 4007 Sec. 6. Should an implementation desire to implement a different policy, it can define IPV6_CUSTOM_SCOPES to 1 and supply its own definitions for the three macros instead. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="ga1993c4b6a297b6e92d80a9ce46ddedfe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1993c4b6a297b6e92d80a9ce46ddedfe">&#9670;&nbsp;</a></span>lwip_ipv6_scope_type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__ip6__zones.html#ga1993c4b6a297b6e92d80a9ce46ddedfe">lwip_ipv6_scope_type</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Symbolic constants for the 'type' parameters in some of the macros. These exist for efficiency only, allowing the macros to avoid certain tests when the address is known not to be of a certain type. Dead code elimination will do the rest. IP6_MULTICAST is supported but currently not optimized. </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90">ip6_addr_has_scope</a>, <a class="el" href="group__ip6__zones.html#ga1040a3d67498a1ef617bda8d9e0ba3a5">ip6_addr_assign_zone</a>, <a class="el" href="group__ip6__zones.html#gad963bf3e9695ba898271e314975f5c97">ip6_addr_lacks_zone</a>. </dd></dl>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8"></a>IP6_UNKNOWN&#160;</td><td class="fielddoc"><p>Unknown </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0"></a>IP6_UNICAST&#160;</td><td class="fielddoc"><p>Unicast </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga1993c4b6a297b6e92d80a9ce46ddedfea70cda997b66f3e120e925c5a41904809"></a>IP6_MULTICAST&#160;</td><td class="fielddoc"><p>Multicast </p>
+</td></tr>
+</table>
+
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__ip6__zones.js b/doc/doxygen/output/html/group__ip6__zones.js
new file mode 100644
index 0000000..025056a
--- /dev/null
+++ b/doc/doxygen/output/html/group__ip6__zones.js
@@ -0,0 +1,23 @@
+var group__ip6__zones =
+[
+    [ "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_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 ],
+    [ "ip6_addr_has_zone", "group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78", null ],
+    [ "ip6_addr_lacks_zone", "group__ip6__zones.html#gad963bf3e9695ba898271e314975f5c97", null ],
+    [ "ip6_addr_select_zone", "group__ip6__zones.html#gac83f3e7c8d65d3c784bffc9dec29b70c", null ],
+    [ "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_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 ],
+    [ "lwip_ipv6_scope_type", "group__ip6__zones.html#ga1993c4b6a297b6e92d80a9ce46ddedfe", [
+      [ "IP6_UNKNOWN", "group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8", null ],
+      [ "IP6_UNICAST", "group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0", null ],
+      [ "IP6_MULTICAST", "group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfea70cda997b66f3e120e925c5a41904809", null ]
+    ] ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__ip6addr.html b/doc/doxygen/output/html/group__ip6addr.html
new file mode 100644
index 0000000..f703adb
--- /dev/null
+++ b/doc/doxygen/output/html/group__ip6addr.html
@@ -0,0 +1,471 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: IPv6 only</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__ip6addr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">IPv6 only<div class="ingroups"><a class="el" href="group__infrastructure.html">Infrastructure</a> &raquo; <a class="el" href="group__ipaddr.html">IP address handling</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga1266e500b1db0b7cdc4b269cace49746"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#ga1266e500b1db0b7cdc4b269cace49746">IPADDR6_INIT</a>(a,  b,  c,  d)&#160;&#160;&#160;{ { { { a, b, c, d } <a class="el" href="group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9">IPADDR6_ZONE_INIT</a> } }, <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a> }</td></tr>
+<tr class="separator:ga1266e500b1db0b7cdc4b269cace49746"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadaff748da2b808995993dd3db5420f08"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#gadaff748da2b808995993dd3db5420f08">IPADDR6_INIT_HOST</a>(a,  b,  c,  d)&#160;&#160;&#160;{ { { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } <a class="el" href="group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9">IPADDR6_ZONE_INIT</a> } }, <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a> }</td></tr>
+<tr class="separator:gadaff748da2b808995993dd3db5420f08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1578e34703e86711a7fb7dcc3857004d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d">IP_IS_V6_VAL</a>(ipaddr)&#160;&#160;&#160;(IP_GET_TYPE(&amp;ipaddr) == <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a>)</td></tr>
+<tr class="separator:ga1578e34703e86711a7fb7dcc3857004d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9bac7e938757f1d24df2404e8b57cb7d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(ipaddr)&#160;&#160;&#160;(((ipaddr) != NULL) &amp;&amp; <a class="el" href="group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d">IP_IS_V6_VAL</a>(*(ipaddr)))</td></tr>
+<tr class="separator:ga9bac7e938757f1d24df2404e8b57cb7d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga06e75bcd198012b5ba39480c233608bd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(ipaddr)&#160;&#160;&#160;(&amp;((ipaddr)-&gt;u_addr.ip6))</td></tr>
+<tr class="separator:ga06e75bcd198012b5ba39480c233608bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9ee53b601b89dcb517496ba0bccf9bd0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#ga9ee53b601b89dcb517496ba0bccf9bd0">IP_ADDR6</a>(ipaddr,  i0,  i1,  i2,  i3)</td></tr>
+<tr class="separator:ga9ee53b601b89dcb517496ba0bccf9bd0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabfb1ce44d6a8791336bf3ac06aa086ca"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#gabfb1ce44d6a8791336bf3ac06aa086ca">IP_ADDR6_HOST</a>(ipaddr,  i0,  i1,  i2,  i3)&#160;&#160;&#160;<a class="el" href="group__ip6addr.html#ga9ee53b601b89dcb517496ba0bccf9bd0">IP_ADDR6</a>(ipaddr,PP_HTONL(i0),PP_HTONL(i1),PP_HTONL(i2),PP_HTONL(i3))</td></tr>
+<tr class="separator:gabfb1ce44d6a8791336bf3ac06aa086ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabe6f7908ce8a91dc587e2ebc2172e651"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#gabe6f7908ce8a91dc587e2ebc2172e651">ip_addr_copy_from_ip6</a>(dest,  src)</td></tr>
+<tr class="separator:gabe6f7908ce8a91dc587e2ebc2172e651"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga130ca0907497831677c130dbb3289e1e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#ga130ca0907497831677c130dbb3289e1e">ip_addr_copy_from_ip6_packed</a>(dest,  src)</td></tr>
+<tr class="separator:ga130ca0907497831677c130dbb3289e1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafb3a0e5241683aff573e195f31ba8845"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#gafb3a0e5241683aff573e195f31ba8845">ip_addr_set_zero_ip6</a>(ipaddr)</td></tr>
+<tr class="separator:gafb3a0e5241683aff573e195f31ba8845"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5181d2cb6b9254eb5ad4137f7b3635a0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#ga5181d2cb6b9254eb5ad4137f7b3635a0">IP6_ADDR_ANY</a>&#160;&#160;&#160;(&amp;ip6_addr_any)</td></tr>
+<tr class="separator:ga5181d2cb6b9254eb5ad4137f7b3635a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga5181d2cb6b9254eb5ad4137f7b3635a0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5181d2cb6b9254eb5ad4137f7b3635a0">&#9670;&nbsp;</a></span>IP6_ADDR_ANY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP6_ADDR_ANY&#160;&#160;&#160;(&amp;ip6_addr_any)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IP6_ADDR_ANY can be used as a fixed ip_addr_t for the IPv6 wildcard address </p>
+
+</div>
+</div>
+<a id="ga953cdd2592764ba2e6e021aea350ad43"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga953cdd2592764ba2e6e021aea350ad43">&#9670;&nbsp;</a></span>IP6_ADDR_ANY6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP6_ADDR_ANY6&#160;&#160;&#160;(<a class="el" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(&amp;ip6_addr_any))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IP6_ADDR_ANY6 can be used as a fixed ip6_addr_t for the IPv6 wildcard address </p>
+
+</div>
+</div>
+<a id="ga06e75bcd198012b5ba39480c233608bd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga06e75bcd198012b5ba39480c233608bd">&#9670;&nbsp;</a></span>ip_2_ip6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_2_ip6</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td>&#160;&#160;&#160;(&amp;((ipaddr)-&gt;u_addr.ip6))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert generic ip address to specific protocol version </p>
+
+</div>
+</div>
+<a id="ga9ee53b601b89dcb517496ba0bccf9bd0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9ee53b601b89dcb517496ba0bccf9bd0">&#9670;&nbsp;</a></span>IP_ADDR6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_ADDR6</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">i0, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">i1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">i2, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">i3&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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" href="ip6__addr_8h.html#a30c92254d6abe631de6a5accfd491bc3">IP6_ADDR</a>(<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(ipaddr),i0,i1,i2,i3); \</div><div class="line">                                           IP_SET_TYPE_VAL(*(ipaddr), <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a>); } <span class="keywordflow">while</span>(0)</div><div class="ttc" id="ip6__addr_8h_html_a30c92254d6abe631de6a5accfd491bc3"><div class="ttname"><a href="ip6__addr_8h.html#a30c92254d6abe631de6a5accfd491bc3">IP6_ADDR</a></div><div class="ttdeci">#define IP6_ADDR(ip6addr, idx0, idx1, idx2, idx3)</div><div class="ttdef"><b>Definition:</b> ip6_addr.h:75</div></div>
+<div class="ttc" id="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:58</div></div>
+<div class="ttc" id="group__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 -->
+</div>
+</div>
+<a id="gabfb1ce44d6a8791336bf3ac06aa086ca"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabfb1ce44d6a8791336bf3ac06aa086ca">&#9670;&nbsp;</a></span>IP_ADDR6_HOST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_ADDR6_HOST</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">i0, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">i1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">i2, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">i3&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="group__ip6addr.html#ga9ee53b601b89dcb517496ba0bccf9bd0">IP_ADDR6</a>(ipaddr,PP_HTONL(i0),PP_HTONL(i1),PP_HTONL(i2),PP_HTONL(i3))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gabe6f7908ce8a91dc587e2ebc2172e651"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabe6f7908ce8a91dc587e2ebc2172e651">&#9670;&nbsp;</a></span>ip_addr_copy_from_ip6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_copy_from_ip6</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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>{ \</div><div class="line">  ip6_addr_copy(*<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(&amp;(dest)), src); IP_SET_TYPE_VAL(dest, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a>); }<span class="keywordflow">while</span>(0)</div><div class="ttc" id="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:58</div></div>
+<div class="ttc" id="group__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 -->
+</div>
+</div>
+<a id="ga130ca0907497831677c130dbb3289e1e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga130ca0907497831677c130dbb3289e1e">&#9670;&nbsp;</a></span>ip_addr_copy_from_ip6_packed</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_copy_from_ip6_packed</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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>{ \</div><div class="line">  ip6_addr_copy_from_packed(*<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(&amp;(dest)), src); IP_SET_TYPE_VAL(dest, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a>); }<span class="keywordflow">while</span>(0)</div><div class="ttc" id="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:58</div></div>
+<div class="ttc" id="group__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 -->
+</div>
+</div>
+<a id="gafb3a0e5241683aff573e195f31ba8845"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafb3a0e5241683aff573e195f31ba8845">&#9670;&nbsp;</a></span>ip_addr_set_zero_ip6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_set_zero_ip6</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr</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>{ \</div><div class="line">  ip6_addr_set_zero(<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(ipaddr)); IP_SET_TYPE(ipaddr, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a>); }<span class="keywordflow">while</span>(0)</div><div class="ttc" id="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:58</div></div>
+<div class="ttc" id="group__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 -->
+</div>
+</div>
+<a id="ga9bac7e938757f1d24df2404e8b57cb7d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9bac7e938757f1d24df2404e8b57cb7d">&#9670;&nbsp;</a></span>IP_IS_V6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_IS_V6</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td>&#160;&#160;&#160;(((ipaddr) != NULL) &amp;&amp; <a class="el" href="group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d">IP_IS_V6_VAL</a>(*(ipaddr)))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga1578e34703e86711a7fb7dcc3857004d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1578e34703e86711a7fb7dcc3857004d">&#9670;&nbsp;</a></span>IP_IS_V6_VAL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_IS_V6_VAL</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td>&#160;&#160;&#160;(IP_GET_TYPE(&amp;ipaddr) == <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga1266e500b1db0b7cdc4b269cace49746"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1266e500b1db0b7cdc4b269cace49746">&#9670;&nbsp;</a></span>IPADDR6_INIT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IPADDR6_INIT</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">a, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">b, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">d&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;{ { { { a, b, c, d } <a class="el" href="group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9">IPADDR6_ZONE_INIT</a> } }, <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a> }</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gadaff748da2b808995993dd3db5420f08"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadaff748da2b808995993dd3db5420f08">&#9670;&nbsp;</a></span>IPADDR6_INIT_HOST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IPADDR6_INIT_HOST</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">a, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">b, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">d&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;{ { { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } <a class="el" href="group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9">IPADDR6_ZONE_INIT</a> } }, <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a> }</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__ip6addr.js b/doc/doxygen/output/html/group__ip6addr.js
new file mode 100644
index 0000000..5c0226f
--- /dev/null
+++ b/doc/doxygen/output/html/group__ip6addr.js
@@ -0,0 +1,15 @@
+var group__ip6addr =
+[
+    [ "IP6_ADDR_ANY", "group__ip6addr.html#ga5181d2cb6b9254eb5ad4137f7b3635a0", null ],
+    [ "IP6_ADDR_ANY6", "group__ip6addr.html#ga953cdd2592764ba2e6e021aea350ad43", null ],
+    [ "ip_2_ip6", "group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd", null ],
+    [ "IP_ADDR6", "group__ip6addr.html#ga9ee53b601b89dcb517496ba0bccf9bd0", null ],
+    [ "IP_ADDR6_HOST", "group__ip6addr.html#gabfb1ce44d6a8791336bf3ac06aa086ca", null ],
+    [ "ip_addr_copy_from_ip6", "group__ip6addr.html#gabe6f7908ce8a91dc587e2ebc2172e651", null ],
+    [ "ip_addr_copy_from_ip6_packed", "group__ip6addr.html#ga130ca0907497831677c130dbb3289e1e", null ],
+    [ "ip_addr_set_zero_ip6", "group__ip6addr.html#gafb3a0e5241683aff573e195f31ba8845", null ],
+    [ "IP_IS_V6", "group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d", null ],
+    [ "IP_IS_V6_VAL", "group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d", null ],
+    [ "IPADDR6_INIT", "group__ip6addr.html#ga1266e500b1db0b7cdc4b269cace49746", null ],
+    [ "IPADDR6_INIT_HOST", "group__ip6addr.html#gadaff748da2b808995993dd3db5420f08", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__ipaddr.html b/doc/doxygen/output/html/group__ipaddr.html
new file mode 100644
index 0000000..fd8759c
--- /dev/null
+++ b/doc/doxygen/output/html/group__ipaddr.html
@@ -0,0 +1,1004 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: IP address handling</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__ipaddr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</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>
+  <div class="headertitle">
+<div class="title">IP address handling<div class="ingroups"><a class="el" href="group__infrastructure.html">Infrastructure</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__ip4addr"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html">IPv4 only</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__ip6addr"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html">IPv6 only</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 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="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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga83b17dbf7d1faf5c8f8c20b039db8bb8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga83b17dbf7d1faf5c8f8c20b039db8bb8">IP_IS_ANY_TYPE_VAL</a>(ipaddr)&#160;&#160;&#160;(IP_GET_TYPE(&amp;ipaddr) == <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e">IPADDR_TYPE_ANY</a>)</td></tr>
+<tr class="separator:ga83b17dbf7d1faf5c8f8c20b039db8bb8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga23b580930c0eb1d0fdeba2b109c077a5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga23b580930c0eb1d0fdeba2b109c077a5">IPADDR_ANY_TYPE_INIT</a>&#160;&#160;&#160;{ { { { 0ul, 0ul, 0ul, 0ul } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_ANY }</td></tr>
+<tr class="separator:ga23b580930c0eb1d0fdeba2b109c077a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga77a933975db287f6aa5c2e70249ba18f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga77a933975db287f6aa5c2e70249ba18f">ip_addr_copy</a>(dest,  src)</td></tr>
+<tr class="separator:ga77a933975db287f6aa5c2e70249ba18f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga40db7feae2b92f7a7a01d65a85b06e18"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga40db7feae2b92f7a7a01d65a85b06e18">ip_addr_set</a>(dest,  src)</td></tr>
+<tr class="separator:ga40db7feae2b92f7a7a01d65a85b06e18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaea5e4795598bc33fa2db1773c8e6fbac"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gaea5e4795598bc33fa2db1773c8e6fbac">ip_addr_set_ipaddr</a>(dest,  src)&#160;&#160;&#160;<a class="el" href="group__ipaddr.html#ga40db7feae2b92f7a7a01d65a85b06e18">ip_addr_set</a>(dest, src)</td></tr>
+<tr class="separator:gaea5e4795598bc33fa2db1773c8e6fbac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaae7edb585c062ae03bfbd3af7bf671bc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gaae7edb585c062ae03bfbd3af7bf671bc">ip_addr_set_zero</a>(ipaddr)</td></tr>
+<tr class="separator:gaae7edb585c062ae03bfbd3af7bf671bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8853fce54b1816dca3af90b48677e673"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga8853fce54b1816dca3af90b48677e673">ip_addr_set_any</a>(is_ipv6,  ipaddr)</td></tr>
+<tr class="separator:ga8853fce54b1816dca3af90b48677e673"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga93c7bf3f7487495472aa0f9b5fc25d1a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga93c7bf3f7487495472aa0f9b5fc25d1a">ip_addr_set_any_val</a>(is_ipv6,  ipaddr)</td></tr>
+<tr class="separator:ga93c7bf3f7487495472aa0f9b5fc25d1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8f9d56ac85cd87338a1823e4a58ba1da"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga8f9d56ac85cd87338a1823e4a58ba1da">ip_addr_set_loopback</a>(is_ipv6,  ipaddr)</td></tr>
+<tr class="separator:ga8f9d56ac85cd87338a1823e4a58ba1da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac1c5f897bbee217771b1a6ba18733042"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gac1c5f897bbee217771b1a6ba18733042">ip_addr_set_loopback_val</a>(is_ipv6,  ipaddr)</td></tr>
+<tr class="separator:gac1c5f897bbee217771b1a6ba18733042"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3528798be1d2f1ec6a6bccd35694edce"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga3528798be1d2f1ec6a6bccd35694edce">ip_addr_set_hton</a>(dest,  src)</td></tr>
+<tr class="separator:ga3528798be1d2f1ec6a6bccd35694edce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab5c5540ea05227bdd9207a47304bb2c1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gab5c5540ea05227bdd9207a47304bb2c1">ip_addr_get_network</a>(target,  host,  netmask)</td></tr>
+<tr class="separator:gab5c5540ea05227bdd9207a47304bb2c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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: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: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"><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"><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"><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"><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"><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:ga8619278bcbf705844f584f36972fc758"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga8619278bcbf705844f584f36972fc758">IPADDR_STRLEN_MAX</a>&#160;&#160;&#160;IP6ADDR_STRLEN_MAX</td></tr>
+<tr class="separator:ga8619278bcbf705844f584f36972fc758"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae5f26df8f5099f330ad1e506c74f06f7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gae5f26df8f5099f330ad1e506c74f06f7">ip4_2_ipv4_mapped_ipv6</a>(ip6addr,  ip4addr)</td></tr>
+<tr class="separator:gae5f26df8f5099f330ad1e506c74f06f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga66b5a64b12128e3716bcf04ff91b5a57"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga66b5a64b12128e3716bcf04ff91b5a57">unmap_ipv4_mapped_ipv6</a>(ip4addr,  ip6addr)&#160;&#160;&#160;(ip4addr)-&gt;addr = (ip6addr)-&gt;addr[3];</td></tr>
+<tr class="separator:ga66b5a64b12128e3716bcf04ff91b5a57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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 name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga16ef96d6cde029029bbf47fee35fd67a"><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="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a></td></tr>
+<tr class="separator:ga16ef96d6cde029029bbf47fee35fd67a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:gaf2142f0dfdcc938e2db16aa745ed585c"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">lwip_ip_addr_type</a> { <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a> = 0U, 
+<a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a> = 6U, 
+<a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e">IPADDR_TYPE_ANY</a> = 46U
+ }</td></tr>
+<tr class="separator:gaf2142f0dfdcc938e2db16aa745ed585c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gace12d28aef35bb15962e8563aea571b1"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1">ipaddr_ntoa</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr)</td></tr>
+<tr class="separator:gace12d28aef35bb15962e8563aea571b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3684dabc0cae597ffb5b51d41f1d886f"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga3684dabc0cae597ffb5b51d41f1d886f">ipaddr_ntoa_r</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, char *buf, int buflen)</td></tr>
+<tr class="separator:ga3684dabc0cae597ffb5b51d41f1d886f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4de70fdd7fd36c5b6eaed8b855d5f151"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151">ipaddr_aton</a> (const char *cp, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr)</td></tr>
+<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="gae5f26df8f5099f330ad1e506c74f06f7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae5f26df8f5099f330ad1e506c74f06f7">&#9670;&nbsp;</a></span>ip4_2_ipv4_mapped_ipv6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip4_2_ipv4_mapped_ipv6</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip4addr&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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> { \</div><div class="line">  (ip6addr)-&gt;addr[3] = (ip4addr)-&gt;addr; \</div><div class="line">  (ip6addr)-&gt;addr[2] = PP_HTONL(0x0000FFFFUL); \</div><div class="line">  (ip6addr)-&gt;addr[1] = 0; \</div><div class="line">  (ip6addr)-&gt;addr[0] = 0; \</div><div class="line">  ip6_addr_clear_zone(ip6addr); } <span class="keywordflow">while</span>(0);</div></div><!-- fragment -->
+</div>
+</div>
+<a id="ga008c9c92d770cc030ea054e6b259835a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga008c9c92d770cc030ea054e6b259835a">&#9670;&nbsp;</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">&#160;</td>
+          <td class="paramname">addr1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addr2&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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 : (<a class="code" href="group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d">IP_IS_V6_VAL</a>(*(addr1)) ? \</div><div class="line">  ip6_addr_cmp(<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(addr1), <a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(addr2)) : \</div><div class="line">  ip4_addr_cmp(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(addr1), <a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(addr2))))</div><div class="ttc" id="group__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="group__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="group__ip6addr_html_ga1578e34703e86711a7fb7dcc3857004d"><div class="ttname"><a href="group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d">IP_IS_V6_VAL</a></div><div class="ttdeci">#define IP_IS_V6_VAL(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:98</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="gadb66f6d5fa926ed4b0e69db58dffcbe4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadb66f6d5fa926ed4b0e69db58dffcbe4">&#9670;&nbsp;</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">&#160;</td>
+          <td class="paramname">addr1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addr2&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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 : (<a class="code" href="group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d">IP_IS_V6_VAL</a>(*(addr1)) ? \</div><div class="line">  ip6_addr_cmp_zoneless(<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(addr1), <a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(addr2)) : \</div><div class="line">  ip4_addr_cmp(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(addr1), <a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(addr2))))</div><div class="ttc" id="group__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="group__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="group__ip6addr_html_ga1578e34703e86711a7fb7dcc3857004d"><div class="ttname"><a href="group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d">IP_IS_V6_VAL</a></div><div class="ttdeci">#define IP_IS_V6_VAL(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:98</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="ga77a933975db287f6aa5c2e70249ba18f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga77a933975db287f6aa5c2e70249ba18f">&#9670;&nbsp;</a></span>ip_addr_copy</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_copy</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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>{ IP_SET_TYPE_VAL(dest, IP_GET_TYPE(&amp;src)); <span class="keywordflow">if</span>(<a class="code" href="group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d">IP_IS_V6_VAL</a>(src)){ \</div><div class="line">  ip6_addr_copy(*<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(&amp;(dest)), *<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(&amp;(src))); }<span class="keywordflow">else</span>{ \</div><div class="line">  ip4_addr_copy(*<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;(dest)), *<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;(src))); ip_clear_no4(&amp;dest); }}<span class="keywordflow">while</span>(0)</div><div class="ttc" id="group__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="group__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="group__ip6addr_html_ga1578e34703e86711a7fb7dcc3857004d"><div class="ttname"><a href="group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d">IP_IS_V6_VAL</a></div><div class="ttdeci">#define IP_IS_V6_VAL(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:98</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="gab5c5540ea05227bdd9207a47304bb2c1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab5c5540ea05227bdd9207a47304bb2c1">&#9670;&nbsp;</a></span>ip_addr_get_network</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_get_network</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">target, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">host, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">netmask&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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>{<span class="keywordflow">if</span>(<a class="code" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(host)){ \</div><div class="line">  ip4_addr_set_zero(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(target)); IP_SET_TYPE(target, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a>); } <span class="keywordflow">else</span> { \</div><div class="line">  ip4_addr_get_network(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(target), <a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(host), <a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(netmask)); IP_SET_TYPE(target, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a>); }}<span class="keywordflow">while</span>(0)</div><div class="ttc" id="group__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="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:58</div></div>
+<div class="ttc" id="group__ip6addr_html_ga9bac7e938757f1d24df2404e8b57cb7d"><div class="ttname"><a href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a></div><div class="ttdeci">#define IP_IS_V6(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:102</div></div>
+<div class="ttc" id="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:56</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="ga279118890e6a90aa740051fb8b0cc5f4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga279118890e6a90aa740051fb8b0cc5f4">&#9670;&nbsp;</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">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(((ipaddr) == NULL) ? 1 : ((<a class="code" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(ipaddr)) ? \</div><div class="line">  ip6_addr_isany(<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(ipaddr)) : \</div><div class="line">  ip4_addr_isany(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(ipaddr))))</div><div class="ttc" id="group__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="group__ip6addr_html_ga9bac7e938757f1d24df2404e8b57cb7d"><div class="ttname"><a href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a></div><div class="ttdeci">#define IP_IS_V6(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:102</div></div>
+<div class="ttc" id="group__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 -->
+</div>
+</div>
+<a id="gacd8f5aa151cff966fd28368b85f38c05"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacd8f5aa151cff966fd28368b85f38c05">&#9670;&nbsp;</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">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">((<a class="code" href="group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d">IP_IS_V6_VAL</a>(ipaddr)) ? \</div><div class="line">  ip6_addr_isany_val(*<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(&amp;(ipaddr))) : \</div><div class="line">  ip4_addr_isany_val(*<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;(ipaddr))))</div><div class="ttc" id="group__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="group__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="group__ip6addr_html_ga1578e34703e86711a7fb7dcc3857004d"><div class="ttname"><a href="group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d">IP_IS_V6_VAL</a></div><div class="ttdeci">#define IP_IS_V6_VAL(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:98</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="gaa3345706e3aa8b32dd630c195b053e75"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa3345706e3aa8b32dd630c195b053e75">&#9670;&nbsp;</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">&#160;</td>
+          <td class="paramname">ipaddr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">((<a class="code" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(ipaddr)) ? \</div><div class="line">  0 : \</div><div class="line">  ip4_addr_isbroadcast(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(ipaddr), <a class="code" href="structnetif.html">netif</a>))</div><div class="ttc" id="group__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="group__ip6addr_html_ga9bac7e938757f1d24df2404e8b57cb7d"><div class="ttname"><a href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a></div><div class="ttdeci">#define IP_IS_V6(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:102</div></div>
+<div class="ttc" id="structnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition:</b> netif.h:260</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="ga33bc079baaf513a9a7381b9531a1f653"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga33bc079baaf513a9a7381b9531a1f653">&#9670;&nbsp;</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">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">((<a class="code" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(ipaddr)) ? \</div><div class="line">  ip6_addr_islinklocal(<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(ipaddr)) : \</div><div class="line">  ip4_addr_islinklocal(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(ipaddr)))</div><div class="ttc" id="group__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="group__ip6addr_html_ga9bac7e938757f1d24df2404e8b57cb7d"><div class="ttname"><a href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a></div><div class="ttdeci">#define IP_IS_V6(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:102</div></div>
+<div class="ttc" id="group__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 -->
+</div>
+</div>
+<a id="ga0fc8bf6662809274750868683b3a422e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0fc8bf6662809274750868683b3a422e">&#9670;&nbsp;</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">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">((<a class="code" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(ipaddr)) ? \</div><div class="line">  ip6_addr_isloopback(<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(ipaddr)) : \</div><div class="line">  <a class="code" href="ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051">ip4_addr_isloopback</a>(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(ipaddr)))</div><div class="ttc" id="ip4__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 class="ttc" id="group__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="group__ip6addr_html_ga9bac7e938757f1d24df2404e8b57cb7d"><div class="ttname"><a href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a></div><div class="ttdeci">#define IP_IS_V6(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:102</div></div>
+<div class="ttc" id="group__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 -->
+</div>
+</div>
+<a id="ga2170d3ee13dd22722222228e7b1c5752"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2170d3ee13dd22722222228e7b1c5752">&#9670;&nbsp;</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">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">((<a class="code" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(ipaddr)) ? \</div><div class="line">  ip6_addr_ismulticast(<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(ipaddr)) : \</div><div class="line">  ip4_addr_ismulticast(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(ipaddr)))</div><div class="ttc" id="group__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="group__ip6addr_html_ga9bac7e938757f1d24df2404e8b57cb7d"><div class="ttname"><a href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a></div><div class="ttdeci">#define IP_IS_V6(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:102</div></div>
+<div class="ttc" id="group__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 -->
+</div>
+</div>
+<a id="ga3a2123f0bbf6fe843c8542e349c680eb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3a2123f0bbf6fe843c8542e349c680eb">&#9670;&nbsp;</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">&#160;</td>
+          <td class="paramname">addr1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addr2, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">mask&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">((<a class="code" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(addr1) &amp;&amp; <a class="code" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(addr2)) ? \</div><div class="line">  0 : \</div><div class="line">  <a class="code" href="ip4__addr_8h.html#afd43f6ceb2df8d50c84509ad1059f514">ip4_addr_netcmp</a>(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(addr1), <a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(addr2), mask))</div><div class="ttc" id="group__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="group__ip6addr_html_ga9bac7e938757f1d24df2404e8b57cb7d"><div class="ttname"><a href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a></div><div class="ttdeci">#define IP_IS_V6(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:102</div></div>
+<div class="ttc" id="ip4__addr_8h_html_afd43f6ceb2df8d50c84509ad1059f514"><div class="ttname"><a href="ip4__addr_8h.html#afd43f6ceb2df8d50c84509ad1059f514">ip4_addr_netcmp</a></div><div class="ttdeci">#define ip4_addr_netcmp(addr1, addr2, mask)</div><div class="ttdef"><b>Definition:</b> ip4_addr.h:141</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a id="ga40db7feae2b92f7a7a01d65a85b06e18"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga40db7feae2b92f7a7a01d65a85b06e18">&#9670;&nbsp;</a></span>ip_addr_set</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_set</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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>{ IP_SET_TYPE(dest, IP_GET_TYPE(src)); <span class="keywordflow">if</span>(<a class="code" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(src)){ \</div><div class="line">  ip6_addr_set(<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(dest), <a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(src)); }<span class="keywordflow">else</span>{ \</div><div class="line">  ip4_addr_set(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(dest), <a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(src)); ip_clear_no4(dest); }}<span class="keywordflow">while</span>(0)</div><div class="ttc" id="group__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="group__ip6addr_html_ga9bac7e938757f1d24df2404e8b57cb7d"><div class="ttname"><a href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a></div><div class="ttdeci">#define IP_IS_V6(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:102</div></div>
+<div class="ttc" id="group__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 -->
+</div>
+</div>
+<a id="ga8853fce54b1816dca3af90b48677e673"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8853fce54b1816dca3af90b48677e673">&#9670;&nbsp;</a></span>ip_addr_set_any</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_set_any</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">is_ipv6, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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>{<span class="keywordflow">if</span>(is_ipv6){ \</div><div class="line">  ip6_addr_set_any(<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(ipaddr)); IP_SET_TYPE(ipaddr, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a>); }<span class="keywordflow">else</span>{ \</div><div class="line">  ip4_addr_set_any(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(ipaddr)); IP_SET_TYPE(ipaddr, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a>); ip_clear_no4(ipaddr); }}<span class="keywordflow">while</span>(0)</div><div class="ttc" id="group__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="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:58</div></div>
+<div class="ttc" id="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:56</div></div>
+<div class="ttc" id="group__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 -->
+</div>
+</div>
+<a id="ga93c7bf3f7487495472aa0f9b5fc25d1a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga93c7bf3f7487495472aa0f9b5fc25d1a">&#9670;&nbsp;</a></span>ip_addr_set_any_val</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_set_any_val</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">is_ipv6, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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>{<span class="keywordflow">if</span>(is_ipv6){ \</div><div class="line">  ip6_addr_set_any(<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(&amp;(ipaddr))); IP_SET_TYPE_VAL(ipaddr, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a>); }<span class="keywordflow">else</span>{ \</div><div class="line">  ip4_addr_set_any(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;(ipaddr))); IP_SET_TYPE_VAL(ipaddr, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a>); ip_clear_no4(&amp;ipaddr); }}<span class="keywordflow">while</span>(0)</div><div class="ttc" id="group__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="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:58</div></div>
+<div class="ttc" id="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:56</div></div>
+<div class="ttc" id="group__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 -->
+</div>
+</div>
+<a id="ga3528798be1d2f1ec6a6bccd35694edce"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3528798be1d2f1ec6a6bccd35694edce">&#9670;&nbsp;</a></span>ip_addr_set_hton</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_set_hton</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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>{<span class="keywordflow">if</span>(<a class="code" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(src)){ \</div><div class="line">  ip6_addr_set_hton(<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(dest), <a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(src)); IP_SET_TYPE(dest, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a>); }<span class="keywordflow">else</span>{ \</div><div class="line">  ip4_addr_set_hton(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(dest), <a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(src)); IP_SET_TYPE(dest, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a>); ip_clear_no4(ipaddr); }}<span class="keywordflow">while</span>(0)</div><div class="ttc" id="group__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="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:58</div></div>
+<div class="ttc" id="group__ip6addr_html_ga9bac7e938757f1d24df2404e8b57cb7d"><div class="ttname"><a href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a></div><div class="ttdeci">#define IP_IS_V6(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:102</div></div>
+<div class="ttc" id="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:56</div></div>
+<div class="ttc" id="group__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 -->
+</div>
+</div>
+<a id="gaea5e4795598bc33fa2db1773c8e6fbac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaea5e4795598bc33fa2db1773c8e6fbac">&#9670;&nbsp;</a></span>ip_addr_set_ipaddr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_set_ipaddr</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="group__ipaddr.html#ga40db7feae2b92f7a7a01d65a85b06e18">ip_addr_set</a>(dest, src)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga8f9d56ac85cd87338a1823e4a58ba1da"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8f9d56ac85cd87338a1823e4a58ba1da">&#9670;&nbsp;</a></span>ip_addr_set_loopback</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_set_loopback</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">is_ipv6, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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>{<span class="keywordflow">if</span>(is_ipv6){ \</div><div class="line">  ip6_addr_set_loopback(<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(ipaddr)); IP_SET_TYPE(ipaddr, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a>); }<span class="keywordflow">else</span>{ \</div><div class="line">  ip4_addr_set_loopback(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(ipaddr)); IP_SET_TYPE(ipaddr, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a>); ip_clear_no4(ipaddr); }}<span class="keywordflow">while</span>(0)</div><div class="ttc" id="group__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="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:58</div></div>
+<div class="ttc" id="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:56</div></div>
+<div class="ttc" id="group__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 -->
+</div>
+</div>
+<a id="gac1c5f897bbee217771b1a6ba18733042"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac1c5f897bbee217771b1a6ba18733042">&#9670;&nbsp;</a></span>ip_addr_set_loopback_val</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_set_loopback_val</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">is_ipv6, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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>{<span class="keywordflow">if</span>(is_ipv6){ \</div><div class="line">  ip6_addr_set_loopback(<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(&amp;(ipaddr))); IP_SET_TYPE_VAL(ipaddr, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a>); }<span class="keywordflow">else</span>{ \</div><div class="line">  ip4_addr_set_loopback(<a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;(ipaddr))); IP_SET_TYPE_VAL(ipaddr, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a>); ip_clear_no4(&amp;ipaddr); }}<span class="keywordflow">while</span>(0)</div><div class="ttc" id="group__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="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:58</div></div>
+<div class="ttc" id="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:56</div></div>
+<div class="ttc" id="group__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 -->
+</div>
+</div>
+<a id="gaae7edb585c062ae03bfbd3af7bf671bc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaae7edb585c062ae03bfbd3af7bf671bc">&#9670;&nbsp;</a></span>ip_addr_set_zero</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_set_zero</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr</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>{ \</div><div class="line">  ip6_addr_set_zero(<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(ipaddr)); IP_SET_TYPE(ipaddr, 0); }<span class="keywordflow">while</span>(0)</div><div class="ttc" id="group__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 -->
+</div>
+</div>
+<a id="gabe43b154533b73585c4e58f568370ede"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabe43b154533b73585c4e58f568370ede">&#9670;&nbsp;</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">
+
+</div>
+</div>
+<a id="ga83b17dbf7d1faf5c8f8c20b039db8bb8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga83b17dbf7d1faf5c8f8c20b039db8bb8">&#9670;&nbsp;</a></span>IP_IS_ANY_TYPE_VAL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_IS_ANY_TYPE_VAL</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td>&#160;&#160;&#160;(IP_GET_TYPE(&amp;ipaddr) == <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e">IPADDR_TYPE_ANY</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga23b580930c0eb1d0fdeba2b109c077a5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga23b580930c0eb1d0fdeba2b109c077a5">&#9670;&nbsp;</a></span>IPADDR_ANY_TYPE_INIT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IPADDR_ANY_TYPE_INIT&#160;&#160;&#160;{ { { { 0ul, 0ul, 0ul, 0ul } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_ANY }</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga8619278bcbf705844f584f36972fc758"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8619278bcbf705844f584f36972fc758">&#9670;&nbsp;</a></span>IPADDR_STRLEN_MAX</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IPADDR_STRLEN_MAX&#160;&#160;&#160;IP6ADDR_STRLEN_MAX</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga66b5a64b12128e3716bcf04ff91b5a57"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga66b5a64b12128e3716bcf04ff91b5a57">&#9670;&nbsp;</a></span>unmap_ipv4_mapped_ipv6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define unmap_ipv4_mapped_ipv6</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip4addr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;(ip4addr)-&gt;addr = (ip6addr)-&gt;addr[3];</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="ga16ef96d6cde029029bbf47fee35fd67a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga16ef96d6cde029029bbf47fee35fd67a">&#9670;&nbsp;</a></span>ip_addr_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structip__addr.html">ip_addr</a>  <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A union struct for both IP version's addresses. ATTENTION: watch out for its size when adding IPv6 address scope! </p>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="gaf2142f0dfdcc938e2db16aa745ed585c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf2142f0dfdcc938e2db16aa745ed585c">&#9670;&nbsp;</a></span>lwip_ip_addr_type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">lwip_ip_addr_type</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IP address types for use in <a class="el" href="structip__addr.html#a66eaa8e9051e7102bf9f0c195fbe555a">ip_addr_t.type</a> member. </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937">tcp_new_ip_type()</a>, <a class="el" href="group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88">udp_new_ip_type()</a>, <a class="el" href="group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11">raw_new_ip_type()</a>. </dd></dl>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049"></a>IPADDR_TYPE_V4&#160;</td><td class="fielddoc"><p>IPv4 </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02"></a>IPADDR_TYPE_V6&#160;</td><td class="fielddoc"><p>IPv6 </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e"></a>IPADDR_TYPE_ANY&#160;</td><td class="fielddoc"><p>IPv4+IPv6 ("dual-stack") </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga4de70fdd7fd36c5b6eaed8b855d5f151"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4de70fdd7fd36c5b6eaed8b855d5f151">&#9670;&nbsp;</a></span>ipaddr_aton()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ipaddr_aton </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>cp</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert IP address string (both versions) to numeric. The version is auto-detected from the string.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">cp</td><td>IP address string to convert </td></tr>
+    <tr><td class="paramname">addr</td><td>conversion result is stored here </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 on success, 0 on error </dd></dl>
+
+</div>
+</div>
+<a id="gace12d28aef35bb15962e8563aea571b1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gace12d28aef35bb15962e8563aea571b1">&#9670;&nbsp;</a></span>ipaddr_ntoa()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* ipaddr_ntoa </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert numeric IP address (both versions) into ASCII representation. returns ptr to static buffer; not reentrant!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">addr</td><td>ip address in network order to convert </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to a global static (!) buffer that holds the ASCII representation of addr </dd></dl>
+
+</div>
+</div>
+<a id="ga3684dabc0cae597ffb5b51d41f1d886f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3684dabc0cae597ffb5b51d41f1d886f">&#9670;&nbsp;</a></span>ipaddr_ntoa_r()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* ipaddr_ntoa_r </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>buflen</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">addr</td><td>ip address in network order to convert </td></tr>
+    <tr><td class="paramname">buf</td><td>target buffer where the string is stored </td></tr>
+    <tr><td class="paramname">buflen</td><td>length of buf </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>either pointer to buf which now holds the ASCII representation of addr or NULL if buf was too small </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__ipaddr.js b/doc/doxygen/output/html/group__ipaddr.js
new file mode 100644
index 0000000..0e722c1
--- /dev/null
+++ b/doc/doxygen/output/html/group__ipaddr.js
@@ -0,0 +1,42 @@
+var group__ipaddr =
+[
+    [ "IPv4 only", "group__ip4addr.html", "group__ip4addr" ],
+    [ "IPv6 only", "group__ip6addr.html", "group__ip6addr" ],
+    [ "ip_addr", "structip__addr.html", [
+      [ "type", "structip__addr.html#a66eaa8e9051e7102bf9f0c195fbe555a", null ]
+    ] ],
+    [ "ip4_2_ipv4_mapped_ipv6", "group__ipaddr.html#gae5f26df8f5099f330ad1e506c74f06f7", null ],
+    [ "ip_addr_cmp", "group__ipaddr.html#ga008c9c92d770cc030ea054e6b259835a", null ],
+    [ "ip_addr_cmp_zoneless", "group__ipaddr.html#gadb66f6d5fa926ed4b0e69db58dffcbe4", null ],
+    [ "ip_addr_copy", "group__ipaddr.html#ga77a933975db287f6aa5c2e70249ba18f", null ],
+    [ "ip_addr_get_network", "group__ipaddr.html#gab5c5540ea05227bdd9207a47304bb2c1", 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_netcmp", "group__ipaddr.html#ga3a2123f0bbf6fe843c8542e349c680eb", null ],
+    [ "ip_addr_set", "group__ipaddr.html#ga40db7feae2b92f7a7a01d65a85b06e18", null ],
+    [ "ip_addr_set_any", "group__ipaddr.html#ga8853fce54b1816dca3af90b48677e673", null ],
+    [ "ip_addr_set_any_val", "group__ipaddr.html#ga93c7bf3f7487495472aa0f9b5fc25d1a", null ],
+    [ "ip_addr_set_hton", "group__ipaddr.html#ga3528798be1d2f1ec6a6bccd35694edce", null ],
+    [ "ip_addr_set_ipaddr", "group__ipaddr.html#gaea5e4795598bc33fa2db1773c8e6fbac", null ],
+    [ "ip_addr_set_loopback", "group__ipaddr.html#ga8f9d56ac85cd87338a1823e4a58ba1da", null ],
+    [ "ip_addr_set_loopback_val", "group__ipaddr.html#gac1c5f897bbee217771b1a6ba18733042", null ],
+    [ "ip_addr_set_zero", "group__ipaddr.html#gaae7edb585c062ae03bfbd3af7bf671bc", null ],
+    [ "IP_ANY_TYPE", "group__ipaddr.html#gabe43b154533b73585c4e58f568370ede", null ],
+    [ "IP_IS_ANY_TYPE_VAL", "group__ipaddr.html#ga83b17dbf7d1faf5c8f8c20b039db8bb8", null ],
+    [ "IPADDR_ANY_TYPE_INIT", "group__ipaddr.html#ga23b580930c0eb1d0fdeba2b109c077a5", null ],
+    [ "IPADDR_STRLEN_MAX", "group__ipaddr.html#ga8619278bcbf705844f584f36972fc758", null ],
+    [ "unmap_ipv4_mapped_ipv6", "group__ipaddr.html#ga66b5a64b12128e3716bcf04ff91b5a57", null ],
+    [ "ip_addr_t", "group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a", null ],
+    [ "lwip_ip_addr_type", "group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c", [
+      [ "IPADDR_TYPE_V4", "group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049", null ],
+      [ "IPADDR_TYPE_V6", "group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02", null ],
+      [ "IPADDR_TYPE_ANY", "group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e", null ]
+    ] ],
+    [ "ipaddr_aton", "group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151", null ],
+    [ "ipaddr_ntoa", "group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1", null ],
+    [ "ipaddr_ntoa_r", "group__ipaddr.html#ga3684dabc0cae597ffb5b51d41f1d886f", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__iperf.html b/doc/doxygen/output/html/group__iperf.html
new file mode 100644
index 0000000..4654cb6
--- /dev/null
+++ b/doc/doxygen/output/html/group__iperf.html
@@ -0,0 +1,293 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Iperf 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__iperf.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">Iperf server<div class="ingroups"><a class="el" href="group__apps.html">Applications</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gae1f30a02b86c4dd3d47810cd493baf26"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iperf.html#gae1f30a02b86c4dd3d47810cd493baf26">lwiperf_start_tcp_server_default</a> (<a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf_report_fn</a> report_fn, void *report_arg)</td></tr>
+<tr class="separator:gae1f30a02b86c4dd3d47810cd493baf26"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad97bf77057e7f96d6d8def812deea202"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iperf.html#gad97bf77057e7f96d6d8def812deea202">lwiperf_start_tcp_server</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *local_addr, u16_t local_port, <a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf_report_fn</a> report_fn, void *report_arg)</td></tr>
+<tr class="separator:gad97bf77057e7f96d6d8def812deea202"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga85a487cf8ecbd0999382c9bff375d0da"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iperf.html#ga85a487cf8ecbd0999382c9bff375d0da">lwiperf_start_tcp_client_default</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *remote_addr, <a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf_report_fn</a> report_fn, void *report_arg)</td></tr>
+<tr class="separator:ga85a487cf8ecbd0999382c9bff375d0da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad8317f52289d8bb12a14627cd177a565"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iperf.html#gad8317f52289d8bb12a14627cd177a565">lwiperf_start_tcp_client</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *remote_addr, u16_t remote_port, enum <a class="el" href="lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76c">lwiperf_client_type</a> type, <a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf_report_fn</a> report_fn, void *report_arg)</td></tr>
+<tr class="separator:gad8317f52289d8bb12a14627cd177a565"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac51c9c44a38bfa1140bd44b793a0a004"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004">lwiperf_abort</a> (void *lwiperf_session)</td></tr>
+<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>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gac51c9c44a38bfa1140bd44b793a0a004"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac51c9c44a38bfa1140bd44b793a0a004">&#9670;&nbsp;</a></span>lwiperf_abort()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwiperf_abort </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>lwiperf_session</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Abort an iperf session (handle returned by lwiperf_start_tcp_server*()) </p>
+
+</div>
+</div>
+<a id="gad8317f52289d8bb12a14627cd177a565"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad8317f52289d8bb12a14627cd177a565">&#9670;&nbsp;</a></span>lwiperf_start_tcp_client()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* lwiperf_start_tcp_client </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>remote_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>remote_port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum <a class="el" href="lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76c">lwiperf_client_type</a>&#160;</td>
+          <td class="paramname"><em>type</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf_report_fn</a>&#160;</td>
+          <td class="paramname"><em>report_fn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>report_arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Start a TCP iperf client to a specific IP address and port.</p>
+<dl class="section return"><dt>Returns</dt><dd>a connection handle that can be used to abort the client by calling <a class="el" href="group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004">lwiperf_abort()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga85a487cf8ecbd0999382c9bff375d0da"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga85a487cf8ecbd0999382c9bff375d0da">&#9670;&nbsp;</a></span>lwiperf_start_tcp_client_default()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* lwiperf_start_tcp_client_default </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>remote_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf_report_fn</a>&#160;</td>
+          <td class="paramname"><em>report_fn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>report_arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Start a TCP iperf client to the default TCP port (5001).</p>
+<dl class="section return"><dt>Returns</dt><dd>a connection handle that can be used to abort the client by calling <a class="el" href="group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004">lwiperf_abort()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gad97bf77057e7f96d6d8def812deea202"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad97bf77057e7f96d6d8def812deea202">&#9670;&nbsp;</a></span>lwiperf_start_tcp_server()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* lwiperf_start_tcp_server </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>local_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>local_port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf_report_fn</a>&#160;</td>
+          <td class="paramname"><em>report_fn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>report_arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Start a TCP iperf server on a specific IP address and port and listen for incoming connections from iperf clients.</p>
+<dl class="section return"><dt>Returns</dt><dd>a connection handle that can be used to abort the server by calling <a class="el" href="group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004">lwiperf_abort()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gae1f30a02b86c4dd3d47810cd493baf26"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae1f30a02b86c4dd3d47810cd493baf26">&#9670;&nbsp;</a></span>lwiperf_start_tcp_server_default()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* lwiperf_start_tcp_server_default </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf_report_fn</a>&#160;</td>
+          <td class="paramname"><em>report_fn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>report_arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Start a TCP iperf server on the default TCP port (5001) and listen for incoming connections from iperf clients.</p>
+<dl class="section return"><dt>Returns</dt><dd>a connection handle that can be used to abort the server by calling <a class="el" href="group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004">lwiperf_abort()</a> </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__iperf.js b/doc/doxygen/output/html/group__iperf.js
new file mode 100644
index 0000000..5d30a7e
--- /dev/null
+++ b/doc/doxygen/output/html/group__iperf.js
@@ -0,0 +1,8 @@
+var group__iperf =
+[
+    [ "lwiperf_abort", "group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004", null ],
+    [ "lwiperf_start_tcp_client", "group__iperf.html#gad8317f52289d8bb12a14627cd177a565", null ],
+    [ "lwiperf_start_tcp_client_default", "group__iperf.html#ga85a487cf8ecbd0999382c9bff375d0da", null ],
+    [ "lwiperf_start_tcp_server", "group__iperf.html#gad97bf77057e7f96d6d8def812deea202", null ],
+    [ "lwiperf_start_tcp_server_default", "group__iperf.html#gae1f30a02b86c4dd3d47810cd493baf26", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip.html b/doc/doxygen/output/html/group__lwip.html
new file mode 100644
index 0000000..430b3ba
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: lwIP</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">lwIP</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__lwip__nosys"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__nosys.html">Mainloop mode (&quot;NO_SYS&quot;)</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__os"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__os.html">OS mode (TCPIP thread)</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__sys__layer"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__layer.html">Porting (system abstraction layer)</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__version"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__version.html">Version</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts.html">Options (lwipopts.h)</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>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip.js b/doc/doxygen/output/html/group__lwip.js
new file mode 100644
index 0000000..e85c034
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip.js
@@ -0,0 +1,8 @@
+var group__lwip =
+[
+    [ "Mainloop mode (\"NO_SYS\")", "group__lwip__nosys.html", "group__lwip__nosys" ],
+    [ "OS mode (TCPIP thread)", "group__lwip__os.html", "group__lwip__os" ],
+    [ "Porting (system abstraction layer)", "group__sys__layer.html", "group__sys__layer" ],
+    [ "Version", "group__lwip__version.html", "group__lwip__version" ],
+    [ "Options (lwipopts.h)", "group__lwip__opts.html", "group__lwip__opts" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__assertions.html b/doc/doxygen/output/html/group__lwip__assertions.html
new file mode 100644
index 0000000..21bd29f
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__assertions.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Assertion handling</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__assertions.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Assertion handling<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__debug.html">Debugging</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga71b7787802abbfc2218fb1f39f948a41"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__assertions.html#ga71b7787802abbfc2218fb1f39f948a41">LWIP_NOASSERT</a></td></tr>
+<tr class="separator:ga71b7787802abbfc2218fb1f39f948a41"><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="ga71b7787802abbfc2218fb1f39f948a41"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga71b7787802abbfc2218fb1f39f948a41">&#9670;&nbsp;</a></span>LWIP_NOASSERT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NOASSERT</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NOASSERT: Disable LWIP_ASSERT checks: To disable assertions define LWIP_NOASSERT in arch/cc.h. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__assertions.js b/doc/doxygen/output/html/group__lwip__assertions.js
new file mode 100644
index 0000000..900b5ea
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__assertions.js
@@ -0,0 +1,4 @@
+var group__lwip__assertions =
+[
+    [ "LWIP_NOASSERT", "group__lwip__assertions.html#ga71b7787802abbfc2218fb1f39f948a41", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__nosys.html b/doc/doxygen/output/html/group__lwip__nosys.html
new file mode 100644
index 0000000..386f7c0
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__nosys.html
@@ -0,0 +1,261 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Mainloop mode (&quot;NO_SYS&quot;)</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__nosys.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">Mainloop mode ("NO_SYS")<div class="ingroups"><a class="el" href="group__lwip.html">lwIP</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga0c1a18439524d2f4a5e51d25c0ca2ce9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9">lwip_init</a> (void)</td></tr>
+<tr class="separator:ga0c1a18439524d2f4a5e51d25c0ca2ce9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3c420dab0c6760df099a2d688fa42a26"><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__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip_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:ga3c420dab0c6760df099a2d688fa42a26"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5532f93d68c874fb99c681bff2165385"><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__nosys.html#ga5532f93d68c874fb99c681bff2165385">netif_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:ga5532f93d68c874fb99c681bff2165385"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83cffdf69ab60fd0eba9d17d363f9883"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883">sys_check_timeouts</a> (void)</td></tr>
+<tr class="separator:ga83cffdf69ab60fd0eba9d17d363f9883"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6a10c58b82c56d02c48b3cfa2c2494ff"><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__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff">ethernet_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:ga6a10c58b82c56d02c48b3cfa2c2494ff"><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 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="group__lwip__nosys.html#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><div class="line">eth_mac_irq()</div><div class="line">{</div><div class="line">  <span class="comment">/* Service MAC IRQ here */</span></div><div class="line"></div><div class="line">  <span class="comment">/* Allocate pbuf from pool (avoid using heap in interrupts) */</span></div><div class="line">  <span class="keyword">struct </span><a class="code" href="structpbuf.html">pbuf</a>* p = <a class="code" href="group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47">pbuf_alloc</a>(<a class="code" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba">PBUF_RAW</a>, eth_data_count, <a class="code" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbae969347127387b9b59a23ccd24b76d21">PBUF_POOL</a>);</div><div class="line"></div><div class="line">  <span class="keywordflow">if</span>(p != NULL) {</div><div class="line">    <span class="comment">/* Copy ethernet frame into pbuf */</span></div><div class="line">    <a class="code" href="group__pbuf.html#gad1e31e370271335b197272af2724ca85">pbuf_take</a>(p, eth_data, eth_data_count);</div><div class="line"></div><div class="line">    <span class="comment">/* Put in a queue which is processed in main loop */</span></div><div class="line">    <span class="keywordflow">if</span>(!queue_try_put(&amp;queue, p)) {</div><div class="line">      <span class="comment">/* queue is full -&gt; packet loss */</span></div><div class="line">      <a class="code" href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf_free</a>(p);</div><div class="line">    }</div><div class="line">  }</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keyword">static</span> <a class="code" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> </div><div class="line">netif_output(<span class="keyword">struct</span> netif *netif, <span class="keyword">struct</span> <a class="code" href="structpbuf.html">pbuf</a> *p)</div><div class="line">{</div><div class="line">  LINK_STATS_INC(link.xmit);</div><div class="line"></div><div class="line">  <span class="comment">/* Update SNMP stats (only if you use SNMP) */</span></div><div class="line">  <a class="code" href="group__netif__mib2.html#ga05641438775014b7e13b9e55eba48bed">MIB2_STATS_NETIF_ADD</a>(netif, ifoutoctets, p-&gt;<a class="code" href="structpbuf.html#a5259e7ec29bab9c0999b64f2e86b411f">tot_len</a>);</div><div class="line">  <span class="keywordtype">int</span> unicast = ((p-&gt;<a class="code" href="structpbuf.html#a8d32dc3e964369d4eec638fc37fbc460">payload</a>[0] &amp; 0x01) == 0);</div><div class="line">  <span class="keywordflow">if</span> (unicast) {</div><div class="line">    <a class="code" href="group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f">MIB2_STATS_NETIF_INC</a>(netif, ifoutucastpkts);</div><div class="line">  } <span class="keywordflow">else</span> {</div><div class="line">    <a class="code" href="group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f">MIB2_STATS_NETIF_INC</a>(netif, ifoutnucastpkts);</div><div class="line">  }</div><div class="line"></div><div class="line">  lock_interrupts();</div><div class="line">  <a class="code" href="group__pbuf.html#gac2f1f58fd36042e82af46f5015720899">pbuf_copy_partial</a>(p, mac_send_buffer, p-&gt;<a class="code" href="structpbuf.html#a5259e7ec29bab9c0999b64f2e86b411f">tot_len</a>, 0);</div><div class="line">  <span class="comment">/* Start MAC transmit here */</span></div><div class="line">  unlock_interrupts();</div><div class="line"></div><div class="line">  <span class="keywordflow">return</span> <a class="code" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb">ERR_OK</a>;</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keyword">static</span> <span class="keywordtype">void</span> </div><div class="line">netif_status_callback(<span class="keyword">struct</span> netif *netif)</div><div class="line">{</div><div class="line">  printf(<span class="stringliteral">&quot;netif status changed %s\n&quot;</span>, <a class="code" href="ip4__addr_8c.html#a28620fdd443c5c98d15e5890cbd9059c">ip4addr_ntoa</a>(<a class="code" href="group__netif__ip4.html#gac9b6e63b5dd2968fe0a4813f3eefb55d">netif_ip4_addr</a>(netif)));</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keyword">static</span> <a class="code" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> </div><div class="line">netif_init(<span class="keyword">struct</span> netif *netif)</div><div class="line">{</div><div class="line">  netif-&gt;<a class="code" href="structnetif.html#acaaac9b415a7be73eb8a287c8ed18a8d">linkoutput</a> = netif_output;</div><div class="line">  netif-&gt;<a class="code" href="structnetif.html#a8e1dcfe65db487feecd244355f39215e">output</a>     = <a class="code" href="etharp_8c.html#a19258c75a3778b6ed0c82f63a419502d">etharp_output</a>;</div><div class="line">  netif-&gt;<a class="code" href="structnetif.html#ac38383379cff22c402156fec71c19617">output_ip6</a> = <a class="code" href="ethip6_8c.html#ab5326546d33174f91f1fb0cc6d398bfd">ethip6_output</a>;</div><div class="line">  netif-&gt;<a class="code" href="structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48">mtu</a>        = ETHERNET_MTU;</div><div class="line">  netif-&gt;<a class="code" href="structnetif.html#a1c171db6097bbb6f09f63549a66e00ea">flags</a>      = <a class="code" href="group__netif__flags.html#gaef64fe15c82bc7b235366923e517104e">NETIF_FLAG_BROADCAST</a> | <a class="code" href="group__netif__flags.html#ga92448dc510bc8d700c09e5c971ef0676">NETIF_FLAG_ETHARP</a> | <a class="code" href="group__netif__flags.html#ga76ad9d0cf9f029df0ab2a998c64040dc">NETIF_FLAG_ETHERNET</a> | <a class="code" href="group__netif__flags.html#gac9493b923d733c73f6006d9714826558">NETIF_FLAG_IGMP</a> | <a class="code" href="group__netif__flags.html#gab14fbe1447d2fdbdf5abc87f51eb6508">NETIF_FLAG_MLD6</a>;</div><div class="line">  <a class="code" href="group__netif__mib2.html#ga5be1b8cba1d67bf6e7f8851ec91b10f0">MIB2_INIT_NETIF</a>(netif, snmp_ifType_ethernet_csmacd, 100000000);</div><div class="line"></div><div class="line">  <a class="code" href="group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec">SMEMCPY</a>(netif-&gt;<a class="code" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">hwaddr</a>, your_mac_address_goes_here, ETH_HWADDR_LEN);</div><div class="line">  netif-&gt;<a class="code" href="structnetif.html#afe1181561cb16241f3cb5ed01e567d42">hwaddr_len</a> = ETH_HWADDR_LEN;</div><div class="line"></div><div class="line">  <span class="keywordflow">return</span> <a class="code" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb">ERR_OK</a>;</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keywordtype">void</span> </div><div class="line">main(<span class="keywordtype">void</span>)</div><div class="line">{</div><div class="line">  <span class="keyword">struct </span>netif netif;</div><div class="line"></div><div class="line">  <a class="code" href="group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9">lwip_init</a>();</div><div class="line"></div><div class="line">  <a class="code" href="group__netif.html#gade5498543e74067f28cc6bef0209e3be">netif_add</a>(&amp;netif, <a class="code" href="group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff">IP4_ADDR_ANY</a>, <a class="code" href="group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff">IP4_ADDR_ANY</a>, <a class="code" href="group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff">IP4_ADDR_ANY</a>, NULL, netif_init, <a class="code" href="group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385">netif_input</a>);</div><div class="line">  netif.<a class="code" href="structnetif.html#a32fca6ffd28bb9af3f891a378827a67e">name</a>[0] = <span class="charliteral">&#39;e&#39;</span>;</div><div class="line">  netif.<a class="code" href="structnetif.html#a32fca6ffd28bb9af3f891a378827a67e">name</a>[1] = <span class="charliteral">&#39;0&#39;</span>;</div><div class="line">  <a class="code" href="group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9">netif_create_ip6_linklocal_address</a>(&amp;netif, 1);</div><div class="line">  netif.<a class="code" href="structnetif.html#ad98bafb7733b40ef898e53d91fbfa20f">ip6_autoconfig_enabled</a> = 1;</div><div class="line">  <a class="code" href="group__netif.html#gadc8787b23ac0ee023979cbadf87813d4">netif_set_status_callback</a>(&amp;netif, netif_status_callback);</div><div class="line">  <a class="code" href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif_set_default</a>(&amp;netif);</div><div class="line">  <a class="code" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up</a>(&amp;netif);</div><div class="line">  </div><div class="line">  <span class="comment">/* Start DHCP and HTTPD */</span></div><div class="line">  <a class="code" href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp_start</a>(&amp;netif );</div><div class="line">  <a class="code" href="group__httpd.html#gac364305cee969a0be43c071722b136e6">httpd_init</a>();</div><div class="line"></div><div class="line">  <span class="keywordflow">while</span>(1) {</div><div class="line">    <span class="comment">/* Check link state, e.g. via MDIO communication with PHY */</span></div><div class="line">    <span class="keywordflow">if</span>(link_state_changed()) {</div><div class="line">      <span class="keywordflow">if</span>(link_is_up()) {</div><div class="line">        <a class="code" href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_link_up</a>(&amp;netif);</div><div class="line">      } <span class="keywordflow">else</span> {</div><div class="line">        <a class="code" href="group__netif.html#ga34e37a1e8e358760dc1c43887922c7db">netif_set_link_down</a>(&amp;netif);</div><div class="line">      }</div><div class="line">    }</div><div class="line"></div><div class="line">    <span class="comment">/* Check for received frames, feed them to lwIP */</span></div><div class="line">    lock_interrupts();</div><div class="line">    <span class="keyword">struct </span><a class="code" href="structpbuf.html">pbuf</a>* p = queue_try_get(&amp;queue);</div><div class="line">    unlock_interrupts();</div><div class="line"></div><div class="line">    <span class="keywordflow">if</span>(p != NULL) {</div><div class="line">      LINK_STATS_INC(link.recv);</div><div class="line"> </div><div class="line">      <span class="comment">/* Update SNMP stats (only if you use SNMP) */</span></div><div class="line">      <a class="code" href="group__netif__mib2.html#ga05641438775014b7e13b9e55eba48bed">MIB2_STATS_NETIF_ADD</a>(netif, ifinoctets, p-&gt;<a class="code" href="structpbuf.html#a5259e7ec29bab9c0999b64f2e86b411f">tot_len</a>);</div><div class="line">      <span class="keywordtype">int</span> unicast = ((p-&gt;<a class="code" href="structpbuf.html#a8d32dc3e964369d4eec638fc37fbc460">payload</a>[0] &amp; 0x01) == 0);</div><div class="line">      <span class="keywordflow">if</span> (unicast) {</div><div class="line">        <a class="code" href="group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f">MIB2_STATS_NETIF_INC</a>(netif, ifinucastpkts);</div><div class="line">      } <span class="keywordflow">else</span> {</div><div class="line">        <a class="code" href="group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f">MIB2_STATS_NETIF_INC</a>(netif, ifinnucastpkts);</div><div class="line">      }</div><div class="line"></div><div class="line">      <span class="keywordflow">if</span>(netif.<a class="code" href="structnetif.html#a8fe4f1b7b0d710216287da9615164a5c">input</a>(p, &amp;netif) != <a class="code" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb">ERR_OK</a>) {</div><div class="line">        <a class="code" href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf_free</a>(p);</div><div class="line">      }</div><div class="line">    }</div><div class="line">     </div><div class="line">    <span class="comment">/* Cyclic lwIP timers check */</span></div><div class="line">    <a class="code" href="group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883">sys_check_timeouts</a>();</div><div class="line">     </div><div class="line">    <span class="comment">/* your application goes here */</span></div><div class="line">  }</div><div class="line">}</div></div><!-- fragment --> <h2 class="groupheader">Function Documentation</h2>
+<a id="ga6a10c58b82c56d02c48b3cfa2c2494ff"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6a10c58b82c56d02c48b3cfa2c2494ff">&#9670;&nbsp;</a></span>ethernet_input()</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> ethernet_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </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#gade5498543e74067f28cc6bef0209e3be">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>
+    <tr><td class="paramname">netif</td><td>the network interface on which the packet was received</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__lwip__opts__hooks.html#ga6cc92f5101dd7a0420e18e1f2101abf4">LWIP_HOOK_UNKNOWN_ETH_PROTOCOL</a> </dd>
+<dd>
+<a class="el" href="group__lwip__opts__arp.html#ga70ce0ecf56cf5fab000134e66d863f90">ETHARP_SUPPORT_VLAN</a> </dd>
+<dd>
+<a class="el" href="group__lwip__opts__hooks.html#ga2f020543772368f8f4355f50f24c86a9">LWIP_HOOK_VLAN_CHECK</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga3c420dab0c6760df099a2d688fa42a26"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3c420dab0c6760df099a2d688fa42a26">&#9670;&nbsp;</a></span>ip_input()</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> ip_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If both IP versions are enabled, this function can dispatch packets to the correct one. Don't call directly, pass to <a class="el" href="group__netif.html#gade5498543e74067f28cc6bef0209e3be">netif_add()</a> and call netif-&gt;input(). </p>
+
+</div>
+</div>
+<a id="ga0c1a18439524d2f4a5e51d25c0ca2ce9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0c1a18439524d2f4a5e51d25c0ca2ce9">&#9670;&nbsp;</a></span>lwip_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize all modules. Use this in NO_SYS mode. Use <a class="el" href="group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db">tcpip_init()</a> otherwise. </p>
+
+</div>
+</div>
+<a id="ga5532f93d68c874fb99c681bff2165385"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5532f93d68c874fb99c681bff2165385">&#9670;&nbsp;</a></span>netif_input()</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> netif_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Forwards a received packet for input processing with <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> depending on netif flags. Don't call directly, pass to <a class="el" href="group__netif.html#gade5498543e74067f28cc6bef0209e3be">netif_add()</a> and call netif-&gt;input(). Only works if the netif driver correctly sets NETIF_FLAG_ETHARP and/or NETIF_FLAG_ETHERNET flag! </p>
+
+</div>
+</div>
+<a id="ga83cffdf69ab60fd0eba9d17d363f9883"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga83cffdf69ab60fd0eba9d17d363f9883">&#9670;&nbsp;</a></span>sys_check_timeouts()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_check_timeouts </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Handle timeouts for NO_SYS==1 (i.e. without using tcpip_thread/sys_timeouts_mbox_fetch(). Uses <a class="el" href="group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199">sys_now()</a> to call timeout handler functions when timeouts expire.</p>
+<p>Must be called periodically from your main loop. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__nosys.js b/doc/doxygen/output/html/group__lwip__nosys.js
new file mode 100644
index 0000000..361c675
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__nosys.js
@@ -0,0 +1,8 @@
+var group__lwip__nosys =
+[
+    [ "ethernet_input", "group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff", null ],
+    [ "ip_input", "group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26", null ],
+    [ "lwip_init", "group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9", null ],
+    [ "netif_input", "group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385", null ],
+    [ "sys_check_timeouts", "group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts.html b/doc/doxygen/output/html/group__lwip__opts.html
new file mode 100644
index 0000000..ede9c06
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Options (lwipopts.h)</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">Options (lwipopts.h)<div class="ingroups"><a class="el" href="group__lwip.html">lwIP</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__lwip__opts__debug"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debug.html">Debugging</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__infrastructure"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__infrastructure.html">Infrastructure</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__callback"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__callback.html">Callback-style APIs</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__threadsafe__apis"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__threadsafe__apis.html">Thread-safe APIs</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__ipv4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html">IPv4</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__pbuf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__pbuf.html">PBUF</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__netif"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html">NETIF</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__ipv6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html">IPv6</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>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts.js b/doc/doxygen/output/html/group__lwip__opts.js
new file mode 100644
index 0000000..4edcbdf
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts.js
@@ -0,0 +1,11 @@
+var group__lwip__opts =
+[
+    [ "Debugging", "group__lwip__opts__debug.html", "group__lwip__opts__debug" ],
+    [ "Infrastructure", "group__lwip__opts__infrastructure.html", "group__lwip__opts__infrastructure" ],
+    [ "Callback-style APIs", "group__lwip__opts__callback.html", "group__lwip__opts__callback" ],
+    [ "Thread-safe APIs", "group__lwip__opts__threadsafe__apis.html", "group__lwip__opts__threadsafe__apis" ],
+    [ "IPv4", "group__lwip__opts__ipv4.html", "group__lwip__opts__ipv4" ],
+    [ "PBUF", "group__lwip__opts__pbuf.html", "group__lwip__opts__pbuf" ],
+    [ "NETIF", "group__lwip__opts__netif.html", "group__lwip__opts__netif" ],
+    [ "IPv6", "group__lwip__opts__ipv6.html", "group__lwip__opts__ipv6" ]
+];
\ 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
new file mode 100644
index 0000000..e2f1e45
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__arp.html
@@ -0,0 +1,277 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__arp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">ARP<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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga9609a014bba4638cc191d6a8f9556c87"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">LWIP_ARP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga9609a014bba4638cc191d6a8f9556c87"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga924936a814564dbdb0bc950d255a83b9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga924936a814564dbdb0bc950d255a83b9">ARP_TABLE_SIZE</a>&#160;&#160;&#160;10</td></tr>
+<tr class="separator:ga924936a814564dbdb0bc950d255a83b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga741a0710dc126ed3ae9e305472df3432"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga741a0710dc126ed3ae9e305472df3432">ARP_MAXAGE</a>&#160;&#160;&#160;300</td></tr>
+<tr class="separator:ga741a0710dc126ed3ae9e305472df3432"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga75837814536af29b6102508588d0ab58"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga75837814536af29b6102508588d0ab58">ARP_QUEUEING</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga75837814536af29b6102508588d0ab58"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga29f41a6ebdbb23f46688d381b3609fd1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga29f41a6ebdbb23f46688d381b3609fd1">ARP_QUEUE_LEN</a>&#160;&#160;&#160;3</td></tr>
+<tr class="separator:ga29f41a6ebdbb23f46688d381b3609fd1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga70ce0ecf56cf5fab000134e66d863f90"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga70ce0ecf56cf5fab000134e66d863f90">ETHARP_SUPPORT_VLAN</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga70ce0ecf56cf5fab000134e66d863f90"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga30e02dc217cc2995d0fd241d510c904f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga30e02dc217cc2995d0fd241d510c904f">LWIP_ETHERNET</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">LWIP_ARP</a></td></tr>
+<tr class="separator:ga30e02dc217cc2995d0fd241d510c904f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad7fa3b356ca7e603e848b069c4cc6276"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#gad7fa3b356ca7e603e848b069c4cc6276">ETH_PAD_SIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gad7fa3b356ca7e603e848b069c4cc6276"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4675829464156f3d665f4de171c212d7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga4675829464156f3d665f4de171c212d7">ETHARP_SUPPORT_STATIC_ENTRIES</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga4675829464156f3d665f4de171c212d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2f762eee309a545650f80fc8dcc19084"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga2f762eee309a545650f80fc8dcc19084">ETHARP_TABLE_MATCH_NETIF</a>&#160;&#160;&#160;!<a class="el" href="group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be">LWIP_SINGLE_NETIF</a></td></tr>
+<tr class="separator:ga2f762eee309a545650f80fc8dcc19084"><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="ga741a0710dc126ed3ae9e305472df3432"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga741a0710dc126ed3ae9e305472df3432">&#9670;&nbsp;</a></span>ARP_MAXAGE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ARP_MAXAGE&#160;&#160;&#160;300</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>the time an ARP entry stays valid after its last update, for ARP_TMR_INTERVAL = 1000, this is (60 * 5) seconds = 5 minutes. </p>
+
+</div>
+</div>
+<a id="ga29f41a6ebdbb23f46688d381b3609fd1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga29f41a6ebdbb23f46688d381b3609fd1">&#9670;&nbsp;</a></span>ARP_QUEUE_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ARP_QUEUE_LEN&#160;&#160;&#160;3</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The maximum number of packets which may be queued for each unresolved address by other network layers. Defaults to 3, 0 means disabled. Old packets are dropped, new packets are queued. </p>
+
+</div>
+</div>
+<a id="ga75837814536af29b6102508588d0ab58"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga75837814536af29b6102508588d0ab58">&#9670;&nbsp;</a></span>ARP_QUEUEING</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ARP_QUEUEING&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ARP_QUEUEING==1: Multiple outgoing packets are queued during hardware address resolution. By default, only the most recent packet is queued per IP address. This is sufficient for most protocols and mainly reduces TCP connection startup time. Set this to 1 if you know your application sends more than one packet in a row to an IP address that is not in the ARP cache. </p>
+
+</div>
+</div>
+<a id="ga924936a814564dbdb0bc950d255a83b9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga924936a814564dbdb0bc950d255a83b9">&#9670;&nbsp;</a></span>ARP_TABLE_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ARP_TABLE_SIZE&#160;&#160;&#160;10</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ARP_TABLE_SIZE: Number of active MAC-IP address pairs cached. </p>
+
+</div>
+</div>
+<a id="gad7fa3b356ca7e603e848b069c4cc6276"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad7fa3b356ca7e603e848b069c4cc6276">&#9670;&nbsp;</a></span>ETH_PAD_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ETH_PAD_SIZE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ETH_PAD_SIZE: number of bytes added before the ethernet header to ensure alignment of payload after that header. Since the header is 14 bytes long, without this padding e.g. addresses in the IP header will not be aligned on a 32-bit boundary, so setting this to 2 can speed up 32-bit-platforms. </p>
+
+</div>
+</div>
+<a id="ga4675829464156f3d665f4de171c212d7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4675829464156f3d665f4de171c212d7">&#9670;&nbsp;</a></span>ETHARP_SUPPORT_STATIC_ENTRIES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ETHARP_SUPPORT_STATIC_ENTRIES&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ETHARP_SUPPORT_STATIC_ENTRIES==1: enable code to support static ARP table entries (using etharp_add_static_entry/etharp_remove_static_entry). </p>
+
+</div>
+</div>
+<a id="ga70ce0ecf56cf5fab000134e66d863f90"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga70ce0ecf56cf5fab000134e66d863f90">&#9670;&nbsp;</a></span>ETHARP_SUPPORT_VLAN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ETHARP_SUPPORT_VLAN&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ETHARP_SUPPORT_VLAN==1: support receiving and sending ethernet packets with VLAN header. See the description of LWIP_HOOK_VLAN_CHECK and LWIP_HOOK_VLAN_SET hooks to check/set VLAN headers. Additionally, you can define ETHARP_VLAN_CHECK to an u16_t VLAN ID to check. If ETHARP_VLAN_CHECK is defined, only VLAN-traffic for this VLAN is accepted. If ETHARP_VLAN_CHECK is not defined, all traffic is accepted. Alternatively, define a function/define ETHARP_VLAN_CHECK_FN(eth_hdr, vlan) that returns 1 to accept a packet or 0 to drop a packet. </p>
+
+</div>
+</div>
+<a id="ga2f762eee309a545650f80fc8dcc19084"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2f762eee309a545650f80fc8dcc19084">&#9670;&nbsp;</a></span>ETHARP_TABLE_MATCH_NETIF</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ETHARP_TABLE_MATCH_NETIF&#160;&#160;&#160;!<a class="el" href="group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be">LWIP_SINGLE_NETIF</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ETHARP_TABLE_MATCH_NETIF==1: Match netif for ARP table entries. If disabled, duplicate IP address on multiple netifs are not supported (but this should only occur for AutoIP). </p>
+
+</div>
+</div>
+<a id="ga9609a014bba4638cc191d6a8f9556c87"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9609a014bba4638cc191d6a8f9556c87">&#9670;&nbsp;</a></span>LWIP_ARP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ARP&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ARP==1: Enable ARP functionality. </p>
+
+</div>
+</div>
+<a id="ga30e02dc217cc2995d0fd241d510c904f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga30e02dc217cc2995d0fd241d510c904f">&#9670;&nbsp;</a></span>LWIP_ETHERNET</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ETHERNET&#160;&#160;&#160;<a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">LWIP_ARP</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ETHERNET==1: enable ethernet support even though ARP might be disabled </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__arp.js b/doc/doxygen/output/html/group__lwip__opts__arp.js
new file mode 100644
index 0000000..e3bee96
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__arp.js
@@ -0,0 +1,13 @@
+var group__lwip__opts__arp =
+[
+    [ "ARP_MAXAGE", "group__lwip__opts__arp.html#ga741a0710dc126ed3ae9e305472df3432", null ],
+    [ "ARP_QUEUE_LEN", "group__lwip__opts__arp.html#ga29f41a6ebdbb23f46688d381b3609fd1", null ],
+    [ "ARP_QUEUEING", "group__lwip__opts__arp.html#ga75837814536af29b6102508588d0ab58", null ],
+    [ "ARP_TABLE_SIZE", "group__lwip__opts__arp.html#ga924936a814564dbdb0bc950d255a83b9", null ],
+    [ "ETH_PAD_SIZE", "group__lwip__opts__arp.html#gad7fa3b356ca7e603e848b069c4cc6276", null ],
+    [ "ETHARP_SUPPORT_STATIC_ENTRIES", "group__lwip__opts__arp.html#ga4675829464156f3d665f4de171c212d7", null ],
+    [ "ETHARP_SUPPORT_VLAN", "group__lwip__opts__arp.html#ga70ce0ecf56cf5fab000134e66d863f90", null ],
+    [ "ETHARP_TABLE_MATCH_NETIF", "group__lwip__opts__arp.html#ga2f762eee309a545650f80fc8dcc19084", null ],
+    [ "LWIP_ARP", "group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87", null ],
+    [ "LWIP_ETHERNET", "group__lwip__opts__arp.html#ga30e02dc217cc2995d0fd241d510c904f", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__autoip.html b/doc/doxygen/output/html/group__lwip__opts__autoip.html
new file mode 100644
index 0000000..82370b4
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__autoip.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: AUTOIP</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__autoip.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">AUTOIP<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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem: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"><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"><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>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="gaaf1b3a089827223589baf1b7f4f57069"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaaf1b3a089827223589baf1b7f4f57069">&#9670;&nbsp;</a></span>LWIP_AUTOIP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_AUTOIP&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_AUTOIP==1: Enable AUTOIP module. </p>
+
+</div>
+</div>
+<a id="ga1a91e18dbb9777bc6e3963f52cb5f9fe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1a91e18dbb9777bc6e3963f52cb5f9fe">&#9670;&nbsp;</a></span>LWIP_DHCP_AUTOIP_COOP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DHCP_AUTOIP_COOP&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_DHCP_AUTOIP_COOP==1: Allow DHCP and AUTOIP to be both enabled on the same interface at the same time. </p>
+
+</div>
+</div>
+<a id="ga4ff3f941b4c71a04b0c30fbee5b198c2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4ff3f941b4c71a04b0c30fbee5b198c2">&#9670;&nbsp;</a></span>LWIP_DHCP_AUTOIP_COOP_TRIES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DHCP_AUTOIP_COOP_TRIES&#160;&#160;&#160;9</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_DHCP_AUTOIP_COOP_TRIES: Set to the number of DHCP DISCOVER probes that should be sent before falling back on AUTOIP (the DHCP client keeps running in this case). This can be set as low as 1 to get an AutoIP address very quickly, but you should be prepared to handle a changing IP address when DHCP overrides 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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__autoip.js b/doc/doxygen/output/html/group__lwip__opts__autoip.js
new file mode 100644
index 0000000..edddd96
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__autoip.js
@@ -0,0 +1,6 @@
+var group__lwip__opts__autoip =
+[
+    [ "LWIP_AUTOIP", "group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069", null ],
+    [ "LWIP_DHCP_AUTOIP_COOP", "group__lwip__opts__autoip.html#ga1a91e18dbb9777bc6e3963f52cb5f9fe", null ],
+    [ "LWIP_DHCP_AUTOIP_COOP_TRIES", "group__lwip__opts__autoip.html#ga4ff3f941b4c71a04b0c30fbee5b198c2", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__callback.html b/doc/doxygen/output/html/group__lwip__opts__callback.html
new file mode 100644
index 0000000..8628b8c
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__callback.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Callback-style APIs</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__callback.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">Callback-style APIs<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__lwip__opts__raw"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__raw.html">RAW</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__dns"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html">DNS</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__udp"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__udp.html">UDP</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__tcp"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html">TCP</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>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__callback.js b/doc/doxygen/output/html/group__lwip__opts__callback.js
new file mode 100644
index 0000000..2b5f560
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__callback.js
@@ -0,0 +1,7 @@
+var group__lwip__opts__callback =
+[
+    [ "RAW", "group__lwip__opts__raw.html", "group__lwip__opts__raw" ],
+    [ "DNS", "group__lwip__opts__dns.html", "group__lwip__opts__dns" ],
+    [ "UDP", "group__lwip__opts__udp.html", "group__lwip__opts__udp" ],
+    [ "TCP", "group__lwip__opts__tcp.html", "group__lwip__opts__tcp" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__checksum.html b/doc/doxygen/output/html/group__lwip__opts__checksum.html
new file mode 100644
index 0000000..c7a099e
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__checksum.html
@@ -0,0 +1,311 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Checksum</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__checksum.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Checksum<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__infrastructure.html">Infrastructure</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga3ecc5246a0c6ca5aed56c2d7899c1004"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga3ecc5246a0c6ca5aed56c2d7899c1004">LWIP_CHECKSUM_CTRL_PER_NETIF</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga3ecc5246a0c6ca5aed56c2d7899c1004"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8ddad81fc26268a13b35091781da2265"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga8ddad81fc26268a13b35091781da2265">CHECKSUM_GEN_IP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga8ddad81fc26268a13b35091781da2265"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga98d460f8c2baed8bf62d5473831c0b2c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga98d460f8c2baed8bf62d5473831c0b2c">CHECKSUM_GEN_UDP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga98d460f8c2baed8bf62d5473831c0b2c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga800069963cc4552b99235237c22f00bb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga800069963cc4552b99235237c22f00bb">CHECKSUM_GEN_TCP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga800069963cc4552b99235237c22f00bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2291ec5bec0a551545da6d5f9f9316b2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga2291ec5bec0a551545da6d5f9f9316b2">CHECKSUM_GEN_ICMP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga2291ec5bec0a551545da6d5f9f9316b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7cd47a55af03b1048c5a4a5fe0e76013"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga7cd47a55af03b1048c5a4a5fe0e76013">CHECKSUM_GEN_ICMP6</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga7cd47a55af03b1048c5a4a5fe0e76013"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga005b1b9988b84a2cb844144cef22c11e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga005b1b9988b84a2cb844144cef22c11e">CHECKSUM_CHECK_IP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga005b1b9988b84a2cb844144cef22c11e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6747f7b72abe544fd4dc184cc7fcad37"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga6747f7b72abe544fd4dc184cc7fcad37">CHECKSUM_CHECK_UDP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga6747f7b72abe544fd4dc184cc7fcad37"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab676cc29571b7ffda12336482ad97699"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#gab676cc29571b7ffda12336482ad97699">CHECKSUM_CHECK_TCP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gab676cc29571b7ffda12336482ad97699"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga79807171be8c20b69a5cd8de83566d25"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga79807171be8c20b69a5cd8de83566d25">CHECKSUM_CHECK_ICMP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga79807171be8c20b69a5cd8de83566d25"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf466a10b093489910a773fd1cec74c2d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#gaf466a10b093489910a773fd1cec74c2d">CHECKSUM_CHECK_ICMP6</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gaf466a10b093489910a773fd1cec74c2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9f60183f0442bdbeefd6b395c6647613"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga9f60183f0442bdbeefd6b395c6647613">LWIP_CHECKSUM_ON_COPY</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga9f60183f0442bdbeefd6b395c6647613"><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="ga79807171be8c20b69a5cd8de83566d25"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga79807171be8c20b69a5cd8de83566d25">&#9670;&nbsp;</a></span>CHECKSUM_CHECK_ICMP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define CHECKSUM_CHECK_ICMP&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>CHECKSUM_CHECK_ICMP==1: Check checksums in software for incoming ICMP packets. </p>
+
+</div>
+</div>
+<a id="gaf466a10b093489910a773fd1cec74c2d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf466a10b093489910a773fd1cec74c2d">&#9670;&nbsp;</a></span>CHECKSUM_CHECK_ICMP6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define CHECKSUM_CHECK_ICMP6&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>CHECKSUM_CHECK_ICMP6==1: Check checksums in software for incoming ICMPv6 packets </p>
+
+</div>
+</div>
+<a id="ga005b1b9988b84a2cb844144cef22c11e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga005b1b9988b84a2cb844144cef22c11e">&#9670;&nbsp;</a></span>CHECKSUM_CHECK_IP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define CHECKSUM_CHECK_IP&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets. </p>
+
+</div>
+</div>
+<a id="gab676cc29571b7ffda12336482ad97699"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab676cc29571b7ffda12336482ad97699">&#9670;&nbsp;</a></span>CHECKSUM_CHECK_TCP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define CHECKSUM_CHECK_TCP&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets. </p>
+
+</div>
+</div>
+<a id="ga6747f7b72abe544fd4dc184cc7fcad37"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6747f7b72abe544fd4dc184cc7fcad37">&#9670;&nbsp;</a></span>CHECKSUM_CHECK_UDP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define CHECKSUM_CHECK_UDP&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets. </p>
+
+</div>
+</div>
+<a id="ga2291ec5bec0a551545da6d5f9f9316b2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2291ec5bec0a551545da6d5f9f9316b2">&#9670;&nbsp;</a></span>CHECKSUM_GEN_ICMP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define CHECKSUM_GEN_ICMP&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>CHECKSUM_GEN_ICMP==1: Generate checksums in software for outgoing ICMP packets. </p>
+
+</div>
+</div>
+<a id="ga7cd47a55af03b1048c5a4a5fe0e76013"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7cd47a55af03b1048c5a4a5fe0e76013">&#9670;&nbsp;</a></span>CHECKSUM_GEN_ICMP6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define CHECKSUM_GEN_ICMP6&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>CHECKSUM_GEN_ICMP6==1: Generate checksums in software for outgoing ICMP6 packets. </p>
+
+</div>
+</div>
+<a id="ga8ddad81fc26268a13b35091781da2265"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8ddad81fc26268a13b35091781da2265">&#9670;&nbsp;</a></span>CHECKSUM_GEN_IP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define CHECKSUM_GEN_IP&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets. </p>
+
+</div>
+</div>
+<a id="ga800069963cc4552b99235237c22f00bb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga800069963cc4552b99235237c22f00bb">&#9670;&nbsp;</a></span>CHECKSUM_GEN_TCP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define CHECKSUM_GEN_TCP&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets. </p>
+
+</div>
+</div>
+<a id="ga98d460f8c2baed8bf62d5473831c0b2c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga98d460f8c2baed8bf62d5473831c0b2c">&#9670;&nbsp;</a></span>CHECKSUM_GEN_UDP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define CHECKSUM_GEN_UDP&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets. </p>
+
+</div>
+</div>
+<a id="ga3ecc5246a0c6ca5aed56c2d7899c1004"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3ecc5246a0c6ca5aed56c2d7899c1004">&#9670;&nbsp;</a></span>LWIP_CHECKSUM_CTRL_PER_NETIF</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_CHECKSUM_CTRL_PER_NETIF&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_CHECKSUM_CTRL_PER_NETIF==1: Checksum generation/check can be enabled/disabled per netif. ATTENTION: if enabled, the CHECKSUM_GEN_* and CHECKSUM_CHECK_* defines must be enabled! </p>
+
+</div>
+</div>
+<a id="ga9f60183f0442bdbeefd6b395c6647613"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9f60183f0442bdbeefd6b395c6647613">&#9670;&nbsp;</a></span>LWIP_CHECKSUM_ON_COPY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_CHECKSUM_ON_COPY&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_CHECKSUM_ON_COPY==1: Calculate checksum when copying data from application buffers to pbufs. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__checksum.js b/doc/doxygen/output/html/group__lwip__opts__checksum.js
new file mode 100644
index 0000000..ce33af1
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__checksum.js
@@ -0,0 +1,15 @@
+var group__lwip__opts__checksum =
+[
+    [ "CHECKSUM_CHECK_ICMP", "group__lwip__opts__checksum.html#ga79807171be8c20b69a5cd8de83566d25", null ],
+    [ "CHECKSUM_CHECK_ICMP6", "group__lwip__opts__checksum.html#gaf466a10b093489910a773fd1cec74c2d", null ],
+    [ "CHECKSUM_CHECK_IP", "group__lwip__opts__checksum.html#ga005b1b9988b84a2cb844144cef22c11e", null ],
+    [ "CHECKSUM_CHECK_TCP", "group__lwip__opts__checksum.html#gab676cc29571b7ffda12336482ad97699", null ],
+    [ "CHECKSUM_CHECK_UDP", "group__lwip__opts__checksum.html#ga6747f7b72abe544fd4dc184cc7fcad37", null ],
+    [ "CHECKSUM_GEN_ICMP", "group__lwip__opts__checksum.html#ga2291ec5bec0a551545da6d5f9f9316b2", null ],
+    [ "CHECKSUM_GEN_ICMP6", "group__lwip__opts__checksum.html#ga7cd47a55af03b1048c5a4a5fe0e76013", null ],
+    [ "CHECKSUM_GEN_IP", "group__lwip__opts__checksum.html#ga8ddad81fc26268a13b35091781da2265", null ],
+    [ "CHECKSUM_GEN_TCP", "group__lwip__opts__checksum.html#ga800069963cc4552b99235237c22f00bb", null ],
+    [ "CHECKSUM_GEN_UDP", "group__lwip__opts__checksum.html#ga98d460f8c2baed8bf62d5473831c0b2c", null ],
+    [ "LWIP_CHECKSUM_CTRL_PER_NETIF", "group__lwip__opts__checksum.html#ga3ecc5246a0c6ca5aed56c2d7899c1004", null ],
+    [ "LWIP_CHECKSUM_ON_COPY", "group__lwip__opts__checksum.html#ga9f60183f0442bdbeefd6b395c6647613", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__debug.html b/doc/doxygen/output/html/group__lwip__opts__debug.html
new file mode 100644
index 0000000..954427c
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__debug.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Debugging</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__debug.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">Debugging<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__lwip__assertions"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__assertions.html">Assertion handling</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__stats"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html">Statistics</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__debugmsg"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html">Debug messages</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__perf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__perf.html">Performance</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>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__debug.js b/doc/doxygen/output/html/group__lwip__opts__debug.js
new file mode 100644
index 0000000..f82eca9
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__debug.js
@@ -0,0 +1,7 @@
+var group__lwip__opts__debug =
+[
+    [ "Assertion handling", "group__lwip__assertions.html", "group__lwip__assertions" ],
+    [ "Statistics", "group__lwip__opts__stats.html", "group__lwip__opts__stats" ],
+    [ "Debug messages", "group__lwip__opts__debugmsg.html", "group__lwip__opts__debugmsg" ],
+    [ "Performance", "group__lwip__opts__perf.html", "group__lwip__opts__perf" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__debugmsg.html b/doc/doxygen/output/html/group__lwip__opts__debugmsg.html
new file mode 100644
index 0000000..87b041a
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__debugmsg.html
@@ -0,0 +1,708 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Debug messages</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__debugmsg.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Debug messages<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__debug.html">Debugging</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__debugging__levels"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__debugging__levels.html">LWIP_DBG_MIN_LEVEL and LWIP_DBG_TYPES_ON values</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga2043f599515774f8e571ba185dbcb9e7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga2043f599515774f8e571ba185dbcb9e7">LWIP_DBG_MIN_LEVEL</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#ga8ebaeb006b43f55897f3196b3617dc87">LWIP_DBG_LEVEL_ALL</a></td></tr>
+<tr class="separator:ga2043f599515774f8e571ba185dbcb9e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac095d0e53f5eb5b326b2cccfd071d93d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gac095d0e53f5eb5b326b2cccfd071d93d">LWIP_DBG_TYPES_ON</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#ga9e31b7cbbc8f46af8e62b548079acd4e">LWIP_DBG_ON</a></td></tr>
+<tr class="separator:gac095d0e53f5eb5b326b2cccfd071d93d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabff5d1e0b334f5b45bd2b8bbb675411e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gabff5d1e0b334f5b45bd2b8bbb675411e">ETHARP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gabff5d1e0b334f5b45bd2b8bbb675411e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2dfad02b075a7f9a8791a66fe40864a4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga2dfad02b075a7f9a8791a66fe40864a4">NETIF_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga2dfad02b075a7f9a8791a66fe40864a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5c3d44a0ec3bb8bd66f776c70d5c6a6c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga5c3d44a0ec3bb8bd66f776c70d5c6a6c">PBUF_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga5c3d44a0ec3bb8bd66f776c70d5c6a6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga671009550216f7dc03e67ba5751e3160"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga671009550216f7dc03e67ba5751e3160">API_LIB_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga671009550216f7dc03e67ba5751e3160"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4279d7ff9f986b2ff3eb068bb012b697"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga4279d7ff9f986b2ff3eb068bb012b697">API_MSG_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga4279d7ff9f986b2ff3eb068bb012b697"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga509594f3ba7d8b1356628b50b55a0934"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga509594f3ba7d8b1356628b50b55a0934">SOCKETS_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga509594f3ba7d8b1356628b50b55a0934"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9595904a1cb9bfe0b9b1d958abdc923a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga9595904a1cb9bfe0b9b1d958abdc923a">ICMP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga9595904a1cb9bfe0b9b1d958abdc923a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8da07508ee75704362d45eee3eb857fa"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga8da07508ee75704362d45eee3eb857fa">IGMP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga8da07508ee75704362d45eee3eb857fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga78140cbe70258a65cb5c9e381843e4f3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga78140cbe70258a65cb5c9e381843e4f3">INET_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga78140cbe70258a65cb5c9e381843e4f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5d3348778951e7bc5cd397c6575eef3a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga5d3348778951e7bc5cd397c6575eef3a">IP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga5d3348778951e7bc5cd397c6575eef3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33">IP_REASS_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf0551bef83c0fc1baa57cf339d220e25"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gaf0551bef83c0fc1baa57cf339d220e25">RAW_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gaf0551bef83c0fc1baa57cf339d220e25"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2d7bc380695eeedb1af50c3808613afe"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga2d7bc380695eeedb1af50c3808613afe">MEM_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga2d7bc380695eeedb1af50c3808613afe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad80231923f7a808d49eba5ec57d63616"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gad80231923f7a808d49eba5ec57d63616">MEMP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gad80231923f7a808d49eba5ec57d63616"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2960ae20008f05da8cc0714f36365642"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga2960ae20008f05da8cc0714f36365642">SYS_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga2960ae20008f05da8cc0714f36365642"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga24a6644ba9cc82665a7bf209b3870c15"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga24a6644ba9cc82665a7bf209b3870c15">TIMERS_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga24a6644ba9cc82665a7bf209b3870c15"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4f43bb8a430c7a52a1ad5086d3f2803c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga4f43bb8a430c7a52a1ad5086d3f2803c">TCP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga4f43bb8a430c7a52a1ad5086d3f2803c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf51dc2563536de56470146749f715ba8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gaf51dc2563536de56470146749f715ba8">TCP_INPUT_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gaf51dc2563536de56470146749f715ba8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5895bee26e8e1a0b89d597e0f2580b23"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga5895bee26e8e1a0b89d597e0f2580b23">TCP_FR_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga5895bee26e8e1a0b89d597e0f2580b23"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad6e52e37415d0d0cbe4931a28f5a9662"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gad6e52e37415d0d0cbe4931a28f5a9662">TCP_RTO_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gad6e52e37415d0d0cbe4931a28f5a9662"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga66df03d8192cd978d3321a9d68bf5411"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga66df03d8192cd978d3321a9d68bf5411">TCP_CWND_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga66df03d8192cd978d3321a9d68bf5411"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3704f433e947d6342da77c74e33627e1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga3704f433e947d6342da77c74e33627e1">TCP_WND_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga3704f433e947d6342da77c74e33627e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9f70601fdc1feee490772bf7fcdb74fb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga9f70601fdc1feee490772bf7fcdb74fb">TCP_OUTPUT_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga9f70601fdc1feee490772bf7fcdb74fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga37596f7bbb9b7663826244ba54486679"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga37596f7bbb9b7663826244ba54486679">TCP_RST_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga37596f7bbb9b7663826244ba54486679"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae7980c7f8eb45cd411bf410ff0a3fc55"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gae7980c7f8eb45cd411bf410ff0a3fc55">TCP_QLEN_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gae7980c7f8eb45cd411bf410ff0a3fc55"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0393f312c5475a1c649b39ef9cfcaad4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga0393f312c5475a1c649b39ef9cfcaad4">UDP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga0393f312c5475a1c649b39ef9cfcaad4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga52d6c83451936c3de3b0338d4a3f921f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga52d6c83451936c3de3b0338d4a3f921f">TCPIP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga52d6c83451936c3de3b0338d4a3f921f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab986f95183559d8678c6d80969b01857"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gab986f95183559d8678c6d80969b01857">SLIP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gab986f95183559d8678c6d80969b01857"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga97927ceecabcdb5f41735bf372a05cee"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga97927ceecabcdb5f41735bf372a05cee">DHCP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga97927ceecabcdb5f41735bf372a05cee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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"><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>
+<tr class="separator:gac2f9726756b78d4d7c425b0422a776ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacfc11be8b3bf6bb55e3e5c39ea8802d1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gacfc11be8b3bf6bb55e3e5c39ea8802d1">DHCP6_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gacfc11be8b3bf6bb55e3e5c39ea8802d1"><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="ga671009550216f7dc03e67ba5751e3160"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga671009550216f7dc03e67ba5751e3160">&#9670;&nbsp;</a></span>API_LIB_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define API_LIB_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>API_LIB_DEBUG: Enable debugging in <a class="el" href="api__lib_8c.html">api_lib.c</a>. </p>
+
+</div>
+</div>
+<a id="ga4279d7ff9f986b2ff3eb068bb012b697"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4279d7ff9f986b2ff3eb068bb012b697">&#9670;&nbsp;</a></span>API_MSG_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define API_MSG_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>API_MSG_DEBUG: Enable debugging in <a class="el" href="api__msg_8c.html">api_msg.c</a>. </p>
+
+</div>
+</div>
+<a id="gafaee522e7f32d81022215e1805e303a5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafaee522e7f32d81022215e1805e303a5">&#9670;&nbsp;</a></span>AUTOIP_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define AUTOIP_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>AUTOIP_DEBUG: Enable debugging in <a class="el" href="autoip_8c.html">autoip.c</a>. </p>
+
+</div>
+</div>
+<a id="gacfc11be8b3bf6bb55e3e5c39ea8802d1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacfc11be8b3bf6bb55e3e5c39ea8802d1">&#9670;&nbsp;</a></span>DHCP6_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DHCP6_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>DHCP6_DEBUG: Enable debugging in <a class="el" href="dhcp6_8c.html">dhcp6.c</a>. </p>
+
+</div>
+</div>
+<a id="ga97927ceecabcdb5f41735bf372a05cee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga97927ceecabcdb5f41735bf372a05cee">&#9670;&nbsp;</a></span>DHCP_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DHCP_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>DHCP_DEBUG: Enable debugging in <a class="el" href="dhcp_8c.html">dhcp.c</a>. </p>
+
+</div>
+</div>
+<a id="gaba55da2352c99d813767913e5e36be1f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaba55da2352c99d813767913e5e36be1f">&#9670;&nbsp;</a></span>DNS_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DNS_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>DNS_DEBUG: Enable debugging for DNS. </p>
+
+</div>
+</div>
+<a id="gabff5d1e0b334f5b45bd2b8bbb675411e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabff5d1e0b334f5b45bd2b8bbb675411e">&#9670;&nbsp;</a></span>ETHARP_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ETHARP_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>ETHARP_DEBUG: Enable debugging in <a class="el" href="etharp_8c.html">etharp.c</a>. </p>
+
+</div>
+</div>
+<a id="ga9595904a1cb9bfe0b9b1d958abdc923a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9595904a1cb9bfe0b9b1d958abdc923a">&#9670;&nbsp;</a></span>ICMP_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ICMP_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>ICMP_DEBUG: Enable debugging in <a class="el" href="icmp_8c.html">icmp.c</a>. </p>
+
+</div>
+</div>
+<a id="ga8da07508ee75704362d45eee3eb857fa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8da07508ee75704362d45eee3eb857fa">&#9670;&nbsp;</a></span>IGMP_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IGMP_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>IGMP_DEBUG: Enable debugging in <a class="el" href="igmp_8c.html">igmp.c</a>. </p>
+
+</div>
+</div>
+<a id="ga78140cbe70258a65cb5c9e381843e4f3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga78140cbe70258a65cb5c9e381843e4f3">&#9670;&nbsp;</a></span>INET_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define INET_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>INET_DEBUG: Enable debugging in inet.c. </p>
+
+</div>
+</div>
+<a id="gac2f9726756b78d4d7c425b0422a776ce"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac2f9726756b78d4d7c425b0422a776ce">&#9670;&nbsp;</a></span>IP6_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP6_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>IP6_DEBUG: Enable debugging for IPv6. </p>
+
+</div>
+</div>
+<a id="ga5d3348778951e7bc5cd397c6575eef3a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5d3348778951e7bc5cd397c6575eef3a">&#9670;&nbsp;</a></span>IP_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_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>IP_DEBUG: Enable debugging for IP. </p>
+
+</div>
+</div>
+<a id="ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33">&#9670;&nbsp;</a></span>IP_REASS_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_REASS_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>IP_REASS_DEBUG: Enable debugging in ip_frag.c for both frag &amp; reass. </p>
+
+</div>
+</div>
+<a id="ga2043f599515774f8e571ba185dbcb9e7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2043f599515774f8e571ba185dbcb9e7">&#9670;&nbsp;</a></span>LWIP_DBG_MIN_LEVEL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DBG_MIN_LEVEL&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#ga8ebaeb006b43f55897f3196b3617dc87">LWIP_DBG_LEVEL_ALL</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_DBG_MIN_LEVEL: After masking, the value of the debug is compared against this value. If it is smaller, then debugging messages are written. </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__debugging__levels.html">LWIP_DBG_MIN_LEVEL and LWIP_DBG_TYPES_ON values</a> </dd></dl>
+
+</div>
+</div>
+<a id="gac095d0e53f5eb5b326b2cccfd071d93d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac095d0e53f5eb5b326b2cccfd071d93d">&#9670;&nbsp;</a></span>LWIP_DBG_TYPES_ON</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DBG_TYPES_ON&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#ga9e31b7cbbc8f46af8e62b548079acd4e">LWIP_DBG_ON</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_DBG_TYPES_ON: A mask that can be used to globally enable/disable debug messages of certain types. </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__debugging__levels.html">LWIP_DBG_MIN_LEVEL and LWIP_DBG_TYPES_ON values</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga2d7bc380695eeedb1af50c3808613afe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2d7bc380695eeedb1af50c3808613afe">&#9670;&nbsp;</a></span>MEM_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEM_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>MEM_DEBUG: Enable debugging in <a class="el" href="mem_8c.html">mem.c</a>. </p>
+
+</div>
+</div>
+<a id="gad80231923f7a808d49eba5ec57d63616"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad80231923f7a808d49eba5ec57d63616">&#9670;&nbsp;</a></span>MEMP_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_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>MEMP_DEBUG: Enable debugging in <a class="el" href="memp_8c.html">memp.c</a>. </p>
+
+</div>
+</div>
+<a id="ga2dfad02b075a7f9a8791a66fe40864a4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2dfad02b075a7f9a8791a66fe40864a4">&#9670;&nbsp;</a></span>NETIF_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETIF_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>NETIF_DEBUG: Enable debugging in <a class="el" href="netif_8c.html">netif.c</a>. </p>
+
+</div>
+</div>
+<a id="ga5c3d44a0ec3bb8bd66f776c70d5c6a6c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5c3d44a0ec3bb8bd66f776c70d5c6a6c">&#9670;&nbsp;</a></span>PBUF_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_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>PBUF_DEBUG: Enable debugging in <a class="el" href="pbuf_8c.html">pbuf.c</a>. </p>
+
+</div>
+</div>
+<a id="gaf0551bef83c0fc1baa57cf339d220e25"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf0551bef83c0fc1baa57cf339d220e25">&#9670;&nbsp;</a></span>RAW_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define RAW_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>RAW_DEBUG: Enable debugging in <a class="el" href="raw_8c.html">raw.c</a>. </p>
+
+</div>
+</div>
+<a id="gab986f95183559d8678c6d80969b01857"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab986f95183559d8678c6d80969b01857">&#9670;&nbsp;</a></span>SLIP_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SLIP_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>SLIP_DEBUG: Enable debugging in <a class="el" href="slipif_8c.html">slipif.c</a>. </p>
+
+</div>
+</div>
+<a id="ga509594f3ba7d8b1356628b50b55a0934"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga509594f3ba7d8b1356628b50b55a0934">&#9670;&nbsp;</a></span>SOCKETS_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SOCKETS_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>SOCKETS_DEBUG: Enable debugging in <a class="el" href="sockets_8c.html">sockets.c</a>. </p>
+
+</div>
+</div>
+<a id="ga2960ae20008f05da8cc0714f36365642"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2960ae20008f05da8cc0714f36365642">&#9670;&nbsp;</a></span>SYS_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SYS_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>SYS_DEBUG: Enable debugging in <a class="el" href="sys_8c.html">sys.c</a>. </p>
+
+</div>
+</div>
+<a id="ga66df03d8192cd978d3321a9d68bf5411"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga66df03d8192cd978d3321a9d68bf5411">&#9670;&nbsp;</a></span>TCP_CWND_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_CWND_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>TCP_CWND_DEBUG: Enable debugging for TCP congestion window. </p>
+
+</div>
+</div>
+<a id="ga4f43bb8a430c7a52a1ad5086d3f2803c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4f43bb8a430c7a52a1ad5086d3f2803c">&#9670;&nbsp;</a></span>TCP_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_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>TCP_DEBUG: Enable debugging for TCP. </p>
+
+</div>
+</div>
+<a id="ga5895bee26e8e1a0b89d597e0f2580b23"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5895bee26e8e1a0b89d597e0f2580b23">&#9670;&nbsp;</a></span>TCP_FR_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_FR_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>TCP_FR_DEBUG: Enable debugging in <a class="el" href="tcp__in_8c.html">tcp_in.c</a> for fast retransmit. </p>
+
+</div>
+</div>
+<a id="gaf51dc2563536de56470146749f715ba8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf51dc2563536de56470146749f715ba8">&#9670;&nbsp;</a></span>TCP_INPUT_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_INPUT_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>TCP_INPUT_DEBUG: Enable debugging in <a class="el" href="tcp__in_8c.html">tcp_in.c</a> for incoming debug. </p>
+
+</div>
+</div>
+<a id="ga9f70601fdc1feee490772bf7fcdb74fb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9f70601fdc1feee490772bf7fcdb74fb">&#9670;&nbsp;</a></span>TCP_OUTPUT_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_OUTPUT_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>TCP_OUTPUT_DEBUG: Enable debugging in <a class="el" href="tcp__out_8c.html">tcp_out.c</a> output functions. </p>
+
+</div>
+</div>
+<a id="gae7980c7f8eb45cd411bf410ff0a3fc55"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae7980c7f8eb45cd411bf410ff0a3fc55">&#9670;&nbsp;</a></span>TCP_QLEN_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_QLEN_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>TCP_QLEN_DEBUG: Enable debugging for TCP queue lengths. </p>
+
+</div>
+</div>
+<a id="ga37596f7bbb9b7663826244ba54486679"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga37596f7bbb9b7663826244ba54486679">&#9670;&nbsp;</a></span>TCP_RST_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_RST_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>TCP_RST_DEBUG: Enable debugging for TCP with the RST message. </p>
+
+</div>
+</div>
+<a id="gad6e52e37415d0d0cbe4931a28f5a9662"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad6e52e37415d0d0cbe4931a28f5a9662">&#9670;&nbsp;</a></span>TCP_RTO_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_RTO_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>TCP_RTO_DEBUG: Enable debugging in TCP for retransmit timeout. </p>
+
+</div>
+</div>
+<a id="ga3704f433e947d6342da77c74e33627e1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3704f433e947d6342da77c74e33627e1">&#9670;&nbsp;</a></span>TCP_WND_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_WND_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>TCP_WND_DEBUG: Enable debugging in <a class="el" href="tcp__in_8c.html">tcp_in.c</a> for window updating. </p>
+
+</div>
+</div>
+<a id="ga52d6c83451936c3de3b0338d4a3f921f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga52d6c83451936c3de3b0338d4a3f921f">&#9670;&nbsp;</a></span>TCPIP_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCPIP_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>TCPIP_DEBUG: Enable debugging in <a class="el" href="tcpip_8c.html">tcpip.c</a>. </p>
+
+</div>
+</div>
+<a id="ga24a6644ba9cc82665a7bf209b3870c15"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga24a6644ba9cc82665a7bf209b3870c15">&#9670;&nbsp;</a></span>TIMERS_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TIMERS_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>TIMERS_DEBUG: Enable debugging in timers.c. </p>
+
+</div>
+</div>
+<a id="ga0393f312c5475a1c649b39ef9cfcaad4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0393f312c5475a1c649b39ef9cfcaad4">&#9670;&nbsp;</a></span>UDP_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UDP_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>UDP_DEBUG: Enable debugging in UDP. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__debugmsg.js b/doc/doxygen/output/html/group__lwip__opts__debugmsg.js
new file mode 100644
index 0000000..705253f
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__debugmsg.js
@@ -0,0 +1,39 @@
+var group__lwip__opts__debugmsg =
+[
+    [ "LWIP_DBG_MIN_LEVEL and LWIP_DBG_TYPES_ON values", "group__debugging__levels.html", "group__debugging__levels" ],
+    [ "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 ],
+    [ "DHCP6_DEBUG", "group__lwip__opts__debugmsg.html#gacfc11be8b3bf6bb55e3e5c39ea8802d1", null ],
+    [ "DHCP_DEBUG", "group__lwip__opts__debugmsg.html#ga97927ceecabcdb5f41735bf372a05cee", null ],
+    [ "DNS_DEBUG", "group__lwip__opts__debugmsg.html#gaba55da2352c99d813767913e5e36be1f", null ],
+    [ "ETHARP_DEBUG", "group__lwip__opts__debugmsg.html#gabff5d1e0b334f5b45bd2b8bbb675411e", null ],
+    [ "ICMP_DEBUG", "group__lwip__opts__debugmsg.html#ga9595904a1cb9bfe0b9b1d958abdc923a", null ],
+    [ "IGMP_DEBUG", "group__lwip__opts__debugmsg.html#ga8da07508ee75704362d45eee3eb857fa", null ],
+    [ "INET_DEBUG", "group__lwip__opts__debugmsg.html#ga78140cbe70258a65cb5c9e381843e4f3", null ],
+    [ "IP6_DEBUG", "group__lwip__opts__debugmsg.html#gac2f9726756b78d4d7c425b0422a776ce", null ],
+    [ "IP_DEBUG", "group__lwip__opts__debugmsg.html#ga5d3348778951e7bc5cd397c6575eef3a", null ],
+    [ "IP_REASS_DEBUG", "group__lwip__opts__debugmsg.html#ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33", null ],
+    [ "LWIP_DBG_MIN_LEVEL", "group__lwip__opts__debugmsg.html#ga2043f599515774f8e571ba185dbcb9e7", null ],
+    [ "LWIP_DBG_TYPES_ON", "group__lwip__opts__debugmsg.html#gac095d0e53f5eb5b326b2cccfd071d93d", null ],
+    [ "MEM_DEBUG", "group__lwip__opts__debugmsg.html#ga2d7bc380695eeedb1af50c3808613afe", null ],
+    [ "MEMP_DEBUG", "group__lwip__opts__debugmsg.html#gad80231923f7a808d49eba5ec57d63616", null ],
+    [ "NETIF_DEBUG", "group__lwip__opts__debugmsg.html#ga2dfad02b075a7f9a8791a66fe40864a4", null ],
+    [ "PBUF_DEBUG", "group__lwip__opts__debugmsg.html#ga5c3d44a0ec3bb8bd66f776c70d5c6a6c", null ],
+    [ "RAW_DEBUG", "group__lwip__opts__debugmsg.html#gaf0551bef83c0fc1baa57cf339d220e25", null ],
+    [ "SLIP_DEBUG", "group__lwip__opts__debugmsg.html#gab986f95183559d8678c6d80969b01857", null ],
+    [ "SOCKETS_DEBUG", "group__lwip__opts__debugmsg.html#ga509594f3ba7d8b1356628b50b55a0934", null ],
+    [ "SYS_DEBUG", "group__lwip__opts__debugmsg.html#ga2960ae20008f05da8cc0714f36365642", null ],
+    [ "TCP_CWND_DEBUG", "group__lwip__opts__debugmsg.html#ga66df03d8192cd978d3321a9d68bf5411", null ],
+    [ "TCP_DEBUG", "group__lwip__opts__debugmsg.html#ga4f43bb8a430c7a52a1ad5086d3f2803c", null ],
+    [ "TCP_FR_DEBUG", "group__lwip__opts__debugmsg.html#ga5895bee26e8e1a0b89d597e0f2580b23", null ],
+    [ "TCP_INPUT_DEBUG", "group__lwip__opts__debugmsg.html#gaf51dc2563536de56470146749f715ba8", null ],
+    [ "TCP_OUTPUT_DEBUG", "group__lwip__opts__debugmsg.html#ga9f70601fdc1feee490772bf7fcdb74fb", null ],
+    [ "TCP_QLEN_DEBUG", "group__lwip__opts__debugmsg.html#gae7980c7f8eb45cd411bf410ff0a3fc55", null ],
+    [ "TCP_RST_DEBUG", "group__lwip__opts__debugmsg.html#ga37596f7bbb9b7663826244ba54486679", null ],
+    [ "TCP_RTO_DEBUG", "group__lwip__opts__debugmsg.html#gad6e52e37415d0d0cbe4931a28f5a9662", null ],
+    [ "TCP_WND_DEBUG", "group__lwip__opts__debugmsg.html#ga3704f433e947d6342da77c74e33627e1", null ],
+    [ "TCPIP_DEBUG", "group__lwip__opts__debugmsg.html#ga52d6c83451936c3de3b0338d4a3f921f", null ],
+    [ "TIMERS_DEBUG", "group__lwip__opts__debugmsg.html#ga24a6644ba9cc82665a7bf209b3870c15", null ],
+    [ "UDP_DEBUG", "group__lwip__opts__debugmsg.html#ga0393f312c5475a1c649b39ef9cfcaad4", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__dhcp.html b/doc/doxygen/output/html/group__lwip__opts__dhcp.html
new file mode 100644
index 0000000..b324bcc
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__dhcp.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: DHCP</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__dhcp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">DHCP<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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem: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"><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: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"><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>
+<tr class="separator:ga2cc18315edcd5ffc083d1256f7d22a83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9d014e3f7dc9e1e7c7decd8652ba65e2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2">LWIP_DHCP_MAX_NTP_SERVERS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga9d014e3f7dc9e1e7c7decd8652ba65e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="gab2d91de7b2fce879b0a213682e1b0b69"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab2d91de7b2fce879b0a213682e1b0b69">&#9670;&nbsp;</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="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>
+      </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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8a6ec62dc121064ac591b1fd8567bee9">&#9670;&nbsp;</a></span>LWIP_DHCP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DHCP&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_DHCP==1: Enable DHCP module. </p>
+
+</div>
+</div>
+<a id="ga3c2983cbd228011dd3e18cb417e7e423"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3c2983cbd228011dd3e18cb417e7e423">&#9670;&nbsp;</a></span>LWIP_DHCP_BOOTP_FILE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DHCP_BOOTP_FILE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_DHCP_BOOTP_FILE==1: Store offered_si_addr and boot_file_name. </p>
+
+</div>
+</div>
+<a id="ga2cc18315edcd5ffc083d1256f7d22a83"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2cc18315edcd5ffc083d1256f7d22a83">&#9670;&nbsp;</a></span>LWIP_DHCP_GET_NTP_SRV</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DHCP_GET_NTP_SRV&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_DHCP_GETS_NTP==1: Request NTP servers with discover/select. For each response packet, an callback is called, which has to be provided by the port: void dhcp_set_ntp_servers(u8_t num_ntp_servers, ip_addr_t* ntp_server_addrs); </p>
+
+</div>
+</div>
+<a id="ga60ccc20fbb08be24b5d5f599dd47a6a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga60ccc20fbb08be24b5d5f599dd47a6a6">&#9670;&nbsp;</a></span>LWIP_DHCP_MAX_DNS_SERVERS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DHCP_MAX_DNS_SERVERS&#160;&#160;&#160;<a class="el" href="group__lwip__opts__dns.html#ga9f9881c887a8aceb9765820c2dbdf292">DNS_MAX_SERVERS</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_DHCP_MAX_DNS_SERVERS &gt; 0: Request DNS servers with discover/select. DNS servers received in the response are passed to DNS via <a class="el" href="group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584">dns_setserver()</a> (up to the maximum limit defined here). </p>
+
+</div>
+</div>
+<a id="ga9d014e3f7dc9e1e7c7decd8652ba65e2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9d014e3f7dc9e1e7c7decd8652ba65e2">&#9670;&nbsp;</a></span>LWIP_DHCP_MAX_NTP_SERVERS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DHCP_MAX_NTP_SERVERS&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The maximum of NTP servers requested </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__dhcp.js b/doc/doxygen/output/html/group__lwip__opts__dhcp.js
new file mode 100644
index 0000000..267451d
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__dhcp.js
@@ -0,0 +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_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 ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__dhcpv6.html b/doc/doxygen/output/html/group__lwip__opts__dhcpv6.html
new file mode 100644
index 0000000..2fcf431
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__dhcpv6.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: DHCPv6</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__dhcpv6.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">DHCPv6<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__ipv6.html">IPv6</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga1ba67b6665026ec0c688dc4b0df047a6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6">LWIP_IPV6_DHCP6</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga1ba67b6665026ec0c688dc4b0df047a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3fc9dbe8feae61621cac4952ac28e155"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcpv6.html#ga3fc9dbe8feae61621cac4952ac28e155">LWIP_IPV6_DHCP6_STATEFUL</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga3fc9dbe8feae61621cac4952ac28e155"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8d6bab14d580d2136430319aab6d7930"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcpv6.html#ga8d6bab14d580d2136430319aab6d7930">LWIP_IPV6_DHCP6_STATELESS</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6">LWIP_IPV6_DHCP6</a></td></tr>
+<tr class="separator:ga8d6bab14d580d2136430319aab6d7930"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5d08f76a7472daa7bcfe17343243bd77"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcpv6.html#ga5d08f76a7472daa7bcfe17343243bd77">LWIP_DHCP6_GET_NTP_SRV</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga5d08f76a7472daa7bcfe17343243bd77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf3ac8e15d7a67429a02bc2317e16bcfe"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcpv6.html#gaf3ac8e15d7a67429a02bc2317e16bcfe">LWIP_DHCP6_MAX_NTP_SERVERS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gaf3ac8e15d7a67429a02bc2317e16bcfe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga92c3bc242ad20a5f398c45d332864a29"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcpv6.html#ga92c3bc242ad20a5f398c45d332864a29">LWIP_DHCP6_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:ga92c3bc242ad20a5f398c45d332864a29"><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="ga5d08f76a7472daa7bcfe17343243bd77"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5d08f76a7472daa7bcfe17343243bd77">&#9670;&nbsp;</a></span>LWIP_DHCP6_GET_NTP_SRV</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DHCP6_GET_NTP_SRV&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_DHCP6_GETS_NTP==1: Request NTP servers via DHCPv6. For each response packet, a callback is called, which has to be provided by the port: void dhcp6_set_ntp_servers(u8_t num_ntp_servers, ip_addr_t* ntp_server_addrs); </p>
+
+</div>
+</div>
+<a id="ga92c3bc242ad20a5f398c45d332864a29"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga92c3bc242ad20a5f398c45d332864a29">&#9670;&nbsp;</a></span>LWIP_DHCP6_MAX_DNS_SERVERS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DHCP6_MAX_DNS_SERVERS&#160;&#160;&#160;<a class="el" href="group__lwip__opts__dns.html#ga9f9881c887a8aceb9765820c2dbdf292">DNS_MAX_SERVERS</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_DHCP6_MAX_DNS_SERVERS &gt; 0: Request DNS servers via DHCPv6. DNS servers received in the response are passed to DNS via <a class="el" href="group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584">dns_setserver()</a> (up to the maximum limit defined here). </p>
+
+</div>
+</div>
+<a id="gaf3ac8e15d7a67429a02bc2317e16bcfe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf3ac8e15d7a67429a02bc2317e16bcfe">&#9670;&nbsp;</a></span>LWIP_DHCP6_MAX_NTP_SERVERS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DHCP6_MAX_NTP_SERVERS&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The maximum of NTP servers requested </p>
+
+</div>
+</div>
+<a id="ga1ba67b6665026ec0c688dc4b0df047a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1ba67b6665026ec0c688dc4b0df047a6">&#9670;&nbsp;</a></span>LWIP_IPV6_DHCP6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IPV6_DHCP6&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_IPV6_DHCP6==1: enable DHCPv6 stateful/stateless address autoconfiguration. </p>
+
+</div>
+</div>
+<a id="ga3fc9dbe8feae61621cac4952ac28e155"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3fc9dbe8feae61621cac4952ac28e155">&#9670;&nbsp;</a></span>LWIP_IPV6_DHCP6_STATEFUL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IPV6_DHCP6_STATEFUL&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_IPV6_DHCP6_STATEFUL==1: enable DHCPv6 stateful address autoconfiguration. (not supported, yet!) </p>
+
+</div>
+</div>
+<a id="ga8d6bab14d580d2136430319aab6d7930"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8d6bab14d580d2136430319aab6d7930">&#9670;&nbsp;</a></span>LWIP_IPV6_DHCP6_STATELESS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IPV6_DHCP6_STATELESS&#160;&#160;&#160;<a class="el" href="group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6">LWIP_IPV6_DHCP6</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_IPV6_DHCP6_STATELESS==1: enable DHCPv6 stateless address autoconfiguration. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__dhcpv6.js b/doc/doxygen/output/html/group__lwip__opts__dhcpv6.js
new file mode 100644
index 0000000..29c6642
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__dhcpv6.js
@@ -0,0 +1,9 @@
+var group__lwip__opts__dhcpv6 =
+[
+    [ "LWIP_DHCP6_GET_NTP_SRV", "group__lwip__opts__dhcpv6.html#ga5d08f76a7472daa7bcfe17343243bd77", null ],
+    [ "LWIP_DHCP6_MAX_DNS_SERVERS", "group__lwip__opts__dhcpv6.html#ga92c3bc242ad20a5f398c45d332864a29", null ],
+    [ "LWIP_DHCP6_MAX_NTP_SERVERS", "group__lwip__opts__dhcpv6.html#gaf3ac8e15d7a67429a02bc2317e16bcfe", null ],
+    [ "LWIP_IPV6_DHCP6", "group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6", null ],
+    [ "LWIP_IPV6_DHCP6_STATEFUL", "group__lwip__opts__dhcpv6.html#ga3fc9dbe8feae61621cac4952ac28e155", null ],
+    [ "LWIP_IPV6_DHCP6_STATELESS", "group__lwip__opts__dhcpv6.html#ga8d6bab14d580d2136430319aab6d7930", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__dns.html b/doc/doxygen/output/html/group__lwip__opts__dns.html
new file mode 100644
index 0000000..8c26547
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__dns.html
@@ -0,0 +1,278 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: DNS</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__dns.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">DNS<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__callback.html">Callback-style APIs</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga98710dd81446b7cb2daac736bae6f646"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646">LWIP_DNS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga98710dd81446b7cb2daac736bae6f646"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2384e76c1acdf969d883f3de08d340f7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#ga2384e76c1acdf969d883f3de08d340f7">DNS_TABLE_SIZE</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:ga2384e76c1acdf969d883f3de08d340f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3b01c79902063c170ef57deb72f56124"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#ga3b01c79902063c170ef57deb72f56124">DNS_MAX_NAME_LENGTH</a>&#160;&#160;&#160;256</td></tr>
+<tr class="separator:ga3b01c79902063c170ef57deb72f56124"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9f9881c887a8aceb9765820c2dbdf292"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#ga9f9881c887a8aceb9765820c2dbdf292">DNS_MAX_SERVERS</a>&#160;&#160;&#160;2</td></tr>
+<tr class="separator:ga9f9881c887a8aceb9765820c2dbdf292"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaab73c241189335435f3f662aa6a00dba"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#gaab73c241189335435f3f662aa6a00dba">DNS_MAX_RETRIES</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:gaab73c241189335435f3f662aa6a00dba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga07ffd8e9106dae3b65347bd03811a4b6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#ga07ffd8e9106dae3b65347bd03811a4b6">DNS_DOES_NAME_CHECK</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga07ffd8e9106dae3b65347bd03811a4b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8979c30dfbfde609d5139f80aabdfcc5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#ga8979c30dfbfde609d5139f80aabdfcc5">LWIP_DNS_SECURE</a>&#160;&#160;&#160;(LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)</td></tr>
+<tr class="separator:ga8979c30dfbfde609d5139f80aabdfcc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacba1ac491c1b47b98dfbd0d5c1662659"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#gacba1ac491c1b47b98dfbd0d5c1662659">DNS_LOCAL_HOSTLIST</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gacba1ac491c1b47b98dfbd0d5c1662659"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8235a5fb0a1c1cceeee670cf95612ba8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#ga8235a5fb0a1c1cceeee670cf95612ba8">DNS_LOCAL_HOSTLIST_IS_DYNAMIC</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga8235a5fb0a1c1cceeee670cf95612ba8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafcbde5706a70ace562bd1f7d2d6f77cb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#gafcbde5706a70ace562bd1f7d2d6f77cb">LWIP_DNS_SUPPORT_MDNS_QUERIES</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gafcbde5706a70ace562bd1f7d2d6f77cb"><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="ga07ffd8e9106dae3b65347bd03811a4b6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga07ffd8e9106dae3b65347bd03811a4b6">&#9670;&nbsp;</a></span>DNS_DOES_NAME_CHECK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DNS_DOES_NAME_CHECK&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DNS do a name checking between the query and the response. </p>
+
+</div>
+</div>
+<a id="gacba1ac491c1b47b98dfbd0d5c1662659"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacba1ac491c1b47b98dfbd0d5c1662659">&#9670;&nbsp;</a></span>DNS_LOCAL_HOSTLIST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DNS_LOCAL_HOSTLIST&#160;&#160;&#160;0</td>
+        </tr>
+      </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", <a class="el" href="group__ip4addr.html#ga55cc3896c46564bd2941ee5806fe1e11">IPADDR4_INIT_BYTES(1,2,3,4)</a>), \ DNS_LOCAL_HOSTLIST_ELEM("host_ip6", <a class="el" href="group__ip6addr.html#gadaff748da2b808995993dd3db5420f08">IPADDR6_INIT_HOST(123, 234, 345, 456)</a>}</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>
+
+</div>
+</div>
+<a id="ga8235a5fb0a1c1cceeee670cf95612ba8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8235a5fb0a1c1cceeee670cf95612ba8">&#9670;&nbsp;</a></span>DNS_LOCAL_HOSTLIST_IS_DYNAMIC</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If this is turned on, the local host-list can be dynamically changed at runtime. </p>
+
+</div>
+</div>
+<a id="ga3b01c79902063c170ef57deb72f56124"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3b01c79902063c170ef57deb72f56124">&#9670;&nbsp;</a></span>DNS_MAX_NAME_LENGTH</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DNS_MAX_NAME_LENGTH&#160;&#160;&#160;256</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DNS maximum host name length supported in the name table. </p>
+
+</div>
+</div>
+<a id="gaab73c241189335435f3f662aa6a00dba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaab73c241189335435f3f662aa6a00dba">&#9670;&nbsp;</a></span>DNS_MAX_RETRIES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DNS_MAX_RETRIES&#160;&#160;&#160;4</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DNS maximum number of retries when asking for a name, before "timeout". </p>
+
+</div>
+</div>
+<a id="ga9f9881c887a8aceb9765820c2dbdf292"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9f9881c887a8aceb9765820c2dbdf292">&#9670;&nbsp;</a></span>DNS_MAX_SERVERS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DNS_MAX_SERVERS&#160;&#160;&#160;2</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The maximum of DNS servers The first server can be initialized automatically by defining DNS_SERVER_ADDRESS(ipaddr), where 'ipaddr' is an 'ip_addr_t*' </p>
+
+</div>
+</div>
+<a id="ga2384e76c1acdf969d883f3de08d340f7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2384e76c1acdf969d883f3de08d340f7">&#9670;&nbsp;</a></span>DNS_TABLE_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DNS_TABLE_SIZE&#160;&#160;&#160;4</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DNS maximum number of entries to maintain locally. </p>
+
+</div>
+</div>
+<a id="ga98710dd81446b7cb2daac736bae6f646"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga98710dd81446b7cb2daac736bae6f646">&#9670;&nbsp;</a></span>LWIP_DNS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DNS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS transport. </p>
+
+</div>
+</div>
+<a id="ga8979c30dfbfde609d5139f80aabdfcc5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8979c30dfbfde609d5139f80aabdfcc5">&#9670;&nbsp;</a></span>LWIP_DNS_SECURE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DNS_SECURE&#160;&#160;&#160;(LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_DNS_SECURE: controls the security level of the DNS implementation Use all DNS security features by default. This is overridable but should only be needed by very small targets or when using against non standard DNS servers. </p>
+
+</div>
+</div>
+<a id="gafcbde5706a70ace562bd1f7d2d6f77cb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafcbde5706a70ace562bd1f7d2d6f77cb">&#9670;&nbsp;</a></span>LWIP_DNS_SUPPORT_MDNS_QUERIES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DNS_SUPPORT_MDNS_QUERIES&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to enable querying ".local" names via mDNS using a One-Shot Multicast DNS Query </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__dns.js b/doc/doxygen/output/html/group__lwip__opts__dns.js
new file mode 100644
index 0000000..96c8af7
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__dns.js
@@ -0,0 +1,13 @@
+var group__lwip__opts__dns =
+[
+    [ "DNS_DOES_NAME_CHECK", "group__lwip__opts__dns.html#ga07ffd8e9106dae3b65347bd03811a4b6", null ],
+    [ "DNS_LOCAL_HOSTLIST", "group__lwip__opts__dns.html#gacba1ac491c1b47b98dfbd0d5c1662659", null ],
+    [ "DNS_LOCAL_HOSTLIST_IS_DYNAMIC", "group__lwip__opts__dns.html#ga8235a5fb0a1c1cceeee670cf95612ba8", null ],
+    [ "DNS_MAX_NAME_LENGTH", "group__lwip__opts__dns.html#ga3b01c79902063c170ef57deb72f56124", null ],
+    [ "DNS_MAX_RETRIES", "group__lwip__opts__dns.html#gaab73c241189335435f3f662aa6a00dba", null ],
+    [ "DNS_MAX_SERVERS", "group__lwip__opts__dns.html#ga9f9881c887a8aceb9765820c2dbdf292", null ],
+    [ "DNS_TABLE_SIZE", "group__lwip__opts__dns.html#ga2384e76c1acdf969d883f3de08d340f7", null ],
+    [ "LWIP_DNS", "group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646", null ],
+    [ "LWIP_DNS_SECURE", "group__lwip__opts__dns.html#ga8979c30dfbfde609d5139f80aabdfcc5", null ],
+    [ "LWIP_DNS_SUPPORT_MDNS_QUERIES", "group__lwip__opts__dns.html#gafcbde5706a70ace562bd1f7d2d6f77cb", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__hooks.html b/doc/doxygen/output/html/group__lwip__opts__hooks.html
new file mode 100644
index 0000000..28eaf1d
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__hooks.html
@@ -0,0 +1,1180 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Hooks</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__hooks.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Hooks<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__infrastructure.html">Infrastructure</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga11ac9d637cb6afc0a32e8da7f51d0c0d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga11ac9d637cb6afc0a32e8da7f51d0c0d">LWIP_HOOK_FILENAME</a>&#160;&#160;&#160;&quot;path/to/my/lwip_hooks.h&quot;</td></tr>
+<tr class="separator:ga11ac9d637cb6afc0a32e8da7f51d0c0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga078d203053911cf3af178392700386a4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga078d203053911cf3af178392700386a4">LWIP_HOOK_TCP_ISN</a>(local_ip,  local_port,  remote_ip,  remote_port)</td></tr>
+<tr class="separator:ga078d203053911cf3af178392700386a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabed8b1cda4aba2d108fa62cdd74895a2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#gabed8b1cda4aba2d108fa62cdd74895a2">LWIP_HOOK_TCP_INPACKET_PCB</a>(pcb,  hdr,  optlen,  opt1len,  opt2,  p)</td></tr>
+<tr class="separator:gabed8b1cda4aba2d108fa62cdd74895a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga31c0694abe4eedf3ff039b7073c2293f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga31c0694abe4eedf3ff039b7073c2293f">LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH</a>(pcb,  internal_len)</td></tr>
+<tr class="separator:ga31c0694abe4eedf3ff039b7073c2293f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0ef31b749307b63c06633645d4de21f0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga0ef31b749307b63c06633645d4de21f0">LWIP_HOOK_TCP_OUT_ADD_TCPOPTS</a>(p,  hdr,  pcb,  opts)</td></tr>
+<tr class="separator:ga0ef31b749307b63c06633645d4de21f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9124237c28e2f18f3b28d5be09e9ccb6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga9124237c28e2f18f3b28d5be09e9ccb6">LWIP_HOOK_IP4_INPUT</a>(<a class="el" href="structpbuf.html">pbuf</a>,  input_netif)</td></tr>
+<tr class="separator:ga9124237c28e2f18f3b28d5be09e9ccb6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5d1061ad722a73012a28dbaf0f169b70"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga5d1061ad722a73012a28dbaf0f169b70">LWIP_HOOK_IP4_ROUTE</a>()</td></tr>
+<tr class="separator:ga5d1061ad722a73012a28dbaf0f169b70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa410d9cbe1d4fa4c8a7f49af7b501024"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#gaa410d9cbe1d4fa4c8a7f49af7b501024">LWIP_HOOK_IP4_ROUTE_SRC</a>(src,  dest)</td></tr>
+<tr class="separator:gaa410d9cbe1d4fa4c8a7f49af7b501024"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaed848a98dbb5c8856a27e379986ea70d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#gaed848a98dbb5c8856a27e379986ea70d">LWIP_HOOK_IP4_CANFORWARD</a>(src,  dest)</td></tr>
+<tr class="separator:gaed848a98dbb5c8856a27e379986ea70d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2b76f127325fd5ca8b80077a4b6160b1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga2b76f127325fd5ca8b80077a4b6160b1">LWIP_HOOK_ETHARP_GET_GW</a>(<a class="el" href="structnetif.html">netif</a>,  dest)</td></tr>
+<tr class="separator:ga2b76f127325fd5ca8b80077a4b6160b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaccbdd3d0250f7176dcd799ca06007f20"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#gaccbdd3d0250f7176dcd799ca06007f20">LWIP_HOOK_IP6_INPUT</a>(<a class="el" href="structpbuf.html">pbuf</a>,  input_netif)</td></tr>
+<tr class="separator:gaccbdd3d0250f7176dcd799ca06007f20"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8245a4bc7ffb172e3bf32276f9d126ce"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga8245a4bc7ffb172e3bf32276f9d126ce">LWIP_HOOK_IP6_ROUTE</a>(src,  dest)</td></tr>
+<tr class="separator:ga8245a4bc7ffb172e3bf32276f9d126ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga287544c3d74bc2a2d645bddbbc4fbdd0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga287544c3d74bc2a2d645bddbbc4fbdd0">LWIP_HOOK_ND6_GET_GW</a>(<a class="el" href="structnetif.html">netif</a>,  dest)</td></tr>
+<tr class="separator:ga287544c3d74bc2a2d645bddbbc4fbdd0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2f020543772368f8f4355f50f24c86a9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga2f020543772368f8f4355f50f24c86a9">LWIP_HOOK_VLAN_CHECK</a>(<a class="el" href="structnetif.html">netif</a>,  <a class="el" href="structeth__hdr.html">eth_hdr</a>,  vlan_hdr)</td></tr>
+<tr class="separator:ga2f020543772368f8f4355f50f24c86a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2b6e450b4934b95df9b9a9d2b9a4d57e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga2b6e450b4934b95df9b9a9d2b9a4d57e">LWIP_HOOK_VLAN_SET</a>(<a class="el" href="structnetif.html">netif</a>,  p,  src,  dst,  eth_type)</td></tr>
+<tr class="separator:ga2b6e450b4934b95df9b9a9d2b9a4d57e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga13e90672158221b40f8b12bf9d8b721f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga13e90672158221b40f8b12bf9d8b721f">LWIP_HOOK_MEMP_AVAILABLE</a>(memp_t_type)</td></tr>
+<tr class="separator:ga13e90672158221b40f8b12bf9d8b721f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6cc92f5101dd7a0420e18e1f2101abf4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga6cc92f5101dd7a0420e18e1f2101abf4">LWIP_HOOK_UNKNOWN_ETH_PROTOCOL</a>(<a class="el" href="structpbuf.html">pbuf</a>,  <a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga6cc92f5101dd7a0420e18e1f2101abf4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga40e6c9aba06e66e5df1b4ca18329f9b4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga40e6c9aba06e66e5df1b4ca18329f9b4">LWIP_HOOK_DHCP_APPEND_OPTIONS</a>(<a class="el" href="structnetif.html">netif</a>,  dhcp,  state,  msg,  msg_type,  options_len_ptr)</td></tr>
+<tr class="separator:ga40e6c9aba06e66e5df1b4ca18329f9b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafbbbc574863c0f88988936bd1434f2d2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#gafbbbc574863c0f88988936bd1434f2d2">LWIP_HOOK_DHCP_PARSE_OPTION</a>(<a class="el" href="structnetif.html">netif</a>,  dhcp,  state,  msg,  msg_type,  option,  len,  <a class="el" href="structpbuf.html">pbuf</a>,  offset)</td></tr>
+<tr class="separator:gafbbbc574863c0f88988936bd1434f2d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4068b3313e32f711ba016215fc2c886a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga4068b3313e32f711ba016215fc2c886a">LWIP_HOOK_DHCP6_APPEND_OPTIONS</a>(<a class="el" href="structnetif.html">netif</a>,  dhcp6,  state,  msg,  msg_type,  options_len_ptr,  max_len)</td></tr>
+<tr class="separator:ga4068b3313e32f711ba016215fc2c886a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga14ea9210c09da4dd33bc85bd8a01b48a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga14ea9210c09da4dd33bc85bd8a01b48a">LWIP_HOOK_SOCKETS_SETSOCKOPT</a>(s,  sock,  level,  optname,  optval,  optlen,  err)</td></tr>
+<tr class="separator:ga14ea9210c09da4dd33bc85bd8a01b48a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabdaeb09ac9f441934e21a087544a1af1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#gabdaeb09ac9f441934e21a087544a1af1">LWIP_HOOK_SOCKETS_GETSOCKOPT</a>(s,  sock,  level,  optname,  optval,  optlen,  err)</td></tr>
+<tr class="separator:gabdaeb09ac9f441934e21a087544a1af1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae35e4b7374868dc748b12dedb8f807e5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#gae35e4b7374868dc748b12dedb8f807e5">LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE</a>(name,  addr,  addrtype,  err)</td></tr>
+<tr class="separator:gae35e4b7374868dc748b12dedb8f807e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Hooks are undefined by default, define them to a function if you need them. </p>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga4068b3313e32f711ba016215fc2c886a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4068b3313e32f711ba016215fc2c886a">&#9670;&nbsp;</a></span>LWIP_HOOK_DHCP6_APPEND_OPTIONS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_DHCP6_APPEND_OPTIONS</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dhcp6, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">state, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">msg, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">msg_type, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">options_len_ptr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">max_len&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__lwip__opts__hooks.html#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" href="structnetif.html">netif</a> *<a class="code" href="structnetif.html">netif</a>, <span class="keyword">struct</span> dhcp6 *dhcp, u8_t <a class="code" href="structnetif.html#a809cc57c0dff09c5c9ae45b02c2002f3">state</a>, <span class="keyword">struct</span> <a class="code" href="structdhcp6__msg.html">dhcp6_msg</a> *msg,</div><div class="line">             u8_t msg_type, u16_t *options_len_ptr);</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>
+<li>state: current dhcp6 state (dhcp6_state_enum_t as an u8_t)</li>
+<li>msg: struct <a class="el" href="structdhcp6__msg.html">dhcp6_msg</a> that will be sent</li>
+<li>msg_type: dhcp6 message type to be sent (u8_t)</li>
+<li>options_len_ptr: pointer to the current length of options in the <a class="el" href="structdhcp6__msg.html">dhcp6_msg</a> "msg" (must be increased when options are added!)</li>
+</ul>
+<p>Options need to appended like this: u8_t *options = (u8_t *)(msg + 1); LWIP_ASSERT("dhcp option overflow", sizeof(struct dhcp6_msg) + *options_len_ptr + newoptlen &lt;= max_len); options[(*options_len_ptr)++] = &lt;option_data&gt;; [...] </p>
+
+</div>
+</div>
+<a id="ga40e6c9aba06e66e5df1b4ca18329f9b4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga40e6c9aba06e66e5df1b4ca18329f9b4">&#9670;&nbsp;</a></span>LWIP_HOOK_DHCP_APPEND_OPTIONS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_DHCP_APPEND_OPTIONS</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dhcp, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">state, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">msg, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">msg_type, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">options_len_ptr&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__lwip__opts__hooks.html#ga40e6c9aba06e66e5df1b4ca18329f9b4">LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, state, msg, msg_type, options_len_ptr)</a>: Called from various dhcp functions when sending a DHCP message. This hook is called just before the DHCP message trailer is added, so the options are at the end of a DHCP message. Signature:</p><div class="fragment"><div class="line"><span class="keywordtype">void</span> my_hook(<span class="keyword">struct</span> <a class="code" href="structnetif.html">netif</a> *<a class="code" href="structnetif.html">netif</a>, <span class="keyword">struct</span> dhcp *dhcp, u8_t <a class="code" href="structnetif.html#a809cc57c0dff09c5c9ae45b02c2002f3">state</a>, <span class="keyword">struct</span> <a class="code" href="structdhcp__msg.html">dhcp_msg</a> *msg,</div><div class="line">             u8_t msg_type, u16_t *options_len_ptr);</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>netif: struct netif that the packet will be sent through</li>
+<li>dhcp: struct dhcp on that netif</li>
+<li>state: current dhcp state (dhcp_state_enum_t as an u8_t)</li>
+<li>msg: struct <a class="el" href="structdhcp__msg.html">dhcp_msg</a> that will be sent</li>
+<li>msg_type: dhcp message type to be sent (u8_t)</li>
+<li>options_len_ptr: pointer to the current length of options in the <a class="el" href="structdhcp__msg.html">dhcp_msg</a> "msg" (must be increased when options are added!)</li>
+</ul>
+<p>Options need to appended like this: LWIP_ASSERT("dhcp option overflow", *options_len_ptr + option_len + 2 &lt;= DHCP_OPTIONS_LEN); msg-&gt;options[(*options_len_ptr)++] = &lt;option_number&gt;; msg-&gt;options[(*options_len_ptr)++] = &lt;option_len&gt;; msg-&gt;options[(*options_len_ptr)++] = &lt;option_bytes&gt;; [...] </p>
+
+</div>
+</div>
+<a id="gafbbbc574863c0f88988936bd1434f2d2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafbbbc574863c0f88988936bd1434f2d2">&#9670;&nbsp;</a></span>LWIP_HOOK_DHCP_PARSE_OPTION</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_DHCP_PARSE_OPTION</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dhcp, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">state, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">msg, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">msg_type, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">option, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">len, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structpbuf.html">pbuf</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">offset&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__lwip__opts__hooks.html#gafbbbc574863c0f88988936bd1434f2d2">LWIP_HOOK_DHCP_PARSE_OPTION(netif, dhcp, state, msg, msg_type, option, len, pbuf, option_value_offset)</a>: Called from dhcp_parse_reply when receiving a DHCP message. This hook is called for every option in the received message that is not handled internally. Signature:</p><div class="fragment"><div class="line"><span class="keywordtype">void</span> my_hook(<span class="keyword">struct</span> <a class="code" href="structnetif.html">netif</a> *<a class="code" href="structnetif.html">netif</a>, <span class="keyword">struct</span> dhcp *dhcp, u8_t <a class="code" href="structnetif.html#a809cc57c0dff09c5c9ae45b02c2002f3">state</a>, <span class="keyword">struct</span> <a class="code" href="structdhcp__msg.html">dhcp_msg</a> *msg,</div><div class="line">             u8_t msg_type, u8_t option, u8_t option_len, <span class="keyword">struct</span> <a class="code" href="structpbuf.html">pbuf</a> *<a class="code" href="structpbuf.html">pbuf</a>, u16_t option_value_offset);</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>netif: struct netif that the packet will be sent through</li>
+<li>dhcp: struct dhcp on that netif</li>
+<li>state: current dhcp state (dhcp_state_enum_t as an u8_t)</li>
+<li>msg: struct <a class="el" href="structdhcp__msg.html">dhcp_msg</a> that was received</li>
+<li>msg_type: dhcp message type received (u8_t, ATTENTION: only valid after the message type option has been parsed!)</li>
+<li>option: option value (u8_t)</li>
+<li>len: option data length (u8_t)</li>
+<li>pbuf: pbuf where option data is contained</li>
+<li>option_value_offset: offset in pbuf where option data begins</li>
+</ul>
+<p>A nice way to get the option contents is <a class="el" href="group__pbuf.html#gad0357ae0be17b2aacd0c301cdc86fc39">pbuf_get_contiguous()</a>: u8_t buf[32]; u8_t <em>ptr = (u8_t</em>)pbuf_get_contiguous(p, buf, sizeof(buf), LWIP_MIN(option_len, sizeof(buf)), offset); </p>
+
+</div>
+</div>
+<a id="ga2b76f127325fd5ca8b80077a4b6160b1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2b76f127325fd5ca8b80077a4b6160b1">&#9670;&nbsp;</a></span>LWIP_HOOK_ETHARP_GET_GW</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_ETHARP_GET_GW</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__lwip__opts__hooks.html#ga2b76f127325fd5ca8b80077a4b6160b1">LWIP_HOOK_ETHARP_GET_GW(netif, dest)</a>: Called from <a class="el" href="etharp_8c.html#a19258c75a3778b6ed0c82f63a419502d">etharp_output()</a> (IPv4) Signature:</p><div class="fragment"><div class="line"><span class="keyword">const</span> <a class="code" href="structip4__addr.html">ip4_addr_t</a> *my_hook(<span class="keyword">struct</span> <a class="code" href="structnetif.html">netif</a> *<a class="code" href="structnetif.html">netif</a>, <span class="keyword">const</span> <a class="code" href="structip4__addr.html">ip4_addr_t</a> *dest);</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>netif: the netif used for sending</li>
+<li>dest: the destination IPv4 address Return values:</li>
+<li>the IPv4 address of the gateway to handle the specified destination IPv4 address</li>
+<li>NULL, in which case the netif's default gateway is used</li>
+</ul>
+<p>The returned address MUST be directly reachable on the specified netif! This function is meant to implement advanced IPv4 routing together with <a class="el" href="group__lwip__opts__hooks.html#ga5d1061ad722a73012a28dbaf0f169b70">LWIP_HOOK_IP4_ROUTE()</a>. The actual routing/gateway table implementation is not part of lwIP but can e.g. be hidden in the netif's state argument. </p>
+
+</div>
+</div>
+<a id="ga11ac9d637cb6afc0a32e8da7f51d0c0d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga11ac9d637cb6afc0a32e8da7f51d0c0d">&#9670;&nbsp;</a></span>LWIP_HOOK_FILENAME</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_FILENAME&#160;&#160;&#160;&quot;path/to/my/lwip_hooks.h&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_HOOK_FILENAME: Custom filename to #include in files that provide hooks. Declare your hook function prototypes in there, you may also #include all headers providing data types that are need in this file. </p>
+
+</div>
+</div>
+<a id="gaed848a98dbb5c8856a27e379986ea70d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaed848a98dbb5c8856a27e379986ea70d">&#9670;&nbsp;</a></span>LWIP_HOOK_IP4_CANFORWARD</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_IP4_CANFORWARD</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__lwip__opts__hooks.html#gaed848a98dbb5c8856a27e379986ea70d">LWIP_HOOK_IP4_CANFORWARD(src, dest)</a>: Check if an IPv4 can be forwarded - called from: <a class="el" href="ip4_8c.html#aff1f784c9f05f3d79cc1a921d840501b">ip4_input()</a> -&gt; ip4_forward() -&gt; ip4_canforward() (IPv4)</p><ul>
+<li>source address is available via <a class="el" href="ip_8h.html#ad2a62f96b9431a79f0258dc13058b160">ip4_current_src_addr()</a></li>
+<li>calling an output function in this context (e.g. multicast router) is allowed Signature:<div class="fragment"><div class="line"><span class="keywordtype">int</span> my_hook(<span class="keyword">struct</span> <a class="code" href="structpbuf.html">pbuf</a> *p, u32_t dest_addr_hostorder);</div></div><!-- fragment --> Arguments:</li>
+<li>p: packet to forward</li>
+<li>dest: destination IPv4 address Returns values:</li>
+<li>1: forward</li>
+<li>0: don't forward</li>
+<li>-1: no decision. In that case, ip4_canforward() continues as normal. </li>
+</ul>
+
+</div>
+</div>
+<a id="ga9124237c28e2f18f3b28d5be09e9ccb6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9124237c28e2f18f3b28d5be09e9ccb6">&#9670;&nbsp;</a></span>LWIP_HOOK_IP4_INPUT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_IP4_INPUT</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structpbuf.html">pbuf</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">input_netif&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__lwip__opts__hooks.html#ga9124237c28e2f18f3b28d5be09e9ccb6">LWIP_HOOK_IP4_INPUT(pbuf, input_netif)</a>: Called from <a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip_input()</a> (IPv4) Signature:</p><div class="fragment"><div class="line"><span class="keywordtype">int</span> my_hook(<span class="keyword">struct</span> <a class="code" href="structpbuf.html">pbuf</a> *<a class="code" href="structpbuf.html">pbuf</a>, <span class="keyword">struct</span> <a class="code" href="structnetif.html">netif</a> *input_netif);</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>pbuf: received struct pbuf passed to <a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip_input()</a></li>
+<li>input_netif: struct netif on which the packet has been received Return values:</li>
+<li>0: Hook has not consumed the packet, packet is processed as normal</li>
+<li>!= 0: Hook has consumed the packet. If the hook consumed the packet, 'pbuf' is in the responsibility of the hook (i.e. free it when done). </li>
+</ul>
+
+</div>
+</div>
+<a id="ga5d1061ad722a73012a28dbaf0f169b70"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5d1061ad722a73012a28dbaf0f169b70">&#9670;&nbsp;</a></span>LWIP_HOOK_IP4_ROUTE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_IP4_ROUTE</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__lwip__opts__hooks.html#ga5d1061ad722a73012a28dbaf0f169b70">LWIP_HOOK_IP4_ROUTE(dest)</a>: Called from <a class="el" href="group__ip.html#ga0fa3afc2c00aea346889b476650adee3">ip_route()</a> (IPv4) Signature:</p><div class="fragment"><div class="line"><span class="keyword">struct </span><a class="code" href="structnetif.html">netif</a> *my_hook(<span class="keyword">const</span> <a class="code" href="structip4__addr.html">ip4_addr_t</a> *dest);</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>dest: destination IPv4 address Returns values:</li>
+<li>the destination netif</li>
+<li>NULL if no destination netif is found. In that case, <a class="el" href="group__ip.html#ga0fa3afc2c00aea346889b476650adee3">ip_route()</a> continues as normal. </li>
+</ul>
+
+</div>
+</div>
+<a id="gaa410d9cbe1d4fa4c8a7f49af7b501024"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa410d9cbe1d4fa4c8a7f49af7b501024">&#9670;&nbsp;</a></span>LWIP_HOOK_IP4_ROUTE_SRC</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_IP4_ROUTE_SRC</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__lwip__opts__hooks.html#gaa410d9cbe1d4fa4c8a7f49af7b501024">LWIP_HOOK_IP4_ROUTE_SRC(src, dest)</a>: Source-based routing for IPv4 - called from <a class="el" href="group__ip.html#ga0fa3afc2c00aea346889b476650adee3">ip_route()</a> (IPv4) Signature:</p><div class="fragment"><div class="line"><span class="keyword">struct </span><a class="code" href="structnetif.html">netif</a> *my_hook(<span class="keyword">const</span> <a class="code" href="structip4__addr.html">ip4_addr_t</a> *src, <span class="keyword">const</span> <a class="code" href="structip4__addr.html">ip4_addr_t</a> *dest);</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>src: local/source IPv4 address</li>
+<li>dest: destination IPv4 address Returns values:</li>
+<li>the destination netif</li>
+<li>NULL if no destination netif is found. In that case, <a class="el" href="group__ip.html#ga0fa3afc2c00aea346889b476650adee3">ip_route()</a> continues as normal. </li>
+</ul>
+
+</div>
+</div>
+<a id="gaccbdd3d0250f7176dcd799ca06007f20"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaccbdd3d0250f7176dcd799ca06007f20">&#9670;&nbsp;</a></span>LWIP_HOOK_IP6_INPUT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_IP6_INPUT</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structpbuf.html">pbuf</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">input_netif&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__lwip__opts__hooks.html#gaccbdd3d0250f7176dcd799ca06007f20">LWIP_HOOK_IP6_INPUT(pbuf, input_netif)</a>: Called from <a class="el" href="ip6_8c.html#a6bbbae5ea37a82c746dba2feb1abd094">ip6_input()</a> (IPv6) Signature:</p><div class="fragment"><div class="line"><span class="keywordtype">int</span> my_hook(<span class="keyword">struct</span> <a class="code" href="structpbuf.html">pbuf</a> *<a class="code" href="structpbuf.html">pbuf</a>, <span class="keyword">struct</span> <a class="code" href="structnetif.html">netif</a> *input_netif);</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>pbuf: received struct pbuf passed to <a class="el" href="ip6_8c.html#a6bbbae5ea37a82c746dba2feb1abd094">ip6_input()</a></li>
+<li>input_netif: struct netif on which the packet has been received Return values:</li>
+<li>0: Hook has not consumed the packet, packet is processed as normal</li>
+<li>!= 0: Hook has consumed the packet. If the hook consumed the packet, 'pbuf' is in the responsibility of the hook (i.e. free it when done). </li>
+</ul>
+
+</div>
+</div>
+<a id="ga8245a4bc7ffb172e3bf32276f9d126ce"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8245a4bc7ffb172e3bf32276f9d126ce">&#9670;&nbsp;</a></span>LWIP_HOOK_IP6_ROUTE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_IP6_ROUTE</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__lwip__opts__hooks.html#ga8245a4bc7ffb172e3bf32276f9d126ce">LWIP_HOOK_IP6_ROUTE(src, dest)</a>: Called from <a class="el" href="group__ip.html#ga0fa3afc2c00aea346889b476650adee3">ip_route()</a> (IPv6) Signature:</p><div class="fragment"><div class="line"><span class="keyword">struct </span><a class="code" href="structnetif.html">netif</a> *my_hook(<span class="keyword">const</span> <a class="code" href="structip6__addr.html">ip6_addr_t</a> *dest, <span class="keyword">const</span> <a class="code" href="structip6__addr.html">ip6_addr_t</a> *src);</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>src: source IPv6 address</li>
+<li>dest: destination IPv6 address Return values:</li>
+<li>the destination netif</li>
+<li>NULL if no destination netif is found. In that case, <a class="el" href="ip6_8c.html#a1153bd9e8c45847282105ab6379e6e70">ip6_route()</a> continues as normal. </li>
+</ul>
+
+</div>
+</div>
+<a id="ga13e90672158221b40f8b12bf9d8b721f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga13e90672158221b40f8b12bf9d8b721f">&#9670;&nbsp;</a></span>LWIP_HOOK_MEMP_AVAILABLE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_MEMP_AVAILABLE</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">memp_t_type</td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__lwip__opts__hooks.html#ga13e90672158221b40f8b12bf9d8b721f">LWIP_HOOK_MEMP_AVAILABLE(memp_t_type)</a>: Called from <a class="el" href="memp_8c.html#aecd94926b7c2a0e23ae195f4ae97581f">memp_free()</a> when a memp pool was empty and an item is now available Signature:</p><div class="fragment"><div class="line"><span class="keywordtype">void</span> my_hook(<a class="code" href="memp_8h.html#a85a164b1f7764951cc685ea525114e57">memp_t</a> type);</div></div><!-- fragment --> 
+</div>
+</div>
+<a id="ga287544c3d74bc2a2d645bddbbc4fbdd0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga287544c3d74bc2a2d645bddbbc4fbdd0">&#9670;&nbsp;</a></span>LWIP_HOOK_ND6_GET_GW</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_ND6_GET_GW</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__lwip__opts__hooks.html#ga287544c3d74bc2a2d645bddbbc4fbdd0">LWIP_HOOK_ND6_GET_GW(netif, dest)</a>: Called from nd6_get_next_hop_entry() (IPv6) Signature:</p><div class="fragment"><div class="line"><span class="keyword">const</span> <a class="code" href="structip6__addr.html">ip6_addr_t</a> *my_hook(<span class="keyword">struct</span> <a class="code" href="structnetif.html">netif</a> *<a class="code" href="structnetif.html">netif</a>, <span class="keyword">const</span> <a class="code" href="structip6__addr.html">ip6_addr_t</a> *dest);</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>netif: the netif used for sending</li>
+<li>dest: the destination IPv6 address Return values:</li>
+<li>the IPv6 address of the next hop to handle the specified destination IPv6 address</li>
+<li>NULL, in which case a NDP-discovered router is used instead</li>
+</ul>
+<p>The returned address MUST be directly reachable on the specified netif! This function is meant to implement advanced IPv6 routing together with <a class="el" href="group__lwip__opts__hooks.html#ga8245a4bc7ffb172e3bf32276f9d126ce">LWIP_HOOK_IP6_ROUTE()</a>. The actual routing/gateway table implementation is not part of lwIP but can e.g. be hidden in the netif's state argument. </p>
+
+</div>
+</div>
+<a id="gae35e4b7374868dc748b12dedb8f807e5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae35e4b7374868dc748b12dedb8f807e5">&#9670;&nbsp;</a></span>LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">name, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addrtype, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">err&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__lwip__opts__hooks.html#gae35e4b7374868dc748b12dedb8f807e5">LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE(name, addr, addrtype, err)</a> Called from netconn APIs (not usable with callback apps) allowing an external DNS resolver (which uses sequential API) to handle the query. Signature:</p><div class="fragment"><div class="line"><span class="keywordtype">int</span> my_hook(<span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structnetif.html#a32fca6ffd28bb9af3f891a378827a67e">name</a>, <a class="code" href="structip__addr.html">ip_addr_t</a> *addr, u8_t addrtype, <a class="code" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> *err)</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>name: hostname to resolve</li>
+<li>addr: output host address</li>
+<li>addrtype: type of address to query</li>
+<li>err: output error Return values:</li>
+<li>0: Hook has not consumed hostname query, query continues into DNS module</li>
+<li>!= 0: Hook has consumed the query</li>
+</ul>
+<p>err must also be checked to determine if the hook consumed the query, but the query failed </p>
+
+</div>
+</div>
+<a id="gabdaeb09ac9f441934e21a087544a1af1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabdaeb09ac9f441934e21a087544a1af1">&#9670;&nbsp;</a></span>LWIP_HOOK_SOCKETS_GETSOCKOPT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_SOCKETS_GETSOCKOPT</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">sock, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">level, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">optname, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">optval, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">optlen, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">err&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__lwip__opts__hooks.html#gabdaeb09ac9f441934e21a087544a1af1">LWIP_HOOK_SOCKETS_GETSOCKOPT(s, sock, level, optname, optval, optlen, err)</a> Called from socket API to implement <a class="el" href="group__socket.html#gad2de02b35dbbf2334d1befb137ede821">getsockopt()</a> for options not provided by lwIP. Core lock is held when this hook is called. Signature:</p><div class="fragment"><div class="line"><span class="keywordtype">int</span> my_hook(<span class="keywordtype">int</span> s, <span class="keyword">struct</span> <a class="code" href="structlwip__sock.html">lwip_sock</a> *sock, <span class="keywordtype">int</span> level, <span class="keywordtype">int</span> optname, <span class="keywordtype">void</span> *optval, socklen_t *optlen, <span class="keywordtype">int</span> *err)</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>s: socket file descriptor</li>
+<li>sock: internal socket descriptor (see <a class="el" href="sockets__priv_8h.html">lwip/priv/sockets_priv.h</a>)</li>
+<li>level: protocol level at which the option resides</li>
+<li>optname: option to get</li>
+<li>optval: value to get</li>
+<li>optlen: size of optval</li>
+<li>err: output error Return values:</li>
+<li>0: Hook has not consumed the option, code continues as normal (to internal options)</li>
+<li>!= 0: Hook has consumed the option, 'err' is returned </li>
+</ul>
+
+</div>
+</div>
+<a id="ga14ea9210c09da4dd33bc85bd8a01b48a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga14ea9210c09da4dd33bc85bd8a01b48a">&#9670;&nbsp;</a></span>LWIP_HOOK_SOCKETS_SETSOCKOPT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_SOCKETS_SETSOCKOPT</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">sock, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">level, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">optname, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">optval, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">optlen, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">err&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__lwip__opts__hooks.html#ga14ea9210c09da4dd33bc85bd8a01b48a">LWIP_HOOK_SOCKETS_SETSOCKOPT(s, sock, level, optname, optval, optlen, err)</a> Called from socket API to implement <a class="el" href="group__socket.html#ga115d74cd1953e7bafc2e34157c697df1">setsockopt()</a> for options not provided by lwIP. Core lock is held when this hook is called. Signature:</p><div class="fragment"><div class="line"><span class="keywordtype">int</span> my_hook(<span class="keywordtype">int</span> s, <span class="keyword">struct</span> <a class="code" href="structlwip__sock.html">lwip_sock</a> *sock, <span class="keywordtype">int</span> level, <span class="keywordtype">int</span> optname, <span class="keyword">const</span> <span class="keywordtype">void</span> *optval, socklen_t optlen, <span class="keywordtype">int</span> *err)</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>s: socket file descriptor</li>
+<li>sock: internal socket descriptor (see <a class="el" href="sockets__priv_8h.html">lwip/priv/sockets_priv.h</a>)</li>
+<li>level: protocol level at which the option resides</li>
+<li>optname: option to set</li>
+<li>optval: value to set</li>
+<li>optlen: size of optval</li>
+<li>err: output error Return values:</li>
+<li>0: Hook has not consumed the option, code continues as normal (to internal options)</li>
+<li>!= 0: Hook has consumed the option, 'err' is returned </li>
+</ul>
+
+</div>
+</div>
+<a id="gabed8b1cda4aba2d108fa62cdd74895a2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabed8b1cda4aba2d108fa62cdd74895a2">&#9670;&nbsp;</a></span>LWIP_HOOK_TCP_INPACKET_PCB</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_TCP_INPACKET_PCB</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">pcb, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">hdr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">optlen, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">opt1len, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">opt2, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">p&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_HOOK_TCP_INPACKET_PCB: Hook for intercepting incoming packets before they are passed to a pcb. This allows updating some state or even dropping a packet. Signature:</p><div class="fragment"><div class="line"><a class="code" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> my_hook_tcp_inpkt(<span class="keyword">struct</span> <a class="code" href="structtcp__pcb.html">tcp_pcb</a> *pcb, <span class="keyword">struct</span> tcp_hdr *hdr, u16_t optlen, u16_t opt1len, u8_t *opt2, <span class="keyword">struct</span> <a class="code" href="structpbuf.html">pbuf</a> *p);</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>pcb: <a class="el" href="structtcp__pcb.html">tcp_pcb</a> selected for input of this packet (ATTENTION: this may be struct <a class="el" href="structtcp__pcb__listen.html">tcp_pcb_listen</a> if pcb-&gt;state == LISTEN)</li>
+<li>hdr: pointer to tcp header (ATTENTION: tcp options may not be in one piece!)</li>
+<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>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>
+<p>ATTENTION: don't call any tcp api functions that might change tcp state (pcb state or any pcb lists) from this callback! </p>
+
+</div>
+</div>
+<a id="ga078d203053911cf3af178392700386a4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga078d203053911cf3af178392700386a4">&#9670;&nbsp;</a></span>LWIP_HOOK_TCP_ISN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_TCP_ISN</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">local_ip, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">local_port, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">remote_ip, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">remote_port&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </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" href="structip__addr.html">ip_addr_t</a>* local_ip, u16_t local_port, <span class="keyword">const</span> <a class="code" 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>
+<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>
+<li>the 32-bit Initial Sequence Number to use for the new TCP connection. </li>
+</ul>
+
+</div>
+</div>
+<a id="ga0ef31b749307b63c06633645d4de21f0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0ef31b749307b63c06633645d4de21f0">&#9670;&nbsp;</a></span>LWIP_HOOK_TCP_OUT_ADD_TCPOPTS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_TCP_OUT_ADD_TCPOPTS</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">p, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">hdr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">pcb, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">opts&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_HOOK_TCP_OUT_ADD_TCPOPTS: Hook for adding custom options to outgoing tcp segments. Space for these custom options has to be reserved via LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH. Signature:</p><div class="fragment"><div class="line">u32_t *my_hook_tcp_out_add_tcpopts(<span class="keyword">struct</span> <a class="code" href="structpbuf.html">pbuf</a> *p, <span class="keyword">struct</span> tcp_hdr *hdr, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u32_t *opts);</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>p: output packet, p-&gt;payload pointing to tcp header, data follows</li>
+<li>hdr: tcp header</li>
+<li>pcb: <a class="el" href="structtcp__pcb.html">tcp_pcb</a> that transmits (ATTENTION: this may be NULL or struct <a class="el" href="structtcp__pcb__listen.html">tcp_pcb_listen</a> if pcb-&gt;state == LISTEN)</li>
+<li>opts: pointer where to add the custom options (there may already be options between the header and these) Return value:</li>
+<li>pointer pointing directly after the inserted options</li>
+</ul>
+<p>ATTENTION: don't call any tcp api functions that might change tcp state (pcb state or any pcb lists) from this callback! </p>
+
+</div>
+</div>
+<a id="ga31c0694abe4eedf3ff039b7073c2293f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga31c0694abe4eedf3ff039b7073c2293f">&#9670;&nbsp;</a></span>LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">pcb, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">internal_len&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH: Hook for increasing the size of the options allocated with a tcp header. Together with LWIP_HOOK_TCP_OUT_ADD_TCPOPTS, this can be used to add custom options to outgoing tcp segments. Signature:</p><div class="fragment"><div class="line">u8_t my_hook_tcp_out_tcpopt_length(<span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t internal_option_length);</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>pcb: <a class="el" href="structtcp__pcb.html">tcp_pcb</a> that transmits (ATTENTION: this may be NULL or struct <a class="el" href="structtcp__pcb__listen.html">tcp_pcb_listen</a> if pcb-&gt;state == LISTEN)</li>
+<li>internal_option_length: tcp option length used by the stack internally Return value:</li>
+<li>a number of bytes to allocate for tcp options (internal_option_length &lt;= ret &lt;= 40)</li>
+</ul>
+<p>ATTENTION: don't call any tcp api functions that might change tcp state (pcb state or any pcb lists) from this callback! </p>
+
+</div>
+</div>
+<a id="ga6cc92f5101dd7a0420e18e1f2101abf4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6cc92f5101dd7a0420e18e1f2101abf4">&#9670;&nbsp;</a></span>LWIP_HOOK_UNKNOWN_ETH_PROTOCOL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_UNKNOWN_ETH_PROTOCOL</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structpbuf.html">pbuf</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__lwip__opts__hooks.html#ga6cc92f5101dd7a0420e18e1f2101abf4">LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(pbuf, netif)</a>: Called from <a class="el" href="group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff">ethernet_input()</a> when an unknown eth type is encountered. Signature:</p><div class="fragment"><div class="line"><a class="code" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> my_hook(<span class="keyword">struct</span> <a class="code" href="structpbuf.html">pbuf</a>* <a class="code" href="structpbuf.html">pbuf</a>, <span class="keyword">struct</span> <a class="code" href="structnetif.html">netif</a>* <a class="code" href="structnetif.html">netif</a>);</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>p: rx packet with unknown eth type</li>
+<li>netif: netif on which the packet has been received Return values:</li>
+<li>ERR_OK if packet is accepted (hook function now owns the pbuf)</li>
+<li>any error code otherwise (pbuf is freed)</li>
+</ul>
+<p>Payload points to ethernet header! </p>
+
+</div>
+</div>
+<a id="ga2f020543772368f8f4355f50f24c86a9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2f020543772368f8f4355f50f24c86a9">&#9670;&nbsp;</a></span>LWIP_HOOK_VLAN_CHECK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_VLAN_CHECK</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structeth__hdr.html">eth_hdr</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">vlan_hdr&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__lwip__opts__hooks.html#ga2f020543772368f8f4355f50f24c86a9">LWIP_HOOK_VLAN_CHECK(netif, eth_hdr, vlan_hdr)</a>: Called from <a class="el" href="group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff">ethernet_input()</a> if VLAN support is enabled Signature:</p><div class="fragment"><div class="line"><span class="keywordtype">int</span> my_hook(<span class="keyword">struct</span> <a class="code" href="structnetif.html">netif</a> *<a class="code" href="structnetif.html">netif</a>, <span class="keyword">struct</span> <a class="code" href="structeth__hdr.html">eth_hdr</a> *<a class="code" href="structeth__hdr.html">eth_hdr</a>, <span class="keyword">struct</span> <a class="code" href="structeth__vlan__hdr.html">eth_vlan_hdr</a> *vlan_hdr);</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>netif: struct netif on which the packet has been received</li>
+<li><a class="el" href="structeth__hdr.html">eth_hdr</a>: struct <a class="el" href="structeth__hdr.html">eth_hdr</a> of the packet</li>
+<li>vlan_hdr: struct <a class="el" href="structeth__vlan__hdr.html">eth_vlan_hdr</a> of the packet Return values:</li>
+<li>0: Packet must be dropped.</li>
+<li>!= 0: Packet must be accepted. </li>
+</ul>
+
+</div>
+</div>
+<a id="ga2b6e450b4934b95df9b9a9d2b9a4d57e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2b6e450b4934b95df9b9a9d2b9a4d57e">&#9670;&nbsp;</a></span>LWIP_HOOK_VLAN_SET</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HOOK_VLAN_SET</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">p, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dst, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">eth_type&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </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" href="structnetif.html">netif</a>* <a class="code" href="structnetif.html">netif</a>, <span class="keyword">struct</span> <a class="code" href="structpbuf.html">pbuf</a>* <a class="code" href="structpbuf.html">pbuf</a>, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structeth__addr.html">eth_addr</a>* src, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structeth__addr.html">eth_addr</a>* dst, u16_t eth_type);\n</div></div><!-- fragment --><p> Arguments:</p><ul>
+<li>netif: struct netif that the packet will be sent through</li>
+<li>p: struct pbuf packet to be sent</li>
+<li>src: source eth address</li>
+<li>dst: destination eth address</li>
+<li>eth_type: ethernet type to packet to be sent<br />
+</li>
+</ul>
+<p>Return values:</p><ul>
+<li>&lt;0: Packet shall not contain VLAN header.</li>
+<li>0 &lt;= return value &lt;= 0xFFFF: Packet shall contain VLAN header. Return value is prio_vid in host byte order. </li>
+</ul>
+
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__hooks.js b/doc/doxygen/output/html/group__lwip__opts__hooks.js
new file mode 100644
index 0000000..1f27d1f
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__hooks.js
@@ -0,0 +1,26 @@
+var group__lwip__opts__hooks =
+[
+    [ "LWIP_HOOK_DHCP6_APPEND_OPTIONS", "group__lwip__opts__hooks.html#ga4068b3313e32f711ba016215fc2c886a", null ],
+    [ "LWIP_HOOK_DHCP_APPEND_OPTIONS", "group__lwip__opts__hooks.html#ga40e6c9aba06e66e5df1b4ca18329f9b4", null ],
+    [ "LWIP_HOOK_DHCP_PARSE_OPTION", "group__lwip__opts__hooks.html#gafbbbc574863c0f88988936bd1434f2d2", null ],
+    [ "LWIP_HOOK_ETHARP_GET_GW", "group__lwip__opts__hooks.html#ga2b76f127325fd5ca8b80077a4b6160b1", null ],
+    [ "LWIP_HOOK_FILENAME", "group__lwip__opts__hooks.html#ga11ac9d637cb6afc0a32e8da7f51d0c0d", null ],
+    [ "LWIP_HOOK_IP4_CANFORWARD", "group__lwip__opts__hooks.html#gaed848a98dbb5c8856a27e379986ea70d", null ],
+    [ "LWIP_HOOK_IP4_INPUT", "group__lwip__opts__hooks.html#ga9124237c28e2f18f3b28d5be09e9ccb6", null ],
+    [ "LWIP_HOOK_IP4_ROUTE", "group__lwip__opts__hooks.html#ga5d1061ad722a73012a28dbaf0f169b70", null ],
+    [ "LWIP_HOOK_IP4_ROUTE_SRC", "group__lwip__opts__hooks.html#gaa410d9cbe1d4fa4c8a7f49af7b501024", null ],
+    [ "LWIP_HOOK_IP6_INPUT", "group__lwip__opts__hooks.html#gaccbdd3d0250f7176dcd799ca06007f20", null ],
+    [ "LWIP_HOOK_IP6_ROUTE", "group__lwip__opts__hooks.html#ga8245a4bc7ffb172e3bf32276f9d126ce", null ],
+    [ "LWIP_HOOK_MEMP_AVAILABLE", "group__lwip__opts__hooks.html#ga13e90672158221b40f8b12bf9d8b721f", null ],
+    [ "LWIP_HOOK_ND6_GET_GW", "group__lwip__opts__hooks.html#ga287544c3d74bc2a2d645bddbbc4fbdd0", null ],
+    [ "LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE", "group__lwip__opts__hooks.html#gae35e4b7374868dc748b12dedb8f807e5", null ],
+    [ "LWIP_HOOK_SOCKETS_GETSOCKOPT", "group__lwip__opts__hooks.html#gabdaeb09ac9f441934e21a087544a1af1", null ],
+    [ "LWIP_HOOK_SOCKETS_SETSOCKOPT", "group__lwip__opts__hooks.html#ga14ea9210c09da4dd33bc85bd8a01b48a", null ],
+    [ "LWIP_HOOK_TCP_INPACKET_PCB", "group__lwip__opts__hooks.html#gabed8b1cda4aba2d108fa62cdd74895a2", null ],
+    [ "LWIP_HOOK_TCP_ISN", "group__lwip__opts__hooks.html#ga078d203053911cf3af178392700386a4", null ],
+    [ "LWIP_HOOK_TCP_OUT_ADD_TCPOPTS", "group__lwip__opts__hooks.html#ga0ef31b749307b63c06633645d4de21f0", null ],
+    [ "LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH", "group__lwip__opts__hooks.html#ga31c0694abe4eedf3ff039b7073c2293f", null ],
+    [ "LWIP_HOOK_UNKNOWN_ETH_PROTOCOL", "group__lwip__opts__hooks.html#ga6cc92f5101dd7a0420e18e1f2101abf4", null ],
+    [ "LWIP_HOOK_VLAN_CHECK", "group__lwip__opts__hooks.html#ga2f020543772368f8f4355f50f24c86a9", null ],
+    [ "LWIP_HOOK_VLAN_SET", "group__lwip__opts__hooks.html#ga2b6e450b4934b95df9b9a9d2b9a4d57e", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__icmp.html b/doc/doxygen/output/html/group__lwip__opts__icmp.html
new file mode 100644
index 0000000..3c4e4f1
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__icmp.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ICMP</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__icmp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">ICMP<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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gae4d45345c3ab8e5a355fda1d8d24fca6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__icmp.html#gae4d45345c3ab8e5a355fda1d8d24fca6">LWIP_ICMP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gae4d45345c3ab8e5a355fda1d8d24fca6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae1533f2bc39a5843989909555f6ce0cf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__icmp.html#gae1533f2bc39a5843989909555f6ce0cf">ICMP_TTL</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411">IP_DEFAULT_TTL</a></td></tr>
+<tr class="separator:gae1533f2bc39a5843989909555f6ce0cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8088cb56d1a84fe554b11bc15d84b2b9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__icmp.html#ga8088cb56d1a84fe554b11bc15d84b2b9">LWIP_BROADCAST_PING</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga8088cb56d1a84fe554b11bc15d84b2b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf77baf0a83b04312eab4c006ef229661"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__icmp.html#gaf77baf0a83b04312eab4c006ef229661">LWIP_MULTICAST_PING</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaf77baf0a83b04312eab4c006ef229661"><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="gae1533f2bc39a5843989909555f6ce0cf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae1533f2bc39a5843989909555f6ce0cf">&#9670;&nbsp;</a></span>ICMP_TTL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ICMP_TTL&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411">IP_DEFAULT_TTL</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ICMP_TTL: Default value for Time-To-Live used by ICMP packets. </p>
+
+</div>
+</div>
+<a id="ga8088cb56d1a84fe554b11bc15d84b2b9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8088cb56d1a84fe554b11bc15d84b2b9">&#9670;&nbsp;</a></span>LWIP_BROADCAST_PING</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_BROADCAST_PING&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_BROADCAST_PING==1: respond to broadcast pings (default is unicast only) </p>
+
+</div>
+</div>
+<a id="gae4d45345c3ab8e5a355fda1d8d24fca6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae4d45345c3ab8e5a355fda1d8d24fca6">&#9670;&nbsp;</a></span>LWIP_ICMP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ICMP&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ICMP==1: Enable ICMP module inside the IP stack. Be careful, disable that make your product non-compliant to RFC1122 </p>
+
+</div>
+</div>
+<a id="gaf77baf0a83b04312eab4c006ef229661"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf77baf0a83b04312eab4c006ef229661">&#9670;&nbsp;</a></span>LWIP_MULTICAST_PING</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_MULTICAST_PING&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_MULTICAST_PING==1: respond to multicast pings (default is unicast only) </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__icmp.js b/doc/doxygen/output/html/group__lwip__opts__icmp.js
new file mode 100644
index 0000000..f44612d
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__icmp.js
@@ -0,0 +1,7 @@
+var group__lwip__opts__icmp =
+[
+    [ "ICMP_TTL", "group__lwip__opts__icmp.html#gae1533f2bc39a5843989909555f6ce0cf", null ],
+    [ "LWIP_BROADCAST_PING", "group__lwip__opts__icmp.html#ga8088cb56d1a84fe554b11bc15d84b2b9", null ],
+    [ "LWIP_ICMP", "group__lwip__opts__icmp.html#gae4d45345c3ab8e5a355fda1d8d24fca6", null ],
+    [ "LWIP_MULTICAST_PING", "group__lwip__opts__icmp.html#gaf77baf0a83b04312eab4c006ef229661", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__icmp6.html b/doc/doxygen/output/html/group__lwip__opts__icmp6.html
new file mode 100644
index 0000000..1028701
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__icmp6.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ICMP6</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__icmp6.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">ICMP6<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__ipv6.html">IPv6</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga65ac8bcbad242cba3a2b557e1574b21f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__icmp6.html#ga65ac8bcbad242cba3a2b557e1574b21f">LWIP_ICMP6</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a></td></tr>
+<tr class="separator:ga65ac8bcbad242cba3a2b557e1574b21f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa88c55e37e5d7b865b91a9399313bbbf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__icmp6.html#gaa88c55e37e5d7b865b91a9399313bbbf">LWIP_ICMP6_DATASIZE</a>&#160;&#160;&#160;8</td></tr>
+<tr class="separator:gaa88c55e37e5d7b865b91a9399313bbbf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga82193577b4045e1ac1533c4341a2bd79"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__icmp6.html#ga82193577b4045e1ac1533c4341a2bd79">LWIP_ICMP6_HL</a>&#160;&#160;&#160;255</td></tr>
+<tr class="separator:ga82193577b4045e1ac1533c4341a2bd79"><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="ga65ac8bcbad242cba3a2b557e1574b21f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga65ac8bcbad242cba3a2b557e1574b21f">&#9670;&nbsp;</a></span>LWIP_ICMP6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ICMP6&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ICMP6==1: Enable ICMPv6 (mandatory per RFC) </p>
+
+</div>
+</div>
+<a id="gaa88c55e37e5d7b865b91a9399313bbbf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa88c55e37e5d7b865b91a9399313bbbf">&#9670;&nbsp;</a></span>LWIP_ICMP6_DATASIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ICMP6_DATASIZE&#160;&#160;&#160;8</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ICMP6_DATASIZE: bytes from original packet to send back in ICMPv6 error messages. </p>
+
+</div>
+</div>
+<a id="ga82193577b4045e1ac1533c4341a2bd79"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga82193577b4045e1ac1533c4341a2bd79">&#9670;&nbsp;</a></span>LWIP_ICMP6_HL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ICMP6_HL&#160;&#160;&#160;255</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ICMP6_HL: default hop limit for ICMPv6 messages </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__icmp6.js b/doc/doxygen/output/html/group__lwip__opts__icmp6.js
new file mode 100644
index 0000000..b805dbc
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__icmp6.js
@@ -0,0 +1,6 @@
+var group__lwip__opts__icmp6 =
+[
+    [ "LWIP_ICMP6", "group__lwip__opts__icmp6.html#ga65ac8bcbad242cba3a2b557e1574b21f", null ],
+    [ "LWIP_ICMP6_DATASIZE", "group__lwip__opts__icmp6.html#gaa88c55e37e5d7b865b91a9399313bbbf", null ],
+    [ "LWIP_ICMP6_HL", "group__lwip__opts__icmp6.html#ga82193577b4045e1ac1533c4341a2bd79", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__igmp.html b/doc/doxygen/output/html/group__lwip__opts__igmp.html
new file mode 100644
index 0000000..9a3e9f0
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__igmp.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: IGMP</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__igmp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">IGMP<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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gadaf25915ae1fd69c0943ef68cbb38923"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923">LWIP_IGMP</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gadaf25915ae1fd69c0943ef68cbb38923"><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="gadaf25915ae1fd69c0943ef68cbb38923"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadaf25915ae1fd69c0943ef68cbb38923">&#9670;&nbsp;</a></span>LWIP_IGMP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IGMP&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_IGMP==1: Turn on IGMP module. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__igmp.js b/doc/doxygen/output/html/group__lwip__opts__igmp.js
new file mode 100644
index 0000000..e541101
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__igmp.js
@@ -0,0 +1,4 @@
+var group__lwip__opts__igmp =
+[
+    [ "LWIP_IGMP", "group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__infrastructure.html b/doc/doxygen/output/html/group__lwip__opts__infrastructure.html
new file mode 100644
index 0000000..e917155
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__infrastructure.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Infrastructure</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__infrastructure.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">Infrastructure<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__lwip__opts__nosys"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nosys.html">NO_SYS</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__timers"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__timers.html">Timers</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__memcpy"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memcpy.html">memcpy</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__lock"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__lock.html">Core locking and MPU</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__mem"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html">Heap and memory pools</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__memp"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html">Internal memory pools</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__mib2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mib2.html">SNMP MIB2 callbacks</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__multicast"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__multicast.html">Multicast</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__thread"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html">Threading</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__checksum"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html">Checksum</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__hooks"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html">Hooks</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>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__infrastructure.js b/doc/doxygen/output/html/group__lwip__opts__infrastructure.js
new file mode 100644
index 0000000..96c0eb6
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__infrastructure.js
@@ -0,0 +1,14 @@
+var group__lwip__opts__infrastructure =
+[
+    [ "NO_SYS", "group__lwip__opts__nosys.html", "group__lwip__opts__nosys" ],
+    [ "Timers", "group__lwip__opts__timers.html", "group__lwip__opts__timers" ],
+    [ "memcpy", "group__lwip__opts__memcpy.html", "group__lwip__opts__memcpy" ],
+    [ "Core locking and MPU", "group__lwip__opts__lock.html", "group__lwip__opts__lock" ],
+    [ "Heap and memory pools", "group__lwip__opts__mem.html", "group__lwip__opts__mem" ],
+    [ "Internal memory pools", "group__lwip__opts__memp.html", "group__lwip__opts__memp" ],
+    [ "SNMP MIB2 callbacks", "group__lwip__opts__mib2.html", "group__lwip__opts__mib2" ],
+    [ "Multicast", "group__lwip__opts__multicast.html", "group__lwip__opts__multicast" ],
+    [ "Threading", "group__lwip__opts__thread.html", "group__lwip__opts__thread" ],
+    [ "Checksum", "group__lwip__opts__checksum.html", "group__lwip__opts__checksum" ],
+    [ "Hooks", "group__lwip__opts__hooks.html", "group__lwip__opts__hooks" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__ipv4.html b/doc/doxygen/output/html/group__lwip__opts__ipv4.html
new file mode 100644
index 0000000..8052405
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__ipv4.html
@@ -0,0 +1,308 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: IPv4</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__ipv4.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">IPv4<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__lwip__opts__arp"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html">ARP</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__icmp"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__icmp.html">ICMP</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__dhcp"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcp.html">DHCP</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__autoip"><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:group__lwip__opts__igmp"><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">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga429e811a80ebb5157e14a854870c4410"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#ga429e811a80ebb5157e14a854870c4410">LWIP_IPV4</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga429e811a80ebb5157e14a854870c4410"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga881d32ff5ee02af01f758953f1b51d59"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#ga881d32ff5ee02af01f758953f1b51d59">IP_FORWARD</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga881d32ff5ee02af01f758953f1b51d59"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1a31ab0e0f37b17d40fa7c35bc2c4f69"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69">IP_REASSEMBLY</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga1a31ab0e0f37b17d40fa7c35bc2c4f69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf85c8bdd5035b6cada790b4cc2a209a4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4">IP_FRAG</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gaf85c8bdd5035b6cada790b4cc2a209a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa956b0167c37a2265b55e2d0204a3933"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#gaa956b0167c37a2265b55e2d0204a3933">IP_OPTIONS_ALLOWED</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gaa956b0167c37a2265b55e2d0204a3933"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad41122bd0b5485a18a4415c8f953727b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#gad41122bd0b5485a18a4415c8f953727b">IP_REASS_MAXAGE</a>&#160;&#160;&#160;15</td></tr>
+<tr class="separator:gad41122bd0b5485a18a4415c8f953727b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga29084a46d7d4be30e8029d356bca0394"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#ga29084a46d7d4be30e8029d356bca0394">IP_REASS_MAX_PBUFS</a>&#160;&#160;&#160;10</td></tr>
+<tr class="separator:ga29084a46d7d4be30e8029d356bca0394"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga556b9b58fd02c0fdd126791baef77411"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411">IP_DEFAULT_TTL</a>&#160;&#160;&#160;255</td></tr>
+<tr class="separator:ga556b9b58fd02c0fdd126791baef77411"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0b2c993fd940f5774108298933310384"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#ga0b2c993fd940f5774108298933310384">IP_SOF_BROADCAST</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga0b2c993fd940f5774108298933310384"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0f1fbf42d3344bf87cd056d48ddca3db"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#ga0f1fbf42d3344bf87cd056d48ddca3db">IP_SOF_BROADCAST_RECV</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga0f1fbf42d3344bf87cd056d48ddca3db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9e761df07c4e93901858741d4771dbc7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#ga9e761df07c4e93901858741d4771dbc7">IP_FORWARD_ALLOW_TX_ON_RX_NETIF</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga9e761df07c4e93901858741d4771dbc7"><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="ga556b9b58fd02c0fdd126791baef77411"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga556b9b58fd02c0fdd126791baef77411">&#9670;&nbsp;</a></span>IP_DEFAULT_TTL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_DEFAULT_TTL&#160;&#160;&#160;255</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. </p>
+
+</div>
+</div>
+<a id="ga881d32ff5ee02af01f758953f1b51d59"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga881d32ff5ee02af01f758953f1b51d59">&#9670;&nbsp;</a></span>IP_FORWARD</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_FORWARD&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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. </p>
+
+</div>
+</div>
+<a id="ga9e761df07c4e93901858741d4771dbc7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9e761df07c4e93901858741d4771dbc7">&#9670;&nbsp;</a></span>IP_FORWARD_ALLOW_TX_ON_RX_NETIF</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_FORWARD_ALLOW_TX_ON_RX_NETIF&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IP_FORWARD_ALLOW_TX_ON_RX_NETIF==1: allow ip_forward() to send packets back out on the netif where it was received. This should only be used for wireless networks. ATTENTION: When this is 1, make sure your netif driver correctly marks incoming link-layer-broadcast/multicast packets as such using the corresponding pbuf flags! </p>
+
+</div>
+</div>
+<a id="gaf85c8bdd5035b6cada790b4cc2a209a4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf85c8bdd5035b6cada790b4cc2a209a4">&#9670;&nbsp;</a></span>IP_FRAG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_FRAG&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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. </p>
+
+</div>
+</div>
+<a id="gaa956b0167c37a2265b55e2d0204a3933"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa956b0167c37a2265b55e2d0204a3933">&#9670;&nbsp;</a></span>IP_OPTIONS_ALLOWED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_OPTIONS_ALLOWED&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IP_OPTIONS_ALLOWED: 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). </p>
+
+</div>
+</div>
+<a id="ga29084a46d7d4be30e8029d356bca0394"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga29084a46d7d4be30e8029d356bca0394">&#9670;&nbsp;</a></span>IP_REASS_MAX_PBUFS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_REASS_MAX_PBUFS&#160;&#160;&#160;10</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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 &gt; 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! When IPv4 <em>and</em> IPv6 are enabled, this even changes to (PBUF_POOL_SIZE &gt; 2 * IP_REASS_MAX_PBUFS)! </p>
+
+</div>
+</div>
+<a id="gad41122bd0b5485a18a4415c8f953727b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad41122bd0b5485a18a4415c8f953727b">&#9670;&nbsp;</a></span>IP_REASS_MAXAGE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_REASS_MAXAGE&#160;&#160;&#160;15</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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. </p>
+
+</div>
+</div>
+<a id="ga1a31ab0e0f37b17d40fa7c35bc2c4f69"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1a31ab0e0f37b17d40fa7c35bc2c4f69">&#9670;&nbsp;</a></span>IP_REASSEMBLY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_REASSEMBLY&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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. </p>
+
+</div>
+</div>
+<a id="ga0b2c993fd940f5774108298933310384"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0b2c993fd940f5774108298933310384">&#9670;&nbsp;</a></span>IP_SOF_BROADCAST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_SOF_BROADCAST&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IP_SOF_BROADCAST=1: Use the SOF_BROADCAST field to enable broadcast filter per pcb on udp and raw send operations. To enable broadcast filter on recv operations, you also have to set IP_SOF_BROADCAST_RECV=1. </p>
+
+</div>
+</div>
+<a id="ga0f1fbf42d3344bf87cd056d48ddca3db"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0f1fbf42d3344bf87cd056d48ddca3db">&#9670;&nbsp;</a></span>IP_SOF_BROADCAST_RECV</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_SOF_BROADCAST_RECV&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IP_SOF_BROADCAST_RECV (requires IP_SOF_BROADCAST=1) enable the broadcast filter on recv operations. </p>
+
+</div>
+</div>
+<a id="ga429e811a80ebb5157e14a854870c4410"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga429e811a80ebb5157e14a854870c4410">&#9670;&nbsp;</a></span>LWIP_IPV4</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IPV4&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_IPV4==1: Enable IPv4 </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__ipv4.js b/doc/doxygen/output/html/group__lwip__opts__ipv4.js
new file mode 100644
index 0000000..a269c2e
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__ipv4.js
@@ -0,0 +1,19 @@
+var group__lwip__opts__ipv4 =
+[
+    [ "ARP", "group__lwip__opts__arp.html", "group__lwip__opts__arp" ],
+    [ "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" ],
+    [ "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 ],
+    [ "IP_FORWARD_ALLOW_TX_ON_RX_NETIF", "group__lwip__opts__ipv4.html#ga9e761df07c4e93901858741d4771dbc7", null ],
+    [ "IP_FRAG", "group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4", null ],
+    [ "IP_OPTIONS_ALLOWED", "group__lwip__opts__ipv4.html#gaa956b0167c37a2265b55e2d0204a3933", null ],
+    [ "IP_REASS_MAX_PBUFS", "group__lwip__opts__ipv4.html#ga29084a46d7d4be30e8029d356bca0394", null ],
+    [ "IP_REASS_MAXAGE", "group__lwip__opts__ipv4.html#gad41122bd0b5485a18a4415c8f953727b", null ],
+    [ "IP_REASSEMBLY", "group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69", null ],
+    [ "IP_SOF_BROADCAST", "group__lwip__opts__ipv4.html#ga0b2c993fd940f5774108298933310384", null ],
+    [ "IP_SOF_BROADCAST_RECV", "group__lwip__opts__ipv4.html#ga0f1fbf42d3344bf87cd056d48ddca3db", null ],
+    [ "LWIP_IPV4", "group__lwip__opts__ipv4.html#ga429e811a80ebb5157e14a854870c4410", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__ipv6.html b/doc/doxygen/output/html/group__lwip__opts__ipv6.html
new file mode 100644
index 0000000..0eb596c
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__ipv6.html
@@ -0,0 +1,323 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: IPv6</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__ipv6.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">IPv6<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__lwip__opts__icmp6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__icmp6.html">ICMP6</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__mld6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mld6.html">Multicast listener discovery</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__nd6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html">Neighbor discovery</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__dhcpv6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcpv6.html">DHCPv6</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga872e3bb3fe2212156d66b18fccc9643f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga872e3bb3fe2212156d66b18fccc9643f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8adc0b7dbedd279387a21588f0e2c969"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga8adc0b7dbedd279387a21588f0e2c969">IPV6_REASS_MAXAGE</a>&#160;&#160;&#160;60</td></tr>
+<tr class="separator:ga8adc0b7dbedd279387a21588f0e2c969"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga91d1e630059df3b3a296e2b6ff7aead5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga91d1e630059df3b3a296e2b6ff7aead5">LWIP_IPV6_SCOPES</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> &amp;&amp; !<a class="el" href="group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be">LWIP_SINGLE_NETIF</a>)</td></tr>
+<tr class="separator:ga91d1e630059df3b3a296e2b6ff7aead5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga623ef29d27d98fb7be8732730a5ddf4b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga623ef29d27d98fb7be8732730a5ddf4b">LWIP_IPV6_SCOPES_DEBUG</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga623ef29d27d98fb7be8732730a5ddf4b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga16c1b672604bfb0a66a6aeeb854589d3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga16c1b672604bfb0a66a6aeeb854589d3">LWIP_IPV6_NUM_ADDRESSES</a>&#160;&#160;&#160;3</td></tr>
+<tr class="separator:ga16c1b672604bfb0a66a6aeeb854589d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac96c5802de6c75dd62ab38cff6d16a32"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#gac96c5802de6c75dd62ab38cff6d16a32">LWIP_IPV6_FORWARD</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gac96c5802de6c75dd62ab38cff6d16a32"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9ab6269f3087f6d9f7b2c7181ef043c3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3">LWIP_IPV6_FRAG</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga9ab6269f3087f6d9f7b2c7181ef043c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad0ef160d72e63b02c5e875b06ec53864"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864">LWIP_IPV6_REASS</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a></td></tr>
+<tr class="separator:gad0ef160d72e63b02c5e875b06ec53864"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga273ed2e1a4e6a43713a0e4a06a34ee5c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga273ed2e1a4e6a43713a0e4a06a34ee5c">LWIP_IPV6_SEND_ROUTER_SOLICIT</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga273ed2e1a4e6a43713a0e4a06a34ee5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga580039bf2baf49fcb9e504e5d2b40a03"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga580039bf2baf49fcb9e504e5d2b40a03">LWIP_IPV6_AUTOCONFIG</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a></td></tr>
+<tr class="separator:ga580039bf2baf49fcb9e504e5d2b40a03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2c0127fca1073ad3f0a1e53f00ea8858"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga2c0127fca1073ad3f0a1e53f00ea8858">LWIP_IPV6_ADDRESS_LIFETIMES</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga580039bf2baf49fcb9e504e5d2b40a03">LWIP_IPV6_AUTOCONFIG</a></td></tr>
+<tr class="separator:ga2c0127fca1073ad3f0a1e53f00ea8858"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad8489522d34f37e42b4001bab3781bcb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#gad8489522d34f37e42b4001bab3781bcb">LWIP_IPV6_DUP_DETECT_ATTEMPTS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gad8489522d34f37e42b4001bab3781bcb"><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="ga8adc0b7dbedd279387a21588f0e2c969"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8adc0b7dbedd279387a21588f0e2c969">&#9670;&nbsp;</a></span>IPV6_REASS_MAXAGE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IPV6_REASS_MAXAGE&#160;&#160;&#160;60</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IPV6_REASS_MAXAGE: Maximum time (in multiples of IP6_REASS_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. </p>
+
+</div>
+</div>
+<a id="ga872e3bb3fe2212156d66b18fccc9643f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga872e3bb3fe2212156d66b18fccc9643f">&#9670;&nbsp;</a></span>LWIP_IPV6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IPV6&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_IPV6==1: Enable IPv6 </p>
+
+</div>
+</div>
+<a id="ga2c0127fca1073ad3f0a1e53f00ea8858"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2c0127fca1073ad3f0a1e53f00ea8858">&#9670;&nbsp;</a></span>LWIP_IPV6_ADDRESS_LIFETIMES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IPV6_ADDRESS_LIFETIMES&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga580039bf2baf49fcb9e504e5d2b40a03">LWIP_IPV6_AUTOCONFIG</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_IPV6_ADDRESS_LIFETIMES==1: Keep valid and preferred lifetimes for each IPv6 address. Required for LWIP_IPV6_AUTOCONFIG. May still be enabled otherwise, in which case the application may assign address lifetimes with the appropriate macros. Addresses with no lifetime are assumed to be static. If this option is disabled, all addresses are assumed to be static. </p>
+
+</div>
+</div>
+<a id="ga580039bf2baf49fcb9e504e5d2b40a03"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga580039bf2baf49fcb9e504e5d2b40a03">&#9670;&nbsp;</a></span>LWIP_IPV6_AUTOCONFIG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IPV6_AUTOCONFIG&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_IPV6_AUTOCONFIG==1: Enable stateless address autoconfiguration as per RFC 4862. </p>
+
+</div>
+</div>
+<a id="gad8489522d34f37e42b4001bab3781bcb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad8489522d34f37e42b4001bab3781bcb">&#9670;&nbsp;</a></span>LWIP_IPV6_DUP_DETECT_ATTEMPTS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IPV6_DUP_DETECT_ATTEMPTS&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_IPV6_DUP_DETECT_ATTEMPTS=[0..7]: Number of duplicate address detection attempts. </p>
+
+</div>
+</div>
+<a id="gac96c5802de6c75dd62ab38cff6d16a32"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac96c5802de6c75dd62ab38cff6d16a32">&#9670;&nbsp;</a></span>LWIP_IPV6_FORWARD</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IPV6_FORWARD&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_IPV6_FORWARD==1: Forward IPv6 packets across netifs </p>
+
+</div>
+</div>
+<a id="ga9ab6269f3087f6d9f7b2c7181ef043c3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9ab6269f3087f6d9f7b2c7181ef043c3">&#9670;&nbsp;</a></span>LWIP_IPV6_FRAG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IPV6_FRAG&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_IPV6_FRAG==1: Fragment outgoing IPv6 packets that are too big. </p>
+
+</div>
+</div>
+<a id="ga16c1b672604bfb0a66a6aeeb854589d3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga16c1b672604bfb0a66a6aeeb854589d3">&#9670;&nbsp;</a></span>LWIP_IPV6_NUM_ADDRESSES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IPV6_NUM_ADDRESSES&#160;&#160;&#160;3</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_IPV6_NUM_ADDRESSES: Number of IPv6 addresses per netif. </p>
+
+</div>
+</div>
+<a id="gad0ef160d72e63b02c5e875b06ec53864"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad0ef160d72e63b02c5e875b06ec53864">&#9670;&nbsp;</a></span>LWIP_IPV6_REASS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IPV6_REASS&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_IPV6_REASS==1: reassemble incoming IPv6 packets that fragmented </p>
+
+</div>
+</div>
+<a id="ga91d1e630059df3b3a296e2b6ff7aead5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga91d1e630059df3b3a296e2b6ff7aead5">&#9670;&nbsp;</a></span>LWIP_IPV6_SCOPES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IPV6_SCOPES&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> &amp;&amp; !<a class="el" href="group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be">LWIP_SINGLE_NETIF</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_IPV6_SCOPES==1: Enable support for IPv6 address scopes, ensuring that e.g. link-local addresses are really treated as link-local. Disable this setting only for single-interface configurations. 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 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 <a class="el" href="ip6__zone_8h.html">ip6_zone.h</a> header file for more information and relevant macros. For now it is still possible to turn off scopes support through the new LWIP_IPV6_SCOPES option. When upgrading an implementation that uses the core API directly, it is highly recommended to enable LWIP_IPV6_SCOPES_DEBUG at least for a while, to ensure e.g. proper address initialization. </p>
+
+</div>
+</div>
+<a id="ga623ef29d27d98fb7be8732730a5ddf4b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga623ef29d27d98fb7be8732730a5ddf4b">&#9670;&nbsp;</a></span>LWIP_IPV6_SCOPES_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IPV6_SCOPES_DEBUG&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_IPV6_SCOPES_DEBUG==1: Perform run-time checks to verify that addresses are properly zoned (see <a class="el" href="ip6__zone_8h.html">ip6_zone.h</a> on what that means) where it matters. Enabling this setting is highly recommended when upgrading from an existing installation that is not yet scope-aware; otherwise it may be too expensive. </p>
+
+</div>
+</div>
+<a id="ga273ed2e1a4e6a43713a0e4a06a34ee5c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga273ed2e1a4e6a43713a0e4a06a34ee5c">&#9670;&nbsp;</a></span>LWIP_IPV6_SEND_ROUTER_SOLICIT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IPV6_SEND_ROUTER_SOLICIT&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_IPV6_SEND_ROUTER_SOLICIT==1: Send router solicitation messages during network startup. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__ipv6.js b/doc/doxygen/output/html/group__lwip__opts__ipv6.js
new file mode 100644
index 0000000..959770f
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__ipv6.js
@@ -0,0 +1,19 @@
+var group__lwip__opts__ipv6 =
+[
+    [ "ICMP6", "group__lwip__opts__icmp6.html", "group__lwip__opts__icmp6" ],
+    [ "Multicast listener discovery", "group__lwip__opts__mld6.html", "group__lwip__opts__mld6" ],
+    [ "Neighbor discovery", "group__lwip__opts__nd6.html", "group__lwip__opts__nd6" ],
+    [ "DHCPv6", "group__lwip__opts__dhcpv6.html", "group__lwip__opts__dhcpv6" ],
+    [ "IPV6_REASS_MAXAGE", "group__lwip__opts__ipv6.html#ga8adc0b7dbedd279387a21588f0e2c969", null ],
+    [ "LWIP_IPV6", "group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f", null ],
+    [ "LWIP_IPV6_ADDRESS_LIFETIMES", "group__lwip__opts__ipv6.html#ga2c0127fca1073ad3f0a1e53f00ea8858", null ],
+    [ "LWIP_IPV6_AUTOCONFIG", "group__lwip__opts__ipv6.html#ga580039bf2baf49fcb9e504e5d2b40a03", null ],
+    [ "LWIP_IPV6_DUP_DETECT_ATTEMPTS", "group__lwip__opts__ipv6.html#gad8489522d34f37e42b4001bab3781bcb", null ],
+    [ "LWIP_IPV6_FORWARD", "group__lwip__opts__ipv6.html#gac96c5802de6c75dd62ab38cff6d16a32", null ],
+    [ "LWIP_IPV6_FRAG", "group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3", null ],
+    [ "LWIP_IPV6_NUM_ADDRESSES", "group__lwip__opts__ipv6.html#ga16c1b672604bfb0a66a6aeeb854589d3", null ],
+    [ "LWIP_IPV6_REASS", "group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864", null ],
+    [ "LWIP_IPV6_SCOPES", "group__lwip__opts__ipv6.html#ga91d1e630059df3b3a296e2b6ff7aead5", null ],
+    [ "LWIP_IPV6_SCOPES_DEBUG", "group__lwip__opts__ipv6.html#ga623ef29d27d98fb7be8732730a5ddf4b", null ],
+    [ "LWIP_IPV6_SEND_ROUTER_SOLICIT", "group__lwip__opts__ipv6.html#ga273ed2e1a4e6a43713a0e4a06a34ee5c", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__lock.html b/doc/doxygen/output/html/group__lwip__opts__lock.html
new file mode 100644
index 0000000..b52f876
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__lock.html
@@ -0,0 +1,221 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Core locking and MPU</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__lock.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Core locking and MPU<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__infrastructure.html">Infrastructure</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gae9afcefa5d233372abb9413188dd98c9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__lock.html#gae9afcefa5d233372abb9413188dd98c9">LWIP_MPU_COMPATIBLE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gae9afcefa5d233372abb9413188dd98c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8e46232794349c209e8ed4e9e7e4f011"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011">LWIP_TCPIP_CORE_LOCKING</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga8e46232794349c209e8ed4e9e7e4f011"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga351beb1c06affe49e717bc9f76c66acf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__lock.html#ga351beb1c06affe49e717bc9f76c66acf">LWIP_TCPIP_CORE_LOCKING_INPUT</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga351beb1c06affe49e717bc9f76c66acf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae85efb3a5fcf8585c94b3c2669978959"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__lock.html#gae85efb3a5fcf8585c94b3c2669978959">SYS_LIGHTWEIGHT_PROT</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gae85efb3a5fcf8585c94b3c2669978959"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga6a30040db307b3459fc11906bd433f75"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6a30040db307b3459fc11906bd433f75">&#9670;&nbsp;</a></span>LWIP_ASSERT_CORE_LOCKED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ASSERT_CORE_LOCKED</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Macro/function to check whether lwIP's threading/locking requirements are satisfied during current function call. This macro usually calls a function that is implemented in the OS-dependent sys layer and performs the following checks:</p><ul>
+<li>Not in ISR (this should be checked for NO_SYS==1, too!)</li>
+<li>If <a class="el" href="group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011">LWIP_TCPIP_CORE_LOCKING</a> = 1: TCPIP core lock is held</li>
+<li>If <a class="el" href="group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011">LWIP_TCPIP_CORE_LOCKING</a> = 0: function is called from TCPIP thread <dl class="section see"><dt>See also</dt><dd><a class="el" href="multithreading.html">Multithreading</a> </dd></dl>
+</li>
+</ul>
+
+</div>
+</div>
+<a id="gab97d014f7ecf3b20f9d5abc2d0a79a3e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab97d014f7ecf3b20f9d5abc2d0a79a3e">&#9670;&nbsp;</a></span>LWIP_MARK_TCPIP_THREAD</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_MARK_TCPIP_THREAD</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called as first thing in the lwIP TCPIP thread. Can be used in conjunction with <a class="el" href="group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75">LWIP_ASSERT_CORE_LOCKED</a> to check core locking. </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="multithreading.html">Multithreading</a> </dd></dl>
+
+</div>
+</div>
+<a id="gae9afcefa5d233372abb9413188dd98c9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae9afcefa5d233372abb9413188dd98c9">&#9670;&nbsp;</a></span>LWIP_MPU_COMPATIBLE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_MPU_COMPATIBLE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_MPU_COMPATIBLE: enables special memory management mechanism which makes lwip able to work on MPU (Memory Protection Unit) system by not passing stack-pointers to other threads (this decreases performance as memory is allocated from pools instead of keeping it on the stack) </p>
+
+</div>
+</div>
+<a id="ga8e46232794349c209e8ed4e9e7e4f011"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8e46232794349c209e8ed4e9e7e4f011">&#9670;&nbsp;</a></span>LWIP_TCPIP_CORE_LOCKING</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_TCPIP_CORE_LOCKING&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_TCPIP_CORE_LOCKING Creates a global mutex that is held during TCPIP thread operations. Can be locked by client code to perform lwIP operations without changing into TCPIP thread using callbacks. 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>. Your system should provide mutexes supporting priority inversion to use this. </p>
+
+</div>
+</div>
+<a id="ga351beb1c06affe49e717bc9f76c66acf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga351beb1c06affe49e717bc9f76c66acf">&#9670;&nbsp;</a></span>LWIP_TCPIP_CORE_LOCKING_INPUT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_TCPIP_CORE_LOCKING_INPUT&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_TCPIP_CORE_LOCKING_INPUT: when LWIP_TCPIP_CORE_LOCKING is enabled, this lets <a class="el" href="group__lwip__os.html#gae510f195171bed8499ae94e264a92717">tcpip_input()</a> grab the mutex for input packets as well, instead of allocating a message and passing it to tcpip_thread.</p>
+<p>ATTENTION: this does not work when <a class="el" href="group__lwip__os.html#gae510f195171bed8499ae94e264a92717">tcpip_input()</a> is called from interrupt context! </p>
+
+</div>
+</div>
+<a id="gae85efb3a5fcf8585c94b3c2669978959"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae85efb3a5fcf8585c94b3c2669978959">&#9670;&nbsp;</a></span>SYS_LIGHTWEIGHT_PROT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SYS_LIGHTWEIGHT_PROT&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SYS_LIGHTWEIGHT_PROT==1: enable inter-task protection (and task-vs-interrupt protection) for certain critical regions during buffer allocation, deallocation and memory allocation and deallocation. ATTENTION: This is required when using lwIP from more than one context! If you disable this, you must be sure what you are doing! </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__lock.js b/doc/doxygen/output/html/group__lwip__opts__lock.js
new file mode 100644
index 0000000..8119923
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__lock.js
@@ -0,0 +1,9 @@
+var group__lwip__opts__lock =
+[
+    [ "LWIP_ASSERT_CORE_LOCKED", "group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75", null ],
+    [ "LWIP_MARK_TCPIP_THREAD", "group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e", null ],
+    [ "LWIP_MPU_COMPATIBLE", "group__lwip__opts__lock.html#gae9afcefa5d233372abb9413188dd98c9", null ],
+    [ "LWIP_TCPIP_CORE_LOCKING", "group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011", null ],
+    [ "LWIP_TCPIP_CORE_LOCKING_INPUT", "group__lwip__opts__lock.html#ga351beb1c06affe49e717bc9f76c66acf", null ],
+    [ "SYS_LIGHTWEIGHT_PROT", "group__lwip__opts__lock.html#gae85efb3a5fcf8585c94b3c2669978959", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__loop.html b/doc/doxygen/output/html/group__lwip__opts__loop.html
new file mode 100644
index 0000000..3dda3fb
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__loop.html
@@ -0,0 +1,192 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Loopback interface</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__loop.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Loopback interface<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__netif.html">NETIF</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gaa2b1f736373cd896e212644aa453fbaf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__loop.html#gaa2b1f736373cd896e212644aa453fbaf">LWIP_HAVE_LOOPIF</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__loop.html#ga724a0ea765d5a47d026d529725f31c01">LWIP_NETIF_LOOPBACK</a> &amp;&amp; !<a class="el" href="group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be">LWIP_SINGLE_NETIF</a>)</td></tr>
+<tr class="separator:gaa2b1f736373cd896e212644aa453fbaf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga10a878b390c2fbe421d82502001c7300"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__loop.html#ga10a878b390c2fbe421d82502001c7300">LWIP_LOOPIF_MULTICAST</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga10a878b390c2fbe421d82502001c7300"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga724a0ea765d5a47d026d529725f31c01"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__loop.html#ga724a0ea765d5a47d026d529725f31c01">LWIP_NETIF_LOOPBACK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga724a0ea765d5a47d026d529725f31c01"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaacc3ad5d0a771d45fb0a3e3a09b1dbea"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__loop.html#gaacc3ad5d0a771d45fb0a3e3a09b1dbea">LWIP_LOOPBACK_MAX_PBUFS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaacc3ad5d0a771d45fb0a3e3a09b1dbea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa28d13ddd5281b1912276991e7ea58c5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__loop.html#gaa28d13ddd5281b1912276991e7ea58c5">LWIP_NETIF_LOOPBACK_MULTITHREADING</a>&#160;&#160;&#160;(!<a class="el" href="group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b">NO_SYS</a>)</td></tr>
+<tr class="separator:gaa28d13ddd5281b1912276991e7ea58c5"><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="gaa2b1f736373cd896e212644aa453fbaf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa2b1f736373cd896e212644aa453fbaf">&#9670;&nbsp;</a></span>LWIP_HAVE_LOOPIF</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HAVE_LOOPIF&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__loop.html#ga724a0ea765d5a47d026d529725f31c01">LWIP_NETIF_LOOPBACK</a> &amp;&amp; !<a class="el" href="group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be">LWIP_SINGLE_NETIF</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1). This is only needed when no real netifs are available. If at least one other netif is available, loopback traffic uses this netif. </p>
+
+</div>
+</div>
+<a id="gaacc3ad5d0a771d45fb0a3e3a09b1dbea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaacc3ad5d0a771d45fb0a3e3a09b1dbea">&#9670;&nbsp;</a></span>LWIP_LOOPBACK_MAX_PBUFS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_LOOPBACK_MAX_PBUFS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_LOOPBACK_MAX_PBUFS: Maximum number of pbufs on queue for loopback sending for each netif (0 = disabled) </p>
+
+</div>
+</div>
+<a id="ga10a878b390c2fbe421d82502001c7300"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga10a878b390c2fbe421d82502001c7300">&#9670;&nbsp;</a></span>LWIP_LOOPIF_MULTICAST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_LOOPIF_MULTICAST&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_LOOPIF_MULTICAST==1: Support multicast/IGMP on loop interface (127.0.0.1). </p>
+
+</div>
+</div>
+<a id="ga724a0ea765d5a47d026d529725f31c01"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga724a0ea765d5a47d026d529725f31c01">&#9670;&nbsp;</a></span>LWIP_NETIF_LOOPBACK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NETIF_LOOPBACK&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETIF_LOOPBACK==1: Support sending packets with a destination IP address equal to the netif IP address, looping them back up the stack. </p>
+
+</div>
+</div>
+<a id="gaa28d13ddd5281b1912276991e7ea58c5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa28d13ddd5281b1912276991e7ea58c5">&#9670;&nbsp;</a></span>LWIP_NETIF_LOOPBACK_MULTITHREADING</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NETIF_LOOPBACK_MULTITHREADING&#160;&#160;&#160;(!<a class="el" href="group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b">NO_SYS</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETIF_LOOPBACK_MULTITHREADING: Indicates whether threading is enabled in the system, as netifs must change how they behave depending on this setting for the LWIP_NETIF_LOOPBACK option to work. Setting this is needed to avoid reentering non-reentrant functions like <a class="el" href="tcp__in_8c.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5">tcp_input()</a>. LWIP_NETIF_LOOPBACK_MULTITHREADING==1: Indicates that the user is using a multithreaded environment like <a class="el" href="tcpip_8c.html">tcpip.c</a>. In this case, netif-&gt;input() is called directly. LWIP_NETIF_LOOPBACK_MULTITHREADING==0: Indicates a polling (or NO_SYS) setup. The packets are put on a list and <a class="el" href="netif_8c.html#a0fbaed78253d21e1b54e65651da3e327">netif_poll()</a> must be called in the main application loop. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__loop.js b/doc/doxygen/output/html/group__lwip__opts__loop.js
new file mode 100644
index 0000000..ed27762
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__loop.js
@@ -0,0 +1,8 @@
+var group__lwip__opts__loop =
+[
+    [ "LWIP_HAVE_LOOPIF", "group__lwip__opts__loop.html#gaa2b1f736373cd896e212644aa453fbaf", null ],
+    [ "LWIP_LOOPBACK_MAX_PBUFS", "group__lwip__opts__loop.html#gaacc3ad5d0a771d45fb0a3e3a09b1dbea", null ],
+    [ "LWIP_LOOPIF_MULTICAST", "group__lwip__opts__loop.html#ga10a878b390c2fbe421d82502001c7300", null ],
+    [ "LWIP_NETIF_LOOPBACK", "group__lwip__opts__loop.html#ga724a0ea765d5a47d026d529725f31c01", null ],
+    [ "LWIP_NETIF_LOOPBACK_MULTITHREADING", "group__lwip__opts__loop.html#gaa28d13ddd5281b1912276991e7ea58c5", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__mem.html b/doc/doxygen/output/html/group__lwip__opts__mem.html
new file mode 100644
index 0000000..a6e1f7d
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__mem.html
@@ -0,0 +1,333 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Heap and memory pools</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__mem.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Heap and memory pools<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__infrastructure.html">Infrastructure</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem: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"><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>
+<tr class="separator:gae93af697d27bbcefa6a28052d90f2f38"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa2f25586972d1cbc1ff0dcdc6f15a1b0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#gaa2f25586972d1cbc1ff0dcdc6f15a1b0">MEMP_MEM_INIT</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaa2f25586972d1cbc1ff0dcdc6f15a1b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga97343214666ee6dcb18c0bd77b441ea7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga97343214666ee6dcb18c0bd77b441ea7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2dcf8c45f945dd0c4301a94700f2112c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#ga2dcf8c45f945dd0c4301a94700f2112c">MEM_SIZE</a>&#160;&#160;&#160;1600</td></tr>
+<tr class="separator:ga2dcf8c45f945dd0c4301a94700f2112c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga27fdd01194a42fc41a7716b72cdb49e3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#ga27fdd01194a42fc41a7716b72cdb49e3">MEMP_OVERFLOW_CHECK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga27fdd01194a42fc41a7716b72cdb49e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0838947193e222a9f46b582e01e5beff"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#ga0838947193e222a9f46b582e01e5beff">MEMP_SANITY_CHECK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga0838947193e222a9f46b582e01e5beff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae331a198bd06100b90ea020cd5f07f4e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#gae331a198bd06100b90ea020cd5f07f4e">MEM_OVERFLOW_CHECK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gae331a198bd06100b90ea020cd5f07f4e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga90b17afabb93986a162c327ed30bb4d3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#ga90b17afabb93986a162c327ed30bb4d3">MEM_SANITY_CHECK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga90b17afabb93986a162c327ed30bb4d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaddca3141bc7037241769eb152b6f89ba"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#gaddca3141bc7037241769eb152b6f89ba">MEM_USE_POOLS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaddca3141bc7037241769eb152b6f89ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaba8be68e8fd0716b723ce4569ed89f82"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#gaba8be68e8fd0716b723ce4569ed89f82">MEM_USE_POOLS_TRY_BIGGER_POOL</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaba8be68e8fd0716b723ce4569ed89f82"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga69de593b8ffd4f1c249f03e48e11983b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#ga69de593b8ffd4f1c249f03e48e11983b">MEMP_USE_CUSTOM_POOLS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga69de593b8ffd4f1c249f03e48e11983b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0a3ef6098813c103e5aba07da76e15e2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#ga0a3ef6098813c103e5aba07da76e15e2">LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga0a3ef6098813c103e5aba07da76e15e2"><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="ga0a3ef6098813c103e5aba07da76e15e2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0a3ef6098813c103e5aba07da76e15e2">&#9670;&nbsp;</a></span>LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 if you want to free PBUF_RAM pbufs (or call <a class="el" href="mem_8c.html#a65169147c44e9db60d997819af9b455c">mem_free()</a>) from interrupt context (or another context that doesn't allow waiting for a semaphore). If set to 1, mem_malloc will be protected by a semaphore and SYS_ARCH_PROTECT, while mem_free will only use SYS_ARCH_PROTECT. mem_malloc SYS_ARCH_UNPROTECTs with each loop so that mem_free can run.</p>
+<p>ATTENTION: As you can see from the above description, this leads to dis-/ enabling interrupts often, which can be slow! Also, on low memory, mem_malloc can need longer.</p>
+<p>If you don't want that, at least for NO_SYS=0, you can still use the following functions to enqueue a deallocation call which then runs in the tcpip_thread context:</p><ul>
+<li>pbuf_free_callback(p);</li>
+<li>mem_free_callback(m); </li>
+</ul>
+
+</div>
+</div>
+<a id="ga97343214666ee6dcb18c0bd77b441ea7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga97343214666ee6dcb18c0bd77b441ea7">&#9670;&nbsp;</a></span>MEM_ALIGNMENT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEM_ALIGNMENT&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEM_ALIGNMENT: should be set to the alignment of the CPU 4 byte alignment -&gt; #define MEM_ALIGNMENT 4 2 byte alignment -&gt; #define MEM_ALIGNMENT 2 </p>
+
+</div>
+</div>
+<a id="ga4ef345cc270912bd2230b1c5ec51dfc8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4ef345cc270912bd2230b1c5ec51dfc8">&#9670;&nbsp;</a></span>MEM_LIBC_MALLOC</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEM_LIBC_MALLOC&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library instead of the lwip internal allocator. Can save code size if you already use it. </p>
+
+</div>
+</div>
+<a id="gae331a198bd06100b90ea020cd5f07f4e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae331a198bd06100b90ea020cd5f07f4e">&#9670;&nbsp;</a></span>MEM_OVERFLOW_CHECK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEM_OVERFLOW_CHECK&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEM_OVERFLOW_CHECK: mem overflow protection reserves a configurable amount of bytes before and after each heap allocation chunk and fills it with a prominent default value. MEM_OVERFLOW_CHECK == 0 no checking MEM_OVERFLOW_CHECK == 1 checks each element when it is freed MEM_OVERFLOW_CHECK &gt;= 2 checks all heap elements every time <a class="el" href="mem_8c.html#af418ade27d91d41e6143dba2cc246b0f">mem_malloc()</a> or <a class="el" href="mem_8c.html#a65169147c44e9db60d997819af9b455c">mem_free()</a> is called (useful but slow!) </p>
+
+</div>
+</div>
+<a id="ga90b17afabb93986a162c327ed30bb4d3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga90b17afabb93986a162c327ed30bb4d3">&#9670;&nbsp;</a></span>MEM_SANITY_CHECK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEM_SANITY_CHECK&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEM_SANITY_CHECK==1: run a sanity check after each <a class="el" href="mem_8c.html#a65169147c44e9db60d997819af9b455c">mem_free()</a> to make sure that the linked list of heap elements is not corrupted. </p>
+
+</div>
+</div>
+<a id="ga2dcf8c45f945dd0c4301a94700f2112c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2dcf8c45f945dd0c4301a94700f2112c">&#9670;&nbsp;</a></span>MEM_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEM_SIZE&#160;&#160;&#160;1600</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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. </p>
+
+</div>
+</div>
+<a id="gaddca3141bc7037241769eb152b6f89ba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaddca3141bc7037241769eb152b6f89ba">&#9670;&nbsp;</a></span>MEM_USE_POOLS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEM_USE_POOLS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEM_USE_POOLS==1: Use an alternative to malloc() by allocating from a set of memory pools of various sizes. When mem_malloc is called, an element of the smallest pool that can provide the length needed is returned. To use this, MEMP_USE_CUSTOM_POOLS also has to be enabled. </p>
+
+</div>
+</div>
+<a id="gaba8be68e8fd0716b723ce4569ed89f82"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaba8be68e8fd0716b723ce4569ed89f82">&#9670;&nbsp;</a></span>MEM_USE_POOLS_TRY_BIGGER_POOL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEM_USE_POOLS_TRY_BIGGER_POOL&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEM_USE_POOLS_TRY_BIGGER_POOL==1: if one malloc-pool is empty, try the next bigger pool - WARNING: THIS MIGHT WASTE MEMORY but it can make a system more reliable. </p>
+
+</div>
+</div>
+<a id="gaa2f25586972d1cbc1ff0dcdc6f15a1b0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa2f25586972d1cbc1ff0dcdc6f15a1b0">&#9670;&nbsp;</a></span>MEMP_MEM_INIT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_MEM_INIT&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_MEM_INIT==1: Force use of memset to initialize pool memory. Useful if pool are moved in uninitialized section of memory. This will ensure default values in pcbs struct are well initialized in all conditions. </p>
+
+</div>
+</div>
+<a id="gae93af697d27bbcefa6a28052d90f2f38"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae93af697d27bbcefa6a28052d90f2f38">&#9670;&nbsp;</a></span>MEMP_MEM_MALLOC</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_MEM_MALLOC&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_MEM_MALLOC==1: Use mem_malloc/mem_free instead of the lwip pool allocator. Especially useful with MEM_LIBC_MALLOC but handle with care regarding execution speed (heap alloc can be much slower than pool alloc) and usage from interrupts (especially if your netif driver allocates PBUF_POOL pbufs for received frames from interrupt)! ATTENTION: Currently, this uses the heap for ALL pools (also for private pools, not only for internal pools defined in <a class="el" href="memp__std_8h.html">memp_std.h</a>)! </p>
+
+</div>
+</div>
+<a id="ga27fdd01194a42fc41a7716b72cdb49e3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga27fdd01194a42fc41a7716b72cdb49e3">&#9670;&nbsp;</a></span>MEMP_OVERFLOW_CHECK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_OVERFLOW_CHECK&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_OVERFLOW_CHECK: memp overflow protection reserves a configurable amount of bytes before and after each memp element in every pool and fills it with a prominent default value. MEMP_OVERFLOW_CHECK == 0 no checking MEMP_OVERFLOW_CHECK == 1 checks each element when it is freed MEMP_OVERFLOW_CHECK &gt;= 2 checks each element in every pool every time <a class="el" href="memp_8c.html#a2b00593d086313c267b54a976bf67aa5">memp_malloc()</a> or <a class="el" href="memp_8c.html#aecd94926b7c2a0e23ae195f4ae97581f">memp_free()</a> is called (useful but slow!) </p>
+
+</div>
+</div>
+<a id="ga0838947193e222a9f46b582e01e5beff"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0838947193e222a9f46b582e01e5beff">&#9670;&nbsp;</a></span>MEMP_SANITY_CHECK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_SANITY_CHECK&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_SANITY_CHECK==1: run a sanity check after each <a class="el" href="memp_8c.html#aecd94926b7c2a0e23ae195f4ae97581f">memp_free()</a> to make sure that there are no cycles in the linked lists. </p>
+
+</div>
+</div>
+<a id="ga69de593b8ffd4f1c249f03e48e11983b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga69de593b8ffd4f1c249f03e48e11983b">&#9670;&nbsp;</a></span>MEMP_USE_CUSTOM_POOLS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_USE_CUSTOM_POOLS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_USE_CUSTOM_POOLS==1: whether to include a user file lwippools.h that defines additional pools beyond the "standard" ones required by lwIP. If you set this to 1, you must have lwippools.h in your include path somewhere. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__mem.js b/doc/doxygen/output/html/group__lwip__opts__mem.js
new file mode 100644
index 0000000..c709336
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__mem.js
@@ -0,0 +1,16 @@
+var group__lwip__opts__mem =
+[
+    [ "LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT", "group__lwip__opts__mem.html#ga0a3ef6098813c103e5aba07da76e15e2", null ],
+    [ "MEM_ALIGNMENT", "group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7", null ],
+    [ "MEM_LIBC_MALLOC", "group__lwip__opts__mem.html#ga4ef345cc270912bd2230b1c5ec51dfc8", null ],
+    [ "MEM_OVERFLOW_CHECK", "group__lwip__opts__mem.html#gae331a198bd06100b90ea020cd5f07f4e", null ],
+    [ "MEM_SANITY_CHECK", "group__lwip__opts__mem.html#ga90b17afabb93986a162c327ed30bb4d3", null ],
+    [ "MEM_SIZE", "group__lwip__opts__mem.html#ga2dcf8c45f945dd0c4301a94700f2112c", null ],
+    [ "MEM_USE_POOLS", "group__lwip__opts__mem.html#gaddca3141bc7037241769eb152b6f89ba", null ],
+    [ "MEM_USE_POOLS_TRY_BIGGER_POOL", "group__lwip__opts__mem.html#gaba8be68e8fd0716b723ce4569ed89f82", null ],
+    [ "MEMP_MEM_INIT", "group__lwip__opts__mem.html#gaa2f25586972d1cbc1ff0dcdc6f15a1b0", null ],
+    [ "MEMP_MEM_MALLOC", "group__lwip__opts__mem.html#gae93af697d27bbcefa6a28052d90f2f38", null ],
+    [ "MEMP_OVERFLOW_CHECK", "group__lwip__opts__mem.html#ga27fdd01194a42fc41a7716b72cdb49e3", null ],
+    [ "MEMP_SANITY_CHECK", "group__lwip__opts__mem.html#ga0838947193e222a9f46b582e01e5beff", null ],
+    [ "MEMP_USE_CUSTOM_POOLS", "group__lwip__opts__mem.html#ga69de593b8ffd4f1c249f03e48e11983b", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__memcpy.html b/doc/doxygen/output/html/group__lwip__opts__memcpy.html
new file mode 100644
index 0000000..f42052f
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__memcpy.html
@@ -0,0 +1,218 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: memcpy</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__memcpy.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">memcpy<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__infrastructure.html">Infrastructure</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gaa1dd57a66b6de8c0593e9e3e8d1411f6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memcpy.html#gaa1dd57a66b6de8c0593e9e3e8d1411f6">MEMCPY</a>(dst,  src,  len)&#160;&#160;&#160;memcpy(dst,src,len)</td></tr>
+<tr class="separator:gaa1dd57a66b6de8c0593e9e3e8d1411f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8c6e3c1e4f74acb16376188dbf8909ec"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec">SMEMCPY</a>(dst,  src,  len)&#160;&#160;&#160;memcpy(dst,src,len)</td></tr>
+<tr class="separator:ga8c6e3c1e4f74acb16376188dbf8909ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0e00bb235da5557fcbc049f732503863"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memcpy.html#ga0e00bb235da5557fcbc049f732503863">MEMMOVE</a>(dst,  src,  len)&#160;&#160;&#160;memmove(dst,src,len)</td></tr>
+<tr class="separator:ga0e00bb235da5557fcbc049f732503863"><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="gaa1dd57a66b6de8c0593e9e3e8d1411f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa1dd57a66b6de8c0593e9e3e8d1411f6">&#9670;&nbsp;</a></span>MEMCPY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMCPY</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dst, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">len&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;memcpy(dst,src,len)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMCPY: override this if you have a faster implementation at hand than the one included in your C library </p>
+
+</div>
+</div>
+<a id="ga0e00bb235da5557fcbc049f732503863"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0e00bb235da5557fcbc049f732503863">&#9670;&nbsp;</a></span>MEMMOVE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMMOVE</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dst, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">len&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;memmove(dst,src,len)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMMOVE: override this if you have a faster implementation at hand than the one included in your C library. lwIP currently uses MEMMOVE only when IPv6 fragmentation support is enabled. </p>
+
+</div>
+</div>
+<a id="ga8c6e3c1e4f74acb16376188dbf8909ec"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8c6e3c1e4f74acb16376188dbf8909ec">&#9670;&nbsp;</a></span>SMEMCPY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SMEMCPY</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dst, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">len&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;memcpy(dst,src,len)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SMEMCPY: override this with care! Some compilers (e.g. gcc) can inline a call to memcpy() if the length is known at compile time and is small. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__memcpy.js b/doc/doxygen/output/html/group__lwip__opts__memcpy.js
new file mode 100644
index 0000000..842dc06
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__memcpy.js
@@ -0,0 +1,6 @@
+var group__lwip__opts__memcpy =
+[
+    [ "MEMCPY", "group__lwip__opts__memcpy.html#gaa1dd57a66b6de8c0593e9e3e8d1411f6", null ],
+    [ "MEMMOVE", "group__lwip__opts__memcpy.html#ga0e00bb235da5557fcbc049f732503863", null ],
+    [ "SMEMCPY", "group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__memp.html b/doc/doxygen/output/html/group__lwip__opts__memp.html
new file mode 100644
index 0000000..2590ae8
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__memp.html
@@ -0,0 +1,532 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Internal memory pools</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__memp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Internal memory pools<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__infrastructure.html">Infrastructure</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga92b30aed958ec59334d936d4ca725418"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga92b30aed958ec59334d936d4ca725418">MEMP_NUM_PBUF</a>&#160;&#160;&#160;16</td></tr>
+<tr class="separator:ga92b30aed958ec59334d936d4ca725418"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga379bf92ed322cda54cb701337421e0d3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga379bf92ed322cda54cb701337421e0d3">MEMP_NUM_RAW_PCB</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:ga379bf92ed322cda54cb701337421e0d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2c416da481ab09bd1ba257b75a0707eb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga2c416da481ab09bd1ba257b75a0707eb">MEMP_NUM_UDP_PCB</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:ga2c416da481ab09bd1ba257b75a0707eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga73beecc19cfbc3114768f9b32b2cd70e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga73beecc19cfbc3114768f9b32b2cd70e">MEMP_NUM_TCP_PCB</a>&#160;&#160;&#160;5</td></tr>
+<tr class="separator:ga73beecc19cfbc3114768f9b32b2cd70e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga04fba6a249123513271dccb4ec26aa5a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga04fba6a249123513271dccb4ec26aa5a">MEMP_NUM_TCP_PCB_LISTEN</a>&#160;&#160;&#160;8</td></tr>
+<tr class="separator:ga04fba6a249123513271dccb4ec26aa5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa35fb3a1a76661e3ffb9722a57092de3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#gaa35fb3a1a76661e3ffb9722a57092de3">MEMP_NUM_TCP_SEG</a>&#160;&#160;&#160;16</td></tr>
+<tr class="separator:gaa35fb3a1a76661e3ffb9722a57092de3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga24f6737ee990990b81b0d16ef6e0dffd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga24f6737ee990990b81b0d16ef6e0dffd">MEMP_NUM_ALTCP_PCB</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memp.html#ga73beecc19cfbc3114768f9b32b2cd70e">MEMP_NUM_TCP_PCB</a></td></tr>
+<tr class="separator:ga24f6737ee990990b81b0d16ef6e0dffd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga169436c5860253b90e25bdba9fdcac86"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga169436c5860253b90e25bdba9fdcac86">MEMP_NUM_REASSDATA</a>&#160;&#160;&#160;5</td></tr>
+<tr class="separator:ga169436c5860253b90e25bdba9fdcac86"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1f66051a654dcd7a4e19bc6aff240630"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga1f66051a654dcd7a4e19bc6aff240630">MEMP_NUM_FRAG_PBUF</a>&#160;&#160;&#160;15</td></tr>
+<tr class="separator:ga1f66051a654dcd7a4e19bc6aff240630"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga087b00ea20a7edebcad33a1a1353a5d7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga087b00ea20a7edebcad33a1a1353a5d7">MEMP_NUM_ARP_QUEUE</a>&#160;&#160;&#160;30</td></tr>
+<tr class="separator:ga087b00ea20a7edebcad33a1a1353a5d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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="separator:ga87a05debb46ff82093d0e6dc1aad8804"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="memitem:ga5d99df65869ac101ed6a611fc85016be"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga5d99df65869ac101ed6a611fc85016be">MEMP_NUM_NETBUF</a>&#160;&#160;&#160;2</td></tr>
+<tr class="separator:ga5d99df65869ac101ed6a611fc85016be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacb40bd726b7e15593b20a628d298f456"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#gacb40bd726b7e15593b20a628d298f456">MEMP_NUM_NETCONN</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:gacb40bd726b7e15593b20a628d298f456"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8e136f5811e6652c6c5d2fcf596f0893"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga8e136f5811e6652c6c5d2fcf596f0893">MEMP_NUM_SELECT_CB</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:ga8e136f5811e6652c6c5d2fcf596f0893"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafbbfd6ce8536038cd00fa85bebae987c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c">MEMP_NUM_TCPIP_MSG_API</a>&#160;&#160;&#160;8</td></tr>
+<tr class="separator:gafbbfd6ce8536038cd00fa85bebae987c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab089a7088439e726c3801ba9e249d831"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#gab089a7088439e726c3801ba9e249d831">MEMP_NUM_TCPIP_MSG_INPKT</a>&#160;&#160;&#160;8</td></tr>
+<tr class="separator:gab089a7088439e726c3801ba9e249d831"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga293bc22b60bf3f8e2520f60a88370e7a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga293bc22b60bf3f8e2520f60a88370e7a">MEMP_NUM_NETDB</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga293bc22b60bf3f8e2520f60a88370e7a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa9b0f949da12cbe8fe5f7aefc30290e0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#gaa9b0f949da12cbe8fe5f7aefc30290e0">MEMP_NUM_LOCALHOSTLIST</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gaa9b0f949da12cbe8fe5f7aefc30290e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga50eaadc4cad0716410332691e382c38a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga50eaadc4cad0716410332691e382c38a">PBUF_POOL_SIZE</a>&#160;&#160;&#160;16</td></tr>
+<tr class="separator:ga50eaadc4cad0716410332691e382c38a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5a95abf3610c56e7c23cb035eb9c3444"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga5a95abf3610c56e7c23cb035eb9c3444">MEMP_NUM_API_MSG</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c">MEMP_NUM_TCPIP_MSG_API</a></td></tr>
+<tr class="separator:ga5a95abf3610c56e7c23cb035eb9c3444"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3b1f228c598529c62895ad04ff294980"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga3b1f228c598529c62895ad04ff294980">MEMP_NUM_DNS_API_MSG</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c">MEMP_NUM_TCPIP_MSG_API</a></td></tr>
+<tr class="separator:ga3b1f228c598529c62895ad04ff294980"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacf9782dd26bf8a655044dc041a9de948"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#gacf9782dd26bf8a655044dc041a9de948">MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c">MEMP_NUM_TCPIP_MSG_API</a></td></tr>
+<tr class="separator:gacf9782dd26bf8a655044dc041a9de948"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadd5a973b98068ce9318ea2f96b5fa14c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#gadd5a973b98068ce9318ea2f96b5fa14c">MEMP_NUM_NETIFAPI_MSG</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c">MEMP_NUM_TCPIP_MSG_API</a></td></tr>
+<tr class="separator:gadd5a973b98068ce9318ea2f96b5fa14c"><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="ga87a05debb46ff82093d0e6dc1aad8804"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga87a05debb46ff82093d0e6dc1aad8804">&#9670;&nbsp;</a></span>LWIP_NUM_SYS_TIMEOUT_INTERNAL</h2>
+
+<div class="memitem">
+<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>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The number of sys timeouts used by the core stack (not apps) The default number of timeouts is calculated here for all enabled modules. </p>
+
+</div>
+</div>
+<a id="ga24f6737ee990990b81b0d16ef6e0dffd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga24f6737ee990990b81b0d16ef6e0dffd">&#9670;&nbsp;</a></span>MEMP_NUM_ALTCP_PCB</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_ALTCP_PCB&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memp.html#ga73beecc19cfbc3114768f9b32b2cd70e">MEMP_NUM_TCP_PCB</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_ALTCP_PCB: the number of simultaneously active altcp layer pcbs. (requires the LWIP_ALTCP option) Connections with multiple layers require more than one altcp_pcb (e.g. TLS over TCP requires 2 altcp_pcbs, one for TLS and one for TCP). </p>
+
+</div>
+</div>
+<a id="ga5a95abf3610c56e7c23cb035eb9c3444"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5a95abf3610c56e7c23cb035eb9c3444">&#9670;&nbsp;</a></span>MEMP_NUM_API_MSG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_API_MSG&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c">MEMP_NUM_TCPIP_MSG_API</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_API_MSG: the number of concurrently active calls to various socket, netconn, and tcpip functions </p>
+
+</div>
+</div>
+<a id="ga087b00ea20a7edebcad33a1a1353a5d7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga087b00ea20a7edebcad33a1a1353a5d7">&#9670;&nbsp;</a></span>MEMP_NUM_ARP_QUEUE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_ARP_QUEUE&#160;&#160;&#160;30</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_ARP_QUEUE: the number of simultaneously queued outgoing packets (pbufs) that are waiting for an ARP request (to resolve their destination address) to finish. (requires the ARP_QUEUEING option) </p>
+
+</div>
+</div>
+<a id="ga3b1f228c598529c62895ad04ff294980"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3b1f228c598529c62895ad04ff294980">&#9670;&nbsp;</a></span>MEMP_NUM_DNS_API_MSG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_DNS_API_MSG&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c">MEMP_NUM_TCPIP_MSG_API</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_DNS_API_MSG: the number of concurrently active calls to netconn_gethostbyname </p>
+
+</div>
+</div>
+<a id="ga1f66051a654dcd7a4e19bc6aff240630"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1f66051a654dcd7a4e19bc6aff240630">&#9670;&nbsp;</a></span>MEMP_NUM_FRAG_PBUF</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_FRAG_PBUF&#160;&#160;&#160;15</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_FRAG_PBUF: the number of IP fragments simultaneously sent (fragments, not whole packets!). This is only used with LWIP_NETIF_TX_SINGLE_PBUF==0 and only has to be &gt; 1 with DMA-enabled MACs where the packet is not yet sent when netif-&gt;output returns. </p>
+
+</div>
+</div>
+<a id="gab648ff95d8ffa4216b95f82a568a5d9a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab648ff95d8ffa4216b95f82a568a5d9a">&#9670;&nbsp;</a></span>MEMP_NUM_IGMP_GROUP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_IGMP_GROUP&#160;&#160;&#160;8</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_IGMP_GROUP: The number of multicast groups whose network interfaces can be members at the same time (one per netif - allsystems group -, plus one per netif membership). (requires the LWIP_IGMP option) </p>
+
+</div>
+</div>
+<a id="gaa9b0f949da12cbe8fe5f7aefc30290e0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa9b0f949da12cbe8fe5f7aefc30290e0">&#9670;&nbsp;</a></span>MEMP_NUM_LOCALHOSTLIST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_LOCALHOSTLIST&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_LOCALHOSTLIST: the number of host entries in the local host list if DNS_LOCAL_HOSTLIST_IS_DYNAMIC==1. </p>
+
+</div>
+</div>
+<a id="ga5d99df65869ac101ed6a611fc85016be"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5d99df65869ac101ed6a611fc85016be">&#9670;&nbsp;</a></span>MEMP_NUM_NETBUF</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_NETBUF&#160;&#160;&#160;2</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_NETBUF: the number of struct netbufs. (only needed if you use the sequential API, like <a class="el" href="api__lib_8c.html">api_lib.c</a>) </p>
+
+</div>
+</div>
+<a id="gacb40bd726b7e15593b20a628d298f456"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacb40bd726b7e15593b20a628d298f456">&#9670;&nbsp;</a></span>MEMP_NUM_NETCONN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_NETCONN&#160;&#160;&#160;4</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_NETCONN: the number of struct netconns. (only needed if you use the sequential API, like <a class="el" href="api__lib_8c.html">api_lib.c</a>) </p>
+
+</div>
+</div>
+<a id="ga293bc22b60bf3f8e2520f60a88370e7a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga293bc22b60bf3f8e2520f60a88370e7a">&#9670;&nbsp;</a></span>MEMP_NUM_NETDB</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_NETDB&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_NETDB: the number of concurrently running lwip_addrinfo() calls (before freeing the corresponding memory using <a class="el" href="netdb_8c.html#a7f65ff5982a0743849a644ef2cd15ef5">lwip_freeaddrinfo()</a>). </p>
+
+</div>
+</div>
+<a id="gadd5a973b98068ce9318ea2f96b5fa14c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadd5a973b98068ce9318ea2f96b5fa14c">&#9670;&nbsp;</a></span>MEMP_NUM_NETIFAPI_MSG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_NETIFAPI_MSG&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c">MEMP_NUM_TCPIP_MSG_API</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_NETIFAPI_MSG: the number of concurrently active calls to the netifapi functions </p>
+
+</div>
+</div>
+<a id="ga92b30aed958ec59334d936d4ca725418"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga92b30aed958ec59334d936d4ca725418">&#9670;&nbsp;</a></span>MEMP_NUM_PBUF</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_PBUF&#160;&#160;&#160;16</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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. </p>
+
+</div>
+</div>
+<a id="ga379bf92ed322cda54cb701337421e0d3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga379bf92ed322cda54cb701337421e0d3">&#9670;&nbsp;</a></span>MEMP_NUM_RAW_PCB</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_RAW_PCB&#160;&#160;&#160;4</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_RAW_PCB: Number of raw connection PCBs (requires the LWIP_RAW option) </p>
+
+</div>
+</div>
+<a id="ga169436c5860253b90e25bdba9fdcac86"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga169436c5860253b90e25bdba9fdcac86">&#9670;&nbsp;</a></span>MEMP_NUM_REASSDATA</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_REASSDATA&#160;&#160;&#160;5</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_REASSDATA: the number of IP packets simultaneously queued for reassembly (whole packets, not fragments!) </p>
+
+</div>
+</div>
+<a id="ga8e136f5811e6652c6c5d2fcf596f0893"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8e136f5811e6652c6c5d2fcf596f0893">&#9670;&nbsp;</a></span>MEMP_NUM_SELECT_CB</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_SELECT_CB&#160;&#160;&#160;4</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_SELECT_CB: the number of struct <a class="el" href="structlwip__select__cb.html">lwip_select_cb</a>. (Only needed if you have LWIP_MPU_COMPATIBLE==1 and use the socket API. In that case, you need one per thread calling lwip_select.) </p>
+
+</div>
+</div>
+<a id="gacf9782dd26bf8a655044dc041a9de948"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacf9782dd26bf8a655044dc041a9de948">&#9670;&nbsp;</a></span>MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c">MEMP_NUM_TCPIP_MSG_API</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA: the number of concurrently active calls to getsockopt/setsockopt </p>
+
+</div>
+</div>
+<a id="ga4afbdca581a58d57bc7a81118a95327e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4afbdca581a58d57bc7a81118a95327e">&#9670;&nbsp;</a></span>MEMP_NUM_SYS_TIMEOUT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_SYS_TIMEOUT&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memp.html#ga87a05debb46ff82093d0e6dc1aad8804">LWIP_NUM_SYS_TIMEOUT_INTERNAL</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_SYS_TIMEOUT: the number of simultaneously active timeouts. The default number of timeouts is calculated here for all enabled modules. The formula expects settings to be either '0' or '1'. </p>
+
+</div>
+</div>
+<a id="ga73beecc19cfbc3114768f9b32b2cd70e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga73beecc19cfbc3114768f9b32b2cd70e">&#9670;&nbsp;</a></span>MEMP_NUM_TCP_PCB</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_TCP_PCB&#160;&#160;&#160;5</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_TCP_PCB: the number of simultaneously active TCP connections. (requires the LWIP_TCP option) </p>
+
+</div>
+</div>
+<a id="ga04fba6a249123513271dccb4ec26aa5a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga04fba6a249123513271dccb4ec26aa5a">&#9670;&nbsp;</a></span>MEMP_NUM_TCP_PCB_LISTEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_TCP_PCB_LISTEN&#160;&#160;&#160;8</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. (requires the LWIP_TCP option) </p>
+
+</div>
+</div>
+<a id="gaa35fb3a1a76661e3ffb9722a57092de3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa35fb3a1a76661e3ffb9722a57092de3">&#9670;&nbsp;</a></span>MEMP_NUM_TCP_SEG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_TCP_SEG&#160;&#160;&#160;16</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. (requires the LWIP_TCP option) </p>
+
+</div>
+</div>
+<a id="gafbbfd6ce8536038cd00fa85bebae987c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafbbfd6ce8536038cd00fa85bebae987c">&#9670;&nbsp;</a></span>MEMP_NUM_TCPIP_MSG_API</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_TCPIP_MSG_API&#160;&#160;&#160;8</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used for callback/timeout API communication. (only needed if you use <a class="el" href="tcpip_8c.html">tcpip.c</a>) </p>
+
+</div>
+</div>
+<a id="gab089a7088439e726c3801ba9e249d831"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab089a7088439e726c3801ba9e249d831">&#9670;&nbsp;</a></span>MEMP_NUM_TCPIP_MSG_INPKT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_TCPIP_MSG_INPKT&#160;&#160;&#160;8</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used for incoming packets. (only needed if you use <a class="el" href="tcpip_8c.html">tcpip.c</a>) </p>
+
+</div>
+</div>
+<a id="ga2c416da481ab09bd1ba257b75a0707eb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2c416da481ab09bd1ba257b75a0707eb">&#9670;&nbsp;</a></span>MEMP_NUM_UDP_PCB</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_UDP_PCB&#160;&#160;&#160;4</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One per active UDP "connection". (requires the LWIP_UDP option) </p>
+
+</div>
+</div>
+<a id="ga50eaadc4cad0716410332691e382c38a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga50eaadc4cad0716410332691e382c38a">&#9670;&nbsp;</a></span>PBUF_POOL_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_POOL_SIZE&#160;&#160;&#160;16</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>PBUF_POOL_SIZE: the number of buffers in the pbuf pool. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__memp.js b/doc/doxygen/output/html/group__lwip__opts__memp.js
new file mode 100644
index 0000000..fbd2275
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__memp.js
@@ -0,0 +1,28 @@
+var group__lwip__opts__memp =
+[
+    [ "LWIP_NUM_SYS_TIMEOUT_INTERNAL", "group__lwip__opts__memp.html#ga87a05debb46ff82093d0e6dc1aad8804", null ],
+    [ "MEMP_NUM_ALTCP_PCB", "group__lwip__opts__memp.html#ga24f6737ee990990b81b0d16ef6e0dffd", null ],
+    [ "MEMP_NUM_API_MSG", "group__lwip__opts__memp.html#ga5a95abf3610c56e7c23cb035eb9c3444", null ],
+    [ "MEMP_NUM_ARP_QUEUE", "group__lwip__opts__memp.html#ga087b00ea20a7edebcad33a1a1353a5d7", null ],
+    [ "MEMP_NUM_DNS_API_MSG", "group__lwip__opts__memp.html#ga3b1f228c598529c62895ad04ff294980", null ],
+    [ "MEMP_NUM_FRAG_PBUF", "group__lwip__opts__memp.html#ga1f66051a654dcd7a4e19bc6aff240630", null ],
+    [ "MEMP_NUM_IGMP_GROUP", "group__lwip__opts__memp.html#gab648ff95d8ffa4216b95f82a568a5d9a", null ],
+    [ "MEMP_NUM_LOCALHOSTLIST", "group__lwip__opts__memp.html#gaa9b0f949da12cbe8fe5f7aefc30290e0", null ],
+    [ "MEMP_NUM_NETBUF", "group__lwip__opts__memp.html#ga5d99df65869ac101ed6a611fc85016be", null ],
+    [ "MEMP_NUM_NETCONN", "group__lwip__opts__memp.html#gacb40bd726b7e15593b20a628d298f456", null ],
+    [ "MEMP_NUM_NETDB", "group__lwip__opts__memp.html#ga293bc22b60bf3f8e2520f60a88370e7a", null ],
+    [ "MEMP_NUM_NETIFAPI_MSG", "group__lwip__opts__memp.html#gadd5a973b98068ce9318ea2f96b5fa14c", null ],
+    [ "MEMP_NUM_PBUF", "group__lwip__opts__memp.html#ga92b30aed958ec59334d936d4ca725418", null ],
+    [ "MEMP_NUM_RAW_PCB", "group__lwip__opts__memp.html#ga379bf92ed322cda54cb701337421e0d3", null ],
+    [ "MEMP_NUM_REASSDATA", "group__lwip__opts__memp.html#ga169436c5860253b90e25bdba9fdcac86", null ],
+    [ "MEMP_NUM_SELECT_CB", "group__lwip__opts__memp.html#ga8e136f5811e6652c6c5d2fcf596f0893", null ],
+    [ "MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA", "group__lwip__opts__memp.html#gacf9782dd26bf8a655044dc041a9de948", null ],
+    [ "MEMP_NUM_SYS_TIMEOUT", "group__lwip__opts__memp.html#ga4afbdca581a58d57bc7a81118a95327e", null ],
+    [ "MEMP_NUM_TCP_PCB", "group__lwip__opts__memp.html#ga73beecc19cfbc3114768f9b32b2cd70e", null ],
+    [ "MEMP_NUM_TCP_PCB_LISTEN", "group__lwip__opts__memp.html#ga04fba6a249123513271dccb4ec26aa5a", null ],
+    [ "MEMP_NUM_TCP_SEG", "group__lwip__opts__memp.html#gaa35fb3a1a76661e3ffb9722a57092de3", null ],
+    [ "MEMP_NUM_TCPIP_MSG_API", "group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c", null ],
+    [ "MEMP_NUM_TCPIP_MSG_INPKT", "group__lwip__opts__memp.html#gab089a7088439e726c3801ba9e249d831", null ],
+    [ "MEMP_NUM_UDP_PCB", "group__lwip__opts__memp.html#ga2c416da481ab09bd1ba257b75a0707eb", null ],
+    [ "PBUF_POOL_SIZE", "group__lwip__opts__memp.html#ga50eaadc4cad0716410332691e382c38a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__mib2.html b/doc/doxygen/output/html/group__lwip__opts__mib2.html
new file mode 100644
index 0000000..02e234b
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__mib2.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: SNMP MIB2 callbacks</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__mib2.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">SNMP MIB2 callbacks<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__infrastructure.html">Infrastructure</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem: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>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="gad84d6a781880cec19a1ef4b2339fea29"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad84d6a781880cec19a1ef4b2339fea29">&#9670;&nbsp;</a></span>LWIP_MIB2_CALLBACKS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_MIB2_CALLBACKS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_MIB2_CALLBACKS==1: Turn on SNMP MIB2 callbacks. Turn this on to get callbacks needed to implement MIB2. Usually MIB2_STATS should be enabled, too. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__mib2.js b/doc/doxygen/output/html/group__lwip__opts__mib2.js
new file mode 100644
index 0000000..68574fe
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__mib2.js
@@ -0,0 +1,4 @@
+var group__lwip__opts__mib2 =
+[
+    [ "LWIP_MIB2_CALLBACKS", "group__lwip__opts__mib2.html#gad84d6a781880cec19a1ef4b2339fea29", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__mld6.html b/doc/doxygen/output/html/group__lwip__opts__mld6.html
new file mode 100644
index 0000000..62fcdd7
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__mld6.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Multicast listener discovery</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__mld6.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Multicast listener discovery<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__ipv6.html">IPv6</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga44d8f24eaebbc50221ac1336212a3528"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528">LWIP_IPV6_MLD</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a></td></tr>
+<tr class="separator:ga44d8f24eaebbc50221ac1336212a3528"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga89e92d8de8898696e797f13fdd169494"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mld6.html#ga89e92d8de8898696e797f13fdd169494">MEMP_NUM_MLD6_GROUP</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:ga89e92d8de8898696e797f13fdd169494"><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="ga44d8f24eaebbc50221ac1336212a3528"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga44d8f24eaebbc50221ac1336212a3528">&#9670;&nbsp;</a></span>LWIP_IPV6_MLD</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IPV6_MLD&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_IPV6_MLD==1: Enable multicast listener discovery protocol. If LWIP_IPV6 is enabled but this setting is disabled, the MAC layer must indiscriminately pass all inbound IPv6 multicast traffic to lwIP. </p>
+
+</div>
+</div>
+<a id="ga89e92d8de8898696e797f13fdd169494"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga89e92d8de8898696e797f13fdd169494">&#9670;&nbsp;</a></span>MEMP_NUM_MLD6_GROUP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_MLD6_GROUP&#160;&#160;&#160;4</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_MLD6_GROUP: Max number of IPv6 multicast groups that can be joined. There must be enough groups so that each netif can join the solicited-node multicast group for each of its local addresses, plus one for MDNS if applicable, plus any number of groups to be joined on UDP sockets. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__mld6.js b/doc/doxygen/output/html/group__lwip__opts__mld6.js
new file mode 100644
index 0000000..a83b124
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__mld6.js
@@ -0,0 +1,5 @@
+var group__lwip__opts__mld6 =
+[
+    [ "LWIP_IPV6_MLD", "group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528", null ],
+    [ "MEMP_NUM_MLD6_GROUP", "group__lwip__opts__mld6.html#ga89e92d8de8898696e797f13fdd169494", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__multicast.html b/doc/doxygen/output/html/group__lwip__opts__multicast.html
new file mode 100644
index 0000000..1b46469
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__multicast.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Multicast</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__multicast.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Multicast<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__infrastructure.html">Infrastructure</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem: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>
+<tr class="separator:gab8d7d53247cc62caa76f54b2c5a5df30"><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="gab8d7d53247cc62caa76f54b2c5a5df30"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab8d7d53247cc62caa76f54b2c5a5df30">&#9670;&nbsp;</a></span>LWIP_MULTICAST_TX_OPTIONS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_MULTICAST_TX_OPTIONS&#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>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_MULTICAST_TX_OPTIONS==1: Enable multicast TX support like the socket options IP_MULTICAST_TTL/IP_MULTICAST_IF/IP_MULTICAST_LOOP, as well as (currently only) core support for the corresponding IPv6 options. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__multicast.js b/doc/doxygen/output/html/group__lwip__opts__multicast.js
new file mode 100644
index 0000000..2c0e28f
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__multicast.js
@@ -0,0 +1,4 @@
+var group__lwip__opts__multicast =
+[
+    [ "LWIP_MULTICAST_TX_OPTIONS", "group__lwip__opts__multicast.html#gab8d7d53247cc62caa76f54b2c5a5df30", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__nd6.html b/doc/doxygen/output/html/group__lwip__opts__nd6.html
new file mode 100644
index 0000000..dd41297
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__nd6.html
@@ -0,0 +1,379 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Neighbor discovery</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__nd6.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Neighbor discovery<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__ipv6.html">IPv6</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga0757a3c1b5d1563ad2d77228e1d8a60f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga0757a3c1b5d1563ad2d77228e1d8a60f">LWIP_ND6_QUEUEING</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a></td></tr>
+<tr class="separator:ga0757a3c1b5d1563ad2d77228e1d8a60f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabfaf3d92d51e2a9d70c8360af2611fb2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#gabfaf3d92d51e2a9d70c8360af2611fb2">MEMP_NUM_ND6_QUEUE</a>&#160;&#160;&#160;20</td></tr>
+<tr class="separator:gabfaf3d92d51e2a9d70c8360af2611fb2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab2fe15bdb4e0a41f295eb5577b11ad16"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#gab2fe15bdb4e0a41f295eb5577b11ad16">LWIP_ND6_NUM_NEIGHBORS</a>&#160;&#160;&#160;10</td></tr>
+<tr class="separator:gab2fe15bdb4e0a41f295eb5577b11ad16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacad118b1ae886e80137a1d4f0fb19672"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#gacad118b1ae886e80137a1d4f0fb19672">LWIP_ND6_NUM_DESTINATIONS</a>&#160;&#160;&#160;10</td></tr>
+<tr class="separator:gacad118b1ae886e80137a1d4f0fb19672"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad9cc576b5951f1b5e1c2b0d0bb831d9a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#gad9cc576b5951f1b5e1c2b0d0bb831d9a">LWIP_ND6_NUM_PREFIXES</a>&#160;&#160;&#160;5</td></tr>
+<tr class="separator:gad9cc576b5951f1b5e1c2b0d0bb831d9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga75e81a96148f266c8fad8c0bcab2f36a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga75e81a96148f266c8fad8c0bcab2f36a">LWIP_ND6_NUM_ROUTERS</a>&#160;&#160;&#160;3</td></tr>
+<tr class="separator:ga75e81a96148f266c8fad8c0bcab2f36a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga980909018aed54adc10dd68be3572b30"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga980909018aed54adc10dd68be3572b30">LWIP_ND6_MAX_MULTICAST_SOLICIT</a>&#160;&#160;&#160;3</td></tr>
+<tr class="separator:ga980909018aed54adc10dd68be3572b30"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafa6f4c2d2c259ab0895fa03a6f08c691"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#gafa6f4c2d2c259ab0895fa03a6f08c691">LWIP_ND6_MAX_UNICAST_SOLICIT</a>&#160;&#160;&#160;3</td></tr>
+<tr class="separator:gafa6f4c2d2c259ab0895fa03a6f08c691"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga960b8973df083fad53ae0eaa79f8c4df"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga960b8973df083fad53ae0eaa79f8c4df">LWIP_ND6_MAX_ANYCAST_DELAY_TIME</a>&#160;&#160;&#160;1000</td></tr>
+<tr class="separator:ga960b8973df083fad53ae0eaa79f8c4df"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga86ab0cac87cdc7aeff09384ddbaaba2a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga86ab0cac87cdc7aeff09384ddbaaba2a">LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT</a>&#160;&#160;&#160;3</td></tr>
+<tr class="separator:ga86ab0cac87cdc7aeff09384ddbaaba2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga269db9d61cdfc2fd3bc7b12c56261c74"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga269db9d61cdfc2fd3bc7b12c56261c74">LWIP_ND6_REACHABLE_TIME</a>&#160;&#160;&#160;30000</td></tr>
+<tr class="separator:ga269db9d61cdfc2fd3bc7b12c56261c74"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga461abcbeef1d236d1f3201827dd28ad9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga461abcbeef1d236d1f3201827dd28ad9">LWIP_ND6_RETRANS_TIMER</a>&#160;&#160;&#160;1000</td></tr>
+<tr class="separator:ga461abcbeef1d236d1f3201827dd28ad9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga315bd6d4a9d185766dfc3253cd9d7715"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga315bd6d4a9d185766dfc3253cd9d7715">LWIP_ND6_DELAY_FIRST_PROBE_TIME</a>&#160;&#160;&#160;5000</td></tr>
+<tr class="separator:ga315bd6d4a9d185766dfc3253cd9d7715"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad35d10353ac7c7d2c8d4b83788cdc6d9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#gad35d10353ac7c7d2c8d4b83788cdc6d9">LWIP_ND6_ALLOW_RA_UPDATES</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gad35d10353ac7c7d2c8d4b83788cdc6d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9d7cb6fd447ef0f6726f565e2c7509c4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga9d7cb6fd447ef0f6726f565e2c7509c4">LWIP_ND6_TCP_REACHABILITY_HINTS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga9d7cb6fd447ef0f6726f565e2c7509c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaea4d829c0b52cc6cc28925eee89a7429"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#gaea4d829c0b52cc6cc28925eee89a7429">LWIP_ND6_RDNSS_MAX_DNS_SERVERS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaea4d829c0b52cc6cc28925eee89a7429"><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="gad35d10353ac7c7d2c8d4b83788cdc6d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad35d10353ac7c7d2c8d4b83788cdc6d9">&#9670;&nbsp;</a></span>LWIP_ND6_ALLOW_RA_UPDATES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ND6_ALLOW_RA_UPDATES&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ND6_ALLOW_RA_UPDATES==1: Allow Router Advertisement messages to update Reachable time and retransmission timers, and netif MTU. </p>
+
+</div>
+</div>
+<a id="ga315bd6d4a9d185766dfc3253cd9d7715"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga315bd6d4a9d185766dfc3253cd9d7715">&#9670;&nbsp;</a></span>LWIP_ND6_DELAY_FIRST_PROBE_TIME</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ND6_DELAY_FIRST_PROBE_TIME&#160;&#160;&#160;5000</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ND6_DELAY_FIRST_PROBE_TIME: Delay before first unicast neighbor solicitation message is sent, during neighbor reachability detection. </p>
+
+</div>
+</div>
+<a id="ga960b8973df083fad53ae0eaa79f8c4df"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga960b8973df083fad53ae0eaa79f8c4df">&#9670;&nbsp;</a></span>LWIP_ND6_MAX_ANYCAST_DELAY_TIME</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ND6_MAX_ANYCAST_DELAY_TIME&#160;&#160;&#160;1000</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Unused: See ND RFC (time in milliseconds). </p>
+
+</div>
+</div>
+<a id="ga980909018aed54adc10dd68be3572b30"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga980909018aed54adc10dd68be3572b30">&#9670;&nbsp;</a></span>LWIP_ND6_MAX_MULTICAST_SOLICIT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ND6_MAX_MULTICAST_SOLICIT&#160;&#160;&#160;3</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ND6_MAX_MULTICAST_SOLICIT: max number of multicast solicit messages to send (neighbor solicit and router solicit) </p>
+
+</div>
+</div>
+<a id="ga86ab0cac87cdc7aeff09384ddbaaba2a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga86ab0cac87cdc7aeff09384ddbaaba2a">&#9670;&nbsp;</a></span>LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT&#160;&#160;&#160;3</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Unused: See ND RFC </p>
+
+</div>
+</div>
+<a id="gafa6f4c2d2c259ab0895fa03a6f08c691"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafa6f4c2d2c259ab0895fa03a6f08c691">&#9670;&nbsp;</a></span>LWIP_ND6_MAX_UNICAST_SOLICIT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ND6_MAX_UNICAST_SOLICIT&#160;&#160;&#160;3</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ND6_MAX_UNICAST_SOLICIT: max number of unicast neighbor solicitation messages to send during neighbor reachability detection. </p>
+
+</div>
+</div>
+<a id="gacad118b1ae886e80137a1d4f0fb19672"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacad118b1ae886e80137a1d4f0fb19672">&#9670;&nbsp;</a></span>LWIP_ND6_NUM_DESTINATIONS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ND6_NUM_DESTINATIONS&#160;&#160;&#160;10</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ND6_NUM_DESTINATIONS: number of entries in IPv6 destination cache </p>
+
+</div>
+</div>
+<a id="gab2fe15bdb4e0a41f295eb5577b11ad16"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab2fe15bdb4e0a41f295eb5577b11ad16">&#9670;&nbsp;</a></span>LWIP_ND6_NUM_NEIGHBORS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ND6_NUM_NEIGHBORS&#160;&#160;&#160;10</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ND6_NUM_NEIGHBORS: Number of entries in IPv6 neighbor cache </p>
+
+</div>
+</div>
+<a id="gad9cc576b5951f1b5e1c2b0d0bb831d9a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad9cc576b5951f1b5e1c2b0d0bb831d9a">&#9670;&nbsp;</a></span>LWIP_ND6_NUM_PREFIXES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ND6_NUM_PREFIXES&#160;&#160;&#160;5</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ND6_NUM_PREFIXES: number of entries in IPv6 on-link prefixes cache </p>
+
+</div>
+</div>
+<a id="ga75e81a96148f266c8fad8c0bcab2f36a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga75e81a96148f266c8fad8c0bcab2f36a">&#9670;&nbsp;</a></span>LWIP_ND6_NUM_ROUTERS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ND6_NUM_ROUTERS&#160;&#160;&#160;3</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ND6_NUM_ROUTERS: number of entries in IPv6 default router cache </p>
+
+</div>
+</div>
+<a id="ga0757a3c1b5d1563ad2d77228e1d8a60f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0757a3c1b5d1563ad2d77228e1d8a60f">&#9670;&nbsp;</a></span>LWIP_ND6_QUEUEING</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ND6_QUEUEING&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ND6_QUEUEING==1: queue outgoing IPv6 packets while MAC address is being resolved. </p>
+
+</div>
+</div>
+<a id="gaea4d829c0b52cc6cc28925eee89a7429"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaea4d829c0b52cc6cc28925eee89a7429">&#9670;&nbsp;</a></span>LWIP_ND6_RDNSS_MAX_DNS_SERVERS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ND6_RDNSS_MAX_DNS_SERVERS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ND6_RDNSS_MAX_DNS_SERVERS &gt; 0: Use IPv6 Router Advertisement Recursive DNS Server Option (as per RFC 6106) to copy a defined maximum number of DNS servers to the DNS module. </p>
+
+</div>
+</div>
+<a id="ga269db9d61cdfc2fd3bc7b12c56261c74"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga269db9d61cdfc2fd3bc7b12c56261c74">&#9670;&nbsp;</a></span>LWIP_ND6_REACHABLE_TIME</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ND6_REACHABLE_TIME&#160;&#160;&#160;30000</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ND6_REACHABLE_TIME: default neighbor reachable time (in milliseconds). May be updated by router advertisement messages. </p>
+
+</div>
+</div>
+<a id="ga461abcbeef1d236d1f3201827dd28ad9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga461abcbeef1d236d1f3201827dd28ad9">&#9670;&nbsp;</a></span>LWIP_ND6_RETRANS_TIMER</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ND6_RETRANS_TIMER&#160;&#160;&#160;1000</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ND6_RETRANS_TIMER: default retransmission timer for solicitation messages </p>
+
+</div>
+</div>
+<a id="ga9d7cb6fd447ef0f6726f565e2c7509c4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9d7cb6fd447ef0f6726f565e2c7509c4">&#9670;&nbsp;</a></span>LWIP_ND6_TCP_REACHABILITY_HINTS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ND6_TCP_REACHABILITY_HINTS&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ND6_TCP_REACHABILITY_HINTS==1: Allow TCP to provide Neighbor Discovery with reachability hints for connected destinations. This helps avoid sending unicast neighbor solicitation messages. </p>
+
+</div>
+</div>
+<a id="gabfaf3d92d51e2a9d70c8360af2611fb2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabfaf3d92d51e2a9d70c8360af2611fb2">&#9670;&nbsp;</a></span>MEMP_NUM_ND6_QUEUE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_NUM_ND6_QUEUE&#160;&#160;&#160;20</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_NUM_ND6_QUEUE: Max number of IPv6 packets to queue during MAC resolution. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__nd6.js b/doc/doxygen/output/html/group__lwip__opts__nd6.js
new file mode 100644
index 0000000..50f5fd6
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__nd6.js
@@ -0,0 +1,19 @@
+var group__lwip__opts__nd6 =
+[
+    [ "LWIP_ND6_ALLOW_RA_UPDATES", "group__lwip__opts__nd6.html#gad35d10353ac7c7d2c8d4b83788cdc6d9", null ],
+    [ "LWIP_ND6_DELAY_FIRST_PROBE_TIME", "group__lwip__opts__nd6.html#ga315bd6d4a9d185766dfc3253cd9d7715", null ],
+    [ "LWIP_ND6_MAX_ANYCAST_DELAY_TIME", "group__lwip__opts__nd6.html#ga960b8973df083fad53ae0eaa79f8c4df", null ],
+    [ "LWIP_ND6_MAX_MULTICAST_SOLICIT", "group__lwip__opts__nd6.html#ga980909018aed54adc10dd68be3572b30", null ],
+    [ "LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT", "group__lwip__opts__nd6.html#ga86ab0cac87cdc7aeff09384ddbaaba2a", null ],
+    [ "LWIP_ND6_MAX_UNICAST_SOLICIT", "group__lwip__opts__nd6.html#gafa6f4c2d2c259ab0895fa03a6f08c691", null ],
+    [ "LWIP_ND6_NUM_DESTINATIONS", "group__lwip__opts__nd6.html#gacad118b1ae886e80137a1d4f0fb19672", null ],
+    [ "LWIP_ND6_NUM_NEIGHBORS", "group__lwip__opts__nd6.html#gab2fe15bdb4e0a41f295eb5577b11ad16", null ],
+    [ "LWIP_ND6_NUM_PREFIXES", "group__lwip__opts__nd6.html#gad9cc576b5951f1b5e1c2b0d0bb831d9a", null ],
+    [ "LWIP_ND6_NUM_ROUTERS", "group__lwip__opts__nd6.html#ga75e81a96148f266c8fad8c0bcab2f36a", null ],
+    [ "LWIP_ND6_QUEUEING", "group__lwip__opts__nd6.html#ga0757a3c1b5d1563ad2d77228e1d8a60f", null ],
+    [ "LWIP_ND6_RDNSS_MAX_DNS_SERVERS", "group__lwip__opts__nd6.html#gaea4d829c0b52cc6cc28925eee89a7429", null ],
+    [ "LWIP_ND6_REACHABLE_TIME", "group__lwip__opts__nd6.html#ga269db9d61cdfc2fd3bc7b12c56261c74", null ],
+    [ "LWIP_ND6_RETRANS_TIMER", "group__lwip__opts__nd6.html#ga461abcbeef1d236d1f3201827dd28ad9", null ],
+    [ "LWIP_ND6_TCP_REACHABILITY_HINTS", "group__lwip__opts__nd6.html#ga9d7cb6fd447ef0f6726f565e2c7509c4", null ],
+    [ "MEMP_NUM_ND6_QUEUE", "group__lwip__opts__nd6.html#gabfaf3d92d51e2a9d70c8360af2611fb2", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__netconn.html b/doc/doxygen/output/html/group__lwip__opts__netconn.html
new file mode 100644
index 0000000..54d60c4
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__netconn.html
@@ -0,0 +1,182 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Netconn</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__netconn.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Netconn<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__threadsafe__apis.html">Thread-safe APIs</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga478041b8544461258f6961bf0f3c1a77"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netconn.html#ga478041b8544461258f6961bf0f3c1a77">LWIP_NETCONN</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga478041b8544461258f6961bf0f3c1a77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1cd8d15a42262a0defaedabed126ea99"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netconn.html#ga1cd8d15a42262a0defaedabed126ea99">LWIP_TCPIP_TIMEOUT</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga1cd8d15a42262a0defaedabed126ea99"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2543345adf7d2c307df78a54ac2ba8c4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netconn.html#ga2543345adf7d2c307df78a54ac2ba8c4">LWIP_NETCONN_SEM_PER_THREAD</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga2543345adf7d2c307df78a54ac2ba8c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7bfe8487a3abffdd9d6730977d22c406"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netconn.html#ga7bfe8487a3abffdd9d6730977d22c406">LWIP_NETCONN_FULLDUPLEX</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga7bfe8487a3abffdd9d6730977d22c406"><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="ga478041b8544461258f6961bf0f3c1a77"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga478041b8544461258f6961bf0f3c1a77">&#9670;&nbsp;</a></span>LWIP_NETCONN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NETCONN&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETCONN==1: Enable Netconn API (require to use <a class="el" href="api__lib_8c.html">api_lib.c</a>) </p>
+
+</div>
+</div>
+<a id="ga7bfe8487a3abffdd9d6730977d22c406"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7bfe8487a3abffdd9d6730977d22c406">&#9670;&nbsp;</a></span>LWIP_NETCONN_FULLDUPLEX</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NETCONN_FULLDUPLEX&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETCONN_FULLDUPLEX==1: Enable code that allows reading from one thread, writing from a 2nd thread and closing from a 3rd thread at the same time. ATTENTION: This is currently really alpha! Some requirements:</p><ul>
+<li>LWIP_NETCONN_SEM_PER_THREAD==1 is required to use one socket/netconn from multiple threads at once</li>
+<li><a class="el" href="group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f">sys_mbox_free()</a> has to unblock receive tasks waiting on recvmbox/acceptmbox and prevent a task pending on this during/after deletion </li>
+</ul>
+
+</div>
+</div>
+<a id="ga2543345adf7d2c307df78a54ac2ba8c4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2543345adf7d2c307df78a54ac2ba8c4">&#9670;&nbsp;</a></span>LWIP_NETCONN_SEM_PER_THREAD</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NETCONN_SEM_PER_THREAD&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETCONN_SEM_PER_THREAD==1: Use one (thread-local) semaphore per thread calling socket/netconn functions instead of allocating one semaphore per netconn (and per select etc.) ATTENTION: a thread-local semaphore for API calls is needed:</p><ul>
+<li>LWIP_NETCONN_THREAD_SEM_GET() returning a sys_sem_t*</li>
+<li>LWIP_NETCONN_THREAD_SEM_ALLOC() creating the semaphore</li>
+<li>LWIP_NETCONN_THREAD_SEM_FREE() freeing the semaphore The latter 2 can be invoked up by calling netconn_thread_init()/netconn_thread_cleanup(). Ports may call these for threads created with <a class="el" href="group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a">sys_thread_new()</a>. </li>
+</ul>
+
+</div>
+</div>
+<a id="ga1cd8d15a42262a0defaedabed126ea99"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1cd8d15a42262a0defaedabed126ea99">&#9670;&nbsp;</a></span>LWIP_TCPIP_TIMEOUT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_TCPIP_TIMEOUT&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_TCPIP_TIMEOUT==1: Enable tcpip_timeout/tcpip_untimeout to create timers running in tcpip_thread from another thread. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__netconn.js b/doc/doxygen/output/html/group__lwip__opts__netconn.js
new file mode 100644
index 0000000..ba24b54
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__netconn.js
@@ -0,0 +1,7 @@
+var group__lwip__opts__netconn =
+[
+    [ "LWIP_NETCONN", "group__lwip__opts__netconn.html#ga478041b8544461258f6961bf0f3c1a77", null ],
+    [ "LWIP_NETCONN_FULLDUPLEX", "group__lwip__opts__netconn.html#ga7bfe8487a3abffdd9d6730977d22c406", null ],
+    [ "LWIP_NETCONN_SEM_PER_THREAD", "group__lwip__opts__netconn.html#ga2543345adf7d2c307df78a54ac2ba8c4", null ],
+    [ "LWIP_TCPIP_TIMEOUT", "group__lwip__opts__netconn.html#ga1cd8d15a42262a0defaedabed126ea99", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__netif.html b/doc/doxygen/output/html/group__lwip__opts__netif.html
new file mode 100644
index 0000000..0943ec5
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__netif.html
@@ -0,0 +1,284 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: NETIF</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__netif.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">NETIF<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__lwip__opts__loop"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__loop.html">Loopback interface</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga943063b053eeac76b0b1bcef2ddd93be"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be">LWIP_SINGLE_NETIF</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga943063b053eeac76b0b1bcef2ddd93be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa714dbfa66822ec4c6111bdb8cf753c1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#gaa714dbfa66822ec4c6111bdb8cf753c1">LWIP_NETIF_HOSTNAME</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaa714dbfa66822ec4c6111bdb8cf753c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadd45fb65f2d0e6de5a0d14ff9e101b77"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#gadd45fb65f2d0e6de5a0d14ff9e101b77">LWIP_NETIF_API</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gadd45fb65f2d0e6de5a0d14ff9e101b77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaffb97d89516c38d3fcb9e44e5d707f36"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#gaffb97d89516c38d3fcb9e44e5d707f36">LWIP_NETIF_STATUS_CALLBACK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaffb97d89516c38d3fcb9e44e5d707f36"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga090482867ba04d442ab5b8ad745c0e1e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#ga090482867ba04d442ab5b8ad745c0e1e">LWIP_NETIF_EXT_STATUS_CALLBACK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga090482867ba04d442ab5b8ad745c0e1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1a446932dd927cc4136ba654c13bb97b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#ga1a446932dd927cc4136ba654c13bb97b">LWIP_NETIF_LINK_CALLBACK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga1a446932dd927cc4136ba654c13bb97b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9c942c2e9655b06d4f73c630d30f60bf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#ga9c942c2e9655b06d4f73c630d30f60bf">LWIP_NETIF_REMOVE_CALLBACK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga9c942c2e9655b06d4f73c630d30f60bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad1d5e878d94b56ba687cef69be936ad9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#gad1d5e878d94b56ba687cef69be936ad9">LWIP_NETIF_HWADDRHINT</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gad1d5e878d94b56ba687cef69be936ad9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabafb9f64a80e51b56c0abbcfc1f7e04e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#gabafb9f64a80e51b56c0abbcfc1f7e04e">LWIP_NETIF_TX_SINGLE_PBUF</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gabafb9f64a80e51b56c0abbcfc1f7e04e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga94a35212616f9a9aae5c98741612b936"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#ga94a35212616f9a9aae5c98741612b936">LWIP_NUM_NETIF_CLIENT_DATA</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga94a35212616f9a9aae5c98741612b936"><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="gadd45fb65f2d0e6de5a0d14ff9e101b77"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadd45fb65f2d0e6de5a0d14ff9e101b77">&#9670;&nbsp;</a></span>LWIP_NETIF_API</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NETIF_API&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETIF_API==1: Support netif api (in <a class="el" href="netifapi_8c.html">netifapi.c</a>) </p>
+
+</div>
+</div>
+<a id="ga090482867ba04d442ab5b8ad745c0e1e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga090482867ba04d442ab5b8ad745c0e1e">&#9670;&nbsp;</a></span>LWIP_NETIF_EXT_STATUS_CALLBACK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NETIF_EXT_STATUS_CALLBACK&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETIF_EXT_STATUS_CALLBACK==1: Support an extended callback function for several netif related event that supports multiple subscribers. </p><dl class="section see"><dt>See also</dt><dd>netif_ext_status_callback </dd></dl>
+
+</div>
+</div>
+<a id="gaa714dbfa66822ec4c6111bdb8cf753c1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa714dbfa66822ec4c6111bdb8cf753c1">&#9670;&nbsp;</a></span>LWIP_NETIF_HOSTNAME</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NETIF_HOSTNAME&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETIF_HOSTNAME==1: use DHCP_OPTION_HOSTNAME with netif's hostname field. </p>
+
+</div>
+</div>
+<a id="gad1d5e878d94b56ba687cef69be936ad9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad1d5e878d94b56ba687cef69be936ad9">&#9670;&nbsp;</a></span>LWIP_NETIF_HWADDRHINT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NETIF_HWADDRHINT&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETIF_HWADDRHINT==1: Cache link-layer-address hints (e.g. table indices) in struct netif. TCP and UDP can make use of this to prevent scanning the ARP table for every sent packet. While this is faster for big ARP tables or many concurrent connections, it might be counterproductive if you have a tiny ARP table or if there never are concurrent connections. </p>
+
+</div>
+</div>
+<a id="ga1a446932dd927cc4136ba654c13bb97b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1a446932dd927cc4136ba654c13bb97b">&#9670;&nbsp;</a></span>LWIP_NETIF_LINK_CALLBACK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NETIF_LINK_CALLBACK&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface whenever the link changes (i.e., link down) </p>
+
+</div>
+</div>
+<a id="ga9c942c2e9655b06d4f73c630d30f60bf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9c942c2e9655b06d4f73c630d30f60bf">&#9670;&nbsp;</a></span>LWIP_NETIF_REMOVE_CALLBACK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NETIF_REMOVE_CALLBACK&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETIF_REMOVE_CALLBACK==1: Support a callback function that is called when a netif has been removed </p>
+
+</div>
+</div>
+<a id="gaffb97d89516c38d3fcb9e44e5d707f36"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaffb97d89516c38d3fcb9e44e5d707f36">&#9670;&nbsp;</a></span>LWIP_NETIF_STATUS_CALLBACK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NETIF_STATUS_CALLBACK&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETIF_STATUS_CALLBACK==1: Support a callback function whenever an interface changes its up/down status (i.e., due to DHCP IP acquisition) </p>
+
+</div>
+</div>
+<a id="gabafb9f64a80e51b56c0abbcfc1f7e04e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabafb9f64a80e51b56c0abbcfc1f7e04e">&#9670;&nbsp;</a></span>LWIP_NETIF_TX_SINGLE_PBUF</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NETIF_TX_SINGLE_PBUF&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETIF_TX_SINGLE_PBUF: if this is set to 1, lwIP <em>tries</em> to put all data to be sent into one single pbuf. This is for compatibility with DMA-enabled MACs that do not support scatter-gather. Beware that this might involve CPU-memcpy before transmitting that would not be needed without this flag! Use this only if you need to!</p>
+<p>ATTENTION: a driver should <em>NOT</em> rely on getting single pbufs but check TX pbufs for being in one piece. If not, <a class="el" href="group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0">pbuf_clone</a> can be used to get a single pbuf: if (p-&gt;next != NULL) { struct pbuf *q = pbuf_clone(PBUF_RAW, PBUF_RAM, p); if (q == NULL) { return ERR_MEM; } p = q; ATTENTION: do NOT free the old 'p' as the ref belongs to the caller! } </p>
+
+</div>
+</div>
+<a id="ga94a35212616f9a9aae5c98741612b936"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga94a35212616f9a9aae5c98741612b936">&#9670;&nbsp;</a></span>LWIP_NUM_NETIF_CLIENT_DATA</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NUM_NETIF_CLIENT_DATA&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NUM_NETIF_CLIENT_DATA: Number of clients that may store data in client_data member array of struct netif (max. 256). </p>
+
+</div>
+</div>
+<a id="ga943063b053eeac76b0b1bcef2ddd93be"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga943063b053eeac76b0b1bcef2ddd93be">&#9670;&nbsp;</a></span>LWIP_SINGLE_NETIF</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_SINGLE_NETIF&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_SINGLE_NETIF==1: use a single netif only. This is the common case for small real-life targets. Some code like routing etc. can be left out. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__netif.js b/doc/doxygen/output/html/group__lwip__opts__netif.js
new file mode 100644
index 0000000..28ba081
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__netif.js
@@ -0,0 +1,14 @@
+var group__lwip__opts__netif =
+[
+    [ "Loopback interface", "group__lwip__opts__loop.html", "group__lwip__opts__loop" ],
+    [ "LWIP_NETIF_API", "group__lwip__opts__netif.html#gadd45fb65f2d0e6de5a0d14ff9e101b77", null ],
+    [ "LWIP_NETIF_EXT_STATUS_CALLBACK", "group__lwip__opts__netif.html#ga090482867ba04d442ab5b8ad745c0e1e", null ],
+    [ "LWIP_NETIF_HOSTNAME", "group__lwip__opts__netif.html#gaa714dbfa66822ec4c6111bdb8cf753c1", null ],
+    [ "LWIP_NETIF_HWADDRHINT", "group__lwip__opts__netif.html#gad1d5e878d94b56ba687cef69be936ad9", null ],
+    [ "LWIP_NETIF_LINK_CALLBACK", "group__lwip__opts__netif.html#ga1a446932dd927cc4136ba654c13bb97b", null ],
+    [ "LWIP_NETIF_REMOVE_CALLBACK", "group__lwip__opts__netif.html#ga9c942c2e9655b06d4f73c630d30f60bf", null ],
+    [ "LWIP_NETIF_STATUS_CALLBACK", "group__lwip__opts__netif.html#gaffb97d89516c38d3fcb9e44e5d707f36", null ],
+    [ "LWIP_NETIF_TX_SINGLE_PBUF", "group__lwip__opts__netif.html#gabafb9f64a80e51b56c0abbcfc1f7e04e", null ],
+    [ "LWIP_NUM_NETIF_CLIENT_DATA", "group__lwip__opts__netif.html#ga94a35212616f9a9aae5c98741612b936", null ],
+    [ "LWIP_SINGLE_NETIF", "group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__nosys.html b/doc/doxygen/output/html/group__lwip__opts__nosys.html
new file mode 100644
index 0000000..9f6095e
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__nosys.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: NO_SYS</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__nosys.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">NO_SYS<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__infrastructure.html">Infrastructure</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gae00ba99de94a5bf84d832be8976df59b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b">NO_SYS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gae00ba99de94a5bf84d832be8976df59b"><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="gae00ba99de94a5bf84d832be8976df59b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae00ba99de94a5bf84d832be8976df59b">&#9670;&nbsp;</a></span>NO_SYS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NO_SYS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>NO_SYS==1: Use lwIP without OS-awareness (no thread, semaphores, mutexes or mboxes). This means threaded APIs cannot be used (socket, netconn, i.e. everything in the 'api' folder), only the callback-style raw API is available (and you have to watch out for yourself that you don't access lwIP functions/structures from more than one context at a time!) </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__nosys.js b/doc/doxygen/output/html/group__lwip__opts__nosys.js
new file mode 100644
index 0000000..a95381c
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__nosys.js
@@ -0,0 +1,4 @@
+var group__lwip__opts__nosys =
+[
+    [ "NO_SYS", "group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__pbuf.html b/doc/doxygen/output/html/group__lwip__opts__pbuf.html
new file mode 100644
index 0000000..70fcce5
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__pbuf.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: PBUF</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__pbuf.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">PBUF<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga35998a3d56af9940e6a80bb372597685"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__pbuf.html#ga35998a3d56af9940e6a80bb372597685">PBUF_LINK_HLEN</a>&#160;&#160;&#160;(14 + <a class="el" href="group__lwip__opts__arp.html#gad7fa3b356ca7e603e848b069c4cc6276">ETH_PAD_SIZE</a>)</td></tr>
+<tr class="separator:ga35998a3d56af9940e6a80bb372597685"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6e1ba1875ae5168a17b53d83597bc1de"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__pbuf.html#ga6e1ba1875ae5168a17b53d83597bc1de">PBUF_LINK_ENCAPSULATION_HLEN</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga6e1ba1875ae5168a17b53d83597bc1de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae61f4491d56e805e79b79eb5d35a00e5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__pbuf.html#gae61f4491d56e805e79b79eb5d35a00e5">PBUF_POOL_BUFSIZE</a>&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18">LWIP_MEM_ALIGN_SIZE</a>(<a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a>+40+<a class="el" href="group__lwip__opts__pbuf.html#ga6e1ba1875ae5168a17b53d83597bc1de">PBUF_LINK_ENCAPSULATION_HLEN</a>+<a class="el" href="group__lwip__opts__pbuf.html#ga35998a3d56af9940e6a80bb372597685">PBUF_LINK_HLEN</a>)</td></tr>
+<tr class="separator:gae61f4491d56e805e79b79eb5d35a00e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaefb80d6bf9257c0f4322c36e1272c38"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__pbuf.html#gaaefb80d6bf9257c0f4322c36e1272c38">LWIP_PBUF_REF_T</a>&#160;&#160;&#160;u8_t</td></tr>
+<tr class="separator:gaaefb80d6bf9257c0f4322c36e1272c38"><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="gaaefb80d6bf9257c0f4322c36e1272c38"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaaefb80d6bf9257c0f4322c36e1272c38">&#9670;&nbsp;</a></span>LWIP_PBUF_REF_T</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_PBUF_REF_T&#160;&#160;&#160;u8_t</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_PBUF_REF_T: Refcount type in pbuf. Default width of u8_t can be increased if 255 refs are not enough for you. </p>
+
+</div>
+</div>
+<a id="ga6e1ba1875ae5168a17b53d83597bc1de"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6e1ba1875ae5168a17b53d83597bc1de">&#9670;&nbsp;</a></span>PBUF_LINK_ENCAPSULATION_HLEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_LINK_ENCAPSULATION_HLEN&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>PBUF_LINK_ENCAPSULATION_HLEN: the number of bytes that should be allocated for an additional encapsulation header before ethernet headers (e.g. 802.11) </p>
+
+</div>
+</div>
+<a id="ga35998a3d56af9940e6a80bb372597685"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga35998a3d56af9940e6a80bb372597685">&#9670;&nbsp;</a></span>PBUF_LINK_HLEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_LINK_HLEN&#160;&#160;&#160;(14 + <a class="el" href="group__lwip__opts__arp.html#gad7fa3b356ca7e603e848b069c4cc6276">ETH_PAD_SIZE</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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. </p>
+
+</div>
+</div>
+<a id="gae61f4491d56e805e79b79eb5d35a00e5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae61f4491d56e805e79b79eb5d35a00e5">&#9670;&nbsp;</a></span>PBUF_POOL_BUFSIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_POOL_BUFSIZE&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18">LWIP_MEM_ALIGN_SIZE</a>(<a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a>+40+<a class="el" href="group__lwip__opts__pbuf.html#ga6e1ba1875ae5168a17b53d83597bc1de">PBUF_LINK_ENCAPSULATION_HLEN</a>+<a class="el" href="group__lwip__opts__pbuf.html#ga35998a3d56af9940e6a80bb372597685">PBUF_LINK_HLEN</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__pbuf.js b/doc/doxygen/output/html/group__lwip__opts__pbuf.js
new file mode 100644
index 0000000..446e3c3
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__pbuf.js
@@ -0,0 +1,7 @@
+var group__lwip__opts__pbuf =
+[
+    [ "LWIP_PBUF_REF_T", "group__lwip__opts__pbuf.html#gaaefb80d6bf9257c0f4322c36e1272c38", null ],
+    [ "PBUF_LINK_ENCAPSULATION_HLEN", "group__lwip__opts__pbuf.html#ga6e1ba1875ae5168a17b53d83597bc1de", null ],
+    [ "PBUF_LINK_HLEN", "group__lwip__opts__pbuf.html#ga35998a3d56af9940e6a80bb372597685", null ],
+    [ "PBUF_POOL_BUFSIZE", "group__lwip__opts__pbuf.html#gae61f4491d56e805e79b79eb5d35a00e5", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__perf.html b/doc/doxygen/output/html/group__lwip__opts__perf.html
new file mode 100644
index 0000000..0ed8329
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__perf.html
@@ -0,0 +1,125 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Performance</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__perf.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Performance<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__debug.html">Debugging</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga44acd95b33e2d58a74455279721298de"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__perf.html#ga44acd95b33e2d58a74455279721298de">LWIP_PERF</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga44acd95b33e2d58a74455279721298de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>LWIP_TESTMODE: Changes to make unit test possible </p>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga44acd95b33e2d58a74455279721298de"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga44acd95b33e2d58a74455279721298de">&#9670;&nbsp;</a></span>LWIP_PERF</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_PERF&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_PERF: Enable performance testing for lwIP (if enabled, arch/perf.h is included) </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__perf.js b/doc/doxygen/output/html/group__lwip__opts__perf.js
new file mode 100644
index 0000000..b640700
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__perf.js
@@ -0,0 +1,4 @@
+var group__lwip__opts__perf =
+[
+    [ "LWIP_PERF", "group__lwip__opts__perf.html#ga44acd95b33e2d58a74455279721298de", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__raw.html b/doc/doxygen/output/html/group__lwip__opts__raw.html
new file mode 100644
index 0000000..6e1ccaf
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__raw.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: RAW</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__raw.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">RAW<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__callback.html">Callback-style APIs</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gaca452be5cb05d9666f8f57e582c39221"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__raw.html#gaca452be5cb05d9666f8f57e582c39221">LWIP_RAW</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaca452be5cb05d9666f8f57e582c39221"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga36e3ffa66073ca0d27d11c422778249c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__raw.html#ga36e3ffa66073ca0d27d11c422778249c">RAW_TTL</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411">IP_DEFAULT_TTL</a></td></tr>
+<tr class="separator:ga36e3ffa66073ca0d27d11c422778249c"><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="gaca452be5cb05d9666f8f57e582c39221"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaca452be5cb05d9666f8f57e582c39221">&#9670;&nbsp;</a></span>LWIP_RAW</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_RAW&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_RAW==1: Enable application layer to hook into the IP layer itself. </p>
+
+</div>
+</div>
+<a id="ga36e3ffa66073ca0d27d11c422778249c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga36e3ffa66073ca0d27d11c422778249c">&#9670;&nbsp;</a></span>RAW_TTL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define RAW_TTL&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411">IP_DEFAULT_TTL</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_RAW==1: Enable application layer to hook into the IP layer itself. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__raw.js b/doc/doxygen/output/html/group__lwip__opts__raw.js
new file mode 100644
index 0000000..e773fc5
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__raw.js
@@ -0,0 +1,5 @@
+var group__lwip__opts__raw =
+[
+    [ "LWIP_RAW", "group__lwip__opts__raw.html#gaca452be5cb05d9666f8f57e582c39221", null ],
+    [ "RAW_TTL", "group__lwip__opts__raw.html#ga36e3ffa66073ca0d27d11c422778249c", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__socket.html b/doc/doxygen/output/html/group__lwip__opts__socket.html
new file mode 100644
index 0000000..7d6673d
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__socket.html
@@ -0,0 +1,396 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Sockets</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__socket.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Sockets<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__threadsafe__apis.html">Thread-safe APIs</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga1cb62ce61ac39d7d6728ae5d3d3b927f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f">LWIP_SOCKET</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga1cb62ce61ac39d7d6728ae5d3d3b927f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafed2811f031822ec5afa1ee211fb7447"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#gafed2811f031822ec5afa1ee211fb7447">LWIP_COMPAT_SOCKETS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gafed2811f031822ec5afa1ee211fb7447"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga484c38ab08f60d5b3335d23d31f9a402"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga484c38ab08f60d5b3335d23d31f9a402">LWIP_POSIX_SOCKETS_IO_NAMES</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga484c38ab08f60d5b3335d23d31f9a402"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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"><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>
+<tr class="separator:ga1162cb685f202d9b21c11344b8209a58"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga91af3ade95b20b9a60c65ed0380fa0ed"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga91af3ade95b20b9a60c65ed0380fa0ed">LWIP_SO_RCVTIMEO</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga91af3ade95b20b9a60c65ed0380fa0ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5b115bacb569763d8a3889a12229e942"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga5b115bacb569763d8a3889a12229e942">LWIP_SO_SNDRCVTIMEO_NONSTANDARD</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga5b115bacb569763d8a3889a12229e942"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga06390cebcf4d13d3d47a11365e5fcd28"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga06390cebcf4d13d3d47a11365e5fcd28">LWIP_SO_RCVBUF</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga06390cebcf4d13d3d47a11365e5fcd28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa91292d5d014dc1c6f1c1f4166269a1d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#gaa91292d5d014dc1c6f1c1f4166269a1d">LWIP_SO_LINGER</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaa91292d5d014dc1c6f1c1f4166269a1d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5dbd0a61f30ae6c6bfbda635095f138d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga5dbd0a61f30ae6c6bfbda635095f138d">RECV_BUFSIZE_DEFAULT</a>&#160;&#160;&#160;INT_MAX</td></tr>
+<tr class="separator:ga5dbd0a61f30ae6c6bfbda635095f138d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3e7498d5d2921f0df3792de72f384d36"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga3e7498d5d2921f0df3792de72f384d36">LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT</a>&#160;&#160;&#160;20000</td></tr>
+<tr class="separator:ga3e7498d5d2921f0df3792de72f384d36"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf3822feed320cf8439b083ee525e4942"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#gaf3822feed320cf8439b083ee525e4942">SO_REUSE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaf3822feed320cf8439b083ee525e4942"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae9395d83af89002343e5782130f52f44"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#gae9395d83af89002343e5782130f52f44">SO_REUSE_RXTOALL</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gae9395d83af89002343e5782130f52f44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0543eea2abe390d0bdc843c33debd762"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga0543eea2abe390d0bdc843c33debd762">LWIP_FIONREAD_LINUXMODE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga0543eea2abe390d0bdc843c33debd762"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga68417078b71b0be9735256f52933dcdb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga68417078b71b0be9735256f52933dcdb">LWIP_SOCKET_SELECT</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga68417078b71b0be9735256f52933dcdb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6c14d705e3321429683f24de9f5a7200"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga6c14d705e3321429683f24de9f5a7200">LWIP_SOCKET_POLL</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga6c14d705e3321429683f24de9f5a7200"><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="gafed2811f031822ec5afa1ee211fb7447"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafed2811f031822ec5afa1ee211fb7447">&#9670;&nbsp;</a></span>LWIP_COMPAT_SOCKETS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_COMPAT_SOCKETS&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_COMPAT_SOCKETS==1: Enable BSD-style sockets functions names through defines. LWIP_COMPAT_SOCKETS==2: Same as ==1 but correctly named functions are created. While this helps code completion, it might conflict with existing libraries. (only used if you use <a class="el" href="sockets_8c.html">sockets.c</a>) </p>
+
+</div>
+</div>
+<a id="ga0543eea2abe390d0bdc843c33debd762"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0543eea2abe390d0bdc843c33debd762">&#9670;&nbsp;</a></span>LWIP_FIONREAD_LINUXMODE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_FIONREAD_LINUXMODE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_FIONREAD_LINUXMODE==0 (default): ioctl/FIONREAD returns the amount of pending data in the network buffer. This is the way windows does it. It's the default for lwIP since it is smaller. LWIP_FIONREAD_LINUXMODE==1: ioctl/FIONREAD returns the size of the next pending datagram in bytes. This is the way linux does it. This code is only here for compatibility. </p>
+
+</div>
+</div>
+<a id="ga484c38ab08f60d5b3335d23d31f9a402"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga484c38ab08f60d5b3335d23d31f9a402">&#9670;&nbsp;</a></span>LWIP_POSIX_SOCKETS_IO_NAMES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_POSIX_SOCKETS_IO_NAMES&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_POSIX_SOCKETS_IO_NAMES==1: Enable POSIX-style sockets functions names. Disable this option if you use a POSIX operating system that uses the same names (read, write &amp; close). (only used if you use <a class="el" href="sockets_8c.html">sockets.c</a>) </p>
+
+</div>
+</div>
+<a id="gaa91292d5d014dc1c6f1c1f4166269a1d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa91292d5d014dc1c6f1c1f4166269a1d">&#9670;&nbsp;</a></span>LWIP_SO_LINGER</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_SO_LINGER&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_SO_LINGER==1: Enable SO_LINGER processing. </p>
+
+</div>
+</div>
+<a id="ga06390cebcf4d13d3d47a11365e5fcd28"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga06390cebcf4d13d3d47a11365e5fcd28">&#9670;&nbsp;</a></span>LWIP_SO_RCVBUF</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_SO_RCVBUF&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_SO_RCVBUF==1: Enable SO_RCVBUF processing. </p>
+
+</div>
+</div>
+<a id="ga91af3ade95b20b9a60c65ed0380fa0ed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga91af3ade95b20b9a60c65ed0380fa0ed">&#9670;&nbsp;</a></span>LWIP_SO_RCVTIMEO</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_SO_RCVTIMEO&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_SO_RCVTIMEO==1: Enable receive timeout for sockets/netconns and SO_RCVTIMEO processing. </p>
+
+</div>
+</div>
+<a id="ga5b115bacb569763d8a3889a12229e942"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5b115bacb569763d8a3889a12229e942">&#9670;&nbsp;</a></span>LWIP_SO_SNDRCVTIMEO_NONSTANDARD</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_SO_SNDRCVTIMEO_NONSTANDARD&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_SO_SNDRCVTIMEO_NONSTANDARD==1: SO_RCVTIMEO/SO_SNDTIMEO take an int (milliseconds, much like winsock does) instead of a struct timeval (default). </p>
+
+</div>
+</div>
+<a id="ga1162cb685f202d9b21c11344b8209a58"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1162cb685f202d9b21c11344b8209a58">&#9670;&nbsp;</a></span>LWIP_SO_SNDTIMEO</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_SO_SNDTIMEO&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_SO_SNDTIMEO==1: Enable send timeout for sockets/netconns and SO_SNDTIMEO processing. </p>
+
+</div>
+</div>
+<a id="ga1cb62ce61ac39d7d6728ae5d3d3b927f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1cb62ce61ac39d7d6728ae5d3d3b927f">&#9670;&nbsp;</a></span>LWIP_SOCKET</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_SOCKET&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_SOCKET==1: Enable Socket API (require to use <a class="el" href="sockets_8c.html">sockets.c</a>) </p>
+
+</div>
+</div>
+<a id="gad0197c845fbb44c920b272f0fef3b57e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad0197c845fbb44c920b272f0fef3b57e">&#9670;&nbsp;</a></span>LWIP_SOCKET_OFFSET</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_SOCKET_OFFSET&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_SOCKET_OFFSET==n: Increases the file descriptor number created by LwIP with n. This can be useful when there are multiple APIs which create file descriptors. When they all start with a different offset and you won't make them overlap you can re implement read/write/close/ioctl/fnctl to send the requested action to the right library (sharing select will need more work though). </p>
+
+</div>
+</div>
+<a id="ga6c14d705e3321429683f24de9f5a7200"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6c14d705e3321429683f24de9f5a7200">&#9670;&nbsp;</a></span>LWIP_SOCKET_POLL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_SOCKET_POLL&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_SOCKET_POLL==1 (default): enable <a class="el" href="group__socket.html#ga80ae38841b0e64e60618cd8bf857f617">poll()</a> for sockets (including struct pollfd, nfds_t, and constants) </p>
+
+</div>
+</div>
+<a id="ga68417078b71b0be9735256f52933dcdb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga68417078b71b0be9735256f52933dcdb">&#9670;&nbsp;</a></span>LWIP_SOCKET_SELECT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_SOCKET_SELECT&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_SOCKET_SELECT==1 (default): enable <a class="el" href="group__socket.html#gac332b9b9b2cd877a6189ef838de49e33">select()</a> for sockets (uses a netconn callback to keep track of events). This saves RAM (counters per socket) and code (netconn event callback), which should improve performance a bit). </p>
+
+</div>
+</div>
+<a id="ga3e7498d5d2921f0df3792de72f384d36"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3e7498d5d2921f0df3792de72f384d36">&#9670;&nbsp;</a></span>LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT&#160;&#160;&#160;20000</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>By default, TCP socket/netconn close waits 20 seconds max to send the FIN </p>
+
+</div>
+</div>
+<a id="ga8b9369ab260f032686a81c77c5b4db77"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8b9369ab260f032686a81c77c5b4db77">&#9670;&nbsp;</a></span>LWIP_TCP_KEEPALIVE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_TCP_KEEPALIVE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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 <a class="el" href="sockets_8c.html">sockets.c</a>, and will affect <a class="el" href="tcp_8c.html">tcp.c</a>) </p>
+
+</div>
+</div>
+<a id="ga5dbd0a61f30ae6c6bfbda635095f138d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5dbd0a61f30ae6c6bfbda635095f138d">&#9670;&nbsp;</a></span>RECV_BUFSIZE_DEFAULT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define RECV_BUFSIZE_DEFAULT&#160;&#160;&#160;INT_MAX</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If LWIP_SO_RCVBUF is used, this is the default value for recv_bufsize. </p>
+
+</div>
+</div>
+<a id="gaf3822feed320cf8439b083ee525e4942"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf3822feed320cf8439b083ee525e4942">&#9670;&nbsp;</a></span>SO_REUSE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SO_REUSE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SO_REUSE==1: Enable SO_REUSEADDR option. </p>
+
+</div>
+</div>
+<a id="gae9395d83af89002343e5782130f52f44"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae9395d83af89002343e5782130f52f44">&#9670;&nbsp;</a></span>SO_REUSE_RXTOALL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SO_REUSE_RXTOALL&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SO_REUSE_RXTOALL==1: Pass a copy of incoming broadcast/multicast packets to all local matches if SO_REUSEADDR is turned on. WARNING: Adds a memcpy for every packet if passing to more than one pcb! </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__socket.js b/doc/doxygen/output/html/group__lwip__opts__socket.js
new file mode 100644
index 0000000..42d6dbb
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__socket.js
@@ -0,0 +1,20 @@
+var group__lwip__opts__socket =
+[
+    [ "LWIP_COMPAT_SOCKETS", "group__lwip__opts__socket.html#gafed2811f031822ec5afa1ee211fb7447", null ],
+    [ "LWIP_FIONREAD_LINUXMODE", "group__lwip__opts__socket.html#ga0543eea2abe390d0bdc843c33debd762", null ],
+    [ "LWIP_POSIX_SOCKETS_IO_NAMES", "group__lwip__opts__socket.html#ga484c38ab08f60d5b3335d23d31f9a402", null ],
+    [ "LWIP_SO_LINGER", "group__lwip__opts__socket.html#gaa91292d5d014dc1c6f1c1f4166269a1d", null ],
+    [ "LWIP_SO_RCVBUF", "group__lwip__opts__socket.html#ga06390cebcf4d13d3d47a11365e5fcd28", null ],
+    [ "LWIP_SO_RCVTIMEO", "group__lwip__opts__socket.html#ga91af3ade95b20b9a60c65ed0380fa0ed", null ],
+    [ "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_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 ],
+    [ "LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT", "group__lwip__opts__socket.html#ga3e7498d5d2921f0df3792de72f384d36", null ],
+    [ "LWIP_TCP_KEEPALIVE", "group__lwip__opts__socket.html#ga8b9369ab260f032686a81c77c5b4db77", null ],
+    [ "RECV_BUFSIZE_DEFAULT", "group__lwip__opts__socket.html#ga5dbd0a61f30ae6c6bfbda635095f138d", null ],
+    [ "SO_REUSE", "group__lwip__opts__socket.html#gaf3822feed320cf8439b083ee525e4942", null ],
+    [ "SO_REUSE_RXTOALL", "group__lwip__opts__socket.html#gae9395d83af89002343e5782130f52f44", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__stats.html b/doc/doxygen/output/html/group__lwip__opts__stats.html
new file mode 100644
index 0000000..fb6dde4
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__stats.html
@@ -0,0 +1,430 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Statistics</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__stats.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Statistics<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__debug.html">Debugging</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga542b58734cc01902c5e099f6efdc5f1b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga542b58734cc01902c5e099f6efdc5f1b">LWIP_STATS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga542b58734cc01902c5e099f6efdc5f1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacdc38ed58d1900b5d3d109a65be1c3d1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gacdc38ed58d1900b5d3d109a65be1c3d1">LWIP_STATS_DISPLAY</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gacdc38ed58d1900b5d3d109a65be1c3d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae58b452782d0327ae728192686c5a84a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gae58b452782d0327ae728192686c5a84a">LINK_STATS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gae58b452782d0327ae728192686c5a84a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3a8359abf4fff8ffdc449e5007f93275"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga3a8359abf4fff8ffdc449e5007f93275">ETHARP_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">LWIP_ARP</a>)</td></tr>
+<tr class="separator:ga3a8359abf4fff8ffdc449e5007f93275"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf50575a4895e26ea2c01d1f2269487be"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gaf50575a4895e26ea2c01d1f2269487be">IP_STATS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gaf50575a4895e26ea2c01d1f2269487be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac9a4fbb46df3c0f479a334d0e34fb74f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gac9a4fbb46df3c0f479a334d0e34fb74f">IPFRAG_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69">IP_REASSEMBLY</a> || <a class="el" href="group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4">IP_FRAG</a>)</td></tr>
+<tr class="separator:gac9a4fbb46df3c0f479a334d0e34fb74f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga472ad3f6da741f5b287d66ad3051242b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga472ad3f6da741f5b287d66ad3051242b">ICMP_STATS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga472ad3f6da741f5b287d66ad3051242b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4d12af1356b9fd60717984be51e27740"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga4d12af1356b9fd60717984be51e27740">IGMP_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923">LWIP_IGMP</a>)</td></tr>
+<tr class="separator:ga4d12af1356b9fd60717984be51e27740"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaef64b11bf71f0d6d5bafaf6092462276"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gaef64b11bf71f0d6d5bafaf6092462276">UDP_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__udp.html#gab6030e96e72df649d2650fd32d7a67b3">LWIP_UDP</a>)</td></tr>
+<tr class="separator:gaef64b11bf71f0d6d5bafaf6092462276"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa02ec5c5bc0edebe418680c54d044f58"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gaa02ec5c5bc0edebe418680c54d044f58">TCP_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">LWIP_TCP</a>)</td></tr>
+<tr class="separator:gaa02ec5c5bc0edebe418680c54d044f58"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga61ec04a08c4fde690d10819e582656a7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga61ec04a08c4fde690d10819e582656a7">MEM_STATS</a>&#160;&#160;&#160;((<a class="el" href="group__lwip__opts__mem.html#ga4ef345cc270912bd2230b1c5ec51dfc8">MEM_LIBC_MALLOC</a> == 0) &amp;&amp; (<a class="el" href="group__lwip__opts__mem.html#gaddca3141bc7037241769eb152b6f89ba">MEM_USE_POOLS</a> == 0))</td></tr>
+<tr class="separator:ga61ec04a08c4fde690d10819e582656a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab8c2430be0e567a7499a95454aaa6041"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gab8c2430be0e567a7499a95454aaa6041">MEMP_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__mem.html#gae93af697d27bbcefa6a28052d90f2f38">MEMP_MEM_MALLOC</a> == 0)</td></tr>
+<tr class="separator:gab8c2430be0e567a7499a95454aaa6041"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0173549afa76553583e5a02c6a791218"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga0173549afa76553583e5a02c6a791218">SYS_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b">NO_SYS</a> == 0)</td></tr>
+<tr class="separator:ga0173549afa76553583e5a02c6a791218"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6a211b787c97bce3af4273b29c95d9c2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga6a211b787c97bce3af4273b29c95d9c2">IP6_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a>)</td></tr>
+<tr class="separator:ga6a211b787c97bce3af4273b29c95d9c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga714006cd5c5b0eb333159d0f677616a0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga714006cd5c5b0eb333159d0f677616a0">ICMP6_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> &amp;&amp; <a class="el" href="group__lwip__opts__icmp6.html#ga65ac8bcbad242cba3a2b557e1574b21f">LWIP_ICMP6</a>)</td></tr>
+<tr class="separator:ga714006cd5c5b0eb333159d0f677616a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaa08a181c11ff8b471549e8f52c9939b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gaaa08a181c11ff8b471549e8f52c9939b">IP6_FRAG_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> &amp;&amp; (<a class="el" href="group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3">LWIP_IPV6_FRAG</a> || <a class="el" href="group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864">LWIP_IPV6_REASS</a>))</td></tr>
+<tr class="separator:gaaa08a181c11ff8b471549e8f52c9939b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf263df10b63b38201cae3d2dd5fb0b9e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gaf263df10b63b38201cae3d2dd5fb0b9e">MLD6_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> &amp;&amp; <a class="el" href="group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528">LWIP_IPV6_MLD</a>)</td></tr>
+<tr class="separator:gaf263df10b63b38201cae3d2dd5fb0b9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga753161114df60299a28d51c092c756cf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga753161114df60299a28d51c092c756cf">ND6_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a>)</td></tr>
+<tr class="separator:ga753161114df60299a28d51c092c756cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5b01047eeb149a0b0ffe33d760d8370f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga5b01047eeb149a0b0ffe33d760d8370f">MIB2_STATS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga5b01047eeb149a0b0ffe33d760d8370f"><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="ga3a8359abf4fff8ffdc449e5007f93275"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3a8359abf4fff8ffdc449e5007f93275">&#9670;&nbsp;</a></span>ETHARP_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ETHARP_STATS&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">LWIP_ARP</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ETHARP_STATS==1: Enable etharp stats. </p>
+
+</div>
+</div>
+<a id="ga714006cd5c5b0eb333159d0f677616a0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga714006cd5c5b0eb333159d0f677616a0">&#9670;&nbsp;</a></span>ICMP6_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ICMP6_STATS&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> &amp;&amp; <a class="el" href="group__lwip__opts__icmp6.html#ga65ac8bcbad242cba3a2b557e1574b21f">LWIP_ICMP6</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ICMP6_STATS==1: Enable ICMP for IPv6 stats. </p>
+
+</div>
+</div>
+<a id="ga472ad3f6da741f5b287d66ad3051242b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga472ad3f6da741f5b287d66ad3051242b">&#9670;&nbsp;</a></span>ICMP_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ICMP_STATS&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ICMP_STATS==1: Enable ICMP stats. </p>
+
+</div>
+</div>
+<a id="ga4d12af1356b9fd60717984be51e27740"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4d12af1356b9fd60717984be51e27740">&#9670;&nbsp;</a></span>IGMP_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IGMP_STATS&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923">LWIP_IGMP</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IGMP_STATS==1: Enable IGMP stats. </p>
+
+</div>
+</div>
+<a id="gaaa08a181c11ff8b471549e8f52c9939b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaaa08a181c11ff8b471549e8f52c9939b">&#9670;&nbsp;</a></span>IP6_FRAG_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP6_FRAG_STATS&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> &amp;&amp; (<a class="el" href="group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3">LWIP_IPV6_FRAG</a> || <a class="el" href="group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864">LWIP_IPV6_REASS</a>))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IP6_FRAG_STATS==1: Enable IPv6 fragmentation stats. </p>
+
+</div>
+</div>
+<a id="ga6a211b787c97bce3af4273b29c95d9c2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6a211b787c97bce3af4273b29c95d9c2">&#9670;&nbsp;</a></span>IP6_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP6_STATS&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IP6_STATS==1: Enable IPv6 stats. </p>
+
+</div>
+</div>
+<a id="gaf50575a4895e26ea2c01d1f2269487be"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf50575a4895e26ea2c01d1f2269487be">&#9670;&nbsp;</a></span>IP_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_STATS&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IP_STATS==1: Enable IP stats. </p>
+
+</div>
+</div>
+<a id="gac9a4fbb46df3c0f479a334d0e34fb74f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac9a4fbb46df3c0f479a334d0e34fb74f">&#9670;&nbsp;</a></span>IPFRAG_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IPFRAG_STATS&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69">IP_REASSEMBLY</a> || <a class="el" href="group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4">IP_FRAG</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IPFRAG_STATS==1: Enable IP fragmentation stats. Default is on if using either frag or reass. </p>
+
+</div>
+</div>
+<a id="gae58b452782d0327ae728192686c5a84a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae58b452782d0327ae728192686c5a84a">&#9670;&nbsp;</a></span>LINK_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LINK_STATS&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LINK_STATS==1: Enable link stats. </p>
+
+</div>
+</div>
+<a id="ga542b58734cc01902c5e099f6efdc5f1b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga542b58734cc01902c5e099f6efdc5f1b">&#9670;&nbsp;</a></span>LWIP_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_STATS&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_STATS==1: Enable statistics collection in lwip_stats. </p>
+
+</div>
+</div>
+<a id="gacdc38ed58d1900b5d3d109a65be1c3d1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacdc38ed58d1900b5d3d109a65be1c3d1">&#9670;&nbsp;</a></span>LWIP_STATS_DISPLAY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_STATS_DISPLAY&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_STATS_DISPLAY==1: Compile in the statistics output functions. </p>
+
+</div>
+</div>
+<a id="ga61ec04a08c4fde690d10819e582656a7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga61ec04a08c4fde690d10819e582656a7">&#9670;&nbsp;</a></span>MEM_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEM_STATS&#160;&#160;&#160;((<a class="el" href="group__lwip__opts__mem.html#ga4ef345cc270912bd2230b1c5ec51dfc8">MEM_LIBC_MALLOC</a> == 0) &amp;&amp; (<a class="el" href="group__lwip__opts__mem.html#gaddca3141bc7037241769eb152b6f89ba">MEM_USE_POOLS</a> == 0))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEM_STATS==1: Enable <a class="el" href="mem_8c.html">mem.c</a> stats. </p>
+
+</div>
+</div>
+<a id="gab8c2430be0e567a7499a95454aaa6041"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab8c2430be0e567a7499a95454aaa6041">&#9670;&nbsp;</a></span>MEMP_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MEMP_STATS&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__mem.html#gae93af697d27bbcefa6a28052d90f2f38">MEMP_MEM_MALLOC</a> == 0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMP_STATS==1: Enable <a class="el" href="memp_8c.html">memp.c</a> pool stats. </p>
+
+</div>
+</div>
+<a id="ga5b01047eeb149a0b0ffe33d760d8370f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5b01047eeb149a0b0ffe33d760d8370f">&#9670;&nbsp;</a></span>MIB2_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MIB2_STATS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MIB2_STATS==1: Stats for SNMP MIB2. </p>
+
+</div>
+</div>
+<a id="gaf263df10b63b38201cae3d2dd5fb0b9e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf263df10b63b38201cae3d2dd5fb0b9e">&#9670;&nbsp;</a></span>MLD6_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MLD6_STATS&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> &amp;&amp; <a class="el" href="group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528">LWIP_IPV6_MLD</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MLD6_STATS==1: Enable MLD for IPv6 stats. </p>
+
+</div>
+</div>
+<a id="ga753161114df60299a28d51c092c756cf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga753161114df60299a28d51c092c756cf">&#9670;&nbsp;</a></span>ND6_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ND6_STATS&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ND6_STATS==1: Enable Neighbor discovery for IPv6 stats. </p>
+
+</div>
+</div>
+<a id="ga0173549afa76553583e5a02c6a791218"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0173549afa76553583e5a02c6a791218">&#9670;&nbsp;</a></span>SYS_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SYS_STATS&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b">NO_SYS</a> == 0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SYS_STATS==1: Enable system stats (sem and mbox counts, etc). </p>
+
+</div>
+</div>
+<a id="gaa02ec5c5bc0edebe418680c54d044f58"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa02ec5c5bc0edebe418680c54d044f58">&#9670;&nbsp;</a></span>TCP_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_STATS&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">LWIP_TCP</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP_STATS==1: Enable TCP stats. Default is on if TCP enabled, otherwise off. </p>
+
+</div>
+</div>
+<a id="gaef64b11bf71f0d6d5bafaf6092462276"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaef64b11bf71f0d6d5bafaf6092462276">&#9670;&nbsp;</a></span>UDP_STATS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UDP_STATS&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__udp.html#gab6030e96e72df649d2650fd32d7a67b3">LWIP_UDP</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>UDP_STATS==1: Enable UDP stats. Default is on if UDP enabled, otherwise off. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__stats.js b/doc/doxygen/output/html/group__lwip__opts__stats.js
new file mode 100644
index 0000000..cbf6050
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__stats.js
@@ -0,0 +1,22 @@
+var group__lwip__opts__stats =
+[
+    [ "ETHARP_STATS", "group__lwip__opts__stats.html#ga3a8359abf4fff8ffdc449e5007f93275", null ],
+    [ "ICMP6_STATS", "group__lwip__opts__stats.html#ga714006cd5c5b0eb333159d0f677616a0", null ],
+    [ "ICMP_STATS", "group__lwip__opts__stats.html#ga472ad3f6da741f5b287d66ad3051242b", null ],
+    [ "IGMP_STATS", "group__lwip__opts__stats.html#ga4d12af1356b9fd60717984be51e27740", null ],
+    [ "IP6_FRAG_STATS", "group__lwip__opts__stats.html#gaaa08a181c11ff8b471549e8f52c9939b", null ],
+    [ "IP6_STATS", "group__lwip__opts__stats.html#ga6a211b787c97bce3af4273b29c95d9c2", null ],
+    [ "IP_STATS", "group__lwip__opts__stats.html#gaf50575a4895e26ea2c01d1f2269487be", null ],
+    [ "IPFRAG_STATS", "group__lwip__opts__stats.html#gac9a4fbb46df3c0f479a334d0e34fb74f", null ],
+    [ "LINK_STATS", "group__lwip__opts__stats.html#gae58b452782d0327ae728192686c5a84a", null ],
+    [ "LWIP_STATS", "group__lwip__opts__stats.html#ga542b58734cc01902c5e099f6efdc5f1b", null ],
+    [ "LWIP_STATS_DISPLAY", "group__lwip__opts__stats.html#gacdc38ed58d1900b5d3d109a65be1c3d1", null ],
+    [ "MEM_STATS", "group__lwip__opts__stats.html#ga61ec04a08c4fde690d10819e582656a7", null ],
+    [ "MEMP_STATS", "group__lwip__opts__stats.html#gab8c2430be0e567a7499a95454aaa6041", null ],
+    [ "MIB2_STATS", "group__lwip__opts__stats.html#ga5b01047eeb149a0b0ffe33d760d8370f", null ],
+    [ "MLD6_STATS", "group__lwip__opts__stats.html#gaf263df10b63b38201cae3d2dd5fb0b9e", null ],
+    [ "ND6_STATS", "group__lwip__opts__stats.html#ga753161114df60299a28d51c092c756cf", null ],
+    [ "SYS_STATS", "group__lwip__opts__stats.html#ga0173549afa76553583e5a02c6a791218", null ],
+    [ "TCP_STATS", "group__lwip__opts__stats.html#gaa02ec5c5bc0edebe418680c54d044f58", null ],
+    [ "UDP_STATS", "group__lwip__opts__stats.html#gaef64b11bf71f0d6d5bafaf6092462276", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__tcp.html b/doc/doxygen/output/html/group__lwip__opts__tcp.html
new file mode 100644
index 0000000..cb34494
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__tcp.html
@@ -0,0 +1,552 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: TCP</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__tcp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">TCP<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__callback.html">Callback-style APIs</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gaa4ed98deb97b77c633cb8870f34c71e9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">LWIP_TCP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gaa4ed98deb97b77c633cb8870f34c71e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacd5b25ea81d2894790d25da5393cdab4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#gacd5b25ea81d2894790d25da5393cdab4">TCP_TTL</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411">IP_DEFAULT_TTL</a></td></tr>
+<tr class="separator:gacd5b25ea81d2894790d25da5393cdab4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7f535a6efb5cdf86c3210e35ece1d6a7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga7f535a6efb5cdf86c3210e35ece1d6a7">TCP_WND</a>&#160;&#160;&#160;(4 * <a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a>)</td></tr>
+<tr class="separator:ga7f535a6efb5cdf86c3210e35ece1d6a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0dee0911197855bdf19ef79778c241a6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga0dee0911197855bdf19ef79778c241a6">TCP_MAXRTX</a>&#160;&#160;&#160;12</td></tr>
+<tr class="separator:ga0dee0911197855bdf19ef79778c241a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga50b434a8541a4813f7b27f576c05d1b6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga50b434a8541a4813f7b27f576c05d1b6">TCP_SYNMAXRTX</a>&#160;&#160;&#160;6</td></tr>
+<tr class="separator:ga50b434a8541a4813f7b27f576c05d1b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga89ffd0d7d1529bdb26bfbad267d0ad75"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga89ffd0d7d1529bdb26bfbad267d0ad75">TCP_QUEUE_OOSEQ</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">LWIP_TCP</a></td></tr>
+<tr class="separator:ga89ffd0d7d1529bdb26bfbad267d0ad75"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf1b6a015d29fea67b906c276e1e8314f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#gaf1b6a015d29fea67b906c276e1e8314f">LWIP_TCP_SACK_OUT</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaf1b6a015d29fea67b906c276e1e8314f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaac0e9f559a8e3c251f3504cebcf44dc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#gaaac0e9f559a8e3c251f3504cebcf44dc">LWIP_TCP_MAX_SACK_NUM</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:gaaac0e9f559a8e3c251f3504cebcf44dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf1ab7bb27860aa3677c387a2f3ba317b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a>&#160;&#160;&#160;536</td></tr>
+<tr class="separator:gaf1ab7bb27860aa3677c387a2f3ba317b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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"><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>
+<tr class="separator:ga9beaa47832ead4180981bfbf71074904"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae5c9866d7cd463ac7b36792182145aec"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#gae5c9866d7cd463ac7b36792182145aec">TCP_SNDLOWAT</a>&#160;&#160;&#160;LWIP_MIN(LWIP_MAX(((<a class="el" href="group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd">TCP_SND_BUF</a>)/2), (2 * <a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a>) + 1), (<a class="el" href="group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd">TCP_SND_BUF</a>) - 1)</td></tr>
+<tr class="separator:gae5c9866d7cd463ac7b36792182145aec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga75659867592a6b01c198532ed1b65698"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga75659867592a6b01c198532ed1b65698">TCP_SNDQUEUELOWAT</a>&#160;&#160;&#160;LWIP_MAX(((<a class="el" href="group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904">TCP_SND_QUEUELEN</a>)/2), 5)</td></tr>
+<tr class="separator:ga75659867592a6b01c198532ed1b65698"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9d6d3219bb5fc0bc760a64114de13c25"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga9d6d3219bb5fc0bc760a64114de13c25">TCP_OOSEQ_MAX_BYTES</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga9d6d3219bb5fc0bc760a64114de13c25"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1f57d3859c4556f785708e5dc440617e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga1f57d3859c4556f785708e5dc440617e">TCP_OOSEQ_MAX_PBUFS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga1f57d3859c4556f785708e5dc440617e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga98b23e7cbd3281915c50a485cb61899d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga98b23e7cbd3281915c50a485cb61899d">TCP_LISTEN_BACKLOG</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga98b23e7cbd3281915c50a485cb61899d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga93cce3f47e33df11248c908d1775bacf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf">TCP_DEFAULT_LISTEN_BACKLOG</a>&#160;&#160;&#160;0xff</td></tr>
+<tr class="separator:ga93cce3f47e33df11248c908d1775bacf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5648e2580bb55c0efdfbebcf3bad1eef"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga5648e2580bb55c0efdfbebcf3bad1eef">TCP_OVERSIZE</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a></td></tr>
+<tr class="separator:ga5648e2580bb55c0efdfbebcf3bad1eef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga249bc450bb818cf2ef3cf1472ff354fd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga249bc450bb818cf2ef3cf1472ff354fd">LWIP_TCP_TIMESTAMPS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga249bc450bb818cf2ef3cf1472ff354fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5d45732ba3a8438b141096d86e07ef8d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga5d45732ba3a8438b141096d86e07ef8d">TCP_WND_UPDATE_THRESHOLD</a>&#160;&#160;&#160;LWIP_MIN((<a class="el" href="group__lwip__opts__tcp.html#ga7f535a6efb5cdf86c3210e35ece1d6a7">TCP_WND</a> / 4), (<a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a> * 4))</td></tr>
+<tr class="separator:ga5d45732ba3a8438b141096d86e07ef8d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga39f76e811117155be8525bb386ecddb7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga39f76e811117155be8525bb386ecddb7">LWIP_EVENT_API</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga39f76e811117155be8525bb386ecddb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga88dbbfeeeb41b129fdc8235fc08bb530"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga88dbbfeeeb41b129fdc8235fc08bb530">LWIP_WND_SCALE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga88dbbfeeeb41b129fdc8235fc08bb530"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga40b1cdad52eaa91a3f5c242fc92ee223"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga40b1cdad52eaa91a3f5c242fc92ee223">LWIP_TCP_PCB_NUM_EXT_ARGS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga40b1cdad52eaa91a3f5c242fc92ee223"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga26dee0e5d9c51b1dda0adad29c770a77"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga26dee0e5d9c51b1dda0adad29c770a77">LWIP_ALTCP</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga26dee0e5d9c51b1dda0adad29c770a77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab03ba0306cf0a99ccce3d100142f60c8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#gab03ba0306cf0a99ccce3d100142f60c8">LWIP_ALTCP_TLS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gab03ba0306cf0a99ccce3d100142f60c8"><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="ga26dee0e5d9c51b1dda0adad29c770a77"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga26dee0e5d9c51b1dda0adad29c770a77">&#9670;&nbsp;</a></span>LWIP_ALTCP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ALTCP&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ALTCP==1: enable the altcp API. altcp is an abstraction layer that prevents applications linking against the tcp.h functions but provides the same functionality. It is used to e.g. add SSL/TLS or proxy-connect support to an application written for the tcp callback API without that application knowing the protocol details.</p>
+<p>With LWIP_ALTCP==0, applications written against the altcp API can still be compiled but are directly linked against the tcp.h callback API and then cannot use layered protocols.</p>
+<p>See <a class="el" href="group__altcp__api.html">Application layered TCP Introduction</a> </p>
+
+</div>
+</div>
+<a id="gab03ba0306cf0a99ccce3d100142f60c8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab03ba0306cf0a99ccce3d100142f60c8">&#9670;&nbsp;</a></span>LWIP_ALTCP_TLS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ALTCP_TLS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ALTCP_TLS==1: enable TLS support for altcp API. This needs a port of the functions in <a class="el" href="altcp__tls_8h.html">altcp_tls.h</a> to a TLS library. A port to ARM mbedtls is provided with lwIP, see apps/altcp_tls/ directory and LWIP_ALTCP_TLS_MBEDTLS option. </p>
+
+</div>
+</div>
+<a id="ga39f76e811117155be8525bb386ecddb7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga39f76e811117155be8525bb386ecddb7">&#9670;&nbsp;</a></span>LWIP_EVENT_API</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_EVENT_API&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_EVENT_API and LWIP_CALLBACK_API: Only one of these should be set to 1. LWIP_EVENT_API==1: The user defines lwip_tcp_event() to receive all events (accept, sent, etc) that happen in the system. LWIP_CALLBACK_API==1: The PCB callback function is called directly for the event. This is the default. </p>
+
+</div>
+</div>
+<a id="gaa4ed98deb97b77c633cb8870f34c71e9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa4ed98deb97b77c633cb8870f34c71e9">&#9670;&nbsp;</a></span>LWIP_TCP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_TCP&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_TCP==1: Turn on TCP. </p>
+
+</div>
+</div>
+<a id="gaaac0e9f559a8e3c251f3504cebcf44dc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaaac0e9f559a8e3c251f3504cebcf44dc">&#9670;&nbsp;</a></span>LWIP_TCP_MAX_SACK_NUM</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_TCP_MAX_SACK_NUM&#160;&#160;&#160;4</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_TCP_MAX_SACK_NUM: The maximum number of SACK values to include in TCP segments. Must be at least 1, but is only used if LWIP_TCP_SACK_OUT is enabled. NOTE: Even though we never send more than 3 or 4 SACK ranges in a single segment (depending on other options), setting this option to values greater than 4 is not pointless. This is basically the max number of SACK ranges we want to keep track of. As new data is delivered, some of the SACK ranges may be removed or merged. In that case some of those older SACK ranges may be used again. The amount of memory used to store SACK ranges is LWIP_TCP_MAX_SACK_NUM * 8 bytes for each TCP PCB. </p>
+
+</div>
+</div>
+<a id="ga40b1cdad52eaa91a3f5c242fc92ee223"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga40b1cdad52eaa91a3f5c242fc92ee223">&#9670;&nbsp;</a></span>LWIP_TCP_PCB_NUM_EXT_ARGS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_TCP_PCB_NUM_EXT_ARGS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_TCP_PCB_NUM_EXT_ARGS: When this is &gt; 0, every tcp pcb (including listen pcb) includes a number of additional argument entries in an array (see tcp_ext_arg_alloc_id) </p>
+
+</div>
+</div>
+<a id="gaf1b6a015d29fea67b906c276e1e8314f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf1b6a015d29fea67b906c276e1e8314f">&#9670;&nbsp;</a></span>LWIP_TCP_SACK_OUT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_TCP_SACK_OUT&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_TCP_SACK_OUT==1: TCP will support sending selective acknowledgements (SACKs). </p>
+
+</div>
+</div>
+<a id="ga249bc450bb818cf2ef3cf1472ff354fd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga249bc450bb818cf2ef3cf1472ff354fd">&#9670;&nbsp;</a></span>LWIP_TCP_TIMESTAMPS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_TCP_TIMESTAMPS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_TCP_TIMESTAMPS==1: support the TCP timestamp option. The timestamp option is currently only used to help remote hosts, it is not really used locally. Therefore, it is only enabled when a TS option is received in the initial SYN packet from a remote host. </p>
+
+</div>
+</div>
+<a id="ga88dbbfeeeb41b129fdc8235fc08bb530"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga88dbbfeeeb41b129fdc8235fc08bb530">&#9670;&nbsp;</a></span>LWIP_WND_SCALE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_WND_SCALE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_WND_SCALE and TCP_RCV_SCALE: Set LWIP_WND_SCALE to 1 to enable window scaling. Set TCP_RCV_SCALE to the desired scaling factor (shift count in the range of [0..14]). When LWIP_WND_SCALE is enabled but TCP_RCV_SCALE is 0, we can use a large send window while having a small receive window only. </p>
+
+</div>
+</div>
+<a id="gac04b84d32251ac558f0c3a8af85ba3a5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac04b84d32251ac558f0c3a8af85ba3a5">&#9670;&nbsp;</a></span>TCP_CALCULATE_EFF_SEND_MSS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_CALCULATE_EFF_SEND_MSS&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP_CALCULATE_EFF_SEND_MSS: "The maximum size of a segment that TCP really sends, the 'effective send MSS,' MUST be the smaller of the send MSS (which reflects the available reassembly buffer size at the remote host) and the largest size permitted by the IP layer" (RFC 1122) Setting this to 1 enables code that checks TCP_MSS against the MTU of the netif used for a connection and limits the MSS if it would be too big otherwise. </p>
+
+</div>
+</div>
+<a id="ga93cce3f47e33df11248c908d1775bacf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga93cce3f47e33df11248c908d1775bacf">&#9670;&nbsp;</a></span>TCP_DEFAULT_LISTEN_BACKLOG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_DEFAULT_LISTEN_BACKLOG&#160;&#160;&#160;0xff</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The maximum allowed backlog for TCP listen netconns. This backlog is used unless another is explicitly specified. 0xff is the maximum (u8_t). </p>
+
+</div>
+</div>
+<a id="ga98b23e7cbd3281915c50a485cb61899d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga98b23e7cbd3281915c50a485cb61899d">&#9670;&nbsp;</a></span>TCP_LISTEN_BACKLOG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_LISTEN_BACKLOG&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP_OOSEQ_PBUFS_LIMIT(pcb): Return the maximum number of pbufs to be queued on ooseq per pcb, given the pcb. Only valid for TCP_QUEUE_OOSEQ==1 &amp;&amp; TCP_OOSEQ_MAX_PBUFS==1. Use this to override TCP_OOSEQ_MAX_PBUFS to a dynamic value per pcb. TCP_LISTEN_BACKLOG: Enable the backlog option for tcp listen pcb. </p>
+
+</div>
+</div>
+<a id="ga0dee0911197855bdf19ef79778c241a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0dee0911197855bdf19ef79778c241a6">&#9670;&nbsp;</a></span>TCP_MAXRTX</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_MAXRTX&#160;&#160;&#160;12</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP_MAXRTX: Maximum number of retransmissions of data segments. </p>
+
+</div>
+</div>
+<a id="gaf1ab7bb27860aa3677c387a2f3ba317b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf1ab7bb27860aa3677c387a2f3ba317b">&#9670;&nbsp;</a></span>TCP_MSS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_MSS&#160;&#160;&#160;536</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP_MSS: TCP Maximum segment size. (default is 536, a conservative default, you might want to increase this.) For the receive side, this MSS is advertised to the remote side when opening a connection. For the transmit size, this MSS sets an upper limit on the MSS advertised by the remote host. </p>
+
+</div>
+</div>
+<a id="ga9d6d3219bb5fc0bc760a64114de13c25"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9d6d3219bb5fc0bc760a64114de13c25">&#9670;&nbsp;</a></span>TCP_OOSEQ_MAX_BYTES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_OOSEQ_MAX_BYTES&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP_OOSEQ_MAX_BYTES: The default maximum number of bytes queued on ooseq per pcb if TCP_OOSEQ_BYTES_LIMIT is not defined. Default is 0 (no limit). Only valid for TCP_QUEUE_OOSEQ==1. </p>
+
+</div>
+</div>
+<a id="ga1f57d3859c4556f785708e5dc440617e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1f57d3859c4556f785708e5dc440617e">&#9670;&nbsp;</a></span>TCP_OOSEQ_MAX_PBUFS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_OOSEQ_MAX_PBUFS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP_OOSEQ_BYTES_LIMIT(pcb): Return the maximum number of bytes to be queued on ooseq per pcb, given the pcb. Only valid for TCP_QUEUE_OOSEQ==1 &amp;&amp; TCP_OOSEQ_MAX_BYTES==1. Use this to override TCP_OOSEQ_MAX_BYTES to a dynamic value per pcb. TCP_OOSEQ_MAX_PBUFS: The default maximum number of pbufs queued on ooseq per pcb if TCP_OOSEQ_BYTES_LIMIT is not defined. Default is 0 (no limit). Only valid for TCP_QUEUE_OOSEQ==1. </p>
+
+</div>
+</div>
+<a id="ga5648e2580bb55c0efdfbebcf3bad1eef"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5648e2580bb55c0efdfbebcf3bad1eef">&#9670;&nbsp;</a></span>TCP_OVERSIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_OVERSIZE&#160;&#160;&#160;<a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP_OVERSIZE: The maximum number of bytes that tcp_write may allocate ahead of time in an attempt to create shorter pbuf chains for transmission. The meaningful range is 0 to TCP_MSS. Some suggested values are:</p>
+<p>0: Disable oversized allocation. Each <a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp_write()</a> allocates a new pbuf (old behaviour). 1: Allocate size-aligned pbufs with minimal excess. Use this if your scatter-gather DMA requires aligned fragments. 128: Limit the pbuf/memory overhead to 20%. TCP_MSS: Try to create unfragmented TCP packets. TCP_MSS/4: Try to create 4 fragments or less per TCP packet. </p>
+
+</div>
+</div>
+<a id="ga89ffd0d7d1529bdb26bfbad267d0ad75"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga89ffd0d7d1529bdb26bfbad267d0ad75">&#9670;&nbsp;</a></span>TCP_QUEUE_OOSEQ</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_QUEUE_OOSEQ&#160;&#160;&#160;<a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">LWIP_TCP</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP_QUEUE_OOSEQ==1: TCP will queue segments that arrive out of order. Define to 0 if your device is low on memory. </p>
+
+</div>
+</div>
+<a id="ga871d111968d8c6c7880ff36b93c5c4dd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga871d111968d8c6c7880ff36b93c5c4dd">&#9670;&nbsp;</a></span>TCP_SND_BUF</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_SND_BUF&#160;&#160;&#160;(2 * <a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP_SND_BUF: TCP sender buffer space (bytes). To achieve good performance, this should be at least 2 * TCP_MSS. </p>
+
+</div>
+</div>
+<a id="ga9beaa47832ead4180981bfbf71074904"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9beaa47832ead4180981bfbf71074904">&#9670;&nbsp;</a></span>TCP_SND_QUEUELEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_SND_QUEUELEN&#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>
+      </table>
+</div><div class="memdoc">
+<p>TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. </p>
+
+</div>
+</div>
+<a id="gae5c9866d7cd463ac7b36792182145aec"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae5c9866d7cd463ac7b36792182145aec">&#9670;&nbsp;</a></span>TCP_SNDLOWAT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_SNDLOWAT&#160;&#160;&#160;LWIP_MIN(LWIP_MAX(((<a class="el" href="group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd">TCP_SND_BUF</a>)/2), (2 * <a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a>) + 1), (<a class="el" href="group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd">TCP_SND_BUF</a>) - 1)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP_SNDLOWAT: TCP writable space (bytes). This must be less than TCP_SND_BUF. It is the amount of space which must be available in the TCP snd_buf for select to return writable (combined with TCP_SNDQUEUELOWAT). </p>
+
+</div>
+</div>
+<a id="ga75659867592a6b01c198532ed1b65698"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga75659867592a6b01c198532ed1b65698">&#9670;&nbsp;</a></span>TCP_SNDQUEUELOWAT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_SNDQUEUELOWAT&#160;&#160;&#160;LWIP_MAX(((<a class="el" href="group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904">TCP_SND_QUEUELEN</a>)/2), 5)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP_SNDQUEUELOWAT: TCP writable bufs (pbuf count). This must be less than TCP_SND_QUEUELEN. If the number of pbufs queued on a pcb drops below this number, select returns writable (combined with TCP_SNDLOWAT). </p>
+
+</div>
+</div>
+<a id="ga50b434a8541a4813f7b27f576c05d1b6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga50b434a8541a4813f7b27f576c05d1b6">&#9670;&nbsp;</a></span>TCP_SYNMAXRTX</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_SYNMAXRTX&#160;&#160;&#160;6</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP_SYNMAXRTX: Maximum number of retransmissions of SYN segments. </p>
+
+</div>
+</div>
+<a id="gacd5b25ea81d2894790d25da5393cdab4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacd5b25ea81d2894790d25da5393cdab4">&#9670;&nbsp;</a></span>TCP_TTL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_TTL&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411">IP_DEFAULT_TTL</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP_TTL: Default Time-To-Live value. </p>
+
+</div>
+</div>
+<a id="ga7f535a6efb5cdf86c3210e35ece1d6a7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7f535a6efb5cdf86c3210e35ece1d6a7">&#9670;&nbsp;</a></span>TCP_WND</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_WND&#160;&#160;&#160;(4 * <a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP_WND: The size of a TCP window. This must be at least (2 * TCP_MSS) for things to work well. ATTENTION: when using TCP_RCV_SCALE, TCP_WND is the total size with scaling applied. Maximum window value in the TCP header will be TCP_WND &gt;&gt; TCP_RCV_SCALE </p>
+
+</div>
+</div>
+<a id="ga5d45732ba3a8438b141096d86e07ef8d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5d45732ba3a8438b141096d86e07ef8d">&#9670;&nbsp;</a></span>TCP_WND_UPDATE_THRESHOLD</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_WND_UPDATE_THRESHOLD&#160;&#160;&#160;LWIP_MIN((<a class="el" href="group__lwip__opts__tcp.html#ga7f535a6efb5cdf86c3210e35ece1d6a7">TCP_WND</a> / 4), (<a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a> * 4))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP_WND_UPDATE_THRESHOLD: difference in window to trigger an explicit window update </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__tcp.js b/doc/doxygen/output/html/group__lwip__opts__tcp.js
new file mode 100644
index 0000000..873dab0
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__tcp.js
@@ -0,0 +1,29 @@
+var group__lwip__opts__tcp =
+[
+    [ "LWIP_ALTCP", "group__lwip__opts__tcp.html#ga26dee0e5d9c51b1dda0adad29c770a77", null ],
+    [ "LWIP_ALTCP_TLS", "group__lwip__opts__tcp.html#gab03ba0306cf0a99ccce3d100142f60c8", null ],
+    [ "LWIP_EVENT_API", "group__lwip__opts__tcp.html#ga39f76e811117155be8525bb386ecddb7", null ],
+    [ "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_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 ],
+    [ "TCP_CALCULATE_EFF_SEND_MSS", "group__lwip__opts__tcp.html#gac04b84d32251ac558f0c3a8af85ba3a5", null ],
+    [ "TCP_DEFAULT_LISTEN_BACKLOG", "group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf", null ],
+    [ "TCP_LISTEN_BACKLOG", "group__lwip__opts__tcp.html#ga98b23e7cbd3281915c50a485cb61899d", null ],
+    [ "TCP_MAXRTX", "group__lwip__opts__tcp.html#ga0dee0911197855bdf19ef79778c241a6", null ],
+    [ "TCP_MSS", "group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b", null ],
+    [ "TCP_OOSEQ_MAX_BYTES", "group__lwip__opts__tcp.html#ga9d6d3219bb5fc0bc760a64114de13c25", null ],
+    [ "TCP_OOSEQ_MAX_PBUFS", "group__lwip__opts__tcp.html#ga1f57d3859c4556f785708e5dc440617e", null ],
+    [ "TCP_OVERSIZE", "group__lwip__opts__tcp.html#ga5648e2580bb55c0efdfbebcf3bad1eef", null ],
+    [ "TCP_QUEUE_OOSEQ", "group__lwip__opts__tcp.html#ga89ffd0d7d1529bdb26bfbad267d0ad75", null ],
+    [ "TCP_SND_BUF", "group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd", null ],
+    [ "TCP_SND_QUEUELEN", "group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904", null ],
+    [ "TCP_SNDLOWAT", "group__lwip__opts__tcp.html#gae5c9866d7cd463ac7b36792182145aec", null ],
+    [ "TCP_SNDQUEUELOWAT", "group__lwip__opts__tcp.html#ga75659867592a6b01c198532ed1b65698", null ],
+    [ "TCP_SYNMAXRTX", "group__lwip__opts__tcp.html#ga50b434a8541a4813f7b27f576c05d1b6", null ],
+    [ "TCP_TTL", "group__lwip__opts__tcp.html#gacd5b25ea81d2894790d25da5393cdab4", null ],
+    [ "TCP_WND", "group__lwip__opts__tcp.html#ga7f535a6efb5cdf86c3210e35ece1d6a7", null ],
+    [ "TCP_WND_UPDATE_THRESHOLD", "group__lwip__opts__tcp.html#ga5d45732ba3a8438b141096d86e07ef8d", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__thread.html b/doc/doxygen/output/html/group__lwip__opts__thread.html
new file mode 100644
index 0000000..0a77c21
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__thread.html
@@ -0,0 +1,365 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Threading</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__thread.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Threading<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__infrastructure.html">Infrastructure</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga405e604e4328e1feb878c6fe1798a587"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga405e604e4328e1feb878c6fe1798a587">TCPIP_THREAD_NAME</a>&#160;&#160;&#160;&quot;tcpip_thread&quot;</td></tr>
+<tr class="separator:ga405e604e4328e1feb878c6fe1798a587"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa02b84eafa0c8b09b158b97c96d79db0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#gaa02b84eafa0c8b09b158b97c96d79db0">TCPIP_THREAD_STACKSIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaa02b84eafa0c8b09b158b97c96d79db0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga42b2c7a3042d7c3efd00f367f5837435"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga42b2c7a3042d7c3efd00f367f5837435">TCPIP_THREAD_PRIO</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga42b2c7a3042d7c3efd00f367f5837435"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8cf210ad4e4bf616860a45fbd140fd06"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga8cf210ad4e4bf616860a45fbd140fd06">TCPIP_MBOX_SIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga8cf210ad4e4bf616860a45fbd140fd06"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8b99d75d9e0a0868567d10c8522915bb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga8b99d75d9e0a0868567d10c8522915bb">LWIP_TCPIP_THREAD_ALIVE</a>()</td></tr>
+<tr class="separator:ga8b99d75d9e0a0868567d10c8522915bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae9cd260c56472324a2f0ee5f9597a675"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#gae9cd260c56472324a2f0ee5f9597a675">SLIPIF_THREAD_NAME</a>&#160;&#160;&#160;&quot;slipif_loop&quot;</td></tr>
+<tr class="separator:gae9cd260c56472324a2f0ee5f9597a675"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae8ab54a25007ce997bbab6289815e258"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#gae8ab54a25007ce997bbab6289815e258">SLIPIF_THREAD_STACKSIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gae8ab54a25007ce997bbab6289815e258"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab1b9fc2efcbf1f804bfd0191bc019c4e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#gab1b9fc2efcbf1f804bfd0191bc019c4e">SLIPIF_THREAD_PRIO</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gab1b9fc2efcbf1f804bfd0191bc019c4e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaca13123a5c8271558353e04123957616"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#gaca13123a5c8271558353e04123957616">DEFAULT_THREAD_NAME</a>&#160;&#160;&#160;&quot;lwIP&quot;</td></tr>
+<tr class="separator:gaca13123a5c8271558353e04123957616"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7f93dfeaed4021061959f822def602cb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga7f93dfeaed4021061959f822def602cb">DEFAULT_THREAD_STACKSIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga7f93dfeaed4021061959f822def602cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3d8715b1fdd0449d6c214e4a40108456"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga3d8715b1fdd0449d6c214e4a40108456">DEFAULT_THREAD_PRIO</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga3d8715b1fdd0449d6c214e4a40108456"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4ef8f046c957750056131310a1580df7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga4ef8f046c957750056131310a1580df7">DEFAULT_RAW_RECVMBOX_SIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga4ef8f046c957750056131310a1580df7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga09fe785559b3f0cf108da4440489e335"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga09fe785559b3f0cf108da4440489e335">DEFAULT_UDP_RECVMBOX_SIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga09fe785559b3f0cf108da4440489e335"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1bd172938b9c8ba63156fcafc87e83c7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga1bd172938b9c8ba63156fcafc87e83c7">DEFAULT_TCP_RECVMBOX_SIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga1bd172938b9c8ba63156fcafc87e83c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5d5a6e04abe2ec233c7acdb09f992461"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga5d5a6e04abe2ec233c7acdb09f992461">DEFAULT_ACCEPTMBOX_SIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga5d5a6e04abe2ec233c7acdb09f992461"><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="ga5d5a6e04abe2ec233c7acdb09f992461"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5d5a6e04abe2ec233c7acdb09f992461">&#9670;&nbsp;</a></span>DEFAULT_ACCEPTMBOX_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DEFAULT_ACCEPTMBOX_SIZE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DEFAULT_ACCEPTMBOX_SIZE: The mailbox size for the incoming connections. The queue size value itself is platform-dependent, but is passed to <a class="el" href="group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc">sys_mbox_new()</a> when the acceptmbox is created. </p>
+
+</div>
+</div>
+<a id="ga4ef8f046c957750056131310a1580df7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4ef8f046c957750056131310a1580df7">&#9670;&nbsp;</a></span>DEFAULT_RAW_RECVMBOX_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DEFAULT_RAW_RECVMBOX_SIZE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DEFAULT_RAW_RECVMBOX_SIZE: The mailbox size for the incoming packets on a NETCONN_RAW. The queue size value itself is platform-dependent, but is passed to <a class="el" href="group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc">sys_mbox_new()</a> when the recvmbox is created. </p>
+
+</div>
+</div>
+<a id="ga1bd172938b9c8ba63156fcafc87e83c7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1bd172938b9c8ba63156fcafc87e83c7">&#9670;&nbsp;</a></span>DEFAULT_TCP_RECVMBOX_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DEFAULT_TCP_RECVMBOX_SIZE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DEFAULT_TCP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a NETCONN_TCP. The queue size value itself is platform-dependent, but is passed to <a class="el" href="group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc">sys_mbox_new()</a> when the recvmbox is created. </p>
+
+</div>
+</div>
+<a id="gaca13123a5c8271558353e04123957616"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaca13123a5c8271558353e04123957616">&#9670;&nbsp;</a></span>DEFAULT_THREAD_NAME</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DEFAULT_THREAD_NAME&#160;&#160;&#160;&quot;lwIP&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DEFAULT_THREAD_NAME: The name assigned to any other lwIP thread. </p>
+
+</div>
+</div>
+<a id="ga3d8715b1fdd0449d6c214e4a40108456"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3d8715b1fdd0449d6c214e4a40108456">&#9670;&nbsp;</a></span>DEFAULT_THREAD_PRIO</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DEFAULT_THREAD_PRIO&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DEFAULT_THREAD_PRIO: The priority assigned to any other lwIP thread. The priority value itself is platform-dependent, but is passed to <a class="el" href="group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a">sys_thread_new()</a> when the thread is created. </p>
+
+</div>
+</div>
+<a id="ga7f93dfeaed4021061959f822def602cb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7f93dfeaed4021061959f822def602cb">&#9670;&nbsp;</a></span>DEFAULT_THREAD_STACKSIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DEFAULT_THREAD_STACKSIZE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DEFAULT_THREAD_STACKSIZE: The stack size used by any other lwIP thread. The stack size value itself is platform-dependent, but is passed to <a class="el" href="group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a">sys_thread_new()</a> when the thread is created. </p>
+
+</div>
+</div>
+<a id="ga09fe785559b3f0cf108da4440489e335"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga09fe785559b3f0cf108da4440489e335">&#9670;&nbsp;</a></span>DEFAULT_UDP_RECVMBOX_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DEFAULT_UDP_RECVMBOX_SIZE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DEFAULT_UDP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a NETCONN_UDP. The queue size value itself is platform-dependent, but is passed to <a class="el" href="group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc">sys_mbox_new()</a> when the recvmbox is created. </p>
+
+</div>
+</div>
+<a id="ga8b99d75d9e0a0868567d10c8522915bb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8b99d75d9e0a0868567d10c8522915bb">&#9670;&nbsp;</a></span>LWIP_TCPIP_THREAD_ALIVE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_TCPIP_THREAD_ALIVE</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Define this to something that triggers a watchdog. This is called from tcpip_thread after processing a message. </p>
+
+</div>
+</div>
+<a id="gae9cd260c56472324a2f0ee5f9597a675"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae9cd260c56472324a2f0ee5f9597a675">&#9670;&nbsp;</a></span>SLIPIF_THREAD_NAME</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SLIPIF_THREAD_NAME&#160;&#160;&#160;&quot;slipif_loop&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SLIPIF_THREAD_NAME: The name assigned to the slipif_loop thread. </p>
+
+</div>
+</div>
+<a id="gab1b9fc2efcbf1f804bfd0191bc019c4e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab1b9fc2efcbf1f804bfd0191bc019c4e">&#9670;&nbsp;</a></span>SLIPIF_THREAD_PRIO</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SLIPIF_THREAD_PRIO&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SLIPIF_THREAD_PRIO: The priority assigned to the slipif_loop thread. The priority value itself is platform-dependent, but is passed to <a class="el" href="group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a">sys_thread_new()</a> when the thread is created. </p>
+
+</div>
+</div>
+<a id="gae8ab54a25007ce997bbab6289815e258"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae8ab54a25007ce997bbab6289815e258">&#9670;&nbsp;</a></span>SLIPIF_THREAD_STACKSIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SLIPIF_THREAD_STACKSIZE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SLIP_THREAD_STACKSIZE: The stack size used by the slipif_loop thread. The stack size value itself is platform-dependent, but is passed to <a class="el" href="group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a">sys_thread_new()</a> when the thread is created. </p>
+
+</div>
+</div>
+<a id="ga8cf210ad4e4bf616860a45fbd140fd06"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8cf210ad4e4bf616860a45fbd140fd06">&#9670;&nbsp;</a></span>TCPIP_MBOX_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCPIP_MBOX_SIZE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCPIP_MBOX_SIZE: The mailbox size for the tcpip thread messages The queue size value itself is platform-dependent, but is passed to <a class="el" href="group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc">sys_mbox_new()</a> when tcpip_init is called. </p>
+
+</div>
+</div>
+<a id="ga405e604e4328e1feb878c6fe1798a587"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga405e604e4328e1feb878c6fe1798a587">&#9670;&nbsp;</a></span>TCPIP_THREAD_NAME</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCPIP_THREAD_NAME&#160;&#160;&#160;&quot;tcpip_thread&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCPIP_THREAD_NAME: The name assigned to the main tcpip thread. </p>
+
+</div>
+</div>
+<a id="ga42b2c7a3042d7c3efd00f367f5837435"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga42b2c7a3042d7c3efd00f367f5837435">&#9670;&nbsp;</a></span>TCPIP_THREAD_PRIO</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCPIP_THREAD_PRIO&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCPIP_THREAD_PRIO: The priority assigned to the main tcpip thread. The priority value itself is platform-dependent, but is passed to <a class="el" href="group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a">sys_thread_new()</a> when the thread is created. </p>
+
+</div>
+</div>
+<a id="gaa02b84eafa0c8b09b158b97c96d79db0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa02b84eafa0c8b09b158b97c96d79db0">&#9670;&nbsp;</a></span>TCPIP_THREAD_STACKSIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCPIP_THREAD_STACKSIZE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCPIP_THREAD_STACKSIZE: The stack size used by the main tcpip thread. The stack size value itself is platform-dependent, but is passed to <a class="el" href="group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a">sys_thread_new()</a> when the thread is created. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__thread.js b/doc/doxygen/output/html/group__lwip__opts__thread.js
new file mode 100644
index 0000000..3b480d5
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__thread.js
@@ -0,0 +1,18 @@
+var group__lwip__opts__thread =
+[
+    [ "DEFAULT_ACCEPTMBOX_SIZE", "group__lwip__opts__thread.html#ga5d5a6e04abe2ec233c7acdb09f992461", null ],
+    [ "DEFAULT_RAW_RECVMBOX_SIZE", "group__lwip__opts__thread.html#ga4ef8f046c957750056131310a1580df7", null ],
+    [ "DEFAULT_TCP_RECVMBOX_SIZE", "group__lwip__opts__thread.html#ga1bd172938b9c8ba63156fcafc87e83c7", null ],
+    [ "DEFAULT_THREAD_NAME", "group__lwip__opts__thread.html#gaca13123a5c8271558353e04123957616", null ],
+    [ "DEFAULT_THREAD_PRIO", "group__lwip__opts__thread.html#ga3d8715b1fdd0449d6c214e4a40108456", null ],
+    [ "DEFAULT_THREAD_STACKSIZE", "group__lwip__opts__thread.html#ga7f93dfeaed4021061959f822def602cb", null ],
+    [ "DEFAULT_UDP_RECVMBOX_SIZE", "group__lwip__opts__thread.html#ga09fe785559b3f0cf108da4440489e335", null ],
+    [ "LWIP_TCPIP_THREAD_ALIVE", "group__lwip__opts__thread.html#ga8b99d75d9e0a0868567d10c8522915bb", null ],
+    [ "SLIPIF_THREAD_NAME", "group__lwip__opts__thread.html#gae9cd260c56472324a2f0ee5f9597a675", null ],
+    [ "SLIPIF_THREAD_PRIO", "group__lwip__opts__thread.html#gab1b9fc2efcbf1f804bfd0191bc019c4e", null ],
+    [ "SLIPIF_THREAD_STACKSIZE", "group__lwip__opts__thread.html#gae8ab54a25007ce997bbab6289815e258", null ],
+    [ "TCPIP_MBOX_SIZE", "group__lwip__opts__thread.html#ga8cf210ad4e4bf616860a45fbd140fd06", null ],
+    [ "TCPIP_THREAD_NAME", "group__lwip__opts__thread.html#ga405e604e4328e1feb878c6fe1798a587", null ],
+    [ "TCPIP_THREAD_PRIO", "group__lwip__opts__thread.html#ga42b2c7a3042d7c3efd00f367f5837435", null ],
+    [ "TCPIP_THREAD_STACKSIZE", "group__lwip__opts__thread.html#gaa02b84eafa0c8b09b158b97c96d79db0", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__threadsafe__apis.html b/doc/doxygen/output/html/group__lwip__opts__threadsafe__apis.html
new file mode 100644
index 0000000..f0adaf1
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__threadsafe__apis.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Thread-safe APIs</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__threadsafe__apis.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">Thread-safe APIs<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__lwip__opts__netconn"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netconn.html">Netconn</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__lwip__opts__socket"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html">Sockets</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>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__threadsafe__apis.js b/doc/doxygen/output/html/group__lwip__opts__threadsafe__apis.js
new file mode 100644
index 0000000..3af3cd2
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__threadsafe__apis.js
@@ -0,0 +1,5 @@
+var group__lwip__opts__threadsafe__apis =
+[
+    [ "Netconn", "group__lwip__opts__netconn.html", "group__lwip__opts__netconn" ],
+    [ "Sockets", "group__lwip__opts__socket.html", "group__lwip__opts__socket" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__timers.html b/doc/doxygen/output/html/group__lwip__opts__timers.html
new file mode 100644
index 0000000..78a503f
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__timers.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Timers</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__timers.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Timers<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__infrastructure.html">Infrastructure</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga25a41610055f91cbd0960256240b8f2c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__timers.html#ga25a41610055f91cbd0960256240b8f2c">LWIP_TIMERS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga25a41610055f91cbd0960256240b8f2c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaff0ea56f3e3d8e86c49b50557bc13815"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__timers.html#gaff0ea56f3e3d8e86c49b50557bc13815">LWIP_TIMERS_CUSTOM</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaff0ea56f3e3d8e86c49b50557bc13815"><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="ga25a41610055f91cbd0960256240b8f2c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga25a41610055f91cbd0960256240b8f2c">&#9670;&nbsp;</a></span>LWIP_TIMERS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_TIMERS&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_TIMERS==0: Drop support for sys_timeout and lwip-internal cyclic timers. (the array of lwip-internal cyclic timers is still provided) (check NO_SYS_NO_TIMERS for compatibility to old versions) </p>
+
+</div>
+</div>
+<a id="gaff0ea56f3e3d8e86c49b50557bc13815"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaff0ea56f3e3d8e86c49b50557bc13815">&#9670;&nbsp;</a></span>LWIP_TIMERS_CUSTOM</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_TIMERS_CUSTOM&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_TIMERS_CUSTOM==1: Provide your own timer implementation. Function prototypes in <a class="el" href="timeouts_8h.html">timeouts.h</a> and the array of lwip-internal cyclic timers are still included, but the implementation is not. The following functions will be required: <a class="el" href="timeouts_8c.html#a60f42f167f496f6f740c8df48f4dd26c">sys_timeouts_init()</a>, <a class="el" href="timeouts_8c.html#a8deed391626ec8b5423998e33782d7a8">sys_timeout()</a>, <a class="el" href="timeouts_8c.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6">sys_untimeout()</a>, sys_timeouts_mbox_fetch() </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__timers.js b/doc/doxygen/output/html/group__lwip__opts__timers.js
new file mode 100644
index 0000000..3df3054
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__timers.js
@@ -0,0 +1,5 @@
+var group__lwip__opts__timers =
+[
+    [ "LWIP_TIMERS", "group__lwip__opts__timers.html#ga25a41610055f91cbd0960256240b8f2c", null ],
+    [ "LWIP_TIMERS_CUSTOM", "group__lwip__opts__timers.html#gaff0ea56f3e3d8e86c49b50557bc13815", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__udp.html b/doc/doxygen/output/html/group__lwip__opts__udp.html
new file mode 100644
index 0000000..2804457
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__udp.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: UDP</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__opts__udp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">UDP<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__callback.html">Callback-style APIs</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gab6030e96e72df649d2650fd32d7a67b3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__udp.html#gab6030e96e72df649d2650fd32d7a67b3">LWIP_UDP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gab6030e96e72df649d2650fd32d7a67b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga35731bc5f337943e474a15c1cd538a61"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__udp.html#ga35731bc5f337943e474a15c1cd538a61">LWIP_UDPLITE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga35731bc5f337943e474a15c1cd538a61"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga97908a317bcba89174b5d1ccbdca0096"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__udp.html#ga97908a317bcba89174b5d1ccbdca0096">UDP_TTL</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411">IP_DEFAULT_TTL</a></td></tr>
+<tr class="separator:ga97908a317bcba89174b5d1ccbdca0096"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga72021505969c5ce29e972486d7794baa"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__udp.html#ga72021505969c5ce29e972486d7794baa">LWIP_NETBUF_RECVINFO</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga72021505969c5ce29e972486d7794baa"><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="ga72021505969c5ce29e972486d7794baa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga72021505969c5ce29e972486d7794baa">&#9670;&nbsp;</a></span>LWIP_NETBUF_RECVINFO</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NETBUF_RECVINFO&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETBUF_RECVINFO==1: append destination addr and port to every netbuf. </p>
+
+</div>
+</div>
+<a id="gab6030e96e72df649d2650fd32d7a67b3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab6030e96e72df649d2650fd32d7a67b3">&#9670;&nbsp;</a></span>LWIP_UDP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_UDP&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_UDP==1: Turn on UDP. </p>
+
+</div>
+</div>
+<a id="ga35731bc5f337943e474a15c1cd538a61"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga35731bc5f337943e474a15c1cd538a61">&#9670;&nbsp;</a></span>LWIP_UDPLITE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_UDPLITE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_UDPLITE==1: Turn on UDP-Lite. (Requires LWIP_UDP) </p>
+
+</div>
+</div>
+<a id="ga97908a317bcba89174b5d1ccbdca0096"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga97908a317bcba89174b5d1ccbdca0096">&#9670;&nbsp;</a></span>UDP_TTL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UDP_TTL&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411">IP_DEFAULT_TTL</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>UDP_TTL: Default Time-To-Live value. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__udp.js b/doc/doxygen/output/html/group__lwip__opts__udp.js
new file mode 100644
index 0000000..5484979
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__udp.js
@@ -0,0 +1,7 @@
+var group__lwip__opts__udp =
+[
+    [ "LWIP_NETBUF_RECVINFO", "group__lwip__opts__udp.html#ga72021505969c5ce29e972486d7794baa", null ],
+    [ "LWIP_UDP", "group__lwip__opts__udp.html#gab6030e96e72df649d2650fd32d7a67b3", null ],
+    [ "LWIP_UDPLITE", "group__lwip__opts__udp.html#ga35731bc5f337943e474a15c1cd538a61", null ],
+    [ "UDP_TTL", "group__lwip__opts__udp.html#ga97908a317bcba89174b5d1ccbdca0096", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__os.html b/doc/doxygen/output/html/group__lwip__os.html
new file mode 100644
index 0000000..d401d91
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__os.html
@@ -0,0 +1,439 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: OS mode (TCPIP thread)</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__os.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">OS mode (TCPIP thread)<div class="ingroups"><a class="el" href="group__lwip.html">lwIP</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gacd0a865623921ada2dd08962eb82c9df"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__os.html#gacd0a865623921ada2dd08962eb82c9df">tcpip_callback_with_block</a>(function,  ctx,  block)&#160;&#160;&#160;((block != 0)? <a class="el" href="group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip_callback</a>(function, ctx) : <a class="el" href="group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip_try_callback</a>(function, ctx))</td></tr>
+<tr class="separator:gacd0a865623921ada2dd08962eb82c9df"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gae510f195171bed8499ae94e264a92717"><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#gae510f195171bed8499ae94e264a92717">tcpip_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:gae510f195171bed8499ae94e264a92717"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="tcpip_8h.html#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:gaeb7b3c7414c76ad8dde14d2fba6cb020"><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#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip_try_callback</a> (<a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a> function, void *ctx)</td></tr>
+<tr class="separator:gaeb7b3c7414c76ad8dde14d2fba6cb020"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaee14fa2587a9ba9d23e4c7e16c4526ac"><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#gaee14fa2587a9ba9d23e4c7e16c4526ac">tcpip_callbackmsg_new</a> (<a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a> function, void *ctx)</td></tr>
+<tr class="separator:gaee14fa2587a9ba9d23e4c7e16c4526ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="separator:gac5b7a59f4c3f5f721ab9ee81f231c9fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83fe5fb2ea33e8c262567ac46f4db3f8"><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#ga83fe5fb2ea33e8c262567ac46f4db3f8">tcpip_callbackmsg_trycallback</a> (struct tcpip_callback_msg *msg)</td></tr>
+<tr class="separator:ga83fe5fb2ea33e8c262567ac46f4db3f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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>
+</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 <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="group__lwip__os.html#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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacd0a865623921ada2dd08962eb82c9df">&#9670;&nbsp;</a></span>tcpip_callback_with_block</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define tcpip_callback_with_block</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">function, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ctx, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">block&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((block != 0)? <a class="el" href="group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip_callback</a>(function, ctx) : <a class="el" href="group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip_try_callback</a>(function, ctx))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000005">Deprecated:</a></b></dt><dd>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>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gaab838fe3417ab3a1f61f0728009a0c2a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaab838fe3417ab3a1f61f0728009a0c2a">&#9670;&nbsp;</a></span>tcpip_callback()</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 </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a>&#160;</td>
+          <td class="paramname"><em>function</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ctx</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Call a specific function in the thread context of tcpip_thread for easy access synchronization. A function called in that way may access lwIP core code without fearing concurrent access. Blocks until the request is posted. Must not be called from interrupt context!</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>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip_try_callback</a> </dd></dl>
+
+</div>
+</div>
+<a id="gac5b7a59f4c3f5f721ab9ee81f231c9fd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac5b7a59f4c3f5f721ab9ee81f231c9fd">&#9670;&nbsp;</a></span>tcpip_callbackmsg_delete()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcpip_callbackmsg_delete </td>
+          <td>(</td>
+          <td class="paramtype">struct tcpip_callback_msg *&#160;</td>
+          <td class="paramname"><em>msg</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Free a callback message allocated by <a class="el" href="group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac">tcpip_callbackmsg_new()</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">msg</td><td>the message to free</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac">tcpip_callbackmsg_new()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gaee14fa2587a9ba9d23e4c7e16c4526ac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaee14fa2587a9ba9d23e4c7e16c4526ac">&#9670;&nbsp;</a></span>tcpip_callbackmsg_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct tcpip_callback_msg* tcpip_callbackmsg_new </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a>&#160;</td>
+          <td class="paramname"><em>function</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ctx</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocate a structure for a static callback message and initialize it. The message has a special type such that lwIP never frees it. This is intended to be used to send "static" messages from interrupt context, e.g. the message is allocated once and posted several times from an IRQ using <a class="el" href="group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8">tcpip_callbackmsg_trycallback()</a>. Example usage: Trigger execution of an ethernet IRQ DPC routine in lwIP thread context.</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 function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a struct pointer to pass to <a class="el" href="group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8">tcpip_callbackmsg_trycallback()</a>.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8">tcpip_callbackmsg_trycallback()</a> </dd>
+<dd>
+<a class="el" href="group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd">tcpip_callbackmsg_delete()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga83fe5fb2ea33e8c262567ac46f4db3f8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga83fe5fb2ea33e8c262567ac46f4db3f8">&#9670;&nbsp;</a></span>tcpip_callbackmsg_trycallback()</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_callbackmsg_trycallback </td>
+          <td>(</td>
+          <td class="paramtype">struct tcpip_callback_msg *&#160;</td>
+          <td class="paramname"><em>msg</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Try to post a callback-message to the tcpip_thread tcpip_mbox.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">msg</td><td>pointer to the message to post </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group__sys__mbox.html#gaa36345e48a49d67cbb0878cd4cbd2195">sys_mbox_trypost()</a> return code</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac">tcpip_callbackmsg_new()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga56a234f3d895791225c3c850bfadb666"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga56a234f3d895791225c3c850bfadb666">&#9670;&nbsp;</a></span>tcpip_callbackmsg_trycallback_fromisr()</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_callbackmsg_trycallback_fromisr </td>
+          <td>(</td>
+          <td class="paramtype">struct tcpip_callback_msg *&#160;</td>
+          <td class="paramname"><em>msg</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Try to post a callback-message to the tcpip_thread mbox. Same as <a class="el" href="group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8">tcpip_callbackmsg_trycallback</a> but calls <a class="el" href="group__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a">sys_mbox_trypost_fromisr()</a>, mainly to help FreeRTOS, where calls differ between task level and ISR level.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">msg</td><td>pointer to the message to post </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="group__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a">sys_mbox_trypost_fromisr()</a> return code (without change, so this knowledge can be used to e.g. propagate "bool needs_scheduling")</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac">tcpip_callbackmsg_new()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga1f3a88b8df6ba3b9ed1c00e0a305e3db"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1f3a88b8df6ba3b9ed1c00e0a305e3db">&#9670;&nbsp;</a></span>tcpip_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcpip_init </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="tcpip_8h.html#a5fe07216c441e27c3028bcac60fa0992">tcpip_init_done_fn</a>&#160;</td>
+          <td class="paramname"><em>initfunc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize this module:</p><ul>
+<li>initialize all sub modules</li>
+<li>start the tcpip_thread</li>
+</ul>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">initfunc</td><td>a function to call when tcpip_thread is running and finished initializing </td></tr>
+    <tr><td class="paramname">arg</td><td>argument to pass to initfunc </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gae510f195171bed8499ae94e264a92717"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae510f195171bed8499ae94e264a92717">&#9670;&nbsp;</a></span>tcpip_input()</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_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Pass a received packet to tcpip_thread for input processing with ethernet_input or ip_input. Don't call directly, pass to <a class="el" href="group__netif.html#gade5498543e74067f28cc6bef0209e3be">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 or to an IP header (if inp doesn't have NETIF_FLAG_ETHARP or NETIF_FLAG_ETHERNET flags) </td></tr>
+    <tr><td class="paramname">inp</td><td>the network interface on which the packet was received </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gaeb7b3c7414c76ad8dde14d2fba6cb020"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaeb7b3c7414c76ad8dde14d2fba6cb020">&#9670;&nbsp;</a></span>tcpip_try_callback()</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_try_callback </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a>&#160;</td>
+          <td class="paramname"><em>function</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ctx</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Call a specific function in the thread context of tcpip_thread for easy access synchronization. A function called in that way may access lwIP core code without fearing concurrent access. Does NOT block when the request cannot be posted because the tcpip_mbox is full, but returns ERR_MEM instead. Can be called from interrupt context.</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>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip_callback</a> </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__os.js b/doc/doxygen/output/html/group__lwip__os.js
new file mode 100644
index 0000000..b415433
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__os.js
@@ -0,0 +1,12 @@
+var group__lwip__os =
+[
+    [ "tcpip_callback_with_block", "group__lwip__os.html#gacd0a865623921ada2dd08962eb82c9df", null ],
+    [ "tcpip_callback", "group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a", null ],
+    [ "tcpip_callbackmsg_delete", "group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd", null ],
+    [ "tcpip_callbackmsg_new", "group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac", null ],
+    [ "tcpip_callbackmsg_trycallback", "group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8", null ],
+    [ "tcpip_callbackmsg_trycallback_fromisr", "group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666", null ],
+    [ "tcpip_init", "group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db", null ],
+    [ "tcpip_input", "group__lwip__os.html#gae510f195171bed8499ae94e264a92717", null ],
+    [ "tcpip_try_callback", "group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__version.html b/doc/doxygen/output/html/group__lwip__version.html
new file mode 100644
index 0000000..9779ec3
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__version.html
@@ -0,0 +1,247 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Version</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__lwip__version.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Version<div class="ingroups"><a class="el" href="group__lwip.html">lwIP</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem: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"><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="separator:ga1e596388c15ba81e753c5633fad1c034"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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;2</td></tr>
+<tr class="separator:ga0a57983df1b199cf39a2e6a2d90e3d50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="memitem:ga375ee868e76ed7c458cdf249387bd469"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__version.html#ga375ee868e76ed7c458cdf249387bd469">LWIP_RC_RELEASE</a>&#160;&#160;&#160;255</td></tr>
+<tr class="separator:ga375ee868e76ed7c458cdf249387bd469"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9ca69b1a453eb72efd0bbda333f2a33b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__version.html#ga9ca69b1a453eb72efd0bbda333f2a33b">LWIP_RC_DEVELOPMENT</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga9ca69b1a453eb72efd0bbda333f2a33b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0a0d322fad0a67aa5b8f1b8c9dfcfe59"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__version.html#ga0a0d322fad0a67aa5b8f1b8c9dfcfe59">LWIP_VERSION</a></td></tr>
+<tr class="separator:ga0a0d322fad0a67aa5b8f1b8c9dfcfe59"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab47e87bc38eef94486db402813183ba7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__version.html#gab47e87bc38eef94486db402813183ba7">LWIP_VERSION_STRING</a>&#160;&#160;&#160;LWIP_VERSTR(<a class="el" href="group__lwip__version.html#ga4308c06ef36496e00c798d96d7d03246">LWIP_VERSION_MAJOR</a>) &quot;.&quot; LWIP_VERSTR(<a class="el" href="group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034">LWIP_VERSION_MINOR</a>) &quot;.&quot; LWIP_VERSTR(<a class="el" href="group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50">LWIP_VERSION_REVISION</a>) LWIP_VERSION_STRING_SUFFIX</td></tr>
+<tr class="separator:gab47e87bc38eef94486db402813183ba7"><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="ga9ca69b1a453eb72efd0bbda333f2a33b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9ca69b1a453eb72efd0bbda333f2a33b">&#9670;&nbsp;</a></span>LWIP_RC_DEVELOPMENT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_RC_DEVELOPMENT&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_VERSION_RC is set to LWIP_RC_DEVELOPMENT for Git versions </p>
+
+</div>
+</div>
+<a id="ga375ee868e76ed7c458cdf249387bd469"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga375ee868e76ed7c458cdf249387bd469">&#9670;&nbsp;</a></span>LWIP_RC_RELEASE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_RC_RELEASE&#160;&#160;&#160;255</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_VERSION_RC is set to LWIP_RC_RELEASE for official releases </p>
+
+</div>
+</div>
+<a id="ga0a0d322fad0a67aa5b8f1b8c9dfcfe59"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0a0d322fad0a67aa5b8f1b8c9dfcfe59">&#9670;&nbsp;</a></span>LWIP_VERSION</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_VERSION</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">((<a class="code" href="group__lwip__version.html#ga4308c06ef36496e00c798d96d7d03246">LWIP_VERSION_MAJOR</a>) &lt;&lt; 24   | (<a class="code" href="group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034">LWIP_VERSION_MINOR</a>) &lt;&lt; 16 | \</div><div class="line">                        (<a class="code" href="group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50">LWIP_VERSION_REVISION</a>) &lt;&lt; 8 | (<a class="code" href="group__lwip__version.html#gac1dc92d8f453a98560de7e2e00a221a1">LWIP_VERSION_RC</a>))</div><div class="ttc" id="group__lwip__version_html_ga1e596388c15ba81e753c5633fad1c034"><div class="ttname"><a href="group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034">LWIP_VERSION_MINOR</a></div><div class="ttdeci">#define LWIP_VERSION_MINOR</div><div class="ttdef"><b>Definition:</b> init.h:55</div></div>
+<div class="ttc" id="group__lwip__version_html_ga4308c06ef36496e00c798d96d7d03246"><div class="ttname"><a href="group__lwip__version.html#ga4308c06ef36496e00c798d96d7d03246">LWIP_VERSION_MAJOR</a></div><div class="ttdeci">#define LWIP_VERSION_MAJOR</div><div class="ttdef"><b>Definition:</b> init.h:53</div></div>
+<div class="ttc" id="group__lwip__version_html_ga0a57983df1b199cf39a2e6a2d90e3d50"><div class="ttname"><a href="group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50">LWIP_VERSION_REVISION</a></div><div class="ttdeci">#define LWIP_VERSION_REVISION</div><div class="ttdef"><b>Definition:</b> init.h:57</div></div>
+<div class="ttc" id="group__lwip__version_html_gac1dc92d8f453a98560de7e2e00a221a1"><div class="ttname"><a href="group__lwip__version.html#gac1dc92d8f453a98560de7e2e00a221a1">LWIP_VERSION_RC</a></div><div class="ttdeci">#define LWIP_VERSION_RC</div><div class="ttdef"><b>Definition:</b> init.h:61</div></div>
+</div><!-- fragment --><p>Provides the version of the stack </p>
+
+</div>
+</div>
+<a id="ga4308c06ef36496e00c798d96d7d03246"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4308c06ef36496e00c798d96d7d03246">&#9670;&nbsp;</a></span>LWIP_VERSION_MAJOR</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_VERSION_MAJOR&#160;&#160;&#160;2</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>X.x.x: Major version of the stack </p>
+
+</div>
+</div>
+<a id="ga1e596388c15ba81e753c5633fad1c034"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1e596388c15ba81e753c5633fad1c034">&#9670;&nbsp;</a></span>LWIP_VERSION_MINOR</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_VERSION_MINOR&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>x.X.x: Minor version of the stack </p>
+
+</div>
+</div>
+<a id="gac1dc92d8f453a98560de7e2e00a221a1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac1dc92d8f453a98560de7e2e00a221a1">&#9670;&nbsp;</a></span>LWIP_VERSION_RC</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_VERSION_RC&#160;&#160;&#160;<a class="el" href="group__lwip__version.html#ga375ee868e76ed7c458cdf249387bd469">LWIP_RC_RELEASE</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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) </p>
+
+</div>
+</div>
+<a id="ga0a57983df1b199cf39a2e6a2d90e3d50"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0a57983df1b199cf39a2e6a2d90e3d50">&#9670;&nbsp;</a></span>LWIP_VERSION_REVISION</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_VERSION_REVISION&#160;&#160;&#160;2</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>x.x.X: Revision of the stack </p>
+
+</div>
+</div>
+<a id="gab47e87bc38eef94486db402813183ba7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab47e87bc38eef94486db402813183ba7">&#9670;&nbsp;</a></span>LWIP_VERSION_STRING</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_VERSION_STRING&#160;&#160;&#160;LWIP_VERSTR(<a class="el" href="group__lwip__version.html#ga4308c06ef36496e00c798d96d7d03246">LWIP_VERSION_MAJOR</a>) &quot;.&quot; LWIP_VERSTR(<a class="el" href="group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034">LWIP_VERSION_MINOR</a>) &quot;.&quot; LWIP_VERSTR(<a class="el" href="group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50">LWIP_VERSION_REVISION</a>) LWIP_VERSION_STRING_SUFFIX</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Provides the version of the stack as string </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__version.js b/doc/doxygen/output/html/group__lwip__version.js
new file mode 100644
index 0000000..171e7c6
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__version.js
@@ -0,0 +1,11 @@
+var group__lwip__version =
+[
+    [ "LWIP_RC_DEVELOPMENT", "group__lwip__version.html#ga9ca69b1a453eb72efd0bbda333f2a33b", null ],
+    [ "LWIP_RC_RELEASE", "group__lwip__version.html#ga375ee868e76ed7c458cdf249387bd469", null ],
+    [ "LWIP_VERSION", "group__lwip__version.html#ga0a0d322fad0a67aa5b8f1b8c9dfcfe59", null ],
+    [ "LWIP_VERSION_MAJOR", "group__lwip__version.html#ga4308c06ef36496e00c798d96d7d03246", null ],
+    [ "LWIP_VERSION_MINOR", "group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034", null ],
+    [ "LWIP_VERSION_RC", "group__lwip__version.html#gac1dc92d8f453a98560de7e2e00a221a1", null ],
+    [ "LWIP_VERSION_REVISION", "group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50", null ],
+    [ "LWIP_VERSION_STRING", "group__lwip__version.html#gab47e87bc38eef94486db402813183ba7", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__mdns.html b/doc/doxygen/output/html/group__mdns.html
new file mode 100644
index 0000000..e589ae2
--- /dev/null
+++ b/doc/doxygen/output/html/group__mdns.html
@@ -0,0 +1,659 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: MDNS</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__mdns.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">MDNS<div class="ingroups"><a class="el" href="group__apps.html">Applications</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__mdns__opts"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns__opts.html">Options</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem: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>)&#160;&#160;&#160;<a class="el" href="group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85">mdns_resp_announce</a>(<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gab2edba12d5cad1949f7ca040ae12beec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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: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"><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"><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"><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"><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: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: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: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"><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>
+</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
+
+Author: Erik Ekman
+
+
+Note! The MDNS responder does not have all features required by the standards.
+See notes in src/apps/mdns/mdns.c for what is left. It is however usable in normal
+cases - but watch out if many devices on the same network try to use the same
+host/service instance names.
+
+
+How to enable:
+==============
+
+MDNS support does not depend on DNS.
+MDNS supports using IPv4 only, v6 only, or v4+v6.
+
+To enable MDNS responder, set
+  LWIP_MDNS_RESPONDER = 1
+in lwipopts.h and add src/apps/mdns/mdns.c to your list of files to build.
+
+The max number of services supported per netif is defined by MDNS_MAX_SERVICES,
+default is 1.
+
+Increase MEMP_NUM_UDP_PCB by 1. MDNS needs one PCB.
+Increase LWIP_NUM_NETIF_CLIENT_DATA by 1 (MDNS needs one entry on netif).
+
+MDNS with IPv4 requires LWIP_IGMP = 1, and preferably LWIP_AUTOIP = 1.
+MDNS with IPv6 requires LWIP_IPV6_MLD = 1, and that a link-local address is
+generated.
+
+The MDNS code puts its structs on the stack where suitable to reduce dynamic
+memory allocation. It may use up to 1kB of stack.
+
+MDNS (like other apps) needs a strncasecmp() implementation. If you have one, define
+'lwip_strnicmp' to it. Otherwise the code will provide an implementation
+for you.
+
+
+How to use:
+===========
+
+Call mdns_resp_init() during system initialization.
+This opens UDP sockets on port 5353 for IPv4 and IPv6.
+
+
+To start responding on a netif, run
+  mdns_resp_add_netif(struct netif *netif, char *hostname, u32_t dns_ttl)
+
+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
+to port 5353 will be handled:
+- &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.
+
+Call mdns_resp_announce() every time the IP address on the netif has changed.
+
+Call mdns_resp_restart() every time the network interface comes up after being
+down, for example cable connected after being disconnected, administrative 
+interface comes up after being down, or the device wakes up from sleep.
+
+To stop responding on a netif, run
+  mdns_resp_remove_netif(struct netif *netif)
+
+
+Adding services:
+================
+
+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,
+      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
+service instance, and service is the type of service, like _http
+proto can be DNSSD_PROTO_UDP or DNSSD_PROTO_TCP which represent _udp and _tcp.
+If this call returns successfully, the following queries will be answered:
+- _services._dns-sd._udp.local type PTR returns &lt;service&gt;.&lt;proto&gt;.local
+- &lt;service&gt;.&lt;proto&gt;.local type PTR returns &lt;name&gt;.&lt;service&gt;.&lt;proto&gt;.local
+- &lt;name&gt;.&lt;service&gt;.&lt;proto&gt;.local type SRV returns hostname and port of service
+- &lt;name&gt;.&lt;service&gt;.&lt;proto&gt;.local type TXT builds text strings by calling txt_fn
+  with the supplied userdata. The callback adds strings to the reply by calling
+  mdns_resp_add_service_txtitem(struct mdns_service *service, char *txt,
+   int txt_len). Example callback method:
+
+   static void srv_txt(struct mdns_service *service, void *txt_userdata)
+   {
+     res = mdns_resp_add_service_txtitem(service, "path=/", 6);
+     LWIP_ERROR("mdns add service txt failed\n", (res == ERR_OK), return);
+   }
+
+  Since a hostname struct is used for TXT storage each single item can be max
+  63 bytes long, and  the total max length (including length bytes for each
+  item) is 255 bytes.
+
+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);
+
+which will publish myweb._http._tcp.local for any hosts looking for web servers,
+and point them to &lt;hostname&gt;.local:80
+
+Relevant information will be sent as additional records to reduce number of
+requests required from a client.
+
+To remove a service from a netif, run
+  mdns_resp_del_service(struct netif *netif, s8_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>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>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="gab2edba12d5cad1949f7ca040ae12beec"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab2edba12d5cad1949f7ca040ae12beec">&#9670;&nbsp;</a></span>mdns_resp_netif_settings_changed</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define mdns_resp_netif_settings_changed</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85">mdns_resp_announce</a>(<a class="el" href="structnetif.html">netif</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gaa619ac8f46a4b4021195720f0355cbeb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa619ac8f46a4b4021195720f0355cbeb">&#9670;&nbsp;</a></span>mdns_resp_add_netif()</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_resp_add_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>hostname</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>dns_ttl</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Activate MDNS responder for a network interface. </p><dl class="params"><dt>Parameters</dt><dd>
+  <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>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if netif was added, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ga824e992e94be216c8e059f48f49a59ce"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga824e992e94be216c8e059f48f49a59ce">&#9670;&nbsp;</a></span>mdns_resp_add_service()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">s8_t mdns_resp_add_service </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>service</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum mdns_sd_proto&#160;</td>
+          <td class="paramname"><em>proto</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>dns_ttl</em>, </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>&#160;</td>
+          <td class="paramname"><em>txt_fn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>txt_data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add a service to the selected network interface. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The network interface to publish this service on </td></tr>
+    <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">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>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>service_id if the service was added to the netif, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ga01c85202f4b85edc8b571f2f419db576"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga01c85202f4b85edc8b571f2f419db576">&#9670;&nbsp;</a></span>mdns_resp_add_service_txtitem()</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_resp_add_service_txtitem </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structmdns__service.html">mdns_service</a> *&#160;</td>
+          <td class="paramname"><em>service</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>txt</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>txt_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Call this function from inside the service_get_txt_fn_t callback to add text data. Buffer for TXT data is 256 bytes, and each field is prefixed with a length byte. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">service</td><td>The service provided to the get_txt callback </td></tr>
+    <tr><td class="paramname">txt</td><td>String to add to the TXT field. </td></tr>
+    <tr><td class="paramname">txt_len</td><td>Length of string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the string was added to the reply, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ga0f462fb91a9d0323bb4636bd725f0e85"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0f462fb91a9d0323bb4636bd725f0e85">&#9670;&nbsp;</a></span>mdns_resp_announce()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_resp_announce </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send unsolicited answer containing all our known data </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>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga3df2ae751cdfdffb0a567390940eb8ad"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3df2ae751cdfdffb0a567390940eb8ad">&#9670;&nbsp;</a></span>mdns_resp_del_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_resp_del_service </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s8_t&#160;</td>
+          <td class="paramname"><em>slot</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Delete a service on the selected network interface. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The network interface on which service should be removed </td></tr>
+    <tr><td class="paramname">slot</td><td>The service slot number returned by mdns_resp_add_service </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the service was removed from the netif, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ga5fa15978a398dae1a8d7620ae169bdd3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5fa15978a398dae1a8d7620ae169bdd3">&#9670;&nbsp;</a></span>mdns_resp_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_resp_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initiate MDNS responder. Will open UDP sockets on port 5353 </p>
+
+</div>
+</div>
+<a id="gaa8144e3c77a92c4043e6214ff6b6010c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa8144e3c77a92c4043e6214ff6b6010c">&#9670;&nbsp;</a></span>mdns_resp_remove_netif()</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_resp_remove_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Stop responding to MDNS queries on this interface, leave multicast groups, and free the helper structure and any of its services. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The network interface to remove. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if netif was removed, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ga7b1473e595eb0c185bab293f3ec2e50e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7b1473e595eb0c185bab293f3ec2e50e">&#9670;&nbsp;</a></span>mdns_resp_rename_netif()</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_resp_rename_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>hostname</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Update MDNS hostname for a network interface. </p><dl class="params"><dt>Parameters</dt><dd>
+  <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>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if name could be set on netif, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="gaf273897059f1bbddc74cfcb820777dd9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf273897059f1bbddc74cfcb820777dd9">&#9670;&nbsp;</a></span>mdns_resp_rename_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_resp_rename_service </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s8_t&#160;</td>
+          <td class="paramname"><em>slot</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>name</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Update name for an MDNS service. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The network interface to activate. </td></tr>
+    <tr><td class="paramname">slot</td><td>The service slot number returned by mdns_resp_add_service </td></tr>
+    <tr><td class="paramname">name</td><td>The new name for the service </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if name could be set on service, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ga93eccdc0d9afff0f24160d31c70e2c9a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga93eccdc0d9afff0f24160d31c70e2c9a">&#9670;&nbsp;</a></span>mdns_resp_restart()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_resp_restart </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Restart mdns responder. 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>
+  </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__mdns.js b/doc/doxygen/output/html/group__mdns.js
new file mode 100644
index 0000000..37503a3
--- /dev/null
+++ b/doc/doxygen/output/html/group__mdns.js
@@ -0,0 +1,15 @@
+var group__mdns =
+[
+    [ "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_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_init", "group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3", 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 ]
+];
\ 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
new file mode 100644
index 0000000..443f9ad
--- /dev/null
+++ b/doc/doxygen/output/html/group__mdns__opts.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Options</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__mdns__opts.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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__mdns.html">MDNS</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem: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: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: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>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga53a97502efdcf1214cab4078f93a6dc9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga53a97502efdcf1214cab4078f93a6dc9">&#9670;&nbsp;</a></span>MDNS_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MDNS_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>MDNS_DEBUG: Enable debugging for multicast DNS. </p>
+
+</div>
+</div>
+<a id="ga82749ee08be21967b6daf577b9710ac6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga82749ee08be21967b6daf577b9710ac6">&#9670;&nbsp;</a></span>MDNS_MAX_SERVICES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MDNS_MAX_SERVICES&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_MDNS_RESPONDER==1: Turn on multicast DNS module. UDP must be available for MDNS transport. IGMP is needed for IPv4 multicast.The maximum number of services per netif </p>
+
+</div>
+</div>
+<a id="ga172e579cd09a1db51cf224319c012396"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga172e579cd09a1db51cf224319c012396">&#9670;&nbsp;</a></span>MDNS_RESP_USENETIF_EXTCALLBACK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MDNS_RESP_USENETIF_EXTCALLBACK&#160;&#160;&#160;<a class="el" href="group__lwip__opts__netif.html#ga090482867ba04d442ab5b8ad745c0e1e">LWIP_NETIF_EXT_STATUS_CALLBACK</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MDNS_RESP_USENETIF_EXTCALLBACK==1: register an ext_callback on the netif to automatically restart probing/announcing on status or address change. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__mdns__opts.js b/doc/doxygen/output/html/group__mdns__opts.js
new file mode 100644
index 0000000..4d92a3d
--- /dev/null
+++ b/doc/doxygen/output/html/group__mdns__opts.js
@@ -0,0 +1,6 @@
+var group__mdns__opts =
+[
+    [ "MDNS_DEBUG", "group__mdns__opts.html#ga53a97502efdcf1214cab4078f93a6dc9", null ],
+    [ "MDNS_MAX_SERVICES", "group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6", 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
new file mode 100644
index 0000000..f9b5757
--- /dev/null
+++ b/doc/doxygen/output/html/group__mempool.html
@@ -0,0 +1,255 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Memory pools</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__mempool.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Memory pools<div class="ingroups"><a class="el" href="group__infrastructure.html">Infrastructure</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga92fc8c29d0e2654f2a2ecc43b2b7fb13"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mempool.html#ga92fc8c29d0e2654f2a2ecc43b2b7fb13">LWIP_MEMPOOL_PROTOTYPE</a>(name)&#160;&#160;&#160;extern const struct <a class="el" href="structmemp__desc.html">memp_desc</a> memp_ ## name</td></tr>
+<tr class="separator:ga92fc8c29d0e2654f2a2ecc43b2b7fb13"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5b1fb3ce7942432d87cc948b1c5ed6cb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mempool.html#ga5b1fb3ce7942432d87cc948b1c5ed6cb">LWIP_MEMPOOL_DECLARE</a>(name,  num,  size,  desc)</td></tr>
+<tr class="separator:ga5b1fb3ce7942432d87cc948b1c5ed6cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga60b51c06d276f525b35d8b7abd4dcb41"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mempool.html#ga60b51c06d276f525b35d8b7abd4dcb41">LWIP_MEMPOOL_INIT</a>(name)&#160;&#160;&#160;<a class="el" href="memp__priv_8h.html#a6416303426d05526bed33f241fa6ecd7">memp_init_pool</a>(&amp;memp_ ## name)</td></tr>
+<tr class="separator:ga60b51c06d276f525b35d8b7abd4dcb41"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5e2498f6c17746c1fe7153de5f7f275a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mempool.html#ga5e2498f6c17746c1fe7153de5f7f275a">LWIP_MEMPOOL_ALLOC</a>(name)&#160;&#160;&#160;<a class="el" href="memp__priv_8h.html#a348c83ee972f1edf7296a1cdf1d75f22">memp_malloc_pool</a>(&amp;memp_ ## name)</td></tr>
+<tr class="separator:ga5e2498f6c17746c1fe7153de5f7f275a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa43d114dd702fbd8f1db18474ea93a04"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mempool.html#gaa43d114dd702fbd8f1db18474ea93a04">LWIP_MEMPOOL_FREE</a>(name,  x)&#160;&#160;&#160;<a class="el" href="memp__priv_8h.html#a62f8c3c907743e34eee3cdac7fa1eaa5">memp_free_pool</a>(&amp;memp_ ## name, (x))</td></tr>
+<tr class="separator:gaa43d114dd702fbd8f1db18474ea93a04"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Custom memory pools </p>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga5e2498f6c17746c1fe7153de5f7f275a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5e2498f6c17746c1fe7153de5f7f275a">&#9670;&nbsp;</a></span>LWIP_MEMPOOL_ALLOC</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_MEMPOOL_ALLOC</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">name</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="memp__priv_8h.html#a348c83ee972f1edf7296a1cdf1d75f22">memp_malloc_pool</a>(&amp;memp_ ## name)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocate from a private memory pool </p>
+
+</div>
+</div>
+<a id="ga5b1fb3ce7942432d87cc948b1c5ed6cb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5b1fb3ce7942432d87cc948b1c5ed6cb">&#9670;&nbsp;</a></span>LWIP_MEMPOOL_DECLARE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_MEMPOOL_DECLARE</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">name, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">num, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">size, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">desc&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><a class="code" href="group__compiler__abstraction.html#ga651bb349041669fe717b19f127ef16c0">LWIP_DECLARE_MEMORY_ALIGNED</a>(memp_memory_ ## name ## _base, ((num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size)))); \</div><div class="line">    \</div><div class="line">  LWIP_MEMPOOL_DECLARE_STATS_INSTANCE(memp_stats_ ## name) \</div><div class="line">    \</div><div class="line">  static <span class="keyword">struct </span>memp *memp_tab_ ## name; \</div><div class="line">    \</div><div class="line">  const <span class="keyword">struct </span><a class="code" href="structmemp__desc.html">memp_desc</a> memp_ ## name = { \</div><div class="line">    DECLARE_LWIP_MEMPOOL_DESC(desc) \</div><div class="line">    LWIP_MEMPOOL_DECLARE_STATS_REFERENCE(memp_stats_ ## name) \</div><div class="line">    LWIP_MEM_ALIGN_SIZE(<a class="code" href="structmemp__desc.html#a1688d2bdd5a7b77700e1fa627f025ba3">size</a>), \</div><div class="line">    (<a class="code" href="structmemp__desc.html#a2c32db78e565b8812ca0e20fe929a8a7">num</a>), \</div><div class="line">    memp_memory_ ## name ## _base, \</div><div class="line">    &amp;memp_tab_ ## name \</div><div class="line">  };</div><div class="ttc" id="structmemp__desc_html_a1688d2bdd5a7b77700e1fa627f025ba3"><div class="ttname"><a href="structmemp__desc.html#a1688d2bdd5a7b77700e1fa627f025ba3">memp_desc::size</a></div><div class="ttdeci">u16_t size</div><div class="ttdef"><b>Definition:</b> memp_priv.h:119</div></div>
+<div class="ttc" id="structmemp__desc_html_a2c32db78e565b8812ca0e20fe929a8a7"><div class="ttname"><a href="structmemp__desc.html#a2c32db78e565b8812ca0e20fe929a8a7">memp_desc::num</a></div><div class="ttdeci">u16_t num</div><div class="ttdef"><b>Definition:</b> memp_priv.h:123</div></div>
+<div class="ttc" id="group__compiler__abstraction_html_ga651bb349041669fe717b19f127ef16c0"><div class="ttname"><a href="group__compiler__abstraction.html#ga651bb349041669fe717b19f127ef16c0">LWIP_DECLARE_MEMORY_ALIGNED</a></div><div class="ttdeci">#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size)</div><div class="ttdef"><b>Definition:</b> arch.h:271</div></div>
+<div class="ttc" id="structmemp__desc_html"><div class="ttname"><a href="structmemp__desc.html">memp_desc</a></div><div class="ttdef"><b>Definition:</b> memp_priv.h:108</div></div>
+</div><!-- fragment --><p>Declare a private memory pool Private mempools example: .h: only when pool is used in multiple .c files: <a class="el" href="group__mempool.html#ga92fc8c29d0e2654f2a2ecc43b2b7fb13">LWIP_MEMPOOL_PROTOTYPE(my_private_pool)</a>; .c:</p><ul>
+<li>in global variables section: LWIP_MEMPOOL_DECLARE(my_private_pool, 10, sizeof(foo), "Some description")</li>
+<li>call ONCE before using pool (e.g. in some init() function): <a class="el" href="group__mempool.html#ga60b51c06d276f525b35d8b7abd4dcb41">LWIP_MEMPOOL_INIT(my_private_pool)</a>;</li>
+<li>allocate: void* my_new_mem = <a class="el" href="group__mempool.html#ga5e2498f6c17746c1fe7153de5f7f275a">LWIP_MEMPOOL_ALLOC(my_private_pool)</a>;</li>
+<li>free: <a class="el" href="group__mempool.html#gaa43d114dd702fbd8f1db18474ea93a04">LWIP_MEMPOOL_FREE(my_private_pool, my_new_mem)</a>;</li>
+</ul>
+<p>To relocate a pool, declare it as extern in cc.h. Example for GCC: extern u8_t __attribute__((section(".onchip_mem"))) memp_memory_my_private_pool_base[]; </p>
+
+</div>
+</div>
+<a id="gaa43d114dd702fbd8f1db18474ea93a04"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa43d114dd702fbd8f1db18474ea93a04">&#9670;&nbsp;</a></span>LWIP_MEMPOOL_FREE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_MEMPOOL_FREE</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">name, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">x&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="memp__priv_8h.html#a62f8c3c907743e34eee3cdac7fa1eaa5">memp_free_pool</a>(&amp;memp_ ## name, (x))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Free element from a private memory pool </p>
+
+</div>
+</div>
+<a id="ga60b51c06d276f525b35d8b7abd4dcb41"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga60b51c06d276f525b35d8b7abd4dcb41">&#9670;&nbsp;</a></span>LWIP_MEMPOOL_INIT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_MEMPOOL_INIT</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">name</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="memp__priv_8h.html#a6416303426d05526bed33f241fa6ecd7">memp_init_pool</a>(&amp;memp_ ## name)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize a private memory pool </p>
+
+</div>
+</div>
+<a id="ga92fc8c29d0e2654f2a2ecc43b2b7fb13"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga92fc8c29d0e2654f2a2ecc43b2b7fb13">&#9670;&nbsp;</a></span>LWIP_MEMPOOL_PROTOTYPE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_MEMPOOL_PROTOTYPE</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">name</td><td>)</td>
+          <td>&#160;&#160;&#160;extern const struct <a class="el" href="structmemp__desc.html">memp_desc</a> memp_ ## name</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Declare prototype for private memory pool if it is used in multiple files </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__mempool.js b/doc/doxygen/output/html/group__mempool.js
new file mode 100644
index 0000000..17f752d
--- /dev/null
+++ b/doc/doxygen/output/html/group__mempool.js
@@ -0,0 +1,8 @@
+var group__mempool =
+[
+    [ "LWIP_MEMPOOL_ALLOC", "group__mempool.html#ga5e2498f6c17746c1fe7153de5f7f275a", null ],
+    [ "LWIP_MEMPOOL_DECLARE", "group__mempool.html#ga5b1fb3ce7942432d87cc948b1c5ed6cb", null ],
+    [ "LWIP_MEMPOOL_FREE", "group__mempool.html#gaa43d114dd702fbd8f1db18474ea93a04", null ],
+    [ "LWIP_MEMPOOL_INIT", "group__mempool.html#ga60b51c06d276f525b35d8b7abd4dcb41", null ],
+    [ "LWIP_MEMPOOL_PROTOTYPE", "group__mempool.html#ga92fc8c29d0e2654f2a2ecc43b2b7fb13", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__mld6.html b/doc/doxygen/output/html/group__mld6.html
new file mode 100644
index 0000000..987504b
--- /dev/null
+++ b/doc/doxygen/output/html/group__mld6.html
@@ -0,0 +1,295 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: MLD6</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__mld6.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">MLD6<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__ip6.html">IPv6</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga02a2259082f22c5989a3c929be95e641"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mld6.html#ga02a2259082f22c5989a3c929be95e641">netif_mld6_data</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;((struct <a class="el" href="structmld__group.html">mld_group</a> *)<a class="el" href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a>(<a class="el" href="structnetif.html">netif</a>, LWIP_NETIF_CLIENT_DATA_INDEX_MLD6))</td></tr>
+<tr class="separator:ga02a2259082f22c5989a3c929be95e641"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga53560ab6e47163e4888070830bf912a8"><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__mld6.html#ga53560ab6e47163e4888070830bf912a8">mld6_joingroup</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *srcaddr, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:ga53560ab6e47163e4888070830bf912a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2ba41d575a56d27c0af0a08fb8724940"><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__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940">mld6_joingroup_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:ga2ba41d575a56d27c0af0a08fb8724940"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga946b830efc6fd795b07a0964dc7940e5"><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__mld6.html#ga946b830efc6fd795b07a0964dc7940e5">mld6_leavegroup</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *srcaddr, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:ga946b830efc6fd795b07a0964dc7940e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab664062a15a3ae3e05282eacf4dc0a22"><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__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22">mld6_leavegroup_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:gab664062a15a3ae3e05282eacf4dc0a22"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</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>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga02a2259082f22c5989a3c929be95e641"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga02a2259082f22c5989a3c929be95e641">&#9670;&nbsp;</a></span>netif_mld6_data</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_mld6_data</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td>&#160;&#160;&#160;((struct <a class="el" href="structmld__group.html">mld_group</a> *)<a class="el" href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a>(<a class="el" href="structnetif.html">netif</a>, LWIP_NETIF_CLIENT_DATA_INDEX_MLD6))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga53560ab6e47163e4888070830bf912a8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga53560ab6e47163e4888070830bf912a8">&#9670;&nbsp;</a></span>mld6_joingroup()</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> mld6_joingroup </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>srcaddr</em>, </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> *&#160;</td>
+          <td class="paramname"><em>groupaddr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Join a group on one or all network interfaces.</p>
+<p>If the group is to be joined on all interfaces, the given group address must not have a zone set (i.e., it must have its zone index set to IP6_NO_ZONE). If the group is to be joined on one particular interface, the given group address may or may not have a zone set.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">srcaddr</td><td>ipv6 address (zoned) of the network interface which should join a new group. If IP6_ADDR_ANY6, join on all netifs </td></tr>
+    <tr><td class="paramname">groupaddr</td><td>the ipv6 address of the group to join (possibly but not necessarily zoned) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if group was joined on the <a class="el" href="structnetif.html">netif(s)</a>, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ga2ba41d575a56d27c0af0a08fb8724940"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2ba41d575a56d27c0af0a08fb8724940">&#9670;&nbsp;</a></span>mld6_joingroup_netif()</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> mld6_joingroup_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>groupaddr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Join a group on a network interface.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the network interface which should join a new group. </td></tr>
+    <tr><td class="paramname">groupaddr</td><td>the ipv6 address of the group to join (possibly but not necessarily zoned) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if group was joined on the netif, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ga946b830efc6fd795b07a0964dc7940e5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga946b830efc6fd795b07a0964dc7940e5">&#9670;&nbsp;</a></span>mld6_leavegroup()</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> mld6_leavegroup </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>srcaddr</em>, </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> *&#160;</td>
+          <td class="paramname"><em>groupaddr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Leave a group on a network interface.</p>
+<p>Zoning of address follows the same rules as <a class="el" href="group__mld6.html#ga53560ab6e47163e4888070830bf912a8">mld6_joingroup</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">srcaddr</td><td>ipv6 address (zoned) of the network interface which should leave the group. If IP6_ADDR_ANY6, leave on all netifs </td></tr>
+    <tr><td class="paramname">groupaddr</td><td>the ipv6 address of the group to leave (possibly, but not necessarily zoned) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if group was left on the <a class="el" href="structnetif.html">netif(s)</a>, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="gab664062a15a3ae3e05282eacf4dc0a22"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab664062a15a3ae3e05282eacf4dc0a22">&#9670;&nbsp;</a></span>mld6_leavegroup_netif()</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> mld6_leavegroup_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>groupaddr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Leave a group on a network interface.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the network interface which should leave the group. </td></tr>
+    <tr><td class="paramname">groupaddr</td><td>the ipv6 address of the group to leave (possibly, but not necessarily zoned) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if group was left on the netif, 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="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__mld6.js b/doc/doxygen/output/html/group__mld6.js
new file mode 100644
index 0000000..ab5a891
--- /dev/null
+++ b/doc/doxygen/output/html/group__mld6.js
@@ -0,0 +1,8 @@
+var group__mld6 =
+[
+    [ "netif_mld6_data", "group__mld6.html#ga02a2259082f22c5989a3c929be95e641", null ],
+    [ "mld6_joingroup", "group__mld6.html#ga53560ab6e47163e4888070830bf912a8", null ],
+    [ "mld6_joingroup_netif", "group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940", null ],
+    [ "mld6_leavegroup", "group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5", null ],
+    [ "mld6_leavegroup_netif", "group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__mqtt.html b/doc/doxygen/output/html/group__mqtt.html
new file mode 100644
index 0000000..cb23d2b
--- /dev/null
+++ b/doc/doxygen/output/html/group__mqtt.html
@@ -0,0 +1,955 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: MQTT client</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__mqtt.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</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>
+  <div class="headertitle">
+<div class="title">MQTT client<div class="ingroups"><a class="el" href="group__apps.html">Applications</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__mqtt__opts"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt__opts.html">Options</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 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="structmqtt__connect__client__info__t.html">mqtt_connect_client_info_t</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gaa8632baff6bbb5004385998918f1e6bd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#gaa8632baff6bbb5004385998918f1e6bd">MQTT_PORT</a>&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22">LWIP_IANA_PORT_MQTT</a></td></tr>
+<tr class="separator:gaa8632baff6bbb5004385998918f1e6bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6610174f17b9ecbcf2bc66a4fd5a6b0f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#ga6610174f17b9ecbcf2bc66a4fd5a6b0f">MQTT_TLS_PORT</a>&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601">LWIP_IANA_PORT_SECURE_MQTT</a></td></tr>
+<tr class="separator:ga6610174f17b9ecbcf2bc66a4fd5a6b0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83d6a6d811b201a74d793bc1b5d4e029"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#ga83d6a6d811b201a74d793bc1b5d4e029">mqtt_subscribe</a>(client,  topic,  qos,  cb,  arg)&#160;&#160;&#160;<a class="el" href="group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103">mqtt_sub_unsub</a>(client, topic, qos, cb, arg, 1)</td></tr>
+<tr class="separator:ga83d6a6d811b201a74d793bc1b5d4e029"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0f133ef09cbe56c46ebe2cc21afccf3f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#ga0f133ef09cbe56c46ebe2cc21afccf3f">mqtt_unsubscribe</a>(client,  topic,  cb,  arg)&#160;&#160;&#160;<a class="el" href="group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103">mqtt_sub_unsub</a>(client, topic, 0, cb, arg, 0)</td></tr>
+<tr class="separator:ga0f133ef09cbe56c46ebe2cc21afccf3f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga8558743bdb7d599a93844fbc56c9029f"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f">mqtt_connection_cb_t</a>) (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client, void *arg, <a class="el" href="group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d">mqtt_connection_status_t</a> status)</td></tr>
+<tr class="separator:ga8558743bdb7d599a93844fbc56c9029f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafec7e75fe6a746eef9ca411463446c81"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81">mqtt_incoming_data_cb_t</a>) (void *arg, const u8_t *data, u16_t len, u8_t flags)</td></tr>
+<tr class="separator:gafec7e75fe6a746eef9ca411463446c81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7116bb85255394cec4b1d9fa38842c29"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29">mqtt_incoming_publish_cb_t</a>) (void *arg, const char *topic, u32_t tot_len)</td></tr>
+<tr class="separator:ga7116bb85255394cec4b1d9fa38842c29"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacad2bbe2cee76eaa120cc63e2f6094fd"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd">mqtt_request_cb_t</a>) (void *arg, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> err)</td></tr>
+<tr class="separator:gacad2bbe2cee76eaa120cc63e2f6094fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga8cf0f360ab20343af37e1d124395a77d"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d">mqtt_connection_status_t</a> { <br />
+&#160;&#160;<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da074dc1d289b8e8d4aad91f6a2cb93dc1">MQTT_CONNECT_ACCEPTED</a> = 0, 
+<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da41f8aa97142be337cb639f94d9145190">MQTT_CONNECT_REFUSED_PROTOCOL_VERSION</a> = 1, 
+<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da28ffe49b0175adaa2b9a27cb4873224a">MQTT_CONNECT_REFUSED_IDENTIFIER</a> = 2, 
+<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a">MQTT_CONNECT_REFUSED_SERVER</a> = 3, 
+<br />
+&#160;&#160;<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da290cf9037054c42022cc864cfade896a">MQTT_CONNECT_REFUSED_USERNAME_PASS</a> = 4, 
+<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dafc4888158dd6ee84269a5f0bfdc12b17">MQTT_CONNECT_REFUSED_NOT_AUTHORIZED_</a> = 5, 
+<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da321f5ce31b173f235de1a517fcfd00dd">MQTT_CONNECT_DISCONNECTED</a> = 256, 
+<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62">MQTT_CONNECT_TIMEOUT</a> = 257
+<br />
+ }</td></tr>
+<tr class="separator:ga8cf0f360ab20343af37e1d124395a77d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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
+ }</td></tr>
+<tr class="separator:ga99fb83031ce9923c84392b4e92f956b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gade9850d716e81fde572cb012be795d2f"><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#gade9850d716e81fde572cb012be795d2f">mqtt_publish</a> (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client, const char *topic, const void *payload, u16_t payload_length, u8_t qos, u8_t retain, <a class="el" href="group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd">mqtt_request_cb_t</a> cb, void *arg)</td></tr>
+<tr class="separator:gade9850d716e81fde572cb012be795d2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="memitem: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:gae7e19e236eb6122c8c39e93db6f5f53f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#gae7e19e236eb6122c8c39e93db6f5f53f">mqtt_client_new</a> (void)</td></tr>
+<tr class="separator:gae7e19e236eb6122c8c39e93db6f5f53f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa0fa1d985c322a9c91a51322db254882"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882">mqtt_client_free</a> (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client)</td></tr>
+<tr class="separator:gaa0fa1d985c322a9c91a51322db254882"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadf4d2a3f1b12fb6cbc020b126f3125f0"><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#gadf4d2a3f1b12fb6cbc020b126f3125f0">mqtt_client_connect</a> (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *<a class="el" href="structip__addr.html">ip_addr</a>, u16_t port, <a class="el" href="group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f">mqtt_connection_cb_t</a> cb, void *arg, const struct <a class="el" href="structmqtt__connect__client__info__t.html">mqtt_connect_client_info_t</a> *client_info)</td></tr>
+<tr class="separator:gadf4d2a3f1b12fb6cbc020b126f3125f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga73d8dd718bce09bfaab452770b4f76e6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6">mqtt_disconnect</a> (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client)</td></tr>
+<tr class="separator:ga73d8dd718bce09bfaab452770b4f76e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<pre class="fragment">MQTT client for lwIP
+
+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 
+
+-----------------------------------------------------------------
+1. Initial steps, reserve memory and make connection to server:
+
+1.1: Provide storage
+
+Static allocation:
+  mqtt_client_t static_client;
+  example_do_connect(&amp;static_client);
+
+Dynamic allocation:
+  mqtt_client_t *client = mqtt_client_new();
+  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 */ 
+  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. 
+     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) 
+
+-----------------------------------------------------------------
+2. Implementing the connection status callback
+
+
+static void mqtt_connection_cb(mqtt_client_t *client, void *arg, mqtt_connection_status_t status)
+{
+  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 */ 
+    err = mqtt_subscribe(client, "subtopic", 1, mqtt_sub_request_cb, arg);
+
+    if(err != ERR_OK) {
+      printf("mqtt_subscribe return: %d\n", err);
+    }
+  } 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 
+     notifying user, retry subscribe or disconnect from server */
+  printf("Subscribe result: %d\n", result);
+}
+
+-----------------------------------------------------------------
+3. Implementing callbacks for incoming publish and data
+
+/* The idea is to demultiplex topic and create some reference to be used in data callbacks
+   Example here uses a global variable, better would be to use a member in arg
+   If RAM and CPU budget allows it, the easiest implementation might be to just take a copy of
+   the topic string and use it in mqtt_incoming_data_cb
+*/
+static int inpub_id;
+static void mqtt_incoming_publish_cb(void *arg, const char *topic, u32_t tot_len)
+{
+  printf("Incoming publish at topic %s with total length %u\n", topic, (unsigned int)tot_len);
+
+  /* Decode topic string into a user defined reference */
+  if(strcmp(topic, "print_payload") == 0) {
+    inpub_id = 0;
+  } else if(topic[0] == 'A') {
+    /* All topics starting with 'A' might be handled at the same way */
+    inpub_id = 1;
+  } else {
+    /* For all other topics */
+    inpub_id = 2;
+  }
+}
+
+static void mqtt_incoming_data_cb(void *arg, const u8_t *data, u16_t len, u8_t flags)
+{
+  printf("Incoming publish payload with length %d, flags %u\n", len, (unsigned int)flags);
+
+  if(flags &amp; MQTT_DATA_FLAG_LAST) {
+    /* Last fragment of payload received (or whole part if payload fits receive buffer
+       See MQTT_VAR_HEADER_BUFFER_LEN)  */
+
+    /* Call function or do action depending on reference, in this case inpub_id */
+    if(inpub_id == 0) {
+      /* Don't trust the publisher, check zero termination */
+      if(data[len-1] == 0) {
+        printf("mqtt_incoming_data_cb: %s\n", (const char *)data);
+      }
+    } else if(inpub_id == 1) {
+      /* Call an 'A' function... */
+    } else {
+      printf("mqtt_incoming_data_cb: Ignoring payload...\n");
+    }
+  } else {
+    /* Handle fragmented payload, store in buffer, write to file or whatever */
+  }
+}
+
+-----------------------------------------------------------------
+4. Using outgoing publish
+
+
+void example_publish(mqtt_client_t *client, void *arg)
+{
+  const char *pub_payload= "PubSubHubLubJub";
+  err_t err;
+  u8_t qos = 2; /* 0 1 or 2, see MQTT specification */
+  u8_t retain = 0; /* No don't retain such crappy payload... */
+  err = mqtt_publish(client, "pub_topic", pub_payload, strlen(pub_payload), qos, retain, mqtt_pub_request_cb, arg);
+  if(err != ERR_OK) {
+    printf("Publish err: %d\n", err);
+  }
+}
+
+/* Called when publish is complete either with sucess or failure */
+static void mqtt_pub_request_cb(void *arg, err_t result)
+{
+  if(result != ERR_OK) {
+    printf("Publish result: %d\n", result);
+  }
+}
+
+-----------------------------------------------------------------
+5. Disconnecting
+
+Simply call mqtt_disconnect(client)
+</pre> <h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="gaa8632baff6bbb5004385998918f1e6bd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa8632baff6bbb5004385998918f1e6bd">&#9670;&nbsp;</a></span>MQTT_PORT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MQTT_PORT&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22">LWIP_IANA_PORT_MQTT</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Default MQTT port (non-TLS) </p>
+
+</div>
+</div>
+<a id="ga83d6a6d811b201a74d793bc1b5d4e029"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga83d6a6d811b201a74d793bc1b5d4e029">&#9670;&nbsp;</a></span>mqtt_subscribe</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define mqtt_subscribe</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">client, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">topic, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">qos, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">cb, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">arg&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103">mqtt_sub_unsub</a>(client, topic, qos, cb, arg, 1)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Subscribe to topic </p>
+
+</div>
+</div>
+<a id="ga6610174f17b9ecbcf2bc66a4fd5a6b0f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6610174f17b9ecbcf2bc66a4fd5a6b0f">&#9670;&nbsp;</a></span>MQTT_TLS_PORT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MQTT_TLS_PORT&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601">LWIP_IANA_PORT_SECURE_MQTT</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Default MQTT TLS port </p>
+
+</div>
+</div>
+<a id="ga0f133ef09cbe56c46ebe2cc21afccf3f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0f133ef09cbe56c46ebe2cc21afccf3f">&#9670;&nbsp;</a></span>mqtt_unsubscribe</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define mqtt_unsubscribe</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">client, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">topic, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">cb, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">arg&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103">mqtt_sub_unsub</a>(client, topic, 0, cb, arg, 0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Unsubscribe to topic </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="ga8558743bdb7d599a93844fbc56c9029f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8558743bdb7d599a93844fbc56c9029f">&#9670;&nbsp;</a></span>mqtt_connection_cb_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* mqtt_connection_cb_t) (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client, void *arg, <a class="el" href="group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d">mqtt_connection_status_t</a> status)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for mqtt connection status callback. Called when client has connected to the server after initiating a mqtt connection attempt by calling <a class="el" href="group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0">mqtt_client_connect()</a> or when connection is closed by server or an error</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">client</td><td>MQTT client itself </td></tr>
+    <tr><td class="paramname">arg</td><td>Additional argument to pass to the callback function </td></tr>
+    <tr><td class="paramname">status</td><td>Connect result code or disconnection notification </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d">mqtt_connection_status_t</a> </dd></dl>
+
+</div>
+</div>
+<a id="gafec7e75fe6a746eef9ca411463446c81"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafec7e75fe6a746eef9ca411463446c81">&#9670;&nbsp;</a></span>mqtt_incoming_data_cb_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* mqtt_incoming_data_cb_t) (void *arg, const u8_t *data, u16_t len, u8_t flags)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for MQTT incoming publish data callback function. Called when data arrives to a subscribed topic </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__mqtt.html#ga83d6a6d811b201a74d793bc1b5d4e029">mqtt_subscribe</a></dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>Additional argument to pass to the callback function </td></tr>
+    <tr><td class="paramname">data</td><td>User data, pointed object, data may not be referenced after callback return, NULL is passed when all publish data are delivered </td></tr>
+    <tr><td class="paramname">len</td><td>Length of publish data fragment </td></tr>
+    <tr><td class="paramname">flags</td><td>MQTT_DATA_FLAG_LAST set when this call contains the last part of data from publish message </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga7116bb85255394cec4b1d9fa38842c29"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7116bb85255394cec4b1d9fa38842c29">&#9670;&nbsp;</a></span>mqtt_incoming_publish_cb_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* mqtt_incoming_publish_cb_t) (void *arg, const char *topic, u32_t tot_len)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for MQTT incoming publish function. Called when an incoming publish arrives to a subscribed topic </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__mqtt.html#ga83d6a6d811b201a74d793bc1b5d4e029">mqtt_subscribe</a></dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>Additional argument to pass to the callback function </td></tr>
+    <tr><td class="paramname">topic</td><td>Zero terminated Topic text string, topic may not be referenced after callback return </td></tr>
+    <tr><td class="paramname">tot_len</td><td>Total length of publish data, if set to 0 (no publish payload) data callback will not be invoked </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gacad2bbe2cee76eaa120cc63e2f6094fd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacad2bbe2cee76eaa120cc63e2f6094fd">&#9670;&nbsp;</a></span>mqtt_request_cb_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* mqtt_request_cb_t) (void *arg, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> err)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for mqtt request callback. Called when a subscribe, unsubscribe or publish request has completed </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>Pointer to user data supplied when invoking request </td></tr>
+    <tr><td class="paramname">err</td><td>ERR_OK on success ERR_TIMEOUT if no response was received within timeout, ERR_ABRT if (un)subscribe was denied </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="ga99fb83031ce9923c84392b4e92f956b5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga99fb83031ce9923c84392b4e92f956b5">&#9670;&nbsp;</a></span>anonymous enum</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">anonymous enum</td>
+        </tr>
+      </table>
+</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"></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>
+
+</div>
+</div>
+<a id="ga8cf0f360ab20343af37e1d124395a77d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8cf0f360ab20343af37e1d124395a77d">&#9670;&nbsp;</a></span>mqtt_connection_status_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d">mqtt_connection_status_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Connection status codes </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="gga8cf0f360ab20343af37e1d124395a77da074dc1d289b8e8d4aad91f6a2cb93dc1"></a>MQTT_CONNECT_ACCEPTED&#160;</td><td class="fielddoc"><p>Accepted </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga8cf0f360ab20343af37e1d124395a77da41f8aa97142be337cb639f94d9145190"></a>MQTT_CONNECT_REFUSED_PROTOCOL_VERSION&#160;</td><td class="fielddoc"><p>Refused protocol version </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga8cf0f360ab20343af37e1d124395a77da28ffe49b0175adaa2b9a27cb4873224a"></a>MQTT_CONNECT_REFUSED_IDENTIFIER&#160;</td><td class="fielddoc"><p>Refused identifier </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a"></a>MQTT_CONNECT_REFUSED_SERVER&#160;</td><td class="fielddoc"><p>Refused server </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga8cf0f360ab20343af37e1d124395a77da290cf9037054c42022cc864cfade896a"></a>MQTT_CONNECT_REFUSED_USERNAME_PASS&#160;</td><td class="fielddoc"><p>Refused user credentials </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga8cf0f360ab20343af37e1d124395a77dafc4888158dd6ee84269a5f0bfdc12b17"></a>MQTT_CONNECT_REFUSED_NOT_AUTHORIZED_&#160;</td><td class="fielddoc"><p>Refused not authorized </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga8cf0f360ab20343af37e1d124395a77da321f5ce31b173f235de1a517fcfd00dd"></a>MQTT_CONNECT_DISCONNECTED&#160;</td><td class="fielddoc"><p>Disconnected </p>
+</td></tr>
+<tr><td class="fieldname"><a id="gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62"></a>MQTT_CONNECT_TIMEOUT&#160;</td><td class="fielddoc"><p>Timeout </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gadf4d2a3f1b12fb6cbc020b126f3125f0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadf4d2a3f1b12fb6cbc020b126f3125f0">&#9670;&nbsp;</a></span>mqtt_client_connect()</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> mqtt_client_connect </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *&#160;</td>
+          <td class="paramname"><em>client</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f">mqtt_connection_cb_t</a>&#160;</td>
+          <td class="paramname"><em>cb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structmqtt__connect__client__info__t.html">mqtt_connect_client_info_t</a> *&#160;</td>
+          <td class="paramname"><em>client_info</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Connect to MQTT server </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">client</td><td>MQTT client </td></tr>
+    <tr><td class="paramname"><a class="el" href="structip__addr.html">ip_addr</a></td><td>Server IP </td></tr>
+    <tr><td class="paramname">port</td><td>Server port </td></tr>
+    <tr><td class="paramname">cb</td><td>Connection state change callback </td></tr>
+    <tr><td class="paramname">arg</td><td>User supplied argument to connection callback </td></tr>
+    <tr><td class="paramname">client_info</td><td>Client identification and connection options </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> enum for other results </dd></dl>
+
+</div>
+</div>
+<a id="gaa0fa1d985c322a9c91a51322db254882"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa0fa1d985c322a9c91a51322db254882">&#9670;&nbsp;</a></span>mqtt_client_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mqtt_client_free </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *&#160;</td>
+          <td class="paramname"><em>client</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Free MQTT client instance </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">client</td><td>Pointer to instance to be freed </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga98f0fd168112b8b7db59bcd7a325a5c5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga98f0fd168112b8b7db59bcd7a325a5c5">&#9670;&nbsp;</a></span>mqtt_client_is_connected()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mqtt_client_is_connected </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *&#160;</td>
+          <td class="paramname"><em>client</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Check connection with server </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">client</td><td>MQTT client </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if connected to server, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="gae7e19e236eb6122c8c39e93db6f5f53f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae7e19e236eb6122c8c39e93db6f5f53f">&#9670;&nbsp;</a></span>mqtt_client_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structmqtt__client__s.html">mqtt_client_t</a>* mqtt_client_new </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create a new MQTT client instance </p><dl class="section return"><dt>Returns</dt><dd>Pointer to instance on success, NULL otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ga73d8dd718bce09bfaab452770b4f76e6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga73d8dd718bce09bfaab452770b4f76e6">&#9670;&nbsp;</a></span>mqtt_disconnect()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mqtt_disconnect </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *&#160;</td>
+          <td class="paramname"><em>client</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Disconnect from MQTT server </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">client</td><td>MQTT client </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gade9850d716e81fde572cb012be795d2f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gade9850d716e81fde572cb012be795d2f">&#9670;&nbsp;</a></span>mqtt_publish()</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> mqtt_publish </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *&#160;</td>
+          <td class="paramname"><em>client</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>topic</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>payload</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>payload_length</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>qos</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>retain</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd">mqtt_request_cb_t</a>&#160;</td>
+          <td class="paramname"><em>cb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MQTT publish function. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">client</td><td>MQTT client </td></tr>
+    <tr><td class="paramname">topic</td><td>Publish topic string </td></tr>
+    <tr><td class="paramname">payload</td><td>Data to publish (NULL is allowed) </td></tr>
+    <tr><td class="paramname">payload_length</td><td>Length of payload (0 is allowed) </td></tr>
+    <tr><td class="paramname">qos</td><td>Quality of service, 0 1 or 2 </td></tr>
+    <tr><td class="paramname">retain</td><td>MQTT retain flag </td></tr>
+    <tr><td class="paramname">cb</td><td>Callback to call when publish is complete or has timed out </td></tr>
+    <tr><td class="paramname">arg</td><td>User supplied argument to publish callback </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful ERR_CONN if client is disconnected ERR_MEM if short on memory </dd></dl>
+
+</div>
+</div>
+<a id="gafdfa0e65b217e92835d35858924565cf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafdfa0e65b217e92835d35858924565cf">&#9670;&nbsp;</a></span>mqtt_set_inpub_callback()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mqtt_set_inpub_callback </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *&#160;</td>
+          <td class="paramname"><em>client</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29">mqtt_incoming_publish_cb_t</a>&#160;</td>
+          <td class="paramname"><em>pub_cb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81">mqtt_incoming_data_cb_t</a>&#160;</td>
+          <td class="paramname"><em>data_cb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set callback to handle incoming publish requests from server </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">client</td><td>MQTT client </td></tr>
+    <tr><td class="paramname">pub_cb</td><td>Callback invoked when publish starts, contain topic and total length of payload </td></tr>
+    <tr><td class="paramname">data_cb</td><td>Callback for each fragment of payload that arrives </td></tr>
+    <tr><td class="paramname">arg</td><td>User supplied argument to both callbacks </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gafdb39d4a9758f98c02451aaa9a9b3103"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafdb39d4a9758f98c02451aaa9a9b3103">&#9670;&nbsp;</a></span>mqtt_sub_unsub()</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> mqtt_sub_unsub </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *&#160;</td>
+          <td class="paramname"><em>client</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>topic</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>qos</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd">mqtt_request_cb_t</a>&#160;</td>
+          <td class="paramname"><em>cb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>sub</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MQTT subscribe/unsubscribe function. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <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">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>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> enum for other results </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__mqtt.js b/doc/doxygen/output/html/group__mqtt.js
new file mode 100644
index 0000000..b6b763c
--- /dev/null
+++ b/doc/doxygen/output/html/group__mqtt.js
@@ -0,0 +1,43 @@
+var group__mqtt =
+[
+    [ "Options", "group__mqtt__opts.html", "group__mqtt__opts" ],
+    [ "mqtt_connect_client_info_t", "structmqtt__connect__client__info__t.html", [
+      [ "client_id", "structmqtt__connect__client__info__t.html#ad35f7850df21f001d5c5ffaa1a18c05a", null ],
+      [ "client_pass", "structmqtt__connect__client__info__t.html#a8f68efe91c5311418151256c96102d4b", null ],
+      [ "client_user", "structmqtt__connect__client__info__t.html#aec961673d5c3e8dc853c91f30d9333b5", null ],
+      [ "keep_alive", "structmqtt__connect__client__info__t.html#ac80262a7456812e9eefffd8c3b9ac21a", null ],
+      [ "tls_config", "structmqtt__connect__client__info__t.html#a45987acc116de5d27fff6856778e55b4", null ],
+      [ "will_msg", "structmqtt__connect__client__info__t.html#a925fcebd15555afdc0820e196e2fd3a7", null ],
+      [ "will_qos", "structmqtt__connect__client__info__t.html#a07954934f4fecf54fa190997848229d9", null ],
+      [ "will_retain", "structmqtt__connect__client__info__t.html#a49c10873f44d7534140a63eef2a6a4e3", null ],
+      [ "will_topic", "structmqtt__connect__client__info__t.html#a32e77415460752ba0484eb3ba0faf0c8", null ]
+    ] ],
+    [ "MQTT_PORT", "group__mqtt.html#gaa8632baff6bbb5004385998918f1e6bd", null ],
+    [ "mqtt_subscribe", "group__mqtt.html#ga83d6a6d811b201a74d793bc1b5d4e029", null ],
+    [ "MQTT_TLS_PORT", "group__mqtt.html#ga6610174f17b9ecbcf2bc66a4fd5a6b0f", null ],
+    [ "mqtt_unsubscribe", "group__mqtt.html#ga0f133ef09cbe56c46ebe2cc21afccf3f", null ],
+    [ "mqtt_connection_cb_t", "group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f", null ],
+    [ "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_connection_status_t", "group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d", [
+      [ "MQTT_CONNECT_ACCEPTED", "group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da074dc1d289b8e8d4aad91f6a2cb93dc1", null ],
+      [ "MQTT_CONNECT_REFUSED_PROTOCOL_VERSION", "group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da41f8aa97142be337cb639f94d9145190", null ],
+      [ "MQTT_CONNECT_REFUSED_IDENTIFIER", "group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da28ffe49b0175adaa2b9a27cb4873224a", null ],
+      [ "MQTT_CONNECT_REFUSED_SERVER", "group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a", null ],
+      [ "MQTT_CONNECT_REFUSED_USERNAME_PASS", "group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da290cf9037054c42022cc864cfade896a", null ],
+      [ "MQTT_CONNECT_REFUSED_NOT_AUTHORIZED_", "group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dafc4888158dd6ee84269a5f0bfdc12b17", null ],
+      [ "MQTT_CONNECT_DISCONNECTED", "group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da321f5ce31b173f235de1a517fcfd00dd", null ],
+      [ "MQTT_CONNECT_TIMEOUT", "group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62", null ]
+    ] ],
+    [ "mqtt_client_connect", "group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0", null ],
+    [ "mqtt_client_free", "group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882", null ],
+    [ "mqtt_client_is_connected", "group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5", null ],
+    [ "mqtt_client_new", "group__mqtt.html#gae7e19e236eb6122c8c39e93db6f5f53f", null ],
+    [ "mqtt_disconnect", "group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6", null ],
+    [ "mqtt_publish", "group__mqtt.html#gade9850d716e81fde572cb012be795d2f", null ],
+    [ "mqtt_set_inpub_callback", "group__mqtt.html#gafdfa0e65b217e92835d35858924565cf", null ],
+    [ "mqtt_sub_unsub", "group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__mqtt__opts.html b/doc/doxygen/output/html/group__mqtt__opts.html
new file mode 100644
index 0000000..01ed2c6
--- /dev/null
+++ b/doc/doxygen/output/html/group__mqtt__opts.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Options</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__mqtt__opts.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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__mqtt.html">MQTT client</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga70627bafaffa071875cee9edc38d942b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt__opts.html#ga70627bafaffa071875cee9edc38d942b">MQTT_OUTPUT_RINGBUF_SIZE</a>&#160;&#160;&#160;256</td></tr>
+<tr class="separator:ga70627bafaffa071875cee9edc38d942b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8275ef78a85fb14c3ac1423c70e45805"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt__opts.html#ga8275ef78a85fb14c3ac1423c70e45805">MQTT_VAR_HEADER_BUFFER_LEN</a>&#160;&#160;&#160;128</td></tr>
+<tr class="separator:ga8275ef78a85fb14c3ac1423c70e45805"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae82460b35de2291e9661e440c3458e8f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt__opts.html#gae82460b35de2291e9661e440c3458e8f">MQTT_REQ_MAX_IN_FLIGHT</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:gae82460b35de2291e9661e440c3458e8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1d89fda808c7047eab7a67d3785aea8e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt__opts.html#ga1d89fda808c7047eab7a67d3785aea8e">MQTT_CYCLIC_TIMER_INTERVAL</a>&#160;&#160;&#160;5</td></tr>
+<tr class="separator:ga1d89fda808c7047eab7a67d3785aea8e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga262639f2b45f6e064fb53156396d6d0a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt__opts.html#ga262639f2b45f6e064fb53156396d6d0a">MQTT_REQ_TIMEOUT</a>&#160;&#160;&#160;30</td></tr>
+<tr class="separator:ga262639f2b45f6e064fb53156396d6d0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac5d0580d1caf57dac1cb56662e5d9f7b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt__opts.html#gac5d0580d1caf57dac1cb56662e5d9f7b">MQTT_CONNECT_TIMOUT</a>&#160;&#160;&#160;100</td></tr>
+<tr class="separator:gac5d0580d1caf57dac1cb56662e5d9f7b"><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="gac5d0580d1caf57dac1cb56662e5d9f7b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac5d0580d1caf57dac1cb56662e5d9f7b">&#9670;&nbsp;</a></span>MQTT_CONNECT_TIMOUT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MQTT_CONNECT_TIMOUT&#160;&#160;&#160;100</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Seconds for MQTT connect response timeout after sending connect request </p>
+
+</div>
+</div>
+<a id="ga1d89fda808c7047eab7a67d3785aea8e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1d89fda808c7047eab7a67d3785aea8e">&#9670;&nbsp;</a></span>MQTT_CYCLIC_TIMER_INTERVAL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MQTT_CYCLIC_TIMER_INTERVAL&#160;&#160;&#160;5</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Seconds between each cyclic timer call. </p>
+
+</div>
+</div>
+<a id="ga70627bafaffa071875cee9edc38d942b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga70627bafaffa071875cee9edc38d942b">&#9670;&nbsp;</a></span>MQTT_OUTPUT_RINGBUF_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MQTT_OUTPUT_RINGBUF_SIZE&#160;&#160;&#160;256</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Output ring-buffer size, must be able to fit largest outgoing publish message topic+payloads </p>
+
+</div>
+</div>
+<a id="gae82460b35de2291e9661e440c3458e8f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae82460b35de2291e9661e440c3458e8f">&#9670;&nbsp;</a></span>MQTT_REQ_MAX_IN_FLIGHT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MQTT_REQ_MAX_IN_FLIGHT&#160;&#160;&#160;4</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Maximum number of pending subscribe, unsubscribe and publish requests to server . </p>
+
+</div>
+</div>
+<a id="ga262639f2b45f6e064fb53156396d6d0a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga262639f2b45f6e064fb53156396d6d0a">&#9670;&nbsp;</a></span>MQTT_REQ_TIMEOUT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MQTT_REQ_TIMEOUT&#160;&#160;&#160;30</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Publish, subscribe and unsubscribe request timeout in seconds. </p>
+
+</div>
+</div>
+<a id="ga8275ef78a85fb14c3ac1423c70e45805"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8275ef78a85fb14c3ac1423c70e45805">&#9670;&nbsp;</a></span>MQTT_VAR_HEADER_BUFFER_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MQTT_VAR_HEADER_BUFFER_LEN&#160;&#160;&#160;128</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of bytes in receive buffer, must be at least the size of the longest incoming topic + 8 If one wants to avoid fragmented incoming publish, set length to max incoming topic length + max payload length + 8 </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__mqtt__opts.js b/doc/doxygen/output/html/group__mqtt__opts.js
new file mode 100644
index 0000000..3ba3884
--- /dev/null
+++ b/doc/doxygen/output/html/group__mqtt__opts.js
@@ -0,0 +1,9 @@
+var group__mqtt__opts =
+[
+    [ "MQTT_CONNECT_TIMOUT", "group__mqtt__opts.html#gac5d0580d1caf57dac1cb56662e5d9f7b", null ],
+    [ "MQTT_CYCLIC_TIMER_INTERVAL", "group__mqtt__opts.html#ga1d89fda808c7047eab7a67d3785aea8e", null ],
+    [ "MQTT_OUTPUT_RINGBUF_SIZE", "group__mqtt__opts.html#ga70627bafaffa071875cee9edc38d942b", null ],
+    [ "MQTT_REQ_MAX_IN_FLIGHT", "group__mqtt__opts.html#gae82460b35de2291e9661e440c3458e8f", null ],
+    [ "MQTT_REQ_TIMEOUT", "group__mqtt__opts.html#ga262639f2b45f6e064fb53156396d6d0a", null ],
+    [ "MQTT_VAR_HEADER_BUFFER_LEN", "group__mqtt__opts.html#ga8275ef78a85fb14c3ac1423c70e45805", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netbiosns.html b/doc/doxygen/output/html/group__netbiosns.html
new file mode 100644
index 0000000..5d9bb35
--- /dev/null
+++ b/doc/doxygen/output/html/group__netbiosns.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: NETBIOS responder</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netbiosns.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">NETBIOS responder<div class="ingroups"><a class="el" href="group__apps.html">Applications</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__netbiosns__opts"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbiosns__opts.html">Options</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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga0c696ea25a79e97715c8217901cff66b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b">netbiosns_init</a> (void)</td></tr>
+<tr class="separator:ga0c696ea25a79e97715c8217901cff66b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf82174943d25d67b04d44b7fba808806"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806">netbiosns_stop</a> (void)</td></tr>
+<tr class="separator:gaf82174943d25d67b04d44b7fba808806"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>This is an example implementation of a NetBIOS name server. It responds to name queries for a configurable name. Name resolving is not supported.</p>
+<p>Note that the device doesn't broadcast it's own name so can't detect duplicate names! </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga0c696ea25a79e97715c8217901cff66b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0c696ea25a79e97715c8217901cff66b">&#9670;&nbsp;</a></span>netbiosns_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netbiosns_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Init netbios responder </p>
+
+</div>
+</div>
+<a id="gaf82174943d25d67b04d44b7fba808806"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf82174943d25d67b04d44b7fba808806">&#9670;&nbsp;</a></span>netbiosns_stop()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netbiosns_stop </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Stop netbios responder </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netbiosns.js b/doc/doxygen/output/html/group__netbiosns.js
new file mode 100644
index 0000000..ad68eeb
--- /dev/null
+++ b/doc/doxygen/output/html/group__netbiosns.js
@@ -0,0 +1,6 @@
+var group__netbiosns =
+[
+    [ "Options", "group__netbiosns__opts.html", "group__netbiosns__opts" ],
+    [ "netbiosns_init", "group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b", null ],
+    [ "netbiosns_stop", "group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netbiosns__opts.html b/doc/doxygen/output/html/group__netbiosns__opts.html
new file mode 100644
index 0000000..30eed10
--- /dev/null
+++ b/doc/doxygen/output/html/group__netbiosns__opts.html
@@ -0,0 +1,142 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Options</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netbiosns__opts.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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__netbiosns.html">NETBIOS responder</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga468c2ae67a79ce082ee585a438f7373b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbiosns__opts.html#ga468c2ae67a79ce082ee585a438f7373b">NETBIOS_LWIP_NAME</a>&#160;&#160;&#160;&quot;NETBIOSLWIPDEV&quot;</td></tr>
+<tr class="separator:ga468c2ae67a79ce082ee585a438f7373b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa9dec8fc3dee5e72fbe9b854437bce84"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbiosns__opts.html#gaa9dec8fc3dee5e72fbe9b854437bce84">LWIP_NETBIOS_RESPOND_NAME_QUERY</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaa9dec8fc3dee5e72fbe9b854437bce84"><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="gaa9dec8fc3dee5e72fbe9b854437bce84"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa9dec8fc3dee5e72fbe9b854437bce84">&#9670;&nbsp;</a></span>LWIP_NETBIOS_RESPOND_NAME_QUERY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NETBIOS_RESPOND_NAME_QUERY&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Respond to NetBIOS name queries Default is disabled </p>
+
+</div>
+</div>
+<a id="ga468c2ae67a79ce082ee585a438f7373b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga468c2ae67a79ce082ee585a438f7373b">&#9670;&nbsp;</a></span>NETBIOS_LWIP_NAME</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETBIOS_LWIP_NAME&#160;&#160;&#160;&quot;NETBIOSLWIPDEV&quot;</td>
+        </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>If this is not defined, netbiosns_set_name() can be called at runtime to change the name. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netbiosns__opts.js b/doc/doxygen/output/html/group__netbiosns__opts.js
new file mode 100644
index 0000000..78adb60
--- /dev/null
+++ b/doc/doxygen/output/html/group__netbiosns__opts.js
@@ -0,0 +1,5 @@
+var group__netbiosns__opts =
+[
+    [ "LWIP_NETBIOS_RESPOND_NAME_QUERY", "group__netbiosns__opts.html#gaa9dec8fc3dee5e72fbe9b854437bce84", null ],
+    [ "NETBIOS_LWIP_NAME", "group__netbiosns__opts.html#ga468c2ae67a79ce082ee585a438f7373b", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netbuf.html b/doc/doxygen/output/html/group__netbuf.html
new file mode 100644
index 0000000..ec91bcd
--- /dev/null
+++ b/doc/doxygen/output/html/group__netbuf.html
@@ -0,0 +1,409 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Network buffers</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netbuf.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">Network buffers<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__netconn.html">Netconn API</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaaba704cd963e35e71145de9f5112991d"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structnetbuf.html">netbuf</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#gaaba704cd963e35e71145de9f5112991d">netbuf_new</a> (void)</td></tr>
+<tr class="separator:gaaba704cd963e35e71145de9f5112991d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9dfd3ddfe0ec65009cb140c68404b09d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d">netbuf_delete</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf)</td></tr>
+<tr class="separator:ga9dfd3ddfe0ec65009cb140c68404b09d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0b831b80d3aa64938abdbfb6d89eaac0"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#ga0b831b80d3aa64938abdbfb6d89eaac0">netbuf_alloc</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf, u16_t size)</td></tr>
+<tr class="separator:ga0b831b80d3aa64938abdbfb6d89eaac0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga02f82348ac23431a4b1512feae25f26b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b">netbuf_free</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf)</td></tr>
+<tr class="separator:ga02f82348ac23431a4b1512feae25f26b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabdffa0401e4473c9d9100ecbf50e46d2"><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__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2">netbuf_ref</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf, const void *dataptr, u16_t size)</td></tr>
+<tr class="separator:gabdffa0401e4473c9d9100ecbf50e46d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga631e8bddd99b2397cd0b26973c659602"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602">netbuf_chain</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *head, struct <a class="el" href="structnetbuf.html">netbuf</a> *tail)</td></tr>
+<tr class="separator:ga631e8bddd99b2397cd0b26973c659602"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga04a54a8476b37c2a8804fed679b6cc01"><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__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01">netbuf_data</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf, void **dataptr, u16_t *len)</td></tr>
+<tr class="separator:ga04a54a8476b37c2a8804fed679b6cc01"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf4e3718d378bb11f2fc8af42ce7b3715"><td class="memItemLeft" align="right" valign="top">s8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715">netbuf_next</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf)</td></tr>
+<tr class="separator:gaf4e3718d378bb11f2fc8af42ce7b3715"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga222ad2a2eb871d603b216a87e9f9be51"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51">netbuf_first</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf)</td></tr>
+<tr class="separator:ga222ad2a2eb871d603b216a87e9f9be51"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</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="group__netbuf.html#gaaba704cd963e35e71145de9f5112991d">netbuf_new()</a> and <a class="el" href="group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d">netbuf_delete()</a> are not thread-safe. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga0b831b80d3aa64938abdbfb6d89eaac0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0b831b80d3aa64938abdbfb6d89eaac0">&#9670;&nbsp;</a></span>netbuf_alloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* netbuf_alloc </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetbuf.html">netbuf</a> *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>size</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocate memory for a packet buffer for a given netbuf.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buf</td><td>the netbuf for which to allocate a packet buffer </td></tr>
+    <tr><td class="paramname">size</td><td>the size of the packet buffer to allocate </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to the allocated memory NULL if no memory could be allocated </dd></dl>
+
+</div>
+</div>
+<a id="ga631e8bddd99b2397cd0b26973c659602"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga631e8bddd99b2397cd0b26973c659602">&#9670;&nbsp;</a></span>netbuf_chain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netbuf_chain </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetbuf.html">netbuf</a> *&#160;</td>
+          <td class="paramname"><em>head</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetbuf.html">netbuf</a> *&#160;</td>
+          <td class="paramname"><em>tail</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Chain one netbuf to another (</p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891">pbuf_chain</a>)</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">head</td><td>the first netbuf </td></tr>
+    <tr><td class="paramname">tail</td><td>netbuf to chain after head, freed by this function, may not be reference after returning </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga04a54a8476b37c2a8804fed679b6cc01"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga04a54a8476b37c2a8804fed679b6cc01">&#9670;&nbsp;</a></span>netbuf_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> netbuf_data </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetbuf.html">netbuf</a> *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void **&#160;</td>
+          <td class="paramname"><em>dataptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get the data pointer and length of the data inside a netbuf.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buf</td><td>netbuf to get the data from </td></tr>
+    <tr><td class="paramname">dataptr</td><td>pointer to a void pointer where to store the data pointer </td></tr>
+    <tr><td class="paramname">len</td><td>pointer to an u16_t where the length of the data is stored </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the information was retrieved, ERR_BUF on error. </dd></dl>
+
+</div>
+</div>
+<a id="ga9dfd3ddfe0ec65009cb140c68404b09d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9dfd3ddfe0ec65009cb140c68404b09d">&#9670;&nbsp;</a></span>netbuf_delete()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netbuf_delete </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetbuf.html">netbuf</a> *&#160;</td>
+          <td class="paramname"><em>buf</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Deallocate a netbuf allocated by <a class="el" href="group__netbuf.html#gaaba704cd963e35e71145de9f5112991d">netbuf_new()</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buf</td><td>pointer to a netbuf allocated by <a class="el" href="group__netbuf.html#gaaba704cd963e35e71145de9f5112991d">netbuf_new()</a> </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga222ad2a2eb871d603b216a87e9f9be51"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga222ad2a2eb871d603b216a87e9f9be51">&#9670;&nbsp;</a></span>netbuf_first()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netbuf_first </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetbuf.html">netbuf</a> *&#160;</td>
+          <td class="paramname"><em>buf</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Move the current data pointer of a packet buffer contained in a netbuf to the beginning of the packet. The packet buffer itself is not modified.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buf</td><td>the netbuf to modify </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga02f82348ac23431a4b1512feae25f26b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga02f82348ac23431a4b1512feae25f26b">&#9670;&nbsp;</a></span>netbuf_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netbuf_free </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetbuf.html">netbuf</a> *&#160;</td>
+          <td class="paramname"><em>buf</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Free the packet buffer included in a netbuf</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buf</td><td>pointer to the netbuf which contains the packet buffer to free </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gaaba704cd963e35e71145de9f5112991d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaaba704cd963e35e71145de9f5112991d">&#9670;&nbsp;</a></span>netbuf_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetbuf.html">netbuf</a>* netbuf_new </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create (allocate) and initialize a new netbuf. The netbuf doesn't yet contain a packet buffer!</p>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to a new netbuf NULL on lack of memory </dd></dl>
+
+</div>
+</div>
+<a id="gaf4e3718d378bb11f2fc8af42ce7b3715"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf4e3718d378bb11f2fc8af42ce7b3715">&#9670;&nbsp;</a></span>netbuf_next()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">s8_t netbuf_next </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetbuf.html">netbuf</a> *&#160;</td>
+          <td class="paramname"><em>buf</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Move the current data pointer of a packet buffer contained in a netbuf to the next part. The packet buffer itself is not modified.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buf</td><td>the netbuf to modify </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1 if there is no next part 1 if moved to the next part but now there is no next part 0 if moved to the next part and there are still more parts </dd></dl>
+
+</div>
+</div>
+<a id="gabdffa0401e4473c9d9100ecbf50e46d2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabdffa0401e4473c9d9100ecbf50e46d2">&#9670;&nbsp;</a></span>netbuf_ref()</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> netbuf_ref </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetbuf.html">netbuf</a> *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>dataptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>size</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Let a netbuf reference existing (non-volatile) data.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buf</td><td>netbuf which should reference the data </td></tr>
+    <tr><td class="paramname">dataptr</td><td>pointer to the data to reference </td></tr>
+    <tr><td class="paramname">size</td><td>size of the data </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if data is referenced ERR_MEM if data couldn't be referenced due to lack of memory </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netbuf.js b/doc/doxygen/output/html/group__netbuf.js
new file mode 100644
index 0000000..8027d49
--- /dev/null
+++ b/doc/doxygen/output/html/group__netbuf.js
@@ -0,0 +1,12 @@
+var group__netbuf =
+[
+    [ "netbuf_alloc", "group__netbuf.html#ga0b831b80d3aa64938abdbfb6d89eaac0", null ],
+    [ "netbuf_chain", "group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602", null ],
+    [ "netbuf_data", "group__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01", null ],
+    [ "netbuf_delete", "group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d", null ],
+    [ "netbuf_first", "group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51", null ],
+    [ "netbuf_free", "group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b", null ],
+    [ "netbuf_new", "group__netbuf.html#gaaba704cd963e35e71145de9f5112991d", null ],
+    [ "netbuf_next", "group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715", null ],
+    [ "netbuf_ref", "group__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netconn.html b/doc/doxygen/output/html/group__netconn.html
new file mode 100644
index 0000000..62a0968
--- /dev/null
+++ b/doc/doxygen/output/html/group__netconn.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Netconn API</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netconn.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">Netconn API<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__netconn__common"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__common.html">Common functions</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__netconn__tcp"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__tcp.html">TCP only</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__netconn__udp"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__udp.html">UDP only</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__netbuf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html">Network buffers</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>
+<p>Thread-safe, to be called from non-TCPIP threads only. TX/RX handling based on <a class="el" href="group__netbuf.html">Network buffers</a> (containing <a class="el" href="group__pbuf.html">Packet buffers (PBUF)</a>) to avoid copying data around. </p>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netconn.js b/doc/doxygen/output/html/group__netconn.js
new file mode 100644
index 0000000..d747908
--- /dev/null
+++ b/doc/doxygen/output/html/group__netconn.js
@@ -0,0 +1,7 @@
+var group__netconn =
+[
+    [ "Common functions", "group__netconn__common.html", "group__netconn__common" ],
+    [ "TCP only", "group__netconn__tcp.html", "group__netconn__tcp" ],
+    [ "UDP only", "group__netconn__udp.html", "group__netconn__udp" ],
+    [ "Network buffers", "group__netbuf.html", "group__netbuf" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netconn__common.html b/doc/doxygen/output/html/group__netconn__common.html
new file mode 100644
index 0000000..c1ad66e
--- /dev/null
+++ b/doc/doxygen/output/html/group__netconn__common.html
@@ -0,0 +1,619 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Common functions</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netconn__common.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">Common functions<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__netconn.html">Netconn API</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gab2bd1d5e633e14e428cfc0ca908d5e0c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__common.html#gab2bd1d5e633e14e428cfc0ca908d5e0c">netconn_new</a>(t)&#160;&#160;&#160;<a class="el" href="api_8h.html#ad0a0434e5ff08bb350740cb840e2aca8">netconn_new_with_proto_and_callback</a>(t, 0, NULL)</td></tr>
+<tr class="separator:gab2bd1d5e633e14e428cfc0ca908d5e0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1065e769f2276270722a7700182077bc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__common.html#ga1065e769f2276270722a7700182077bc">netconn_peer</a>(c,  i,  p)&#160;&#160;&#160;<a class="el" href="api_8h.html#a28430d1d86733f1bf98dc31305c42104">netconn_getaddr</a>(c,i,p,0)</td></tr>
+<tr class="separator:ga1065e769f2276270722a7700182077bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga37ec33522cfc26fa57251c33e4cebb3e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__common.html#ga37ec33522cfc26fa57251c33e4cebb3e">netconn_addr</a>(c,  i,  p)&#160;&#160;&#160;<a class="el" href="api_8h.html#a28430d1d86733f1bf98dc31305c42104">netconn_getaddr</a>(c,i,p,1)</td></tr>
+<tr class="separator:ga37ec33522cfc26fa57251c33e4cebb3e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae56911e2d92bebf43d73e116530e41f1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__common.html#gae56911e2d92bebf43d73e116530e41f1">netconn_set_ipv6only</a>(conn,  val)</td></tr>
+<tr class="separator:gae56911e2d92bebf43d73e116530e41f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf001c7d5fbf97c04eb1d9ac7d14c9c31"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__common.html#gaf001c7d5fbf97c04eb1d9ac7d14c9c31">netconn_get_ipv6only</a>(conn)&#160;&#160;&#160;(((conn)-&gt;flags &amp; <a class="el" href="api_8h.html#a60892e4eb139f10157847fea4266bf5b">NETCONN_FLAG_IPV6_V6ONLY</a>) != 0)</td></tr>
+<tr class="separator:gaf001c7d5fbf97c04eb1d9ac7d14c9c31"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:gaaba260d28d105fb4bce9185fd0300d91"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a> { , <br />
+&#160;&#160;<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a75d14318b91af7a452230189f47e5e1a">NETCONN_TCP</a> = 0x10, 
+<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91ae7efa7c4e50b7b381531a2136cd5a013">NETCONN_TCP_IPV6</a> = NETCONN_TCP | 0x08, 
+<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a6b8ec191d69f7e639f4ab40779069636">NETCONN_UDP</a> = 0x20, 
+<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a655e1625cc7e6a93f1e3d2646f56a1e4">NETCONN_UDPLITE</a> = 0x21, 
+<br />
+&#160;&#160;<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a7e0c3f566b3d4321b36b711b6b1ad6de">NETCONN_UDPNOCHKSUM</a> = 0x22, 
+<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a34ee1c89f6705462590a4fe2c9772d9e">NETCONN_UDP_IPV6</a> = NETCONN_UDP | 0x08, 
+<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91aa9cabc9d90606b5c5939fcc02ac588c7">NETCONN_UDPLITE_IPV6</a> = NETCONN_UDPLITE | 0x08, 
+<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a2c7f548d26f6c411f084b6c59247b60e">NETCONN_UDPNOCHKSUM_IPV6</a> = NETCONN_UDPNOCHKSUM | 0x08, 
+<br />
+&#160;&#160;<a class="el" href="group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a0d828a7e9c1614d4cae56602b09f39e9">NETCONN_RAW</a> = 0x40
+<br />
+ }</td></tr>
+<tr class="separator:gaaba260d28d105fb4bce9185fd0300d91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gad5c079af0ad791a92fe9dade375744f0"><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__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0">netconn_prepare_delete</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn)</td></tr>
+<tr class="separator:gad5c079af0ad791a92fe9dade375744f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab411221f912a6d9e4c82ac3963989403"><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__netconn__common.html#gab411221f912a6d9e4c82ac3963989403">netconn_delete</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn)</td></tr>
+<tr class="separator:gab411221f912a6d9e4c82ac3963989403"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga63bcc4d7bd150674fa953a1253fa6230"><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__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230">netconn_bind</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, u16_t port)</td></tr>
+<tr class="separator:ga63bcc4d7bd150674fa953a1253fa6230"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa78479deeedcecd3bacade387ac40cc5"><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__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5">netconn_bind_if</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, u8_t if_idx)</td></tr>
+<tr class="separator:gaa78479deeedcecd3bacade387ac40cc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacba7f74d973872ad0b88b9a96098cf77"><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__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77">netconn_connect</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, u16_t port)</td></tr>
+<tr class="separator:gacba7f74d973872ad0b88b9a96098cf77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga50490bab058f4e740798beffcf48cabf"><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__netconn__common.html#ga50490bab058f4e740798beffcf48cabf">netconn_recv</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetbuf.html">netbuf</a> **new_buf)</td></tr>
+<tr class="separator:ga50490bab058f4e740798beffcf48cabf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab9eccae90351eb6c3d2ca690068445d4"><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__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4">netconn_err</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn)</td></tr>
+<tr class="separator:gab9eccae90351eb6c3d2ca690068445d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafb3494b149dff96ed8d1acb770ab52f5"><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__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5">netconn_gethostbyname_addrtype</a> (const char *name, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, u8_t dns_addrtype)</td></tr>
+<tr class="separator:gafb3494b149dff96ed8d1acb770ab52f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>For use with TCP and UDP </p>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga37ec33522cfc26fa57251c33e4cebb3e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga37ec33522cfc26fa57251c33e4cebb3e">&#9670;&nbsp;</a></span>netconn_addr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netconn_addr</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">i, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">p&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="api_8h.html#a28430d1d86733f1bf98dc31305c42104">netconn_getaddr</a>(c,i,p,1)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gaf001c7d5fbf97c04eb1d9ac7d14c9c31"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf001c7d5fbf97c04eb1d9ac7d14c9c31">&#9670;&nbsp;</a></span>netconn_get_ipv6only</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netconn_get_ipv6only</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">conn</td><td>)</td>
+          <td>&#160;&#160;&#160;(((conn)-&gt;flags &amp; <a class="el" href="api_8h.html#a60892e4eb139f10157847fea4266bf5b">NETCONN_FLAG_IPV6_V6ONLY</a>) != 0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP: Get the IPv6 ONLY status of netconn calls (see NETCONN_FLAG_IPV6_V6ONLY) </p>
+
+</div>
+</div>
+<a id="gab2bd1d5e633e14e428cfc0ca908d5e0c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab2bd1d5e633e14e428cfc0ca908d5e0c">&#9670;&nbsp;</a></span>netconn_new</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netconn_new</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">t</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="api_8h.html#ad0a0434e5ff08bb350740cb840e2aca8">netconn_new_with_proto_and_callback</a>(t, 0, NULL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create new netconn connection </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">t</td><td><a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a> </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga1065e769f2276270722a7700182077bc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1065e769f2276270722a7700182077bc">&#9670;&nbsp;</a></span>netconn_peer</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netconn_peer</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">i, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">p&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="api_8h.html#a28430d1d86733f1bf98dc31305c42104">netconn_getaddr</a>(c,i,p,0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gae56911e2d92bebf43d73e116530e41f1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae56911e2d92bebf43d73e116530e41f1">&#9670;&nbsp;</a></span>netconn_set_ipv6only</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netconn_set_ipv6only</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">conn, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">val&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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> { <span class="keywordflow">if</span>(val) { \</div><div class="line">  netconn_set_flags(conn, <a class="code" href="api_8h.html#a60892e4eb139f10157847fea4266bf5b">NETCONN_FLAG_IPV6_V6ONLY</a>); \</div><div class="line">} <span class="keywordflow">else</span> { \</div><div class="line">  netconn_clear_flags(conn, <a class="code" href="api_8h.html#a60892e4eb139f10157847fea4266bf5b">NETCONN_FLAG_IPV6_V6ONLY</a>); }} <span class="keywordflow">while</span>(0)</div><div class="ttc" id="api_8h_html_a60892e4eb139f10157847fea4266bf5b"><div class="ttname"><a href="api_8h.html#a60892e4eb139f10157847fea4266bf5b">NETCONN_FLAG_IPV6_V6ONLY</a></div><div class="ttdeci">#define NETCONN_FLAG_IPV6_V6ONLY</div><div class="ttdef"><b>Definition:</b> api.h:87</div></div>
+</div><!-- fragment --><p>TCP: Set the IPv6 ONLY status of netconn calls (see NETCONN_FLAG_IPV6_V6ONLY) </p>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="gaaba260d28d105fb4bce9185fd0300d91"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaaba260d28d105fb4bce9185fd0300d91">&#9670;&nbsp;</a></span>netconn_type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Protocol family and type of the netconn </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="ggaaba260d28d105fb4bce9185fd0300d91a75d14318b91af7a452230189f47e5e1a"></a>NETCONN_TCP&#160;</td><td class="fielddoc"><p>TCP IPv4 </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggaaba260d28d105fb4bce9185fd0300d91ae7efa7c4e50b7b381531a2136cd5a013"></a>NETCONN_TCP_IPV6&#160;</td><td class="fielddoc"><p>TCP IPv6 </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggaaba260d28d105fb4bce9185fd0300d91a6b8ec191d69f7e639f4ab40779069636"></a>NETCONN_UDP&#160;</td><td class="fielddoc"><p>UDP IPv4 </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggaaba260d28d105fb4bce9185fd0300d91a655e1625cc7e6a93f1e3d2646f56a1e4"></a>NETCONN_UDPLITE&#160;</td><td class="fielddoc"><p>UDP IPv4 lite </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggaaba260d28d105fb4bce9185fd0300d91a7e0c3f566b3d4321b36b711b6b1ad6de"></a>NETCONN_UDPNOCHKSUM&#160;</td><td class="fielddoc"><p>UDP IPv4 no checksum </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggaaba260d28d105fb4bce9185fd0300d91a34ee1c89f6705462590a4fe2c9772d9e"></a>NETCONN_UDP_IPV6&#160;</td><td class="fielddoc"><p>UDP IPv6 (dual-stack by default, unless you call <a class="el" href="group__netconn__common.html#gae56911e2d92bebf43d73e116530e41f1">netconn_set_ipv6only</a>) </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggaaba260d28d105fb4bce9185fd0300d91aa9cabc9d90606b5c5939fcc02ac588c7"></a>NETCONN_UDPLITE_IPV6&#160;</td><td class="fielddoc"><p>UDP IPv6 lite (dual-stack by default, unless you call <a class="el" href="group__netconn__common.html#gae56911e2d92bebf43d73e116530e41f1">netconn_set_ipv6only</a>) </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggaaba260d28d105fb4bce9185fd0300d91a2c7f548d26f6c411f084b6c59247b60e"></a>NETCONN_UDPNOCHKSUM_IPV6&#160;</td><td class="fielddoc"><p>UDP IPv6 no checksum (dual-stack by default, unless you call <a class="el" href="group__netconn__common.html#gae56911e2d92bebf43d73e116530e41f1">netconn_set_ipv6only</a>) </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggaaba260d28d105fb4bce9185fd0300d91a0d828a7e9c1614d4cae56602b09f39e9"></a>NETCONN_RAW&#160;</td><td class="fielddoc"><p>Raw connection IPv4 </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga63bcc4d7bd150674fa953a1253fa6230"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga63bcc4d7bd150674fa953a1253fa6230">&#9670;&nbsp;</a></span>netconn_bind()</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> netconn_bind </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>port</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Bind a netconn to a specific local IP address and port. Binding one netconn twice might not always be checked correctly!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn to bind </td></tr>
+    <tr><td class="paramname">addr</td><td>the local IP address to bind the netconn to (use IP4_ADDR_ANY/IP6_ADDR_ANY to bind to all addresses) </td></tr>
+    <tr><td class="paramname">port</td><td>the local port to bind the netconn to (not used for RAW) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if bound, any other err_t on failure </dd></dl>
+
+</div>
+</div>
+<a id="gaa78479deeedcecd3bacade387ac40cc5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa78479deeedcecd3bacade387ac40cc5">&#9670;&nbsp;</a></span>netconn_bind_if()</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> netconn_bind_if </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>if_idx</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Bind a netconn to a specific interface and port. Binding one netconn twice might not always be checked correctly!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn to bind </td></tr>
+    <tr><td class="paramname">if_idx</td><td>the local interface index to bind the netconn to </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if bound, any other err_t on failure </dd></dl>
+
+</div>
+</div>
+<a id="gacba7f74d973872ad0b88b9a96098cf77"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacba7f74d973872ad0b88b9a96098cf77">&#9670;&nbsp;</a></span>netconn_connect()</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> netconn_connect </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>port</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Connect a netconn to a specific remote IP address and port.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn to connect </td></tr>
+    <tr><td class="paramname">addr</td><td>the remote IP address to connect to </td></tr>
+    <tr><td class="paramname">port</td><td>the remote port to connect to (no used for RAW) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if connected, return value of tcp_/udp_/raw_connect otherwise </dd></dl>
+
+</div>
+</div>
+<a id="gab411221f912a6d9e4c82ac3963989403"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab411221f912a6d9e4c82ac3963989403">&#9670;&nbsp;</a></span>netconn_delete()</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> netconn_delete </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Close a netconn 'connection' and free its resources. UDP and RAW connection are completely closed, TCP pcbs might still be in a waitstate after this returns.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn to delete </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the connection was deleted </dd></dl>
+
+</div>
+</div>
+<a id="gab9eccae90351eb6c3d2ca690068445d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab9eccae90351eb6c3d2ca690068445d4">&#9670;&nbsp;</a></span>netconn_err()</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> netconn_err </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get and reset pending error on a netconn</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn to get the error from </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>and pending error or ERR_OK if no error was pending </dd></dl>
+
+</div>
+</div>
+<a id="gafb3494b149dff96ed8d1acb770ab52f5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafb3494b149dff96ed8d1acb770ab52f5">&#9670;&nbsp;</a></span>netconn_gethostbyname_addrtype()</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> netconn_gethostbyname_addrtype </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>dns_addrtype</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Execute a DNS query, only one IP address is returned</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <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>
+
+</div>
+</div>
+<a id="gad5c079af0ad791a92fe9dade375744f0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad5c079af0ad791a92fe9dade375744f0">&#9670;&nbsp;</a></span>netconn_prepare_delete()</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> netconn_prepare_delete </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Close a netconn 'connection' and free all its resources but not the netconn itself. UDP and RAW connection are completely closed, TCP pcbs might still be in a waitstate after this returns.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn to delete </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the connection was deleted </dd></dl>
+
+</div>
+</div>
+<a id="ga50490bab058f4e740798beffcf48cabf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga50490bab058f4e740798beffcf48cabf">&#9670;&nbsp;</a></span>netconn_recv()</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> netconn_recv </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetbuf.html">netbuf</a> **&#160;</td>
+          <td class="paramname"><em>new_buf</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Receive data (in form of a netbuf containing a packet buffer) from a netconn</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn from which to receive data </td></tr>
+    <tr><td class="paramname">new_buf</td><td>pointer where a new netbuf is stored when received data </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if data has been received, an error code otherwise (timeout, memory error or another error) </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netconn__common.js b/doc/doxygen/output/html/group__netconn__common.js
new file mode 100644
index 0000000..7809877
--- /dev/null
+++ b/doc/doxygen/output/html/group__netconn__common.js
@@ -0,0 +1,27 @@
+var group__netconn__common =
+[
+    [ "netconn_addr", "group__netconn__common.html#ga37ec33522cfc26fa57251c33e4cebb3e", null ],
+    [ "netconn_get_ipv6only", "group__netconn__common.html#gaf001c7d5fbf97c04eb1d9ac7d14c9c31", null ],
+    [ "netconn_new", "group__netconn__common.html#gab2bd1d5e633e14e428cfc0ca908d5e0c", null ],
+    [ "netconn_peer", "group__netconn__common.html#ga1065e769f2276270722a7700182077bc", null ],
+    [ "netconn_set_ipv6only", "group__netconn__common.html#gae56911e2d92bebf43d73e116530e41f1", null ],
+    [ "netconn_type", "group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91", [
+      [ "NETCONN_TCP", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a75d14318b91af7a452230189f47e5e1a", null ],
+      [ "NETCONN_TCP_IPV6", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91ae7efa7c4e50b7b381531a2136cd5a013", null ],
+      [ "NETCONN_UDP", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a6b8ec191d69f7e639f4ab40779069636", null ],
+      [ "NETCONN_UDPLITE", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a655e1625cc7e6a93f1e3d2646f56a1e4", null ],
+      [ "NETCONN_UDPNOCHKSUM", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a7e0c3f566b3d4321b36b711b6b1ad6de", null ],
+      [ "NETCONN_UDP_IPV6", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a34ee1c89f6705462590a4fe2c9772d9e", null ],
+      [ "NETCONN_UDPLITE_IPV6", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91aa9cabc9d90606b5c5939fcc02ac588c7", null ],
+      [ "NETCONN_UDPNOCHKSUM_IPV6", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a2c7f548d26f6c411f084b6c59247b60e", null ],
+      [ "NETCONN_RAW", "group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a0d828a7e9c1614d4cae56602b09f39e9", null ]
+    ] ],
+    [ "netconn_bind", "group__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230", null ],
+    [ "netconn_bind_if", "group__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5", null ],
+    [ "netconn_connect", "group__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77", null ],
+    [ "netconn_delete", "group__netconn__common.html#gab411221f912a6d9e4c82ac3963989403", null ],
+    [ "netconn_err", "group__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4", null ],
+    [ "netconn_gethostbyname_addrtype", "group__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5", null ],
+    [ "netconn_prepare_delete", "group__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0", null ],
+    [ "netconn_recv", "group__netconn__common.html#ga50490bab058f4e740798beffcf48cabf", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netconn__tcp.html b/doc/doxygen/output/html/group__netconn__tcp.html
new file mode 100644
index 0000000..54fdd72
--- /dev/null
+++ b/doc/doxygen/output/html/group__netconn__tcp.html
@@ -0,0 +1,482 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: TCP only</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netconn__tcp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">TCP only<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__netconn.html">Netconn API</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga43e3f4c2169dec0f666c502e490416b7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__tcp.html#ga43e3f4c2169dec0f666c502e490416b7">netconn_listen</a>(conn)&#160;&#160;&#160;<a class="el" href="group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d">netconn_listen_with_backlog</a>(conn, <a class="el" href="group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf">TCP_DEFAULT_LISTEN_BACKLOG</a>)</td></tr>
+<tr class="separator:ga43e3f4c2169dec0f666c502e490416b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafea5e9b90770a7c6cd0762ceb65e5b46"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn__tcp.html#gafea5e9b90770a7c6cd0762ceb65e5b46">netconn_write</a>(conn,  dataptr,  size,  apiflags)&#160;&#160;&#160;<a class="el" href="group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf">netconn_write_partly</a>(conn, dataptr, size, apiflags, NULL)</td></tr>
+<tr class="separator:gafea5e9b90770a7c6cd0762ceb65e5b46"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga84333ba8e7cdf45558d2b4795f53265d"><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__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d">netconn_listen_with_backlog</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, u8_t backlog)</td></tr>
+<tr class="separator:ga84333ba8e7cdf45558d2b4795f53265d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga13593148f60f7bbc6a505b567f175d69"><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__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69">netconn_accept</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetconn.html">netconn</a> **new_conn)</td></tr>
+<tr class="separator:ga13593148f60f7bbc6a505b567f175d69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6893cb7648733d1f05696bac94e10490"><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__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490">netconn_recv_tcp_pbuf</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structpbuf.html">pbuf</a> **new_buf)</td></tr>
+<tr class="separator:ga6893cb7648733d1f05696bac94e10490"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabb8a242c445ef928c23258a2b2344294"><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__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294">netconn_recv_tcp_pbuf_flags</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structpbuf.html">pbuf</a> **new_buf, u8_t apiflags)</td></tr>
+<tr class="separator:gabb8a242c445ef928c23258a2b2344294"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacf9ce6f71652739d6be2ca83f7c423bf"><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__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf">netconn_write_partly</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, const void *dataptr, size_t size, u8_t apiflags, size_t *bytes_written)</td></tr>
+<tr class="separator:gacf9ce6f71652739d6be2ca83f7c423bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga25bb1c1c9928f91f53149a026e2e2624"><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__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624">netconn_close</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn)</td></tr>
+<tr class="separator:ga25bb1c1c9928f91f53149a026e2e2624"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6ec6b2cf7b0f59e9371e38ae7dea2a63"><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__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63">netconn_shutdown</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, u8_t shut_rx, u8_t shut_tx)</td></tr>
+<tr class="separator:ga6ec6b2cf7b0f59e9371e38ae7dea2a63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>TCP only functions </p>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga43e3f4c2169dec0f666c502e490416b7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga43e3f4c2169dec0f666c502e490416b7">&#9670;&nbsp;</a></span>netconn_listen</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netconn_listen</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">conn</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d">netconn_listen_with_backlog</a>(conn, <a class="el" href="group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf">TCP_DEFAULT_LISTEN_BACKLOG</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gafea5e9b90770a7c6cd0762ceb65e5b46"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafea5e9b90770a7c6cd0762ceb65e5b46">&#9670;&nbsp;</a></span>netconn_write</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netconn_write</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">conn, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dataptr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">size, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">apiflags&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf">netconn_write_partly</a>(conn, dataptr, size, apiflags, NULL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga13593148f60f7bbc6a505b567f175d69"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga13593148f60f7bbc6a505b567f175d69">&#9670;&nbsp;</a></span>netconn_accept()</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> netconn_accept </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> **&#160;</td>
+          <td class="paramname"><em>new_conn</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Accept a new connection on a TCP listening netconn.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the TCP listen netconn </td></tr>
+    <tr><td class="paramname">new_conn</td><td>pointer where the new connection is stored </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if a new connection has been received or an error code otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ga25bb1c1c9928f91f53149a026e2e2624"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga25bb1c1c9928f91f53149a026e2e2624">&#9670;&nbsp;</a></span>netconn_close()</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> netconn_close </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Close a TCP netconn (doesn't delete it).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the TCP netconn to close </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the netconn was closed, any other err_t on error </dd></dl>
+
+</div>
+</div>
+<a id="ga84333ba8e7cdf45558d2b4795f53265d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga84333ba8e7cdf45558d2b4795f53265d">&#9670;&nbsp;</a></span>netconn_listen_with_backlog()</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> netconn_listen_with_backlog </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>backlog</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set a TCP netconn into listen mode</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the tcp netconn to set to listen mode </td></tr>
+    <tr><td class="paramname">backlog</td><td>the listen backlog, only used if TCP_LISTEN_BACKLOG==1 </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the netconn was set to listen (UDP and RAW netconns don't return any error (yet?)) </dd></dl>
+
+</div>
+</div>
+<a id="ga6893cb7648733d1f05696bac94e10490"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6893cb7648733d1f05696bac94e10490">&#9670;&nbsp;</a></span>netconn_recv_tcp_pbuf()</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> netconn_recv_tcp_pbuf </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> **&#160;</td>
+          <td class="paramname"><em>new_buf</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Receive data (in form of a pbuf) from a TCP netconn</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn from which to receive data </td></tr>
+    <tr><td class="paramname">new_buf</td><td>pointer where a new pbuf is stored when received data </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if data has been received, an error code otherwise (timeout, memory error or another error, </dd></dl>
+<dl class="section see"><dt>See also</dt><dd>netconn_recv_data) <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab508ce0ebdf3ca735208b00a80a45c91">ERR_ARG</a> if conn is not a TCP <a class="el" href="structnetconn.html">netconn</a> </dd></dl>
+
+</div>
+</div>
+<a id="gabb8a242c445ef928c23258a2b2344294"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabb8a242c445ef928c23258a2b2344294">&#9670;&nbsp;</a></span>netconn_recv_tcp_pbuf_flags()</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> netconn_recv_tcp_pbuf_flags </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> **&#160;</td>
+          <td class="paramname"><em>new_buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>apiflags</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Receive data (in form of a pbuf) from a TCP netconn</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn from which to receive data </td></tr>
+    <tr><td class="paramname">new_buf</td><td>pointer where a new pbuf is stored when received data </td></tr>
+    <tr><td class="paramname">apiflags</td><td>flags that control function behaviour. For now only:<ul>
+<li>NETCONN_DONTBLOCK: only read data that is available now, don't wait for more data </li>
+</ul>
+</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if data has been received, an error code otherwise (timeout, memory error or another error, </dd></dl>
+<dl class="section see"><dt>See also</dt><dd>netconn_recv_data) <a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab508ce0ebdf3ca735208b00a80a45c91">ERR_ARG</a> if conn is not a TCP <a class="el" href="structnetconn.html">netconn</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga6ec6b2cf7b0f59e9371e38ae7dea2a63"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6ec6b2cf7b0f59e9371e38ae7dea2a63">&#9670;&nbsp;</a></span>netconn_shutdown()</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> netconn_shutdown </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>shut_rx</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>shut_tx</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Shut down one or both sides of a TCP netconn (doesn't delete it).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the TCP netconn to shut down </td></tr>
+    <tr><td class="paramname">shut_rx</td><td>shut down the RX side (no more read possible after this) </td></tr>
+    <tr><td class="paramname">shut_tx</td><td>shut down the TX side (no more write possible after this) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the netconn was closed, any other err_t on error </dd></dl>
+
+</div>
+</div>
+<a id="gacf9ce6f71652739d6be2ca83f7c423bf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacf9ce6f71652739d6be2ca83f7c423bf">&#9670;&nbsp;</a></span>netconn_write_partly()</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> netconn_write_partly </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>dataptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>size</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>apiflags</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t *&#160;</td>
+          <td class="paramname"><em>bytes_written</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send data over a TCP netconn.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the TCP netconn over which to send data </td></tr>
+    <tr><td class="paramname">dataptr</td><td>pointer to the application buffer that contains the data to send </td></tr>
+    <tr><td class="paramname">size</td><td>size of the application data to send </td></tr>
+    <tr><td class="paramname">apiflags</td><td>combination of following flags :<ul>
+<li>NETCONN_COPY: data will be copied into memory belonging to the stack</li>
+<li>NETCONN_MORE: for TCP connection, PSH flag will be set on last segment sent</li>
+<li>NETCONN_DONTBLOCK: only write the data if all data can be written at once </li>
+</ul>
+</td></tr>
+    <tr><td class="paramname">bytes_written</td><td>pointer to a location that receives the number of written bytes </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if data was sent, any other err_t on error </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netconn__tcp.js b/doc/doxygen/output/html/group__netconn__tcp.js
new file mode 100644
index 0000000..809fac5
--- /dev/null
+++ b/doc/doxygen/output/html/group__netconn__tcp.js
@@ -0,0 +1,12 @@
+var group__netconn__tcp =
+[
+    [ "netconn_listen", "group__netconn__tcp.html#ga43e3f4c2169dec0f666c502e490416b7", null ],
+    [ "netconn_write", "group__netconn__tcp.html#gafea5e9b90770a7c6cd0762ceb65e5b46", null ],
+    [ "netconn_accept", "group__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69", null ],
+    [ "netconn_close", "group__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624", null ],
+    [ "netconn_listen_with_backlog", "group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d", null ],
+    [ "netconn_recv_tcp_pbuf", "group__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490", null ],
+    [ "netconn_recv_tcp_pbuf_flags", "group__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294", null ],
+    [ "netconn_shutdown", "group__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63", null ],
+    [ "netconn_write_partly", "group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netconn__udp.html b/doc/doxygen/output/html/group__netconn__udp.html
new file mode 100644
index 0000000..667d274
--- /dev/null
+++ b/doc/doxygen/output/html/group__netconn__udp.html
@@ -0,0 +1,334 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: UDP only</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netconn__udp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">UDP only<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__netconn.html">Netconn API</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga90bb4c4d1af6602a655b78fce0520402"><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__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402">netconn_disconnect</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn)</td></tr>
+<tr class="separator:ga90bb4c4d1af6602a655b78fce0520402"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8e1d852119bda1e1b602c2995282ef0c"><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__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c">netconn_sendto</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetbuf.html">netbuf</a> *buf, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, u16_t port)</td></tr>
+<tr class="separator:ga8e1d852119bda1e1b602c2995282ef0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac4d4d10153d47c80a783c34b27c66238"><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__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238">netconn_send</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, struct <a class="el" href="structnetbuf.html">netbuf</a> *buf)</td></tr>
+<tr class="separator:gac4d4d10153d47c80a783c34b27c66238"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaaf2f92eeb38dca70b3e6ad98c3c45ed"><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__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed">netconn_join_leave_group</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *multiaddr, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *netif_addr, enum <a class="el" href="api_8h.html#a5c6ded2c082de1536019b197a0a912db">netconn_igmp</a> join_or_leave)</td></tr>
+<tr class="separator:gaaaf2f92eeb38dca70b3e6ad98c3c45ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5db2a1cf06a5fbb36f433e637da8729b"><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__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b">netconn_join_leave_group_netif</a> (struct <a class="el" href="structnetconn.html">netconn</a> *conn, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *multiaddr, u8_t if_idx, enum <a class="el" href="api_8h.html#a5c6ded2c082de1536019b197a0a912db">netconn_igmp</a> join_or_leave)</td></tr>
+<tr class="separator:ga5db2a1cf06a5fbb36f433e637da8729b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>UDP only functions </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga90bb4c4d1af6602a655b78fce0520402"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga90bb4c4d1af6602a655b78fce0520402">&#9670;&nbsp;</a></span>netconn_disconnect()</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> netconn_disconnect </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Disconnect a netconn from its current peer (only valid for UDP netconns).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn to disconnect </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>See <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> </dd></dl>
+
+</div>
+</div>
+<a id="gaaaf2f92eeb38dca70b3e6ad98c3c45ed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaaaf2f92eeb38dca70b3e6ad98c3c45ed">&#9670;&nbsp;</a></span>netconn_join_leave_group()</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> netconn_join_leave_group </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>multiaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>netif_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum <a class="el" href="api_8h.html#a5c6ded2c082de1536019b197a0a912db">netconn_igmp</a>&#160;</td>
+          <td class="paramname"><em>join_or_leave</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Join multicast groups for UDP netconns.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the UDP netconn for which to change multicast addresses </td></tr>
+    <tr><td class="paramname">multiaddr</td><td>IP address of the multicast group to join or leave </td></tr>
+    <tr><td class="paramname">netif_addr</td><td>the IP address of the network interface on which to send the igmp message </td></tr>
+    <tr><td class="paramname">join_or_leave</td><td>flag whether to send a join- or leave-message </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the action was taken, any err_t on error </dd></dl>
+
+</div>
+</div>
+<a id="ga5db2a1cf06a5fbb36f433e637da8729b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5db2a1cf06a5fbb36f433e637da8729b">&#9670;&nbsp;</a></span>netconn_join_leave_group_netif()</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> netconn_join_leave_group_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>multiaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>if_idx</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum <a class="el" href="api_8h.html#a5c6ded2c082de1536019b197a0a912db">netconn_igmp</a>&#160;</td>
+          <td class="paramname"><em>join_or_leave</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Join multicast groups for UDP netconns.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the UDP netconn for which to change multicast addresses </td></tr>
+    <tr><td class="paramname">multiaddr</td><td>IP address of the multicast group to join or leave </td></tr>
+    <tr><td class="paramname">if_idx</td><td>the index of the netif </td></tr>
+    <tr><td class="paramname">join_or_leave</td><td>flag whether to send a join- or leave-message </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the action was taken, any err_t on error </dd></dl>
+
+</div>
+</div>
+<a id="gac4d4d10153d47c80a783c34b27c66238"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac4d4d10153d47c80a783c34b27c66238">&#9670;&nbsp;</a></span>netconn_send()</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> netconn_send </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetbuf.html">netbuf</a> *&#160;</td>
+          <td class="paramname"><em>buf</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send data over a UDP or RAW netconn (that is already connected).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the UDP or RAW netconn over which to send data </td></tr>
+    <tr><td class="paramname">buf</td><td>a netbuf containing the data to send </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if data was sent, any other err_t on error </dd></dl>
+
+</div>
+</div>
+<a id="ga8e1d852119bda1e1b602c2995282ef0c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8e1d852119bda1e1b602c2995282ef0c">&#9670;&nbsp;</a></span>netconn_sendto()</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> netconn_sendto </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td>
+          <td class="paramname"><em>conn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetbuf.html">netbuf</a> *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>port</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send data (in form of a netbuf) to a specific remote IP address and port. Only to be used for UDP and RAW netconns (not TCP).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">conn</td><td>the netconn over which to send data </td></tr>
+    <tr><td class="paramname">buf</td><td>a netbuf containing the data to send </td></tr>
+    <tr><td class="paramname">addr</td><td>the remote IP address to which to send the data </td></tr>
+    <tr><td class="paramname">port</td><td>the remote port to which to send the data </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if data was sent, any other err_t on error </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netconn__udp.js b/doc/doxygen/output/html/group__netconn__udp.js
new file mode 100644
index 0000000..7d0370a
--- /dev/null
+++ b/doc/doxygen/output/html/group__netconn__udp.js
@@ -0,0 +1,8 @@
+var group__netconn__udp =
+[
+    [ "netconn_disconnect", "group__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402", null ],
+    [ "netconn_join_leave_group", "group__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed", null ],
+    [ "netconn_join_leave_group_netif", "group__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b", null ],
+    [ "netconn_send", "group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238", null ],
+    [ "netconn_sendto", "group__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netdbapi.html b/doc/doxygen/output/html/group__netdbapi.html
new file mode 100644
index 0000000..a96d6b8
--- /dev/null
+++ b/doc/doxygen/output/html/group__netdbapi.html
@@ -0,0 +1,243 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: NETDB API</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netdbapi.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">NETDB API<div class="ingroups"><a class="el" href="group__api.html">APIs</a> &raquo; <a class="el" href="group__socket.html">Socket API</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga39746b4b096060ca3e8c6ee7a7560b1d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netdbapi.html#ga39746b4b096060ca3e8c6ee7a7560b1d">gethostbyname</a>(name)&#160;&#160;&#160;<a class="el" href="lwip_2netdb_8h.html#a8adc6d35c068a073369edde71c678cbc">lwip_gethostbyname</a>(name)</td></tr>
+<tr class="separator:ga39746b4b096060ca3e8c6ee7a7560b1d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga76204a4d646dba393f88aa9b0980fc07"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netdbapi.html#ga76204a4d646dba393f88aa9b0980fc07">gethostbyname_r</a>(name,  ret,  buf,  buflen,  result,  h_errnop)&#160;&#160;&#160;<a class="el" href="lwip_2netdb_8h.html#afa229e90916f6c8d6308828f45351d2d">lwip_gethostbyname_r</a>(name, ret, buf, buflen, result, h_errnop)</td></tr>
+<tr class="separator:ga76204a4d646dba393f88aa9b0980fc07"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab28cd3049bcf6e2bc3a71e968a64a92d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netdbapi.html#gab28cd3049bcf6e2bc3a71e968a64a92d">freeaddrinfo</a>(addrinfo)&#160;&#160;&#160;<a class="el" href="lwip_2netdb_8h.html#a7f65ff5982a0743849a644ef2cd15ef5">lwip_freeaddrinfo</a>(addrinfo)</td></tr>
+<tr class="separator:gab28cd3049bcf6e2bc3a71e968a64a92d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga558191530d91c101621b49e43bd5bbf5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netdbapi.html#ga558191530d91c101621b49e43bd5bbf5">getaddrinfo</a>(nodname,  servname,  hints,  res)&#160;&#160;&#160;<a class="el" href="lwip_2netdb_8h.html#af356989c172a51187e22b557f22d4165">lwip_getaddrinfo</a>(nodname, servname, hints, res)</td></tr>
+<tr class="separator:ga558191530d91c101621b49e43bd5bbf5"><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="gab28cd3049bcf6e2bc3a71e968a64a92d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab28cd3049bcf6e2bc3a71e968a64a92d">&#9670;&nbsp;</a></span>freeaddrinfo</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define freeaddrinfo</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addrinfo</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="lwip_2netdb_8h.html#a7f65ff5982a0743849a644ef2cd15ef5">lwip_freeaddrinfo</a>(addrinfo)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga558191530d91c101621b49e43bd5bbf5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga558191530d91c101621b49e43bd5bbf5">&#9670;&nbsp;</a></span>getaddrinfo</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define getaddrinfo</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">nodname, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">servname, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">hints, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">res&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="lwip_2netdb_8h.html#af356989c172a51187e22b557f22d4165">lwip_getaddrinfo</a>(nodname, servname, hints, res)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga39746b4b096060ca3e8c6ee7a7560b1d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga39746b4b096060ca3e8c6ee7a7560b1d">&#9670;&nbsp;</a></span>gethostbyname</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define gethostbyname</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">name</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="lwip_2netdb_8h.html#a8adc6d35c068a073369edde71c678cbc">lwip_gethostbyname</a>(name)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga76204a4d646dba393f88aa9b0980fc07"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga76204a4d646dba393f88aa9b0980fc07">&#9670;&nbsp;</a></span>gethostbyname_r</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define gethostbyname_r</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">name, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ret, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">buf, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">buflen, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">result, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">h_errnop&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="lwip_2netdb_8h.html#afa229e90916f6c8d6308828f45351d2d">lwip_gethostbyname_r</a>(name, ret, buf, buflen, result, h_errnop)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netdbapi.js b/doc/doxygen/output/html/group__netdbapi.js
new file mode 100644
index 0000000..2b05cc4
--- /dev/null
+++ b/doc/doxygen/output/html/group__netdbapi.js
@@ -0,0 +1,7 @@
+var group__netdbapi =
+[
+    [ "freeaddrinfo", "group__netdbapi.html#gab28cd3049bcf6e2bc3a71e968a64a92d", null ],
+    [ "getaddrinfo", "group__netdbapi.html#ga558191530d91c101621b49e43bd5bbf5", null ],
+    [ "gethostbyname", "group__netdbapi.html#ga39746b4b096060ca3e8c6ee7a7560b1d", null ],
+    [ "gethostbyname_r", "group__netdbapi.html#ga76204a4d646dba393f88aa9b0980fc07", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netif.html b/doc/doxygen/output/html/group__netif.html
new file mode 100644
index 0000000..aa952c0
--- /dev/null
+++ b/doc/doxygen/output/html/group__netif.html
@@ -0,0 +1,883 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Network interface (NETIF)</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netif.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</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="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">Network interface (NETIF)<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__netif__ip4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html">IPv4 address handling</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__netif__ip6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip6.html">IPv6 address handling</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__netif__cd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__cd.html">Client data handling</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__netif__flags"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__flags.html">Flags</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__netif__mib2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__mib2.html">MIB2 statistics</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 name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">union &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionnetif__ext__callback__args__t.html">netif_ext_callback_args_t</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga94a4c24c988afc0a577387730f303b19"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga94a4c24c988afc0a577387730f303b19">netif_is_up</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;(((<a class="el" href="structnetif.html">netif</a>)-&gt;flags &amp; <a class="el" href="group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e">NETIF_FLAG_UP</a>) ? (u8_t)1 : (u8_t)0)</td></tr>
+<tr class="separator:ga94a4c24c988afc0a577387730f303b19"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5e5d2c6fa5566a24dd848f3a2c7c957f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga5e5d2c6fa5566a24dd848f3a2c7c957f">netif_set_hostname</a>(<a class="el" href="structnetif.html">netif</a>,  name)&#160;&#160;&#160;do { if((<a class="el" href="structnetif.html">netif</a>) != NULL) { (<a class="el" href="structnetif.html">netif</a>)-&gt;hostname = name; }}while(0)</td></tr>
+<tr class="separator:ga5e5d2c6fa5566a24dd848f3a2c7c957f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5a378ba73e60cd1e5235474f0db22978"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga5a378ba73e60cd1e5235474f0db22978">netif_get_hostname</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;(((<a class="el" href="structnetif.html">netif</a>) != NULL) ? ((<a class="el" href="structnetif.html">netif</a>)-&gt;hostname) : NULL)</td></tr>
+<tr class="separator:ga5a378ba73e60cd1e5235474f0db22978"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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)&#160;&#160;&#160;do { if((<a class="el" href="structnetif.html">netif</a>) != NULL) { (<a class="el" href="structnetif.html">netif</a>)-&gt;igmp_mac_filter = function; }}while(0)</td></tr>
+<tr class="separator:ga3428b3f8195249c6cd8704a4db46b401"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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)&#160;&#160;&#160;do { if((<a class="el" href="structnetif.html">netif</a>) != NULL) { (<a class="el" href="structnetif.html">netif</a>)-&gt;mld_mac_filter = function; }}while(0)</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 name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gab2b9387389513a02027c62e246723808"><td class="memItemLeft" align="right" valign="top">typedef u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#gab2b9387389513a02027c62e246723808">netif_nsc_reason_t</a></td></tr>
+<tr class="separator:gab2b9387389513a02027c62e246723808"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5ee213cea065424c89c66f138c008da1"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga5ee213cea065424c89c66f138c008da1">netif_ext_callback_fn</a>) (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, <a class="el" href="group__netif.html#gab2b9387389513a02027c62e246723808">netif_nsc_reason_t</a> reason, const <a class="el" href="unionnetif__ext__callback__args__t.html">netif_ext_callback_args_t</a> *args)</td></tr>
+<tr class="separator:ga5ee213cea065424c89c66f138c008da1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gac20150ac754ff1f88afeaa33be3552a4"><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="group__netif.html#gac20150ac754ff1f88afeaa33be3552a4">netif_add_noaddr</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, 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:gac20150ac754ff1f88afeaa33be3552a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gade5498543e74067f28cc6bef0209e3be"><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="group__netif.html#gade5498543e74067f28cc6bef0209e3be">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:gade5498543e74067f28cc6bef0209e3be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9c6e541f0c184e1ea61a5cd8afe3e979"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979">netif_remove</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga9c6e541f0c184e1ea61a5cd8afe3e979"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac90f290edd005238d62aa94c4ac9dea3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif_set_default</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gac90f290edd005238d62aa94c4ac9dea3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf19693be401a265a52d2a56c65753121"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gaf19693be401a265a52d2a56c65753121"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga641d07ed8c31fe5306bc01605a6790cf"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf">netif_set_down</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga641d07ed8c31fe5306bc01605a6790cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadc8787b23ac0ee023979cbadf87813d4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#gadc8787b23ac0ee023979cbadf87813d4">netif_set_status_callback</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, <a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a> status_callback)</td></tr>
+<tr class="separator:gadc8787b23ac0ee023979cbadf87813d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga319c88da0fdf25c1fee1595299bc35ce"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce">netif_set_remove_callback</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, <a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a> remove_callback)</td></tr>
+<tr class="separator:ga319c88da0fdf25c1fee1595299bc35ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae0d2975f189277990e9d5276fdd9e9ea"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_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:gae0d2975f189277990e9d5276fdd9e9ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga34e37a1e8e358760dc1c43887922c7db"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga34e37a1e8e358760dc1c43887922c7db">netif_set_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:ga34e37a1e8e358760dc1c43887922c7db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1cd45910add90e267e33d680bbc3f0f4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4">netif_set_link_callback</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, <a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a> link_callback)</td></tr>
+<tr class="separator:ga1cd45910add90e267e33d680bbc3f0f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga691f1cc7c9778ffa62a3843c184404b2"><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__netif.html#ga691f1cc7c9778ffa62a3843c184404b2">netif_loop_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> *p)</td></tr>
+<tr class="separator:ga691f1cc7c9778ffa62a3843c184404b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac763a1f647fb9e8af4254418e813a6ae"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#gac763a1f647fb9e8af4254418e813a6ae">netif_name_to_index</a> (const char *name)</td></tr>
+<tr class="separator:gac763a1f647fb9e8af4254418e813a6ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3ff104d083914e87a7805a0b90a85755"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga3ff104d083914e87a7805a0b90a85755">netif_index_to_name</a> (u8_t idx, char *name)</td></tr>
+<tr class="separator:ga3ff104d083914e87a7805a0b90a85755"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae4df885347c800a5486d3bf25981300e"><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="group__netif.html#gae4df885347c800a5486d3bf25981300e">netif_get_by_index</a> (u8_t idx)</td></tr>
+<tr class="separator:gae4df885347c800a5486d3bf25981300e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga69c93a139e8a1f6ef4e3d076a2897def"><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="group__netif.html#ga69c93a139e8a1f6ef4e3d076a2897def">netif_find</a> (const char *name)</td></tr>
+<tr class="separator:ga69c93a139e8a1f6ef4e3d076a2897def"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3efc2b72f75936d50708247420c9d1d9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga3efc2b72f75936d50708247420c9d1d9">netif_add_ext_callback</a> (netif_ext_callback_t *callback, <a class="el" href="group__netif.html#ga5ee213cea065424c89c66f138c008da1">netif_ext_callback_fn</a> fn)</td></tr>
+<tr class="separator:ga3efc2b72f75936d50708247420c9d1d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1d91ac26b0993a9a3466b317ab5ec716"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716">netif_remove_ext_callback</a> (netif_ext_callback_t *callback)</td></tr>
+<tr class="separator:ga1d91ac26b0993a9a3466b317ab5ec716"><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="ga5a378ba73e60cd1e5235474f0db22978"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5a378ba73e60cd1e5235474f0db22978">&#9670;&nbsp;</a></span>netif_get_hostname</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_get_hostname</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td>&#160;&#160;&#160;(((<a class="el" href="structnetif.html">netif</a>) != NULL) ? ((<a class="el" href="structnetif.html">netif</a>)-&gt;hostname) : NULL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga94a4c24c988afc0a577387730f303b19"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga94a4c24c988afc0a577387730f303b19">&#9670;&nbsp;</a></span>netif_is_up</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_is_up</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td>&#160;&#160;&#160;(((<a class="el" href="structnetif.html">netif</a>)-&gt;flags &amp; <a class="el" href="group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e">NETIF_FLAG_UP</a>) ? (u8_t)1 : (u8_t)0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Ask if an interface is up </p>
+
+</div>
+</div>
+<a id="ga5e5d2c6fa5566a24dd848f3a2c7c957f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5e5d2c6fa5566a24dd848f3a2c7c957f">&#9670;&nbsp;</a></span>netif_set_hostname</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_set_hostname</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">name&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;do { if((<a class="el" href="structnetif.html">netif</a>) != NULL) { (<a class="el" href="structnetif.html">netif</a>)-&gt;hostname = name; }}while(0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga3428b3f8195249c6cd8704a4db46b401"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3428b3f8195249c6cd8704a4db46b401">&#9670;&nbsp;</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">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">function&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;do { if((<a class="el" href="structnetif.html">netif</a>) != NULL) { (<a class="el" href="structnetif.html">netif</a>)-&gt;igmp_mac_filter = function; }}while(0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga97f30bb5542e4c07d3b32e3c754e104c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga97f30bb5542e4c07d3b32e3c754e104c">&#9670;&nbsp;</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">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">function&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;do { if((<a class="el" href="structnetif.html">netif</a>) != NULL) { (<a class="el" href="structnetif.html">netif</a>)-&gt;mld_mac_filter = function; }}while(0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="ga5ee213cea065424c89c66f138c008da1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5ee213cea065424c89c66f138c008da1">&#9670;&nbsp;</a></span>netif_ext_callback_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* netif_ext_callback_fn) (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, <a class="el" href="group__netif.html#gab2b9387389513a02027c62e246723808">netif_nsc_reason_t</a> reason, const <a class="el" href="unionnetif__ext__callback__args__t.html">netif_ext_callback_args_t</a> *args)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function used for extended netif status callbacks Note: When parsing reason argument, keep in mind that more reasons may be added in the future! </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>netif that is affected by change </td></tr>
+    <tr><td class="paramname">reason</td><td>change reason </td></tr>
+    <tr><td class="paramname">args</td><td>depends on reason, see reason description </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gab2b9387389513a02027c62e246723808"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab2b9387389513a02027c62e246723808">&#9670;&nbsp;</a></span>netif_nsc_reason_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef u16_t <a class="el" href="group__netif.html#gab2b9387389513a02027c62e246723808">netif_nsc_reason_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Extended netif status callback (NSC) reasons flags. May be extended in the future! </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gade5498543e74067f28cc6bef0209e3be"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gade5498543e74067f28cc6bef0209e3be">&#9670;&nbsp;</a></span>netif_add()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* netif_add </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </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> *&#160;</td>
+          <td class="paramname"><em>netmask</em>, </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> *&#160;</td>
+          <td class="paramname"><em>gw</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>state</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5">netif_init_fn</a>&#160;</td>
+          <td class="paramname"><em>init</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e">netif_input_fn</a>&#160;</td>
+          <td class="paramname"><em>input</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add a network interface to the list of lwIP netifs.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>a pre-allocated netif structure </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>IP address for the new netif </td></tr>
+    <tr><td class="paramname">netmask</td><td>network mask for the new netif </td></tr>
+    <tr><td class="paramname">gw</td><td>default gateway IP address for the new netif </td></tr>
+    <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>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>netif, or NULL if failed. </dd></dl>
+
+</div>
+</div>
+<a id="ga3efc2b72f75936d50708247420c9d1d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3efc2b72f75936d50708247420c9d1d9">&#9670;&nbsp;</a></span>netif_add_ext_callback()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_add_ext_callback </td>
+          <td>(</td>
+          <td class="paramtype">netif_ext_callback_t *&#160;</td>
+          <td class="paramname"><em>callback</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__netif.html#ga5ee213cea065424c89c66f138c008da1">netif_ext_callback_fn</a>&#160;</td>
+          <td class="paramname"><em>fn</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add extended netif events listener </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">callback</td><td>pointer to listener structure </td></tr>
+    <tr><td class="paramname">fn</td><td>callback function </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gac20150ac754ff1f88afeaa33be3552a4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac20150ac754ff1f88afeaa33be3552a4">&#9670;&nbsp;</a></span>netif_add_noaddr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* netif_add_noaddr </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>state</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5">netif_init_fn</a>&#160;</td>
+          <td class="paramname"><em>init</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e">netif_input_fn</a>&#160;</td>
+          <td class="paramname"><em>input</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add a network interface to the list of lwIP netifs.</p>
+<p>Same as <a class="el" href="group__netif.html#gade5498543e74067f28cc6bef0209e3be">netif_add</a> but without IPv4 addresses </p>
+
+</div>
+</div>
+<a id="ga69c93a139e8a1f6ef4e3d076a2897def"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga69c93a139e8a1f6ef4e3d076a2897def">&#9670;&nbsp;</a></span>netif_find()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* netif_find </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>name</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Find a network interface by searching for its name</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">name</td><td>the name of the netif (like netif-&gt;name) plus concatenated number in ascii representation (e.g. 'en0') </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gae4df885347c800a5486d3bf25981300e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae4df885347c800a5486d3bf25981300e">&#9670;&nbsp;</a></span>netif_get_by_index()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* netif_get_by_index </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>idx</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return the interface for the netif index</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">idx</td><td>index of netif to find </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga3ff104d083914e87a7805a0b90a85755"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3ff104d083914e87a7805a0b90a85755">&#9670;&nbsp;</a></span>netif_index_to_name()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* netif_index_to_name </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>idx</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>name</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return the interface name for the netif matching index or NULL if not found/on error</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">idx</td><td>the interface index of the netif </td></tr>
+    <tr><td class="paramname">name</td><td>char buffer of at least NETIF_NAMESIZE bytes </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga691f1cc7c9778ffa62a3843c184404b2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga691f1cc7c9778ffa62a3843c184404b2">&#9670;&nbsp;</a></span>netif_loop_output()</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> netif_loop_output </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an IP packet to be received on the same netif (loopif-like). The pbuf is simply copied and handed back to netif-&gt;input. In multithreaded mode, this is done directly since netif-&gt;input must put the packet on a queue. In callback mode, the packet is put on an internal queue and is fed to netif-&gt;input by <a class="el" href="netif_8c.html#a0fbaed78253d21e1b54e65651da3e327">netif_poll()</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the lwip network interface structure </td></tr>
+    <tr><td class="paramname">p</td><td>the (IP) packet to 'send' </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the packet has been sent ERR_MEM if the pbuf used to copy the packet couldn't be allocated </dd></dl>
+
+</div>
+</div>
+<a id="gac763a1f647fb9e8af4254418e813a6ae"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac763a1f647fb9e8af4254418e813a6ae">&#9670;&nbsp;</a></span>netif_name_to_index()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netif_name_to_index </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>name</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return the interface index for the netif with name or NETIF_NO_INDEX if not found/on error</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">name</td><td>the name of the netif </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga9c6e541f0c184e1ea61a5cd8afe3e979"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9c6e541f0c184e1ea61a5cd8afe3e979">&#9670;&nbsp;</a></span>netif_remove()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_remove </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Remove a network interface from the list of lwIP netifs.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the network interface to remove </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga1d91ac26b0993a9a3466b317ab5ec716"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1d91ac26b0993a9a3466b317ab5ec716">&#9670;&nbsp;</a></span>netif_remove_ext_callback()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_remove_ext_callback </td>
+          <td>(</td>
+          <td class="paramtype">netif_ext_callback_t *&#160;</td>
+          <td class="paramname"><em>callback</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Remove extended netif events listener </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">callback</td><td>pointer to listener structure </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gac90f290edd005238d62aa94c4ac9dea3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac90f290edd005238d62aa94c4ac9dea3">&#9670;&nbsp;</a></span>netif_set_default()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_set_default </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set a network interface as the default network interface (used to output all packets for which no specific route is found)</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the default network interface </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga641d07ed8c31fe5306bc01605a6790cf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga641d07ed8c31fe5306bc01605a6790cf">&#9670;&nbsp;</a></span>netif_set_down()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_set_down </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Bring an interface down, disabling any traffic processing. </p>
+
+</div>
+</div>
+<a id="ga1cd45910add90e267e33d680bbc3f0f4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1cd45910add90e267e33d680bbc3f0f4">&#9670;&nbsp;</a></span>netif_set_link_callback()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_set_link_callback </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a>&#160;</td>
+          <td class="paramname"><em>link_callback</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set callback to be called when link is brought up/down </p>
+
+</div>
+</div>
+<a id="ga34e37a1e8e358760dc1c43887922c7db"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga34e37a1e8e358760dc1c43887922c7db">&#9670;&nbsp;</a></span>netif_set_link_down()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_set_link_down </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by a driver when its link goes down </p>
+
+</div>
+</div>
+<a id="gae0d2975f189277990e9d5276fdd9e9ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae0d2975f189277990e9d5276fdd9e9ea">&#9670;&nbsp;</a></span>netif_set_link_up()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_set_link_up </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by a driver when its link goes up </p>
+
+</div>
+</div>
+<a id="ga319c88da0fdf25c1fee1595299bc35ce"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga319c88da0fdf25c1fee1595299bc35ce">&#9670;&nbsp;</a></span>netif_set_remove_callback()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_set_remove_callback </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a>&#160;</td>
+          <td class="paramname"><em>remove_callback</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set callback to be called when the interface has been removed </p>
+
+</div>
+</div>
+<a id="gadc8787b23ac0ee023979cbadf87813d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadc8787b23ac0ee023979cbadf87813d4">&#9670;&nbsp;</a></span>netif_set_status_callback()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_set_status_callback </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a>&#160;</td>
+          <td class="paramname"><em>status_callback</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set callback to be called when interface is brought up/down or address is changed while up </p>
+
+</div>
+</div>
+<a id="gaf19693be401a265a52d2a56c65753121"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf19693be401a265a52d2a56c65753121">&#9670;&nbsp;</a></span>netif_set_up()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_set_up </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Bring an interface up, available for processing traffic. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netif.js b/doc/doxygen/output/html/group__netif.js
new file mode 100644
index 0000000..7b84c6f
--- /dev/null
+++ b/doc/doxygen/output/html/group__netif.js
@@ -0,0 +1,53 @@
+var group__netif =
+[
+    [ "IPv4 address handling", "group__netif__ip4.html", "group__netif__ip4" ],
+    [ "IPv6 address handling", "group__netif__ip6.html", "group__netif__ip6" ],
+    [ "Client data handling", "group__netif__cd.html", "group__netif__cd" ],
+    [ "Flags", "group__netif__flags.html", "group__netif__flags" ],
+    [ "MIB2 statistics", "group__netif__mib2.html", "group__netif__mib2" ],
+    [ "netif_ext_callback_args_t", "unionnetif__ext__callback__args__t.html", [
+      [ "ipv4_changed_s", "structnetif__ext__callback__args__t_1_1ipv4__changed__s.html", [
+        [ "old_address", "structnetif__ext__callback__args__t_1_1ipv4__changed__s.html#a0f6e5c1318218d95f1d3dc8c29c30ade", null ]
+      ] ],
+      [ "ipv6_addr_state_changed_s", "structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html", [
+        [ "addr_index", "structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#aebf2aa0b26b07ca1977c676a0404323f", null ],
+        [ "address", "structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#acd24c243c866f8f9169b89af11974f17", null ],
+        [ "old_state", "structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#a9b58712e82a73803391523324e19a776", null ]
+      ] ],
+      [ "ipv6_set_s", "structnetif__ext__callback__args__t_1_1ipv6__set__s.html", [
+        [ "addr_index", "structnetif__ext__callback__args__t_1_1ipv6__set__s.html#ad44a5f52ad695ea90b15a1e29ff823dd", null ],
+        [ "old_address", "structnetif__ext__callback__args__t_1_1ipv6__set__s.html#aafda237ad0c20d25fa2ad83d63051226", null ]
+      ] ],
+      [ "link_changed_s", "structnetif__ext__callback__args__t_1_1link__changed__s.html", [
+        [ "state", "structnetif__ext__callback__args__t_1_1link__changed__s.html#a39870f966a2a64a7f51747b45977296c", null ]
+      ] ],
+      [ "status_changed_s", "structnetif__ext__callback__args__t_1_1status__changed__s.html", [
+        [ "state", "structnetif__ext__callback__args__t_1_1status__changed__s.html#a207d3afdf0a37d16a61d1253e264d7a7", null ]
+      ] ]
+    ] ],
+    [ "netif_get_hostname", "group__netif.html#ga5a378ba73e60cd1e5235474f0db22978", null ],
+    [ "netif_is_up", "group__netif.html#ga94a4c24c988afc0a577387730f303b19", null ],
+    [ "netif_set_hostname", "group__netif.html#ga5e5d2c6fa5566a24dd848f3a2c7c957f", 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#gade5498543e74067f28cc6bef0209e3be", null ],
+    [ "netif_add_ext_callback", "group__netif.html#ga3efc2b72f75936d50708247420c9d1d9", null ],
+    [ "netif_add_noaddr", "group__netif.html#gac20150ac754ff1f88afeaa33be3552a4", null ],
+    [ "netif_find", "group__netif.html#ga69c93a139e8a1f6ef4e3d076a2897def", null ],
+    [ "netif_get_by_index", "group__netif.html#gae4df885347c800a5486d3bf25981300e", null ],
+    [ "netif_index_to_name", "group__netif.html#ga3ff104d083914e87a7805a0b90a85755", null ],
+    [ "netif_loop_output", "group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2", null ],
+    [ "netif_name_to_index", "group__netif.html#gac763a1f647fb9e8af4254418e813a6ae", null ],
+    [ "netif_remove", "group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979", null ],
+    [ "netif_remove_ext_callback", "group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716", null ],
+    [ "netif_set_default", "group__netif.html#gac90f290edd005238d62aa94c4ac9dea3", null ],
+    [ "netif_set_down", "group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf", null ],
+    [ "netif_set_link_callback", "group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4", null ],
+    [ "netif_set_link_down", "group__netif.html#ga34e37a1e8e358760dc1c43887922c7db", null ],
+    [ "netif_set_link_up", "group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea", null ],
+    [ "netif_set_remove_callback", "group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce", null ],
+    [ "netif_set_status_callback", "group__netif.html#gadc8787b23ac0ee023979cbadf87813d4", null ],
+    [ "netif_set_up", "group__netif.html#gaf19693be401a265a52d2a56c65753121", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netif__cd.html b/doc/doxygen/output/html/group__netif__cd.html
new file mode 100644
index 0000000..f79c491
--- /dev/null
+++ b/doc/doxygen/output/html/group__netif__cd.html
@@ -0,0 +1,202 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Client data handling</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netif__cd.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">Client data handling<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__netif.html">Network interface (NETIF)</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga5ce61a277e1951183f7b7d03742c231f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f">netif_set_client_data</a>(<a class="el" href="structnetif.html">netif</a>,  id,  data)&#160;&#160;&#160;<a class="el" href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a>(<a class="el" href="structnetif.html">netif</a>, id) = (data)</td></tr>
+<tr class="separator:ga5ce61a277e1951183f7b7d03742c231f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4bce01ddbf0fd70cb88431f773c91bc5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a>(<a class="el" href="structnetif.html">netif</a>,  id)&#160;&#160;&#160;(<a class="el" href="structnetif.html">netif</a>)-&gt;client_data[(id)]</td></tr>
+<tr class="separator:ga4bce01ddbf0fd70cb88431f773c91bc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga55d62d43b5a9a5527f0116ec38369978"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978">netif_alloc_client_data_id</a> (void)</td></tr>
+<tr class="separator:ga55d62d43b5a9a5527f0116ec38369978"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Store data (void*) on a netif for application usage. </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__lwip__opts__netif.html#ga94a35212616f9a9aae5c98741612b936">LWIP_NUM_NETIF_CLIENT_DATA</a> </dd></dl>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga4bce01ddbf0fd70cb88431f773c91bc5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4bce01ddbf0fd70cb88431f773c91bc5">&#9670;&nbsp;</a></span>netif_get_client_data</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_get_client_data</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">id&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;(<a class="el" href="structnetif.html">netif</a>)-&gt;client_data[(id)]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get client data. Obtain ID from <a class="el" href="group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978">netif_alloc_client_data_id()</a>. </p>
+
+</div>
+</div>
+<a id="ga5ce61a277e1951183f7b7d03742c231f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5ce61a277e1951183f7b7d03742c231f">&#9670;&nbsp;</a></span>netif_set_client_data</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_set_client_data</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">id, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">data&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a>(<a class="el" href="structnetif.html">netif</a>, id) = (data)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set client data. Obtain ID from <a class="el" href="group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978">netif_alloc_client_data_id()</a>. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga55d62d43b5a9a5527f0116ec38369978"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga55d62d43b5a9a5527f0116ec38369978">&#9670;&nbsp;</a></span>netif_alloc_client_data_id()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netif_alloc_client_data_id </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocate an index to store data in client_data member of struct netif. Returned value is an index in mentioned array. </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__lwip__opts__netif.html#ga94a35212616f9a9aae5c98741612b936">LWIP_NUM_NETIF_CLIENT_DATA</a> </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netif__cd.js b/doc/doxygen/output/html/group__netif__cd.js
new file mode 100644
index 0000000..dece5d9
--- /dev/null
+++ b/doc/doxygen/output/html/group__netif__cd.js
@@ -0,0 +1,6 @@
+var group__netif__cd =
+[
+    [ "netif_get_client_data", "group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5", null ],
+    [ "netif_set_client_data", "group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f", null ],
+    [ "netif_alloc_client_data_id", "group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netif__flags.html b/doc/doxygen/output/html/group__netif__flags.html
new file mode 100644
index 0000000..233bf70
--- /dev/null
+++ b/doc/doxygen/output/html/group__netif__flags.html
@@ -0,0 +1,226 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Flags</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netif__flags.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Flags<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__netif.html">Network interface (NETIF)</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gab47d7d130693dc155f480a5bf447725e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e">NETIF_FLAG_UP</a>&#160;&#160;&#160;0x01U</td></tr>
+<tr class="separator:gab47d7d130693dc155f480a5bf447725e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaef64fe15c82bc7b235366923e517104e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__flags.html#gaef64fe15c82bc7b235366923e517104e">NETIF_FLAG_BROADCAST</a>&#160;&#160;&#160;0x02U</td></tr>
+<tr class="separator:gaef64fe15c82bc7b235366923e517104e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga75f5a2b9276c93e3bd18a568459fd2d8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__flags.html#ga75f5a2b9276c93e3bd18a568459fd2d8">NETIF_FLAG_LINK_UP</a>&#160;&#160;&#160;0x04U</td></tr>
+<tr class="separator:ga75f5a2b9276c93e3bd18a568459fd2d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga92448dc510bc8d700c09e5c971ef0676"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__flags.html#ga92448dc510bc8d700c09e5c971ef0676">NETIF_FLAG_ETHARP</a>&#160;&#160;&#160;0x08U</td></tr>
+<tr class="separator:ga92448dc510bc8d700c09e5c971ef0676"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga76ad9d0cf9f029df0ab2a998c64040dc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__flags.html#ga76ad9d0cf9f029df0ab2a998c64040dc">NETIF_FLAG_ETHERNET</a>&#160;&#160;&#160;0x10U</td></tr>
+<tr class="separator:ga76ad9d0cf9f029df0ab2a998c64040dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac9493b923d733c73f6006d9714826558"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__flags.html#gac9493b923d733c73f6006d9714826558">NETIF_FLAG_IGMP</a>&#160;&#160;&#160;0x20U</td></tr>
+<tr class="separator:gac9493b923d733c73f6006d9714826558"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab14fbe1447d2fdbdf5abc87f51eb6508"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__flags.html#gab14fbe1447d2fdbdf5abc87f51eb6508">NETIF_FLAG_MLD6</a>&#160;&#160;&#160;0x40U</td></tr>
+<tr class="separator:gab14fbe1447d2fdbdf5abc87f51eb6508"><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="gaef64fe15c82bc7b235366923e517104e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaef64fe15c82bc7b235366923e517104e">&#9670;&nbsp;</a></span>NETIF_FLAG_BROADCAST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETIF_FLAG_BROADCAST&#160;&#160;&#160;0x02U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If set, the netif has broadcast capability. Set by the netif driver in its init function. </p>
+
+</div>
+</div>
+<a id="ga92448dc510bc8d700c09e5c971ef0676"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga92448dc510bc8d700c09e5c971ef0676">&#9670;&nbsp;</a></span>NETIF_FLAG_ETHARP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETIF_FLAG_ETHARP&#160;&#160;&#160;0x08U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If set, the netif is an ethernet device using ARP. Set by the netif driver in its init function. Used to check input packet types and use of DHCP. </p>
+
+</div>
+</div>
+<a id="ga76ad9d0cf9f029df0ab2a998c64040dc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga76ad9d0cf9f029df0ab2a998c64040dc">&#9670;&nbsp;</a></span>NETIF_FLAG_ETHERNET</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETIF_FLAG_ETHERNET&#160;&#160;&#160;0x10U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If set, the netif is an ethernet device. It might not use ARP or TCP/IP if it is used for PPPoE only. </p>
+
+</div>
+</div>
+<a id="gac9493b923d733c73f6006d9714826558"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac9493b923d733c73f6006d9714826558">&#9670;&nbsp;</a></span>NETIF_FLAG_IGMP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETIF_FLAG_IGMP&#160;&#160;&#160;0x20U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If set, the netif has IGMP capability. Set by the netif driver in its init function. </p>
+
+</div>
+</div>
+<a id="ga75f5a2b9276c93e3bd18a568459fd2d8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga75f5a2b9276c93e3bd18a568459fd2d8">&#9670;&nbsp;</a></span>NETIF_FLAG_LINK_UP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETIF_FLAG_LINK_UP&#160;&#160;&#160;0x04U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If set, the interface has an active link (set by the network interface driver). Either set by the netif driver in its init function (if the link is up at that time) or at a later point once the link comes up (if link detection is supported by the hardware). </p>
+
+</div>
+</div>
+<a id="gab14fbe1447d2fdbdf5abc87f51eb6508"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab14fbe1447d2fdbdf5abc87f51eb6508">&#9670;&nbsp;</a></span>NETIF_FLAG_MLD6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETIF_FLAG_MLD6&#160;&#160;&#160;0x40U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If set, the netif has MLD6 capability. Set by the netif driver in its init function. </p>
+
+</div>
+</div>
+<a id="gab47d7d130693dc155f480a5bf447725e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab47d7d130693dc155f480a5bf447725e">&#9670;&nbsp;</a></span>NETIF_FLAG_UP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETIF_FLAG_UP&#160;&#160;&#160;0x01U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Whether the network interface is 'up'. This is a software flag used to control whether this network interface is enabled and processes traffic. It must be set by the startup code before this netif can be used (also for dhcp/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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netif__flags.js b/doc/doxygen/output/html/group__netif__flags.js
new file mode 100644
index 0000000..9ee58da
--- /dev/null
+++ b/doc/doxygen/output/html/group__netif__flags.js
@@ -0,0 +1,10 @@
+var group__netif__flags =
+[
+    [ "NETIF_FLAG_BROADCAST", "group__netif__flags.html#gaef64fe15c82bc7b235366923e517104e", null ],
+    [ "NETIF_FLAG_ETHARP", "group__netif__flags.html#ga92448dc510bc8d700c09e5c971ef0676", null ],
+    [ "NETIF_FLAG_ETHERNET", "group__netif__flags.html#ga76ad9d0cf9f029df0ab2a998c64040dc", null ],
+    [ "NETIF_FLAG_IGMP", "group__netif__flags.html#gac9493b923d733c73f6006d9714826558", null ],
+    [ "NETIF_FLAG_LINK_UP", "group__netif__flags.html#ga75f5a2b9276c93e3bd18a568459fd2d8", null ],
+    [ "NETIF_FLAG_MLD6", "group__netif__flags.html#gab14fbe1447d2fdbdf5abc87f51eb6508", null ],
+    [ "NETIF_FLAG_UP", "group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netif__ip4.html b/doc/doxygen/output/html/group__netif__ip4.html
new file mode 100644
index 0000000..fdfac50
--- /dev/null
+++ b/doc/doxygen/output/html/group__netif__ip4.html
@@ -0,0 +1,401 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: IPv4 address handling</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netif__ip4.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">IPv4 address handling<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__netif.html">Network interface (NETIF)</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gac9b6e63b5dd2968fe0a4813f3eefb55d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#gac9b6e63b5dd2968fe0a4813f3eefb55d">netif_ip4_addr</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;((const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a>*)<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;<a class="el" href="structip__addr.html">ip_addr</a>)))</td></tr>
+<tr class="separator:gac9b6e63b5dd2968fe0a4813f3eefb55d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga952d1436f2428b92fc8197bcf2f8fca3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga952d1436f2428b92fc8197bcf2f8fca3">netif_ip4_netmask</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;((const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a>*)<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;netmask)))</td></tr>
+<tr class="separator:ga952d1436f2428b92fc8197bcf2f8fca3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga86d69faf416765b7f8faf60a43cc50da"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga86d69faf416765b7f8faf60a43cc50da">netif_ip4_gw</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;((const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a>*)<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;gw)))</td></tr>
+<tr class="separator:ga86d69faf416765b7f8faf60a43cc50da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga54179a2f3b7cc35b23ee8d692d8d8022"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga54179a2f3b7cc35b23ee8d692d8d8022">netif_ip_addr4</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;((const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>*)&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;<a class="el" href="structip__addr.html">ip_addr</a>))</td></tr>
+<tr class="separator:ga54179a2f3b7cc35b23ee8d692d8d8022"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga58518602f388d2640985a01a312f0a51"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga58518602f388d2640985a01a312f0a51">netif_ip_netmask4</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;((const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>*)&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;netmask))</td></tr>
+<tr class="separator:ga58518602f388d2640985a01a312f0a51"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7ea95478e000701423b7f6316e575a2a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga7ea95478e000701423b7f6316e575a2a">netif_ip_gw4</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;((const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>*)&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;gw))</td></tr>
+<tr class="separator:ga7ea95478e000701423b7f6316e575a2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga73b043a7ec0e4899aba8433ec9064cca"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca">netif_set_ipaddr</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:ga73b043a7ec0e4899aba8433ec9064cca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0bdd7c057c2f55f670853e3906014a53"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53">netif_set_netmask</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> *netmask)</td></tr>
+<tr class="separator:ga0bdd7c057c2f55f670853e3906014a53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga841876c274c3c90898579f9e12f3b520"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520">netif_set_gw</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> *gw)</td></tr>
+<tr class="separator:ga841876c274c3c90898579f9e12f3b520"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga85e31a68e96390dab2feffb11f4948a1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1">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>
+<tr class="separator:ga85e31a68e96390dab2feffb11f4948a1"><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="gac9b6e63b5dd2968fe0a4813f3eefb55d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac9b6e63b5dd2968fe0a4813f3eefb55d">&#9670;&nbsp;</a></span>netif_ip4_addr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_ip4_addr</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td>&#160;&#160;&#160;((const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a>*)<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;<a class="el" href="structip__addr.html">ip_addr</a>)))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga86d69faf416765b7f8faf60a43cc50da"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga86d69faf416765b7f8faf60a43cc50da">&#9670;&nbsp;</a></span>netif_ip4_gw</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_ip4_gw</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td>&#160;&#160;&#160;((const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a>*)<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;gw)))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga952d1436f2428b92fc8197bcf2f8fca3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga952d1436f2428b92fc8197bcf2f8fca3">&#9670;&nbsp;</a></span>netif_ip4_netmask</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_ip4_netmask</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td>&#160;&#160;&#160;((const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a>*)<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;netmask)))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga54179a2f3b7cc35b23ee8d692d8d8022"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga54179a2f3b7cc35b23ee8d692d8d8022">&#9670;&nbsp;</a></span>netif_ip_addr4</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_ip_addr4</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td>&#160;&#160;&#160;((const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>*)&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;<a class="el" href="structip__addr.html">ip_addr</a>))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga7ea95478e000701423b7f6316e575a2a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7ea95478e000701423b7f6316e575a2a">&#9670;&nbsp;</a></span>netif_ip_gw4</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_ip_gw4</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td>&#160;&#160;&#160;((const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>*)&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;gw))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga58518602f388d2640985a01a312f0a51"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga58518602f388d2640985a01a312f0a51">&#9670;&nbsp;</a></span>netif_ip_netmask4</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_ip_netmask4</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td>&#160;&#160;&#160;((const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>*)&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;netmask))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga85e31a68e96390dab2feffb11f4948a1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga85e31a68e96390dab2feffb11f4948a1">&#9670;&nbsp;</a></span>netif_set_addr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_set_addr </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </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> *&#160;</td>
+          <td class="paramname"><em>netmask</em>, </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> *&#160;</td>
+          <td class="paramname"><em>gw</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Change IP address configuration for a network interface (including netmask and default gateway).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the network interface to change </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>the new IP address </td></tr>
+    <tr><td class="paramname">netmask</td><td>the new netmask </td></tr>
+    <tr><td class="paramname">gw</td><td>the new default gateway </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga841876c274c3c90898579f9e12f3b520"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga841876c274c3c90898579f9e12f3b520">&#9670;&nbsp;</a></span>netif_set_gw()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_set_gw </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>gw</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Change the default gateway for a network interface</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the network interface to change </td></tr>
+    <tr><td class="paramname">gw</td><td>the new default gateway</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>call <a class="el" href="group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1">netif_set_addr()</a> if you also want to change ip address and netmask </dd></dl>
+
+</div>
+</div>
+<a id="ga73b043a7ec0e4899aba8433ec9064cca"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga73b043a7ec0e4899aba8433ec9064cca">&#9670;&nbsp;</a></span>netif_set_ipaddr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_set_ipaddr </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Change the IP address of a network interface</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the network interface to change </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>the new IP address</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>call <a class="el" href="group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1">netif_set_addr()</a> if you also want to change netmask and default gateway </dd></dl>
+
+</div>
+</div>
+<a id="ga0bdd7c057c2f55f670853e3906014a53"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0bdd7c057c2f55f670853e3906014a53">&#9670;&nbsp;</a></span>netif_set_netmask()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_set_netmask </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>netmask</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Change the netmask of a network interface</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the network interface to change </td></tr>
+    <tr><td class="paramname">netmask</td><td>the new netmask</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>call <a class="el" href="group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1">netif_set_addr()</a> if you also want to change ip address and default gateway </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netif__ip4.js b/doc/doxygen/output/html/group__netif__ip4.js
new file mode 100644
index 0000000..927b345
--- /dev/null
+++ b/doc/doxygen/output/html/group__netif__ip4.js
@@ -0,0 +1,13 @@
+var group__netif__ip4 =
+[
+    [ "netif_ip4_addr", "group__netif__ip4.html#gac9b6e63b5dd2968fe0a4813f3eefb55d", null ],
+    [ "netif_ip4_gw", "group__netif__ip4.html#ga86d69faf416765b7f8faf60a43cc50da", null ],
+    [ "netif_ip4_netmask", "group__netif__ip4.html#ga952d1436f2428b92fc8197bcf2f8fca3", null ],
+    [ "netif_ip_addr4", "group__netif__ip4.html#ga54179a2f3b7cc35b23ee8d692d8d8022", null ],
+    [ "netif_ip_gw4", "group__netif__ip4.html#ga7ea95478e000701423b7f6316e575a2a", null ],
+    [ "netif_ip_netmask4", "group__netif__ip4.html#ga58518602f388d2640985a01a312f0a51", null ],
+    [ "netif_set_addr", "group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1", null ],
+    [ "netif_set_gw", "group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520", null ],
+    [ "netif_set_ipaddr", "group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca", null ],
+    [ "netif_set_netmask", "group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netif__ip6.html b/doc/doxygen/output/html/group__netif__ip6.html
new file mode 100644
index 0000000..97e458c
--- /dev/null
+++ b/doc/doxygen/output/html/group__netif__ip6.html
@@ -0,0 +1,346 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: IPv6 address handling</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netif__ip6.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">IPv6 address handling<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__netif.html">Network interface (NETIF)</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gae424e336fe9f013b30d4065fd35c91ee"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip6.html#gae424e336fe9f013b30d4065fd35c91ee">netif_ip_addr6</a>(<a class="el" href="structnetif.html">netif</a>,  i)&#160;&#160;&#160;((const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>*)(&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;<a class="el" href="structip6__addr.html">ip6_addr</a>[i])))</td></tr>
+<tr class="separator:gae424e336fe9f013b30d4065fd35c91ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7ec0623f1a858a0cdb187beaa89df365"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip6.html#ga7ec0623f1a858a0cdb187beaa89df365">netif_ip6_addr</a>(<a class="el" href="structnetif.html">netif</a>,  i)&#160;&#160;&#160;((const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a>*)<a class="el" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;<a class="el" href="structip6__addr.html">ip6_addr</a>[i])))</td></tr>
+<tr class="separator:ga7ec0623f1a858a0cdb187beaa89df365"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gae21572fdbd8664d22a1b281a6c31c9bb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb">netif_ip6_addr_set</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, s8_t addr_idx, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *addr6)</td></tr>
+<tr class="separator:gae21572fdbd8664d22a1b281a6c31c9bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9cde7286535c7f037a9b16052561b91f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f">netif_ip6_addr_set_state</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, s8_t addr_idx, u8_t state)</td></tr>
+<tr class="separator:ga9cde7286535c7f037a9b16052561b91f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae864211a5eb052deb5da7bc7e3427fb9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9">netif_create_ip6_linklocal_address</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t from_mac_48bit)</td></tr>
+<tr class="separator:gae864211a5eb052deb5da7bc7e3427fb9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab0727fba5f5b3fed8d7013775506f327"><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__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327">netif_add_ip6_address</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ip6addr, s8_t *chosen_idx)</td></tr>
+<tr class="separator:gab0727fba5f5b3fed8d7013775506f327"><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="ga7ec0623f1a858a0cdb187beaa89df365"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7ec0623f1a858a0cdb187beaa89df365">&#9670;&nbsp;</a></span>netif_ip6_addr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_ip6_addr</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">i&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a>*)<a class="el" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;<a class="el" href="structip6__addr.html">ip6_addr</a>[i])))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gae424e336fe9f013b30d4065fd35c91ee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae424e336fe9f013b30d4065fd35c91ee">&#9670;&nbsp;</a></span>netif_ip_addr6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_ip_addr6</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">i&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>*)(&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;<a class="el" href="structip6__addr.html">ip6_addr</a>[i])))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gab0727fba5f5b3fed8d7013775506f327"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab0727fba5f5b3fed8d7013775506f327">&#9670;&nbsp;</a></span>netif_add_ip6_address()</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> netif_add_ip6_address </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ip6addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s8_t *&#160;</td>
+          <td class="paramname"><em>chosen_idx</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function allows for the easy addition of a new IPv6 address to an interface. It takes care of finding an empty slot and then sets the address tentative (to make sure that all the subsequent processing happens).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>netif to add the address on </td></tr>
+    <tr><td class="paramname">ip6addr</td><td>address to add </td></tr>
+    <tr><td class="paramname">chosen_idx</td><td>if != NULL, the chosen IPv6 address index will be stored here </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gae864211a5eb052deb5da7bc7e3427fb9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae864211a5eb052deb5da7bc7e3427fb9">&#9670;&nbsp;</a></span>netif_create_ip6_linklocal_address()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_create_ip6_linklocal_address </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>from_mac_48bit</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create a link-local IPv6 address on a netif (stored in slot 0)</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the netif to create the address on </td></tr>
+    <tr><td class="paramname">from_mac_48bit</td><td>if != 0, assume hwadr is a 48-bit MAC address (std conversion) if == 0, use hwaddr directly as interface ID </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gae21572fdbd8664d22a1b281a6c31c9bb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae21572fdbd8664d22a1b281a6c31c9bb">&#9670;&nbsp;</a></span>netif_ip6_addr_set()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_ip6_addr_set </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s8_t&#160;</td>
+          <td class="paramname"><em>addr_idx</em>, </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> *&#160;</td>
+          <td class="paramname"><em>addr6</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Change an IPv6 address of a network interface</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the network interface to change </td></tr>
+    <tr><td class="paramname">addr_idx</td><td>index of the IPv6 address </td></tr>
+    <tr><td class="paramname">addr6</td><td>the new IPv6 address</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>call <a class="el" href="group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f">netif_ip6_addr_set_state()</a> to set the address valid/temptative </dd></dl>
+
+</div>
+</div>
+<a id="ga9cde7286535c7f037a9b16052561b91f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9cde7286535c7f037a9b16052561b91f">&#9670;&nbsp;</a></span>netif_ip6_addr_set_state()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_ip6_addr_set_state </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s8_t&#160;</td>
+          <td class="paramname"><em>addr_idx</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>state</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Change the state of an IPv6 address of a network interface (INVALID, TEMPTATIVE, PREFERRED, DEPRECATED, where TEMPTATIVE includes the number of checks done, see <a class="el" href="ip6__addr_8h.html">ip6_addr.h</a>)</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the network interface to change </td></tr>
+    <tr><td class="paramname">addr_idx</td><td>index of the IPv6 address </td></tr>
+    <tr><td class="paramname">state</td><td>the new IPv6 address state </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netif__ip6.js b/doc/doxygen/output/html/group__netif__ip6.js
new file mode 100644
index 0000000..a044005
--- /dev/null
+++ b/doc/doxygen/output/html/group__netif__ip6.js
@@ -0,0 +1,9 @@
+var group__netif__ip6 =
+[
+    [ "netif_ip6_addr", "group__netif__ip6.html#ga7ec0623f1a858a0cdb187beaa89df365", null ],
+    [ "netif_ip_addr6", "group__netif__ip6.html#gae424e336fe9f013b30d4065fd35c91ee", null ],
+    [ "netif_add_ip6_address", "group__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327", null ],
+    [ "netif_create_ip6_linklocal_address", "group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9", null ],
+    [ "netif_ip6_addr_set", "group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb", null ],
+    [ "netif_ip6_addr_set_state", "group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netif__mib2.html b/doc/doxygen/output/html/group__netif__mib2.html
new file mode 100644
index 0000000..6810be0
--- /dev/null
+++ b/doc/doxygen/output/html/group__netif__mib2.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: MIB2 statistics</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netif__mib2.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#enum-members">Enumerations</a>  </div>
+  <div class="headertitle">
+<div class="title">MIB2 statistics<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__netif.html">Network interface (NETIF)</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structstats__mib2__netif__ctrs.html">stats_mib2_netif_ctrs</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga3c52caf566d37705c6547f2d025afd9f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f">MIB2_STATS_NETIF_INC</a>(n,  x)&#160;&#160;&#160;do { ++(n)-&gt;mib2_counters.x; } while(0)</td></tr>
+<tr class="separator:ga3c52caf566d37705c6547f2d025afd9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga05641438775014b7e13b9e55eba48bed"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__mib2.html#ga05641438775014b7e13b9e55eba48bed">MIB2_STATS_NETIF_ADD</a>(n,  x,  val)&#160;&#160;&#160;do { (n)-&gt;mib2_counters.x += (val); } while(0)</td></tr>
+<tr class="separator:ga05641438775014b7e13b9e55eba48bed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5be1b8cba1d67bf6e7f8851ec91b10f0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__mib2.html#ga5be1b8cba1d67bf6e7f8851ec91b10f0">MIB2_INIT_NETIF</a>(<a class="el" href="structnetif.html">netif</a>,  type,  speed)</td></tr>
+<tr class="separator:ga5be1b8cba1d67bf6e7f8851ec91b10f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga15378b8dcd2a9dc2985142d864a767ba"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__mib2.html#ga15378b8dcd2a9dc2985142d864a767ba">snmp_ifType</a> </td></tr>
+<tr class="separator:ga15378b8dcd2a9dc2985142d864a767ba"><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="ga5be1b8cba1d67bf6e7f8851ec91b10f0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5be1b8cba1d67bf6e7f8851ec91b10f0">&#9670;&nbsp;</a></span>MIB2_INIT_NETIF</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MIB2_INIT_NETIF</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">type, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">speed&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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> { \</div><div class="line">  (<a class="code" href="structnetif.html">netif</a>)-&gt;<a class="code" href="structnetif.html#ad0ee2a2169e384a2977ece2c471e0062">link_type</a> = (type);  \</div><div class="line">  (<a class="code" href="structnetif.html">netif</a>)-&gt;<a class="code" href="structnetif.html#a908452e854180941054ed89f52bb8094">link_speed</a> = (speed);\</div><div class="line">  (<a class="code" href="structnetif.html">netif</a>)-&gt;<a class="code" href="structnetif.html#a1bb4e3aed6e0fd4b6b31ee82d806f971">ts</a> = 0;              \</div><div class="line">  (<a class="code" href="structnetif.html">netif</a>)-&gt;<a class="code" href="structnetif.html#ab32cbe1851154fd020bac4be558f5fd5">mib2_counters</a>.<a class="code" href="structstats__mib2__netif__ctrs.html#a7e9ddf9b4a17748a9d3f041c1d24ba8e">ifinoctets</a> = 0;      \</div><div class="line">  (<a class="code" href="structnetif.html">netif</a>)-&gt;mib2_counters.ifinucastpkts = 0;   \</div><div class="line">  (<a class="code" href="structnetif.html">netif</a>)-&gt;<a class="code" href="structnetif.html#ab32cbe1851154fd020bac4be558f5fd5">mib2_counters</a>.<a class="code" href="structstats__mib2__netif__ctrs.html#a111f08290b3c6944108237cefba066dd">ifinnucastpkts</a> = 0;  \</div><div class="line">  (<a class="code" href="structnetif.html">netif</a>)-&gt;mib2_counters.ifindiscards = 0;    \</div><div class="line">  (<a class="code" href="structnetif.html">netif</a>)-&gt;<a class="code" href="structnetif.html#ab32cbe1851154fd020bac4be558f5fd5">mib2_counters</a>.<a class="code" href="structstats__mib2__netif__ctrs.html#afda1a14dc79bb65a33f97f9fb467ec1d">ifinerrors</a> = 0;    \</div><div class="line">  (<a class="code" href="structnetif.html">netif</a>)-&gt;mib2_counters.ifinunknownprotos = 0;    \</div><div class="line">  (<a class="code" href="structnetif.html">netif</a>)-&gt;<a class="code" href="structnetif.html#ab32cbe1851154fd020bac4be558f5fd5">mib2_counters</a>.<a class="code" href="structstats__mib2__netif__ctrs.html#a24151d13a55452518e5f7832f48bd5a7">ifoutoctets</a> = 0;     \</div><div class="line">  (<a class="code" href="structnetif.html">netif</a>)-&gt;mib2_counters.ifoutucastpkts = 0;  \</div><div class="line">  (<a class="code" href="structnetif.html">netif</a>)-&gt;<a class="code" href="structnetif.html#ab32cbe1851154fd020bac4be558f5fd5">mib2_counters</a>.<a class="code" href="structstats__mib2__netif__ctrs.html#afd3264670c39cc0d721a35cb6650f8d7">ifoutnucastpkts</a> = 0; \</div><div class="line">  (<a class="code" href="structnetif.html">netif</a>)-&gt;mib2_counters.ifoutdiscards = 0; \</div><div class="line">  (<a class="code" href="structnetif.html">netif</a>)-&gt;<a class="code" href="structnetif.html#ab32cbe1851154fd020bac4be558f5fd5">mib2_counters</a>.<a class="code" href="structstats__mib2__netif__ctrs.html#a91b60bb78759c9b655a74bb4fae3346e">ifouterrors</a> = 0; } <span class="keywordflow">while</span>(0)</div><div class="ttc" id="structstats__mib2__netif__ctrs_html_a24151d13a55452518e5f7832f48bd5a7"><div class="ttname"><a href="structstats__mib2__netif__ctrs.html#a24151d13a55452518e5f7832f48bd5a7">stats_mib2_netif_ctrs::ifoutoctets</a></div><div class="ttdeci">u32_t ifoutoctets</div><div class="ttdef"><b>Definition:</b> stats.h:212</div></div>
+<div class="ttc" id="structstats__mib2__netif__ctrs_html_a111f08290b3c6944108237cefba066dd"><div class="ttname"><a href="structstats__mib2__netif__ctrs.html#a111f08290b3c6944108237cefba066dd">stats_mib2_netif_ctrs::ifinnucastpkts</a></div><div class="ttdeci">u32_t ifinnucastpkts</div><div class="ttdef"><b>Definition:</b> stats.h:194</div></div>
+<div class="ttc" id="structnetif_html_ad0ee2a2169e384a2977ece2c471e0062"><div class="ttname"><a href="structnetif.html#ad0ee2a2169e384a2977ece2c471e0062">netif::link_type</a></div><div class="ttdeci">u8_t link_type</div><div class="ttdef"><b>Definition:</b> netif.h:361</div></div>
+<div class="ttc" id="structnetif_html_a1bb4e3aed6e0fd4b6b31ee82d806f971"><div class="ttname"><a href="structnetif.html#a1bb4e3aed6e0fd4b6b31ee82d806f971">netif::ts</a></div><div class="ttdeci">u32_t ts</div><div class="ttdef"><b>Definition:</b> netif.h:365</div></div>
+<div class="ttc" id="structstats__mib2__netif__ctrs_html_a91b60bb78759c9b655a74bb4fae3346e"><div class="ttname"><a href="structstats__mib2__netif__ctrs.html#a91b60bb78759c9b655a74bb4fae3346e">stats_mib2_netif_ctrs::ifouterrors</a></div><div class="ttdeci">u32_t ifouterrors</div><div class="ttdef"><b>Definition:</b> stats.h:228</div></div>
+<div class="ttc" id="structstats__mib2__netif__ctrs_html_afd3264670c39cc0d721a35cb6650f8d7"><div class="ttname"><a href="structstats__mib2__netif__ctrs.html#afd3264670c39cc0d721a35cb6650f8d7">stats_mib2_netif_ctrs::ifoutnucastpkts</a></div><div class="ttdeci">u32_t ifoutnucastpkts</div><div class="ttdef"><b>Definition:</b> stats.h:220</div></div>
+<div class="ttc" id="structnetif_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="structnetif_html_a908452e854180941054ed89f52bb8094"><div class="ttname"><a href="structnetif.html#a908452e854180941054ed89f52bb8094">netif::link_speed</a></div><div class="ttdeci">u32_t link_speed</div><div class="ttdef"><b>Definition:</b> netif.h:363</div></div>
+<div class="ttc" id="structstats__mib2__netif__ctrs_html_afda1a14dc79bb65a33f97f9fb467ec1d"><div class="ttname"><a href="structstats__mib2__netif__ctrs.html#afda1a14dc79bb65a33f97f9fb467ec1d">stats_mib2_netif_ctrs::ifinerrors</a></div><div class="ttdeci">u32_t ifinerrors</div><div class="ttdef"><b>Definition:</b> stats.h:203</div></div>
+<div class="ttc" id="structnetif_html_ab32cbe1851154fd020bac4be558f5fd5"><div class="ttname"><a href="structnetif.html#ab32cbe1851154fd020bac4be558f5fd5">netif::mib2_counters</a></div><div class="ttdeci">struct stats_mib2_netif_ctrs mib2_counters</div><div class="ttdef"><b>Definition:</b> netif.h:367</div></div>
+<div class="ttc" id="structstats__mib2__netif__ctrs_html_a7e9ddf9b4a17748a9d3f041c1d24ba8e"><div class="ttname"><a href="structstats__mib2__netif__ctrs.html#a7e9ddf9b4a17748a9d3f041c1d24ba8e">stats_mib2_netif_ctrs::ifinoctets</a></div><div class="ttdeci">u32_t ifinoctets</div><div class="ttdef"><b>Definition:</b> stats.h:188</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>
+    <tr><td class="paramname">type</td><td>one of enum <a class="el" href="group__netif__mib2.html#ga15378b8dcd2a9dc2985142d864a767ba">snmp_ifType</a> </td></tr>
+    <tr><td class="paramname">speed</td><td>your link speed here (units: bits per second) </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga05641438775014b7e13b9e55eba48bed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga05641438775014b7e13b9e55eba48bed">&#9670;&nbsp;</a></span>MIB2_STATS_NETIF_ADD</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MIB2_STATS_NETIF_ADD</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">x, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">val&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;do { (n)-&gt;mib2_counters.x += (val); } while(0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add value to stats member for SNMP MIB2 stats (struct <a class="el" href="structstats__mib2__netif__ctrs.html">stats_mib2_netif_ctrs</a>) </p>
+
+</div>
+</div>
+<a id="ga3c52caf566d37705c6547f2d025afd9f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3c52caf566d37705c6547f2d025afd9f">&#9670;&nbsp;</a></span>MIB2_STATS_NETIF_INC</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MIB2_STATS_NETIF_INC</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">x&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;do { ++(n)-&gt;mib2_counters.x; } while(0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Increment stats member for SNMP MIB2 stats (struct <a class="el" href="structstats__mib2__netif__ctrs.html">stats_mib2_netif_ctrs</a>) </p>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="ga15378b8dcd2a9dc2985142d864a767ba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga15378b8dcd2a9dc2985142d864a767ba">&#9670;&nbsp;</a></span>snmp_ifType</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__netif__mib2.html#ga15378b8dcd2a9dc2985142d864a767ba">snmp_ifType</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd>RFC1213, "MIB-II, 6. Definitions" </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netif__mib2.js b/doc/doxygen/output/html/group__netif__mib2.js
new file mode 100644
index 0000000..ca2d118
--- /dev/null
+++ b/doc/doxygen/output/html/group__netif__mib2.js
@@ -0,0 +1,20 @@
+var group__netif__mib2 =
+[
+    [ "stats_mib2_netif_ctrs", "structstats__mib2__netif__ctrs.html", [
+      [ "ifindiscards", "structstats__mib2__netif__ctrs.html#a4a767e6b835d5ad2f9b73751de2b0947", null ],
+      [ "ifinerrors", "structstats__mib2__netif__ctrs.html#afda1a14dc79bb65a33f97f9fb467ec1d", null ],
+      [ "ifinnucastpkts", "structstats__mib2__netif__ctrs.html#a111f08290b3c6944108237cefba066dd", null ],
+      [ "ifinoctets", "structstats__mib2__netif__ctrs.html#a7e9ddf9b4a17748a9d3f041c1d24ba8e", null ],
+      [ "ifinucastpkts", "structstats__mib2__netif__ctrs.html#a9ed42d6329a9616669ba21789fa001d8", null ],
+      [ "ifinunknownprotos", "structstats__mib2__netif__ctrs.html#ac34eb01b42f22b1e49ca7c9734e737aa", null ],
+      [ "ifoutdiscards", "structstats__mib2__netif__ctrs.html#a3a2aec508fd4466ca8bab10d8dc2c842", null ],
+      [ "ifouterrors", "structstats__mib2__netif__ctrs.html#a91b60bb78759c9b655a74bb4fae3346e", null ],
+      [ "ifoutnucastpkts", "structstats__mib2__netif__ctrs.html#afd3264670c39cc0d721a35cb6650f8d7", null ],
+      [ "ifoutoctets", "structstats__mib2__netif__ctrs.html#a24151d13a55452518e5f7832f48bd5a7", null ],
+      [ "ifoutucastpkts", "structstats__mib2__netif__ctrs.html#a24aba9660a2951027b23d4118b57c471", null ]
+    ] ],
+    [ "MIB2_INIT_NETIF", "group__netif__mib2.html#ga5be1b8cba1d67bf6e7f8851ec91b10f0", null ],
+    [ "MIB2_STATS_NETIF_ADD", "group__netif__mib2.html#ga05641438775014b7e13b9e55eba48bed", null ],
+    [ "MIB2_STATS_NETIF_INC", "group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f", null ],
+    [ "snmp_ifType", "group__netif__mib2.html#ga15378b8dcd2a9dc2985142d864a767ba", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netifapi.html b/doc/doxygen/output/html/group__netifapi.html
new file mode 100644
index 0000000..f6c4ea9
--- /dev/null
+++ b/doc/doxygen/output/html/group__netifapi.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: NETIF API</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netifapi.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">NETIF API<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__netifapi__netif"><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:group__netifapi__dhcp4"><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:group__netifapi__autoip"><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>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Thread-safe functions to be called from non-TCPIP threads </p>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netifapi.js b/doc/doxygen/output/html/group__netifapi.js
new file mode 100644
index 0000000..9625227
--- /dev/null
+++ b/doc/doxygen/output/html/group__netifapi.js
@@ -0,0 +1,6 @@
+var group__netifapi =
+[
+    [ "NETIF related", "group__netifapi__netif.html", "group__netifapi__netif" ],
+    [ "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__autoip.html b/doc/doxygen/output/html/group__netifapi__autoip.html
new file mode 100644
index 0000000..2bff1b5
--- /dev/null
+++ b/doc/doxygen/output/html/group__netifapi__autoip.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: AUTOIP</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netifapi__autoip.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">AUTOIP<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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gaca26bae2a21e0732a7599df14f880af2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__autoip.html#gaca26bae2a21e0732a7599df14f880af2">netifapi_autoip_start</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="el" href="group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8">autoip_start</a>)</td></tr>
+<tr class="separator:gaca26bae2a21e0732a7599df14f880af2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae604f96907a52557e4ebd1bd5d80071d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__autoip.html#gae604f96907a52557e4ebd1bd5d80071d">netifapi_autoip_stop</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="el" href="group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4">autoip_stop</a>)</td></tr>
+<tr class="separator:gae604f96907a52557e4ebd1bd5d80071d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>To be called from non-TCPIP threads </p>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="gaca26bae2a21e0732a7599df14f880af2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaca26bae2a21e0732a7599df14f880af2">&#9670;&nbsp;</a></span>netifapi_autoip_start</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netifapi_autoip_start</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="el" href="group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8">autoip_start</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8">autoip_start()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gae604f96907a52557e4ebd1bd5d80071d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae604f96907a52557e4ebd1bd5d80071d">&#9670;&nbsp;</a></span>netifapi_autoip_stop</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netifapi_autoip_stop</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="el" href="group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4">autoip_stop</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4">autoip_stop()</a> </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netifapi__autoip.js b/doc/doxygen/output/html/group__netifapi__autoip.js
new file mode 100644
index 0000000..700c993
--- /dev/null
+++ b/doc/doxygen/output/html/group__netifapi__autoip.js
@@ -0,0 +1,5 @@
+var group__netifapi__autoip =
+[
+    [ "netifapi_autoip_start", "group__netifapi__autoip.html#gaca26bae2a21e0732a7599df14f880af2", null ],
+    [ "netifapi_autoip_stop", "group__netifapi__autoip.html#gae604f96907a52557e4ebd1bd5d80071d", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netifapi__dhcp4.html b/doc/doxygen/output/html/group__netifapi__dhcp4.html
new file mode 100644
index 0000000..b588d6d
--- /dev/null
+++ b/doc/doxygen/output/html/group__netifapi__dhcp4.html
@@ -0,0 +1,234 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: DHCPv4</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netifapi__dhcp4.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">DHCPv4<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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gae64d13afc6e3b0f21aae04b66d0e3765"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__dhcp4.html#gae64d13afc6e3b0f21aae04b66d0e3765">netifapi_dhcp_start</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="el" href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp_start</a>)</td></tr>
+<tr class="separator:gae64d13afc6e3b0f21aae04b66d0e3765"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2322c0d0e3eb6c1097d6f3942905dbd5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__dhcp4.html#ga2322c0d0e3eb6c1097d6f3942905dbd5">netifapi_dhcp_stop</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312">dhcp_stop</a>, NULL)</td></tr>
+<tr class="separator:ga2322c0d0e3eb6c1097d6f3942905dbd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga29108975e9aa6463b9a574de961317e0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__dhcp4.html#ga29108975e9aa6463b9a574de961317e0">netifapi_dhcp_inform</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad">dhcp_inform</a>, NULL)</td></tr>
+<tr class="separator:ga29108975e9aa6463b9a574de961317e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga642390e5efa53ad3095e01331c6a936b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__dhcp4.html#ga642390e5efa53ad3095e01331c6a936b">netifapi_dhcp_renew</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="el" href="group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947">dhcp_renew</a>)</td></tr>
+<tr class="separator:ga642390e5efa53ad3095e01331c6a936b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5aeaee24c11128df90a56fe091c9d409"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__dhcp4.html#ga5aeaee24c11128df90a56fe091c9d409">netifapi_dhcp_release</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="el" href="group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4">dhcp_release</a>)</td></tr>
+<tr class="separator:ga5aeaee24c11128df90a56fe091c9d409"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1971af04f882f5afdb3ade454a680134"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134">netifapi_dhcp_release_and_stop</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp_release_and_stop</a>, NULL)</td></tr>
+<tr class="separator:ga1971af04f882f5afdb3ade454a680134"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>To be called from non-TCPIP threads </p>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga29108975e9aa6463b9a574de961317e0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga29108975e9aa6463b9a574de961317e0">&#9670;&nbsp;</a></span>netifapi_dhcp_inform</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netifapi_dhcp_inform</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad">dhcp_inform</a>, NULL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad">dhcp_inform()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga5aeaee24c11128df90a56fe091c9d409"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5aeaee24c11128df90a56fe091c9d409">&#9670;&nbsp;</a></span>netifapi_dhcp_release</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netifapi_dhcp_release</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="el" href="group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4">dhcp_release</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000004">Deprecated:</a></b></dt><dd>Use <a class="el" href="group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134">netifapi_dhcp_release_and_stop()</a> instead. </dd></dl>
+
+</div>
+</div>
+<a id="ga1971af04f882f5afdb3ade454a680134"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1971af04f882f5afdb3ade454a680134">&#9670;&nbsp;</a></span>netifapi_dhcp_release_and_stop</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netifapi_dhcp_release_and_stop</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp_release_and_stop</a>, NULL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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>
+</div>
+<a id="ga642390e5efa53ad3095e01331c6a936b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga642390e5efa53ad3095e01331c6a936b">&#9670;&nbsp;</a></span>netifapi_dhcp_renew</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netifapi_dhcp_renew</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="el" href="group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947">dhcp_renew</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947">dhcp_renew()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gae64d13afc6e3b0f21aae04b66d0e3765"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae64d13afc6e3b0f21aae04b66d0e3765">&#9670;&nbsp;</a></span>netifapi_dhcp_start</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netifapi_dhcp_start</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="el" href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp_start</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp_start()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga2322c0d0e3eb6c1097d6f3942905dbd5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2322c0d0e3eb6c1097d6f3942905dbd5">&#9670;&nbsp;</a></span>netifapi_dhcp_stop</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netifapi_dhcp_stop</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312">dhcp_stop</a>, NULL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000003">Deprecated:</a></b></dt><dd>Use <a class="el" href="group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134">netifapi_dhcp_release_and_stop()</a> instead. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netifapi__dhcp4.js b/doc/doxygen/output/html/group__netifapi__dhcp4.js
new file mode 100644
index 0000000..60cb778
--- /dev/null
+++ b/doc/doxygen/output/html/group__netifapi__dhcp4.js
@@ -0,0 +1,9 @@
+var group__netifapi__dhcp4 =
+[
+    [ "netifapi_dhcp_inform", "group__netifapi__dhcp4.html#ga29108975e9aa6463b9a574de961317e0", null ],
+    [ "netifapi_dhcp_release", "group__netifapi__dhcp4.html#ga5aeaee24c11128df90a56fe091c9d409", null ],
+    [ "netifapi_dhcp_release_and_stop", "group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134", null ],
+    [ "netifapi_dhcp_renew", "group__netifapi__dhcp4.html#ga642390e5efa53ad3095e01331c6a936b", null ],
+    [ "netifapi_dhcp_start", "group__netifapi__dhcp4.html#gae64d13afc6e3b0f21aae04b66d0e3765", null ],
+    [ "netifapi_dhcp_stop", "group__netifapi__dhcp4.html#ga2322c0d0e3eb6c1097d6f3942905dbd5", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netifapi__netif.html b/doc/doxygen/output/html/group__netifapi__netif.html
new file mode 100644
index 0000000..3bc29c8
--- /dev/null
+++ b/doc/doxygen/output/html/group__netifapi__netif.html
@@ -0,0 +1,423 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: NETIF related</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netifapi__netif.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">NETIF related<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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga0e3f522b900a0ba04421c4587e790373"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__netif.html#ga0e3f522b900a0ba04421c4587e790373">netifapi_netif_remove</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979">netif_remove</a>, NULL)</td></tr>
+<tr class="separator:ga0e3f522b900a0ba04421c4587e790373"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6ce735fe79efe1739e53b7f0e975ac76"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__netif.html#ga6ce735fe79efe1739e53b7f0e975ac76">netifapi_netif_set_up</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up</a>, NULL)</td></tr>
+<tr class="separator:ga6ce735fe79efe1739e53b7f0e975ac76"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga22c02edde32743ccfd41924da0601a16"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__netif.html#ga22c02edde32743ccfd41924da0601a16">netifapi_netif_set_down</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf">netif_set_down</a>, NULL)</td></tr>
+<tr class="separator:ga22c02edde32743ccfd41924da0601a16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga862d6cfa5d36b2c36d7b1671e8d95ccf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__netif.html#ga862d6cfa5d36b2c36d7b1671e8d95ccf">netifapi_netif_set_default</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif_set_default</a>, NULL)</td></tr>
+<tr class="separator:ga862d6cfa5d36b2c36d7b1671e8d95ccf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac054a60a32447019913d34da63924853"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__netif.html#gac054a60a32447019913d34da63924853">netifapi_netif_set_link_up</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_link_up</a>, NULL)</td></tr>
+<tr class="separator:gac054a60a32447019913d34da63924853"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2a9694804743f5466c4ecc400b7f07e4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__netif.html#ga2a9694804743f5466c4ecc400b7f07e4">netifapi_netif_set_link_down</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#ga34e37a1e8e358760dc1c43887922c7db">netif_set_link_down</a>, NULL)</td></tr>
+<tr class="separator:ga2a9694804743f5466c4ecc400b7f07e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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"><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>
+<tr class="separator:ga31755ea6dbb213236bfce19bcbe8c973"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad4a821182d01eafa4ca258f958fcb089"><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#gad4a821182d01eafa4ca258f958fcb089">netifapi_netif_name_to_index</a> (const char *name, u8_t *idx)</td></tr>
+<tr class="separator:gad4a821182d01eafa4ca258f958fcb089"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab7914d77d0a89fd6c31048feb0bdafb6"><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#gab7914d77d0a89fd6c31048feb0bdafb6">netifapi_netif_index_to_name</a> (u8_t idx, char *name)</td></tr>
+<tr class="separator:gab7914d77d0a89fd6c31048feb0bdafb6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>To be called from non-TCPIP threads </p>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga0e3f522b900a0ba04421c4587e790373"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0e3f522b900a0ba04421c4587e790373">&#9670;&nbsp;</a></span>netifapi_netif_remove</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netifapi_netif_remove</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979">netif_remove</a>, NULL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979">netif_remove()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga862d6cfa5d36b2c36d7b1671e8d95ccf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga862d6cfa5d36b2c36d7b1671e8d95ccf">&#9670;&nbsp;</a></span>netifapi_netif_set_default</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netifapi_netif_set_default</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif_set_default</a>, NULL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif_set_default()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga22c02edde32743ccfd41924da0601a16"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga22c02edde32743ccfd41924da0601a16">&#9670;&nbsp;</a></span>netifapi_netif_set_down</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netifapi_netif_set_down</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf">netif_set_down</a>, NULL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf">netif_set_down()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga2a9694804743f5466c4ecc400b7f07e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2a9694804743f5466c4ecc400b7f07e4">&#9670;&nbsp;</a></span>netifapi_netif_set_link_down</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netifapi_netif_set_link_down</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#ga34e37a1e8e358760dc1c43887922c7db">netif_set_link_down</a>, NULL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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>
+</div>
+<a id="gac054a60a32447019913d34da63924853"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac054a60a32447019913d34da63924853">&#9670;&nbsp;</a></span>netifapi_netif_set_link_up</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netifapi_netif_set_link_up</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_link_up</a>, NULL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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>
+</div>
+<a id="ga6ce735fe79efe1739e53b7f0e975ac76"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6ce735fe79efe1739e53b7f0e975ac76">&#9670;&nbsp;</a></span>netifapi_netif_set_up</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netifapi_netif_set_up</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up</a>, NULL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up()</a> </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gacc063c5a3071e34eec7376651e35a519"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacc063c5a3071e34eec7376651e35a519">&#9670;&nbsp;</a></span>netifapi_netif_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_netif_add </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </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> *&#160;</td>
+          <td class="paramname"><em>netmask</em>, </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> *&#160;</td>
+          <td class="paramname"><em>gw</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>state</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5">netif_init_fn</a>&#160;</td>
+          <td class="paramname"><em>init</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e">netif_input_fn</a>&#160;</td>
+          <td class="paramname"><em>input</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Call <a class="el" href="group__netif.html#gade5498543e74067f28cc6bef0209e3be">netif_add()</a> in a thread-safe way by running that function inside the tcpip_thread context.</p>
+<dl class="section note"><dt>Note</dt><dd>for params </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__netif.html#gade5498543e74067f28cc6bef0209e3be">netif_add()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gab7914d77d0a89fd6c31048feb0bdafb6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab7914d77d0a89fd6c31048feb0bdafb6">&#9670;&nbsp;</a></span>netifapi_netif_index_to_name()</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_netif_index_to_name </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>idx</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>name</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Call <a class="el" href="group__netif.html#ga3ff104d083914e87a7805a0b90a85755">netif_index_to_name()</a> in a thread-safe way by running that function inside the tcpip_thread context.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">idx</td><td>the interface index of the netif </td></tr>
+    <tr><td class="paramname">name</td><td>output name of the found netif, empty '\0' string if netif not found. name should be of at least NETIF_NAMESIZE bytes</td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gad4a821182d01eafa4ca258f958fcb089"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad4a821182d01eafa4ca258f958fcb089">&#9670;&nbsp;</a></span>netifapi_netif_name_to_index()</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_netif_name_to_index </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t *&#160;</td>
+          <td class="paramname"><em>idx</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Call <a class="el" href="group__netif.html#gac763a1f647fb9e8af4254418e813a6ae">netif_name_to_index()</a> in a thread-safe way by running that function inside the tcpip_thread context.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">name</td><td>the interface name of the netif </td></tr>
+    <tr><td class="paramname">idx</td><td>output index of the found netif</td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga31755ea6dbb213236bfce19bcbe8c973"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga31755ea6dbb213236bfce19bcbe8c973">&#9670;&nbsp;</a></span>netifapi_netif_set_addr()</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_netif_set_addr </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </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> *&#160;</td>
+          <td class="paramname"><em>netmask</em>, </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> *&#160;</td>
+          <td class="paramname"><em>gw</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Call <a class="el" href="group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1">netif_set_addr()</a> in a thread-safe way by running that function inside the tcpip_thread context.</p>
+<dl class="section note"><dt>Note</dt><dd>for params </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1">netif_set_addr()</a> </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netifapi__netif.js b/doc/doxygen/output/html/group__netifapi__netif.js
new file mode 100644
index 0000000..bde3b69
--- /dev/null
+++ b/doc/doxygen/output/html/group__netifapi__netif.js
@@ -0,0 +1,13 @@
+var group__netifapi__netif =
+[
+    [ "netifapi_netif_remove", "group__netifapi__netif.html#ga0e3f522b900a0ba04421c4587e790373", null ],
+    [ "netifapi_netif_set_default", "group__netifapi__netif.html#ga862d6cfa5d36b2c36d7b1671e8d95ccf", null ],
+    [ "netifapi_netif_set_down", "group__netifapi__netif.html#ga22c02edde32743ccfd41924da0601a16", null ],
+    [ "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_netif_add", "group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519", null ],
+    [ "netifapi_netif_index_to_name", "group__netifapi__netif.html#gab7914d77d0a89fd6c31048feb0bdafb6", null ],
+    [ "netifapi_netif_name_to_index", "group__netifapi__netif.html#gad4a821182d01eafa4ca258f958fcb089", null ],
+    [ "netifapi_netif_set_addr", "group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netifs.html b/doc/doxygen/output/html/group__netifs.html
new file mode 100644
index 0000000..b8b26b5
--- /dev/null
+++ b/doc/doxygen/output/html/group__netifs.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: NETIFs</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__netifs.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">NETIFs</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__bridgeif"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__bridgeif.html">IEEE 802.1D bridge</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__sixlowpan"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sixlowpan.html">6LoWPAN (RFC4944)</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__rfc7668if"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__rfc7668if.html">6LoWPAN over BLE (RFC7668)</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__ppp"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ppp.html">PPP</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__slipif"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__slipif.html">SLIP</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__zepif"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__zepif.html">ZEP - ZigBee Encapsulation Protocol</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>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netifs.js b/doc/doxygen/output/html/group__netifs.js
new file mode 100644
index 0000000..ebf095a
--- /dev/null
+++ b/doc/doxygen/output/html/group__netifs.js
@@ -0,0 +1,9 @@
+var group__netifs =
+[
+    [ "IEEE 802.1D bridge", "group__bridgeif.html", "group__bridgeif" ],
+    [ "6LoWPAN (RFC4944)", "group__sixlowpan.html", "group__sixlowpan" ],
+    [ "6LoWPAN over BLE (RFC7668)", "group__rfc7668if.html", "group__rfc7668if" ],
+    [ "PPP", "group__ppp.html", null ],
+    [ "SLIP", "group__slipif.html", "group__slipif" ],
+    [ "ZEP - ZigBee Encapsulation Protocol", "group__zepif.html", "group__zepif" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__pbuf.html b/doc/doxygen/output/html/group__pbuf.html
new file mode 100644
index 0000000..7bac158
--- /dev/null
+++ b/doc/doxygen/output/html/group__pbuf.html
@@ -0,0 +1,1187 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Packet buffers (PBUF)</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__pbuf.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">Packet buffers (PBUF)<div class="ingroups"><a class="el" href="group__infrastructure.html">Infrastructure</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga894d91d811fd986f3cc3da828fa7beb3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga894d91d811fd986f3cc3da828fa7beb3">PBUF_NEEDS_COPY</a>(p)&#160;&#160;&#160;((p)-&gt;type_internal &amp; <a class="el" href="pbuf_8h.html#a02789ca67766def65000b58f7fe7d03b">PBUF_TYPE_FLAG_DATA_VOLATILE</a>)</td></tr>
+<tr class="separator:ga894d91d811fd986f3cc3da828fa7beb3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:gaee1baa59bb2f85ba575b5a8619ac1ebf"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a> { <br />
+&#160;&#160;<a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa2ded3594a3977f8bf9cf09552be327b5">PBUF_TRANSPORT</a> = 0 + (14 + 0 ) + 40 + 20, 
+<a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfafcc1e506061ba69dfa142eb6b3da5f13">PBUF_IP</a> = 0 + (14 + 0 ) + 40, 
+<a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfab4de441e737330558b609a990cd17346">PBUF_LINK</a> = 0 + (14 + 0 ), 
+<a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa0ff039585f05f9208bcb66c2d37783e2">PBUF_RAW_TX</a> = 0, 
+<br />
+&#160;&#160;<a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba">PBUF_RAW</a> = 0
+<br />
+ }</td></tr>
+<tr class="separator:gaee1baa59bb2f85ba575b5a8619ac1ebf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab7e0e32fcc292c0d7107721766ed92fb"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a> { <a class="el" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac5e9f28455bca98944a030d4b84ecfab">PBUF_RAM</a> = ( 0x0200 | 0x80 | 0x00 ), 
+<a class="el" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac120b0fe39efe35bb682e4aa3b82e2c9">PBUF_ROM</a> = 0x01, 
+<a class="el" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac9b6ba960fdea6f2e8f35c8313b77e4e">PBUF_REF</a> = ( 0x40 | 0x01 ), 
+<a class="el" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbae969347127387b9b59a23ccd24b76d21">PBUF_POOL</a> = ( 0x0100 | 0x80 | 0x02 )
+ }</td></tr>
+<tr class="separator:gab7e0e32fcc292c0d7107721766ed92fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gacfcb0a2af918658ba0afe36499c65f47"><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="group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47">pbuf_alloc</a> (<a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a> layer, u16_t length, <a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a> type)</td></tr>
+<tr class="separator:gacfcb0a2af918658ba0afe36499c65f47"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4caa46c6d560d9d0da2be845bc9c2fab"><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="group__pbuf.html#ga4caa46c6d560d9d0da2be845bc9c2fab">pbuf_alloc_reference</a> (void *payload, u16_t length, <a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a> type)</td></tr>
+<tr class="separator:ga4caa46c6d560d9d0da2be845bc9c2fab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga90fa2bbf6ea4a263ee8f7b77c75683c2"><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="group__pbuf.html#ga90fa2bbf6ea4a263ee8f7b77c75683c2">pbuf_alloced_custom</a> (<a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a> l, u16_t length, <a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a> type, struct <a class="el" href="structpbuf__custom.html">pbuf_custom</a> *p, void *payload_mem, u16_t payload_mem_len)</td></tr>
+<tr class="separator:ga90fa2bbf6ea4a263ee8f7b77c75683c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga50abfe830a33a1a47a562febee66015d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga50abfe830a33a1a47a562febee66015d">pbuf_realloc</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t new_len)</td></tr>
+<tr class="separator:ga50abfe830a33a1a47a562febee66015d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab0dd696fb4b6bc65e548944584f1738b"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf_free</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:gab0dd696fb4b6bc65e548944584f1738b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga77f6bbd69e45e542014d9c547c7da74e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e">pbuf_ref</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:ga77f6bbd69e45e542014d9c547c7da74e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga82429084fe29015509c9b4a072707cd4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga82429084fe29015509c9b4a072707cd4">pbuf_cat</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *h, struct <a class="el" href="structpbuf.html">pbuf</a> *t)</td></tr>
+<tr class="separator:ga82429084fe29015509c9b4a072707cd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga831c9a72bda1d3bd4c7b96f5a0e3b891"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891">pbuf_chain</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *h, struct <a class="el" href="structpbuf.html">pbuf</a> *t)</td></tr>
+<tr class="separator:ga831c9a72bda1d3bd4c7b96f5a0e3b891"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaba88511dee3df4b631fde691f421320d"><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__pbuf.html#gaba88511dee3df4b631fde691f421320d">pbuf_copy</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p_to, const struct <a class="el" href="structpbuf.html">pbuf</a> *p_from)</td></tr>
+<tr class="separator:gaba88511dee3df4b631fde691f421320d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac2f1f58fd36042e82af46f5015720899"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#gac2f1f58fd36042e82af46f5015720899">pbuf_copy_partial</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *buf, void *dataptr, u16_t len, u16_t offset)</td></tr>
+<tr class="separator:gac2f1f58fd36042e82af46f5015720899"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad0357ae0be17b2aacd0c301cdc86fc39"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#gad0357ae0be17b2aacd0c301cdc86fc39">pbuf_get_contiguous</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, void *buffer, size_t bufsize, u16_t len, u16_t offset)</td></tr>
+<tr class="separator:gad0357ae0be17b2aacd0c301cdc86fc39"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6a961522d81f0327aaf4d4ee6d96c583"><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="group__pbuf.html#ga6a961522d81f0327aaf4d4ee6d96c583">pbuf_skip</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *in, u16_t in_offset, u16_t *out_offset)</td></tr>
+<tr class="separator:ga6a961522d81f0327aaf4d4ee6d96c583"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad1e31e370271335b197272af2724ca85"><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__pbuf.html#gad1e31e370271335b197272af2724ca85">pbuf_take</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *buf, const void *dataptr, u16_t len)</td></tr>
+<tr class="separator:gad1e31e370271335b197272af2724ca85"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae1cf2bf7454ff87ff377b0b2262f9b44"><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__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44">pbuf_take_at</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *buf, const void *dataptr, u16_t len, u16_t offset)</td></tr>
+<tr class="separator:gae1cf2bf7454ff87ff377b0b2262f9b44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga54ac7b116c6f53c704cbf74f35a8b35c"><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="group__pbuf.html#ga54ac7b116c6f53c704cbf74f35a8b35c">pbuf_coalesce</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, <a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a> layer)</td></tr>
+<tr class="separator:ga54ac7b116c6f53c704cbf74f35a8b35c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafdb04fb0f37f0422fd44ec0fcec8ebd0"><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="group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0">pbuf_clone</a> (<a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a> layer, <a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a> type, struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:gafdb04fb0f37f0422fd44ec0fcec8ebd0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6d803d9945bffb7ad97743f2fa503da6"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6">pbuf_get_at</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t offset)</td></tr>
+<tr class="separator:ga6d803d9945bffb7ad97743f2fa503da6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga839f342803b0cf89049744124c5a98ad"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga839f342803b0cf89049744124c5a98ad">pbuf_try_get_at</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t offset)</td></tr>
+<tr class="separator:ga839f342803b0cf89049744124c5a98ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf76863707dc02993eae116574b1ea03f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#gaf76863707dc02993eae116574b1ea03f">pbuf_put_at</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t offset, u8_t data)</td></tr>
+<tr class="separator:gaf76863707dc02993eae116574b1ea03f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2170ccbbb13238380dbb203ee1b85974"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974">pbuf_memcmp</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t offset, const void *s2, u16_t n)</td></tr>
+<tr class="separator:ga2170ccbbb13238380dbb203ee1b85974"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga18c164a6e4a24d89ea9eb7571a886448"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448">pbuf_memfind</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, const void *<a class="el" href="structmem.html">mem</a>, u16_t mem_len, u16_t start_offset)</td></tr>
+<tr class="separator:ga18c164a6e4a24d89ea9eb7571a886448"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Packets are built from the pbuf data structure. It supports dynamic memory allocation for packet contents or can reference externally managed packet contents both in RAM and ROM. Quick allocation for incoming packets is provided through pools with fixed sized pbufs.</p>
+<p>A packet may span over multiple pbufs, chained as a singly linked list. This is called a "pbuf chain".</p>
+<p>Multiple packets may be queued, also using this singly linked list. This is called a "packet queue".</p>
+<p>So, a packet queue consists of one or more pbuf chains, each of which consist of one or more pbufs. CURRENTLY, PACKET QUEUES ARE NOT SUPPORTED!!! Use helper structs to queue multiple packets.</p>
+<p>The differences between a pbuf chain and a packet queue are very precise but subtle.</p>
+<p>The last pbuf of a packet has a -&gt;tot_len field that equals the -&gt;len field. It can be found by traversing the list. If the last pbuf of a packet has a -&gt;next field other than NULL, more packets are on the queue.</p>
+<p>Therefore, looping through a pbuf of a single packet, has an loop end condition (tot_len == p-&gt;len), NOT (next == NULL).</p>
+<p>Example of custom pbuf usage: <a class="el" href="zerocopyrx.html">Zero-copy RX</a> </p>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga894d91d811fd986f3cc3da828fa7beb3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga894d91d811fd986f3cc3da828fa7beb3">&#9670;&nbsp;</a></span>PBUF_NEEDS_COPY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_NEEDS_COPY</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">p</td><td>)</td>
+          <td>&#160;&#160;&#160;((p)-&gt;type_internal &amp; <a class="el" href="pbuf_8h.html#a02789ca67766def65000b58f7fe7d03b">PBUF_TYPE_FLAG_DATA_VOLATILE</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__pbuf.html#ga894d91d811fd986f3cc3da828fa7beb3">PBUF_NEEDS_COPY(p)</a>: 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: it will make a copy iof any pbuf chain that does not consist entirely of PBUF_ROM type pbufs. For setups with zero-copy support, it may be redefined to evaluate to true in all cases, for example. However, doing so also has an effect on the application side: any buffers that are <em>not</em> copied must also <em>not</em> be reused by the application after passing them to lwIP. For example, when setting PBUF_NEEDS_COPY to (0), after using <a class="el" href="group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc">udp_send()</a> with a PBUF_RAM pbuf, the application must free the pbuf immediately, rather than reusing it for other purposes. For more background information on this, see tasks #6735 and #7896, and bugs #11400 and #49914. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="gaee1baa59bb2f85ba575b5a8619ac1ebf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaee1baa59bb2f85ba575b5a8619ac1ebf">&#9670;&nbsp;</a></span>pbuf_layer</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Enumeration of pbuf layers </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="ggaee1baa59bb2f85ba575b5a8619ac1ebfa2ded3594a3977f8bf9cf09552be327b5"></a>PBUF_TRANSPORT&#160;</td><td class="fielddoc"><p>Includes spare room for transport layer header, e.g. UDP header. Use this if you intend to pass the pbuf to functions like <a class="el" href="group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc">udp_send()</a>. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggaee1baa59bb2f85ba575b5a8619ac1ebfafcc1e506061ba69dfa142eb6b3da5f13"></a>PBUF_IP&#160;</td><td class="fielddoc"><p>Includes spare room for IP header. Use this if you intend to pass the pbuf to functions like <a class="el" href="group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d">raw_send()</a>. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggaee1baa59bb2f85ba575b5a8619ac1ebfab4de441e737330558b609a990cd17346"></a>PBUF_LINK&#160;</td><td class="fielddoc"><p>Includes spare room for link layer header (ethernet header). Use this if you intend to pass the pbuf to functions like <a class="el" href="group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778">ethernet_output()</a>. </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__lwip__opts__pbuf.html#ga35998a3d56af9940e6a80bb372597685">PBUF_LINK_HLEN</a> </dd></dl>
+</td></tr>
+<tr><td class="fieldname"><a id="ggaee1baa59bb2f85ba575b5a8619ac1ebfa0ff039585f05f9208bcb66c2d37783e2"></a>PBUF_RAW_TX&#160;</td><td class="fielddoc"><p>Includes spare room for additional encapsulation header before ethernet headers (e.g. 802.11). Use this if you intend to pass the pbuf to functions like netif-&gt;linkoutput(). </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__lwip__opts__pbuf.html#ga6e1ba1875ae5168a17b53d83597bc1de">PBUF_LINK_ENCAPSULATION_HLEN</a> </dd></dl>
+</td></tr>
+<tr><td class="fieldname"><a id="ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba"></a>PBUF_RAW&#160;</td><td class="fielddoc"><p>Use this for input packets in a netif driver when calling netif-&gt;input() in the most common case - ethernet-layer netif driver. </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<a id="gab7e0e32fcc292c0d7107721766ed92fb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab7e0e32fcc292c0d7107721766ed92fb">&#9670;&nbsp;</a></span>pbuf_type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Enumeration of pbuf types </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="ggab7e0e32fcc292c0d7107721766ed92fbac5e9f28455bca98944a030d4b84ecfab"></a>PBUF_RAM&#160;</td><td class="fielddoc"><p>pbuf data is stored in RAM, used for TX mostly, struct pbuf and its payload are allocated in one piece of contiguous memory (so the first payload byte can be calculated from struct pbuf). <a class="el" href="group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47">pbuf_alloc()</a> allocates PBUF_RAM pbufs as unchained pbufs (although that might change in future versions). This should be used for all OUTGOING packets (TX). </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab7e0e32fcc292c0d7107721766ed92fbac120b0fe39efe35bb682e4aa3b82e2c9"></a>PBUF_ROM&#160;</td><td class="fielddoc"><p>pbuf data is stored in ROM, i.e. struct pbuf and its payload are located in totally different memory areas. Since it points to ROM, payload does not have to be copied when queued for transmission. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab7e0e32fcc292c0d7107721766ed92fbac9b6ba960fdea6f2e8f35c8313b77e4e"></a>PBUF_REF&#160;</td><td class="fielddoc"><p>pbuf comes from the pbuf pool. Much like PBUF_ROM but payload might change so it has to be duplicated when queued before transmitting, depending on who has a 'ref' to it. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ggab7e0e32fcc292c0d7107721766ed92fbae969347127387b9b59a23ccd24b76d21"></a>PBUF_POOL&#160;</td><td class="fielddoc"><p>pbuf payload refers to RAM. This one comes from a pool and should be used for RX. Payload can be chained (scatter-gather RX) but like PBUF_RAM, struct pbuf and its payload are allocated in one piece of contiguous memory (so the first payload byte can be calculated from struct pbuf). Don't use this for TX, if the pool becomes empty e.g. because of TCP queuing, you are unable to receive TCP acks! </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gacfcb0a2af918658ba0afe36499c65f47"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacfcb0a2af918658ba0afe36499c65f47">&#9670;&nbsp;</a></span>pbuf_alloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* pbuf_alloc </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a>&#160;</td>
+          <td class="paramname"><em>layer</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>length</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a>&#160;</td>
+          <td class="paramname"><em>type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocates a pbuf of the given type (possibly a chain for PBUF_POOL type).</p>
+<p>The actual memory allocated for the pbuf is determined by the layer at which the pbuf is allocated and the requested size (from the size parameter).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">layer</td><td>header size </td></tr>
+    <tr><td class="paramname">length</td><td>size of the pbuf's payload </td></tr>
+    <tr><td class="paramname">type</td><td>this parameter decides how and where the pbuf should be allocated as follows:</td></tr>
+  </table>
+  </dd>
+</dl>
+<ul>
+<li>PBUF_RAM: buffer memory for pbuf is allocated as one large chunk. This includes protocol headers as well.</li>
+<li>PBUF_ROM: no buffer memory is allocated for the pbuf, even for protocol headers. Additional headers must be prepended by allocating another pbuf and chain in to the front of the ROM pbuf. It is assumed that the memory used is really similar to ROM in that it is immutable and will not be changed. Memory which is dynamic should generally not be attached to PBUF_ROM pbufs. Use PBUF_REF instead.</li>
+<li>PBUF_REF: no buffer memory is allocated for the pbuf, even for protocol headers. It is assumed that the pbuf is only being used in a single thread. If the pbuf gets queued, then pbuf_take should be called to copy the buffer.</li>
+<li>PBUF_POOL: the pbuf is allocated as a pbuf chain, with pbufs from the pbuf pool that is allocated during pbuf_init().</li>
+</ul>
+<dl class="section return"><dt>Returns</dt><dd>the allocated pbuf. If multiple pbufs where allocated, this is the first pbuf of a pbuf chain. </dd></dl>
+
+</div>
+</div>
+<a id="ga4caa46c6d560d9d0da2be845bc9c2fab"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4caa46c6d560d9d0da2be845bc9c2fab">&#9670;&nbsp;</a></span>pbuf_alloc_reference()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* pbuf_alloc_reference </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>payload</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>length</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a>&#160;</td>
+          <td class="paramname"><em>type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocates a pbuf for referenced data. Referenced data can be volatile (PBUF_REF) or long-lived (PBUF_ROM).</p>
+<p>The actual memory allocated for the pbuf is determined by the layer at which the pbuf is allocated and the requested size (from the size parameter).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">payload</td><td>referenced payload </td></tr>
+    <tr><td class="paramname">length</td><td>size of the pbuf's payload </td></tr>
+    <tr><td class="paramname">type</td><td>this parameter decides how and where the pbuf should be allocated as follows:</td></tr>
+  </table>
+  </dd>
+</dl>
+<ul>
+<li>PBUF_ROM: It is assumed that the memory used is really similar to ROM in that it is immutable and will not be changed. Memory which is dynamic should generally not be attached to PBUF_ROM pbufs. Use PBUF_REF instead.</li>
+<li>PBUF_REF: It is assumed that the pbuf is only being used in a single thread. If the pbuf gets queued, then pbuf_take should be called to copy the buffer.</li>
+</ul>
+<dl class="section return"><dt>Returns</dt><dd>the allocated pbuf. </dd></dl>
+
+</div>
+</div>
+<a id="ga90fa2bbf6ea4a263ee8f7b77c75683c2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga90fa2bbf6ea4a263ee8f7b77c75683c2">&#9670;&nbsp;</a></span>pbuf_alloced_custom()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* pbuf_alloced_custom </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a>&#160;</td>
+          <td class="paramname"><em>l</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>length</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a>&#160;</td>
+          <td class="paramname"><em>type</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf__custom.html">pbuf_custom</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>payload_mem</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>payload_mem_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize a custom pbuf (already allocated). Example of custom pbuf usage: <a class="el" href="zerocopyrx.html">Zero-copy RX</a></p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">l</td><td>header size </td></tr>
+    <tr><td class="paramname">length</td><td>size of the pbuf's payload </td></tr>
+    <tr><td class="paramname">type</td><td>type of the pbuf (only used to treat the pbuf accordingly, as this function allocates no memory) </td></tr>
+    <tr><td class="paramname">p</td><td>pointer to the custom pbuf to initialize (already allocated) </td></tr>
+    <tr><td class="paramname">payload_mem</td><td>pointer to the buffer that is used for payload and headers, must be at least big enough to hold 'length' plus the header size, may be NULL if set later. ATTENTION: The caller is responsible for correct alignment of this buffer!! </td></tr>
+    <tr><td class="paramname">payload_mem_len</td><td>the size of the 'payload_mem' buffer, must be at least big enough to hold 'length' plus the header size </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga82429084fe29015509c9b4a072707cd4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga82429084fe29015509c9b4a072707cd4">&#9670;&nbsp;</a></span>pbuf_cat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void pbuf_cat </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>h</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>t</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Concatenate two pbufs (each may be a pbuf chain) and take over the caller's reference of the tail pbuf.</p>
+<dl class="section note"><dt>Note</dt><dd>The caller MAY NOT reference the tail pbuf afterwards. Use <a class="el" href="group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891">pbuf_chain()</a> for that purpose.</dd></dl>
+<p>This function explicitly does not check for tot_len overflow to prevent failing to queue too long pbufs. This can produce invalid pbufs, so handle with care!</p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891">pbuf_chain()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga831c9a72bda1d3bd4c7b96f5a0e3b891"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga831c9a72bda1d3bd4c7b96f5a0e3b891">&#9670;&nbsp;</a></span>pbuf_chain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void pbuf_chain </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>h</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>t</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Chain two pbufs (or pbuf chains) together.</p>
+<p>The caller MUST call pbuf_free(t) once it has stopped using it. Use <a class="el" href="group__pbuf.html#ga82429084fe29015509c9b4a072707cd4">pbuf_cat()</a> instead if you no longer use t.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">h</td><td>head pbuf (chain) </td></tr>
+    <tr><td class="paramname">t</td><td>tail pbuf (chain) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>The pbufs MUST belong to the same packet. </dd>
+<dd>
+MAY NOT be called on a packet queue.</dd></dl>
+<p>The -&gt;tot_len fields of all pbufs of the head chain are adjusted. The -&gt;next field of the last pbuf of the head chain is adjusted. The -&gt;ref field of the first pbuf of the tail chain is adjusted. </p>
+
+</div>
+</div>
+<a id="gafdb04fb0f37f0422fd44ec0fcec8ebd0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafdb04fb0f37f0422fd44ec0fcec8ebd0">&#9670;&nbsp;</a></span>pbuf_clone()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* pbuf_clone </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a>&#160;</td>
+          <td class="paramname"><em>layer</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a>&#160;</td>
+          <td class="paramname"><em>type</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocates a new pbuf of same length (via <a class="el" href="group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47">pbuf_alloc()</a>) and copies the source pbuf into this new pbuf (using <a class="el" href="group__pbuf.html#gaba88511dee3df4b631fde691f421320d">pbuf_copy()</a>).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">layer</td><td>pbuf_layer of the new pbuf </td></tr>
+    <tr><td class="paramname">type</td><td>this parameter decides how and where the pbuf should be allocated (</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47">pbuf_alloc()</a>) </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the source pbuf</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new pbuf or NULL if allocation fails </dd></dl>
+
+</div>
+</div>
+<a id="ga54ac7b116c6f53c704cbf74f35a8b35c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga54ac7b116c6f53c704cbf74f35a8b35c">&#9670;&nbsp;</a></span>pbuf_coalesce()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* pbuf_coalesce </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a>&#160;</td>
+          <td class="paramname"><em>layer</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Creates a single pbuf out of a queue of pbufs.</p>
+<dl class="section remark"><dt>Remarks</dt><dd>: Either the source pbuf 'p' is freed by this function or the original pbuf 'p' is returned, therefore the caller has to check the result!</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the source pbuf </td></tr>
+    <tr><td class="paramname">layer</td><td>pbuf_layer of the new pbuf</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new, single pbuf (p-&gt;next is NULL) or the old pbuf if allocation fails </dd></dl>
+
+</div>
+</div>
+<a id="gaba88511dee3df4b631fde691f421320d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaba88511dee3df4b631fde691f421320d">&#9670;&nbsp;</a></span>pbuf_copy()</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> pbuf_copy </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p_to</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p_from</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </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>
+<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>
+    <tr><td class="paramname">p_from</td><td>pbuf source of the copy</td></tr>
+  </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>
+
+</div>
+</div>
+<a id="gac2f1f58fd36042e82af46f5015720899"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac2f1f58fd36042e82af46f5015720899">&#9670;&nbsp;</a></span>pbuf_copy_partial()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t pbuf_copy_partial </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>dataptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>offset</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Copy (part of) the contents of a packet buffer to an application supplied buffer.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buf</td><td>the pbuf from which to copy data </td></tr>
+    <tr><td class="paramname">dataptr</td><td>the application supplied buffer </td></tr>
+    <tr><td class="paramname">len</td><td>length of data to copy (dataptr must be big enough). No more than buf-&gt;tot_len will be copied, irrespective of len </td></tr>
+    <tr><td class="paramname">offset</td><td>offset into the packet buffer from where to begin copying len bytes </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the number of bytes copied, or 0 on failure </dd></dl>
+
+</div>
+</div>
+<a id="gab0dd696fb4b6bc65e548944584f1738b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab0dd696fb4b6bc65e548944584f1738b">&#9670;&nbsp;</a></span>pbuf_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t pbuf_free </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Dereference a pbuf chain or queue and deallocate any no-longer-used pbufs at the head of this chain or queue.</p>
+<p>Decrements the pbuf reference count. If it reaches zero, the pbuf is deallocated.</p>
+<p>For a pbuf chain, this is repeated for each pbuf in the chain, up to the first pbuf which has a non-zero reference count after decrementing. So, when all reference counts are one, the whole chain is free'd.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>The pbuf (chain) to be dereferenced.</td></tr>
+  </table>
+  </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>
+
+</div>
+</div>
+<a id="ga6d803d9945bffb7ad97743f2fa503da6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6d803d9945bffb7ad97743f2fa503da6">&#9670;&nbsp;</a></span>pbuf_get_at()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t pbuf_get_at </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>offset</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get one byte from the specified position in a pbuf WARNING: returns zero for offset &gt;= p-&gt;tot_len</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to parse </td></tr>
+    <tr><td class="paramname">offset</td><td>offset into p of the byte to return </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>byte at an offset into p OR ZERO IF 'offset' &gt;= p-&gt;tot_len </dd></dl>
+
+</div>
+</div>
+<a id="gad0357ae0be17b2aacd0c301cdc86fc39"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad0357ae0be17b2aacd0c301cdc86fc39">&#9670;&nbsp;</a></span>pbuf_get_contiguous()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* pbuf_get_contiguous </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>buffer</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>bufsize</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>offset</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get part of a pbuf's payload as contiguous memory. The returned memory is either a pointer into the pbuf's payload or, if split over multiple pbufs, a copy into the user-supplied buffer.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the pbuf from which to copy data </td></tr>
+    <tr><td class="paramname">buffer</td><td>the application supplied buffer </td></tr>
+    <tr><td class="paramname">bufsize</td><td>size of the application supplied buffer </td></tr>
+    <tr><td class="paramname">len</td><td>length of data to copy (dataptr must be big enough). No more than buf-&gt;tot_len will be copied, irrespective of len </td></tr>
+    <tr><td class="paramname">offset</td><td>offset into the packet buffer from where to begin copying len bytes </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the number of bytes copied, or 0 on failure </dd></dl>
+
+</div>
+</div>
+<a id="ga2170ccbbb13238380dbb203ee1b85974"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2170ccbbb13238380dbb203ee1b85974">&#9670;&nbsp;</a></span>pbuf_memcmp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t pbuf_memcmp </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>offset</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>s2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>n</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Compare pbuf contents at specified offset with memory s2, both of length n</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to compare </td></tr>
+    <tr><td class="paramname">offset</td><td>offset into p at which to start comparing </td></tr>
+    <tr><td class="paramname">s2</td><td>buffer to compare </td></tr>
+    <tr><td class="paramname">n</td><td>length of buffer to compare </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero if equal, nonzero otherwise (0xffff if p is too short, diffoffset+1 otherwise) </dd></dl>
+
+</div>
+</div>
+<a id="ga18c164a6e4a24d89ea9eb7571a886448"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga18c164a6e4a24d89ea9eb7571a886448">&#9670;&nbsp;</a></span>pbuf_memfind()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t pbuf_memfind </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>mem</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>mem_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>start_offset</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Find occurrence of mem (with length mem_len) in pbuf p, starting at offset start_offset.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to search, maximum length is 0xFFFE since 0xFFFF is used as return value 'not found' </td></tr>
+    <tr><td class="paramname">mem</td><td>search for the contents of this buffer </td></tr>
+    <tr><td class="paramname">mem_len</td><td>length of 'mem' </td></tr>
+    <tr><td class="paramname">start_offset</td><td>offset into p at which to start searching </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0xFFFF if substr was not found in p or the index where it was found </dd></dl>
+
+</div>
+</div>
+<a id="gaf76863707dc02993eae116574b1ea03f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf76863707dc02993eae116574b1ea03f">&#9670;&nbsp;</a></span>pbuf_put_at()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void pbuf_put_at </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>offset</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Put one byte to the specified position in a pbuf WARNING: silently ignores offset &gt;= p-&gt;tot_len</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to fill </td></tr>
+    <tr><td class="paramname">offset</td><td>offset into p of the byte to write </td></tr>
+    <tr><td class="paramname">data</td><td>byte to write at an offset into p </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga50abfe830a33a1a47a562febee66015d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga50abfe830a33a1a47a562febee66015d">&#9670;&nbsp;</a></span>pbuf_realloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void pbuf_realloc </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>new_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Shrink a pbuf chain to a desired length.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to shrink. </td></tr>
+    <tr><td class="paramname">new_len</td><td>desired new length of pbuf chain</td></tr>
+  </table>
+  </dd>
+</dl>
+<p>Depending on the desired length, the first few pbufs in a chain might be skipped and left unchanged. The new last pbuf in the chain will be resized, and any remaining pbufs will be freed.</p>
+<dl class="section note"><dt>Note</dt><dd>If the pbuf is ROM/REF, only the -&gt;tot_len and -&gt;len fields are adjusted. </dd>
+<dd>
+May not be called on a packet queue.</dd>
+<dd>
+Despite its name, pbuf_realloc cannot grow the size of a pbuf (chain). </dd></dl>
+
+</div>
+</div>
+<a id="ga77f6bbd69e45e542014d9c547c7da74e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga77f6bbd69e45e542014d9c547c7da74e">&#9670;&nbsp;</a></span>pbuf_ref()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void pbuf_ref </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Increment the reference count of the pbuf.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to increase reference counter of </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga6a961522d81f0327aaf4d4ee6d96c583"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6a961522d81f0327aaf4d4ee6d96c583">&#9670;&nbsp;</a></span>pbuf_skip()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* pbuf_skip </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>in_offset</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>out_offset</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Skip a number of bytes at the start of a pbuf</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">in</td><td>input pbuf </td></tr>
+    <tr><td class="paramname">in_offset</td><td>offset to skip </td></tr>
+    <tr><td class="paramname">out_offset</td><td>resulting offset in the returned pbuf </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the pbuf in the queue where the offset is </dd></dl>
+
+</div>
+</div>
+<a id="gad1e31e370271335b197272af2724ca85"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad1e31e370271335b197272af2724ca85">&#9670;&nbsp;</a></span>pbuf_take()</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> pbuf_take </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>dataptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Copy application supplied data into a pbuf. This function can only be used to copy the equivalent of buf-&gt;tot_len data.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buf</td><td>pbuf to fill with data </td></tr>
+    <tr><td class="paramname">dataptr</td><td>application supplied data buffer </td></tr>
+    <tr><td class="paramname">len</td><td>length of the application supplied data buffer</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_MEM if the pbuf is not big enough </dd></dl>
+
+</div>
+</div>
+<a id="gae1cf2bf7454ff87ff377b0b2262f9b44"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae1cf2bf7454ff87ff377b0b2262f9b44">&#9670;&nbsp;</a></span>pbuf_take_at()</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> pbuf_take_at </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>dataptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>offset</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as <a class="el" href="group__pbuf.html#gad1e31e370271335b197272af2724ca85">pbuf_take()</a> but puts data at an offset</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buf</td><td>pbuf to fill with data </td></tr>
+    <tr><td class="paramname">dataptr</td><td>application supplied data buffer </td></tr>
+    <tr><td class="paramname">len</td><td>length of the application supplied data buffer </td></tr>
+    <tr><td class="paramname">offset</td><td>offset in pbuf where to copy dataptr to</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_MEM if the pbuf is not big enough </dd></dl>
+
+</div>
+</div>
+<a id="ga839f342803b0cf89049744124c5a98ad"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga839f342803b0cf89049744124c5a98ad">&#9670;&nbsp;</a></span>pbuf_try_get_at()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int pbuf_try_get_at </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>offset</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get one byte from the specified position in a pbuf</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to parse </td></tr>
+    <tr><td class="paramname">offset</td><td>offset into p of the byte to return </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>byte at an offset into p [0..0xFF] OR negative if 'offset' &gt;= p-&gt;tot_len </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__pbuf.js b/doc/doxygen/output/html/group__pbuf.js
new file mode 100644
index 0000000..7c8da25
--- /dev/null
+++ b/doc/doxygen/output/html/group__pbuf.js
@@ -0,0 +1,38 @@
+var group__pbuf =
+[
+    [ "PBUF_NEEDS_COPY", "group__pbuf.html#ga894d91d811fd986f3cc3da828fa7beb3", null ],
+    [ "pbuf_layer", "group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf", [
+      [ "PBUF_TRANSPORT", "group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa2ded3594a3977f8bf9cf09552be327b5", null ],
+      [ "PBUF_IP", "group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfafcc1e506061ba69dfa142eb6b3da5f13", null ],
+      [ "PBUF_LINK", "group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfab4de441e737330558b609a990cd17346", null ],
+      [ "PBUF_RAW_TX", "group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa0ff039585f05f9208bcb66c2d37783e2", null ],
+      [ "PBUF_RAW", "group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba", null ]
+    ] ],
+    [ "pbuf_type", "group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb", [
+      [ "PBUF_RAM", "group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac5e9f28455bca98944a030d4b84ecfab", null ],
+      [ "PBUF_ROM", "group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac120b0fe39efe35bb682e4aa3b82e2c9", null ],
+      [ "PBUF_REF", "group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac9b6ba960fdea6f2e8f35c8313b77e4e", null ],
+      [ "PBUF_POOL", "group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbae969347127387b9b59a23ccd24b76d21", null ]
+    ] ],
+    [ "pbuf_alloc", "group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47", null ],
+    [ "pbuf_alloc_reference", "group__pbuf.html#ga4caa46c6d560d9d0da2be845bc9c2fab", null ],
+    [ "pbuf_alloced_custom", "group__pbuf.html#ga90fa2bbf6ea4a263ee8f7b77c75683c2", null ],
+    [ "pbuf_cat", "group__pbuf.html#ga82429084fe29015509c9b4a072707cd4", null ],
+    [ "pbuf_chain", "group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891", null ],
+    [ "pbuf_clone", "group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0", null ],
+    [ "pbuf_coalesce", "group__pbuf.html#ga54ac7b116c6f53c704cbf74f35a8b35c", null ],
+    [ "pbuf_copy", "group__pbuf.html#gaba88511dee3df4b631fde691f421320d", null ],
+    [ "pbuf_copy_partial", "group__pbuf.html#gac2f1f58fd36042e82af46f5015720899", null ],
+    [ "pbuf_free", "group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b", null ],
+    [ "pbuf_get_at", "group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6", null ],
+    [ "pbuf_get_contiguous", "group__pbuf.html#gad0357ae0be17b2aacd0c301cdc86fc39", null ],
+    [ "pbuf_memcmp", "group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974", null ],
+    [ "pbuf_memfind", "group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448", null ],
+    [ "pbuf_put_at", "group__pbuf.html#gaf76863707dc02993eae116574b1ea03f", null ],
+    [ "pbuf_realloc", "group__pbuf.html#ga50abfe830a33a1a47a562febee66015d", null ],
+    [ "pbuf_ref", "group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e", null ],
+    [ "pbuf_skip", "group__pbuf.html#ga6a961522d81f0327aaf4d4ee6d96c583", null ],
+    [ "pbuf_take", "group__pbuf.html#gad1e31e370271335b197272af2724ca85", null ],
+    [ "pbuf_take_at", "group__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44", null ],
+    [ "pbuf_try_get_at", "group__pbuf.html#ga839f342803b0cf89049744124c5a98ad", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__perf.html b/doc/doxygen/output/html/group__perf.html
new file mode 100644
index 0000000..e0e8fad
--- /dev/null
+++ b/doc/doxygen/output/html/group__perf.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Performance measurement</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__perf.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">Performance measurement<div class="ingroups"><a class="el" href="group__lwip.html">lwIP</a> &raquo; <a class="el" href="group__sys__layer.html">Porting (system abstraction layer)</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<p>All defines related to this section must not be placed in lwipopts.h, but in arch/perf.h! Measurement calls made throughout lwip, these can be defined to nothing.</p><ul>
+<li>PERF_START: start measuring something.</li>
+<li>PERF_STOP(x): stop measuring something, and record the result. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__ppp.html b/doc/doxygen/output/html/group__ppp.html
new file mode 100644
index 0000000..114374d
--- /dev/null
+++ b/doc/doxygen/output/html/group__ppp.html
@@ -0,0 +1,628 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: PPP</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__ppp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">PPP<div class="ingroups"><a class="el" href="group__netifs.html">NETIFs</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<pre class="fragment">PPP interface for lwIP
+
+Author: Sylvain Rochet
+
+Table of Contents:
+
+1 - Supported PPP protocols and features
+2 - Raw API PPP example for all protocols
+3 - PPPoS input path (raw API, IRQ safe API, TCPIP API)
+4 - Thread safe PPP API (PPPAPI)
+5 - Notify phase callback (PPP_NOTIFY_PHASE)
+6 - Upgrading from lwIP &lt;= 1.4.x to lwIP &gt;= 2.0.x
+
+
+
+1 Supported PPP protocols and features
+======================================
+
+Supported Low level protocols:
+* PPP over serial using HDLC-like framing, such as wired dialup modems
+  or mobile telecommunications GPRS/EDGE/UMTS/HSPA+/LTE modems
+* PPP over Ethernet, such as xDSL modems
+* PPP over L2TP (Layer 2 Tunneling Protocol) LAC (L2TP Access Concentrator),
+  IP tunnel over UDP, such as VPN access
+
+Supported auth protocols:
+* PAP, Password Authentication Protocol
+* CHAP, Challenge-Handshake Authentication Protocol, also known as CHAP-MD5
+* MSCHAPv1, Microsoft version of CHAP, version 1
+* MSCHAPv2, Microsoft version of CHAP, version 2
+* EAP, Extensible Authentication Protocol
+
+Supported address protocols:
+* IPCP, IP Control Protocol, IPv4 addresses negotiation
+* IP6CP, IPv6 Control Protocol, IPv6 link-local addresses negotiation
+
+Supported encryption protocols:
+* MPPE, Microsoft Point-to-Point Encryption
+
+Supported compression or miscellaneous protocols, for serial links only:
+* PFC, Protocol Field Compression
+* ACFC, Address-and-Control-Field-Compression
+* ACCM, Asynchronous-Control-Character-Map
+* VJ, Van Jacobson TCP/IP Header Compression
+
+
+
+2 Raw API PPP example for all protocols
+=======================================
+
+As usual, raw API for lwIP means the lightweight API which *MUST* only be used
+for NO_SYS=1 systems or called inside lwIP core thread for NO_SYS=0 systems.
+
+/*
+ * Globals
+ * =======
+ */
+
+/* The PPP control block */
+ppp_pcb *ppp;
+
+/* The PPP IP interface */
+struct netif ppp_netif;
+
+
+/*
+ * PPP status callback
+ * ===================
+ *
+ * PPP status callback is called on PPP status change (up, down, …) from lwIP
+ * core thread
+ */
+
+/* PPP status callback example */
+static void 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: {
+#if LWIP_DNS
+      const ip_addr_t *ns;
+#endif /* LWIP_DNS */
+      printf("status_cb: Connected\n");
+#if PPP_IPV4_SUPPORT
+      printf("   our_ipaddr  = %s\n", ipaddr_ntoa(&amp;pppif-&gt;ip_addr));
+      printf("   his_ipaddr  = %s\n", ipaddr_ntoa(&amp;pppif-&gt;gw));
+      printf("   netmask     = %s\n", ipaddr_ntoa(&amp;pppif-&gt;netmask));
+#if LWIP_DNS
+      ns = dns_getserver(0);
+      printf("   dns1        = %s\n", ipaddr_ntoa(ns));
+      ns = dns_getserver(1);
+      printf("   dns2        = %s\n", ipaddr_ntoa(ns));
+#endif /* LWIP_DNS */
+#endif /* PPP_IPV4_SUPPORT */
+#if PPP_IPV6_SUPPORT
+      printf("   our6_ipaddr = %s\n", ip6addr_ntoa(netif_ip6_addr(pppif, 0)));
+#endif /* PPP_IPV6_SUPPORT */
+      break;
+    }
+    case PPPERR_PARAM: {
+      printf("status_cb: Invalid parameter\n");
+      break;
+    }
+    case PPPERR_OPEN: {
+      printf("status_cb: Unable to open PPP session\n");
+      break;
+    }
+    case PPPERR_DEVICE: {
+      printf("status_cb: Invalid I/O device for PPP\n");
+      break;
+    }
+    case PPPERR_ALLOC: {
+      printf("status_cb: Unable to allocate resources\n");
+      break;
+    }
+    case PPPERR_USER: {
+      printf("status_cb: User interrupt\n");
+      break;
+    }
+    case PPPERR_CONNECT: {
+      printf("status_cb: Connection lost\n");
+      break;
+    }
+    case PPPERR_AUTHFAIL: {
+      printf("status_cb: Failed authentication challenge\n");
+      break;
+    }
+    case PPPERR_PROTOCOL: {
+      printf("status_cb: Failed to meet protocol\n");
+      break;
+    }
+    case PPPERR_PEERDEAD: {
+      printf("status_cb: Connection timeout\n");
+      break;
+    }
+    case PPPERR_IDLETIMEOUT: {
+      printf("status_cb: Idle Timeout\n");
+      break;
+    }
+    case PPPERR_CONNECTTIME: {
+      printf("status_cb: Max connect time reached\n");
+      break;
+    }
+    case PPPERR_LOOPBACK: {
+      printf("status_cb: Loopback detected\n");
+      break;
+    }
+    default: {
+      printf("status_cb: Unknown error code %d\n", err_code);
+      break;
+    }
+  }
+
+/*
+ * This should be in the switch case, this is put outside of the switch
+ * case for example readability.
+ */
+
+  if (err_code == PPPERR_NONE) {
+    return;
+  }
+
+  /* ppp_close() was previously called, don't reconnect */
+  if (err_code == PPPERR_USER) {
+    /* ppp_free(); -- can be called here */
+    return;
+  }
+
+  /*
+   * Try to reconnect in 30 seconds, if you need a modem chatscript you have
+   * to do a much better signaling here ;-)
+   */
+  ppp_connect(pcb, 30);
+  /* OR ppp_listen(pcb); */
+}
+
+
+/*
+ * Creating a new PPPoS session
+ * ============================
+ *
+ * In lwIP, PPPoS is not PPPoSONET, in lwIP PPPoS is PPPoSerial.
+ */
+
+#include "netif/ppp/pppos.h"
+
+/*
+ * PPPoS serial output callback
+ *
+ * ppp_pcb, PPP control block
+ * data, buffer to write to serial port
+ * len, length of the data buffer
+ * ctx, optional user-provided callback context pointer
+ *
+ * Return value: len if write succeed
+ */
+static u32_t output_cb(ppp_pcb *pcb, u8_t *data, u32_t len, void *ctx) {
+  return uart_write(UART, data, len);
+}
+
+/*
+ * Create a new PPPoS interface
+ *
+ * ppp_netif, netif to use for this PPP link, i.e. PPP IP interface
+ * output_cb, PPPoS serial output callback
+ * status_cb, PPP status callback, called on PPP status change (up, down, …)
+ * ctx_cb, optional user-provided callback context pointer
+ */
+ppp = pppos_create(&amp;ppp_netif,
+       output_cb, status_cb, ctx_cb);
+
+
+/*
+ * Creating a new PPPoE session
+ * ============================
+ */
+
+#include "netif/ppp/pppoe.h"
+
+/*
+ * Create a new PPPoE interface
+ *
+ * ppp_netif, netif to use for this PPP link, i.e. PPP IP interface
+ * ethif, already existing and setup Ethernet interface to use
+ * service_name, PPPoE service name discriminator (not supported yet)
+ * concentrator_name, PPPoE concentrator name discriminator (not supported yet)
+ * status_cb, PPP status callback, called on PPP status change (up, down, …)
+ * ctx_cb, optional user-provided callback context pointer
+ */
+ppp = pppoe_create(&amp;ppp_netif,
+       &amp;ethif,
+       service_name, concentrator_name,
+       status_cb, ctx_cb);
+
+
+/*
+ * Creating a new PPPoL2TP session
+ * ===============================
+ */
+
+#include "netif/ppp/pppol2tp.h"
+
+/*
+ * Create a new PPPoL2TP interface
+ *
+ * ppp_netif, netif to use for this PPP link, i.e. PPP IP interface
+ * netif, optional already existing and setup output netif, necessary if you
+ *        want to set this interface as default route to settle the chicken
+ *        and egg problem with VPN links
+ * ipaddr, IP to connect to
+ * port, UDP port to connect to (usually 1701)
+ * secret, L2TP secret to use
+ * secret_len, size in bytes of the L2TP secret
+ * status_cb, PPP status callback, called on PPP status change (up, down, …)
+ * ctx_cb, optional user-provided callback context pointer
+ */
+ppp = pppol2tp_create(&amp;ppp_netif,
+       struct netif *netif, ip_addr_t *ipaddr, u16_t port,
+       u8_t *secret, u8_t secret_len,
+       ppp_link_status_cb_fn link_status_cb, void *ctx_cb);
+
+
+/*
+ * Initiate PPP client connection
+ * ==============================
+ */
+
+/* Set this interface as default route */
+ppp_set_default(ppp);
+
+/*
+ * Basic PPP client configuration. Can only be set if PPP session is in the
+ * dead state (i.e. disconnected). We don't need to provide thread-safe
+ * equivalents through PPPAPI because those helpers are only changing
+ * structure members while session is inactive for lwIP core. Configuration
+ * only need to be done once.
+ */
+
+/* Ask the peer for up to 2 DNS server addresses. */
+ppp_set_usepeerdns(ppp, 1);
+
+/* Auth configuration, this is pretty self-explanatory */
+ppp_set_auth(ppp, PPPAUTHTYPE_ANY, "login", "password");
+
+/*
+ * Initiate PPP negotiation, without waiting (holdoff=0), can only be called
+ * if PPP session is in the dead state (i.e. disconnected).
+ */
+u16_t holdoff = 0;
+ppp_connect(ppp, holdoff);
+
+
+/*
+ * Initiate PPP server listener
+ * ============================
+ */
+
+/*
+ * Basic PPP server configuration. Can only be set if PPP session is in the
+ * dead state (i.e. disconnected). We don't need to provide thread-safe
+ * equivalents through PPPAPI because those helpers are only changing
+ * structure members while session is inactive for lwIP core. Configuration
+ * only need to be done once.
+ */
+ip4_addr_t addr;
+
+/* Set our address */
+IP4_ADDR(&amp;addr, 192,168,0,1);
+ppp_set_ipcp_ouraddr(ppp, &amp;addr);
+
+/* Set peer(his) address */
+IP4_ADDR(&amp;addr, 192,168,0,2);
+ppp_set_ipcp_hisaddr(ppp, &amp;addr);
+
+/* Set primary DNS server */
+IP4_ADDR(&amp;addr, 192,168,10,20);
+ppp_set_ipcp_dnsaddr(ppp, 0, &amp;addr);
+
+/* Set secondary DNS server */
+IP4_ADDR(&amp;addr, 192,168,10,21);
+ppp_set_ipcp_dnsaddr(ppp, 1, &amp;addr);
+
+/* Auth configuration, this is pretty self-explanatory */
+ppp_set_auth(ppp, PPPAUTHTYPE_ANY, "login", "password");
+
+/* Require peer to authenticate */
+ppp_set_auth_required(ppp, 1);
+
+/*
+ * Only for PPPoS, the PPP session should be up and waiting for input.
+ *
+ * Note: for PPPoS, ppp_connect() and ppp_listen() are actually the same thing.
+ * The listen call is meant for future support of PPPoE and PPPoL2TP server
+ * mode, where we will need to negotiate the incoming PPPoE session or L2TP
+ * session before initiating PPP itself. We need this call because there is
+ * two passive modes for PPPoS, ppp_set_passive and ppp_set_silent.
+ */
+ppp_set_silent(pppos, 1);
+
+/*
+ * Initiate PPP listener (i.e. wait for an incoming connection), can only
+ * be called if PPP session is in the dead state (i.e. disconnected).
+ */
+ppp_listen(ppp);
+
+
+/*
+ * Closing PPP connection
+ * ======================
+ */
+
+/*
+ * Initiate the end of the PPP session, without carrier lost signal
+ * (nocarrier=0), meaning a clean shutdown of PPP protocols.
+ * You can call this function at anytime.
+ */
+u8_t nocarrier = 0;
+ppp_close(ppp, nocarrier);
+/*
+ * Then you must wait your status_cb() to be called, it may takes from a few
+ * seconds to several tens of seconds depending on the current PPP state.
+ */
+
+/*
+ * Freeing a PPP connection
+ * ========================
+ */
+
+/*
+ * Free the PPP control block, can only be called if PPP session is in the
+ * dead state (i.e. disconnected). You need to call ppp_close() before.
+ */
+ppp_free(ppp);
+
+
+
+3 PPPoS input path (raw API, IRQ safe API, TCPIP API)
+=====================================================
+
+Received data on serial port should be sent to lwIP using the pppos_input()
+function or the pppos_input_tcpip() function.
+
+If NO_SYS is 1 and if PPP_INPROC_IRQ_SAFE is 0 (the default), pppos_input()
+is not IRQ safe and then *MUST* only be called inside your main loop.
+
+Whatever the NO_SYS value, if PPP_INPROC_IRQ_SAFE is 1, pppos_input() is IRQ
+safe and can be safely called from an interrupt context, using that is going
+to reduce your need of buffer if pppos_input() is called byte after byte in
+your rx serial interrupt.
+
+if NO_SYS is 0, the thread safe way outside an interrupt context is to use
+the pppos_input_tcpip() function to pass input data to the lwIP core thread
+using the TCPIP API. This is thread safe in all cases but you should avoid
+passing data byte after byte because it uses heavy locking (mailbox) and it
+allocates pbuf, better fill them !
+
+if NO_SYS is 0 and if PPP_INPROC_IRQ_SAFE is 1, you may also use pppos_input()
+from an RX thread, however pppos_input() is not thread safe by itself. You can
+do that *BUT* you should NEVER call pppos_connect(), pppos_listen() and
+ppp_free() if pppos_input() can still be running, doing this is NOT thread safe
+at all. Using PPP_INPROC_IRQ_SAFE from an RX thread is discouraged unless you
+really know what you are doing, your move ;-)
+
+
+/*
+ * Fonction to call for received data
+ *
+ * ppp, PPP control block
+ * buffer, input buffer
+ * buffer_len, buffer length in bytes
+ */
+void pppos_input(ppp, buffer, buffer_len);
+
+or
+
+void pppos_input_tcpip(ppp, buffer, buffer_len);
+
+
+
+4 Thread safe PPP API (PPPAPI)
+==============================
+
+There is a thread safe API for all corresponding ppp_* functions, you have to
+enable LWIP_PPP_API in your lwipopts.h file, then see
+include/netif/ppp/pppapi.h, this is actually pretty obvious.
+
+
+
+5 Notify phase callback (PPP_NOTIFY_PHASE)
+==========================================
+
+Notify phase callback, enabled using the PPP_NOTIFY_PHASE config option, let
+you configure a callback that is called on each PPP internal state change.
+This is different from the status callback which only warns you about
+up(running) and down(dead) events.
+
+Notify phase callback can be used, for example, to set a LED pattern depending
+on the current phase of the PPP session. Here is a callback example which
+tries to mimic what we usually see on xDSL modems while they are negotiating
+the link, which should be self-explanatory:
+
+static void ppp_notify_phase_cb(ppp_pcb *pcb, u8_t phase, void *ctx) {
+  switch (phase) {
+
+  /* Session is down (either permanently or briefly) */
+  case PPP_PHASE_DEAD:
+    led_set(PPP_LED, LED_OFF);
+    break;
+
+  /* We are between two sessions */
+  case PPP_PHASE_HOLDOFF:
+    led_set(PPP_LED, LED_SLOW_BLINK);
+    break;
+
+  /* Session just started */
+  case PPP_PHASE_INITIALIZE:
+    led_set(PPP_LED, LED_FAST_BLINK);
+    break;
+
+  /* Session is running */
+  case PPP_PHASE_RUNNING:
+    led_set(PPP_LED, LED_ON);
+    break;
+
+  default:
+    break;
+  }
+}
+
+
+
+6 Upgrading from lwIP &lt;= 1.4.x to lwIP &gt;= 2.0.x
+===============================================
+
+PPP API was fully reworked between 1.4.x and 2.0.x releases. However porting
+from previous lwIP version is pretty easy:
+
+* Previous PPP API used an integer to identify PPP sessions, we are now
+  using ppp_pcb* control block, therefore all functions changed from "int ppp"
+  to "ppp_pcb *ppp"
+
+* struct netif was moved outside the PPP structure, you have to provide a netif
+  for PPP interface in pppoX_create() functions
+
+* PPP session are not started automatically after you created them anymore,
+  you have to call ppp_connect(), this way you can configure the session before
+  starting it.
+
+* Previous PPP API used CamelCase, we are now using snake_case.
+
+* Previous PPP API mixed PPPoS and PPPoE calls, this isn't the case anymore,
+  PPPoS functions are now prefixed pppos_ and PPPoE functions are now prefixed
+  pppoe_, common functions are now prefixed ppp_.
+
+* New PPPERR_ error codes added, check you have all of them in your status
+  callback function
+
+* Only the following include files should now be used in user application:
+  #include "netif/ppp/pppapi.h"
+  #include "netif/ppp/pppos.h"
+  #include "netif/ppp/pppoe.h"
+  #include "netif/ppp/pppol2tp.h"
+
+  Functions from ppp.h can be used, but you don't need to include this header
+  file as it is already included by above header files.
+
+* PPP_INPROC_OWNTHREAD was broken by design and was removed, you have to create
+  your own serial rx thread
+
+* PPP_INPROC_MULTITHREADED option was misnamed and confusing and was renamed
+  PPP_INPROC_IRQ_SAFE, please read the "PPPoS input path" documentation above
+  because you might have been fooled by that
+
+* If you used tcpip_callback_with_block() on ppp_ functions you may wish to use
+  the PPPAPI API instead.
+
+* ppp_sighup and ppp_close functions were merged using an optional argument
+  "nocarrier" on ppp_close.
+
+* DNS servers are now only remotely asked if LWIP_DNS is set and if
+  ppp_set_usepeerdns() is set to true, they are now automatically registered
+  using the dns_setserver() function so you don't need to do that in the PPP
+  callback anymore.
+
+* PPPoS does not use the SIO API anymore, as such it now requires a serial
+  output callback in place of sio_write
+
+* PPP_MAXIDLEFLAG is now in ms instead of jiffies
+</pre> </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__raw__raw.html b/doc/doxygen/output/html/group__raw__raw.html
new file mode 100644
index 0000000..8a5fd23
--- /dev/null
+++ b/doc/doxygen/output/html/group__raw__raw.html
@@ -0,0 +1,540 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: RAW</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__raw__raw.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">RAW<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga8576dbbc7f03797525d2cdb7ec3b9fe4"><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__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4">raw_bind</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr)</td></tr>
+<tr class="separator:ga8576dbbc7f03797525d2cdb7ec3b9fe4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa124ac8a9479aebefe2c953629df591a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a">raw_bind_netif</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, const struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gaa124ac8a9479aebefe2c953629df591a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga31bb29c964d5e2f734e563485fc25168"><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__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168">raw_connect</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr)</td></tr>
+<tr class="separator:ga31bb29c964d5e2f734e563485fc25168"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7634c0306e2c6f8040e35f6547e8d3ef"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef">raw_disconnect</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga7634c0306e2c6f8040e35f6547e8d3ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadf84e4e6911ce3c0d7f5669b6edac426"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426">raw_recv</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, <a class="el" href="raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd">raw_recv_fn</a> <a class="el" href="group__socket.html#gadd7ae45df7c005619eb1126542231e9b">recv</a>, void *recv_arg)</td></tr>
+<tr class="separator:gadf84e4e6911ce3c0d7f5669b6edac426"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga09427456070fb610cc7795d23dedc159"><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__raw__raw.html#ga09427456070fb610cc7795d23dedc159">raw_sendto</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr)</td></tr>
+<tr class="separator:ga09427456070fb610cc7795d23dedc159"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2fe3765ae938a3f7c53dc7051b7ab0b1"><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__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1">raw_sendto_if_src</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dst_ip, 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#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *src_ip)</td></tr>
+<tr class="separator:ga2fe3765ae938a3f7c53dc7051b7ab0b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabbc2e7c7a1b4429f420562d4f31b3a9d"><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__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d">raw_send</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:gabbc2e7c7a1b4429f420562d4f31b3a9d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8db62f7d75f722a653b5368305a47e16"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16">raw_remove</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga8db62f7d75f722a653b5368305a47e16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3217f096ea86728e011f91b249933e8f"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f">raw_new</a> (u8_t proto)</td></tr>
+<tr class="separator:ga3217f096ea86728e011f91b249933e8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3292b7ed2271ac29983edcef16dcbc11"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11">raw_new_ip_type</a> (u8_t type, u8_t proto)</td></tr>
+<tr class="separator:ga3292b7ed2271ac29983edcef16dcbc11"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</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>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga8576dbbc7f03797525d2cdb7ec3b9fe4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8576dbbc7f03797525d2cdb7ec3b9fe4">&#9670;&nbsp;</a></span>raw_bind()</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> raw_bind </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Bind a RAW PCB.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>RAW PCB to be bound with a local address ipaddr. </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>local IP address to bind with. Use IP4_ADDR_ANY to bind to all local interfaces.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>lwIP error code.<ul>
+<li>ERR_OK. Successful. No error occurred.</li>
+<li>ERR_USE. The specified IP address is already bound to by another RAW PCB.</li>
+</ul>
+</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef">raw_disconnect()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gaa124ac8a9479aebefe2c953629df591a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa124ac8a9479aebefe2c953629df591a">&#9670;&nbsp;</a></span>raw_bind_netif()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void raw_bind_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Bind an RAW PCB to a specific netif. After calling this function, all packets received via this PCB are guaranteed to have come in via the specified netif, and all outgoing packets will go out via the specified netif.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>RAW PCB to be bound with netif. </td></tr>
+    <tr><td class="paramname">netif</td><td>netif to bind to. Can be NULL.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef">raw_disconnect()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga31bb29c964d5e2f734e563485fc25168"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga31bb29c964d5e2f734e563485fc25168">&#9670;&nbsp;</a></span>raw_connect()</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> raw_connect </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Connect an RAW PCB. This function is required by upper layers of lwip. Using the raw api you could use <a class="el" href="group__raw__raw.html#ga09427456070fb610cc7795d23dedc159">raw_sendto()</a> instead</p>
+<p>This will associate the RAW PCB with the remote address.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>RAW PCB to be connected with remote address ipaddr and port. </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>remote IP address to connect with.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>lwIP error code</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef">raw_disconnect()</a> and <a class="el" href="group__raw__raw.html#ga09427456070fb610cc7795d23dedc159">raw_sendto()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga7634c0306e2c6f8040e35f6547e8d3ef"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7634c0306e2c6f8040e35f6547e8d3ef">&#9670;&nbsp;</a></span>raw_disconnect()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void raw_disconnect </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Disconnect a RAW PCB.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>the raw pcb to disconnect. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga3217f096ea86728e011f91b249933e8f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3217f096ea86728e011f91b249933e8f">&#9670;&nbsp;</a></span>raw_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structraw__pcb.html">raw_pcb</a>* raw_new </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create a RAW PCB.</p>
+<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">proto</td><td>the protocol number of the IPs payload (e.g. IP_PROTO_ICMP)</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16">raw_remove()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga3292b7ed2271ac29983edcef16dcbc11"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3292b7ed2271ac29983edcef16dcbc11">&#9670;&nbsp;</a></span>raw_new_ip_type()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structraw__pcb.html">raw_pcb</a>* raw_new_ip_type </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>type</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create a RAW PCB for specific IP type.</p>
+<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 <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>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16">raw_remove()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gadf84e4e6911ce3c0d7f5669b6edac426"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadf84e4e6911ce3c0d7f5669b6edac426">&#9670;&nbsp;</a></span>raw_recv()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void raw_recv </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd">raw_recv_fn</a>&#160;</td>
+          <td class="paramname"><em>recv</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>recv_arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the callback function for received packets that match the raw PCB's protocol and binding.</p>
+<p>The callback function MUST either</p><ul>
+<li>eat the packet by calling <a class="el" href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf_free()</a> and returning non-zero. The packet will not be passed to other raw PCBs or other protocol layers.</li>
+<li>not free the packet, and return zero. The packet will be matched against further PCBs and/or forwarded to another protocol layers. </li>
+</ul>
+
+</div>
+</div>
+<a id="ga8db62f7d75f722a653b5368305a47e16"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8db62f7d75f722a653b5368305a47e16">&#9670;&nbsp;</a></span>raw_remove()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void raw_remove </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Remove an RAW PCB.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>RAW PCB to be removed. The PCB is removed from the list of RAW PCB's and the data structure is freed from memory.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f">raw_new()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gabbc2e7c7a1b4429f420562d4f31b3a9d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabbc2e7c7a1b4429f420562d4f31b3a9d">&#9670;&nbsp;</a></span>raw_send()</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> raw_send </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send the raw IP packet to the address given by <a class="el" href="group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168">raw_connect()</a></p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>the raw pcb which to send </td></tr>
+    <tr><td class="paramname">p</td><td>the IP payload to send </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga09427456070fb610cc7795d23dedc159"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga09427456070fb610cc7795d23dedc159">&#9670;&nbsp;</a></span>raw_sendto()</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> raw_sendto </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send the raw IP packet to the given address. An IP header will be prepended to the packet, unless the RAW_FLAGS_HDRINCL flag is set on the PCB. In that case, the packet must include an IP header, which will then be sent as is.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>the raw pcb which to send </td></tr>
+    <tr><td class="paramname">p</td><td>the IP payload to send </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>the destination address of the IP packet </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga2fe3765ae938a3f7c53dc7051b7ab0b1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2fe3765ae938a3f7c53dc7051b7ab0b1">&#9670;&nbsp;</a></span>raw_sendto_if_src()</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> raw_sendto_if_src </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>dst_ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>src_ip</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send the raw IP packet to the given address, using a particular outgoing netif and source IP address. An IP header will be prepended to the packet, unless the RAW_FLAGS_HDRINCL flag is set on the PCB. In that case, the packet must include an IP header, which will then be sent as is.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>RAW PCB used to send the data </td></tr>
+    <tr><td class="paramname">p</td><td>chain of pbufs to be sent </td></tr>
+    <tr><td class="paramname">dst_ip</td><td>destination IP address </td></tr>
+    <tr><td class="paramname">netif</td><td>the netif used for sending </td></tr>
+    <tr><td class="paramname">src_ip</td><td>source IP address </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__raw__raw.js b/doc/doxygen/output/html/group__raw__raw.js
new file mode 100644
index 0000000..010845a
--- /dev/null
+++ b/doc/doxygen/output/html/group__raw__raw.js
@@ -0,0 +1,14 @@
+var group__raw__raw =
+[
+    [ "raw_bind", "group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4", null ],
+    [ "raw_bind_netif", "group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a", null ],
+    [ "raw_connect", "group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168", null ],
+    [ "raw_disconnect", "group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef", null ],
+    [ "raw_new", "group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f", null ],
+    [ "raw_new_ip_type", "group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11", null ],
+    [ "raw_recv", "group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426", null ],
+    [ "raw_remove", "group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16", null ],
+    [ "raw_send", "group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d", null ],
+    [ "raw_sendto", "group__raw__raw.html#ga09427456070fb610cc7795d23dedc159", null ],
+    [ "raw_sendto_if_src", "group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__rfc7668if.html b/doc/doxygen/output/html/group__rfc7668if.html
new file mode 100644
index 0000000..f37aca8
--- /dev/null
+++ b/doc/doxygen/output/html/group__rfc7668if.html
@@ -0,0 +1,363 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: 6LoWPAN over BLE (RFC7668)</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__rfc7668if.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">6LoWPAN over BLE (RFC7668)<div class="ingroups"><a class="el" href="group__netifs.html">NETIFs</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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"><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: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="group__rfc7668if.html#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"><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__rfc7668if.html#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>
+<tr class="separator:ga22930ade4e77b3195fe59949834d85f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1d9d7aff9f2f0515f761be0802178197"><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__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197">rfc7668_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:ga1d9d7aff9f2f0515f761be0802178197"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3d940376bd983c14ffcc8d2580f3bdde"><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__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde">rfc7668_if_init</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga3d940376bd983c14ffcc8d2580f3bdde"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>This file implements a RFC7668 implementation for 6LoWPAN over Bluetooth Low Energy. The specification is very similar to 6LoWPAN, so most of the code is re-used. Compared to 6LoWPAN, much functionality is already implemented in lower BLE layers (fragmenting, session management,...).</p>
+<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="group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c">ble_addr_to_eui64</a>)</li>
+<li>input function: <a class="el" href="group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197">rfc7668_input</a></li>
+</ul>
+</li>
+<li>set the link output function, which transmits output data to an established L2CAP channel</li>
+<li>If data arrives (HCI event "L2CAP_DATA_PACKET"):<ul>
+<li>allocate a <a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba">PBUF_RAW</a> buffer</li>
+<li>let the pbuf struct point to the incoming data or copy it to the buffer</li>
+<li>call netif-&gt;input</li>
+</ul>
+</li>
+</ul>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gaa5b1823c2509b8816ef98dcac67e037c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa5b1823c2509b8816ef98dcac67e037c">&#9670;&nbsp;</a></span>ble_addr_to_eui64()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ble_addr_to_eui64 </td>
+          <td>(</td>
+          <td class="paramtype">uint8_t *&#160;</td>
+          <td class="paramname"><em>dst</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const uint8_t *&#160;</td>
+          <td class="paramname"><em>src</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>public_addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>convert BT address to EUI64 addr</p>
+<p>This method converts a Bluetooth MAC address to an EUI64 address, which is used within IPv6 communication</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">dst</td><td>IPv6 destination space </td></tr>
+    <tr><td class="paramname">src</td><td>BLE MAC address source </td></tr>
+    <tr><td class="paramname">public_addr</td><td>If the LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS option is set, bit 0x02 will be set if param=0 (no public addr); cleared otherwise</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="lowpan6__opts_8h.html#af4a4d962af3439b111a8e72e5eeaccf8">LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga3e245a85f9edddca93ddd2967209881d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3e245a85f9edddca93ddd2967209881d">&#9670;&nbsp;</a></span>eui64_to_ble_addr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void eui64_to_ble_addr </td>
+          <td>(</td>
+          <td class="paramtype">uint8_t *&#160;</td>
+          <td class="paramname"><em>dst</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const uint8_t *&#160;</td>
+          <td class="paramname"><em>src</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>convert EUI64 address to Bluetooth MAC addr</p>
+<p>This method converts an EUI64 address to a Bluetooth MAC address,</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">dst</td><td>BLE MAC address destination </td></tr>
+    <tr><td class="paramname">src</td><td>IPv6 source </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga3d940376bd983c14ffcc8d2580f3bdde"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3d940376bd983c14ffcc8d2580f3bdde">&#9670;&nbsp;</a></span>rfc7668_if_init()</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> rfc7668_if_init </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize the netif</p>
+<p>No flags are used (broadcast not possible, not ethernet, ...) The shortname for this netif is "BT"</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the network interface to be initialized as RFC7668 netif</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if everything went fine </dd></dl>
+
+</div>
+</div>
+<a id="ga1d9d7aff9f2f0515f761be0802178197"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1d9d7aff9f2f0515f761be0802178197">&#9670;&nbsp;</a></span>rfc7668_input()</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> rfc7668_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Process a received raw payload from an L2CAP channel</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 IPv6 header (maybe compressed) </td></tr>
+    <tr><td class="paramname">netif</td><td>the network interface on which the packet was received</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if everything was fine </dd></dl>
+
+</div>
+</div>
+<a id="ga22930ade4e77b3195fe59949834d85f0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga22930ade4e77b3195fe59949834d85f0">&#9670;&nbsp;</a></span>rfc7668_output()</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> rfc7668_output </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>q</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ip6addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Compress outgoing IPv6 packet and pass it on to netif-&gt;linkoutput</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The lwIP network interface which the IP packet will be sent on. </td></tr>
+    <tr><td class="paramname">q</td><td>The <a class="el" href="structpbuf.html">pbuf(s)</a> containing the IP packet to be sent. </td></tr>
+    <tr><td class="paramname">ip6addr</td><td>The IP address of the packet destination.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>See rfc7668_compress </dd></dl>
+
+</div>
+</div>
+<a id="ga29dc0ebb8e640b64a57008b940fbca1e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga29dc0ebb8e640b64a57008b940fbca1e">&#9670;&nbsp;</a></span>rfc7668_set_context()</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> rfc7668_set_context </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>idx</em>, </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> *&#160;</td>
+          <td class="paramname"><em>context</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set context id IPv6 address</p>
+<p>Store one IPv6 address to a given context id.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">idx</td><td>Context id </td></tr>
+    <tr><td class="paramname">context</td><td>IPv6 addr for this context</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK (if everything is fine), ERR_ARG (if the context id is out of range), ERR_VAL (if contexts disabled) </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__rfc7668if.js b/doc/doxygen/output/html/group__rfc7668if.js
new file mode 100644
index 0000000..e48ae74
--- /dev/null
+++ b/doc/doxygen/output/html/group__rfc7668if.js
@@ -0,0 +1,9 @@
+var group__rfc7668if =
+[
+    [ "ble_addr_to_eui64", "group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c", null ],
+    [ "eui64_to_ble_addr", "group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d", null ],
+    [ "rfc7668_if_init", "group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde", null ],
+    [ "rfc7668_input", "group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197", null ],
+    [ "rfc7668_output", "group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0", null ],
+    [ "rfc7668_set_context", "group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__sequential__api.html b/doc/doxygen/output/html/group__sequential__api.html
new file mode 100644
index 0000000..1759626
--- /dev/null
+++ b/doc/doxygen/output/html/group__sequential__api.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Sequential-style APIs</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__sequential__api.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">Sequential-style APIs<div class="ingroups"><a class="el" href="group__api.html">APIs</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__netconn"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netconn.html">Netconn API</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__netifapi"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi.html">NETIF API</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>
+<p>Sequential-style APIs, blocking functions. More overhead, but can be called from any thread except TCPIP thread. The sequential API provides a way for ordinary, sequential, programs to use the lwIP stack. It is quite similar to the BSD socket API. The model of execution is based on the blocking open-read-write-close 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). </p>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__sequential__api.js b/doc/doxygen/output/html/group__sequential__api.js
new file mode 100644
index 0000000..e65293c
--- /dev/null
+++ b/doc/doxygen/output/html/group__sequential__api.js
@@ -0,0 +1,5 @@
+var group__sequential__api =
+[
+    [ "Netconn API", "group__netconn.html", "group__netconn" ],
+    [ "NETIF API", "group__netifapi.html", "group__netifapi" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__sixlowpan.html b/doc/doxygen/output/html/group__sixlowpan.html
new file mode 100644
index 0000000..a092346
--- /dev/null
+++ b/doc/doxygen/output/html/group__sixlowpan.html
@@ -0,0 +1,307 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: 6LoWPAN (RFC4944)</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__sixlowpan.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">6LoWPAN (RFC4944)<div class="ingroups"><a class="el" href="group__netifs.html">NETIFs</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga94c6d289bc25a14fd0fee9230ae3af94"><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__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94">lowpan6_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:ga94c6d289bc25a14fd0fee9230ae3af94"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafee5495843dfb36cb77ba2f16ea6a625"><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__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625">lowpan6_set_short_addr</a> (u8_t addr_high, u8_t addr_low)</td></tr>
+<tr class="separator:gafee5495843dfb36cb77ba2f16ea6a625"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9e650551777ededccf035ef9aaee247b"><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__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b">lowpan6_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>
+<tr class="separator:ga9e650551777ededccf035ef9aaee247b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3c943da6f9d3f1096bdcebe3e19d38b7"><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__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7">lowpan6_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:ga3c943da6f9d3f1096bdcebe3e19d38b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gade00524e85d37a3521ea85359f801df3"><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__sixlowpan.html#gade00524e85d37a3521ea85359f801df3">lowpan6_set_pan_id</a> (u16_t pan_id)</td></tr>
+<tr class="separator:gade00524e85d37a3521ea85359f801df3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9d9b93c47dd138fd84a503ffecb9336b"><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__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b">tcpip_6lowpan_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:ga9d9b93c47dd138fd84a503ffecb9336b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>6LowPAN netif implementation </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga3c943da6f9d3f1096bdcebe3e19d38b7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3c943da6f9d3f1096bdcebe3e19d38b7">&#9670;&nbsp;</a></span>lowpan6_input()</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> lowpan6_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>NETIF input function: don't free the input pbuf when returning != ERR_OK! </p>
+
+</div>
+</div>
+<a id="ga9e650551777ededccf035ef9aaee247b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9e650551777ededccf035ef9aaee247b">&#9670;&nbsp;</a></span>lowpan6_output()</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> lowpan6_output </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>q</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ip6addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Resolve and fill-in IEEE 802.15.4 address header for outgoing IPv6 packet.</p>
+<p>Perform Header Compression and fragment if necessary.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The lwIP network interface which the IP packet will be sent on. </td></tr>
+    <tr><td class="paramname">q</td><td>The <a class="el" href="structpbuf.html">pbuf(s)</a> containing the IP packet to be sent. </td></tr>
+    <tr><td class="paramname">ip6addr</td><td>The IP address of the packet destination.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>err_t </dd></dl>
+
+</div>
+</div>
+<a id="ga94c6d289bc25a14fd0fee9230ae3af94"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga94c6d289bc25a14fd0fee9230ae3af94">&#9670;&nbsp;</a></span>lowpan6_set_context()</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> lowpan6_set_context </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>idx</em>, </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> *&#160;</td>
+          <td class="paramname"><em>context</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set context </p>
+
+</div>
+</div>
+<a id="gade00524e85d37a3521ea85359f801df3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gade00524e85d37a3521ea85359f801df3">&#9670;&nbsp;</a></span>lowpan6_set_pan_id()</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> lowpan6_set_pan_id </td>
+          <td>(</td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>pan_id</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set PAN ID </p>
+
+</div>
+</div>
+<a id="gafee5495843dfb36cb77ba2f16ea6a625"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafee5495843dfb36cb77ba2f16ea6a625">&#9670;&nbsp;</a></span>lowpan6_set_short_addr()</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> lowpan6_set_short_addr </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>addr_high</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>addr_low</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set short address </p>
+
+</div>
+</div>
+<a id="ga9d9b93c47dd138fd84a503ffecb9336b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9d9b93c47dd138fd84a503ffecb9336b">&#9670;&nbsp;</a></span>tcpip_6lowpan_input()</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_6lowpan_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Pass a received packet to tcpip_thread for input processing</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 IEEE 802.15.4 header. </td></tr>
+    <tr><td class="paramname">inp</td><td>the network interface on which the packet was received </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__sixlowpan.js b/doc/doxygen/output/html/group__sixlowpan.js
new file mode 100644
index 0000000..f11ac8d
--- /dev/null
+++ b/doc/doxygen/output/html/group__sixlowpan.js
@@ -0,0 +1,9 @@
+var group__sixlowpan =
+[
+    [ "lowpan6_input", "group__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7", null ],
+    [ "lowpan6_output", "group__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b", null ],
+    [ "lowpan6_set_context", "group__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94", null ],
+    [ "lowpan6_set_pan_id", "group__sixlowpan.html#gade00524e85d37a3521ea85359f801df3", null ],
+    [ "lowpan6_set_short_addr", "group__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625", null ],
+    [ "tcpip_6lowpan_input", "group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__slipif.html b/doc/doxygen/output/html/group__slipif.html
new file mode 100644
index 0000000..2f45665
--- /dev/null
+++ b/doc/doxygen/output/html/group__slipif.html
@@ -0,0 +1,281 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: SLIP</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__slipif.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">SLIP<div class="ingroups"><a class="el" href="group__netifs.html">NETIFs</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga687973ba82dab13a5b9d38d7399aeee3"><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__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3">slipif_init</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga687973ba82dab13a5b9d38d7399aeee3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7b036fd1cde9b299139cac62f52d15a6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6">slipif_poll</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga7b036fd1cde9b299139cac62f52d15a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae135be7d61e5bb49ab72476b0aa70946"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946">slipif_process_rxqueue</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gae135be7d61e5bb49ab72476b0aa70946"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3f2f5e2fa4a816dc27a46f3ee91cf1b3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3">slipif_received_byte</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t data)</td></tr>
+<tr class="separator:ga3f2f5e2fa4a816dc27a46f3ee91cf1b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabbee48569a513c90fe154632038eb6d6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__slipif.html#gabbee48569a513c90fe154632038eb6d6">slipif_received_bytes</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t *data, u8_t len)</td></tr>
+<tr class="separator:gabbee48569a513c90fe154632038eb6d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</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="group__slipif.html#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="group__slipif.html#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>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga687973ba82dab13a5b9d38d7399aeee3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga687973ba82dab13a5b9d38d7399aeee3">&#9670;&nbsp;</a></span>slipif_init()</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> slipif_init </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SLIP netif initialization</p>
+<p>Call the arch specific sio_open and remember the opened device in the state field of the netif.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the lwip network interface structure for this slipif </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if serial line could be opened, ERR_MEM if no memory could be allocated, ERR_IF is serial line couldn't be opened</dd></dl>
+<dl class="section note"><dt>Note</dt><dd>If netif-&gt;state is interpreted as an u8_t serial port number. </dd></dl>
+
+</div>
+</div>
+<a id="ga7b036fd1cde9b299139cac62f52d15a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7b036fd1cde9b299139cac62f52d15a6">&#9670;&nbsp;</a></span>slipif_poll()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void slipif_poll </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Polls the serial device and feeds the IP layer with incoming packets.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The lwip network interface structure for this slipif </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gae135be7d61e5bb49ab72476b0aa70946"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae135be7d61e5bb49ab72476b0aa70946">&#9670;&nbsp;</a></span>slipif_process_rxqueue()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void slipif_process_rxqueue </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Feeds the IP layer with incoming packets that were receive</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The lwip network interface structure for this slipif </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga3f2f5e2fa4a816dc27a46f3ee91cf1b3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3">&#9670;&nbsp;</a></span>slipif_received_byte()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void slipif_received_byte </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Process a received byte, completed packets are put on a queue that is fed into IP through <a class="el" href="group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946">slipif_process_rxqueue()</a>.</p>
+<p>This function can be called from ISR if SYS_LIGHTWEIGHT_PROT is enabled.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The lwip network interface structure for this slipif </td></tr>
+    <tr><td class="paramname">data</td><td>received character </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gabbee48569a513c90fe154632038eb6d6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabbee48569a513c90fe154632038eb6d6">&#9670;&nbsp;</a></span>slipif_received_bytes()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void slipif_received_bytes </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t *&#160;</td>
+          <td class="paramname"><em>data</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Process multiple received byte, completed packets are put on a queue that is fed into IP through <a class="el" href="group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946">slipif_process_rxqueue()</a>.</p>
+<p>This function can be called from ISR if SYS_LIGHTWEIGHT_PROT is enabled.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The lwip network interface structure for this slipif </td></tr>
+    <tr><td class="paramname">data</td><td>received character </td></tr>
+    <tr><td class="paramname">len</td><td>Number of received characters </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__slipif.js b/doc/doxygen/output/html/group__slipif.js
new file mode 100644
index 0000000..c15cb27
--- /dev/null
+++ b/doc/doxygen/output/html/group__slipif.js
@@ -0,0 +1,8 @@
+var group__slipif =
+[
+    [ "slipif_init", "group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3", null ],
+    [ "slipif_poll", "group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6", null ],
+    [ "slipif_process_rxqueue", "group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946", null ],
+    [ "slipif_received_byte", "group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3", null ],
+    [ "slipif_received_bytes", "group__slipif.html#gabbee48569a513c90fe154632038eb6d6", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__smtp.html b/doc/doxygen/output/html/group__smtp.html
new file mode 100644
index 0000000..0d2ed0c
--- /dev/null
+++ b/doc/doxygen/output/html/group__smtp.html
@@ -0,0 +1,390 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: SMTP client</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__smtp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">SMTP client<div class="ingroups"><a class="el" href="group__apps.html">Applications</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__smtp__opts"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp__opts.html">Options</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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga1ccf4305461ec16cf41599341ec54983"><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__smtp.html#ga1ccf4305461ec16cf41599341ec54983">smtp_set_server_addr</a> (const char *server)</td></tr>
+<tr class="separator:ga1ccf4305461ec16cf41599341ec54983"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4b0606e7ad64d8215cebbea43f08759f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f">smtp_set_server_port</a> (u16_t port)</td></tr>
+<tr class="separator:ga4b0606e7ad64d8215cebbea43f08759f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae72a8a0ec42ecae1be401978e224c39e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e">smtp_set_tls_config</a> (struct altcp_tls_config *tls_config)</td></tr>
+<tr class="separator:gae72a8a0ec42ecae1be401978e224c39e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga79567a5a75e048a6b8addb5b038fc899"><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__smtp.html#ga79567a5a75e048a6b8addb5b038fc899">smtp_set_auth</a> (const char *username, const char *pass)</td></tr>
+<tr class="separator:ga79567a5a75e048a6b8addb5b038fc899"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae43119480c4146df9eeff7ae80c767f7"><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__smtp.html#gae43119480c4146df9eeff7ae80c767f7">smtp_send_mail</a> (const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg)</td></tr>
+<tr class="separator:gae43119480c4146df9eeff7ae80c767f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga06f6582701def2a62582373bb0be5788"><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__smtp.html#ga06f6582701def2a62582373bb0be5788">smtp_send_mail_static</a> (const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg)</td></tr>
+<tr class="separator:ga06f6582701def2a62582373bb0be5788"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa9331cc8c6d73a8cd7e6e4466aca9243"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243">smtp_send_mail_int</a> (void *arg)</td></tr>
+<tr class="separator:gaa9331cc8c6d73a8cd7e6e4466aca9243"><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 SMTP client for raw API. It is a minimal implementation of SMTP as specified in RFC 5321.</p>
+<p>Example usage: </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> my_smtp_result_fn(<span class="keywordtype">void</span> *arg, u8_t smtp_result, u16_t srv_err, <a class="code" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> err)</div><div class="line">{</div><div class="line">  printf(<span class="stringliteral">&quot;mail (%p) sent with results: 0x%02x, 0x%04x, 0x%08x\n&quot;</span>, arg,</div><div class="line">         smtp_result, srv_err, err);</div><div class="line">}</div><div class="line"><span class="keyword">static</span> <span class="keywordtype">void</span> my_smtp_test(<span class="keywordtype">void</span>)</div><div class="line">{</div><div class="line">  <a class="code" href="group__smtp.html#ga1ccf4305461ec16cf41599341ec54983">smtp_set_server_addr</a>(<span class="stringliteral">&quot;mymailserver.org&quot;</span>);</div><div class="line">  -&gt; <span class="keyword">set</span> both username and password as NULL <span class="keywordflow">if</span> no auth needed</div><div class="line">  <a class="code" href="group__smtp.html#ga79567a5a75e048a6b8addb5b038fc899">smtp_set_auth</a>(<span class="stringliteral">&quot;username&quot;</span>, <span class="stringliteral">&quot;password&quot;</span>);</div><div class="line">  <a class="code" href="group__smtp.html#gae43119480c4146df9eeff7ae80c767f7">smtp_send_mail</a>(<span class="stringliteral">&quot;sender&quot;</span>, <span class="stringliteral">&quot;recipient&quot;</span>, <span class="stringliteral">&quot;subject&quot;</span>, <span class="stringliteral">&quot;body&quot;</span>, my_smtp_result_fn,</div><div class="line">                 some_argument);</div><div class="line">}</div></div><!-- fragment --><p>When using from any other thread than the tcpip_thread (for NO_SYS==0), use <a class="el" href="group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243">smtp_send_mail_int()</a>!</p>
+<p>SMTP_BODYDH usage: </p><div class="fragment"><div class="line"><span class="keywordtype">int</span> my_smtp_bodydh_fn(<span class="keywordtype">void</span> *arg, <span class="keyword">struct</span> smtp_bodydh *bdh)</div><div class="line">{</div><div class="line">   <span class="keywordflow">if</span>(bdh-&gt;state &gt;= 10) {</div><div class="line">      <span class="keywordflow">return</span> BDH_DONE;</div><div class="line">   }</div><div class="line">   sprintf(bdh-&gt;buffer,<span class="stringliteral">&quot;Line #%2d\r\n&quot;</span>,bdh-&gt;state);</div><div class="line">   bdh-&gt;length = strlen(bdh-&gt;buffer);</div><div class="line">   ++bdh-&gt;state;</div><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">               my_smtp_bodydh_fn, my_smtp_result_fn, some_argument);</div></div><!-- fragment --><h2 class="groupheader">Function Documentation</h2>
+<a id="gae43119480c4146df9eeff7ae80c767f7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae43119480c4146df9eeff7ae80c767f7">&#9670;&nbsp;</a></span>smtp_send_mail()</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> smtp_send_mail </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>from</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>to</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>subject</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>body</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">smtp_result_fn&#160;</td>
+          <td class="paramname"><em>callback_fn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>callback_arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an email via the currently selected server, username and password.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">from</td><td>source email address (must be NULL-terminated) </td></tr>
+    <tr><td class="paramname">to</td><td>target email address (must be NULL-terminated) </td></tr>
+    <tr><td class="paramname">subject</td><td>email subject (must be NULL-terminated) </td></tr>
+    <tr><td class="paramname">body</td><td>email body (must be NULL-terminated) </td></tr>
+    <tr><td class="paramname">callback_fn</td><td>callback function </td></tr>
+    <tr><td class="paramname">callback_arg</td><td>user argument to callback_fn </td></tr>
+  </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>
+<li>another err_t on error. </li>
+</ul>
+</dd></dl>
+
+</div>
+</div>
+<a id="gaa9331cc8c6d73a8cd7e6e4466aca9243"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa9331cc8c6d73a8cd7e6e4466aca9243">&#9670;&nbsp;</a></span>smtp_send_mail_int()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void smtp_send_mail_int </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as smtp_send_mail but takes a struct <a class="el" href="structsmtp__send__request.html">smtp_send_request</a> as single parameter which contains all the other parameters. To be used with tcpip_callback to send mail from interrupt context or from another thread.</p>
+<p>WARNING: server and authentication must stay untouched until this function has run!</p>
+<p>Usage example:</p><ul>
+<li>allocate a struct <a class="el" href="structsmtp__send__request.html">smtp_send_request</a> (in a way that is allowed in interrupt context)</li>
+<li>fill the members of the struct as if calling smtp_send_mail</li>
+<li>specify a callback_function</li>
+<li>set callback_arg to the structure itself</li>
+<li>call this function</li>
+<li>wait for the callback function to be called</li>
+<li>in the callback function, deallocate the structure (passed as arg) </li>
+</ul>
+
+</div>
+</div>
+<a id="ga06f6582701def2a62582373bb0be5788"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga06f6582701def2a62582373bb0be5788">&#9670;&nbsp;</a></span>smtp_send_mail_static()</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> smtp_send_mail_static </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>from</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>to</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>subject</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>body</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">smtp_result_fn&#160;</td>
+          <td class="paramname"><em>callback_fn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>callback_arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as smtp_send_mail, but doesn't copy from, to, subject and body into an internal buffer to save memory. WARNING: the above data must stay untouched until the callback function is called (unless the function returns != ERR_OK) </p>
+
+</div>
+</div>
+<a id="ga79567a5a75e048a6b8addb5b038fc899"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga79567a5a75e048a6b8addb5b038fc899">&#9670;&nbsp;</a></span>smtp_set_auth()</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> smtp_set_auth </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>username</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>pass</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set authentication parameters for next SMTP connection</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">username</td><td>login name as passed to the server </td></tr>
+    <tr><td class="paramname">pass</td><td>password passed to the server together with username </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga1ccf4305461ec16cf41599341ec54983"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1ccf4305461ec16cf41599341ec54983">&#9670;&nbsp;</a></span>smtp_set_server_addr()</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> smtp_set_server_addr </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>server</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set IP address or DNS name for next SMTP connection</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">server</td><td>IP address (in ASCII representation) or DNS name of the server </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga4b0606e7ad64d8215cebbea43f08759f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4b0606e7ad64d8215cebbea43f08759f">&#9670;&nbsp;</a></span>smtp_set_server_port()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void smtp_set_server_port </td>
+          <td>(</td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>port</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set TCP port for next SMTP connection</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">port</td><td>TCP port </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gae72a8a0ec42ecae1be401978e224c39e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae72a8a0ec42ecae1be401978e224c39e">&#9670;&nbsp;</a></span>smtp_set_tls_config()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void smtp_set_tls_config </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_tls_config *&#160;</td>
+          <td class="paramname"><em>tls_config</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set TLS configuration for next SMTP connection</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">tls_config</td><td>TLS configuration </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__smtp.js b/doc/doxygen/output/html/group__smtp.js
new file mode 100644
index 0000000..b80451b
--- /dev/null
+++ b/doc/doxygen/output/html/group__smtp.js
@@ -0,0 +1,11 @@
+var group__smtp =
+[
+    [ "Options", "group__smtp__opts.html", "group__smtp__opts" ],
+    [ "smtp_send_mail", "group__smtp.html#gae43119480c4146df9eeff7ae80c767f7", null ],
+    [ "smtp_send_mail_int", "group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243", null ],
+    [ "smtp_send_mail_static", "group__smtp.html#ga06f6582701def2a62582373bb0be5788", null ],
+    [ "smtp_set_auth", "group__smtp.html#ga79567a5a75e048a6b8addb5b038fc899", null ],
+    [ "smtp_set_server_addr", "group__smtp.html#ga1ccf4305461ec16cf41599341ec54983", null ],
+    [ "smtp_set_server_port", "group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f", null ],
+    [ "smtp_set_tls_config", "group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__smtp__opts.html b/doc/doxygen/output/html/group__smtp__opts.html
new file mode 100644
index 0000000..2903e98
--- /dev/null
+++ b/doc/doxygen/output/html/group__smtp__opts.html
@@ -0,0 +1,260 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Options</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__smtp__opts.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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__smtp.html">SMTP client</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga4b1667149354b7819847cb4f5f1ff144"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp__opts.html#ga4b1667149354b7819847cb4f5f1ff144">SMTP_BODYDH</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga4b1667149354b7819847cb4f5f1ff144"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae7ea4f31c521947d5127e268ae02c317"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp__opts.html#gae7ea4f31c521947d5127e268ae02c317">SMTP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gae7ea4f31c521947d5127e268ae02c317"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaee3b273524a2253ce5fb44b240b0371b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp__opts.html#gaee3b273524a2253ce5fb44b240b0371b">SMTP_MAX_SERVERNAME_LEN</a>&#160;&#160;&#160;256</td></tr>
+<tr class="separator:gaee3b273524a2253ce5fb44b240b0371b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafa0c84e5279b8eb8a5dbea6fe97aa099"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp__opts.html#gafa0c84e5279b8eb8a5dbea6fe97aa099">SMTP_MAX_USERNAME_LEN</a>&#160;&#160;&#160;32</td></tr>
+<tr class="separator:gafa0c84e5279b8eb8a5dbea6fe97aa099"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9aa5f5529121a8266947f33c5e424ccc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp__opts.html#ga9aa5f5529121a8266947f33c5e424ccc">SMTP_MAX_PASS_LEN</a>&#160;&#160;&#160;32</td></tr>
+<tr class="separator:ga9aa5f5529121a8266947f33c5e424ccc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab5559a7c976e72204d9391f655bcc07e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp__opts.html#gab5559a7c976e72204d9391f655bcc07e">SMTP_COPY_AUTHDATA</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gab5559a7c976e72204d9391f655bcc07e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga021d8133159895a2dbf5fb0b243da9fa"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp__opts.html#ga021d8133159895a2dbf5fb0b243da9fa">SMTP_CHECK_DATA</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga021d8133159895a2dbf5fb0b243da9fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2e6c8313006592884e89bbcf353cf5ac"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp__opts.html#ga2e6c8313006592884e89bbcf353cf5ac">SMTP_SUPPORT_AUTH_PLAIN</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga2e6c8313006592884e89bbcf353cf5ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7a83e686b109fa59557c13736aeeab3b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp__opts.html#ga7a83e686b109fa59557c13736aeeab3b">SMTP_SUPPORT_AUTH_LOGIN</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga7a83e686b109fa59557c13736aeeab3b"><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="ga4b1667149354b7819847cb4f5f1ff144"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4b1667149354b7819847cb4f5f1ff144">&#9670;&nbsp;</a></span>SMTP_BODYDH</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SMTP_BODYDH&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to enable data handler callback on BODY </p>
+
+</div>
+</div>
+<a id="ga021d8133159895a2dbf5fb0b243da9fa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga021d8133159895a2dbf5fb0b243da9fa">&#9670;&nbsp;</a></span>SMTP_CHECK_DATA</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SMTP_CHECK_DATA&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 0 to save some code space if you know for sure that all data passed to this module conforms to the requirements in the SMTP RFC. WARNING: use this with care! </p>
+
+</div>
+</div>
+<a id="gab5559a7c976e72204d9391f655bcc07e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab5559a7c976e72204d9391f655bcc07e">&#9670;&nbsp;</a></span>SMTP_COPY_AUTHDATA</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SMTP_COPY_AUTHDATA&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 0 if you know the authentication data will not change during the smtp session, which saves some heap space. </p>
+
+</div>
+</div>
+<a id="gae7ea4f31c521947d5127e268ae02c317"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae7ea4f31c521947d5127e268ae02c317">&#9670;&nbsp;</a></span>SMTP_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SMTP_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>SMTP_DEBUG: Enable debugging for SNTP. </p>
+
+</div>
+</div>
+<a id="ga9aa5f5529121a8266947f33c5e424ccc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9aa5f5529121a8266947f33c5e424ccc">&#9670;&nbsp;</a></span>SMTP_MAX_PASS_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SMTP_MAX_PASS_LEN&#160;&#160;&#160;32</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Maximum length reserved for password </p>
+
+</div>
+</div>
+<a id="gaee3b273524a2253ce5fb44b240b0371b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaee3b273524a2253ce5fb44b240b0371b">&#9670;&nbsp;</a></span>SMTP_MAX_SERVERNAME_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SMTP_MAX_SERVERNAME_LEN&#160;&#160;&#160;256</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Maximum length reserved for server name including terminating 0 byte </p>
+
+</div>
+</div>
+<a id="gafa0c84e5279b8eb8a5dbea6fe97aa099"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafa0c84e5279b8eb8a5dbea6fe97aa099">&#9670;&nbsp;</a></span>SMTP_MAX_USERNAME_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SMTP_MAX_USERNAME_LEN&#160;&#160;&#160;32</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Maximum length reserved for username </p>
+
+</div>
+</div>
+<a id="ga7a83e686b109fa59557c13736aeeab3b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7a83e686b109fa59557c13736aeeab3b">&#9670;&nbsp;</a></span>SMTP_SUPPORT_AUTH_LOGIN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SMTP_SUPPORT_AUTH_LOGIN&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to enable AUTH LOGIN support </p>
+
+</div>
+</div>
+<a id="ga2e6c8313006592884e89bbcf353cf5ac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2e6c8313006592884e89bbcf353cf5ac">&#9670;&nbsp;</a></span>SMTP_SUPPORT_AUTH_PLAIN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SMTP_SUPPORT_AUTH_PLAIN&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to enable AUTH PLAIN support </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__smtp__opts.js b/doc/doxygen/output/html/group__smtp__opts.js
new file mode 100644
index 0000000..6e45897
--- /dev/null
+++ b/doc/doxygen/output/html/group__smtp__opts.js
@@ -0,0 +1,12 @@
+var group__smtp__opts =
+[
+    [ "SMTP_BODYDH", "group__smtp__opts.html#ga4b1667149354b7819847cb4f5f1ff144", null ],
+    [ "SMTP_CHECK_DATA", "group__smtp__opts.html#ga021d8133159895a2dbf5fb0b243da9fa", null ],
+    [ "SMTP_COPY_AUTHDATA", "group__smtp__opts.html#gab5559a7c976e72204d9391f655bcc07e", null ],
+    [ "SMTP_DEBUG", "group__smtp__opts.html#gae7ea4f31c521947d5127e268ae02c317", null ],
+    [ "SMTP_MAX_PASS_LEN", "group__smtp__opts.html#ga9aa5f5529121a8266947f33c5e424ccc", null ],
+    [ "SMTP_MAX_SERVERNAME_LEN", "group__smtp__opts.html#gaee3b273524a2253ce5fb44b240b0371b", null ],
+    [ "SMTP_MAX_USERNAME_LEN", "group__smtp__opts.html#gafa0c84e5279b8eb8a5dbea6fe97aa099", null ],
+    [ "SMTP_SUPPORT_AUTH_LOGIN", "group__smtp__opts.html#ga7a83e686b109fa59557c13736aeeab3b", null ],
+    [ "SMTP_SUPPORT_AUTH_PLAIN", "group__smtp__opts.html#ga2e6c8313006592884e89bbcf353cf5ac", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__snmp.html b/doc/doxygen/output/html/group__snmp.html
new file mode 100644
index 0000000..092ca0b
--- /dev/null
+++ b/doc/doxygen/output/html/group__snmp.html
@@ -0,0 +1,184 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: SNMPv2c/v3 agent</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__snmp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">SNMPv2c/v3 agent<div class="ingroups"><a class="el" href="group__apps.html">Applications</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__snmp__core"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html">Core</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__snmp__traps"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html">Traps</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__snmp__mib2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html">MIB2</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__snmp__opts"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html">Options</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>
+<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 style="display: none;">.nosp@m.</span>cl-s<span style="display: none;">.nosp@m.</span>oft.d<span style="display: none;">.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 style="display: none;">.nosp@m.</span>el@g<span style="display: none;">.nosp@m.</span>mx.de</a><br />
+ </p><h1>0 Agent Capabilities </h1>
+<h2>Features: </h2>
+<ul>
+<li>SNMPv2c support.</li>
+<li>SNMPv3 support (a port to ARM mbedtls is provided, LWIP_SNMP_V3_MBEDTLS option).</li>
+<li>Low RAM usage - no memory pools, stack only.</li>
+<li>MIB2 implementation is separated from SNMP stack.</li>
+<li>Support for multiple MIBs (<a class="el" href="group__snmp__core.html#ga29c76474971f25d038fd486447c70e21">snmp_set_mibs()</a> call) - e.g. for private MIB.</li>
+<li>Simple and generic API for MIB implementation.</li>
+<li>Comfortable node types and helper functions for scalar arrays and tables.</li>
+<li>Counter64, bit and truthvalue datatype support.</li>
+<li>Callbacks for SNMP writes e.g. to implement persistency.</li>
+<li>Runs on two APIs: RAW and netconn.</li>
+<li>Async API is gone - the stack now supports netconn API instead, so blocking operations can be done in MIB calls. SNMP runs in a worker thread when netconn API is used.</li>
+<li>Simplified thread sync support for MIBs - useful when MIBs need to access variables shared with other threads where no locking is possible. Used in MIB2 to access lwIP stats from lwIP thread.</li>
+</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>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>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>
+<ul>
+<li>Stack and MIB compiler were used to implement a Profinet device. Compiled/implemented MIBs: LLDP-MIB, LLDP-EXT-DOT3-MIB, LLDP-EXT-PNO-MIB.</li>
+</ul>
+<h2>SNMPv1 per RFC1157 and SNMPv2c per RFC 3416 </h2>
+<p>Note the S in SNMP stands for "Simple". Note that "Simple" is relative. SNMP is simple compared to the complex ISO network management protocols CMIP (Common Management Information Protocol) and CMOT (CMip Over Tcp).</p>
+<h2>SNMPv3 </h2>
+<p>When SNMPv3 is used, several functions from <a class="el" href="snmpv3_8h.html">snmpv3.h</a> must be implemented by the user. This is mainly user management and persistence handling. The sample provided in lwip-contrib is insecure, don't use it in production systems, especially the missing persistence for engine boots variable simplifies replay attacks.</p>
+<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>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>
+<h1>1 Building the Agent </h1>
+<p>First of all you'll need to add the following define to your local lwipopts.h: #define LWIP_SNMP 1</p>
+<p>and add the source files your makefile.</p>
+<p>Note you'll might need to adapt you network driver to update the mib2 variables for your interface.</p>
+<h1>2 Running the Agent </h1>
+<p>The following function calls must be made in your program to actually get the SNMP agent running.</p>
+<p>Before starting the agent you should supply pointers for sysContact, sysLocation, and snmpEnableAuthenTraps. You can do this by calling</p>
+<ul>
+<li><a class="el" href="group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e">snmp_mib2_set_syscontact()</a></li>
+<li><a class="el" href="group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2">snmp_mib2_set_syslocation()</a></li>
+<li><a class="el" href="group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c">snmp_set_auth_traps_enabled()</a></li>
+</ul>
+<p>You can register a callback which is called on successful write access: <a class="el" href="group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b">snmp_set_write_callback()</a>.</p>
+<p>Additionally you may want to set</p>
+<ul>
+<li><a class="el" href="group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc">snmp_mib2_set_sysdescr()</a></li>
+<li><a class="el" href="group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a">snmp_set_device_enterprise_oid()</a></li>
+<li><a class="el" href="group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7">snmp_mib2_set_sysname()</a></li>
+</ul>
+<p>Also before starting the agent you need to setup one or more trap destinations using these calls:</p>
+<ul>
+<li><a class="el" href="group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32">snmp_trap_dst_enable()</a></li>
+<li><a class="el" href="group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86">snmp_trap_dst_ip_set()</a></li>
+</ul>
+<p>If you need more than MIB2, set the MIBs you want to use by <a class="el" href="group__snmp__core.html#ga29c76474971f25d038fd486447c70e21">snmp_set_mibs()</a>.</p>
+<p>Finally, enable the agent by calling <a class="el" href="snmp__netconn_8c.html#ga4d88f2fc7655280384131d543e0d83e5">snmp_init()</a> </p>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__snmp.js b/doc/doxygen/output/html/group__snmp.js
new file mode 100644
index 0000000..b84ba14
--- /dev/null
+++ b/doc/doxygen/output/html/group__snmp.js
@@ -0,0 +1,7 @@
+var group__snmp =
+[
+    [ "Core", "group__snmp__core.html", "group__snmp__core" ],
+    [ "Traps", "group__snmp__traps.html", "group__snmp__traps" ],
+    [ "MIB2", "group__snmp__mib2.html", "group__snmp__mib2" ],
+    [ "Options", "group__snmp__opts.html", "group__snmp__opts" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__snmp__core.html b/doc/doxygen/output/html/group__snmp__core.html
new file mode 100644
index 0000000..a5e4480
--- /dev/null
+++ b/doc/doxygen/output/html/group__snmp__core.html
@@ -0,0 +1,329 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Core</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__snmp__core.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">Core<div class="ingroups"><a class="el" href="group__apps.html">Applications</a> &raquo; <a class="el" href="group__snmp.html">SNMPv2c/v3 agent</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga29c76474971f25d038fd486447c70e21"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#ga29c76474971f25d038fd486447c70e21">snmp_set_mibs</a> (const struct <a class="el" href="structsnmp__mib.html">snmp_mib</a> **mibs, u8_t num_mibs)</td></tr>
+<tr class="separator:ga29c76474971f25d038fd486447c70e21"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacc71ac857bf9215f06a624dda09abe3a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a">snmp_set_device_enterprise_oid</a> (const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *device_enterprise_oid)</td></tr>
+<tr class="separator:gacc71ac857bf9215f06a624dda09abe3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4dff82dda2553b9554a9f98561852a50"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#ga4dff82dda2553b9554a9f98561852a50">snmp_get_device_enterprise_oid</a> (void)</td></tr>
+<tr class="separator:ga4dff82dda2553b9554a9f98561852a50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacf277cbca915275190426aeef4cfb103"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#gacf277cbca915275190426aeef4cfb103">snmp_get_community</a> (void)</td></tr>
+<tr class="separator:gacf277cbca915275190426aeef4cfb103"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga30cc587a260757fdb2b81d462f430ef1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1">snmp_set_community</a> (const char *const community)</td></tr>
+<tr class="separator:ga30cc587a260757fdb2b81d462f430ef1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaba31b6f1816661df5a3b7f2076ee6ec0"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#gaba31b6f1816661df5a3b7f2076ee6ec0">snmp_get_community_write</a> (void)</td></tr>
+<tr class="separator:gaba31b6f1816661df5a3b7f2076ee6ec0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga341461766863cff46a44e5f431f2da01"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#ga341461766863cff46a44e5f431f2da01">snmp_set_community_write</a> (const char *const community)</td></tr>
+<tr class="separator:ga341461766863cff46a44e5f431f2da01"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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:ga4d88f2fc7655280384131d543e0d83e5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5">snmp_init</a> (void)</td></tr>
+<tr class="separator:ga4d88f2fc7655280384131d543e0d83e5"><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="gacf277cbca915275190426aeef4cfb103"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacf277cbca915275190426aeef4cfb103">&#9670;&nbsp;</a></span>snmp_get_community()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* snmp_get_community </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns current SNMP community string. </p><dl class="section return"><dt>Returns</dt><dd>current SNMP community string </dd></dl>
+
+</div>
+</div>
+<a id="gaba31b6f1816661df5a3b7f2076ee6ec0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaba31b6f1816661df5a3b7f2076ee6ec0">&#9670;&nbsp;</a></span>snmp_get_community_write()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* snmp_get_community_write </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns current SNMP write-access community string. </p><dl class="section return"><dt>Returns</dt><dd>current SNMP write-access community string </dd></dl>
+
+</div>
+</div>
+<a id="ga4dff82dda2553b9554a9f98561852a50"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4dff82dda2553b9554a9f98561852a50">&#9670;&nbsp;</a></span>snmp_get_device_enterprise_oid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a>* snmp_get_device_enterprise_oid </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get 'device enterprise oid' </p>
+
+</div>
+</div>
+<a id="ga4d88f2fc7655280384131d543e0d83e5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4d88f2fc7655280384131d543e0d83e5">&#9670;&nbsp;</a></span>snmp_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Starts SNMP Agent. Allocates UDP pcb and binds it to IP_ANY_TYPE port 161.</p>
+<p>Agent setup, start listening to port 161. </p>
+
+</div>
+</div>
+<a id="ga30cc587a260757fdb2b81d462f430ef1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga30cc587a260757fdb2b81d462f430ef1">&#9670;&nbsp;</a></span>snmp_set_community()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_set_community </td>
+          <td>(</td>
+          <td class="paramtype">const char *const&#160;</td>
+          <td class="paramname"><em>community</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sets SNMP community string. The string itself (its storage) must be valid throughout the whole life of program (or until it is changed to sth else).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">community</td><td>is a pointer to new community string </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga341461766863cff46a44e5f431f2da01"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga341461766863cff46a44e5f431f2da01">&#9670;&nbsp;</a></span>snmp_set_community_write()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_set_community_write </td>
+          <td>(</td>
+          <td class="paramtype">const char *const&#160;</td>
+          <td class="paramname"><em>community</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sets SNMP community string for write-access. The string itself (its storage) must be valid throughout the whole life of program (or until it is changed to sth else).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">community</td><td>is a pointer to new write-access community string </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gacc71ac857bf9215f06a624dda09abe3a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacc71ac857bf9215f06a624dda09abe3a">&#9670;&nbsp;</a></span>snmp_set_device_enterprise_oid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_set_device_enterprise_oid </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *&#160;</td>
+          <td class="paramname"><em>device_enterprise_oid</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>'device enterprise oid' is used for 'device OID' field in trap PDU's (for identification of generating device) as well as for value returned by MIB-2 'sysObjectID' field (if internal MIB2 implementation is used). The 'device enterprise oid' shall point to an OID located under 'private-enterprises' branch (1.3.6.1.4.1.XXX). If a vendor wants to provide a custom object there, he has to get its own enterprise oid from IANA (<a href="http://www.iana.org">http://www.iana.org</a>). It is not allowed to use LWIP enterprise ID! In order to identify a specific device it is recommended to create a dedicated OID for each device type under its own enterprise oid. e.g. device a &gt; 1.3.6.1.4.1.XXX(ent-oid).1(devices).1(device a) device b &gt; 1.3.6.1.4.1.XXX(ent-oid).1(devices).2(device b) for more details see description of 'sysObjectID' field in RFC1213-MIB </p>
+
+</div>
+</div>
+<a id="ga29c76474971f25d038fd486447c70e21"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga29c76474971f25d038fd486447c70e21">&#9670;&nbsp;</a></span>snmp_set_mibs()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_set_mibs </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structsnmp__mib.html">snmp_mib</a> **&#160;</td>
+          <td class="paramname"><em>mibs</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>num_mibs</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sets the MIBs to use. Example: call <a class="el" href="group__snmp__core.html#ga29c76474971f25d038fd486447c70e21">snmp_set_mibs()</a> as follows: static const struct <a class="el" href="structsnmp__mib.html">snmp_mib</a> *my_snmp_mibs[] = { &amp;mib2, &amp;private_mib }; snmp_set_mibs(my_snmp_mibs, LWIP_ARRAYSIZE(my_snmp_mibs)); </p>
+
+</div>
+</div>
+<a id="gaff6a6b39322e92862ab55cfcddfe254b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaff6a6b39322e92862ab55cfcddfe254b">&#9670;&nbsp;</a></span>snmp_set_write_callback()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_set_write_callback </td>
+          <td>(</td>
+          <td class="paramtype">snmp_write_callback_fct&#160;</td>
+          <td class="paramname"><em>write_callback</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>callback_arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Callback fired on every successful write access </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__snmp__core.js b/doc/doxygen/output/html/group__snmp__core.js
new file mode 100644
index 0000000..46de97b
--- /dev/null
+++ b/doc/doxygen/output/html/group__snmp__core.js
@@ -0,0 +1,12 @@
+var group__snmp__core =
+[
+    [ "snmp_get_community", "group__snmp__core.html#gacf277cbca915275190426aeef4cfb103", null ],
+    [ "snmp_get_community_write", "group__snmp__core.html#gaba31b6f1816661df5a3b7f2076ee6ec0", null ],
+    [ "snmp_get_device_enterprise_oid", "group__snmp__core.html#ga4dff82dda2553b9554a9f98561852a50", null ],
+    [ "snmp_init", "group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5", null ],
+    [ "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_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
new file mode 100644
index 0000000..ed9871d
--- /dev/null
+++ b/doc/doxygen/output/html/group__snmp__mib2.html
@@ -0,0 +1,373 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: MIB2</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__snmp__mib2.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">MIB2<div class="ingroups"><a class="el" href="group__apps.html">Applications</a> &raquo; <a class="el" href="group__snmp.html">SNMPv2c/v3 agent</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gacde87dc1d3bd669b19d834b028f490cc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc">snmp_mib2_set_sysdescr</a> (const u8_t *str, const u16_t *len)</td></tr>
+<tr class="separator:gacde87dc1d3bd669b19d834b028f490cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf96002d9d10bcae27a95b2367674249e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e">snmp_mib2_set_syscontact</a> (u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize)</td></tr>
+<tr class="separator:gaf96002d9d10bcae27a95b2367674249e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga53339a03d720c745790837905bc2171a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a">snmp_mib2_set_syscontact_readonly</a> (const u8_t *ocstr, const u16_t *ocstrlen)</td></tr>
+<tr class="separator:ga53339a03d720c745790837905bc2171a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae7ce98a6ecc0bb92aaa2b330599a2db7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7">snmp_mib2_set_sysname</a> (u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize)</td></tr>
+<tr class="separator:gae7ce98a6ecc0bb92aaa2b330599a2db7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab95eb687492fa0e7d762f911c442bdc5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5">snmp_mib2_set_sysname_readonly</a> (const u8_t *ocstr, const u16_t *ocstrlen)</td></tr>
+<tr class="separator:gab95eb687492fa0e7d762f911c442bdc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4248e004a27344b7260574c3a51882f2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2">snmp_mib2_set_syslocation</a> (u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize)</td></tr>
+<tr class="separator:ga4248e004a27344b7260574c3a51882f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac1759d5b0640943697be2ad538325267"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267">snmp_mib2_set_syslocation_readonly</a> (const u8_t *ocstr, const u16_t *ocstrlen)</td></tr>
+<tr class="separator:gac1759d5b0640943697be2ad538325267"><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="gaf96002d9d10bcae27a95b2367674249e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf96002d9d10bcae27a95b2367674249e">&#9670;&nbsp;</a></span>snmp_mib2_set_syscontact()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_mib2_set_syscontact </td>
+          <td>(</td>
+          <td class="paramtype">u8_t *&#160;</td>
+          <td class="paramname"><em>ocstr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>ocstrlen</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>bufsize</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initializes sysContact pointers</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ocstr</td><td>if non-NULL then copy str pointer </td></tr>
+    <tr><td class="paramname">ocstrlen</td><td>points to string length, excluding zero terminator. if set to NULL it is assumed that ocstr is NULL-terminated. </td></tr>
+    <tr><td class="paramname">bufsize</td><td>size of the buffer in bytes. (this is required because the buffer can be overwritten by snmp-set) if ocstrlen is NULL buffer needs space for terminating 0 byte. otherwise complete buffer is used for string. if bufsize is set to 0, the value is regarded as read-only. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga53339a03d720c745790837905bc2171a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga53339a03d720c745790837905bc2171a">&#9670;&nbsp;</a></span>snmp_mib2_set_syscontact_readonly()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_mib2_set_syscontact_readonly </td>
+          <td>(</td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>ocstr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u16_t *&#160;</td>
+          <td class="paramname"><em>ocstrlen</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>see <a class="el" href="group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e">snmp_mib2_set_syscontact</a> but set pointer to readonly memory </p>
+
+</div>
+</div>
+<a id="gacde87dc1d3bd669b19d834b028f490cc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacde87dc1d3bd669b19d834b028f490cc">&#9670;&nbsp;</a></span>snmp_mib2_set_sysdescr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_mib2_set_sysdescr </td>
+          <td>(</td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>str</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u16_t *&#160;</td>
+          <td class="paramname"><em>len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initializes sysDescr pointers.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">str</td><td>if non-NULL then copy str pointer </td></tr>
+    <tr><td class="paramname">len</td><td>points to string length, excluding zero terminator </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga4248e004a27344b7260574c3a51882f2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4248e004a27344b7260574c3a51882f2">&#9670;&nbsp;</a></span>snmp_mib2_set_syslocation()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_mib2_set_syslocation </td>
+          <td>(</td>
+          <td class="paramtype">u8_t *&#160;</td>
+          <td class="paramname"><em>ocstr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>ocstrlen</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>bufsize</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initializes sysLocation pointers</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ocstr</td><td>if non-NULL then copy str pointer </td></tr>
+    <tr><td class="paramname">ocstrlen</td><td>points to string length, excluding zero terminator. if set to NULL it is assumed that ocstr is NULL-terminated. </td></tr>
+    <tr><td class="paramname">bufsize</td><td>size of the buffer in bytes. (this is required because the buffer can be overwritten by snmp-set) if ocstrlen is NULL buffer needs space for terminating 0 byte. otherwise complete buffer is used for string. if bufsize is set to 0, the value is regarded as read-only. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gac1759d5b0640943697be2ad538325267"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac1759d5b0640943697be2ad538325267">&#9670;&nbsp;</a></span>snmp_mib2_set_syslocation_readonly()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_mib2_set_syslocation_readonly </td>
+          <td>(</td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>ocstr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u16_t *&#160;</td>
+          <td class="paramname"><em>ocstrlen</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>see <a class="el" href="group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2">snmp_mib2_set_syslocation</a> but set pointer to readonly memory </p>
+
+</div>
+</div>
+<a id="gae7ce98a6ecc0bb92aaa2b330599a2db7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae7ce98a6ecc0bb92aaa2b330599a2db7">&#9670;&nbsp;</a></span>snmp_mib2_set_sysname()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_mib2_set_sysname </td>
+          <td>(</td>
+          <td class="paramtype">u8_t *&#160;</td>
+          <td class="paramname"><em>ocstr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>ocstrlen</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>bufsize</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initializes sysName pointers</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ocstr</td><td>if non-NULL then copy str pointer </td></tr>
+    <tr><td class="paramname">ocstrlen</td><td>points to string length, excluding zero terminator. if set to NULL it is assumed that ocstr is NULL-terminated. </td></tr>
+    <tr><td class="paramname">bufsize</td><td>size of the buffer in bytes. (this is required because the buffer can be overwritten by snmp-set) if ocstrlen is NULL buffer needs space for terminating 0 byte. otherwise complete buffer is used for string. if bufsize is set to 0, the value is regarded as read-only. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gab95eb687492fa0e7d762f911c442bdc5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab95eb687492fa0e7d762f911c442bdc5">&#9670;&nbsp;</a></span>snmp_mib2_set_sysname_readonly()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_mib2_set_sysname_readonly </td>
+          <td>(</td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>ocstr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u16_t *&#160;</td>
+          <td class="paramname"><em>ocstrlen</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>see <a class="el" href="group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7">snmp_mib2_set_sysname</a> but set pointer to readonly memory </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__snmp__mib2.js b/doc/doxygen/output/html/group__snmp__mib2.js
new file mode 100644
index 0000000..488f0c3
--- /dev/null
+++ b/doc/doxygen/output/html/group__snmp__mib2.js
@@ -0,0 +1,10 @@
+var group__snmp__mib2 =
+[
+    [ "snmp_mib2_set_syscontact", "group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e", null ],
+    [ "snmp_mib2_set_syscontact_readonly", "group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a", null ],
+    [ "snmp_mib2_set_sysdescr", "group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc", null ],
+    [ "snmp_mib2_set_syslocation", "group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2", null ],
+    [ "snmp_mib2_set_syslocation_readonly", "group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267", null ],
+    [ "snmp_mib2_set_sysname", "group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7", null ],
+    [ "snmp_mib2_set_sysname_readonly", "group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__snmp__opts.html b/doc/doxygen/output/html/group__snmp__opts.html
new file mode 100644
index 0000000..60e8fc3
--- /dev/null
+++ b/doc/doxygen/output/html/group__snmp__opts.html
@@ -0,0 +1,553 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Options</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__snmp__opts.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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__snmp.html">SNMPv2c/v3 agent</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gaf4900859dc53f19f5f67cc34e48ad68c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gaf4900859dc53f19f5f67cc34e48ad68c">LWIP_SNMP</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaf4900859dc53f19f5f67cc34e48ad68c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf02e8b4b69e99df784e9953401477078"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gaf02e8b4b69e99df784e9953401477078">SNMP_USE_NETCONN</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaf02e8b4b69e99df784e9953401477078"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8c93f4260af2eb3c50d4bc603f716f1f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga8c93f4260af2eb3c50d4bc603f716f1f">SNMP_USE_RAW</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga8c93f4260af2eb3c50d4bc603f716f1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0dcacdccc61216c6773943ad3fd31242"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga0dcacdccc61216c6773943ad3fd31242">SNMP_STACK_SIZE</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__thread.html#ga7f93dfeaed4021061959f822def602cb">DEFAULT_THREAD_STACKSIZE</a></td></tr>
+<tr class="separator:ga0dcacdccc61216c6773943ad3fd31242"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad9bce0d9c05ed4607d72de7b75f2a80b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gad9bce0d9c05ed4607d72de7b75f2a80b">SNMP_THREAD_PRIO</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__thread.html#ga3d8715b1fdd0449d6c214e4a40108456">DEFAULT_THREAD_PRIO</a></td></tr>
+<tr class="separator:gad9bce0d9c05ed4607d72de7b75f2a80b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga692343b0cc555c302fd713003d4f8a08"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga692343b0cc555c302fd713003d4f8a08">SNMP_TRAP_DESTINATIONS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga692343b0cc555c302fd713003d4f8a08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga95e39047b9bcb385780b06b35af49261"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga95e39047b9bcb385780b06b35af49261">SNMP_SAFE_REQUESTS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga95e39047b9bcb385780b06b35af49261"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae50cdd09697aa54a8b9f26432ac55ac2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gae50cdd09697aa54a8b9f26432ac55ac2">SNMP_MAX_OCTET_STRING_LEN</a>&#160;&#160;&#160;127</td></tr>
+<tr class="separator:gae50cdd09697aa54a8b9f26432ac55ac2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3ad9d293f90e3c885c4e3263a9064a41"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga3ad9d293f90e3c885c4e3263a9064a41">SNMP_MAX_OBJ_ID_LEN</a>&#160;&#160;&#160;50</td></tr>
+<tr class="separator:ga3ad9d293f90e3c885c4e3263a9064a41"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac815d0dbe576299546ac612e7eaf3f90"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gac815d0dbe576299546ac612e7eaf3f90">SNMP_MIN_VALUE_SIZE</a>&#160;&#160;&#160;(2 * sizeof(u32_t*)) /* size required to store the basic types (8 bytes for counter64) */</td></tr>
+<tr class="separator:gac815d0dbe576299546ac612e7eaf3f90"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafb4362575bc50476a7401a1ed14787f0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gafb4362575bc50476a7401a1ed14787f0">SNMP_MAX_VALUE_SIZE</a>&#160;&#160;&#160;LWIP_MAX(LWIP_MAX((<a class="el" href="group__snmp__opts.html#gae50cdd09697aa54a8b9f26432ac55ac2">SNMP_MAX_OCTET_STRING_LEN</a>), sizeof(u32_t)*(<a class="el" href="group__snmp__opts.html#ga3ad9d293f90e3c885c4e3263a9064a41">SNMP_MAX_OBJ_ID_LEN</a>)), <a class="el" href="group__snmp__opts.html#gac815d0dbe576299546ac612e7eaf3f90">SNMP_MIN_VALUE_SIZE</a>)</td></tr>
+<tr class="separator:gafb4362575bc50476a7401a1ed14787f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga316c1e1f06f0c7ca56589563809e64db"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga316c1e1f06f0c7ca56589563809e64db">SNMP_COMMUNITY</a>&#160;&#160;&#160;&quot;public&quot;</td></tr>
+<tr class="separator:ga316c1e1f06f0c7ca56589563809e64db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafb9414dc7a33978b62a3a9838b659464"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gafb9414dc7a33978b62a3a9838b659464">SNMP_COMMUNITY_WRITE</a>&#160;&#160;&#160;&quot;private&quot;</td></tr>
+<tr class="separator:gafb9414dc7a33978b62a3a9838b659464"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaefc9dda5f8e5c296018a463cdbac39b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gaaefc9dda5f8e5c296018a463cdbac39b">SNMP_COMMUNITY_TRAP</a>&#160;&#160;&#160;&quot;public&quot;</td></tr>
+<tr class="separator:gaaefc9dda5f8e5c296018a463cdbac39b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0e98b58159a77688f87f9f50479177fd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga0e98b58159a77688f87f9f50479177fd">SNMP_MAX_COMMUNITY_STR_LEN</a>&#160;&#160;&#160;LWIP_MAX(LWIP_MAX(sizeof(<a class="el" href="group__snmp__opts.html#ga316c1e1f06f0c7ca56589563809e64db">SNMP_COMMUNITY</a>), sizeof(<a class="el" href="group__snmp__opts.html#gafb9414dc7a33978b62a3a9838b659464">SNMP_COMMUNITY_WRITE</a>)), sizeof(<a class="el" href="group__snmp__opts.html#gaaefc9dda5f8e5c296018a463cdbac39b">SNMP_COMMUNITY_TRAP</a>))</td></tr>
+<tr class="separator:ga0e98b58159a77688f87f9f50479177fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga868bfef6efe05515c86291137a633479"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga868bfef6efe05515c86291137a633479">SNMP_LWIP_ENTERPRISE_OID</a>&#160;&#160;&#160;26381</td></tr>
+<tr class="separator:ga868bfef6efe05515c86291137a633479"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga09118b734e85df152af098744e888b34"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga09118b734e85df152af098744e888b34">SNMP_DEVICE_ENTERPRISE_OID</a>&#160;&#160;&#160;{1, 3, 6, 1, 4, 1, <a class="el" href="group__snmp__opts.html#ga868bfef6efe05515c86291137a633479">SNMP_LWIP_ENTERPRISE_OID</a>}</td></tr>
+<tr class="separator:ga09118b734e85df152af098744e888b34"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9e39ba5308f5c7ac5296c7d05fdfa97f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga9e39ba5308f5c7ac5296c7d05fdfa97f">SNMP_DEVICE_ENTERPRISE_OID_LEN</a>&#160;&#160;&#160;7</td></tr>
+<tr class="separator:ga9e39ba5308f5c7ac5296c7d05fdfa97f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac041000361342f51ad5ee5d8f6254e02"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gac041000361342f51ad5ee5d8f6254e02">SNMP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gac041000361342f51ad5ee5d8f6254e02"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac12240265db443eaf9d31d187e586c16"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gac12240265db443eaf9d31d187e586c16">SNMP_MIB_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gac12240265db443eaf9d31d187e586c16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaab667d48f48ee89f8bdbc7f134e6037d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gaab667d48f48ee89f8bdbc7f134e6037d">SNMP_LWIP_MIB2</a>&#160;&#160;&#160;<a class="el" href="group__snmp__opts.html#gaf4900859dc53f19f5f67cc34e48ad68c">LWIP_SNMP</a></td></tr>
+<tr class="separator:gaab667d48f48ee89f8bdbc7f134e6037d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae93a105b421a2ca91e862da5087cec73"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gae93a105b421a2ca91e862da5087cec73">SNMP_LWIP_MIB2_SYSDESC</a>&#160;&#160;&#160;&quot;lwIP&quot;</td></tr>
+<tr class="separator:gae93a105b421a2ca91e862da5087cec73"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga80ba46f9517a51b5477f13082b2bcf98"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga80ba46f9517a51b5477f13082b2bcf98">SNMP_LWIP_MIB2_SYSNAME</a>&#160;&#160;&#160;&quot;FQDN-unk&quot;</td></tr>
+<tr class="separator:ga80ba46f9517a51b5477f13082b2bcf98"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1a57501c615b630d363e0af1a504e683"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga1a57501c615b630d363e0af1a504e683">SNMP_LWIP_MIB2_SYSCONTACT</a>&#160;&#160;&#160;&quot;&quot;</td></tr>
+<tr class="separator:ga1a57501c615b630d363e0af1a504e683"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga311cec98c8f7e4851d325fffe96cf8d9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga311cec98c8f7e4851d325fffe96cf8d9">SNMP_LWIP_MIB2_SYSLOCATION</a>&#160;&#160;&#160;&quot;&quot;</td></tr>
+<tr class="separator:ga311cec98c8f7e4851d325fffe96cf8d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5a24152aa5f3c2837b9a3145aa3c59f3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga5a24152aa5f3c2837b9a3145aa3c59f3">SNMP_LWIP_GETBULK_MAX_REPETITIONS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga5a24152aa5f3c2837b9a3145aa3c59f3"><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="gaf4900859dc53f19f5f67cc34e48ad68c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf4900859dc53f19f5f67cc34e48ad68c">&#9670;&nbsp;</a></span>LWIP_SNMP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_SNMP&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_SNMP==1: This enables the lwIP SNMP agent. UDP must be available for SNMP transport. If you want to use your own SNMP agent, leave this disabled. To integrate MIB2 of an external agent, you need to enable LWIP_MIB2_CALLBACKS and MIB2_STATS. This will give you the callbacks and statistics counters you need to get MIB2 working. </p>
+
+</div>
+</div>
+<a id="ga316c1e1f06f0c7ca56589563809e64db"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga316c1e1f06f0c7ca56589563809e64db">&#9670;&nbsp;</a></span>SNMP_COMMUNITY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_COMMUNITY&#160;&#160;&#160;&quot;public&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The snmp read-access community. Used for write-access and traps, too unless SNMP_COMMUNITY_WRITE or SNMP_COMMUNITY_TRAP are enabled, respectively. </p>
+
+</div>
+</div>
+<a id="gaaefc9dda5f8e5c296018a463cdbac39b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaaefc9dda5f8e5c296018a463cdbac39b">&#9670;&nbsp;</a></span>SNMP_COMMUNITY_TRAP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_COMMUNITY_TRAP&#160;&#160;&#160;&quot;public&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The snmp community used for sending traps. </p>
+
+</div>
+</div>
+<a id="gafb9414dc7a33978b62a3a9838b659464"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafb9414dc7a33978b62a3a9838b659464">&#9670;&nbsp;</a></span>SNMP_COMMUNITY_WRITE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_COMMUNITY_WRITE&#160;&#160;&#160;&quot;private&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The snmp write-access community. Set this community to "" in order to disallow any write access. </p>
+
+</div>
+</div>
+<a id="gac041000361342f51ad5ee5d8f6254e02"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac041000361342f51ad5ee5d8f6254e02">&#9670;&nbsp;</a></span>SNMP_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_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>SNMP_DEBUG: Enable debugging for SNMP messages. </p>
+
+</div>
+</div>
+<a id="ga09118b734e85df152af098744e888b34"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga09118b734e85df152af098744e888b34">&#9670;&nbsp;</a></span>SNMP_DEVICE_ENTERPRISE_OID</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_DEVICE_ENTERPRISE_OID&#160;&#160;&#160;{1, 3, 6, 1, 4, 1, <a class="el" href="group__snmp__opts.html#ga868bfef6efe05515c86291137a633479">SNMP_LWIP_ENTERPRISE_OID</a>}</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IANA assigned enterprise ID for lwIP is 26381 </p><dl class="section see"><dt>See also</dt><dd><a href="http://www.iana.org/assignments/enterprise-numbers">http://www.iana.org/assignments/enterprise-numbers</a></dd></dl>
+<dl class="section note"><dt>Note</dt><dd>this enterprise ID is assigned to the lwIP project, all object identifiers living under this ID are assigned by the lwIP maintainers! </dd>
+<dd>
+don't change this define, use <a class="el" href="group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a">snmp_set_device_enterprise_oid()</a></dd></dl>
+<p>If you need to create your own private MIB you'll need to apply for your own enterprise ID with IANA: <a href="http://www.iana.org/numbers.html">http://www.iana.org/numbers.html</a> </p>
+
+</div>
+</div>
+<a id="ga9e39ba5308f5c7ac5296c7d05fdfa97f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9e39ba5308f5c7ac5296c7d05fdfa97f">&#9670;&nbsp;</a></span>SNMP_DEVICE_ENTERPRISE_OID_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_DEVICE_ENTERPRISE_OID_LEN&#160;&#160;&#160;7</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Length of SNMP_DEVICE_ENTERPRISE_OID </p>
+
+</div>
+</div>
+<a id="ga868bfef6efe05515c86291137a633479"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga868bfef6efe05515c86291137a633479">&#9670;&nbsp;</a></span>SNMP_LWIP_ENTERPRISE_OID</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_LWIP_ENTERPRISE_OID&#160;&#160;&#160;26381</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The OID identifiying the device. This may be the enterprise OID itself or any OID located below it in tree. </p>
+
+</div>
+</div>
+<a id="ga5a24152aa5f3c2837b9a3145aa3c59f3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5a24152aa5f3c2837b9a3145aa3c59f3">&#9670;&nbsp;</a></span>SNMP_LWIP_GETBULK_MAX_REPETITIONS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_LWIP_GETBULK_MAX_REPETITIONS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This value is used to limit the repetitions processed in GetBulk requests (value == 0 means no limitation). This may be useful to limit the load for a single request. According to SNMP RFC 1905 it is allowed to not return all requested variables from a GetBulk request if system load would be too high. so the effect is that the client will do more requests to gather all data. For the stack this could be useful in case that SNMP processing is done in TCP/IP thread. In this situation a request with many repetitions could block the thread for a longer time. Setting limit here will keep the stack more responsive. </p>
+
+</div>
+</div>
+<a id="gaab667d48f48ee89f8bdbc7f134e6037d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaab667d48f48ee89f8bdbc7f134e6037d">&#9670;&nbsp;</a></span>SNMP_LWIP_MIB2</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_LWIP_MIB2&#160;&#160;&#160;<a class="el" href="group__snmp__opts.html#gaf4900859dc53f19f5f67cc34e48ad68c">LWIP_SNMP</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Indicates if the MIB2 implementation of LWIP SNMP stack is used. </p>
+
+</div>
+</div>
+<a id="ga1a57501c615b630d363e0af1a504e683"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1a57501c615b630d363e0af1a504e683">&#9670;&nbsp;</a></span>SNMP_LWIP_MIB2_SYSCONTACT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_LWIP_MIB2_SYSCONTACT&#160;&#160;&#160;&quot;&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Value return for sysContact field of MIB2. To make sysContact field settable, call <a class="el" href="group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e">snmp_mib2_set_syscontact()</a> to provide the necessary buffers. </p>
+
+</div>
+</div>
+<a id="gae93a105b421a2ca91e862da5087cec73"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae93a105b421a2ca91e862da5087cec73">&#9670;&nbsp;</a></span>SNMP_LWIP_MIB2_SYSDESC</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_LWIP_MIB2_SYSDESC&#160;&#160;&#160;&quot;lwIP&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Value return for sysDesc field of MIB2. </p>
+
+</div>
+</div>
+<a id="ga311cec98c8f7e4851d325fffe96cf8d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga311cec98c8f7e4851d325fffe96cf8d9">&#9670;&nbsp;</a></span>SNMP_LWIP_MIB2_SYSLOCATION</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_LWIP_MIB2_SYSLOCATION&#160;&#160;&#160;&quot;&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Value return for sysLocation field of MIB2. To make sysLocation field settable, call <a class="el" href="group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2">snmp_mib2_set_syslocation()</a> to provide the necessary buffers. </p>
+
+</div>
+</div>
+<a id="ga80ba46f9517a51b5477f13082b2bcf98"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga80ba46f9517a51b5477f13082b2bcf98">&#9670;&nbsp;</a></span>SNMP_LWIP_MIB2_SYSNAME</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_LWIP_MIB2_SYSNAME&#160;&#160;&#160;&quot;FQDN-unk&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Value return for sysName field of MIB2. To make sysName field settable, call <a class="el" href="group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7">snmp_mib2_set_sysname()</a> to provide the necessary buffers. </p>
+
+</div>
+</div>
+<a id="ga0e98b58159a77688f87f9f50479177fd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0e98b58159a77688f87f9f50479177fd">&#9670;&nbsp;</a></span>SNMP_MAX_COMMUNITY_STR_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_MAX_COMMUNITY_STR_LEN&#160;&#160;&#160;LWIP_MAX(LWIP_MAX(sizeof(<a class="el" href="group__snmp__opts.html#ga316c1e1f06f0c7ca56589563809e64db">SNMP_COMMUNITY</a>), sizeof(<a class="el" href="group__snmp__opts.html#gafb9414dc7a33978b62a3a9838b659464">SNMP_COMMUNITY_WRITE</a>)), sizeof(<a class="el" href="group__snmp__opts.html#gaaefc9dda5f8e5c296018a463cdbac39b">SNMP_COMMUNITY_TRAP</a>))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The maximum length of community string. If community names shall be adjusted at runtime via <a class="el" href="group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1">snmp_set_community()</a> calls, enter here the possible maximum length (+1 for terminating null character). </p>
+
+</div>
+</div>
+<a id="ga3ad9d293f90e3c885c4e3263a9064a41"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3ad9d293f90e3c885c4e3263a9064a41">&#9670;&nbsp;</a></span>SNMP_MAX_OBJ_ID_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_MAX_OBJ_ID_LEN&#160;&#160;&#160;50</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The maximum number of Sub ID's inside an object identifier. Indirectly this also limits the maximum depth of SNMP tree. </p>
+
+</div>
+</div>
+<a id="gae50cdd09697aa54a8b9f26432ac55ac2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae50cdd09697aa54a8b9f26432ac55ac2">&#9670;&nbsp;</a></span>SNMP_MAX_OCTET_STRING_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_MAX_OCTET_STRING_LEN&#160;&#160;&#160;127</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The maximum length of strings used. </p>
+
+</div>
+</div>
+<a id="gafb4362575bc50476a7401a1ed14787f0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafb4362575bc50476a7401a1ed14787f0">&#9670;&nbsp;</a></span>SNMP_MAX_VALUE_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_MAX_VALUE_SIZE&#160;&#160;&#160;LWIP_MAX(LWIP_MAX((<a class="el" href="group__snmp__opts.html#gae50cdd09697aa54a8b9f26432ac55ac2">SNMP_MAX_OCTET_STRING_LEN</a>), sizeof(u32_t)*(<a class="el" href="group__snmp__opts.html#ga3ad9d293f90e3c885c4e3263a9064a41">SNMP_MAX_OBJ_ID_LEN</a>)), <a class="el" href="group__snmp__opts.html#gac815d0dbe576299546ac612e7eaf3f90">SNMP_MIN_VALUE_SIZE</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The maximum size of a value. </p>
+
+</div>
+</div>
+<a id="gac12240265db443eaf9d31d187e586c16"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac12240265db443eaf9d31d187e586c16">&#9670;&nbsp;</a></span>SNMP_MIB_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_MIB_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>SNMP_MIB_DEBUG: Enable debugging for SNMP MIBs. </p>
+
+</div>
+</div>
+<a id="gac815d0dbe576299546ac612e7eaf3f90"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac815d0dbe576299546ac612e7eaf3f90">&#9670;&nbsp;</a></span>SNMP_MIN_VALUE_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_MIN_VALUE_SIZE&#160;&#160;&#160;(2 * sizeof(u32_t*)) /* size required to store the basic types (8 bytes for counter64) */</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The minimum size of a value. </p>
+
+</div>
+</div>
+<a id="ga95e39047b9bcb385780b06b35af49261"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga95e39047b9bcb385780b06b35af49261">&#9670;&nbsp;</a></span>SNMP_SAFE_REQUESTS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_SAFE_REQUESTS&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Only allow SNMP write actions that are 'safe' (e.g. disabling netifs is not a safe action and disabled when SNMP_SAFE_REQUESTS = 1). Unsafe requests are disabled by default! </p>
+
+</div>
+</div>
+<a id="ga0dcacdccc61216c6773943ad3fd31242"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0dcacdccc61216c6773943ad3fd31242">&#9670;&nbsp;</a></span>SNMP_STACK_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_STACK_SIZE&#160;&#160;&#160;<a class="el" href="group__lwip__opts__thread.html#ga7f93dfeaed4021061959f822def602cb">DEFAULT_THREAD_STACKSIZE</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SNMP_STACK_SIZE: Stack size of SNMP netconn worker thread </p>
+
+</div>
+</div>
+<a id="gad9bce0d9c05ed4607d72de7b75f2a80b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad9bce0d9c05ed4607d72de7b75f2a80b">&#9670;&nbsp;</a></span>SNMP_THREAD_PRIO</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_THREAD_PRIO&#160;&#160;&#160;<a class="el" href="group__lwip__opts__thread.html#ga3d8715b1fdd0449d6c214e4a40108456">DEFAULT_THREAD_PRIO</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SNMP_THREAD_PRIO: SNMP netconn worker thread priority </p>
+
+</div>
+</div>
+<a id="ga692343b0cc555c302fd713003d4f8a08"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga692343b0cc555c302fd713003d4f8a08">&#9670;&nbsp;</a></span>SNMP_TRAP_DESTINATIONS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_TRAP_DESTINATIONS&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SNMP_TRAP_DESTINATIONS: Number of trap destinations. At least one trap destination is required </p>
+
+</div>
+</div>
+<a id="gaf02e8b4b69e99df784e9953401477078"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf02e8b4b69e99df784e9953401477078">&#9670;&nbsp;</a></span>SNMP_USE_NETCONN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_USE_NETCONN&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SNMP_USE_NETCONN: Use netconn API instead of raw API. Makes SNMP agent run in a worker thread, so blocking operations can be done in MIB calls. </p>
+
+</div>
+</div>
+<a id="ga8c93f4260af2eb3c50d4bc603f716f1f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8c93f4260af2eb3c50d4bc603f716f1f">&#9670;&nbsp;</a></span>SNMP_USE_RAW</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_USE_RAW&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SNMP_USE_RAW: Use raw API. SNMP agent does not run in a worker thread, so blocking operations should not be done in MIB calls. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__snmp__opts.js b/doc/doxygen/output/html/group__snmp__opts.js
new file mode 100644
index 0000000..16059ca
--- /dev/null
+++ b/doc/doxygen/output/html/group__snmp__opts.js
@@ -0,0 +1,29 @@
+var group__snmp__opts =
+[
+    [ "LWIP_SNMP", "group__snmp__opts.html#gaf4900859dc53f19f5f67cc34e48ad68c", null ],
+    [ "SNMP_COMMUNITY", "group__snmp__opts.html#ga316c1e1f06f0c7ca56589563809e64db", null ],
+    [ "SNMP_COMMUNITY_TRAP", "group__snmp__opts.html#gaaefc9dda5f8e5c296018a463cdbac39b", null ],
+    [ "SNMP_COMMUNITY_WRITE", "group__snmp__opts.html#gafb9414dc7a33978b62a3a9838b659464", null ],
+    [ "SNMP_DEBUG", "group__snmp__opts.html#gac041000361342f51ad5ee5d8f6254e02", null ],
+    [ "SNMP_DEVICE_ENTERPRISE_OID", "group__snmp__opts.html#ga09118b734e85df152af098744e888b34", null ],
+    [ "SNMP_DEVICE_ENTERPRISE_OID_LEN", "group__snmp__opts.html#ga9e39ba5308f5c7ac5296c7d05fdfa97f", null ],
+    [ "SNMP_LWIP_ENTERPRISE_OID", "group__snmp__opts.html#ga868bfef6efe05515c86291137a633479", null ],
+    [ "SNMP_LWIP_GETBULK_MAX_REPETITIONS", "group__snmp__opts.html#ga5a24152aa5f3c2837b9a3145aa3c59f3", null ],
+    [ "SNMP_LWIP_MIB2", "group__snmp__opts.html#gaab667d48f48ee89f8bdbc7f134e6037d", null ],
+    [ "SNMP_LWIP_MIB2_SYSCONTACT", "group__snmp__opts.html#ga1a57501c615b630d363e0af1a504e683", null ],
+    [ "SNMP_LWIP_MIB2_SYSDESC", "group__snmp__opts.html#gae93a105b421a2ca91e862da5087cec73", null ],
+    [ "SNMP_LWIP_MIB2_SYSLOCATION", "group__snmp__opts.html#ga311cec98c8f7e4851d325fffe96cf8d9", null ],
+    [ "SNMP_LWIP_MIB2_SYSNAME", "group__snmp__opts.html#ga80ba46f9517a51b5477f13082b2bcf98", null ],
+    [ "SNMP_MAX_COMMUNITY_STR_LEN", "group__snmp__opts.html#ga0e98b58159a77688f87f9f50479177fd", null ],
+    [ "SNMP_MAX_OBJ_ID_LEN", "group__snmp__opts.html#ga3ad9d293f90e3c885c4e3263a9064a41", null ],
+    [ "SNMP_MAX_OCTET_STRING_LEN", "group__snmp__opts.html#gae50cdd09697aa54a8b9f26432ac55ac2", null ],
+    [ "SNMP_MAX_VALUE_SIZE", "group__snmp__opts.html#gafb4362575bc50476a7401a1ed14787f0", null ],
+    [ "SNMP_MIB_DEBUG", "group__snmp__opts.html#gac12240265db443eaf9d31d187e586c16", null ],
+    [ "SNMP_MIN_VALUE_SIZE", "group__snmp__opts.html#gac815d0dbe576299546ac612e7eaf3f90", null ],
+    [ "SNMP_SAFE_REQUESTS", "group__snmp__opts.html#ga95e39047b9bcb385780b06b35af49261", null ],
+    [ "SNMP_STACK_SIZE", "group__snmp__opts.html#ga0dcacdccc61216c6773943ad3fd31242", null ],
+    [ "SNMP_THREAD_PRIO", "group__snmp__opts.html#gad9bce0d9c05ed4607d72de7b75f2a80b", null ],
+    [ "SNMP_TRAP_DESTINATIONS", "group__snmp__opts.html#ga692343b0cc555c302fd713003d4f8a08", null ],
+    [ "SNMP_USE_NETCONN", "group__snmp__opts.html#gaf02e8b4b69e99df784e9953401477078", null ],
+    [ "SNMP_USE_RAW", "group__snmp__opts.html#ga8c93f4260af2eb3c50d4bc603f716f1f", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__snmp__traps.html b/doc/doxygen/output/html/group__snmp__traps.html
new file mode 100644
index 0000000..f894468
--- /dev/null
+++ b/doc/doxygen/output/html/group__snmp__traps.html
@@ -0,0 +1,420 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Traps</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__snmp__traps.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">Traps<div class="ingroups"><a class="el" href="group__apps.html">Applications</a> &raquo; <a class="el" href="group__snmp.html">SNMPv2c/v3 agent</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gafdd3299e145f53cc826cc11a469f8409"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#gafdd3299e145f53cc826cc11a469f8409">snmp_get_community_trap</a> (void)</td></tr>
+<tr class="separator:gafdd3299e145f53cc826cc11a469f8409"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5631711f357b6610be7e93b1c6d87760"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760">snmp_set_community_trap</a> (const char *const community)</td></tr>
+<tr class="separator:ga5631711f357b6610be7e93b1c6d87760"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab101505be59778cf0f2f1ac40bcf3f32"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32">snmp_trap_dst_enable</a> (u8_t dst_idx, u8_t enable)</td></tr>
+<tr class="separator:gab101505be59778cf0f2f1ac40bcf3f32"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga15e4afbf80ed2260850842e6608c6d86"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86">snmp_trap_dst_ip_set</a> (u8_t dst_idx, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dst)</td></tr>
+<tr class="separator:ga15e4afbf80ed2260850842e6608c6d86"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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"><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: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"><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:gaa8a49d1a6a207740ba44e27b5bbc22be"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be">snmp_coldstart_trap</a> (void)</td></tr>
+<tr class="separator:gaa8a49d1a6a207740ba44e27b5bbc22be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gaf6d0a95a3a406d8ea00849c07aca05ee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf6d0a95a3a406d8ea00849c07aca05ee">&#9670;&nbsp;</a></span>snmp_authfail_trap()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_authfail_trap </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send authentication failure trap (used internally by agent) </p>
+
+</div>
+</div>
+<a id="gaa8a49d1a6a207740ba44e27b5bbc22be"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa8a49d1a6a207740ba44e27b5bbc22be">&#9670;&nbsp;</a></span>snmp_coldstart_trap()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_coldstart_trap </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send coldstart trap </p>
+
+</div>
+</div>
+<a id="ga7804a22615bd9b3a323a3f48a9fb8cb7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7804a22615bd9b3a323a3f48a9fb8cb7">&#9670;&nbsp;</a></span>snmp_get_auth_traps_enabled()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_get_auth_traps_enabled </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get authentication traps enabled state </p>
+
+</div>
+</div>
+<a id="gafdd3299e145f53cc826cc11a469f8409"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafdd3299e145f53cc826cc11a469f8409">&#9670;&nbsp;</a></span>snmp_get_community_trap()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* snmp_get_community_trap </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns current SNMP community string used for sending traps. </p><dl class="section return"><dt>Returns</dt><dd>current SNMP community string used for sending traps </dd></dl>
+
+</div>
+</div>
+<a id="ga96cc7af0118d75049609872ea41187cd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga96cc7af0118d75049609872ea41187cd">&#9670;&nbsp;</a></span>snmp_send_trap()</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_trap </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *&#160;</td>
+          <td class="paramname"><em>eoid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s32_t&#160;</td>
+          <td class="paramname"><em>generic_trap</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s32_t&#160;</td>
+          <td class="paramname"><em>specific_trap</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *&#160;</td>
+          <td class="paramname"><em>varbinds</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sends a generic or enterprise specific trap message.</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">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>
+  </table>
+  </dd>
+</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>
+<a id="ga0e044259289cb690197173f93c17607d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0e044259289cb690197173f93c17607d">&#9670;&nbsp;</a></span>snmp_send_trap_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_trap_generic </td>
+          <td>(</td>
+          <td class="paramtype">s32_t&#160;</td>
+          <td class="paramname"><em>generic_trap</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send generic SNMP trap </p>
+
+</div>
+</div>
+<a id="ga56bdce04e9e77cb3f8a872718cd273d1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga56bdce04e9e77cb3f8a872718cd273d1">&#9670;&nbsp;</a></span>snmp_send_trap_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_trap_specific </td>
+          <td>(</td>
+          <td class="paramtype">s32_t&#160;</td>
+          <td class="paramname"><em>specific_trap</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *&#160;</td>
+          <td class="paramname"><em>varbinds</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send specific SNMP trap with variable bindings </p>
+
+</div>
+</div>
+<a id="gacaf816ff917f7b7e5d00ed6c9f79b51c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacaf816ff917f7b7e5d00ed6c9f79b51c">&#9670;&nbsp;</a></span>snmp_set_auth_traps_enabled()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_set_auth_traps_enabled </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>enable</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Enable/disable authentication traps </p>
+
+</div>
+</div>
+<a id="ga5631711f357b6610be7e93b1c6d87760"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5631711f357b6610be7e93b1c6d87760">&#9670;&nbsp;</a></span>snmp_set_community_trap()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_set_community_trap </td>
+          <td>(</td>
+          <td class="paramtype">const char *const&#160;</td>
+          <td class="paramname"><em>community</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sets SNMP community string used for sending traps. The string itself (its storage) must be valid throughout the whole life of program (or until it is changed to sth else).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">community</td><td>is a pointer to new trap community string </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gab101505be59778cf0f2f1ac40bcf3f32"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab101505be59778cf0f2f1ac40bcf3f32">&#9670;&nbsp;</a></span>snmp_trap_dst_enable()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_trap_dst_enable </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>dst_idx</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>enable</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sets enable switch for this trap destination. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">dst_idx</td><td>index in 0 .. SNMP_TRAP_DESTINATIONS-1 </td></tr>
+    <tr><td class="paramname">enable</td><td>switch if 0 destination is disabled &gt;0 enabled. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga15e4afbf80ed2260850842e6608c6d86"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga15e4afbf80ed2260850842e6608c6d86">&#9670;&nbsp;</a></span>snmp_trap_dst_ip_set()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_trap_dst_ip_set </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>dst_idx</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>dst</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sets IPv4 address for this trap destination. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">dst_idx</td><td>index in 0 .. SNMP_TRAP_DESTINATIONS-1 </td></tr>
+    <tr><td class="paramname">dst</td><td>IPv4 address in host order. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__snmp__traps.js b/doc/doxygen/output/html/group__snmp__traps.js
new file mode 100644
index 0000000..a9c9358
--- /dev/null
+++ b/doc/doxygen/output/html/group__snmp__traps.js
@@ -0,0 +1,14 @@
+var group__snmp__traps =
+[
+    [ "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_get_community_trap", "group__snmp__traps.html#gafdd3299e145f53cc826cc11a469f8409", null ],
+    [ "snmp_send_trap", "group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd", 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_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
new file mode 100644
index 0000000..b7c4104
--- /dev/null
+++ b/doc/doxygen/output/html/group__sntp.html
@@ -0,0 +1,318 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: SNTP</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__sntp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">SNTP<div class="ingroups"><a class="el" href="group__apps.html">Applications</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__sntp__opts"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html">Options</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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga9b300c6616de60524c85ea40bf70e2ba"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba">sntp_init</a> (void)</td></tr>
+<tr class="separator:ga9b300c6616de60524c85ea40bf70e2ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8119fc2d1ff7ff6eba511cc9c7167488"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488">sntp_stop</a> (void)</td></tr>
+<tr class="separator:ga8119fc2d1ff7ff6eba511cc9c7167488"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3fe5254e5a056fca80802d9f26b9c3c5"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5">sntp_enabled</a> (void)</td></tr>
+<tr class="separator:ga3fe5254e5a056fca80802d9f26b9c3c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaae94fb2adadbf9667e9597f8a45bf120"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120">sntp_setoperatingmode</a> (u8_t operating_mode)</td></tr>
+<tr class="separator:gaae94fb2adadbf9667e9597f8a45bf120"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae66404a551d5cef420cf844a71356fae"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#gae66404a551d5cef420cf844a71356fae">sntp_getoperatingmode</a> (void)</td></tr>
+<tr class="separator:gae66404a551d5cef420cf844a71356fae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="memitem:ga4fa038dcea66349fafdbe1cc3e52ff3a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a">sntp_setserver</a> (u8_t idx, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *server)</td></tr>
+<tr class="separator:ga4fa038dcea66349fafdbe1cc3e52ff3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2a28523cb9f2b5b025a4818bc2c1afc1"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#ga2a28523cb9f2b5b025a4818bc2c1afc1">sntp_getserver</a> (u8_t idx)</td></tr>
+<tr class="separator:ga2a28523cb9f2b5b025a4818bc2c1afc1"><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>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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3fe5254e5a056fca80802d9f26b9c3c5">&#9670;&nbsp;</a></span>sntp_enabled()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t sntp_enabled </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get enabled state. </p>
+
+</div>
+</div>
+<a id="gae66404a551d5cef420cf844a71356fae"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae66404a551d5cef420cf844a71356fae">&#9670;&nbsp;</a></span>sntp_getoperatingmode()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t sntp_getoperatingmode </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Gets the operating mode. </p>
+
+</div>
+</div>
+<a id="gac8097829a81cb6f37d9acf8efb2cc82e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac8097829a81cb6f37d9acf8efb2cc82e">&#9670;&nbsp;</a></span>sntp_getreachability()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t sntp_getreachability </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>idx</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Gets the server reachability shift register as described in RFC 5905.</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>
+
+</div>
+</div>
+<a id="ga2a28523cb9f2b5b025a4818bc2c1afc1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2a28523cb9f2b5b025a4818bc2c1afc1">&#9670;&nbsp;</a></span>sntp_getserver()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>* sntp_getserver </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>idx</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Obtain one of the currently configured by IP address (or DHCP) NTP servers</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>IP address of the indexed NTP server or "ip_addr_any" if the NTP server has not been configured by address (or at all). </dd></dl>
+
+</div>
+</div>
+<a id="ga9b300c6616de60524c85ea40bf70e2ba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9b300c6616de60524c85ea40bf70e2ba">&#9670;&nbsp;</a></span>sntp_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sntp_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize this module. Send out request instantly or after <a class="el" href="group__sntp__opts.html#ga22017d43da7d4bf8d42e786b4ced4dfa">SNTP_STARTUP_DELAY(_FUNC)</a>. </p>
+
+</div>
+</div>
+<a id="gaae94fb2adadbf9667e9597f8a45bf120"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaae94fb2adadbf9667e9597f8a45bf120">&#9670;&nbsp;</a></span>sntp_setoperatingmode()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sntp_setoperatingmode </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>operating_mode</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sets the operating mode. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">operating_mode</td><td>one of the available operating modes </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga4fa038dcea66349fafdbe1cc3e52ff3a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4fa038dcea66349fafdbe1cc3e52ff3a">&#9670;&nbsp;</a></span>sntp_setserver()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sntp_setserver </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>idx</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>server</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize one of the NTP servers by IP address</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">idx</td><td>the index of the NTP server to set must be &lt; SNTP_MAX_SERVERS </td></tr>
+    <tr><td class="paramname">server</td><td>IP address of the NTP server to set </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga8119fc2d1ff7ff6eba511cc9c7167488"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8119fc2d1ff7ff6eba511cc9c7167488">&#9670;&nbsp;</a></span>sntp_stop()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sntp_stop </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Stop this module. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__sntp.js b/doc/doxygen/output/html/group__sntp.js
new file mode 100644
index 0000000..9f31e03
--- /dev/null
+++ b/doc/doxygen/output/html/group__sntp.js
@@ -0,0 +1,12 @@
+var group__sntp =
+[
+    [ "Options", "group__sntp__opts.html", "group__sntp__opts" ],
+    [ "sntp_enabled", "group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5", null ],
+    [ "sntp_getoperatingmode", "group__sntp.html#gae66404a551d5cef420cf844a71356fae", null ],
+    [ "sntp_getreachability", "group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e", null ],
+    [ "sntp_getserver", "group__sntp.html#ga2a28523cb9f2b5b025a4818bc2c1afc1", null ],
+    [ "sntp_init", "group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba", null ],
+    [ "sntp_setoperatingmode", "group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120", null ],
+    [ "sntp_setserver", "group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a", null ],
+    [ "sntp_stop", "group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__sntp__opts.html b/doc/doxygen/output/html/group__sntp__opts.html
new file mode 100644
index 0000000..ab05aab
--- /dev/null
+++ b/doc/doxygen/output/html/group__sntp__opts.html
@@ -0,0 +1,421 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Options</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__sntp__opts.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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__sntp.html">SNTP</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gafe340b98c52dedcbc041267fe13b2da6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#gafe340b98c52dedcbc041267fe13b2da6">SNTP_SET_SYSTEM_TIME</a>(sec)&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#ga70624a5deb8b9199406372a7f3603ecf">LWIP_UNUSED_ARG</a>(sec)</td></tr>
+<tr class="separator:gafe340b98c52dedcbc041267fe13b2da6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5d9dc0827f402849f5c18d44e311dbc2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga5d9dc0827f402849f5c18d44e311dbc2">SNTP_MAX_SERVERS</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2">LWIP_DHCP_MAX_NTP_SERVERS</a></td></tr>
+<tr class="separator:ga5d9dc0827f402849f5c18d44e311dbc2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga961a61eef942ab5378cff1e3742b3ade"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga961a61eef942ab5378cff1e3742b3ade">SNTP_GET_SERVERS_FROM_DHCP</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83">LWIP_DHCP_GET_NTP_SRV</a></td></tr>
+<tr class="separator:ga961a61eef942ab5378cff1e3742b3ade"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaef477c145ae404d77188b26b79b6996f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#gaef477c145ae404d77188b26b79b6996f">SNTP_SERVER_DNS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaef477c145ae404d77188b26b79b6996f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga25c6f9c14c17e218d110d826b09f8d91"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga25c6f9c14c17e218d110d826b09f8d91">SNTP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga25c6f9c14c17e218d110d826b09f8d91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacbee62c27f54371fc2c5259a834a0f9b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#gacbee62c27f54371fc2c5259a834a0f9b">SNTP_PORT</a>&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb">LWIP_IANA_PORT_SNTP</a></td></tr>
+<tr class="separator:gacbee62c27f54371fc2c5259a834a0f9b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7d4e12d90912d486e64f289d7f3ca446"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga7d4e12d90912d486e64f289d7f3ca446">SNTP_CHECK_RESPONSE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga7d4e12d90912d486e64f289d7f3ca446"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1e21781705d3549a305339fd7fca63e7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga1e21781705d3549a305339fd7fca63e7">SNTP_COMP_ROUNDTRIP</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga1e21781705d3549a305339fd7fca63e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga22017d43da7d4bf8d42e786b4ced4dfa"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga22017d43da7d4bf8d42e786b4ced4dfa">SNTP_STARTUP_DELAY</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga22017d43da7d4bf8d42e786b4ced4dfa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae082c2f3044d500ca5e1be1d4928de75"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#gae082c2f3044d500ca5e1be1d4928de75">SNTP_STARTUP_DELAY_FUNC</a>&#160;&#160;&#160;(<a class="el" href="group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a">LWIP_RAND</a>() % 5000)</td></tr>
+<tr class="separator:gae082c2f3044d500ca5e1be1d4928de75"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga44cf26b9b19832d88599244711a12d08"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga44cf26b9b19832d88599244711a12d08">SNTP_RECV_TIMEOUT</a>&#160;&#160;&#160;15000</td></tr>
+<tr class="separator:ga44cf26b9b19832d88599244711a12d08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9232c56443115be05a2f852eba21979c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga9232c56443115be05a2f852eba21979c">SNTP_UPDATE_DELAY</a>&#160;&#160;&#160;3600000</td></tr>
+<tr class="separator:ga9232c56443115be05a2f852eba21979c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab0ea385479a5c5c8c173f165ded2fb63"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#gab0ea385479a5c5c8c173f165ded2fb63">SNTP_GET_SYSTEM_TIME</a>(sec,  us)&#160;&#160;&#160;do { (sec) = 0; (us) = 0; } while(0)</td></tr>
+<tr class="separator:gab0ea385479a5c5c8c173f165ded2fb63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga86d651d8eb07687208308deef95a23ba"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga86d651d8eb07687208308deef95a23ba">SNTP_RETRY_TIMEOUT</a>&#160;&#160;&#160;<a class="el" href="group__sntp__opts.html#ga44cf26b9b19832d88599244711a12d08">SNTP_RECV_TIMEOUT</a></td></tr>
+<tr class="separator:ga86d651d8eb07687208308deef95a23ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafde10b3ed7cb4bb2cd2c4daa389db699"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#gafde10b3ed7cb4bb2cd2c4daa389db699">SNTP_RETRY_TIMEOUT_MAX</a>&#160;&#160;&#160;(<a class="el" href="group__sntp__opts.html#ga86d651d8eb07687208308deef95a23ba">SNTP_RETRY_TIMEOUT</a> * 10)</td></tr>
+<tr class="separator:gafde10b3ed7cb4bb2cd2c4daa389db699"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafdb7e98f608cc429188d7dac356614c2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#gafdb7e98f608cc429188d7dac356614c2">SNTP_RETRY_TIMEOUT_EXP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gafdb7e98f608cc429188d7dac356614c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5782f21ef24ebddd5ba2ce9a889094e3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga5782f21ef24ebddd5ba2ce9a889094e3">SNTP_MONITOR_SERVER_REACHABILITY</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga5782f21ef24ebddd5ba2ce9a889094e3"><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="ga7d4e12d90912d486e64f289d7f3ca446"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7d4e12d90912d486e64f289d7f3ca446">&#9670;&nbsp;</a></span>SNTP_CHECK_RESPONSE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_CHECK_RESPONSE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sanity check: Define this to</p><ul>
+<li>0 to turn off sanity checks (default; smaller code)</li>
+<li>&gt;= 1 to check address and port of the response packet to ensure the response comes from the server we sent the request to.</li>
+<li>&gt;= 2 to check returned Originate Timestamp against Transmit Timestamp sent to the server (to ensure response to older request).</li>
+<li>&gt;= 3 </li>
+</ul>
+
+</div>
+</div>
+<a id="ga1e21781705d3549a305339fd7fca63e7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1e21781705d3549a305339fd7fca63e7">&#9670;&nbsp;</a></span>SNTP_COMP_ROUNDTRIP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_COMP_ROUNDTRIP&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Enable round-trip delay compensation. Compensate for the round-trip delay by calculating the clock offset from the originate, receive, transmit and destination timestamps, as per RFC.</p>
+<p>The calculation requires compiler support for 64-bit integers. Also, either SNTP_SET_SYSTEM_TIME_US or SNTP_SET_SYSTEM_TIME_NTP has to be implemented for setting the system clock with sub-second precision. Likewise, either SNTP_GET_SYSTEM_TIME or SNTP_GET_SYSTEM_TIME_NTP needs to be implemented with sub-second precision.</p>
+<p>Although not strictly required, it makes sense to combine this option with SNTP_CHECK_RESPONSE &gt;= 2 for sanity-checking of the received timestamps. Also, in order for the round-trip calculation to work, the difference between the local clock and the NTP server clock must not be larger than about 34 years. If that limit is exceeded, the implementation will fall back to setting the clock without compensation. In order to ensure that the local clock is always within the permitted range for compensation, even at first try, it may be necessary to store at least the current year in non-volatile memory. </p>
+
+</div>
+</div>
+<a id="ga25c6f9c14c17e218d110d826b09f8d91"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga25c6f9c14c17e218d110d826b09f8d91">&#9670;&nbsp;</a></span>SNTP_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_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>SNTP_DEBUG: Enable debugging for SNTP. </p>
+
+</div>
+</div>
+<a id="ga961a61eef942ab5378cff1e3742b3ade"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga961a61eef942ab5378cff1e3742b3ade">&#9670;&nbsp;</a></span>SNTP_GET_SERVERS_FROM_DHCP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_GET_SERVERS_FROM_DHCP&#160;&#160;&#160;<a class="el" href="group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83">LWIP_DHCP_GET_NTP_SRV</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to implement the callback function called by dhcp when NTP servers are received. </p>
+
+</div>
+</div>
+<a id="gab0ea385479a5c5c8c173f165ded2fb63"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab0ea385479a5c5c8c173f165ded2fb63">&#9670;&nbsp;</a></span>SNTP_GET_SYSTEM_TIME</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_GET_SYSTEM_TIME</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">sec, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">us&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;do { (sec) = 0; (us) = 0; } while(0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SNTP macro to get system time, used with SNTP_CHECK_RESPONSE &gt;= 2 to send in request and compare in response. Also used for round-trip delay compensation if SNTP_COMP_ROUNDTRIP != 0. Alternatively, define SNTP_GET_SYSTEM_TIME_NTP(sec, frac) in order to work with native NTP timestamps instead. </p>
+
+</div>
+</div>
+<a id="ga5d9dc0827f402849f5c18d44e311dbc2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5d9dc0827f402849f5c18d44e311dbc2">&#9670;&nbsp;</a></span>SNTP_MAX_SERVERS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_MAX_SERVERS&#160;&#160;&#160;<a class="el" href="group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2">LWIP_DHCP_MAX_NTP_SERVERS</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The maximum number of SNTP servers that can be set </p>
+
+</div>
+</div>
+<a id="ga5782f21ef24ebddd5ba2ce9a889094e3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5782f21ef24ebddd5ba2ce9a889094e3">&#9670;&nbsp;</a></span>SNTP_MONITOR_SERVER_REACHABILITY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_MONITOR_SERVER_REACHABILITY&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Keep a reachability shift register per server Default is on to conform to RFC. </p>
+
+</div>
+</div>
+<a id="gacbee62c27f54371fc2c5259a834a0f9b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacbee62c27f54371fc2c5259a834a0f9b">&#9670;&nbsp;</a></span>SNTP_PORT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_PORT&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb">LWIP_IANA_PORT_SNTP</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SNTP server port </p>
+
+</div>
+</div>
+<a id="ga44cf26b9b19832d88599244711a12d08"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga44cf26b9b19832d88599244711a12d08">&#9670;&nbsp;</a></span>SNTP_RECV_TIMEOUT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_RECV_TIMEOUT&#160;&#160;&#160;15000</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SNTP receive timeout - in milliseconds Also used as retry timeout - this shouldn't be too low. Default is 15 seconds. Must not be beolw 15 seconds by specification (i.e. 15000) </p>
+
+</div>
+</div>
+<a id="ga86d651d8eb07687208308deef95a23ba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga86d651d8eb07687208308deef95a23ba">&#9670;&nbsp;</a></span>SNTP_RETRY_TIMEOUT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_RETRY_TIMEOUT&#160;&#160;&#160;<a class="el" href="group__sntp__opts.html#ga44cf26b9b19832d88599244711a12d08">SNTP_RECV_TIMEOUT</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Default retry timeout (in milliseconds) if the response received is invalid. This is doubled with each retry until SNTP_RETRY_TIMEOUT_MAX is reached. </p>
+
+</div>
+</div>
+<a id="gafdb7e98f608cc429188d7dac356614c2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafdb7e98f608cc429188d7dac356614c2">&#9670;&nbsp;</a></span>SNTP_RETRY_TIMEOUT_EXP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_RETRY_TIMEOUT_EXP&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Increase retry timeout with every retry sent Default is on to conform to RFC. </p>
+
+</div>
+</div>
+<a id="gafde10b3ed7cb4bb2cd2c4daa389db699"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafde10b3ed7cb4bb2cd2c4daa389db699">&#9670;&nbsp;</a></span>SNTP_RETRY_TIMEOUT_MAX</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_RETRY_TIMEOUT_MAX&#160;&#160;&#160;(<a class="el" href="group__sntp__opts.html#ga86d651d8eb07687208308deef95a23ba">SNTP_RETRY_TIMEOUT</a> * 10)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Maximum retry timeout (in milliseconds). </p>
+
+</div>
+</div>
+<a id="gaef477c145ae404d77188b26b79b6996f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaef477c145ae404d77188b26b79b6996f">&#9670;&nbsp;</a></span>SNTP_SERVER_DNS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_SERVER_DNS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to support DNS names (or IP address strings) to set sntp servers One server address/name can be defined as default if SNTP_SERVER_DNS == 1: #define SNTP_SERVER_ADDRESS "pool.ntp.org" </p>
+
+</div>
+</div>
+<a id="gafe340b98c52dedcbc041267fe13b2da6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafe340b98c52dedcbc041267fe13b2da6">&#9670;&nbsp;</a></span>SNTP_SET_SYSTEM_TIME</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_SET_SYSTEM_TIME</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">sec</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#ga70624a5deb8b9199406372a7f3603ecf">LWIP_UNUSED_ARG</a>(sec)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SNTP macro to change system time in seconds Define SNTP_SET_SYSTEM_TIME_US(sec, us) to set the time in microseconds instead of this one if you need the additional precision. Alternatively, define SNTP_SET_SYSTEM_TIME_NTP(sec, frac) in order to work with native NTP timestamps instead. </p>
+
+</div>
+</div>
+<a id="ga22017d43da7d4bf8d42e786b4ced4dfa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga22017d43da7d4bf8d42e786b4ced4dfa">&#9670;&nbsp;</a></span>SNTP_STARTUP_DELAY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_STARTUP_DELAY&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>According to the RFC, this shall be a random delay between 1 and 5 minutes (in milliseconds) to prevent load peaks. This can be defined to a random generation function, which must return the delay in milliseconds as u32_t. Turned off by default. </p>
+
+</div>
+</div>
+<a id="gae082c2f3044d500ca5e1be1d4928de75"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae082c2f3044d500ca5e1be1d4928de75">&#9670;&nbsp;</a></span>SNTP_STARTUP_DELAY_FUNC</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_STARTUP_DELAY_FUNC&#160;&#160;&#160;(<a class="el" href="group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a">LWIP_RAND</a>() % 5000)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If you want the startup delay to be a function, define this to a function (including the brackets) and define SNTP_STARTUP_DELAY to 1. </p>
+
+</div>
+</div>
+<a id="ga9232c56443115be05a2f852eba21979c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9232c56443115be05a2f852eba21979c">&#9670;&nbsp;</a></span>SNTP_UPDATE_DELAY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_UPDATE_DELAY&#160;&#160;&#160;3600000</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SNTP update delay - in milliseconds Default is 1 hour. Must not be beolw 60 seconds by specification (i.e. 60000) </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__sntp__opts.js b/doc/doxygen/output/html/group__sntp__opts.js
new file mode 100644
index 0000000..4ec5cc1
--- /dev/null
+++ b/doc/doxygen/output/html/group__sntp__opts.js
@@ -0,0 +1,20 @@
+var group__sntp__opts =
+[
+    [ "SNTP_CHECK_RESPONSE", "group__sntp__opts.html#ga7d4e12d90912d486e64f289d7f3ca446", null ],
+    [ "SNTP_COMP_ROUNDTRIP", "group__sntp__opts.html#ga1e21781705d3549a305339fd7fca63e7", null ],
+    [ "SNTP_DEBUG", "group__sntp__opts.html#ga25c6f9c14c17e218d110d826b09f8d91", null ],
+    [ "SNTP_GET_SERVERS_FROM_DHCP", "group__sntp__opts.html#ga961a61eef942ab5378cff1e3742b3ade", null ],
+    [ "SNTP_GET_SYSTEM_TIME", "group__sntp__opts.html#gab0ea385479a5c5c8c173f165ded2fb63", null ],
+    [ "SNTP_MAX_SERVERS", "group__sntp__opts.html#ga5d9dc0827f402849f5c18d44e311dbc2", null ],
+    [ "SNTP_MONITOR_SERVER_REACHABILITY", "group__sntp__opts.html#ga5782f21ef24ebddd5ba2ce9a889094e3", null ],
+    [ "SNTP_PORT", "group__sntp__opts.html#gacbee62c27f54371fc2c5259a834a0f9b", null ],
+    [ "SNTP_RECV_TIMEOUT", "group__sntp__opts.html#ga44cf26b9b19832d88599244711a12d08", null ],
+    [ "SNTP_RETRY_TIMEOUT", "group__sntp__opts.html#ga86d651d8eb07687208308deef95a23ba", null ],
+    [ "SNTP_RETRY_TIMEOUT_EXP", "group__sntp__opts.html#gafdb7e98f608cc429188d7dac356614c2", null ],
+    [ "SNTP_RETRY_TIMEOUT_MAX", "group__sntp__opts.html#gafde10b3ed7cb4bb2cd2c4daa389db699", null ],
+    [ "SNTP_SERVER_DNS", "group__sntp__opts.html#gaef477c145ae404d77188b26b79b6996f", null ],
+    [ "SNTP_SET_SYSTEM_TIME", "group__sntp__opts.html#gafe340b98c52dedcbc041267fe13b2da6", null ],
+    [ "SNTP_STARTUP_DELAY", "group__sntp__opts.html#ga22017d43da7d4bf8d42e786b4ced4dfa", null ],
+    [ "SNTP_STARTUP_DELAY_FUNC", "group__sntp__opts.html#gae082c2f3044d500ca5e1be1d4928de75", null ],
+    [ "SNTP_UPDATE_DELAY", "group__sntp__opts.html#ga9232c56443115be05a2f852eba21979c", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__socket.html b/doc/doxygen/output/html/group__socket.html
new file mode 100644
index 0000000..8462742
--- /dev/null
+++ b/doc/doxygen/output/html/group__socket.html
@@ -0,0 +1,1210 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Socket API</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__socket.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Socket API<div class="ingroups"><a class="el" href="group__api.html">APIs</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__if__api"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__if__api.html">Interface Identification API</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__netdbapi"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netdbapi.html">NETDB API</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gade2b17671b5a4b18e941fbf7e1060310"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gade2b17671b5a4b18e941fbf7e1060310">accept</a>(s,  addr,  addrlen)&#160;&#160;&#160;lwip_accept(s,addr,addrlen)</td></tr>
+<tr class="separator:gade2b17671b5a4b18e941fbf7e1060310"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4a88bb849aa7203b24bb245a193997a6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga4a88bb849aa7203b24bb245a193997a6">bind</a>(s,  name,  namelen)&#160;&#160;&#160;lwip_bind(s,name,namelen)</td></tr>
+<tr class="separator:ga4a88bb849aa7203b24bb245a193997a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7d832f77cfad97cf901640f243c6e682"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga7d832f77cfad97cf901640f243c6e682">shutdown</a>(s,  how)&#160;&#160;&#160;<a class="el" href="sockets_8h.html#ade85c68b6673296c8fb67127b93fa4c1">lwip_shutdown</a>(s,how)</td></tr>
+<tr class="separator:ga7d832f77cfad97cf901640f243c6e682"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga33bf1b7f5b11de02d0db32531cd940b8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga33bf1b7f5b11de02d0db32531cd940b8">getpeername</a>(s,  name,  namelen)&#160;&#160;&#160;lwip_getpeername(s,name,namelen)</td></tr>
+<tr class="separator:ga33bf1b7f5b11de02d0db32531cd940b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab096fb7dbc3f84be1699a87dce980f2f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gab096fb7dbc3f84be1699a87dce980f2f">getsockname</a>(s,  name,  namelen)&#160;&#160;&#160;lwip_getsockname(s,name,namelen)</td></tr>
+<tr class="separator:gab096fb7dbc3f84be1699a87dce980f2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga115d74cd1953e7bafc2e34157c697df1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga115d74cd1953e7bafc2e34157c697df1">setsockopt</a>(s,  level,  optname,  opval,  optlen)&#160;&#160;&#160;lwip_setsockopt(s,level,optname,opval,optlen)</td></tr>
+<tr class="separator:ga115d74cd1953e7bafc2e34157c697df1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad2de02b35dbbf2334d1befb137ede821"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gad2de02b35dbbf2334d1befb137ede821">getsockopt</a>(s,  level,  optname,  opval,  optlen)&#160;&#160;&#160;lwip_getsockopt(s,level,optname,opval,optlen)</td></tr>
+<tr class="separator:gad2de02b35dbbf2334d1befb137ede821"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5a3eb971b466278ada4f7f87399a537c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga5a3eb971b466278ada4f7f87399a537c">closesocket</a>(s)&#160;&#160;&#160;lwip_close(s)</td></tr>
+<tr class="separator:ga5a3eb971b466278ada4f7f87399a537c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae3d13671f622e17c17317c9a16dfd0ee"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gae3d13671f622e17c17317c9a16dfd0ee">connect</a>(s,  name,  namelen)&#160;&#160;&#160;lwip_connect(s,name,namelen)</td></tr>
+<tr class="separator:gae3d13671f622e17c17317c9a16dfd0ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae6e6de5a20bed9fc7078f0e6c9c4aca4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gae6e6de5a20bed9fc7078f0e6c9c4aca4">listen</a>(s,  backlog)&#160;&#160;&#160;<a class="el" href="sockets_8h.html#abee6ee286147cf334a1ba19f19b2e08b">lwip_listen</a>(s,backlog)</td></tr>
+<tr class="separator:gae6e6de5a20bed9fc7078f0e6c9c4aca4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadd7ae45df7c005619eb1126542231e9b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gadd7ae45df7c005619eb1126542231e9b">recv</a>(s,  <a class="el" href="structmem.html">mem</a>,  len,  flags)&#160;&#160;&#160;lwip_recv(s,<a class="el" href="structmem.html">mem</a>,len,flags)</td></tr>
+<tr class="separator:gadd7ae45df7c005619eb1126542231e9b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaecfc7d524105e52604829c66ced752b8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gaecfc7d524105e52604829c66ced752b8">recvmsg</a>(s,  message,  flags)&#160;&#160;&#160;lwip_recvmsg(s,message,flags)</td></tr>
+<tr class="separator:gaecfc7d524105e52604829c66ced752b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5e5f7bcda6562bae815e188ea1a81ecd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga5e5f7bcda6562bae815e188ea1a81ecd">recvfrom</a>(s,  <a class="el" href="structmem.html">mem</a>,  len,  flags,  from,  fromlen)&#160;&#160;&#160;lwip_recvfrom(s,<a class="el" href="structmem.html">mem</a>,len,flags,from,fromlen)</td></tr>
+<tr class="separator:ga5e5f7bcda6562bae815e188ea1a81ecd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga19024690fdfd3512d24dcaa9b80d24ed"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga19024690fdfd3512d24dcaa9b80d24ed">send</a>(s,  dataptr,  size,  flags)&#160;&#160;&#160;lwip_send(s,dataptr,size,flags)</td></tr>
+<tr class="separator:ga19024690fdfd3512d24dcaa9b80d24ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaad99bea090b1fe4743234fcee15a5d28"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gaad99bea090b1fe4743234fcee15a5d28">sendmsg</a>(s,  message,  flags)&#160;&#160;&#160;lwip_sendmsg(s,message,flags)</td></tr>
+<tr class="separator:gaad99bea090b1fe4743234fcee15a5d28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaa17499d76ef421821fe72fd29fe38f7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gaaa17499d76ef421821fe72fd29fe38f7">sendto</a>(s,  dataptr,  size,  flags,  to,  tolen)&#160;&#160;&#160;lwip_sendto(s,dataptr,size,flags,to,tolen)</td></tr>
+<tr class="separator:gaaa17499d76ef421821fe72fd29fe38f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga862d8f4070c66dddb979540ce9ba6a83"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga862d8f4070c66dddb979540ce9ba6a83">socket</a>(domain,  type,  protocol)&#160;&#160;&#160;lwip_socket(domain,type,protocol)</td></tr>
+<tr class="separator:ga862d8f4070c66dddb979540ce9ba6a83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac332b9b9b2cd877a6189ef838de49e33"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gac332b9b9b2cd877a6189ef838de49e33">select</a>(maxfdp1,  readset,  writeset,  exceptset,  timeout)&#160;&#160;&#160;lwip_select(maxfdp1,readset,writeset,exceptset,timeout)</td></tr>
+<tr class="separator:gac332b9b9b2cd877a6189ef838de49e33"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga80ae38841b0e64e60618cd8bf857f617"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga80ae38841b0e64e60618cd8bf857f617">poll</a>(fds,  nfds,  timeout)&#160;&#160;&#160;lwip_poll(fds,nfds,timeout)</td></tr>
+<tr class="separator:ga80ae38841b0e64e60618cd8bf857f617"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga19e714443d0238cfd79b71059ec92378"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga19e714443d0238cfd79b71059ec92378">ioctlsocket</a>(s,  cmd,  argp)&#160;&#160;&#160;lwip_ioctl(s,cmd,argp)</td></tr>
+<tr class="separator:ga19e714443d0238cfd79b71059ec92378"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa40bf11abb409097e68aa3a6982eb52b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gaa40bf11abb409097e68aa3a6982eb52b">inet_ntop</a>(af,  src,  dst,  size)&#160;&#160;&#160;lwip_inet_ntop(af,src,dst,size)</td></tr>
+<tr class="separator:gaa40bf11abb409097e68aa3a6982eb52b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga90d2b417d82e8da981c940a665324fd5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga90d2b417d82e8da981c940a665324fd5">inet_pton</a>(af,  src,  dst)&#160;&#160;&#160;lwip_inet_pton(af,src,dst)</td></tr>
+<tr class="separator:ga90d2b417d82e8da981c940a665324fd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga822040573319cf87bfe6758d511be57f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga822040573319cf87bfe6758d511be57f">read</a>(s,  <a class="el" href="structmem.html">mem</a>,  len)&#160;&#160;&#160;lwip_read(s,<a class="el" href="structmem.html">mem</a>,len)</td></tr>
+<tr class="separator:ga822040573319cf87bfe6758d511be57f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga86788b3c690d38699fdbaea523ddec9d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga86788b3c690d38699fdbaea523ddec9d">readv</a>(s,  iov,  iovcnt)&#160;&#160;&#160;lwip_readv(s,iov,iovcnt)</td></tr>
+<tr class="separator:ga86788b3c690d38699fdbaea523ddec9d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0a651eb5fb5e6127f5e5153ce2251f3d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga0a651eb5fb5e6127f5e5153ce2251f3d">write</a>(s,  dataptr,  len)&#160;&#160;&#160;lwip_write(s,dataptr,len)</td></tr>
+<tr class="separator:ga0a651eb5fb5e6127f5e5153ce2251f3d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga697fd916a65a10b4dcb54b8199346fee"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga697fd916a65a10b4dcb54b8199346fee">writev</a>(s,  iov,  iovcnt)&#160;&#160;&#160;lwip_writev(s,iov,iovcnt)</td></tr>
+<tr class="separator:ga697fd916a65a10b4dcb54b8199346fee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4ef17e85ec4d3acdcee5ce23f8ed93c4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga4ef17e85ec4d3acdcee5ce23f8ed93c4">close</a>(s)&#160;&#160;&#160;lwip_close(s)</td></tr>
+<tr class="separator:ga4ef17e85ec4d3acdcee5ce23f8ed93c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaa2b0e00cab161fcc4b31ee0d06e7eb3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gaaa2b0e00cab161fcc4b31ee0d06e7eb3">fcntl</a>(s,  cmd,  val)&#160;&#160;&#160;<a class="el" href="sockets_8h.html#ae84296093574ec746f8f88321356388f">lwip_fcntl</a>(s,cmd,val)</td></tr>
+<tr class="separator:gaaa2b0e00cab161fcc4b31ee0d06e7eb3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga50a83956bc3a96e6274a21ec0d4d6338"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga50a83956bc3a96e6274a21ec0d4d6338">ioctl</a>(s,  cmd,  argp)&#160;&#160;&#160;lwip_ioctl(s,cmd,argp)</td></tr>
+<tr class="separator:ga50a83956bc3a96e6274a21ec0d4d6338"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</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>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="gade2b17671b5a4b18e941fbf7e1060310"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gade2b17671b5a4b18e941fbf7e1060310">&#9670;&nbsp;</a></span>accept</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define accept</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addrlen&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_accept(s,addr,addrlen)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga4a88bb849aa7203b24bb245a193997a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4a88bb849aa7203b24bb245a193997a6">&#9670;&nbsp;</a></span>bind</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define bind</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">name, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">namelen&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_bind(s,name,namelen)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga4ef17e85ec4d3acdcee5ce23f8ed93c4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4ef17e85ec4d3acdcee5ce23f8ed93c4">&#9670;&nbsp;</a></span>close</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define close</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s</td><td>)</td>
+          <td>&#160;&#160;&#160;lwip_close(s)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga5a3eb971b466278ada4f7f87399a537c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5a3eb971b466278ada4f7f87399a537c">&#9670;&nbsp;</a></span>closesocket</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define closesocket</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s</td><td>)</td>
+          <td>&#160;&#160;&#160;lwip_close(s)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gae3d13671f622e17c17317c9a16dfd0ee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae3d13671f622e17c17317c9a16dfd0ee">&#9670;&nbsp;</a></span>connect</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define connect</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">name, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">namelen&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_connect(s,name,namelen)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gaaa2b0e00cab161fcc4b31ee0d06e7eb3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaaa2b0e00cab161fcc4b31ee0d06e7eb3">&#9670;&nbsp;</a></span>fcntl</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define fcntl</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">cmd, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">val&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="sockets_8h.html#ae84296093574ec746f8f88321356388f">lwip_fcntl</a>(s,cmd,val)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga33bf1b7f5b11de02d0db32531cd940b8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga33bf1b7f5b11de02d0db32531cd940b8">&#9670;&nbsp;</a></span>getpeername</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define getpeername</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">name, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">namelen&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_getpeername(s,name,namelen)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gab096fb7dbc3f84be1699a87dce980f2f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab096fb7dbc3f84be1699a87dce980f2f">&#9670;&nbsp;</a></span>getsockname</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define getsockname</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">name, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">namelen&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_getsockname(s,name,namelen)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gad2de02b35dbbf2334d1befb137ede821"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad2de02b35dbbf2334d1befb137ede821">&#9670;&nbsp;</a></span>getsockopt</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define getsockopt</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">level, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">optname, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">opval, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">optlen&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_getsockopt(s,level,optname,opval,optlen)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gaa40bf11abb409097e68aa3a6982eb52b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa40bf11abb409097e68aa3a6982eb52b">&#9670;&nbsp;</a></span>inet_ntop</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define inet_ntop</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">af, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dst, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">size&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_inet_ntop(af,src,dst,size)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga90d2b417d82e8da981c940a665324fd5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga90d2b417d82e8da981c940a665324fd5">&#9670;&nbsp;</a></span>inet_pton</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define inet_pton</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">af, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dst&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_inet_pton(af,src,dst)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga50a83956bc3a96e6274a21ec0d4d6338"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga50a83956bc3a96e6274a21ec0d4d6338">&#9670;&nbsp;</a></span>ioctl</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ioctl</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">cmd, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">argp&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_ioctl(s,cmd,argp)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga19e714443d0238cfd79b71059ec92378"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga19e714443d0238cfd79b71059ec92378">&#9670;&nbsp;</a></span>ioctlsocket</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ioctlsocket</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">cmd, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">argp&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_ioctl(s,cmd,argp)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gae6e6de5a20bed9fc7078f0e6c9c4aca4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae6e6de5a20bed9fc7078f0e6c9c4aca4">&#9670;&nbsp;</a></span>listen</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define listen</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">backlog&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="sockets_8h.html#abee6ee286147cf334a1ba19f19b2e08b">lwip_listen</a>(s,backlog)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga80ae38841b0e64e60618cd8bf857f617"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga80ae38841b0e64e60618cd8bf857f617">&#9670;&nbsp;</a></span>poll</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define poll</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">fds, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">nfds, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">timeout&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_poll(fds,nfds,timeout)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga822040573319cf87bfe6758d511be57f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga822040573319cf87bfe6758d511be57f">&#9670;&nbsp;</a></span>read</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define read</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structmem.html">mem</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">len&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_read(s,<a class="el" href="structmem.html">mem</a>,len)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga86788b3c690d38699fdbaea523ddec9d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga86788b3c690d38699fdbaea523ddec9d">&#9670;&nbsp;</a></span>readv</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define readv</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">iov, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">iovcnt&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_readv(s,iov,iovcnt)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gadd7ae45df7c005619eb1126542231e9b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadd7ae45df7c005619eb1126542231e9b">&#9670;&nbsp;</a></span>recv</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define recv</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structmem.html">mem</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">len, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">flags&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_recv(s,<a class="el" href="structmem.html">mem</a>,len,flags)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga5e5f7bcda6562bae815e188ea1a81ecd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5e5f7bcda6562bae815e188ea1a81ecd">&#9670;&nbsp;</a></span>recvfrom</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define recvfrom</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structmem.html">mem</a>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">len, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">flags, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">from, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">fromlen&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_recvfrom(s,<a class="el" href="structmem.html">mem</a>,len,flags,from,fromlen)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gaecfc7d524105e52604829c66ced752b8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaecfc7d524105e52604829c66ced752b8">&#9670;&nbsp;</a></span>recvmsg</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define recvmsg</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">message, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">flags&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_recvmsg(s,message,flags)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gac332b9b9b2cd877a6189ef838de49e33"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac332b9b9b2cd877a6189ef838de49e33">&#9670;&nbsp;</a></span>select</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define select</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">maxfdp1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">readset, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">writeset, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">exceptset, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">timeout&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_select(maxfdp1,readset,writeset,exceptset,timeout)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga19024690fdfd3512d24dcaa9b80d24ed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga19024690fdfd3512d24dcaa9b80d24ed">&#9670;&nbsp;</a></span>send</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define send</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dataptr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">size, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">flags&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_send(s,dataptr,size,flags)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gaad99bea090b1fe4743234fcee15a5d28"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaad99bea090b1fe4743234fcee15a5d28">&#9670;&nbsp;</a></span>sendmsg</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sendmsg</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">message, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">flags&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_sendmsg(s,message,flags)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gaaa17499d76ef421821fe72fd29fe38f7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaaa17499d76ef421821fe72fd29fe38f7">&#9670;&nbsp;</a></span>sendto</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sendto</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dataptr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">size, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">flags, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">to, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">tolen&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_sendto(s,dataptr,size,flags,to,tolen)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga115d74cd1953e7bafc2e34157c697df1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga115d74cd1953e7bafc2e34157c697df1">&#9670;&nbsp;</a></span>setsockopt</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define setsockopt</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">level, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">optname, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">opval, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">optlen&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_setsockopt(s,level,optname,opval,optlen)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga7d832f77cfad97cf901640f243c6e682"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7d832f77cfad97cf901640f243c6e682">&#9670;&nbsp;</a></span>shutdown</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define shutdown</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">how&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="sockets_8h.html#ade85c68b6673296c8fb67127b93fa4c1">lwip_shutdown</a>(s,how)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga862d8f4070c66dddb979540ce9ba6a83"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga862d8f4070c66dddb979540ce9ba6a83">&#9670;&nbsp;</a></span>socket</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define socket</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">domain, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">type, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">protocol&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_socket(domain,type,protocol)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga0a651eb5fb5e6127f5e5153ce2251f3d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0a651eb5fb5e6127f5e5153ce2251f3d">&#9670;&nbsp;</a></span>write</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define write</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dataptr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">len&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_write(s,dataptr,len)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga697fd916a65a10b4dcb54b8199346fee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga697fd916a65a10b4dcb54b8199346fee">&#9670;&nbsp;</a></span>writev</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define writev</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">iov, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">iovcnt&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;lwip_writev(s,iov,iovcnt)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__socket.js b/doc/doxygen/output/html/group__socket.js
new file mode 100644
index 0000000..67d1624
--- /dev/null
+++ b/doc/doxygen/output/html/group__socket.js
@@ -0,0 +1,34 @@
+var group__socket =
+[
+    [ "Interface Identification API", "group__if__api.html", "group__if__api" ],
+    [ "NETDB API", "group__netdbapi.html", "group__netdbapi" ],
+    [ "accept", "group__socket.html#gade2b17671b5a4b18e941fbf7e1060310", null ],
+    [ "bind", "group__socket.html#ga4a88bb849aa7203b24bb245a193997a6", null ],
+    [ "close", "group__socket.html#ga4ef17e85ec4d3acdcee5ce23f8ed93c4", null ],
+    [ "closesocket", "group__socket.html#ga5a3eb971b466278ada4f7f87399a537c", null ],
+    [ "connect", "group__socket.html#gae3d13671f622e17c17317c9a16dfd0ee", null ],
+    [ "fcntl", "group__socket.html#gaaa2b0e00cab161fcc4b31ee0d06e7eb3", null ],
+    [ "getpeername", "group__socket.html#ga33bf1b7f5b11de02d0db32531cd940b8", null ],
+    [ "getsockname", "group__socket.html#gab096fb7dbc3f84be1699a87dce980f2f", null ],
+    [ "getsockopt", "group__socket.html#gad2de02b35dbbf2334d1befb137ede821", null ],
+    [ "inet_ntop", "group__socket.html#gaa40bf11abb409097e68aa3a6982eb52b", null ],
+    [ "inet_pton", "group__socket.html#ga90d2b417d82e8da981c940a665324fd5", null ],
+    [ "ioctl", "group__socket.html#ga50a83956bc3a96e6274a21ec0d4d6338", null ],
+    [ "ioctlsocket", "group__socket.html#ga19e714443d0238cfd79b71059ec92378", null ],
+    [ "listen", "group__socket.html#gae6e6de5a20bed9fc7078f0e6c9c4aca4", null ],
+    [ "poll", "group__socket.html#ga80ae38841b0e64e60618cd8bf857f617", null ],
+    [ "read", "group__socket.html#ga822040573319cf87bfe6758d511be57f", null ],
+    [ "readv", "group__socket.html#ga86788b3c690d38699fdbaea523ddec9d", null ],
+    [ "recv", "group__socket.html#gadd7ae45df7c005619eb1126542231e9b", null ],
+    [ "recvfrom", "group__socket.html#ga5e5f7bcda6562bae815e188ea1a81ecd", null ],
+    [ "recvmsg", "group__socket.html#gaecfc7d524105e52604829c66ced752b8", null ],
+    [ "select", "group__socket.html#gac332b9b9b2cd877a6189ef838de49e33", null ],
+    [ "send", "group__socket.html#ga19024690fdfd3512d24dcaa9b80d24ed", null ],
+    [ "sendmsg", "group__socket.html#gaad99bea090b1fe4743234fcee15a5d28", null ],
+    [ "sendto", "group__socket.html#gaaa17499d76ef421821fe72fd29fe38f7", null ],
+    [ "setsockopt", "group__socket.html#ga115d74cd1953e7bafc2e34157c697df1", null ],
+    [ "shutdown", "group__socket.html#ga7d832f77cfad97cf901640f243c6e682", null ],
+    [ "socket", "group__socket.html#ga862d8f4070c66dddb979540ce9ba6a83", null ],
+    [ "write", "group__socket.html#ga0a651eb5fb5e6127f5e5153ce2251f3d", null ],
+    [ "writev", "group__socket.html#ga697fd916a65a10b4dcb54b8199346fee", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__sys__layer.html b/doc/doxygen/output/html/group__sys__layer.html
new file mode 100644
index 0000000..223dda7
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__layer.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Porting (system abstraction layer)</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__sys__layer.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">Porting (system abstraction layer)<div class="ingroups"><a class="el" href="group__lwip.html">lwIP</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__sys__nonstandard"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__nonstandard.html">Non-standard functions</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__sys__os"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__os.html">OS abstraction layer</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__sys__time"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__time.html">Time</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__sys__prot"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__prot.html">Critical sections</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__compiler__abstraction"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__compiler__abstraction.html">Compiler/platform abstraction</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__perf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__perf.html">Performance measurement</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>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__sys__layer.js b/doc/doxygen/output/html/group__sys__layer.js
new file mode 100644
index 0000000..fae8a1f
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__layer.js
@@ -0,0 +1,9 @@
+var group__sys__layer =
+[
+    [ "Non-standard functions", "group__sys__nonstandard.html", "group__sys__nonstandard" ],
+    [ "OS abstraction layer", "group__sys__os.html", "group__sys__os" ],
+    [ "Time", "group__sys__time.html", "group__sys__time" ],
+    [ "Critical sections", "group__sys__prot.html", "group__sys__prot" ],
+    [ "Compiler/platform abstraction", "group__compiler__abstraction.html", "group__compiler__abstraction" ],
+    [ "Performance measurement", "group__perf.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__sys__mbox.html b/doc/doxygen/output/html/group__sys__mbox.html
new file mode 100644
index 0000000..2cbfa3c
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__mbox.html
@@ -0,0 +1,417 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Mailboxes</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__sys__mbox.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">Mailboxes<div class="ingroups"><a class="el" href="group__lwip.html">lwIP</a> &raquo; <a class="el" href="group__sys__layer.html">Porting (system abstraction layer)</a> &raquo; <a class="el" href="group__sys__os.html">OS abstraction layer</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gab9793f30642de06ce87827e9adbe30cc"><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__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc">sys_mbox_new</a> (sys_mbox_t *mbox, int size)</td></tr>
+<tr class="separator:gab9793f30642de06ce87827e9adbe30cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9d068386a3c53dd01b8af99c3ef77555"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mbox.html#ga9d068386a3c53dd01b8af99c3ef77555">sys_mbox_post</a> (sys_mbox_t *mbox, void *msg)</td></tr>
+<tr class="separator:ga9d068386a3c53dd01b8af99c3ef77555"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa36345e48a49d67cbb0878cd4cbd2195"><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__sys__mbox.html#gaa36345e48a49d67cbb0878cd4cbd2195">sys_mbox_trypost</a> (sys_mbox_t *mbox, void *msg)</td></tr>
+<tr class="separator:gaa36345e48a49d67cbb0878cd4cbd2195"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf677a6e76adb7650a3020fdb3cb8429a"><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__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a">sys_mbox_trypost_fromisr</a> (sys_mbox_t *mbox, void *msg)</td></tr>
+<tr class="separator:gaf677a6e76adb7650a3020fdb3cb8429a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6464cd77cf6799bd8b3d6c840166a2e8"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mbox.html#ga6464cd77cf6799bd8b3d6c840166a2e8">sys_arch_mbox_fetch</a> (sys_mbox_t *mbox, void **msg, u32_t timeout)</td></tr>
+<tr class="separator:ga6464cd77cf6799bd8b3d6c840166a2e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafab441b130b4ec417012835dbe1e497c"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c">sys_arch_mbox_tryfetch</a> (sys_mbox_t *mbox, void **msg)</td></tr>
+<tr class="separator:gafab441b130b4ec417012835dbe1e497c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac641a45812155d2234ef80dd6412882f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f">sys_mbox_free</a> (sys_mbox_t *mbox)</td></tr>
+<tr class="separator:gac641a45812155d2234ef80dd6412882f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8bcfab4bd791dd33f69a778e7585275d"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d">sys_mbox_valid</a> (sys_mbox_t *mbox)</td></tr>
+<tr class="separator:ga8bcfab4bd791dd33f69a778e7585275d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga53ddec9d7f5500c5b1d982cd17493172"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172">sys_mbox_set_invalid</a> (sys_mbox_t *mbox)</td></tr>
+<tr class="separator:ga53ddec9d7f5500c5b1d982cd17493172"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>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. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga6464cd77cf6799bd8b3d6c840166a2e8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6464cd77cf6799bd8b3d6c840166a2e8">&#9670;&nbsp;</a></span>sys_arch_mbox_fetch()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t sys_arch_mbox_fetch </td>
+          <td>(</td>
+          <td class="paramtype">sys_mbox_t *&#160;</td>
+          <td class="paramname"><em>mbox</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void **&#160;</td>
+          <td class="paramname"><em>msg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>timeout</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Blocks the thread until a message arrives in the mailbox, but does not block the thread longer than "timeout" milliseconds (similar to the <a class="el" href="group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f">sys_arch_sem_wait()</a> function). If "timeout" is 0, the thread should be blocked until a message arrives. The "msg" argument is a result parameter that is set by the function (i.e., by doing "*msg =
+ptr"). The "msg" parameter maybe NULL to indicate that the message should be dropped. The return values are the same as for the <a class="el" href="group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f">sys_arch_sem_wait()</a> function: SYS_ARCH_TIMEOUT if there was a timeout, any other value if a messages is received.</p>
+<p>Note that a function with a similar name, sys_mbox_fetch(), is implemented by lwIP.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">mbox</td><td>mbox to get a message from </td></tr>
+    <tr><td class="paramname">msg</td><td>pointer where the message is stored </td></tr>
+    <tr><td class="paramname">timeout</td><td>maximum time (in milliseconds) to wait for a message (0 = wait forever) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>SYS_ARCH_TIMEOUT on timeout, any other value if a message has been received </dd></dl>
+
+</div>
+</div>
+<a id="gafab441b130b4ec417012835dbe1e497c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafab441b130b4ec417012835dbe1e497c">&#9670;&nbsp;</a></span>sys_arch_mbox_tryfetch()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t sys_arch_mbox_tryfetch </td>
+          <td>(</td>
+          <td class="paramtype">sys_mbox_t *&#160;</td>
+          <td class="paramname"><em>mbox</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void **&#160;</td>
+          <td class="paramname"><em>msg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This is similar to sys_arch_mbox_fetch, however if a message is not present in the mailbox, it immediately returns with the code SYS_MBOX_EMPTY. On success 0 is returned. To allow for efficient implementations, this can be defined as a function-like macro in sys_arch.h instead of a normal function. For 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.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">mbox</td><td>mbox to get a message from </td></tr>
+    <tr><td class="paramname">msg</td><td>pointer where the message is stored </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 (milliseconds) if a message has been received or SYS_MBOX_EMPTY if the mailbox is empty </dd></dl>
+
+</div>
+</div>
+<a id="gac641a45812155d2234ef80dd6412882f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac641a45812155d2234ef80dd6412882f">&#9670;&nbsp;</a></span>sys_mbox_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_mbox_free </td>
+          <td>(</td>
+          <td class="paramtype">sys_mbox_t *&#160;</td>
+          <td class="paramname"><em>mbox</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">mbox</td><td>mbox to delete </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gab9793f30642de06ce87827e9adbe30cc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab9793f30642de06ce87827e9adbe30cc">&#9670;&nbsp;</a></span>sys_mbox_new()</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> sys_mbox_new </td>
+          <td>(</td>
+          <td class="paramtype">sys_mbox_t *&#160;</td>
+          <td class="paramname"><em>mbox</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>size</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Creates an empty mailbox for maximum "size" elements. Elements stored in mailboxes are pointers. You have to define macros "_MBOX_SIZE" in your lwipopts.h, or ignore this parameter in your implementation and use a default size. 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.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">mbox</td><td>pointer to the mbox to create </td></tr>
+    <tr><td class="paramname">size</td><td>(minimum) number of messages in this mbox </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, another err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ga9d068386a3c53dd01b8af99c3ef77555"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9d068386a3c53dd01b8af99c3ef77555">&#9670;&nbsp;</a></span>sys_mbox_post()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_mbox_post </td>
+          <td>(</td>
+          <td class="paramtype">sys_mbox_t *&#160;</td>
+          <td class="paramname"><em>mbox</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>msg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Post a message to an mbox - may not fail -&gt; blocks if full, only to be used from tasks NOT from ISR!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">mbox</td><td>mbox to posts the message </td></tr>
+    <tr><td class="paramname">msg</td><td>message to post (ATTENTION: can be NULL) </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga53ddec9d7f5500c5b1d982cd17493172"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga53ddec9d7f5500c5b1d982cd17493172">&#9670;&nbsp;</a></span>sys_mbox_set_invalid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_mbox_set_invalid </td>
+          <td>(</td>
+          <td class="paramtype">sys_mbox_t *&#160;</td>
+          <td class="paramname"><em>mbox</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Invalidate a mailbox so that <a class="el" href="group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d">sys_mbox_valid()</a> returns 0. ATTENTION: This does NOT mean that the mailbox shall be deallocated: <a class="el" href="group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f">sys_mbox_free()</a> is always called before calling this function! This may also be a define, in which case the function is not prototyped. </p>
+
+</div>
+</div>
+<a id="gaa36345e48a49d67cbb0878cd4cbd2195"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa36345e48a49d67cbb0878cd4cbd2195">&#9670;&nbsp;</a></span>sys_mbox_trypost()</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> sys_mbox_trypost </td>
+          <td>(</td>
+          <td class="paramtype">sys_mbox_t *&#160;</td>
+          <td class="paramname"><em>mbox</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>msg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">mbox</td><td>mbox to posts the message </td></tr>
+    <tr><td class="paramname">msg</td><td>message to post (ATTENTION: can be NULL) </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gaf677a6e76adb7650a3020fdb3cb8429a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf677a6e76adb7650a3020fdb3cb8429a">&#9670;&nbsp;</a></span>sys_mbox_trypost_fromisr()</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> sys_mbox_trypost_fromisr </td>
+          <td>(</td>
+          <td class="paramtype">sys_mbox_t *&#160;</td>
+          <td class="paramname"><em>mbox</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>msg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">mbox</td><td>mbox to posts the message </td></tr>
+    <tr><td class="paramname">msg</td><td>message to post (ATTENTION: can be NULL) </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga8bcfab4bd791dd33f69a778e7585275d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8bcfab4bd791dd33f69a778e7585275d">&#9670;&nbsp;</a></span>sys_mbox_valid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int sys_mbox_valid </td>
+          <td>(</td>
+          <td class="paramtype">sys_mbox_t *&#160;</td>
+          <td class="paramname"><em>mbox</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns 1 if the mailbox is valid, 0 if it is not valid. When using pointers, a simple way is to check the pointer for != NULL. When directly using OS structures, implementing this may be more complex. This may also be a define, in which case the function is not prototyped. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__sys__mbox.js b/doc/doxygen/output/html/group__sys__mbox.js
new file mode 100644
index 0000000..4066e2f
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__mbox.js
@@ -0,0 +1,12 @@
+var group__sys__mbox =
+[
+    [ "sys_arch_mbox_fetch", "group__sys__mbox.html#ga6464cd77cf6799bd8b3d6c840166a2e8", null ],
+    [ "sys_arch_mbox_tryfetch", "group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c", null ],
+    [ "sys_mbox_free", "group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f", null ],
+    [ "sys_mbox_new", "group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc", null ],
+    [ "sys_mbox_post", "group__sys__mbox.html#ga9d068386a3c53dd01b8af99c3ef77555", null ],
+    [ "sys_mbox_set_invalid", "group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172", null ],
+    [ "sys_mbox_trypost", "group__sys__mbox.html#gaa36345e48a49d67cbb0878cd4cbd2195", null ],
+    [ "sys_mbox_trypost_fromisr", "group__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a", null ],
+    [ "sys_mbox_valid", "group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__sys__misc.html b/doc/doxygen/output/html/group__sys__misc.html
new file mode 100644
index 0000000..b713281
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__misc.html
@@ -0,0 +1,215 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Misc</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__sys__misc.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">Misc<div class="ingroups"><a class="el" href="group__lwip.html">lwIP</a> &raquo; <a class="el" href="group__sys__layer.html">Porting (system abstraction layer)</a> &raquo; <a class="el" href="group__sys__os.html">OS abstraction layer</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga6b8786f43e779953e8b74e983c88682e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e">sys_msleep</a> (u32_t ms)</td></tr>
+<tr class="separator:ga6b8786f43e779953e8b74e983c88682e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0d596afdd8dbcfad320172d39b0f607a"><td class="memItemLeft" align="right" valign="top">sys_thread_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a">sys_thread_new</a> (const char *name, <a class="el" href="sys_8h.html#ae30a77bf6bd69bfcc5f235eaad54f2b9">lwip_thread_fn</a> thread, void *arg, int stacksize, int prio)</td></tr>
+<tr class="separator:ga0d596afdd8dbcfad320172d39b0f607a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf411a8bc6b7ed4b0af9114e10c959448"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__misc.html#gaf411a8bc6b7ed4b0af9114e10c959448">sys_init</a> (void)</td></tr>
+<tr class="separator:gaf411a8bc6b7ed4b0af9114e10c959448"><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="gaf411a8bc6b7ed4b0af9114e10c959448"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf411a8bc6b7ed4b0af9114e10c959448">&#9670;&nbsp;</a></span>sys_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__sys__misc.html#gaf411a8bc6b7ed4b0af9114e10c959448">sys_init()</a> must be called before anything else. Initialize the sys_arch layer. </p>
+
+</div>
+</div>
+<a id="ga6b8786f43e779953e8b74e983c88682e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6b8786f43e779953e8b74e983c88682e">&#9670;&nbsp;</a></span>sys_msleep()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_msleep </td>
+          <td>(</td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>ms</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sleep for specified number of ms</p>
+<p>Sleep for some ms. Timeouts are NOT processed while sleeping.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ms</td><td>number of milliseconds to sleep </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga0d596afdd8dbcfad320172d39b0f607a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0d596afdd8dbcfad320172d39b0f607a">&#9670;&nbsp;</a></span>sys_thread_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">sys_thread_t sys_thread_new </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="sys_8h.html#ae30a77bf6bd69bfcc5f235eaad54f2b9">lwip_thread_fn</a>&#160;</td>
+          <td class="paramname"><em>thread</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>stacksize</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>prio</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The only thread function: Starts a new thread named "name" with priority "prio" that will begin its execution in the function "thread()". The "arg" argument will be passed as an argument to the thread() function. The stack size to used for this thread is 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!)</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">name</td><td>human-readable name for the thread (used for debugging purposes) </td></tr>
+    <tr><td class="paramname">thread</td><td>thread-function </td></tr>
+    <tr><td class="paramname">arg</td><td>parameter passed to 'thread' </td></tr>
+    <tr><td class="paramname">stacksize</td><td>stack size in bytes for the new thread (may be ignored by ports) </td></tr>
+    <tr><td class="paramname">prio</td><td>priority of the new thread (may be ignored by ports) </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__sys__misc.js b/doc/doxygen/output/html/group__sys__misc.js
new file mode 100644
index 0000000..1ac63f9
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__misc.js
@@ -0,0 +1,6 @@
+var group__sys__misc =
+[
+    [ "sys_init", "group__sys__misc.html#gaf411a8bc6b7ed4b0af9114e10c959448", null ],
+    [ "sys_msleep", "group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e", null ],
+    [ "sys_thread_new", "group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__sys__mutex.html b/doc/doxygen/output/html/group__sys__mutex.html
new file mode 100644
index 0000000..de16b4e
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__mutex.html
@@ -0,0 +1,256 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Mutexes</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__sys__mutex.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">Mutexes<div class="ingroups"><a class="el" href="group__lwip.html">lwIP</a> &raquo; <a class="el" href="group__sys__layer.html">Porting (system abstraction layer)</a> &raquo; <a class="el" href="group__sys__os.html">OS abstraction layer</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga38e7dae1fd88b338eb1cd97f110f3897"><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__sys__mutex.html#ga38e7dae1fd88b338eb1cd97f110f3897">sys_mutex_new</a> (sys_mutex_t *mutex)</td></tr>
+<tr class="separator:ga38e7dae1fd88b338eb1cd97f110f3897"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4d4eb9afe5965fa2661dd54ff55d616a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a">sys_mutex_lock</a> (sys_mutex_t *mutex)</td></tr>
+<tr class="separator:ga4d4eb9afe5965fa2661dd54ff55d616a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5568f68898fe9d5735f9ce2f665624fb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb">sys_mutex_unlock</a> (sys_mutex_t *mutex)</td></tr>
+<tr class="separator:ga5568f68898fe9d5735f9ce2f665624fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga16336ce68b741e98204102ca4bc84dd9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mutex.html#ga16336ce68b741e98204102ca4bc84dd9">sys_mutex_free</a> (sys_mutex_t *mutex)</td></tr>
+<tr class="separator:ga16336ce68b741e98204102ca4bc84dd9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaebe83ba90a6d9c23cdb3eb5d49562c4a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mutex.html#gaebe83ba90a6d9c23cdb3eb5d49562c4a">sys_mutex_valid</a> (sys_mutex_t *mutex)</td></tr>
+<tr class="separator:gaebe83ba90a6d9c23cdb3eb5d49562c4a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3f392725971dc837aa56dd7e45fa7ca8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mutex.html#ga3f392725971dc837aa56dd7e45fa7ca8">sys_mutex_set_invalid</a> (sys_mutex_t *mutex)</td></tr>
+<tr class="separator:ga3f392725971dc837aa56dd7e45fa7ca8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Mutexes are recommended to correctly handle priority inversion, especially if you use LWIP_CORE_LOCKING . </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga16336ce68b741e98204102ca4bc84dd9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga16336ce68b741e98204102ca4bc84dd9">&#9670;&nbsp;</a></span>sys_mutex_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_mutex_free </td>
+          <td>(</td>
+          <td class="paramtype">sys_mutex_t *&#160;</td>
+          <td class="paramname"><em>mutex</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Deallocates a mutex. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">mutex</td><td>the mutex to delete </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga4d4eb9afe5965fa2661dd54ff55d616a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4d4eb9afe5965fa2661dd54ff55d616a">&#9670;&nbsp;</a></span>sys_mutex_lock()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_mutex_lock </td>
+          <td>(</td>
+          <td class="paramtype">sys_mutex_t *&#160;</td>
+          <td class="paramname"><em>mutex</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Blocks the thread until the mutex can be grabbed. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">mutex</td><td>the mutex to lock </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga38e7dae1fd88b338eb1cd97f110f3897"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga38e7dae1fd88b338eb1cd97f110f3897">&#9670;&nbsp;</a></span>sys_mutex_new()</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> sys_mutex_new </td>
+          <td>(</td>
+          <td class="paramtype">sys_mutex_t *&#160;</td>
+          <td class="paramname"><em>mutex</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create a new mutex. Note that mutexes are expected to not be taken recursively by the lwIP code, so both implementation types (recursive or non-recursive) should work. The mutex is allocated to the memory that 'mutex' points to (which can be both a pointer or the actual OS structure). 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.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">mutex</td><td>pointer to the mutex to create </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, another err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ga3f392725971dc837aa56dd7e45fa7ca8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3f392725971dc837aa56dd7e45fa7ca8">&#9670;&nbsp;</a></span>sys_mutex_set_invalid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_mutex_set_invalid </td>
+          <td>(</td>
+          <td class="paramtype">sys_mutex_t *&#160;</td>
+          <td class="paramname"><em>mutex</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Invalidate a mutex so that <a class="el" href="group__sys__mutex.html#gaebe83ba90a6d9c23cdb3eb5d49562c4a">sys_mutex_valid()</a> returns 0. ATTENTION: This does NOT mean that the mutex shall be deallocated: <a class="el" href="group__sys__mutex.html#ga16336ce68b741e98204102ca4bc84dd9">sys_mutex_free()</a> is always called before calling this function! This may also be a define, in which case the function is not prototyped. </p>
+
+</div>
+</div>
+<a id="ga5568f68898fe9d5735f9ce2f665624fb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5568f68898fe9d5735f9ce2f665624fb">&#9670;&nbsp;</a></span>sys_mutex_unlock()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_mutex_unlock </td>
+          <td>(</td>
+          <td class="paramtype">sys_mutex_t *&#160;</td>
+          <td class="paramname"><em>mutex</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Releases the mutex previously locked through '<a class="el" href="group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a">sys_mutex_lock()</a>'. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">mutex</td><td>the mutex to unlock </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gaebe83ba90a6d9c23cdb3eb5d49562c4a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaebe83ba90a6d9c23cdb3eb5d49562c4a">&#9670;&nbsp;</a></span>sys_mutex_valid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int sys_mutex_valid </td>
+          <td>(</td>
+          <td class="paramtype">sys_mutex_t *&#160;</td>
+          <td class="paramname"><em>mutex</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns 1 if the mutes is valid, 0 if it is not valid. When using pointers, a simple way is to check the pointer for != NULL. When directly using OS structures, implementing this may be more complex. This may also be a define, in which case the function is not prototyped. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__sys__mutex.js b/doc/doxygen/output/html/group__sys__mutex.js
new file mode 100644
index 0000000..890346c
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__mutex.js
@@ -0,0 +1,9 @@
+var group__sys__mutex =
+[
+    [ "sys_mutex_free", "group__sys__mutex.html#ga16336ce68b741e98204102ca4bc84dd9", null ],
+    [ "sys_mutex_lock", "group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a", null ],
+    [ "sys_mutex_new", "group__sys__mutex.html#ga38e7dae1fd88b338eb1cd97f110f3897", null ],
+    [ "sys_mutex_set_invalid", "group__sys__mutex.html#ga3f392725971dc837aa56dd7e45fa7ca8", null ],
+    [ "sys_mutex_unlock", "group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb", null ],
+    [ "sys_mutex_valid", "group__sys__mutex.html#gaebe83ba90a6d9c23cdb3eb5d49562c4a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__sys__nonstandard.html b/doc/doxygen/output/html/group__sys__nonstandard.html
new file mode 100644
index 0000000..4c6fb1a
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__nonstandard.html
@@ -0,0 +1,250 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Non-standard functions</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__sys__nonstandard.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">Non-standard functions<div class="ingroups"><a class="el" href="group__lwip.html">lwIP</a> &raquo; <a class="el" href="group__sys__layer.html">Porting (system abstraction layer)</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaeece028198cdaea2f0d2f1d691752c02"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__nonstandard.html#gaeece028198cdaea2f0d2f1d691752c02">lwip_strnstr</a> (const char *buffer, const char *token, size_t n)</td></tr>
+<tr class="separator:gaeece028198cdaea2f0d2f1d691752c02"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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>
+<tr class="separator:ga997dcc49451121d4ed755b33bc7bd26a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf15b4fbaaae5bb7f6da4301f3f979284"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284">lwip_itoa</a> (char *result, size_t bufsize, int number)</td></tr>
+<tr class="separator:gaf15b4fbaaae5bb7f6da4301f3f979284"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>lwIP provides default implementations for non-standard functions. These can be mapped to OS functions to reduce code footprint if desired. All defines related to this section must not be placed in lwipopts.h, but in arch/cc.h! These options cannot be #defined in lwipopts.h since they are not options of lwIP itself, but options of the lwIP port to your system. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gaf15b4fbaaae5bb7f6da4301f3f979284"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf15b4fbaaae5bb7f6da4301f3f979284">&#9670;&nbsp;</a></span>lwip_itoa()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_itoa </td>
+          <td>(</td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>result</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>bufsize</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>number</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>lwIP default implementation for itoa() non-standard function. This can be #defined to itoa() or snprintf(result, bufsize, "%d", number) depending on your platform port. </p>
+
+</div>
+</div>
+<a id="ga263cbafcb697eff964139a9998a6668a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga263cbafcb697eff964139a9998a6668a">&#9670;&nbsp;</a></span>lwip_stricmp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lwip_stricmp </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>str1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>str2</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>lwIP default implementation for stricmp() non-standard function. This can be #defined to stricmp() depending on your platform port. </p>
+
+</div>
+</div>
+<a id="ga997dcc49451121d4ed755b33bc7bd26a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga997dcc49451121d4ed755b33bc7bd26a">&#9670;&nbsp;</a></span>lwip_strnicmp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lwip_strnicmp </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>str1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>str2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>lwIP default implementation for strnicmp() non-standard function. This can be #defined to strnicmp() depending on your platform port. </p>
+
+</div>
+</div>
+<a id="gaeece028198cdaea2f0d2f1d691752c02"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaeece028198cdaea2f0d2f1d691752c02">&#9670;&nbsp;</a></span>lwip_strnstr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* lwip_strnstr </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>buffer</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>token</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>n</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>lwIP default implementation for strnstr() non-standard function. This can be #defined to strnstr() depending on your platform port. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__sys__nonstandard.js b/doc/doxygen/output/html/group__sys__nonstandard.js
new file mode 100644
index 0000000..be8235d
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__nonstandard.js
@@ -0,0 +1,7 @@
+var group__sys__nonstandard =
+[
+    [ "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_strnstr", "group__sys__nonstandard.html#gaeece028198cdaea2f0d2f1d691752c02", 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
new file mode 100644
index 0000000..bade091
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__os.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: OS abstraction layer</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__sys__os.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<div class="title">OS abstraction layer<div class="ingroups"><a class="el" href="group__lwip.html">lwIP</a> &raquo; <a class="el" href="group__sys__layer.html">Porting (system abstraction layer)</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__sys__sem"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__sem.html">Semaphores</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__sys__mutex"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mutex.html">Mutexes</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__sys__mbox"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mbox.html">Mailboxes</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:group__sys__misc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__misc.html">Misc</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>
+<p>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.</p>
+<p>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.</p>
+<p>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).</p>
+<p>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.</p>
+<p>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).</p>
+<h2>Note: </h2>
+<p>Be careful with using <a class="el" href="mem_8c.html#af418ade27d91d41e6143dba2cc246b0f">mem_malloc()</a> in sys_arch. When malloc() refers to <a class="el" href="mem_8c.html#af418ade27d91d41e6143dba2cc246b0f">mem_malloc()</a> you can run into a circular function call problem. In <a class="el" href="mem_8c.html">mem.c</a> <a class="el" href="mem_8c.html#a44a136e3b70c36abb6f8dc060c778113">mem_init()</a> tries to allocate a semaphore using mem_malloc, which of course can't be performed when sys_arch uses mem_malloc. </p>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__sys__os.js b/doc/doxygen/output/html/group__sys__os.js
new file mode 100644
index 0000000..fece860
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__os.js
@@ -0,0 +1,7 @@
+var group__sys__os =
+[
+    [ "Semaphores", "group__sys__sem.html", "group__sys__sem" ],
+    [ "Mutexes", "group__sys__mutex.html", "group__sys__mutex" ],
+    [ "Mailboxes", "group__sys__mbox.html", "group__sys__mbox" ],
+    [ "Misc", "group__sys__misc.html", "group__sys__misc" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__sys__prot.html b/doc/doxygen/output/html/group__sys__prot.html
new file mode 100644
index 0000000..451ae71
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__prot.html
@@ -0,0 +1,176 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Critical sections</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__sys__prot.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">Critical sections<div class="ingroups"><a class="el" href="group__lwip.html">lwIP</a> &raquo; <a class="el" href="group__sys__layer.html">Porting (system abstraction layer)</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem: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)&#160;&#160;&#160;sys_prot_t lev</td></tr>
+<tr class="separator:ga945395fa326214fc9736487242710a90"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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)&#160;&#160;&#160;lev = sys_arch_protect()</td></tr>
+<tr class="separator:ga3d0e48feafd378e9c26c64567ecd8bab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2f48e97047945642ddeb27e65bf4ffe2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__prot.html#ga2f48e97047945642ddeb27e65bf4ffe2">SYS_ARCH_UNPROTECT</a>(lev)&#160;&#160;&#160;sys_arch_unprotect(lev)</td></tr>
+<tr class="separator:ga2f48e97047945642ddeb27e65bf4ffe2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Used to protect short regions of code against concurrent access.</p><ul>
+<li>Your system is a bare-metal system (probably with an RTOS) and interrupts are under your control: Implement this as LockInterrupts() / UnlockInterrupts()</li>
+<li>Your system uses an RTOS with deferred interrupt handling from a worker thread: Implement as a global mutex or lock/unlock scheduler</li>
+<li>Your system uses a high-level OS with e.g. POSIX signals: Implement as a global mutex </li>
+</ul>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga945395fa326214fc9736487242710a90"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga945395fa326214fc9736487242710a90">&#9670;&nbsp;</a></span>SYS_ARCH_DECL_PROTECT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SYS_ARCH_DECL_PROTECT</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">lev</td><td>)</td>
+          <td>&#160;&#160;&#160;sys_prot_t lev</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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.</p>
+<p>SYS_ARCH_DECL_PROTECT declare a protection variable. This macro will default to defining a variable of type sys_prot_t. If a particular port needs a different implementation, then this macro may be defined in sys_arch.h. </p>
+
+</div>
+</div>
+<a id="ga3d0e48feafd378e9c26c64567ecd8bab"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3d0e48feafd378e9c26c64567ecd8bab">&#9670;&nbsp;</a></span>SYS_ARCH_PROTECT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SYS_ARCH_PROTECT</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">lev</td><td>)</td>
+          <td>&#160;&#160;&#160;lev = sys_arch_protect()</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SYS_ARCH_PROTECT Perform a "fast" protect. This could be implemented by disabling interrupts for an embedded system or by using a semaphore or mutex. The implementation should allow calling SYS_ARCH_PROTECT when already protected. The old protection level is returned in the variable "lev". This macro will default to calling the sys_arch_protect() function which should be implemented in sys_arch.c. If a particular port needs a different implementation, then this macro may be defined in sys_arch.h </p>
+
+</div>
+</div>
+<a id="ga2f48e97047945642ddeb27e65bf4ffe2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2f48e97047945642ddeb27e65bf4ffe2">&#9670;&nbsp;</a></span>SYS_ARCH_UNPROTECT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SYS_ARCH_UNPROTECT</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">lev</td><td>)</td>
+          <td>&#160;&#160;&#160;sys_arch_unprotect(lev)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SYS_ARCH_UNPROTECT Perform a "fast" set of the protection level to "lev". This could be implemented by setting the interrupt level to "lev" within the MACRO or by using a semaphore or mutex. This macro will default to calling the sys_arch_unprotect() function which should be implemented in sys_arch.c. If a particular port needs a different implementation, then this macro may be defined in sys_arch.h </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__sys__prot.js b/doc/doxygen/output/html/group__sys__prot.js
new file mode 100644
index 0000000..1d2299d
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__prot.js
@@ -0,0 +1,6 @@
+var group__sys__prot =
+[
+    [ "SYS_ARCH_DECL_PROTECT", "group__sys__prot.html#ga945395fa326214fc9736487242710a90", null ],
+    [ "SYS_ARCH_PROTECT", "group__sys__prot.html#ga3d0e48feafd378e9c26c64567ecd8bab", null ],
+    [ "SYS_ARCH_UNPROTECT", "group__sys__prot.html#ga2f48e97047945642ddeb27e65bf4ffe2", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__sys__sem.html b/doc/doxygen/output/html/group__sys__sem.html
new file mode 100644
index 0000000..cb775ba
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__sem.html
@@ -0,0 +1,281 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Semaphores</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__sys__sem.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">Semaphores<div class="ingroups"><a class="el" href="group__lwip.html">lwIP</a> &raquo; <a class="el" href="group__sys__layer.html">Porting (system abstraction layer)</a> &raquo; <a class="el" href="group__sys__os.html">OS abstraction layer</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaf99da9e34a71855285c535183133dfde"><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__sys__sem.html#gaf99da9e34a71855285c535183133dfde">sys_sem_new</a> (sys_sem_t *sem, u8_t count)</td></tr>
+<tr class="separator:gaf99da9e34a71855285c535183133dfde"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaf800273061fcc3f8200fd4e1b9ca875"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__sem.html#gaaf800273061fcc3f8200fd4e1b9ca875">sys_sem_signal</a> (sys_sem_t *sem)</td></tr>
+<tr class="separator:gaaf800273061fcc3f8200fd4e1b9ca875"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8d364c5037778acb21c3df675db81b4f"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f">sys_arch_sem_wait</a> (sys_sem_t *sem, u32_t timeout)</td></tr>
+<tr class="separator:ga8d364c5037778acb21c3df675db81b4f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83b781f96c30e915c752065a757da283"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__sem.html#ga83b781f96c30e915c752065a757da283">sys_sem_free</a> (sys_sem_t *sem)</td></tr>
+<tr class="separator:ga83b781f96c30e915c752065a757da283"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga09a6c052ddaf799139efc56adfa087e4"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4">sys_sem_valid</a> (sys_sem_t *sem)</td></tr>
+<tr class="separator:ga09a6c052ddaf799139efc56adfa087e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga42a2ab32afbf41a4146a9d135224ef33"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33">sys_sem_set_invalid</a> (sys_sem_t *sem)</td></tr>
+<tr class="separator:ga42a2ab32afbf41a4146a9d135224ef33"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Semaphores can be either counting or binary - lwIP works with both kinds. Semaphores are represented by the type "sys_sem_t" which is typedef'd in the sys_arch.h file. Mailboxes are equivalently represented by the type "sys_mbox_t". Mutexes are represented by the type "sys_mutex_t". lwIP does not place any restrictions on how these types are represented internally. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga8d364c5037778acb21c3df675db81b4f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8d364c5037778acb21c3df675db81b4f">&#9670;&nbsp;</a></span>sys_arch_sem_wait()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t sys_arch_sem_wait </td>
+          <td>(</td>
+          <td class="paramtype">sys_sem_t *&#160;</td>
+          <td class="paramname"><em>sem</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>timeout</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Blocks the thread while waiting for the semaphore to be signaled. If the "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.</p>
+<p>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, <a class="el" href="sys_8h.html#a84e7e4bc00255aee84e6e7289a985703">sys_sem_wait()</a>, that uses the <a class="el" href="group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f">sys_arch_sem_wait()</a> function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">sem</td><td>the semaphore to wait for </td></tr>
+    <tr><td class="paramname">timeout</td><td>timeout in milliseconds to wait (0 = wait forever) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>SYS_ARCH_TIMEOUT on timeout, any other value on success </dd></dl>
+
+</div>
+</div>
+<a id="ga83b781f96c30e915c752065a757da283"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga83b781f96c30e915c752065a757da283">&#9670;&nbsp;</a></span>sys_sem_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_sem_free </td>
+          <td>(</td>
+          <td class="paramtype">sys_sem_t *&#160;</td>
+          <td class="paramname"><em>sem</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Deallocates a semaphore. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">sem</td><td>semaphore to delete </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gaf99da9e34a71855285c535183133dfde"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf99da9e34a71855285c535183133dfde">&#9670;&nbsp;</a></span>sys_sem_new()</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> sys_sem_new </td>
+          <td>(</td>
+          <td class="paramtype">sys_sem_t *&#160;</td>
+          <td class="paramname"><em>sem</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>count</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create a new semaphore Creates a new semaphore. The semaphore is allocated to the memory that 'sem' points to (which can be both a pointer or the actual OS structure). The "count" argument specifies the initial state of the semaphore (which is either 0 or 1). If the semaphore 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.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">sem</td><td>pointer to the semaphore to create </td></tr>
+    <tr><td class="paramname">count</td><td>initial count of the semaphore </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, another err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ga42a2ab32afbf41a4146a9d135224ef33"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga42a2ab32afbf41a4146a9d135224ef33">&#9670;&nbsp;</a></span>sys_sem_set_invalid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_sem_set_invalid </td>
+          <td>(</td>
+          <td class="paramtype">sys_sem_t *&#160;</td>
+          <td class="paramname"><em>sem</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Invalidate a semaphore so that <a class="el" href="group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4">sys_sem_valid()</a> returns 0. ATTENTION: This does NOT mean that the semaphore shall be deallocated: <a class="el" href="group__sys__sem.html#ga83b781f96c30e915c752065a757da283">sys_sem_free()</a> is always called before calling this function! This may also be a define, in which case the function is not prototyped. </p>
+
+</div>
+</div>
+<a id="gaaf800273061fcc3f8200fd4e1b9ca875"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaaf800273061fcc3f8200fd4e1b9ca875">&#9670;&nbsp;</a></span>sys_sem_signal()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_sem_signal </td>
+          <td>(</td>
+          <td class="paramtype">sys_sem_t *&#160;</td>
+          <td class="paramname"><em>sem</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Signals a semaphore </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">sem</td><td>the semaphore to signal </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga09a6c052ddaf799139efc56adfa087e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga09a6c052ddaf799139efc56adfa087e4">&#9670;&nbsp;</a></span>sys_sem_valid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int sys_sem_valid </td>
+          <td>(</td>
+          <td class="paramtype">sys_sem_t *&#160;</td>
+          <td class="paramname"><em>sem</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns 1 if the semaphore is valid, 0 if it is not valid. When using pointers, a simple way is to check the pointer for != NULL. When directly using OS structures, implementing this may be more complex. This may also be a define, in which case the function is not prototyped. </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__sys__sem.js b/doc/doxygen/output/html/group__sys__sem.js
new file mode 100644
index 0000000..4d4c837
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__sem.js
@@ -0,0 +1,9 @@
+var group__sys__sem =
+[
+    [ "sys_arch_sem_wait", "group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f", null ],
+    [ "sys_sem_free", "group__sys__sem.html#ga83b781f96c30e915c752065a757da283", null ],
+    [ "sys_sem_new", "group__sys__sem.html#gaf99da9e34a71855285c535183133dfde", null ],
+    [ "sys_sem_set_invalid", "group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33", null ],
+    [ "sys_sem_signal", "group__sys__sem.html#gaaf800273061fcc3f8200fd4e1b9ca875", null ],
+    [ "sys_sem_valid", "group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__sys__time.html b/doc/doxygen/output/html/group__sys__time.html
new file mode 100644
index 0000000..9fe8247
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__time.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Time</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__sys__time.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">Time<div class="ingroups"><a class="el" href="group__lwip.html">lwIP</a> &raquo; <a class="el" href="group__sys__layer.html">Porting (system abstraction layer)</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga11316ac1e77418c6fa4ab8869e3fa199"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199">sys_now</a> (void)</td></tr>
+<tr class="separator:ga11316ac1e77418c6fa4ab8869e3fa199"><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="ga11316ac1e77418c6fa4ab8869e3fa199"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga11316ac1e77418c6fa4ab8869e3fa199">&#9670;&nbsp;</a></span>sys_now()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t sys_now </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns the current time in milliseconds, may be the same as sys_jiffies or at least based on it. Don't care for wraparound, this is only used for time diffs. Not implementing this function means you cannot use some modules (e.g. TCP timestamps, internal timeouts for NO_SYS==1). </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__sys__time.js b/doc/doxygen/output/html/group__sys__time.js
new file mode 100644
index 0000000..90c8c5e
--- /dev/null
+++ b/doc/doxygen/output/html/group__sys__time.js
@@ -0,0 +1,4 @@
+var group__sys__time =
+[
+    [ "sys_now", "group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__tcp__raw.html b/doc/doxygen/output/html/group__tcp__raw.html
new file mode 100644
index 0000000..10fbea8
--- /dev/null
+++ b/doc/doxygen/output/html/group__tcp__raw.html
@@ -0,0 +1,1088 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: TCP</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__tcp__raw.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">TCP<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__tcp__raw__extargs"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html">ext arguments</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gab0b45a01dcd461e5b8df2a1d9ddda134"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gab0b45a01dcd461e5b8df2a1d9ddda134">tcp_mss</a>(pcb)&#160;&#160;&#160;((pcb)-&gt;mss)</td></tr>
+<tr class="separator:gab0b45a01dcd461e5b8df2a1d9ddda134"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad1a95f09deb49cd7341d35527d6d3e2f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gad1a95f09deb49cd7341d35527d6d3e2f">tcp_sndbuf</a>(pcb)&#160;&#160;&#160;(TCPWND16((pcb)-&gt;snd_buf))</td></tr>
+<tr class="separator:gad1a95f09deb49cd7341d35527d6d3e2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga53ee4364718e84dc42cb1e0179deb1f4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga53ee4364718e84dc42cb1e0179deb1f4">tcp_sndqueuelen</a>(pcb)&#160;&#160;&#160;((pcb)-&gt;snd_queuelen)</td></tr>
+<tr class="separator:ga53ee4364718e84dc42cb1e0179deb1f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5b5c0093efff4466bda06d45f12a4633"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga5b5c0093efff4466bda06d45f12a4633">tcp_nagle_disable</a>(pcb)&#160;&#160;&#160;tcp_set_flags(pcb, TF_NODELAY)</td></tr>
+<tr class="separator:ga5b5c0093efff4466bda06d45f12a4633"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9dfcdb8a05533b07dca91cf7e784f88f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga9dfcdb8a05533b07dca91cf7e784f88f">tcp_nagle_enable</a>(pcb)&#160;&#160;&#160;tcp_clear_flags(pcb, TF_NODELAY)</td></tr>
+<tr class="separator:ga9dfcdb8a05533b07dca91cf7e784f88f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9398061411b4af900160233aa3b1a286"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga9398061411b4af900160233aa3b1a286">tcp_nagle_disabled</a>(pcb)&#160;&#160;&#160;tcp_is_flag_set(pcb, TF_NODELAY)</td></tr>
+<tr class="separator:ga9398061411b4af900160233aa3b1a286"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6b2a4efb1fc15d7d85cb71cb2a1d1066"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga6b2a4efb1fc15d7d85cb71cb2a1d1066">tcp_listen</a>(pcb)&#160;&#160;&#160;<a class="el" href="group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338">tcp_listen_with_backlog</a>(pcb, <a class="el" href="group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf">TCP_DEFAULT_LISTEN_BACKLOG</a>)</td></tr>
+<tr class="separator:ga6b2a4efb1fc15d7d85cb71cb2a1d1066"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga427b11c7b98c748ec487cd43093bd2f8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8">tcp_backlog_delayed</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga427b11c7b98c748ec487cd43093bd2f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga619154658137a23839ca3b94882131ca"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga619154658137a23839ca3b94882131ca">tcp_backlog_accepted</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga619154658137a23839ca3b94882131ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga87093e137fcc53ea82a134a3f5b33623"><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#ga87093e137fcc53ea82a134a3f5b33623">tcp_close</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga87093e137fcc53ea82a134a3f5b33623"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5b94d57f1891b9287f88525a2ac561dd"><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#ga5b94d57f1891b9287f88525a2ac561dd">tcp_shutdown</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, int shut_rx, int shut_tx)</td></tr>
+<tr class="separator:ga5b94d57f1891b9287f88525a2ac561dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga468c2260ddb01582e966ddcf3c25ce61"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61">tcp_abort</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga468c2260ddb01582e966ddcf3c25ce61"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacf5aa67bd7fc66fef43f77a55a1201ee"><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#gacf5aa67bd7fc66fef43f77a55a1201ee">tcp_bind</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, u16_t port)</td></tr>
+<tr class="separator:gacf5aa67bd7fc66fef43f77a55a1201ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6469a15709088e80024258dbe80fcd1f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f">tcp_bind_netif</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, const struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga6469a15709088e80024258dbe80fcd1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaeff14f321d1eecd0431611f382fcd338"><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="group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338">tcp_listen_with_backlog</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t backlog)</td></tr>
+<tr class="separator:gaeff14f321d1eecd0431611f382fcd338"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac86ad8ded4d1db15a5b5fb42eb7c1436"><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="group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436">tcp_listen_with_backlog_and_err</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t backlog, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> *err)</td></tr>
+<tr class="separator:gac86ad8ded4d1db15a5b5fb42eb7c1436"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabdac0856a52b5789dc897d4c7137ec44"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44">tcp_recved</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u16_t len)</td></tr>
+<tr class="separator:gabdac0856a52b5789dc897d4c7137ec44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012">tcp_connect</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">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:ga7427c5d237fe66a8097bfa8d24ceb943"><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="group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943">tcp_new</a> (void)</td></tr>
+<tr class="separator:ga7427c5d237fe66a8097bfa8d24ceb943"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac14e757a21a4a87c6aa52372c210b937"><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="group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937">tcp_new_ip_type</a> (u8_t type)</td></tr>
+<tr class="separator:gac14e757a21a4a87c6aa52372c210b937"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac10926e6f76f73e17c0d37aaab3e56b6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6">tcp_arg</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, void *arg)</td></tr>
+<tr class="separator:gac10926e6f76f73e17c0d37aaab3e56b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8afd0b316a87a5eeff4726dc95006ed0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0">tcp_recv</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, <a class="el" href="tcp_8h.html#a780cfac08b02c66948ab94ea974202e8">tcp_recv_fn</a> <a class="el" href="group__socket.html#gadd7ae45df7c005619eb1126542231e9b">recv</a>)</td></tr>
+<tr class="separator:ga8afd0b316a87a5eeff4726dc95006ed0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1596332b93bb6249179f3b89f24bd808"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808">tcp_sent</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, <a class="el" href="tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18">tcp_sent_fn</a> sent)</td></tr>
+<tr class="separator:ga1596332b93bb6249179f3b89f24bd808"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae1346c4e34d3bc7c01e1b47142ab3121"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121">tcp_err</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, <a class="el" href="tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55">tcp_err_fn</a> err)</td></tr>
+<tr class="separator:gae1346c4e34d3bc7c01e1b47142ab3121"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaff4c3e380fc60c8fb9b3aa95eda94c62"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62">tcp_accept</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, <a class="el" href="tcp_8h.html#a00517abce6856d6c82f0efebdafb734d">tcp_accept_fn</a> <a class="el" href="group__socket.html#gade2b17671b5a4b18e941fbf7e1060310">accept</a>)</td></tr>
+<tr class="separator:gaff4c3e380fc60c8fb9b3aa95eda94c62"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafba47015098ed7ce523dcf7bdf70f7e5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5">tcp_poll</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, <a class="el" href="tcp_8h.html#a66deb97618a9cd9d57fca28c5245e073">tcp_poll_fn</a> <a class="el" href="group__socket.html#ga80ae38841b0e64e60618cd8bf857f617">poll</a>, u8_t interval)</td></tr>
+<tr class="separator:gafba47015098ed7ce523dcf7bdf70f7e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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 *arg, u16_t len, u8_t apiflags)</td></tr>
+<tr class="separator:ga6b2aa0efbf10e254930332b7c89cd8c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+</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>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>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="group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943">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="group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943">tcp_new()</a></li>
+<li><a class="el" href="group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee">tcp_bind()</a></li>
+<li><a class="el" href="group__tcp__raw.html#ga6b2a4efb1fc15d7d85cb71cb2a1d1066">tcp_listen()</a> and <a class="el" href="group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338">tcp_listen_with_backlog()</a></li>
+<li><a class="el" href="group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62">tcp_accept()</a></li>
+<li><a class="el" href="group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012">tcp_connect()</a></li>
+</ul>
+<h2>Sending TCP data </h2>
+<p>TCP data is sent by enqueueing the data with a call to <a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp_write()</a> and triggering to send by calling <a class="el" href="group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f">tcp_output()</a>. When the data is successfully transmitted to the remote host, the application will be notified with a call to a specified callback function.</p><ul>
+<li><a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp_write()</a></li>
+<li><a class="el" href="group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f">tcp_output()</a></li>
+<li><a class="el" href="group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808">tcp_sent()</a></li>
+</ul>
+<h2>Receiving TCP data </h2>
+<p>TCP data reception is callback based - an application specified callback function is called when new data arrives. When the application has taken the data, it has to call the <a class="el" href="group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44">tcp_recved()</a> function to indicate that TCP can advertise increase the receive window.</p><ul>
+<li><a class="el" href="group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0">tcp_recv()</a></li>
+<li><a class="el" href="group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44">tcp_recved()</a></li>
+</ul>
+<h2>Application polling </h2>
+<p>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 timer for killing connections that have stayed idle for too long, or as a method of waiting for memory to become available. For instance, if a call to <a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp_write()</a> has failed because memory wasn't available, the application may use the polling functionality to call <a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp_write()</a> again when the connection has been idle for a while.</p><ul>
+<li><a class="el" href="group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5">tcp_poll()</a></li>
+</ul>
+<h2>Closing and aborting connections </h2>
+<ul>
+<li><a class="el" href="group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623">tcp_close()</a></li>
+<li><a class="el" href="group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61">tcp_abort()</a></li>
+<li><a class="el" href="group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121">tcp_err()</a> </li>
+</ul>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga6b2a4efb1fc15d7d85cb71cb2a1d1066"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6b2a4efb1fc15d7d85cb71cb2a1d1066">&#9670;&nbsp;</a></span>tcp_listen</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define tcp_listen</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">pcb</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338">tcp_listen_with_backlog</a>(pcb, <a class="el" href="group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf">TCP_DEFAULT_LISTEN_BACKLOG</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gab0b45a01dcd461e5b8df2a1d9ddda134"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab0b45a01dcd461e5b8df2a1d9ddda134">&#9670;&nbsp;</a></span>tcp_mss</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define tcp_mss</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">pcb</td><td>)</td>
+          <td>&#160;&#160;&#160;((pcb)-&gt;mss)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga5b5c0093efff4466bda06d45f12a4633"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5b5c0093efff4466bda06d45f12a4633">&#9670;&nbsp;</a></span>tcp_nagle_disable</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define tcp_nagle_disable</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">pcb</td><td>)</td>
+          <td>&#160;&#160;&#160;tcp_set_flags(pcb, TF_NODELAY)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga9398061411b4af900160233aa3b1a286"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9398061411b4af900160233aa3b1a286">&#9670;&nbsp;</a></span>tcp_nagle_disabled</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define tcp_nagle_disabled</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">pcb</td><td>)</td>
+          <td>&#160;&#160;&#160;tcp_is_flag_set(pcb, TF_NODELAY)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga9dfcdb8a05533b07dca91cf7e784f88f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9dfcdb8a05533b07dca91cf7e784f88f">&#9670;&nbsp;</a></span>tcp_nagle_enable</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define tcp_nagle_enable</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">pcb</td><td>)</td>
+          <td>&#160;&#160;&#160;tcp_clear_flags(pcb, TF_NODELAY)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="gad1a95f09deb49cd7341d35527d6d3e2f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad1a95f09deb49cd7341d35527d6d3e2f">&#9670;&nbsp;</a></span>tcp_sndbuf</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define tcp_sndbuf</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">pcb</td><td>)</td>
+          <td>&#160;&#160;&#160;(TCPWND16((pcb)-&gt;snd_buf))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ga53ee4364718e84dc42cb1e0179deb1f4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga53ee4364718e84dc42cb1e0179deb1f4">&#9670;&nbsp;</a></span>tcp_sndqueuelen</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define tcp_sndqueuelen</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">pcb</td><td>)</td>
+          <td>&#160;&#160;&#160;((pcb)-&gt;snd_queuelen)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga468c2260ddb01582e966ddcf3c25ce61"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga468c2260ddb01582e966ddcf3c25ce61">&#9670;&nbsp;</a></span>tcp_abort()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_abort </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Aborts the connection by sending a RST (reset) segment to the remote host. The pcb is deallocated. This function never fails.</p>
+<p>ATTENTION: When calling this from one of the TCP callbacks, make sure you always return ERR_ABRT (and never return ERR_ABRT otherwise or you will risk accessing deallocated memory or memory leaks!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>the tcp pcb to abort </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gaff4c3e380fc60c8fb9b3aa95eda94c62"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaff4c3e380fc60c8fb9b3aa95eda94c62">&#9670;&nbsp;</a></span>tcp_accept()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_accept </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="tcp_8h.html#a00517abce6856d6c82f0efebdafb734d">tcp_accept_fn</a>&#160;</td>
+          <td class="paramname"><em>accept</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Used for specifying the function that should be called when a LISTENing connection has been connected to another host.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td><a class="el" href="structtcp__pcb.html">tcp_pcb</a> to set the accept callback </td></tr>
+    <tr><td class="paramname">accept</td><td>callback function to call for this pcb when LISTENing connection has been connected to another host </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gac10926e6f76f73e17c0d37aaab3e56b6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac10926e6f76f73e17c0d37aaab3e56b6">&#9670;&nbsp;</a></span>tcp_arg()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_arg </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Specifies the program specific state that should be passed to all other callback functions. The "pcb" argument is the current TCP connection control block, and the "arg" argument is the argument that will be passed to the callbacks.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td><a class="el" href="structtcp__pcb.html">tcp_pcb</a> to set the callback argument </td></tr>
+    <tr><td class="paramname">arg</td><td>void pointer argument to pass to callback functions </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga619154658137a23839ca3b94882131ca"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga619154658137a23839ca3b94882131ca">&#9670;&nbsp;</a></span>tcp_backlog_accepted()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_backlog_accepted </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A delayed-accept a connection is accepted (or closed/aborted): decreases the number of outstanding connections after calling <a class="el" href="group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8">tcp_backlog_delayed()</a>.</p>
+<p>ATTENTION: the caller is responsible for calling <a class="el" href="group__tcp__raw.html#ga619154658137a23839ca3b94882131ca">tcp_backlog_accepted()</a> or else the backlog feature will get out of sync!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>the connection pcb which is now fully accepted (or closed/aborted) </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga427b11c7b98c748ec487cd43093bd2f8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga427b11c7b98c748ec487cd43093bd2f8">&#9670;&nbsp;</a></span>tcp_backlog_delayed()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_backlog_delayed </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Delay accepting a connection in respect to the listen backlog: the number of outstanding connections is increased until <a class="el" href="group__tcp__raw.html#ga619154658137a23839ca3b94882131ca">tcp_backlog_accepted()</a> is called.</p>
+<p>ATTENTION: the caller is responsible for calling <a class="el" href="group__tcp__raw.html#ga619154658137a23839ca3b94882131ca">tcp_backlog_accepted()</a> or else the backlog feature will get out of sync!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>the connection pcb which is not fully accepted yet </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gacf5aa67bd7fc66fef43f77a55a1201ee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacf5aa67bd7fc66fef43f77a55a1201ee">&#9670;&nbsp;</a></span>tcp_bind()</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> tcp_bind </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>port</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Binds the connection to a local port number and IP address. If the IP address is not given (i.e., ipaddr == IP_ANY_TYPE), the connection is bound to all local IP addresses. If another connection is bound to the same port, the function will return ERR_USE, otherwise ERR_OK is returned.</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 bind (no check is done whether this pcb is already bound!) </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>the local ip address to bind to (use IPx_ADDR_ANY to bind to any local address </td></tr>
+    <tr><td class="paramname">port</td><td>the local port to bind to </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_USE if the port is already in use ERR_VAL if bind failed because the PCB is not in a valid state ERR_OK if bound </dd></dl>
+
+</div>
+</div>
+<a id="ga6469a15709088e80024258dbe80fcd1f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6469a15709088e80024258dbe80fcd1f">&#9670;&nbsp;</a></span>tcp_bind_netif()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_bind_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Binds the connection to a netif and IP address. After calling this function, all packets received via this PCB are guaranteed to have come in via the specified netif, and all outgoing packets will go out via the specified netif.</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 bind. </td></tr>
+    <tr><td class="paramname">netif</td><td>the netif to bind to. Can be NULL. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga87093e137fcc53ea82a134a3f5b33623"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga87093e137fcc53ea82a134a3f5b33623">&#9670;&nbsp;</a></span>tcp_close()</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> tcp_close </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Closes the connection held by the PCB.</p>
+<p>Listening pcbs are freed and may not be referenced any more. Connection pcbs are freed if not yet connected and may not be referenced any more. If a connection is established (at least SYN received or in a closing state), the connection is closed, and put in a closing state. The pcb is then automatically freed in <a class="el" href="tcp_8c.html#a421fb42ef919018e14ae413adfee9905">tcp_slowtmr()</a>. It is therefore unsafe to reference it (unless an error is returned).</p>
+<p>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 callback or the polling functionality. If the close succeeds, the function returns ERR_OK.</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 close </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if connection has been closed another err_t if closing failed and pcb is not freed </dd></dl>
+
+</div>
+</div>
+<a id="ga9a31deea4cadacd39f9485f37cfdd012"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga9a31deea4cadacd39f9485f37cfdd012">&#9670;&nbsp;</a></span>tcp_connect()</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> tcp_connect </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="tcp_8h.html#a939867106bd492caf2d85852fb7f6ae8">tcp_connected_fn</a>&#160;</td>
+          <td class="paramname"><em>connected</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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.</p>
+<p>The <a class="el" href="group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012">tcp_connect()</a> function returns immediately; it does not wait for the connection to be properly setup. Instead, it will call the function specified as the fourth argument (the "connected" argument) when the connection is established. If the connection could not be properly established, either because the other host refused the connection or because the other host didn't answer, the "err" callback function of this pcb (registered with tcp_err, see below) will be called.</p>
+<p>The <a class="el" href="group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012">tcp_connect()</a> function can return ERR_MEM if no memory is available for enqueueing the SYN segment. If the SYN indeed was enqueued successfully, the <a class="el" href="group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012">tcp_connect()</a> function returns ERR_OK.</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> 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>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>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 </dd></dl>
+
+</div>
+</div>
+<a id="gae1346c4e34d3bc7c01e1b47142ab3121"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae1346c4e34d3bc7c01e1b47142ab3121">&#9670;&nbsp;</a></span>tcp_err()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_err </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55">tcp_err_fn</a>&#160;</td>
+          <td class="paramname"><em>err</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Used to specify the function that should be called when a fatal error has occurred on the connection.</p>
+<p>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 function to be called is set using the <a class="el" href="group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121">tcp_err()</a> function.</p>
+<dl class="section note"><dt>Note</dt><dd>The corresponding pcb is already freed when this callback is called!</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td><a class="el" href="structtcp__pcb.html">tcp_pcb</a> to set the err callback </td></tr>
+    <tr><td class="paramname">err</td><td>callback function to call for this pcb when a fatal error has occurred on the connection </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gaeff14f321d1eecd0431611f382fcd338"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaeff14f321d1eecd0431611f382fcd338">&#9670;&nbsp;</a></span>tcp_listen_with_backlog()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a>* tcp_listen_with_backlog </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>backlog</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the state of the connection to be LISTEN, which means that it is able to accept incoming connections. The protocol control block is reallocated in order to consume less memory. Setting the connection to LISTEN is an irreversible process. When an incoming connection is accepted, the function specified with the <a class="el" href="group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62">tcp_accept()</a> function will be called. The pcb has to be bound to a local port with the <a class="el" href="group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee">tcp_bind()</a> function.</p>
+<p>The <a class="el" href="group__tcp__raw.html#ga6b2a4efb1fc15d7d85cb71cb2a1d1066">tcp_listen()</a> 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 needed for a connection that is listening, so <a class="el" href="group__tcp__raw.html#ga6b2a4efb1fc15d7d85cb71cb2a1d1066">tcp_listen()</a> will reclaim the memory needed for the original connection and allocate a new smaller memory block for the listening connection.</p>
+<p><a class="el" href="group__tcp__raw.html#ga6b2a4efb1fc15d7d85cb71cb2a1d1066">tcp_listen()</a> may return NULL if no memory was available for the listening connection. If so, the memory associated with the pcb passed as an argument to <a class="el" href="group__tcp__raw.html#ga6b2a4efb1fc15d7d85cb71cb2a1d1066">tcp_listen()</a> will not be deallocated.</p>
+<p>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.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>the original <a class="el" href="structtcp__pcb.html">tcp_pcb</a> </td></tr>
+    <tr><td class="paramname">backlog</td><td>the incoming connections queue limit </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="structtcp__pcb.html">tcp_pcb</a> used for listening, consumes less memory.</dd></dl>
+<dl class="section note"><dt>Note</dt><dd>The original <a class="el" href="structtcp__pcb.html">tcp_pcb</a> is freed. This function therefore has to be called like this: tpcb = tcp_listen_with_backlog(tpcb, backlog); </dd></dl>
+
+</div>
+</div>
+<a id="gac86ad8ded4d1db15a5b5fb42eb7c1436"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac86ad8ded4d1db15a5b5fb42eb7c1436">&#9670;&nbsp;</a></span>tcp_listen_with_backlog_and_err()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a>* tcp_listen_with_backlog_and_err </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>backlog</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> *&#160;</td>
+          <td class="paramname"><em>err</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the state of the connection to be LISTEN, which means that it is able to accept incoming connections. The protocol control block is reallocated in order to consume less memory. Setting the connection to LISTEN is an irreversible process.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>the original <a class="el" href="structtcp__pcb.html">tcp_pcb</a> </td></tr>
+    <tr><td class="paramname">backlog</td><td>the incoming connections queue limit </td></tr>
+    <tr><td class="paramname">err</td><td>when NULL is returned, this contains the error reason </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="structtcp__pcb.html">tcp_pcb</a> used for listening, consumes less memory.</dd></dl>
+<dl class="section note"><dt>Note</dt><dd>The original <a class="el" href="structtcp__pcb.html">tcp_pcb</a> is freed. This function therefore has to be called like this: tpcb = tcp_listen_with_backlog_and_err(tpcb, backlog, &amp;err); </dd></dl>
+
+</div>
+</div>
+<a id="ga7427c5d237fe66a8097bfa8d24ceb943"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7427c5d237fe66a8097bfa8d24ceb943">&#9670;&nbsp;</a></span>tcp_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a>* tcp_new </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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="group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee">tcp_bind()</a>. If memory is not available for creating the new pcb, NULL is returned. </p>
+
+</div>
+</div>
+<a id="gac14e757a21a4a87c6aa52372c210b937"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac14e757a21a4a87c6aa52372c210b937">&#9670;&nbsp;</a></span>tcp_new_ip_type()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a>* tcp_new_ip_type </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>type</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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="group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee">tcp_bind()</a>.</p>
+<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 <a class="el" href="group__ipaddr.html#gabe43b154533b73585c4e58f568370ede">IP_ANY_TYPE</a>. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new <a class="el" href="structtcp__pcb.html">tcp_pcb</a> that initially is in state CLOSED </dd></dl>
+
+</div>
+</div>
+<a id="ga0cbcc6d628f644a530daf629fa3e5f7f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0cbcc6d628f644a530daf629fa3e5f7f">&#9670;&nbsp;</a></span>tcp_output()</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> tcp_output </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Find out what we can send and send it</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>Protocol control block for the TCP connection to send data </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if data has been sent or nothing to send another err_t on error </dd></dl>
+
+</div>
+</div>
+<a id="gafba47015098ed7ce523dcf7bdf70f7e5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gafba47015098ed7ce523dcf7bdf70f7e5">&#9670;&nbsp;</a></span>tcp_poll()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_poll </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="tcp_8h.html#a66deb97618a9cd9d57fca28c5245e073">tcp_poll_fn</a>&#160;</td>
+          <td class="paramname"><em>poll</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>interval</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Specifies the polling interval and the callback function that should be called to poll the application. The interval is specified in 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.</p>
+<p>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 timer for killing connections that have stayed idle for too long, or as a method of waiting for memory to become available. For instance, if a call to <a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp_write()</a> has failed because memory wasn't available, the application may use the polling functionality to call <a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp_write()</a> again when the connection has been idle for a while. </p>
+
+</div>
+</div>
+<a id="ga8afd0b316a87a5eeff4726dc95006ed0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8afd0b316a87a5eeff4726dc95006ed0">&#9670;&nbsp;</a></span>tcp_recv()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_recv </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="tcp_8h.html#a780cfac08b02c66948ab94ea974202e8">tcp_recv_fn</a>&#160;</td>
+          <td class="paramname"><em>recv</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sets the callback function that will be called when new data arrives. The callback function will be passed a NULL pbuf to indicate that the remote host has closed the connection. If the callback function returns ERR_OK or ERR_ABRT it must have freed the pbuf, otherwise it must not have freed it.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td><a class="el" href="structtcp__pcb.html">tcp_pcb</a> to set the recv callback </td></tr>
+    <tr><td class="paramname">recv</td><td>callback function to call for this pcb when data is received </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gabdac0856a52b5789dc897d4c7137ec44"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabdac0856a52b5789dc897d4c7137ec44">&#9670;&nbsp;</a></span>tcp_recved()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_recved </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function should be called by the application when it has processed the data. The purpose is to advertise a larger window when the data has been processed.</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> for which data is read </td></tr>
+    <tr><td class="paramname">len</td><td>the amount of bytes that have been read by the application </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga1596332b93bb6249179f3b89f24bd808"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1596332b93bb6249179f3b89f24bd808">&#9670;&nbsp;</a></span>tcp_sent()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_sent </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18">tcp_sent_fn</a>&#160;</td>
+          <td class="paramname"><em>sent</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Specifies the callback function that should be called when data has successfully been received (i.e., acknowledged) by the remote host. The len argument passed to the callback function gives the amount bytes that was acknowledged by the last acknowledgment.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td><a class="el" href="structtcp__pcb.html">tcp_pcb</a> to set the sent callback </td></tr>
+    <tr><td class="paramname">sent</td><td>callback function to call for this pcb when data is successfully sent </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga5b94d57f1891b9287f88525a2ac561dd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5b94d57f1891b9287f88525a2ac561dd">&#9670;&nbsp;</a></span>tcp_shutdown()</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> tcp_shutdown </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>shut_rx</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>shut_tx</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </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>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>PCB to shutdown </td></tr>
+    <tr><td class="paramname">shut_rx</td><td>shut down receive side if this is != 0 </td></tr>
+    <tr><td class="paramname">shut_tx</td><td>shut down send side if this is != 0 </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if shutdown succeeded (or the PCB has already been shut down) another err_t on error. </dd></dl>
+
+</div>
+</div>
+<a id="ga6b2aa0efbf10e254930332b7c89cd8c5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6b2aa0efbf10e254930332b7c89cd8c5">&#9670;&nbsp;</a></span>tcp_write()</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> tcp_write </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>arg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>apiflags</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Write data for sending (but does not send it immediately).</p>
+<p>It waits in the expectation of more data being sent soon (as it can send them more efficiently by combining them together). To prompt the system to send data now, call <a class="el" href="group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f">tcp_output()</a> after calling <a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp_write()</a>.</p>
+<p>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:</p><ul>
+<li>TCP_WRITE_FLAG_COPY: indicates whether the new memory should be allocated for the data to be copied into. If this flag is not given, no new memory should be allocated and the data should only be referenced by pointer. This also means that the memory behind dataptr must not change until the data is ACKed by the remote host</li>
+<li>TCP_WRITE_FLAG_MORE: indicates that more data follows. If this is omitted, the PSH flag is set in the last segment created by this call to tcp_write. If this flag is given, the PSH flag is not set.</li>
+</ul>
+<p>The <a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp_write()</a> function will fail and return ERR_MEM if the length of the data exceeds the current send buffer size or if the length of the queue of outgoing segment is larger than the upper limit defined in lwipopts.h. The number of bytes available in the output queue can be retrieved with the <a class="el" href="group__tcp__raw.html#gad1a95f09deb49cd7341d35527d6d3e2f">tcp_sndbuf()</a> function.</p>
+<p>The proper way to use this function is to call the function with at most <a class="el" href="group__tcp__raw.html#gad1a95f09deb49cd7341d35527d6d3e2f">tcp_sndbuf()</a> bytes of data. If the function returns ERR_MEM, the application should wait until some of the currently enqueued data has been successfully received by the other host and try again.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>Protocol control block for the TCP connection to enqueue data for. </td></tr>
+    <tr><td class="paramname">arg</td><td>Pointer to the data to be enqueued for sending. </td></tr>
+    <tr><td class="paramname">len</td><td>Data length in bytes </td></tr>
+    <tr><td class="paramname">apiflags</td><td>combination of following flags :<ul>
+<li>TCP_WRITE_FLAG_COPY (0x01) data will be copied into memory belonging to the stack</li>
+<li>TCP_WRITE_FLAG_MORE (0x02) for TCP connection, PSH flag will not be set on last segment sent, </li>
+</ul>
+</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if enqueued, another err_t on error </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__tcp__raw.js b/doc/doxygen/output/html/group__tcp__raw.js
new file mode 100644
index 0000000..9e78a94
--- /dev/null
+++ b/doc/doxygen/output/html/group__tcp__raw.js
@@ -0,0 +1,32 @@
+var group__tcp__raw =
+[
+    [ "ext arguments", "group__tcp__raw__extargs.html", "group__tcp__raw__extargs" ],
+    [ "tcp_listen", "group__tcp__raw.html#ga6b2a4efb1fc15d7d85cb71cb2a1d1066", null ],
+    [ "tcp_mss", "group__tcp__raw.html#gab0b45a01dcd461e5b8df2a1d9ddda134", null ],
+    [ "tcp_nagle_disable", "group__tcp__raw.html#ga5b5c0093efff4466bda06d45f12a4633", null ],
+    [ "tcp_nagle_disabled", "group__tcp__raw.html#ga9398061411b4af900160233aa3b1a286", null ],
+    [ "tcp_nagle_enable", "group__tcp__raw.html#ga9dfcdb8a05533b07dca91cf7e784f88f", null ],
+    [ "tcp_sndbuf", "group__tcp__raw.html#gad1a95f09deb49cd7341d35527d6d3e2f", null ],
+    [ "tcp_sndqueuelen", "group__tcp__raw.html#ga53ee4364718e84dc42cb1e0179deb1f4", null ],
+    [ "tcp_abort", "group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61", null ],
+    [ "tcp_accept", "group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62", null ],
+    [ "tcp_arg", "group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6", null ],
+    [ "tcp_backlog_accepted", "group__tcp__raw.html#ga619154658137a23839ca3b94882131ca", null ],
+    [ "tcp_backlog_delayed", "group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8", null ],
+    [ "tcp_bind", "group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee", null ],
+    [ "tcp_bind_netif", "group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f", null ],
+    [ "tcp_close", "group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623", null ],
+    [ "tcp_connect", "group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012", null ],
+    [ "tcp_err", "group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121", null ],
+    [ "tcp_listen_with_backlog", "group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338", null ],
+    [ "tcp_listen_with_backlog_and_err", "group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436", null ],
+    [ "tcp_new", "group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943", null ],
+    [ "tcp_new_ip_type", "group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937", null ],
+    [ "tcp_output", "group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f", null ],
+    [ "tcp_poll", "group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5", null ],
+    [ "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_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
new file mode 100644
index 0000000..3424593
--- /dev/null
+++ b/doc/doxygen/output/html/group__tcp__raw__extargs.html
@@ -0,0 +1,266 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ext arguments</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__tcp__raw__extargs.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">ext arguments<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__tcp__raw.html">TCP</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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"><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"><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:gaa8ac7a74407cb3e0e01a30314805f990"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html#gaa8ac7a74407cb3e0e01a30314805f990">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:gaa8ac7a74407cb3e0e01a30314805f990"><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>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="group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318">tcp_ext_arg_set</a> and <a class="el" href="group__tcp__raw__extargs.html#gaa8ac7a74407cb3e0e01a30314805f990">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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4836e0b4f66439493e106a50400d1616">&#9670;&nbsp;</a></span>tcp_ext_arg_alloc_id()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t tcp_ext_arg_alloc_id </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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="group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318">tcp_ext_arg_set</a> and <a class="el" href="group__tcp__raw__extargs.html#gaa8ac7a74407cb3e0e01a30314805f990">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="gaa8ac7a74407cb3e0e01a30314805f990"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa8ac7a74407cb3e0e01a30314805f990">&#9670;&nbsp;</a></span>tcp_ext_arg_get()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* tcp_ext_arg_get </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">uint8_t&#160;</td>
+          <td class="paramname"><em>id</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set data for a given index of ext_args on the specified pcb.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td><a class="el" href="structtcp__pcb.html">tcp_pcb</a> for which to set the data </td></tr>
+    <tr><td class="paramname">id</td><td>ext_args index to set (allocated via <a class="el" href="group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616">tcp_ext_arg_alloc_id</a>) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>data pointer at the given index </dd></dl>
+
+</div>
+</div>
+<a id="ga58500cb2ce22438e16a37373595af318"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga58500cb2ce22438e16a37373595af318">&#9670;&nbsp;</a></span>tcp_ext_arg_set()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_ext_arg_set </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">uint8_t&#160;</td>
+          <td class="paramname"><em>id</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set data for a given index of ext_args on the specified pcb.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td><a class="el" href="structtcp__pcb.html">tcp_pcb</a> for which to set the data </td></tr>
+    <tr><td class="paramname">id</td><td>ext_args index to set (allocated via <a class="el" href="group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616">tcp_ext_arg_alloc_id</a>) </td></tr>
+    <tr><td class="paramname">arg</td><td>data pointer to set </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga36e60dc02bfe0437c8da368a62e2f316"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga36e60dc02bfe0437c8da368a62e2f316">&#9670;&nbsp;</a></span>tcp_ext_arg_set_callbacks()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_ext_arg_set_callbacks </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">uint8_t&#160;</td>
+          <td class="paramname"><em>id</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structtcp__ext__arg__callbacks.html">tcp_ext_arg_callbacks</a> *const&#160;</td>
+          <td class="paramname"><em>callbacks</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set callbacks for a given index of ext_args on the specified pcb.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td><a class="el" href="structtcp__pcb.html">tcp_pcb</a> for which to set the callback </td></tr>
+    <tr><td class="paramname">id</td><td>ext_args index to set (allocated via <a class="el" href="group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616">tcp_ext_arg_alloc_id</a>) </td></tr>
+    <tr><td class="paramname">callbacks</td><td>callback table (const since it is referenced, not copied!) </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__tcp__raw__extargs.js b/doc/doxygen/output/html/group__tcp__raw__extargs.js
new file mode 100644
index 0000000..d22c99e
--- /dev/null
+++ b/doc/doxygen/output/html/group__tcp__raw__extargs.js
@@ -0,0 +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#gaa8ac7a74407cb3e0e01a30314805f990", null ],
+    [ "tcp_ext_arg_set", "group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318", null ],
+    [ "tcp_ext_arg_set_callbacks", "group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316", 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
new file mode 100644
index 0000000..ccab655
--- /dev/null
+++ b/doc/doxygen/output/html/group__tftp.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: TFTP 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__tftp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</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><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__tftp__opts"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp__opts.html">Options</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 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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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"><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>
+<p>This is simple TFTP server for the lwIP raw API. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gabb4a4e24b5c7ec8df70ec5a68a206dec"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabb4a4e24b5c7ec8df70ec5a68a206dec">&#9670;&nbsp;</a></span>tftp_cleanup()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tftp_cleanup </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Deinitialize ("turn off") TFTP server. </p>
+
+</div>
+</div>
+<a id="ga7a80673a1324da5c8ae2440af7b008a3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7a80673a1324da5c8ae2440af7b008a3">&#9670;&nbsp;</a></span>tftp_init()</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>(</td>
+          <td class="paramtype">const struct <a class="el" href="structtftp__context.html">tftp_context</a> *&#160;</td>
+          <td class="paramname"><em>ctx</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize TFTP server. </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>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__tftp.js b/doc/doxygen/output/html/group__tftp.js
new file mode 100644
index 0000000..8d29ab2
--- /dev/null
+++ b/doc/doxygen/output/html/group__tftp.js
@@ -0,0 +1,12 @@
+var group__tftp =
+[
+    [ "Options", "group__tftp__opts.html", "group__tftp__opts" ],
+    [ "tftp_context", "structtftp__context.html", [
+      [ "close", "structtftp__context.html#ae9181c57d1cf89bc263f7671e5630a65", null ],
+      [ "open", "structtftp__context.html#ae70d64e8e20328cc492d766506df4cba", 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 ]
+];
\ 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
new file mode 100644
index 0000000..f3eb003
--- /dev/null
+++ b/doc/doxygen/output/html/group__tftp__opts.html
@@ -0,0 +1,226 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Options</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__tftp__opts.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga2dd54a1d0c3006527b8a7a8604b81981"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp__opts.html#ga2dd54a1d0c3006527b8a7a8604b81981">TFTP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga2dd54a1d0c3006527b8a7a8604b81981"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad9230620a5d3bb87a7ac280ff99875d1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp__opts.html#gad9230620a5d3bb87a7ac280ff99875d1">TFTP_PORT</a>&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050">LWIP_IANA_PORT_TFTP</a></td></tr>
+<tr class="separator:gad9230620a5d3bb87a7ac280ff99875d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga36986e5465dc2ccb6184fc57f9a37d63"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp__opts.html#ga36986e5465dc2ccb6184fc57f9a37d63">TFTP_TIMEOUT_MSECS</a>&#160;&#160;&#160;10000</td></tr>
+<tr class="separator:ga36986e5465dc2ccb6184fc57f9a37d63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6a01757ad942eb602e8a87e2be42d313"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp__opts.html#ga6a01757ad942eb602e8a87e2be42d313">TFTP_MAX_RETRIES</a>&#160;&#160;&#160;5</td></tr>
+<tr class="separator:ga6a01757ad942eb602e8a87e2be42d313"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3e6caacb3f4d43f780b2d68ffe4258ea"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp__opts.html#ga3e6caacb3f4d43f780b2d68ffe4258ea">TFTP_TIMER_MSECS</a>&#160;&#160;&#160;(<a class="el" href="group__tftp__opts.html#ga36986e5465dc2ccb6184fc57f9a37d63">TFTP_TIMEOUT_MSECS</a> / 10)</td></tr>
+<tr class="separator:ga3e6caacb3f4d43f780b2d68ffe4258ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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="separator:gaa8a449c25e37be757f5efccd422c9055"><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="ga2dd54a1d0c3006527b8a7a8604b81981"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2dd54a1d0c3006527b8a7a8604b81981">&#9670;&nbsp;</a></span>TFTP_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TFTP_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>Enable TFTP debug messages </p>
+
+</div>
+</div>
+<a id="ga8e975900b4397313f1a649ff76a3063b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8e975900b4397313f1a649ff76a3063b">&#9670;&nbsp;</a></span>TFTP_MAX_FILENAME_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TFTP_MAX_FILENAME_LEN&#160;&#160;&#160;20</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Max. length of TFTP filename </p>
+
+</div>
+</div>
+<a id="gaa8a449c25e37be757f5efccd422c9055"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa8a449c25e37be757f5efccd422c9055">&#9670;&nbsp;</a></span>TFTP_MAX_MODE_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TFTP_MAX_MODE_LEN&#160;&#160;&#160;7</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Max. length of TFTP mode </p>
+
+</div>
+</div>
+<a id="ga6a01757ad942eb602e8a87e2be42d313"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6a01757ad942eb602e8a87e2be42d313">&#9670;&nbsp;</a></span>TFTP_MAX_RETRIES</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TFTP_MAX_RETRIES&#160;&#160;&#160;5</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Max. number of retries when a file is read from server </p>
+
+</div>
+</div>
+<a id="gad9230620a5d3bb87a7ac280ff99875d1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad9230620a5d3bb87a7ac280ff99875d1">&#9670;&nbsp;</a></span>TFTP_PORT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TFTP_PORT&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050">LWIP_IANA_PORT_TFTP</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TFTP server port </p>
+
+</div>
+</div>
+<a id="ga36986e5465dc2ccb6184fc57f9a37d63"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga36986e5465dc2ccb6184fc57f9a37d63">&#9670;&nbsp;</a></span>TFTP_TIMEOUT_MSECS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TFTP_TIMEOUT_MSECS&#160;&#160;&#160;10000</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TFTP timeout </p>
+
+</div>
+</div>
+<a id="ga3e6caacb3f4d43f780b2d68ffe4258ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3e6caacb3f4d43f780b2d68ffe4258ea">&#9670;&nbsp;</a></span>TFTP_TIMER_MSECS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TFTP_TIMER_MSECS&#160;&#160;&#160;(<a class="el" href="group__tftp__opts.html#ga36986e5465dc2ccb6184fc57f9a37d63">TFTP_TIMEOUT_MSECS</a> / 10)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TFTP timer cyclic interval </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__tftp__opts.js b/doc/doxygen/output/html/group__tftp__opts.js
new file mode 100644
index 0000000..c774240
--- /dev/null
+++ b/doc/doxygen/output/html/group__tftp__opts.js
@@ -0,0 +1,10 @@
+var group__tftp__opts =
+[
+    [ "TFTP_DEBUG", "group__tftp__opts.html#ga2dd54a1d0c3006527b8a7a8604b81981", null ],
+    [ "TFTP_MAX_FILENAME_LEN", "group__tftp__opts.html#ga8e975900b4397313f1a649ff76a3063b", null ],
+    [ "TFTP_MAX_MODE_LEN", "group__tftp__opts.html#gaa8a449c25e37be757f5efccd422c9055", null ],
+    [ "TFTP_MAX_RETRIES", "group__tftp__opts.html#ga6a01757ad942eb602e8a87e2be42d313", null ],
+    [ "TFTP_PORT", "group__tftp__opts.html#gad9230620a5d3bb87a7ac280ff99875d1", null ],
+    [ "TFTP_TIMEOUT_MSECS", "group__tftp__opts.html#ga36986e5465dc2ccb6184fc57f9a37d63", null ],
+    [ "TFTP_TIMER_MSECS", "group__tftp__opts.html#ga3e6caacb3f4d43f780b2d68ffe4258ea", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__udp__raw.html b/doc/doxygen/output/html/group__udp__raw.html
new file mode 100644
index 0000000..b135ab4
--- /dev/null
+++ b/doc/doxygen/output/html/group__udp__raw.html
@@ -0,0 +1,627 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: UDP</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__udp__raw.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">UDP<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></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaa4546c43981f043c0ae4514d625cc3fc"><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__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc">udp_send</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:gaa4546c43981f043c0ae4514d625cc3fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa0e135a5958f1f0cc83cbeb609e18743"><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__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743">udp_sendto</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dst_ip, u16_t dst_port)</td></tr>
+<tr class="separator:gaa0e135a5958f1f0cc83cbeb609e18743"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83f8c873671ca7f307d14b29a0a7a142"><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__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142">udp_sendto_if</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dst_ip, u16_t dst_port, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga83f8c873671ca7f307d14b29a0a7a142"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa389827c979c766c1dae301239f7bbb7"><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__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7">udp_sendto_if_src</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dst_ip, u16_t dst_port, 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#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *src_ip)</td></tr>
+<tr class="separator:gaa389827c979c766c1dae301239f7bbb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac7fbda8b12b9b9360e92b51e805e799e"><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__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e">udp_bind</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, u16_t port)</td></tr>
+<tr class="separator:gac7fbda8b12b9b9360e92b51e805e799e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4360535ae72e77019721c9637a1051a8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8">udp_bind_netif</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, const struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga4360535ae72e77019721c9637a1051a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83625967670477aa254643129a53971b"><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__udp__raw.html#ga83625967670477aa254643129a53971b">udp_connect</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, u16_t port)</td></tr>
+<tr class="separator:ga83625967670477aa254643129a53971b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8d26559743e59e4b409c92a268ee67fc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc">udp_disconnect</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga8d26559743e59e4b409c92a268ee67fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gada6d02b9a5f35e1fb2e1bc71b11e6027"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027">udp_recv</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, <a class="el" href="udp_8h.html#af0ec7feb31acdb6e11b928f438c8a64b">udp_recv_fn</a> <a class="el" href="group__socket.html#gadd7ae45df7c005619eb1126542231e9b">recv</a>, void *recv_arg)</td></tr>
+<tr class="separator:gada6d02b9a5f35e1fb2e1bc71b11e6027"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3aed8e469f74f960837ebf9f34acf646"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646">udp_remove</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga3aed8e469f74f960837ebf9f34acf646"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa6d6430499acae43d342f0e68ddbb209"><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="group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209">udp_new</a> (void)</td></tr>
+<tr class="separator:gaa6d6430499acae43d342f0e68ddbb209"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf1ab236050dd351e93f112cfbc1ada88"><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="group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88">udp_new_ip_type</a> (u8_t type)</td></tr>
+<tr class="separator:gaf1ab236050dd351e93f112cfbc1ada88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</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>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="gac7fbda8b12b9b9360e92b51e805e799e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac7fbda8b12b9b9360e92b51e805e799e">&#9670;&nbsp;</a></span>udp_bind()</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> udp_bind </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>port</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Bind an UDP PCB.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>UDP PCB to be bound with a local address ipaddr and port. </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>local IP address to bind with. Use IP_ANY_TYPE to bind to all local interfaces. </td></tr>
+    <tr><td class="paramname">port</td><td>local UDP port to bind with. Use 0 to automatically bind to a random port between UDP_LOCAL_PORT_RANGE_START and UDP_LOCAL_PORT_RANGE_END.</td></tr>
+  </table>
+  </dd>
+</dl>
+<p>ipaddr &amp; port are expected to be in the same byte order as in the pcb.</p>
+<dl class="section return"><dt>Returns</dt><dd>lwIP error code.<ul>
+<li>ERR_OK. Successful. No error occurred.</li>
+<li>ERR_USE. The specified ipaddr and port are already bound to by another UDP PCB.</li>
+</ul>
+</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc">udp_disconnect()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga4360535ae72e77019721c9637a1051a8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4360535ae72e77019721c9637a1051a8">&#9670;&nbsp;</a></span>udp_bind_netif()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void udp_bind_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Bind an UDP PCB to a specific netif. After calling this function, all packets received via this PCB are guaranteed to have come in via the specified netif, and all outgoing packets will go out via the specified netif.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>UDP PCB to be bound. </td></tr>
+    <tr><td class="paramname">netif</td><td>netif to bind udp pcb to. Can be NULL.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc">udp_disconnect()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga83625967670477aa254643129a53971b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga83625967670477aa254643129a53971b">&#9670;&nbsp;</a></span>udp_connect()</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> udp_connect </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>port</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sets the remote end of the pcb. This function does not generate any network traffic, but only sets the remote address of the pcb.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>UDP PCB to be connected with remote address ipaddr and port. </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>remote IP address to connect with. </td></tr>
+    <tr><td class="paramname">port</td><td>remote UDP port to connect with.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>lwIP error code</dd></dl>
+<p>ipaddr &amp; port are expected to be in the same byte order as in the pcb.</p>
+<p>The udp pcb is bound to a random local port if not already bound.</p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc">udp_disconnect()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga8d26559743e59e4b409c92a268ee67fc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8d26559743e59e4b409c92a268ee67fc">&#9670;&nbsp;</a></span>udp_disconnect()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void udp_disconnect </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Remove the remote end of the pcb. This function does not generate any network traffic, but only removes the remote address of the pcb.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>the udp pcb to disconnect. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gaa6d6430499acae43d342f0e68ddbb209"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa6d6430499acae43d342f0e68ddbb209">&#9670;&nbsp;</a></span>udp_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structudp__pcb.html">udp_pcb</a>* udp_new </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Creates a new UDP pcb which can be used for UDP communication. 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 return"><dt>Returns</dt><dd>The UDP PCB which was created. NULL if the PCB data structure could not be allocated.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646">udp_remove()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gaf1ab236050dd351e93f112cfbc1ada88"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf1ab236050dd351e93f112cfbc1ada88">&#9670;&nbsp;</a></span>udp_new_ip_type()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structudp__pcb.html">udp_pcb</a>* udp_new_ip_type </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>type</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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="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 <a class="el" href="group__ipaddr.html#gabe43b154533b73585c4e58f568370ede">IP_ANY_TYPE</a>. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The UDP PCB which was created. NULL if the PCB data structure could not be allocated.</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646">udp_remove()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gada6d02b9a5f35e1fb2e1bc71b11e6027"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gada6d02b9a5f35e1fb2e1bc71b11e6027">&#9670;&nbsp;</a></span>udp_recv()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void udp_recv </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="udp_8h.html#af0ec7feb31acdb6e11b928f438c8a64b">udp_recv_fn</a>&#160;</td>
+          <td class="paramname"><em>recv</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>recv_arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set a receive callback for a UDP PCB. This callback will be called when receiving a datagram for the pcb.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>the pcb for which to set the recv callback </td></tr>
+    <tr><td class="paramname">recv</td><td>function pointer of the callback function </td></tr>
+    <tr><td class="paramname">recv_arg</td><td>additional argument to pass to the callback function </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga3aed8e469f74f960837ebf9f34acf646"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3aed8e469f74f960837ebf9f34acf646">&#9670;&nbsp;</a></span>udp_remove()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void udp_remove </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209">udp_new()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gaa4546c43981f043c0ae4514d625cc3fc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa4546c43981f043c0ae4514d625cc3fc">&#9670;&nbsp;</a></span>udp_send()</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> udp_send </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sends the pbuf p using UDP. The pbuf is not deallocated.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>UDP PCB used to send the data. </td></tr>
+    <tr><td class="paramname">p</td><td>chain of pbuf's to be sent.</td></tr>
+  </table>
+  </dd>
+</dl>
+<p>The datagram will be sent to the current remote_ip &amp; remote_port stored in pcb. If the pcb is not bound to a port, it will automatically be bound to a random port.</p>
+<dl class="section return"><dt>Returns</dt><dd>lwIP error code.<ul>
+<li>ERR_OK. Successful. No error occurred.</li>
+<li>ERR_MEM. Out of memory.</li>
+<li>ERR_RTE. Could not find route to destination address.</li>
+<li>ERR_VAL. No PCB or PCB is dual-stack</li>
+<li>More errors could be returned by lower protocol layers.</li>
+</ul>
+</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc">udp_disconnect()</a> <a class="el" href="group__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743">udp_sendto()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gaa0e135a5958f1f0cc83cbeb609e18743"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa0e135a5958f1f0cc83cbeb609e18743">&#9670;&nbsp;</a></span>udp_sendto()</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> udp_sendto </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>dst_ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>dst_port</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send data to a specified address using UDP.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>UDP PCB used to send the data. </td></tr>
+    <tr><td class="paramname">p</td><td>chain of pbuf's to be sent. </td></tr>
+    <tr><td class="paramname">dst_ip</td><td>Destination IP address. </td></tr>
+    <tr><td class="paramname">dst_port</td><td>Destination UDP port.</td></tr>
+  </table>
+  </dd>
+</dl>
+<p>dst_ip &amp; dst_port are expected to be in the same byte order as in the pcb.</p>
+<p>If the PCB already has a remote address association, it will be restored after the data is sent.</p>
+<dl class="section return"><dt>Returns</dt><dd>lwIP error code (</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc">udp_send</a> for possible error codes)</dd>
+<dd>
+<a class="el" href="group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc">udp_disconnect()</a> <a class="el" href="group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc">udp_send()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga83f8c873671ca7f307d14b29a0a7a142"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga83f8c873671ca7f307d14b29a0a7a142">&#9670;&nbsp;</a></span>udp_sendto_if()</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> udp_sendto_if </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>dst_ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>dst_port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send data to a specified address using UDP. The netif used for sending can be specified.</p>
+<p>This function exists mainly for DHCP, to be able to send UDP packets on a netif that is still down.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>UDP PCB used to send the data. </td></tr>
+    <tr><td class="paramname">p</td><td>chain of pbuf's to be sent. </td></tr>
+    <tr><td class="paramname">dst_ip</td><td>Destination IP address. </td></tr>
+    <tr><td class="paramname">dst_port</td><td>Destination UDP port. </td></tr>
+    <tr><td class="paramname">netif</td><td>the netif used for sending.</td></tr>
+  </table>
+  </dd>
+</dl>
+<p>dst_ip &amp; dst_port are expected to be in the same byte order as in the pcb.</p>
+<dl class="section return"><dt>Returns</dt><dd>lwIP error code (</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc">udp_send</a> for possible error codes)</dd>
+<dd>
+<a class="el" href="group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc">udp_disconnect()</a> <a class="el" href="group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc">udp_send()</a> </dd></dl>
+
+</div>
+</div>
+<a id="gaa389827c979c766c1dae301239f7bbb7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa389827c979c766c1dae301239f7bbb7">&#9670;&nbsp;</a></span>udp_sendto_if_src()</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> udp_sendto_if_src </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>dst_ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>dst_port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>src_ip</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as <a class="el" href="group__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142">udp_sendto_if</a>, but with source address </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__udp__raw.js b/doc/doxygen/output/html/group__udp__raw.js
new file mode 100644
index 0000000..469a9e6
--- /dev/null
+++ b/doc/doxygen/output/html/group__udp__raw.js
@@ -0,0 +1,15 @@
+var group__udp__raw =
+[
+    [ "udp_bind", "group__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e", null ],
+    [ "udp_bind_netif", "group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8", null ],
+    [ "udp_connect", "group__udp__raw.html#ga83625967670477aa254643129a53971b", null ],
+    [ "udp_disconnect", "group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc", null ],
+    [ "udp_new", "group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209", null ],
+    [ "udp_new_ip_type", "group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88", null ],
+    [ "udp_recv", "group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027", null ],
+    [ "udp_remove", "group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646", null ],
+    [ "udp_send", "group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc", null ],
+    [ "udp_sendto", "group__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743", null ],
+    [ "udp_sendto_if", "group__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142", null ],
+    [ "udp_sendto_if_src", "group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__zepif.html b/doc/doxygen/output/html/group__zepif.html
new file mode 100644
index 0000000..8b40af0
--- /dev/null
+++ b/doc/doxygen/output/html/group__zepif.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ZEP - ZigBee Encapsulation Protocol</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('group__zepif.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">ZEP - ZigBee Encapsulation Protocol<div class="ingroups"><a class="el" href="group__netifs.html">NETIFs</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gad61a6d9c1ab17e5b2c2c3eb9b42cc004"><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__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004">zepif_init</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gad61a6d9c1ab17e5b2c2c3eb9b42cc004"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>A netif implementing the ZigBee Encapsulation Protocol (ZEP). This is used to tunnel 6LowPAN over UDP.</p>
+<p>Usage (there must be a default netif before!): </p><div class="fragment"><div class="line"><a class="code" href="group__netif.html#gade5498543e74067f28cc6bef0209e3be">netif_add</a>(&amp;zep_netif, NULL, NULL, NULL, NULL, <a class="code" href="structzepif__init.html">zepif_init</a>, <a class="code" href="group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b">tcpip_6lowpan_input</a>);</div><div class="line"><a class="code" href="group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9">netif_create_ip6_linklocal_address</a>(&amp;zep_netif, 1);</div><div class="line"><a class="code" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up</a>(&amp;zep_netif);</div><div class="line"><a class="code" href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_link_up</a>(&amp;zep_netif);</div></div><!-- fragment --> <h2 class="groupheader">Function Documentation</h2>
+<a id="gad61a6d9c1ab17e5b2c2c3eb9b42cc004"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad61a6d9c1ab17e5b2c2c3eb9b42cc004">&#9670;&nbsp;</a></span>zepif_init()</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> <a class="el" href="structzepif__init.html">zepif_init</a> </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set up a raw 6LowPAN netif and surround it with input- and output functions for ZEP </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__zepif.js b/doc/doxygen/output/html/group__zepif.js
new file mode 100644
index 0000000..475780b
--- /dev/null
+++ b/doc/doxygen/output/html/group__zepif.js
@@ -0,0 +1,4 @@
+var group__zepif =
+[
+    [ "zepif_init", "group__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/http__client_8c.html b/doc/doxygen/output/html/http__client_8c.html
new file mode 100644
index 0000000..798d147
--- /dev/null
+++ b/doc/doxygen/output/html/http__client_8c.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/http/http_client.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('http__client_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">http_client.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="http__client_8h.html">lwip/apps/http_client.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="altcp__tcp_8h.html">lwip/altcp_tcp.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="debug_8h.html">lwip/debug.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="altcp__tls_8h.html">lwip/altcp_tls.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="init_8h.html">lwip/init.h</a>&quot;</code><br />
+<code>#include &lt;stdio.h&gt;</code><br />
+<code>#include &lt;stdlib.h&gt;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a32d4c0e6e42327e21fb59dabdc152dd1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="http__client_8c.html#a32d4c0e6e42327e21fb59dabdc152dd1">HTTPC_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:a32d4c0e6e42327e21fb59dabdc152dd1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad2ec42c8e7adaef67266a5bd12c4ad2a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="http__client_8c.html#ad2ec42c8e7adaef67266a5bd12c4ad2a">HTTPC_DEBUG_REQUEST</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ad2ec42c8e7adaef67266a5bd12c4ad2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeda6122d341b879ba8b0fb2df834276a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="http__client_8c.html#aeda6122d341b879ba8b0fb2df834276a">HTTPC_CLIENT_AGENT</a>&#160;&#160;&#160;&quot;lwIP/&quot; LWIP_VERSION_STRING &quot; (http://savannah.nongnu.org/projects/lwip)&quot;</td></tr>
+<tr class="separator:aeda6122d341b879ba8b0fb2df834276a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga6c961e52cec2d25b4b82b6910ebcfa1b"><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__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b">httpc_get_file</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *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)</td></tr>
+<tr class="separator:ga6c961e52cec2d25b4b82b6910ebcfa1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabd4ef2259885a93090733235cc0fa8d6"><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__httpc.html#gabd4ef2259885a93090733235cc0fa8d6">httpc_get_file_dns</a> (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)</td></tr>
+<tr class="separator:gabd4ef2259885a93090733235cc0fa8d6"><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>HTTP client </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="aeda6122d341b879ba8b0fb2df834276a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeda6122d341b879ba8b0fb2df834276a">&#9670;&nbsp;</a></span>HTTPC_CLIENT_AGENT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTPC_CLIENT_AGENT&#160;&#160;&#160;&quot;lwIP/&quot; LWIP_VERSION_STRING &quot; (http://savannah.nongnu.org/projects/lwip)&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This string is passed in the HTTP header as "User-Agent: " </p>
+
+</div>
+</div>
+<a id="a32d4c0e6e42327e21fb59dabdc152dd1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a32d4c0e6e42327e21fb59dabdc152dd1">&#9670;&nbsp;</a></span>HTTPC_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTPC_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>HTTPC_DEBUG: Enable debugging for HTTP client. </p>
+
+</div>
+</div>
+<a id="ad2ec42c8e7adaef67266a5bd12c4ad2a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad2ec42c8e7adaef67266a5bd12c4ad2a">&#9670;&nbsp;</a></span>HTTPC_DEBUG_REQUEST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTPC_DEBUG_REQUEST&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to keep server name and uri in request state </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_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_34adf996f92d0eef72c45a7167a966e6.html">http</a></li><li class="navelem"><a class="el" href="http__client_8c.html">http_client.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/http__client_8c.js b/doc/doxygen/output/html/http__client_8c.js
new file mode 100644
index 0000000..d5d7e38
--- /dev/null
+++ b/doc/doxygen/output/html/http__client_8c.js
@@ -0,0 +1,8 @@
+var http__client_8c =
+[
+    [ "HTTPC_CLIENT_AGENT", "http__client_8c.html#aeda6122d341b879ba8b0fb2df834276a", null ],
+    [ "HTTPC_DEBUG", "http__client_8c.html#a32d4c0e6e42327e21fb59dabdc152dd1", null ],
+    [ "HTTPC_DEBUG_REQUEST", "http__client_8c.html#ad2ec42c8e7adaef67266a5bd12c4ad2a", null ],
+    [ "httpc_get_file", "group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b", null ],
+    [ "httpc_get_file_dns", "group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/http__client_8h.html b/doc/doxygen/output/html/http__client_8h.html
new file mode 100644
index 0000000..93c0230
--- /dev/null
+++ b/doc/doxygen/output/html/http__client_8h.html
@@ -0,0 +1,156 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/http_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('http__client_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<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>
+  <div class="headertitle">
+<div class="title">http_client.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="ip__addr_8h.html">lwip/ip_addr.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="altcp_8h.html">lwip/altcp.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="pbuf_8h.html">lwip/pbuf.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga055b9a8bf8f4e2c18c621471773fa66c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpc.html#ga055b9a8bf8f4e2c18c621471773fa66c">LWIP_HTTPC_HAVE_FILE_IO</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga055b9a8bf8f4e2c18c621471773fa66c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1f192f3009865e9f9a3cd83609c866c2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpc.html#ga1f192f3009865e9f9a3cd83609c866c2">HTTP_DEFAULT_PORT</a>&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618">LWIP_IANA_PORT_HTTP</a></td></tr>
+<tr class="separator:ga1f192f3009865e9f9a3cd83609c866c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gac6713454283bff8e1187849e8d4bda18"><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="group__httpc.html#ga49e34884b272b1e0ddae8da46c31d9a3">ehttpc_result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpc.html#gac6713454283bff8e1187849e8d4bda18">httpc_result_t</a></td></tr>
+<tr class="separator:gac6713454283bff8e1187849e8d4bda18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0452eb8007dbb5f139ec992e58e560dd"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpc.html#ga0452eb8007dbb5f139ec992e58e560dd">httpc_result_fn</a>) (void *arg, <a class="el" href="group__httpc.html#gac6713454283bff8e1187849e8d4bda18">httpc_result_t</a> httpc_result, u32_t rx_content_len, u32_t srv_res, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> err)</td></tr>
+<tr class="separator:ga0452eb8007dbb5f139ec992e58e560dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1e5b62519d6592c89ed3edfabd917472"><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpc.html#ga1e5b62519d6592c89ed3edfabd917472">httpc_headers_done_fn</a>) (httpc_state_t *connection, void *arg, struct <a class="el" href="structpbuf.html">pbuf</a> *hdr, u16_t hdr_len, u32_t content_len)</td></tr>
+<tr class="separator:ga1e5b62519d6592c89ed3edfabd917472"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga49e34884b272b1e0ddae8da46c31d9a3"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpc.html#ga49e34884b272b1e0ddae8da46c31d9a3">ehttpc_result</a> { <br />
+&#160;&#160;<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3af3173d4d272c9c0b5a5c9b5b027e3659">HTTPC_RESULT_OK</a> = 0, 
+<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a5026187026abd1d242333ba6ff69ddbd">HTTPC_RESULT_ERR_UNKNOWN</a> = 1, 
+<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ab866d5433b4c4593c80b756d434e1d09">HTTPC_RESULT_ERR_CONNECT</a> = 2, 
+<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ae04714f90692c122e6c85e06083dbc6d">HTTPC_RESULT_ERR_HOSTNAME</a> = 3, 
+<br />
+&#160;&#160;<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a89a6700abb14dd7cab9b4e0fd66e5fd6">HTTPC_RESULT_ERR_CLOSED</a> = 4, 
+<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a8e6c597f88335b31e6a8b078a32fde33">HTTPC_RESULT_ERR_TIMEOUT</a> = 5, 
+<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3aaa023a6f8069c02c87a826ba323c54b8">HTTPC_RESULT_ERR_SVR_RESP</a> = 6, 
+<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a49972833ec01c7a10dee734c7c69ed62">HTTPC_RESULT_ERR_MEM</a> = 7, 
+<br />
+&#160;&#160;<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3adf4e45365923c16b6a6879bde5f60867">HTTPC_RESULT_LOCAL_ABORT</a> = 8, 
+<a class="el" href="group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a6c8a4195834e1997a498a03bb47bb096">HTTPC_RESULT_ERR_CONTENT_LEN</a> = 9
+<br />
+ }</td></tr>
+<tr class="separator:ga49e34884b272b1e0ddae8da46c31d9a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga6c961e52cec2d25b4b82b6910ebcfa1b"><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__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b">httpc_get_file</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *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)</td></tr>
+<tr class="separator:ga6c961e52cec2d25b4b82b6910ebcfa1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabd4ef2259885a93090733235cc0fa8d6"><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__httpc.html#gabd4ef2259885a93090733235cc0fa8d6">httpc_get_file_dns</a> (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)</td></tr>
+<tr class="separator:gabd4ef2259885a93090733235cc0fa8d6"><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>HTTP client </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_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="http__client_8h.html">http_client.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/http__client_8h.js b/doc/doxygen/output/html/http__client_8h.js
new file mode 100644
index 0000000..42647e5
--- /dev/null
+++ b/doc/doxygen/output/html/http__client_8h.js
@@ -0,0 +1,22 @@
+var http__client_8h =
+[
+    [ "HTTP_DEFAULT_PORT", "group__httpc.html#ga1f192f3009865e9f9a3cd83609c866c2", null ],
+    [ "LWIP_HTTPC_HAVE_FILE_IO", "group__httpc.html#ga055b9a8bf8f4e2c18c621471773fa66c", null ],
+    [ "httpc_headers_done_fn", "group__httpc.html#ga1e5b62519d6592c89ed3edfabd917472", null ],
+    [ "httpc_result_fn", "group__httpc.html#ga0452eb8007dbb5f139ec992e58e560dd", null ],
+    [ "httpc_result_t", "group__httpc.html#gac6713454283bff8e1187849e8d4bda18", null ],
+    [ "ehttpc_result", "group__httpc.html#ga49e34884b272b1e0ddae8da46c31d9a3", [
+      [ "HTTPC_RESULT_OK", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3af3173d4d272c9c0b5a5c9b5b027e3659", null ],
+      [ "HTTPC_RESULT_ERR_UNKNOWN", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a5026187026abd1d242333ba6ff69ddbd", null ],
+      [ "HTTPC_RESULT_ERR_CONNECT", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ab866d5433b4c4593c80b756d434e1d09", null ],
+      [ "HTTPC_RESULT_ERR_HOSTNAME", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ae04714f90692c122e6c85e06083dbc6d", null ],
+      [ "HTTPC_RESULT_ERR_CLOSED", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a89a6700abb14dd7cab9b4e0fd66e5fd6", null ],
+      [ "HTTPC_RESULT_ERR_TIMEOUT", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a8e6c597f88335b31e6a8b078a32fde33", null ],
+      [ "HTTPC_RESULT_ERR_SVR_RESP", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3aaa023a6f8069c02c87a826ba323c54b8", null ],
+      [ "HTTPC_RESULT_ERR_MEM", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a49972833ec01c7a10dee734c7c69ed62", null ],
+      [ "HTTPC_RESULT_LOCAL_ABORT", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3adf4e45365923c16b6a6879bde5f60867", null ],
+      [ "HTTPC_RESULT_ERR_CONTENT_LEN", "group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a6c8a4195834e1997a498a03bb47bb096", null ]
+    ] ],
+    [ "httpc_get_file", "group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b", null ],
+    [ "httpc_get_file_dns", "group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/httpd_8c.html b/doc/doxygen/output/html/httpd_8c.html
new file mode 100644
index 0000000..3531137
--- /dev/null
+++ b/doc/doxygen/output/html/httpd_8c.html
@@ -0,0 +1,206 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/http/httpd.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('httpd_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">httpd.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="init_8h.html">lwip/init.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="httpd_8h.html">lwip/apps/httpd.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="debug_8h.html">lwip/debug.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<code>#include &quot;lwip/apps/fs.h&quot;</code><br />
+<code>#include &quot;httpd_structs.h&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="altcp_8h.html">lwip/altcp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="altcp__tcp_8h.html">lwip/altcp_tcp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="altcp__tls_8h.html">lwip/altcp_tls.h</a>&quot;</code><br />
+<code>#include &quot;path/to/my/lwip_hooks.h&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &lt;stdlib.h&gt;</code><br />
+<code>#include &lt;stdio.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:aa8e2f3e13ac1fcacd85c558d6e40e40a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="httpd_8c.html#aa8e2f3e13ac1fcacd85c558d6e40e40a">MIN_REQ_LEN</a>&#160;&#160;&#160;7</td></tr>
+<tr class="separator:aa8e2f3e13ac1fcacd85c558d6e40e40a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa93d60e8af23b915b5b9652ff71e1300"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="httpd_8c.html#aa93d60e8af23b915b5b9652ff71e1300">HTTP_IS_DATA_VOLATILE</a>(hs)&#160;&#160;&#160;(HTTP_IS_DYNAMIC_FILE(hs) ? TCP_WRITE_FLAG_COPY : 0)</td></tr>
+<tr class="separator:aa93d60e8af23b915b5b9652ff71e1300"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af281bc4a762d56243e0b85dd4197174a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="httpd_8c.html#af281bc4a762d56243e0b85dd4197174a">HTTP_IS_HDR_VOLATILE</a>(hs,  ptr)&#160;&#160;&#160;0</td></tr>
+<tr class="separator:af281bc4a762d56243e0b85dd4197174a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaca4357acf5c988b28123bc6f23540380"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#gaca4357acf5c988b28123bc6f23540380">httpd_post_data_recved</a> (void *connection, u16_t recved_len)</td></tr>
+<tr class="separator:gaca4357acf5c988b28123bc6f23540380"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac364305cee969a0be43c071722b136e6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#gac364305cee969a0be43c071722b136e6">httpd_init</a> (void)</td></tr>
+<tr class="separator:gac364305cee969a0be43c071722b136e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafaedb1911a83854b1e9835132db64409"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#gafaedb1911a83854b1e9835132db64409">httpd_inits</a> (struct altcp_tls_config *conf)</td></tr>
+<tr class="separator:gafaedb1911a83854b1e9835132db64409"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8834ecb16d9a7d6c128bdf9514b7879c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c">http_set_ssi_handler</a> (<a class="el" href="group__httpd.html#gaf88dacc4f18d299084cab75252001319">tSSIHandler</a> ssi_handler, const char **tags, int num_tags)</td></tr>
+<tr class="separator:ga8834ecb16d9a7d6c128bdf9514b7879c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae1ec09532ff7fc622e1860727bf2c897"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897">http_set_cgi_handlers</a> (const <a class="el" href="structt_c_g_i.html">tCGI</a> *cgis, int num_handlers)</td></tr>
+<tr class="separator:gae1ec09532ff7fc622e1860727bf2c897"><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>LWIP HTTP server implementation </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="aa93d60e8af23b915b5b9652ff71e1300"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa93d60e8af23b915b5b9652ff71e1300">&#9670;&nbsp;</a></span>HTTP_IS_DATA_VOLATILE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTP_IS_DATA_VOLATILE</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">hs</td><td>)</td>
+          <td>&#160;&#160;&#160;(HTTP_IS_DYNAMIC_FILE(hs) ? TCP_WRITE_FLAG_COPY : 0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>tcp_write does not have to copy data when sent from rom-file-system directly </p>
+
+</div>
+</div>
+<a id="af281bc4a762d56243e0b85dd4197174a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af281bc4a762d56243e0b85dd4197174a">&#9670;&nbsp;</a></span>HTTP_IS_HDR_VOLATILE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTP_IS_HDR_VOLATILE</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">hs, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ptr&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Default: dynamic headers are sent from ROM (non-dynamic headers are handled like file data) </p>
+
+</div>
+</div>
+<a id="aa8e2f3e13ac1fcacd85c558d6e40e40a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa8e2f3e13ac1fcacd85c558d6e40e40a">&#9670;&nbsp;</a></span>MIN_REQ_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MIN_REQ_LEN&#160;&#160;&#160;7</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Minimum length for a valid HTTP/0.9 request: "GET /\r\n" -&gt; 7 bytes </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_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_34adf996f92d0eef72c45a7167a966e6.html">http</a></li><li class="navelem"><a class="el" href="httpd_8c.html">httpd.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/httpd_8c.js b/doc/doxygen/output/html/httpd_8c.js
new file mode 100644
index 0000000..917e0a8
--- /dev/null
+++ b/doc/doxygen/output/html/httpd_8c.js
@@ -0,0 +1,11 @@
+var httpd_8c =
+[
+    [ "HTTP_IS_DATA_VOLATILE", "httpd_8c.html#aa93d60e8af23b915b5b9652ff71e1300", null ],
+    [ "HTTP_IS_HDR_VOLATILE", "httpd_8c.html#af281bc4a762d56243e0b85dd4197174a", null ],
+    [ "MIN_REQ_LEN", "httpd_8c.html#aa8e2f3e13ac1fcacd85c558d6e40e40a", null ],
+    [ "http_set_cgi_handlers", "group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897", null ],
+    [ "http_set_ssi_handler", "group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c", null ],
+    [ "httpd_init", "group__httpd.html#gac364305cee969a0be43c071722b136e6", null ],
+    [ "httpd_inits", "group__httpd.html#gafaedb1911a83854b1e9835132db64409", null ],
+    [ "httpd_post_data_recved", "group__httpd.html#gaca4357acf5c988b28123bc6f23540380", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/httpd_8h.html b/doc/doxygen/output/html/httpd_8h.html
new file mode 100644
index 0000000..ec63d85
--- /dev/null
+++ b/doc/doxygen/output/html/httpd_8h.html
@@ -0,0 +1,163 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/httpd.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('httpd_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">httpd.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="httpd__opts_8h.html">httpd_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><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structt_c_g_i.html">tCGI</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:aeb00bcd99ec9627b108832f0b58891ca"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="httpd_8h.html#aeb00bcd99ec9627b108832f0b58891ca">HTTPD_SSI_TAG_UNKNOWN</a>&#160;&#160;&#160;0xFFFF</td></tr>
+<tr class="separator:aeb00bcd99ec9627b108832f0b58891ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gafe011a487c5e8d03a6b2f629e14e6b5c"><td class="memItemLeft" align="right" valign="top">typedef const char *(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#gafe011a487c5e8d03a6b2f629e14e6b5c">tCGIHandler</a>) (int iIndex, int iNumParams, char *pcParam[], char *pcValue[])</td></tr>
+<tr class="separator:gafe011a487c5e8d03a6b2f629e14e6b5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf88dacc4f18d299084cab75252001319"><td class="memItemLeft" align="right" valign="top">typedef u16_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#gaf88dacc4f18d299084cab75252001319">tSSIHandler</a>) (const char *ssi_tag_name, char *pcInsert, int iInsertLen)</td></tr>
+<tr class="separator:gaf88dacc4f18d299084cab75252001319"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gae1ec09532ff7fc622e1860727bf2c897"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897">http_set_cgi_handlers</a> (const <a class="el" href="structt_c_g_i.html">tCGI</a> *pCGIs, int iNumHandlers)</td></tr>
+<tr class="separator:gae1ec09532ff7fc622e1860727bf2c897"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8834ecb16d9a7d6c128bdf9514b7879c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c">http_set_ssi_handler</a> (<a class="el" href="group__httpd.html#gaf88dacc4f18d299084cab75252001319">tSSIHandler</a> pfnSSIHandler, const char **ppcTags, int iNumTags)</td></tr>
+<tr class="separator:ga8834ecb16d9a7d6c128bdf9514b7879c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6cb33693ee8f0c054be82a968ceff582"><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__httpd.html#ga6cb33693ee8f0c054be82a968ceff582">httpd_post_begin</a> (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)</td></tr>
+<tr class="separator:ga6cb33693ee8f0c054be82a968ceff582"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga461409c8813c2a82ba63fde987c0e537"><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__httpd.html#ga461409c8813c2a82ba63fde987c0e537">httpd_post_receive_data</a> (void *connection, struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:ga461409c8813c2a82ba63fde987c0e537"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga477473f7ead250fec71f1f8b9926fec5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#ga477473f7ead250fec71f1f8b9926fec5">httpd_post_finished</a> (void *connection, char *response_uri, u16_t response_uri_len)</td></tr>
+<tr class="separator:ga477473f7ead250fec71f1f8b9926fec5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaca4357acf5c988b28123bc6f23540380"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#gaca4357acf5c988b28123bc6f23540380">httpd_post_data_recved</a> (void *connection, u16_t recved_len)</td></tr>
+<tr class="separator:gaca4357acf5c988b28123bc6f23540380"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac364305cee969a0be43c071722b136e6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#gac364305cee969a0be43c071722b136e6">httpd_init</a> (void)</td></tr>
+<tr class="separator:gac364305cee969a0be43c071722b136e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafaedb1911a83854b1e9835132db64409"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd.html#gafaedb1911a83854b1e9835132db64409">httpd_inits</a> (struct altcp_tls_config *conf)</td></tr>
+<tr class="separator:gafaedb1911a83854b1e9835132db64409"><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>HTTP server </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="aeb00bcd99ec9627b108832f0b58891ca"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeb00bcd99ec9627b108832f0b58891ca">&#9670;&nbsp;</a></span>HTTPD_SSI_TAG_UNKNOWN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HTTPD_SSI_TAG_UNKNOWN&#160;&#160;&#160;0xFFFF</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>For LWIP_HTTPD_SSI_RAW==1, return this to indicate the tag is unknown. In this case, the webserver writes a warning into the page. You can also just return 0 to write nothing for unknown tags. </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="dir_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="httpd_8h.html">httpd.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/httpd_8h.js b/doc/doxygen/output/html/httpd_8h.js
new file mode 100644
index 0000000..813cbf6
--- /dev/null
+++ b/doc/doxygen/output/html/httpd_8h.js
@@ -0,0 +1,14 @@
+var httpd_8h =
+[
+    [ "HTTPD_SSI_TAG_UNKNOWN", "httpd_8h.html#aeb00bcd99ec9627b108832f0b58891ca", null ],
+    [ "tCGIHandler", "group__httpd.html#gafe011a487c5e8d03a6b2f629e14e6b5c", null ],
+    [ "tSSIHandler", "group__httpd.html#gaf88dacc4f18d299084cab75252001319", null ],
+    [ "http_set_cgi_handlers", "group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897", null ],
+    [ "http_set_ssi_handler", "group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c", null ],
+    [ "httpd_init", "group__httpd.html#gac364305cee969a0be43c071722b136e6", null ],
+    [ "httpd_inits", "group__httpd.html#gafaedb1911a83854b1e9835132db64409", null ],
+    [ "httpd_post_begin", "group__httpd.html#ga6cb33693ee8f0c054be82a968ceff582", null ],
+    [ "httpd_post_data_recved", "group__httpd.html#gaca4357acf5c988b28123bc6f23540380", null ],
+    [ "httpd_post_finished", "group__httpd.html#ga477473f7ead250fec71f1f8b9926fec5", null ],
+    [ "httpd_post_receive_data", "group__httpd.html#ga461409c8813c2a82ba63fde987c0e537", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/httpd__opts_8h.html b/doc/doxygen/output/html/httpd__opts_8h.html
new file mode 100644
index 0000000..199260e
--- /dev/null
+++ b/doc/doxygen/output/html/httpd__opts_8h.html
@@ -0,0 +1,186 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/httpd_opts.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('httpd__opts_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">httpd_opts.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="iana_8h.html">lwip/prot/iana.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gafb28f7c5fee75f013a199d427452372c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gafb28f7c5fee75f013a199d427452372c">LWIP_HTTPD_CGI</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gafb28f7c5fee75f013a199d427452372c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad3960bf65731bd0f1341867664afe860"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gad3960bf65731bd0f1341867664afe860">LWIP_HTTPD_CGI_SSI</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gad3960bf65731bd0f1341867664afe860"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacb70e0cdd30a940f8bce681c6cc63949"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gacb70e0cdd30a940f8bce681c6cc63949">LWIP_HTTPD_SSI</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gacb70e0cdd30a940f8bce681c6cc63949"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga520858778b84d4d2fa125294c0f119e5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga520858778b84d4d2fa125294c0f119e5">LWIP_HTTPD_SSI_RAW</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga520858778b84d4d2fa125294c0f119e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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"><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>
+<tr class="separator:ga3167d52d20cf90857e2c809b92458bf0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafb2115e763ed3163a3e204a0ba53edb9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gafb2115e763ed3163a3e204a0ba53edb9">HTTPD_SERVER_AGENT</a>&#160;&#160;&#160;&quot;lwIP/&quot; LWIP_VERSION_STRING &quot; (http://savannah.nongnu.org/projects/lwip)&quot;</td></tr>
+<tr class="separator:gafb2115e763ed3163a3e204a0ba53edb9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga75932fc5eeb9abeddfdaf8413574c6d7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga75932fc5eeb9abeddfdaf8413574c6d7">LWIP_HTTPD_DYNAMIC_HEADERS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga75932fc5eeb9abeddfdaf8413574c6d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabb13219495a813fceaafa954a238a924"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gabb13219495a813fceaafa954a238a924">HTTPD_USE_MEM_POOL</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gabb13219495a813fceaafa954a238a924"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2b058c5d1bd67e5d7cb260166e3ace50"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga2b058c5d1bd67e5d7cb260166e3ace50">HTTPD_SERVER_PORT</a>&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618">LWIP_IANA_PORT_HTTP</a></td></tr>
+<tr class="separator:ga2b058c5d1bd67e5d7cb260166e3ace50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaffe653b08bf5ba25b276c655f6813441"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gaffe653b08bf5ba25b276c655f6813441">HTTPD_SERVER_PORT_HTTPS</a>&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88">LWIP_IANA_PORT_HTTPS</a></td></tr>
+<tr class="separator:gaffe653b08bf5ba25b276c655f6813441"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga64dc2a10b1c2ec886e698fe9008e51e2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga64dc2a10b1c2ec886e698fe9008e51e2">HTTPD_ENABLE_HTTPS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga64dc2a10b1c2ec886e698fe9008e51e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad92e78e19fd3ab2af42750e83ed73fd5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gad92e78e19fd3ab2af42750e83ed73fd5">HTTPD_MAX_RETRIES</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:gad92e78e19fd3ab2af42750e83ed73fd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacc3e7667baa2cfafd23de2b152df7a63"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gacc3e7667baa2cfafd23de2b152df7a63">HTTPD_POLL_INTERVAL</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:gacc3e7667baa2cfafd23de2b152df7a63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaabd1f6319d04b8d5f2c93270794d5182"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gaabd1f6319d04b8d5f2c93270794d5182">HTTPD_TCP_PRIO</a>&#160;&#160;&#160;TCP_PRIO_MIN</td></tr>
+<tr class="separator:gaabd1f6319d04b8d5f2c93270794d5182"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga054db3f080715942967969c6ae30bb6a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga054db3f080715942967969c6ae30bb6a">LWIP_HTTPD_TIMING</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga054db3f080715942967969c6ae30bb6a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5f2642874f930798d975b1f7a6d2e1da"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga5f2642874f930798d975b1f7a6d2e1da">HTTPD_DEBUG_TIMING</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga5f2642874f930798d975b1f7a6d2e1da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga85ebddbc4236b1e31bfa68fa163f9b07"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga85ebddbc4236b1e31bfa68fa163f9b07">LWIP_HTTPD_SUPPORT_EXTSTATUS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga85ebddbc4236b1e31bfa68fa163f9b07"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7a8f4ab787b6fb8482c8a36c9fd0c7dd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga7a8f4ab787b6fb8482c8a36c9fd0c7dd">LWIP_HTTPD_SUPPORT_V09</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga7a8f4ab787b6fb8482c8a36c9fd0c7dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6f78487bc829f7f98274f1264020045e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga6f78487bc829f7f98274f1264020045e">LWIP_HTTPD_SUPPORT_11_KEEPALIVE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga6f78487bc829f7f98274f1264020045e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0bd0f9a89423fb3bbfea4e4c6141ae43"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga0bd0f9a89423fb3bbfea4e4c6141ae43">LWIP_HTTPD_SUPPORT_REQUESTLIST</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga0bd0f9a89423fb3bbfea4e4c6141ae43"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaef23f4e3525aa5dd0ecbce9b5e16d4e0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0">LWIP_HTTPD_REQ_QUEUELEN</a>&#160;&#160;&#160;5</td></tr>
+<tr class="separator:gaef23f4e3525aa5dd0ecbce9b5e16d4e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8dbe61a35228da0e7365a088197191b8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga8dbe61a35228da0e7365a088197191b8">LWIP_HTTPD_REQ_BUFSIZE</a>&#160;&#160;&#160;<a class="el" href="group__httpd__opts.html#ga30dc71c59f3904df7daaf293f74f91f8">LWIP_HTTPD_MAX_REQ_LENGTH</a></td></tr>
+<tr class="separator:ga8dbe61a35228da0e7365a088197191b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga30dc71c59f3904df7daaf293f74f91f8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga30dc71c59f3904df7daaf293f74f91f8">LWIP_HTTPD_MAX_REQ_LENGTH</a>&#160;&#160;&#160;LWIP_MIN(1023, (<a class="el" href="group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0">LWIP_HTTPD_REQ_QUEUELEN</a> * <a class="el" href="group__lwip__opts__pbuf.html#gae61f4491d56e805e79b79eb5d35a00e5">PBUF_POOL_BUFSIZE</a>))</td></tr>
+<tr class="separator:ga30dc71c59f3904df7daaf293f74f91f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaca4ef53e7a9abbd8d4bd8bc1ba7b486a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gaca4ef53e7a9abbd8d4bd8bc1ba7b486a">LWIP_HTTPD_MAX_REQUEST_URI_LEN</a>&#160;&#160;&#160;63</td></tr>
+<tr class="separator:gaca4ef53e7a9abbd8d4bd8bc1ba7b486a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa27f7c5450392d10aeed033ca878cce3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gaa27f7c5450392d10aeed033ca878cce3">LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN</a>&#160;&#160;&#160;63</td></tr>
+<tr class="separator:gaa27f7c5450392d10aeed033ca878cce3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga975961a6d22d1a077118fb85dfec809a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga975961a6d22d1a077118fb85dfec809a">LWIP_HTTPD_SSI_INCLUDE_TAG</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga975961a6d22d1a077118fb85dfec809a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0ff20ebc4ab50d4aa6151c3241dacb3a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga0ff20ebc4ab50d4aa6151c3241dacb3a">LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga0ff20ebc4ab50d4aa6151c3241dacb3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0d5074965efd40786182287895feb691"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga0d5074965efd40786182287895feb691">LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga0d5074965efd40786182287895feb691"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga82a030ce2ecdcf741b02b7be41c012b3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga82a030ce2ecdcf741b02b7be41c012b3">LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga82a030ce2ecdcf741b02b7be41c012b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga662e88120b507426374dd8ebbd54a048"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga662e88120b507426374dd8ebbd54a048">HTTP_IS_TAG_VOLATILE</a>(ptr)&#160;&#160;&#160;TCP_WRITE_FLAG_COPY</td></tr>
+<tr class="separator:ga662e88120b507426374dd8ebbd54a048"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadadb70f5663cdf004bf879e3b5d326bd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gadadb70f5663cdf004bf879e3b5d326bd">LWIP_HTTPD_CUSTOM_FILES</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gadadb70f5663cdf004bf879e3b5d326bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1ee8d7c975c7e3d1c9d9dd9b43660c79"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga1ee8d7c975c7e3d1c9d9dd9b43660c79">LWIP_HTTPD_DYNAMIC_FILE_READ</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga1ee8d7c975c7e3d1c9d9dd9b43660c79"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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"><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>
+<tr class="separator:ga51cb673cb5cc362acc409f23c1e0a331"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad68e8e06ea4c2be1b3508e813a49f7cc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gad68e8e06ea4c2be1b3508e813a49f7cc">HTTPD_FSDATA_FILE</a>&#160;&#160;&#160;&quot;fsdata.c&quot;</td></tr>
+<tr class="separator:gad68e8e06ea4c2be1b3508e813a49f7cc"><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>HTTP server options list </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_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="httpd__opts_8h.html">httpd_opts.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/httpd__opts_8h.js b/doc/doxygen/output/html/httpd__opts_8h.js
new file mode 100644
index 0000000..bb2653d
--- /dev/null
+++ b/doc/doxygen/output/html/httpd__opts_8h.js
@@ -0,0 +1,41 @@
+var httpd__opts_8h =
+[
+    [ "HTTP_IS_TAG_VOLATILE", "group__httpd__opts.html#ga662e88120b507426374dd8ebbd54a048", null ],
+    [ "HTTPD_DEBUG_TIMING", "group__httpd__opts.html#ga5f2642874f930798d975b1f7a6d2e1da", null ],
+    [ "HTTPD_ENABLE_HTTPS", "group__httpd__opts.html#ga64dc2a10b1c2ec886e698fe9008e51e2", null ],
+    [ "HTTPD_FSDATA_FILE", "group__httpd__opts.html#gad68e8e06ea4c2be1b3508e813a49f7cc", null ],
+    [ "HTTPD_MAX_RETRIES", "group__httpd__opts.html#gad92e78e19fd3ab2af42750e83ed73fd5", null ],
+    [ "HTTPD_POLL_INTERVAL", "group__httpd__opts.html#gacc3e7667baa2cfafd23de2b152df7a63", null ],
+    [ "HTTPD_PRECALCULATED_CHECKSUM", "group__httpd__opts.html#ga6e5de8515c89af12277e4cb011165103", null ],
+    [ "HTTPD_SERVER_AGENT", "group__httpd__opts.html#gafb2115e763ed3163a3e204a0ba53edb9", null ],
+    [ "HTTPD_SERVER_PORT", "group__httpd__opts.html#ga2b058c5d1bd67e5d7cb260166e3ace50", null ],
+    [ "HTTPD_SERVER_PORT_HTTPS", "group__httpd__opts.html#gaffe653b08bf5ba25b276c655f6813441", null ],
+    [ "HTTPD_TCP_PRIO", "group__httpd__opts.html#gaabd1f6319d04b8d5f2c93270794d5182", null ],
+    [ "HTTPD_USE_MEM_POOL", "group__httpd__opts.html#gabb13219495a813fceaafa954a238a924", null ],
+    [ "LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR", "group__httpd__opts.html#ga0ff20ebc4ab50d4aa6151c3241dacb3a", null ],
+    [ "LWIP_HTTPD_CGI", "group__httpd__opts.html#gafb28f7c5fee75f013a199d427452372c", null ],
+    [ "LWIP_HTTPD_CGI_SSI", "group__httpd__opts.html#gad3960bf65731bd0f1341867664afe860", null ],
+    [ "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_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 ],
+    [ "LWIP_HTTPD_MAX_REQ_LENGTH", "group__httpd__opts.html#ga30dc71c59f3904df7daaf293f74f91f8", null ],
+    [ "LWIP_HTTPD_MAX_REQUEST_URI_LEN", "group__httpd__opts.html#gaca4ef53e7a9abbd8d4bd8bc1ba7b486a", null ],
+    [ "LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI", "group__httpd__opts.html#ga82a030ce2ecdcf741b02b7be41c012b3", null ],
+    [ "LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN", "group__httpd__opts.html#gaa27f7c5450392d10aeed033ca878cce3", null ],
+    [ "LWIP_HTTPD_REQ_BUFSIZE", "group__httpd__opts.html#ga8dbe61a35228da0e7365a088197191b8", null ],
+    [ "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_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 ],
+    [ "LWIP_HTTPD_SUPPORT_11_KEEPALIVE", "group__httpd__opts.html#ga6f78487bc829f7f98274f1264020045e", null ],
+    [ "LWIP_HTTPD_SUPPORT_EXTSTATUS", "group__httpd__opts.html#ga85ebddbc4236b1e31bfa68fa163f9b07", null ],
+    [ "LWIP_HTTPD_SUPPORT_POST", "group__httpd__opts.html#gacbea06ce33933e3ef2f2f1834a21cc2c", null ],
+    [ "LWIP_HTTPD_SUPPORT_REQUESTLIST", "group__httpd__opts.html#ga0bd0f9a89423fb3bbfea4e4c6141ae43", null ],
+    [ "LWIP_HTTPD_SUPPORT_V09", "group__httpd__opts.html#ga7a8f4ab787b6fb8482c8a36c9fd0c7dd", null ],
+    [ "LWIP_HTTPD_TIMING", "group__httpd__opts.html#ga054db3f080715942967969c6ae30bb6a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/iana_8h.html b/doc/doxygen/output/html/iana_8h.html
new file mode 100644
index 0000000..285285f
--- /dev/null
+++ b/doc/doxygen/output/html/iana_8h.html
@@ -0,0 +1,132 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/iana.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('iana_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#enum-members">Enumerations</a>  </div>
+  <div class="headertitle">
+<div class="title">iana.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga3d2bbfcb56c8adf3be8c8d12868cecfe"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iana.html#ga3d2bbfcb56c8adf3be8c8d12868cecfe">lwip_iana_hwtype</a> { <a class="el" href="group__iana.html#gga3d2bbfcb56c8adf3be8c8d12868cecfea89e82e6ac55811bb26fe66ec029f2a0c">LWIP_IANA_HWTYPE_ETHERNET</a> = 1
+ }</td></tr>
+<tr class="separator:ga3d2bbfcb56c8adf3be8c8d12868cecfe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac9396d90585e49e9a287179bf5aa9ba0"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iana.html#gac9396d90585e49e9a287179bf5aa9ba0">lwip_iana_port_number</a> { <br />
+&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae2645895203ca3c54005afad053a813c">LWIP_IANA_PORT_SMTP</a> = 25, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ac70ae96c985cf3660e26aa496094916d">LWIP_IANA_PORT_DHCP_SERVER</a> = 67, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a9fcae1f16758e1ac35dab343fc897f40">LWIP_IANA_PORT_DHCP_CLIENT</a> = 68, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050">LWIP_IANA_PORT_TFTP</a> = 69, 
+<br />
+&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618">LWIP_IANA_PORT_HTTP</a> = 80, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb">LWIP_IANA_PORT_SNTP</a> = 123, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae1cf6eaab024b31aff5bf407d38e0ede">LWIP_IANA_PORT_NETBIOS</a> = 137, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aeb10a37f0c48e053b138f65b843c45d3">LWIP_IANA_PORT_SNMP</a> = 161, 
+<br />
+&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aff60c0d3e8eca210b7e4faca3491f4a8">LWIP_IANA_PORT_SNMP_TRAP</a> = 162, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88">LWIP_IANA_PORT_HTTPS</a> = 443, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a88f8872246977c6e24c617266ada1a3b">LWIP_IANA_PORT_SMTPS</a> = 465, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22">LWIP_IANA_PORT_MQTT</a> = 1883, 
+<br />
+&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a839da325f45916d7b27d53d5e5e97dc6">LWIP_IANA_PORT_MDNS</a> = 5353, 
+<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601">LWIP_IANA_PORT_SECURE_MQTT</a> = 8883
+<br />
+ }</td></tr>
+<tr class="separator:gac9396d90585e49e9a287179bf5aa9ba0"><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>IANA assigned numbers (RFC 1700 and successors) </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="iana_8h.html">iana.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/iana_8h.js b/doc/doxygen/output/html/iana_8h.js
new file mode 100644
index 0000000..ea4de63
--- /dev/null
+++ b/doc/doxygen/output/html/iana_8h.js
@@ -0,0 +1,22 @@
+var iana_8h =
+[
+    [ "lwip_iana_hwtype", "group__iana.html#ga3d2bbfcb56c8adf3be8c8d12868cecfe", [
+      [ "LWIP_IANA_HWTYPE_ETHERNET", "group__iana.html#gga3d2bbfcb56c8adf3be8c8d12868cecfea89e82e6ac55811bb26fe66ec029f2a0c", null ]
+    ] ],
+    [ "lwip_iana_port_number", "group__iana.html#gac9396d90585e49e9a287179bf5aa9ba0", [
+      [ "LWIP_IANA_PORT_SMTP", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae2645895203ca3c54005afad053a813c", null ],
+      [ "LWIP_IANA_PORT_DHCP_SERVER", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ac70ae96c985cf3660e26aa496094916d", null ],
+      [ "LWIP_IANA_PORT_DHCP_CLIENT", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a9fcae1f16758e1ac35dab343fc897f40", null ],
+      [ "LWIP_IANA_PORT_TFTP", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050", null ],
+      [ "LWIP_IANA_PORT_HTTP", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618", null ],
+      [ "LWIP_IANA_PORT_SNTP", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb", null ],
+      [ "LWIP_IANA_PORT_NETBIOS", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae1cf6eaab024b31aff5bf407d38e0ede", null ],
+      [ "LWIP_IANA_PORT_SNMP", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aeb10a37f0c48e053b138f65b843c45d3", null ],
+      [ "LWIP_IANA_PORT_SNMP_TRAP", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aff60c0d3e8eca210b7e4faca3491f4a8", null ],
+      [ "LWIP_IANA_PORT_HTTPS", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88", null ],
+      [ "LWIP_IANA_PORT_SMTPS", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a88f8872246977c6e24c617266ada1a3b", null ],
+      [ "LWIP_IANA_PORT_MQTT", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22", null ],
+      [ "LWIP_IANA_PORT_MDNS", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a839da325f45916d7b27d53d5e5e97dc6", null ],
+      [ "LWIP_IANA_PORT_SECURE_MQTT", "group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601", null ]
+    ] ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/icmp6_8c.html b/doc/doxygen/output/html/icmp6_8c.html
new file mode 100644
index 0000000..db11561
--- /dev/null
+++ b/doc/doxygen/output/html/icmp6_8c.html
@@ -0,0 +1,377 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv6/icmp6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('icmp6_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">icmp6.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 &quot;<a class="el" href="icmp6_8h.html">lwip/icmp6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2icmp6_8h.html">lwip/prot/icmp6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6_8h.html">lwip/ip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="inet__chksum_8h.html">lwip/inet_chksum.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="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="nd6_8h.html">lwip/nd6.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="ip_8h.html">lwip/ip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a94bec819e11f51c8088ca338f2e36c3d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp6_8c.html#a94bec819e11f51c8088ca338f2e36c3d">icmp6_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:a94bec819e11f51c8088ca338f2e36c3d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab480867394952904b5607d62315bdbac"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp6_8c.html#ab480867394952904b5607d62315bdbac">icmp6_dest_unreach</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, enum <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccf">icmp6_dur_code</a> c)</td></tr>
+<tr class="separator:ab480867394952904b5607d62315bdbac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3c0a84e0944263d92c9dc3ad094ffcb0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp6_8c.html#a3c0a84e0944263d92c9dc3ad094ffcb0">icmp6_packet_too_big</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u32_t mtu)</td></tr>
+<tr class="separator:a3c0a84e0944263d92c9dc3ad094ffcb0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a358abb6555f6ca6b2b2b1412c9117bec"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp6_8c.html#a358abb6555f6ca6b2b2b1412c9117bec">icmp6_time_exceeded</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, enum <a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e">icmp6_te_code</a> c)</td></tr>
+<tr class="separator:a358abb6555f6ca6b2b2b1412c9117bec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad01e5bc4690a2c6aeb534237a5a9b593"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp6_8c.html#ad01e5bc4690a2c6aeb534237a5a9b593">icmp6_time_exceeded_with_addrs</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, enum <a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e">icmp6_te_code</a> c, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *src_addr, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest_addr)</td></tr>
+<tr class="separator:ad01e5bc4690a2c6aeb534237a5a9b593"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6094fa333b2cbf1b1b062e72313ef146"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp6_8c.html#a6094fa333b2cbf1b1b062e72313ef146">icmp6_param_problem</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, enum <a class="el" href="prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023">icmp6_pp_code</a> c, const void *pointer)</td></tr>
+<tr class="separator:a6094fa333b2cbf1b1b062e72313ef146"><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>IPv6 version of ICMP, as per RFC 4443. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ab480867394952904b5607d62315bdbac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab480867394952904b5607d62315bdbac">&#9670;&nbsp;</a></span>icmp6_dest_unreach()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp6_dest_unreach </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccf">icmp6_dur_code</a>&#160;</td>
+          <td class="paramname"><em>c</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an icmpv6 'destination unreachable' packet.</p>
+<p>This function must be used only in direct response to a packet that is being received right now. Otherwise, address zones would be lost.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the input packet for which the 'unreachable' should be sent, p-&gt;payload pointing to the IPv6 header </td></tr>
+    <tr><td class="paramname">c</td><td>ICMPv6 code for the unreachable type </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a94bec819e11f51c8088ca338f2e36c3d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a94bec819e11f51c8088ca338f2e36c3d">&#9670;&nbsp;</a></span>icmp6_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp6_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Process an input ICMPv6 message. Called by ip6_input.</p>
+<p>Will generate a reply for echo requests. Other messages are forwarded to nd6_input, or mld6_input.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the mld packet, p-&gt;payload pointing to the icmpv6 header </td></tr>
+    <tr><td class="paramname">inp</td><td>the netif on which this packet was received </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a3c0a84e0944263d92c9dc3ad094ffcb0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3c0a84e0944263d92c9dc3ad094ffcb0">&#9670;&nbsp;</a></span>icmp6_packet_too_big()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp6_packet_too_big </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>mtu</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an icmpv6 'packet too big' packet.</p>
+<p>This function must be used only in direct response to a packet that is being received right now. Otherwise, address zones would be lost.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the input packet for which the 'packet too big' should be sent, p-&gt;payload pointing to the IPv6 header </td></tr>
+    <tr><td class="paramname">mtu</td><td>the maximum mtu that we can accept </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a6094fa333b2cbf1b1b062e72313ef146"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6094fa333b2cbf1b1b062e72313ef146">&#9670;&nbsp;</a></span>icmp6_param_problem()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp6_param_problem </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum <a class="el" href="prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023">icmp6_pp_code</a>&#160;</td>
+          <td class="paramname"><em>c</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>pointer</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an icmpv6 'parameter problem' packet.</p>
+<p>This function must be used only in direct response to a packet that is being received right now. Otherwise, address zones would be lost and the calculated offset would be wrong (calculated against <a class="el" href="ip_8h.html#af9bf74750c9d7a219ee88d240300fe69">ip6_current_header()</a>).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the input packet for which the 'param problem' should be sent, p-&gt;payload pointing to the IP header </td></tr>
+    <tr><td class="paramname">c</td><td>ICMPv6 code for the param problem type </td></tr>
+    <tr><td class="paramname">pointer</td><td>the pointer to the byte where the parameter is found </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a358abb6555f6ca6b2b2b1412c9117bec"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a358abb6555f6ca6b2b2b1412c9117bec">&#9670;&nbsp;</a></span>icmp6_time_exceeded()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp6_time_exceeded </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum <a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e">icmp6_te_code</a>&#160;</td>
+          <td class="paramname"><em>c</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an icmpv6 'time exceeded' packet.</p>
+<p>This function must be used only in direct response to a packet that is being received right now. Otherwise, address zones would be lost.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the input packet for which the 'time exceeded' should be sent, p-&gt;payload pointing to the IPv6 header </td></tr>
+    <tr><td class="paramname">c</td><td>ICMPv6 code for the time exceeded type </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ad01e5bc4690a2c6aeb534237a5a9b593"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad01e5bc4690a2c6aeb534237a5a9b593">&#9670;&nbsp;</a></span>icmp6_time_exceeded_with_addrs()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp6_time_exceeded_with_addrs </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum <a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e">icmp6_te_code</a>&#160;</td>
+          <td class="paramname"><em>c</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src_addr</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest_addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an icmpv6 'time exceeded' packet, with explicit source and destination addresses.</p>
+<p>This function may be used to send a response sometime after receiving the packet for which this response is meant. The provided source and destination addresses are used primarily to retain their zone information.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the input packet for which the 'time exceeded' should be sent, p-&gt;payload pointing to the IPv6 header </td></tr>
+    <tr><td class="paramname">c</td><td>ICMPv6 code for the time exceeded type </td></tr>
+    <tr><td class="paramname">src_addr</td><td>source address of the original packet, with zone information </td></tr>
+    <tr><td class="paramname">dest_addr</td><td>destination address of the original packet, with zone information </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_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li><li class="navelem"><a class="el" href="dir_da9c6f43d3cd00be3de224bac907a425.html">ipv6</a></li><li class="navelem"><a class="el" href="icmp6_8c.html">icmp6.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/icmp6_8c.js b/doc/doxygen/output/html/icmp6_8c.js
new file mode 100644
index 0000000..5686a9b
--- /dev/null
+++ b/doc/doxygen/output/html/icmp6_8c.js
@@ -0,0 +1,9 @@
+var icmp6_8c =
+[
+    [ "icmp6_dest_unreach", "icmp6_8c.html#ab480867394952904b5607d62315bdbac", null ],
+    [ "icmp6_input", "icmp6_8c.html#a94bec819e11f51c8088ca338f2e36c3d", null ],
+    [ "icmp6_packet_too_big", "icmp6_8c.html#a3c0a84e0944263d92c9dc3ad094ffcb0", null ],
+    [ "icmp6_param_problem", "icmp6_8c.html#a6094fa333b2cbf1b1b062e72313ef146", null ],
+    [ "icmp6_time_exceeded", "icmp6_8c.html#a358abb6555f6ca6b2b2b1412c9117bec", null ],
+    [ "icmp6_time_exceeded_with_addrs", "icmp6_8c.html#ad01e5bc4690a2c6aeb534237a5a9b593", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/icmp6_8h.html b/doc/doxygen/output/html/icmp6_8h.html
new file mode 100644
index 0000000..bf91573
--- /dev/null
+++ b/doc/doxygen/output/html/icmp6_8h.html
@@ -0,0 +1,369 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/icmp6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('icmp6_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">icmp6.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="pbuf_8h.html">lwip/pbuf.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_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="prot_2icmp6_8h.html">lwip/prot/icmp6.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a94bec819e11f51c8088ca338f2e36c3d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp6_8h.html#a94bec819e11f51c8088ca338f2e36c3d">icmp6_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:a94bec819e11f51c8088ca338f2e36c3d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab480867394952904b5607d62315bdbac"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp6_8h.html#ab480867394952904b5607d62315bdbac">icmp6_dest_unreach</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, enum <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccf">icmp6_dur_code</a> c)</td></tr>
+<tr class="separator:ab480867394952904b5607d62315bdbac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3c0a84e0944263d92c9dc3ad094ffcb0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp6_8h.html#a3c0a84e0944263d92c9dc3ad094ffcb0">icmp6_packet_too_big</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u32_t mtu)</td></tr>
+<tr class="separator:a3c0a84e0944263d92c9dc3ad094ffcb0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a358abb6555f6ca6b2b2b1412c9117bec"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp6_8h.html#a358abb6555f6ca6b2b2b1412c9117bec">icmp6_time_exceeded</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, enum <a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e">icmp6_te_code</a> c)</td></tr>
+<tr class="separator:a358abb6555f6ca6b2b2b1412c9117bec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad01e5bc4690a2c6aeb534237a5a9b593"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp6_8h.html#ad01e5bc4690a2c6aeb534237a5a9b593">icmp6_time_exceeded_with_addrs</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, enum <a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e">icmp6_te_code</a> c, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *src_addr, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest_addr)</td></tr>
+<tr class="separator:ad01e5bc4690a2c6aeb534237a5a9b593"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6094fa333b2cbf1b1b062e72313ef146"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp6_8h.html#a6094fa333b2cbf1b1b062e72313ef146">icmp6_param_problem</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, enum <a class="el" href="prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023">icmp6_pp_code</a> c, const void *pointer)</td></tr>
+<tr class="separator:a6094fa333b2cbf1b1b062e72313ef146"><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>IPv6 version of ICMP, as per RFC 4443. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ab480867394952904b5607d62315bdbac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab480867394952904b5607d62315bdbac">&#9670;&nbsp;</a></span>icmp6_dest_unreach()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp6_dest_unreach </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccf">icmp6_dur_code</a>&#160;</td>
+          <td class="paramname"><em>c</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an icmpv6 'destination unreachable' packet.</p>
+<p>This function must be used only in direct response to a packet that is being received right now. Otherwise, address zones would be lost.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the input packet for which the 'unreachable' should be sent, p-&gt;payload pointing to the IPv6 header </td></tr>
+    <tr><td class="paramname">c</td><td>ICMPv6 code for the unreachable type </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a94bec819e11f51c8088ca338f2e36c3d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a94bec819e11f51c8088ca338f2e36c3d">&#9670;&nbsp;</a></span>icmp6_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp6_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Process an input ICMPv6 message. Called by ip6_input.</p>
+<p>Will generate a reply for echo requests. Other messages are forwarded to nd6_input, or mld6_input.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the mld packet, p-&gt;payload pointing to the icmpv6 header </td></tr>
+    <tr><td class="paramname">inp</td><td>the netif on which this packet was received </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a3c0a84e0944263d92c9dc3ad094ffcb0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3c0a84e0944263d92c9dc3ad094ffcb0">&#9670;&nbsp;</a></span>icmp6_packet_too_big()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp6_packet_too_big </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>mtu</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an icmpv6 'packet too big' packet.</p>
+<p>This function must be used only in direct response to a packet that is being received right now. Otherwise, address zones would be lost.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the input packet for which the 'packet too big' should be sent, p-&gt;payload pointing to the IPv6 header </td></tr>
+    <tr><td class="paramname">mtu</td><td>the maximum mtu that we can accept </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a6094fa333b2cbf1b1b062e72313ef146"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6094fa333b2cbf1b1b062e72313ef146">&#9670;&nbsp;</a></span>icmp6_param_problem()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp6_param_problem </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum <a class="el" href="prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023">icmp6_pp_code</a>&#160;</td>
+          <td class="paramname"><em>c</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>pointer</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an icmpv6 'parameter problem' packet.</p>
+<p>This function must be used only in direct response to a packet that is being received right now. Otherwise, address zones would be lost and the calculated offset would be wrong (calculated against <a class="el" href="ip_8h.html#af9bf74750c9d7a219ee88d240300fe69">ip6_current_header()</a>).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the input packet for which the 'param problem' should be sent, p-&gt;payload pointing to the IP header </td></tr>
+    <tr><td class="paramname">c</td><td>ICMPv6 code for the param problem type </td></tr>
+    <tr><td class="paramname">pointer</td><td>the pointer to the byte where the parameter is found </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a358abb6555f6ca6b2b2b1412c9117bec"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a358abb6555f6ca6b2b2b1412c9117bec">&#9670;&nbsp;</a></span>icmp6_time_exceeded()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp6_time_exceeded </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum <a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e">icmp6_te_code</a>&#160;</td>
+          <td class="paramname"><em>c</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an icmpv6 'time exceeded' packet.</p>
+<p>This function must be used only in direct response to a packet that is being received right now. Otherwise, address zones would be lost.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the input packet for which the 'time exceeded' should be sent, p-&gt;payload pointing to the IPv6 header </td></tr>
+    <tr><td class="paramname">c</td><td>ICMPv6 code for the time exceeded type </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ad01e5bc4690a2c6aeb534237a5a9b593"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad01e5bc4690a2c6aeb534237a5a9b593">&#9670;&nbsp;</a></span>icmp6_time_exceeded_with_addrs()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp6_time_exceeded_with_addrs </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum <a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e">icmp6_te_code</a>&#160;</td>
+          <td class="paramname"><em>c</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src_addr</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest_addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an icmpv6 'time exceeded' packet, with explicit source and destination addresses.</p>
+<p>This function may be used to send a response sometime after receiving the packet for which this response is meant. The provided source and destination addresses are used primarily to retain their zone information.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the input packet for which the 'time exceeded' should be sent, p-&gt;payload pointing to the IPv6 header </td></tr>
+    <tr><td class="paramname">c</td><td>ICMPv6 code for the time exceeded type </td></tr>
+    <tr><td class="paramname">src_addr</td><td>source address of the original packet, with zone information </td></tr>
+    <tr><td class="paramname">dest_addr</td><td>destination address of the original packet, with zone information </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="icmp6_8h.html">icmp6.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/icmp6_8h.js b/doc/doxygen/output/html/icmp6_8h.js
new file mode 100644
index 0000000..3332a95
--- /dev/null
+++ b/doc/doxygen/output/html/icmp6_8h.js
@@ -0,0 +1,9 @@
+var icmp6_8h =
+[
+    [ "icmp6_dest_unreach", "icmp6_8h.html#ab480867394952904b5607d62315bdbac", null ],
+    [ "icmp6_input", "icmp6_8h.html#a94bec819e11f51c8088ca338f2e36c3d", null ],
+    [ "icmp6_packet_too_big", "icmp6_8h.html#a3c0a84e0944263d92c9dc3ad094ffcb0", null ],
+    [ "icmp6_param_problem", "icmp6_8h.html#a6094fa333b2cbf1b1b062e72313ef146", null ],
+    [ "icmp6_time_exceeded", "icmp6_8h.html#a358abb6555f6ca6b2b2b1412c9117bec", null ],
+    [ "icmp6_time_exceeded_with_addrs", "icmp6_8h.html#ad01e5bc4690a2c6aeb534237a5a9b593", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/icmp_8c.html b/doc/doxygen/output/html/icmp_8c.html
new file mode 100644
index 0000000..8bbe85e
--- /dev/null
+++ b/doc/doxygen/output/html/icmp_8c.html
@@ -0,0 +1,254 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv4/icmp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('icmp_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">icmp.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 &quot;<a class="el" href="icmp_8h.html">lwip/icmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="inet__chksum_8h.html">lwip/inet_chksum.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.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="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;path/to/my/lwip_hooks.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a6b9fd6be0a7dcf301bc86b9e96e3857e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp_8c.html#a6b9fd6be0a7dcf301bc86b9e96e3857e">LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:a6b9fd6be0a7dcf301bc86b9e96e3857e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac929e48a1dddf98050b73a2633fcaef1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp_8c.html#ac929e48a1dddf98050b73a2633fcaef1">icmp_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:ac929e48a1dddf98050b73a2633fcaef1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae26c59eab4ce553964a0c9d43f534d06"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp_8c.html#ae26c59eab4ce553964a0c9d43f534d06">icmp_dest_unreach</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, enum <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5">icmp_dur_type</a> t)</td></tr>
+<tr class="separator:ae26c59eab4ce553964a0c9d43f534d06"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49723e5e11c4bbc86197e58fdca7c119"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp_8c.html#a49723e5e11c4bbc86197e58fdca7c119">icmp_time_exceeded</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, enum <a class="el" href="icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324a">icmp_te_type</a> t)</td></tr>
+<tr class="separator:a49723e5e11c4bbc86197e58fdca7c119"><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>ICMP - Internet Control Message Protocol </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a6b9fd6be0a7dcf301bc86b9e96e3857e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6b9fd6be0a7dcf301bc86b9e96e3857e">&#9670;&nbsp;</a></span>LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Small optimization: set to 0 if incoming PBUF_POOL pbuf always can be used to modify and send a response packet (and to 1 if this is not the case, e.g. when link header is stripped off when receiving) </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ae26c59eab4ce553964a0c9d43f534d06"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae26c59eab4ce553964a0c9d43f534d06">&#9670;&nbsp;</a></span>icmp_dest_unreach()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp_dest_unreach </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5">icmp_dur_type</a>&#160;</td>
+          <td class="paramname"><em>t</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an icmp 'destination unreachable' packet, called from <a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip_input()</a> if the transport layer protocol is unknown and from <a class="el" href="udp_8c.html#a7b338a5515606bd51976fbc5bcec9611">udp_input()</a> if the local port is not bound.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the input packet for which the 'unreachable' should be sent, p-&gt;payload pointing to the IP header </td></tr>
+    <tr><td class="paramname">t</td><td>type of the 'unreachable' packet </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ac929e48a1dddf98050b73a2633fcaef1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac929e48a1dddf98050b73a2633fcaef1">&#9670;&nbsp;</a></span>icmp_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Processes ICMP input packets, called from <a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip_input()</a>.</p>
+<p>Currently only processes icmp echo requests and sends out the echo response.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the icmp echo request packet, p-&gt;payload pointing to the icmp header </td></tr>
+    <tr><td class="paramname">inp</td><td>the netif on which this packet was received </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a49723e5e11c4bbc86197e58fdca7c119"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a49723e5e11c4bbc86197e58fdca7c119">&#9670;&nbsp;</a></span>icmp_time_exceeded()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp_time_exceeded </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum <a class="el" href="icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324a">icmp_te_type</a>&#160;</td>
+          <td class="paramname"><em>t</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send a 'time exceeded' packet, called from ip_forward() if TTL is 0.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the input packet for which the 'time exceeded' should be sent, p-&gt;payload pointing to the IP header </td></tr>
+    <tr><td class="paramname">t</td><td>type of the 'time exceeded' packet </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_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="icmp_8c.html">icmp.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/icmp_8c.js b/doc/doxygen/output/html/icmp_8c.js
new file mode 100644
index 0000000..955afd5
--- /dev/null
+++ b/doc/doxygen/output/html/icmp_8c.js
@@ -0,0 +1,7 @@
+var icmp_8c =
+[
+    [ "LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN", "icmp_8c.html#a6b9fd6be0a7dcf301bc86b9e96e3857e", null ],
+    [ "icmp_dest_unreach", "icmp_8c.html#ae26c59eab4ce553964a0c9d43f534d06", null ],
+    [ "icmp_input", "icmp_8c.html#ac929e48a1dddf98050b73a2633fcaef1", null ],
+    [ "icmp_time_exceeded", "icmp_8c.html#a49723e5e11c4bbc86197e58fdca7c119", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/icmp_8h.html b/doc/doxygen/output/html/icmp_8h.html
new file mode 100644
index 0000000..d7e7037
--- /dev/null
+++ b/doc/doxygen/output/html/icmp_8h.html
@@ -0,0 +1,300 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/icmp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('icmp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">icmp.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="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 />
+<code>#include &quot;<a class="el" href="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2icmp_8h.html">lwip/prot/icmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="icmp6_8h.html">lwip/icmp6.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:a17637465f209385e5d19ef47fd9266a5"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5">icmp_dur_type</a> { <br />
+&#160;&#160;<a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3cc3714544e123bdef2eadb1a4d320e3">ICMP_DUR_NET</a> = 0, 
+<a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a648ab915a76dfb7b9568e94de00da1e7">ICMP_DUR_HOST</a> = 1, 
+<a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3c7bbd13b613990413ef167017dfbcef">ICMP_DUR_PROTO</a> = 2, 
+<a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5ac973dd9b04e094043ccc4cf875ef5644">ICMP_DUR_PORT</a> = 3, 
+<br />
+&#160;&#160;<a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a8be2bc49d42aa1a6ee1da93a8700ef5f">ICMP_DUR_FRAG</a> = 4, 
+<a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5af63296fc25f79e56946a56a8da132c13">ICMP_DUR_SR</a> = 5
+<br />
+ }</td></tr>
+<tr class="separator:a17637465f209385e5d19ef47fd9266a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a058d0a0769bd38db99fc6fd1dad1324a"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324a">icmp_te_type</a> { <a class="el" href="icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa827a1f8705826a6cc3c22e2571acf02c">ICMP_TE_TTL</a> = 0, 
+<a class="el" href="icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa4d351874c3e2d4a4cf46569df28cd796">ICMP_TE_FRAG</a> = 1
+ }</td></tr>
+<tr class="separator:a058d0a0769bd38db99fc6fd1dad1324a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac929e48a1dddf98050b73a2633fcaef1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp_8h.html#ac929e48a1dddf98050b73a2633fcaef1">icmp_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:ac929e48a1dddf98050b73a2633fcaef1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae26c59eab4ce553964a0c9d43f534d06"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp_8h.html#ae26c59eab4ce553964a0c9d43f534d06">icmp_dest_unreach</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, enum <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5">icmp_dur_type</a> t)</td></tr>
+<tr class="separator:ae26c59eab4ce553964a0c9d43f534d06"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49723e5e11c4bbc86197e58fdca7c119"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="icmp_8h.html#a49723e5e11c4bbc86197e58fdca7c119">icmp_time_exceeded</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, enum <a class="el" href="icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324a">icmp_te_type</a> t)</td></tr>
+<tr class="separator:a49723e5e11c4bbc86197e58fdca7c119"><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>ICMP API </p>
+</div><h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="a17637465f209385e5d19ef47fd9266a5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a17637465f209385e5d19ef47fd9266a5">&#9670;&nbsp;</a></span>icmp_dur_type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5">icmp_dur_type</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ICMP destination unreachable codes </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a17637465f209385e5d19ef47fd9266a5a3cc3714544e123bdef2eadb1a4d320e3"></a>ICMP_DUR_NET&#160;</td><td class="fielddoc"><p>net unreachable </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a17637465f209385e5d19ef47fd9266a5a648ab915a76dfb7b9568e94de00da1e7"></a>ICMP_DUR_HOST&#160;</td><td class="fielddoc"><p>host unreachable </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a17637465f209385e5d19ef47fd9266a5a3c7bbd13b613990413ef167017dfbcef"></a>ICMP_DUR_PROTO&#160;</td><td class="fielddoc"><p>protocol unreachable </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a17637465f209385e5d19ef47fd9266a5ac973dd9b04e094043ccc4cf875ef5644"></a>ICMP_DUR_PORT&#160;</td><td class="fielddoc"><p>port unreachable </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a17637465f209385e5d19ef47fd9266a5a8be2bc49d42aa1a6ee1da93a8700ef5f"></a>ICMP_DUR_FRAG&#160;</td><td class="fielddoc"><p>fragmentation needed and DF set </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a17637465f209385e5d19ef47fd9266a5af63296fc25f79e56946a56a8da132c13"></a>ICMP_DUR_SR&#160;</td><td class="fielddoc"><p>source route failed </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<a id="a058d0a0769bd38db99fc6fd1dad1324a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a058d0a0769bd38db99fc6fd1dad1324a">&#9670;&nbsp;</a></span>icmp_te_type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324a">icmp_te_type</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ICMP time exceeded codes </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a058d0a0769bd38db99fc6fd1dad1324aa827a1f8705826a6cc3c22e2571acf02c"></a>ICMP_TE_TTL&#160;</td><td class="fielddoc"><p>time to live exceeded in transit </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a058d0a0769bd38db99fc6fd1dad1324aa4d351874c3e2d4a4cf46569df28cd796"></a>ICMP_TE_FRAG&#160;</td><td class="fielddoc"><p>fragment reassembly time exceeded </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ae26c59eab4ce553964a0c9d43f534d06"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae26c59eab4ce553964a0c9d43f534d06">&#9670;&nbsp;</a></span>icmp_dest_unreach()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp_dest_unreach </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum <a class="el" href="icmp_8h.html#a17637465f209385e5d19ef47fd9266a5">icmp_dur_type</a>&#160;</td>
+          <td class="paramname"><em>t</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an icmp 'destination unreachable' packet, called from <a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip_input()</a> if the transport layer protocol is unknown and from <a class="el" href="udp_8c.html#a7b338a5515606bd51976fbc5bcec9611">udp_input()</a> if the local port is not bound.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the input packet for which the 'unreachable' should be sent, p-&gt;payload pointing to the IP header </td></tr>
+    <tr><td class="paramname">t</td><td>type of the 'unreachable' packet </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ac929e48a1dddf98050b73a2633fcaef1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac929e48a1dddf98050b73a2633fcaef1">&#9670;&nbsp;</a></span>icmp_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Processes ICMP input packets, called from <a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip_input()</a>.</p>
+<p>Currently only processes icmp echo requests and sends out the echo response.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the icmp echo request packet, p-&gt;payload pointing to the icmp header </td></tr>
+    <tr><td class="paramname">inp</td><td>the netif on which this packet was received </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a49723e5e11c4bbc86197e58fdca7c119"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a49723e5e11c4bbc86197e58fdca7c119">&#9670;&nbsp;</a></span>icmp_time_exceeded()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void icmp_time_exceeded </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum <a class="el" href="icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324a">icmp_te_type</a>&#160;</td>
+          <td class="paramname"><em>t</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send a 'time exceeded' packet, called from ip_forward() if TTL is 0.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the input packet for which the 'time exceeded' should be sent, p-&gt;payload pointing to the IP header </td></tr>
+    <tr><td class="paramname">t</td><td>type of the 'time exceeded' packet </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="icmp_8h.html">icmp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/icmp_8h.js b/doc/doxygen/output/html/icmp_8h.js
new file mode 100644
index 0000000..1a8b1ec
--- /dev/null
+++ b/doc/doxygen/output/html/icmp_8h.js
@@ -0,0 +1,18 @@
+var icmp_8h =
+[
+    [ "icmp_dur_type", "icmp_8h.html#a17637465f209385e5d19ef47fd9266a5", [
+      [ "ICMP_DUR_NET", "icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3cc3714544e123bdef2eadb1a4d320e3", null ],
+      [ "ICMP_DUR_HOST", "icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a648ab915a76dfb7b9568e94de00da1e7", null ],
+      [ "ICMP_DUR_PROTO", "icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3c7bbd13b613990413ef167017dfbcef", null ],
+      [ "ICMP_DUR_PORT", "icmp_8h.html#a17637465f209385e5d19ef47fd9266a5ac973dd9b04e094043ccc4cf875ef5644", null ],
+      [ "ICMP_DUR_FRAG", "icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a8be2bc49d42aa1a6ee1da93a8700ef5f", null ],
+      [ "ICMP_DUR_SR", "icmp_8h.html#a17637465f209385e5d19ef47fd9266a5af63296fc25f79e56946a56a8da132c13", null ]
+    ] ],
+    [ "icmp_te_type", "icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324a", [
+      [ "ICMP_TE_TTL", "icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa827a1f8705826a6cc3c22e2571acf02c", null ],
+      [ "ICMP_TE_FRAG", "icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa4d351874c3e2d4a4cf46569df28cd796", null ]
+    ] ],
+    [ "icmp_dest_unreach", "icmp_8h.html#ae26c59eab4ce553964a0c9d43f534d06", null ],
+    [ "icmp_input", "icmp_8h.html#ac929e48a1dddf98050b73a2633fcaef1", null ],
+    [ "icmp_time_exceeded", "icmp_8h.html#a49723e5e11c4bbc86197e58fdca7c119", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ieee802154_8h.html b/doc/doxygen/output/html/ieee802154_8h.html
new file mode 100644
index 0000000..018686e
--- /dev/null
+++ b/doc/doxygen/output/html/ieee802154_8h.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/netif/ieee802154.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ieee802154_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a>  </div>
+  <div class="headertitle">
+<div class="title">ieee802154.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;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structieee__802154__hdr.html">ieee_802154_hdr</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>
+<div class="textblock"><p>Definitions for IEEE 802.15.4 MAC frames </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_c9a67764bf8a12cf6b427bb859cbcd0b.html">netif</a></li><li class="navelem"><a class="el" href="ieee802154_8h.html">ieee802154.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ieee802154_8h.js b/doc/doxygen/output/html/ieee802154_8h.js
new file mode 100644
index 0000000..f13fd40
--- /dev/null
+++ b/doc/doxygen/output/html/ieee802154_8h.js
@@ -0,0 +1,4 @@
+var ieee802154_8h =
+[
+    [ "ieee_802154_hdr", "structieee__802154__hdr.html", "structieee__802154__hdr" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ieee_8h.html b/doc/doxygen/output/html/ieee_8h.html
new file mode 100644
index 0000000..9c0682d
--- /dev/null
+++ b/doc/doxygen/output/html/ieee_8h.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/ieee.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ieee_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#enum-members">Enumerations</a>  </div>
+  <div class="headertitle">
+<div class="title">ieee.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:gab3a7b97666b100584972d158acbbd1f4"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ieee.html#gab3a7b97666b100584972d158acbbd1f4">lwip_ieee_eth_type</a> { <br />
+&#160;&#160;<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ac95756b20fde70b868ef4185dd221c79">ETHTYPE_IP</a> = 0x0800U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a41217db03576ea59c44b28b248c39be5">ETHTYPE_ARP</a> = 0x0806U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a530a30feb9b87fd993da2bf83776cf9b">ETHTYPE_WOL</a> = 0x0842U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a14292184cb41b279249319896d0e2b1f">ETHTYPE_RARP</a> = 0x8035U, 
+<br />
+&#160;&#160;<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad8f84826d52d92ac24a477d1f03e7903">ETHTYPE_VLAN</a> = 0x8100U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aab26004eed559217be5dd466a79b1383">ETHTYPE_IPV6</a> = 0x86DDU, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a58c6f40d7cc3edb9455762938f3f6569">ETHTYPE_PPPOEDISC</a> = 0x8863U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a8c0e8f68b90134eb4f1f17d3d2eb6f8c">ETHTYPE_PPPOE</a> = 0x8864U, 
+<br />
+&#160;&#160;<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a2511e8a31961bd742363b11b274b9dd1">ETHTYPE_JUMBO</a> = 0x8870U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a889eb8f716238d16ee3408f16a5cf19d">ETHTYPE_PROFINET</a> = 0x8892U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a5085a5fd5f9c9506124e93ea43ad2d7c">ETHTYPE_ETHERCAT</a> = 0x88A4U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a02eab0dd87f222a2d555ca38b1b8afcc">ETHTYPE_LLDP</a> = 0x88CCU, 
+<br />
+&#160;&#160;<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ab93419f8edf5692e91629ab92fce8a14">ETHTYPE_SERCOS</a> = 0x88CDU, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad36caec44d8db59ff433a8bd3e92ad3e">ETHTYPE_MRP</a> = 0x88E3U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aa3e9e834eef932d073028e28eb8793dc">ETHTYPE_PTP</a> = 0x88F7U, 
+<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a39a18006412cbb57536535bd9d378394">ETHTYPE_QINQ</a> = 0x9100U
+<br />
+ }</td></tr>
+<tr class="separator:gab3a7b97666b100584972d158acbbd1f4"><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>IEEE assigned numbers </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="ieee_8h.html">ieee.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ieee_8h.js b/doc/doxygen/output/html/ieee_8h.js
new file mode 100644
index 0000000..483eff4
--- /dev/null
+++ b/doc/doxygen/output/html/ieee_8h.js
@@ -0,0 +1,21 @@
+var ieee_8h =
+[
+    [ "lwip_ieee_eth_type", "group__ieee.html#gab3a7b97666b100584972d158acbbd1f4", [
+      [ "ETHTYPE_IP", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ac95756b20fde70b868ef4185dd221c79", null ],
+      [ "ETHTYPE_ARP", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a41217db03576ea59c44b28b248c39be5", null ],
+      [ "ETHTYPE_WOL", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a530a30feb9b87fd993da2bf83776cf9b", null ],
+      [ "ETHTYPE_RARP", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a14292184cb41b279249319896d0e2b1f", null ],
+      [ "ETHTYPE_VLAN", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad8f84826d52d92ac24a477d1f03e7903", null ],
+      [ "ETHTYPE_IPV6", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aab26004eed559217be5dd466a79b1383", null ],
+      [ "ETHTYPE_PPPOEDISC", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a58c6f40d7cc3edb9455762938f3f6569", null ],
+      [ "ETHTYPE_PPPOE", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a8c0e8f68b90134eb4f1f17d3d2eb6f8c", null ],
+      [ "ETHTYPE_JUMBO", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a2511e8a31961bd742363b11b274b9dd1", null ],
+      [ "ETHTYPE_PROFINET", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a889eb8f716238d16ee3408f16a5cf19d", null ],
+      [ "ETHTYPE_ETHERCAT", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a5085a5fd5f9c9506124e93ea43ad2d7c", null ],
+      [ "ETHTYPE_LLDP", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a02eab0dd87f222a2d555ca38b1b8afcc", null ],
+      [ "ETHTYPE_SERCOS", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ab93419f8edf5692e91629ab92fce8a14", null ],
+      [ "ETHTYPE_MRP", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad36caec44d8db59ff433a8bd3e92ad3e", null ],
+      [ "ETHTYPE_PTP", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aa3e9e834eef932d073028e28eb8793dc", null ],
+      [ "ETHTYPE_QINQ", "group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a39a18006412cbb57536535bd9d378394", null ]
+    ] ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/if_8h.html b/doc/doxygen/output/html/if_8h.html
new file mode 100644
index 0000000..daeca56
--- /dev/null
+++ b/doc/doxygen/output/html/if_8h.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/compat/posix/net/if.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('if_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">if.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="if__api_8h.html">lwip/if_api.h</a>&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is a posix wrapper for <a class="el" href="if__api_8h.html">lwip/if_api.h</a>. </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_1e445e767c368c70d58af8a0b7552719.html">compat</a></li><li class="navelem"><a class="el" href="dir_fe219fca207b878205c0dd92278d118b.html">posix</a></li><li class="navelem"><a class="el" href="dir_c62aba36f6630fea5cd7fe1c941850d4.html">net</a></li><li class="navelem"><a class="el" href="if_8h.html">if.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/if__api_8c.html b/doc/doxygen/output/html/if__api_8c.html
new file mode 100644
index 0000000..239431d
--- /dev/null
+++ b/doc/doxygen/output/html/if__api_8c.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/api/if_api.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('if__api_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">if_api.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 &quot;<a class="el" href="lwip_2errno_8h.html">lwip/errno.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="if__api_8h.html">lwip/if_api.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="netifapi_8h.html">lwip/netifapi.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="sockets__priv_8h.html">lwip/priv/sockets_priv.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gac68ad9ef70eb869525e0a1cc818f056b"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__if__api.html#gac68ad9ef70eb869525e0a1cc818f056b">lwip_if_indextoname</a> (unsigned int ifindex, char *ifname)</td></tr>
+<tr class="separator:gac68ad9ef70eb869525e0a1cc818f056b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga76d07962b9d19c3c6f578de780e2c3be"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be">lwip_if_nametoindex</a> (const char *ifname)</td></tr>
+<tr class="separator:ga76d07962b9d19c3c6f578de780e2c3be"><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>Interface Identification APIs from: RFC 3493: Basic Socket Interface Extensions for IPv6 Section 4: Interface Identification </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_da61e3e9a357748887e3ca8d7c5a0c16.html">api</a></li><li class="navelem"><a class="el" href="if__api_8c.html">if_api.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/if__api_8c.js b/doc/doxygen/output/html/if__api_8c.js
new file mode 100644
index 0000000..41608db
--- /dev/null
+++ b/doc/doxygen/output/html/if__api_8c.js
@@ -0,0 +1,5 @@
+var if__api_8c =
+[
+    [ "lwip_if_indextoname", "group__if__api.html#gac68ad9ef70eb869525e0a1cc818f056b", null ],
+    [ "lwip_if_nametoindex", "group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/if__api_8h.html b/doc/doxygen/output/html/if__api_8h.html
new file mode 100644
index 0000000..51a7b1a
--- /dev/null
+++ b/doc/doxygen/output/html/if__api_8h.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/if_api.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('if__api_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">if_api.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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gac68ad9ef70eb869525e0a1cc818f056b"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__if__api.html#gac68ad9ef70eb869525e0a1cc818f056b">lwip_if_indextoname</a> (unsigned int ifindex, char *ifname)</td></tr>
+<tr class="separator:gac68ad9ef70eb869525e0a1cc818f056b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga76d07962b9d19c3c6f578de780e2c3be"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be">lwip_if_nametoindex</a> (const char *ifname)</td></tr>
+<tr class="separator:ga76d07962b9d19c3c6f578de780e2c3be"><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>Interface Identification APIs from: RFC 3493: Basic Socket Interface Extensions for IPv6 Section 4: Interface Identification </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="if__api_8h.html">if_api.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/if__api_8h.js b/doc/doxygen/output/html/if__api_8h.js
new file mode 100644
index 0000000..b1ff690
--- /dev/null
+++ b/doc/doxygen/output/html/if__api_8h.js
@@ -0,0 +1,5 @@
+var if__api_8h =
+[
+    [ "lwip_if_indextoname", "group__if__api.html#gac68ad9ef70eb869525e0a1cc818f056b", null ],
+    [ "lwip_if_nametoindex", "group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/igmp_8c.html b/doc/doxygen/output/html/igmp_8c.html
new file mode 100644
index 0000000..f1acc75
--- /dev/null
+++ b/doc/doxygen/output/html/igmp_8c.html
@@ -0,0 +1,335 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv4/igmp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('igmp_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">igmp.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 &quot;<a class="el" href="igmp_8h.html">lwip/igmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="debug_8h.html">lwip/debug.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="mem_8h.html">lwip/mem.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="inet__chksum_8h.html">lwip/inet_chksum.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="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2igmp_8h.html">lwip/prot/igmp.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aeb8103aa3091e35c966f0894fb54a2c8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="igmp_8c.html#aeb8103aa3091e35c966f0894fb54a2c8">igmp_init</a> (void)</td></tr>
+<tr class="separator:aeb8103aa3091e35c966f0894fb54a2c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aac0fe91a589ba90b3f76e69cebf264f6"><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="igmp_8c.html#aac0fe91a589ba90b3f76e69cebf264f6">igmp_start</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:aac0fe91a589ba90b3f76e69cebf264f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc19bd532855a64c021be08172065f84"><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="igmp_8c.html#afc19bd532855a64c021be08172065f84">igmp_stop</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:afc19bd532855a64c021be08172065f84"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af06eeba0e984aab4a67a836eab577726"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="igmp_8c.html#af06eeba0e984aab4a67a836eab577726">igmp_report_groups</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:af06eeba0e984aab4a67a836eab577726"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8228ddd10aa3f2518b16815d82d73448"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structigmp__group.html">igmp_group</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="igmp_8c.html#a8228ddd10aa3f2518b16815d82d73448">igmp_lookfor_group</a> (struct <a class="el" href="structnetif.html">netif</a> *ifp, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *addr)</td></tr>
+<tr class="separator:a8228ddd10aa3f2518b16815d82d73448"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a065685cc25f2cc50f0d9659f4b086e1a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="igmp_8c.html#a065685cc25f2cc50f0d9659f4b086e1a">igmp_input</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, struct <a class="el" href="structnetif.html">netif</a> *inp, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest)</td></tr>
+<tr class="separator:a065685cc25f2cc50f0d9659f4b086e1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac989949e9cf84dbd08ab071854bd1ba6"><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__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6">igmp_joingroup</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ifaddr, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:gac989949e9cf84dbd08ab071854bd1ba6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7a6d36dd7b4c8a8c2790c0eac53b49d6"><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__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6">igmp_joingroup_netif</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> *groupaddr)</td></tr>
+<tr class="separator:ga7a6d36dd7b4c8a8c2790c0eac53b49d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga21c572ba7481ca41eb873923a5346544"><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__igmp.html#ga21c572ba7481ca41eb873923a5346544">igmp_leavegroup</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ifaddr, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:ga21c572ba7481ca41eb873923a5346544"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga651bec2a5f3a24766c52aa86a5d88201"><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__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201">igmp_leavegroup_netif</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> *groupaddr)</td></tr>
+<tr class="separator:ga651bec2a5f3a24766c52aa86a5d88201"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4418a22d37098f05d0c2fcfe288d0ca1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="igmp_8c.html#a4418a22d37098f05d0c2fcfe288d0ca1">igmp_tmr</a> (void)</td></tr>
+<tr class="separator:a4418a22d37098f05d0c2fcfe288d0ca1"><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>IGMP - Internet Group Management Protocol </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="aeb8103aa3091e35c966f0894fb54a2c8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeb8103aa3091e35c966f0894fb54a2c8">&#9670;&nbsp;</a></span>igmp_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void igmp_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize the IGMP module </p>
+
+</div>
+</div>
+<a id="a065685cc25f2cc50f0d9659f4b086e1a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a065685cc25f2cc50f0d9659f4b086e1a">&#9670;&nbsp;</a></span>igmp_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void igmp_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called from <a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip_input()</a> if a new IGMP packet is received.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>received igmp packet, p-&gt;payload pointing to the igmp header </td></tr>
+    <tr><td class="paramname">inp</td><td>network interface on which the packet was received </td></tr>
+    <tr><td class="paramname">dest</td><td>destination ip address of the igmp packet </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a8228ddd10aa3f2518b16815d82d73448"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8228ddd10aa3f2518b16815d82d73448">&#9670;&nbsp;</a></span>igmp_lookfor_group()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structigmp__group.html">igmp_group</a>* igmp_lookfor_group </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>ifp</em>, </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> *&#160;</td>
+          <td class="paramname"><em>addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Search for a group in the netif's igmp group list</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ifp</td><td>the network interface for which to look </td></tr>
+    <tr><td class="paramname">addr</td><td>the group ip address to search for </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a struct igmp_group* if the group has been found, NULL if the group wasn't found. </dd></dl>
+
+</div>
+</div>
+<a id="af06eeba0e984aab4a67a836eab577726"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af06eeba0e984aab4a67a836eab577726">&#9670;&nbsp;</a></span>igmp_report_groups()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void igmp_report_groups </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Report IGMP memberships for this interface</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface on which report IGMP memberships </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aac0fe91a589ba90b3f76e69cebf264f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aac0fe91a589ba90b3f76e69cebf264f6">&#9670;&nbsp;</a></span>igmp_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> igmp_start </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Start IGMP processing on interface</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface on which start IGMP processing </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="afc19bd532855a64c021be08172065f84"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afc19bd532855a64c021be08172065f84">&#9670;&nbsp;</a></span>igmp_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> igmp_stop </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Stop IGMP processing on interface</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface on which stop IGMP processing </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a4418a22d37098f05d0c2fcfe288d0ca1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4418a22d37098f05d0c2fcfe288d0ca1">&#9670;&nbsp;</a></span>igmp_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void igmp_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The igmp timer function (both for NO_SYS=1 and =0) Should be called every IGMP_TMR_INTERVAL milliseconds (100 ms is default). </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="igmp_8c.html">igmp.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/igmp_8c.js b/doc/doxygen/output/html/igmp_8c.js
new file mode 100644
index 0000000..4d7e4c4
--- /dev/null
+++ b/doc/doxygen/output/html/igmp_8c.js
@@ -0,0 +1,14 @@
+var igmp_8c =
+[
+    [ "igmp_init", "igmp_8c.html#aeb8103aa3091e35c966f0894fb54a2c8", null ],
+    [ "igmp_input", "igmp_8c.html#a065685cc25f2cc50f0d9659f4b086e1a", null ],
+    [ "igmp_joingroup", "group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6", null ],
+    [ "igmp_joingroup_netif", "group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6", null ],
+    [ "igmp_leavegroup", "group__igmp.html#ga21c572ba7481ca41eb873923a5346544", null ],
+    [ "igmp_leavegroup_netif", "group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201", null ],
+    [ "igmp_lookfor_group", "igmp_8c.html#a8228ddd10aa3f2518b16815d82d73448", null ],
+    [ "igmp_report_groups", "igmp_8c.html#af06eeba0e984aab4a67a836eab577726", null ],
+    [ "igmp_start", "igmp_8c.html#aac0fe91a589ba90b3f76e69cebf264f6", null ],
+    [ "igmp_stop", "igmp_8c.html#afc19bd532855a64c021be08172065f84", null ],
+    [ "igmp_tmr", "igmp_8c.html#a4418a22d37098f05d0c2fcfe288d0ca1", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/igmp_8h.html b/doc/doxygen/output/html/igmp_8h.html
new file mode 100644
index 0000000..5ef4fb5
--- /dev/null
+++ b/doc/doxygen/output/html/igmp_8h.html
@@ -0,0 +1,340 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/igmp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('igmp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">igmp.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="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="pbuf_8h.html">lwip/pbuf.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structigmp__group.html">igmp_group</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gad990dfc5ed8b644c16cc578c876e588d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__igmp.html#gad990dfc5ed8b644c16cc578c876e588d">netif_igmp_data</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;((struct <a class="el" href="structigmp__group.html">igmp_group</a> *)<a class="el" href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a>(<a class="el" href="structnetif.html">netif</a>, LWIP_NETIF_CLIENT_DATA_INDEX_IGMP))</td></tr>
+<tr class="separator:gad990dfc5ed8b644c16cc578c876e588d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aeb8103aa3091e35c966f0894fb54a2c8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="igmp_8h.html#aeb8103aa3091e35c966f0894fb54a2c8">igmp_init</a> (void)</td></tr>
+<tr class="separator:aeb8103aa3091e35c966f0894fb54a2c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aac0fe91a589ba90b3f76e69cebf264f6"><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="igmp_8h.html#aac0fe91a589ba90b3f76e69cebf264f6">igmp_start</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:aac0fe91a589ba90b3f76e69cebf264f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc19bd532855a64c021be08172065f84"><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="igmp_8h.html#afc19bd532855a64c021be08172065f84">igmp_stop</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:afc19bd532855a64c021be08172065f84"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af06eeba0e984aab4a67a836eab577726"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="igmp_8h.html#af06eeba0e984aab4a67a836eab577726">igmp_report_groups</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:af06eeba0e984aab4a67a836eab577726"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8228ddd10aa3f2518b16815d82d73448"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structigmp__group.html">igmp_group</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="igmp_8h.html#a8228ddd10aa3f2518b16815d82d73448">igmp_lookfor_group</a> (struct <a class="el" href="structnetif.html">netif</a> *ifp, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *addr)</td></tr>
+<tr class="separator:a8228ddd10aa3f2518b16815d82d73448"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a065685cc25f2cc50f0d9659f4b086e1a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="igmp_8h.html#a065685cc25f2cc50f0d9659f4b086e1a">igmp_input</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, struct <a class="el" href="structnetif.html">netif</a> *inp, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest)</td></tr>
+<tr class="separator:a065685cc25f2cc50f0d9659f4b086e1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac989949e9cf84dbd08ab071854bd1ba6"><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__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6">igmp_joingroup</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ifaddr, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:gac989949e9cf84dbd08ab071854bd1ba6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7a6d36dd7b4c8a8c2790c0eac53b49d6"><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__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6">igmp_joingroup_netif</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> *groupaddr)</td></tr>
+<tr class="separator:ga7a6d36dd7b4c8a8c2790c0eac53b49d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga21c572ba7481ca41eb873923a5346544"><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__igmp.html#ga21c572ba7481ca41eb873923a5346544">igmp_leavegroup</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ifaddr, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:ga21c572ba7481ca41eb873923a5346544"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga651bec2a5f3a24766c52aa86a5d88201"><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__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201">igmp_leavegroup_netif</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> *groupaddr)</td></tr>
+<tr class="separator:ga651bec2a5f3a24766c52aa86a5d88201"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4418a22d37098f05d0c2fcfe288d0ca1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="igmp_8h.html#a4418a22d37098f05d0c2fcfe288d0ca1">igmp_tmr</a> (void)</td></tr>
+<tr class="separator:a4418a22d37098f05d0c2fcfe288d0ca1"><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>IGMP API </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="aeb8103aa3091e35c966f0894fb54a2c8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeb8103aa3091e35c966f0894fb54a2c8">&#9670;&nbsp;</a></span>igmp_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void igmp_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize the IGMP module </p>
+
+</div>
+</div>
+<a id="a065685cc25f2cc50f0d9659f4b086e1a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a065685cc25f2cc50f0d9659f4b086e1a">&#9670;&nbsp;</a></span>igmp_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void igmp_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called from <a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip_input()</a> if a new IGMP packet is received.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>received igmp packet, p-&gt;payload pointing to the igmp header </td></tr>
+    <tr><td class="paramname">inp</td><td>network interface on which the packet was received </td></tr>
+    <tr><td class="paramname">dest</td><td>destination ip address of the igmp packet </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a8228ddd10aa3f2518b16815d82d73448"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8228ddd10aa3f2518b16815d82d73448">&#9670;&nbsp;</a></span>igmp_lookfor_group()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structigmp__group.html">igmp_group</a>* igmp_lookfor_group </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>ifp</em>, </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> *&#160;</td>
+          <td class="paramname"><em>addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Search for a group in the netif's igmp group list</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ifp</td><td>the network interface for which to look </td></tr>
+    <tr><td class="paramname">addr</td><td>the group ip address to search for </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a struct igmp_group* if the group has been found, NULL if the group wasn't found. </dd></dl>
+
+</div>
+</div>
+<a id="af06eeba0e984aab4a67a836eab577726"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af06eeba0e984aab4a67a836eab577726">&#9670;&nbsp;</a></span>igmp_report_groups()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void igmp_report_groups </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Report IGMP memberships for this interface</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface on which report IGMP memberships </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aac0fe91a589ba90b3f76e69cebf264f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aac0fe91a589ba90b3f76e69cebf264f6">&#9670;&nbsp;</a></span>igmp_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> igmp_start </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Start IGMP processing on interface</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface on which start IGMP processing </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="afc19bd532855a64c021be08172065f84"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afc19bd532855a64c021be08172065f84">&#9670;&nbsp;</a></span>igmp_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> igmp_stop </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Stop IGMP processing on interface</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface on which stop IGMP processing </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a4418a22d37098f05d0c2fcfe288d0ca1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4418a22d37098f05d0c2fcfe288d0ca1">&#9670;&nbsp;</a></span>igmp_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void igmp_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The igmp timer function (both for NO_SYS=1 and =0) Should be called every IGMP_TMR_INTERVAL milliseconds (100 ms is default). </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="igmp_8h.html">igmp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/igmp_8h.js b/doc/doxygen/output/html/igmp_8h.js
new file mode 100644
index 0000000..ccc92ef
--- /dev/null
+++ b/doc/doxygen/output/html/igmp_8h.js
@@ -0,0 +1,16 @@
+var igmp_8h =
+[
+    [ "igmp_group", "structigmp__group.html", "structigmp__group" ],
+    [ "netif_igmp_data", "group__igmp.html#gad990dfc5ed8b644c16cc578c876e588d", null ],
+    [ "igmp_init", "igmp_8h.html#aeb8103aa3091e35c966f0894fb54a2c8", null ],
+    [ "igmp_input", "igmp_8h.html#a065685cc25f2cc50f0d9659f4b086e1a", null ],
+    [ "igmp_joingroup", "group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6", null ],
+    [ "igmp_joingroup_netif", "group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6", null ],
+    [ "igmp_leavegroup", "group__igmp.html#ga21c572ba7481ca41eb873923a5346544", null ],
+    [ "igmp_leavegroup_netif", "group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201", null ],
+    [ "igmp_lookfor_group", "igmp_8h.html#a8228ddd10aa3f2518b16815d82d73448", null ],
+    [ "igmp_report_groups", "igmp_8h.html#af06eeba0e984aab4a67a836eab577726", null ],
+    [ "igmp_start", "igmp_8h.html#aac0fe91a589ba90b3f76e69cebf264f6", null ],
+    [ "igmp_stop", "igmp_8h.html#afc19bd532855a64c021be08172065f84", null ],
+    [ "igmp_tmr", "igmp_8h.html#a4418a22d37098f05d0c2fcfe288d0ca1", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/index.html b/doc/doxygen/output/html/index.html
new file mode 100644
index 0000000..0c719fe
--- /dev/null
+++ b/doc/doxygen/output/html/index.html
@@ -0,0 +1,205 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Overview</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('index.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">Overview </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><pre class="fragment">INTRODUCTION
+
+lwIP is a small independent implementation of the TCP/IP protocol suite.
+
+The focus of the lwIP TCP/IP implementation is to reduce the RAM usage
+while still having a full scale TCP. This making lwIP suitable for use
+in embedded systems with tens of kilobytes of free RAM and room for
+around 40 kilobytes of code ROM.
+
+lwIP was originally developed by Adam Dunkels at the Computer and Networks
+Architectures (CNA) lab at the Swedish Institute of Computer Science (SICS)
+and is now developed and maintained by a worldwide network of developers.
+
+FEATURES
+
+  * IP (Internet Protocol, IPv4 and IPv6) including packet forwarding over
+    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 
+    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
+  * 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
+  * raw/native API for enhanced performance
+  * Optional Berkeley-like socket API
+  * TLS: optional layered TCP ("altcp") for nearly transparent TLS for any
+    TCP-based protocol (ported to mbedTLS) (see changelog for more info)
+  * PPPoS and PPPoE (Point-to-point protocol over Serial/Ethernet)
+  * DNS (Domain name resolver incl. mDNS)
+  * 6LoWPAN (via IEEE 802.15.4, BLE or ZEP)
+
+
+APPLICATIONS
+
+  * HTTP server with SSI and CGI (HTTPS via altcp)
+  * SNMPv2c agent with MIB compiler (Simple Network Management Protocol), v3 via altcp
+  * SNTP (Simple network time protocol)
+  * NetBIOS name service responder
+  * MDNS (Multicast DNS) responder
+  * iPerf server implementation
+  * MQTT client (TLS support via altcp)
+
+
+LICENSE
+
+lwIP is freely available under a BSD license.
+
+
+DEVELOPMENT
+
+lwIP has grown into an excellent TCP/IP stack for embedded devices,
+and developers using the stack often submit bug fixes, improvements,
+and additions to the stack to further increase its usefulness.
+
+Development of lwIP is hosted on Savannah, a central point for
+software development, maintenance and distribution. Everyone can
+help improve lwIP by use of Savannah's interface, Git and the
+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.
+
+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
+
+Submit patches and bugs via the lwIP project page:
+  http://savannah.nongnu.org/projects/lwip/
+
+Continuous integration builds (GCC, clang):
+  https://travis-ci.org/yarrick/lwip-merged
+
+
+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
+
+Also, there are mailing lists you can subscribe at
+  http://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/
+
+lwIP was originally written by Adam Dunkels:
+  http://dunkels.com/adam/
+
+Reading Adam's papers, the files in docs/, browsing the source code
+documentation and browsing the mailing list archives is a good way to
+become familiar with the design of lwIP.
+
+Adam Dunkels &lt;adam@sics.se&gt;
+Leon Woestenberg &lt;leon.woestenberg@gmx.net&gt;
+</pre> </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/inet6_8c.html b/doc/doxygen/output/html/inet6_8c.html
new file mode 100644
index 0000000..7f8dc0b
--- /dev/null
+++ b/doc/doxygen/output/html/inet6_8c.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv6/inet6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('inet6_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">inet6.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 &quot;<a class="el" href="def_8h.html">lwip/def.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="lwip_2inet_8h.html">lwip/inet.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:af8c97553060738d9edd6bfeab13ef7c3"><td class="memItemLeft" align="right" valign="top">const struct in6_addr&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="inet6_8c.html#af8c97553060738d9edd6bfeab13ef7c3">in6addr_any</a> = {{{0,0,0,0}}}</td></tr>
+<tr class="separator:af8c97553060738d9edd6bfeab13ef7c3"><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>INET v6 addresses. </p>
+</div><h2 class="groupheader">Variable Documentation</h2>
+<a id="af8c97553060738d9edd6bfeab13ef7c3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af8c97553060738d9edd6bfeab13ef7c3">&#9670;&nbsp;</a></span>in6addr_any</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const struct in6_addr in6addr_any = {{{0,0,0,0}}}</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This variable is initialized by the system to contain the wildcard IPv6 address. </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_da9c6f43d3cd00be3de224bac907a425.html">ipv6</a></li><li class="navelem"><a class="el" href="inet6_8c.html">inet6.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/inet6_8c.js b/doc/doxygen/output/html/inet6_8c.js
new file mode 100644
index 0000000..005cc21
--- /dev/null
+++ b/doc/doxygen/output/html/inet6_8c.js
@@ -0,0 +1,4 @@
+var inet6_8c =
+[
+    [ "in6addr_any", "inet6_8c.html#af8c97553060738d9edd6bfeab13ef7c3", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/inet__chksum_8c.html b/doc/doxygen/output/html/inet__chksum_8c.html
new file mode 100644
index 0000000..2d3f9c7
--- /dev/null
+++ b/doc/doxygen/output/html/inet__chksum_8c.html
@@ -0,0 +1,272 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/inet_chksum.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('inet__chksum_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">inet_chksum.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 &quot;<a class="el" href="inet__chksum_8h.html">lwip/inet_chksum.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="ip__addr_8h.html">lwip/ip_addr.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a102544bca5912c78649e25a45a7d0a88"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="inet__chksum_8c.html#a102544bca5912c78649e25a45a7d0a88">ip6_chksum_pseudo</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u8_t proto, u16_t proto_len, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *src, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest)</td></tr>
+<tr class="separator:a102544bca5912c78649e25a45a7d0a88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4218e08510fd92c9a699c4e5d9fc17b"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="inet__chksum_8c.html#ae4218e08510fd92c9a699c4e5d9fc17b">ip6_chksum_pseudo_partial</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u8_t proto, u16_t proto_len, u16_t chksum_len, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *src, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest)</td></tr>
+<tr class="separator:ae4218e08510fd92c9a699c4e5d9fc17b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab35967a50418358e194e8f80fdc3c865"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="inet__chksum_8c.html#ab35967a50418358e194e8f80fdc3c865">inet_chksum_pbuf</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<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>
+<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>
+<a id="ab35967a50418358e194e8f80fdc3c865"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab35967a50418358e194e8f80fdc3c865">&#9670;&nbsp;</a></span>inet_chksum_pbuf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t inet_chksum_pbuf </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Calculate a checksum over a chain of pbufs (without pseudo-header, much like inet_chksum only pbufs are used).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf chain over that the checksum should be calculated </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>checksum (as u16_t) to be saved directly in the protocol header </dd></dl>
+
+</div>
+</div>
+<a id="a102544bca5912c78649e25a45a7d0a88"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a102544bca5912c78649e25a45a7d0a88">&#9670;&nbsp;</a></span>ip6_chksum_pseudo()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t ip6_chksum_pseudo </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>proto_len</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Calculates the checksum with IPv6 pseudo header used by TCP and UDP for a pbuf chain. IPv6 addresses are expected to be in network byte order.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>chain of pbufs over that a checksum should be calculated (ip data part) </td></tr>
+    <tr><td class="paramname">proto</td><td>ipv6 protocol/next header (used for checksum of pseudo header) </td></tr>
+    <tr><td class="paramname">proto_len</td><td>length of the ipv6 payload (used for checksum of pseudo header) </td></tr>
+    <tr><td class="paramname">src</td><td>source ipv6 address (used for checksum of pseudo header) </td></tr>
+    <tr><td class="paramname">dest</td><td>destination ipv6 address (used for checksum of pseudo header) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>checksum (as u16_t) to be saved directly in the protocol header </dd></dl>
+
+</div>
+</div>
+<a id="ae4218e08510fd92c9a699c4e5d9fc17b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae4218e08510fd92c9a699c4e5d9fc17b">&#9670;&nbsp;</a></span>ip6_chksum_pseudo_partial()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t ip6_chksum_pseudo_partial </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>proto_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>chksum_len</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Calculates the checksum with IPv6 pseudo header used by TCP and UDP for a pbuf chain. IPv6 addresses are expected to be in network byte order. Will only compute for a portion of the payload.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>chain of pbufs over that a checksum should be calculated (ip data part) </td></tr>
+    <tr><td class="paramname">proto</td><td>ipv6 protocol/next header (used for checksum of pseudo header) </td></tr>
+    <tr><td class="paramname">proto_len</td><td>length of the ipv6 payload (used for checksum of pseudo header) </td></tr>
+    <tr><td class="paramname">chksum_len</td><td>number of payload bytes used to compute chksum </td></tr>
+    <tr><td class="paramname">src</td><td>source ipv6 address (used for checksum of pseudo header) </td></tr>
+    <tr><td class="paramname">dest</td><td>destination ipv6 address (used for checksum of pseudo header) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>checksum (as u16_t) to be saved directly in the protocol header </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_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li><li class="navelem"><a class="el" href="inet__chksum_8c.html">inet_chksum.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/inet__chksum_8c.js b/doc/doxygen/output/html/inet__chksum_8c.js
new file mode 100644
index 0000000..a1aa888
--- /dev/null
+++ b/doc/doxygen/output/html/inet__chksum_8c.js
@@ -0,0 +1,6 @@
+var inet__chksum_8c =
+[
+    [ "inet_chksum_pbuf", "inet__chksum_8c.html#ab35967a50418358e194e8f80fdc3c865", null ],
+    [ "ip6_chksum_pseudo", "inet__chksum_8c.html#a102544bca5912c78649e25a45a7d0a88", null ],
+    [ "ip6_chksum_pseudo_partial", "inet__chksum_8c.html#ae4218e08510fd92c9a699c4e5d9fc17b", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/inet__chksum_8h.html b/doc/doxygen/output/html/inet__chksum_8h.html
new file mode 100644
index 0000000..5cf65a9
--- /dev/null
+++ b/doc/doxygen/output/html/inet__chksum_8h.html
@@ -0,0 +1,314 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/inet_chksum.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('inet__chksum_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">inet_chksum.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="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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a0196bd603262882d16b5264b52eafe18"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="inet__chksum_8h.html#a0196bd603262882d16b5264b52eafe18">SWAP_BYTES_IN_WORD</a>(w)&#160;&#160;&#160;(((w) &amp; 0xff) &lt;&lt; 8) | (((w) &amp; 0xff00) &gt;&gt; 8)</td></tr>
+<tr class="separator:a0196bd603262882d16b5264b52eafe18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6ffe83b4bdd1784a0671ee4778966a01"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="inet__chksum_8h.html#a6ffe83b4bdd1784a0671ee4778966a01">FOLD_U32T</a>(u)&#160;&#160;&#160;((u32_t)(((u) &gt;&gt; 16) + ((u) &amp; 0x0000ffffUL)))</td></tr>
+<tr class="separator:a6ffe83b4bdd1784a0671ee4778966a01"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab35967a50418358e194e8f80fdc3c865"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="inet__chksum_8h.html#ab35967a50418358e194e8f80fdc3c865">inet_chksum_pbuf</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:ab35967a50418358e194e8f80fdc3c865"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a102544bca5912c78649e25a45a7d0a88"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="inet__chksum_8h.html#a102544bca5912c78649e25a45a7d0a88">ip6_chksum_pseudo</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u8_t proto, u16_t proto_len, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *src, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest)</td></tr>
+<tr class="separator:a102544bca5912c78649e25a45a7d0a88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4218e08510fd92c9a699c4e5d9fc17b"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="inet__chksum_8h.html#ae4218e08510fd92c9a699c4e5d9fc17b">ip6_chksum_pseudo_partial</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u8_t proto, u16_t proto_len, u16_t chksum_len, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *src, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest)</td></tr>
+<tr class="separator:ae4218e08510fd92c9a699c4e5d9fc17b"><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>IP checksum calculation functions </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a6ffe83b4bdd1784a0671ee4778966a01"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6ffe83b4bdd1784a0671ee4778966a01">&#9670;&nbsp;</a></span>FOLD_U32T</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define FOLD_U32T</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">u</td><td>)</td>
+          <td>&#160;&#160;&#160;((u32_t)(((u) &gt;&gt; 16) + ((u) &amp; 0x0000ffffUL)))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Split an u32_t in two u16_ts and add them up </p>
+
+</div>
+</div>
+<a id="a0196bd603262882d16b5264b52eafe18"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0196bd603262882d16b5264b52eafe18">&#9670;&nbsp;</a></span>SWAP_BYTES_IN_WORD</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SWAP_BYTES_IN_WORD</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">w</td><td>)</td>
+          <td>&#160;&#160;&#160;(((w) &amp; 0xff) &lt;&lt; 8) | (((w) &amp; 0xff00) &gt;&gt; 8)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Swap the bytes in an u16_t: much like <a class="el" href="def_8c.html#ad637280639de4066392e6b5614fa3e56">lwip_htons()</a> for little-endian </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ab35967a50418358e194e8f80fdc3c865"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab35967a50418358e194e8f80fdc3c865">&#9670;&nbsp;</a></span>inet_chksum_pbuf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t inet_chksum_pbuf </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Calculate a checksum over a chain of pbufs (without pseudo-header, much like inet_chksum only pbufs are used).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf chain over that the checksum should be calculated </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>checksum (as u16_t) to be saved directly in the protocol header </dd></dl>
+
+</div>
+</div>
+<a id="a102544bca5912c78649e25a45a7d0a88"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a102544bca5912c78649e25a45a7d0a88">&#9670;&nbsp;</a></span>ip6_chksum_pseudo()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t ip6_chksum_pseudo </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>proto_len</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Calculates the checksum with IPv6 pseudo header used by TCP and UDP for a pbuf chain. IPv6 addresses are expected to be in network byte order.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>chain of pbufs over that a checksum should be calculated (ip data part) </td></tr>
+    <tr><td class="paramname">proto</td><td>ipv6 protocol/next header (used for checksum of pseudo header) </td></tr>
+    <tr><td class="paramname">proto_len</td><td>length of the ipv6 payload (used for checksum of pseudo header) </td></tr>
+    <tr><td class="paramname">src</td><td>source ipv6 address (used for checksum of pseudo header) </td></tr>
+    <tr><td class="paramname">dest</td><td>destination ipv6 address (used for checksum of pseudo header) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>checksum (as u16_t) to be saved directly in the protocol header </dd></dl>
+
+</div>
+</div>
+<a id="ae4218e08510fd92c9a699c4e5d9fc17b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae4218e08510fd92c9a699c4e5d9fc17b">&#9670;&nbsp;</a></span>ip6_chksum_pseudo_partial()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t ip6_chksum_pseudo_partial </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>proto_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>chksum_len</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Calculates the checksum with IPv6 pseudo header used by TCP and UDP for a pbuf chain. IPv6 addresses are expected to be in network byte order. Will only compute for a portion of the payload.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>chain of pbufs over that a checksum should be calculated (ip data part) </td></tr>
+    <tr><td class="paramname">proto</td><td>ipv6 protocol/next header (used for checksum of pseudo header) </td></tr>
+    <tr><td class="paramname">proto_len</td><td>length of the ipv6 payload (used for checksum of pseudo header) </td></tr>
+    <tr><td class="paramname">chksum_len</td><td>number of payload bytes used to compute chksum </td></tr>
+    <tr><td class="paramname">src</td><td>source ipv6 address (used for checksum of pseudo header) </td></tr>
+    <tr><td class="paramname">dest</td><td>destination ipv6 address (used for checksum of pseudo header) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>checksum (as u16_t) to be saved directly in the protocol header </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="inet__chksum_8h.html">inet_chksum.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/inet__chksum_8h.js b/doc/doxygen/output/html/inet__chksum_8h.js
new file mode 100644
index 0000000..106e612
--- /dev/null
+++ b/doc/doxygen/output/html/inet__chksum_8h.js
@@ -0,0 +1,8 @@
+var inet__chksum_8h =
+[
+    [ "FOLD_U32T", "inet__chksum_8h.html#a6ffe83b4bdd1784a0671ee4778966a01", null ],
+    [ "SWAP_BYTES_IN_WORD", "inet__chksum_8h.html#a0196bd603262882d16b5264b52eafe18", null ],
+    [ "inet_chksum_pbuf", "inet__chksum_8h.html#ab35967a50418358e194e8f80fdc3c865", null ],
+    [ "ip6_chksum_pseudo", "inet__chksum_8h.html#a102544bca5912c78649e25a45a7d0a88", null ],
+    [ "ip6_chksum_pseudo_partial", "inet__chksum_8h.html#ae4218e08510fd92c9a699c4e5d9fc17b", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/init_8c.html b/doc/doxygen/output/html/init_8c.html
new file mode 100644
index 0000000..e70341d
--- /dev/null
+++ b/doc/doxygen/output/html/init_8c.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/init.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('init_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">init.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 &quot;<a class="el" href="init_8h.html">lwip/init.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.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="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="pbuf_8h.html">lwip/pbuf.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="sockets_8h.html">lwip/sockets.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="raw_8h.html">lwip/raw.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="tcp__priv_8h.html">lwip/priv/tcp_priv.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="timeouts_8h.html">lwip/timeouts.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="ip6_8h.html">lwip/ip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="nd6_8h.html">lwip/nd6.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="api_8h.html">lwip/api.h</a>&quot;</code><br />
+<code>#include &quot;netif/ppp/ppp_opts.h&quot;</code><br />
+<code>#include &quot;netif/ppp/ppp_impl.h&quot;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga0c1a18439524d2f4a5e51d25c0ca2ce9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9">lwip_init</a> (void)</td></tr>
+<tr class="separator:ga0c1a18439524d2f4a5e51d25c0ca2ce9"><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>Modules initialization </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_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li><li class="navelem"><a class="el" href="init_8c.html">init.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/init_8c.js b/doc/doxygen/output/html/init_8c.js
new file mode 100644
index 0000000..d0c9a14
--- /dev/null
+++ b/doc/doxygen/output/html/init_8c.js
@@ -0,0 +1,4 @@
+var init_8c =
+[
+    [ "lwip_init", "group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/init_8h.html b/doc/doxygen/output/html/init_8h.html
new file mode 100644
index 0000000..6f47354
--- /dev/null
+++ b/doc/doxygen/output/html/init_8h.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/init.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('init_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">init.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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem: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"><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="separator:ga1e596388c15ba81e753c5633fad1c034"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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;2</td></tr>
+<tr class="separator:ga0a57983df1b199cf39a2e6a2d90e3d50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="memitem:ga375ee868e76ed7c458cdf249387bd469"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__version.html#ga375ee868e76ed7c458cdf249387bd469">LWIP_RC_RELEASE</a>&#160;&#160;&#160;255</td></tr>
+<tr class="separator:ga375ee868e76ed7c458cdf249387bd469"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9ca69b1a453eb72efd0bbda333f2a33b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__version.html#ga9ca69b1a453eb72efd0bbda333f2a33b">LWIP_RC_DEVELOPMENT</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga9ca69b1a453eb72efd0bbda333f2a33b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0a0d322fad0a67aa5b8f1b8c9dfcfe59"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__version.html#ga0a0d322fad0a67aa5b8f1b8c9dfcfe59">LWIP_VERSION</a></td></tr>
+<tr class="separator:ga0a0d322fad0a67aa5b8f1b8c9dfcfe59"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab47e87bc38eef94486db402813183ba7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__version.html#gab47e87bc38eef94486db402813183ba7">LWIP_VERSION_STRING</a>&#160;&#160;&#160;LWIP_VERSTR(<a class="el" href="group__lwip__version.html#ga4308c06ef36496e00c798d96d7d03246">LWIP_VERSION_MAJOR</a>) &quot;.&quot; LWIP_VERSTR(<a class="el" href="group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034">LWIP_VERSION_MINOR</a>) &quot;.&quot; LWIP_VERSTR(<a class="el" href="group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50">LWIP_VERSION_REVISION</a>) LWIP_VERSION_STRING_SUFFIX</td></tr>
+<tr class="separator:gab47e87bc38eef94486db402813183ba7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga0c1a18439524d2f4a5e51d25c0ca2ce9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9">lwip_init</a> (void)</td></tr>
+<tr class="separator:ga0c1a18439524d2f4a5e51d25c0ca2ce9"><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>lwIP initialization API </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="init_8h.html">init.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/init_8h.js b/doc/doxygen/output/html/init_8h.js
new file mode 100644
index 0000000..3b18f11
--- /dev/null
+++ b/doc/doxygen/output/html/init_8h.js
@@ -0,0 +1,12 @@
+var init_8h =
+[
+    [ "LWIP_RC_DEVELOPMENT", "group__lwip__version.html#ga9ca69b1a453eb72efd0bbda333f2a33b", null ],
+    [ "LWIP_RC_RELEASE", "group__lwip__version.html#ga375ee868e76ed7c458cdf249387bd469", null ],
+    [ "LWIP_VERSION", "group__lwip__version.html#ga0a0d322fad0a67aa5b8f1b8c9dfcfe59", null ],
+    [ "LWIP_VERSION_MAJOR", "group__lwip__version.html#ga4308c06ef36496e00c798d96d7d03246", null ],
+    [ "LWIP_VERSION_MINOR", "group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034", null ],
+    [ "LWIP_VERSION_RC", "group__lwip__version.html#gac1dc92d8f453a98560de7e2e00a221a1", null ],
+    [ "LWIP_VERSION_REVISION", "group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50", null ],
+    [ "LWIP_VERSION_STRING", "group__lwip__version.html#gab47e87bc38eef94486db402813183ba7", null ],
+    [ "lwip_init", "group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ip4_8c.html b/doc/doxygen/output/html/ip4_8c.html
new file mode 100644
index 0000000..5870f4b
--- /dev/null
+++ b/doc/doxygen/output/html/ip4_8c.html
@@ -0,0 +1,622 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv4/ip4.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ip4_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">ip4.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 &quot;<a class="el" href="ip_8h.html">lwip/ip.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="mem_8h.html">lwip/mem.h</a>&quot;</code><br />
+<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="inet__chksum_8h.html">lwip/inet_chksum.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="icmp_8h.html">lwip/icmp.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="raw__priv_8h.html">lwip/priv/raw_priv.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="tcp__priv_8h.html">lwip/priv/tcp_priv.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="stats_8h.html">lwip/stats.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 &lt;string.h&gt;</code><br />
+<code>#include &quot;path/to/my/lwip_hooks.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a9652ce304f893f6245c6ba9daea0a30f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4_8c.html#a9652ce304f893f6245c6ba9daea0a30f">LWIP_INLINE_IP_CHKSUM</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:a9652ce304f893f6245c6ba9daea0a30f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a185c7d6380711847105430931692b267"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4_8c.html#a185c7d6380711847105430931692b267">IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT</a>(port)&#160;&#160;&#160;((port) == PP_NTOHS(<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a9fcae1f16758e1ac35dab343fc897f40">LWIP_IANA_PORT_DHCP_CLIENT</a>))</td></tr>
+<tr class="separator:a185c7d6380711847105430931692b267"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga6ae67c86aa82dccac5df81d93de00420"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420">ip4_set_default_multicast_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *default_multicast_netif)</td></tr>
+<tr class="separator:ga6ae67c86aa82dccac5df81d93de00420"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab615a9ca8fdd99e697f52506fc440fba"><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="ip4_8c.html#ab615a9ca8fdd99e697f52506fc440fba">ip4_route_src</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *src, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest)</td></tr>
+<tr class="separator:ab615a9ca8fdd99e697f52506fc440fba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac659f675356cfc1d4d13884946347e47"><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="ip4_8c.html#ac659f675356cfc1d4d13884946347e47">ip4_route</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest)</td></tr>
+<tr class="separator:ac659f675356cfc1d4d13884946347e47"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff1f784c9f05f3d79cc1a921d840501b"><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="ip4_8c.html#aff1f784c9f05f3d79cc1a921d840501b">ip4_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:aff1f784c9f05f3d79cc1a921d840501b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab220bc4ce4f48bdbba447358b3594917"><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="ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917">ip4_output_if</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *src, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest, u8_t ttl, u8_t tos, u8_t proto, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ab220bc4ce4f48bdbba447358b3594917"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0d912e400875396792a12ea443ecc1cf"><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="ip4_8c.html#a0d912e400875396792a12ea443ecc1cf">ip4_output_if_opt</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *src, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest, u8_t ttl, u8_t tos, u8_t proto, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, void *ip_options, u16_t optlen)</td></tr>
+<tr class="separator:a0d912e400875396792a12ea443ecc1cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2943d118873e9eb1d8296e04a6740db7"><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="ip4_8c.html#a2943d118873e9eb1d8296e04a6740db7">ip4_output_if_src</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *src, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest, u8_t ttl, u8_t tos, u8_t proto, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a2943d118873e9eb1d8296e04a6740db7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:accd56b095730de4ad56728bfcb349940"><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="ip4_8c.html#accd56b095730de4ad56728bfcb349940">ip4_output_if_opt_src</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *src, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest, u8_t ttl, u8_t tos, u8_t proto, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, void *ip_options, u16_t optlen)</td></tr>
+<tr class="separator:accd56b095730de4ad56728bfcb349940"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac87d296205eb5ac04058e609672d4ba8"><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="ip4_8c.html#ac87d296205eb5ac04058e609672d4ba8">ip4_output</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *src, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest, u8_t ttl, u8_t tos, u8_t proto)</td></tr>
+<tr class="separator:ac87d296205eb5ac04058e609672d4ba8"><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 is the IPv4 layer implementation for incoming and outgoing IP traffic.</p>
+<dl class="section see"><dt>See also</dt><dd>ip_frag.c </dd></dl>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a185c7d6380711847105430931692b267"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a185c7d6380711847105430931692b267">&#9670;&nbsp;</a></span>IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">port</td><td>)</td>
+          <td>&#160;&#160;&#160;((port) == PP_NTOHS(<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a9fcae1f16758e1ac35dab343fc897f40">LWIP_IANA_PORT_DHCP_CLIENT</a>))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Some defines for DHCP to let link-layer-addressed packets through while the netif is down. To use this in your own application/protocol, define LWIP_IP_ACCEPT_UDP_PORT(port) to return 1 if the port is accepted and 0 if the port is not accepted. </p>
+
+</div>
+</div>
+<a id="a9652ce304f893f6245c6ba9daea0a30f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9652ce304f893f6245c6ba9daea0a30f">&#9670;&nbsp;</a></span>LWIP_INLINE_IP_CHKSUM</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_INLINE_IP_CHKSUM&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 0 in the rare case of wanting to call an extra function to generate the IP checksum (in contrast to calculating it on-the-fly). </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="aff1f784c9f05f3d79cc1a921d840501b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aff1f784c9f05f3d79cc1a921d840501b">&#9670;&nbsp;</a></span>ip4_input()</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> ip4_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called by the network interface device driver when an IP packet is received. The function does the basic checks of the IP header such as packet size being at least larger than the header size etc. If the packet was not destined for us, the packet is forwarded (using ip_forward). The IP checksum is always checked.</p>
+<p>Finally, the packet is sent to the upper layer protocol input function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the received IP packet (p-&gt;payload points to IP header) </td></tr>
+    <tr><td class="paramname">inp</td><td>the netif on which this packet was received </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the packet was processed (could return ERR_* if it wasn't processed, but currently always returns ERR_OK) </dd></dl>
+
+</div>
+</div>
+<a id="ac87d296205eb5ac04058e609672d4ba8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac87d296205eb5ac04058e609672d4ba8">&#9670;&nbsp;</a></span>ip4_output()</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> ip4_output </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ttl</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>tos</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Simple interface to ip_output_if. It finds the outgoing network interface and calls upon ip_output_if to do the actual work.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the packet to send (p-&gt;payload points to the data, e.g. next protocol header; if dest == LWIP_IP_HDRINCL, p already includes an IP header and p-&gt;payload points to that IP header) </td></tr>
+    <tr><td class="paramname">src</td><td>the source IP address to send from (if src == IP4_ADDR_ANY, the IP address of the netif used to send is used as source address) </td></tr>
+    <tr><td class="paramname">dest</td><td>the destination IP address to send the packet to </td></tr>
+    <tr><td class="paramname">ttl</td><td>the TTL value to be set in the IP header </td></tr>
+    <tr><td class="paramname">tos</td><td>the TOS value to be set in the IP header </td></tr>
+    <tr><td class="paramname">proto</td><td>the PROTOCOL to be set in the IP header</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_RTE if no route is found see <a class="el" href="group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250">ip_output_if()</a> for more return values </dd></dl>
+
+</div>
+</div>
+<a id="ab220bc4ce4f48bdbba447358b3594917"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab220bc4ce4f48bdbba447358b3594917">&#9670;&nbsp;</a></span>ip4_output_if()</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> ip4_output_if </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ttl</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>tos</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sends an IP packet on a network interface. This function constructs the IP header and calculates the IP header checksum. If the source IP address is NULL, the IP address of the outgoing network interface is filled in as source address. If the destination IP address is LWIP_IP_HDRINCL, p is assumed to already include an IP header and p-&gt;payload points to it instead of the data.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the packet to send (p-&gt;payload points to the data, e.g. next protocol header; if dest == LWIP_IP_HDRINCL, p already includes an IP header and p-&gt;payload points to that IP header) </td></tr>
+    <tr><td class="paramname">src</td><td>the source IP address to send from (if src == IP4_ADDR_ANY, the IP address of the netif used to send is used as source address) </td></tr>
+    <tr><td class="paramname">dest</td><td>the destination IP address to send the packet to </td></tr>
+    <tr><td class="paramname">ttl</td><td>the TTL value to be set in the IP header </td></tr>
+    <tr><td class="paramname">tos</td><td>the TOS value to be set in the IP header </td></tr>
+    <tr><td class="paramname">proto</td><td>the PROTOCOL to be set in the IP header </td></tr>
+    <tr><td class="paramname">netif</td><td>the netif on which to send this packet </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the packet was sent OK ERR_BUF if p doesn't have enough space for IP/LINK headers returns errors returned by netif-&gt;output</dd></dl>
+<dl class="section note"><dt>Note</dt><dd>ip_id: RFC791 "some host may be able to simply use
+ unique identifiers independent of destination" </dd></dl>
+
+</div>
+</div>
+<a id="a0d912e400875396792a12ea443ecc1cf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0d912e400875396792a12ea443ecc1cf">&#9670;&nbsp;</a></span>ip4_output_if_opt()</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> ip4_output_if_opt </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ttl</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>tos</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ip_options</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>optlen</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as <a class="el" href="group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250">ip_output_if()</a> but with the possibility to include IP options:</p>
+<p>@ param ip_options pointer to the IP options, copied into the IP header @ param optlen length of ip_options </p>
+
+</div>
+</div>
+<a id="accd56b095730de4ad56728bfcb349940"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#accd56b095730de4ad56728bfcb349940">&#9670;&nbsp;</a></span>ip4_output_if_opt_src()</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> ip4_output_if_opt_src </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ttl</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>tos</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ip_options</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>optlen</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as ip_output_if_opt() but 'src' address is not replaced by netif address when it is 'any'. </p>
+
+</div>
+</div>
+<a id="a2943d118873e9eb1d8296e04a6740db7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2943d118873e9eb1d8296e04a6740db7">&#9670;&nbsp;</a></span>ip4_output_if_src()</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> ip4_output_if_src </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ttl</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>tos</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as <a class="el" href="group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250">ip_output_if()</a> but 'src' address is not replaced by netif address when it is 'any'. </p>
+
+</div>
+</div>
+<a id="ac659f675356cfc1d4d13884946347e47"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac659f675356cfc1d4d13884946347e47">&#9670;&nbsp;</a></span>ip4_route()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* ip4_route </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>dest</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Finds the appropriate network interface for a given IP address. It searches the list of network interfaces linearly. A match is found if the masked IP address of the network interface equals the masked IP address given to the function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">dest</td><td>the destination IP address for which to find the route </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the netif on which to send to reach dest </dd></dl>
+
+</div>
+</div>
+<a id="ab615a9ca8fdd99e697f52506fc440fba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab615a9ca8fdd99e697f52506fc440fba">&#9670;&nbsp;</a></span>ip4_route_src()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* ip4_route_src </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Source based IPv4 routing must be fully implemented in <a class="el" href="group__lwip__opts__hooks.html#gaa410d9cbe1d4fa4c8a7f49af7b501024">LWIP_HOOK_IP4_ROUTE_SRC()</a>. This function only provides the parameters. </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="ip4_8c.html">ip4.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ip4_8c.js b/doc/doxygen/output/html/ip4_8c.js
new file mode 100644
index 0000000..0b17ae2
--- /dev/null
+++ b/doc/doxygen/output/html/ip4_8c.js
@@ -0,0 +1,14 @@
+var ip4_8c =
+[
+    [ "IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT", "ip4_8c.html#a185c7d6380711847105430931692b267", null ],
+    [ "LWIP_INLINE_IP_CHKSUM", "ip4_8c.html#a9652ce304f893f6245c6ba9daea0a30f", null ],
+    [ "ip4_input", "ip4_8c.html#aff1f784c9f05f3d79cc1a921d840501b", null ],
+    [ "ip4_output", "ip4_8c.html#ac87d296205eb5ac04058e609672d4ba8", null ],
+    [ "ip4_output_if", "ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917", null ],
+    [ "ip4_output_if_opt", "ip4_8c.html#a0d912e400875396792a12ea443ecc1cf", null ],
+    [ "ip4_output_if_opt_src", "ip4_8c.html#accd56b095730de4ad56728bfcb349940", null ],
+    [ "ip4_output_if_src", "ip4_8c.html#a2943d118873e9eb1d8296e04a6740db7", null ],
+    [ "ip4_route", "ip4_8c.html#ac659f675356cfc1d4d13884946347e47", null ],
+    [ "ip4_route_src", "ip4_8c.html#ab615a9ca8fdd99e697f52506fc440fba", null ],
+    [ "ip4_set_default_multicast_netif", "group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ip4_8h.html b/doc/doxygen/output/html/ip4_8h.html
new file mode 100644
index 0000000..9051499
--- /dev/null
+++ b/doc/doxygen/output/html/ip4_8h.html
@@ -0,0 +1,590 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/ip4.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ip4_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">ip4.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="def_8h.html">lwip/def.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="ip4__addr_8h.html">lwip/ip4_addr.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="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2ip4_8h.html">lwip/prot/ip4.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a516aa115f61c368cbe74fae2da2c6824"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4_8h.html#a516aa115f61c368cbe74fae2da2c6824">IP_OPTIONS_SEND</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv4.html#ga429e811a80ebb5157e14a854870c4410">LWIP_IPV4</a> &amp;&amp; <a class="el" href="group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923">LWIP_IGMP</a>)</td></tr>
+<tr class="separator:a516aa115f61c368cbe74fae2da2c6824"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac659f675356cfc1d4d13884946347e47"><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="ip4_8h.html#ac659f675356cfc1d4d13884946347e47">ip4_route</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest)</td></tr>
+<tr class="separator:ac659f675356cfc1d4d13884946347e47"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab615a9ca8fdd99e697f52506fc440fba"><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="ip4_8h.html#ab615a9ca8fdd99e697f52506fc440fba">ip4_route_src</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *src, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest)</td></tr>
+<tr class="separator:ab615a9ca8fdd99e697f52506fc440fba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff1f784c9f05f3d79cc1a921d840501b"><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="ip4_8h.html#aff1f784c9f05f3d79cc1a921d840501b">ip4_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:aff1f784c9f05f3d79cc1a921d840501b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac87d296205eb5ac04058e609672d4ba8"><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="ip4_8h.html#ac87d296205eb5ac04058e609672d4ba8">ip4_output</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *src, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest, u8_t ttl, u8_t tos, u8_t proto)</td></tr>
+<tr class="separator:ac87d296205eb5ac04058e609672d4ba8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab220bc4ce4f48bdbba447358b3594917"><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="ip4_8h.html#ab220bc4ce4f48bdbba447358b3594917">ip4_output_if</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *src, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest, u8_t ttl, u8_t tos, u8_t proto, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ab220bc4ce4f48bdbba447358b3594917"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2943d118873e9eb1d8296e04a6740db7"><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="ip4_8h.html#a2943d118873e9eb1d8296e04a6740db7">ip4_output_if_src</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *src, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest, u8_t ttl, u8_t tos, u8_t proto, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a2943d118873e9eb1d8296e04a6740db7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0d912e400875396792a12ea443ecc1cf"><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="ip4_8h.html#a0d912e400875396792a12ea443ecc1cf">ip4_output_if_opt</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *src, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest, u8_t ttl, u8_t tos, u8_t proto, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, void *ip_options, u16_t optlen)</td></tr>
+<tr class="separator:a0d912e400875396792a12ea443ecc1cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:accd56b095730de4ad56728bfcb349940"><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="ip4_8h.html#accd56b095730de4ad56728bfcb349940">ip4_output_if_opt_src</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *src, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest, u8_t ttl, u8_t tos, u8_t proto, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, void *ip_options, u16_t optlen)</td></tr>
+<tr class="separator:accd56b095730de4ad56728bfcb349940"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6ae67c86aa82dccac5df81d93de00420"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420">ip4_set_default_multicast_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *default_multicast_netif)</td></tr>
+<tr class="separator:ga6ae67c86aa82dccac5df81d93de00420"><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>IPv4 API </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a516aa115f61c368cbe74fae2da2c6824"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a516aa115f61c368cbe74fae2da2c6824">&#9670;&nbsp;</a></span>IP_OPTIONS_SEND</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_OPTIONS_SEND&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv4.html#ga429e811a80ebb5157e14a854870c4410">LWIP_IPV4</a> &amp;&amp; <a class="el" href="group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923">LWIP_IGMP</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Currently, the function ip_output_if_opt() is only used with IGMP </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="aff1f784c9f05f3d79cc1a921d840501b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aff1f784c9f05f3d79cc1a921d840501b">&#9670;&nbsp;</a></span>ip4_input()</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> ip4_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called by the network interface device driver when an IP packet is received. The function does the basic checks of the IP header such as packet size being at least larger than the header size etc. If the packet was not destined for us, the packet is forwarded (using ip_forward). The IP checksum is always checked.</p>
+<p>Finally, the packet is sent to the upper layer protocol input function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the received IP packet (p-&gt;payload points to IP header) </td></tr>
+    <tr><td class="paramname">inp</td><td>the netif on which this packet was received </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the packet was processed (could return ERR_* if it wasn't processed, but currently always returns ERR_OK) </dd></dl>
+
+</div>
+</div>
+<a id="ac87d296205eb5ac04058e609672d4ba8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac87d296205eb5ac04058e609672d4ba8">&#9670;&nbsp;</a></span>ip4_output()</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> ip4_output </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ttl</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>tos</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Simple interface to ip_output_if. It finds the outgoing network interface and calls upon ip_output_if to do the actual work.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the packet to send (p-&gt;payload points to the data, e.g. next protocol header; if dest == LWIP_IP_HDRINCL, p already includes an IP header and p-&gt;payload points to that IP header) </td></tr>
+    <tr><td class="paramname">src</td><td>the source IP address to send from (if src == IP4_ADDR_ANY, the IP address of the netif used to send is used as source address) </td></tr>
+    <tr><td class="paramname">dest</td><td>the destination IP address to send the packet to </td></tr>
+    <tr><td class="paramname">ttl</td><td>the TTL value to be set in the IP header </td></tr>
+    <tr><td class="paramname">tos</td><td>the TOS value to be set in the IP header </td></tr>
+    <tr><td class="paramname">proto</td><td>the PROTOCOL to be set in the IP header</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_RTE if no route is found see <a class="el" href="group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250">ip_output_if()</a> for more return values </dd></dl>
+
+</div>
+</div>
+<a id="ab220bc4ce4f48bdbba447358b3594917"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab220bc4ce4f48bdbba447358b3594917">&#9670;&nbsp;</a></span>ip4_output_if()</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> ip4_output_if </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ttl</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>tos</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sends an IP packet on a network interface. This function constructs the IP header and calculates the IP header checksum. If the source IP address is NULL, the IP address of the outgoing network interface is filled in as source address. If the destination IP address is LWIP_IP_HDRINCL, p is assumed to already include an IP header and p-&gt;payload points to it instead of the data.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the packet to send (p-&gt;payload points to the data, e.g. next protocol header; if dest == LWIP_IP_HDRINCL, p already includes an IP header and p-&gt;payload points to that IP header) </td></tr>
+    <tr><td class="paramname">src</td><td>the source IP address to send from (if src == IP4_ADDR_ANY, the IP address of the netif used to send is used as source address) </td></tr>
+    <tr><td class="paramname">dest</td><td>the destination IP address to send the packet to </td></tr>
+    <tr><td class="paramname">ttl</td><td>the TTL value to be set in the IP header </td></tr>
+    <tr><td class="paramname">tos</td><td>the TOS value to be set in the IP header </td></tr>
+    <tr><td class="paramname">proto</td><td>the PROTOCOL to be set in the IP header </td></tr>
+    <tr><td class="paramname">netif</td><td>the netif on which to send this packet </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the packet was sent OK ERR_BUF if p doesn't have enough space for IP/LINK headers returns errors returned by netif-&gt;output</dd></dl>
+<dl class="section note"><dt>Note</dt><dd>ip_id: RFC791 "some host may be able to simply use
+ unique identifiers independent of destination" </dd></dl>
+
+</div>
+</div>
+<a id="a0d912e400875396792a12ea443ecc1cf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0d912e400875396792a12ea443ecc1cf">&#9670;&nbsp;</a></span>ip4_output_if_opt()</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> ip4_output_if_opt </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ttl</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>tos</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ip_options</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>optlen</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as <a class="el" href="group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250">ip_output_if()</a> but with the possibility to include IP options:</p>
+<p>@ param ip_options pointer to the IP options, copied into the IP header @ param optlen length of ip_options </p>
+
+</div>
+</div>
+<a id="accd56b095730de4ad56728bfcb349940"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#accd56b095730de4ad56728bfcb349940">&#9670;&nbsp;</a></span>ip4_output_if_opt_src()</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> ip4_output_if_opt_src </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ttl</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>tos</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ip_options</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>optlen</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as ip_output_if_opt() but 'src' address is not replaced by netif address when it is 'any'. </p>
+
+</div>
+</div>
+<a id="a2943d118873e9eb1d8296e04a6740db7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2943d118873e9eb1d8296e04a6740db7">&#9670;&nbsp;</a></span>ip4_output_if_src()</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> ip4_output_if_src </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>ttl</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>tos</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>proto</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as <a class="el" href="group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250">ip_output_if()</a> but 'src' address is not replaced by netif address when it is 'any'. </p>
+
+</div>
+</div>
+<a id="ac659f675356cfc1d4d13884946347e47"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac659f675356cfc1d4d13884946347e47">&#9670;&nbsp;</a></span>ip4_route()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* ip4_route </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>dest</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Finds the appropriate network interface for a given IP address. It searches the list of network interfaces linearly. A match is found if the masked IP address of the network interface equals the masked IP address given to the function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">dest</td><td>the destination IP address for which to find the route </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the netif on which to send to reach dest </dd></dl>
+
+</div>
+</div>
+<a id="ab615a9ca8fdd99e697f52506fc440fba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab615a9ca8fdd99e697f52506fc440fba">&#9670;&nbsp;</a></span>ip4_route_src()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* ip4_route_src </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Source based IPv4 routing must be fully implemented in <a class="el" href="group__lwip__opts__hooks.html#gaa410d9cbe1d4fa4c8a7f49af7b501024">LWIP_HOOK_IP4_ROUTE_SRC()</a>. This function only provides the parameters. </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="ip4_8h.html">ip4.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ip4_8h.js b/doc/doxygen/output/html/ip4_8h.js
new file mode 100644
index 0000000..56a4e1a
--- /dev/null
+++ b/doc/doxygen/output/html/ip4_8h.js
@@ -0,0 +1,13 @@
+var ip4_8h =
+[
+    [ "IP_OPTIONS_SEND", "ip4_8h.html#a516aa115f61c368cbe74fae2da2c6824", null ],
+    [ "ip4_input", "ip4_8h.html#aff1f784c9f05f3d79cc1a921d840501b", null ],
+    [ "ip4_output", "ip4_8h.html#ac87d296205eb5ac04058e609672d4ba8", null ],
+    [ "ip4_output_if", "ip4_8h.html#ab220bc4ce4f48bdbba447358b3594917", null ],
+    [ "ip4_output_if_opt", "ip4_8h.html#a0d912e400875396792a12ea443ecc1cf", null ],
+    [ "ip4_output_if_opt_src", "ip4_8h.html#accd56b095730de4ad56728bfcb349940", null ],
+    [ "ip4_output_if_src", "ip4_8h.html#a2943d118873e9eb1d8296e04a6740db7", null ],
+    [ "ip4_route", "ip4_8h.html#ac659f675356cfc1d4d13884946347e47", null ],
+    [ "ip4_route_src", "ip4_8h.html#ab615a9ca8fdd99e697f52506fc440fba", null ],
+    [ "ip4_set_default_multicast_netif", "group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ip4__addr_8c.html b/doc/doxygen/output/html/ip4__addr_8c.html
new file mode 100644
index 0000000..ce20630
--- /dev/null
+++ b/doc/doxygen/output/html/ip4__addr_8c.html
@@ -0,0 +1,320 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv4/ip4_addr.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ip4__addr_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">ip4_addr.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 &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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab3cd7e7fba28c29d35f3c17461071421"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8c.html#ab3cd7e7fba28c29d35f3c17461071421">ip4_addr_isbroadcast_u32</a> (u32_t addr, const struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ab3cd7e7fba28c29d35f3c17461071421"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab5810d404b0ad1b89ef1323ea1e78071"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8c.html#ab5810d404b0ad1b89ef1323ea1e78071">ip4_addr_netmask_valid</a> (u32_t netmask)</td></tr>
+<tr class="separator:ab5810d404b0ad1b89ef1323ea1e78071"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c05f9138da41115978409e547df9670"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8c.html#a2c05f9138da41115978409e547df9670">ipaddr_addr</a> (const char *cp)</td></tr>
+<tr class="separator:a2c05f9138da41115978409e547df9670"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af66de98501e92c66714d58119b6d9e1a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8c.html#af66de98501e92c66714d58119b6d9e1a">ip4addr_aton</a> (const char *cp, <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *addr)</td></tr>
+<tr class="separator:af66de98501e92c66714d58119b6d9e1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a28620fdd443c5c98d15e5890cbd9059c"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8c.html#a28620fdd443c5c98d15e5890cbd9059c">ip4addr_ntoa</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *addr)</td></tr>
+<tr class="separator:a28620fdd443c5c98d15e5890cbd9059c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3825d5b4786c207af971ceb287f101fd"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8c.html#a3825d5b4786c207af971ceb287f101fd">ip4addr_ntoa_r</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *addr, char *buf, int buflen)</td></tr>
+<tr class="separator:a3825d5b4786c207af971ceb287f101fd"><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 is the IPv4 address tools implementation. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ab3cd7e7fba28c29d35f3c17461071421"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab3cd7e7fba28c29d35f3c17461071421">&#9670;&nbsp;</a></span>ip4_addr_isbroadcast_u32()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t ip4_addr_isbroadcast_u32 </td>
+          <td>(</td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Determine if an address is a broadcast address on a network interface</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">addr</td><td>address to be checked </td></tr>
+    <tr><td class="paramname">netif</td><td>the network interface against which the address is checked </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>returns non-zero if the address is a broadcast address </dd></dl>
+
+</div>
+</div>
+<a id="ab5810d404b0ad1b89ef1323ea1e78071"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab5810d404b0ad1b89ef1323ea1e78071">&#9670;&nbsp;</a></span>ip4_addr_netmask_valid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t ip4_addr_netmask_valid </td>
+          <td>(</td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>netmask</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Checks if a netmask is valid (starting with ones, then only zeros)</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netmask</td><td>the IPv4 netmask to check (in network byte order!) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if the netmask is valid, 0 if it is not </dd></dl>
+
+</div>
+</div>
+<a id="af66de98501e92c66714d58119b6d9e1a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af66de98501e92c66714d58119b6d9e1a">&#9670;&nbsp;</a></span>ip4addr_aton()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ip4addr_aton </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>cp</em>, </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> *&#160;</td>
+          <td class="paramname"><em>addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Check whether "cp" is a valid ascii representation of an Internet address and convert to a binary address. Returns 1 if the address is valid, 0 if not. This replaces inet_addr, the return value from which cannot distinguish between failure and a local broadcast address.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">cp</td><td>IP address in ascii representation (e.g. "127.0.0.1") </td></tr>
+    <tr><td class="paramname">addr</td><td>pointer to which to save the ip address in network order </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if cp could be converted to addr, 0 on failure </dd></dl>
+
+</div>
+</div>
+<a id="a28620fdd443c5c98d15e5890cbd9059c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a28620fdd443c5c98d15e5890cbd9059c">&#9670;&nbsp;</a></span>ip4addr_ntoa()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* ip4addr_ntoa </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert numeric IP address into decimal dotted ASCII representation. returns ptr to static buffer; not reentrant!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">addr</td><td>ip address in network order to convert </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to a global static (!) buffer that holds the ASCII representation of addr </dd></dl>
+
+</div>
+</div>
+<a id="a3825d5b4786c207af971ceb287f101fd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3825d5b4786c207af971ceb287f101fd">&#9670;&nbsp;</a></span>ip4addr_ntoa_r()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* ip4addr_ntoa_r </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>buflen</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as ip4addr_ntoa, but reentrant since a user-supplied buffer is used.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">addr</td><td>ip address in network order to convert </td></tr>
+    <tr><td class="paramname">buf</td><td>target buffer where the string is stored </td></tr>
+    <tr><td class="paramname">buflen</td><td>length of buf </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>either pointer to buf which now holds the ASCII representation of addr or NULL if buf was too small </dd></dl>
+
+</div>
+</div>
+<a id="a2c05f9138da41115978409e547df9670"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2c05f9138da41115978409e547df9670">&#9670;&nbsp;</a></span>ipaddr_addr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t ipaddr_addr </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>cp</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Ascii internet address interpretation routine. The value returned is in network order.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">cp</td><td>IP address in ascii representation (e.g. "127.0.0.1") </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ip address in network order </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_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="ip4__addr_8c.html">ip4_addr.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ip4__addr_8c.js b/doc/doxygen/output/html/ip4__addr_8c.js
new file mode 100644
index 0000000..e4da21b
--- /dev/null
+++ b/doc/doxygen/output/html/ip4__addr_8c.js
@@ -0,0 +1,9 @@
+var ip4__addr_8c =
+[
+    [ "ip4_addr_isbroadcast_u32", "ip4__addr_8c.html#ab3cd7e7fba28c29d35f3c17461071421", null ],
+    [ "ip4_addr_netmask_valid", "ip4__addr_8c.html#ab5810d404b0ad1b89ef1323ea1e78071", null ],
+    [ "ip4addr_aton", "ip4__addr_8c.html#af66de98501e92c66714d58119b6d9e1a", null ],
+    [ "ip4addr_ntoa", "ip4__addr_8c.html#a28620fdd443c5c98d15e5890cbd9059c", null ],
+    [ "ip4addr_ntoa_r", "ip4__addr_8c.html#a3825d5b4786c207af971ceb287f101fd", null ],
+    [ "ipaddr_addr", "ip4__addr_8c.html#a2c05f9138da41115978409e547df9670", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ip4__addr_8h.html b/doc/doxygen/output/html/ip4__addr_8h.html
new file mode 100644
index 0000000..e1b5430
--- /dev/null
+++ b/doc/doxygen/output/html/ip4__addr_8h.html
@@ -0,0 +1,800 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/ip4_addr.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ip4__addr_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">ip4_addr.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="def_8h.html">lwip/def.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structip4__addr.html">ip4_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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:abc4b2e3531c4992f2ae4b8c0f9751544"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#abc4b2e3531c4992f2ae4b8c0f9751544">IPADDR_NONE</a>&#160;&#160;&#160;((u32_t)0xffffffffUL)</td></tr>
+<tr class="separator:abc4b2e3531c4992f2ae4b8c0f9751544"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6f51a2eb21547df4e6b3ba046188345e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e">IPADDR_LOOPBACK</a>&#160;&#160;&#160;((u32_t)0x7f000001UL)</td></tr>
+<tr class="separator:a6f51a2eb21547df4e6b3ba046188345e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad6ed0d622d61ecd6edd606e3b564f0a2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#ad6ed0d622d61ecd6edd606e3b564f0a2">IPADDR_ANY</a>&#160;&#160;&#160;((u32_t)0x00000000UL)</td></tr>
+<tr class="separator:ad6ed0d622d61ecd6edd606e3b564f0a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac661fca7e7d25e5cd379b811a767c29a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#ac661fca7e7d25e5cd379b811a767c29a">IPADDR_BROADCAST</a>&#160;&#160;&#160;((u32_t)0xffffffffUL)</td></tr>
+<tr class="separator:ac661fca7e7d25e5cd379b811a767c29a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a58aee4166c466f9ac7035bf5cc9f9974"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974">IP4_ADDR</a>(ipaddr,  a,  b,  c,  d)&#160;&#160;&#160;(ipaddr)-&gt;addr = PP_HTONL(<a class="el" href="def_8h.html#acf56d3da92a0a7a8a62a617e793e948c">LWIP_MAKEU32</a>(a,b,c,d))</td></tr>
+<tr class="separator:a58aee4166c466f9ac7035bf5cc9f9974"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f4e9c339e897e6ca5cb4a2f1e8394d5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#a2f4e9c339e897e6ca5cb4a2f1e8394d5">ip4_addr_copy</a>(dest,  src)&#160;&#160;&#160;((dest).addr = (src).addr)</td></tr>
+<tr class="separator:a2f4e9c339e897e6ca5cb4a2f1e8394d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a33a17a8d2025ce3715db835534868e88"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#a33a17a8d2025ce3715db835534868e88">ip4_addr_set</a>(dest,  src)</td></tr>
+<tr class="separator:a33a17a8d2025ce3715db835534868e88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a973b6ad98e037fc45f1e11d29cda99ea"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#a973b6ad98e037fc45f1e11d29cda99ea">ip4_addr_set_zero</a>(ipaddr)&#160;&#160;&#160;((ipaddr)-&gt;addr = 0)</td></tr>
+<tr class="separator:a973b6ad98e037fc45f1e11d29cda99ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afaaed3762ce8e9de14fcf73b19964567"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#afaaed3762ce8e9de14fcf73b19964567">ip4_addr_set_any</a>(ipaddr)&#160;&#160;&#160;((ipaddr)-&gt;addr = <a class="el" href="ip4__addr_8h.html#ad6ed0d622d61ecd6edd606e3b564f0a2">IPADDR_ANY</a>)</td></tr>
+<tr class="separator:afaaed3762ce8e9de14fcf73b19964567"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c7eae50a387987a7f56c29c74255c3c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#a5c7eae50a387987a7f56c29c74255c3c">ip4_addr_set_loopback</a>(ipaddr)&#160;&#160;&#160;((ipaddr)-&gt;addr = PP_HTONL(<a class="el" href="ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e">IPADDR_LOOPBACK</a>))</td></tr>
+<tr class="separator:a5c7eae50a387987a7f56c29c74255c3c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a46dabb4df212d156004fa5afe03e2051"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051">ip4_addr_isloopback</a>(ipaddr)&#160;&#160;&#160;(((ipaddr)-&gt;addr &amp; PP_HTONL(IP_CLASSA_NET)) == PP_HTONL(((u32_t)IP_LOOPBACKNET) &lt;&lt; 24))</td></tr>
+<tr class="separator:a46dabb4df212d156004fa5afe03e2051"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a901850ec90b01b9bf6baf69561aa465a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#a901850ec90b01b9bf6baf69561aa465a">ip4_addr_set_hton</a>(dest,  src)</td></tr>
+<tr class="separator:a901850ec90b01b9bf6baf69561aa465a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeb39f58b38435f89219c8ccb509eb520"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#aeb39f58b38435f89219c8ccb509eb520">ip4_addr_set_u32</a>(dest_ipaddr,  src_u32)&#160;&#160;&#160;((dest_ipaddr)-&gt;addr = (src_u32))</td></tr>
+<tr class="separator:aeb39f58b38435f89219c8ccb509eb520"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad50d93464bbbda199b585c54869a3a4b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#ad50d93464bbbda199b585c54869a3a4b">ip4_addr_get_u32</a>(src_ipaddr)&#160;&#160;&#160;((src_ipaddr)-&gt;addr)</td></tr>
+<tr class="separator:ad50d93464bbbda199b585c54869a3a4b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a81658cb05ba504d13ee860e82dc444e9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#a81658cb05ba504d13ee860e82dc444e9">ip4_addr_get_network</a>(target,  host,  netmask)&#160;&#160;&#160;do { ((target)-&gt;addr = ((host)-&gt;addr) &amp; ((netmask)-&gt;addr)); } while(0)</td></tr>
+<tr class="separator:a81658cb05ba504d13ee860e82dc444e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd43f6ceb2df8d50c84509ad1059f514"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#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:a2b2230516e7911dfacc9b87644ba30f1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#a2b2230516e7911dfacc9b87644ba30f1">ip_ntoa</a>(ipaddr)&#160;&#160;&#160;<a class="el" href="group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1">ipaddr_ntoa</a>(ipaddr)</td></tr>
+<tr class="separator:a2b2230516e7911dfacc9b87644ba30f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a3d3b45daffbc15d65da236e31e621b7e"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structip4__addr.html">ip4_addr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a></td></tr>
+<tr class="separator:a3d3b45daffbc15d65da236e31e621b7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab3cd7e7fba28c29d35f3c17461071421"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#ab3cd7e7fba28c29d35f3c17461071421">ip4_addr_isbroadcast_u32</a> (u32_t addr, const struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ab3cd7e7fba28c29d35f3c17461071421"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab5810d404b0ad1b89ef1323ea1e78071"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#ab5810d404b0ad1b89ef1323ea1e78071">ip4_addr_netmask_valid</a> (u32_t netmask)</td></tr>
+<tr class="separator:ab5810d404b0ad1b89ef1323ea1e78071"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c05f9138da41115978409e547df9670"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#a2c05f9138da41115978409e547df9670">ipaddr_addr</a> (const char *cp)</td></tr>
+<tr class="separator:a2c05f9138da41115978409e547df9670"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af66de98501e92c66714d58119b6d9e1a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#af66de98501e92c66714d58119b6d9e1a">ip4addr_aton</a> (const char *cp, <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *addr)</td></tr>
+<tr class="separator:af66de98501e92c66714d58119b6d9e1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a28620fdd443c5c98d15e5890cbd9059c"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#a28620fdd443c5c98d15e5890cbd9059c">ip4addr_ntoa</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *addr)</td></tr>
+<tr class="separator:a28620fdd443c5c98d15e5890cbd9059c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3825d5b4786c207af971ceb287f101fd"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__addr_8h.html#a3825d5b4786c207af971ceb287f101fd">ip4addr_ntoa_r</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *addr, char *buf, int buflen)</td></tr>
+<tr class="separator:a3825d5b4786c207af971ceb287f101fd"><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>IPv4 address API </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a58aee4166c466f9ac7035bf5cc9f9974"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a58aee4166c466f9ac7035bf5cc9f9974">&#9670;&nbsp;</a></span>IP4_ADDR</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP4_ADDR</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">a, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">b, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">d&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;(ipaddr)-&gt;addr = PP_HTONL(<a class="el" href="def_8h.html#acf56d3da92a0a7a8a62a617e793e948c">LWIP_MAKEU32</a>(a,b,c,d))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set an IP address given by the four byte-parts </p>
+
+</div>
+</div>
+<a id="a2f4e9c339e897e6ca5cb4a2f1e8394d5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2f4e9c339e897e6ca5cb4a2f1e8394d5">&#9670;&nbsp;</a></span>ip4_addr_copy</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip4_addr_copy</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((dest).addr = (src).addr)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Copy IP address - faster than ip4_addr_set: no NULL check </p>
+
+</div>
+</div>
+<a id="a81658cb05ba504d13ee860e82dc444e9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a81658cb05ba504d13ee860e82dc444e9">&#9670;&nbsp;</a></span>ip4_addr_get_network</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip4_addr_get_network</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">target, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">host, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">netmask&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;do { ((target)-&gt;addr = ((host)-&gt;addr) &amp; ((netmask)-&gt;addr)); } while(0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get the network address by combining host address with netmask </p>
+
+</div>
+</div>
+<a id="ad50d93464bbbda199b585c54869a3a4b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad50d93464bbbda199b585c54869a3a4b">&#9670;&nbsp;</a></span>ip4_addr_get_u32</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip4_addr_get_u32</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src_ipaddr</td><td>)</td>
+          <td>&#160;&#160;&#160;((src_ipaddr)-&gt;addr)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IPv4 only: get the IP address as an u32_t </p>
+
+</div>
+</div>
+<a id="a46dabb4df212d156004fa5afe03e2051"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a46dabb4df212d156004fa5afe03e2051">&#9670;&nbsp;</a></span>ip4_addr_isloopback</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip4_addr_isloopback</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td>&#160;&#160;&#160;(((ipaddr)-&gt;addr &amp; PP_HTONL(IP_CLASSA_NET)) == PP_HTONL(((u32_t)IP_LOOPBACKNET) &lt;&lt; 24))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Check if an address is in the loopback region </p>
+
+</div>
+</div>
+<a id="afd43f6ceb2df8d50c84509ad1059f514"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afd43f6ceb2df8d50c84509ad1059f514">&#9670;&nbsp;</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">&#160;</td>
+          <td class="paramname">addr1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addr2, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">mask&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(((addr1)-&gt;addr &amp; \</div><div class="line">                                              (mask)-&gt;addr) == \</div><div class="line">                                             ((addr2)-&gt;addr &amp; \</div><div class="line">                                              (mask)-&gt;addr))</div></div><!-- fragment --><p>Determine if two address are on the same network.</p>
+<ul>
+<li>addr1 IP address 1 </li>
+<li>addr2 IP address 2 </li>
+<li>mask network identifier mask <dl class="section return"><dt>Returns</dt><dd>!0 if the network identifiers of both address match </dd></dl>
+</li>
+</ul>
+
+</div>
+</div>
+<a id="a33a17a8d2025ce3715db835534868e88"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a33a17a8d2025ce3715db835534868e88">&#9670;&nbsp;</a></span>ip4_addr_set</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip4_addr_set</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">((dest)-&gt;addr = \</div><div class="line">                                    ((src) == NULL ? 0 : \</div><div class="line">                                    (src)-&gt;addr))</div></div><!-- fragment --><p>Safely copy one IP address to another (src may be NULL) </p>
+
+</div>
+</div>
+<a id="afaaed3762ce8e9de14fcf73b19964567"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afaaed3762ce8e9de14fcf73b19964567">&#9670;&nbsp;</a></span>ip4_addr_set_any</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip4_addr_set_any</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td>&#160;&#160;&#160;((ipaddr)-&gt;addr = <a class="el" href="ip4__addr_8h.html#ad6ed0d622d61ecd6edd606e3b564f0a2">IPADDR_ANY</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set address to IPADDR_ANY (no need for <a class="el" href="def_8c.html#a14f94347a5b9b9e3602705b75b7ae524">lwip_htonl()</a>) </p>
+
+</div>
+</div>
+<a id="a901850ec90b01b9bf6baf69561aa465a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a901850ec90b01b9bf6baf69561aa465a">&#9670;&nbsp;</a></span>ip4_addr_set_hton</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip4_addr_set_hton</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">((dest)-&gt;addr = \</div><div class="line">                               ((src) == NULL ? 0:\</div><div class="line">                               lwip_htonl((src)-&gt;addr)))</div></div><!-- fragment --><p>Safely copy one IP address to another and change byte order from host- to network-order. </p>
+
+</div>
+</div>
+<a id="a5c7eae50a387987a7f56c29c74255c3c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5c7eae50a387987a7f56c29c74255c3c">&#9670;&nbsp;</a></span>ip4_addr_set_loopback</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip4_addr_set_loopback</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td>&#160;&#160;&#160;((ipaddr)-&gt;addr = PP_HTONL(<a class="el" href="ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e">IPADDR_LOOPBACK</a>))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set address to loopback address </p>
+
+</div>
+</div>
+<a id="aeb39f58b38435f89219c8ccb509eb520"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeb39f58b38435f89219c8ccb509eb520">&#9670;&nbsp;</a></span>ip4_addr_set_u32</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip4_addr_set_u32</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest_ipaddr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src_u32&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((dest_ipaddr)-&gt;addr = (src_u32))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IPv4 only: set the IP address given as an u32_t </p>
+
+</div>
+</div>
+<a id="a973b6ad98e037fc45f1e11d29cda99ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a973b6ad98e037fc45f1e11d29cda99ea">&#9670;&nbsp;</a></span>ip4_addr_set_zero</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip4_addr_set_zero</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td>&#160;&#160;&#160;((ipaddr)-&gt;addr = 0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set complete address to zero </p>
+
+</div>
+</div>
+<a id="a2b2230516e7911dfacc9b87644ba30f1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2b2230516e7911dfacc9b87644ba30f1">&#9670;&nbsp;</a></span>ip_ntoa</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_ntoa</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1">ipaddr_ntoa</a>(ipaddr)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>For backwards compatibility </p>
+
+</div>
+</div>
+<a id="ad6ed0d622d61ecd6edd606e3b564f0a2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad6ed0d622d61ecd6edd606e3b564f0a2">&#9670;&nbsp;</a></span>IPADDR_ANY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IPADDR_ANY&#160;&#160;&#160;((u32_t)0x00000000UL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>0.0.0.0 </p>
+
+</div>
+</div>
+<a id="ac661fca7e7d25e5cd379b811a767c29a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac661fca7e7d25e5cd379b811a767c29a">&#9670;&nbsp;</a></span>IPADDR_BROADCAST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IPADDR_BROADCAST&#160;&#160;&#160;((u32_t)0xffffffffUL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>255.255.255.255 </p>
+
+</div>
+</div>
+<a id="a6f51a2eb21547df4e6b3ba046188345e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6f51a2eb21547df4e6b3ba046188345e">&#9670;&nbsp;</a></span>IPADDR_LOOPBACK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IPADDR_LOOPBACK&#160;&#160;&#160;((u32_t)0x7f000001UL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>127.0.0.1 </p>
+
+</div>
+</div>
+<a id="abc4b2e3531c4992f2ae4b8c0f9751544"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abc4b2e3531c4992f2ae4b8c0f9751544">&#9670;&nbsp;</a></span>IPADDR_NONE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IPADDR_NONE&#160;&#160;&#160;((u32_t)0xffffffffUL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>255.255.255.255 </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="a3d3b45daffbc15d65da236e31e621b7e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3d3b45daffbc15d65da236e31e621b7e">&#9670;&nbsp;</a></span>ip4_addr_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structip4__addr.html">ip4_addr</a> <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ip4_addr_t uses a struct for convenience only, so that the same defines can operate both on ip4_addr_t as well as on ip4_addr_p_t. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ab3cd7e7fba28c29d35f3c17461071421"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab3cd7e7fba28c29d35f3c17461071421">&#9670;&nbsp;</a></span>ip4_addr_isbroadcast_u32()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t ip4_addr_isbroadcast_u32 </td>
+          <td>(</td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Determine if an address is a broadcast address on a network interface</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">addr</td><td>address to be checked </td></tr>
+    <tr><td class="paramname">netif</td><td>the network interface against which the address is checked </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>returns non-zero if the address is a broadcast address </dd></dl>
+
+</div>
+</div>
+<a id="ab5810d404b0ad1b89ef1323ea1e78071"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab5810d404b0ad1b89ef1323ea1e78071">&#9670;&nbsp;</a></span>ip4_addr_netmask_valid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t ip4_addr_netmask_valid </td>
+          <td>(</td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>netmask</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Checks if a netmask is valid (starting with ones, then only zeros)</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netmask</td><td>the IPv4 netmask to check (in network byte order!) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if the netmask is valid, 0 if it is not </dd></dl>
+
+</div>
+</div>
+<a id="af66de98501e92c66714d58119b6d9e1a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af66de98501e92c66714d58119b6d9e1a">&#9670;&nbsp;</a></span>ip4addr_aton()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ip4addr_aton </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>cp</em>, </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> *&#160;</td>
+          <td class="paramname"><em>addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Check whether "cp" is a valid ascii representation of an Internet address and convert to a binary address. Returns 1 if the address is valid, 0 if not. This replaces inet_addr, the return value from which cannot distinguish between failure and a local broadcast address.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">cp</td><td>IP address in ascii representation (e.g. "127.0.0.1") </td></tr>
+    <tr><td class="paramname">addr</td><td>pointer to which to save the ip address in network order </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if cp could be converted to addr, 0 on failure </dd></dl>
+
+</div>
+</div>
+<a id="a28620fdd443c5c98d15e5890cbd9059c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a28620fdd443c5c98d15e5890cbd9059c">&#9670;&nbsp;</a></span>ip4addr_ntoa()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* ip4addr_ntoa </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>returns ptr to static buffer; not reentrant!</p>
+<p>Convert numeric IP address into decimal dotted ASCII representation. returns ptr to static buffer; not reentrant!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">addr</td><td>ip address in network order to convert </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to a global static (!) buffer that holds the ASCII representation of addr </dd></dl>
+
+</div>
+</div>
+<a id="a3825d5b4786c207af971ceb287f101fd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3825d5b4786c207af971ceb287f101fd">&#9670;&nbsp;</a></span>ip4addr_ntoa_r()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* ip4addr_ntoa_r </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>buflen</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as ip4addr_ntoa, but reentrant since a user-supplied buffer is used.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">addr</td><td>ip address in network order to convert </td></tr>
+    <tr><td class="paramname">buf</td><td>target buffer where the string is stored </td></tr>
+    <tr><td class="paramname">buflen</td><td>length of buf </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>either pointer to buf which now holds the ASCII representation of addr or NULL if buf was too small </dd></dl>
+
+</div>
+</div>
+<a id="a2c05f9138da41115978409e547df9670"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2c05f9138da41115978409e547df9670">&#9670;&nbsp;</a></span>ipaddr_addr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t ipaddr_addr </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>cp</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Ascii internet address interpretation routine. The value returned is in network order.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">cp</td><td>IP address in ascii representation (e.g. "127.0.0.1") </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ip address in network order </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="ip4__addr_8h.html">ip4_addr.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ip4__addr_8h.js b/doc/doxygen/output/html/ip4__addr_8h.js
new file mode 100644
index 0000000..3b31bc2
--- /dev/null
+++ b/doc/doxygen/output/html/ip4__addr_8h.js
@@ -0,0 +1,28 @@
+var ip4__addr_8h =
+[
+    [ "ip4_addr", "structip4__addr.html", null ],
+    [ "IP4_ADDR", "ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974", 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_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 ],
+    [ "ip4_addr_set_hton", "ip4__addr_8h.html#a901850ec90b01b9bf6baf69561aa465a", null ],
+    [ "ip4_addr_set_loopback", "ip4__addr_8h.html#a5c7eae50a387987a7f56c29c74255c3c", null ],
+    [ "ip4_addr_set_u32", "ip4__addr_8h.html#aeb39f58b38435f89219c8ccb509eb520", null ],
+    [ "ip4_addr_set_zero", "ip4__addr_8h.html#a973b6ad98e037fc45f1e11d29cda99ea", null ],
+    [ "ip_ntoa", "ip4__addr_8h.html#a2b2230516e7911dfacc9b87644ba30f1", null ],
+    [ "IPADDR_ANY", "ip4__addr_8h.html#ad6ed0d622d61ecd6edd606e3b564f0a2", null ],
+    [ "IPADDR_BROADCAST", "ip4__addr_8h.html#ac661fca7e7d25e5cd379b811a767c29a", null ],
+    [ "IPADDR_LOOPBACK", "ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e", null ],
+    [ "IPADDR_NONE", "ip4__addr_8h.html#abc4b2e3531c4992f2ae4b8c0f9751544", null ],
+    [ "ip4_addr_t", "ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e", null ],
+    [ "ip4_addr_isbroadcast_u32", "ip4__addr_8h.html#ab3cd7e7fba28c29d35f3c17461071421", null ],
+    [ "ip4_addr_netmask_valid", "ip4__addr_8h.html#ab5810d404b0ad1b89ef1323ea1e78071", null ],
+    [ "ip4addr_aton", "ip4__addr_8h.html#af66de98501e92c66714d58119b6d9e1a", null ],
+    [ "ip4addr_ntoa", "ip4__addr_8h.html#a28620fdd443c5c98d15e5890cbd9059c", null ],
+    [ "ip4addr_ntoa_r", "ip4__addr_8h.html#a3825d5b4786c207af971ceb287f101fd", null ],
+    [ "ipaddr_addr", "ip4__addr_8h.html#a2c05f9138da41115978409e547df9670", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ip4__frag_8c.html b/doc/doxygen/output/html/ip4__frag_8c.html
new file mode 100644
index 0000000..200d85b
--- /dev/null
+++ b/doc/doxygen/output/html/ip4__frag_8c.html
@@ -0,0 +1,265 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv4/ip4_frag.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ip4__frag_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">ip4_frag.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 &quot;<a class="el" href="ip4__frag_8h.html">lwip/ip4_frag.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="inet__chksum_8h.html">lwip/inet_chksum.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="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="icmp_8h.html">lwip/icmp.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structip__reass__helper.html">ip_reass_helper</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:af920fb8127d00dd7a8b809afd28723fe"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe">IP_REASS_CHECK_OVERLAP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:af920fb8127d00dd7a8b809afd28723fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a510934accf149433bdcf683993e79080"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__frag_8c.html#a510934accf149433bdcf683993e79080">IP_REASS_FREE_OLDEST</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:a510934accf149433bdcf683993e79080"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:abc7017eb20983f372e81de7376ebec88"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__frag_8c.html#abc7017eb20983f372e81de7376ebec88">ip_reass_tmr</a> (void)</td></tr>
+<tr class="separator:abc7017eb20983f372e81de7376ebec88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7debaa6366c0db4270d4f03219c75c05"><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="ip4__frag_8c.html#a7debaa6366c0db4270d4f03219c75c05">ip4_reass</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:a7debaa6366c0db4270d4f03219c75c05"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70872fd4c7aefec6b4eef0707e1a371c"><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="ip4__frag_8c.html#a70872fd4c7aefec6b4eef0707e1a371c">ip4_frag</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>, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest)</td></tr>
+<tr class="separator:a70872fd4c7aefec6b4eef0707e1a371c"><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 is the IPv4 packet segmentation and reassembly implementation. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="af920fb8127d00dd7a8b809afd28723fe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af920fb8127d00dd7a8b809afd28723fe">&#9670;&nbsp;</a></span>IP_REASS_CHECK_OVERLAP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_REASS_CHECK_OVERLAP&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The IP reassembly code currently has the following limitations:</p><ul>
+<li>IP header options are not supported</li>
+<li>fragments must not overlap (e.g. due to different routes), currently, overlapping or duplicate fragments are thrown away if IP_REASS_CHECK_OVERLAP=1 (the default)!</li>
+</ul>
+<p>Setting this to 0, you can turn off checking the fragments for overlapping regions. The code gets a little smaller. Only use this if you know that overlapping won't occur on your network! </p>
+
+</div>
+</div>
+<a id="a510934accf149433bdcf683993e79080"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a510934accf149433bdcf683993e79080">&#9670;&nbsp;</a></span>IP_REASS_FREE_OLDEST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_REASS_FREE_OLDEST&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set to 0 to prevent freeing the oldest datagram when the reassembly buffer is full (IP_REASS_MAX_PBUFS pbufs are enqueued). The code gets a little smaller. Datagrams will be freed by timeout only. Especially useful when MEMP_NUM_REASSDATA is set to 1, so one datagram can be reassembled at a time, only. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a70872fd4c7aefec6b4eef0707e1a371c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a70872fd4c7aefec6b4eef0707e1a371c">&#9670;&nbsp;</a></span>ip4_frag()</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> ip4_frag </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Fragment an IP datagram if too large for the netif.</p>
+<p>Chop the datagram in MTU sized chunks and send them in order by pointing PBUF_REFs into p.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>ip packet to send </td></tr>
+    <tr><td class="paramname">netif</td><td>the netif on which to send </td></tr>
+    <tr><td class="paramname">dest</td><td>destination ip address to which to send</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if sent successfully, err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a7debaa6366c0db4270d4f03219c75c05"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7debaa6366c0db4270d4f03219c75c05">&#9670;&nbsp;</a></span>ip4_reass()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* ip4_reass </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Reassembles incoming IP fragments into an IP datagram.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>points to a pbuf chain of the fragment </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>NULL if reassembly is incomplete, ? otherwise </dd></dl>
+
+</div>
+</div>
+<a id="abc7017eb20983f372e81de7376ebec88"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abc7017eb20983f372e81de7376ebec88">&#9670;&nbsp;</a></span>ip_reass_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ip_reass_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Reassembly timer base function for both NO_SYS == 0 and 1 (!).</p>
+<p>Should be called every 1000 msec (defined by IP_TMR_INTERVAL). </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="ip4__frag_8c.html">ip4_frag.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ip4__frag_8c.js b/doc/doxygen/output/html/ip4__frag_8c.js
new file mode 100644
index 0000000..67f34b9
--- /dev/null
+++ b/doc/doxygen/output/html/ip4__frag_8c.js
@@ -0,0 +1,9 @@
+var ip4__frag_8c =
+[
+    [ "ip_reass_helper", "structip__reass__helper.html", null ],
+    [ "IP_REASS_CHECK_OVERLAP", "ip4__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe", null ],
+    [ "IP_REASS_FREE_OLDEST", "ip4__frag_8c.html#a510934accf149433bdcf683993e79080", null ],
+    [ "ip4_frag", "ip4__frag_8c.html#a70872fd4c7aefec6b4eef0707e1a371c", null ],
+    [ "ip4_reass", "ip4__frag_8c.html#a7debaa6366c0db4270d4f03219c75c05", null ],
+    [ "ip_reass_tmr", "ip4__frag_8c.html#abc7017eb20983f372e81de7376ebec88", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ip4__frag_8h.html b/doc/doxygen/output/html/ip4__frag_8h.html
new file mode 100644
index 0000000..dd50f28
--- /dev/null
+++ b/doc/doxygen/output/html/ip4__frag_8h.html
@@ -0,0 +1,220 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/ip4_frag.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ip4__frag_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">ip4_frag.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="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="netif_8h.html">lwip/netif.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="ip_8h.html">lwip/ip.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structip__reassdata.html">ip_reassdata</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="structpbuf__custom__ref.html">pbuf_custom_ref</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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:abc7017eb20983f372e81de7376ebec88"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip4__frag_8h.html#abc7017eb20983f372e81de7376ebec88">ip_reass_tmr</a> (void)</td></tr>
+<tr class="separator:abc7017eb20983f372e81de7376ebec88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7debaa6366c0db4270d4f03219c75c05"><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="ip4__frag_8h.html#a7debaa6366c0db4270d4f03219c75c05">ip4_reass</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:a7debaa6366c0db4270d4f03219c75c05"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70872fd4c7aefec6b4eef0707e1a371c"><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="ip4__frag_8h.html#a70872fd4c7aefec6b4eef0707e1a371c">ip4_frag</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>, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *dest)</td></tr>
+<tr class="separator:a70872fd4c7aefec6b4eef0707e1a371c"><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>IP fragmentation/reassembly </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a70872fd4c7aefec6b4eef0707e1a371c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a70872fd4c7aefec6b4eef0707e1a371c">&#9670;&nbsp;</a></span>ip4_frag()</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> ip4_frag </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Fragment an IP datagram if too large for the netif.</p>
+<p>Chop the datagram in MTU sized chunks and send them in order by pointing PBUF_REFs into p.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>ip packet to send </td></tr>
+    <tr><td class="paramname">netif</td><td>the netif on which to send </td></tr>
+    <tr><td class="paramname">dest</td><td>destination ip address to which to send</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if sent successfully, err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a7debaa6366c0db4270d4f03219c75c05"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7debaa6366c0db4270d4f03219c75c05">&#9670;&nbsp;</a></span>ip4_reass()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* ip4_reass </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Reassembles incoming IP fragments into an IP datagram.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>points to a pbuf chain of the fragment </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>NULL if reassembly is incomplete, ? otherwise </dd></dl>
+
+</div>
+</div>
+<a id="abc7017eb20983f372e81de7376ebec88"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abc7017eb20983f372e81de7376ebec88">&#9670;&nbsp;</a></span>ip_reass_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ip_reass_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Reassembly timer base function for both NO_SYS == 0 and 1 (!).</p>
+<p>Should be called every 1000 msec (defined by IP_TMR_INTERVAL). </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="ip4__frag_8h.html">ip4_frag.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ip4__frag_8h.js b/doc/doxygen/output/html/ip4__frag_8h.js
new file mode 100644
index 0000000..f83c971
--- /dev/null
+++ b/doc/doxygen/output/html/ip4__frag_8h.js
@@ -0,0 +1,8 @@
+var ip4__frag_8h =
+[
+    [ "ip_reassdata", "structip__reassdata.html", null ],
+    [ "pbuf_custom_ref", "structpbuf__custom__ref.html", "structpbuf__custom__ref" ],
+    [ "ip4_frag", "ip4__frag_8h.html#a70872fd4c7aefec6b4eef0707e1a371c", null ],
+    [ "ip4_reass", "ip4__frag_8h.html#a7debaa6366c0db4270d4f03219c75c05", null ],
+    [ "ip_reass_tmr", "ip4__frag_8h.html#abc7017eb20983f372e81de7376ebec88", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ip6_8c.html b/doc/doxygen/output/html/ip6_8c.html
new file mode 100644
index 0000000..c8d46d3
--- /dev/null
+++ b/doc/doxygen/output/html/ip6_8c.html
@@ -0,0 +1,458 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv6/ip6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ip6_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">ip6.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 &quot;<a class="el" href="def_8h.html">lwip/def.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="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6_8h.html">lwip/ip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__frag_8h.html">lwip/ip6_frag.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="icmp6_8h.html">lwip/icmp6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="raw__priv_8h.html">lwip/priv/raw_priv.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="tcp__priv_8h.html">lwip/priv/tcp_priv.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="nd6_8h.html">lwip/nd6.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="debug_8h.html">lwip/debug.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<code>#include &quot;path/to/my/lwip_hooks.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1153bd9e8c45847282105ab6379e6e70"><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="ip6_8c.html#a1153bd9e8c45847282105ab6379e6e70">ip6_route</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *src, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest)</td></tr>
+<tr class="separator:a1153bd9e8c45847282105ab6379e6e70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga540ad82e2af4c4709f1852e63c36706a"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6.html#ga540ad82e2af4c4709f1852e63c36706a">ip6_select_source_address</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest)</td></tr>
+<tr class="separator:ga540ad82e2af4c4709f1852e63c36706a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6bbbae5ea37a82c746dba2feb1abd094"><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="ip6_8c.html#a6bbbae5ea37a82c746dba2feb1abd094">ip6_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:a6bbbae5ea37a82c746dba2feb1abd094"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeb1c9967e7ae7d7ba71b68256ff6fdb4"><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="ip6_8c.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4">ip6_output_if</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *src, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest, u8_t hl, u8_t tc, u8_t nexth, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:aeb1c9967e7ae7d7ba71b68256ff6fdb4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a58bd3c9ce332731fac82b89c77be4f56"><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="ip6_8c.html#a58bd3c9ce332731fac82b89c77be4f56">ip6_output_if_src</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *src, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest, u8_t hl, u8_t tc, u8_t nexth, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a58bd3c9ce332731fac82b89c77be4f56"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aec695e64536ac744e616c997deb84cda"><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="ip6_8c.html#aec695e64536ac744e616c997deb84cda">ip6_output</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *src, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest, u8_t hl, u8_t tc, u8_t nexth)</td></tr>
+<tr class="separator:aec695e64536ac744e616c997deb84cda"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7a8d47200bb6ccbec329be8f0979853e"><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="ip6_8c.html#a7a8d47200bb6ccbec329be8f0979853e">ip6_options_add_hbh_ra</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u8_t nexth, u8_t value)</td></tr>
+<tr class="separator:a7a8d47200bb6ccbec329be8f0979853e"><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>IPv6 layer. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a6bbbae5ea37a82c746dba2feb1abd094"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6bbbae5ea37a82c746dba2feb1abd094">&#9670;&nbsp;</a></span>ip6_input()</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> ip6_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called by the network interface device driver when an IPv6 packet is received. The function does the basic checks of the IP header such as packet size being at least larger than the header size etc. If the packet was not destined for us, the packet is forwarded (using ip6_forward).</p>
+<p>Finally, the packet is sent to the upper layer protocol input function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the received IPv6 packet (p-&gt;payload points to IPv6 header) </td></tr>
+    <tr><td class="paramname">inp</td><td>the netif on which this packet was received </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the packet was processed (could return ERR_* if it wasn't processed, but currently always returns ERR_OK) </dd></dl>
+
+</div>
+</div>
+<a id="a7a8d47200bb6ccbec329be8f0979853e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7a8d47200bb6ccbec329be8f0979853e">&#9670;&nbsp;</a></span>ip6_options_add_hbh_ra()</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> ip6_options_add_hbh_ra </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>nexth</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add a hop-by-hop options header with a router alert option and padding.</p>
+<p>Used by MLD when sending a Multicast listener report/done message.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the packet to which we will prepend the options header </td></tr>
+    <tr><td class="paramname">nexth</td><td>the next header protocol number (e.g. IP6_NEXTH_ICMP6) </td></tr>
+    <tr><td class="paramname">value</td><td>the value of the router alert option data (e.g. IP6_ROUTER_ALERT_VALUE_MLD) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if hop-by-hop header was added, ERR_* otherwise </dd></dl>
+
+</div>
+</div>
+<a id="aec695e64536ac744e616c997deb84cda"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aec695e64536ac744e616c997deb84cda">&#9670;&nbsp;</a></span>ip6_output()</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> ip6_output </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>hl</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>tc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>nexth</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Simple interface to ip6_output_if. It finds the outgoing network interface and calls upon ip6_output_if to do the actual work.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the packet to send (p-&gt;payload points to the data, e.g. next protocol header; if dest == LWIP_IP_HDRINCL, p already includes an IPv6 header and p-&gt;payload points to that IPv6 header) </td></tr>
+    <tr><td class="paramname">src</td><td>the source IPv6 address to send from (if src == IP6_ADDR_ANY, an IP address of the netif is selected and used as source address. if src == NULL, IP6_ADDR_ANY is used as source) </td></tr>
+    <tr><td class="paramname">dest</td><td>the destination IPv6 address to send the packet to </td></tr>
+    <tr><td class="paramname">hl</td><td>the Hop Limit value to be set in the IPv6 header </td></tr>
+    <tr><td class="paramname">tc</td><td>the Traffic Class value to be set in the IPv6 header </td></tr>
+    <tr><td class="paramname">nexth</td><td>the Next Header to be set in the IPv6 header</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_RTE if no route is found see <a class="el" href="group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250">ip_output_if()</a> for more return values </dd></dl>
+
+</div>
+</div>
+<a id="aeb1c9967e7ae7d7ba71b68256ff6fdb4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeb1c9967e7ae7d7ba71b68256ff6fdb4">&#9670;&nbsp;</a></span>ip6_output_if()</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> ip6_output_if </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>hl</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>tc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>nexth</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sends an IPv6 packet on a network interface. This function constructs the IPv6 header. If the source IPv6 address is NULL, the IPv6 "ANY" address is used as source (usually during network startup). If the source IPv6 address it IP6_ADDR_ANY, the most appropriate IPv6 address of the outgoing network interface is filled in as source address. If the destination IPv6 address is LWIP_IP_HDRINCL, p is assumed to already include an IPv6 header and p-&gt;payload points to it instead of the data.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the packet to send (p-&gt;payload points to the data, e.g. next protocol header; if dest == LWIP_IP_HDRINCL, p already includes an IPv6 header and p-&gt;payload points to that IPv6 header) </td></tr>
+    <tr><td class="paramname">src</td><td>the source IPv6 address to send from (if src == IP6_ADDR_ANY, an IP address of the netif is selected and used as source address. if src == NULL, IP6_ADDR_ANY is used as source) (src is possibly not properly zoned) </td></tr>
+    <tr><td class="paramname">dest</td><td>the destination IPv6 address to send the packet to (possibly not properly zoned) </td></tr>
+    <tr><td class="paramname">hl</td><td>the Hop Limit value to be set in the IPv6 header </td></tr>
+    <tr><td class="paramname">tc</td><td>the Traffic Class value to be set in the IPv6 header </td></tr>
+    <tr><td class="paramname">nexth</td><td>the Next Header to be set in the IPv6 header </td></tr>
+    <tr><td class="paramname">netif</td><td>the netif on which to send this packet </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the packet was sent OK ERR_BUF if p doesn't have enough space for IPv6/LINK headers returns errors returned by netif-&gt;output_ip6 </dd></dl>
+
+</div>
+</div>
+<a id="a58bd3c9ce332731fac82b89c77be4f56"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a58bd3c9ce332731fac82b89c77be4f56">&#9670;&nbsp;</a></span>ip6_output_if_src()</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> ip6_output_if_src </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>hl</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>tc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>nexth</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as <a class="el" href="ip6_8c.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4">ip6_output_if()</a> but 'src' address is not replaced by netif address when it is 'any'. </p>
+
+</div>
+</div>
+<a id="a1153bd9e8c45847282105ab6379e6e70"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1153bd9e8c45847282105ab6379e6e70">&#9670;&nbsp;</a></span>ip6_route()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* ip6_route </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Finds the appropriate network interface for a given IPv6 address. It tries to select a netif following a sequence of heuristics: 1) if there is only 1 netif, return it 2) if the destination is a zoned address, match its zone to a netif 3) if the either the source or destination address is a scoped address, match the source address's zone (if set) or address (if not) to a netif 4) tries to match the destination subnet to a configured address 5) tries to find a router-announced route 6) tries to match the (unscoped) source address to the netif 7) returns the default netif, if configured</p>
+<p>Note that each of the two given addresses may or may not be properly zoned.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">src</td><td>the source IPv6 address, if known </td></tr>
+    <tr><td class="paramname">dest</td><td>the destination IPv6 address for which to find the route </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the netif on which to send to reach dest </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_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li><li class="navelem"><a class="el" href="dir_da9c6f43d3cd00be3de224bac907a425.html">ipv6</a></li><li class="navelem"><a class="el" href="ip6_8c.html">ip6.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ip6_8c.js b/doc/doxygen/output/html/ip6_8c.js
new file mode 100644
index 0000000..f4e79ab
--- /dev/null
+++ b/doc/doxygen/output/html/ip6_8c.js
@@ -0,0 +1,10 @@
+var ip6_8c =
+[
+    [ "ip6_input", "ip6_8c.html#a6bbbae5ea37a82c746dba2feb1abd094", null ],
+    [ "ip6_options_add_hbh_ra", "ip6_8c.html#a7a8d47200bb6ccbec329be8f0979853e", null ],
+    [ "ip6_output", "ip6_8c.html#aec695e64536ac744e616c997deb84cda", null ],
+    [ "ip6_output_if", "ip6_8c.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4", null ],
+    [ "ip6_output_if_src", "ip6_8c.html#a58bd3c9ce332731fac82b89c77be4f56", null ],
+    [ "ip6_route", "ip6_8c.html#a1153bd9e8c45847282105ab6379e6e70", null ],
+    [ "ip6_select_source_address", "group__ip6.html#ga540ad82e2af4c4709f1852e63c36706a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ip6_8h.html b/doc/doxygen/output/html/ip6_8h.html
new file mode 100644
index 0000000..3072a25
--- /dev/null
+++ b/doc/doxygen/output/html/ip6_8h.html
@@ -0,0 +1,447 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/ip6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ip6_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">ip6.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="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2ip6_8h.html">lwip/prot/ip6.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="pbuf_8h.html">lwip/pbuf.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="err_8h.html">lwip/err.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1153bd9e8c45847282105ab6379e6e70"><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="ip6_8h.html#a1153bd9e8c45847282105ab6379e6e70">ip6_route</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *src, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest)</td></tr>
+<tr class="separator:a1153bd9e8c45847282105ab6379e6e70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga540ad82e2af4c4709f1852e63c36706a"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6.html#ga540ad82e2af4c4709f1852e63c36706a">ip6_select_source_address</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest)</td></tr>
+<tr class="separator:ga540ad82e2af4c4709f1852e63c36706a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6bbbae5ea37a82c746dba2feb1abd094"><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="ip6_8h.html#a6bbbae5ea37a82c746dba2feb1abd094">ip6_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:a6bbbae5ea37a82c746dba2feb1abd094"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aec695e64536ac744e616c997deb84cda"><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="ip6_8h.html#aec695e64536ac744e616c997deb84cda">ip6_output</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *src, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest, u8_t hl, u8_t tc, u8_t nexth)</td></tr>
+<tr class="separator:aec695e64536ac744e616c997deb84cda"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeb1c9967e7ae7d7ba71b68256ff6fdb4"><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="ip6_8h.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4">ip6_output_if</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *src, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest, u8_t hl, u8_t tc, u8_t nexth, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:aeb1c9967e7ae7d7ba71b68256ff6fdb4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a58bd3c9ce332731fac82b89c77be4f56"><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="ip6_8h.html#a58bd3c9ce332731fac82b89c77be4f56">ip6_output_if_src</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *src, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest, u8_t hl, u8_t tc, u8_t nexth, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a58bd3c9ce332731fac82b89c77be4f56"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7a8d47200bb6ccbec329be8f0979853e"><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="ip6_8h.html#a7a8d47200bb6ccbec329be8f0979853e">ip6_options_add_hbh_ra</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u8_t nexth, u8_t value)</td></tr>
+<tr class="separator:a7a8d47200bb6ccbec329be8f0979853e"><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>IPv6 layer. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a6bbbae5ea37a82c746dba2feb1abd094"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6bbbae5ea37a82c746dba2feb1abd094">&#9670;&nbsp;</a></span>ip6_input()</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> ip6_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called by the network interface device driver when an IPv6 packet is received. The function does the basic checks of the IP header such as packet size being at least larger than the header size etc. If the packet was not destined for us, the packet is forwarded (using ip6_forward).</p>
+<p>Finally, the packet is sent to the upper layer protocol input function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the received IPv6 packet (p-&gt;payload points to IPv6 header) </td></tr>
+    <tr><td class="paramname">inp</td><td>the netif on which this packet was received </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the packet was processed (could return ERR_* if it wasn't processed, but currently always returns ERR_OK) </dd></dl>
+
+</div>
+</div>
+<a id="a7a8d47200bb6ccbec329be8f0979853e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7a8d47200bb6ccbec329be8f0979853e">&#9670;&nbsp;</a></span>ip6_options_add_hbh_ra()</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> ip6_options_add_hbh_ra </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>nexth</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add a hop-by-hop options header with a router alert option and padding.</p>
+<p>Used by MLD when sending a Multicast listener report/done message.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the packet to which we will prepend the options header </td></tr>
+    <tr><td class="paramname">nexth</td><td>the next header protocol number (e.g. IP6_NEXTH_ICMP6) </td></tr>
+    <tr><td class="paramname">value</td><td>the value of the router alert option data (e.g. IP6_ROUTER_ALERT_VALUE_MLD) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if hop-by-hop header was added, ERR_* otherwise </dd></dl>
+
+</div>
+</div>
+<a id="aec695e64536ac744e616c997deb84cda"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aec695e64536ac744e616c997deb84cda">&#9670;&nbsp;</a></span>ip6_output()</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> ip6_output </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>hl</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>tc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>nexth</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Simple interface to ip6_output_if. It finds the outgoing network interface and calls upon ip6_output_if to do the actual work.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the packet to send (p-&gt;payload points to the data, e.g. next protocol header; if dest == LWIP_IP_HDRINCL, p already includes an IPv6 header and p-&gt;payload points to that IPv6 header) </td></tr>
+    <tr><td class="paramname">src</td><td>the source IPv6 address to send from (if src == IP6_ADDR_ANY, an IP address of the netif is selected and used as source address. if src == NULL, IP6_ADDR_ANY is used as source) </td></tr>
+    <tr><td class="paramname">dest</td><td>the destination IPv6 address to send the packet to </td></tr>
+    <tr><td class="paramname">hl</td><td>the Hop Limit value to be set in the IPv6 header </td></tr>
+    <tr><td class="paramname">tc</td><td>the Traffic Class value to be set in the IPv6 header </td></tr>
+    <tr><td class="paramname">nexth</td><td>the Next Header to be set in the IPv6 header</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_RTE if no route is found see <a class="el" href="group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250">ip_output_if()</a> for more return values </dd></dl>
+
+</div>
+</div>
+<a id="aeb1c9967e7ae7d7ba71b68256ff6fdb4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeb1c9967e7ae7d7ba71b68256ff6fdb4">&#9670;&nbsp;</a></span>ip6_output_if()</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> ip6_output_if </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>hl</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>tc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>nexth</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sends an IPv6 packet on a network interface. This function constructs the IPv6 header. If the source IPv6 address is NULL, the IPv6 "ANY" address is used as source (usually during network startup). If the source IPv6 address it IP6_ADDR_ANY, the most appropriate IPv6 address of the outgoing network interface is filled in as source address. If the destination IPv6 address is LWIP_IP_HDRINCL, p is assumed to already include an IPv6 header and p-&gt;payload points to it instead of the data.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the packet to send (p-&gt;payload points to the data, e.g. next protocol header; if dest == LWIP_IP_HDRINCL, p already includes an IPv6 header and p-&gt;payload points to that IPv6 header) </td></tr>
+    <tr><td class="paramname">src</td><td>the source IPv6 address to send from (if src == IP6_ADDR_ANY, an IP address of the netif is selected and used as source address. if src == NULL, IP6_ADDR_ANY is used as source) (src is possibly not properly zoned) </td></tr>
+    <tr><td class="paramname">dest</td><td>the destination IPv6 address to send the packet to (possibly not properly zoned) </td></tr>
+    <tr><td class="paramname">hl</td><td>the Hop Limit value to be set in the IPv6 header </td></tr>
+    <tr><td class="paramname">tc</td><td>the Traffic Class value to be set in the IPv6 header </td></tr>
+    <tr><td class="paramname">nexth</td><td>the Next Header to be set in the IPv6 header </td></tr>
+    <tr><td class="paramname">netif</td><td>the netif on which to send this packet </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the packet was sent OK ERR_BUF if p doesn't have enough space for IPv6/LINK headers returns errors returned by netif-&gt;output_ip6 </dd></dl>
+
+</div>
+</div>
+<a id="a58bd3c9ce332731fac82b89c77be4f56"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a58bd3c9ce332731fac82b89c77be4f56">&#9670;&nbsp;</a></span>ip6_output_if_src()</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> ip6_output_if_src </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </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> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>hl</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>tc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>nexth</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as <a class="el" href="ip6_8c.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4">ip6_output_if()</a> but 'src' address is not replaced by netif address when it is 'any'. </p>
+
+</div>
+</div>
+<a id="a1153bd9e8c45847282105ab6379e6e70"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1153bd9e8c45847282105ab6379e6e70">&#9670;&nbsp;</a></span>ip6_route()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* ip6_route </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>src</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Finds the appropriate network interface for a given IPv6 address. It tries to select a netif following a sequence of heuristics: 1) if there is only 1 netif, return it 2) if the destination is a zoned address, match its zone to a netif 3) if the either the source or destination address is a scoped address, match the source address's zone (if set) or address (if not) to a netif 4) tries to match the destination subnet to a configured address 5) tries to find a router-announced route 6) tries to match the (unscoped) source address to the netif 7) returns the default netif, if configured</p>
+<p>Note that each of the two given addresses may or may not be properly zoned.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">src</td><td>the source IPv6 address, if known </td></tr>
+    <tr><td class="paramname">dest</td><td>the destination IPv6 address for which to find the route </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the netif on which to send to reach dest </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="ip6_8h.html">ip6.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ip6_8h.js b/doc/doxygen/output/html/ip6_8h.js
new file mode 100644
index 0000000..a04a6f7
--- /dev/null
+++ b/doc/doxygen/output/html/ip6_8h.js
@@ -0,0 +1,10 @@
+var ip6_8h =
+[
+    [ "ip6_input", "ip6_8h.html#a6bbbae5ea37a82c746dba2feb1abd094", null ],
+    [ "ip6_options_add_hbh_ra", "ip6_8h.html#a7a8d47200bb6ccbec329be8f0979853e", null ],
+    [ "ip6_output", "ip6_8h.html#aec695e64536ac744e616c997deb84cda", null ],
+    [ "ip6_output_if", "ip6_8h.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4", null ],
+    [ "ip6_output_if_src", "ip6_8h.html#a58bd3c9ce332731fac82b89c77be4f56", null ],
+    [ "ip6_route", "ip6_8h.html#a1153bd9e8c45847282105ab6379e6e70", null ],
+    [ "ip6_select_source_address", "group__ip6.html#ga540ad82e2af4c4709f1852e63c36706a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ip6__addr_8c.html b/doc/doxygen/output/html/ip6__addr_8c.html
new file mode 100644
index 0000000..22b1307
--- /dev/null
+++ b/doc/doxygen/output/html/ip6__addr_8c.html
@@ -0,0 +1,227 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv6/ip6_addr.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ip6__addr_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">ip6_addr.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 &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 &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">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3f555ae302eb056f28f6cb266a27036e"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8c.html#a3f555ae302eb056f28f6cb266a27036e">ip6addr_aton</a> (const char *cp, <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *addr)</td></tr>
+<tr class="separator:a3f555ae302eb056f28f6cb266a27036e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adba4443e6629583d48e1d1c7c21a977e"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8c.html#adba4443e6629583d48e1d1c7c21a977e">ip6addr_ntoa</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *addr)</td></tr>
+<tr class="separator:adba4443e6629583d48e1d1c7c21a977e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a64d442f35f34c43121bf91cfea2e77a2"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8c.html#a64d442f35f34c43121bf91cfea2e77a2">ip6addr_ntoa_r</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *addr, char *buf, int buflen)</td></tr>
+<tr class="separator:a64d442f35f34c43121bf91cfea2e77a2"><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>IPv6 addresses. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a3f555ae302eb056f28f6cb266a27036e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3f555ae302eb056f28f6cb266a27036e">&#9670;&nbsp;</a></span>ip6addr_aton()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ip6addr_aton </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>cp</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Check whether "cp" is a valid ascii representation of an IPv6 address and convert to a binary address. Returns 1 if the address is valid, 0 if not.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">cp</td><td>IPv6 address in ascii representation (e.g. "FF01::1") </td></tr>
+    <tr><td class="paramname">addr</td><td>pointer to which to save the ip address in network order </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if cp could be converted to addr, 0 on failure </dd></dl>
+
+</div>
+</div>
+<a id="adba4443e6629583d48e1d1c7c21a977e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adba4443e6629583d48e1d1c7c21a977e">&#9670;&nbsp;</a></span>ip6addr_ntoa()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* ip6addr_ntoa </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert numeric IPv6 address into ASCII representation. returns ptr to static buffer; not reentrant!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">addr</td><td>ip6 address in network order to convert </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to a global static (!) buffer that holds the ASCII representation of addr </dd></dl>
+
+</div>
+</div>
+<a id="a64d442f35f34c43121bf91cfea2e77a2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a64d442f35f34c43121bf91cfea2e77a2">&#9670;&nbsp;</a></span>ip6addr_ntoa_r()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* ip6addr_ntoa_r </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>buflen</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">addr</td><td>ip6 address in network order to convert </td></tr>
+    <tr><td class="paramname">buf</td><td>target buffer where the string is stored </td></tr>
+    <tr><td class="paramname">buflen</td><td>length of buf </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>either pointer to buf which now holds the ASCII representation of addr or NULL if buf was too small </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_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li><li class="navelem"><a class="el" href="dir_da9c6f43d3cd00be3de224bac907a425.html">ipv6</a></li><li class="navelem"><a class="el" href="ip6__addr_8c.html">ip6_addr.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ip6__addr_8c.js b/doc/doxygen/output/html/ip6__addr_8c.js
new file mode 100644
index 0000000..b955d35
--- /dev/null
+++ b/doc/doxygen/output/html/ip6__addr_8c.js
@@ -0,0 +1,6 @@
+var ip6__addr_8c =
+[
+    [ "ip6addr_aton", "ip6__addr_8c.html#a3f555ae302eb056f28f6cb266a27036e", null ],
+    [ "ip6addr_ntoa", "ip6__addr_8c.html#adba4443e6629583d48e1d1c7c21a977e", null ],
+    [ "ip6addr_ntoa_r", "ip6__addr_8c.html#a64d442f35f34c43121bf91cfea2e77a2", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ip6__addr_8h.html b/doc/doxygen/output/html/ip6__addr_8h.html
new file mode 100644
index 0000000..9b391be
--- /dev/null
+++ b/doc/doxygen/output/html/ip6__addr_8h.html
@@ -0,0 +1,933 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/ip6_addr.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ip6__addr_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">ip6_addr.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="def_8h.html">def.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__zone_8h.html">lwip/ip6_zone.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structip6__addr.html">ip6_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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a1d78feeb50aec8f2c07d840829f49ddd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#a1d78feeb50aec8f2c07d840829f49ddd">IP6_ADDR_PART</a>(ip6addr,  index,  a,  b,  c,  d)&#160;&#160;&#160;(ip6addr)-&gt;addr[index] = PP_HTONL(<a class="el" href="def_8h.html#acf56d3da92a0a7a8a62a617e793e948c">LWIP_MAKEU32</a>(a,b,c,d))</td></tr>
+<tr class="separator:a1d78feeb50aec8f2c07d840829f49ddd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a30c92254d6abe631de6a5accfd491bc3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#a30c92254d6abe631de6a5accfd491bc3">IP6_ADDR</a>(ip6addr,  idx0,  idx1,  idx2,  idx3)</td></tr>
+<tr class="separator:a30c92254d6abe631de6a5accfd491bc3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae258ebfa66d18c8c428bf3d8fd0f969c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#ae258ebfa66d18c8c428bf3d8fd0f969c">IP6_ADDR_BLOCK1</a>(ip6addr)&#160;&#160;&#160;((u16_t)((<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>((ip6addr)-&gt;addr[0]) &gt;&gt; 16) &amp; 0xffff))</td></tr>
+<tr class="separator:ae258ebfa66d18c8c428bf3d8fd0f969c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9193137423b6b936d25c2e6cf33b4921"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#a9193137423b6b936d25c2e6cf33b4921">IP6_ADDR_BLOCK2</a>(ip6addr)&#160;&#160;&#160;((u16_t)((<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>((ip6addr)-&gt;addr[0])) &amp; 0xffff))</td></tr>
+<tr class="separator:a9193137423b6b936d25c2e6cf33b4921"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6466b1c0edd03d6a5986dcc79f7d8bb6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#a6466b1c0edd03d6a5986dcc79f7d8bb6">IP6_ADDR_BLOCK3</a>(ip6addr)&#160;&#160;&#160;((u16_t)((<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>((ip6addr)-&gt;addr[1]) &gt;&gt; 16) &amp; 0xffff))</td></tr>
+<tr class="separator:a6466b1c0edd03d6a5986dcc79f7d8bb6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2a5d7de341ce708b7145ad4d72652c71"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#a2a5d7de341ce708b7145ad4d72652c71">IP6_ADDR_BLOCK4</a>(ip6addr)&#160;&#160;&#160;((u16_t)((<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>((ip6addr)-&gt;addr[1])) &amp; 0xffff))</td></tr>
+<tr class="separator:a2a5d7de341ce708b7145ad4d72652c71"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56a11cfaa169389c319f8bd027ac524c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#a56a11cfaa169389c319f8bd027ac524c">IP6_ADDR_BLOCK5</a>(ip6addr)&#160;&#160;&#160;((u16_t)((<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>((ip6addr)-&gt;addr[2]) &gt;&gt; 16) &amp; 0xffff))</td></tr>
+<tr class="separator:a56a11cfaa169389c319f8bd027ac524c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a116d7c5c8bf8531b27f8a9fa98e728c3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#a116d7c5c8bf8531b27f8a9fa98e728c3">IP6_ADDR_BLOCK6</a>(ip6addr)&#160;&#160;&#160;((u16_t)((<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>((ip6addr)-&gt;addr[2])) &amp; 0xffff))</td></tr>
+<tr class="separator:a116d7c5c8bf8531b27f8a9fa98e728c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab87bee320ecc0e923931ee6f49802deb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#ab87bee320ecc0e923931ee6f49802deb">IP6_ADDR_BLOCK7</a>(ip6addr)&#160;&#160;&#160;((u16_t)((<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>((ip6addr)-&gt;addr[3]) &gt;&gt; 16) &amp; 0xffff))</td></tr>
+<tr class="separator:ab87bee320ecc0e923931ee6f49802deb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3d1f9876bf256ec964bd3809d7ed1b4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#af3d1f9876bf256ec964bd3809d7ed1b4">IP6_ADDR_BLOCK8</a>(ip6addr)&#160;&#160;&#160;((u16_t)((<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>((ip6addr)-&gt;addr[3])) &amp; 0xffff))</td></tr>
+<tr class="separator:af3d1f9876bf256ec964bd3809d7ed1b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b17e85a46bd8368ce27fc644e058073"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#a7b17e85a46bd8368ce27fc644e058073">ip6_addr_copy</a>(dest,  src)</td></tr>
+<tr class="separator:a7b17e85a46bd8368ce27fc644e058073"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa7b4ba4202b5f64dee605fe159e9c3ad"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#aa7b4ba4202b5f64dee605fe159e9c3ad">ip6_addr_set</a>(dest,  src)</td></tr>
+<tr class="separator:aa7b4ba4202b5f64dee605fe159e9c3ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a05575d46c233ffb13fb03a3a2c8a16b3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#a05575d46c233ffb13fb03a3a2c8a16b3">ip6_addr_copy_from_packed</a>(dest,  src)</td></tr>
+<tr class="separator:a05575d46c233ffb13fb03a3a2c8a16b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c46d12fa7d36c47b629d0ccdefa114b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#a6c46d12fa7d36c47b629d0ccdefa114b">ip6_addr_copy_to_packed</a>(dest,  src)</td></tr>
+<tr class="separator:a6c46d12fa7d36c47b629d0ccdefa114b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af696d3b81f4cb9c40ece912de73ed53c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#af696d3b81f4cb9c40ece912de73ed53c">ip6_addr_set_zero</a>(ip6addr)</td></tr>
+<tr class="separator:af696d3b81f4cb9c40ece912de73ed53c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae2d1ce50ec6dbee890e2f8ae64abdf6b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#ae2d1ce50ec6dbee890e2f8ae64abdf6b">ip6_addr_set_any</a>(ip6addr)&#160;&#160;&#160;<a class="el" href="ip6__addr_8h.html#af696d3b81f4cb9c40ece912de73ed53c">ip6_addr_set_zero</a>(ip6addr)</td></tr>
+<tr class="separator:ae2d1ce50ec6dbee890e2f8ae64abdf6b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a02f5271e922f34a09153ce84839ad292"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#a02f5271e922f34a09153ce84839ad292">ip6_addr_set_loopback</a>(ip6addr)</td></tr>
+<tr class="separator:a02f5271e922f34a09153ce84839ad292"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad636c27d56d1b3deca9f780bc173d3c2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#ad636c27d56d1b3deca9f780bc173d3c2">ip6_addr_set_hton</a>(dest,  src)</td></tr>
+<tr class="separator:ad636c27d56d1b3deca9f780bc173d3c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc1622ab895680da0a3b6e5e56070342"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#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:a76b01f76b65647767d00ee9fad9fbaa2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2">ip6_addr_netcmp</a>(addr1,  addr2)</td></tr>
+<tr class="separator:a76b01f76b65647767d00ee9fad9fbaa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad0fc088972d395839a7ad75d3dab8322"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#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:aea8d4c4134abff1c76bc997a91163fe1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#aea8d4c4134abff1c76bc997a91163fe1">ip6_addr_cmp</a>(addr1,  addr2)</td></tr>
+<tr class="separator:aea8d4c4134abff1c76bc997a91163fe1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a11fe84789e3f039b3f71009e802946a8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#a11fe84789e3f039b3f71009e802946a8">ip6_addr_cmp_packed</a>(ip6addr,  paddr,  zone_idx)</td></tr>
+<tr class="separator:a11fe84789e3f039b3f71009e802946a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:aaca9e796e93a355294c4954c08d01762"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structip6__addr.html">ip6_addr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a></td></tr>
+<tr class="separator:aaca9e796e93a355294c4954c08d01762"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3f555ae302eb056f28f6cb266a27036e"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#a3f555ae302eb056f28f6cb266a27036e">ip6addr_aton</a> (const char *cp, <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *addr)</td></tr>
+<tr class="separator:a3f555ae302eb056f28f6cb266a27036e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adba4443e6629583d48e1d1c7c21a977e"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#adba4443e6629583d48e1d1c7c21a977e">ip6addr_ntoa</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *addr)</td></tr>
+<tr class="separator:adba4443e6629583d48e1d1c7c21a977e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a64d442f35f34c43121bf91cfea2e77a2"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__addr_8h.html#a64d442f35f34c43121bf91cfea2e77a2">ip6addr_ntoa_r</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *addr, char *buf, int buflen)</td></tr>
+<tr class="separator:a64d442f35f34c43121bf91cfea2e77a2"><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>IPv6 addresses. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a30c92254d6abe631de6a5accfd491bc3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a30c92254d6abe631de6a5accfd491bc3">&#9670;&nbsp;</a></span>IP6_ADDR</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP6_ADDR</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">idx0, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">idx1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">idx2, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">idx3&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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> { \</div><div class="line">  (ip6addr)-&gt;addr[0] = idx0; \</div><div class="line">  (ip6addr)-&gt;addr[1] = idx1; \</div><div class="line">  (ip6addr)-&gt;addr[2] = idx2; \</div><div class="line">  (ip6addr)-&gt;addr[3] = idx3; \</div><div class="line">  ip6_addr_clear_zone(ip6addr); } <span class="keywordflow">while</span>(0)</div></div><!-- fragment --><p>Set a full IPv6 address by passing the 4 u32_t indices in network byte order (use PP_HTONL() for constants) </p>
+
+</div>
+</div>
+<a id="ae258ebfa66d18c8c428bf3d8fd0f969c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae258ebfa66d18c8c428bf3d8fd0f969c">&#9670;&nbsp;</a></span>IP6_ADDR_BLOCK1</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP6_ADDR_BLOCK1</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr</td><td>)</td>
+          <td>&#160;&#160;&#160;((u16_t)((<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>((ip6addr)-&gt;addr[0]) &gt;&gt; 16) &amp; 0xffff))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Access address in 16-bit block </p>
+
+</div>
+</div>
+<a id="a9193137423b6b936d25c2e6cf33b4921"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9193137423b6b936d25c2e6cf33b4921">&#9670;&nbsp;</a></span>IP6_ADDR_BLOCK2</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP6_ADDR_BLOCK2</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr</td><td>)</td>
+          <td>&#160;&#160;&#160;((u16_t)((<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>((ip6addr)-&gt;addr[0])) &amp; 0xffff))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Access address in 16-bit block </p>
+
+</div>
+</div>
+<a id="a6466b1c0edd03d6a5986dcc79f7d8bb6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6466b1c0edd03d6a5986dcc79f7d8bb6">&#9670;&nbsp;</a></span>IP6_ADDR_BLOCK3</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP6_ADDR_BLOCK3</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr</td><td>)</td>
+          <td>&#160;&#160;&#160;((u16_t)((<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>((ip6addr)-&gt;addr[1]) &gt;&gt; 16) &amp; 0xffff))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Access address in 16-bit block </p>
+
+</div>
+</div>
+<a id="a2a5d7de341ce708b7145ad4d72652c71"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2a5d7de341ce708b7145ad4d72652c71">&#9670;&nbsp;</a></span>IP6_ADDR_BLOCK4</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP6_ADDR_BLOCK4</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr</td><td>)</td>
+          <td>&#160;&#160;&#160;((u16_t)((<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>((ip6addr)-&gt;addr[1])) &amp; 0xffff))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Access address in 16-bit block </p>
+
+</div>
+</div>
+<a id="a56a11cfaa169389c319f8bd027ac524c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a56a11cfaa169389c319f8bd027ac524c">&#9670;&nbsp;</a></span>IP6_ADDR_BLOCK5</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP6_ADDR_BLOCK5</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr</td><td>)</td>
+          <td>&#160;&#160;&#160;((u16_t)((<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>((ip6addr)-&gt;addr[2]) &gt;&gt; 16) &amp; 0xffff))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Access address in 16-bit block </p>
+
+</div>
+</div>
+<a id="a116d7c5c8bf8531b27f8a9fa98e728c3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a116d7c5c8bf8531b27f8a9fa98e728c3">&#9670;&nbsp;</a></span>IP6_ADDR_BLOCK6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP6_ADDR_BLOCK6</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr</td><td>)</td>
+          <td>&#160;&#160;&#160;((u16_t)((<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>((ip6addr)-&gt;addr[2])) &amp; 0xffff))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Access address in 16-bit block </p>
+
+</div>
+</div>
+<a id="ab87bee320ecc0e923931ee6f49802deb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab87bee320ecc0e923931ee6f49802deb">&#9670;&nbsp;</a></span>IP6_ADDR_BLOCK7</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP6_ADDR_BLOCK7</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr</td><td>)</td>
+          <td>&#160;&#160;&#160;((u16_t)((<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>((ip6addr)-&gt;addr[3]) &gt;&gt; 16) &amp; 0xffff))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Access address in 16-bit block </p>
+
+</div>
+</div>
+<a id="af3d1f9876bf256ec964bd3809d7ed1b4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af3d1f9876bf256ec964bd3809d7ed1b4">&#9670;&nbsp;</a></span>IP6_ADDR_BLOCK8</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP6_ADDR_BLOCK8</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr</td><td>)</td>
+          <td>&#160;&#160;&#160;((u16_t)((<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>((ip6addr)-&gt;addr[3])) &amp; 0xffff))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Access address in 16-bit block </p>
+
+</div>
+</div>
+<a id="aea8d4c4134abff1c76bc997a91163fe1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aea8d4c4134abff1c76bc997a91163fe1">&#9670;&nbsp;</a></span>ip6_addr_cmp</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_cmp</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addr1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addr2&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(<a class="code" href="ip6__addr_8h.html#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="ip6__addr_8h_html_ad0fc088972d395839a7ad75d3dab8322"><div class="ttname"><a href="ip6__addr_8h.html#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>
+
+</div>
+</div>
+<a id="a11fe84789e3f039b3f71009e802946a8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a11fe84789e3f039b3f71009e802946a8">&#9670;&nbsp;</a></span>ip6_addr_cmp_packed</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_cmp_packed</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">paddr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">zone_idx&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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>
+<a id="ad0fc088972d395839a7ad75d3dab8322"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad0fc088972d395839a7ad75d3dab8322">&#9670;&nbsp;</a></span>ip6_addr_cmp_zoneless</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_cmp_zoneless</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addr1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addr2&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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>
+<a id="a7b17e85a46bd8368ce27fc644e058073"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7b17e85a46bd8368ce27fc644e058073">&#9670;&nbsp;</a></span>ip6_addr_copy</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_copy</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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>{(dest).addr[0] = (src).addr[0]; \</div><div class="line">                                    (dest).addr[1] = (src).addr[1]; \</div><div class="line">                                    (dest).addr[2] = (src).addr[2]; \</div><div class="line">                                    (dest).addr[3] = (src).addr[3]; \</div><div class="line">                                    ip6_addr_copy_zone((dest), (src)); }<span class="keywordflow">while</span>(0)</div></div><!-- fragment --><p>Copy IPv6 address - faster than ip6_addr_set: no NULL check </p>
+
+</div>
+</div>
+<a id="a05575d46c233ffb13fb03a3a2c8a16b3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a05575d46c233ffb13fb03a3a2c8a16b3">&#9670;&nbsp;</a></span>ip6_addr_copy_from_packed</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_copy_from_packed</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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>{(dest).addr[0] = (src).addr[0]; \</div><div class="line">                                    (dest).addr[1] = (src).addr[1]; \</div><div class="line">                                    (dest).addr[2] = (src).addr[2]; \</div><div class="line">                                    (dest).addr[3] = (src).addr[3]; \</div><div class="line">                                    ip6_addr_clear_zone(&amp;dest); }<span class="keywordflow">while</span>(0)</div></div><!-- fragment --><p>Copy packed IPv6 address to unpacked IPv6 address; zone is not set </p>
+
+</div>
+</div>
+<a id="a6c46d12fa7d36c47b629d0ccdefa114b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6c46d12fa7d36c47b629d0ccdefa114b">&#9670;&nbsp;</a></span>ip6_addr_copy_to_packed</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_copy_to_packed</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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>{(dest).addr[0] = (src).addr[0]; \</div><div class="line">                                    (dest).addr[1] = (src).addr[1]; \</div><div class="line">                                    (dest).addr[2] = (src).addr[2]; \</div><div class="line">                                    (dest).addr[3] = (src).addr[3]; }<span class="keywordflow">while</span>(0)</div></div><!-- fragment --><p>Copy unpacked IPv6 address to packed IPv6 address; zone is lost </p>
+
+</div>
+</div>
+<a id="a76b01f76b65647767d00ee9fad9fbaa2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a76b01f76b65647767d00ee9fad9fbaa2">&#9670;&nbsp;</a></span>ip6_addr_netcmp</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_netcmp</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addr1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addr2&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(<a class="code" href="ip6__addr_8h.html#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="ip6__addr_8h_html_acc1622ab895680da0a3b6e5e56070342"><div class="ttname"><a href="ip6__addr_8h.html#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>
+
+</div>
+</div>
+<a id="acc1622ab895680da0a3b6e5e56070342"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acc1622ab895680da0a3b6e5e56070342">&#9670;&nbsp;</a></span>ip6_addr_netcmp_zoneless</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_netcmp_zoneless</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addr1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">addr2&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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="a1d78feeb50aec8f2c07d840829f49ddd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1d78feeb50aec8f2c07d840829f49ddd">&#9670;&nbsp;</a></span>IP6_ADDR_PART</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP6_ADDR_PART</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">index, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">a, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">b, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">d&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;(ip6addr)-&gt;addr[index] = PP_HTONL(<a class="el" href="def_8h.html#acf56d3da92a0a7a8a62a617e793e948c">LWIP_MAKEU32</a>(a,b,c,d))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set an IPv6 partial address given by byte-parts </p>
+
+</div>
+</div>
+<a id="aa7b4ba4202b5f64dee605fe159e9c3ad"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa7b4ba4202b5f64dee605fe159e9c3ad">&#9670;&nbsp;</a></span>ip6_addr_set</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_set</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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>{(dest)-&gt;addr[0] = (src) == NULL ? 0 : (src)-&gt;addr[0]; \</div><div class="line">                                   (dest)-&gt;addr[1] = (src) == NULL ? 0 : (src)-&gt;addr[1]; \</div><div class="line">                                   (dest)-&gt;addr[2] = (src) == NULL ? 0 : (src)-&gt;addr[2]; \</div><div class="line">                                   (dest)-&gt;addr[3] = (src) == NULL ? 0 : (src)-&gt;addr[3]; \</div><div class="line">                                   ip6_addr_set_zone((dest), (src) == NULL ? <a class="code" href="group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb">IP6_NO_ZONE</a> : <a class="code" href="group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634">ip6_addr_zone</a>(src)); }<span class="keywordflow">while</span>(0)</div><div class="ttc" id="group__ip6__zones_html_ga2049167d1715b9a9cf2730e122c0d4fb"><div class="ttname"><a href="group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb">IP6_NO_ZONE</a></div><div class="ttdeci">#define IP6_NO_ZONE</div><div class="ttdef"><b>Definition:</b> ip6_zone.h:101</div></div>
+<div class="ttc" id="group__ip6__zones_html_gaee83e12649fa9706857c9ad8f9ef8634"><div class="ttname"><a href="group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634">ip6_addr_zone</a></div><div class="ttdeci">#define ip6_addr_zone(ip6addr)</div><div class="ttdef"><b>Definition:</b> ip6_zone.h:109</div></div>
+</div><!-- fragment --><p>Safely copy one IPv6 address to another (src may be NULL) </p>
+
+</div>
+</div>
+<a id="ae2d1ce50ec6dbee890e2f8ae64abdf6b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae2d1ce50ec6dbee890e2f8ae64abdf6b">&#9670;&nbsp;</a></span>ip6_addr_set_any</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_set_any</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="ip6__addr_8h.html#af696d3b81f4cb9c40ece912de73ed53c">ip6_addr_set_zero</a>(ip6addr)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set address to ipv6 'any' (no need for <a class="el" href="def_8c.html#a14f94347a5b9b9e3602705b75b7ae524">lwip_htonl()</a>) </p>
+
+</div>
+</div>
+<a id="ad636c27d56d1b3deca9f780bc173d3c2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad636c27d56d1b3deca9f780bc173d3c2">&#9670;&nbsp;</a></span>ip6_addr_set_hton</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_set_hton</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</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>{(dest)-&gt;addr[0] = (src) == NULL ? 0 : <a class="code" href="def_8c.html#a14f94347a5b9b9e3602705b75b7ae524">lwip_htonl</a>((src)-&gt;addr[0]); \</div><div class="line">                                        (dest)-&gt;addr[1] = (src) == NULL ? 0 : <a class="code" href="def_8c.html#a14f94347a5b9b9e3602705b75b7ae524">lwip_htonl</a>((src)-&gt;addr[1]); \</div><div class="line">                                        (dest)-&gt;addr[2] = (src) == NULL ? 0 : <a class="code" href="def_8c.html#a14f94347a5b9b9e3602705b75b7ae524">lwip_htonl</a>((src)-&gt;addr[2]); \</div><div class="line">                                        (dest)-&gt;addr[3] = (src) == NULL ? 0 : <a class="code" href="def_8c.html#a14f94347a5b9b9e3602705b75b7ae524">lwip_htonl</a>((src)-&gt;addr[3]); \</div><div class="line">                                        ip6_addr_set_zone((dest), (src) == NULL ? <a class="code" href="group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb">IP6_NO_ZONE</a> : <a class="code" href="group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634">ip6_addr_zone</a>(src));}<span class="keywordflow">while</span>(0)</div><div class="ttc" id="def_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="group__ip6__zones_html_ga2049167d1715b9a9cf2730e122c0d4fb"><div class="ttname"><a href="group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb">IP6_NO_ZONE</a></div><div class="ttdeci">#define IP6_NO_ZONE</div><div class="ttdef"><b>Definition:</b> ip6_zone.h:101</div></div>
+<div class="ttc" id="group__ip6__zones_html_gaee83e12649fa9706857c9ad8f9ef8634"><div class="ttname"><a href="group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634">ip6_addr_zone</a></div><div class="ttdeci">#define ip6_addr_zone(ip6addr)</div><div class="ttdef"><b>Definition:</b> ip6_zone.h:109</div></div>
+</div><!-- fragment --><p>Safely copy one IPv6 address to another and change byte order from host- to network-order. </p>
+
+</div>
+</div>
+<a id="a02f5271e922f34a09153ce84839ad292"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a02f5271e922f34a09153ce84839ad292">&#9670;&nbsp;</a></span>ip6_addr_set_loopback</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_set_loopback</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr</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>{(ip6addr)-&gt;addr[0] = 0; \</div><div class="line">                                          (ip6addr)-&gt;addr[1] = 0; \</div><div class="line">                                          (ip6addr)-&gt;addr[2] = 0; \</div><div class="line">                                          (ip6addr)-&gt;addr[3] = PP_HTONL(0x00000001UL); \</div><div class="line">                                          ip6_addr_clear_zone(ip6addr);}<span class="keywordflow">while</span>(0)</div></div><!-- fragment --><p>Set address to ipv6 loopback address </p>
+
+</div>
+</div>
+<a id="af696d3b81f4cb9c40ece912de73ed53c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af696d3b81f4cb9c40ece912de73ed53c">&#9670;&nbsp;</a></span>ip6_addr_set_zero</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_set_zero</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ip6addr</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>{(ip6addr)-&gt;addr[0] = 0; \</div><div class="line">                                         (ip6addr)-&gt;addr[1] = 0; \</div><div class="line">                                         (ip6addr)-&gt;addr[2] = 0; \</div><div class="line">                                         (ip6addr)-&gt;addr[3] = 0; \</div><div class="line">                                         ip6_addr_clear_zone(ip6addr);}<span class="keywordflow">while</span>(0)</div></div><!-- fragment --><p>Set complete address to zero </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="aaca9e796e93a355294c4954c08d01762"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaca9e796e93a355294c4954c08d01762">&#9670;&nbsp;</a></span>ip6_addr_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structip6__addr.html">ip6_addr</a> <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IPv6 address </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a3f555ae302eb056f28f6cb266a27036e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3f555ae302eb056f28f6cb266a27036e">&#9670;&nbsp;</a></span>ip6addr_aton()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ip6addr_aton </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>cp</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Check whether "cp" is a valid ascii representation of an IPv6 address and convert to a binary address. Returns 1 if the address is valid, 0 if not.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">cp</td><td>IPv6 address in ascii representation (e.g. "FF01::1") </td></tr>
+    <tr><td class="paramname">addr</td><td>pointer to which to save the ip address in network order </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if cp could be converted to addr, 0 on failure </dd></dl>
+
+</div>
+</div>
+<a id="adba4443e6629583d48e1d1c7c21a977e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adba4443e6629583d48e1d1c7c21a977e">&#9670;&nbsp;</a></span>ip6addr_ntoa()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* ip6addr_ntoa </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>returns ptr to static buffer; not reentrant!</p>
+<p>Convert numeric IPv6 address into ASCII representation. returns ptr to static buffer; not reentrant!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">addr</td><td>ip6 address in network order to convert </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to a global static (!) buffer that holds the ASCII representation of addr </dd></dl>
+
+</div>
+</div>
+<a id="a64d442f35f34c43121bf91cfea2e77a2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a64d442f35f34c43121bf91cfea2e77a2">&#9670;&nbsp;</a></span>ip6addr_ntoa_r()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* ip6addr_ntoa_r </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>buflen</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">addr</td><td>ip6 address in network order to convert </td></tr>
+    <tr><td class="paramname">buf</td><td>target buffer where the string is stored </td></tr>
+    <tr><td class="paramname">buflen</td><td>length of buf </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>either pointer to buf which now holds the ASCII representation of addr or NULL if buf was too small </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="ip6__addr_8h.html">ip6_addr.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ip6__addr_8h.js b/doc/doxygen/output/html/ip6__addr_8h.js
new file mode 100644
index 0000000..5f8c5cf
--- /dev/null
+++ b/doc/doxygen/output/html/ip6__addr_8h.js
@@ -0,0 +1,31 @@
+var ip6__addr_8h =
+[
+    [ "ip6_addr", "structip6__addr.html", null ],
+    [ "IP6_ADDR", "ip6__addr_8h.html#a30c92254d6abe631de6a5accfd491bc3", null ],
+    [ "IP6_ADDR_BLOCK1", "ip6__addr_8h.html#ae258ebfa66d18c8c428bf3d8fd0f969c", null ],
+    [ "IP6_ADDR_BLOCK2", "ip6__addr_8h.html#a9193137423b6b936d25c2e6cf33b4921", null ],
+    [ "IP6_ADDR_BLOCK3", "ip6__addr_8h.html#a6466b1c0edd03d6a5986dcc79f7d8bb6", null ],
+    [ "IP6_ADDR_BLOCK4", "ip6__addr_8h.html#a2a5d7de341ce708b7145ad4d72652c71", null ],
+    [ "IP6_ADDR_BLOCK5", "ip6__addr_8h.html#a56a11cfaa169389c319f8bd027ac524c", null ],
+    [ "IP6_ADDR_BLOCK6", "ip6__addr_8h.html#a116d7c5c8bf8531b27f8a9fa98e728c3", null ],
+    [ "IP6_ADDR_BLOCK7", "ip6__addr_8h.html#ab87bee320ecc0e923931ee6f49802deb", null ],
+    [ "IP6_ADDR_BLOCK8", "ip6__addr_8h.html#af3d1f9876bf256ec964bd3809d7ed1b4", null ],
+    [ "ip6_addr_cmp", "ip6__addr_8h.html#aea8d4c4134abff1c76bc997a91163fe1", null ],
+    [ "ip6_addr_cmp_packed", "ip6__addr_8h.html#a11fe84789e3f039b3f71009e802946a8", null ],
+    [ "ip6_addr_cmp_zoneless", "ip6__addr_8h.html#ad0fc088972d395839a7ad75d3dab8322", null ],
+    [ "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_netcmp", "ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2", null ],
+    [ "ip6_addr_netcmp_zoneless", "ip6__addr_8h.html#acc1622ab895680da0a3b6e5e56070342", 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_t", "ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762", null ],
+    [ "ip6addr_aton", "ip6__addr_8h.html#a3f555ae302eb056f28f6cb266a27036e", null ],
+    [ "ip6addr_ntoa", "ip6__addr_8h.html#adba4443e6629583d48e1d1c7c21a977e", null ],
+    [ "ip6addr_ntoa_r", "ip6__addr_8h.html#a64d442f35f34c43121bf91cfea2e77a2", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ip6__frag_8c.html b/doc/doxygen/output/html/ip6__frag_8c.html
new file mode 100644
index 0000000..a7b7c53
--- /dev/null
+++ b/doc/doxygen/output/html/ip6__frag_8c.html
@@ -0,0 +1,241 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv6/ip6_frag.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ip6__frag_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">ip6_frag.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 &quot;<a class="el" href="ip6__frag_8h.html">lwip/ip6_frag.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6_8h.html">lwip/ip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="icmp6_8h.html">lwip/icmp6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="nd6_8h.html">lwip/nd6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.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="memp_8h.html">lwip/memp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structip6__reass__helper.html">ip6_reass_helper</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:af920fb8127d00dd7a8b809afd28723fe"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe">IP_REASS_CHECK_OVERLAP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:af920fb8127d00dd7a8b809afd28723fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a510934accf149433bdcf683993e79080"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__frag_8c.html#a510934accf149433bdcf683993e79080">IP_REASS_FREE_OLDEST</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:a510934accf149433bdcf683993e79080"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:adbd666d01adcbbbc5966938f02025b7c"><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="ip6__frag_8c.html#adbd666d01adcbbbc5966938f02025b7c">ip6_reass</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:adbd666d01adcbbbc5966938f02025b7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3ef87acbc615d5eb015104f83bbe7d37"><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="ip6__frag_8c.html#a3ef87acbc615d5eb015104f83bbe7d37">ip6_frag</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>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest)</td></tr>
+<tr class="separator:a3ef87acbc615d5eb015104f83bbe7d37"><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>IPv6 fragmentation and reassembly. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="af920fb8127d00dd7a8b809afd28723fe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af920fb8127d00dd7a8b809afd28723fe">&#9670;&nbsp;</a></span>IP_REASS_CHECK_OVERLAP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_REASS_CHECK_OVERLAP&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Setting this to 0, you can turn off checking the fragments for overlapping regions. The code gets a little smaller. Only use this if you know that overlapping won't occur on your network! </p>
+
+</div>
+</div>
+<a id="a510934accf149433bdcf683993e79080"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a510934accf149433bdcf683993e79080">&#9670;&nbsp;</a></span>IP_REASS_FREE_OLDEST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_REASS_FREE_OLDEST&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set to 0 to prevent freeing the oldest datagram when the reassembly buffer is full (IP_REASS_MAX_PBUFS pbufs are enqueued). The code gets a little smaller. Datagrams will be freed by timeout only. Especially useful when MEMP_NUM_REASSDATA is set to 1, so one datagram can be reassembled at a time, only. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a3ef87acbc615d5eb015104f83bbe7d37"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3ef87acbc615d5eb015104f83bbe7d37">&#9670;&nbsp;</a></span>ip6_frag()</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> ip6_frag </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Fragment an IPv6 datagram if too large for the netif or path MTU.</p>
+<p>Chop the datagram in MTU sized chunks and send them in order by pointing PBUF_REFs into p</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>ipv6 packet to send </td></tr>
+    <tr><td class="paramname">netif</td><td>the netif on which to send </td></tr>
+    <tr><td class="paramname">dest</td><td>destination ipv6 address to which to send</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if sent successfully, err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="adbd666d01adcbbbc5966938f02025b7c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adbd666d01adcbbbc5966938f02025b7c">&#9670;&nbsp;</a></span>ip6_reass()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* ip6_reass </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Reassembles incoming IPv6 fragments into an IPv6 datagram.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>points to the IPv6 Fragment Header </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>NULL if reassembly is incomplete, pbuf pointing to IPv6 Header if reassembly is complete </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_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li><li class="navelem"><a class="el" href="dir_da9c6f43d3cd00be3de224bac907a425.html">ipv6</a></li><li class="navelem"><a class="el" href="ip6__frag_8c.html">ip6_frag.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ip6__frag_8c.js b/doc/doxygen/output/html/ip6__frag_8c.js
new file mode 100644
index 0000000..c2d2efe
--- /dev/null
+++ b/doc/doxygen/output/html/ip6__frag_8c.js
@@ -0,0 +1,8 @@
+var ip6__frag_8c =
+[
+    [ "ip6_reass_helper", "structip6__reass__helper.html", null ],
+    [ "IP_REASS_CHECK_OVERLAP", "ip6__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe", null ],
+    [ "IP_REASS_FREE_OLDEST", "ip6__frag_8c.html#a510934accf149433bdcf683993e79080", null ],
+    [ "ip6_frag", "ip6__frag_8c.html#a3ef87acbc615d5eb015104f83bbe7d37", null ],
+    [ "ip6_reass", "ip6__frag_8c.html#adbd666d01adcbbbc5966938f02025b7c", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ip6__frag_8h.html b/doc/doxygen/output/html/ip6__frag_8h.html
new file mode 100644
index 0000000..35db10f
--- /dev/null
+++ b/doc/doxygen/output/html/ip6__frag_8h.html
@@ -0,0 +1,237 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/ip6_frag.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ip6__frag_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">ip6_frag.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="pbuf_8h.html">lwip/pbuf.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6_8h.html">lwip/ip6.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 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="structip6__reassdata.html">ip6_reassdata</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="structpbuf__custom__ref.html">pbuf_custom_ref</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ad0730ee4db9fbebdf071bb33d75698a2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__frag_8h.html#ad0730ee4db9fbebdf071bb33d75698a2">IP6_REASS_TMR_INTERVAL</a>&#160;&#160;&#160;1000</td></tr>
+<tr class="separator:ad0730ee4db9fbebdf071bb33d75698a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a151e742cf7f0e5c3a08f31db0370cea7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip6__frag_8h.html#a151e742cf7f0e5c3a08f31db0370cea7">IPV6_FRAG_COPYHEADER</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a151e742cf7f0e5c3a08f31db0370cea7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:adbd666d01adcbbbc5966938f02025b7c"><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="ip6__frag_8h.html#adbd666d01adcbbbc5966938f02025b7c">ip6_reass</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:adbd666d01adcbbbc5966938f02025b7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3ef87acbc615d5eb015104f83bbe7d37"><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="ip6__frag_8h.html#a3ef87acbc615d5eb015104f83bbe7d37">ip6_frag</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>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *dest)</td></tr>
+<tr class="separator:a3ef87acbc615d5eb015104f83bbe7d37"><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>IPv6 fragmentation and reassembly. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ad0730ee4db9fbebdf071bb33d75698a2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad0730ee4db9fbebdf071bb33d75698a2">&#9670;&nbsp;</a></span>IP6_REASS_TMR_INTERVAL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP6_REASS_TMR_INTERVAL&#160;&#160;&#160;1000</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The IPv6 reassembly timer interval in milliseconds. </p>
+
+</div>
+</div>
+<a id="a151e742cf7f0e5c3a08f31db0370cea7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a151e742cf7f0e5c3a08f31db0370cea7">&#9670;&nbsp;</a></span>IPV6_FRAG_COPYHEADER</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IPV6_FRAG_COPYHEADER&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IP6_FRAG_COPYHEADER==1: for platforms where sizeof(void*) &gt; 4, "struct
+ip6_reass_helper" is too large to be stored in the IPv6 fragment header, and will bleed into the header before it, which may be the IPv6 header or an extension header. This means that for each first fragment packet, we need to 1) make a copy of some IPv6 header fields (src+dest) that we need later on, just in case we do overwrite part of the IPv6 header, and 2) make a copy of the header data that we overwrote, so that we can restore it before either completing reassembly or sending an ICMPv6 reply. The last part is true even if this setting is disabled, but if it is enabled, we need to save a bit more data (up to the size of a pointer) because we overwrite more. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a3ef87acbc615d5eb015104f83bbe7d37"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3ef87acbc615d5eb015104f83bbe7d37">&#9670;&nbsp;</a></span>ip6_frag()</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> ip6_frag </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>dest</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Fragment an IPv6 datagram if too large for the netif or path MTU.</p>
+<p>Chop the datagram in MTU sized chunks and send them in order by pointing PBUF_REFs into p</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>ipv6 packet to send </td></tr>
+    <tr><td class="paramname">netif</td><td>the netif on which to send </td></tr>
+    <tr><td class="paramname">dest</td><td>destination ipv6 address to which to send</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if sent successfully, err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="adbd666d01adcbbbc5966938f02025b7c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adbd666d01adcbbbc5966938f02025b7c">&#9670;&nbsp;</a></span>ip6_reass()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* ip6_reass </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Reassembles incoming IPv6 fragments into an IPv6 datagram.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>points to the IPv6 Fragment Header </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>NULL if reassembly is incomplete, pbuf pointing to IPv6 Header if reassembly is complete </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="ip6__frag_8h.html">ip6_frag.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ip6__frag_8h.js b/doc/doxygen/output/html/ip6__frag_8h.js
new file mode 100644
index 0000000..c991605
--- /dev/null
+++ b/doc/doxygen/output/html/ip6__frag_8h.js
@@ -0,0 +1,9 @@
+var ip6__frag_8h =
+[
+    [ "ip6_reassdata", "structip6__reassdata.html", null ],
+    [ "pbuf_custom_ref", "structpbuf__custom__ref.html", "structpbuf__custom__ref" ],
+    [ "IP6_REASS_TMR_INTERVAL", "ip6__frag_8h.html#ad0730ee4db9fbebdf071bb33d75698a2", null ],
+    [ "IPV6_FRAG_COPYHEADER", "ip6__frag_8h.html#a151e742cf7f0e5c3a08f31db0370cea7", null ],
+    [ "ip6_frag", "ip6__frag_8h.html#a3ef87acbc615d5eb015104f83bbe7d37", null ],
+    [ "ip6_reass", "ip6__frag_8h.html#adbd666d01adcbbbc5966938f02025b7c", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ip6__zone_8h.html b/doc/doxygen/output/html/ip6__zone_8h.html
new file mode 100644
index 0000000..0def3ae
--- /dev/null
+++ b/doc/doxygen/output/html/ip6__zone_8h.html
@@ -0,0 +1,153 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/ip6_zone.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ip6__zone_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#enum-members">Enumerations</a>  </div>
+  <div class="headertitle">
+<div class="title">ip6_zone.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga2049167d1715b9a9cf2730e122c0d4fb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb">IP6_NO_ZONE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga2049167d1715b9a9cf2730e122c0d4fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa090e54f632c8512a7991307e011c1b9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9">IPADDR6_ZONE_INIT</a>&#160;&#160;&#160;, <a class="el" href="group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb">IP6_NO_ZONE</a></td></tr>
+<tr class="separator:gaa090e54f632c8512a7991307e011c1b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaee83e12649fa9706857c9ad8f9ef8634"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634">ip6_addr_zone</a>(ip6addr)&#160;&#160;&#160;((ip6addr)-&gt;zone)</td></tr>
+<tr class="separator:gaee83e12649fa9706857c9ad8f9ef8634"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8727c081b6a80992881d481d0680db78"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78">ip6_addr_has_zone</a>(ip6addr)&#160;&#160;&#160;(<a class="el" href="group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634">ip6_addr_zone</a>(ip6addr) != <a class="el" href="group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb">IP6_NO_ZONE</a>)</td></tr>
+<tr class="separator:ga8727c081b6a80992881d481d0680db78"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga213310b303dd050da7856d67da72abd6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#ga213310b303dd050da7856d67da72abd6">ip6_addr_set_zone</a>(ip6addr,  zone_idx)&#160;&#160;&#160;((ip6addr)-&gt;zone = (zone_idx))</td></tr>
+<tr class="separator:ga213310b303dd050da7856d67da72abd6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae0249db6cd2687f2dbc445e7778d37ad"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gae0249db6cd2687f2dbc445e7778d37ad">ip6_addr_clear_zone</a>(ip6addr)&#160;&#160;&#160;((ip6addr)-&gt;zone = <a class="el" href="group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb">IP6_NO_ZONE</a>)</td></tr>
+<tr class="separator:gae0249db6cd2687f2dbc445e7778d37ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7347729485d837bcff85ae4731bbf5c4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#ga7347729485d837bcff85ae4731bbf5c4">ip6_addr_copy_zone</a>(ip6addr1,  ip6addr2)&#160;&#160;&#160;((ip6addr1).zone = (ip6addr2).zone)</td></tr>
+<tr class="separator:ga7347729485d837bcff85ae4731bbf5c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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)&#160;&#160;&#160;((ip6addr)-&gt;zone == (zone_idx))</td></tr>
+<tr class="separator:gaeead8379cc3fd4c257be0bb654994a8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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)&#160;&#160;&#160;((ip6addr1)-&gt;zone == (ip6addr2)-&gt;zone)</td></tr>
+<tr class="separator:gacbb8e1a7505d9772181defa0e75b8da9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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>
+<tr class="separator:gaa5332bb3b70c1a9acba1bea3ea0ecb90"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1040a3d67498a1ef617bda8d9e0ba3a5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#ga1040a3d67498a1ef617bda8d9e0ba3a5">ip6_addr_assign_zone</a>(ip6addr,  type,  <a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga1040a3d67498a1ef617bda8d9e0ba3a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac3ec5f94e1cd62b1237efca3723dc06e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gac3ec5f94e1cd62b1237efca3723dc06e">ip6_addr_test_zone</a>(ip6addr,  <a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;(<a class="el" href="group__ip6__zones.html#gaeead8379cc3fd4c257be0bb654994a8f">ip6_addr_equals_zone</a>((ip6addr), netif_get_index(<a class="el" href="structnetif.html">netif</a>)))</td></tr>
+<tr class="separator:gac3ec5f94e1cd62b1237efca3723dc06e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad963bf3e9695ba898271e314975f5c97"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gad963bf3e9695ba898271e314975f5c97">ip6_addr_lacks_zone</a>(ip6addr,  type)&#160;&#160;&#160;(!<a class="el" href="group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78">ip6_addr_has_zone</a>(ip6addr) &amp;&amp; <a class="el" href="group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90">ip6_addr_has_scope</a>((ip6addr), (type)))</td></tr>
+<tr class="separator:gad963bf3e9695ba898271e314975f5c97"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac83f3e7c8d65d3c784bffc9dec29b70c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gac83f3e7c8d65d3c784bffc9dec29b70c">ip6_addr_select_zone</a>(dest,  src)</td></tr>
+<tr class="separator:gac83f3e7c8d65d3c784bffc9dec29b70c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga1993c4b6a297b6e92d80a9ce46ddedfe"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#ga1993c4b6a297b6e92d80a9ce46ddedfe">lwip_ipv6_scope_type</a> { <a class="el" href="group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8">IP6_UNKNOWN</a> = 0, 
+<a class="el" href="group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0">IP6_UNICAST</a> = 1, 
+<a class="el" href="group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfea70cda997b66f3e120e925c5a41904809">IP6_MULTICAST</a> = 2
+ }</td></tr>
+<tr class="separator:ga1993c4b6a297b6e92d80a9ce46ddedfe"><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>IPv6 address scopes, zones, and scoping policy.</p>
+<p>This header provides the means to implement support for IPv6 address scopes, as per RFC 4007. An address scope can be either global or more constrained. In lwIP, we say that an address "has a scope" or "is scoped" when its scope is constrained, in which case the address is meaningful only in a specific "zone." For unicast addresses, only link-local addresses have a scope; in that case, the scope is the link. For multicast addresses, there are various scopes defined by RFC 4007 and others. For any constrained scope, a system must establish a (potentially one-to-many) mapping between zones and local interfaces. For example, a link-local address is valid on only one link (its zone). That link may be attached to one or more local interfaces. The decisions on which scopes are constrained and the mapping between zones and interfaces is together what we refer to as the "scoping policy" - more on this in a bit.</p>
+<p>In lwIP, each IPv6 address has an associated zone index. This zone index may be set to "no zone" (IP6_NO_ZONE, 0) or an actual zone. We say that an address "has a zone" or "is zoned" when its zone index is <em>not</em> set to "no
+zone." In lwIP, in principle, each address should be "properly zoned," which means that if the address has a zone if and only if has a scope. As such, it is a rule that an unscoped (e.g., global) address must never have a zone. Even though one could argue that there is always one zone even for global scopes, this rule exists for implementation simplicity. Violation of the rule will trigger assertions or otherwise result in undesired behavior.</p>
+<p>Backward compatibility prevents us from requiring that applications always provide properly zoned addresses. We do enforce the rule that the in the lwIP link layer (everything below netif-&gt;output_ip6() and in particular ND6) <em>all</em> addresses are properly zoned. Thus, on the output paths down the stack, various places deal with the case of addresses that lack a zone. Some of them are best-effort for efficiency (e.g. the PCB bind and connect API calls' attempts to add missing zones); ultimately the IPv6 output handler (<a class="el" href="ip6_8h.html#a58bd3c9ce332731fac82b89c77be4f56">ip6_output_if_src</a>) will set a zone if necessary.</p>
+<p>Aside from dealing with scoped addresses lacking a zone, a proper IPv6 implementation must also ensure that a packet with a scoped source and/or destination address does not leave its zone. This is currently implemented in the input and forward functions. However, for output, these checks are deliberately omitted in order to keep the implementation lightweight. The routing algorithm in <a class="el" href="ip6_8h.html#a1153bd9e8c45847282105ab6379e6e70">ip6_route</a> will take decisions such that it will not cause zone violations unless the application sets bad addresses, though.</p>
+<p>In terms of scoping policy, lwIP implements the default policy from RFC 4007 using macros in this file. This policy considers link-local unicast addresses and (only) interface-local and link-local multicast addresses as having a scope. For all these addresses, the zone is equal to the interface. As shown below in this file, it is possible to implement a custom policy. </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="ip6__zone_8h.html">ip6_zone.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ip6__zone_8h.js b/doc/doxygen/output/html/ip6__zone_8h.js
new file mode 100644
index 0000000..3ae3aae
--- /dev/null
+++ b/doc/doxygen/output/html/ip6__zone_8h.js
@@ -0,0 +1,23 @@
+var ip6__zone_8h =
+[
+    [ "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_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 ],
+    [ "ip6_addr_has_zone", "group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78", null ],
+    [ "ip6_addr_lacks_zone", "group__ip6__zones.html#gad963bf3e9695ba898271e314975f5c97", null ],
+    [ "ip6_addr_select_zone", "group__ip6__zones.html#gac83f3e7c8d65d3c784bffc9dec29b70c", null ],
+    [ "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_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 ],
+    [ "lwip_ipv6_scope_type", "group__ip6__zones.html#ga1993c4b6a297b6e92d80a9ce46ddedfe", [
+      [ "IP6_UNKNOWN", "group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8", null ],
+      [ "IP6_UNICAST", "group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0", null ],
+      [ "IP6_MULTICAST", "group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfea70cda997b66f3e120e925c5a41904809", null ]
+    ] ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ip_8c.html b/doc/doxygen/output/html/ip_8c.html
new file mode 100644
index 0000000..a65c37e
--- /dev/null
+++ b/doc/doxygen/output/html/ip_8c.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ip.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ip_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">ip.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 &quot;<a class="el" href="ip__addr_8h.html">lwip/ip_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gace12d28aef35bb15962e8563aea571b1"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1">ipaddr_ntoa</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr)</td></tr>
+<tr class="separator:gace12d28aef35bb15962e8563aea571b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3684dabc0cae597ffb5b51d41f1d886f"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga3684dabc0cae597ffb5b51d41f1d886f">ipaddr_ntoa_r</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, char *buf, int buflen)</td></tr>
+<tr class="separator:ga3684dabc0cae597ffb5b51d41f1d886f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4de70fdd7fd36c5b6eaed8b855d5f151"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151">ipaddr_aton</a> (const char *cp, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr)</td></tr>
+<tr class="separator:ga4de70fdd7fd36c5b6eaed8b855d5f151"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3c420dab0c6760df099a2d688fa42a26"><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__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip_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:ga3c420dab0c6760df099a2d688fa42a26"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:ac944fb6564f181bc90bc7c2b8b00d94c"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structip__globals.html">ip_globals</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8c.html#ac944fb6564f181bc90bc7c2b8b00d94c">ip_data</a></td></tr>
+<tr class="separator:ac944fb6564f181bc90bc7c2b8b00d94c"><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>Common IPv4 and IPv6 code </p>
+</div><h2 class="groupheader">Variable Documentation</h2>
+<a id="ac944fb6564f181bc90bc7c2b8b00d94c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac944fb6564f181bc90bc7c2b8b00d94c">&#9670;&nbsp;</a></span>ip_data</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structip__globals.html">ip_globals</a> ip_data</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Global data for both IPv4 and IPv6 </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="ip_8c.html">ip.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ip_8c.js b/doc/doxygen/output/html/ip_8c.js
new file mode 100644
index 0000000..eea2a71
--- /dev/null
+++ b/doc/doxygen/output/html/ip_8c.js
@@ -0,0 +1,8 @@
+var ip_8c =
+[
+    [ "ip_input", "group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26", null ],
+    [ "ipaddr_aton", "group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151", null ],
+    [ "ipaddr_ntoa", "group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1", null ],
+    [ "ipaddr_ntoa_r", "group__ipaddr.html#ga3684dabc0cae597ffb5b51d41f1d886f", null ],
+    [ "ip_data", "ip_8c.html#ac944fb6564f181bc90bc7c2b8b00d94c", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ip_8h.html b/doc/doxygen/output/html/ip_8h.html
new file mode 100644
index 0000000..c15f0a6
--- /dev/null
+++ b/doc/doxygen/output/html/ip_8h.html
@@ -0,0 +1,736 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/ip.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ip_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">ip.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="def_8h.html">lwip/def.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 />
+<code>#include &quot;<a class="el" href="err_8h.html">lwip/err.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="ip4_8h.html">lwip/ip4.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6_8h.html">lwip/ip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2ip_8h.html">lwip/prot/ip.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structip__globals.html">ip_globals</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a355679dba1c0d8ef07ce3abcd28e3063"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#a355679dba1c0d8ef07ce3abcd28e3063">LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX</a>(p)&#160;&#160;&#160;LWIP_ASSERT(&quot;p-&gt;ref == 1&quot;, (p)-&gt;ref == 1)</td></tr>
+<tr class="separator:a355679dba1c0d8ef07ce3abcd28e3063"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8bdf4b5f674375e76cdd968826d80e53"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#a8bdf4b5f674375e76cdd968826d80e53">IP_PCB</a></td></tr>
+<tr class="separator:a8bdf4b5f674375e76cdd968826d80e53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aabecef3c7653a9767c79245c44fcab9f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#aabecef3c7653a9767c79245c44fcab9f">ip_current_netif</a>()&#160;&#160;&#160;(ip_data.current_netif)</td></tr>
+<tr class="separator:aabecef3c7653a9767c79245c44fcab9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae214afa9d3f1b26fc8d538436b8fa3c4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#ae214afa9d3f1b26fc8d538436b8fa3c4">ip_current_input_netif</a>()&#160;&#160;&#160;(ip_data.current_input_netif)</td></tr>
+<tr class="separator:ae214afa9d3f1b26fc8d538436b8fa3c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2ca15ea285a10982294378cd7b8e83e2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#a2ca15ea285a10982294378cd7b8e83e2">ip_current_header_tot_len</a>()&#160;&#160;&#160;(ip_data.current_ip_header_tot_len)</td></tr>
+<tr class="separator:a2ca15ea285a10982294378cd7b8e83e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e35b7692c228c98e738892f0a215647"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#a4e35b7692c228c98e738892f0a215647">ip_current_src_addr</a>()&#160;&#160;&#160;(&amp;ip_data.current_iphdr_src)</td></tr>
+<tr class="separator:a4e35b7692c228c98e738892f0a215647"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9135977868017c3deeec86b525e13997"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#a9135977868017c3deeec86b525e13997">ip_current_dest_addr</a>()&#160;&#160;&#160;(&amp;ip_data.current_iphdr_dest)</td></tr>
+<tr class="separator:a9135977868017c3deeec86b525e13997"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3ce482b7e08282effd670001198ecd87"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#a3ce482b7e08282effd670001198ecd87">ip4_current_header</a>()&#160;&#160;&#160;ip_data.current_ip4_header</td></tr>
+<tr class="separator:a3ce482b7e08282effd670001198ecd87"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af9bf74750c9d7a219ee88d240300fe69"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#af9bf74750c9d7a219ee88d240300fe69">ip6_current_header</a>()&#160;&#160;&#160;((const struct <a class="el" href="structip6__hdr.html">ip6_hdr</a>*)(ip_data.current_ip6_header))</td></tr>
+<tr class="separator:af9bf74750c9d7a219ee88d240300fe69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abc56623d434a204298a4e98352af1c9d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#abc56623d434a204298a4e98352af1c9d">ip_current_is_v6</a>()&#160;&#160;&#160;(<a class="el" href="ip_8h.html#af9bf74750c9d7a219ee88d240300fe69">ip6_current_header</a>() != NULL)</td></tr>
+<tr class="separator:abc56623d434a204298a4e98352af1c9d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac40a9e4a21ecf5bb39813bb6ca5bb245"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#ac40a9e4a21ecf5bb39813bb6ca5bb245">ip6_current_src_addr</a>()&#160;&#160;&#160;(<a class="el" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(&amp;ip_data.current_iphdr_src))</td></tr>
+<tr class="separator:ac40a9e4a21ecf5bb39813bb6ca5bb245"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a176525c2192d37ee9eaeba8012c5d9c0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#a176525c2192d37ee9eaeba8012c5d9c0">ip6_current_dest_addr</a>()&#160;&#160;&#160;(<a class="el" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(&amp;ip_data.current_iphdr_dest))</td></tr>
+<tr class="separator:a176525c2192d37ee9eaeba8012c5d9c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af27c43c23b59d68a8463cd5ad035b20f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#af27c43c23b59d68a8463cd5ad035b20f">ip_current_header_proto</a>()</td></tr>
+<tr class="separator:af27c43c23b59d68a8463cd5ad035b20f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a68d25b5924b768cbf2f1a78bbabfce26"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#a68d25b5924b768cbf2f1a78bbabfce26">ip_next_header_ptr</a>()</td></tr>
+<tr class="separator:a68d25b5924b768cbf2f1a78bbabfce26"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad2a62f96b9431a79f0258dc13058b160"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#ad2a62f96b9431a79f0258dc13058b160">ip4_current_src_addr</a>()&#160;&#160;&#160;(<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;ip_data.current_iphdr_src))</td></tr>
+<tr class="separator:ad2a62f96b9431a79f0258dc13058b160"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2833c8d59910dd7c0e87ab3bb174e720"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#a2833c8d59910dd7c0e87ab3bb174e720">ip4_current_dest_addr</a>()&#160;&#160;&#160;(<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;ip_data.current_iphdr_dest))</td></tr>
+<tr class="separator:a2833c8d59910dd7c0e87ab3bb174e720"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e35b7692c228c98e738892f0a215647"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#a4e35b7692c228c98e738892f0a215647">ip_current_src_addr</a>()&#160;&#160;&#160;(&amp;ip_data.current_iphdr_src)</td></tr>
+<tr class="separator:a4e35b7692c228c98e738892f0a215647"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9135977868017c3deeec86b525e13997"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#a9135977868017c3deeec86b525e13997">ip_current_dest_addr</a>()&#160;&#160;&#160;(&amp;ip_data.current_iphdr_dest)</td></tr>
+<tr class="separator:a9135977868017c3deeec86b525e13997"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a26e077f52de4a97ff89c02415c084518"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#a26e077f52de4a97ff89c02415c084518">ip_get_option</a>(pcb,  opt)&#160;&#160;&#160;((pcb)-&gt;so_options &amp; (opt))</td></tr>
+<tr class="separator:a26e077f52de4a97ff89c02415c084518"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a13f48cf825c7f074dc05bea54e9d6a93"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#a13f48cf825c7f074dc05bea54e9d6a93">ip_set_option</a>(pcb,  opt)&#160;&#160;&#160;((pcb)-&gt;so_options = (u8_t)((pcb)-&gt;so_options | (opt)))</td></tr>
+<tr class="separator:a13f48cf825c7f074dc05bea54e9d6a93"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a441c63f00c4b0cb69fc34ca6b55307cc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#a441c63f00c4b0cb69fc34ca6b55307cc">ip_reset_option</a>(pcb,  opt)&#160;&#160;&#160;((pcb)-&gt;so_options = (u8_t)((pcb)-&gt;so_options &amp; ~(opt)))</td></tr>
+<tr class="separator:a441c63f00c4b0cb69fc34ca6b55307cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf056aa43789c2964f091f8349bb83730"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip.html#gaf056aa43789c2964f091f8349bb83730">ip_output</a>(p,  src,  dest,  ttl,  tos,  proto)</td></tr>
+<tr class="separator:gaf056aa43789c2964f091f8349bb83730"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga51cd772c3f6fca7c0363dca1fce7b250"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250">ip_output_if</a>(p,  src,  dest,  ttl,  tos,  proto,  <a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga51cd772c3f6fca7c0363dca1fce7b250"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab9d45f846f796bd6ce1e0c780c392765"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip.html#gab9d45f846f796bd6ce1e0c780c392765">ip_output_if_src</a>(p,  src,  dest,  ttl,  tos,  proto,  <a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gab9d45f846f796bd6ce1e0c780c392765"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aac608b92f8f226c3574d6bb855f12496"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#aac608b92f8f226c3574d6bb855f12496">ip_output_if_hdrincl</a>(p,  src,  dest,  <a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:aac608b92f8f226c3574d6bb855f12496"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:accbc01f37dd426a66de41693a5450207"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#accbc01f37dd426a66de41693a5450207">ip_output_hinted</a>(p,  src,  dest,  ttl,  tos,  proto,  netif_hint)</td></tr>
+<tr class="separator:accbc01f37dd426a66de41693a5450207"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0fa3afc2c00aea346889b476650adee3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip.html#ga0fa3afc2c00aea346889b476650adee3">ip_route</a>(src,  dest)</td></tr>
+<tr class="separator:ga0fa3afc2c00aea346889b476650adee3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4a4b9439c91eeec719692dfe10f14af0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip.html#ga4a4b9439c91eeec719692dfe10f14af0">ip_netif_get_local_ip</a>(<a class="el" href="structnetif.html">netif</a>,  dest)</td></tr>
+<tr class="separator:ga4a4b9439c91eeec719692dfe10f14af0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga3c420dab0c6760df099a2d688fa42a26"><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__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip_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:ga3c420dab0c6760df099a2d688fa42a26"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:ac944fb6564f181bc90bc7c2b8b00d94c"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structip__globals.html">ip_globals</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip_8h.html#ac944fb6564f181bc90bc7c2b8b00d94c">ip_data</a></td></tr>
+<tr class="separator:ac944fb6564f181bc90bc7c2b8b00d94c"><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>IP API </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a2833c8d59910dd7c0e87ab3bb174e720"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2833c8d59910dd7c0e87ab3bb174e720">&#9670;&nbsp;</a></span>ip4_current_dest_addr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip4_current_dest_addr</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;(<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;ip_data.current_iphdr_dest))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Destination IP4 address of current_header </p>
+
+</div>
+</div>
+<a id="a3ce482b7e08282effd670001198ecd87"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3ce482b7e08282effd670001198ecd87">&#9670;&nbsp;</a></span>ip4_current_header</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip4_current_header</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;ip_data.current_ip4_header</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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>
+</div>
+<a id="ad2a62f96b9431a79f0258dc13058b160"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad2a62f96b9431a79f0258dc13058b160">&#9670;&nbsp;</a></span>ip4_current_src_addr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip4_current_src_addr</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;(<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;ip_data.current_iphdr_src))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Source IP4 address of current_header </p>
+
+</div>
+</div>
+<a id="a176525c2192d37ee9eaeba8012c5d9c0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a176525c2192d37ee9eaeba8012c5d9c0">&#9670;&nbsp;</a></span>ip6_current_dest_addr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_current_dest_addr</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;(<a class="el" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(&amp;ip_data.current_iphdr_dest))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Destination IPv6 address of current_header </p>
+
+</div>
+</div>
+<a id="af9bf74750c9d7a219ee88d240300fe69"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af9bf74750c9d7a219ee88d240300fe69">&#9670;&nbsp;</a></span>ip6_current_header</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_current_header</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;((const struct <a class="el" href="structip6__hdr.html">ip6_hdr</a>*)(ip_data.current_ip6_header))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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>
+</div>
+<a id="ac40a9e4a21ecf5bb39813bb6ca5bb245"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac40a9e4a21ecf5bb39813bb6ca5bb245">&#9670;&nbsp;</a></span>ip6_current_src_addr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_current_src_addr</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;(<a class="el" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(&amp;ip_data.current_iphdr_src))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Source IPv6 address of current_header </p>
+
+</div>
+</div>
+<a id="a9135977868017c3deeec86b525e13997"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9135977868017c3deeec86b525e13997">&#9670;&nbsp;</a></span>ip_current_dest_addr <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_current_dest_addr</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;(&amp;ip_data.current_iphdr_dest)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Destination IP address of current_header</p>
+<p>Union destination address of current_header </p>
+
+</div>
+</div>
+<a id="a9135977868017c3deeec86b525e13997"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9135977868017c3deeec86b525e13997">&#9670;&nbsp;</a></span>ip_current_dest_addr <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_current_dest_addr</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;(&amp;ip_data.current_iphdr_dest)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Destination IP address of current_header</p>
+<p>Union destination address of current_header </p>
+
+</div>
+</div>
+<a id="af27c43c23b59d68a8463cd5ad035b20f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af27c43c23b59d68a8463cd5ad035b20f">&#9670;&nbsp;</a></span>ip_current_header_proto</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_current_header_proto</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(<a class="code" href="ip_8h.html#abc56623d434a204298a4e98352af1c9d">ip_current_is_v6</a>() ? \</div><div class="line">                                   IP6H_NEXTH(<a class="code" href="ip_8h.html#af9bf74750c9d7a219ee88d240300fe69">ip6_current_header</a>()) :\</div><div class="line">                                   IPH_PROTO(<a class="code" href="ip_8h.html#a3ce482b7e08282effd670001198ecd87">ip4_current_header</a>()))</div><div class="ttc" id="ip_8h_html_abc56623d434a204298a4e98352af1c9d"><div class="ttname"><a href="ip_8h.html#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="ip_8h_html_af9bf74750c9d7a219ee88d240300fe69"><div class="ttname"><a href="ip_8h.html#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="ip_8h_html_a3ce482b7e08282effd670001198ecd87"><div class="ttname"><a href="ip_8h.html#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><!-- fragment --><p>Get the transport layer protocol </p>
+
+</div>
+</div>
+<a id="a2ca15ea285a10982294378cd7b8e83e2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2ca15ea285a10982294378cd7b8e83e2">&#9670;&nbsp;</a></span>ip_current_header_tot_len</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_current_header_tot_len</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;(ip_data.current_ip_header_tot_len)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Total header length of ip(6)_current_header() (i.e. after this, the UDP/TCP header starts) </p>
+
+</div>
+</div>
+<a id="ae214afa9d3f1b26fc8d538436b8fa3c4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae214afa9d3f1b26fc8d538436b8fa3c4">&#9670;&nbsp;</a></span>ip_current_input_netif</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_current_input_netif</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;(ip_data.current_input_netif)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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>
+</div>
+<a id="abc56623d434a204298a4e98352af1c9d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abc56623d434a204298a4e98352af1c9d">&#9670;&nbsp;</a></span>ip_current_is_v6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_current_is_v6</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;(<a class="el" href="ip_8h.html#af9bf74750c9d7a219ee88d240300fe69">ip6_current_header</a>() != NULL)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns TRUE if the current IP input packet is IPv6, FALSE if it is IPv4 </p>
+
+</div>
+</div>
+<a id="aabecef3c7653a9767c79245c44fcab9f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aabecef3c7653a9767c79245c44fcab9f">&#9670;&nbsp;</a></span>ip_current_netif</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_current_netif</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;(ip_data.current_netif)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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>
+</div>
+<a id="a4e35b7692c228c98e738892f0a215647"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4e35b7692c228c98e738892f0a215647">&#9670;&nbsp;</a></span>ip_current_src_addr <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_current_src_addr</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;(&amp;ip_data.current_iphdr_src)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Source IP address of current_header</p>
+<p>Union source address of current_header </p>
+
+</div>
+</div>
+<a id="a4e35b7692c228c98e738892f0a215647"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4e35b7692c228c98e738892f0a215647">&#9670;&nbsp;</a></span>ip_current_src_addr <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_current_src_addr</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;(&amp;ip_data.current_iphdr_src)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Source IP address of current_header</p>
+<p>Union source address of current_header </p>
+
+</div>
+</div>
+<a id="a26e077f52de4a97ff89c02415c084518"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a26e077f52de4a97ff89c02415c084518">&#9670;&nbsp;</a></span>ip_get_option</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_get_option</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">pcb, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">opt&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((pcb)-&gt;so_options &amp; (opt))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Gets an IP pcb option (SOF_* flags) </p>
+
+</div>
+</div>
+<a id="a68d25b5924b768cbf2f1a78bbabfce26"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a68d25b5924b768cbf2f1a78bbabfce26">&#9670;&nbsp;</a></span>ip_next_header_ptr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_next_header_ptr</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</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" href="ip_8h.html#abc56623d434a204298a4e98352af1c9d">ip_current_is_v6</a>() ? \</div><div class="line">  (<span class="keyword">const</span> u8_t*)<a class="code" href="ip_8h.html#af9bf74750c9d7a219ee88d240300fe69">ip6_current_header</a>() : (<span class="keyword">const</span> u8_t*)<a class="code" href="ip_8h.html#a3ce482b7e08282effd670001198ecd87">ip4_current_header</a>())  + <a class="code" href="ip_8h.html#a2ca15ea285a10982294378cd7b8e83e2">ip_current_header_tot_len</a>()))</div><div class="ttc" id="ip_8h_html_abc56623d434a204298a4e98352af1c9d"><div class="ttname"><a href="ip_8h.html#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="ip_8h_html_a2ca15ea285a10982294378cd7b8e83e2"><div class="ttname"><a href="ip_8h.html#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="ip_8h_html_af9bf74750c9d7a219ee88d240300fe69"><div class="ttname"><a href="ip_8h.html#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="ip_8h_html_a3ce482b7e08282effd670001198ecd87"><div class="ttname"><a href="ip_8h.html#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><!-- fragment --><p>Get the transport layer header </p>
+
+</div>
+</div>
+<a id="accbc01f37dd426a66de41693a5450207"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#accbc01f37dd426a66de41693a5450207">&#9670;&nbsp;</a></span>ip_output_hinted</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_output_hinted</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">p, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ttl, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">tos, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">proto, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">netif_hint&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(<a class="code" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(dest) ? \</div><div class="line">        ip6_output_hinted(p, <a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(src), <a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(dest), ttl, tos, proto, netif_hint) : \</div><div class="line">        ip4_output_hinted(p, <a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(src), <a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(dest), ttl, tos, proto, netif_hint))</div><div class="ttc" id="group__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="group__ip6addr_html_ga9bac7e938757f1d24df2404e8b57cb7d"><div class="ttname"><a href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a></div><div class="ttdeci">#define IP_IS_V6(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:102</div></div>
+<div class="ttc" id="group__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>Output IP packet with netif_hint </p>
+
+</div>
+</div>
+<a id="aac608b92f8f226c3574d6bb855f12496"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aac608b92f8f226c3574d6bb855f12496">&#9670;&nbsp;</a></span>ip_output_if_hdrincl</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_output_if_hdrincl</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">p, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(<a class="code" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(dest) ? \</div><div class="line">        ip6_output_if(p, <a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(src), LWIP_IP_HDRINCL, 0, 0, 0, <a class="code" href="structnetif.html">netif</a>) : \</div><div class="line">        <a class="code" href="ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917">ip4_output_if</a>(p, <a class="code" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(src), LWIP_IP_HDRINCL, 0, 0, 0, <a class="code" href="structnetif.html">netif</a>))</div><div class="ttc" id="group__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="group__ip6addr_html_ga9bac7e938757f1d24df2404e8b57cb7d"><div class="ttname"><a href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a></div><div class="ttdeci">#define IP_IS_V6(ipaddr)</div><div class="ttdef"><b>Definition:</b> ip_addr.h:102</div></div>
+<div class="ttc" id="structnetif_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="ip4_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="group__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>Output IP packet that already includes an IP header. </p>
+
+</div>
+</div>
+<a id="a8bdf4b5f674375e76cdd968826d80e53"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8bdf4b5f674375e76cdd968826d80e53">&#9670;&nbsp;</a></span>IP_PCB</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_PCB</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><span class="comment">/* ip addresses in network byte order */</span> \</div><div class="line">  ip_addr_t local_ip;                      \</div><div class="line">  ip_addr_t remote_ip;                     \</div><div class="line">  <span class="comment">/* Bound netif index */</span>                  \</div><div class="line">  u8_t netif_idx;                          \</div><div class="line">  <span class="comment">/* Socket options */</span>                     \</div><div class="line">  u8_t so_options;                         \</div><div class="line">  <span class="comment">/* Type Of Service */</span>                    \</div><div class="line">  u8_t tos;                                \</div><div class="line">  <span class="comment">/* Time To Live */</span>                       \</div><div class="line">  u8_t ttl                                 \</div><div class="line">  <span class="comment">/* link layer address resolution hint */</span> \</div><div class="line">  IP_PCB_NETIFHINT</div></div><!-- fragment --><p>This is the common part of all PCB types. It needs to be at the beginning of a PCB type definition. It is located here so that changes to this common part are made in one location instead of having to change all PCB structs. </p>
+
+</div>
+</div>
+<a id="a441c63f00c4b0cb69fc34ca6b55307cc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a441c63f00c4b0cb69fc34ca6b55307cc">&#9670;&nbsp;</a></span>ip_reset_option</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_reset_option</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">pcb, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">opt&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((pcb)-&gt;so_options = (u8_t)((pcb)-&gt;so_options &amp; ~(opt)))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Resets an IP pcb option (SOF_* flags) </p>
+
+</div>
+</div>
+<a id="a13f48cf825c7f074dc05bea54e9d6a93"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a13f48cf825c7f074dc05bea54e9d6a93">&#9670;&nbsp;</a></span>ip_set_option</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_set_option</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">pcb, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">opt&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((pcb)-&gt;so_options = (u8_t)((pcb)-&gt;so_options | (opt)))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sets an IP pcb option (SOF_* flags) </p>
+
+</div>
+</div>
+<a id="a355679dba1c0d8ef07ce3abcd28e3063"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a355679dba1c0d8ef07ce3abcd28e3063">&#9670;&nbsp;</a></span>LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">p</td><td>)</td>
+          <td>&#160;&#160;&#160;LWIP_ASSERT(&quot;p-&gt;ref == 1&quot;, (p)-&gt;ref == 1)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>pbufs passed to IP must have a ref-count of 1 as their payload pointer gets altered as the packet is passed down the stack </p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="ac944fb6564f181bc90bc7c2b8b00d94c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac944fb6564f181bc90bc7c2b8b00d94c">&#9670;&nbsp;</a></span>ip_data</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structip__globals.html">ip_globals</a> ip_data</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Global data for both IPv4 and IPv6 </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="ip_8h.html">ip.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ip_8h.js b/doc/doxygen/output/html/ip_8h.js
new file mode 100644
index 0000000..0976519
--- /dev/null
+++ b/doc/doxygen/output/html/ip_8h.js
@@ -0,0 +1,34 @@
+var ip_8h =
+[
+    [ "ip_globals", "structip__globals.html", "structip__globals" ],
+    [ "ip4_current_dest_addr", "ip_8h.html#a2833c8d59910dd7c0e87ab3bb174e720", null ],
+    [ "ip4_current_header", "ip_8h.html#a3ce482b7e08282effd670001198ecd87", null ],
+    [ "ip4_current_src_addr", "ip_8h.html#ad2a62f96b9431a79f0258dc13058b160", null ],
+    [ "ip6_current_dest_addr", "ip_8h.html#a176525c2192d37ee9eaeba8012c5d9c0", null ],
+    [ "ip6_current_header", "ip_8h.html#af9bf74750c9d7a219ee88d240300fe69", null ],
+    [ "ip6_current_src_addr", "ip_8h.html#ac40a9e4a21ecf5bb39813bb6ca5bb245", null ],
+    [ "ip_current_dest_addr", "ip_8h.html#a9135977868017c3deeec86b525e13997", null ],
+    [ "ip_current_dest_addr", "ip_8h.html#a9135977868017c3deeec86b525e13997", null ],
+    [ "ip_current_header_proto", "ip_8h.html#af27c43c23b59d68a8463cd5ad035b20f", null ],
+    [ "ip_current_header_tot_len", "ip_8h.html#a2ca15ea285a10982294378cd7b8e83e2", null ],
+    [ "ip_current_input_netif", "ip_8h.html#ae214afa9d3f1b26fc8d538436b8fa3c4", null ],
+    [ "ip_current_is_v6", "ip_8h.html#abc56623d434a204298a4e98352af1c9d", null ],
+    [ "ip_current_netif", "ip_8h.html#aabecef3c7653a9767c79245c44fcab9f", null ],
+    [ "ip_current_src_addr", "ip_8h.html#a4e35b7692c228c98e738892f0a215647", null ],
+    [ "ip_current_src_addr", "ip_8h.html#a4e35b7692c228c98e738892f0a215647", null ],
+    [ "ip_get_option", "ip_8h.html#a26e077f52de4a97ff89c02415c084518", null ],
+    [ "ip_netif_get_local_ip", "group__ip.html#ga4a4b9439c91eeec719692dfe10f14af0", null ],
+    [ "ip_next_header_ptr", "ip_8h.html#a68d25b5924b768cbf2f1a78bbabfce26", null ],
+    [ "ip_output", "group__ip.html#gaf056aa43789c2964f091f8349bb83730", null ],
+    [ "ip_output_hinted", "ip_8h.html#accbc01f37dd426a66de41693a5450207", null ],
+    [ "ip_output_if", "group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250", null ],
+    [ "ip_output_if_hdrincl", "ip_8h.html#aac608b92f8f226c3574d6bb855f12496", null ],
+    [ "ip_output_if_src", "group__ip.html#gab9d45f846f796bd6ce1e0c780c392765", null ],
+    [ "IP_PCB", "ip_8h.html#a8bdf4b5f674375e76cdd968826d80e53", null ],
+    [ "ip_reset_option", "ip_8h.html#a441c63f00c4b0cb69fc34ca6b55307cc", null ],
+    [ "ip_route", "group__ip.html#ga0fa3afc2c00aea346889b476650adee3", null ],
+    [ "ip_set_option", "ip_8h.html#a13f48cf825c7f074dc05bea54e9d6a93", null ],
+    [ "LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX", "ip_8h.html#a355679dba1c0d8ef07ce3abcd28e3063", null ],
+    [ "ip_input", "group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26", null ],
+    [ "ip_data", "ip_8h.html#ac944fb6564f181bc90bc7c2b8b00d94c", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/ip__addr_8h.html b/doc/doxygen/output/html/ip__addr_8h.html
new file mode 100644
index 0000000..c1a05dc
--- /dev/null
+++ b/doc/doxygen/output/html/ip__addr_8h.html
@@ -0,0 +1,270 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/ip_addr.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('ip__addr_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">ip_addr.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="def_8h.html">lwip/def.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip4__addr_8h.html">lwip/ip4_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga1eaffd17b4b3c56cc91a6d516e18118f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#ga1eaffd17b4b3c56cc91a6d516e18118f">IPADDR4_INIT</a>(u32val)&#160;&#160;&#160;{ { { { u32val, 0ul, 0ul, 0ul } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_V4 }</td></tr>
+<tr class="separator:ga1eaffd17b4b3c56cc91a6d516e18118f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga55cc3896c46564bd2941ee5806fe1e11"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#ga55cc3896c46564bd2941ee5806fe1e11">IPADDR4_INIT_BYTES</a>(a,  b,  c,  d)&#160;&#160;&#160;<a class="el" href="group__ip4addr.html#ga1eaffd17b4b3c56cc91a6d516e18118f">IPADDR4_INIT</a>(PP_HTONL(<a class="el" href="def_8h.html#acf56d3da92a0a7a8a62a617e793e948c">LWIP_MAKEU32</a>(a,b,c,d)))</td></tr>
+<tr class="separator:ga55cc3896c46564bd2941ee5806fe1e11"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1266e500b1db0b7cdc4b269cace49746"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#ga1266e500b1db0b7cdc4b269cace49746">IPADDR6_INIT</a>(a,  b,  c,  d)&#160;&#160;&#160;{ { { { a, b, c, d } <a class="el" href="group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9">IPADDR6_ZONE_INIT</a> } }, <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a> }</td></tr>
+<tr class="separator:ga1266e500b1db0b7cdc4b269cace49746"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadaff748da2b808995993dd3db5420f08"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#gadaff748da2b808995993dd3db5420f08">IPADDR6_INIT_HOST</a>(a,  b,  c,  d)&#160;&#160;&#160;{ { { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } <a class="el" href="group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9">IPADDR6_ZONE_INIT</a> } }, <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a> }</td></tr>
+<tr class="separator:gadaff748da2b808995993dd3db5420f08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83b17dbf7d1faf5c8f8c20b039db8bb8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga83b17dbf7d1faf5c8f8c20b039db8bb8">IP_IS_ANY_TYPE_VAL</a>(ipaddr)&#160;&#160;&#160;(IP_GET_TYPE(&amp;ipaddr) == <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e">IPADDR_TYPE_ANY</a>)</td></tr>
+<tr class="separator:ga83b17dbf7d1faf5c8f8c20b039db8bb8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga23b580930c0eb1d0fdeba2b109c077a5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga23b580930c0eb1d0fdeba2b109c077a5">IPADDR_ANY_TYPE_INIT</a>&#160;&#160;&#160;{ { { { 0ul, 0ul, 0ul, 0ul } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_ANY }</td></tr>
+<tr class="separator:ga23b580930c0eb1d0fdeba2b109c077a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab1a059f07bd9c50aa58447d963b823a1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#gab1a059f07bd9c50aa58447d963b823a1">IP_IS_V4_VAL</a>(ipaddr)&#160;&#160;&#160;(IP_GET_TYPE(&amp;ipaddr) == <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a>)</td></tr>
+<tr class="separator:gab1a059f07bd9c50aa58447d963b823a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1578e34703e86711a7fb7dcc3857004d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d">IP_IS_V6_VAL</a>(ipaddr)&#160;&#160;&#160;(IP_GET_TYPE(&amp;ipaddr) == <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a>)</td></tr>
+<tr class="separator:ga1578e34703e86711a7fb7dcc3857004d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabee5dab2191bb0f3355d7f30d1496f24"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#gabee5dab2191bb0f3355d7f30d1496f24">IP_IS_V4</a>(ipaddr)&#160;&#160;&#160;(((ipaddr) == NULL) || <a class="el" href="group__ip4addr.html#gab1a059f07bd9c50aa58447d963b823a1">IP_IS_V4_VAL</a>(*(ipaddr)))</td></tr>
+<tr class="separator:gabee5dab2191bb0f3355d7f30d1496f24"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9bac7e938757f1d24df2404e8b57cb7d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d">IP_IS_V6</a>(ipaddr)&#160;&#160;&#160;(((ipaddr) != NULL) &amp;&amp; <a class="el" href="group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d">IP_IS_V6_VAL</a>(*(ipaddr)))</td></tr>
+<tr class="separator:ga9bac7e938757f1d24df2404e8b57cb7d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga06e75bcd198012b5ba39480c233608bd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(ipaddr)&#160;&#160;&#160;(&amp;((ipaddr)-&gt;u_addr.ip6))</td></tr>
+<tr class="separator:ga06e75bcd198012b5ba39480c233608bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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)&#160;&#160;&#160;(&amp;((ipaddr)-&gt;u_addr.ip4))</td></tr>
+<tr class="separator:gad7268a496b7e3f872efecd859eba6f03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadd2203c6cbfb6de8c2d9ce5bbfb2bd2a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#gadd2203c6cbfb6de8c2d9ce5bbfb2bd2a">IP_ADDR4</a>(ipaddr,  a,  b,  c,  d)</td></tr>
+<tr class="separator:gadd2203c6cbfb6de8c2d9ce5bbfb2bd2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9ee53b601b89dcb517496ba0bccf9bd0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#ga9ee53b601b89dcb517496ba0bccf9bd0">IP_ADDR6</a>(ipaddr,  i0,  i1,  i2,  i3)</td></tr>
+<tr class="separator:ga9ee53b601b89dcb517496ba0bccf9bd0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabfb1ce44d6a8791336bf3ac06aa086ca"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#gabfb1ce44d6a8791336bf3ac06aa086ca">IP_ADDR6_HOST</a>(ipaddr,  i0,  i1,  i2,  i3)&#160;&#160;&#160;<a class="el" href="group__ip6addr.html#ga9ee53b601b89dcb517496ba0bccf9bd0">IP_ADDR6</a>(ipaddr,PP_HTONL(i0),PP_HTONL(i1),PP_HTONL(i2),PP_HTONL(i3))</td></tr>
+<tr class="separator:gabfb1ce44d6a8791336bf3ac06aa086ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga77a933975db287f6aa5c2e70249ba18f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga77a933975db287f6aa5c2e70249ba18f">ip_addr_copy</a>(dest,  src)</td></tr>
+<tr class="separator:ga77a933975db287f6aa5c2e70249ba18f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabe6f7908ce8a91dc587e2ebc2172e651"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#gabe6f7908ce8a91dc587e2ebc2172e651">ip_addr_copy_from_ip6</a>(dest,  src)</td></tr>
+<tr class="separator:gabe6f7908ce8a91dc587e2ebc2172e651"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga130ca0907497831677c130dbb3289e1e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#ga130ca0907497831677c130dbb3289e1e">ip_addr_copy_from_ip6_packed</a>(dest,  src)</td></tr>
+<tr class="separator:ga130ca0907497831677c130dbb3289e1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaef063b2e975dae7ecf398770b04b14af"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#gaef063b2e975dae7ecf398770b04b14af">ip_addr_copy_from_ip4</a>(dest,  src)</td></tr>
+<tr class="separator:gaef063b2e975dae7ecf398770b04b14af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga971516589980428bf51f37cefa4ddf66"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#ga971516589980428bf51f37cefa4ddf66">ip_addr_set_ip4_u32</a>(ipaddr,  val)</td></tr>
+<tr class="separator:ga971516589980428bf51f37cefa4ddf66"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga624b5010ccc04cc3d0de2acce44f1c9e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#ga624b5010ccc04cc3d0de2acce44f1c9e">ip_addr_set_ip4_u32_val</a>(ipaddr,  val)</td></tr>
+<tr class="separator:ga624b5010ccc04cc3d0de2acce44f1c9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga09c62e8a3bf599aa7f335e0ad0820e85"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#ga09c62e8a3bf599aa7f335e0ad0820e85">ip_addr_get_ip4_u32</a>(ipaddr)</td></tr>
+<tr class="separator:ga09c62e8a3bf599aa7f335e0ad0820e85"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga40db7feae2b92f7a7a01d65a85b06e18"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga40db7feae2b92f7a7a01d65a85b06e18">ip_addr_set</a>(dest,  src)</td></tr>
+<tr class="separator:ga40db7feae2b92f7a7a01d65a85b06e18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaea5e4795598bc33fa2db1773c8e6fbac"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gaea5e4795598bc33fa2db1773c8e6fbac">ip_addr_set_ipaddr</a>(dest,  src)&#160;&#160;&#160;<a class="el" href="group__ipaddr.html#ga40db7feae2b92f7a7a01d65a85b06e18">ip_addr_set</a>(dest, src)</td></tr>
+<tr class="separator:gaea5e4795598bc33fa2db1773c8e6fbac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaae7edb585c062ae03bfbd3af7bf671bc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gaae7edb585c062ae03bfbd3af7bf671bc">ip_addr_set_zero</a>(ipaddr)</td></tr>
+<tr class="separator:gaae7edb585c062ae03bfbd3af7bf671bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aecb93d575e65f835f1045a4e87e70ed9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ip__addr_8h.html#aecb93d575e65f835f1045a4e87e70ed9">ip_addr_set_zero_ip4</a>(ipaddr)</td></tr>
+<tr class="separator:aecb93d575e65f835f1045a4e87e70ed9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafb3a0e5241683aff573e195f31ba8845"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#gafb3a0e5241683aff573e195f31ba8845">ip_addr_set_zero_ip6</a>(ipaddr)</td></tr>
+<tr class="separator:gafb3a0e5241683aff573e195f31ba8845"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8853fce54b1816dca3af90b48677e673"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga8853fce54b1816dca3af90b48677e673">ip_addr_set_any</a>(is_ipv6,  ipaddr)</td></tr>
+<tr class="separator:ga8853fce54b1816dca3af90b48677e673"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga93c7bf3f7487495472aa0f9b5fc25d1a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga93c7bf3f7487495472aa0f9b5fc25d1a">ip_addr_set_any_val</a>(is_ipv6,  ipaddr)</td></tr>
+<tr class="separator:ga93c7bf3f7487495472aa0f9b5fc25d1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8f9d56ac85cd87338a1823e4a58ba1da"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga8f9d56ac85cd87338a1823e4a58ba1da">ip_addr_set_loopback</a>(is_ipv6,  ipaddr)</td></tr>
+<tr class="separator:ga8f9d56ac85cd87338a1823e4a58ba1da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac1c5f897bbee217771b1a6ba18733042"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gac1c5f897bbee217771b1a6ba18733042">ip_addr_set_loopback_val</a>(is_ipv6,  ipaddr)</td></tr>
+<tr class="separator:gac1c5f897bbee217771b1a6ba18733042"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3528798be1d2f1ec6a6bccd35694edce"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga3528798be1d2f1ec6a6bccd35694edce">ip_addr_set_hton</a>(dest,  src)</td></tr>
+<tr class="separator:ga3528798be1d2f1ec6a6bccd35694edce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab5c5540ea05227bdd9207a47304bb2c1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gab5c5540ea05227bdd9207a47304bb2c1">ip_addr_get_network</a>(target,  host,  netmask)</td></tr>
+<tr class="separator:gab5c5540ea05227bdd9207a47304bb2c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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: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: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"><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"><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"><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"><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"><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:ga8619278bcbf705844f584f36972fc758"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga8619278bcbf705844f584f36972fc758">IPADDR_STRLEN_MAX</a>&#160;&#160;&#160;IP6ADDR_STRLEN_MAX</td></tr>
+<tr class="separator:ga8619278bcbf705844f584f36972fc758"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae5f26df8f5099f330ad1e506c74f06f7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gae5f26df8f5099f330ad1e506c74f06f7">ip4_2_ipv4_mapped_ipv6</a>(ip6addr,  ip4addr)</td></tr>
+<tr class="separator:gae5f26df8f5099f330ad1e506c74f06f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga66b5a64b12128e3716bcf04ff91b5a57"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga66b5a64b12128e3716bcf04ff91b5a57">unmap_ipv4_mapped_ipv6</a>(ip4addr,  ip6addr)&#160;&#160;&#160;(ip4addr)-&gt;addr = (ip6addr)-&gt;addr[3];</td></tr>
+<tr class="separator:ga66b5a64b12128e3716bcf04ff91b5a57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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>
+<tr class="separator:gae920b6e81610a38cf9ada52118807eff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa3f65a42b68149e96e618600b2ca2e42"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#gaa3f65a42b68149e96e618600b2ca2e42">IP4_ADDR_ANY4</a>&#160;&#160;&#160;(<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;ip_addr_any))</td></tr>
+<tr class="separator:gaa3f65a42b68149e96e618600b2ca2e42"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad546955e48dada78b552375b873f6986"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#gad546955e48dada78b552375b873f6986">IP_ADDR_BROADCAST</a>&#160;&#160;&#160;(&amp;ip_addr_broadcast)</td></tr>
+<tr class="separator:gad546955e48dada78b552375b873f6986"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5efdf55ba72c2b1b5755b1fc6f559a1a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#ga5efdf55ba72c2b1b5755b1fc6f559a1a">IP4_ADDR_BROADCAST</a>&#160;&#160;&#160;(<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;ip_addr_broadcast))</td></tr>
+<tr class="separator:ga5efdf55ba72c2b1b5755b1fc6f559a1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5181d2cb6b9254eb5ad4137f7b3635a0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#ga5181d2cb6b9254eb5ad4137f7b3635a0">IP6_ADDR_ANY</a>&#160;&#160;&#160;(&amp;ip6_addr_any)</td></tr>
+<tr class="separator:ga5181d2cb6b9254eb5ad4137f7b3635a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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 name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga16ef96d6cde029029bbf47fee35fd67a"><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="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a></td></tr>
+<tr class="separator:ga16ef96d6cde029029bbf47fee35fd67a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:gaf2142f0dfdcc938e2db16aa745ed585c"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">lwip_ip_addr_type</a> { <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a> = 0U, 
+<a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02">IPADDR_TYPE_V6</a> = 6U, 
+<a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e">IPADDR_TYPE_ANY</a> = 46U
+ }</td></tr>
+<tr class="separator:gaf2142f0dfdcc938e2db16aa745ed585c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gace12d28aef35bb15962e8563aea571b1"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1">ipaddr_ntoa</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr)</td></tr>
+<tr class="separator:gace12d28aef35bb15962e8563aea571b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3684dabc0cae597ffb5b51d41f1d886f"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga3684dabc0cae597ffb5b51d41f1d886f">ipaddr_ntoa_r</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, char *buf, int buflen)</td></tr>
+<tr class="separator:ga3684dabc0cae597ffb5b51d41f1d886f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4de70fdd7fd36c5b6eaed8b855d5f151"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151">ipaddr_aton</a> (const char *cp, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr)</td></tr>
+<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>
+<div class="textblock"><p>IP address API (common IPv4 and IPv6) </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="aecb93d575e65f835f1045a4e87e70ed9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aecb93d575e65f835f1045a4e87e70ed9">&#9670;&nbsp;</a></span>ip_addr_set_zero_ip4</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_set_zero_ip4</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ipaddr</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>{ \</div><div class="line">  ip6_addr_set_zero(<a class="code" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(ipaddr)); IP_SET_TYPE(ipaddr, <a class="code" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a>); }<span class="keywordflow">while</span>(0)</div><div class="ttc" id="group__ipaddr_html_ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049"><div class="ttname"><a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049">IPADDR_TYPE_V4</a></div><div class="ttdef"><b>Definition:</b> ip_addr.h:56</div></div>
+<div class="ttc" id="group__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 -->
+</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="ip__addr_8h.html">ip_addr.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/ip__addr_8h.js b/doc/doxygen/output/html/ip__addr_8h.js
new file mode 100644
index 0000000..dcc141b
--- /dev/null
+++ b/doc/doxygen/output/html/ip__addr_8h.js
@@ -0,0 +1,65 @@
+var ip__addr_8h =
+[
+    [ "ip4_2_ipv4_mapped_ipv6", "group__ipaddr.html#gae5f26df8f5099f330ad1e506c74f06f7", null ],
+    [ "IP4_ADDR_ANY", "group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff", null ],
+    [ "IP4_ADDR_ANY4", "group__ip4addr.html#gaa3f65a42b68149e96e618600b2ca2e42", null ],
+    [ "IP4_ADDR_BROADCAST", "group__ip4addr.html#ga5efdf55ba72c2b1b5755b1fc6f559a1a", null ],
+    [ "IP6_ADDR_ANY", "group__ip6addr.html#ga5181d2cb6b9254eb5ad4137f7b3635a0", null ],
+    [ "IP6_ADDR_ANY6", "group__ip6addr.html#ga953cdd2592764ba2e6e021aea350ad43", null ],
+    [ "ip_2_ip4", "group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03", null ],
+    [ "ip_2_ip6", "group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd", null ],
+    [ "IP_ADDR4", "group__ip4addr.html#gadd2203c6cbfb6de8c2d9ce5bbfb2bd2a", null ],
+    [ "IP_ADDR6", "group__ip6addr.html#ga9ee53b601b89dcb517496ba0bccf9bd0", null ],
+    [ "IP_ADDR6_HOST", "group__ip6addr.html#gabfb1ce44d6a8791336bf3ac06aa086ca", null ],
+    [ "IP_ADDR_ANY", "group__ip4addr.html#ga3e5e67b7292b156034560fef2202776c", null ],
+    [ "IP_ADDR_BROADCAST", "group__ip4addr.html#gad546955e48dada78b552375b873f6986", null ],
+    [ "ip_addr_cmp", "group__ipaddr.html#ga008c9c92d770cc030ea054e6b259835a", null ],
+    [ "ip_addr_cmp_zoneless", "group__ipaddr.html#gadb66f6d5fa926ed4b0e69db58dffcbe4", null ],
+    [ "ip_addr_copy", "group__ipaddr.html#ga77a933975db287f6aa5c2e70249ba18f", null ],
+    [ "ip_addr_copy_from_ip4", "group__ip4addr.html#gaef063b2e975dae7ecf398770b04b14af", null ],
+    [ "ip_addr_copy_from_ip6", "group__ip6addr.html#gabe6f7908ce8a91dc587e2ebc2172e651", null ],
+    [ "ip_addr_copy_from_ip6_packed", "group__ip6addr.html#ga130ca0907497831677c130dbb3289e1e", null ],
+    [ "ip_addr_get_ip4_u32", "group__ip4addr.html#ga09c62e8a3bf599aa7f335e0ad0820e85", null ],
+    [ "ip_addr_get_network", "group__ipaddr.html#gab5c5540ea05227bdd9207a47304bb2c1", 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_netcmp", "group__ipaddr.html#ga3a2123f0bbf6fe843c8542e349c680eb", null ],
+    [ "ip_addr_set", "group__ipaddr.html#ga40db7feae2b92f7a7a01d65a85b06e18", null ],
+    [ "ip_addr_set_any", "group__ipaddr.html#ga8853fce54b1816dca3af90b48677e673", null ],
+    [ "ip_addr_set_any_val", "group__ipaddr.html#ga93c7bf3f7487495472aa0f9b5fc25d1a", null ],
+    [ "ip_addr_set_hton", "group__ipaddr.html#ga3528798be1d2f1ec6a6bccd35694edce", null ],
+    [ "ip_addr_set_ip4_u32", "group__ip4addr.html#ga971516589980428bf51f37cefa4ddf66", null ],
+    [ "ip_addr_set_ip4_u32_val", "group__ip4addr.html#ga624b5010ccc04cc3d0de2acce44f1c9e", null ],
+    [ "ip_addr_set_ipaddr", "group__ipaddr.html#gaea5e4795598bc33fa2db1773c8e6fbac", null ],
+    [ "ip_addr_set_loopback", "group__ipaddr.html#ga8f9d56ac85cd87338a1823e4a58ba1da", null ],
+    [ "ip_addr_set_loopback_val", "group__ipaddr.html#gac1c5f897bbee217771b1a6ba18733042", null ],
+    [ "ip_addr_set_zero", "group__ipaddr.html#gaae7edb585c062ae03bfbd3af7bf671bc", null ],
+    [ "ip_addr_set_zero_ip4", "ip__addr_8h.html#aecb93d575e65f835f1045a4e87e70ed9", null ],
+    [ "ip_addr_set_zero_ip6", "group__ip6addr.html#gafb3a0e5241683aff573e195f31ba8845", null ],
+    [ "IP_ANY_TYPE", "group__ipaddr.html#gabe43b154533b73585c4e58f568370ede", null ],
+    [ "IP_IS_ANY_TYPE_VAL", "group__ipaddr.html#ga83b17dbf7d1faf5c8f8c20b039db8bb8", null ],
+    [ "IP_IS_V4", "group__ip4addr.html#gabee5dab2191bb0f3355d7f30d1496f24", null ],
+    [ "IP_IS_V4_VAL", "group__ip4addr.html#gab1a059f07bd9c50aa58447d963b823a1", null ],
+    [ "IP_IS_V6", "group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d", null ],
+    [ "IP_IS_V6_VAL", "group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d", null ],
+    [ "IPADDR4_INIT", "group__ip4addr.html#ga1eaffd17b4b3c56cc91a6d516e18118f", null ],
+    [ "IPADDR4_INIT_BYTES", "group__ip4addr.html#ga55cc3896c46564bd2941ee5806fe1e11", null ],
+    [ "IPADDR6_INIT", "group__ip6addr.html#ga1266e500b1db0b7cdc4b269cace49746", null ],
+    [ "IPADDR6_INIT_HOST", "group__ip6addr.html#gadaff748da2b808995993dd3db5420f08", null ],
+    [ "IPADDR_ANY_TYPE_INIT", "group__ipaddr.html#ga23b580930c0eb1d0fdeba2b109c077a5", null ],
+    [ "IPADDR_STRLEN_MAX", "group__ipaddr.html#ga8619278bcbf705844f584f36972fc758", null ],
+    [ "unmap_ipv4_mapped_ipv6", "group__ipaddr.html#ga66b5a64b12128e3716bcf04ff91b5a57", null ],
+    [ "ip_addr_t", "group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a", null ],
+    [ "lwip_ip_addr_type", "group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c", [
+      [ "IPADDR_TYPE_V4", "group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049", null ],
+      [ "IPADDR_TYPE_V6", "group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02", null ],
+      [ "IPADDR_TYPE_ANY", "group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e", null ]
+    ] ],
+    [ "ipaddr_aton", "group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151", null ],
+    [ "ipaddr_ntoa", "group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1", null ],
+    [ "ipaddr_ntoa_r", "group__ipaddr.html#ga3684dabc0cae597ffb5b51d41f1d886f", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/jquery.js b/doc/doxygen/output/html/jquery.js
new file mode 100644
index 0000000..f5343ed
--- /dev/null
+++ b/doc/doxygen/output/html/jquery.js
@@ -0,0 +1,87 @@
+/*!
+ * jQuery JavaScript Library v1.7.1
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Mon Nov 21 21:11:03 2011 -0500
+ */
+(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b4<b3;b4++){if((b9=arguments[b4])!=null){for(b2 in b9){b0=b5[b2];b1=b9[b2];if(b5===b1){continue}if(b8&&b1&&(bF.isPlainObject(b1)||(b6=bF.isArray(b1)))){if(b6){b6=false;b7=b0&&bF.isArray(b0)?b0:[]}else{b7=b0&&bF.isPlainObject(b0)?b0:{}}b5[b2]=bF.extend(b8,b7,b1)}else{if(b1!==L){b5[b2]=b1}}}}}return b5};bF.extend({noConflict:function(b0){if(bb.$===bF){bb.$=bH}if(b0&&bb.jQuery===bF){bb.jQuery=bU}return bF},isReady:false,readyWait:1,holdReady:function(b0){if(b0){bF.readyWait++}else{bF.ready(true)}},ready:function(b0){if((b0===true&&!--bF.readyWait)||(b0!==true&&!bF.isReady)){if(!av.body){return setTimeout(bF.ready,1)}bF.isReady=true;if(b0!==true&&--bF.readyWait>0){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b4<b5;){if(b6.apply(b3[b4++],b2)===false){break}}}}else{if(b0){for(b1 in b3){if(b6.call(b3[b1],b1,b3[b1])===false){break}}}else{for(;b4<b5;){if(b6.call(b3[b4],b4,b3[b4++])===false){break}}}}return b3},trim:bO?function(b0){return b0==null?"":bO.call(b0)}:function(b0){return b0==null?"":b0.toString().replace(bI,"").replace(bE,"")},makeArray:function(b3,b1){var b0=b1||[];if(b3!=null){var b2=bF.type(b3);if(b3.length==null||b2==="string"||b2==="function"||b2==="regexp"||bF.isWindow(b3)){bz.call(b0,b3)}else{bF.merge(b0,b3)}}return b0},inArray:function(b2,b3,b1){var b0;if(b3){if(bv){return bv.call(b3,b2,b1)}b0=b3.length;b1=b1?b1<0?Math.max(0,b0+b1):b1:0;for(;b1<b0;b1++){if(b1 in b3&&b3[b1]===b2){return b1}}}return -1},merge:function(b4,b2){var b3=b4.length,b1=0;if(typeof b2.length==="number"){for(var b0=b2.length;b1<b0;b1++){b4[b3++]=b2[b1]}}else{while(b2[b1]!==L){b4[b3++]=b2[b1++]}}b4.length=b3;return b4},grep:function(b1,b6,b0){var b2=[],b5;b0=!!b0;for(var b3=0,b4=b1.length;b3<b4;b3++){b5=!!b6(b1[b3],b3);if(b0!==b5){b2.push(b1[b3])}}return b2},map:function(b0,b7,b8){var b5,b6,b4=[],b2=0,b1=b0.length,b3=b0 instanceof bF||b1!==L&&typeof b1==="number"&&((b1>0&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b2<b1;b2++){b5=b7(b0[b2],b2,b8);if(b5!=null){b4[b4.length]=b5}}}else{for(b6 in b0){b5=b7(b0[b6],b6,b8);if(b5!=null){b4[b4.length]=b5}}}return b4.concat.apply([],b4)},guid:1,proxy:function(b4,b3){if(typeof b3==="string"){var b2=b4[b3];b3=b4;b4=b2}if(!bF.isFunction(b4)){return L}var b0=bK.call(arguments,2),b1=function(){return b4.apply(b3,b0.concat(bK.call(arguments)))};b1.guid=b4.guid=b4.guid||b1.guid||bF.guid++;return b1},access:function(b0,b8,b6,b2,b5,b7){var b1=b0.length;if(typeof b8==="object"){for(var b3 in b8){bF.access(b0,b3,b8[b3],b2,b5,b6)}return b0}if(b6!==L){b2=!b7&&b2&&bF.isFunction(b6);for(var b4=0;b4<b1;b4++){b5(b0[b4],b8,b2?b6.call(b0[b4],b4,b5(b0[b4],b8)):b6,b7)}return b0}return b1?b5(b0[0],b8):L},now:function(){return(new Date()).getTime()},uaMatch:function(b1){b1=b1.toLowerCase();var b0=by.exec(b1)||bR.exec(b1)||bQ.exec(b1)||b1.indexOf("compatible")<0&&bS.exec(b1)||[];return{browser:b0[1]||"",version:b0[2]||"0"}},sub:function(){function b0(b3,b4){return new b0.fn.init(b3,b4)}bF.extend(true,b0,this);b0.superclass=this;b0.fn=b0.prototype=this();b0.fn.constructor=b0;b0.sub=this.sub;b0.fn.init=function b2(b3,b4){if(b4&&b4 instanceof bF&&!(b4 instanceof b0)){b4=b0(b4)}return bF.fn.init.call(this,b3,b4,b1)};b0.fn.init.prototype=b0.fn;var b1=b0(av);return b0},browser:{}});bF.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(b1,b0){bx["[object "+b0+"]"]=b0.toLowerCase()});bV=bF.uaMatch(bX);if(bV.browser){bF.browser[bV.browser]=true;bF.browser.version=bV.version}if(bF.browser.webkit){bF.browser.safari=true}if(bM.test("\xA0")){bI=/^[\s\xA0]+/;bE=/[\s\xA0]+$/}bD=bF(av);if(av.addEventListener){e=function(){av.removeEventListener("DOMContentLoaded",e,false);bF.ready()}}else{if(av.attachEvent){e=function(){if(av.readyState==="complete"){av.detachEvent("onreadystatechange",e);bF.ready()}}}}function bw(){if(bF.isReady){return}try{av.documentElement.doScroll("left")}catch(b0){setTimeout(bw,1);return}bF.ready()}return bF})();var a2={};function X(e){var bv=a2[e]={},bw,bx;e=e.split(/\s+/);for(bw=0,bx=e.length;bw<bx;bw++){bv[e[bw]]=true}return bv}b.Callbacks=function(bw){bw=bw?(a2[bw]||X(bw)):{};var bB=[],bC=[],bx,by,bv,bz,bA,bE=function(bF){var bG,bJ,bI,bH,bK;for(bG=0,bJ=bF.length;bG<bJ;bG++){bI=bF[bG];bH=b.type(bI);if(bH==="array"){bE(bI)}else{if(bH==="function"){if(!bw.unique||!bD.has(bI)){bB.push(bI)}}}}},e=function(bG,bF){bF=bF||[];bx=!bw.memory||[bG,bF];by=true;bA=bv||0;bv=0;bz=bB.length;for(;bB&&bA<bz;bA++){if(bB[bA].apply(bG,bF)===false&&bw.stopOnFalse){bx=true;break}}by=false;if(bB){if(!bw.once){if(bC&&bC.length){bx=bC.shift();bD.fireWith(bx[0],bx[1])}}else{if(bx===true){bD.disable()}else{bB=[]}}}},bD={add:function(){if(bB){var bF=bB.length;bE(arguments);if(by){bz=bB.length}else{if(bx&&bx!==true){bv=bF;e(bx[0],bx[1])}}}return this},remove:function(){if(bB){var bF=arguments,bH=0,bI=bF.length;for(;bH<bI;bH++){for(var bG=0;bG<bB.length;bG++){if(bF[bH]===bB[bG]){if(by){if(bG<=bz){bz--;if(bG<=bA){bA--}}}bB.splice(bG--,1);if(bw.unique){break}}}}}return this},has:function(bG){if(bB){var bF=0,bH=bB.length;for(;bF<bH;bF++){if(bG===bB[bF]){return true}}}return false},empty:function(){bB=[];return this},disable:function(){bB=bC=bx=L;return this},disabled:function(){return !bB},lock:function(){bC=L;if(!bx||bx===true){bD.disable()}return this},locked:function(){return !bC},fireWith:function(bG,bF){if(bC){if(by){if(!bw.once){bC.push([bG,bF])}}else{if(!(bw.once&&bx)){e(bG,bF)}}}return this},fire:function(){bD.fireWith(this,arguments);return this},fired:function(){return !!bx}};return bD};var aJ=[].slice;b.extend({Deferred:function(by){var bx=b.Callbacks("once memory"),bw=b.Callbacks("once memory"),bv=b.Callbacks("memory"),e="pending",bA={resolve:bx,reject:bw,notify:bv},bC={done:bx.add,fail:bw.add,progress:bv.add,state:function(){return e},isResolved:bx.fired,isRejected:bw.fired,then:function(bE,bD,bF){bB.done(bE).fail(bD).progress(bF);return this},always:function(){bB.done.apply(bB,arguments).fail.apply(bB,arguments);return this},pipe:function(bF,bE,bD){return b.Deferred(function(bG){b.each({done:[bF,"resolve"],fail:[bE,"reject"],progress:[bD,"notify"]},function(bI,bL){var bH=bL[0],bK=bL[1],bJ;if(b.isFunction(bH)){bB[bI](function(){bJ=bH.apply(this,arguments);if(bJ&&b.isFunction(bJ.promise)){bJ.promise().then(bG.resolve,bG.reject,bG.notify)}else{bG[bK+"With"](this===bB?bG:this,[bJ])}})}else{bB[bI](bG[bK])}})}).promise()},promise:function(bE){if(bE==null){bE=bC}else{for(var bD in bC){bE[bD]=bC[bD]}}return bE}},bB=bC.promise({}),bz;for(bz in bA){bB[bz]=bA[bz].fire;bB[bz+"With"]=bA[bz].fireWith}bB.done(function(){e="resolved"},bw.disable,bv.lock).fail(function(){e="rejected"},bx.disable,bv.lock);if(by){by.call(bB,bB)}return bB},when:function(bA){var bx=aJ.call(arguments,0),bv=0,e=bx.length,bB=new Array(e),bw=e,by=e,bC=e<=1&&bA&&b.isFunction(bA.promise)?bA:b.Deferred(),bE=bC.promise();function bD(bF){return function(bG){bx[bF]=arguments.length>1?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv<e;bv++){if(bx[bv]&&bx[bv].promise&&b.isFunction(bx[bv].promise)){bx[bv].promise().then(bD(bv),bC.reject,bz(bv))}else{--bw}}if(!bw){bC.resolveWith(bC,bx)}}else{if(bC!==bA){bC.resolveWith(bC,e?[bA]:[])}}return bE}});b.support=(function(){var bJ,bI,bF,bG,bx,bE,bA,bD,bz,bK,bB,by,bw,bv=av.createElement("div"),bH=av.documentElement;bv.setAttribute("className","t");bv.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav></:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="<div "+e+"><div></div></div><table "+e+" cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="<div style='width:4px;'></div>";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA<bz;bA++){delete bB[bv[bA]]}if(!(by?S:b.isEmptyObject)(bB)){return}}}if(!by){delete e[bw].data;if(!S(e[bw])){return}}if(b.support.deleteExpando||!e.setInterval){delete e[bw]}else{e[bw]=null}if(bD){if(b.support.deleteExpando){delete bx[bC]}else{if(bx.removeAttribute){bx.removeAttribute(bC)}else{bx[bC]=null}}}},_data:function(bv,e,bw){return b.data(bv,e,bw,true)},acceptData:function(bv){if(bv.nodeName){var e=b.noData[bv.nodeName.toLowerCase()];if(e){return !(e===true||bv.getAttribute("classid")!==e)}}return true}});b.fn.extend({data:function(by,bA){var bB,e,bw,bz=null;if(typeof by==="undefined"){if(this.length){bz=b.data(this[0]);if(this[0].nodeType===1&&!b._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var bx=0,bv=e.length;bx<bv;bx++){bw=e[bx].name;if(bw.indexOf("data-")===0){bw=b.camelCase(bw.substring(5));a5(this[0],bw,bz[bw])}}b._data(this[0],"parsedAttrs",true)}}return bz}else{if(typeof by==="object"){return this.each(function(){b.data(this,by)})}}bB=by.split(".");bB[1]=bB[1]?"."+bB[1]:"";if(bA===L){bz=this.triggerHandler("getData"+bB[1]+"!",[bB[0]]);if(bz===L&&this.length){bz=b.data(this[0],by);bz=a5(this[0],by,bz)}return bz===L&&bB[1]?this.data(bB[0]):bz}else{return this.each(function(){var bC=b(this),bD=[bB[0],bA];bC.triggerHandler("setData"+bB[1]+"!",bD);b.data(this,by,bA);bC.triggerHandler("changeData"+bB[1]+"!",bD)})}},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function a5(bx,bw,by){if(by===L&&bx.nodeType===1){var bv="data-"+bw.replace(aA,"-$1").toLowerCase();by=bx.getAttribute(bv);if(typeof by==="string"){try{by=by==="true"?true:by==="false"?false:by==="null"?null:b.isNumeric(by)?parseFloat(by):aS.test(by)?b.parseJSON(by):by}catch(bz){}b.data(bx,bw,by)}else{by=L}}return by}function S(bv){for(var e in bv){if(e==="data"&&b.isEmptyObject(bv[e])){continue}if(e!=="toJSON"){return false}}return true}function bi(by,bx,bA){var bw=bx+"defer",bv=bx+"queue",e=bx+"mark",bz=b._data(by,bw);if(bz&&(bA==="queue"||!b._data(by,bv))&&(bA==="mark"||!b._data(by,e))){setTimeout(function(){if(!b._data(by,bv)&&!b._data(by,e)){b.removeData(by,bw,true);bz.fire()}},0)}}b.extend({_mark:function(bv,e){if(bv){e=(e||"fx")+"mark";b._data(bv,e,(b._data(bv,e)||0)+1)}},_unmark:function(by,bx,bv){if(by!==true){bv=bx;bx=by;by=false}if(bx){bv=bv||"fx";var e=bv+"mark",bw=by?0:((b._data(bx,e)||1)-1);if(bw){b._data(bx,e,bw)}else{b.removeData(bx,e,true);bi(bx,bv,"mark")}}},queue:function(bv,e,bx){var bw;if(bv){e=(e||"fx")+"queue";bw=b._data(bv,e);if(bx){if(!bw||b.isArray(bx)){bw=b._data(bv,e,b.makeArray(bx))}else{bw.push(bx)}}return bw||[]}},dequeue:function(by,bx){bx=bx||"fx";var bv=b.queue(by,bx),bw=bv.shift(),e={};if(bw==="inprogress"){bw=bv.shift()}if(bw){if(bx==="fx"){bv.unshift("inprogress")}b._data(by,bx+".run",e);bw.call(by,function(){b.dequeue(by,bx)},e)}if(!bv.length){b.removeData(by,bx+"queue "+bx+".run",true);bi(by,bx,"queue")}}});b.fn.extend({queue:function(e,bv){if(typeof e!=="string"){bv=e;e="fx"}if(bv===L){return b.queue(this[0],e)}return this.each(function(){var bw=b.queue(this,e,bv);if(e==="fx"&&bw[0]!=="inprogress"){b.dequeue(this,e)}})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(bv,e){bv=b.fx?b.fx.speeds[bv]||bv:bv;e=e||"fx";return this.queue(e,function(bx,bw){var by=setTimeout(bx,bv);bw.stop=function(){clearTimeout(by)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(bD,bw){if(typeof bD!=="string"){bw=bD;bD=L}bD=bD||"fx";var e=b.Deferred(),bv=this,by=bv.length,bB=1,bz=bD+"defer",bA=bD+"queue",bC=bD+"mark",bx;function bE(){if(!(--bB)){e.resolveWith(bv,[bv])}}while(by--){if((bx=b.data(bv[by],bz,L,true)||(b.data(bv[by],bA,L,true)||b.data(bv[by],bC,L,true))&&b.data(bv[by],bz,b.Callbacks("once memory"),true))){bB++;bx.add(bE)}}bE();return e.promise()}});var aP=/[\n\t\r]/g,af=/\s+/,aU=/\r/g,g=/^(?:button|input)$/i,D=/^(?:button|input|object|select|textarea)$/i,l=/^a(?:rea)?$/i,ao=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,F=b.support.getSetAttribute,be,aY,aF;b.fn.extend({attr:function(e,bv){return b.access(this,e,bv,true,b.attr)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,bv){return b.access(this,e,bv,true,b.prop)},removeProp:function(e){e=b.propFix[e]||e;return this.each(function(){try{this[e]=L;delete this[e]}catch(bv){}})},addClass:function(by){var bA,bw,bv,bx,bz,bB,e;if(b.isFunction(by)){return this.each(function(bC){b(this).addClass(by.call(this,bC,this.className))})}if(by&&typeof by==="string"){bA=by.split(af);for(bw=0,bv=this.length;bw<bv;bw++){bx=this[bw];if(bx.nodeType===1){if(!bx.className&&bA.length===1){bx.className=by}else{bz=" "+bx.className+" ";for(bB=0,e=bA.length;bB<e;bB++){if(!~bz.indexOf(" "+bA[bB]+" ")){bz+=bA[bB]+" "}}bx.className=b.trim(bz)}}}}return this},removeClass:function(bz){var bA,bw,bv,by,bx,bB,e;if(b.isFunction(bz)){return this.each(function(bC){b(this).removeClass(bz.call(this,bC,this.className))})}if((bz&&typeof bz==="string")||bz===L){bA=(bz||"").split(af);for(bw=0,bv=this.length;bw<bv;bw++){by=this[bw];if(by.nodeType===1&&by.className){if(bz){bx=(" "+by.className+" ").replace(aP," ");for(bB=0,e=bA.length;bB<e;bB++){bx=bx.replace(" "+bA[bB]+" "," ")}by.className=b.trim(bx)}else{by.className=""}}}}return this},toggleClass:function(bx,bv){var bw=typeof bx,e=typeof bv==="boolean";if(b.isFunction(bx)){return this.each(function(by){b(this).toggleClass(bx.call(this,by,this.className,bv),bv)})}return this.each(function(){if(bw==="string"){var bA,bz=0,by=b(this),bB=bv,bC=bx.split(af);while((bA=bC[bz++])){bB=e?bB:!by.hasClass(bA);by[bB?"addClass":"removeClass"](bA)}}else{if(bw==="undefined"||bw==="boolean"){if(this.className){b._data(this,"__className__",this.className)}this.className=this.className||bx===false?"":b._data(this,"__className__")||""}}})},hasClass:function(e){var bx=" "+e+" ",bw=0,bv=this.length;for(;bw<bv;bw++){if(this[bw].nodeType===1&&(" "+this[bw].className+" ").replace(aP," ").indexOf(bx)>-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv<bz;bv++){bx=bC[bv];if(bx.selected&&(b.support.optDisabled?!bx.disabled:bx.getAttribute("disabled")===null)&&(!bx.parentNode.disabled||!b.nodeName(bx.parentNode,"optgroup"))){bA=b(bx).val();if(bw){return bA}bB.push(bA)}}if(bw&&!bB.length&&bC.length){return b(bC[by]).val()}return bB},set:function(bv,bw){var e=b.makeArray(bw);b(bv).find("option").each(function(){this.selected=b.inArray(b(this).val(),e)>=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw<e;bw++){bv=bA[bw];if(bv){by=b.propFix[bv]||bv;b.attr(bx,bv,"");bx.removeAttribute(F?bv:by);if(ao.test(bv)&&by in bx){bx[by]=false}}}}},attrHooks:{type:{set:function(e,bv){if(g.test(e.nodeName)&&e.parentNode){b.error("type property can't be changed")}else{if(!b.support.radioValue&&bv==="radio"&&b.nodeName(e,"input")){var bw=e.value;e.setAttribute("type",bv);if(bw){e.value=bw}return bv}}}},value:{get:function(bv,e){if(be&&b.nodeName(bv,"button")){return be.get(bv,e)}return e in bv?bv.value:null},set:function(bv,bw,e){if(be&&b.nodeName(bv,"button")){return be.set(bv,bw,e)}bv.value=bw}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(bz,bx,bA){var bw,e,by,bv=bz.nodeType;if(!bz||bv===3||bv===8||bv===2){return}by=bv!==1||!b.isXMLDoc(bz);if(by){bx=b.propFix[bx]||bx;e=b.propHooks[bx]}if(bA!==L){if(e&&"set" in e&&(bw=e.set(bz,bA,bx))!==L){return bw}else{return(bz[bx]=bA)}}else{if(e&&"get" in e&&(bw=e.get(bz,bx))!==null){return bw}else{return bz[bx]}}},propHooks:{tabIndex:{get:function(bv){var e=bv.getAttributeNode("tabindex");return e&&e.specified?parseInt(e.value,10):D.test(bv.nodeName)||l.test(bv.nodeName)&&bv.href?0:L}}}});b.attrHooks.tabindex=b.propHooks.tabIndex;aY={get:function(bv,e){var bx,bw=b.prop(bv,e);return bw===true||typeof bw!=="boolean"&&(bx=bv.getAttributeNode(e))&&bx.nodeValue!==false?e.toLowerCase():L},set:function(bv,bx,e){var bw;if(bx===false){b.removeAttr(bv,e)}else{bw=b.propFix[e]||e;if(bw in bv){bv[bw]=true}bv.setAttribute(e,e.toLowerCase())}return e}};if(!F){aF={name:true,id:true};be=b.valHooks.button={get:function(bw,bv){var e;e=bw.getAttributeNode(bv);return e&&(aF[bv]?e.nodeValue!=="":e.specified)?e.nodeValue:L},set:function(bw,bx,bv){var e=bw.getAttributeNode(bv);if(!e){e=av.createAttribute(bv);bw.setAttributeNode(e)}return(e.nodeValue=bx+"")}};b.attrHooks.tabindex.set=be.set;b.each(["width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{set:function(bw,bx){if(bx===""){bw.setAttribute(e,"auto");return bx}}})});b.attrHooks.contenteditable={get:be.get,set:function(bv,bw,e){if(bw===""){bw="false"}be.set(bv,bw,e)}}}if(!b.support.hrefNormalized){b.each(["href","src","width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{get:function(bx){var bw=bx.getAttribute(e,2);return bw===null?L:bw}})})}if(!b.support.style){b.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||L},set:function(e,bv){return(e.style.cssText=""+bv)}}}if(!b.support.optSelected){b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(bv){var e=bv.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}})}if(!b.support.enctype){b.propFix.enctype="encoding"}if(!b.support.checkOn){b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}})}b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,bv){if(b.isArray(bv)){return(e.checked=b.inArray(b(e).val(),bv)>=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI<bC.length;bI++){bH=n.exec(bC[bI])||[];bF=bH[1];e=(bH[2]||"").split(".").sort();bE=b.event.special[bF]||{};bF=(by?bE.delegateType:bE.bindType)||bF;bE=b.event.special[bF]||{};bG=b.extend({type:bF,origType:bH[1],data:bA,handler:bJ,guid:bJ.guid,selector:by,quick:Y(by),namespace:e.join(".")},bv);bw=bK[bF];if(!bw){bw=bK[bF]=[];bw.delegateCount=0;if(!bE.setup||bE.setup.call(bx,bA,e,bB)===false){if(bx.addEventListener){bx.addEventListener(bF,bB,false)}else{if(bx.attachEvent){bx.attachEvent("on"+bF,bB)}}}}if(bE.add){bE.add.call(bx,bG);if(!bG.handler.guid){bG.handler.guid=bJ.guid}}if(by){bw.splice(bw.delegateCount++,0,bG)}else{bw.push(bG)}b.event.global[bF]=true}bx=null},global:{},remove:function(bJ,bE,bv,bH,bB){var bI=b.hasData(bJ)&&b._data(bJ),bF,bx,bz,bL,bC,bA,bG,bw,by,bK,bD,e;if(!bI||!(bw=bI.events)){return}bE=b.trim(bt(bE||"")).split(" ");for(bF=0;bF<bE.length;bF++){bx=n.exec(bE[bF])||[];bz=bL=bx[1];bC=bx[2];if(!bz){for(bz in bw){b.event.remove(bJ,bz+bE[bF],bv,bH,true)}continue}by=b.event.special[bz]||{};bz=(bH?by.delegateType:by.bindType)||bz;bD=bw[bz]||[];bA=bD.length;bC=bC?new RegExp("(^|\\.)"+bC.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(bG=0;bG<bD.length;bG++){e=bD[bG];if((bB||bL===e.origType)&&(!bv||bv.guid===e.guid)&&(!bC||bC.test(e.namespace))&&(!bH||bH===e.selector||bH==="**"&&e.selector)){bD.splice(bG--,1);if(e.selector){bD.delegateCount--}if(by.remove){by.remove.call(bJ,e)}}}if(bD.length===0&&bA!==bD.length){if(!by.teardown||by.teardown.call(bJ,bC)===false){b.removeEvent(bJ,bz,bI.handle)}delete bw[bz]}}if(b.isEmptyObject(bw)){bK=bI.handle;if(bK){bK.elem=null}b.removeData(bJ,["events","handle"],true)}},customEvent:{getData:true,setData:true,changeData:true},trigger:function(bv,bD,bA,bJ){if(bA&&(bA.nodeType===3||bA.nodeType===8)){return}var bG=bv.type||bv,bx=[],e,bw,bC,bH,bz,by,bF,bE,bB,bI;if(T.test(bG+b.event.triggered)){return}if(bG.indexOf("!")>=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bC<bB.length&&!bv.isPropagationStopped();bC++){bH=bB[bC][0];bv.type=bB[bC][1];bE=(b._data(bH,"events")||{})[bv.type]&&b._data(bH,"handle");if(bE){bE.apply(bH,bD)}bE=by&&bH[by];if(bE&&b.acceptData(bH)&&bE.apply(bH,bD)===false){bv.preventDefault()}}bv.type=bG;if(!bJ&&!bv.isDefaultPrevented()){if((!bF._default||bF._default.apply(bA.ownerDocument,bD)===false)&&!(bG==="click"&&b.nodeName(bA,"a"))&&b.acceptData(bA)){if(by&&bA[bG]&&((bG!=="focus"&&bG!=="blur")||bv.target.offsetWidth!==0)&&!b.isWindow(bA)){bz=bA[by];if(bz){bA[by]=null}b.event.triggered=bG;bA[bG]();b.event.triggered=L;if(bz){bA[by]=bz}}}}return bv.result},dispatch:function(e){e=b.event.fix(e||bb.event);var bz=((b._data(this,"events")||{})[e.type]||[]),bA=bz.delegateCount,bG=[].slice.call(arguments,0),by=!e.exclusive&&!e.namespace,bH=[],bC,bB,bK,bx,bF,bE,bv,bD,bI,bw,bJ;bG[0]=e;e.delegateTarget=this;if(bA&&!e.target.disabled&&!(e.button&&e.type==="click")){bx=b(this);bx.context=this.ownerDocument||this;for(bK=e.target;bK!=this;bK=bK.parentNode||this){bE={};bD=[];bx[0]=bK;for(bC=0;bC<bA;bC++){bI=bz[bC];bw=bI.selector;if(bE[bw]===L){bE[bw]=(bI.quick?j(bK,bI.quick):bx.is(bw))}if(bE[bw]){bD.push(bI)}}if(bD.length){bH.push({elem:bK,matches:bD})}}}if(bz.length>bA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC<bH.length&&!e.isPropagationStopped();bC++){bv=bH[bC];e.currentTarget=bv.elem;for(bB=0;bB<bv.matches.length&&!e.isImmediatePropagationStopped();bB++){bI=bv.matches[bB];if(by||(!e.namespace&&!bI.namespace)||e.namespace_re&&e.namespace_re.test(bI.namespace)){e.data=bI.data;e.handleObj=bI;bF=((b.event.special[bI.origType]||{}).handle||bI.handler).apply(bv.elem,bG);if(bF!==L){e.result=bF;if(bF===false){e.preventDefault();e.stopPropagation()}}}}}return e.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(bv,e){if(bv.which==null){bv.which=e.charCode!=null?e.charCode:e.keyCode}return bv}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(bx,bw){var by,bz,e,bv=bw.button,bA=bw.fromElement;if(bx.pageX==null&&bw.clientX!=null){by=bx.target.ownerDocument||av;bz=by.documentElement;e=by.body;bx.pageX=bw.clientX+(bz&&bz.scrollLeft||e&&e.scrollLeft||0)-(bz&&bz.clientLeft||e&&e.clientLeft||0);bx.pageY=bw.clientY+(bz&&bz.scrollTop||e&&e.scrollTop||0)-(bz&&bz.clientTop||e&&e.clientTop||0)}if(!bx.relatedTarget&&bA){bx.relatedTarget=bA===bx.target?bw.toElement:bA}if(!bx.which&&bv!==L){bx.which=(bv&1?1:(bv&2?3:(bv&4?2:0)))}return bx}},fix:function(bw){if(bw[b.expando]){return bw}var bv,bz,e=bw,bx=b.event.fixHooks[bw.type]||{},by=bx.props?this.props.concat(bx.props):this.props;bw=b.Event(e);for(bv=by.length;bv;){bz=by[--bv];bw[bz]=e[bz]}if(!bw.target){bw.target=e.srcElement||av}if(bw.target.nodeType===3){bw.target=bw.target.parentNode}if(bw.metaKey===L){bw.metaKey=bw.ctrlKey}return bx.filter?bx.filter(bw,e):bw},special:{ready:{setup:b.bindReady},load:{noBubble:true},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(bw,bv,e){if(b.isWindow(this)){this.onbeforeunload=e}},teardown:function(bv,e){if(this.onbeforeunload===e){this.onbeforeunload=null}}}},simulate:function(bw,by,bx,bv){var bz=b.extend(new b.Event(),bx,{type:bw,isSimulated:true,originalEvent:{}});if(bv){b.event.trigger(bz,null,by)}else{b.event.dispatch.call(by,bz)}if(bz.isDefaultPrevented()){bx.preventDefault()}}};b.event.handle=b.event.dispatch;b.removeEvent=av.removeEventListener?function(bv,e,bw){if(bv.removeEventListener){bv.removeEventListener(e,bw,false)}}:function(bv,e,bw){if(bv.detachEvent){bv.detachEvent("on"+e,bw)}};b.Event=function(bv,e){if(!(this instanceof b.Event)){return new b.Event(bv,e)}if(bv&&bv.type){this.originalEvent=bv;this.type=bv.type;this.isDefaultPrevented=(bv.defaultPrevented||bv.returnValue===false||bv.getPreventDefault&&bv.getPreventDefault())?i:bk}else{this.type=bv}if(e){b.extend(this,e)}this.timeStamp=bv&&bv.timeStamp||b.now();this[b.expando]=true};function bk(){return false}function i(){return true}b.Event.prototype={preventDefault:function(){this.isDefaultPrevented=i;var bv=this.originalEvent;if(!bv){return}if(bv.preventDefault){bv.preventDefault()}else{bv.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=i;var bv=this.originalEvent;if(!bv){return}if(bv.stopPropagation){bv.stopPropagation()}bv.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=i;this.stopPropagation()},isDefaultPrevented:bk,isPropagationStopped:bk,isImmediatePropagationStopped:bk};b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(bv,e){b.event.special[bv]={delegateType:e,bindType:e,handle:function(bz){var bB=this,bA=bz.relatedTarget,by=bz.handleObj,bw=by.selector,bx;if(!bA||(bA!==bB&&!b.contains(bB,bA))){bz.type=by.origType;bx=by.handler.apply(this,arguments);bz.type=e}return bx}}});if(!b.support.submitBubbles){b.event.special.submit={setup:function(){if(b.nodeName(this,"form")){return false}b.event.add(this,"click._submit keypress._submit",function(bx){var bw=bx.target,bv=b.nodeName(bw,"input")||b.nodeName(bw,"button")?bw.form:L;if(bv&&!bv._submit_attached){b.event.add(bv,"submit._submit",function(e){if(this.parentNode&&!e.isTrigger){b.event.simulate("submit",this.parentNode,e,true)}});bv._submit_attached=true}})},teardown:function(){if(b.nodeName(this,"form")){return false}b.event.remove(this,"._submit")}}}if(!b.support.changeBubbles){b.event.special.change={setup:function(){if(bd.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio"){b.event.add(this,"propertychange._change",function(e){if(e.originalEvent.propertyName==="checked"){this._just_changed=true}});b.event.add(this,"click._change",function(e){if(this._just_changed&&!e.isTrigger){this._just_changed=false;b.event.simulate("change",this,e,true)}})}return false}b.event.add(this,"beforeactivate._change",function(bw){var bv=bw.target;if(bd.test(bv.nodeName)&&!bv._change_attached){b.event.add(bv,"change._change",function(e){if(this.parentNode&&!e.isSimulated&&!e.isTrigger){b.event.simulate("change",this.parentNode,e,true)}});bv._change_attached=true}})},handle:function(bv){var e=bv.target;if(this!==e||bv.isSimulated||bv.isTrigger||(e.type!=="radio"&&e.type!=="checkbox")){return bv.handleObj.handler.apply(this,arguments)}},teardown:function(){b.event.remove(this,"._change");return bd.test(this.nodeName)}}}if(!b.support.focusinBubbles){b.each({focus:"focusin",blur:"focusout"},function(bx,e){var bv=0,bw=function(by){b.event.simulate(e,by.target,b.event.fix(by),true)};b.event.special[e]={setup:function(){if(bv++===0){av.addEventListener(bx,bw,true)}},teardown:function(){if(--bv===0){av.removeEventListener(bx,bw,true)}}}})}b.fn.extend({on:function(bw,e,bz,by,bv){var bA,bx;if(typeof bw==="object"){if(typeof e!=="string"){bz=e;e=L}for(bx in bw){this.on(bx,e,bz,bw[bx],bv)}return this}if(bz==null&&by==null){by=e;bz=e=L}else{if(by==null){if(typeof e==="string"){by=bz;bz=L}else{by=bz;bz=e;e=L}}}if(by===false){by=bk}else{if(!by){return this}}if(bv===1){bA=by;by=function(bB){b().off(bB);return bA.apply(this,arguments)};by.guid=bA.guid||(bA.guid=b.guid++)}return this.each(function(){b.event.add(this,bw,by,bz,e)})},one:function(bv,e,bx,bw){return this.on.call(this,bv,e,bx,bw,1)},off:function(bw,e,by){if(bw&&bw.preventDefault&&bw.handleObj){var bv=bw.handleObj;b(bw.delegateTarget).off(bv.namespace?bv.type+"."+bv.namespace:bv.type,bv.selector,bv.handler);return this}if(typeof bw==="object"){for(var bx in bw){this.off(bx,e,bw[bx])}return this}if(e===false||typeof e==="function"){by=e;e=L}if(by===false){by=bk}return this.each(function(){b.event.remove(this,bw,by,e)})},bind:function(e,bw,bv){return this.on(e,null,bw,bv)},unbind:function(e,bv){return this.off(e,null,bv)},live:function(e,bw,bv){b(this.context).on(e,this.selector,bw,bv);return this},die:function(e,bv){b(this.context).off(e,this.selector||"**",bv);return this},delegate:function(e,bv,bx,bw){return this.on(bv,e,bx,bw)},undelegate:function(e,bv,bw){return arguments.length==1?this.off(e,"**"):this.off(bv,e,bw)},trigger:function(e,bv){return this.each(function(){b.event.trigger(e,bv,this)})},triggerHandler:function(e,bv){if(this[0]){return b.event.trigger(e,bv,this[0],true)}},toggle:function(bx){var bv=arguments,e=bx.guid||b.guid++,bw=0,by=function(bz){var bA=(b._data(this,"lastToggle"+bx.guid)||0)%bw;b._data(this,"lastToggle"+bx.guid,bA+1);bz.preventDefault();return bv[bA].apply(this,arguments)||false};by.guid=e;while(bw<bv.length){bv[bw++].guid=e}return this.click(by)},hover:function(e,bv){return this.mouseenter(e).mouseleave(bv||e)}});b.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(bv,e){b.fn[e]=function(bx,bw){if(bw==null){bw=bx;bx=null}return arguments.length>0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}});
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e<bR.length;e++){if(bR[e]===bR[e-1]){bR.splice(e--,1)}}}}return bR};by.matches=function(e,bR){return by(e,null,null,bR)};by.matchesSelector=function(e,bR){return by(bR,null,null,[e]).length>0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS<bU;bS++){bV=bE.order[bS];if((bT=bE.leftMatch[bV].exec(bX))){bR=bT[1];bT.splice(1,1);if(bR.substr(bR.length-1)!=="\\"){bT[1]=(bT[1]||"").replace(bK,"");bW=bE.find[bV](bT,e,bY);if(bW!=null){bX=bX.replace(bE.match[bV],"");break}}}}if(!bW){bW=typeof e.getElementsByTagName!=="undefined"?e.getElementsByTagName("*"):[]}return{set:bW,expr:bX}};by.filter=function(b1,b0,b4,bU){var bW,e,bZ,b6,b3,bR,bT,bV,b2,bS=b1,b5=[],bY=b0,bX=b0&&b0[0]&&by.isXML(b0[0]);while(b1&&b0.length){for(bZ in bE.filter){if((bW=bE.leftMatch[bZ].exec(b1))!=null&&bW[2]){bR=bE.filter[bZ];bT=bW[1];e=false;bW.splice(1,1);if(bT.substr(bT.length-1)==="\\"){continue}if(bY===b5){b5=[]}if(bE.preFilter[bZ]){bW=bE.preFilter[bZ](bW,bY,b4,b5,bU,bX);if(!bW){e=b6=true}else{if(bW===true){continue}}}if(bW){for(bV=0;(b3=bY[bV])!=null;bV++){if(b3){b6=bR(b3,bW,bV,bY);b2=bU^b6;if(b4&&b6!=null){if(b2){e=true}else{bY[bV]=false}}else{if(b2){b5.push(b3);e=true}}}}}if(b6!==L){if(!b4){bY=b5}b1=b1.replace(bE.match[bZ],"");if(!e){return[]}break}}}if(b1===bS){if(e==null){by.error(b1)}else{break}}bS=b1}return bY};by.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};var bw=by.getText=function(bU){var bS,bT,e=bU.nodeType,bR="";if(e){if(e===1||e===9){if(typeof bU.textContent==="string"){return bU.textContent}else{if(typeof bU.innerText==="string"){return bU.innerText.replace(bO,"")}else{for(bU=bU.firstChild;bU;bU=bU.nextSibling){bR+=bw(bU)}}}}else{if(e===3||e===4){return bU.nodeValue}}}else{for(bS=0;(bT=bU[bS]);bS++){if(bT.nodeType!==8){bR+=bw(bT)}}}return bR};var bE=by.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")},type:function(e){return e.getAttribute("type")}},relative:{"+":function(bW,bR){var bT=typeof bR==="string",bV=bT&&!bQ.test(bR),bX=bT&&!bV;if(bV){bR=bR.toLowerCase()}for(var bS=0,e=bW.length,bU;bS<e;bS++){if((bU=bW[bS])){while((bU=bU.previousSibling)&&bU.nodeType!==1){}bW[bS]=bX||bU&&bU.nodeName.toLowerCase()===bR?bU||false:bU===bR}}if(bX){by.filter(bR,bW,true)}},">":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS<e;bS++){bV=bW[bS];if(bV){var bT=bV.parentNode;bW[bS]=bT.nodeName.toLowerCase()===bR?bT:false}}}else{for(;bS<e;bS++){bV=bW[bS];if(bV){bW[bS]=bU?bV.parentNode:bV.parentNode===bR}}if(bU){by.filter(bR,bW,true)}}},"":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("parentNode",bR,bS,bT,bU,bV)},"~":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("previousSibling",bR,bS,bT,bU,bV)}},find:{ID:function(bR,bS,bT){if(typeof bS.getElementById!=="undefined"&&!bT){var e=bS.getElementById(bR[1]);return e&&e.parentNode?[e]:[]}},NAME:function(bS,bV){if(typeof bV.getElementsByName!=="undefined"){var bR=[],bU=bV.getElementsByName(bS[1]);for(var bT=0,e=bU.length;bT<e;bT++){if(bU[bT].getAttribute("name")===bS[1]){bR.push(bU[bT])}}return bR.length===0?null:bR}},TAG:function(e,bR){if(typeof bR.getElementsByTagName!=="undefined"){return bR.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(bT,bR,bS,e,bW,bX){bT=" "+bT[1].replace(bK,"")+" ";if(bX){return bT}for(var bU=0,bV;(bV=bR[bU])!=null;bU++){if(bV){if(bW^(bV.className&&(" "+bV.className+" ").replace(/[\t\n\r]/g," ").indexOf(bT)>=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bR<e[3]-0},gt:function(bS,bR,e){return bR>e[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV<bU;bV++){if(bT[bV]===bS){return false}}return true}else{by.error(e)}}}},CHILD:function(bS,bU){var bT,b0,bW,bZ,e,bV,bY,bX=bU[1],bR=bS;switch(bX){case"only":case"first":while((bR=bR.previousSibling)){if(bR.nodeType===1){return false}}if(bX==="first"){return true}bR=bS;case"last":while((bR=bR.nextSibling)){if(bR.nodeType===1){return false}}return true;case"nth":bT=bU[2];b0=bU[3];if(bT===1&&b0===0){return true}bW=bU[0];bZ=bS.parentNode;if(bZ&&(bZ[bC]!==bW||!bS.nodeIndex)){bV=0;for(bR=bZ.firstChild;bR;bR=bR.nextSibling){if(bR.nodeType===1){bR.nodeIndex=++bV}}bZ[bC]=bW}bY=bS.nodeIndex-b0;if(bT===0){return bY===0}else{return(bY%bT===0&&bY/bT>=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS<e;bS++){bR.push(bU[bS])}}else{for(;bU[bS];bS++){bR.push(bU[bS])}}}return bR}}var bJ,bG;if(av.documentElement.compareDocumentPosition){bJ=function(bR,e){if(bR===e){bB=true;return 0}if(!bR.compareDocumentPosition||!e.compareDocumentPosition){return bR.compareDocumentPosition?-1:1}return bR.compareDocumentPosition(e)&4?-1:1}}else{bJ=function(bY,bX){if(bY===bX){bB=true;return 0}else{if(bY.sourceIndex&&bX.sourceIndex){return bY.sourceIndex-bX.sourceIndex}}var bV,bR,bS=[],e=[],bU=bY.parentNode,bW=bX.parentNode,bZ=bU;if(bU===bW){return bG(bY,bX)}else{if(!bU){return -1}else{if(!bW){return 1}}}while(bZ){bS.unshift(bZ);bZ=bZ.parentNode}bZ=bW;while(bZ){e.unshift(bZ);bZ=bZ.parentNode}bV=bS.length;bR=e.length;for(var bT=0;bT<bV&&bT<bR;bT++){if(bS[bT]!==e[bT]){return bG(bS[bT],e[bT])}}return bT===bV?bG(bY,e[bT],-1):bG(bS[bT],bX,1)};bG=function(bR,e,bS){if(bR===e){return bS}var bT=bR.nextSibling;while(bT){if(bT===e){return -1}bT=bT.nextSibling}return 1}}(function(){var bR=av.createElement("div"),bS="script"+(new Date()).getTime(),e=av.documentElement;bR.innerHTML="<a name='"+bS+"'/>";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="<p class='TEST'></p>";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1&&!bY){e[bC]=bV;e.sizset=bT}if(e.nodeName.toLowerCase()===bW){bU=e;break}e=e[bR]}bZ[bT]=bU}}}function bN(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1){if(!bY){e[bC]=bV;e.sizset=bT}if(typeof bW!=="string"){if(e===bW){bU=true;break}}else{if(by.filter(bW,[e]).length>0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT<bR;bT++){by(bS,bY[bT],bX,bW)}return by.filter(bU,bX)};by.attr=b.attr;by.selectors.attrMap={};b.find=by;b.expr=by.selectors;b.expr[":"]=b.expr.filters;b.unique=by.uniqueSort;b.text=by.getText;b.isXMLDoc=by.isXML;b.contains=by.contains})();var ab=/Until$/,aq=/^(?:parents|prevUntil|prevAll)/,a9=/,/,bp=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,H=b.expr.match.POS,ay={children:true,contents:true,next:true,prev:true};b.fn.extend({find:function(e){var bw=this,by,bv;if(typeof e!=="string"){return b(e).filter(function(){for(by=0,bv=bw.length;by<bv;by++){if(b.contains(bw[by],this)){return true}}})}var bx=this.pushStack("","find",e),bA,bB,bz;for(by=0,bv=this.length;by<bv;by++){bA=bx.length;b.find(e,this[by],bx);if(by>0){for(bB=bA;bB<bx.length;bB++){for(bz=0;bz<bA;bz++){if(bx[bz]===bx[bB]){bx.splice(bB--,1);break}}}}}return bx},has:function(bv){var e=b(bv);return this.filter(function(){for(var bx=0,bw=e.length;bx<bw;bx++){if(b.contains(this,e[bx])){return true}}})},not:function(e){return this.pushStack(aG(this,e,false),"not",e)},filter:function(e){return this.pushStack(aG(this,e,true),"filter",e)},is:function(e){return !!e&&(typeof e==="string"?H.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw<by.length;bw++){if(b(bz).is(by[bw])){bv.push({selector:by[bw],elem:bz,level:bB})}}bz=bz.parentNode;bB++}return bv}var bA=H.test(by)||typeof by!=="string"?b(by,bx||this.context):0;for(bw=0,e=this.length;bw<e;bw++){bz=this[bw];while(bz){if(bA?bA.index(bz)>-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/<tbody/i,W=/<|&#?\w+;/,ae=/<(?:script|style)/i,O=/<(?:script|object|embed|option|style)/i,ah=new RegExp("<(?:"+aR+")","i"),o=/checked\s*(?:[^=]|=\s*.checked.)/i,bm=/\/(java|ecma)script/i,aN=/^\s*<!(?:\[CDATA\[|\-\-)/,ax={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div<div>","</div>"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1></$2>");try{for(var bw=0,bv=this.length;bw<bv;bw++){if(this[bw].nodeType===1){b.cleanData(this[bw].getElementsByTagName("*"));this[bw].innerHTML=bx}}}catch(by){this.empty().append(bx)}}else{if(b.isFunction(bx)){this.each(function(bz){var e=b(this);e.html(bx.call(this,bz,e.html()))})}else{this.empty().append(bx)}}}return this},replaceWith:function(e){if(this[0]&&this[0].parentNode){if(b.isFunction(e)){return this.each(function(bx){var bw=b(this),bv=bw.html();bw.replaceWith(e.call(this,bx,bv))})}if(typeof e!=="string"){e=b(e).detach()}return this.each(function(){var bw=this.nextSibling,bv=this.parentNode;b(this).remove();if(bw){b(bw).before(e)}else{b(bv).append(e)}})}else{return this.length?this.pushStack(b(b.isFunction(e)?e():e),"replaceWith",e):this}},detach:function(e){return this.remove(e,true)},domManip:function(bB,bF,bE){var bx,by,bA,bD,bC=bB[0],bv=[];if(!b.support.checkClone&&arguments.length===3&&typeof bC==="string"&&o.test(bC)){return this.each(function(){b(this).domManip(bB,bF,bE,true)})}if(b.isFunction(bC)){return this.each(function(bH){var bG=b(this);bB[0]=bC.call(this,bH,bF?bG.html():L);bG.domManip(bB,bF,bE)})}if(this[0]){bD=bC&&bC.parentNode;if(b.support.parentNode&&bD&&bD.nodeType===11&&bD.childNodes.length===this.length){bx={fragment:bD}}else{bx=b.buildFragment(bB,this,bv)}bA=bx.fragment;if(bA.childNodes.length===1){by=bA=bA.firstChild}else{by=bA.firstChild}if(by){bF=bF&&b.nodeName(by,"tr");for(var bw=0,e=this.length,bz=e-1;bw<e;bw++){bE.call(bF?ba(this[bw],by):this[bw],bx.cacheable||(e>1&&bw<bz)?b.clone(bA,true,true):bA)}}if(bv.length){b.each(bv,bo)}}return this}});function ba(e,bv){return b.nodeName(e,"table")?(e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody"))):e}function t(bB,bv){if(bv.nodeType!==1||!b.hasData(bB)){return}var by,bx,e,bA=b._data(bB),bz=b._data(bv,bA),bw=bA.events;if(bw){delete bz.handle;bz.events={};for(by in bw){for(bx=0,e=bw[by].length;bx<e;bx++){b.event.add(bv,by+(bw[by][bx].namespace?".":"")+bw[by][bx].namespace,bw[by][bx],bw[by][bx].data)}}}if(bz.data){bz.data=b.extend({},bz.data)}}function ai(bv,e){var bw;if(e.nodeType!==1){return}if(e.clearAttributes){e.clearAttributes()}if(e.mergeAttributes){e.mergeAttributes(bv)}bw=e.nodeName.toLowerCase();if(bw==="object"){e.outerHTML=bv.outerHTML}else{if(bw==="input"&&(bv.type==="checkbox"||bv.type==="radio")){if(bv.checked){e.defaultChecked=e.checked=bv.checked}if(e.value!==bv.value){e.value=bv.value}}else{if(bw==="option"){e.selected=bv.defaultSelected}else{if(bw==="input"||bw==="textarea"){e.defaultValue=bv.defaultValue}}}}e.removeAttribute(b.expando)}b.buildFragment=function(bz,bx,bv){var by,e,bw,bA,bB=bz[0];if(bx&&bx[0]){bA=bx[0].ownerDocument||bx[0]}if(!bA.createDocumentFragment){bA=av}if(bz.length===1&&typeof bB==="string"&&bB.length<512&&bA===av&&bB.charAt(0)==="<"&&!O.test(bB)&&(b.support.checkClone||!o.test(bB))&&(b.support.html5Clone||!ah.test(bB))){e=true;bw=b.fragments[bB];if(bw&&bw!==1){by=bw}}if(!by){by=bA.createDocumentFragment();b.clean(bz,bA,by,bv)}if(e){b.fragments[bB]=bw?by:1}return{fragment:by,cacheable:e}};b.fragments={};b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,bv){b.fn[e]=function(bw){var bz=[],bC=b(bw),bB=this.length===1&&this[0].parentNode;if(bB&&bB.nodeType===11&&bB.childNodes.length===1&&bC.length===1){bC[bv](this[0]);return this}else{for(var bA=0,bx=bC.length;bA<bx;bA++){var by=(bA>0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1></$2>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]==="<table>"&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB<bG;bB++){E(bz[bB])}}else{E(bz)}}if(bz.nodeType){bI.push(bz)}else{bI=b.merge(bI,bz)}}if(bH){bF=function(bL){return !bL.type||bm.test(bL.type)};for(bE=0;bI[bE];bE++){if(bA&&b.nodeName(bI[bE],"script")&&(!bI[bE].type||bI[bE].type.toLowerCase()==="text/javascript")){bA.push(bI[bE].parentNode?bI[bE].parentNode.removeChild(bI[bE]):bI[bE])}else{if(bI[bE].nodeType===1){var bJ=b.grep(bI[bE].getElementsByTagName("script"),bF);bI.splice.apply(bI,[bE+1,0].concat(bJ))}bH.appendChild(bI[bE])}}}return bI},cleanData:function(bv){var by,bw,e=b.cache,bB=b.event.special,bA=b.support.deleteExpando;for(var bz=0,bx;(bx=bv[bz])!=null;bz++){if(bx.nodeName&&b.noData[bx.nodeName.toLowerCase()]){continue}bw=bx[b.expando];if(bw){by=e[bw];if(by&&by.events){for(var bC in by.events){if(bB[bC]){b.event.remove(bx,bC)}else{b.removeEvent(bx,bC,by.handle)}}if(by.handle){by.handle.elem=null}}if(bA){delete bx[b.expando]}else{if(bx.removeAttribute){bx.removeAttribute(b.expando)}}delete e[bw]}}}});function bo(e,bv){if(bv.src){b.ajax({url:bv.src,async:false,dataType:"script"})}else{b.globalEval((bv.text||bv.textContent||bv.innerHTML||"").replace(aN,"/*$0*/"))}if(bv.parentNode){bv.parentNode.removeChild(bv)}}var ak=/alpha\([^)]*\)/i,au=/opacity=([^)]*)/,z=/([A-Z]|^ms)/g,bc=/^-?\d+(?:px)?$/i,bn=/^-?\d/,I=/^([\-+])=([\-+.\de]+)/,a7={position:"absolute",visibility:"hidden",display:"block"},an=["Left","Right"],a1=["Top","Bottom"],Z,aI,aX;b.fn.css=function(e,bv){if(arguments.length===2&&bv===L){return this}return b.access(this,e,bv,true,function(bx,bw,by){return by!==L?b.style(bx,bw,by):b.css(bx,bw)})};b.extend({cssHooks:{opacity:{get:function(bw,bv){if(bv){var e=Z(bw,"opacity","opacity");return e===""?"1":e}else{return bw.style.opacity}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(bx,bw,bD,by){if(!bx||bx.nodeType===3||bx.nodeType===8||!bx.style){return}var bB,bC,bz=b.camelCase(bw),bv=bx.style,bE=b.cssHooks[bz];bw=b.cssProps[bz]||bz;if(bD!==L){bC=typeof bD;if(bC==="string"&&(bB=I.exec(bD))){bD=(+(bB[1]+1)*+bB[2])+parseFloat(b.css(bx,bw));bC="number"}if(bD==null||bC==="number"&&isNaN(bD)){return}if(bC==="number"&&!b.cssNumber[bz]){bD+="px"}if(!bE||!("set" in bE)||(bD=bE.set(bx,bD))!==L){try{bv[bw]=bD}catch(bA){}}}else{if(bE&&"get" in bE&&(bB=bE.get(bx,false,by))!==L){return bB}return bv[bw]}},css:function(by,bx,bv){var bw,e;bx=b.camelCase(bx);e=b.cssHooks[bx];bx=b.cssProps[bx]||bx;if(bx==="cssFloat"){bx="float"}if(e&&"get" in e&&(bw=e.get(by,true,bv))!==L){return bw}else{if(Z){return Z(by,bx)}}},swap:function(bx,bw,by){var e={};for(var bv in bw){e[bv]=bx.style[bv];bx.style[bv]=bw[bv]}by.call(bx);for(bv in bw){bx.style[bv]=e[bv]}}});b.curCSS=b.css;b.each(["height","width"],function(bv,e){b.cssHooks[e]={get:function(by,bx,bw){var bz;if(bx){if(by.offsetWidth!==0){return p(by,e,bw)}else{b.swap(by,a7,function(){bz=p(by,e,bw)})}return bz}},set:function(bw,bx){if(bc.test(bx)){bx=parseFloat(bx);if(bx>=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx<e;bx++){if(!bv){bA-=parseFloat(b.css(by,"padding"+bz[bx]))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}else{bA-=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}}}return bA+"px"}bA=Z(by,bw,bw);if(bA<0||bA==null){bA=by.style[bw]||0}bA=parseFloat(bA)||0;if(bv){for(;bx<e;bx++){bA+=parseFloat(b.css(by,"padding"+bz[bx]))||0;if(bv!=="padding"){bA+=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}}}return bA+"px"}if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,"display"))==="none")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}var k=/%20/g,ap=/\[\]$/,bs=/\r?\n/g,bq=/#.*$/,aD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,aZ=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aM=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,aQ=/^(?:GET|HEAD)$/,c=/^\/\//,M=/\?/,a6=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw<bz;bw++){bv=bx[bw];bC=/^\+/.test(bv);if(bC){bv=bv.substr(1)||"*"}bB=e[bv]=e[bv]||[];bB[bC?"unshift":"push"](bA)}}}}function aW(bv,bE,bz,bD,bB,bx){bB=bB||bE.dataTypes[0];bx=bx||{};bx[bB]=true;var bA=bv[bB],bw=0,e=bA?bA.length:0,by=(bv===aa),bC;for(;bw<e&&(by||!bC);bw++){bC=bA[bw](bE,bz,bD);if(typeof bC==="string"){if(!by||bx[bC]){bC=L}else{bE.dataTypes.unshift(bC);bC=aW(bv,bE,bz,bD,bC,bx)}}}if((by||!bC)&&!bx["*"]){bC=aW(bv,bE,bz,bD,"*",bx)}return bC}function am(bw,bx){var bv,e,by=b.ajaxSettings.flatOptions||{};for(bv in bx){if(bx[bv]!==L){(by[bv]?bw:(e||(e={})))[bv]=bx[bv]}}if(e){b.extend(true,bw,e)}}b.fn.extend({load:function(bw,bz,bA){if(typeof bw!=="string"&&A){return A.apply(this,arguments)}else{if(!this.length){return this}}var by=bw.indexOf(" ");if(by>=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("<div>").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA<bw;bA++){if(bA===1){for(bE in bH.converters){if(typeof bE==="string"){bG[bE.toLowerCase()]=bH.converters[bE]}}}bx=bC;bC=bD[bA];if(bC==="*"){bC=bx}else{if(bx!=="*"&&bx!==bC){by=bx+" "+bC;bF=bG[by]||bG["* "+bC];if(!bF){e=L;for(bv in bG){bB=bv.split(" ");if(bB[0]===bx||bB[0]==="*"){e=bG[bB[1]+" "+bC];if(e){bv=bG[bv];if(bv===true){bF=e}else{if(e===true){bF=bv}}break}}}}if(!(bF||e)){b.error("No conversion from "+by.replace(" "," to "))}if(bF!==true){bz=bF?bF(bz):e(bv(bz))}}}}return bz}var aC=b.now(),u=/(\=)\?(&|$)|\?\?/i;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return b.expando+"_"+(aC++)}});b.ajaxPrefilter("json jsonp",function(bD,bA,bC){var bx=bD.contentType==="application/x-www-form-urlencoded"&&(typeof bD.data==="string");if(bD.dataTypes[0]==="jsonp"||bD.jsonp!==false&&(u.test(bD.url)||bx&&u.test(bD.data))){var bB,bw=bD.jsonpCallback=b.isFunction(bD.jsonpCallback)?bD.jsonpCallback():bD.jsonpCallback,bz=bb[bw],e=bD.url,by=bD.data,bv="$1"+bw+"$2";if(bD.jsonp!==false){e=e.replace(u,bv);if(bD.url===e){if(bx){by=by.replace(u,bv)}if(bD.data===by){e+=(/\?/.test(e)?"&":"?")+bD.jsonp+"="+bw}}}bD.url=e;bD.data=by;bb[bw]=function(bE){bB=[bE]};bC.always(function(){bb[bw]=bz;if(bB&&b.isFunction(bz)){bb[bw](bB[0])}});bD.converters["script json"]=function(){if(!bB){b.error(bw+" was not called")}return bB[0]};bD.dataTypes[0]="json";return"script"}});b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){b.globalEval(e);return e}}});b.ajaxPrefilter("script",function(e){if(e.cache===L){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});b.ajaxTransport("script",function(bw){if(bw.crossDomain){var e,bv=av.head||av.getElementsByTagName("head")[0]||av.documentElement;return{send:function(bx,by){e=av.createElement("script");e.async="async";if(bw.scriptCharset){e.charset=bw.scriptCharset}e.src=bw.url;e.onload=e.onreadystatechange=function(bA,bz){if(bz||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bv&&e.parentNode){bv.removeChild(e)}e=L;if(!bz){by(200,"success")}}};bv.insertBefore(e,bv.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var B=bb.ActiveXObject?function(){for(var e in N){N[e](0,1)}}:false,y=0,N;function aL(){try{return new bb.XMLHttpRequest()}catch(bv){}}function aj(){try{return new bb.ActiveXObject("Microsoft.XMLHTTP")}catch(bv){}}b.ajaxSettings.xhr=bb.ActiveXObject?function(){return !this.isLocal&&aL()||aj()}:aL;(function(e){b.extend(b.support,{ajax:!!e,cors:!!e&&("withCredentials" in e)})})(b.ajaxSettings.xhr());if(b.support.ajax){b.ajaxTransport(function(e){if(!e.crossDomain||b.support.cors){var bv;return{send:function(bB,bw){var bA=e.xhr(),bz,by;if(e.username){bA.open(e.type,e.url,e.async,e.username,e.password)}else{bA.open(e.type,e.url,e.async)}if(e.xhrFields){for(by in e.xhrFields){bA[by]=e.xhrFields[by]}}if(e.mimeType&&bA.overrideMimeType){bA.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!bB["X-Requested-With"]){bB["X-Requested-With"]="XMLHttpRequest"}try{for(by in bB){bA.setRequestHeader(by,bB[by])}}catch(bx){}bA.send((e.hasContent&&e.data)||null);bv=function(bK,bE){var bF,bD,bC,bI,bH;try{if(bv&&(bE||bA.readyState===4)){bv=L;if(bz){bA.onreadystatechange=b.noop;if(B){delete N[bz]}}if(bE){if(bA.readyState!==4){bA.abort()}}else{bF=bA.status;bC=bA.getAllResponseHeaders();bI={};bH=bA.responseXML;if(bH&&bH.documentElement){bI.xml=bH}bI.text=bA.responseText;try{bD=bA.statusText}catch(bJ){bD=""}if(!bF&&e.isLocal&&!e.crossDomain){bF=bI.text?200:404}else{if(bF===1223){bF=204}}}}}catch(bG){if(!bE){bw(-1,bG)}}if(bI){bw(bF,bD,bI,bC)}};if(!e.async||bA.readyState===4){bv()}else{bz=++y;if(B){if(!N){N={};b(bb).unload(B)}N[bz]=bv}bA.onreadystatechange=bv}},abort:function(){if(bv){bv(0,1)}}}}})}var Q={},a8,m,aB=/^(?:toggle|show|hide)$/,aT=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,a3,aH=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],a4;b.fn.extend({show:function(bx,bA,bz){var bw,by;if(bx||bx===0){return this.animate(a0("show",3),bx,bA,bz)}else{for(var bv=0,e=this.length;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(!b._data(bw,"olddisplay")&&by==="none"){by=bw.style.display=""}if(by===""&&b.css(bw,"display")==="none"){b._data(bw,"olddisplay",x(bw.nodeName))}}}for(bv=0;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(by===""||by==="none"){bw.style.display=b._data(bw,"olddisplay")||""}}}return this}},hide:function(bx,bA,bz){if(bx||bx===0){return this.animate(a0("hide",3),bx,bA,bz)}else{var bw,by,bv=0,e=this.length;for(;bv<e;bv++){bw=this[bv];if(bw.style){by=b.css(bw,"display");if(by!=="none"&&!b._data(bw,"olddisplay")){b._data(bw,"olddisplay",by)}}}for(bv=0;bv<e;bv++){if(this[bv].style){this[bv].style.display="none"}}return this}},_toggle:b.fn.toggle,toggle:function(bw,bv,bx){var e=typeof bw==="boolean";if(b.isFunction(bw)&&b.isFunction(bv)){this._toggle.apply(this,arguments)}else{if(bw==null||e){this.each(function(){var by=e?bw:b(this).is(":hidden");b(this)[by?"show":"hide"]()})}else{this.animate(a0("toggle",3),bw,bv,bx)}}return this},fadeTo:function(e,bx,bw,bv){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:bx},e,bw,bv)},animate:function(bz,bw,by,bx){var e=b.speed(bw,by,bx);if(b.isEmptyObject(bz)){return this.each(e.complete,[false])}bz=b.extend({},bz);function bv(){if(e.queue===false){b._mark(this)}var bE=b.extend({},e),bK=this.nodeType===1,bI=bK&&b(this).is(":hidden"),bB,bF,bD,bJ,bH,bC,bG,bL,bA;bE.animatedProperties={};for(bD in bz){bB=b.camelCase(bD);if(bD!==bB){bz[bB]=bz[bD];delete bz[bD]}bF=bz[bB];if(b.isArray(bF)){bE.animatedProperties[bB]=bF[1];bF=bz[bB]=bF[0]}else{bE.animatedProperties[bB]=bE.specialEasing&&bE.specialEasing[bB]||bE.easing||"swing"}if(bF==="hide"&&bI||bF==="show"&&!bI){return bE.complete.call(this)}if(bK&&(bB==="height"||bB==="width")){bE.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(b.css(this,"display")==="inline"&&b.css(this,"float")==="none"){if(!b.support.inlineBlockNeedsLayout||x(this.nodeName)==="inline"){this.style.display="inline-block"}else{this.style.zoom=1}}}}if(bE.overflow!=null){this.style.overflow="hidden"}for(bD in bz){bJ=new b.fx(this,bE,bD);bF=bz[bD];if(aB.test(bF)){bA=b._data(this,"toggle"+bD)||(bF==="toggle"?bI?"show":"hide":0);if(bA){b._data(this,"toggle"+bD,bA==="show"?"hide":"show");bJ[bA]()}else{bJ[bF]()}}else{bH=aT.exec(bF);bC=bJ.cur();if(bH){bG=parseFloat(bH[2]);bL=bH[3]||(b.cssNumber[bD]?"":"px");if(bL!=="px"){b.style(this,bD,(bG||1)+bL);bC=((bG||1)/bJ.cur())*bC;b.style(this,bD,bC+bL)}if(bH[1]){bG=((bH[1]==="-="?-1:1)*bG)+bC}bJ.custom(bC,bG,bL)}else{bJ.custom(bC,bF,"")}}}return true}return e.queue===false?this.each(bv):this.queue(e.queue,bv)},stop:function(bw,bv,e){if(typeof bw!=="string"){e=bv;bv=bw;bw=L}if(bv&&bw!==false){this.queue(bw||"fx",[])}return this.each(function(){var bx,by=false,bA=b.timers,bz=b._data(this);if(!e){b._unmark(true,this)}function bB(bE,bF,bD){var bC=bF[bD];b.removeData(bE,bD,true);bC.stop(e)}if(bw==null){for(bx in bz){if(bz[bx]&&bz[bx].stop&&bx.indexOf(".run")===bx.length-4){bB(this,bz,bx)}}}else{if(bz[bx=bw+".run"]&&bz[bx].stop){bB(this,bz,bx)}}for(bx=bA.length;bx--;){if(bA[bx].elem===this&&(bw==null||bA[bx].queue===bw)){if(e){bA[bx](true)}else{bA[bx].saveState()}by=true;bA.splice(bx,1)}}if(!(e&&by)){b.dequeue(this,bw)}})}});function bh(){setTimeout(at,0);return(a4=b.now())}function at(){a4=L}function a0(bv,e){var bw={};b.each(aH.concat.apply([],aH.slice(0,e)),function(){bw[this]=bv});return bw}b.each({slideDown:a0("show",1),slideUp:a0("hide",1),slideToggle:a0("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,bv){b.fn[e]=function(bw,by,bx){return this.animate(bv,bw,by,bx)}});b.extend({speed:function(bw,bx,bv){var e=bw&&typeof bw==="object"?b.extend({},bw):{complete:bv||!bv&&bx||b.isFunction(bw)&&bw,duration:bw,easing:bv&&bx||bx&&!b.isFunction(bx)&&bx};e.duration=b.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in b.fx.speeds?b.fx.speeds[e.duration]:b.fx.speeds._default;if(e.queue==null||e.queue===true){e.queue="fx"}e.old=e.complete;e.complete=function(by){if(b.isFunction(e.old)){e.old.call(this)}if(e.queue){b.dequeue(this,e.queue)}else{if(by!==false){b._unmark(this)}}};return e},easing:{linear:function(bw,bx,e,bv){return e+bv*bw},swing:function(bw,bx,e,bv){return((-Math.cos(bw*Math.PI)/2)+0.5)*bv+e}},timers:[],fx:function(bv,e,bw){this.options=e;this.elem=bv;this.prop=bw;e.orig=e.orig||{}}});b.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(b.fx.step[this.prop]||b.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bv=b.css(this.elem,this.prop);return isNaN(e=parseFloat(bv))?!bv||bv==="auto"?0:bv:e},custom:function(bz,by,bx){var e=this,bw=b.fx;this.startTime=a4||bh();this.end=by;this.now=this.start=bz;this.pos=this.state=0;this.unit=bx||this.unit||(b.cssNumber[this.prop]?"":"px");function bv(bA){return e.step(bA)}bv.queue=this.options.queue;bv.elem=this.elem;bv.saveState=function(){if(e.options.hide&&b._data(e.elem,"fxshow"+e.prop)===L){b._data(e.elem,"fxshow"+e.prop,e.start)}};if(bv()&&b.timers.push(bv)&&!a3){a3=setInterval(bw.tick,bw.interval)}},show:function(){var e=b._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=e||b.style(this.elem,this.prop);this.options.show=true;if(e!==L){this.custom(this.cur(),e)}else{this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur())}b(this.elem).show()},hide:function(){this.options.orig[this.prop]=b._data(this.elem,"fxshow"+this.prop)||b.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(by){var bA,bB,bv,bx=a4||bh(),e=true,bz=this.elem,bw=this.options;if(by||bx>=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e<bv.length;e++){bw=bv[e];if(!bw()&&bv[e]===bw){bv.splice(e--,1)}}if(!bv.length){b.fx.stop()}},interval:13,stop:function(){clearInterval(a3);a3=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){b.style(e.elem,"opacity",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=e.now+e.unit}else{e.elem[e.prop]=e.now}}}});b.each(["width","height"],function(e,bv){b.fx.step[bv]=function(bw){b.style(bw.elem,bv,Math.max(0,bw.now)+bw.unit)}});if(b.expr&&b.expr.filters){b.expr.filters.animated=function(e){return b.grep(b.timers,function(bv){return e===bv.elem}).length}}function x(bx){if(!Q[bx]){var e=av.body,bv=b("<"+bx+">").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*!
+ * jQuery UI 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h<j.length;h++){if(e.options[j[h][0]]){j[h][1].apply(e.element,f)}}}},contains:function(f,e){return document.compareDocumentPosition?f.compareDocumentPosition(e)&16:f!==e&&f.contains(e)},hasScroll:function(h,f){if(a(h).css("overflow")==="hidden"){return false}var e=(f&&f==="left")?"scrollLeft":"scrollTop",g=false;if(h[e]>0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*!
+ * jQuery UI Widget 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*!
+ * jQuery UI Mouse 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ *	jquery.ui.widget.js
+ */
+(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g<l.length;g++){var j=c.trim(l[g]),e="ui-resizable-"+j;var h=c('<div class="ui-resizable-handle '+e+'"></div>');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(h<e.maxWidth){e.maxWidth=h}if(k<e.maxHeight){e.maxHeight=k}}this._vBoundaries=e},_updateCache:function(e){var f=this.options;this.offset=this.helper.offset();if(a(e.left)){this.position.left=e.left}if(a(e.top)){this.position.top=e.top}if(a(e.height)){this.size.height=e.height}if(a(e.width)){this.size.width=e.width}},_updateRatio:function(h,g){var i=this.options,j=this.position,f=this.size,e=this.axis;if(a(h.height)){h.width=(h.height*this.aspectRatio)}else{if(a(h.width)){h.height=(h.width/this.aspectRatio)}}if(e=="sw"){h.left=j.left+(f.width-h.width);h.top=null}if(e=="nw"){h.top=j.top+(f.height-h.height);h.left=j.left+(f.width-h.width)}return h},_respectSize:function(l,g){var j=this.helper,i=this._vBoundaries,r=this._aspectRatio||g.shiftKey,q=this.axis,t=a(l.width)&&i.maxWidth&&(i.maxWidth<l.width),m=a(l.height)&&i.maxHeight&&(i.maxHeight<l.height),h=a(l.width)&&i.minWidth&&(i.minWidth>l.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f<this._proportionallyResizeElements.length;f++){var h=this._proportionallyResizeElements[f];if(!this.borderDif){var e=[h.css("borderTopWidth"),h.css("borderRightWidth"),h.css("borderBottomWidth"),h.css("borderLeftWidth")],j=[h.css("paddingTop"),h.css("paddingRight"),h.css("paddingBottom"),h.css("paddingLeft")];this.borderDif=c.map(e,function(l,n){var m=parseInt(l,10)||0,o=parseInt(j[n],10)||0;return m+o})}if(c.browser.msie&&!(!(c(g).is(":hidden")||c(g).parents(":hidden").length))){continue}h.css({height:(g.height()-this.borderDif[0]-this.borderDif[2])||0,width:(g.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var f=this.element,i=this.options;this.elementOffset=f.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*!
+ * jQuery hashchange event - v1.3 - 7/21/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);(function(c){var a=c.scrollTo=function(f,e,d){c(window).scrollTo(f,e,d)};a.defaults={axis:"xy",duration:parseFloat(c.fn.jquery)>=1.3?0:1};a.window=function(d){return c(window)._scrollable()};c.fn._scrollable=function(){return this.map(function(){var e=this,d=!e.nodeName||c.inArray(e.nodeName.toLowerCase(),["iframe","#document","html","body"])!=-1;if(!d){return e}var f=(e.contentWindow||e).document||e.ownerDocument||e;return c.browser.safari||f.compatMode=="BackCompat"?f.body:f.documentElement})};c.fn.scrollTo=function(f,e,d){if(typeof e=="object"){d=e;e=0}if(typeof d=="function"){d={onAfter:d}}if(f=="max"){f=9000000000}d=c.extend({},a.defaults,d);e=e||d.speed||d.duration;d.queue=d.queue&&d.axis.length>1;if(d.queue){e/=2}d.offset=b(d.offset);d.over=b(d.over);return this._scrollable().each(function(){var l=this,j=c(l),k=f,i,g={},m=j.is("html,body");switch(typeof k){case"number":case"string":if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(k)){k=b(k);break}k=c(k,this);case"object":if(k.is||k.style){i=(k=c(k)).offset()}}c.each(d.axis.split(""),function(q,r){var s=r=="x"?"Left":"Top",u=s.toLowerCase(),p="scroll"+s,o=l[p],n=a.max(l,r);if(i){g[p]=i[u]+(m?0:o-j.offset()[u]);if(d.margin){g[p]-=parseInt(k.css("margin"+s))||0;g[p]-=parseInt(k.css("border"+s+"Width"))||0}g[p]+=d.offset[u]||0;if(d.over[u]){g[p]+=k[r=="x"?"width":"height"]()*d.over[u]}}else{var t=k[u];g[p]=t.slice&&t.slice(-1)=="%"?parseFloat(t)/100*n:t}if(/^\d+$/.test(g[p])){g[p]=g[p]<=0?0:Math.min(g[p],n)}if(!q&&d.queue){if(o!=g[p]){h(d.onAfterFirst)}delete g[p]}});h(d.onAfter);function h(n){j.animate(g,e,d.easing,n&&function(){n.call(this,f,d)})}}).end()};a.max=function(j,i){var h=i=="x"?"Width":"Height",e="scroll"+h;if(!c(j).is("html,body")){return j[e]-c(j)[h.toLowerCase()]()}var g="client"+h,f=j.ownerDocument.documentElement,d=j.ownerDocument.body;return Math.max(f[e],d[e])-Math.min(f[g],d[g])};function b(d){return typeof d=="object"?d:{top:d,left:d}}})(jQuery);/*!
+ PowerTip - v1.2.0 - 2013-04-03
+ http://stevenbenner.github.com/jquery-powertip/
+ Copyright (c) 2013 Steven Benner (http://stevenbenner.com/).
+ Released under MIT license.
+ https://raw.github.com/stevenbenner/jquery-powertip/master/LICENSE.txt
+*/
+(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{a(jQuery)}}(function(k){var A=k(document),s=k(window),w=k("body");var n="displayController",e="hasActiveHover",d="forcedOpen",u="hasMouseMove",f="mouseOnToPopup",g="originalTitle",y="powertip",o="powertipjq",l="powertiptarget",E=180/Math.PI;var c={isTipOpen:false,isFixedTipOpen:false,isClosing:false,tipOpenImminent:false,activeHover:null,currentX:0,currentY:0,previousX:0,previousY:0,desyncTimeout:null,mouseTrackingActive:false,delayInProgress:false,windowWidth:0,windowHeight:0,scrollTop:0,scrollLeft:0};var p={none:0,top:1,bottom:2,left:4,right:8};k.fn.powerTip=function(F,N){if(!this.length){return this}if(k.type(F)==="string"&&k.powerTip[F]){return k.powerTip[F].call(this,this,N)}var O=k.extend({},k.fn.powerTip.defaults,F),G=new x(O);h();this.each(function M(){var R=k(this),Q=R.data(y),P=R.data(o),T=R.data(l),S;if(R.data(n)){k.powerTip.destroy(R)}S=R.attr("title");if(!Q&&!T&&!P&&S){R.data(y,S);R.data(g,S);R.removeAttr("title")}R.data(n,new t(R,O,G))});if(!O.manual){this.on({"mouseenter.powertip":function J(P){k.powerTip.show(this,P)},"mouseleave.powertip":function L(){k.powerTip.hide(this)},"focus.powertip":function K(){k.powerTip.show(this)},"blur.powertip":function H(){k.powerTip.hide(this,true)},"keydown.powertip":function I(P){if(P.keyCode===27){k.powerTip.hide(this,true)}}})}return this};k.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false};k.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};k.powerTip={show:function z(F,G){if(G){i(G);c.previousX=G.pageX;c.previousY=G.pageY;k(F).data(n).show()}else{k(F).first().data(n).show(true,true)}return F},reposition:function r(F){k(F).first().data(n).resetPosition();return F},hide:function D(G,F){if(G){k(G).first().data(n).hide(F)}else{if(c.activeHover){c.activeHover.data(n).hide(true)}}return G},destroy:function C(G){k(G).off(".powertip").each(function F(){var I=k(this),H=[g,n,e,d];if(I.data(g)){I.attr("title",I.data(g));H.push(y)}I.removeData(H)});return G}};k.powerTip.showTip=k.powerTip.show;k.powerTip.closeTip=k.powerTip.hide;function b(){var F=this;F.top="auto";F.left="auto";F.right="auto";F.bottom="auto";F.set=function(H,G){if(k.isNumeric(G)){F[H]=Math.round(G)}}}function t(K,N,F){var J=null;function L(P,Q){M();if(!K.data(e)){if(!P){c.tipOpenImminent=true;J=setTimeout(function O(){J=null;I()},N.intentPollInterval)}else{if(Q){K.data(d,true)}F.showTip(K)}}}function G(P){M();c.tipOpenImminent=false;if(K.data(e)){K.data(d,false);if(!P){c.delayInProgress=true;J=setTimeout(function O(){J=null;F.hideTip(K);c.delayInProgress=false},N.closeDelay)}else{F.hideTip(K)}}}function I(){var Q=Math.abs(c.previousX-c.currentX),O=Math.abs(c.previousY-c.currentY),P=Q+O;if(P<N.intentSensitivity){F.showTip(K)}else{c.previousX=c.currentX;c.previousY=c.currentY;L()}}function M(){J=clearTimeout(J);c.delayInProgress=false}function H(){F.resetPosition(K)}this.show=L;this.hide=G;this.cancel=M;this.resetPosition=H}function j(){function G(M,L,J,O,P){var K=L.split("-")[0],N=new b(),I;if(q(M)){I=H(M,K)}else{I=F(M,K)}switch(L){case"n":N.set("left",I.left-(J/2));N.set("bottom",c.windowHeight-I.top+P);break;case"e":N.set("left",I.left+P);N.set("top",I.top-(O/2));break;case"s":N.set("left",I.left-(J/2));N.set("top",I.top+P);break;case"w":N.set("top",I.top-(O/2));N.set("right",c.windowWidth-I.left+P);break;case"nw":N.set("bottom",c.windowHeight-I.top+P);N.set("right",c.windowWidth-I.left-20);break;case"nw-alt":N.set("left",I.left);N.set("bottom",c.windowHeight-I.top+P);break;case"ne":N.set("left",I.left-20);N.set("bottom",c.windowHeight-I.top+P);break;case"ne-alt":N.set("bottom",c.windowHeight-I.top+P);N.set("right",c.windowWidth-I.left);break;case"sw":N.set("top",I.top+P);N.set("right",c.windowWidth-I.left-20);break;case"sw-alt":N.set("left",I.left);N.set("top",I.top+P);break;case"se":N.set("left",I.left-20);N.set("top",I.top+P);break;case"se-alt":N.set("top",I.top+P);N.set("right",c.windowWidth-I.left);break}return N}function F(K,J){var O=K.offset(),N=K.outerWidth(),I=K.outerHeight(),M,L;switch(J){case"n":M=O.left+N/2;L=O.top;break;case"e":M=O.left+N;L=O.top+I/2;break;case"s":M=O.left+N/2;L=O.top+I;break;case"w":M=O.left;L=O.top+I/2;break;case"nw":M=O.left;L=O.top;break;case"ne":M=O.left+N;L=O.top;break;case"sw":M=O.left;L=O.top+I;break;case"se":M=O.left+N;L=O.top+I;break}return{top:L,left:M}}function H(O,K){var S=O.closest("svg")[0],N=O[0],W=S.createSVGPoint(),L=N.getBBox(),V=N.getScreenCTM(),M=L.width/2,Q=L.height/2,P=[],I=["nw","n","ne","e","se","s","sw","w"],U,X,R,T;function J(){P.push(W.matrixTransform(V))}W.x=L.x;W.y=L.y;J();W.x+=M;J();W.x+=M;J();W.y+=Q;J();W.y+=Q;J();W.x-=M;J();W.x-=M;J();W.y-=Q;J();if(P[0].y!==P[1].y||P[0].x!==P[7].x){X=Math.atan2(V.b,V.a)*E;R=Math.ceil(((X%360)-22.5)/45);if(R<1){R+=8}while(R--){I.push(I.shift())}}for(T=0;T<P.length;T++){if(I[T]===K){U=P[T];break}}return{top:U.y+c.scrollTop,left:U.x+c.scrollLeft}}this.compute=G}function x(Q){var P=new j(),O=k("#"+Q.popupId);if(O.length===0){O=k("<div/>",{id:Q.popupId});if(w.length===0){w=k("body")}w.append(O)}if(Q.followMouse){if(!O.data(u)){A.on("mousemove",M);s.on("scroll",M);O.data(u,true)}}if(Q.mouseOnToPopup){O.on({mouseenter:function L(){if(O.data(f)){if(c.activeHover){c.activeHover.data(n).cancel()}}},mouseleave:function N(){if(c.activeHover){c.activeHover.data(n).hide()}}})}function I(S){S.data(e,true);O.queue(function R(T){H(S);T()})}function H(S){var U;if(!S.data(e)){return}if(c.isTipOpen){if(!c.isClosing){K(c.activeHover)}O.delay(100).queue(function R(V){H(S);V()});return}S.trigger("powerTipPreRender");U=B(S);if(U){O.empty().append(U)}else{return}S.trigger("powerTipRender");c.activeHover=S;c.isTipOpen=true;O.data(f,Q.mouseOnToPopup);if(!Q.followMouse){G(S);c.isFixedTipOpen=true}else{M()}O.fadeIn(Q.fadeInTime,function T(){if(!c.desyncTimeout){c.desyncTimeout=setInterval(J,500)}S.trigger("powerTipOpen")})}function K(R){c.isClosing=true;c.activeHover=null;c.isTipOpen=false;c.desyncTimeout=clearInterval(c.desyncTimeout);R.data(e,false);R.data(d,false);O.fadeOut(Q.fadeOutTime,function S(){var T=new b();c.isClosing=false;c.isFixedTipOpen=false;O.removeClass();T.set("top",c.currentY+Q.offset);T.set("left",c.currentX+Q.offset);O.css(T);R.trigger("powerTipClose")})}function M(){if(!c.isFixedTipOpen&&(c.isTipOpen||(c.tipOpenImminent&&O.data(u)))){var R=O.outerWidth(),V=O.outerHeight(),U=new b(),S,T;U.set("top",c.currentY+Q.offset);U.set("left",c.currentX+Q.offset);S=m(U,R,V);if(S!==p.none){T=a(S);if(T===1){if(S===p.right){U.set("left",c.windowWidth-R)}else{if(S===p.bottom){U.set("top",c.scrollTop+c.windowHeight-V)}}}else{U.set("left",c.currentX-R-Q.offset);U.set("top",c.currentY-V-Q.offset)}}O.css(U)}}function G(S){var R,T;if(Q.smartPlacement){R=k.fn.powerTip.smartPlacementLists[Q.placement];k.each(R,function(U,W){var V=m(F(S,W),O.outerWidth(),O.outerHeight());T=W;if(V===p.none){return false}})}else{F(S,Q.placement);T=Q.placement}O.addClass(T)}function F(U,T){var R=0,S,W,V=new b();V.set("top",0);V.set("left",0);O.css(V);do{S=O.outerWidth();W=O.outerHeight();V=P.compute(U,T,S,W,Q.offset);O.css(V)}while(++R<=5&&(S!==O.outerWidth()||W!==O.outerHeight()));return V}function J(){var R=false;if(c.isTipOpen&&!c.isClosing&&!c.delayInProgress){if(c.activeHover.data(e)===false||c.activeHover.is(":disabled")){R=true}else{if(!v(c.activeHover)&&!c.activeHover.is(":focus")&&!c.activeHover.data(d)){if(O.data(f)){if(!v(O)){R=true}}else{R=true}}}if(R){K(c.activeHover)}}}this.showTip=I;this.hideTip=K;this.resetPosition=G}function q(F){return window.SVGElement&&F[0] instanceof SVGElement}function h(){if(!c.mouseTrackingActive){c.mouseTrackingActive=true;k(function H(){c.scrollLeft=s.scrollLeft();c.scrollTop=s.scrollTop();c.windowWidth=s.width();c.windowHeight=s.height()});A.on("mousemove",i);s.on({resize:function G(){c.windowWidth=s.width();c.windowHeight=s.height()},scroll:function F(){var I=s.scrollLeft(),J=s.scrollTop();if(I!==c.scrollLeft){c.currentX+=I-c.scrollLeft;c.scrollLeft=I}if(J!==c.scrollTop){c.currentY+=J-c.scrollTop;c.scrollTop=J}}})}}function i(F){c.currentX=F.pageX;c.currentY=F.pageY}function v(F){var H=F.offset(),J=F[0].getBoundingClientRect(),I=J.right-J.left,G=J.bottom-J.top;return c.currentX>=H.left&&c.currentX<=H.left+I&&c.currentY>=H.top&&c.currentY<=H.top+G}function B(I){var G=I.data(y),F=I.data(o),K=I.data(l),H,J;if(G){if(k.isFunction(G)){G=G.call(I[0])}J=G}else{if(F){if(k.isFunction(F)){F=F.call(I[0])}if(F.length>0){J=F.clone(true,true)}}else{if(K){H=k("#"+K);if(H.length>0){J=H.html()}}}}return J}function m(M,L,K){var G=c.scrollTop,J=c.scrollLeft,I=G+c.windowHeight,F=J+c.windowWidth,H=p.none;if(M.top<G||Math.abs(M.bottom-c.windowHeight)-K<G){H|=p.top}if(M.top+K>I||Math.abs(M.bottom-c.windowHeight)>I){H|=p.bottom}if(M.left<J||M.right+L>F){H|=p.left}if(M.left+L>F||M.right<J){H|=p.right}return H}function a(G){var F=0;while(G){G&=G-1;F++}return F}}));/*!
+ * jQuery UI Touch Punch 0.2.3
+ *
+ * Copyright 2011–2014, Dave Furfero
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ * Depends:
+ *  jquery.ui.widget.js
+ *  jquery.ui.mouse.js
+ */
+(function(b){b.support.touch="ontouchend" in document;if(!b.support.touch){return}var d=b.ui.mouse.prototype,f=d._mouseInit,c=d._mouseDestroy,a;function e(h,i){if(h.originalEvent.touches.length>1){return}h.preventDefault();var j=h.originalEvent.changedTouches[0],g=document.createEvent("MouseEvents");g.initMouseEvent(i,true,true,window,1,j.screenX,j.screenY,j.clientX,j.clientY,false,false,false,false,0,null);h.target.dispatchEvent(g)}d._touchStart=function(h){var g=this;if(a||!g._mouseCapture(h.originalEvent.changedTouches[0])){return}a=true;g._touchMoved=false;e(h,"mouseover");e(h,"mousemove");e(h,"mousedown")};d._touchMove=function(g){if(!a){return}this._touchMoved=true;e(g,"mousemove")};d._touchEnd=function(g){if(!a){return}e(g,"mouseup");e(g,"mouseout");if(!this._touchMoved){e(g,"click")}a=false};d._mouseInit=function(){var g=this;g.element.bind({touchstart:b.proxy(g,"_touchStart"),touchmove:b.proxy(g,"_touchMove"),touchend:b.proxy(g,"_touchEnd")});f.call(g)};d._mouseDestroy=function(){var g=this;g.element.unbind({touchstart:b.proxy(g,"_touchStart"),touchmove:b.proxy(g,"_touchMove"),touchend:b.proxy(g,"_touchEnd")});c.call(g)}})(jQuery);/*!
+ * SmartMenus jQuery Plugin - v1.0.0 - January 27, 2016
+ * http://www.smartmenus.org/
+ *
+ * Copyright Vasil Dinkov, Vadikom Web Ltd.
+ * http://vadikom.com
+ *
+ * Licensed MIT
+ */
+(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{if(typeof module==="object"&&typeof module.exports==="object"){module.exports=a(require("jquery"))}else{a(jQuery)}}}(function(a){var b=[],e=!!window.createPopup,f=false,d="ontouchstart" in window,h=false,g=window.requestAnimationFrame||function(l){return setTimeout(l,1000/60)},c=window.cancelAnimationFrame||function(l){clearTimeout(l)};function k(m){var n=".smartmenus_mouse";if(!h&&!m){var o=true,l=null;a(document).bind(i([["mousemove",function(s){var t={x:s.pageX,y:s.pageY,timeStamp:new Date().getTime()};if(l){var q=Math.abs(l.x-t.x),p=Math.abs(l.y-t.y);if((q>0||p>0)&&q<=2&&p<=2&&t.timeStamp-l.timeStamp<=300){f=true;if(o){var r=a(s.target).closest("a");if(r.is("a")){a.each(b,function(){if(a.contains(this.$root[0],r[0])){this.itemEnter({currentTarget:r[0]});return false}})}o=false}}}l=t}],[d?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut",function(p){if(j(p.originalEvent)){f=false}}]],n));h=true}else{if(h&&m){a(document).unbind(n);h=false}}}function j(l){return !/^(4|mouse)$/.test(l.pointerType)}function i(l,n){if(!n){n=""}var m={};a.each(l,function(o,p){m[p[0].split(" ").join(n+" ")+n]=p[1]});return m}a.SmartMenus=function(m,l){this.$root=a(m);this.opts=l;this.rootId="";this.accessIdPrefix="";this.$subArrow=null;this.activatedItems=[];this.visibleSubMenus=[];this.showTimeout=0;this.hideTimeout=0;this.scrollTimeout=0;this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.idInc=0;this.$firstLink=null;this.$firstSub=null;this.disabled=false;this.$disableOverlay=null;this.$touchScrollingSub=null;this.cssTransforms3d="perspective" in m.style||"webkitPerspective" in m.style;this.wasCollapsible=false;this.init()};a.extend(a.SmartMenus,{hideAll:function(){a.each(b,function(){this.menuHideAll()})},destroy:function(){while(b.length){b[0].destroy()}k(true)},prototype:{init:function(n){var l=this;if(!n){b.push(this);this.rootId=(new Date().getTime()+Math.random()+"").replace(/\D/g,"");this.accessIdPrefix="sm-"+this.rootId+"-";if(this.$root.hasClass("sm-rtl")){this.opts.rightToLeftSubMenus=true}var r=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).bind(i([["mouseover focusin",a.proxy(this.rootOver,this)],["mouseout focusout",a.proxy(this.rootOut,this)],["keydown",a.proxy(this.rootKeyDown,this)]],r)).delegate("a",i([["mouseenter",a.proxy(this.itemEnter,this)],["mouseleave",a.proxy(this.itemLeave,this)],["mousedown",a.proxy(this.itemDown,this)],["focus",a.proxy(this.itemFocus,this)],["blur",a.proxy(this.itemBlur,this)],["click",a.proxy(this.itemClick,this)]],r));r+=this.rootId;if(this.opts.hideOnClick){a(document).bind(i([["touchstart",a.proxy(this.docTouchStart,this)],["touchmove",a.proxy(this.docTouchMove,this)],["touchend",a.proxy(this.docTouchEnd,this)],["click",a.proxy(this.docClick,this)]],r))}a(window).bind(i([["resize orientationchange",a.proxy(this.winResize,this)]],r));if(this.opts.subIndicators){this.$subArrow=a("<span/>").addClass("sub-arrow");if(this.opts.subIndicatorsText){this.$subArrow.html(this.opts.subIndicatorsText)}}k()}this.$firstSub=this.$root.find("ul").each(function(){l.menuInit(a(this))}).eq(0);this.$firstLink=this.$root.find("a").eq(0);if(this.opts.markCurrentItem){var p=/(index|default)\.[^#\?\/]*/i,m=/#.*/,q=window.location.href.replace(p,""),o=q.replace(m,"");this.$root.find("a").each(function(){var s=this.href.replace(p,""),t=a(this);if(s==q||s==o){t.addClass("current");if(l.opts.markCurrentTree){t.parentsUntil("[data-smartmenus-id]","ul").each(function(){a(this).dataSM("parent-a").addClass("current")})}}})}this.wasCollapsible=this.isCollapsible()},destroy:function(m){if(!m){var n=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").unbind(n).undelegate(n);n+=this.rootId;a(document).unbind(n);a(window).unbind(n);if(this.opts.subIndicators){this.$subArrow=null}}this.menuHideAll();var l=this;this.$root.find("ul").each(function(){var o=a(this);if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}if(o.dataSM("shown-before")){if(l.opts.subMenusMinWidth||l.opts.subMenusMaxWidth){o.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap")}if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}o.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})}if((o.attr("id")||"").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("ie-shim").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded");this.$root.find("a.has-submenu").each(function(){var o=a(this);if(o.attr("id").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub");if(this.opts.subIndicators){this.$root.find("span.sub-arrow").remove()}if(this.opts.markCurrentItem){this.$root.find("a.current").removeClass("current")}if(!m){this.$root=null;this.$firstLink=null;this.$firstSub=null;if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}b.splice(a.inArray(this,b),1)}},disable:function(l){if(!this.disabled){this.menuHideAll();if(!l&&!this.opts.isPopup&&this.$root.is(":visible")){var m=this.$root.offset();this.$disableOverlay=a('<div class="sm-jquery-disable-overlay"/>').css({position:"absolute",top:m.top,left:m.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(true),opacity:0}).appendTo(document.body)}this.disabled=true}},docClick:function(l){if(this.$touchScrollingSub){this.$touchScrollingSub=null;return}if(this.visibleSubMenus.length&&!a.contains(this.$root[0],l.target)||a(l.target).is("a")){this.menuHideAll()}},docTouchEnd:function(m){if(!this.lastTouch){return}if(this.visibleSubMenus.length&&(this.lastTouch.x2===undefined||this.lastTouch.x1==this.lastTouch.x2)&&(this.lastTouch.y2===undefined||this.lastTouch.y1==this.lastTouch.y2)&&(!this.lastTouch.target||!a.contains(this.$root[0],this.lastTouch.target))){if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}var l=this;this.hideTimeout=setTimeout(function(){l.menuHideAll()},350)}this.lastTouch=null},docTouchMove:function(m){if(!this.lastTouch){return}var l=m.originalEvent.touches[0];this.lastTouch.x2=l.pageX;this.lastTouch.y2=l.pageY},docTouchStart:function(m){var l=m.originalEvent.touches[0];this.lastTouch={x1:l.pageX,y1:l.pageY,target:l.target}},enable:function(){if(this.disabled){if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}this.disabled=false}},getClosestMenu:function(m){var l=a(m).closest("ul");while(l.dataSM("in-mega")){l=l.parent().closest("ul")}return l[0]||null},getHeight:function(l){return this.getOffset(l,true)},getOffset:function(n,l){var m;if(n.css("display")=="none"){m={position:n[0].style.position,visibility:n[0].style.visibility};n.css({position:"absolute",visibility:"hidden"}).show()}var o=n[0].getBoundingClientRect&&n[0].getBoundingClientRect(),p=o&&(l?o.height||o.bottom-o.top:o.width||o.right-o.left);if(!p&&p!==0){p=l?n[0].offsetHeight:n[0].offsetWidth}if(m){n.hide().css(m)}return p},getStartZIndex:function(l){var m=parseInt(this[l?"$root":"$firstSub"].css("z-index"));if(!l&&isNaN(m)){m=parseInt(this.$root.css("z-index"))}return !isNaN(m)?m:1},getTouchPoint:function(l){return l.touches&&l.touches[0]||l.changedTouches&&l.changedTouches[0]||l},getViewport:function(l){var m=l?"Height":"Width",o=document.documentElement["client"+m],n=window["inner"+m];if(n){o=Math.min(o,n)}return o},getViewportHeight:function(){return this.getViewport(true)},getViewportWidth:function(){return this.getViewport()},getWidth:function(l){return this.getOffset(l)},handleEvents:function(){return !this.disabled&&this.isCSSOn()},handleItemEvents:function(l){return this.handleEvents()&&!this.isLinkInMegaMenu(l)},isCollapsible:function(){return this.$firstSub.css("position")=="static"},isCSSOn:function(){return this.$firstLink.css("display")=="block"},isFixed:function(){var l=this.$root.css("position")=="fixed";if(!l){this.$root.parentsUntil("body").each(function(){if(a(this).css("position")=="fixed"){l=true;return false}})}return l},isLinkInMegaMenu:function(l){return a(this.getClosestMenu(l[0])).hasClass("mega-menu")},isTouchMode:function(){return !f||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(p,l){var n=p.closest("ul"),q=n.dataSM("level");if(q>1&&(!this.activatedItems[q-2]||this.activatedItems[q-2][0]!=n.dataSM("parent-a")[0])){var m=this;a(n.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(n).each(function(){m.itemActivate(a(this).dataSM("parent-a"))})}if(!this.isCollapsible()||l){this.menuHideSubMenus(!this.activatedItems[q-1]||this.activatedItems[q-1][0]!=p[0]?q-1:q)}this.activatedItems[q-1]=p;if(this.$root.triggerHandler("activate.smapi",p[0])===false){return}var o=p.dataSM("sub");if(o&&(this.isTouchMode()||(!this.opts.showOnClick||this.clickActivated))){this.menuShow(o)}},itemBlur:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}this.$root.triggerHandler("blur.smapi",l[0])},itemClick:function(o){var n=a(o.currentTarget);if(!this.handleItemEvents(n)){return}if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==n.closest("ul")[0]){this.$touchScrollingSub=null;o.stopPropagation();return false}if(this.$root.triggerHandler("click.smapi",n[0])===false){return false}var p=a(o.target).is("span.sub-arrow"),m=n.dataSM("sub"),l=m?m.dataSM("level")==2:false;if(m&&!m.is(":visible")){if(this.opts.showOnClick&&l){this.clickActivated=true}this.itemActivate(n);if(m.is(":visible")){this.focusActivated=true;return false}}else{if(this.isCollapsible()&&p){this.itemActivate(n);this.menuHide(m);return false}}if(this.opts.showOnClick&&l||n.hasClass("disabled")||this.$root.triggerHandler("select.smapi",n[0])===false){return false}},itemDown:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}l.dataSM("mousedown",true)},itemEnter:function(n){var m=a(n.currentTarget);if(!this.handleItemEvents(m)){return}if(!this.isTouchMode()){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var l=this;this.showTimeout=setTimeout(function(){l.itemActivate(m)},this.opts.showOnClick&&m.closest("ul").dataSM("level")==1?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",m[0])},itemFocus:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(this.focusActivated&&(!this.isTouchMode()||!l.dataSM("mousedown"))&&(!this.activatedItems.length||this.activatedItems[this.activatedItems.length-1][0]!=l[0])){this.itemActivate(l,true)}this.$root.triggerHandler("focus.smapi",l[0])},itemLeave:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(!this.isTouchMode()){l[0].blur();if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}}l.removeDataSM("mousedown");this.$root.triggerHandler("mouseleave.smapi",l[0])},menuHide:function(m){if(this.$root.triggerHandler("beforehide.smapi",m[0])===false){return}m.stop(true,true);if(m.css("display")!="none"){var l=function(){m.css("z-index","")};if(this.isCollapsible()){if(this.opts.collapsibleHideFunction){this.opts.collapsibleHideFunction.call(this,m,l)}else{m.hide(this.opts.collapsibleHideDuration,l)}}else{if(this.opts.hideFunction){this.opts.hideFunction.call(this,m,l)}else{m.hide(this.opts.hideDuration,l)}}if(m.dataSM("ie-shim")){m.dataSM("ie-shim").remove().css({"-webkit-transform":"",transform:""})}if(m.dataSM("scroll")){this.menuScrollStop(m);m.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).unbind(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()}m.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false");m.attr({"aria-expanded":"false","aria-hidden":"true"});var n=m.dataSM("level");this.activatedItems.splice(n-1,1);this.visibleSubMenus.splice(a.inArray(m,this.visibleSubMenus),1);this.$root.triggerHandler("hide.smapi",m[0])}},menuHideAll:function(){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var m=this.opts.isPopup?1:0;for(var l=this.visibleSubMenus.length-1;l>=m;l--){this.menuHide(this.visibleSubMenus[l])}if(this.opts.isPopup){this.$root.stop(true,true);if(this.$root.is(":visible")){if(this.opts.hideFunction){this.opts.hideFunction.call(this,this.$root)}else{this.$root.hide(this.opts.hideDuration)}if(this.$root.dataSM("ie-shim")){this.$root.dataSM("ie-shim").remove()}}}this.activatedItems=[];this.visibleSubMenus=[];this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(n){for(var l=this.activatedItems.length-1;l>=n;l--){var m=this.activatedItems[l].dataSM("sub");if(m){this.menuHide(m)}}},menuIframeShim:function(l){if(e&&this.opts.overlapControlsInIE&&!l.dataSM("ie-shim")){l.dataSM("ie-shim",a("<iframe/>").attr({src:"javascript:0",tabindex:-9}).css({position:"absolute",top:"auto",left:"0",opacity:0,border:"0"}))}},menuInit:function(l){if(!l.dataSM("in-mega")){if(l.hasClass("mega-menu")){l.find("ul").dataSM("in-mega",true)}var q=2,m=l[0];while((m=m.parentNode.parentNode)!=this.$root[0]){q++}var n=l.prevAll("a").eq(-1);if(!n.length){n=l.prevAll().find("a").eq(-1)}n.addClass("has-submenu").dataSM("sub",l);l.dataSM("parent-a",n).dataSM("level",q).parent().dataSM("sub",l);var o=n.attr("id")||this.accessIdPrefix+(++this.idInc),p=l.attr("id")||this.accessIdPrefix+(++this.idInc);n.attr({id:o,"aria-haspopup":"true","aria-controls":p,"aria-expanded":"false"});l.attr({id:p,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"});if(this.opts.subIndicators){n[this.opts.subIndicatorsPos](this.$subArrow.clone())}}},menuPosition:function(K){var r=K.dataSM("parent-a"),D=r.closest("li"),E=D.parent(),l=K.dataSM("level"),t=this.getWidth(K),J=this.getHeight(K),u=r.offset(),o=u.left,m=u.top,q=this.getWidth(r),F=this.getHeight(r),H=a(window),v=H.scrollLeft(),s=H.scrollTop(),z=this.getViewportWidth(),L=this.getViewportHeight(),w=E.parent().is("[data-sm-horizontal-sub]")||l==2&&!E.hasClass("sm-vertical"),B=this.opts.rightToLeftSubMenus&&!D.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&D.is("[data-sm-reverse]"),p=l==2?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,n=l==2?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY,C,A;if(w){C=B?q-t-p:p;A=this.opts.bottomToTopSubMenus?-J-n:F+n}else{C=B?p-t:q-p;A=this.opts.bottomToTopSubMenus?F-n-J:n}if(this.opts.keepInViewport){var N=o+C,M=m+A;if(B&&N<v){C=w?v-N+C:q-p}else{if(!B&&N+t>v+z){C=w?v+z-t-N+C:p-t}}if(!w){if(J<L&&M+J>s+L){A+=s+L-J-M}else{if(J>=L||M<s){A+=s-M}}}if(w&&(M+J>s+L+0.49||M<s)||!w&&J>L+0.49){var G=this;if(!K.dataSM("scroll-arrows")){K.dataSM("scroll-arrows",a([a('<span class="scroll-up"><span class="scroll-up-arrow"></span></span>')[0],a('<span class="scroll-down"><span class="scroll-down-arrow"></span></span>')[0]]).bind({mouseenter:function(){K.dataSM("scroll").up=a(this).hasClass("scroll-up");G.menuScroll(K)},mouseleave:function(x){G.menuScrollStop(K);G.menuScrollOut(K,x)},"mousewheel DOMMouseScroll":function(x){x.preventDefault()}}).insertAfter(K))}var I=".smartmenus_scroll";K.dataSM("scroll",{y:this.cssTransforms3d?0:A-F,step:1,itemH:F,subH:J,arrowDownH:this.getHeight(K.dataSM("scroll-arrows").eq(1))}).bind(i([["mouseover",function(x){G.menuScrollOver(K,x)}],["mouseout",function(x){G.menuScrollOut(K,x)}],["mousewheel DOMMouseScroll",function(x){G.menuScrollMousewheel(K,x)}]],I)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:C+(parseInt(K.css("border-left-width"))||0),width:t-(parseInt(K.css("border-left-width"))||0)-(parseInt(K.css("border-right-width"))||0),zIndex:K.css("z-index")}).eq(w&&this.opts.bottomToTopSubMenus?0:1).show();if(this.isFixed()){K.css({"touch-action":"none","-ms-touch-action":"none"}).bind(i([[d?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp",function(x){G.menuScrollTouch(K,x)}]],I))}}}K.css({top:"auto",left:"0",marginLeft:C,marginTop:A-F});this.menuIframeShim(K);if(K.dataSM("ie-shim")){K.dataSM("ie-shim").css({zIndex:K.css("z-index"),width:t,height:J,marginLeft:C,marginTop:A-F})}},menuScroll:function(r,m,n){var p=r.dataSM("scroll"),q=r.dataSM("scroll-arrows"),o=p.up?p.upEnd:p.downEnd,s;if(!m&&p.momentum){p.momentum*=0.92;s=p.momentum;if(s<0.5){this.menuScrollStop(r);return}}else{s=n||(m||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(p.step))}var l=r.dataSM("level");if(this.activatedItems[l-1]&&this.activatedItems[l-1].dataSM("sub")&&this.activatedItems[l-1].dataSM("sub").is(":visible")){this.menuHideSubMenus(l-1)}p.y=p.up&&o<=p.y||!p.up&&o>=p.y?p.y:(Math.abs(o-p.y)>s?p.y+(p.up?s:-s):o);r.add(r.dataSM("ie-shim")).css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+p.y+"px, 0)",transform:"translate3d(0, "+p.y+"px, 0)"}:{marginTop:p.y});if(f&&(p.up&&p.y>p.downEnd||!p.up&&p.y<p.upEnd)){q.eq(p.up?1:0).show()}if(p.y==o){if(f){q.eq(p.up?0:1).hide()}this.menuScrollStop(r)}else{if(!m){if(this.opts.scrollAccelerate&&p.step<this.opts.scrollStep){p.step+=0.2}var t=this;this.scrollTimeout=g(function(){t.menuScroll(r)})}}},menuScrollMousewheel:function(m,n){if(this.getClosestMenu(n.target)==m[0]){n=n.originalEvent;var l=(n.wheelDelta||-n.detail)>0;if(m.dataSM("scroll-arrows").eq(l?0:1).is(":visible")){m.dataSM("scroll").up=l;this.menuScroll(m,true)}}n.preventDefault()},menuScrollOut:function(l,m){if(f){if(!/^scroll-(up|down)/.test((m.relatedTarget||"").className)&&(l[0]!=m.relatedTarget&&!a.contains(l[0],m.relatedTarget)||this.getClosestMenu(m.relatedTarget)!=l[0])){l.dataSM("scroll-arrows").css("visibility","hidden")}}},menuScrollOver:function(n,o){if(f){if(!/^scroll-(up|down)/.test(o.target.className)&&this.getClosestMenu(o.target)==n[0]){this.menuScrollRefreshData(n);var m=n.dataSM("scroll"),l=a(window).scrollTop()-n.dataSM("parent-a").offset().top-m.itemH;n.dataSM("scroll-arrows").eq(0).css("margin-top",l).end().eq(1).css("margin-top",l+this.getViewportHeight()-m.arrowDownH).end().css("visibility","visible")}}},menuScrollRefreshData:function(n){var m=n.dataSM("scroll"),l=a(window).scrollTop()-n.dataSM("parent-a").offset().top-m.itemH;if(this.cssTransforms3d){l=-(parseFloat(n.css("margin-top"))-l)}a.extend(m,{upEnd:l,downEnd:l+this.getViewportHeight()-m.subH})},menuScrollStop:function(l){if(this.scrollTimeout){c(this.scrollTimeout);this.scrollTimeout=0;l.dataSM("scroll").step=1;return true}},menuScrollTouch:function(p,q){q=q.originalEvent;if(j(q)){var m=this.getTouchPoint(q);if(this.getClosestMenu(m.target)==p[0]){var o=p.dataSM("scroll");if(/(start|down)$/i.test(q.type)){if(this.menuScrollStop(p)){q.preventDefault();this.$touchScrollingSub=p}else{this.$touchScrollingSub=null}this.menuScrollRefreshData(p);a.extend(o,{touchStartY:m.pageY,touchStartTime:q.timeStamp})}else{if(/move$/i.test(q.type)){var n=o.touchY!==undefined?o.touchY:o.touchStartY;if(n!==undefined&&n!=m.pageY){this.$touchScrollingSub=p;var l=n<m.pageY;if(o.up!==undefined&&o.up!=l){a.extend(o,{touchStartY:m.pageY,touchStartTime:q.timeStamp})}a.extend(o,{up:l,touchY:m.pageY});this.menuScroll(p,true,Math.abs(m.pageY-n))}q.preventDefault()}else{if(o.touchY!==undefined){if(o.momentum=Math.pow(Math.abs(m.pageY-o.touchStartY)/(q.timeStamp-o.touchStartTime),2)*15){this.menuScrollStop(p);this.menuScroll(p);q.preventDefault()}delete o.touchY}}}}}},menuShow:function(n){if(!n.dataSM("beforefirstshowfired")){n.dataSM("beforefirstshowfired",true);if(this.$root.triggerHandler("beforefirstshow.smapi",n[0])===false){return}}if(this.$root.triggerHandler("beforeshow.smapi",n[0])===false){return}n.dataSM("shown-before",true).stop(true,true);if(!n.is(":visible")){var m=n.dataSM("parent-a");if(this.opts.keepHighlighted||this.isCollapsible()){m.addClass("highlighted")}if(this.isCollapsible()){n.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""})}else{n.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1);if(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth){n.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap");if(this.opts.subMenusMinWidth){n.css("min-width",this.opts.subMenusMinWidth)}if(this.opts.subMenusMaxWidth){var o=this.getWidth(n);n.css("max-width",this.opts.subMenusMaxWidth);if(o>this.getWidth(n)){n.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}}}this.menuPosition(n);if(n.dataSM("ie-shim")){n.dataSM("ie-shim").insertBefore(n)}}var l=function(){n.css("overflow","")};if(this.isCollapsible()){if(this.opts.collapsibleShowFunction){this.opts.collapsibleShowFunction.call(this,n,l)}else{n.show(this.opts.collapsibleShowDuration,l)}}else{if(this.opts.showFunction){this.opts.showFunction.call(this,n,l)}else{n.show(this.opts.showDuration,l)}}m.attr("aria-expanded","true");n.attr({"aria-expanded":"true","aria-hidden":"false"});this.visibleSubMenus.push(n);this.$root.triggerHandler("show.smapi",n[0])}},popupHide:function(l){if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}var m=this;this.hideTimeout=setTimeout(function(){m.menuHideAll()},l?1:this.opts.hideTimeout)},popupShow:function(o,n){if(!this.opts.isPopup){alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.');return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}this.$root.dataSM("shown-before",true).stop(true,true);if(!this.$root.is(":visible")){this.$root.css({left:o,top:n});this.menuIframeShim(this.$root);if(this.$root.dataSM("ie-shim")){this.$root.dataSM("ie-shim").css({zIndex:this.$root.css("z-index"),width:this.getWidth(this.$root),height:this.getHeight(this.$root),left:o,top:n}).insertBefore(this.$root)}var m=this,l=function(){m.$root.css("overflow","")};if(this.opts.showFunction){this.opts.showFunction.call(this,this.$root,l)}else{this.$root.show(this.opts.showDuration,l)}this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(true);this.init(true)},rootKeyDown:function(o){if(!this.handleEvents()){return}switch(o.keyCode){case 27:var m=this.activatedItems[0];if(m){this.menuHideAll();m[0].focus();var n=m.dataSM("sub");if(n){this.menuHide(n)}}break;case 32:var l=a(o.target);if(l.is("a")&&this.handleItemEvents(l)){var n=l.dataSM("sub");if(n&&!n.is(":visible")){this.itemClick({currentTarget:o.target});o.preventDefault()}}break}},rootOut:function(m){if(!this.handleEvents()||this.isTouchMode()||m.target==this.$root[0]){return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}if(!this.opts.showOnClick||!this.opts.hideOnClick){var l=this;this.hideTimeout=setTimeout(function(){l.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(l){if(!this.handleEvents()||this.isTouchMode()||l.target==this.$root[0]){return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}},winResize:function(m){if(!this.handleEvents()){if(this.$disableOverlay){var n=this.$root.offset();this.$disableOverlay.css({top:n.top,left:n.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}return}if(!("onorientationchange" in window)||m.type=="orientationchange"){var l=this.isCollapsible();if(!(this.wasCollapsible&&l)){if(this.activatedItems.length){this.activatedItems[this.activatedItems.length-1][0].blur()}this.menuHideAll()}this.wasCollapsible=l}}}});a.fn.dataSM=function(l,m){if(m){return this.data(l+"_smartmenus",m)}return this.data(l+"_smartmenus")};a.fn.removeDataSM=function(l){return this.removeData(l+"_smartmenus")};a.fn.smartmenus=function(m){if(typeof m=="string"){var l=arguments,o=m;Array.prototype.shift.call(l);return this.each(function(){var p=a(this).data("smartmenus");if(p&&p[o]){p[o].apply(p,l)}})}var n=a.extend({},a.fn.smartmenus.defaults,m);return this.each(function(){new a.SmartMenus(this,n)})};a.fn.smartmenus.defaults={isPopup:false,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:true,subIndicatorsPos:"prepend",subIndicatorsText:"+",scrollStep:30,scrollAccelerate:true,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(m,l){m.fadeOut(200,l)},collapsibleShowDuration:0,collapsibleShowFunction:function(m,l){m.slideDown(200,l)},collapsibleHideDuration:0,collapsibleHideFunction:function(m,l){m.slideUp(200,l)},showOnClick:false,hideOnClick:true,noMouseOver:false,keepInViewport:true,keepHighlighted:true,markCurrentItem:false,markCurrentTree:true,rightToLeftSubMenus:false,bottomToTopSubMenus:false,overlapControlsInIE:true};return a}));
\ No newline at end of file
diff --git a/doc/doxygen/output/html/lowpan6_8c.html b/doc/doxygen/output/html/lowpan6_8c.html
new file mode 100644
index 0000000..3f050d2
--- /dev/null
+++ b/doc/doxygen/output/html/lowpan6_8c.html
@@ -0,0 +1,197 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/netif/lowpan6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('lowpan6_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">lowpan6.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="lowpan6_8h.html">netif/lowpan6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.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 />
+<code>#include &quot;<a class="el" href="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="nd6_8h.html">lwip/nd6.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="udp_8h.html">lwip/udp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tcpip_8h.html">lwip/tcpip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp_8h.html">lwip/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ieee802154_8h.html">netif/ieee802154.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 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="structlowpan6__reass__helper.html">lowpan6_reass_helper</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="structlowpan6__ieee802154__data.html">lowpan6_ieee802154_data</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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab33dc87f30aeda871845854511de9931"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6_8c.html#ab33dc87f30aeda871845854511de9931">lowpan6_calc_crc</a> (const void *buf, u16_t len)</td></tr>
+<tr class="separator:ab33dc87f30aeda871845854511de9931"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac8c3a4612aeb23f65e55c18faf5ad7d7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6_8c.html#ac8c3a4612aeb23f65e55c18faf5ad7d7">lowpan6_tmr</a> (void)</td></tr>
+<tr class="separator:ac8c3a4612aeb23f65e55c18faf5ad7d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga94c6d289bc25a14fd0fee9230ae3af94"><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__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94">lowpan6_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:ga94c6d289bc25a14fd0fee9230ae3af94"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafee5495843dfb36cb77ba2f16ea6a625"><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__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625">lowpan6_set_short_addr</a> (u8_t addr_high, u8_t addr_low)</td></tr>
+<tr class="separator:gafee5495843dfb36cb77ba2f16ea6a625"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9e650551777ededccf035ef9aaee247b"><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__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b">lowpan6_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>
+<tr class="separator:ga9e650551777ededccf035ef9aaee247b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3c943da6f9d3f1096bdcebe3e19d38b7"><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__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7">lowpan6_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:ga3c943da6f9d3f1096bdcebe3e19d38b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gade00524e85d37a3521ea85359f801df3"><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__sixlowpan.html#gade00524e85d37a3521ea85359f801df3">lowpan6_set_pan_id</a> (u16_t pan_id)</td></tr>
+<tr class="separator:gade00524e85d37a3521ea85359f801df3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9d9b93c47dd138fd84a503ffecb9336b"><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__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b">tcpip_6lowpan_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:ga9d9b93c47dd138fd84a503ffecb9336b"><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 output for IPv6. Uses ND tables for link-layer addressing. Fragments packets to 6LowPAN units.</p>
+<p>This implementation aims to conform to IEEE 802.15.4(-2015), RFC 4944 and RFC 6282.  </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ab33dc87f30aeda871845854511de9931"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab33dc87f30aeda871845854511de9931">&#9670;&nbsp;</a></span>lowpan6_calc_crc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t lowpan6_calc_crc </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Calculate the 16-bit CRC as required by IEEE 802.15.4 </p>
+
+</div>
+</div>
+<a id="ac8c3a4612aeb23f65e55c18faf5ad7d7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac8c3a4612aeb23f65e55c18faf5ad7d7">&#9670;&nbsp;</a></span>lowpan6_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lowpan6_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Periodic timer for 6LowPAN functions:</p>
+<ul>
+<li>Remove incomplete/old packets </li>
+</ul>
+
+</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_900e6f7ff90690cb8edb53323dd38d80.html">netif</a></li><li class="navelem"><a class="el" href="lowpan6_8c.html">lowpan6.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/lowpan6_8c.js b/doc/doxygen/output/html/lowpan6_8c.js
new file mode 100644
index 0000000..30abcf7
--- /dev/null
+++ b/doc/doxygen/output/html/lowpan6_8c.js
@@ -0,0 +1,13 @@
+var lowpan6_8c =
+[
+    [ "lowpan6_reass_helper", "structlowpan6__reass__helper.html", null ],
+    [ "lowpan6_ieee802154_data", "structlowpan6__ieee802154__data.html", "structlowpan6__ieee802154__data" ],
+    [ "lowpan6_calc_crc", "lowpan6_8c.html#ab33dc87f30aeda871845854511de9931", null ],
+    [ "lowpan6_input", "group__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7", null ],
+    [ "lowpan6_output", "group__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b", null ],
+    [ "lowpan6_set_context", "group__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94", null ],
+    [ "lowpan6_set_pan_id", "group__sixlowpan.html#gade00524e85d37a3521ea85359f801df3", null ],
+    [ "lowpan6_set_short_addr", "group__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625", null ],
+    [ "lowpan6_tmr", "lowpan6_8c.html#ac8c3a4612aeb23f65e55c18faf5ad7d7", null ],
+    [ "tcpip_6lowpan_input", "group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/lowpan6_8h.html b/doc/doxygen/output/html/lowpan6_8h.html
new file mode 100644
index 0000000..af1b3a5
--- /dev/null
+++ b/doc/doxygen/output/html/lowpan6_8h.html
@@ -0,0 +1,204 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/netif/lowpan6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('lowpan6_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">lowpan6.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="lowpan6__opts_8h.html">netif/lowpan6_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="lowpan6__common_8h.html">netif/lowpan6_common.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_8h.html">lwip/ip.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="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:aa258ae16a937c40333c8f97a7f236797"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6_8h.html#aa258ae16a937c40333c8f97a7f236797">LOWPAN6_TMR_INTERVAL</a>&#160;&#160;&#160;1000</td></tr>
+<tr class="separator:aa258ae16a937c40333c8f97a7f236797"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac8c3a4612aeb23f65e55c18faf5ad7d7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6_8h.html#ac8c3a4612aeb23f65e55c18faf5ad7d7">lowpan6_tmr</a> (void)</td></tr>
+<tr class="separator:ac8c3a4612aeb23f65e55c18faf5ad7d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga94c6d289bc25a14fd0fee9230ae3af94"><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__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94">lowpan6_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:ga94c6d289bc25a14fd0fee9230ae3af94"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafee5495843dfb36cb77ba2f16ea6a625"><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__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625">lowpan6_set_short_addr</a> (u8_t addr_high, u8_t addr_low)</td></tr>
+<tr class="separator:gafee5495843dfb36cb77ba2f16ea6a625"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9e650551777ededccf035ef9aaee247b"><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__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b">lowpan6_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>
+<tr class="separator:ga9e650551777ededccf035ef9aaee247b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3c943da6f9d3f1096bdcebe3e19d38b7"><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__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7">lowpan6_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:ga3c943da6f9d3f1096bdcebe3e19d38b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gade00524e85d37a3521ea85359f801df3"><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__sixlowpan.html#gade00524e85d37a3521ea85359f801df3">lowpan6_set_pan_id</a> (u16_t pan_id)</td></tr>
+<tr class="separator:gade00524e85d37a3521ea85359f801df3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab33dc87f30aeda871845854511de9931"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6_8h.html#ab33dc87f30aeda871845854511de9931">lowpan6_calc_crc</a> (const void *buf, u16_t len)</td></tr>
+<tr class="separator:ab33dc87f30aeda871845854511de9931"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9d9b93c47dd138fd84a503ffecb9336b"><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__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b">tcpip_6lowpan_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:ga9d9b93c47dd138fd84a503ffecb9336b"><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 output for IPv6. Uses ND tables for link-layer addressing. Fragments packets to 6LowPAN units. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="aa258ae16a937c40333c8f97a7f236797"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa258ae16a937c40333c8f97a7f236797">&#9670;&nbsp;</a></span>LOWPAN6_TMR_INTERVAL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LOWPAN6_TMR_INTERVAL&#160;&#160;&#160;1000</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>1 second period for reassembly </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ab33dc87f30aeda871845854511de9931"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab33dc87f30aeda871845854511de9931">&#9670;&nbsp;</a></span>lowpan6_calc_crc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t lowpan6_calc_crc </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Calculate the 16-bit CRC as required by IEEE 802.15.4 </p>
+
+</div>
+</div>
+<a id="ac8c3a4612aeb23f65e55c18faf5ad7d7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac8c3a4612aeb23f65e55c18faf5ad7d7">&#9670;&nbsp;</a></span>lowpan6_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lowpan6_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Periodic timer for 6LowPAN functions:</p>
+<ul>
+<li>Remove incomplete/old packets </li>
+</ul>
+
+</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_c9a67764bf8a12cf6b427bb859cbcd0b.html">netif</a></li><li class="navelem"><a class="el" href="lowpan6_8h.html">lowpan6.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/lowpan6_8h.js b/doc/doxygen/output/html/lowpan6_8h.js
new file mode 100644
index 0000000..e5667d6
--- /dev/null
+++ b/doc/doxygen/output/html/lowpan6_8h.js
@@ -0,0 +1,12 @@
+var lowpan6_8h =
+[
+    [ "LOWPAN6_TMR_INTERVAL", "lowpan6_8h.html#aa258ae16a937c40333c8f97a7f236797", null ],
+    [ "lowpan6_calc_crc", "lowpan6_8h.html#ab33dc87f30aeda871845854511de9931", null ],
+    [ "lowpan6_input", "group__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7", null ],
+    [ "lowpan6_output", "group__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b", null ],
+    [ "lowpan6_set_context", "group__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94", null ],
+    [ "lowpan6_set_pan_id", "group__sixlowpan.html#gade00524e85d37a3521ea85359f801df3", null ],
+    [ "lowpan6_set_short_addr", "group__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625", null ],
+    [ "lowpan6_tmr", "lowpan6_8h.html#ac8c3a4612aeb23f65e55c18faf5ad7d7", null ],
+    [ "tcpip_6lowpan_input", "group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/lowpan6__ble_8c.html b/doc/doxygen/output/html/lowpan6__ble_8c.html
new file mode 100644
index 0000000..6ef651c
--- /dev/null
+++ b/doc/doxygen/output/html/lowpan6__ble_8c.html
@@ -0,0 +1,331 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/netif/lowpan6_ble.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('lowpan6__ble_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">lowpan6_ble.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="lowpan6__ble_8h.html">netif/lowpan6_ble.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.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 />
+<code>#include &quot;<a class="el" href="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="nd6_8h.html">lwip/nd6.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="udp_8h.html">lwip/udp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tcpip_8h.html">lwip/tcpip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp_8h.html">lwip/snmp.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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"><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: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="lowpan6__ble_8c.html#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"><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="lowpan6__ble_8c.html#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>
+<tr class="separator:a53d4e8096dd714f94c69d67a6cd49ac2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01b797f4fde59dfb803f0299e6a49593"><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="lowpan6__ble_8c.html#a01b797f4fde59dfb803f0299e6a49593">rfc7668_set_peer_addr_eui64</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const u8_t *peer_addr, size_t peer_addr_len)</td></tr>
+<tr class="separator:a01b797f4fde59dfb803f0299e6a49593"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a437b9f9e85be644bd7b939413e3c81d0"><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="lowpan6__ble_8c.html#a437b9f9e85be644bd7b939413e3c81d0">rfc7668_set_peer_addr_mac48</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const u8_t *peer_addr, size_t peer_addr_len, int is_public_addr)</td></tr>
+<tr class="separator:a437b9f9e85be644bd7b939413e3c81d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="group__rfc7668if.html#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"><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__rfc7668if.html#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>
+<tr class="separator:ga22930ade4e77b3195fe59949834d85f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1d9d7aff9f2f0515f761be0802178197"><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__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197">rfc7668_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:ga1d9d7aff9f2f0515f761be0802178197"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3d940376bd983c14ffcc8d2580f3bdde"><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__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde">rfc7668_if_init</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga3d940376bd983c14ffcc8d2580f3bdde"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="lowpan6__ble_8c.html#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>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>6LowPAN over BLE output for IPv6 (RFC7668). </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a9c5b721f6fb28b4c999baab56a65d8e2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9c5b721f6fb28b4c999baab56a65d8e2">&#9670;&nbsp;</a></span>rfc7668_set_local_addr_eui64()</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> rfc7668_set_local_addr_eui64 </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>local_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>local_addr_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the local address used for stateful compression. This expects an address of 8 bytes. </p>
+
+</div>
+</div>
+<a id="a53d4e8096dd714f94c69d67a6cd49ac2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a53d4e8096dd714f94c69d67a6cd49ac2">&#9670;&nbsp;</a></span>rfc7668_set_local_addr_mac48()</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> rfc7668_set_local_addr_mac48 </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>local_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>local_addr_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>is_public_addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the local address used for stateful compression. This expects an address of 6 bytes. </p>
+
+</div>
+</div>
+<a id="a01b797f4fde59dfb803f0299e6a49593"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a01b797f4fde59dfb803f0299e6a49593">&#9670;&nbsp;</a></span>rfc7668_set_peer_addr_eui64()</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> rfc7668_set_peer_addr_eui64 </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>peer_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>peer_addr_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the peer address used for stateful compression. This expects an address of 8 bytes. </p>
+
+</div>
+</div>
+<a id="a437b9f9e85be644bd7b939413e3c81d0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a437b9f9e85be644bd7b939413e3c81d0">&#9670;&nbsp;</a></span>rfc7668_set_peer_addr_mac48()</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> rfc7668_set_peer_addr_mac48 </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>peer_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>peer_addr_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>is_public_addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the peer address used for stateful compression. This expects an address of 6 bytes. </p>
+
+</div>
+</div>
+<a id="a6ae90ad69f5d901eb44cf87b9120cd9a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6ae90ad69f5d901eb44cf87b9120cd9a">&#9670;&nbsp;</a></span>tcpip_rfc7668_input()</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_rfc7668_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Pass a received packet to tcpip_thread for input processing</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 IEEE 802.15.4 header. </td></tr>
+    <tr><td class="paramname">inp</td><td>the network interface on which the packet was received</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>see <a class="el" href="tcpip_8h.html#a93043b3c66dbe4a15a60299c6199d102">tcpip_inpkt</a>, same return values </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_900e6f7ff90690cb8edb53323dd38d80.html">netif</a></li><li class="navelem"><a class="el" href="lowpan6__ble_8c.html">lowpan6_ble.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/lowpan6__ble_8c.js b/doc/doxygen/output/html/lowpan6__ble_8c.js
new file mode 100644
index 0000000..388eeb7
--- /dev/null
+++ b/doc/doxygen/output/html/lowpan6__ble_8c.js
@@ -0,0 +1,14 @@
+var lowpan6__ble_8c =
+[
+    [ "ble_addr_to_eui64", "group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c", null ],
+    [ "eui64_to_ble_addr", "group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d", null ],
+    [ "rfc7668_if_init", "group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde", null ],
+    [ "rfc7668_input", "group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197", null ],
+    [ "rfc7668_output", "group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0", null ],
+    [ "rfc7668_set_context", "group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e", null ],
+    [ "rfc7668_set_local_addr_eui64", "lowpan6__ble_8c.html#a9c5b721f6fb28b4c999baab56a65d8e2", null ],
+    [ "rfc7668_set_local_addr_mac48", "lowpan6__ble_8c.html#a53d4e8096dd714f94c69d67a6cd49ac2", null ],
+    [ "rfc7668_set_peer_addr_eui64", "lowpan6__ble_8c.html#a01b797f4fde59dfb803f0299e6a49593", null ],
+    [ "rfc7668_set_peer_addr_mac48", "lowpan6__ble_8c.html#a437b9f9e85be644bd7b939413e3c81d0", null ],
+    [ "tcpip_rfc7668_input", "lowpan6__ble_8c.html#a6ae90ad69f5d901eb44cf87b9120cd9a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/lowpan6__ble_8h.html b/doc/doxygen/output/html/lowpan6__ble_8h.html
new file mode 100644
index 0000000..619d401
--- /dev/null
+++ b/doc/doxygen/output/html/lowpan6__ble_8h.html
@@ -0,0 +1,326 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/netif/lowpan6_ble.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('lowpan6__ble_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">lowpan6_ble.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="lowpan6__opts_8h.html">netif/lowpan6_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="lowpan6__common_8h.html">netif/lowpan6_common.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_8h.html">lwip/ip.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="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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="group__rfc7668if.html#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>
+<tr class="separator:ga22930ade4e77b3195fe59949834d85f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1d9d7aff9f2f0515f761be0802178197"><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__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197">rfc7668_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:ga1d9d7aff9f2f0515f761be0802178197"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="lowpan6__ble_8h.html#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"><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="lowpan6__ble_8h.html#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>
+<tr class="separator:a53d4e8096dd714f94c69d67a6cd49ac2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01b797f4fde59dfb803f0299e6a49593"><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="lowpan6__ble_8h.html#a01b797f4fde59dfb803f0299e6a49593">rfc7668_set_peer_addr_eui64</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const u8_t *peer_addr, size_t peer_addr_len)</td></tr>
+<tr class="separator:a01b797f4fde59dfb803f0299e6a49593"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a437b9f9e85be644bd7b939413e3c81d0"><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="lowpan6__ble_8h.html#a437b9f9e85be644bd7b939413e3c81d0">rfc7668_set_peer_addr_mac48</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const u8_t *peer_addr, size_t peer_addr_len, int is_public_addr)</td></tr>
+<tr class="separator:a437b9f9e85be644bd7b939413e3c81d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e">rfc7668_set_context</a> (u8_t index, 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:ga3d940376bd983c14ffcc8d2580f3bdde"><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__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde">rfc7668_if_init</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga3d940376bd983c14ffcc8d2580f3bdde"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="lowpan6__ble_8h.html#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"><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"><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>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>6LowPAN over BLE for IPv6 (RFC7668). </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a9c5b721f6fb28b4c999baab56a65d8e2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9c5b721f6fb28b4c999baab56a65d8e2">&#9670;&nbsp;</a></span>rfc7668_set_local_addr_eui64()</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> rfc7668_set_local_addr_eui64 </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>local_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>local_addr_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the local address used for stateful compression. This expects an address of 8 bytes. </p>
+
+</div>
+</div>
+<a id="a53d4e8096dd714f94c69d67a6cd49ac2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a53d4e8096dd714f94c69d67a6cd49ac2">&#9670;&nbsp;</a></span>rfc7668_set_local_addr_mac48()</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> rfc7668_set_local_addr_mac48 </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>local_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>local_addr_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>is_public_addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the local address used for stateful compression. This expects an address of 6 bytes. </p>
+
+</div>
+</div>
+<a id="a01b797f4fde59dfb803f0299e6a49593"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a01b797f4fde59dfb803f0299e6a49593">&#9670;&nbsp;</a></span>rfc7668_set_peer_addr_eui64()</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> rfc7668_set_peer_addr_eui64 </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>peer_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>peer_addr_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the peer address used for stateful compression. This expects an address of 8 bytes. </p>
+
+</div>
+</div>
+<a id="a437b9f9e85be644bd7b939413e3c81d0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a437b9f9e85be644bd7b939413e3c81d0">&#9670;&nbsp;</a></span>rfc7668_set_peer_addr_mac48()</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> rfc7668_set_peer_addr_mac48 </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>peer_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>peer_addr_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>is_public_addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the peer address used for stateful compression. This expects an address of 6 bytes. </p>
+
+</div>
+</div>
+<a id="a6ae90ad69f5d901eb44cf87b9120cd9a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6ae90ad69f5d901eb44cf87b9120cd9a">&#9670;&nbsp;</a></span>tcpip_rfc7668_input()</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_rfc7668_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Pass a received packet to tcpip_thread for input processing</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 IEEE 802.15.4 header. </td></tr>
+    <tr><td class="paramname">inp</td><td>the network interface on which the packet was received</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>see <a class="el" href="tcpip_8h.html#a93043b3c66dbe4a15a60299c6199d102">tcpip_inpkt</a>, same return values </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_c9a67764bf8a12cf6b427bb859cbcd0b.html">netif</a></li><li class="navelem"><a class="el" href="lowpan6__ble_8h.html">lowpan6_ble.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/lowpan6__ble_8h.js b/doc/doxygen/output/html/lowpan6__ble_8h.js
new file mode 100644
index 0000000..93fa2ef
--- /dev/null
+++ b/doc/doxygen/output/html/lowpan6__ble_8h.js
@@ -0,0 +1,14 @@
+var lowpan6__ble_8h =
+[
+    [ "ble_addr_to_eui64", "group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c", null ],
+    [ "eui64_to_ble_addr", "group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d", null ],
+    [ "rfc7668_if_init", "group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde", null ],
+    [ "rfc7668_input", "group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197", null ],
+    [ "rfc7668_output", "group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0", null ],
+    [ "rfc7668_set_context", "group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e", null ],
+    [ "rfc7668_set_local_addr_eui64", "lowpan6__ble_8h.html#a9c5b721f6fb28b4c999baab56a65d8e2", null ],
+    [ "rfc7668_set_local_addr_mac48", "lowpan6__ble_8h.html#a53d4e8096dd714f94c69d67a6cd49ac2", null ],
+    [ "rfc7668_set_peer_addr_eui64", "lowpan6__ble_8h.html#a01b797f4fde59dfb803f0299e6a49593", null ],
+    [ "rfc7668_set_peer_addr_mac48", "lowpan6__ble_8h.html#a437b9f9e85be644bd7b939413e3c81d0", null ],
+    [ "tcpip_rfc7668_input", "lowpan6__ble_8h.html#a6ae90ad69f5d901eb44cf87b9120cd9a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/lowpan6__common_8c.html b/doc/doxygen/output/html/lowpan6__common_8c.html
new file mode 100644
index 0000000..29fe9fa
--- /dev/null
+++ b/doc/doxygen/output/html/lowpan6__common_8c.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/netif/lowpan6_common.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('lowpan6__common_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">lowpan6_common.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="lowpan6__common_8h.html">netif/lowpan6_common.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.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 />
+<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 &lt;string.h&gt;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Common 6LowPAN routines for IPv6. Uses ND tables for link-layer addressing. Fragments packets to 6LowPAN units.</p>
+<p>This implementation aims to conform to IEEE 802.15.4(-2015), RFC 4944 and RFC 6282.  </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_900e6f7ff90690cb8edb53323dd38d80.html">netif</a></li><li class="navelem"><a class="el" href="lowpan6__common_8c.html">lowpan6_common.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/lowpan6__common_8h.html b/doc/doxygen/output/html/lowpan6__common_8h.html
new file mode 100644
index 0000000..8f06ef4
--- /dev/null
+++ b/doc/doxygen/output/html/lowpan6__common_8h.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/netif/lowpan6_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('lowpan6__common_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a>  </div>
+  <div class="headertitle">
+<div class="title">lowpan6_common.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="lowpan6__opts_8h.html">netif/lowpan6_opts.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_8h.html">lwip/ip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.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 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="structlowpan6__link__addr.html">lowpan6_link_addr</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>
+<div class="textblock"><p>Common 6LowPAN routines for IPv6. Uses ND tables for link-layer addressing. Fragments packets to 6LowPAN units. </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_c9a67764bf8a12cf6b427bb859cbcd0b.html">netif</a></li><li class="navelem"><a class="el" href="lowpan6__common_8h.html">lowpan6_common.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/lowpan6__common_8h.js b/doc/doxygen/output/html/lowpan6__common_8h.js
new file mode 100644
index 0000000..d3e1b82
--- /dev/null
+++ b/doc/doxygen/output/html/lowpan6__common_8h.js
@@ -0,0 +1,4 @@
+var lowpan6__common_8h =
+[
+    [ "lowpan6_link_addr", "structlowpan6__link__addr.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/lowpan6__opts_8h.html b/doc/doxygen/output/html/lowpan6__opts_8h.html
new file mode 100644
index 0000000..ffe2902
--- /dev/null
+++ b/doc/doxygen/output/html/lowpan6__opts_8h.html
@@ -0,0 +1,311 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/netif/lowpan6_opts.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('lowpan6__opts_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">lowpan6_opts.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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a4ffa89f39abf93cc599f78c5a8bb0a4a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6__opts_8h.html#a4ffa89f39abf93cc599f78c5a8bb0a4a">LWIP_6LOWPAN_NUM_CONTEXTS</a>&#160;&#160;&#160;10</td></tr>
+<tr class="separator:a4ffa89f39abf93cc599f78c5a8bb0a4a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a542cd72a6270b7231b8b93f8041207"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6__opts_8h.html#a6a542cd72a6270b7231b8b93f8041207">LWIP_6LOWPAN_INFER_SHORT_ADDRESS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:a6a542cd72a6270b7231b8b93f8041207"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0f178a86d02e0ba4168cafe3de5f3afa"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6__opts_8h.html#a0f178a86d02e0ba4168cafe3de5f3afa">LWIP_6LOWPAN_IPHC</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:a0f178a86d02e0ba4168cafe3de5f3afa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae5bb9b8d695caec08930073edc7c6175"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6__opts_8h.html#ae5bb9b8d695caec08930073edc7c6175">LWIP_6LOWPAN_802154_HW_CRC</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ae5bb9b8d695caec08930073edc7c6175"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad20840e31a0a6eeec8666e4d4a979f43"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6__opts_8h.html#ad20840e31a0a6eeec8666e4d4a979f43">LWIP_6LOWPAN_CALC_CRC</a>(buf,  len)&#160;&#160;&#160;<a class="el" href="lowpan6_8c.html#ab33dc87f30aeda871845854511de9931">lowpan6_calc_crc</a>(buf, len)</td></tr>
+<tr class="separator:ad20840e31a0a6eeec8666e4d4a979f43"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae90ebb32999c6df5cc83705e133e1754"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6__opts_8h.html#ae90ebb32999c6df5cc83705e133e1754">LWIP_LOWPAN6_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ae90ebb32999c6df5cc83705e133e1754"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acf9a44be56d5dca9e45f644571d66f58"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6__opts_8h.html#acf9a44be56d5dca9e45f644571d66f58">LWIP_LOWPAN6_802154_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:acf9a44be56d5dca9e45f644571d66f58"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a231bc758484376dfd2ded6931c462df8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6__opts_8h.html#a231bc758484376dfd2ded6931c462df8">LWIP_LOWPAN6_IP_COMPRESSED_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:a231bc758484376dfd2ded6931c462df8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7f4db0bd3dbe36a19efbd24cd8b7fcf0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6__opts_8h.html#a7f4db0bd3dbe36a19efbd24cd8b7fcf0">LWIP_LOWPAN6_DECOMPRESSION_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:a7f4db0bd3dbe36a19efbd24cd8b7fcf0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b7a3e204d2edde5552ca3c8694419c1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6__opts_8h.html#a5b7a3e204d2edde5552ca3c8694419c1">LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:a5b7a3e204d2edde5552ca3c8694419c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af4a4d962af3439b111a8e72e5eeaccf8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lowpan6__opts_8h.html#af4a4d962af3439b111a8e72e5eeaccf8">LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:af4a4d962af3439b111a8e72e5eeaccf8"><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 options list </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ae5bb9b8d695caec08930073edc7c6175"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae5bb9b8d695caec08930073edc7c6175">&#9670;&nbsp;</a></span>LWIP_6LOWPAN_802154_HW_CRC</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_6LOWPAN_802154_HW_CRC&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 if your IEEE 802.15.4 interface can calculate and check the CRC in hardware. This means TX packets get 2 zero bytes added on transmission which are to be filled with the CRC. </p>
+
+</div>
+</div>
+<a id="ad20840e31a0a6eeec8666e4d4a979f43"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad20840e31a0a6eeec8666e4d4a979f43">&#9670;&nbsp;</a></span>LWIP_6LOWPAN_CALC_CRC</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_6LOWPAN_CALC_CRC</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">buf, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">len&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="lowpan6_8c.html#ab33dc87f30aeda871845854511de9931">lowpan6_calc_crc</a>(buf, len)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If LWIP_6LOWPAN_802154_HW_CRC==0, this can override the default slow implementation of the CRC used for 6LoWPAN over IEEE 802.15.4 (which uses a shift register). </p>
+
+</div>
+</div>
+<a id="a6a542cd72a6270b7231b8b93f8041207"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6a542cd72a6270b7231b8b93f8041207">&#9670;&nbsp;</a></span>LWIP_6LOWPAN_INFER_SHORT_ADDRESS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_6LOWPAN_INFER_SHORT_ADDRESS&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_6LOWPAN_INFER_SHORT_ADDRESS: set this to 0 to disable creating short addresses for matching addresses (debug only) </p>
+
+</div>
+</div>
+<a id="a0f178a86d02e0ba4168cafe3de5f3afa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0f178a86d02e0ba4168cafe3de5f3afa">&#9670;&nbsp;</a></span>LWIP_6LOWPAN_IPHC</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_6LOWPAN_IPHC&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_6LOWPAN_IPHC: set this to 0 to disable IP header compression as per RFC 6282 (which is mandatory for BLE) </p>
+
+</div>
+</div>
+<a id="a4ffa89f39abf93cc599f78c5a8bb0a4a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4ffa89f39abf93cc599f78c5a8bb0a4a">&#9670;&nbsp;</a></span>LWIP_6LOWPAN_NUM_CONTEXTS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_6LOWPAN_NUM_CONTEXTS&#160;&#160;&#160;10</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_6LOWPAN_NUM_CONTEXTS: define the number of compression contexts per netif type </p>
+
+</div>
+</div>
+<a id="acf9a44be56d5dca9e45f644571d66f58"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acf9a44be56d5dca9e45f644571d66f58">&#9670;&nbsp;</a></span>LWIP_LOWPAN6_802154_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_LOWPAN6_802154_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>Debug level for 6LoWPAN over IEEE 802.15.4 </p>
+
+</div>
+</div>
+<a id="ae90ebb32999c6df5cc83705e133e1754"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae90ebb32999c6df5cc83705e133e1754">&#9670;&nbsp;</a></span>LWIP_LOWPAN6_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_LOWPAN6_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>Debug level for 6LoWPAN in general </p>
+
+</div>
+</div>
+<a id="a7f4db0bd3dbe36a19efbd24cd8b7fcf0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7f4db0bd3dbe36a19efbd24cd8b7fcf0">&#9670;&nbsp;</a></span>LWIP_LOWPAN6_DECOMPRESSION_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_LOWPAN6_DECOMPRESSION_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>LWIP_LOWPAN6_DECOMPRESSION_DEBUG: enable decompression debug output </p>
+
+</div>
+</div>
+<a id="a231bc758484376dfd2ded6931c462df8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a231bc758484376dfd2ded6931c462df8">&#9670;&nbsp;</a></span>LWIP_LOWPAN6_IP_COMPRESSED_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_LOWPAN6_IP_COMPRESSED_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>LWIP_LOWPAN6_IP_COMPRESSED_DEBUG: enable compressed IP frame output debugging </p>
+
+</div>
+</div>
+<a id="a5b7a3e204d2edde5552ca3c8694419c1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5b7a3e204d2edde5552ca3c8694419c1">&#9670;&nbsp;</a></span>LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_RFC7668_IP_UNCOMPRESSED_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>LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG: enable decompressed IP frame output debugging </p>
+
+</div>
+</div>
+<a id="af4a4d962af3439b111a8e72e5eeaccf8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af4a4d962af3439b111a8e72e5eeaccf8">&#9670;&nbsp;</a></span>LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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 not (=0) </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_c9a67764bf8a12cf6b427bb859cbcd0b.html">netif</a></li><li class="navelem"><a class="el" href="lowpan6__opts_8h.html">lowpan6_opts.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/lowpan6__opts_8h.js b/doc/doxygen/output/html/lowpan6__opts_8h.js
new file mode 100644
index 0000000..4514c5a
--- /dev/null
+++ b/doc/doxygen/output/html/lowpan6__opts_8h.js
@@ -0,0 +1,14 @@
+var lowpan6__opts_8h =
+[
+    [ "LWIP_6LOWPAN_802154_HW_CRC", "lowpan6__opts_8h.html#ae5bb9b8d695caec08930073edc7c6175", null ],
+    [ "LWIP_6LOWPAN_CALC_CRC", "lowpan6__opts_8h.html#ad20840e31a0a6eeec8666e4d4a979f43", null ],
+    [ "LWIP_6LOWPAN_INFER_SHORT_ADDRESS", "lowpan6__opts_8h.html#a6a542cd72a6270b7231b8b93f8041207", null ],
+    [ "LWIP_6LOWPAN_IPHC", "lowpan6__opts_8h.html#a0f178a86d02e0ba4168cafe3de5f3afa", null ],
+    [ "LWIP_6LOWPAN_NUM_CONTEXTS", "lowpan6__opts_8h.html#a4ffa89f39abf93cc599f78c5a8bb0a4a", null ],
+    [ "LWIP_LOWPAN6_802154_DEBUG", "lowpan6__opts_8h.html#acf9a44be56d5dca9e45f644571d66f58", null ],
+    [ "LWIP_LOWPAN6_DEBUG", "lowpan6__opts_8h.html#ae90ebb32999c6df5cc83705e133e1754", null ],
+    [ "LWIP_LOWPAN6_DECOMPRESSION_DEBUG", "lowpan6__opts_8h.html#a7f4db0bd3dbe36a19efbd24cd8b7fcf0", null ],
+    [ "LWIP_LOWPAN6_IP_COMPRESSED_DEBUG", "lowpan6__opts_8h.html#a231bc758484376dfd2ded6931c462df8", null ],
+    [ "LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG", "lowpan6__opts_8h.html#a5b7a3e204d2edde5552ca3c8694419c1", null ],
+    [ "LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS", "lowpan6__opts_8h.html#af4a4d962af3439b111a8e72e5eeaccf8", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/lwip_2errno_8h.html b/doc/doxygen/output/html/lwip_2errno_8h.html
new file mode 100644
index 0000000..f081905
--- /dev/null
+++ b/doc/doxygen/output/html/lwip_2errno_8h.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/errno.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('lwip_2errno_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">errno.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 />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Posix Errno defines </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="lwip_2errno_8h.html">errno.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/lwip_2etharp_8h.html b/doc/doxygen/output/html/lwip_2etharp_8h.html
new file mode 100644
index 0000000..4f1b50c
--- /dev/null
+++ b/doc/doxygen/output/html/lwip_2etharp_8h.html
@@ -0,0 +1,508 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/etharp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('lwip_2etharp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">etharp.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="pbuf_8h.html">lwip/pbuf.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip4__addr_8h.html">lwip/ip4_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="ip4_8h.html">lwip/ip4.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="lwip_2prot_2ethernet_8h.html">lwip/prot/ethernet.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="lwip_2prot_2etharp_8h.html">lwip/prot/etharp.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structetharp__q__entry.html">etharp_q_entry</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:aaa3d8ed1eb1129f518345e37b38cfc37"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2etharp_8h.html#aaa3d8ed1eb1129f518345e37b38cfc37">ARP_TMR_INTERVAL</a>&#160;&#160;&#160;1000</td></tr>
+<tr class="separator:aaa3d8ed1eb1129f518345e37b38cfc37"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a83947dea159baf3420922084072e631e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2etharp_8h.html#a83947dea159baf3420922084072e631e">etharp_gratuitous</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;<a class="el" href="lwip_2etharp_8h.html#a3e56faced96841e615f88dd57d1b2b15">etharp_request</a>((<a class="el" href="structnetif.html">netif</a>), <a class="el" href="group__netif__ip4.html#gac9b6e63b5dd2968fe0a4813f3eefb55d">netif_ip4_addr</a>(<a class="el" href="structnetif.html">netif</a>))</td></tr>
+<tr class="separator:a83947dea159baf3420922084072e631e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a654f4dad71f7e2bc4820094648f37a26"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2etharp_8h.html#a654f4dad71f7e2bc4820094648f37a26">etharp_tmr</a> (void)</td></tr>
+<tr class="separator:a654f4dad71f7e2bc4820094648f37a26"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0f8ca87c5472fa165763c8c38b76174c"><td class="memItemLeft" align="right" valign="top">ssize_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2etharp_8h.html#a0f8ca87c5472fa165763c8c38b76174c">etharp_find_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, struct <a class="el" href="structeth__addr.html">eth_addr</a> **eth_ret, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> **ip_ret)</td></tr>
+<tr class="separator:a0f8ca87c5472fa165763c8c38b76174c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab93df7ccb26496100d45137541e863c8"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2etharp_8h.html#ab93df7ccb26496100d45137541e863c8">etharp_get_entry</a> (size_t i, <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> **ipaddr, struct <a class="el" href="structnetif.html">netif</a> **<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structeth__addr.html">eth_addr</a> **eth_ret)</td></tr>
+<tr class="separator:ab93df7ccb26496100d45137541e863c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a19258c75a3778b6ed0c82f63a419502d"><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="lwip_2etharp_8h.html#a19258c75a3778b6ed0c82f63a419502d">etharp_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="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr)</td></tr>
+<tr class="separator:a19258c75a3778b6ed0c82f63a419502d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae180772e31346a0afeb707ad172dd19c"><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="lwip_2etharp_8h.html#ae180772e31346a0afeb707ad172dd19c">etharp_query</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, struct <a class="el" href="structpbuf.html">pbuf</a> *q)</td></tr>
+<tr class="separator:ae180772e31346a0afeb707ad172dd19c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="lwip_2etharp_8h.html#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:ae94677a2a5f3698276027c7475f6ca05"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2etharp_8h.html#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:a540a5506979693ef9ac4496db9bfa7d6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2etharp_8h.html#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>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Ethernet output function - handles OUTGOING ethernet level traffic, implements ARP resolving. To be used in most low-level netif implementations </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="aaa3d8ed1eb1129f518345e37b38cfc37"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaa3d8ed1eb1129f518345e37b38cfc37">&#9670;&nbsp;</a></span>ARP_TMR_INTERVAL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ARP_TMR_INTERVAL&#160;&#160;&#160;1000</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>1 seconds period </p>
+
+</div>
+</div>
+<a id="a83947dea159baf3420922084072e631e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a83947dea159baf3420922084072e631e">&#9670;&nbsp;</a></span>etharp_gratuitous</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define etharp_gratuitous</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="lwip_2etharp_8h.html#a3e56faced96841e615f88dd57d1b2b15">etharp_request</a>((<a class="el" href="structnetif.html">netif</a>), <a class="el" href="group__netif__ip4.html#gac9b6e63b5dd2968fe0a4813f3eefb55d">netif_ip4_addr</a>(<a class="el" href="structnetif.html">netif</a>))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<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="ae94677a2a5f3698276027c7475f6ca05"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae94677a2a5f3698276027c7475f6ca05">&#9670;&nbsp;</a></span>etharp_cleanup_netif()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void etharp_cleanup_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Remove all ARP table entries of the specified netif.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>points to a network interface </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a0f8ca87c5472fa165763c8c38b76174c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0f8ca87c5472fa165763c8c38b76174c">&#9670;&nbsp;</a></span>etharp_find_addr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">ssize_t etharp_find_addr </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structeth__addr.html">eth_addr</a> **&#160;</td>
+          <td class="paramname"><em>eth_ret</em>, </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> **&#160;</td>
+          <td class="paramname"><em>ip_ret</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Finds (stable) ethernet/IP address pair from ARP table using interface and IP address index. </p><dl class="section note"><dt>Note</dt><dd>the addresses in the ARP table are in network order!</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>points to interface index </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>points to the (network order) IP address index </td></tr>
+    <tr><td class="paramname">eth_ret</td><td>points to return pointer </td></tr>
+    <tr><td class="paramname">ip_ret</td><td>points to return pointer </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>table index if found, -1 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ab93df7ccb26496100d45137541e863c8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab93df7ccb26496100d45137541e863c8">&#9670;&nbsp;</a></span>etharp_get_entry()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int etharp_get_entry </td>
+          <td>(</td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>i</em>, </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> **&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> **&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structeth__addr.html">eth_addr</a> **&#160;</td>
+          <td class="paramname"><em>eth_ret</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Possibility to iterate over stable ARP table entries</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i</td><td>entry number, 0 to ARP_TABLE_SIZE </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>return value: IP address </td></tr>
+    <tr><td class="paramname">netif</td><td>return value: points to interface </td></tr>
+    <tr><td class="paramname">eth_ret</td><td>return value: ETH address </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 on valid index, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a540a5506979693ef9ac4496db9bfa7d6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a540a5506979693ef9ac4496db9bfa7d6">&#9670;&nbsp;</a></span>etharp_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void etharp_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Responds to ARP requests to us. Upon ARP replies to us, add entry to cache send out queued IP packets. Updates cache with snooped address pairs.</p>
+<p>Should be called for incoming ARP packets. The pbuf in the argument is freed by this function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>The ARP packet that arrived on netif. Is freed by this function. </td></tr>
+    <tr><td class="paramname">netif</td><td>The lwIP network interface on which the ARP packet pbuf arrived.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf_free()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a19258c75a3778b6ed0c82f63a419502d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a19258c75a3778b6ed0c82f63a419502d">&#9670;&nbsp;</a></span>etharp_output()</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_output </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>q</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Resolve and fill-in Ethernet address header for outgoing IP packet.</p>
+<p>For IP multicast and broadcast, corresponding Ethernet addresses are selected and the packet is transmitted on the link.</p>
+<p>For unicast addresses, the packet is submitted to <a class="el" href="etharp_8c.html#ae180772e31346a0afeb707ad172dd19c">etharp_query()</a>. In case the IP address is outside the local network, the IP address of the gateway is used.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The lwIP network interface which the IP packet will be sent on. </td></tr>
+    <tr><td class="paramname">q</td><td>The <a class="el" href="structpbuf.html">pbuf(s)</a> containing the IP packet to be sent. </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>The IP address of the packet destination.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><ul>
+<li>ERR_RTE No route to destination (no gateway to external networks), or the return type of either <a class="el" href="etharp_8c.html#ae180772e31346a0afeb707ad172dd19c">etharp_query()</a> or <a class="el" href="group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778">ethernet_output()</a>. </li>
+</ul>
+</dd></dl>
+
+</div>
+</div>
+<a id="ae180772e31346a0afeb707ad172dd19c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae180772e31346a0afeb707ad172dd19c">&#9670;&nbsp;</a></span>etharp_query()</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_query </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>q</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an ARP request for the given IP address and/or queue a packet.</p>
+<p>If the IP address was not yet in the cache, a pending ARP cache entry is added and an ARP request is sent for the given address. The packet is queued on this entry.</p>
+<p>If the IP address was already pending in the cache, a new ARP request is sent for the given address. The packet is queued on this entry.</p>
+<p>If the IP address was already stable in the cache, and a packet is given, it is directly sent and no ARP request is sent out.</p>
+<p>If the IP address was already stable in the cache, and no packet is given, an ARP request is sent out.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The lwIP network interface on which ipaddr must be queried for. </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>The IP address to be resolved. </td></tr>
+    <tr><td class="paramname">q</td><td>If non-NULL, a pbuf that must be delivered to the IP address. q is not freed by this function.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>q must only be ONE packet, not a packet queue!</dd></dl>
+<dl class="section return"><dt>Returns</dt><dd><ul>
+<li>ERR_BUF Could not make room for Ethernet header.</li>
+<li>ERR_MEM Hardware address unknown, and no more ARP entries available to query for address or queue the packet.</li>
+<li>ERR_MEM Could not queue packet due to memory shortage.</li>
+<li>ERR_RTE No route to destination (no gateway to external networks).</li>
+<li>ERR_ARG Non-unicast address given, those will not appear in ARP cache. </li>
+</ul>
+</dd></dl>
+
+</div>
+</div>
+<a id="a3e56faced96841e615f88dd57d1b2b15"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3e56faced96841e615f88dd57d1b2b15">&#9670;&nbsp;</a></span>etharp_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> etharp_request </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an ARP request packet asking for ipaddr.</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 for which to ask </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="a654f4dad71f7e2bc4820094648f37a26"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a654f4dad71f7e2bc4820094648f37a26">&#9670;&nbsp;</a></span>etharp_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void etharp_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Clears expired entries in the ARP table.</p>
+<p>This function should be called every ARP_TMR_INTERVAL milliseconds (1 second), in order to expire entries in the ARP table. </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="lwip_2etharp_8h.html">etharp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/lwip_2etharp_8h.js b/doc/doxygen/output/html/lwip_2etharp_8h.js
new file mode 100644
index 0000000..bdd938a
--- /dev/null
+++ b/doc/doxygen/output/html/lwip_2etharp_8h.js
@@ -0,0 +1,14 @@
+var lwip_2etharp_8h =
+[
+    [ "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_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 ],
+    [ "etharp_input", "lwip_2etharp_8h.html#a540a5506979693ef9ac4496db9bfa7d6", null ],
+    [ "etharp_output", "lwip_2etharp_8h.html#a19258c75a3778b6ed0c82f63a419502d", null ],
+    [ "etharp_query", "lwip_2etharp_8h.html#ae180772e31346a0afeb707ad172dd19c", null ],
+    [ "etharp_request", "lwip_2etharp_8h.html#a3e56faced96841e615f88dd57d1b2b15", null ],
+    [ "etharp_tmr", "lwip_2etharp_8h.html#a654f4dad71f7e2bc4820094648f37a26", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/lwip_2inet_8h.html b/doc/doxygen/output/html/lwip_2inet_8h.html
new file mode 100644
index 0000000..8bc3b02
--- /dev/null
+++ b/doc/doxygen/output/html/lwip_2inet_8h.html
@@ -0,0 +1,240 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/inet.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('lwip_2inet_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">inet.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="def_8h.html">lwip/def.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="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a3d2472d6cf31b73eeb829110dd0fffea"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2inet_8h.html#a3d2472d6cf31b73eeb829110dd0fffea">INADDR_NONE</a>&#160;&#160;&#160;<a class="el" href="ip4__addr_8h.html#abc4b2e3531c4992f2ae4b8c0f9751544">IPADDR_NONE</a></td></tr>
+<tr class="separator:a3d2472d6cf31b73eeb829110dd0fffea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae1ac25d7797666cff6d01d6c795c2378"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2inet_8h.html#ae1ac25d7797666cff6d01d6c795c2378">INADDR_LOOPBACK</a>&#160;&#160;&#160;<a class="el" href="ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e">IPADDR_LOOPBACK</a></td></tr>
+<tr class="separator:ae1ac25d7797666cff6d01d6c795c2378"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5d1940045dc2e7de552f3d4ff13a74ab"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2inet_8h.html#a5d1940045dc2e7de552f3d4ff13a74ab">INADDR_ANY</a>&#160;&#160;&#160;<a class="el" href="ip4__addr_8h.html#ad6ed0d622d61ecd6edd606e3b564f0a2">IPADDR_ANY</a></td></tr>
+<tr class="separator:a5d1940045dc2e7de552f3d4ff13a74ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a725f61ded23ce8a7dff8e82ed51986"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2inet_8h.html#a4a725f61ded23ce8a7dff8e82ed51986">INADDR_BROADCAST</a>&#160;&#160;&#160;<a class="el" href="ip4__addr_8h.html#ac661fca7e7d25e5cd379b811a767c29a">IPADDR_BROADCAST</a></td></tr>
+<tr class="separator:a4a725f61ded23ce8a7dff8e82ed51986"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1de876a356ee05a2e9427b741f99f49c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2inet_8h.html#a1de876a356ee05a2e9427b741f99f49c">IN6ADDR_ANY_INIT</a>&#160;&#160;&#160;{{{0,0,0,0}}}</td></tr>
+<tr class="separator:a1de876a356ee05a2e9427b741f99f49c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5562c81af19ee5988ddc5a5c6153cf37"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2inet_8h.html#a5562c81af19ee5988ddc5a5c6153cf37">IN6ADDR_LOOPBACK_INIT</a>&#160;&#160;&#160;{{{0,0,0,PP_HTONL(1)}}}</td></tr>
+<tr class="separator:a5562c81af19ee5988ddc5a5c6153cf37"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:af8c97553060738d9edd6bfeab13ef7c3"><td class="memItemLeft" align="right" valign="top">const struct in6_addr&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2inet_8h.html#af8c97553060738d9edd6bfeab13ef7c3">in6addr_any</a></td></tr>
+<tr class="separator:af8c97553060738d9edd6bfeab13ef7c3"><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 file (together with <a class="el" href="sockets_8h.html">sockets.h</a>) aims to provide structs and functions from</p><ul>
+<li><a class="el" href="compat_2posix_2arpa_2inet_8h.html">arpa/inet.h</a></li>
+<li>netinet/in.h </li>
+</ul>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a1de876a356ee05a2e9427b741f99f49c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1de876a356ee05a2e9427b741f99f49c">&#9670;&nbsp;</a></span>IN6ADDR_ANY_INIT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IN6ADDR_ANY_INIT&#160;&#160;&#160;{{{0,0,0,0}}}</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This macro can be used to initialize a variable of type struct in6_addr to the IPv6 wildcard address. </p>
+
+</div>
+</div>
+<a id="a5562c81af19ee5988ddc5a5c6153cf37"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5562c81af19ee5988ddc5a5c6153cf37">&#9670;&nbsp;</a></span>IN6ADDR_LOOPBACK_INIT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IN6ADDR_LOOPBACK_INIT&#160;&#160;&#160;{{{0,0,0,PP_HTONL(1)}}}</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This macro can be used to initialize a variable of type struct in6_addr to the IPv6 loopback address. </p>
+
+</div>
+</div>
+<a id="a5d1940045dc2e7de552f3d4ff13a74ab"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5d1940045dc2e7de552f3d4ff13a74ab">&#9670;&nbsp;</a></span>INADDR_ANY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define INADDR_ANY&#160;&#160;&#160;<a class="el" href="ip4__addr_8h.html#ad6ed0d622d61ecd6edd606e3b564f0a2">IPADDR_ANY</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>0.0.0.0 </p>
+
+</div>
+</div>
+<a id="a4a725f61ded23ce8a7dff8e82ed51986"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4a725f61ded23ce8a7dff8e82ed51986">&#9670;&nbsp;</a></span>INADDR_BROADCAST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define INADDR_BROADCAST&#160;&#160;&#160;<a class="el" href="ip4__addr_8h.html#ac661fca7e7d25e5cd379b811a767c29a">IPADDR_BROADCAST</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>255.255.255.255 </p>
+
+</div>
+</div>
+<a id="ae1ac25d7797666cff6d01d6c795c2378"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae1ac25d7797666cff6d01d6c795c2378">&#9670;&nbsp;</a></span>INADDR_LOOPBACK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define INADDR_LOOPBACK&#160;&#160;&#160;<a class="el" href="ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e">IPADDR_LOOPBACK</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>127.0.0.1 </p>
+
+</div>
+</div>
+<a id="a3d2472d6cf31b73eeb829110dd0fffea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3d2472d6cf31b73eeb829110dd0fffea">&#9670;&nbsp;</a></span>INADDR_NONE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define INADDR_NONE&#160;&#160;&#160;<a class="el" href="ip4__addr_8h.html#abc4b2e3531c4992f2ae4b8c0f9751544">IPADDR_NONE</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>255.255.255.255 </p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="af8c97553060738d9edd6bfeab13ef7c3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af8c97553060738d9edd6bfeab13ef7c3">&#9670;&nbsp;</a></span>in6addr_any</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const struct in6_addr in6addr_any</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This variable is initialized by the system to contain the wildcard IPv6 address. </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="lwip_2inet_8h.html">inet.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/lwip_2inet_8h.js b/doc/doxygen/output/html/lwip_2inet_8h.js
new file mode 100644
index 0000000..f49cd10
--- /dev/null
+++ b/doc/doxygen/output/html/lwip_2inet_8h.js
@@ -0,0 +1,10 @@
+var lwip_2inet_8h =
+[
+    [ "IN6ADDR_ANY_INIT", "lwip_2inet_8h.html#a1de876a356ee05a2e9427b741f99f49c", null ],
+    [ "IN6ADDR_LOOPBACK_INIT", "lwip_2inet_8h.html#a5562c81af19ee5988ddc5a5c6153cf37", null ],
+    [ "INADDR_ANY", "lwip_2inet_8h.html#a5d1940045dc2e7de552f3d4ff13a74ab", null ],
+    [ "INADDR_BROADCAST", "lwip_2inet_8h.html#a4a725f61ded23ce8a7dff8e82ed51986", null ],
+    [ "INADDR_LOOPBACK", "lwip_2inet_8h.html#ae1ac25d7797666cff6d01d6c795c2378", null ],
+    [ "INADDR_NONE", "lwip_2inet_8h.html#a3d2472d6cf31b73eeb829110dd0fffea", null ],
+    [ "in6addr_any", "lwip_2inet_8h.html#af8c97553060738d9edd6bfeab13ef7c3", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/lwip_2netdb_8h.html b/doc/doxygen/output/html/lwip_2netdb_8h.html
new file mode 100644
index 0000000..e1d463a
--- /dev/null
+++ b/doc/doxygen/output/html/lwip_2netdb_8h.html
@@ -0,0 +1,341 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/netdb.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('lwip_2netdb_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">netdb.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="arch_8h.html">lwip/arch.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 &quot;<a class="el" href="sockets_8h.html">lwip/sockets.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a0bb00f48d6ba1e8c55b7d85c8e3a19a7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2netdb_8h.html#a0bb00f48d6ba1e8c55b7d85c8e3a19a7">EAI_NONAME</a>&#160;&#160;&#160;200</td></tr>
+<tr class="separator:a0bb00f48d6ba1e8c55b7d85c8e3a19a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga39746b4b096060ca3e8c6ee7a7560b1d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netdbapi.html#ga39746b4b096060ca3e8c6ee7a7560b1d">gethostbyname</a>(name)&#160;&#160;&#160;<a class="el" href="lwip_2netdb_8h.html#a8adc6d35c068a073369edde71c678cbc">lwip_gethostbyname</a>(name)</td></tr>
+<tr class="separator:ga39746b4b096060ca3e8c6ee7a7560b1d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga76204a4d646dba393f88aa9b0980fc07"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netdbapi.html#ga76204a4d646dba393f88aa9b0980fc07">gethostbyname_r</a>(name,  ret,  buf,  buflen,  result,  h_errnop)&#160;&#160;&#160;<a class="el" href="lwip_2netdb_8h.html#afa229e90916f6c8d6308828f45351d2d">lwip_gethostbyname_r</a>(name, ret, buf, buflen, result, h_errnop)</td></tr>
+<tr class="separator:ga76204a4d646dba393f88aa9b0980fc07"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab28cd3049bcf6e2bc3a71e968a64a92d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netdbapi.html#gab28cd3049bcf6e2bc3a71e968a64a92d">freeaddrinfo</a>(addrinfo)&#160;&#160;&#160;<a class="el" href="lwip_2netdb_8h.html#a7f65ff5982a0743849a644ef2cd15ef5">lwip_freeaddrinfo</a>(addrinfo)</td></tr>
+<tr class="separator:gab28cd3049bcf6e2bc3a71e968a64a92d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga558191530d91c101621b49e43bd5bbf5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netdbapi.html#ga558191530d91c101621b49e43bd5bbf5">getaddrinfo</a>(nodname,  servname,  hints,  res)&#160;&#160;&#160;<a class="el" href="lwip_2netdb_8h.html#af356989c172a51187e22b557f22d4165">lwip_getaddrinfo</a>(nodname, servname, hints, res)</td></tr>
+<tr class="separator:ga558191530d91c101621b49e43bd5bbf5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a8adc6d35c068a073369edde71c678cbc"><td class="memItemLeft" align="right" valign="top">struct hostent *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2netdb_8h.html#a8adc6d35c068a073369edde71c678cbc">lwip_gethostbyname</a> (const char *name)</td></tr>
+<tr class="separator:a8adc6d35c068a073369edde71c678cbc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afa229e90916f6c8d6308828f45351d2d"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2netdb_8h.html#afa229e90916f6c8d6308828f45351d2d">lwip_gethostbyname_r</a> (const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop)</td></tr>
+<tr class="separator:afa229e90916f6c8d6308828f45351d2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7f65ff5982a0743849a644ef2cd15ef5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2netdb_8h.html#a7f65ff5982a0743849a644ef2cd15ef5">lwip_freeaddrinfo</a> (struct addrinfo *ai)</td></tr>
+<tr class="separator:a7f65ff5982a0743849a644ef2cd15ef5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af356989c172a51187e22b557f22d4165"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2netdb_8h.html#af356989c172a51187e22b557f22d4165">lwip_getaddrinfo</a> (const char *nodename, const char *servname, const struct addrinfo *hints, struct addrinfo **res)</td></tr>
+<tr class="separator:af356989c172a51187e22b557f22d4165"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a2a1ce3f2040007303d36c0b682b5ac10"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2netdb_8h.html#a2a1ce3f2040007303d36c0b682b5ac10">h_errno</a></td></tr>
+<tr class="separator:a2a1ce3f2040007303d36c0b682b5ac10"><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>NETDB API (sockets) </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a0bb00f48d6ba1e8c55b7d85c8e3a19a7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0bb00f48d6ba1e8c55b7d85c8e3a19a7">&#9670;&nbsp;</a></span>EAI_NONAME</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define EAI_NONAME&#160;&#160;&#160;200</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Errors used by the DNS API functions, h_errno can be one of them </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a7f65ff5982a0743849a644ef2cd15ef5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7f65ff5982a0743849a644ef2cd15ef5">&#9670;&nbsp;</a></span>lwip_freeaddrinfo()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_freeaddrinfo </td>
+          <td>(</td>
+          <td class="paramtype">struct addrinfo *&#160;</td>
+          <td class="paramname"><em>ai</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Frees one or more addrinfo structures returned by <a class="el" href="group__netdbapi.html#ga558191530d91c101621b49e43bd5bbf5">getaddrinfo()</a>, along with any additional storage associated with those structures. If the ai_next field of the structure is not null, the entire list of structures is freed.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ai</td><td>struct addrinfo to free </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="af356989c172a51187e22b557f22d4165"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af356989c172a51187e22b557f22d4165">&#9670;&nbsp;</a></span>lwip_getaddrinfo()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lwip_getaddrinfo </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>nodename</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>servname</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct addrinfo *&#160;</td>
+          <td class="paramname"><em>hints</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct addrinfo **&#160;</td>
+          <td class="paramname"><em>res</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Translates the name of a service location (for example, a host name) and/or a service name and returns a set of socket addresses and associated information to be used in creating a socket with which to address the specified service. Memory for the result is allocated internally and must be freed by calling <a class="el" href="netdb_8c.html#a7f65ff5982a0743849a644ef2cd15ef5">lwip_freeaddrinfo()</a>!</p>
+<p>Due to a limitation in dns_gethostbyname, only the first address of a host is returned. Also, service names are not supported (only port numbers)!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">nodename</td><td>descriptive name or address string of the host (may be NULL -&gt; local address) </td></tr>
+    <tr><td class="paramname">servname</td><td>port number as string of NULL </td></tr>
+    <tr><td class="paramname">hints</td><td>structure containing input values that set socktype and protocol </td></tr>
+    <tr><td class="paramname">res</td><td>pointer to a pointer where to store the result (set to NULL on failure) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero on failure</dd></dl>
+
+</div>
+</div>
+<a id="a8adc6d35c068a073369edde71c678cbc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8adc6d35c068a073369edde71c678cbc">&#9670;&nbsp;</a></span>lwip_gethostbyname()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct hostent* lwip_gethostbyname </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>name</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns an entry containing addresses of address family AF_INET for the host with name name. Due to dns_gethostbyname limitations, only one address is returned.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">name</td><td>the hostname to resolve </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>an entry containing addresses of address family AF_INET for the host with name name </dd></dl>
+
+</div>
+</div>
+<a id="afa229e90916f6c8d6308828f45351d2d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afa229e90916f6c8d6308828f45351d2d">&#9670;&nbsp;</a></span>lwip_gethostbyname_r()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lwip_gethostbyname_r </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct hostent *&#160;</td>
+          <td class="paramname"><em>ret</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>buflen</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct hostent **&#160;</td>
+          <td class="paramname"><em>result</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&#160;</td>
+          <td class="paramname"><em>h_errnop</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Thread-safe variant of lwip_gethostbyname: instead of using a static buffer, this function takes buffer and errno pointers as arguments and uses these for the result.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">name</td><td>the hostname to resolve </td></tr>
+    <tr><td class="paramname">ret</td><td>pre-allocated struct where to store the result </td></tr>
+    <tr><td class="paramname">buf</td><td>pre-allocated buffer where to store additional data </td></tr>
+    <tr><td class="paramname">buflen</td><td>the size of buf </td></tr>
+    <tr><td class="paramname">result</td><td>pointer to a hostent pointer that is set to ret on success and set to zero on error </td></tr>
+    <tr><td class="paramname">h_errnop</td><td>pointer to an int where to store errors (instead of modifying the global h_errno) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero on error, additional error information is stored in *h_errnop instead of h_errno to be thread-safe </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="a2a1ce3f2040007303d36c0b682b5ac10"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2a1ce3f2040007303d36c0b682b5ac10">&#9670;&nbsp;</a></span>h_errno</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int h_errno</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>h_errno is exported in netdb.h for access by applications. </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="lwip_2netdb_8h.html">netdb.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/lwip_2netdb_8h.js b/doc/doxygen/output/html/lwip_2netdb_8h.js
new file mode 100644
index 0000000..53a96af
--- /dev/null
+++ b/doc/doxygen/output/html/lwip_2netdb_8h.js
@@ -0,0 +1,13 @@
+var lwip_2netdb_8h =
+[
+    [ "EAI_NONAME", "lwip_2netdb_8h.html#a0bb00f48d6ba1e8c55b7d85c8e3a19a7", null ],
+    [ "freeaddrinfo", "group__netdbapi.html#gab28cd3049bcf6e2bc3a71e968a64a92d", null ],
+    [ "getaddrinfo", "group__netdbapi.html#ga558191530d91c101621b49e43bd5bbf5", null ],
+    [ "gethostbyname", "group__netdbapi.html#ga39746b4b096060ca3e8c6ee7a7560b1d", null ],
+    [ "gethostbyname_r", "group__netdbapi.html#ga76204a4d646dba393f88aa9b0980fc07", null ],
+    [ "lwip_freeaddrinfo", "lwip_2netdb_8h.html#a7f65ff5982a0743849a644ef2cd15ef5", null ],
+    [ "lwip_getaddrinfo", "lwip_2netdb_8h.html#af356989c172a51187e22b557f22d4165", null ],
+    [ "lwip_gethostbyname", "lwip_2netdb_8h.html#a8adc6d35c068a073369edde71c678cbc", null ],
+    [ "lwip_gethostbyname_r", "lwip_2netdb_8h.html#afa229e90916f6c8d6308828f45351d2d", null ],
+    [ "h_errno", "lwip_2netdb_8h.html#a2a1ce3f2040007303d36c0b682b5ac10", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/lwip_2prot_2etharp_8h.html b/doc/doxygen/output/html/lwip_2prot_2etharp_8h.html
new file mode 100644
index 0000000..a477cf5
--- /dev/null
+++ b/doc/doxygen/output/html/lwip_2prot_2etharp_8h.html
@@ -0,0 +1,183 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/etharp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('lwip_2prot_2etharp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">etharp.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="lwip_2prot_2ethernet_8h.html">lwip/prot/ethernet.h</a>&quot;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structip4__addr__wordaligned.html">ip4_addr_wordaligned</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="structetharp__hdr.html">etharp_hdr</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a94f1c2a6ad7cecdfe759c0490ba7f030"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2prot_2etharp_8h.html#a94f1c2a6ad7cecdfe759c0490ba7f030">IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T</a>(dest,  src)&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec">SMEMCPY</a>(dest, src, sizeof(<a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a>))</td></tr>
+<tr class="separator:a94f1c2a6ad7cecdfe759c0490ba7f030"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7dff02ff186f844b731cecbe614b7419"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2prot_2etharp_8h.html#a7dff02ff186f844b731cecbe614b7419">IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T</a>(dest,  src)&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec">SMEMCPY</a>(dest, src, sizeof(<a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a>))</td></tr>
+<tr class="separator:a7dff02ff186f844b731cecbe614b7419"><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>ARP protocol definitions </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a7dff02ff186f844b731cecbe614b7419"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7dff02ff186f844b731cecbe614b7419">&#9670;&nbsp;</a></span>IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec">SMEMCPY</a>(dest, src, sizeof(<a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a>))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMCPY-like copying of IP addresses where addresses are known to be 16-bit-aligned if the port is correctly configured (so a port could define this to copying 2 u16_t's) - no NULL-pointer-checking needed. </p>
+
+</div>
+</div>
+<a id="a94f1c2a6ad7cecdfe759c0490ba7f030"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a94f1c2a6ad7cecdfe759c0490ba7f030">&#9670;&nbsp;</a></span>IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec">SMEMCPY</a>(dest, src, sizeof(<a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a>))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MEMCPY-like copying of IP addresses where addresses are known to be 16-bit-aligned if the port is correctly configured (so a port could define this to copying 2 u16_t's) - no NULL-pointer-checking needed. </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="dir_fa0f2b7ac208069fc8d28c28af349d8d.html">prot</a></li><li class="navelem"><a class="el" href="lwip_2prot_2etharp_8h.html">etharp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/lwip_2prot_2etharp_8h.js b/doc/doxygen/output/html/lwip_2prot_2etharp_8h.js
new file mode 100644
index 0000000..a70af41
--- /dev/null
+++ b/doc/doxygen/output/html/lwip_2prot_2etharp_8h.js
@@ -0,0 +1,7 @@
+var lwip_2prot_2etharp_8h =
+[
+    [ "ip4_addr_wordaligned", "structip4__addr__wordaligned.html", null ],
+    [ "etharp_hdr", "structetharp__hdr.html", null ],
+    [ "IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T", "lwip_2prot_2etharp_8h.html#a7dff02ff186f844b731cecbe614b7419", null ],
+    [ "IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T", "lwip_2prot_2etharp_8h.html#a94f1c2a6ad7cecdfe759c0490ba7f030", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/lwip_2prot_2ethernet_8h.html b/doc/doxygen/output/html/lwip_2prot_2ethernet_8h.html
new file mode 100644
index 0000000..ee862b4
--- /dev/null
+++ b/doc/doxygen/output/html/lwip_2prot_2ethernet_8h.html
@@ -0,0 +1,212 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/ethernet.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('lwip_2prot_2ethernet_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">ethernet.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ieee_8h.html">lwip/prot/ieee.h</a>&quot;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structeth__addr.html">eth_addr</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="structeth__hdr.html">eth_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="structeth__vlan__hdr.html">eth_vlan_hdr</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a19c72ce98569e0fb55948a7587d704ee"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2prot_2ethernet_8h.html#a19c72ce98569e0fb55948a7587d704ee">ETH_ADDR</a>(b0,  b1,  b2,  b3,  b4,  b5)&#160;&#160;&#160;{{b0, b1, b2, b3, b4, b5}}</td></tr>
+<tr class="separator:a19c72ce98569e0fb55948a7587d704ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afaf6cbccf9477c3505660e3a17860e07"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2prot_2ethernet_8h.html#afaf6cbccf9477c3505660e3a17860e07">LL_IP4_MULTICAST_ADDR_0</a>&#160;&#160;&#160;0x01</td></tr>
+<tr class="separator:afaf6cbccf9477c3505660e3a17860e07"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8ebe93c6ad2d743e6c952539257679b6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwip_2prot_2ethernet_8h.html#a8ebe93c6ad2d743e6c952539257679b6">LL_IP6_MULTICAST_ADDR_0</a>&#160;&#160;&#160;0x33</td></tr>
+<tr class="separator:a8ebe93c6ad2d743e6c952539257679b6"><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>Ethernet protocol definitions </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a19c72ce98569e0fb55948a7587d704ee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a19c72ce98569e0fb55948a7587d704ee">&#9670;&nbsp;</a></span>ETH_ADDR</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ETH_ADDR</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">b0, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">b1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">b2, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">b3, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">b4, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">b5&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;{{b0, b1, b2, b3, b4, b5}}</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize a struct <a class="el" href="structeth__addr.html">eth_addr</a> with its 6 bytes (takes care of correct braces) </p>
+
+</div>
+</div>
+<a id="afaf6cbccf9477c3505660e3a17860e07"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afaf6cbccf9477c3505660e3a17860e07">&#9670;&nbsp;</a></span>LL_IP4_MULTICAST_ADDR_0</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LL_IP4_MULTICAST_ADDR_0&#160;&#160;&#160;0x01</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The 24-bit IANA IPv4-multicast OUI is 01-00-5e: </p>
+
+</div>
+</div>
+<a id="a8ebe93c6ad2d743e6c952539257679b6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8ebe93c6ad2d743e6c952539257679b6">&#9670;&nbsp;</a></span>LL_IP6_MULTICAST_ADDR_0</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LL_IP6_MULTICAST_ADDR_0&#160;&#160;&#160;0x33</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IPv6 multicast uses this prefix </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="dir_fa0f2b7ac208069fc8d28c28af349d8d.html">prot</a></li><li class="navelem"><a class="el" href="lwip_2prot_2ethernet_8h.html">ethernet.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/lwip_2prot_2ethernet_8h.js b/doc/doxygen/output/html/lwip_2prot_2ethernet_8h.js
new file mode 100644
index 0000000..5df242d
--- /dev/null
+++ b/doc/doxygen/output/html/lwip_2prot_2ethernet_8h.js
@@ -0,0 +1,9 @@
+var lwip_2prot_2ethernet_8h =
+[
+    [ "eth_addr", "structeth__addr.html", null ],
+    [ "eth_hdr", "structeth__hdr.html", null ],
+    [ "eth_vlan_hdr", "structeth__vlan__hdr.html", null ],
+    [ "ETH_ADDR", "lwip_2prot_2ethernet_8h.html#a19c72ce98569e0fb55948a7587d704ee", null ],
+    [ "LL_IP4_MULTICAST_ADDR_0", "lwip_2prot_2ethernet_8h.html#afaf6cbccf9477c3505660e3a17860e07", null ],
+    [ "LL_IP6_MULTICAST_ADDR_0", "lwip_2prot_2ethernet_8h.html#a8ebe93c6ad2d743e6c952539257679b6", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/lwiperf_8c.html b/doc/doxygen/output/html/lwiperf_8c.html
new file mode 100644
index 0000000..d54d3d8
--- /dev/null
+++ b/doc/doxygen/output/html/lwiperf_8c.html
@@ -0,0 +1,225 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/lwiperf/lwiperf.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('lwiperf_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">lwiperf.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<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 &lt;string.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="struct__lwiperf__settings.html">_lwiperf_settings</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="struct__lwiperf__state__tcp.html">_lwiperf_state_tcp</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a646d7e0b37c5cefdd6eef38a3fba4673"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwiperf_8c.html#a646d7e0b37c5cefdd6eef38a3fba4673">LWIPERF_TCP_MAX_IDLE_SEC</a>&#160;&#160;&#160;10U</td></tr>
+<tr class="separator:a646d7e0b37c5cefdd6eef38a3fba4673"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1351e47d0bdb7d0fe0efaf9f1b2b0f7a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwiperf_8c.html#a1351e47d0bdb7d0fe0efaf9f1b2b0f7a">LWIPERF_SERVER_IP_TYPE</a>&#160;&#160;&#160;<a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e">IPADDR_TYPE_ANY</a></td></tr>
+<tr class="separator:a1351e47d0bdb7d0fe0efaf9f1b2b0f7a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af51dcfc53fe575411c26e18963f1b902"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwiperf_8c.html#af51dcfc53fe575411c26e18963f1b902">LWIPERF_CHECK_RX_DATA</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:af51dcfc53fe575411c26e18963f1b902"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a4a794a0c1a90b889d54b1dacbce923f4"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct__lwiperf__settings.html">_lwiperf_settings</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwiperf_8c.html#a4a794a0c1a90b889d54b1dacbce923f4">lwiperf_settings_t</a></td></tr>
+<tr class="separator:a4a794a0c1a90b889d54b1dacbce923f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a06db7abdf1d4864ca2b367d9c89e3e2d"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct__lwiperf__state__tcp.html">_lwiperf_state_tcp</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwiperf_8c.html#a06db7abdf1d4864ca2b367d9c89e3e2d">lwiperf_state_tcp_t</a></td></tr>
+<tr class="separator:a06db7abdf1d4864ca2b367d9c89e3e2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gae1f30a02b86c4dd3d47810cd493baf26"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iperf.html#gae1f30a02b86c4dd3d47810cd493baf26">lwiperf_start_tcp_server_default</a> (<a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf_report_fn</a> report_fn, void *report_arg)</td></tr>
+<tr class="separator:gae1f30a02b86c4dd3d47810cd493baf26"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad97bf77057e7f96d6d8def812deea202"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iperf.html#gad97bf77057e7f96d6d8def812deea202">lwiperf_start_tcp_server</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *local_addr, u16_t local_port, <a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf_report_fn</a> report_fn, void *report_arg)</td></tr>
+<tr class="separator:gad97bf77057e7f96d6d8def812deea202"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga85a487cf8ecbd0999382c9bff375d0da"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iperf.html#ga85a487cf8ecbd0999382c9bff375d0da">lwiperf_start_tcp_client_default</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *remote_addr, <a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf_report_fn</a> report_fn, void *report_arg)</td></tr>
+<tr class="separator:ga85a487cf8ecbd0999382c9bff375d0da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad8317f52289d8bb12a14627cd177a565"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iperf.html#gad8317f52289d8bb12a14627cd177a565">lwiperf_start_tcp_client</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *remote_addr, u16_t remote_port, enum <a class="el" href="lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76c">lwiperf_client_type</a> type, <a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf_report_fn</a> report_fn, void *report_arg)</td></tr>
+<tr class="separator:gad8317f52289d8bb12a14627cd177a565"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac51c9c44a38bfa1140bd44b793a0a004"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004">lwiperf_abort</a> (void *lwiperf_session)</td></tr>
+<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>
+<div class="textblock"><p>lwIP iPerf server implementation </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="af51dcfc53fe575411c26e18963f1b902"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af51dcfc53fe575411c26e18963f1b902">&#9670;&nbsp;</a></span>LWIPERF_CHECK_RX_DATA</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIPERF_CHECK_RX_DATA&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If this is 1, check that received data has the correct format </p>
+
+</div>
+</div>
+<a id="a1351e47d0bdb7d0fe0efaf9f1b2b0f7a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1351e47d0bdb7d0fe0efaf9f1b2b0f7a">&#9670;&nbsp;</a></span>LWIPERF_SERVER_IP_TYPE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIPERF_SERVER_IP_TYPE&#160;&#160;&#160;<a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e">IPADDR_TYPE_ANY</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Change this if you don't want to lwiperf to listen to any IP version </p>
+
+</div>
+</div>
+<a id="a646d7e0b37c5cefdd6eef38a3fba4673"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a646d7e0b37c5cefdd6eef38a3fba4673">&#9670;&nbsp;</a></span>LWIPERF_TCP_MAX_IDLE_SEC</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIPERF_TCP_MAX_IDLE_SEC&#160;&#160;&#160;10U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Specify the idle timeout (in seconds) after that the test fails </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="a4a794a0c1a90b889d54b1dacbce923f4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4a794a0c1a90b889d54b1dacbce923f4">&#9670;&nbsp;</a></span>lwiperf_settings_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="struct__lwiperf__settings.html">_lwiperf_settings</a>  <a class="el" href="lwiperf_8c.html#a4a794a0c1a90b889d54b1dacbce923f4">lwiperf_settings_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This is the Iperf settings struct sent from the client </p>
+
+</div>
+</div>
+<a id="a06db7abdf1d4864ca2b367d9c89e3e2d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a06db7abdf1d4864ca2b367d9c89e3e2d">&#9670;&nbsp;</a></span>lwiperf_state_tcp_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="struct__lwiperf__state__tcp.html">_lwiperf_state_tcp</a>  <a class="el" href="lwiperf_8c.html#a06db7abdf1d4864ca2b367d9c89e3e2d">lwiperf_state_tcp_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Connection handle for a TCP iperf session </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_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_4b846c6b6971d2800eff93d75504accd.html">lwiperf</a></li><li class="navelem"><a class="el" href="lwiperf_8c.html">lwiperf.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/lwiperf_8c.js b/doc/doxygen/output/html/lwiperf_8c.js
new file mode 100644
index 0000000..24c805f
--- /dev/null
+++ b/doc/doxygen/output/html/lwiperf_8c.js
@@ -0,0 +1,15 @@
+var lwiperf_8c =
+[
+    [ "_lwiperf_settings", "struct__lwiperf__settings.html", null ],
+    [ "_lwiperf_state_tcp", "struct__lwiperf__state__tcp.html", null ],
+    [ "LWIPERF_CHECK_RX_DATA", "lwiperf_8c.html#af51dcfc53fe575411c26e18963f1b902", null ],
+    [ "LWIPERF_SERVER_IP_TYPE", "lwiperf_8c.html#a1351e47d0bdb7d0fe0efaf9f1b2b0f7a", null ],
+    [ "LWIPERF_TCP_MAX_IDLE_SEC", "lwiperf_8c.html#a646d7e0b37c5cefdd6eef38a3fba4673", null ],
+    [ "lwiperf_settings_t", "lwiperf_8c.html#a4a794a0c1a90b889d54b1dacbce923f4", null ],
+    [ "lwiperf_state_tcp_t", "lwiperf_8c.html#a06db7abdf1d4864ca2b367d9c89e3e2d", null ],
+    [ "lwiperf_abort", "group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004", null ],
+    [ "lwiperf_start_tcp_client", "group__iperf.html#gad8317f52289d8bb12a14627cd177a565", null ],
+    [ "lwiperf_start_tcp_client_default", "group__iperf.html#ga85a487cf8ecbd0999382c9bff375d0da", null ],
+    [ "lwiperf_start_tcp_server", "group__iperf.html#gad97bf77057e7f96d6d8def812deea202", null ],
+    [ "lwiperf_start_tcp_server_default", "group__iperf.html#gae1f30a02b86c4dd3d47810cd493baf26", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/lwiperf_8h.html b/doc/doxygen/output/html/lwiperf_8h.html
new file mode 100644
index 0000000..be55c55
--- /dev/null
+++ b/doc/doxygen/output/html/lwiperf_8h.html
@@ -0,0 +1,220 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/lwiperf.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('lwiperf_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">lwiperf.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="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 name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a248ea47a58a14c6aecf6525217a812fd"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf_report_fn</a>) (void *arg, enum <a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6">lwiperf_report_type</a> report_type, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *local_addr, u16_t local_port, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *remote_addr, u16_t remote_port, u32_t bytes_transferred, u32_t ms_duration, u32_t bandwidth_kbitpsec)</td></tr>
+<tr class="separator:a248ea47a58a14c6aecf6525217a812fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ab72a2d205e43d5243a291f937bbc24d6"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6">lwiperf_report_type</a> { <br />
+&#160;&#160;<a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6aa52255236ad2983346311ce7f28210e5">LWIPERF_TCP_DONE_SERVER</a>, 
+<a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a4f9bde0cad305eaab25d2c1d0196677b">LWIPERF_TCP_DONE_CLIENT</a>, 
+<a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6abee2bf6da51a0845c15ac52b280203cb">LWIPERF_TCP_ABORTED_LOCAL</a>, 
+<a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6adda7e5dbaf1e04eb04ec0fd2b05584a5">LWIPERF_TCP_ABORTED_LOCAL_DATAERROR</a>, 
+<br />
+&#160;&#160;<a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a3d4e1f5742d80aeafb6b22aa74d93e40">LWIPERF_TCP_ABORTED_LOCAL_TXERROR</a>, 
+<a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6ae664c0f987584f07fb0f6f8896aada0d">LWIPERF_TCP_ABORTED_REMOTE</a>
+<br />
+ }</td></tr>
+<tr class="separator:ab72a2d205e43d5243a291f937bbc24d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3280e56eb41bd6f698a20843573f76c"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76c">lwiperf_client_type</a> { <a class="el" href="lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cae1862655ebaaea2e7e0261dff0173110">LWIPERF_CLIENT</a>, 
+<a class="el" href="lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cab0381feca6655968e7380622e7a63ede">LWIPERF_DUAL</a>, 
+<a class="el" href="lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76caccdab7ee6e1b0981861e66f0755f7964">LWIPERF_TRADEOFF</a>
+ }</td></tr>
+<tr class="separator:ab3280e56eb41bd6f698a20843573f76c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gad97bf77057e7f96d6d8def812deea202"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iperf.html#gad97bf77057e7f96d6d8def812deea202">lwiperf_start_tcp_server</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *local_addr, u16_t local_port, <a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf_report_fn</a> report_fn, void *report_arg)</td></tr>
+<tr class="separator:gad97bf77057e7f96d6d8def812deea202"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae1f30a02b86c4dd3d47810cd493baf26"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iperf.html#gae1f30a02b86c4dd3d47810cd493baf26">lwiperf_start_tcp_server_default</a> (<a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf_report_fn</a> report_fn, void *report_arg)</td></tr>
+<tr class="separator:gae1f30a02b86c4dd3d47810cd493baf26"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad8317f52289d8bb12a14627cd177a565"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iperf.html#gad8317f52289d8bb12a14627cd177a565">lwiperf_start_tcp_client</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *remote_addr, u16_t remote_port, enum <a class="el" href="lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76c">lwiperf_client_type</a> type, <a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf_report_fn</a> report_fn, void *report_arg)</td></tr>
+<tr class="separator:gad8317f52289d8bb12a14627cd177a565"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga85a487cf8ecbd0999382c9bff375d0da"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iperf.html#ga85a487cf8ecbd0999382c9bff375d0da">lwiperf_start_tcp_client_default</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *remote_addr, <a class="el" href="lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd">lwiperf_report_fn</a> report_fn, void *report_arg)</td></tr>
+<tr class="separator:ga85a487cf8ecbd0999382c9bff375d0da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac51c9c44a38bfa1140bd44b793a0a004"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004">lwiperf_abort</a> (void *lwiperf_session)</td></tr>
+<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>
+<div class="textblock"><p>lwIP iPerf server implementation </p>
+</div><h2 class="groupheader">Typedef Documentation</h2>
+<a id="a248ea47a58a14c6aecf6525217a812fd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a248ea47a58a14c6aecf6525217a812fd">&#9670;&nbsp;</a></span>lwiperf_report_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* lwiperf_report_fn) (void *arg, enum <a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6">lwiperf_report_type</a> report_type, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *local_addr, u16_t local_port, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *remote_addr, u16_t remote_port, u32_t bytes_transferred, u32_t ms_duration, u32_t bandwidth_kbitpsec)</td>
+        </tr>
+      </table>
+</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">report_type</td><td>contains the test result </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="ab3280e56eb41bd6f698a20843573f76c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab3280e56eb41bd6f698a20843573f76c">&#9670;&nbsp;</a></span>lwiperf_client_type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76c">lwiperf_client_type</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Control </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="ab3280e56eb41bd6f698a20843573f76cae1862655ebaaea2e7e0261dff0173110"></a>LWIPERF_CLIENT&#160;</td><td class="fielddoc"><p>Unidirectional tx only test </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ab3280e56eb41bd6f698a20843573f76cab0381feca6655968e7380622e7a63ede"></a>LWIPERF_DUAL&#160;</td><td class="fielddoc"><p>Do a bidirectional test simultaneously </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ab3280e56eb41bd6f698a20843573f76caccdab7ee6e1b0981861e66f0755f7964"></a>LWIPERF_TRADEOFF&#160;</td><td class="fielddoc"><p>Do a bidirectional test individually </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<a id="ab72a2d205e43d5243a291f937bbc24d6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab72a2d205e43d5243a291f937bbc24d6">&#9670;&nbsp;</a></span>lwiperf_report_type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6">lwiperf_report_type</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>lwIPerf test results </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="ab72a2d205e43d5243a291f937bbc24d6aa52255236ad2983346311ce7f28210e5"></a>LWIPERF_TCP_DONE_SERVER&#160;</td><td class="fielddoc"><p>The server side test is done </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ab72a2d205e43d5243a291f937bbc24d6a4f9bde0cad305eaab25d2c1d0196677b"></a>LWIPERF_TCP_DONE_CLIENT&#160;</td><td class="fielddoc"><p>The client side test is done </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ab72a2d205e43d5243a291f937bbc24d6abee2bf6da51a0845c15ac52b280203cb"></a>LWIPERF_TCP_ABORTED_LOCAL&#160;</td><td class="fielddoc"><p>Local error lead to test abort </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ab72a2d205e43d5243a291f937bbc24d6adda7e5dbaf1e04eb04ec0fd2b05584a5"></a>LWIPERF_TCP_ABORTED_LOCAL_DATAERROR&#160;</td><td class="fielddoc"><p>Data check error lead to test abort </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ab72a2d205e43d5243a291f937bbc24d6a3d4e1f5742d80aeafb6b22aa74d93e40"></a>LWIPERF_TCP_ABORTED_LOCAL_TXERROR&#160;</td><td class="fielddoc"><p>Transmit error lead to test abort </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ab72a2d205e43d5243a291f937bbc24d6ae664c0f987584f07fb0f6f8896aada0d"></a>LWIPERF_TCP_ABORTED_REMOTE&#160;</td><td class="fielddoc"><p>Remote side aborted the test </p>
+</td></tr>
+</table>
+
+</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="lwiperf_8h.html">lwiperf.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/lwiperf_8h.js b/doc/doxygen/output/html/lwiperf_8h.js
new file mode 100644
index 0000000..a8406f5
--- /dev/null
+++ b/doc/doxygen/output/html/lwiperf_8h.js
@@ -0,0 +1,22 @@
+var lwiperf_8h =
+[
+    [ "lwiperf_report_fn", "lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd", null ],
+    [ "lwiperf_client_type", "lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76c", [
+      [ "LWIPERF_CLIENT", "lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cae1862655ebaaea2e7e0261dff0173110", null ],
+      [ "LWIPERF_DUAL", "lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cab0381feca6655968e7380622e7a63ede", null ],
+      [ "LWIPERF_TRADEOFF", "lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76caccdab7ee6e1b0981861e66f0755f7964", null ]
+    ] ],
+    [ "lwiperf_report_type", "lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6", [
+      [ "LWIPERF_TCP_DONE_SERVER", "lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6aa52255236ad2983346311ce7f28210e5", null ],
+      [ "LWIPERF_TCP_DONE_CLIENT", "lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a4f9bde0cad305eaab25d2c1d0196677b", null ],
+      [ "LWIPERF_TCP_ABORTED_LOCAL", "lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6abee2bf6da51a0845c15ac52b280203cb", null ],
+      [ "LWIPERF_TCP_ABORTED_LOCAL_DATAERROR", "lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6adda7e5dbaf1e04eb04ec0fd2b05584a5", null ],
+      [ "LWIPERF_TCP_ABORTED_LOCAL_TXERROR", "lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a3d4e1f5742d80aeafb6b22aa74d93e40", null ],
+      [ "LWIPERF_TCP_ABORTED_REMOTE", "lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6ae664c0f987584f07fb0f6f8896aada0d", null ]
+    ] ],
+    [ "lwiperf_abort", "group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004", null ],
+    [ "lwiperf_start_tcp_client", "group__iperf.html#gad8317f52289d8bb12a14627cd177a565", null ],
+    [ "lwiperf_start_tcp_client_default", "group__iperf.html#ga85a487cf8ecbd0999382c9bff375d0da", null ],
+    [ "lwiperf_start_tcp_server", "group__iperf.html#gad97bf77057e7f96d6d8def812deea202", null ],
+    [ "lwiperf_start_tcp_server_default", "group__iperf.html#gae1f30a02b86c4dd3d47810cd493baf26", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mdns_8c.html b/doc/doxygen/output/html/mdns_8c.html
new file mode 100644
index 0000000..cf4857a
--- /dev/null
+++ b/doc/doxygen/output/html/mdns_8c.html
@@ -0,0 +1,349 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/mdns/mdns.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('mdns_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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.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="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="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 &lt;string.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 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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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="mdns_8c.html#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"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns_8c.html#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"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns_8c.html#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"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns_8c.html#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"><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: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"><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"><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"><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"><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: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: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"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns_8c.html#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="separator:a01f8850b9c2d2cd40ed77a1438c85bf1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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>
+</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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab72e48cf076afd1e3a08030d1d0bff9e">&#9670;&nbsp;</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> *&#160;</td>
+          <td class="paramname"><em>pbuf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>offset</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct mdns_domain *&#160;</td>
+          <td class="paramname"><em>domain</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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="a17db69fa887515374452b945e959bbf9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a17db69fa887515374452b945e959bbf9">&#9670;&nbsp;</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 *&#160;</td>
+          <td class="paramname"><em>domain</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>label</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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="a52d8f70432ae998814f16b18431213cd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a52d8f70432ae998814f16b18431213cd">&#9670;&nbsp;</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 *&#160;</td>
+          <td class="paramname"><em>a</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct mdns_domain *&#160;</td>
+          <td class="paramname"><em>b</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab5f49d9356a76879e0e6a14eb0643b23">&#9670;&nbsp;</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> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>offset</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct mdns_domain *&#160;</td>
+          <td class="paramname"><em>domain</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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="a01f8850b9c2d2cd40ed77a1438c85bf1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a01f8850b9c2d2cd40ed77a1438c85bf1">&#9670;&nbsp;</a></span>mdns_resp_register_name_result_cb()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <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>&#160;</td>
+          <td class="paramname"><em>cb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Register a callback function that is called if probing is completed successfully or with a conflict. </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_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_8c.html">mdns.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/mdns_8c.js b/doc/doxygen/output/html/mdns_8c.js
new file mode 100644
index 0000000..6fe4187
--- /dev/null
+++ b/doc/doxygen/output/html/mdns_8c.js
@@ -0,0 +1,23 @@
+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_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_init", "group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3", 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 ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mdns_8h.html b/doc/doxygen/output/html/mdns_8h.html
new file mode 100644
index 0000000..c0f269d
--- /dev/null
+++ b/doc/doxygen/output/html/mdns_8h.html
@@ -0,0 +1,197 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/mdns.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('mdns_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">mdns.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="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem: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>)&#160;&#160;&#160;<a class="el" href="group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85">mdns_resp_announce</a>(<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gab2edba12d5cad1949f7ca040ae12beec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a3b9ee5953214665e585e5bcaf6b8ea83"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns_8h.html#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"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns_8h.html#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>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns_8h.html#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="separator:a01f8850b9c2d2cd40ed77a1438c85bf1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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"><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"><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_userdata)</td></tr>
+<tr class="separator:ga824e992e94be216c8e059f48f49a59ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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: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: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"><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>
+</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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a19f12d7092de6fe90d5843e4ef8d4536">&#9670;&nbsp;</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>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Callback function to let application know the result of probing network for name 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 </p>
+
+</div>
+</div>
+<a id="a3b9ee5953214665e585e5bcaf6b8ea83"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3b9ee5953214665e585e5bcaf6b8ea83">&#9670;&nbsp;</a></span>service_get_txt_fn_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* service_get_txt_fn_t) (struct <a class="el" href="structmdns__service.html">mdns_service</a> *service, void *txt_userdata)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Callback function to add text to a reply, called when generating the reply </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a01f8850b9c2d2cd40ed77a1438c85bf1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a01f8850b9c2d2cd40ed77a1438c85bf1">&#9670;&nbsp;</a></span>mdns_resp_register_name_result_cb()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <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>&#160;</td>
+          <td class="paramname"><em>cb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Register a callback function that is called if probing is completed successfully or with a conflict. </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="dir_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="mdns_8h.html">mdns.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/mdns_8h.js b/doc/doxygen/output/html/mdns_8h.js
new file mode 100644
index 0000000..55f98e0
--- /dev/null
+++ b/doc/doxygen/output/html/mdns_8h.js
@@ -0,0 +1,17 @@
+var mdns_8h =
+[
+    [ "mdns_resp_netif_settings_changed", "group__mdns.html#gab2edba12d5cad1949f7ca040ae12beec", null ],
+    [ "mdns_name_result_cb_t", "mdns_8h.html#a19f12d7092de6fe90d5843e4ef8d4536", 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_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_init", "group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3", 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 ]
+];
\ 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
new file mode 100644
index 0000000..18393d6
--- /dev/null
+++ b/doc/doxygen/output/html/mdns__opts_8h.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/mdns_opts.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('mdns__opts_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">mdns_opts.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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem: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: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: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>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>MDNS responder </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_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="mdns__opts_8h.html">mdns_opts.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/mdns__opts_8h.js b/doc/doxygen/output/html/mdns__opts_8h.js
new file mode 100644
index 0000000..2205be4
--- /dev/null
+++ b/doc/doxygen/output/html/mdns__opts_8h.js
@@ -0,0 +1,6 @@
+var mdns__opts_8h =
+[
+    [ "MDNS_DEBUG", "group__mdns__opts.html#ga53a97502efdcf1214cab4078f93a6dc9", null ],
+    [ "MDNS_MAX_SERVICES", "group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6", 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__priv_8h.html b/doc/doxygen/output/html/mdns__priv_8h.html
new file mode 100644
index 0000000..adb9c5b
--- /dev/null
+++ b/doc/doxygen/output/html/mdns__priv_8h.html
@@ -0,0 +1,284 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/mdns_priv.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('mdns__priv_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<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 />
+<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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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="mdns__priv_8h.html#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"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns__priv_8h.html#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"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns__priv_8h.html#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"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns__priv_8h.html#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>
+</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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab72e48cf076afd1e3a08030d1d0bff9e">&#9670;&nbsp;</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> *&#160;</td>
+          <td class="paramname"><em>pbuf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>offset</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct mdns_domain *&#160;</td>
+          <td class="paramname"><em>domain</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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="a17db69fa887515374452b945e959bbf9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a17db69fa887515374452b945e959bbf9">&#9670;&nbsp;</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 *&#160;</td>
+          <td class="paramname"><em>domain</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>label</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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="a52d8f70432ae998814f16b18431213cd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a52d8f70432ae998814f16b18431213cd">&#9670;&nbsp;</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 *&#160;</td>
+          <td class="paramname"><em>a</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct mdns_domain *&#160;</td>
+          <td class="paramname"><em>b</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab5f49d9356a76879e0e6a14eb0643b23">&#9670;&nbsp;</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> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>offset</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct mdns_domain *&#160;</td>
+          <td class="paramname"><em>domain</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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>
+</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__priv_8h.html">mdns_priv.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/mdns__priv_8h.js b/doc/doxygen/output/html/mdns__priv_8h.js
new file mode 100644
index 0000000..0b24da8
--- /dev/null
+++ b/doc/doxygen/output/html/mdns__priv_8h.js
@@ -0,0 +1,7 @@
+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 ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mem_8c.html b/doc/doxygen/output/html/mem_8c.html
new file mode 100644
index 0000000..39fc49d
--- /dev/null
+++ b/doc/doxygen/output/html/mem_8c.html
@@ -0,0 +1,326 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/mem.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('mem_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">mem.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 &quot;<a class="el" href="mem_8h.html">lwip/mem.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="sys_8h.html">lwip/sys.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="err_8h.html">lwip/err.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 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="structmem.html">mem</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a278694c2333c9826f21ddd2c2d220f66"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mem_8c.html#a278694c2333c9826f21ddd2c2d220f66">MIN_SIZE</a>&#160;&#160;&#160;12</td></tr>
+<tr class="separator:a278694c2333c9826f21ddd2c2d220f66"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a44a136e3b70c36abb6f8dc060c778113"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mem_8c.html#a44a136e3b70c36abb6f8dc060c778113">mem_init</a> (void)</td></tr>
+<tr class="separator:a44a136e3b70c36abb6f8dc060c778113"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a65169147c44e9db60d997819af9b455c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mem_8c.html#a65169147c44e9db60d997819af9b455c">mem_free</a> (void *rmem)</td></tr>
+<tr class="separator:a65169147c44e9db60d997819af9b455c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e6b7f11bb50bead9b35515d9a517124"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mem_8c.html#a7e6b7f11bb50bead9b35515d9a517124">mem_trim</a> (void *rmem, mem_size_t new_size)</td></tr>
+<tr class="separator:a7e6b7f11bb50bead9b35515d9a517124"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af418ade27d91d41e6143dba2cc246b0f"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mem_8c.html#af418ade27d91d41e6143dba2cc246b0f">mem_malloc</a> (mem_size_t size_in)</td></tr>
+<tr class="separator:af418ade27d91d41e6143dba2cc246b0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab0bdc525971701883f2065e7fb257a24"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mem_8c.html#ab0bdc525971701883f2065e7fb257a24">mem_calloc</a> (mem_size_t count, mem_size_t size)</td></tr>
+<tr class="separator:ab0bdc525971701883f2065e7fb257a24"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a6da602f2bbf1d555556f9260b3b8ad5f"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mem_8c.html#a6da602f2bbf1d555556f9260b3b8ad5f">ram_heap</a> [((((((1600)+1 - 1U) &amp;~(1 -1U))+(2U *(((sizeof(struct mem))+1 - 1U) &amp;~(1 -1U))))+1 - 1U))]</td></tr>
+<tr class="separator:a6da602f2bbf1d555556f9260b3b8ad5f"><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 memory manager</p>
+<p>This is a lightweight replacement for the standard C library malloc().</p>
+<p>If you want to use the standard C library malloc() instead, define MEM_LIBC_MALLOC to 1 in your lwipopts.h</p>
+<p>To let <a class="el" href="mem_8c.html#af418ade27d91d41e6143dba2cc246b0f">mem_malloc()</a> use pools (prevents fragmentation and is much faster than a heap but might waste some memory), define MEM_USE_POOLS to 1, define MEMP_USE_CUSTOM_POOLS to 1 and create a file "lwippools.h" that includes a list of pools like this (more pools can be added between _START and _END):</p>
+<p>Define three pools with sizes 256, 512, and 1512 bytes LWIP_MALLOC_MEMPOOL_START LWIP_MALLOC_MEMPOOL(20, 256) LWIP_MALLOC_MEMPOOL(10, 512) LWIP_MALLOC_MEMPOOL(5, 1512) LWIP_MALLOC_MEMPOOL_END </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a278694c2333c9826f21ddd2c2d220f66"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a278694c2333c9826f21ddd2c2d220f66">&#9670;&nbsp;</a></span>MIN_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MIN_SIZE&#160;&#160;&#160;12</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>All allocated blocks will be MIN_SIZE bytes big, at least! MIN_SIZE can be overridden to suit your needs. Smaller values save space, larger values could prevent too small blocks to fragment the RAM too much. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ab0bdc525971701883f2065e7fb257a24"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab0bdc525971701883f2065e7fb257a24">&#9670;&nbsp;</a></span>mem_calloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* mem_calloc </td>
+          <td>(</td>
+          <td class="paramtype">mem_size_t&#160;</td>
+          <td class="paramname"><em>count</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">mem_size_t&#160;</td>
+          <td class="paramname"><em>size</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Contiguously allocates enough space for count objects that are size bytes of memory each and returns a pointer to the allocated memory.</p>
+<p>The allocated memory is filled with bytes of value zero.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">count</td><td>number of objects to allocate </td></tr>
+    <tr><td class="paramname">size</td><td>size of the objects to allocate </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to allocated memory / NULL pointer if there is an error </dd></dl>
+
+</div>
+</div>
+<a id="a65169147c44e9db60d997819af9b455c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a65169147c44e9db60d997819af9b455c">&#9670;&nbsp;</a></span>mem_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mem_free </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>rmem</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Put a struct mem back on the heap</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">rmem</td><td>is the data portion of a struct mem as returned by a previous call to <a class="el" href="mem_8c.html#af418ade27d91d41e6143dba2cc246b0f">mem_malloc()</a> </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a44a136e3b70c36abb6f8dc060c778113"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a44a136e3b70c36abb6f8dc060c778113">&#9670;&nbsp;</a></span>mem_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mem_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Zero the heap and initialize start, end and lowest-free </p>
+
+</div>
+</div>
+<a id="af418ade27d91d41e6143dba2cc246b0f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af418ade27d91d41e6143dba2cc246b0f">&#9670;&nbsp;</a></span>mem_malloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* mem_malloc </td>
+          <td>(</td>
+          <td class="paramtype">mem_size_t&#160;</td>
+          <td class="paramname"><em>size_in</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocate a block of memory with a minimum of 'size' bytes.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">size_in</td><td>is the minimum size of the requested block in bytes. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to allocated memory or NULL if no free memory was found.</dd></dl>
+<p>Note that the returned value will always be aligned (as defined by MEM_ALIGNMENT). </p>
+
+</div>
+</div>
+<a id="a7e6b7f11bb50bead9b35515d9a517124"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7e6b7f11bb50bead9b35515d9a517124">&#9670;&nbsp;</a></span>mem_trim()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* mem_trim </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>rmem</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">mem_size_t&#160;</td>
+          <td class="paramname"><em>new_size</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Shrink memory returned by <a class="el" href="mem_8c.html#af418ade27d91d41e6143dba2cc246b0f">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">new_size</td><td>required size after shrinking (needs to be smaller than or equal to the previous size) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>for compatibility reasons: is always == rmem, at the moment or NULL if newsize is &gt; old size, in which case rmem is NOT touched or freed! </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="a6da602f2bbf1d555556f9260b3b8ad5f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6da602f2bbf1d555556f9260b3b8ad5f">&#9670;&nbsp;</a></span>ram_heap</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t ram_heap[(((((( 1600)+ 1 - 1U) &amp;~(1 -1U))+(2U *(((sizeof(struct mem))+ 1 - 1U) &amp;~(1 -1U))))+ 1 - 1U))]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If you want to relocate the heap to external memory, simply define LWIP_RAM_HEAP_POINTER as a void-pointer to that location. If so, make sure the memory at that location is big enough (see below on how that space is calculated). the heap. we need one struct mem at the end and some room for alignment </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="mem_8c.html">mem.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/mem_8c.js b/doc/doxygen/output/html/mem_8c.js
new file mode 100644
index 0000000..3e21d62
--- /dev/null
+++ b/doc/doxygen/output/html/mem_8c.js
@@ -0,0 +1,11 @@
+var mem_8c =
+[
+    [ "mem", "structmem.html", "structmem" ],
+    [ "MIN_SIZE", "mem_8c.html#a278694c2333c9826f21ddd2c2d220f66", null ],
+    [ "mem_calloc", "mem_8c.html#ab0bdc525971701883f2065e7fb257a24", null ],
+    [ "mem_free", "mem_8c.html#a65169147c44e9db60d997819af9b455c", null ],
+    [ "mem_init", "mem_8c.html#a44a136e3b70c36abb6f8dc060c778113", null ],
+    [ "mem_malloc", "mem_8c.html#af418ade27d91d41e6143dba2cc246b0f", null ],
+    [ "mem_trim", "mem_8c.html#a7e6b7f11bb50bead9b35515d9a517124", null ],
+    [ "ram_heap", "mem_8c.html#a6da602f2bbf1d555556f9260b3b8ad5f", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mem_8h.html b/doc/doxygen/output/html/mem_8h.html
new file mode 100644
index 0000000..98cf2cd
--- /dev/null
+++ b/doc/doxygen/output/html/mem_8h.html
@@ -0,0 +1,266 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/mem.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('mem_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">mem.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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a44a136e3b70c36abb6f8dc060c778113"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mem_8h.html#a44a136e3b70c36abb6f8dc060c778113">mem_init</a> (void)</td></tr>
+<tr class="separator:a44a136e3b70c36abb6f8dc060c778113"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5e39a108c44d8a72df0b30a117cb62e4"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mem_8h.html#a5e39a108c44d8a72df0b30a117cb62e4">mem_trim</a> (void *<a class="el" href="structmem.html">mem</a>, mem_size_t size)</td></tr>
+<tr class="separator:a5e39a108c44d8a72df0b30a117cb62e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a932aa40d85b14cb7331625e012d12335"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mem_8h.html#a932aa40d85b14cb7331625e012d12335">mem_malloc</a> (mem_size_t size)</td></tr>
+<tr class="separator:a932aa40d85b14cb7331625e012d12335"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab0bdc525971701883f2065e7fb257a24"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mem_8h.html#ab0bdc525971701883f2065e7fb257a24">mem_calloc</a> (mem_size_t count, mem_size_t size)</td></tr>
+<tr class="separator:ab0bdc525971701883f2065e7fb257a24"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2fd7aa1adf6e394d3be7c7734e7df41a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mem_8h.html#a2fd7aa1adf6e394d3be7c7734e7df41a">mem_free</a> (void *<a class="el" href="structmem.html">mem</a>)</td></tr>
+<tr class="separator:a2fd7aa1adf6e394d3be7c7734e7df41a"><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>Heap API </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ab0bdc525971701883f2065e7fb257a24"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab0bdc525971701883f2065e7fb257a24">&#9670;&nbsp;</a></span>mem_calloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* mem_calloc </td>
+          <td>(</td>
+          <td class="paramtype">mem_size_t&#160;</td>
+          <td class="paramname"><em>count</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">mem_size_t&#160;</td>
+          <td class="paramname"><em>size</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Contiguously allocates enough space for count objects that are size bytes of memory each and returns a pointer to the allocated memory.</p>
+<p>The allocated memory is filled with bytes of value zero.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">count</td><td>number of objects to allocate </td></tr>
+    <tr><td class="paramname">size</td><td>size of the objects to allocate </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to allocated memory / NULL pointer if there is an error </dd></dl>
+
+</div>
+</div>
+<a id="a2fd7aa1adf6e394d3be7c7734e7df41a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2fd7aa1adf6e394d3be7c7734e7df41a">&#9670;&nbsp;</a></span>mem_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mem_free </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>rmem</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Put a struct mem back on the heap</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">rmem</td><td>is the data portion of a struct mem as returned by a previous call to <a class="el" href="mem_8c.html#af418ade27d91d41e6143dba2cc246b0f">mem_malloc()</a> </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a44a136e3b70c36abb6f8dc060c778113"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a44a136e3b70c36abb6f8dc060c778113">&#9670;&nbsp;</a></span>mem_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mem_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Zero the heap and initialize start, end and lowest-free </p>
+
+</div>
+</div>
+<a id="a932aa40d85b14cb7331625e012d12335"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a932aa40d85b14cb7331625e012d12335">&#9670;&nbsp;</a></span>mem_malloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* mem_malloc </td>
+          <td>(</td>
+          <td class="paramtype">mem_size_t&#160;</td>
+          <td class="paramname"><em>size_in</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocate a block of memory with a minimum of 'size' bytes.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">size_in</td><td>is the minimum size of the requested block in bytes. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>pointer to allocated memory or NULL if no free memory was found.</dd></dl>
+<p>Note that the returned value will always be aligned (as defined by MEM_ALIGNMENT). </p>
+
+</div>
+</div>
+<a id="a5e39a108c44d8a72df0b30a117cb62e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5e39a108c44d8a72df0b30a117cb62e4">&#9670;&nbsp;</a></span>mem_trim()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* mem_trim </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>rmem</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">mem_size_t&#160;</td>
+          <td class="paramname"><em>new_size</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Shrink memory returned by <a class="el" href="mem_8c.html#af418ade27d91d41e6143dba2cc246b0f">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">new_size</td><td>required size after shrinking (needs to be smaller than or equal to the previous size) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>for compatibility reasons: is always == rmem, at the moment or NULL if newsize is &gt; old size, in which case rmem is NOT touched or freed! </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="mem_8h.html">mem.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/mem_8h.js b/doc/doxygen/output/html/mem_8h.js
new file mode 100644
index 0000000..c692acf
--- /dev/null
+++ b/doc/doxygen/output/html/mem_8h.js
@@ -0,0 +1,8 @@
+var mem_8h =
+[
+    [ "mem_calloc", "mem_8h.html#ab0bdc525971701883f2065e7fb257a24", null ],
+    [ "mem_free", "mem_8h.html#a2fd7aa1adf6e394d3be7c7734e7df41a", null ],
+    [ "mem_init", "mem_8h.html#a44a136e3b70c36abb6f8dc060c778113", null ],
+    [ "mem_malloc", "mem_8h.html#a932aa40d85b14cb7331625e012d12335", null ],
+    [ "mem_trim", "mem_8h.html#a5e39a108c44d8a72df0b30a117cb62e4", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mem__priv_8h.html b/doc/doxygen/output/html/mem__priv_8h.html
new file mode 100644
index 0000000..cf90dbf
--- /dev/null
+++ b/doc/doxygen/output/html/mem__priv_8h.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/priv/mem_priv.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('mem__priv_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">mem_priv.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="mem_8h.html">lwip/mem.h</a>&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>lwIP internal memory implementations (do not use in application code) </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_460c501b2432fc107adcb38111835e48.html">priv</a></li><li class="navelem"><a class="el" href="mem__priv_8h.html">mem_priv.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/memp_8c.html b/doc/doxygen/output/html/memp_8c.html
new file mode 100644
index 0000000..5e875f9
--- /dev/null
+++ b/doc/doxygen/output/html/memp_8c.html
@@ -0,0 +1,319 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/memp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('memp_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">memp.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 &quot;<a class="el" href="memp_8h.html">lwip/memp.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="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</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="raw_8h.html">lwip/raw.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="tcp_8h.html">lwip/tcp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tcp__priv_8h.html">lwip/priv/tcp_priv.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="ip4__frag_8h.html">lwip/ip4_frag.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="netbuf_8h.html">lwip/netbuf.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="api_8h.html">lwip/api.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tcpip__priv_8h.html">lwip/priv/tcpip_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="api__msg_8h.html">lwip/priv/api_msg.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="sockets__priv_8h.html">lwip/priv/sockets_priv.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="igmp_8h.html">lwip/igmp.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;netif/ppp/ppp_opts.h&quot;</code><br />
+<code>#include &quot;<a class="el" href="lwip_2netdb_8h.html">lwip/netdb.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__priv_8h.html">lwip/priv/nd6_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__frag_8h.html">lwip/ip6_frag.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="memp__std_8h.html">lwip/priv/memp_std.h</a>&quot;</code><br />
+<code>#include &quot;path/to/my/lwip_hooks.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6416303426d05526bed33f241fa6ecd7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="memp_8c.html#a6416303426d05526bed33f241fa6ecd7">memp_init_pool</a> (const struct <a class="el" href="structmemp__desc.html">memp_desc</a> *desc)</td></tr>
+<tr class="separator:a6416303426d05526bed33f241fa6ecd7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9693e5b1ac2c6b9c0e7870522d45efa2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="memp_8c.html#a9693e5b1ac2c6b9c0e7870522d45efa2">memp_init</a> (void)</td></tr>
+<tr class="separator:a9693e5b1ac2c6b9c0e7870522d45efa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a348c83ee972f1edf7296a1cdf1d75f22"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="memp_8c.html#a348c83ee972f1edf7296a1cdf1d75f22">memp_malloc_pool</a> (const struct <a class="el" href="structmemp__desc.html">memp_desc</a> *desc)</td></tr>
+<tr class="separator:a348c83ee972f1edf7296a1cdf1d75f22"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b00593d086313c267b54a976bf67aa5"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="memp_8c.html#a2b00593d086313c267b54a976bf67aa5">memp_malloc</a> (<a class="el" href="memp_8h.html#a85a164b1f7764951cc685ea525114e57">memp_t</a> type)</td></tr>
+<tr class="separator:a2b00593d086313c267b54a976bf67aa5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62f8c3c907743e34eee3cdac7fa1eaa5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="memp_8c.html#a62f8c3c907743e34eee3cdac7fa1eaa5">memp_free_pool</a> (const struct <a class="el" href="structmemp__desc.html">memp_desc</a> *desc, void *<a class="el" href="structmem.html">mem</a>)</td></tr>
+<tr class="separator:a62f8c3c907743e34eee3cdac7fa1eaa5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aecd94926b7c2a0e23ae195f4ae97581f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="memp_8c.html#aecd94926b7c2a0e23ae195f4ae97581f">memp_free</a> (<a class="el" href="memp_8h.html#a85a164b1f7764951cc685ea525114e57">memp_t</a> type, void *<a class="el" href="structmem.html">mem</a>)</td></tr>
+<tr class="separator:aecd94926b7c2a0e23ae195f4ae97581f"><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 pool memory manager</p>
+<p>lwIP has dedicated pools for many structures (netconn, protocol control blocks, packet buffers, ...). All these pools are managed here. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="aecd94926b7c2a0e23ae195f4ae97581f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aecd94926b7c2a0e23ae195f4ae97581f">&#9670;&nbsp;</a></span>memp_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void memp_free </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="memp_8h.html#a85a164b1f7764951cc685ea525114e57">memp_t</a>&#160;</td>
+          <td class="paramname"><em>type</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>mem</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Put an element back into its pool.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">type</td><td>the pool where to put mem </td></tr>
+    <tr><td class="paramname">mem</td><td>the memp element to free </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a62f8c3c907743e34eee3cdac7fa1eaa5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62f8c3c907743e34eee3cdac7fa1eaa5">&#9670;&nbsp;</a></span>memp_free_pool()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void memp_free_pool </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structmemp__desc.html">memp_desc</a> *&#160;</td>
+          <td class="paramname"><em>desc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>mem</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Put a custom pool element back into its pool.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">desc</td><td>the pool where to put mem </td></tr>
+    <tr><td class="paramname">mem</td><td>the memp element to free </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a9693e5b1ac2c6b9c0e7870522d45efa2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9693e5b1ac2c6b9c0e7870522d45efa2">&#9670;&nbsp;</a></span>memp_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void memp_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initializes lwIP built-in pools. Related functions: memp_malloc, memp_free</p>
+<p>Carves out memp_memory into linked lists for each pool-type. </p>
+
+</div>
+</div>
+<a id="a6416303426d05526bed33f241fa6ecd7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6416303426d05526bed33f241fa6ecd7">&#9670;&nbsp;</a></span>memp_init_pool()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void memp_init_pool </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structmemp__desc.html">memp_desc</a> *&#160;</td>
+          <td class="paramname"><em>desc</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize custom memory pool. Related functions: memp_malloc_pool, memp_free_pool</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">desc</td><td>pool to initialize </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a2b00593d086313c267b54a976bf67aa5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2b00593d086313c267b54a976bf67aa5">&#9670;&nbsp;</a></span>memp_malloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* memp_malloc </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="memp_8h.html#a85a164b1f7764951cc685ea525114e57">memp_t</a>&#160;</td>
+          <td class="paramname"><em>type</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get an element from a specific pool.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">type</td><td>the pool to get an element from</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory or a NULL pointer on error </dd></dl>
+
+</div>
+</div>
+<a id="a348c83ee972f1edf7296a1cdf1d75f22"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a348c83ee972f1edf7296a1cdf1d75f22">&#9670;&nbsp;</a></span>memp_malloc_pool()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* memp_malloc_pool </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structmemp__desc.html">memp_desc</a> *&#160;</td>
+          <td class="paramname"><em>desc</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get an element from a custom pool.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">desc</td><td>the pool to get an element from</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory or a NULL pointer on error </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_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li><li class="navelem"><a class="el" href="memp_8c.html">memp.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/memp_8c.js b/doc/doxygen/output/html/memp_8c.js
new file mode 100644
index 0000000..ccad34d
--- /dev/null
+++ b/doc/doxygen/output/html/memp_8c.js
@@ -0,0 +1,9 @@
+var memp_8c =
+[
+    [ "memp_free", "memp_8c.html#aecd94926b7c2a0e23ae195f4ae97581f", null ],
+    [ "memp_free_pool", "memp_8c.html#a62f8c3c907743e34eee3cdac7fa1eaa5", null ],
+    [ "memp_init", "memp_8c.html#a9693e5b1ac2c6b9c0e7870522d45efa2", null ],
+    [ "memp_init_pool", "memp_8c.html#a6416303426d05526bed33f241fa6ecd7", null ],
+    [ "memp_malloc", "memp_8c.html#a2b00593d086313c267b54a976bf67aa5", null ],
+    [ "memp_malloc_pool", "memp_8c.html#a348c83ee972f1edf7296a1cdf1d75f22", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/memp_8h.html b/doc/doxygen/output/html/memp_8h.html
new file mode 100644
index 0000000..650c397
--- /dev/null
+++ b/doc/doxygen/output/html/memp_8h.html
@@ -0,0 +1,238 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/memp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('memp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">memp.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="memp__std_8h.html">lwip/priv/memp_std.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="memp__priv_8h.html">lwip/priv/memp_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga92fc8c29d0e2654f2a2ecc43b2b7fb13"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mempool.html#ga92fc8c29d0e2654f2a2ecc43b2b7fb13">LWIP_MEMPOOL_PROTOTYPE</a>(name)&#160;&#160;&#160;extern const struct <a class="el" href="structmemp__desc.html">memp_desc</a> memp_ ## name</td></tr>
+<tr class="separator:ga92fc8c29d0e2654f2a2ecc43b2b7fb13"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5b1fb3ce7942432d87cc948b1c5ed6cb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mempool.html#ga5b1fb3ce7942432d87cc948b1c5ed6cb">LWIP_MEMPOOL_DECLARE</a>(name,  num,  size,  desc)</td></tr>
+<tr class="separator:ga5b1fb3ce7942432d87cc948b1c5ed6cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga60b51c06d276f525b35d8b7abd4dcb41"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mempool.html#ga60b51c06d276f525b35d8b7abd4dcb41">LWIP_MEMPOOL_INIT</a>(name)&#160;&#160;&#160;<a class="el" href="memp__priv_8h.html#a6416303426d05526bed33f241fa6ecd7">memp_init_pool</a>(&amp;memp_ ## name)</td></tr>
+<tr class="separator:ga60b51c06d276f525b35d8b7abd4dcb41"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5e2498f6c17746c1fe7153de5f7f275a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mempool.html#ga5e2498f6c17746c1fe7153de5f7f275a">LWIP_MEMPOOL_ALLOC</a>(name)&#160;&#160;&#160;<a class="el" href="memp__priv_8h.html#a348c83ee972f1edf7296a1cdf1d75f22">memp_malloc_pool</a>(&amp;memp_ ## name)</td></tr>
+<tr class="separator:ga5e2498f6c17746c1fe7153de5f7f275a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa43d114dd702fbd8f1db18474ea93a04"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mempool.html#gaa43d114dd702fbd8f1db18474ea93a04">LWIP_MEMPOOL_FREE</a>(name,  x)&#160;&#160;&#160;<a class="el" href="memp__priv_8h.html#a62f8c3c907743e34eee3cdac7fa1eaa5">memp_free_pool</a>(&amp;memp_ ## name, (x))</td></tr>
+<tr class="separator:gaa43d114dd702fbd8f1db18474ea93a04"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:a85a164b1f7764951cc685ea525114e57"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="memp_8h.html#a85a164b1f7764951cc685ea525114e57">memp_t</a> </td></tr>
+<tr class="separator:a85a164b1f7764951cc685ea525114e57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9693e5b1ac2c6b9c0e7870522d45efa2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="memp_8h.html#a9693e5b1ac2c6b9c0e7870522d45efa2">memp_init</a> (void)</td></tr>
+<tr class="separator:a9693e5b1ac2c6b9c0e7870522d45efa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b00593d086313c267b54a976bf67aa5"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="memp_8h.html#a2b00593d086313c267b54a976bf67aa5">memp_malloc</a> (<a class="el" href="memp_8h.html#a85a164b1f7764951cc685ea525114e57">memp_t</a> type)</td></tr>
+<tr class="separator:a2b00593d086313c267b54a976bf67aa5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aecd94926b7c2a0e23ae195f4ae97581f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="memp_8h.html#aecd94926b7c2a0e23ae195f4ae97581f">memp_free</a> (<a class="el" href="memp_8h.html#a85a164b1f7764951cc685ea525114e57">memp_t</a> type, void *<a class="el" href="structmem.html">mem</a>)</td></tr>
+<tr class="separator:aecd94926b7c2a0e23ae195f4ae97581f"><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>Memory pool API</p>
+<p>lwIP internal memory pools (do not use in application code) This file is deliberately included multiple times: once with empty definition of LWIP_MEMPOOL() to handle all includes and multiple times to build up various lists of mem pools. </p>
+</div><h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="a85a164b1f7764951cc685ea525114e57"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a85a164b1f7764951cc685ea525114e57">&#9670;&nbsp;</a></span>memp_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="memp_8h.html#a85a164b1f7764951cc685ea525114e57">memp_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create the list of all memory pools managed by memp. MEMP_MAX represents a NULL pool at the end </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="aecd94926b7c2a0e23ae195f4ae97581f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aecd94926b7c2a0e23ae195f4ae97581f">&#9670;&nbsp;</a></span>memp_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void memp_free </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="memp_8h.html#a85a164b1f7764951cc685ea525114e57">memp_t</a>&#160;</td>
+          <td class="paramname"><em>type</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>mem</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Put an element back into its pool.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">type</td><td>the pool where to put mem </td></tr>
+    <tr><td class="paramname">mem</td><td>the memp element to free </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a9693e5b1ac2c6b9c0e7870522d45efa2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9693e5b1ac2c6b9c0e7870522d45efa2">&#9670;&nbsp;</a></span>memp_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void memp_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initializes lwIP built-in pools. Related functions: memp_malloc, memp_free</p>
+<p>Carves out memp_memory into linked lists for each pool-type. </p>
+
+</div>
+</div>
+<a id="a2b00593d086313c267b54a976bf67aa5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2b00593d086313c267b54a976bf67aa5">&#9670;&nbsp;</a></span>memp_malloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* memp_malloc </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="memp_8h.html#a85a164b1f7764951cc685ea525114e57">memp_t</a>&#160;</td>
+          <td class="paramname"><em>type</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get an element from a specific pool.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">type</td><td>the pool to get an element from</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory or a NULL pointer on error </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="memp_8h.html">memp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/memp_8h.js b/doc/doxygen/output/html/memp_8h.js
new file mode 100644
index 0000000..0425ca6
--- /dev/null
+++ b/doc/doxygen/output/html/memp_8h.js
@@ -0,0 +1,12 @@
+var memp_8h =
+[
+    [ "LWIP_MEMPOOL_ALLOC", "group__mempool.html#ga5e2498f6c17746c1fe7153de5f7f275a", null ],
+    [ "LWIP_MEMPOOL_DECLARE", "group__mempool.html#ga5b1fb3ce7942432d87cc948b1c5ed6cb", null ],
+    [ "LWIP_MEMPOOL_FREE", "group__mempool.html#gaa43d114dd702fbd8f1db18474ea93a04", null ],
+    [ "LWIP_MEMPOOL_INIT", "group__mempool.html#ga60b51c06d276f525b35d8b7abd4dcb41", null ],
+    [ "LWIP_MEMPOOL_PROTOTYPE", "group__mempool.html#ga92fc8c29d0e2654f2a2ecc43b2b7fb13", null ],
+    [ "memp_t", "memp_8h.html#a85a164b1f7764951cc685ea525114e57", null ],
+    [ "memp_free", "memp_8h.html#aecd94926b7c2a0e23ae195f4ae97581f", null ],
+    [ "memp_init", "memp_8h.html#a9693e5b1ac2c6b9c0e7870522d45efa2", null ],
+    [ "memp_malloc", "memp_8h.html#a2b00593d086313c267b54a976bf67aa5", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/memp__priv_8h.html b/doc/doxygen/output/html/memp__priv_8h.html
new file mode 100644
index 0000000..950904e
--- /dev/null
+++ b/doc/doxygen/output/html/memp__priv_8h.html
@@ -0,0 +1,211 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/priv/memp_priv.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('memp__priv_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">memp_priv.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="mem_8h.html">lwip/mem.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mem__priv_8h.html">lwip/priv/mem_priv.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structmemp__desc.html">memp_desc</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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6416303426d05526bed33f241fa6ecd7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="memp__priv_8h.html#a6416303426d05526bed33f241fa6ecd7">memp_init_pool</a> (const struct <a class="el" href="structmemp__desc.html">memp_desc</a> *desc)</td></tr>
+<tr class="separator:a6416303426d05526bed33f241fa6ecd7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a348c83ee972f1edf7296a1cdf1d75f22"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="memp__priv_8h.html#a348c83ee972f1edf7296a1cdf1d75f22">memp_malloc_pool</a> (const struct <a class="el" href="structmemp__desc.html">memp_desc</a> *desc)</td></tr>
+<tr class="separator:a348c83ee972f1edf7296a1cdf1d75f22"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62f8c3c907743e34eee3cdac7fa1eaa5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="memp__priv_8h.html#a62f8c3c907743e34eee3cdac7fa1eaa5">memp_free_pool</a> (const struct <a class="el" href="structmemp__desc.html">memp_desc</a> *desc, void *<a class="el" href="structmem.html">mem</a>)</td></tr>
+<tr class="separator:a62f8c3c907743e34eee3cdac7fa1eaa5"><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>memory pools lwIP internal implementations (do not use in application code) </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a62f8c3c907743e34eee3cdac7fa1eaa5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62f8c3c907743e34eee3cdac7fa1eaa5">&#9670;&nbsp;</a></span>memp_free_pool()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void memp_free_pool </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structmemp__desc.html">memp_desc</a> *&#160;</td>
+          <td class="paramname"><em>desc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>mem</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Put a custom pool element back into its pool.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">desc</td><td>the pool where to put mem </td></tr>
+    <tr><td class="paramname">mem</td><td>the memp element to free </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a6416303426d05526bed33f241fa6ecd7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6416303426d05526bed33f241fa6ecd7">&#9670;&nbsp;</a></span>memp_init_pool()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void memp_init_pool </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structmemp__desc.html">memp_desc</a> *&#160;</td>
+          <td class="paramname"><em>desc</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize custom memory pool. Related functions: memp_malloc_pool, memp_free_pool</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">desc</td><td>pool to initialize </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a348c83ee972f1edf7296a1cdf1d75f22"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a348c83ee972f1edf7296a1cdf1d75f22">&#9670;&nbsp;</a></span>memp_malloc_pool()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* memp_malloc_pool </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structmemp__desc.html">memp_desc</a> *&#160;</td>
+          <td class="paramname"><em>desc</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get an element from a custom pool.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">desc</td><td>the pool to get an element from</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory or a NULL pointer on error </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_460c501b2432fc107adcb38111835e48.html">priv</a></li><li class="navelem"><a class="el" href="memp__priv_8h.html">memp_priv.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/memp__priv_8h.js b/doc/doxygen/output/html/memp__priv_8h.js
new file mode 100644
index 0000000..1a32a1c
--- /dev/null
+++ b/doc/doxygen/output/html/memp__priv_8h.js
@@ -0,0 +1,7 @@
+var memp__priv_8h =
+[
+    [ "memp_desc", "structmemp__desc.html", "structmemp__desc" ],
+    [ "memp_free_pool", "memp__priv_8h.html#a62f8c3c907743e34eee3cdac7fa1eaa5", null ],
+    [ "memp_init_pool", "memp__priv_8h.html#a6416303426d05526bed33f241fa6ecd7", null ],
+    [ "memp_malloc_pool", "memp__priv_8h.html#a348c83ee972f1edf7296a1cdf1d75f22", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/memp__std_8h.html b/doc/doxygen/output/html/memp__std_8h.html
new file mode 100644
index 0000000..5de0c32
--- /dev/null
+++ b/doc/doxygen/output/html/memp__std_8h.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/priv/memp_std.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('memp__std_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">memp_std.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>lwIP internal memory pools (do not use in application code) This file is deliberately included multiple times: once with empty definition of LWIP_MEMPOOL() to handle all includes and multiple times to build up various lists of mem pools. </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_460c501b2432fc107adcb38111835e48.html">priv</a></li><li class="navelem"><a class="el" href="memp__std_8h.html">memp_std.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/menu.js b/doc/doxygen/output/html/menu.js
new file mode 100644
index 0000000..97db4c2
--- /dev/null
+++ b/doc/doxygen/output/html/menu.js
@@ -0,0 +1,26 @@
+function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
+  function makeTree(data,relPath) {
+    var result='';
+    if ('children' in data) {
+      result+='<ul>';
+      for (var i in data.children) {
+        result+='<li><a href="'+relPath+data.children[i].url+'">'+
+                                data.children[i].text+'</a>'+
+                                makeTree(data.children[i],relPath)+'</li>';
+      }
+      result+='</ul>';
+    }
+    return result;
+  }
+
+  $('#main-nav').append(makeTree(menudata,relPath));
+  $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
+  if (searchEnabled) {
+    if (serverSide) {
+      $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.png" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>');
+    } else {
+      $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/><input type="text" id="MSearchField" value="'+search+'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/></span><span class="right"><a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="'+relPath+'search/close.png" alt=""/></a></span></div></li>');
+    }
+  }
+  $('#main-menu').smartmenus();
+}
diff --git a/doc/doxygen/output/html/menudata.js b/doc/doxygen/output/html/menudata.js
new file mode 100644
index 0000000..965ee24
--- /dev/null
+++ b/doc/doxygen/output/html/menudata.js
@@ -0,0 +1,160 @@
+var menudata={children:[
+{text:"Main Page",url:"index.html"},
+{text:"Related Pages",url:"pages.html"},
+{text:"Modules",url:"modules.html"},
+{text:"Data Structures",url:"annotated.html",children:[
+{text:"Data Structures",url:"annotated.html"},
+{text:"Data Fields",url:"functions.html",children:[
+{text:"All",url:"functions.html",children:[
+{text:"_",url:"functions.html#index__"},
+{text:"a",url:"functions_a.html#index_a"},
+{text:"b",url:"functions_b.html#index_b"},
+{text:"c",url:"functions_c.html#index_c"},
+{text:"d",url:"functions_d.html#index_d"},
+{text:"e",url:"functions_e.html#index_e"},
+{text:"f",url:"functions_f.html#index_f"},
+{text:"g",url:"functions_g.html#index_g"},
+{text:"h",url:"functions_h.html#index_h"},
+{text:"i",url:"functions_i.html#index_i"},
+{text:"j",url:"functions_j.html#index_j"},
+{text:"k",url:"functions_k.html#index_k"},
+{text:"l",url:"functions_l.html#index_l"},
+{text:"m",url:"functions_m.html#index_m"},
+{text:"n",url:"functions_n.html#index_n"},
+{text:"o",url:"functions_o.html#index_o"},
+{text:"p",url:"functions_p.html#index_p"},
+{text:"q",url:"functions_q.html#index_q"},
+{text:"r",url:"functions_r.html#index_r"},
+{text:"s",url:"functions_s.html#index_s"},
+{text:"t",url:"functions_t.html#index_t"},
+{text:"u",url:"functions_u.html#index_u"},
+{text:"v",url:"functions_v.html#index_v"},
+{text:"w",url:"functions_w.html#index_w"},
+{text:"z",url:"functions_z.html#index_z"}]},
+{text:"Variables",url:"functions_vars.html",children:[
+{text:"_",url:"functions_vars.html#index__"},
+{text:"a",url:"functions_vars_a.html#index_a"},
+{text:"b",url:"functions_vars_b.html#index_b"},
+{text:"c",url:"functions_vars_c.html#index_c"},
+{text:"d",url:"functions_vars_d.html#index_d"},
+{text:"e",url:"functions_vars_e.html#index_e"},
+{text:"f",url:"functions_vars_f.html#index_f"},
+{text:"g",url:"functions_vars_g.html#index_g"},
+{text:"h",url:"functions_vars_h.html#index_h"},
+{text:"i",url:"functions_vars_i.html#index_i"},
+{text:"j",url:"functions_vars_j.html#index_j"},
+{text:"k",url:"functions_vars_k.html#index_k"},
+{text:"l",url:"functions_vars_l.html#index_l"},
+{text:"m",url:"functions_vars_m.html#index_m"},
+{text:"n",url:"functions_vars_n.html#index_n"},
+{text:"o",url:"functions_vars_o.html#index_o"},
+{text:"p",url:"functions_vars_p.html#index_p"},
+{text:"q",url:"functions_vars_q.html#index_q"},
+{text:"r",url:"functions_vars_r.html#index_r"},
+{text:"s",url:"functions_vars_s.html#index_s"},
+{text:"t",url:"functions_vars_t.html#index_t"},
+{text:"u",url:"functions_vars_u.html#index_u"},
+{text:"v",url:"functions_vars_v.html#index_v"},
+{text:"w",url:"functions_vars_w.html#index_w"},
+{text:"z",url:"functions_vars_z.html#index_z"}]}]}]},
+{text:"Files",url:"files.html",children:[
+{text:"File List",url:"files.html"},
+{text:"Globals",url:"globals.html",children:[
+{text:"All",url:"globals.html",children:[
+{text:"a",url:"globals.html#index_a"},
+{text:"b",url:"globals_b.html#index_b"},
+{text:"c",url:"globals_c.html#index_c"},
+{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:"r",url:"globals_r.html#index_r"},
+{text:"s",url:"globals_s.html#index_s"},
+{text:"t",url:"globals_t.html#index_t"},
+{text:"u",url:"globals_u.html#index_u"},
+{text:"w",url:"globals_w.html#index_w"},
+{text:"z",url:"globals_z.html#index_z"}]},
+{text:"Functions",url:"globals_func.html",children:[
+{text:"a",url:"globals_func.html#index_a"},
+{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:"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"},
+{text:"m",url:"globals_func_m.html#index_m"},
+{text:"n",url:"globals_func_n.html#index_n"},
+{text:"p",url:"globals_func_p.html#index_p"},
+{text:"r",url:"globals_func_r.html#index_r"},
+{text:"s",url:"globals_func_s.html#index_s"},
+{text:"t",url:"globals_func_t.html#index_t"},
+{text:"u",url:"globals_func_u.html#index_u"},
+{text:"z",url:"globals_func_z.html#index_z"}]},
+{text:"Variables",url:"globals_vars.html",children:[
+{text:"d",url:"globals_vars.html#index_d"},
+{text:"h",url:"globals_vars.html#index_h"},
+{text:"i",url:"globals_vars.html#index_i"},
+{text:"l",url:"globals_vars.html#index_l"},
+{text:"n",url:"globals_vars.html#index_n"},
+{text:"r",url:"globals_vars.html#index_r"},
+{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"},
+{text:"h",url:"globals_type.html#index_h"},
+{text:"i",url:"globals_type.html#index_i"},
+{text:"l",url:"globals_type.html#index_l"},
+{text:"m",url:"globals_type.html#index_m"},
+{text:"n",url:"globals_type.html#index_n"},
+{text:"p",url:"globals_type.html#index_p"},
+{text:"r",url:"globals_type.html#index_r"},
+{text:"s",url:"globals_type.html#index_s"},
+{text:"t",url:"globals_type.html#index_t"},
+{text:"u",url:"globals_type.html#index_u"}]},
+{text:"Enumerations",url:"globals_enum.html",children:[
+{text:"d",url:"globals_enum.html#index_d"},
+{text:"e",url:"globals_enum.html#index_e"},
+{text:"i",url:"globals_enum.html#index_i"},
+{text:"l",url:"globals_enum.html#index_l"},
+{text:"m",url:"globals_enum.html#index_m"},
+{text:"n",url:"globals_enum.html#index_n"},
+{text:"p",url:"globals_enum.html#index_p"},
+{text:"r",url:"globals_enum.html#index_r"},
+{text:"s",url:"globals_enum.html#index_s"}]},
+{text:"Enumerator",url:"globals_eval.html",children:[
+{text:"e",url:"globals_eval.html#index_e"},
+{text:"h",url:"globals_eval.html#index_h"},
+{text:"i",url:"globals_eval.html#index_i"},
+{text:"l",url:"globals_eval.html#index_l"},
+{text:"m",url:"globals_eval.html#index_m"},
+{text:"n",url:"globals_eval.html#index_n"},
+{text:"p",url:"globals_eval.html#index_p"}]},
+{text:"Macros",url:"globals_defs.html",children:[
+{text:"a",url:"globals_defs.html#index_a"},
+{text:"b",url:"globals_defs_b.html#index_b"},
+{text:"c",url:"globals_defs_c.html#index_c"},
+{text:"d",url:"globals_defs_d.html#index_d"},
+{text:"e",url:"globals_defs_e.html#index_e"},
+{text:"f",url:"globals_defs_f.html#index_f"},
+{text:"g",url:"globals_defs_g.html#index_g"},
+{text:"h",url:"globals_defs_h.html#index_h"},
+{text:"i",url:"globals_defs_i.html#index_i"},
+{text:"l",url:"globals_defs_l.html#index_l"},
+{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:"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"},
+{text:"u",url:"globals_defs_u.html#index_u"},
+{text:"w",url:"globals_defs_w.html#index_w"},
+{text:"z",url:"globals_defs_z.html#index_z"}]}]}]}]}
diff --git a/doc/doxygen/output/html/mld6_8c.html b/doc/doxygen/output/html/mld6_8c.html
new file mode 100644
index 0000000..01b5685
--- /dev/null
+++ b/doc/doxygen/output/html/mld6_8c.html
@@ -0,0 +1,283 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv6/mld6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('mld6_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">mld6.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 &quot;<a class="el" href="mld6_8h.html">lwip/mld6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2mld6_8h.html">lwip/prot/mld6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="icmp6_8h.html">lwip/icmp6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6_8h.html">lwip/ip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="inet__chksum_8h.html">lwip/inet_chksum.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="netif_8h.html">lwip/netif.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="stats_8h.html">lwip/stats.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab7197d123f21a8863b56cc3871fd5198"><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="mld6_8c.html#ab7197d123f21a8863b56cc3871fd5198">mld6_stop</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ab7197d123f21a8863b56cc3871fd5198"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2a08b95a7b3c82da05df1a3b50629686"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mld6_8c.html#a2a08b95a7b3c82da05df1a3b50629686">mld6_report_groups</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a2a08b95a7b3c82da05df1a3b50629686"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad2fbba6bc543dbf994961656d7431eb5"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structmld__group.html">mld_group</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mld6_8c.html#ad2fbba6bc543dbf994961656d7431eb5">mld6_lookfor_group</a> (struct <a class="el" href="structnetif.html">netif</a> *ifp, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *addr)</td></tr>
+<tr class="separator:ad2fbba6bc543dbf994961656d7431eb5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c190ca25432d466b28f607c3574a841"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mld6_8c.html#a7c190ca25432d466b28f607c3574a841">mld6_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:a7c190ca25432d466b28f607c3574a841"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga53560ab6e47163e4888070830bf912a8"><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__mld6.html#ga53560ab6e47163e4888070830bf912a8">mld6_joingroup</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *srcaddr, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:ga53560ab6e47163e4888070830bf912a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2ba41d575a56d27c0af0a08fb8724940"><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__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940">mld6_joingroup_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:ga2ba41d575a56d27c0af0a08fb8724940"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga946b830efc6fd795b07a0964dc7940e5"><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__mld6.html#ga946b830efc6fd795b07a0964dc7940e5">mld6_leavegroup</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *srcaddr, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:ga946b830efc6fd795b07a0964dc7940e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab664062a15a3ae3e05282eacf4dc0a22"><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__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22">mld6_leavegroup_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:gab664062a15a3ae3e05282eacf4dc0a22"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ddb496d0a6a466df5665dbed8bd6274"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mld6_8c.html#a4ddb496d0a6a466df5665dbed8bd6274">mld6_tmr</a> (void)</td></tr>
+<tr class="separator:a4ddb496d0a6a466df5665dbed8bd6274"><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>Multicast listener discovery </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a7c190ca25432d466b28f607c3574a841"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7c190ca25432d466b28f607c3574a841">&#9670;&nbsp;</a></span>mld6_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mld6_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Process an input MLD message. Called by icmp6_input.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the mld packet, p-&gt;payload pointing to the icmpv6 header </td></tr>
+    <tr><td class="paramname">inp</td><td>the netif on which this packet was received </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ad2fbba6bc543dbf994961656d7431eb5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad2fbba6bc543dbf994961656d7431eb5">&#9670;&nbsp;</a></span>mld6_lookfor_group()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structmld__group.html">mld_group</a>* mld6_lookfor_group </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>ifp</em>, </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> *&#160;</td>
+          <td class="paramname"><em>addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Search for a group that is joined on a netif</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ifp</td><td>the network interface for which to look </td></tr>
+    <tr><td class="paramname">addr</td><td>the group ipv6 address to search for </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a struct mld_group* if the group has been found, NULL if the group wasn't found. </dd></dl>
+
+</div>
+</div>
+<a id="a2a08b95a7b3c82da05df1a3b50629686"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2a08b95a7b3c82da05df1a3b50629686">&#9670;&nbsp;</a></span>mld6_report_groups()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mld6_report_groups </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Report MLD memberships for this interface</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface on which report MLD memberships </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab7197d123f21a8863b56cc3871fd5198"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab7197d123f21a8863b56cc3871fd5198">&#9670;&nbsp;</a></span>mld6_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> mld6_stop </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Stop MLD processing on interface</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface on which stop MLD processing </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a4ddb496d0a6a466df5665dbed8bd6274"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4ddb496d0a6a466df5665dbed8bd6274">&#9670;&nbsp;</a></span>mld6_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mld6_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Periodic timer for mld processing. Must be called every MLD6_TMR_INTERVAL milliseconds (100).</p>
+<p>When a delaying member expires, a membership report is sent. </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_da9c6f43d3cd00be3de224bac907a425.html">ipv6</a></li><li class="navelem"><a class="el" href="mld6_8c.html">mld6.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/mld6_8c.js b/doc/doxygen/output/html/mld6_8c.js
new file mode 100644
index 0000000..2d711e1
--- /dev/null
+++ b/doc/doxygen/output/html/mld6_8c.js
@@ -0,0 +1,12 @@
+var mld6_8c =
+[
+    [ "mld6_input", "mld6_8c.html#a7c190ca25432d466b28f607c3574a841", null ],
+    [ "mld6_joingroup", "group__mld6.html#ga53560ab6e47163e4888070830bf912a8", null ],
+    [ "mld6_joingroup_netif", "group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940", null ],
+    [ "mld6_leavegroup", "group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5", null ],
+    [ "mld6_leavegroup_netif", "group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22", null ],
+    [ "mld6_lookfor_group", "mld6_8c.html#ad2fbba6bc543dbf994961656d7431eb5", null ],
+    [ "mld6_report_groups", "mld6_8c.html#a2a08b95a7b3c82da05df1a3b50629686", null ],
+    [ "mld6_stop", "mld6_8c.html#ab7197d123f21a8863b56cc3871fd5198", null ],
+    [ "mld6_tmr", "mld6_8c.html#a4ddb496d0a6a466df5665dbed8bd6274", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mld6_8h.html b/doc/doxygen/output/html/mld6_8h.html
new file mode 100644
index 0000000..8acb6a7
--- /dev/null
+++ b/doc/doxygen/output/html/mld6_8h.html
@@ -0,0 +1,285 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/mld6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('mld6_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">mld6.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="pbuf_8h.html">lwip/pbuf.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 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="structmld__group.html">mld_group</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga02a2259082f22c5989a3c929be95e641"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mld6.html#ga02a2259082f22c5989a3c929be95e641">netif_mld6_data</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;((struct <a class="el" href="structmld__group.html">mld_group</a> *)<a class="el" href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a>(<a class="el" href="structnetif.html">netif</a>, LWIP_NETIF_CLIENT_DATA_INDEX_MLD6))</td></tr>
+<tr class="separator:ga02a2259082f22c5989a3c929be95e641"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab7197d123f21a8863b56cc3871fd5198"><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="mld6_8h.html#ab7197d123f21a8863b56cc3871fd5198">mld6_stop</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ab7197d123f21a8863b56cc3871fd5198"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2a08b95a7b3c82da05df1a3b50629686"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mld6_8h.html#a2a08b95a7b3c82da05df1a3b50629686">mld6_report_groups</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a2a08b95a7b3c82da05df1a3b50629686"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ddb496d0a6a466df5665dbed8bd6274"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mld6_8h.html#a4ddb496d0a6a466df5665dbed8bd6274">mld6_tmr</a> (void)</td></tr>
+<tr class="separator:a4ddb496d0a6a466df5665dbed8bd6274"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad2fbba6bc543dbf994961656d7431eb5"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structmld__group.html">mld_group</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mld6_8h.html#ad2fbba6bc543dbf994961656d7431eb5">mld6_lookfor_group</a> (struct <a class="el" href="structnetif.html">netif</a> *ifp, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *addr)</td></tr>
+<tr class="separator:ad2fbba6bc543dbf994961656d7431eb5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c190ca25432d466b28f607c3574a841"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mld6_8h.html#a7c190ca25432d466b28f607c3574a841">mld6_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:a7c190ca25432d466b28f607c3574a841"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga53560ab6e47163e4888070830bf912a8"><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__mld6.html#ga53560ab6e47163e4888070830bf912a8">mld6_joingroup</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *srcaddr, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:ga53560ab6e47163e4888070830bf912a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2ba41d575a56d27c0af0a08fb8724940"><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__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940">mld6_joingroup_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:ga2ba41d575a56d27c0af0a08fb8724940"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga946b830efc6fd795b07a0964dc7940e5"><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__mld6.html#ga946b830efc6fd795b07a0964dc7940e5">mld6_leavegroup</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *srcaddr, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:ga946b830efc6fd795b07a0964dc7940e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab664062a15a3ae3e05282eacf4dc0a22"><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__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22">mld6_leavegroup_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *groupaddr)</td></tr>
+<tr class="separator:gab664062a15a3ae3e05282eacf4dc0a22"><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>Multicast listener discovery for IPv6. Aims to be compliant with RFC 2710. No support for MLDv2. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a7c190ca25432d466b28f607c3574a841"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7c190ca25432d466b28f607c3574a841">&#9670;&nbsp;</a></span>mld6_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mld6_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Process an input MLD message. Called by icmp6_input.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the mld packet, p-&gt;payload pointing to the icmpv6 header </td></tr>
+    <tr><td class="paramname">inp</td><td>the netif on which this packet was received </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ad2fbba6bc543dbf994961656d7431eb5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad2fbba6bc543dbf994961656d7431eb5">&#9670;&nbsp;</a></span>mld6_lookfor_group()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structmld__group.html">mld_group</a>* mld6_lookfor_group </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>ifp</em>, </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> *&#160;</td>
+          <td class="paramname"><em>addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Search for a group that is joined on a netif</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ifp</td><td>the network interface for which to look </td></tr>
+    <tr><td class="paramname">addr</td><td>the group ipv6 address to search for </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a struct mld_group* if the group has been found, NULL if the group wasn't found. </dd></dl>
+
+</div>
+</div>
+<a id="a2a08b95a7b3c82da05df1a3b50629686"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2a08b95a7b3c82da05df1a3b50629686">&#9670;&nbsp;</a></span>mld6_report_groups()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mld6_report_groups </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Report MLD memberships for this interface</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface on which report MLD memberships </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab7197d123f21a8863b56cc3871fd5198"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab7197d123f21a8863b56cc3871fd5198">&#9670;&nbsp;</a></span>mld6_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> mld6_stop </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Stop MLD processing on interface</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface on which stop MLD processing </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a4ddb496d0a6a466df5665dbed8bd6274"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4ddb496d0a6a466df5665dbed8bd6274">&#9670;&nbsp;</a></span>mld6_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mld6_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Periodic timer for mld processing. Must be called every MLD6_TMR_INTERVAL milliseconds (100).</p>
+<p>When a delaying member expires, a membership report is sent. </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="mld6_8h.html">mld6.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/mld6_8h.js b/doc/doxygen/output/html/mld6_8h.js
new file mode 100644
index 0000000..25e5575
--- /dev/null
+++ b/doc/doxygen/output/html/mld6_8h.js
@@ -0,0 +1,14 @@
+var mld6_8h =
+[
+    [ "mld_group", "structmld__group.html", "structmld__group" ],
+    [ "netif_mld6_data", "group__mld6.html#ga02a2259082f22c5989a3c929be95e641", null ],
+    [ "mld6_input", "mld6_8h.html#a7c190ca25432d466b28f607c3574a841", null ],
+    [ "mld6_joingroup", "group__mld6.html#ga53560ab6e47163e4888070830bf912a8", null ],
+    [ "mld6_joingroup_netif", "group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940", null ],
+    [ "mld6_leavegroup", "group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5", null ],
+    [ "mld6_leavegroup_netif", "group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22", null ],
+    [ "mld6_lookfor_group", "mld6_8h.html#ad2fbba6bc543dbf994961656d7431eb5", null ],
+    [ "mld6_report_groups", "mld6_8h.html#a2a08b95a7b3c82da05df1a3b50629686", null ],
+    [ "mld6_stop", "mld6_8h.html#ab7197d123f21a8863b56cc3871fd5198", null ],
+    [ "mld6_tmr", "mld6_8h.html#a4ddb496d0a6a466df5665dbed8bd6274", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/modules.html b/doc/doxygen/output/html/modules.html
new file mode 100644
index 0000000..766f4ac
--- /dev/null
+++ b/doc/doxygen/output/html/modules.html
@@ -0,0 +1,238 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Modules</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('modules.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">Modules</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all modules:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span><span onclick="javascript:toggleLevel(4);">4</span><span onclick="javascript:toggleLevel(5);">5</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><a class="el" href="group__lwip.html" target="_self">lwIP</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__nosys.html" target="_self">Mainloop mode (&quot;NO_SYS&quot;)</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__os.html" target="_self">OS mode (TCPIP thread)</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_2_" class="arrow" onclick="toggleFolder('0_2_')">&#9660;</span><a class="el" href="group__sys__layer.html" target="_self">Porting (system abstraction layer)</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__sys__nonstandard.html" target="_self">Non-standard functions</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_1_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_2_1_" class="arrow" onclick="toggleFolder('0_2_1_')">&#9658;</span><a class="el" href="group__sys__os.html" target="_self">OS abstraction layer</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_1_0_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__sys__sem.html" target="_self">Semaphores</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_1_1_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__sys__mutex.html" target="_self">Mutexes</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_1_2_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__sys__mbox.html" target="_self">Mailboxes</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_1_3_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__sys__misc.html" target="_self">Misc</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_2_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__sys__time.html" target="_self">Time</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_3_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__sys__prot.html" target="_self">Critical sections</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_4_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__compiler__abstraction.html" target="_self">Compiler/platform abstraction</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_5_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__perf.html" target="_self">Performance measurement</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__version.html" target="_self">Version</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_4_" class="arrow" onclick="toggleFolder('0_4_')">&#9660;</span><a class="el" href="group__lwip__opts.html" target="_self">Options (lwipopts.h)</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_4_0_" class="arrow" onclick="toggleFolder('0_4_0_')">&#9658;</span><a class="el" href="group__lwip__opts__debug.html" target="_self">Debugging</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_0_0_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__assertions.html" target="_self">Assertion handling</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_0_1_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__stats.html" target="_self">Statistics</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_0_2_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span id="arr_0_4_0_2_" class="arrow" onclick="toggleFolder('0_4_0_2_')">&#9658;</span><a class="el" href="group__lwip__opts__debugmsg.html" target="_self">Debug messages</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_0_2_0_" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><a class="el" href="group__debugging__levels.html" target="_self">LWIP_DBG_MIN_LEVEL and LWIP_DBG_TYPES_ON values</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_0_3_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__perf.html" target="_self">Performance</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_1_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_4_1_" class="arrow" onclick="toggleFolder('0_4_1_')">&#9658;</span><a class="el" href="group__lwip__opts__infrastructure.html" target="_self">Infrastructure</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_1_0_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__nosys.html" target="_self">NO_SYS</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_1_1_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__timers.html" target="_self">Timers</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_1_2_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__memcpy.html" target="_self">memcpy</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_1_3_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__lock.html" target="_self">Core locking and MPU</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_1_4_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__mem.html" target="_self">Heap and memory pools</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_1_5_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__memp.html" target="_self">Internal memory pools</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_1_6_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__mib2.html" target="_self">SNMP MIB2 callbacks</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_1_7_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__multicast.html" target="_self">Multicast</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_1_8_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__thread.html" target="_self">Threading</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_1_9_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__checksum.html" target="_self">Checksum</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_1_10_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__hooks.html" target="_self">Hooks</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_4_2_" class="arrow" onclick="toggleFolder('0_4_2_')">&#9658;</span><a class="el" href="group__lwip__opts__callback.html" target="_self">Callback-style APIs</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_2_0_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__raw.html" target="_self">RAW</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_2_1_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__dns.html" target="_self">DNS</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_2_2_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__udp.html" target="_self">UDP</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_2_3_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__tcp.html" target="_self">TCP</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_3_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_4_3_" class="arrow" onclick="toggleFolder('0_4_3_')">&#9658;</span><a class="el" href="group__lwip__opts__threadsafe__apis.html" target="_self">Thread-safe APIs</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_3_0_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__netconn.html" target="_self">Netconn</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_3_1_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__socket.html" target="_self">Sockets</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_4_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_4_4_" class="arrow" onclick="toggleFolder('0_4_4_')">&#9658;</span><a class="el" href="group__lwip__opts__ipv4.html" target="_self">IPv4</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_4_0_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__arp.html" target="_self">ARP</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_4_1_" 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_" 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_" 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_" 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_"><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="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_" 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>
+<tr id="row_0_4_7_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_4_7_" class="arrow" onclick="toggleFolder('0_4_7_')">&#9658;</span><a class="el" href="group__lwip__opts__ipv6.html" target="_self">IPv6</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_7_0_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__icmp6.html" target="_self">ICMP6</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_7_1_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__mld6.html" target="_self">Multicast listener discovery</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_7_2_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__nd6.html" target="_self">Neighbor discovery</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_7_3_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__dhcpv6.html" target="_self">DHCPv6</a></td><td class="desc"></td></tr>
+<tr id="row_1_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_1_" class="arrow" onclick="toggleFolder('1_')">&#9660;</span><a class="el" href="group__infrastructure.html" target="_self">Infrastructure</a></td><td class="desc"></td></tr>
+<tr id="row_1_0_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_1_0_" class="arrow" onclick="toggleFolder('1_0_')">&#9660;</span><a class="el" href="group__ipaddr.html" target="_self">IP address handling</a></td><td class="desc"></td></tr>
+<tr id="row_1_0_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__ip4addr.html" target="_self">IPv4 only</a></td><td class="desc"></td></tr>
+<tr id="row_1_0_1_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__ip6addr.html" target="_self">IPv6 only</a></td><td class="desc"></td></tr>
+<tr id="row_1_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a class="el" href="group__mempool.html" target="_self">Memory pools</a></td><td class="desc"></td></tr>
+<tr id="row_1_2_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a class="el" href="group__pbuf.html" target="_self">Packet buffers (PBUF)</a></td><td class="desc"></td></tr>
+<tr id="row_1_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a class="el" href="group__infrastructure__errors.html" target="_self">Error codes</a></td><td class="desc"></td></tr>
+<tr id="row_1_4_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a class="el" href="group__iana.html" target="_self">IANA assigned numbers</a></td><td class="desc"></td></tr>
+<tr id="row_1_5_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a class="el" href="group__ieee.html" target="_self">IEEE assigned numbers</a></td><td class="desc"></td></tr>
+<tr id="row_2_"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_2_" class="arrow" onclick="toggleFolder('2_')">&#9660;</span><a class="el" href="group__api.html" target="_self">APIs</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_2_0_" class="arrow" onclick="toggleFolder('2_0_')">&#9660;</span><a class="el" href="group__callbackstyle__api.html" target="_self">&quot;raw&quot; APIs</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_2_0_0_" class="arrow" onclick="toggleFolder('2_0_0_')">&#9658;</span><a class="el" href="group__altcp__api.html" target="_self">Application layered TCP Introduction</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_0_0_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span id="arr_2_0_0_0_" class="arrow" onclick="toggleFolder('2_0_0_0_')">&#9658;</span><a class="el" href="group__altcp.html" target="_self">Application layered TCP Functions</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_0_0_0_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><a class="el" href="group__altcp__tls.html" target="_self">TLS layer</a></td><td class="desc"></td></tr>
+<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_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_2_0_2_" class="arrow" onclick="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="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_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="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>
+<tr id="row_2_0_2_1_2_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><a class="el" href="group__ip6__zones.html" target="_self">IPv6 Zones</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_2_0_3_" class="arrow" onclick="toggleFolder('2_0_3_')">&#9658;</span><a class="el" href="group__netif.html" target="_self">Network interface (NETIF)</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_3_0_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__netif__ip4.html" target="_self">IPv4 address handling</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_3_1_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__netif__ip6.html" target="_self">IPv6 address handling</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_3_2_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__netif__cd.html" target="_self">Client data handling</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_3_3_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__netif__flags.html" target="_self">Flags</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_3_4_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__netif__mib2.html" target="_self">MIB2 statistics</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_4_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__raw__raw.html" target="_self">RAW</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_5_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_2_0_5_" class="arrow" onclick="toggleFolder('2_0_5_')">&#9658;</span><a class="el" href="group__tcp__raw.html" target="_self">TCP</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_5_0_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__tcp__raw__extargs.html" target="_self">ext arguments</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_6_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__udp__raw.html" target="_self">UDP</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_7_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__ethernet.html" target="_self">Ethernet</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_2_1_" class="arrow" onclick="toggleFolder('2_1_')">&#9660;</span><a class="el" href="group__sequential__api.html" target="_self">Sequential-style APIs</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_2_1_0_" class="arrow" onclick="toggleFolder('2_1_0_')">&#9658;</span><a class="el" href="group__netconn.html" target="_self">Netconn API</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_0_0_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__netconn__common.html" target="_self">Common functions</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_0_1_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__netconn__tcp.html" target="_self">TCP only</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_0_2_" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__netconn__udp.html" target="_self">UDP only</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_0_3_" 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_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_2_1_1_" class="arrow" onclick="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_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_2_2_" class="arrow" onclick="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_"><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>
+<tr id="row_3_"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_3_" class="arrow" onclick="toggleFolder('3_')">&#9660;</span><a class="el" href="group__netifs.html" target="_self">NETIFs</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_3_0_" class="arrow" onclick="toggleFolder('3_0_')">&#9660;</span><a class="el" href="group__bridgeif.html" target="_self">IEEE 802.1D bridge</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_0_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__bridgeif__opts.html" target="_self">Options</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_1_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__bridgeif__fdb.html" target="_self">FDB example code</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a class="el" href="group__sixlowpan.html" target="_self">6LoWPAN (RFC4944)</a></td><td class="desc"></td></tr>
+<tr id="row_3_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a class="el" href="group__rfc7668if.html" target="_self">6LoWPAN over BLE (RFC7668)</a></td><td class="desc"></td></tr>
+<tr id="row_3_3_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a class="el" href="group__ppp.html" target="_self">PPP</a></td><td class="desc"></td></tr>
+<tr id="row_3_4_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a class="el" href="group__slipif.html" target="_self">SLIP</a></td><td class="desc"></td></tr>
+<tr id="row_3_5_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a class="el" href="group__zepif.html" target="_self">ZEP - ZigBee Encapsulation Protocol</a></td><td class="desc"></td></tr>
+<tr id="row_4_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_4_" class="arrow" onclick="toggleFolder('4_')">&#9660;</span><a class="el" href="group__apps.html" target="_self">Applications</a></td><td class="desc"></td></tr>
+<tr id="row_4_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a class="el" href="group__httpc.html" target="_self">HTTP client</a></td><td class="desc"></td></tr>
+<tr id="row_4_1_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_4_1_" class="arrow" onclick="toggleFolder('4_1_')">&#9660;</span><a class="el" href="group__httpd.html" target="_self">HTTP server</a></td><td class="desc"></td></tr>
+<tr id="row_4_1_0_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__httpd__opts.html" target="_self">Options</a></td><td class="desc"></td></tr>
+<tr id="row_4_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a class="el" href="group__iperf.html" target="_self">Iperf server</a></td><td class="desc"></td></tr>
+<tr id="row_4_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_4_3_" class="arrow" onclick="toggleFolder('4_3_')">&#9660;</span><a class="el" href="group__mdns.html" target="_self">MDNS</a></td><td class="desc"></td></tr>
+<tr id="row_4_3_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__mdns__opts.html" target="_self">Options</a></td><td class="desc"></td></tr>
+<tr id="row_4_4_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_4_4_" class="arrow" onclick="toggleFolder('4_4_')">&#9660;</span><a class="el" href="group__mqtt.html" target="_self">MQTT client</a></td><td class="desc"></td></tr>
+<tr id="row_4_4_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__mqtt__opts.html" target="_self">Options</a></td><td class="desc"></td></tr>
+<tr id="row_4_5_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_4_5_" class="arrow" onclick="toggleFolder('4_5_')">&#9660;</span><a class="el" href="group__netbiosns.html" target="_self">NETBIOS responder</a></td><td class="desc"></td></tr>
+<tr id="row_4_5_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__netbiosns__opts.html" target="_self">Options</a></td><td class="desc"></td></tr>
+<tr id="row_4_6_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_4_6_" class="arrow" onclick="toggleFolder('4_6_')">&#9660;</span><a class="el" href="group__smtp.html" target="_self">SMTP client</a></td><td class="desc"></td></tr>
+<tr id="row_4_6_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__smtp__opts.html" target="_self">Options</a></td><td class="desc"></td></tr>
+<tr id="row_4_7_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_4_7_" class="arrow" onclick="toggleFolder('4_7_')">&#9660;</span><a class="el" href="group__snmp.html" target="_self">SNMPv2c/v3 agent</a></td><td class="desc"></td></tr>
+<tr id="row_4_7_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__snmp__core.html" target="_self">Core</a></td><td class="desc"></td></tr>
+<tr id="row_4_7_1_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__snmp__traps.html" target="_self">Traps</a></td><td class="desc"></td></tr>
+<tr id="row_4_7_2_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__snmp__mib2.html" target="_self">MIB2</a></td><td class="desc"></td></tr>
+<tr id="row_4_7_3_"><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="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_"><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="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_0_"><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 -->
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/modules.js b/doc/doxygen/output/html/modules.js
new file mode 100644
index 0000000..f2152ac
--- /dev/null
+++ b/doc/doxygen/output/html/modules.js
@@ -0,0 +1,8 @@
+var modules =
+[
+    [ "lwIP", "group__lwip.html", "group__lwip" ],
+    [ "Infrastructure", "group__infrastructure.html", "group__infrastructure" ],
+    [ "APIs", "group__api.html", "group__api" ],
+    [ "NETIFs", "group__netifs.html", "group__netifs" ],
+    [ "Applications", "group__apps.html", "group__apps" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mqtt_8c.html b/doc/doxygen/output/html/mqtt_8c.html
new file mode 100644
index 0000000..ef3a476
--- /dev/null
+++ b/doc/doxygen/output/html/mqtt_8c.html
@@ -0,0 +1,276 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/mqtt/mqtt.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('mqtt_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">mqtt.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="mqtt_8h.html">lwip/apps/mqtt.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mqtt__priv_8h.html">lwip/apps/mqtt_priv.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="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="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="altcp_8h.html">lwip/altcp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="altcp__tcp_8h.html">lwip/altcp_tcp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="altcp__tls_8h.html">lwip/altcp_tls.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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a99c325e06cc17ee24e09dab251606f9d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mqtt_8c.html#a99c325e06cc17ee24e09dab251606f9d">MQTT_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:a99c325e06cc17ee24e09dab251606f9d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a45c57ebd31832f1c128d847067c4688b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mqtt_8c.html#a45c57ebd31832f1c128d847067c4688b">MQTT_CTL_PACKET_TYPE</a>(fixed_hdr_byte0)&#160;&#160;&#160;((fixed_hdr_byte0 &amp; 0xf0) &gt;&gt; 4)</td></tr>
+<tr class="separator:a45c57ebd31832f1c128d847067c4688b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afba101fbf26b556c869060d3d013c8fa"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mqtt_8c.html#afba101fbf26b556c869060d3d013c8fa">mqtt_ringbuf_free</a>(rb)&#160;&#160;&#160;(<a class="el" href="group__mqtt__opts.html#ga70627bafaffa071875cee9edc38d942b">MQTT_OUTPUT_RINGBUF_SIZE</a> - mqtt_ringbuf_len(rb))</td></tr>
+<tr class="separator:afba101fbf26b556c869060d3d013c8fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad82b4039213ab3f1d9e4bcd3aa0c88a3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mqtt_8c.html#ad82b4039213ab3f1d9e4bcd3aa0c88a3">mqtt_ringbuf_linear_read_length</a>(rb)&#160;&#160;&#160;LWIP_MIN(mqtt_ringbuf_len(rb), (<a class="el" href="group__mqtt__opts.html#ga70627bafaffa071875cee9edc38d942b">MQTT_OUTPUT_RINGBUF_SIZE</a> - (rb)-&gt;get))</td></tr>
+<tr class="separator:ad82b4039213ab3f1d9e4bcd3aa0c88a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:a06fc87d81c62e9abb8790b6e5713c55b"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:a06fc87d81c62e9abb8790b6e5713c55b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac243cf15beb51b2206e36da86c2f95f1"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mqtt_8c.html#ac243cf15beb51b2206e36da86c2f95f1">mqtt_message_type</a> </td></tr>
+<tr class="separator:ac243cf15beb51b2206e36da86c2f95f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4f6c42ed730546ff755e3bb99989dd12"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mqtt_8c.html#a4f6c42ed730546ff755e3bb99989dd12">mqtt_connect_flag</a> </td></tr>
+<tr class="separator:a4f6c42ed730546ff755e3bb99989dd12"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gade9850d716e81fde572cb012be795d2f"><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#gade9850d716e81fde572cb012be795d2f">mqtt_publish</a> (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client, const char *topic, const void *payload, u16_t payload_length, u8_t qos, u8_t retain, <a class="el" href="group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd">mqtt_request_cb_t</a> cb, void *arg)</td></tr>
+<tr class="separator:gade9850d716e81fde572cb012be795d2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="memitem: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:gae7e19e236eb6122c8c39e93db6f5f53f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#gae7e19e236eb6122c8c39e93db6f5f53f">mqtt_client_new</a> (void)</td></tr>
+<tr class="separator:gae7e19e236eb6122c8c39e93db6f5f53f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa0fa1d985c322a9c91a51322db254882"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882">mqtt_client_free</a> (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client)</td></tr>
+<tr class="separator:gaa0fa1d985c322a9c91a51322db254882"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadf4d2a3f1b12fb6cbc020b126f3125f0"><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#gadf4d2a3f1b12fb6cbc020b126f3125f0">mqtt_client_connect</a> (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *<a class="el" href="structip__addr.html">ip_addr</a>, u16_t port, <a class="el" href="group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f">mqtt_connection_cb_t</a> cb, void *arg, const struct <a class="el" href="structmqtt__connect__client__info__t.html">mqtt_connect_client_info_t</a> *client_info)</td></tr>
+<tr class="separator:gadf4d2a3f1b12fb6cbc020b126f3125f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga73d8dd718bce09bfaab452770b4f76e6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6">mqtt_disconnect</a> (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client)</td></tr>
+<tr class="separator:ga73d8dd718bce09bfaab452770b4f76e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>MQTT client </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a45c57ebd31832f1c128d847067c4688b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a45c57ebd31832f1c128d847067c4688b">&#9670;&nbsp;</a></span>MQTT_CTL_PACKET_TYPE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MQTT_CTL_PACKET_TYPE</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">fixed_hdr_byte0</td><td>)</td>
+          <td>&#160;&#160;&#160;((fixed_hdr_byte0 &amp; 0xf0) &gt;&gt; 4)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Helpers to extract control packet type and qos from first byte in fixed header </p>
+
+</div>
+</div>
+<a id="a99c325e06cc17ee24e09dab251606f9d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a99c325e06cc17ee24e09dab251606f9d">&#9670;&nbsp;</a></span>MQTT_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MQTT_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>MQTT_DEBUG: Default is off. </p>
+
+</div>
+</div>
+<a id="afba101fbf26b556c869060d3d013c8fa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afba101fbf26b556c869060d3d013c8fa">&#9670;&nbsp;</a></span>mqtt_ringbuf_free</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define mqtt_ringbuf_free</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">rb</td><td>)</td>
+          <td>&#160;&#160;&#160;(<a class="el" href="group__mqtt__opts.html#ga70627bafaffa071875cee9edc38d942b">MQTT_OUTPUT_RINGBUF_SIZE</a> - mqtt_ringbuf_len(rb))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return number of bytes free in ring buffer </p>
+
+</div>
+</div>
+<a id="ad82b4039213ab3f1d9e4bcd3aa0c88a3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad82b4039213ab3f1d9e4bcd3aa0c88a3">&#9670;&nbsp;</a></span>mqtt_ringbuf_linear_read_length</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define mqtt_ringbuf_linear_read_length</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">rb</td><td>)</td>
+          <td>&#160;&#160;&#160;LWIP_MIN(mqtt_ringbuf_len(rb), (<a class="el" href="group__mqtt__opts.html#ga70627bafaffa071875cee9edc38d942b">MQTT_OUTPUT_RINGBUF_SIZE</a> - (rb)-&gt;get))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return number of bytes possible to read without wrapping around </p>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="a06fc87d81c62e9abb8790b6e5713c55b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a06fc87d81c62e9abb8790b6e5713c55b">&#9670;&nbsp;</a></span>anonymous enum</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">anonymous enum</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MQTT client connection states </p>
+
+</div>
+</div>
+<a id="a4f6c42ed730546ff755e3bb99989dd12"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4f6c42ed730546ff755e3bb99989dd12">&#9670;&nbsp;</a></span>mqtt_connect_flag</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="mqtt_8c.html#a4f6c42ed730546ff755e3bb99989dd12">mqtt_connect_flag</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MQTT connect flags, only used in CONNECT message </p>
+
+</div>
+</div>
+<a id="ac243cf15beb51b2206e36da86c2f95f1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac243cf15beb51b2206e36da86c2f95f1">&#9670;&nbsp;</a></span>mqtt_message_type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="mqtt_8c.html#ac243cf15beb51b2206e36da86c2f95f1">mqtt_message_type</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MQTT control message types </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_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_dfacd4b005f6a743295cd1d76eff7420.html">mqtt</a></li><li class="navelem"><a class="el" href="mqtt_8c.html">mqtt.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/mqtt_8c.js b/doc/doxygen/output/html/mqtt_8c.js
new file mode 100644
index 0000000..8048e26
--- /dev/null
+++ b/doc/doxygen/output/html/mqtt_8c.js
@@ -0,0 +1,17 @@
+var mqtt_8c =
+[
+    [ "MQTT_CTL_PACKET_TYPE", "mqtt_8c.html#a45c57ebd31832f1c128d847067c4688b", null ],
+    [ "MQTT_DEBUG", "mqtt_8c.html#a99c325e06cc17ee24e09dab251606f9d", null ],
+    [ "mqtt_ringbuf_free", "mqtt_8c.html#afba101fbf26b556c869060d3d013c8fa", null ],
+    [ "mqtt_ringbuf_linear_read_length", "mqtt_8c.html#ad82b4039213ab3f1d9e4bcd3aa0c88a3", null ],
+    [ "mqtt_connect_flag", "mqtt_8c.html#a4f6c42ed730546ff755e3bb99989dd12", null ],
+    [ "mqtt_message_type", "mqtt_8c.html#ac243cf15beb51b2206e36da86c2f95f1", null ],
+    [ "mqtt_client_connect", "group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0", null ],
+    [ "mqtt_client_free", "group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882", null ],
+    [ "mqtt_client_is_connected", "group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5", null ],
+    [ "mqtt_client_new", "group__mqtt.html#gae7e19e236eb6122c8c39e93db6f5f53f", null ],
+    [ "mqtt_disconnect", "group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6", null ],
+    [ "mqtt_publish", "group__mqtt.html#gade9850d716e81fde572cb012be795d2f", null ],
+    [ "mqtt_set_inpub_callback", "group__mqtt.html#gafdfa0e65b217e92835d35858924565cf", null ],
+    [ "mqtt_sub_unsub", "group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mqtt_8h.html b/doc/doxygen/output/html/mqtt_8h.html
new file mode 100644
index 0000000..3e4391b
--- /dev/null
+++ b/doc/doxygen/output/html/mqtt_8h.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/mqtt.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('mqtt_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">mqtt.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="mqtt__opts_8h.html">lwip/apps/mqtt_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="ip__addr_8h.html">lwip/ip_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="iana_8h.html">lwip/prot/iana.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structmqtt__connect__client__info__t.html">mqtt_connect_client_info_t</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gaa8632baff6bbb5004385998918f1e6bd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#gaa8632baff6bbb5004385998918f1e6bd">MQTT_PORT</a>&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22">LWIP_IANA_PORT_MQTT</a></td></tr>
+<tr class="separator:gaa8632baff6bbb5004385998918f1e6bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6610174f17b9ecbcf2bc66a4fd5a6b0f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#ga6610174f17b9ecbcf2bc66a4fd5a6b0f">MQTT_TLS_PORT</a>&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601">LWIP_IANA_PORT_SECURE_MQTT</a></td></tr>
+<tr class="separator:ga6610174f17b9ecbcf2bc66a4fd5a6b0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83d6a6d811b201a74d793bc1b5d4e029"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#ga83d6a6d811b201a74d793bc1b5d4e029">mqtt_subscribe</a>(client,  topic,  qos,  cb,  arg)&#160;&#160;&#160;<a class="el" href="group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103">mqtt_sub_unsub</a>(client, topic, qos, cb, arg, 1)</td></tr>
+<tr class="separator:ga83d6a6d811b201a74d793bc1b5d4e029"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0f133ef09cbe56c46ebe2cc21afccf3f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#ga0f133ef09cbe56c46ebe2cc21afccf3f">mqtt_unsubscribe</a>(client,  topic,  cb,  arg)&#160;&#160;&#160;<a class="el" href="group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103">mqtt_sub_unsub</a>(client, topic, 0, cb, arg, 0)</td></tr>
+<tr class="separator:ga0f133ef09cbe56c46ebe2cc21afccf3f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga8558743bdb7d599a93844fbc56c9029f"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f">mqtt_connection_cb_t</a>) (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client, void *arg, <a class="el" href="group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d">mqtt_connection_status_t</a> status)</td></tr>
+<tr class="separator:ga8558743bdb7d599a93844fbc56c9029f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafec7e75fe6a746eef9ca411463446c81"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81">mqtt_incoming_data_cb_t</a>) (void *arg, const u8_t *data, u16_t len, u8_t flags)</td></tr>
+<tr class="separator:gafec7e75fe6a746eef9ca411463446c81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7116bb85255394cec4b1d9fa38842c29"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29">mqtt_incoming_publish_cb_t</a>) (void *arg, const char *topic, u32_t tot_len)</td></tr>
+<tr class="separator:ga7116bb85255394cec4b1d9fa38842c29"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacad2bbe2cee76eaa120cc63e2f6094fd"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd">mqtt_request_cb_t</a>) (void *arg, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> err)</td></tr>
+<tr class="separator:gacad2bbe2cee76eaa120cc63e2f6094fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga8cf0f360ab20343af37e1d124395a77d"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d">mqtt_connection_status_t</a> { <br />
+&#160;&#160;<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da074dc1d289b8e8d4aad91f6a2cb93dc1">MQTT_CONNECT_ACCEPTED</a> = 0, 
+<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da41f8aa97142be337cb639f94d9145190">MQTT_CONNECT_REFUSED_PROTOCOL_VERSION</a> = 1, 
+<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da28ffe49b0175adaa2b9a27cb4873224a">MQTT_CONNECT_REFUSED_IDENTIFIER</a> = 2, 
+<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a">MQTT_CONNECT_REFUSED_SERVER</a> = 3, 
+<br />
+&#160;&#160;<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da290cf9037054c42022cc864cfade896a">MQTT_CONNECT_REFUSED_USERNAME_PASS</a> = 4, 
+<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dafc4888158dd6ee84269a5f0bfdc12b17">MQTT_CONNECT_REFUSED_NOT_AUTHORIZED_</a> = 5, 
+<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da321f5ce31b173f235de1a517fcfd00dd">MQTT_CONNECT_DISCONNECTED</a> = 256, 
+<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62">MQTT_CONNECT_TIMEOUT</a> = 257
+<br />
+ }</td></tr>
+<tr class="separator:ga8cf0f360ab20343af37e1d124395a77d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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
+ }</td></tr>
+<tr class="separator:ga99fb83031ce9923c84392b4e92f956b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gadf4d2a3f1b12fb6cbc020b126f3125f0"><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#gadf4d2a3f1b12fb6cbc020b126f3125f0">mqtt_client_connect</a> (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, u16_t port, <a class="el" href="group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f">mqtt_connection_cb_t</a> cb, void *arg, const struct <a class="el" href="structmqtt__connect__client__info__t.html">mqtt_connect_client_info_t</a> *client_info)</td></tr>
+<tr class="separator:gadf4d2a3f1b12fb6cbc020b126f3125f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga73d8dd718bce09bfaab452770b4f76e6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6">mqtt_disconnect</a> (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client)</td></tr>
+<tr class="separator:ga73d8dd718bce09bfaab452770b4f76e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae7e19e236eb6122c8c39e93db6f5f53f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#gae7e19e236eb6122c8c39e93db6f5f53f">mqtt_client_new</a> (void)</td></tr>
+<tr class="separator:gae7e19e236eb6122c8c39e93db6f5f53f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa0fa1d985c322a9c91a51322db254882"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882">mqtt_client_free</a> (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client)</td></tr>
+<tr class="separator:gaa0fa1d985c322a9c91a51322db254882"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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="separator:gafdfa0e65b217e92835d35858924565cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="memitem:gade9850d716e81fde572cb012be795d2f"><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#gade9850d716e81fde572cb012be795d2f">mqtt_publish</a> (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client, const char *topic, const void *payload, u16_t payload_length, u8_t qos, u8_t retain, <a class="el" href="group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd">mqtt_request_cb_t</a> cb, void *arg)</td></tr>
+<tr class="separator:gade9850d716e81fde572cb012be795d2f"><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>MQTT client </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_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="mqtt_8h.html">mqtt.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/mqtt_8h.js b/doc/doxygen/output/html/mqtt_8h.js
new file mode 100644
index 0000000..666829a
--- /dev/null
+++ b/doc/doxygen/output/html/mqtt_8h.js
@@ -0,0 +1,30 @@
+var mqtt_8h =
+[
+    [ "MQTT_PORT", "group__mqtt.html#gaa8632baff6bbb5004385998918f1e6bd", null ],
+    [ "mqtt_subscribe", "group__mqtt.html#ga83d6a6d811b201a74d793bc1b5d4e029", null ],
+    [ "MQTT_TLS_PORT", "group__mqtt.html#ga6610174f17b9ecbcf2bc66a4fd5a6b0f", null ],
+    [ "mqtt_unsubscribe", "group__mqtt.html#ga0f133ef09cbe56c46ebe2cc21afccf3f", null ],
+    [ "mqtt_connection_cb_t", "group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f", null ],
+    [ "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", null ],
+    [ "MQTT_DATA_FLAG_LAST", "group__mqtt.html#gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f", null ],
+    [ "mqtt_connection_status_t", "group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d", [
+      [ "MQTT_CONNECT_ACCEPTED", "group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da074dc1d289b8e8d4aad91f6a2cb93dc1", null ],
+      [ "MQTT_CONNECT_REFUSED_PROTOCOL_VERSION", "group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da41f8aa97142be337cb639f94d9145190", null ],
+      [ "MQTT_CONNECT_REFUSED_IDENTIFIER", "group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da28ffe49b0175adaa2b9a27cb4873224a", null ],
+      [ "MQTT_CONNECT_REFUSED_SERVER", "group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a", null ],
+      [ "MQTT_CONNECT_REFUSED_USERNAME_PASS", "group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da290cf9037054c42022cc864cfade896a", null ],
+      [ "MQTT_CONNECT_REFUSED_NOT_AUTHORIZED_", "group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dafc4888158dd6ee84269a5f0bfdc12b17", null ],
+      [ "MQTT_CONNECT_DISCONNECTED", "group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da321f5ce31b173f235de1a517fcfd00dd", null ],
+      [ "MQTT_CONNECT_TIMEOUT", "group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62", null ]
+    ] ],
+    [ "mqtt_client_connect", "group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0", null ],
+    [ "mqtt_client_free", "group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882", null ],
+    [ "mqtt_client_is_connected", "group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5", null ],
+    [ "mqtt_client_new", "group__mqtt.html#gae7e19e236eb6122c8c39e93db6f5f53f", null ],
+    [ "mqtt_disconnect", "group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6", null ],
+    [ "mqtt_publish", "group__mqtt.html#gade9850d716e81fde572cb012be795d2f", null ],
+    [ "mqtt_set_inpub_callback", "group__mqtt.html#gafdfa0e65b217e92835d35858924565cf", null ],
+    [ "mqtt_sub_unsub", "group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mqtt__opts_8h.html b/doc/doxygen/output/html/mqtt__opts_8h.html
new file mode 100644
index 0000000..a42a992
--- /dev/null
+++ b/doc/doxygen/output/html/mqtt__opts_8h.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/mqtt_opts.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('mqtt__opts_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">mqtt_opts.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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga70627bafaffa071875cee9edc38d942b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt__opts.html#ga70627bafaffa071875cee9edc38d942b">MQTT_OUTPUT_RINGBUF_SIZE</a>&#160;&#160;&#160;256</td></tr>
+<tr class="separator:ga70627bafaffa071875cee9edc38d942b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8275ef78a85fb14c3ac1423c70e45805"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt__opts.html#ga8275ef78a85fb14c3ac1423c70e45805">MQTT_VAR_HEADER_BUFFER_LEN</a>&#160;&#160;&#160;128</td></tr>
+<tr class="separator:ga8275ef78a85fb14c3ac1423c70e45805"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae82460b35de2291e9661e440c3458e8f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt__opts.html#gae82460b35de2291e9661e440c3458e8f">MQTT_REQ_MAX_IN_FLIGHT</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:gae82460b35de2291e9661e440c3458e8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1d89fda808c7047eab7a67d3785aea8e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt__opts.html#ga1d89fda808c7047eab7a67d3785aea8e">MQTT_CYCLIC_TIMER_INTERVAL</a>&#160;&#160;&#160;5</td></tr>
+<tr class="separator:ga1d89fda808c7047eab7a67d3785aea8e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga262639f2b45f6e064fb53156396d6d0a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt__opts.html#ga262639f2b45f6e064fb53156396d6d0a">MQTT_REQ_TIMEOUT</a>&#160;&#160;&#160;30</td></tr>
+<tr class="separator:ga262639f2b45f6e064fb53156396d6d0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac5d0580d1caf57dac1cb56662e5d9f7b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt__opts.html#gac5d0580d1caf57dac1cb56662e5d9f7b">MQTT_CONNECT_TIMOUT</a>&#160;&#160;&#160;100</td></tr>
+<tr class="separator:gac5d0580d1caf57dac1cb56662e5d9f7b"><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>MQTT client options </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_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="mqtt__opts_8h.html">mqtt_opts.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/mqtt__opts_8h.js b/doc/doxygen/output/html/mqtt__opts_8h.js
new file mode 100644
index 0000000..58667a0
--- /dev/null
+++ b/doc/doxygen/output/html/mqtt__opts_8h.js
@@ -0,0 +1,9 @@
+var mqtt__opts_8h =
+[
+    [ "MQTT_CONNECT_TIMOUT", "group__mqtt__opts.html#gac5d0580d1caf57dac1cb56662e5d9f7b", null ],
+    [ "MQTT_CYCLIC_TIMER_INTERVAL", "group__mqtt__opts.html#ga1d89fda808c7047eab7a67d3785aea8e", null ],
+    [ "MQTT_OUTPUT_RINGBUF_SIZE", "group__mqtt__opts.html#ga70627bafaffa071875cee9edc38d942b", null ],
+    [ "MQTT_REQ_MAX_IN_FLIGHT", "group__mqtt__opts.html#gae82460b35de2291e9661e440c3458e8f", null ],
+    [ "MQTT_REQ_TIMEOUT", "group__mqtt__opts.html#ga262639f2b45f6e064fb53156396d6d0a", null ],
+    [ "MQTT_VAR_HEADER_BUFFER_LEN", "group__mqtt__opts.html#ga8275ef78a85fb14c3ac1423c70e45805", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mqtt__priv_8h.html b/doc/doxygen/output/html/mqtt__priv_8h.html
new file mode 100644
index 0000000..039298b
--- /dev/null
+++ b/doc/doxygen/output/html/mqtt__priv_8h.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/mqtt_priv.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('mqtt__priv_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a>  </div>
+  <div class="headertitle">
+<div class="title">mqtt_priv.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="mqtt_8h.html">lwip/apps/mqtt.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="altcp_8h.html">lwip/altcp.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structmqtt__request__t.html">mqtt_request_t</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="structmqtt__ringbuf__t.html">mqtt_ringbuf_t</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="structmqtt__client__s.html">mqtt_client_s</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>
+<div class="textblock"><p>MQTT client (private interface) </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_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="mqtt__priv_8h.html">mqtt_priv.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/multithreading.html b/doc/doxygen/output/html/multithreading.html
new file mode 100644
index 0000000..6231c06
--- /dev/null
+++ b/doc/doxygen/output/html/multithreading.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Multithreading</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('multithreading.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">Multithreading </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>lwIP started targeting single-threaded environments. When adding multi- threading support, instead of making the core thread-safe, another approach was chosen: there is one main thread running the lwIP core (also known as the "tcpip_thread"). When running in a multithreaded environment, raw API functions MUST only be called from the core thread since raw API functions are not protected from concurrent access (aside from pbuf- and memory management functions). Application threads using the sequential- or socket API communicate with this main thread through message passing.</p>
+<p>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:</p><ul>
+<li><a class="el" href="api_8h.html">api.h</a></li>
+<li><a class="el" href="netbuf_8h.html">netbuf.h</a></li>
+<li>netdb.h</li>
+<li><a class="el" href="netifapi_8h.html">netifapi.h</a></li>
+<li>pppapi.h</li>
+<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>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>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 -->
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/navtree.css b/doc/doxygen/output/html/navtree.css
new file mode 100644
index 0000000..0cc7e77
--- /dev/null
+++ b/doc/doxygen/output/html/navtree.css
@@ -0,0 +1,146 @@
+#nav-tree .children_ul {
+  margin:0;
+  padding:4px;
+}
+
+#nav-tree ul {
+  list-style:none outside none;
+  margin:0px;
+  padding:0px;
+}
+
+#nav-tree li {
+  white-space:nowrap;
+  margin:0px;
+  padding:0px;
+}
+
+#nav-tree .plus {
+  margin:0px;
+}
+
+#nav-tree .selected {
+  background-image: url('tab_a.png');
+  background-repeat:repeat-x;
+  color: #fff;
+  text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
+
+#nav-tree img {
+  margin:0px;
+  padding:0px;
+  border:0px;
+  vertical-align: middle;
+}
+
+#nav-tree a {
+  text-decoration:none;
+  padding:0px;
+  margin:0px;
+  outline:none;
+}
+
+#nav-tree .label {
+  margin:0px;
+  padding:0px;
+  font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+}
+
+#nav-tree .label a {
+  padding:2px;
+}
+
+#nav-tree .selected a {
+  text-decoration:none;
+  color:#fff;
+}
+
+#nav-tree .children_ul {
+  margin:0px;
+  padding:0px;
+}
+
+#nav-tree .item {
+  margin:0px;
+  padding:0px;
+}
+
+#nav-tree {
+  padding: 0px 0px;
+  background-color: #FAFAFF; 
+  font-size:14px;
+  overflow:auto;
+}
+
+#doc-content {
+  overflow:auto;
+  display:block;
+  padding:0px;
+  margin:0px;
+  -webkit-overflow-scrolling : touch; /* iOS 5+ */
+}
+
+#side-nav {
+  padding:0 6px 0 0;
+  margin: 0px;
+  display:block;
+  position: absolute;
+  left: 0px;
+  width: 250px;
+}
+
+.ui-resizable .ui-resizable-handle {
+  display:block;
+}
+
+.ui-resizable-e {
+  background-image:url("splitbar.png");
+  background-size:100%;
+  background-repeat:no-repeat;
+  background-attachment: scroll;
+  cursor:ew-resize;
+  height:100%;
+  right:0;
+  top:0;
+  width:6px;
+}
+
+.ui-resizable-handle {
+  display:none;
+  font-size:0.1px;
+  position:absolute;
+  z-index:1;
+}
+
+#nav-tree-contents {
+  margin: 6px 0px 0px 0px;
+}
+
+#nav-tree {
+  background-image:url('nav_h.png');
+  background-repeat:repeat-x;
+  background-color: #F9FAFC;
+  -webkit-overflow-scrolling : touch; /* iOS 5+ */
+}
+
+#nav-sync {
+  position:absolute;
+  top:5px;
+  right:24px;
+  z-index:0;
+}
+
+#nav-sync img {
+  opacity:0.3;
+}
+
+#nav-sync img:hover {
+  opacity:0.9;
+}
+
+@media print
+{
+  #nav-tree { display: none; }
+  div.ui-resizable-handle { display: none; position: relative; }
+}
+
diff --git a/doc/doxygen/output/html/navtree.js b/doc/doxygen/output/html/navtree.js
new file mode 100644
index 0000000..e6d31b0
--- /dev/null
+++ b/doc/doxygen/output/html/navtree.js
@@ -0,0 +1,517 @@
+var navTreeSubIndices = new Array();
+var arrowDown = '&#9660;';
+var arrowRight = '&#9658;';
+
+function getData(varName)
+{
+  var i = varName.lastIndexOf('/');
+  var n = i>=0 ? varName.substring(i+1) : varName;
+  return eval(n.replace(/\-/g,'_'));
+}
+
+function stripPath(uri)
+{
+  return uri.substring(uri.lastIndexOf('/')+1);
+}
+
+function stripPath2(uri)
+{
+  var i = uri.lastIndexOf('/');
+  var s = uri.substring(i+1);
+  var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/);
+  return m ? uri.substring(i-6) : s;
+}
+
+function hashValue()
+{
+  return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,'');
+}
+
+function hashUrl()
+{
+  return '#'+hashValue();
+}
+
+function pathName()
+{
+  return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, '');
+}
+
+function localStorageSupported()
+{
+  try {
+    return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem;
+  }
+  catch(e) {
+    return false;
+  }
+}
+
+
+function storeLink(link)
+{
+  if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) {
+      window.localStorage.setItem('navpath',link);
+  }
+}
+
+function deleteLink()
+{
+  if (localStorageSupported()) {
+    window.localStorage.setItem('navpath','');
+  }
+}
+
+function cachedLink()
+{
+  if (localStorageSupported()) {
+    return window.localStorage.getItem('navpath');
+  } else {
+    return '';
+  }
+}
+
+function getScript(scriptName,func,show)
+{
+  var head = document.getElementsByTagName("head")[0];
+  var script = document.createElement('script');
+  script.id = scriptName;
+  script.type = 'text/javascript';
+  script.onload = func;
+  script.src = scriptName+'.js';
+  if ($.browser.msie && $.browser.version<=8) {
+    // script.onload does not work with older versions of IE
+    script.onreadystatechange = function() {
+      if (script.readyState=='complete' || script.readyState=='loaded') {
+        func(); if (show) showRoot();
+      }
+    }
+  }
+  head.appendChild(script); 
+}
+
+function createIndent(o,domNode,node,level)
+{
+  var level=-1;
+  var n = node;
+  while (n.parentNode) { level++; n=n.parentNode; }
+  if (node.childrenData) {
+    var imgNode = document.createElement("span");
+    imgNode.className = 'arrow';
+    imgNode.style.paddingLeft=(16*level).toString()+'px';
+    imgNode.innerHTML=arrowRight;
+    node.plus_img = imgNode;
+    node.expandToggle = document.createElement("a");
+    node.expandToggle.href = "javascript:void(0)";
+    node.expandToggle.onclick = function() {
+      if (node.expanded) {
+        $(node.getChildrenUL()).slideUp("fast");
+        node.plus_img.innerHTML=arrowRight;
+        node.expanded = false;
+      } else {
+        expandNode(o, node, false, false);
+      }
+    }
+    node.expandToggle.appendChild(imgNode);
+    domNode.appendChild(node.expandToggle);
+  } else {
+    var span = document.createElement("span");
+    span.className = 'arrow';
+    span.style.width   = 16*(level+1)+'px';
+    span.innerHTML = '&#160;';
+    domNode.appendChild(span);
+  }
+}
+
+var animationInProgress = false;
+
+function gotoAnchor(anchor,aname,updateLocation)
+{
+  var pos, docContent = $('#doc-content');
+  var ancParent = $(anchor.parent());
+  if (ancParent.hasClass('memItemLeft') ||
+      ancParent.hasClass('fieldname') ||
+      ancParent.hasClass('fieldtype') ||
+      ancParent.is(':header'))
+  {
+    pos = ancParent.position().top;
+  } else if (anchor.position()) {
+    pos = anchor.position().top;
+  }
+  if (pos) {
+    var dist = Math.abs(Math.min(
+               pos-docContent.offset().top,
+               docContent[0].scrollHeight-
+               docContent.height()-docContent.scrollTop()));
+    animationInProgress=true;
+    docContent.animate({
+      scrollTop: pos + docContent.scrollTop() - docContent.offset().top
+    },Math.max(50,Math.min(500,dist)),function(){
+      if (updateLocation) window.location.href=aname;
+      animationInProgress=false;
+    });
+  }
+}
+
+function newNode(o, po, text, link, childrenData, lastNode)
+{
+  var node = new Object();
+  node.children = Array();
+  node.childrenData = childrenData;
+  node.depth = po.depth + 1;
+  node.relpath = po.relpath;
+  node.isLast = lastNode;
+
+  node.li = document.createElement("li");
+  po.getChildrenUL().appendChild(node.li);
+  node.parentNode = po;
+
+  node.itemDiv = document.createElement("div");
+  node.itemDiv.className = "item";
+
+  node.labelSpan = document.createElement("span");
+  node.labelSpan.className = "label";
+
+  createIndent(o,node.itemDiv,node,0);
+  node.itemDiv.appendChild(node.labelSpan);
+  node.li.appendChild(node.itemDiv);
+
+  var a = document.createElement("a");
+  node.labelSpan.appendChild(a);
+  node.label = document.createTextNode(text);
+  node.expanded = false;
+  a.appendChild(node.label);
+  if (link) {
+    var url;
+    if (link.substring(0,1)=='^') {
+      url = link.substring(1);
+      link = url;
+    } else {
+      url = node.relpath+link;
+    }
+    a.className = stripPath(link.replace('#',':'));
+    if (link.indexOf('#')!=-1) {
+      var aname = '#'+link.split('#')[1];
+      var srcPage = stripPath(pathName());
+      var targetPage = stripPath(link.split('#')[0]);
+      a.href = srcPage!=targetPage ? url : "javascript:void(0)";
+      a.onclick = function(){
+        storeLink(link);
+        if (!$(a).parent().parent().hasClass('selected'))
+        {
+          $('.item').removeClass('selected');
+          $('.item').removeAttr('id');
+          $(a).parent().parent().addClass('selected');
+          $(a).parent().parent().attr('id','selected');
+        }
+        var anchor = $(aname);
+        gotoAnchor(anchor,aname,true);
+      };
+    } else {
+      a.href = url;
+      a.onclick = function() { storeLink(link); }
+    }
+  } else {
+    if (childrenData != null)
+    {
+      a.className = "nolink";
+      a.href = "javascript:void(0)";
+      a.onclick = node.expandToggle.onclick;
+    }
+  }
+
+  node.childrenUL = null;
+  node.getChildrenUL = function() {
+    if (!node.childrenUL) {
+      node.childrenUL = document.createElement("ul");
+      node.childrenUL.className = "children_ul";
+      node.childrenUL.style.display = "none";
+      node.li.appendChild(node.childrenUL);
+    }
+    return node.childrenUL;
+  };
+
+  return node;
+}
+
+function showRoot()
+{
+  var headerHeight = $("#top").height();
+  var footerHeight = $("#nav-path").height();
+  var windowHeight = $(window).height() - headerHeight - footerHeight;
+  (function (){ // retry until we can scroll to the selected item
+    try {
+      var navtree=$('#nav-tree');
+      navtree.scrollTo('#selected',0,{offset:-windowHeight/2});
+    } catch (err) {
+      setTimeout(arguments.callee, 0);
+    }
+  })();
+}
+
+function expandNode(o, node, imm, showRoot)
+{
+  if (node.childrenData && !node.expanded) {
+    if (typeof(node.childrenData)==='string') {
+      var varName    = node.childrenData;
+      getScript(node.relpath+varName,function(){
+        node.childrenData = getData(varName);
+        expandNode(o, node, imm, showRoot);
+      }, showRoot);
+    } else {
+      if (!node.childrenVisited) {
+        getNode(o, node);
+      } if (imm || ($.browser.msie && $.browser.version>8)) {
+        // somehow slideDown jumps to the start of tree for IE9 :-(
+        $(node.getChildrenUL()).show();
+      } else {
+        $(node.getChildrenUL()).slideDown("fast");
+      }
+      node.plus_img.innerHTML = arrowDown;
+      node.expanded = true;
+    }
+  }
+}
+
+function glowEffect(n,duration)
+{
+  n.addClass('glow').delay(duration).queue(function(next){
+    $(this).removeClass('glow');next();
+  });
+}
+
+function highlightAnchor()
+{
+  var aname = hashUrl();
+  var anchor = $(aname);
+  if (anchor.parent().attr('class')=='memItemLeft'){
+    var rows = $('.memberdecls tr[class$="'+hashValue()+'"]');
+    glowEffect(rows.children(),300); // member without details
+  } else if (anchor.parent().attr('class')=='fieldname'){
+    glowEffect(anchor.parent().parent(),1000); // enum value
+  } else if (anchor.parent().attr('class')=='fieldtype'){
+    glowEffect(anchor.parent().parent(),1000); // struct field
+  } else if (anchor.parent().is(":header")) {
+    glowEffect(anchor.parent(),1000); // section header
+  } else {
+    glowEffect(anchor.next(),1000); // normal member
+  }
+  gotoAnchor(anchor,aname,false);
+}
+
+function selectAndHighlight(hash,n)
+{
+  var a;
+  if (hash) {
+    var link=stripPath(pathName())+':'+hash.substring(1);
+    a=$('.item a[class$="'+link+'"]');
+  }
+  if (a && a.length) {
+    a.parent().parent().addClass('selected');
+    a.parent().parent().attr('id','selected');
+    highlightAnchor();
+  } else if (n) {
+    $(n.itemDiv).addClass('selected');
+    $(n.itemDiv).attr('id','selected');
+  }
+  if ($('#nav-tree-contents .item:first').hasClass('selected')) {
+    $('#nav-sync').css('top','30px');
+  } else {
+    $('#nav-sync').css('top','5px');
+  }
+  showRoot();
+}
+
+function showNode(o, node, index, hash)
+{
+  if (node && node.childrenData) {
+    if (typeof(node.childrenData)==='string') {
+      var varName    = node.childrenData;
+      getScript(node.relpath+varName,function(){
+        node.childrenData = getData(varName);
+        showNode(o,node,index,hash);
+      },true);
+    } else {
+      if (!node.childrenVisited) {
+        getNode(o, node);
+      }
+      $(node.getChildrenUL()).css({'display':'block'});
+      node.plus_img.innerHTML = arrowDown;
+      node.expanded = true;
+      var n = node.children[o.breadcrumbs[index]];
+      if (index+1<o.breadcrumbs.length) {
+        showNode(o,n,index+1,hash);
+      } else {
+        if (typeof(n.childrenData)==='string') {
+          var varName = n.childrenData;
+          getScript(n.relpath+varName,function(){
+            n.childrenData = getData(varName);
+            node.expanded=false;
+            showNode(o,node,index,hash); // retry with child node expanded
+          },true);
+        } else {
+          var rootBase = stripPath(o.toroot.replace(/\..+$/, ''));
+          if (rootBase=="index" || rootBase=="pages" || rootBase=="search") {
+            expandNode(o, n, true, true);
+          }
+          selectAndHighlight(hash,n);
+        }
+      }
+    }
+  } else {
+    selectAndHighlight(hash);
+  }
+}
+
+function removeToInsertLater(element) {
+  var parentNode = element.parentNode;
+  var nextSibling = element.nextSibling;
+  parentNode.removeChild(element);
+  return function() {
+    if (nextSibling) {
+      parentNode.insertBefore(element, nextSibling);
+    } else {
+      parentNode.appendChild(element);
+    }
+  };
+}
+
+function getNode(o, po)
+{
+  var insertFunction = removeToInsertLater(po.li);
+  po.childrenVisited = true;
+  var l = po.childrenData.length-1;
+  for (var i in po.childrenData) {
+    var nodeData = po.childrenData[i];
+    po.children[i] = newNode(o, po, nodeData[0], nodeData[1], nodeData[2],
+      i==l);
+  }
+  insertFunction();
+}
+
+function gotoNode(o,subIndex,root,hash,relpath)
+{
+  var nti = navTreeSubIndices[subIndex][root+hash];
+  o.breadcrumbs = $.extend(true, [], nti ? nti : navTreeSubIndices[subIndex][root]);
+  if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index
+    navTo(o,NAVTREE[0][1],"",relpath);
+    $('.item').removeClass('selected');
+    $('.item').removeAttr('id');
+  }
+  if (o.breadcrumbs) {
+    o.breadcrumbs.unshift(0); // add 0 for root node
+    showNode(o, o.node, 0, hash);
+  }
+}
+
+function navTo(o,root,hash,relpath)
+{
+  var link = cachedLink();
+  if (link) {
+    var parts = link.split('#');
+    root = parts[0];
+    if (parts.length>1) hash = '#'+parts[1].replace(/[^\w\-]/g,'');
+    else hash='';
+  }
+  if (hash.match(/^#l\d+$/)) {
+    var anchor=$('a[name='+hash.substring(1)+']');
+    glowEffect(anchor.parent(),1000); // line number
+    hash=''; // strip line number anchors
+  }
+  var url=root+hash;
+  var i=-1;
+  while (NAVTREEINDEX[i+1]<=url) i++;
+  if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index
+  if (navTreeSubIndices[i]) {
+    gotoNode(o,i,root,hash,relpath)
+  } else {
+    getScript(relpath+'navtreeindex'+i,function(){
+      navTreeSubIndices[i] = eval('NAVTREEINDEX'+i);
+      if (navTreeSubIndices[i]) {
+        gotoNode(o,i,root,hash,relpath);
+      }
+    },true);
+  }
+}
+
+function showSyncOff(n,relpath)
+{
+    n.html('<img src="'+relpath+'sync_off.png" title="'+SYNCOFFMSG+'"/>');
+}
+
+function showSyncOn(n,relpath)
+{
+    n.html('<img src="'+relpath+'sync_on.png" title="'+SYNCONMSG+'"/>');
+}
+
+function toggleSyncButton(relpath)
+{
+  var navSync = $('#nav-sync');
+  if (navSync.hasClass('sync')) {
+    navSync.removeClass('sync');
+    showSyncOff(navSync,relpath);
+    storeLink(stripPath2(pathName())+hashUrl());
+  } else {
+    navSync.addClass('sync');
+    showSyncOn(navSync,relpath);
+    deleteLink();
+  }
+}
+
+function initNavTree(toroot,relpath)
+{
+  var o = new Object();
+  o.toroot = toroot;
+  o.node = new Object();
+  o.node.li = document.getElementById("nav-tree-contents");
+  o.node.childrenData = NAVTREE;
+  o.node.children = new Array();
+  o.node.childrenUL = document.createElement("ul");
+  o.node.getChildrenUL = function() { return o.node.childrenUL; };
+  o.node.li.appendChild(o.node.childrenUL);
+  o.node.depth = 0;
+  o.node.relpath = relpath;
+  o.node.expanded = false;
+  o.node.isLast = true;
+  o.node.plus_img = document.createElement("span");
+  o.node.plus_img.className = 'arrow';
+  o.node.plus_img.innerHTML = arrowRight;
+
+  if (localStorageSupported()) {
+    var navSync = $('#nav-sync');
+    if (cachedLink()) {
+      showSyncOff(navSync,relpath);
+      navSync.removeClass('sync');
+    } else {
+      showSyncOn(navSync,relpath);
+    }
+    navSync.click(function(){ toggleSyncButton(relpath); });
+  }
+
+  $(window).load(function(){
+    navTo(o,toroot,hashUrl(),relpath);
+    showRoot();
+  });
+
+  $(window).bind('hashchange', function(){
+     if (window.location.hash && window.location.hash.length>1){
+       var a;
+       if ($(location).attr('hash')){
+         var clslink=stripPath(pathName())+':'+hashValue();
+         a=$('.item a[class$="'+clslink.replace(/</g,'\\3c ')+'"]');
+       }
+       if (a==null || !$(a).parent().parent().hasClass('selected')){
+         $('.item').removeClass('selected');
+         $('.item').removeAttr('id');
+       }
+       var link=stripPath2(pathName());
+       navTo(o,link,hashUrl(),relpath);
+     } else if (!animationInProgress) {
+       $('#doc-content').scrollTop(0);
+       $('.item').removeClass('selected');
+       $('.item').removeAttr('id');
+       navTo(o,toroot,hashUrl(),relpath);
+     }
+  })
+}
+
diff --git a/doc/doxygen/output/html/navtreedata.js b/doc/doxygen/output/html/navtreedata.js
new file mode 100644
index 0000000..579ccd7
--- /dev/null
+++ b/doc/doxygen/output/html/navtreedata.js
@@ -0,0 +1,61 @@
+var NAVTREE =
+[
+  [ "lwIP", "index.html", [
+    [ "Overview", "index.html", null ],
+    [ "Upgrading", "upgrading.html", null ],
+    [ "Changelog", "changelog.html", null ],
+    [ "How to contribute to lwIP", "contrib.html", null ],
+    [ "Common pitfalls", "pitfalls.html", null ],
+    [ "Reporting bugs", "bugs.html", null ],
+    [ "Zero-copy RX", "zerocopyrx.html", null ],
+    [ "System initalization", "sys_init.html", null ],
+    [ "Multithreading", "multithreading.html", null ],
+    [ "Optimization hints", "optimization.html", null ],
+    [ "Deprecated List", "deprecated.html", null ],
+    [ "Modules", "modules.html", "modules" ],
+    [ "Data Structures", "annotated.html", [
+      [ "Data Structures", "annotated.html", "annotated_dup" ],
+      [ "Data Fields", "functions.html", [
+        [ "All", "functions.html", "functions_dup" ],
+        [ "Variables", "functions_vars.html", "functions_vars" ]
+      ] ]
+    ] ],
+    [ "Files", null, [
+      [ "File List", "files.html", "files" ],
+      [ "Globals", "globals.html", [
+        [ "All", "globals.html", "globals_dup" ],
+        [ "Functions", "globals_func.html", "globals_func" ],
+        [ "Variables", "globals_vars.html", null ],
+        [ "Typedefs", "globals_type.html", null ],
+        [ "Enumerations", "globals_enum.html", null ],
+        [ "Enumerator", "globals_eval.html", null ],
+        [ "Macros", "globals_defs.html", "globals_defs" ]
+      ] ]
+    ] ]
+  ] ]
+];
+
+var NAVTREEINDEX =
+[
+"altcp_8c.html",
+"functions_j.html",
+"group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e",
+"group__httpd__opts.html#gacc3e7667baa2cfafd23de2b152df7a63",
+"group__ip6addr.html#ga5181d2cb6b9254eb5ad4137f7b3635a0",
+"group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83",
+"group__lwip__opts__memp.html#ga8e136f5811e6652c6c5d2fcf596f0893",
+"group__lwip__opts__thread.html#ga42b2c7a3042d7c3efd00f367f5837435",
+"group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d",
+"group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9",
+"group__smtp__opts.html#ga021d8133159895a2dbf5fb0b243da9fa",
+"group__socket.html#gab096fb7dbc3f84be1699a87dce980f2f",
+"http__client_8c.html#ad2ec42c8e7adaef67266a5bd12c4ad2a",
+"lowpan6__common_8h.html",
+"pbuf_8h.html#a567a0dfa01b0e5540f9416a200ed163f",
+"sockets_8h.html#a0a250b3b4d1827e3a3661327f5e80ae0",
+"structnetbios__hdr.html",
+"tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb"
+];
+
+var SYNCONMSG = 'click to disable panel synchronisation';
+var SYNCOFFMSG = 'click to enable panel synchronisation';
\ No newline at end of file
diff --git a/doc/doxygen/output/html/navtreeindex0.js b/doc/doxygen/output/html/navtreeindex0.js
new file mode 100644
index 0000000..7bab457
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex0.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX0 =
+{
+"altcp_8c.html":[13,0,0,2,2],
+"altcp_8c.html#a6a99f8757c18fbc9b9f30925afbcf4c2":[13,0,0,2,2,2],
+"altcp_8c.html#afd7f6b6602e89cff51f8a8ea0315321d":[13,0,0,2,2,8],
+"altcp_8h.html":[13,0,0,3,1,3],
+"altcp__alloc_8c.html":[13,0,0,2,3],
+"altcp__priv_8h.html":[13,0,0,3,1,1,0],
+"altcp__priv_8h.html#a6a99f8757c18fbc9b9f30925afbcf4c2":[13,0,0,3,1,1,0,0],
+"altcp__priv_8h.html#afd7f6b6602e89cff51f8a8ea0315321d":[13,0,0,3,1,1,0,1],
+"altcp__proxyconnect_8c.html":[13,0,0,1,1,0],
+"altcp__proxyconnect_8c.html#a24e122d2bc2c0b9f86074c1e8d5ccfe4":[13,0,0,1,1,0,3],
+"altcp__proxyconnect_8c.html#a344227f22aa1b58f7ed737a2d4f4636f":[13,0,0,1,1,0,0],
+"altcp__proxyconnect_8c.html#a3d3af45390467ceeaa064b7e28dd43a9":[13,0,0,1,1,0,1],
+"altcp__proxyconnect_8c.html#a5ff49bcd035847a8915f18deef4172a9":[13,0,0,1,1,0,4],
+"altcp__proxyconnect_8c.html#ae774782064a92d0f58ce07b57a5360d1":[13,0,0,1,1,0,2],
+"altcp__proxyconnect_8h.html":[13,0,0,3,1,0,0],
+"altcp__proxyconnect_8h.html#a24e122d2bc2c0b9f86074c1e8d5ccfe4":[13,0,0,3,1,0,0,2],
+"altcp__proxyconnect_8h.html#a3d3af45390467ceeaa064b7e28dd43a9":[13,0,0,3,1,0,0,0],
+"altcp__proxyconnect_8h.html#a5ff49bcd035847a8915f18deef4172a9":[13,0,0,3,1,0,0,3],
+"altcp__proxyconnect_8h.html#ae774782064a92d0f58ce07b57a5360d1":[13,0,0,3,1,0,0,1],
+"altcp__tcp_8c.html":[13,0,0,2,4],
+"altcp__tcp_8c.html#a211215e43cb40bd204a20c34316b7caa":[13,0,0,2,4,0],
+"altcp__tcp_8h.html":[13,0,0,3,1,4],
+"altcp__tcp_8h.html#a211215e43cb40bd204a20c34316b7caa":[13,0,0,3,1,4,0],
+"altcp__tls_8h.html":[13,0,0,3,1,5],
+"altcp__tls__mbedtls_8c.html":[13,0,0,1,0,0],
+"altcp__tls__mbedtls__mem_8c.html":[13,0,0,1,0,1],
+"altcp__tls__mbedtls__mem_8h.html":[13,0,0,1,0,2],
+"altcp__tls__mbedtls__opts_8h.html":[13,0,0,3,1,0,1],
+"altcp__tls__mbedtls__opts_8h.html#a6acb28346f87b2310fc00ec1fccba2b6":[13,0,0,3,1,0,1,1],
+"altcp__tls__mbedtls__opts_8h.html#a7727456eeb0b3311213936413d238989":[13,0,0,3,1,0,1,0],
+"altcp__tls__mbedtls__opts_8h.html#ac8dbfe10a4a9a64c1e2c62ea97e48639":[13,0,0,3,1,0,1,2],
+"altcp__tls__mbedtls__structs_8h.html":[13,0,0,1,0,3],
+"annotated.html":[12,0],
+"api_8h.html":[13,0,0,3,1,6],
+"api_8h.html#a04785274634a5b504c760731c2e70725":[13,0,0,3,1,6,19],
+"api_8h.html#a24d62a2a03ba421fcf2bdce1ea89b949":[13,0,0,3,1,6,4],
+"api_8h.html#a28430d1d86733f1bf98dc31305c42104":[13,0,0,3,1,6,36],
+"api_8h.html#a2c6c9c1869f443c5ec7b31180a44fada":[13,0,0,3,1,6,26],
+"api_8h.html#a3ce3ad9f660e99b11fec20cafaf8f016":[13,0,0,3,1,6,20],
+"api_8h.html#a3ce590f58be8f60dbde361920863b26d":[13,0,0,3,1,6,2],
+"api_8h.html#a3e130339f00202b3ab714af502163a2d":[13,0,0,3,1,6,23],
+"api_8h.html#a505c3b8e400babf9681e09c945b7f421":[13,0,0,3,1,6,47],
+"api_8h.html#a5789f0030b895b40625a74deb5a1092f":[13,0,0,3,1,6,13],
+"api_8h.html#a5c6ded2c082de1536019b197a0a912db":[13,0,0,3,1,6,25],
+"api_8h.html#a60892e4eb139f10157847fea4266bf5b":[13,0,0,3,1,6,7],
+"api_8h.html#a62cd17ad03bb2817cb0c419e1c9790b1":[13,0,0,3,1,6,21],
+"api_8h.html#a6a578dd5b55e4457e0d23574ec9c55bb":[13,0,0,3,1,6,18],
+"api_8h.html#a70bb861ee643b60ee402fd48f581f58d":[13,0,0,3,1,6,6],
+"api_8h.html#a7d6e84458eec796b0b0ce1bb247f323f":[13,0,0,3,1,6,12],
+"api_8h.html#a805a90b546c5a149f04782351633979b":[13,0,0,3,1,6,46],
+"api_8h.html#a992b4fe8a855fd94861738f7260d0a32":[13,0,0,3,1,6,52],
+"api_8h.html#a9d791955a4256a0589a3844e4e6f0f9c":[13,0,0,3,1,6,5],
+"api_8h.html#abee57aa0ba63e35742d411bc5224900a":[13,0,0,3,1,6,9],
+"api_8h.html#ac0298c287dc3823047c378c014ff1eb0":[13,0,0,3,1,6,11],
+"api_8h.html#ad0a0434e5ff08bb350740cb840e2aca8":[13,0,0,3,1,6,41],
+"api_8h.html#af722260882d14c49afb765293ffb0155":[13,0,0,3,1,6,24],
+"api_8h.html#af77be7590d3712259e78103c1dddf63f":[13,0,0,3,1,6,8],
+"api__lib_8c.html":[13,0,0,0,0],
+"api__lib_8c.html#a28430d1d86733f1bf98dc31305c42104":[13,0,0,0,0,8],
+"api__lib_8c.html#a505c3b8e400babf9681e09c945b7f421":[13,0,0,0,0,19],
+"api__lib_8c.html#a805a90b546c5a149f04782351633979b":[13,0,0,0,0,18],
+"api__lib_8c.html#a992b4fe8a855fd94861738f7260d0a32":[13,0,0,0,0,24],
+"api__lib_8c.html#ad0a0434e5ff08bb350740cb840e2aca8":[13,0,0,0,0,13],
+"api__msg_8c.html":[13,0,0,0,1],
+"api__msg_8c.html#a6f18f57eeda7b0596110930e696f9902":[13,0,0,0,1,4],
+"api__msg_8c.html#a7402b52416828906a5679828cce37546":[13,0,0,0,1,9],
+"api__msg_8c.html#a875b82ad129bdec1c6f2c21cbeedc48b":[13,0,0,0,1,17],
+"api__msg_8c.html#a919865fa64270a3e4cb719ddff2fead9":[13,0,0,0,1,16],
+"api__msg_8c.html#a9e77da8492e93d570bc1ec37f3c91d59":[13,0,0,0,1,5],
+"api__msg_8c.html#aa7d753d86818bfd77c1d73dab8dc943f":[13,0,0,0,1,11],
+"api__msg_8c.html#aa8e265922cda9f7fd54bf39e4ecf3768":[13,0,0,0,1,1],
+"api__msg_8c.html#aacc47257c0a5aa5eb107da0cfc699722":[13,0,0,0,1,10],
+"api__msg_8c.html#ab6ae6036baf5c8fef22228ceb5e3ff9f":[13,0,0,0,1,13],
+"api__msg_8c.html#abc6e1a4f8dd4640ab00eae4bbfdb7236":[13,0,0,0,1,12],
+"api__msg_8c.html#ac714bdd3d57e34f0a6517a469d80df6c":[13,0,0,0,1,14],
+"api__msg_8c.html#aca4545a471ead1bc673ea93fe85f7e5c":[13,0,0,0,1,15],
+"api__msg_8c.html#adec8a5ddbcbdacba099c630c8310d34a":[13,0,0,0,1,6],
+"api__msg_8c.html#af33f432db6e3f111d4ee5876089e4163":[13,0,0,0,1,7],
+"api__msg_8c.html#af4fed475f06818552ffefc8a1eda6605":[13,0,0,0,1,2],
+"api__msg_8c.html#afc455a5f63fa3bc85022e34861a2fea5":[13,0,0,0,1,0],
+"api__msg_8c.html#afd3802b2f12e27928ccc0f759b887d61":[13,0,0,0,1,8],
+"api__msg_8c.html#aff73e0fcdc13c7cb97a4bfbd71a4347d":[13,0,0,0,1,3],
+"api__msg_8h.html":[13,0,0,3,1,1,1],
+"api__msg_8h.html#a6f18f57eeda7b0596110930e696f9902":[13,0,0,3,1,1,1,6],
+"api__msg_8h.html#a7402b52416828906a5679828cce37546":[13,0,0,3,1,1,1,11],
+"api__msg_8h.html#a875b82ad129bdec1c6f2c21cbeedc48b":[13,0,0,3,1,1,1,19],
+"api__msg_8h.html#a919865fa64270a3e4cb719ddff2fead9":[13,0,0,3,1,1,1,18],
+"api__msg_8h.html#a9e77da8492e93d570bc1ec37f3c91d59":[13,0,0,3,1,1,1,7],
+"api__msg_8h.html#aa7d753d86818bfd77c1d73dab8dc943f":[13,0,0,3,1,1,1,13],
+"api__msg_8h.html#aa8e265922cda9f7fd54bf39e4ecf3768":[13,0,0,3,1,1,1,3],
+"api__msg_8h.html#aacc47257c0a5aa5eb107da0cfc699722":[13,0,0,3,1,1,1,12],
+"api__msg_8h.html#ab6ae6036baf5c8fef22228ceb5e3ff9f":[13,0,0,3,1,1,1,15],
+"api__msg_8h.html#abc6e1a4f8dd4640ab00eae4bbfdb7236":[13,0,0,3,1,1,1,14],
+"api__msg_8h.html#ac714bdd3d57e34f0a6517a469d80df6c":[13,0,0,3,1,1,1,16],
+"api__msg_8h.html#aca4545a471ead1bc673ea93fe85f7e5c":[13,0,0,3,1,1,1,17],
+"api__msg_8h.html#adec8a5ddbcbdacba099c630c8310d34a":[13,0,0,3,1,1,1,8],
+"api__msg_8h.html#af33f432db6e3f111d4ee5876089e4163":[13,0,0,3,1,1,1,9],
+"api__msg_8h.html#af4fed475f06818552ffefc8a1eda6605":[13,0,0,3,1,1,1,4],
+"api__msg_8h.html#afc455a5f63fa3bc85022e34861a2fea5":[13,0,0,3,1,1,1,2],
+"api__msg_8h.html#afd3802b2f12e27928ccc0f759b887d61":[13,0,0,3,1,1,1,10],
+"api__msg_8h.html#aff73e0fcdc13c7cb97a4bfbd71a4347d":[13,0,0,3,1,1,1,5],
+"apps_2snmp_8h.html":[13,0,0,3,1,0,14],
+"apps_2snmp_8h.html#a1856efbe83199f456c34a4e5139dfb16":[13,0,0,3,1,0,14,5],
+"apps_2snmp_8h.html#a9a2e5824deab50e639b01181307a0926":[13,0,0,3,1,0,14,7],
+"apps_2snmp_8h.html#aaf312d8bdbeed2c02560321ab24a022f":[13,0,0,3,1,0,14,1],
+"apps_2snmp_8h.html#ab3691cecfa911baa52ccf6054022ba43":[13,0,0,3,1,0,14,4],
+"apps_2snmp_8h.html#ac1cd822650d9ac66d0333a5ad600cfee":[13,0,0,3,1,0,14,3],
+"apps_2snmp_8h.html#ae9310bbe1948b3c3bc64c073d4621019":[13,0,0,3,1,0,14,2],
+"apps_2snmp_8h.html#afa665cdc02ccd5ee9fe0c4cb1b792186":[13,0,0,3,1,0,14,6],
+"arch_8h.html":[13,0,0,3,1,7],
+"autoip_8c.html":[13,0,0,2,0,0],
+"autoip_8c.html#a11df7a20d52680cd8c1c18fba2b91e9e":[13,0,0,2,0,0,3],
+"autoip_8c.html#a1b4f0c53da17395d9de92a85708a1bb9":[13,0,0,2,0,0,7],
+"autoip_8c.html#a634535156cc1a8cf9f04d3d5c74f8a59":[13,0,0,2,0,0,1],
+"autoip_8c.html#a746fc1d7db1bf1617afae166c9d92c2d":[13,0,0,2,0,0,8],
+"autoip_8c.html#acaf2793325c60dc4531c21a3fd55c16e":[13,0,0,2,0,0,2],
+"autoip_8c.html#acec75069f6e6ecbe200c5691e56ecd43":[13,0,0,2,0,0,0],
+"autoip_8h.html":[13,0,0,3,1,8],
+"autoip_8h.html#a11df7a20d52680cd8c1c18fba2b91e9e":[13,0,0,3,1,8,4],
+"autoip_8h.html#a1b4f0c53da17395d9de92a85708a1bb9":[13,0,0,3,1,8,8],
+"autoip_8h.html#a746fc1d7db1bf1617afae166c9d92c2d":[13,0,0,3,1,8,9],
+"autoip_8h.html#a8986919a452ab77eec9a199ff6668e92":[13,0,0,3,1,8,2],
+"autoip_8h.html#aaeb4b778fce078bee84144ab50916b15":[13,0,0,3,1,8,1],
+"autoip_8h.html#acaf2793325c60dc4531c21a3fd55c16e":[13,0,0,3,1,8,3],
+"bridgeif_8c.html":[13,0,0,4,1],
+"bridgeif_8h.html":[13,0,0,3,2,1],
+"bridgeif__fdb_8c.html":[13,0,0,4,2],
+"bridgeif__opts_8h.html":[13,0,0,3,2,2],
+"bugs.html":[5],
+"changelog.html":[2],
+"compat_2posix_2arpa_2inet_8h.html":[13,0,0,3,0,0,0,0],
+"compat_2posix_2netdb_8h.html":[13,0,0,3,0,0,3],
+"compat_2stdc_2errno_8h.html":[13,0,0,3,0,1,0],
+"contrib.html":[3],
+"debug_8h.html":[13,0,0,3,1,9],
+"debug_8h.html#a957d947c94fda9b85d4aee0aab72952a":[13,0,0,3,1,9,10],
+"def_8c.html":[13,0,0,2,5],
+"def_8c.html#a14f94347a5b9b9e3602705b75b7ae524":[13,0,0,2,5,0],
+"def_8c.html#ad637280639de4066392e6b5614fa3e56":[13,0,0,2,5,1],
+"def_8h.html":[13,0,0,3,1,10],
+"def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37":[13,0,0,3,1,10,1],
+"def_8h.html#ac49eb25570806fb51c329d4f86302cc2":[13,0,0,3,1,10,2],
+"def_8h.html#acf56d3da92a0a7a8a62a617e793e948c":[13,0,0,3,1,10,0],
+"deprecated.html":[10],
+"dhcp6_8c.html":[13,0,0,2,1,0],
+"dhcp6_8c.html#a5289027cb2b166d08bc55b7ed2d4756d":[13,0,0,2,1,0,7],
+"dhcp6_8c.html#abcce06f078da4b03265d20c0bc1bdce0":[13,0,0,2,1,0,8],
+"dhcp6_8c.html#ac4c519a2e10067f277d6b09e60919e9a":[13,0,0,2,1,0,0],
+"dhcp6_8c.html#af0f47aac3c04c84a7143fa6925e9fdba":[13,0,0,2,1,0,5],
+"dhcp6_8h.html":[13,0,0,3,1,12],
+"dhcp6_8h.html#a5289027cb2b166d08bc55b7ed2d4756d":[13,0,0,3,1,12,8],
+"dhcp6_8h.html#a76941ddba22fe00dfc47d2f339f7aca3":[13,0,0,3,1,12,0],
+"dhcp6_8h.html#af0f47aac3c04c84a7143fa6925e9fdba":[13,0,0,3,1,12,6],
+"dhcp6_8h.html#afdd69327dc7d9f5cc4f029d706f60c8f":[13,0,0,3,1,12,1],
+"dhcp_8c.html":[13,0,0,2,0,1],
+"dhcp_8c.html#a04f3824720223c439165243527906002":[13,0,0,2,0,1,9],
+"dhcp_8c.html#a058b71e1d26b3758b29d16d9f892c8cc":[13,0,0,2,0,1,17],
+"dhcp_8c.html#a1fc0a94e0b94f13c5d302018f7ecb535":[13,0,0,2,0,1,4],
+"dhcp_8c.html#a5abd232496063bddcbc6692c0e8f9c1f":[13,0,0,2,0,1,18],
+"dhcp_8c.html#a601d97faa24fa7289244bb452f052045":[13,0,0,2,0,1,7],
+"dhcp_8c.html#a63e9ec4517b80d8576f218d905e31a9b":[13,0,0,2,0,1,1],
+"dhcp_8c.html#a8c3b584d223b995b48613ad96cb776a0":[13,0,0,2,0,1,3],
+"dhcp_8c.html#aa52c2b64ef42fbad84a3bcd58052caab":[13,0,0,2,0,1,2],
+"dhcp_8c.html#ad6de9c5120654454a330bf5de53c4835":[13,0,0,2,0,1,0],
+"dhcp_8c.html#ad7480883d64f3d6f083c8aa933b5e3cb":[13,0,0,2,0,1,6],
+"dhcp_8c.html#ae24a2529372218327ab9cb6592041c85":[13,0,0,2,0,1,16],
+"dhcp_8h.html":[13,0,0,3,1,11],
+"dhcp_8h.html#a04f3824720223c439165243527906002":[13,0,0,3,1,11,9],
+"dhcp_8h.html#a1fc0a94e0b94f13c5d302018f7ecb535":[13,0,0,3,1,11,4],
+"dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e":[13,0,0,3,1,11,1],
+"dhcp_8h.html#a601d97faa24fa7289244bb452f052045":[13,0,0,3,1,11,7],
+"dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f":[13,0,0,3,1,11,2],
+"dhcp_8h.html#aa92284faa099dac4331c1fc0b997dabc":[13,0,0,3,1,11,3],
+"dhcp_8h.html#ad7480883d64f3d6f083c8aa933b5e3cb":[13,0,0,3,1,11,6],
+"dhcp_8h.html#ad84b8f4deec421bbf6fd85e8fae047d6":[13,0,0,3,1,11,0],
+"dhcp_8h.html#ae24a2529372218327ab9cb6592041c85":[13,0,0,3,1,11,16],
+"dir_149963277126306875d8bfe8322084f3.html":[13,0,0,1,6],
+"dir_1cb496c74bbaf54ecc99133e1c434e0c.html":[13,0,0,1,0],
+"dir_1e445e767c368c70d58af8a0b7552719.html":[13,0,0,3,0],
+"dir_34adf996f92d0eef72c45a7167a966e6.html":[13,0,0,1,1],
+"dir_403e202f99dba154c685be932a8e0c34.html":[13,0,0,1,9],
+"dir_439fcb6f68ea6a3dc0078b338960fd8f.html":[13,0,0,3,2,0],
+"dir_460c501b2432fc107adcb38111835e48.html":[13,0,0,3,1,1],
+"dir_4b846c6b6971d2800eff93d75504accd.html":[13,0,0,1,2],
+"dir_4e6b3cf33a61b6caac9c8ac30c866f37.html":[13,0,0,3,1],
+"dir_53adf0b982dc8545998aae3f283a5a58.html":[13,0,0,1],
+"dir_56d2b6ddbb44630b0fd661af6321f9c4.html":[13,0,0,1,5],
+"dir_68267d1309a1af8e8297ef4c3efbcdba.html":[13,0,0],
+"dir_6aa605ad180e7b166767bf4f86888ab5.html":[13,0,0,4,0],
+"dir_6b1b06896a870ebfb9c854c4c71f4ff5.html":[13,0,0,3,0,0,0],
+"dir_8da39adb2a11af660bdd7075b7323870.html":[13,0,0,3,0,0,2],
+"dir_900e6f7ff90690cb8edb53323dd38d80.html":[13,0,0,4],
+"dir_a32e111ee6805cfc63488fd2d37f2390.html":[13,0,0,2,0],
+"dir_aebb8dcc11953d78e620bbef0b9e2183.html":[13,0,0,2],
+"dir_b0856f6b0d80ccb263b2f415c91f9e17.html":[13,0,0,3],
+"dir_b42baff89a1adc9a57da7decb1835b6b.html":[13,0,0,3,0,1],
+"dir_c62aba36f6630fea5cd7fe1c941850d4.html":[13,0,0,3,0,0,1],
+"dir_c9a67764bf8a12cf6b427bb859cbcd0b.html":[13,0,0,3,2],
+"dir_da61e3e9a357748887e3ca8d7c5a0c16.html":[13,0,0,0],
+"dir_da9c6f43d3cd00be3de224bac907a425.html":[13,0,0,2,1],
+"dir_dfacd4b005f6a743295cd1d76eff7420.html":[13,0,0,1,4],
+"dir_e7856a6aeaebbc124e80ad9550aedba4.html":[13,0,0,1,8],
+"dir_f9284811ac594eafdc3134d5f8b945cb.html":[13,0,0,3,1,0],
+"dir_fa0f2b7ac208069fc8d28c28af349d8d.html":[13,0,0,3,1,2],
+"dir_fb3f7e43f39ddb210bd1444e66d055f1.html":[13,0,0,1,7],
+"dir_fe219fca207b878205c0dd92278d118b.html":[13,0,0,3,0,0],
+"dir_febe3a637907666e8b25366ae60efc0b.html":[13,0,0,1,3],
+"dns_8c.html":[13,0,0,2,6],
+"dns_8c.html#a7f5553dc4a0d2bf99ba1282a86df31e2":[13,0,0,2,6,4],
+"dns_8c.html#a9209c204996270af5cfdfd6e391267a1":[13,0,0,2,6,6],
+"dns_8c.html#a9389f374ec66488aa4f42a652583f533":[13,0,0,2,6,12],
+"dns_8c.html#a97f3b0c56aeee091fdf2f07faf864ce0":[13,0,0,2,6,5],
+"dns_8c.html#adb31c3b6180773bd11f914c327f209cf":[13,0,0,2,6,10],
+"dns_8h.html":[13,0,0,3,1,13],
+"dns_8h.html#a464a7435c4c00735af59033d2acd83bb":[13,0,0,3,1,13,0],
+"dns_8h.html#a9389f374ec66488aa4f42a652583f533":[13,0,0,3,1,13,7],
+"dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae":[13,0,0,3,1,13,1],
+"dns_8h.html#adb31c3b6180773bd11f914c327f209cf":[13,0,0,3,1,13,5],
+"err_8c.html":[13,0,0,0,2],
+"err_8h.html":[13,0,0,3,1,14],
+"etharp_8c.html":[13,0,0,2,0,2],
+"etharp_8c.html#a0a03fea13e060da5a53a10a75a96def9":[13,0,0,2,0,2,1],
+"etharp_8c.html#a0f8ca87c5472fa165763c8c38b76174c":[13,0,0,2,0,2,5],
+"etharp_8c.html#a19258c75a3778b6ed0c82f63a419502d":[13,0,0,2,0,2,8],
+"etharp_8c.html#a3e56faced96841e615f88dd57d1b2b15":[13,0,0,2,0,2,10],
+"etharp_8c.html#a540a5506979693ef9ac4496db9bfa7d6":[13,0,0,2,0,2,7],
+"etharp_8c.html#a654f4dad71f7e2bc4820094648f37a26":[13,0,0,2,0,2,11],
+"etharp_8c.html#a96f8787ca623e704da1d32ca7dd6d6d9":[13,0,0,2,0,2,2],
+"etharp_8c.html#ab93df7ccb26496100d45137541e863c8":[13,0,0,2,0,2,6],
+"etharp_8c.html#ac71515a6f140b25de49e9bf432b2bb2a":[13,0,0,2,0,2,0],
+"etharp_8c.html#ae180772e31346a0afeb707ad172dd19c":[13,0,0,2,0,2,9],
+"etharp_8c.html#ae94677a2a5f3698276027c7475f6ca05":[13,0,0,2,0,2,4],
+"etharp_8c.html#ae95dee9363e6d3417298e07380b2d383":[13,0,0,2,0,2,3],
+"ethernet_8c.html":[13,0,0,4,3],
+"ethip6_8c.html":[13,0,0,2,1,1],
+"ethip6_8c.html#ab5326546d33174f91f1fb0cc6d398bfd":[13,0,0,2,1,1,0],
+"ethip6_8h.html":[13,0,0,3,1,17],
+"ethip6_8h.html#ab5326546d33174f91f1fb0cc6d398bfd":[13,0,0,3,1,17,0],
+"files.html":[13,0],
+"functions.html":[12,1,0,0],
+"functions.html":[12,1,0],
+"functions_a.html":[12,1,0,1],
+"functions_b.html":[12,1,0,2],
+"functions_c.html":[12,1,0,3],
+"functions_d.html":[12,1,0,4],
+"functions_e.html":[12,1,0,5],
+"functions_f.html":[12,1,0,6],
+"functions_g.html":[12,1,0,7],
+"functions_h.html":[12,1,0,8],
+"functions_i.html":[12,1,0,9]
+};
diff --git a/doc/doxygen/output/html/navtreeindex1.js b/doc/doxygen/output/html/navtreeindex1.js
new file mode 100644
index 0000000..4031ca7
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex1.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX1 =
+{
+"functions_j.html":[12,1,0,10],
+"functions_k.html":[12,1,0,11],
+"functions_l.html":[12,1,0,12],
+"functions_m.html":[12,1,0,13],
+"functions_n.html":[12,1,0,14],
+"functions_o.html":[12,1,0,15],
+"functions_p.html":[12,1,0,16],
+"functions_q.html":[12,1,0,17],
+"functions_r.html":[12,1,0,18],
+"functions_s.html":[12,1,0,19],
+"functions_t.html":[12,1,0,20],
+"functions_u.html":[12,1,0,21],
+"functions_v.html":[12,1,0,22],
+"functions_vars.html":[12,1,1],
+"functions_vars.html":[12,1,1,0],
+"functions_vars_a.html":[12,1,1,1],
+"functions_vars_b.html":[12,1,1,2],
+"functions_vars_c.html":[12,1,1,3],
+"functions_vars_d.html":[12,1,1,4],
+"functions_vars_e.html":[12,1,1,5],
+"functions_vars_f.html":[12,1,1,6],
+"functions_vars_g.html":[12,1,1,7],
+"functions_vars_h.html":[12,1,1,8],
+"functions_vars_i.html":[12,1,1,9],
+"functions_vars_j.html":[12,1,1,10],
+"functions_vars_k.html":[12,1,1,11],
+"functions_vars_l.html":[12,1,1,12],
+"functions_vars_m.html":[12,1,1,13],
+"functions_vars_n.html":[12,1,1,14],
+"functions_vars_o.html":[12,1,1,15],
+"functions_vars_p.html":[12,1,1,16],
+"functions_vars_q.html":[12,1,1,17],
+"functions_vars_r.html":[12,1,1,18],
+"functions_vars_s.html":[12,1,1,19],
+"functions_vars_t.html":[12,1,1,20],
+"functions_vars_u.html":[12,1,1,21],
+"functions_vars_v.html":[12,1,1,22],
+"functions_vars_w.html":[12,1,1,23],
+"functions_vars_z.html":[12,1,1,24],
+"functions_w.html":[12,1,0,23],
+"functions_z.html":[12,1,0,24],
+"globals.html":[13,1,0],
+"globals.html":[13,1,0,0],
+"globals_b.html":[13,1,0,1],
+"globals_c.html":[13,1,0,2],
+"globals_d.html":[13,1,0,3],
+"globals_defs.html":[13,1,6],
+"globals_defs.html":[13,1,6,0],
+"globals_defs_b.html":[13,1,6,1],
+"globals_defs_c.html":[13,1,6,2],
+"globals_defs_d.html":[13,1,6,3],
+"globals_defs_e.html":[13,1,6,4],
+"globals_defs_f.html":[13,1,6,5],
+"globals_defs_g.html":[13,1,6,6],
+"globals_defs_h.html":[13,1,6,7],
+"globals_defs_i.html":[13,1,6,8],
+"globals_defs_l.html":[13,1,6,9],
+"globals_defs_m.html":[13,1,6,10],
+"globals_defs_n.html":[13,1,6,11],
+"globals_defs_p.html":[13,1,6,12],
+"globals_defs_r.html":[13,1,6,13],
+"globals_defs_s.html":[13,1,6,14],
+"globals_defs_t.html":[13,1,6,15],
+"globals_defs_u.html":[13,1,6,16],
+"globals_defs_w.html":[13,1,6,17],
+"globals_defs_z.html":[13,1,6,18],
+"globals_e.html":[13,1,0,4],
+"globals_enum.html":[13,1,4],
+"globals_eval.html":[13,1,5],
+"globals_f.html":[13,1,0,5],
+"globals_func.html":[13,1,1,0],
+"globals_func.html":[13,1,1],
+"globals_func_b.html":[13,1,1,1],
+"globals_func_d.html":[13,1,1,2],
+"globals_func_e.html":[13,1,1,3],
+"globals_func_h.html":[13,1,1,4],
+"globals_func_i.html":[13,1,1,5],
+"globals_func_l.html":[13,1,1,6],
+"globals_func_m.html":[13,1,1,7],
+"globals_func_n.html":[13,1,1,8],
+"globals_func_p.html":[13,1,1,9],
+"globals_func_r.html":[13,1,1,10],
+"globals_func_s.html":[13,1,1,11],
+"globals_func_t.html":[13,1,1,12],
+"globals_func_u.html":[13,1,1,13],
+"globals_func_z.html":[13,1,1,14],
+"globals_g.html":[13,1,0,6],
+"globals_h.html":[13,1,0,7],
+"globals_i.html":[13,1,0,8],
+"globals_l.html":[13,1,0,9],
+"globals_m.html":[13,1,0,10],
+"globals_n.html":[13,1,0,11],
+"globals_p.html":[13,1,0,12],
+"globals_r.html":[13,1,0,13],
+"globals_s.html":[13,1,0,14],
+"globals_t.html":[13,1,0,15],
+"globals_type.html":[13,1,3],
+"globals_u.html":[13,1,0,16],
+"globals_vars.html":[13,1,2],
+"globals_w.html":[13,1,0,17],
+"globals_z.html":[13,1,0,18],
+"group__altcp.html":[11,2,0,0,0],
+"group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319":[13,0,0,2,2,20],
+"group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319":[11,2,0,0,0,22],
+"group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319":[13,0,0,3,1,3,20],
+"group__altcp.html#ga197a33af038556a04d8f27c7033d771f":[13,0,0,2,2,3],
+"group__altcp.html#ga197a33af038556a04d8f27c7033d771f":[11,2,0,0,0,6],
+"group__altcp.html#ga197a33af038556a04d8f27c7033d771f":[13,0,0,3,1,3,4],
+"group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0":[13,0,0,2,2,15],
+"group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0":[11,2,0,0,0,17],
+"group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0":[13,0,0,3,1,3,15],
+"group__altcp.html#ga4329798afdf3709c789a2ee060ee3993":[13,0,0,2,2,5],
+"group__altcp.html#ga4329798afdf3709c789a2ee060ee3993":[11,2,0,0,0,8],
+"group__altcp.html#ga4329798afdf3709c789a2ee060ee3993":[13,0,0,3,1,3,6],
+"group__altcp.html#ga485b248680f73b9876d8674029c5157c":[13,0,0,2,2,4],
+"group__altcp.html#ga485b248680f73b9876d8674029c5157c":[11,2,0,0,0,7],
+"group__altcp.html#ga485b248680f73b9876d8674029c5157c":[13,0,0,3,1,3,5],
+"group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5":[13,0,0,2,2,19],
+"group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5":[11,2,0,0,0,21],
+"group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5":[13,0,0,3,1,3,19],
+"group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5":[13,0,0,2,2,22],
+"group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5":[11,2,0,0,0,24],
+"group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5":[13,0,0,3,1,3,22],
+"group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6":[13,0,0,2,2,14],
+"group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6":[11,2,0,0,0,16],
+"group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6":[13,0,0,3,1,3,14],
+"group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9":[13,0,0,2,2,1],
+"group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9":[11,2,0,0,0,5],
+"group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9":[13,0,0,3,1,3,3],
+"group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab":[13,0,0,2,2,0],
+"group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab":[11,2,0,0,0,4],
+"group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab":[13,0,0,3,1,3,2],
+"group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71":[13,0,0,2,2,16],
+"group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71":[11,2,0,0,0,18],
+"group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71":[13,0,0,3,1,3,16],
+"group__altcp.html#ga86843287b0ad0099c067817cfb7aa336":[13,0,0,2,2,11],
+"group__altcp.html#ga86843287b0ad0099c067817cfb7aa336":[11,2,0,0,0,13],
+"group__altcp.html#ga86843287b0ad0099c067817cfb7aa336":[13,0,0,3,1,3,11],
+"group__altcp.html#ga96c22e15230b5216b3a95dc9e2ca42c8":[11,2,0,0,0,2],
+"group__altcp.html#ga96c22e15230b5216b3a95dc9e2ca42c8":[13,0,0,3,1,3,0],
+"group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8":[11,2,0,0,0,3],
+"group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8":[13,0,0,3,1,3,1],
+"group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1":[13,0,0,2,2,12],
+"group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1":[11,2,0,0,0,14],
+"group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1":[13,0,0,3,1,3,12],
+"group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d":[13,0,0,2,2,23],
+"group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d":[11,2,0,0,0,25],
+"group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d":[13,0,0,3,1,3,23],
+"group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c":[13,0,0,2,2,21],
+"group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c":[11,2,0,0,0,23],
+"group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c":[13,0,0,3,1,3,21],
+"group__altcp.html#gab2b228c77c827fb14bfc513171c79f47":[13,0,0,2,2,18],
+"group__altcp.html#gab2b228c77c827fb14bfc513171c79f47":[11,2,0,0,0,20],
+"group__altcp.html#gab2b228c77c827fb14bfc513171c79f47":[13,0,0,3,1,3,18],
+"group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21":[13,0,0,2,2,13],
+"group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21":[11,2,0,0,0,15],
+"group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21":[13,0,0,3,1,3,13],
+"group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83":[13,0,0,2,2,17],
+"group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83":[11,2,0,0,0,19],
+"group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83":[13,0,0,3,1,3,17],
+"group__altcp.html#gac69722b86b1198916f2527fb9f132c2b":[13,0,0,2,2,9],
+"group__altcp.html#gac69722b86b1198916f2527fb9f132c2b":[11,2,0,0,0,11],
+"group__altcp.html#gac69722b86b1198916f2527fb9f132c2b":[13,0,0,3,1,3,9],
+"group__altcp.html#gadc76a1f3b2448559dc87da1b33291644":[13,0,0,2,2,7],
+"group__altcp.html#gadc76a1f3b2448559dc87da1b33291644":[11,2,0,0,0,10],
+"group__altcp.html#gadc76a1f3b2448559dc87da1b33291644":[13,0,0,3,1,3,8],
+"group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08":[13,0,0,2,2,10],
+"group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08":[11,2,0,0,0,12],
+"group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08":[13,0,0,3,1,3,10],
+"group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492":[13,0,0,2,2,6],
+"group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492":[11,2,0,0,0,9],
+"group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492":[13,0,0,3,1,3,7],
+"group__altcp__api.html":[11,2,0,0],
+"group__altcp__tls.html":[11,2,0,0,0,0],
+"group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a":[13,0,0,2,3,1],
+"group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a":[11,2,0,0,0,0,6],
+"group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a":[13,0,0,3,1,5,6],
+"group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391":[13,0,0,2,3,0],
+"group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391":[11,2,0,0,0,0,0],
+"group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391":[13,0,0,3,1,5,0],
+"group__altcp__tls.html#ga2b249447e10c8599b6d723d403086c35":[11,2,0,0,0,0,2],
+"group__altcp__tls.html#ga2b249447e10c8599b6d723d403086c35":[13,0,0,3,1,5,2],
+"group__altcp__tls.html#ga700dc0320e93cea337673e7d4295e161":[11,2,0,0,0,0,4],
+"group__altcp__tls.html#ga700dc0320e93cea337673e7d4295e161":[13,0,0,3,1,5,4],
+"group__altcp__tls.html#ga7352a4600fee89e167541cf0776c01fb":[11,2,0,0,0,0,3],
+"group__altcp__tls.html#ga7352a4600fee89e167541cf0776c01fb":[13,0,0,3,1,5,3],
+"group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145":[11,2,0,0,0,0,5],
+"group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145":[13,0,0,3,1,5,5],
+"group__altcp__tls.html#gab874adb7f87984c0520bd032c2108c47":[11,2,0,0,0,0,7],
+"group__altcp__tls.html#gab874adb7f87984c0520bd032c2108c47":[13,0,0,3,1,5,7],
+"group__altcp__tls.html#gabc1741530d5089c3093889416430bc76":[11,2,0,0,0,0,1],
+"group__altcp__tls.html#gabc1741530d5089c3093889416430bc76":[13,0,0,3,1,5,1],
+"group__api.html":[11,2],
+"group__apps.html":[11,4],
+"group__autoip.html":[11,2,0,2,0,0],
+"group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8":[13,0,0,2,0,0,5],
+"group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8":[11,2,0,2,0,0,1],
+"group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8":[13,0,0,3,1,8,6],
+"group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90":[13,0,0,2,0,0,4],
+"group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90":[11,2,0,2,0,0,0],
+"group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90":[13,0,0,3,1,8,5],
+"group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4":[13,0,0,2,0,0,6],
+"group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4":[11,2,0,2,0,0,2],
+"group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4":[13,0,0,3,1,8,7],
+"group__bridgeif.html":[11,3,0],
+"group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c":[11,3,0,9],
+"group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c":[13,0,0,3,2,1,9],
+"group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c":[13,0,0,4,1,3],
+"group__bridgeif.html#ga3d41c7905b61aef3a3b8c61b3af7879f":[13,0,0,3,2,1,0],
+"group__bridgeif.html#ga3d41c7905b61aef3a3b8c61b3af7879f":[11,3,0,3],
+"group__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77":[13,0,0,3,2,1,3],
+"group__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77":[13,0,0,4,1,0],
+"group__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77":[11,3,0,6],
+"group__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8":[11,3,0,8],
+"group__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8":[13,0,0,3,2,1,7],
+"group__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8":[13,0,0,4,1,2],
+"group__bridgeif.html#gaaaeb47fbf1dd6c30cb502343fa0d0741":[13,0,0,3,2,1,1],
+"group__bridgeif.html#gaaaeb47fbf1dd6c30cb502343fa0d0741":[11,3,0,4],
+"group__bridgeif.html#gac47f8ce66bc6dad5dd9829467f93a1bb":[13,0,0,3,2,1,2],
+"group__bridgeif.html#gac47f8ce66bc6dad5dd9829467f93a1bb":[11,3,0,5],
+"group__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666":[11,3,0,7],
+"group__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666":[13,0,0,3,2,1,4],
+"group__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666":[13,0,0,4,1,1],
+"group__bridgeif__fdb.html":[11,3,0,1],
+"group__bridgeif__fdb.html#ga616fb7404be5da79d8092b4a14976750":[13,0,0,3,2,1,5],
+"group__bridgeif__fdb.html#ga616fb7404be5da79d8092b4a14976750":[13,0,0,4,2,0],
+"group__bridgeif__fdb.html#ga616fb7404be5da79d8092b4a14976750":[11,3,0,1,0],
+"group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39":[13,0,0,4,2,2],
+"group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39":[13,0,0,3,2,1,8],
+"group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39":[11,3,0,1,2],
+"group__bridgeif__fdb.html#gaf7935226ee7f99f964bf0135b6cb9ca0":[13,0,0,4,2,1],
+"group__bridgeif__fdb.html#gaf7935226ee7f99f964bf0135b6cb9ca0":[13,0,0,3,2,1,6],
+"group__bridgeif__fdb.html#gaf7935226ee7f99f964bf0135b6cb9ca0":[11,3,0,1,1],
+"group__bridgeif__opts.html":[11,3,0,0],
+"group__bridgeif__opts.html#ga5aed5cd9b01ba1345b47845cd04ca30d":[13,0,0,3,2,2,4],
+"group__bridgeif__opts.html#ga5aed5cd9b01ba1345b47845cd04ca30d":[11,3,0,0,4],
+"group__bridgeif__opts.html#ga6fe03b84359150b7dea3dfca942b6414":[13,0,0,3,2,2,3],
+"group__bridgeif__opts.html#ga6fe03b84359150b7dea3dfca942b6414":[11,3,0,0,3],
+"group__bridgeif__opts.html#ga72e389f592470dc50288a68f3db70730":[13,0,0,3,2,2,1],
+"group__bridgeif__opts.html#ga72e389f592470dc50288a68f3db70730":[11,3,0,0,1],
+"group__bridgeif__opts.html#gaab45e20e9b09a98217994082968cec73":[13,0,0,3,2,2,0],
+"group__bridgeif__opts.html#gaab45e20e9b09a98217994082968cec73":[11,3,0,0,0],
+"group__bridgeif__opts.html#gac456e97b1b0e9a57449596a2b229763a":[13,0,0,3,2,2,2],
+"group__bridgeif__opts.html#gac456e97b1b0e9a57449596a2b229763a":[11,3,0,0,2],
+"group__callbackstyle__api.html":[11,2,0],
+"group__compiler__abstraction.html":[11,0,2,4],
+"group__compiler__abstraction.html#ga122c754db96ecad23bc6f4541d6360c1":[11,0,2,4,11],
+"group__compiler__abstraction.html#ga122c754db96ecad23bc6f4541d6360c1":[13,0,0,3,1,7,11],
+"group__compiler__abstraction.html#ga1771b7fb65ee640524d0052f229768c3":[11,0,2,4,0],
+"group__compiler__abstraction.html#ga1771b7fb65ee640524d0052f229768c3":[13,0,0,3,1,7,0]
+};
diff --git a/doc/doxygen/output/html/navtreeindex10.js b/doc/doxygen/output/html/navtreeindex10.js
new file mode 100644
index 0000000..da6fbc9
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex10.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX10 =
+{
+"group__smtp__opts.html#ga021d8133159895a2dbf5fb0b243da9fa":[11,4,6,0,1],
+"group__smtp__opts.html#ga2e6c8313006592884e89bbcf353cf5ac":[11,4,6,0,8],
+"group__smtp__opts.html#ga4b1667149354b7819847cb4f5f1ff144":[11,4,6,0,0],
+"group__smtp__opts.html#ga7a83e686b109fa59557c13736aeeab3b":[11,4,6,0,7],
+"group__smtp__opts.html#ga9aa5f5529121a8266947f33c5e424ccc":[11,4,6,0,4],
+"group__smtp__opts.html#gab5559a7c976e72204d9391f655bcc07e":[11,4,6,0,2],
+"group__smtp__opts.html#gae7ea4f31c521947d5127e268ae02c317":[11,4,6,0,3],
+"group__smtp__opts.html#gaee3b273524a2253ce5fb44b240b0371b":[11,4,6,0,5],
+"group__smtp__opts.html#gafa0c84e5279b8eb8a5dbea6fe97aa099":[11,4,6,0,6],
+"group__snmp.html":[11,4,7],
+"group__snmp__core.html":[11,4,7,0],
+"group__snmp__core.html#ga29c76474971f25d038fd486447c70e21":[11,4,7,0,7],
+"group__snmp__core.html#ga29c76474971f25d038fd486447c70e21":[13,0,0,3,1,0,14,24],
+"group__snmp__core.html#ga29c76474971f25d038fd486447c70e21":[13,0,0,1,7,2,24],
+"group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1":[13,0,0,1,7,11,3],
+"group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1":[11,4,7,0,4],
+"group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1":[13,0,0,3,1,0,14,20],
+"group__snmp__core.html#ga341461766863cff46a44e5f431f2da01":[13,0,0,1,7,11,5],
+"group__snmp__core.html#ga341461766863cff46a44e5f431f2da01":[11,4,7,0,5],
+"group__snmp__core.html#ga341461766863cff46a44e5f431f2da01":[13,0,0,3,1,0,14,22],
+"group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5":[13,0,0,1,7,16,0],
+"group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5":[11,4,7,0,3],
+"group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5":[13,0,0,3,1,0,14,15],
+"group__snmp__core.html#ga4dff82dda2553b9554a9f98561852a50":[11,4,7,0,2],
+"group__snmp__core.html#ga4dff82dda2553b9554a9f98561852a50":[13,0,0,3,1,0,14,14],
+"group__snmp__core.html#ga4dff82dda2553b9554a9f98561852a50":[13,0,0,1,7,2,3],
+"group__snmp__core.html#gaba31b6f1816661df5a3b7f2076ee6ec0":[13,0,0,1,7,11,2],
+"group__snmp__core.html#gaba31b6f1816661df5a3b7f2076ee6ec0":[11,4,7,0,1],
+"group__snmp__core.html#gaba31b6f1816661df5a3b7f2076ee6ec0":[13,0,0,3,1,0,14,13],
+"group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a":[11,4,7,0,6],
+"group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a":[13,0,0,3,1,0,14,23],
+"group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a":[13,0,0,1,7,2,23],
+"group__snmp__core.html#gacf277cbca915275190426aeef4cfb103":[13,0,0,1,7,11,0],
+"group__snmp__core.html#gacf277cbca915275190426aeef4cfb103":[11,4,7,0,0],
+"group__snmp__core.html#gacf277cbca915275190426aeef4cfb103":[13,0,0,3,1,0,14,11],
+"group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b":[13,0,0,1,7,11,6],
+"group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b":[11,4,7,0,8],
+"group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b":[13,0,0,3,1,0,14,25],
+"group__snmp__mib2.html":[11,4,7,2],
+"group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2":[11,4,7,2,3],
+"group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2":[13,0,0,3,1,0,16,3],
+"group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2":[13,0,0,1,7,8,3],
+"group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a":[11,4,7,2,1],
+"group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a":[13,0,0,3,1,0,16,1],
+"group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a":[13,0,0,1,7,8,1],
+"group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5":[13,0,0,1,7,8,6],
+"group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5":[11,4,7,2,6],
+"group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5":[13,0,0,3,1,0,16,6],
+"group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267":[11,4,7,2,4],
+"group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267":[13,0,0,3,1,0,16,4],
+"group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267":[13,0,0,1,7,8,4],
+"group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc":[11,4,7,2,2],
+"group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc":[13,0,0,3,1,0,16,2],
+"group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc":[13,0,0,1,7,8,2],
+"group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7":[11,4,7,2,5],
+"group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7":[13,0,0,3,1,0,16,5],
+"group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7":[13,0,0,1,7,8,5],
+"group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e":[11,4,7,2,0],
+"group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e":[13,0,0,3,1,0,16,0],
+"group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e":[13,0,0,1,7,8,0],
+"group__snmp__opts.html":[11,4,7,3],
+"group__snmp__opts.html#ga09118b734e85df152af098744e888b34":[11,4,7,3,5],
+"group__snmp__opts.html#ga09118b734e85df152af098744e888b34":[13,0,0,3,1,0,17,6],
+"group__snmp__opts.html#ga0dcacdccc61216c6773943ad3fd31242":[11,4,7,3,21],
+"group__snmp__opts.html#ga0dcacdccc61216c6773943ad3fd31242":[13,0,0,3,1,0,17,22],
+"group__snmp__opts.html#ga0e98b58159a77688f87f9f50479177fd":[11,4,7,3,14],
+"group__snmp__opts.html#ga0e98b58159a77688f87f9f50479177fd":[13,0,0,3,1,0,17,15],
+"group__snmp__opts.html#ga1a57501c615b630d363e0af1a504e683":[11,4,7,3,10],
+"group__snmp__opts.html#ga1a57501c615b630d363e0af1a504e683":[13,0,0,3,1,0,17,11],
+"group__snmp__opts.html#ga311cec98c8f7e4851d325fffe96cf8d9":[11,4,7,3,12],
+"group__snmp__opts.html#ga311cec98c8f7e4851d325fffe96cf8d9":[13,0,0,3,1,0,17,13],
+"group__snmp__opts.html#ga316c1e1f06f0c7ca56589563809e64db":[11,4,7,3,1],
+"group__snmp__opts.html#ga316c1e1f06f0c7ca56589563809e64db":[13,0,0,3,1,0,17,2],
+"group__snmp__opts.html#ga3ad9d293f90e3c885c4e3263a9064a41":[11,4,7,3,15],
+"group__snmp__opts.html#ga3ad9d293f90e3c885c4e3263a9064a41":[13,0,0,3,1,0,17,16],
+"group__snmp__opts.html#ga5a24152aa5f3c2837b9a3145aa3c59f3":[11,4,7,3,8],
+"group__snmp__opts.html#ga5a24152aa5f3c2837b9a3145aa3c59f3":[13,0,0,3,1,0,17,9],
+"group__snmp__opts.html#ga692343b0cc555c302fd713003d4f8a08":[11,4,7,3,23],
+"group__snmp__opts.html#ga692343b0cc555c302fd713003d4f8a08":[13,0,0,3,1,0,17,24],
+"group__snmp__opts.html#ga80ba46f9517a51b5477f13082b2bcf98":[11,4,7,3,13],
+"group__snmp__opts.html#ga80ba46f9517a51b5477f13082b2bcf98":[13,0,0,3,1,0,17,14],
+"group__snmp__opts.html#ga868bfef6efe05515c86291137a633479":[11,4,7,3,7],
+"group__snmp__opts.html#ga868bfef6efe05515c86291137a633479":[13,0,0,3,1,0,17,8],
+"group__snmp__opts.html#ga8c93f4260af2eb3c50d4bc603f716f1f":[11,4,7,3,25],
+"group__snmp__opts.html#ga8c93f4260af2eb3c50d4bc603f716f1f":[13,0,0,3,1,0,17,26],
+"group__snmp__opts.html#ga95e39047b9bcb385780b06b35af49261":[11,4,7,3,20],
+"group__snmp__opts.html#ga95e39047b9bcb385780b06b35af49261":[13,0,0,3,1,0,17,21],
+"group__snmp__opts.html#ga9e39ba5308f5c7ac5296c7d05fdfa97f":[11,4,7,3,6],
+"group__snmp__opts.html#ga9e39ba5308f5c7ac5296c7d05fdfa97f":[13,0,0,3,1,0,17,7],
+"group__snmp__opts.html#gaab667d48f48ee89f8bdbc7f134e6037d":[13,0,0,3,1,0,17,10],
+"group__snmp__opts.html#gaab667d48f48ee89f8bdbc7f134e6037d":[11,4,7,3,9],
+"group__snmp__opts.html#gaaefc9dda5f8e5c296018a463cdbac39b":[11,4,7,3,2],
+"group__snmp__opts.html#gaaefc9dda5f8e5c296018a463cdbac39b":[13,0,0,3,1,0,17,3],
+"group__snmp__opts.html#gac041000361342f51ad5ee5d8f6254e02":[11,4,7,3,4],
+"group__snmp__opts.html#gac041000361342f51ad5ee5d8f6254e02":[13,0,0,3,1,0,17,5],
+"group__snmp__opts.html#gac12240265db443eaf9d31d187e586c16":[11,4,7,3,18],
+"group__snmp__opts.html#gac12240265db443eaf9d31d187e586c16":[13,0,0,3,1,0,17,19],
+"group__snmp__opts.html#gac815d0dbe576299546ac612e7eaf3f90":[11,4,7,3,19],
+"group__snmp__opts.html#gac815d0dbe576299546ac612e7eaf3f90":[13,0,0,3,1,0,17,20],
+"group__snmp__opts.html#gad9bce0d9c05ed4607d72de7b75f2a80b":[13,0,0,3,1,0,17,23],
+"group__snmp__opts.html#gad9bce0d9c05ed4607d72de7b75f2a80b":[11,4,7,3,22],
+"group__snmp__opts.html#gae50cdd09697aa54a8b9f26432ac55ac2":[11,4,7,3,16],
+"group__snmp__opts.html#gae50cdd09697aa54a8b9f26432ac55ac2":[13,0,0,3,1,0,17,17],
+"group__snmp__opts.html#gae93a105b421a2ca91e862da5087cec73":[11,4,7,3,11],
+"group__snmp__opts.html#gae93a105b421a2ca91e862da5087cec73":[13,0,0,3,1,0,17,12],
+"group__snmp__opts.html#gaf02e8b4b69e99df784e9953401477078":[11,4,7,3,24],
+"group__snmp__opts.html#gaf02e8b4b69e99df784e9953401477078":[13,0,0,3,1,0,17,25],
+"group__snmp__opts.html#gaf4900859dc53f19f5f67cc34e48ad68c":[11,4,7,3,0],
+"group__snmp__opts.html#gaf4900859dc53f19f5f67cc34e48ad68c":[13,0,0,3,1,0,17,0],
+"group__snmp__opts.html#gafb4362575bc50476a7401a1ed14787f0":[11,4,7,3,17],
+"group__snmp__opts.html#gafb4362575bc50476a7401a1ed14787f0":[13,0,0,3,1,0,17,18],
+"group__snmp__opts.html#gafb9414dc7a33978b62a3a9838b659464":[11,4,7,3,3],
+"group__snmp__opts.html#gafb9414dc7a33978b62a3a9838b659464":[13,0,0,3,1,0,17,4],
+"group__snmp__traps.html":[11,4,7,1],
+"group__snmp__traps.html#ga0e044259289cb690197173f93c17607d":[13,0,0,1,7,20,4],
+"group__snmp__traps.html#ga0e044259289cb690197173f93c17607d":[11,4,7,1,5],
+"group__snmp__traps.html#ga0e044259289cb690197173f93c17607d":[13,0,0,3,1,0,14,17],
+"group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86":[13,0,0,1,7,20,8],
+"group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86":[11,4,7,1,10],
+"group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86":[13,0,0,3,1,0,14,27],
+"group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760":[11,4,7,1,8],
+"group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760":[13,0,0,3,1,0,14,21],
+"group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760":[13,0,0,1,7,11,4],
+"group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1":[13,0,0,1,7,20,5],
+"group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1":[11,4,7,1,6],
+"group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1":[13,0,0,3,1,0,14,18],
+"group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7":[13,0,0,1,7,20,2],
+"group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7":[11,4,7,1,2],
+"group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7":[13,0,0,3,1,0,14,10],
+"group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd":[13,0,0,1,7,20,3],
+"group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd":[11,4,7,1,4],
+"group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd":[13,0,0,3,1,0,14,16],
+"group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be":[13,0,0,1,7,20,1],
+"group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be":[11,4,7,1,1],
+"group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be":[13,0,0,3,1,0,14,9],
+"group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32":[13,0,0,1,7,20,7],
+"group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32":[13,0,0,3,1,0,14,26],
+"group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32":[11,4,7,1,9],
+"group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c":[11,4,7,1,7],
+"group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c":[13,0,0,3,1,0,14,19],
+"group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c":[13,0,0,1,7,20,6],
+"group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee":[13,0,0,1,7,20,0],
+"group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee":[11,4,7,1,0],
+"group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee":[13,0,0,3,1,0,14,8],
+"group__snmp__traps.html#gafdd3299e145f53cc826cc11a469f8409":[13,0,0,1,7,11,1],
+"group__snmp__traps.html#gafdd3299e145f53cc826cc11a469f8409":[11,4,7,1,3],
+"group__snmp__traps.html#gafdd3299e145f53cc826cc11a469f8409":[13,0,0,3,1,0,14,12],
+"group__sntp.html":[11,4,8],
+"group__sntp.html#ga2a28523cb9f2b5b025a4818bc2c1afc1":[13,0,0,1,8,0,8],
+"group__sntp.html#ga2a28523cb9f2b5b025a4818bc2c1afc1":[11,4,8,4],
+"group__sntp.html#ga2a28523cb9f2b5b025a4818bc2c1afc1":[13,0,0,3,1,0,22,3],
+"group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5":[13,0,0,1,8,0,5],
+"group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5":[11,4,8,1],
+"group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5":[13,0,0,3,1,0,22,0],
+"group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a":[13,0,0,1,8,0,11],
+"group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a":[11,4,8,7],
+"group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a":[13,0,0,3,1,0,22,6],
+"group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488":[13,0,0,1,8,0,12],
+"group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488":[11,4,8,8],
+"group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488":[13,0,0,3,1,0,22,7],
+"group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba":[13,0,0,1,8,0,9],
+"group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba":[11,4,8,5],
+"group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba":[13,0,0,3,1,0,22,4],
+"group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120":[11,4,8,6],
+"group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120":[13,0,0,3,1,0,22,5],
+"group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120":[13,0,0,1,8,0,10],
+"group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e":[11,4,8,3],
+"group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e":[13,0,0,3,1,0,22,2],
+"group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e":[13,0,0,1,8,0,7],
+"group__sntp.html#gae66404a551d5cef420cf844a71356fae":[13,0,0,1,8,0,6],
+"group__sntp.html#gae66404a551d5cef420cf844a71356fae":[13,0,0,3,1,0,22,1],
+"group__sntp.html#gae66404a551d5cef420cf844a71356fae":[11,4,8,2],
+"group__sntp__opts.html":[11,4,8,0],
+"group__sntp__opts.html#ga1e21781705d3549a305339fd7fca63e7":[11,4,8,0,1],
+"group__sntp__opts.html#ga1e21781705d3549a305339fd7fca63e7":[13,0,0,3,1,0,23,1],
+"group__sntp__opts.html#ga22017d43da7d4bf8d42e786b4ced4dfa":[11,4,8,0,14],
+"group__sntp__opts.html#ga22017d43da7d4bf8d42e786b4ced4dfa":[13,0,0,3,1,0,23,14],
+"group__sntp__opts.html#ga25c6f9c14c17e218d110d826b09f8d91":[11,4,8,0,2],
+"group__sntp__opts.html#ga25c6f9c14c17e218d110d826b09f8d91":[13,0,0,3,1,0,23,2],
+"group__sntp__opts.html#ga44cf26b9b19832d88599244711a12d08":[11,4,8,0,8],
+"group__sntp__opts.html#ga44cf26b9b19832d88599244711a12d08":[13,0,0,3,1,0,23,8],
+"group__sntp__opts.html#ga5782f21ef24ebddd5ba2ce9a889094e3":[11,4,8,0,6],
+"group__sntp__opts.html#ga5782f21ef24ebddd5ba2ce9a889094e3":[13,0,0,3,1,0,23,6],
+"group__sntp__opts.html#ga5d9dc0827f402849f5c18d44e311dbc2":[13,0,0,3,1,0,23,5],
+"group__sntp__opts.html#ga5d9dc0827f402849f5c18d44e311dbc2":[11,4,8,0,5],
+"group__sntp__opts.html#ga7d4e12d90912d486e64f289d7f3ca446":[11,4,8,0,0],
+"group__sntp__opts.html#ga7d4e12d90912d486e64f289d7f3ca446":[13,0,0,3,1,0,23,0],
+"group__sntp__opts.html#ga86d651d8eb07687208308deef95a23ba":[11,4,8,0,9],
+"group__sntp__opts.html#ga86d651d8eb07687208308deef95a23ba":[13,0,0,3,1,0,23,9],
+"group__sntp__opts.html#ga9232c56443115be05a2f852eba21979c":[11,4,8,0,16],
+"group__sntp__opts.html#ga9232c56443115be05a2f852eba21979c":[13,0,0,3,1,0,23,16],
+"group__sntp__opts.html#ga961a61eef942ab5378cff1e3742b3ade":[11,4,8,0,3],
+"group__sntp__opts.html#ga961a61eef942ab5378cff1e3742b3ade":[13,0,0,3,1,0,23,3],
+"group__sntp__opts.html#gab0ea385479a5c5c8c173f165ded2fb63":[11,4,8,0,4],
+"group__sntp__opts.html#gab0ea385479a5c5c8c173f165ded2fb63":[13,0,0,3,1,0,23,4],
+"group__sntp__opts.html#gacbee62c27f54371fc2c5259a834a0f9b":[11,4,8,0,7],
+"group__sntp__opts.html#gacbee62c27f54371fc2c5259a834a0f9b":[13,0,0,3,1,0,23,7],
+"group__sntp__opts.html#gae082c2f3044d500ca5e1be1d4928de75":[11,4,8,0,15],
+"group__sntp__opts.html#gae082c2f3044d500ca5e1be1d4928de75":[13,0,0,3,1,0,23,15],
+"group__sntp__opts.html#gaef477c145ae404d77188b26b79b6996f":[11,4,8,0,12],
+"group__sntp__opts.html#gaef477c145ae404d77188b26b79b6996f":[13,0,0,3,1,0,23,12],
+"group__sntp__opts.html#gafdb7e98f608cc429188d7dac356614c2":[11,4,8,0,10],
+"group__sntp__opts.html#gafdb7e98f608cc429188d7dac356614c2":[13,0,0,3,1,0,23,10],
+"group__sntp__opts.html#gafde10b3ed7cb4bb2cd2c4daa389db699":[11,4,8,0,11],
+"group__sntp__opts.html#gafde10b3ed7cb4bb2cd2c4daa389db699":[13,0,0,3,1,0,23,11],
+"group__sntp__opts.html#gafe340b98c52dedcbc041267fe13b2da6":[11,4,8,0,13],
+"group__sntp__opts.html#gafe340b98c52dedcbc041267fe13b2da6":[13,0,0,3,1,0,23,13],
+"group__socket.html":[11,2,2],
+"group__socket.html#ga0a651eb5fb5e6127f5e5153ce2251f3d":[11,2,2,29],
+"group__socket.html#ga0a651eb5fb5e6127f5e5153ce2251f3d":[13,0,0,3,1,46,28],
+"group__socket.html#ga115d74cd1953e7bafc2e34157c697df1":[13,0,0,3,1,46,25],
+"group__socket.html#ga115d74cd1953e7bafc2e34157c697df1":[11,2,2,26],
+"group__socket.html#ga19024690fdfd3512d24dcaa9b80d24ed":[11,2,2,23],
+"group__socket.html#ga19024690fdfd3512d24dcaa9b80d24ed":[13,0,0,3,1,46,22],
+"group__socket.html#ga19e714443d0238cfd79b71059ec92378":[11,2,2,14],
+"group__socket.html#ga19e714443d0238cfd79b71059ec92378":[13,0,0,3,1,46,12],
+"group__socket.html#ga33bf1b7f5b11de02d0db32531cd940b8":[11,2,2,8],
+"group__socket.html#ga33bf1b7f5b11de02d0db32531cd940b8":[13,0,0,3,1,46,6],
+"group__socket.html#ga4a88bb849aa7203b24bb245a193997a6":[11,2,2,3],
+"group__socket.html#ga4a88bb849aa7203b24bb245a193997a6":[13,0,0,3,1,46,1],
+"group__socket.html#ga4ef17e85ec4d3acdcee5ce23f8ed93c4":[11,2,2,4],
+"group__socket.html#ga4ef17e85ec4d3acdcee5ce23f8ed93c4":[13,0,0,3,1,46,2],
+"group__socket.html#ga50a83956bc3a96e6274a21ec0d4d6338":[13,0,0,3,1,46,11],
+"group__socket.html#ga50a83956bc3a96e6274a21ec0d4d6338":[11,2,2,13],
+"group__socket.html#ga5a3eb971b466278ada4f7f87399a537c":[11,2,2,5],
+"group__socket.html#ga5a3eb971b466278ada4f7f87399a537c":[13,0,0,3,1,46,3],
+"group__socket.html#ga5e5f7bcda6562bae815e188ea1a81ecd":[11,2,2,20],
+"group__socket.html#ga5e5f7bcda6562bae815e188ea1a81ecd":[13,0,0,3,1,46,19],
+"group__socket.html#ga697fd916a65a10b4dcb54b8199346fee":[13,0,0,3,1,46,29],
+"group__socket.html#ga697fd916a65a10b4dcb54b8199346fee":[11,2,2,30],
+"group__socket.html#ga7d832f77cfad97cf901640f243c6e682":[13,0,0,3,1,46,26],
+"group__socket.html#ga7d832f77cfad97cf901640f243c6e682":[11,2,2,27],
+"group__socket.html#ga80ae38841b0e64e60618cd8bf857f617":[13,0,0,3,1,46,15],
+"group__socket.html#ga80ae38841b0e64e60618cd8bf857f617":[11,2,2,16],
+"group__socket.html#ga822040573319cf87bfe6758d511be57f":[11,2,2,17],
+"group__socket.html#ga822040573319cf87bfe6758d511be57f":[13,0,0,3,1,46,16],
+"group__socket.html#ga862d8f4070c66dddb979540ce9ba6a83":[13,0,0,3,1,46,27],
+"group__socket.html#ga862d8f4070c66dddb979540ce9ba6a83":[11,2,2,28],
+"group__socket.html#ga86788b3c690d38699fdbaea523ddec9d":[11,2,2,18],
+"group__socket.html#ga86788b3c690d38699fdbaea523ddec9d":[13,0,0,3,1,46,17],
+"group__socket.html#ga90d2b417d82e8da981c940a665324fd5":[11,2,2,12],
+"group__socket.html#ga90d2b417d82e8da981c940a665324fd5":[13,0,0,3,1,46,10],
+"group__socket.html#gaa40bf11abb409097e68aa3a6982eb52b":[11,2,2,11],
+"group__socket.html#gaa40bf11abb409097e68aa3a6982eb52b":[13,0,0,3,1,46,9],
+"group__socket.html#gaaa17499d76ef421821fe72fd29fe38f7":[11,2,2,25],
+"group__socket.html#gaaa17499d76ef421821fe72fd29fe38f7":[13,0,0,3,1,46,24],
+"group__socket.html#gaaa2b0e00cab161fcc4b31ee0d06e7eb3":[11,2,2,7],
+"group__socket.html#gaaa2b0e00cab161fcc4b31ee0d06e7eb3":[13,0,0,3,1,46,5],
+"group__socket.html#gaad99bea090b1fe4743234fcee15a5d28":[13,0,0,3,1,46,23],
+"group__socket.html#gaad99bea090b1fe4743234fcee15a5d28":[11,2,2,24]
+};
diff --git a/doc/doxygen/output/html/navtreeindex11.js b/doc/doxygen/output/html/navtreeindex11.js
new file mode 100644
index 0000000..926c61c
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex11.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX11 =
+{
+"group__socket.html#gab096fb7dbc3f84be1699a87dce980f2f":[11,2,2,9],
+"group__socket.html#gab096fb7dbc3f84be1699a87dce980f2f":[13,0,0,3,1,46,7],
+"group__socket.html#gac332b9b9b2cd877a6189ef838de49e33":[13,0,0,3,1,46,21],
+"group__socket.html#gac332b9b9b2cd877a6189ef838de49e33":[11,2,2,22],
+"group__socket.html#gad2de02b35dbbf2334d1befb137ede821":[11,2,2,10],
+"group__socket.html#gad2de02b35dbbf2334d1befb137ede821":[13,0,0,3,1,46,8],
+"group__socket.html#gadd7ae45df7c005619eb1126542231e9b":[13,0,0,3,1,46,18],
+"group__socket.html#gadd7ae45df7c005619eb1126542231e9b":[11,2,2,19],
+"group__socket.html#gade2b17671b5a4b18e941fbf7e1060310":[11,2,2,2],
+"group__socket.html#gade2b17671b5a4b18e941fbf7e1060310":[13,0,0,3,1,46,0],
+"group__socket.html#gae3d13671f622e17c17317c9a16dfd0ee":[13,0,0,3,1,46,4],
+"group__socket.html#gae3d13671f622e17c17317c9a16dfd0ee":[11,2,2,6],
+"group__socket.html#gae6e6de5a20bed9fc7078f0e6c9c4aca4":[11,2,2,15],
+"group__socket.html#gae6e6de5a20bed9fc7078f0e6c9c4aca4":[13,0,0,3,1,46,13],
+"group__socket.html#gaecfc7d524105e52604829c66ced752b8":[13,0,0,3,1,46,20],
+"group__socket.html#gaecfc7d524105e52604829c66ced752b8":[11,2,2,21],
+"group__sys__layer.html":[11,0,2],
+"group__sys__mbox.html":[11,0,2,1,2],
+"group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172":[11,0,2,1,2,5],
+"group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172":[13,0,0,3,1,48,21],
+"group__sys__mbox.html#ga6464cd77cf6799bd8b3d6c840166a2e8":[13,0,0,3,1,48,13],
+"group__sys__mbox.html#ga6464cd77cf6799bd8b3d6c840166a2e8":[11,0,2,1,2,0],
+"group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d":[11,0,2,1,2,8],
+"group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d":[13,0,0,3,1,48,24],
+"group__sys__mbox.html#ga9d068386a3c53dd01b8af99c3ef77555":[13,0,0,3,1,48,20],
+"group__sys__mbox.html#ga9d068386a3c53dd01b8af99c3ef77555":[11,0,2,1,2,4],
+"group__sys__mbox.html#gaa36345e48a49d67cbb0878cd4cbd2195":[11,0,2,1,2,6],
+"group__sys__mbox.html#gaa36345e48a49d67cbb0878cd4cbd2195":[13,0,0,3,1,48,22],
+"group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc":[13,0,0,3,1,48,19],
+"group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc":[11,0,2,1,2,3],
+"group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f":[13,0,0,3,1,48,18],
+"group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f":[11,0,2,1,2,2],
+"group__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a":[11,0,2,1,2,7],
+"group__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a":[13,0,0,3,1,48,23],
+"group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c":[13,0,0,3,1,48,14],
+"group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c":[11,0,2,1,2,1],
+"group__sys__misc.html":[11,0,2,1,3],
+"group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a":[13,0,0,3,1,48,38],
+"group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a":[11,0,2,1,3,2],
+"group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e":[11,0,2,1,3,1],
+"group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e":[13,0,0,2,16,0],
+"group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e":[13,0,0,3,1,48,25],
+"group__sys__misc.html#gaf411a8bc6b7ed4b0af9114e10c959448":[13,0,0,3,1,48,16],
+"group__sys__misc.html#gaf411a8bc6b7ed4b0af9114e10c959448":[11,0,2,1,3,0],
+"group__sys__mutex.html":[11,0,2,1,1],
+"group__sys__mutex.html#ga16336ce68b741e98204102ca4bc84dd9":[13,0,0,3,1,48,26],
+"group__sys__mutex.html#ga16336ce68b741e98204102ca4bc84dd9":[11,0,2,1,1,0],
+"group__sys__mutex.html#ga38e7dae1fd88b338eb1cd97f110f3897":[13,0,0,3,1,48,28],
+"group__sys__mutex.html#ga38e7dae1fd88b338eb1cd97f110f3897":[11,0,2,1,1,2],
+"group__sys__mutex.html#ga3f392725971dc837aa56dd7e45fa7ca8":[11,0,2,1,1,3],
+"group__sys__mutex.html#ga3f392725971dc837aa56dd7e45fa7ca8":[13,0,0,3,1,48,29],
+"group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a":[11,0,2,1,1,1],
+"group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a":[13,0,0,3,1,48,27],
+"group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb":[11,0,2,1,1,4],
+"group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb":[13,0,0,3,1,48,30],
+"group__sys__mutex.html#gaebe83ba90a6d9c23cdb3eb5d49562c4a":[11,0,2,1,1,5],
+"group__sys__mutex.html#gaebe83ba90a6d9c23cdb3eb5d49562c4a":[13,0,0,3,1,48,31],
+"group__sys__nonstandard.html":[11,0,2,0],
+"group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a":[13,0,0,2,5,3],
+"group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a":[13,0,0,3,1,10,4],
+"group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a":[11,0,2,0,1],
+"group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a":[13,0,0,2,5,4],
+"group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a":[11,0,2,0,2],
+"group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a":[13,0,0,3,1,10,5],
+"group__sys__nonstandard.html#gaeece028198cdaea2f0d2f1d691752c02":[13,0,0,3,1,10,6],
+"group__sys__nonstandard.html#gaeece028198cdaea2f0d2f1d691752c02":[13,0,0,2,5,5],
+"group__sys__nonstandard.html#gaeece028198cdaea2f0d2f1d691752c02":[11,0,2,0,3],
+"group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284":[11,0,2,0,0],
+"group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284":[13,0,0,2,5,2],
+"group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284":[13,0,0,3,1,10,3],
+"group__sys__os.html":[11,0,2,1],
+"group__sys__prot.html":[11,0,2,3],
+"group__sys__prot.html#ga2f48e97047945642ddeb27e65bf4ffe2":[13,0,0,3,1,48,4],
+"group__sys__prot.html#ga2f48e97047945642ddeb27e65bf4ffe2":[11,0,2,3,2],
+"group__sys__prot.html#ga3d0e48feafd378e9c26c64567ecd8bab":[11,0,2,3,1],
+"group__sys__prot.html#ga3d0e48feafd378e9c26c64567ecd8bab":[13,0,0,3,1,48,2],
+"group__sys__prot.html#ga945395fa326214fc9736487242710a90":[13,0,0,3,1,48,1],
+"group__sys__prot.html#ga945395fa326214fc9736487242710a90":[11,0,2,3,0],
+"group__sys__sem.html":[11,0,2,1,0],
+"group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4":[11,0,2,1,0,5],
+"group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4":[13,0,0,3,1,48,37],
+"group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33":[13,0,0,3,1,48,35],
+"group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33":[11,0,2,1,0,3],
+"group__sys__sem.html#ga83b781f96c30e915c752065a757da283":[13,0,0,3,1,48,33],
+"group__sys__sem.html#ga83b781f96c30e915c752065a757da283":[11,0,2,1,0,1],
+"group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f":[13,0,0,3,1,48,15],
+"group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f":[11,0,2,1,0,0],
+"group__sys__sem.html#gaaf800273061fcc3f8200fd4e1b9ca875":[13,0,0,3,1,48,36],
+"group__sys__sem.html#gaaf800273061fcc3f8200fd4e1b9ca875":[11,0,2,1,0,4],
+"group__sys__sem.html#gaf99da9e34a71855285c535183133dfde":[11,0,2,1,0,2],
+"group__sys__sem.html#gaf99da9e34a71855285c535183133dfde":[13,0,0,3,1,48,34],
+"group__sys__time.html":[11,0,2,2],
+"group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199":[11,0,2,2,0],
+"group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199":[13,0,0,3,1,48,32],
+"group__tcp__raw.html":[11,2,0,5],
+"group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f":[13,0,0,2,19,4],
+"group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f":[13,0,0,3,1,49,37],
+"group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f":[11,2,0,5,22],
+"group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808":[13,0,0,3,1,49,41],
+"group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808":[13,0,0,2,17,37],
+"group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808":[11,2,0,5,26],
+"group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8":[13,0,0,3,1,49,23],
+"group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8":[13,0,0,2,17,6],
+"group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8":[11,2,0,5,12],
+"group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61":[13,0,0,3,1,49,19],
+"group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61":[13,0,0,2,17,1],
+"group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61":[11,2,0,5,8],
+"group__tcp__raw.html#ga53ee4364718e84dc42cb1e0179deb1f4":[13,0,0,3,1,49,10],
+"group__tcp__raw.html#ga53ee4364718e84dc42cb1e0179deb1f4":[11,2,0,5,7],
+"group__tcp__raw.html#ga5b5c0093efff4466bda06d45f12a4633":[13,0,0,3,1,49,5],
+"group__tcp__raw.html#ga5b5c0093efff4466bda06d45f12a4633":[11,2,0,5,3],
+"group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd":[13,0,0,3,1,49,43],
+"group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd":[11,2,0,5,27],
+"group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd":[13,0,0,2,17,39],
+"group__tcp__raw.html#ga619154658137a23839ca3b94882131ca":[13,0,0,3,1,49,22],
+"group__tcp__raw.html#ga619154658137a23839ca3b94882131ca":[13,0,0,2,17,5],
+"group__tcp__raw.html#ga619154658137a23839ca3b94882131ca":[11,2,0,5,11],
+"group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f":[13,0,0,3,1,49,25],
+"group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f":[13,0,0,2,17,8],
+"group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f":[11,2,0,5,14],
+"group__tcp__raw.html#ga6b2a4efb1fc15d7d85cb71cb2a1d1066":[11,2,0,5,1],
+"group__tcp__raw.html#ga6b2a4efb1fc15d7d85cb71cb2a1d1066":[13,0,0,3,1,49,3],
+"group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5":[13,0,0,3,1,49,44],
+"group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5":[13,0,0,2,19,14],
+"group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5":[11,2,0,5,28],
+"group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943":[13,0,0,2,17,24],
+"group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943":[13,0,0,3,1,49,35],
+"group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943":[11,2,0,5,20],
+"group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623":[13,0,0,2,17,9],
+"group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623":[11,2,0,5,15],
+"group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623":[13,0,0,3,1,49,26],
+"group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0":[13,0,0,3,1,49,39],
+"group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0":[13,0,0,2,17,31],
+"group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0":[11,2,0,5,24],
+"group__tcp__raw.html#ga9398061411b4af900160233aa3b1a286":[11,2,0,5,4],
+"group__tcp__raw.html#ga9398061411b4af900160233aa3b1a286":[13,0,0,3,1,49,6],
+"group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012":[13,0,0,2,17,10],
+"group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012":[11,2,0,5,16],
+"group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012":[13,0,0,3,1,49,27],
+"group__tcp__raw.html#ga9dfcdb8a05533b07dca91cf7e784f88f":[13,0,0,3,1,49,7],
+"group__tcp__raw.html#ga9dfcdb8a05533b07dca91cf7e784f88f":[11,2,0,5,5],
+"group__tcp__raw.html#gab0b45a01dcd461e5b8df2a1d9ddda134":[13,0,0,3,1,49,4],
+"group__tcp__raw.html#gab0b45a01dcd461e5b8df2a1d9ddda134":[11,2,0,5,2],
+"group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44":[13,0,0,2,17,33],
+"group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44":[13,0,0,3,1,49,40],
+"group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44":[11,2,0,5,25],
+"group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6":[13,0,0,2,17,4],
+"group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6":[13,0,0,3,1,49,21],
+"group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6":[11,2,0,5,10],
+"group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937":[13,0,0,2,17,25],
+"group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937":[11,2,0,5,21],
+"group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937":[13,0,0,3,1,49,36],
+"group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436":[13,0,0,2,17,22],
+"group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436":[13,0,0,3,1,49,34],
+"group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436":[11,2,0,5,19],
+"group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee":[13,0,0,3,1,49,24],
+"group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee":[11,2,0,5,13],
+"group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee":[13,0,0,2,17,7],
+"group__tcp__raw.html#gad1a95f09deb49cd7341d35527d6d3e2f":[11,2,0,5,6],
+"group__tcp__raw.html#gad1a95f09deb49cd7341d35527d6d3e2f":[13,0,0,3,1,49,9],
+"group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121":[11,2,0,5,17],
+"group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121":[13,0,0,2,17,12],
+"group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121":[13,0,0,3,1,49,28],
+"group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338":[13,0,0,2,17,21],
+"group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338":[11,2,0,5,18],
+"group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338":[13,0,0,3,1,49,33],
+"group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5":[13,0,0,2,17,29],
+"group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5":[13,0,0,3,1,49,38],
+"group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5":[11,2,0,5,23],
+"group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62":[13,0,0,2,17,2],
+"group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62":[11,2,0,5,9],
+"group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62":[13,0,0,3,1,49,20],
+"group__tcp__raw__extargs.html":[11,2,0,5,0],
+"group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316":[13,0,0,2,17,17],
+"group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316":[11,2,0,5,0,3],
+"group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316":[13,0,0,3,1,49,32],
+"group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616":[13,0,0,2,17,13],
+"group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616":[11,2,0,5,0,0],
+"group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616":[13,0,0,3,1,49,29],
+"group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318":[13,0,0,2,17,16],
+"group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318":[11,2,0,5,0,2],
+"group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318":[13,0,0,3,1,49,31],
+"group__tcp__raw__extargs.html#gaa8ac7a74407cb3e0e01a30314805f990":[13,0,0,2,17,14],
+"group__tcp__raw__extargs.html#gaa8ac7a74407cb3e0e01a30314805f990":[11,2,0,5,0,1],
+"group__tcp__raw__extargs.html#gaa8ac7a74407cb3e0e01a30314805f990":[13,0,0,3,1,49,30],
+"group__tftp.html":[11,4,9],
+"group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3":[13,0,0,1,9,0,1],
+"group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3":[11,4,9,3],
+"group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3":[13,0,0,3,1,0,25,1],
+"group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec":[13,0,0,1,9,0,0],
+"group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec":[11,4,9,2],
+"group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec":[13,0,0,3,1,0,25,0],
+"group__tftp__opts.html":[11,4,9,0],
+"group__tftp__opts.html#ga2dd54a1d0c3006527b8a7a8604b81981":[11,4,9,0,0],
+"group__tftp__opts.html#ga2dd54a1d0c3006527b8a7a8604b81981":[13,0,0,3,1,0,24,0],
+"group__tftp__opts.html#ga36986e5465dc2ccb6184fc57f9a37d63":[11,4,9,0,5],
+"group__tftp__opts.html#ga36986e5465dc2ccb6184fc57f9a37d63":[13,0,0,3,1,0,24,5],
+"group__tftp__opts.html#ga3e6caacb3f4d43f780b2d68ffe4258ea":[11,4,9,0,6],
+"group__tftp__opts.html#ga3e6caacb3f4d43f780b2d68ffe4258ea":[13,0,0,3,1,0,24,6],
+"group__tftp__opts.html#ga6a01757ad942eb602e8a87e2be42d313":[11,4,9,0,3],
+"group__tftp__opts.html#ga6a01757ad942eb602e8a87e2be42d313":[13,0,0,3,1,0,24,3],
+"group__tftp__opts.html#ga8e975900b4397313f1a649ff76a3063b":[11,4,9,0,1],
+"group__tftp__opts.html#ga8e975900b4397313f1a649ff76a3063b":[13,0,0,3,1,0,24,1],
+"group__tftp__opts.html#gaa8a449c25e37be757f5efccd422c9055":[11,4,9,0,2],
+"group__tftp__opts.html#gaa8a449c25e37be757f5efccd422c9055":[13,0,0,3,1,0,24,2],
+"group__tftp__opts.html#gad9230620a5d3bb87a7ac280ff99875d1":[11,4,9,0,4],
+"group__tftp__opts.html#gad9230620a5d3bb87a7ac280ff99875d1":[13,0,0,3,1,0,24,4],
+"group__udp__raw.html":[11,2,0,6],
+"group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646":[13,0,0,2,21,10],
+"group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646":[11,2,0,6,7],
+"group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646":[13,0,0,3,1,53,12],
+"group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8":[13,0,0,3,1,53,3],
+"group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8":[13,0,0,2,21,1],
+"group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8":[11,2,0,6,1],
+"group__udp__raw.html#ga83625967670477aa254643129a53971b":[13,0,0,2,21,2],
+"group__udp__raw.html#ga83625967670477aa254643129a53971b":[13,0,0,3,1,53,4],
+"group__udp__raw.html#ga83625967670477aa254643129a53971b":[11,2,0,6,2],
+"group__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142":[13,0,0,3,1,53,15],
+"group__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142":[13,0,0,2,21,13],
+"group__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142":[11,2,0,6,10],
+"group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc":[13,0,0,2,21,3],
+"group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc":[13,0,0,3,1,53,5],
+"group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc":[11,2,0,6,3],
+"group__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743":[13,0,0,3,1,53,14],
+"group__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743":[13,0,0,2,21,12],
+"group__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743":[11,2,0,6,9],
+"group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7":[13,0,0,2,21,14],
+"group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7":[13,0,0,3,1,53,16],
+"group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7":[11,2,0,6,11],
+"group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc":[13,0,0,3,1,53,13],
+"group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc":[11,2,0,6,8],
+"group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc":[13,0,0,2,21,11],
+"group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209":[13,0,0,3,1,53,9],
+"group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209":[13,0,0,2,21,7],
+"group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209":[11,2,0,6,4],
+"group__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e":[13,0,0,3,1,53,2],
+"group__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e":[11,2,0,6,0],
+"group__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e":[13,0,0,2,21,0],
+"group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027":[13,0,0,2,21,9],
+"group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027":[13,0,0,3,1,53,11],
+"group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027":[11,2,0,6,6],
+"group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88":[13,0,0,3,1,53,10],
+"group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88":[13,0,0,2,21,8],
+"group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88":[11,2,0,6,5],
+"group__zepif.html":[11,3,5],
+"group__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004":[11,3,5,0],
+"group__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004":[13,0,0,3,2,10,1],
+"group__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004":[13,0,0,4,8,1],
+"http__client_8c.html":[13,0,0,1,1,1],
+"http__client_8c.html#a32d4c0e6e42327e21fb59dabdc152dd1":[13,0,0,1,1,1,1]
+};
diff --git a/doc/doxygen/output/html/navtreeindex12.js b/doc/doxygen/output/html/navtreeindex12.js
new file mode 100644
index 0000000..cf7d0f1
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex12.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX12 =
+{
+"http__client_8c.html#ad2ec42c8e7adaef67266a5bd12c4ad2a":[13,0,0,1,1,1,2],
+"http__client_8c.html#aeda6122d341b879ba8b0fb2df834276a":[13,0,0,1,1,1,0],
+"http__client_8h.html":[13,0,0,3,1,0,2],
+"httpd_8c.html":[13,0,0,1,1,2],
+"httpd_8c.html#aa8e2f3e13ac1fcacd85c558d6e40e40a":[13,0,0,1,1,2,2],
+"httpd_8c.html#aa93d60e8af23b915b5b9652ff71e1300":[13,0,0,1,1,2,0],
+"httpd_8c.html#af281bc4a762d56243e0b85dd4197174a":[13,0,0,1,1,2,1],
+"httpd_8h.html":[13,0,0,3,1,0,3],
+"httpd_8h.html#aeb00bcd99ec9627b108832f0b58891ca":[13,0,0,3,1,0,3,0],
+"httpd__opts_8h.html":[13,0,0,3,1,0,4],
+"iana_8h.html":[13,0,0,3,1,2,6],
+"icmp6_8c.html":[13,0,0,2,1,2],
+"icmp6_8c.html#a358abb6555f6ca6b2b2b1412c9117bec":[13,0,0,2,1,2,4],
+"icmp6_8c.html#a3c0a84e0944263d92c9dc3ad094ffcb0":[13,0,0,2,1,2,2],
+"icmp6_8c.html#a6094fa333b2cbf1b1b062e72313ef146":[13,0,0,2,1,2,3],
+"icmp6_8c.html#a94bec819e11f51c8088ca338f2e36c3d":[13,0,0,2,1,2,1],
+"icmp6_8c.html#ab480867394952904b5607d62315bdbac":[13,0,0,2,1,2,0],
+"icmp6_8c.html#ad01e5bc4690a2c6aeb534237a5a9b593":[13,0,0,2,1,2,5],
+"icmp6_8h.html":[13,0,0,3,1,19],
+"icmp6_8h.html#a358abb6555f6ca6b2b2b1412c9117bec":[13,0,0,3,1,19,4],
+"icmp6_8h.html#a3c0a84e0944263d92c9dc3ad094ffcb0":[13,0,0,3,1,19,2],
+"icmp6_8h.html#a6094fa333b2cbf1b1b062e72313ef146":[13,0,0,3,1,19,3],
+"icmp6_8h.html#a94bec819e11f51c8088ca338f2e36c3d":[13,0,0,3,1,19,1],
+"icmp6_8h.html#ab480867394952904b5607d62315bdbac":[13,0,0,3,1,19,0],
+"icmp6_8h.html#ad01e5bc4690a2c6aeb534237a5a9b593":[13,0,0,3,1,19,5],
+"icmp_8c.html":[13,0,0,2,0,3],
+"icmp_8c.html#a49723e5e11c4bbc86197e58fdca7c119":[13,0,0,2,0,3,3],
+"icmp_8c.html#a6b9fd6be0a7dcf301bc86b9e96e3857e":[13,0,0,2,0,3,0],
+"icmp_8c.html#ac929e48a1dddf98050b73a2633fcaef1":[13,0,0,2,0,3,2],
+"icmp_8c.html#ae26c59eab4ce553964a0c9d43f534d06":[13,0,0,2,0,3,1],
+"icmp_8h.html":[13,0,0,3,1,18],
+"icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324a":[13,0,0,3,1,18,1],
+"icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa4d351874c3e2d4a4cf46569df28cd796":[13,0,0,3,1,18,1,1],
+"icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa827a1f8705826a6cc3c22e2571acf02c":[13,0,0,3,1,18,1,0],
+"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5":[13,0,0,3,1,18,0],
+"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3c7bbd13b613990413ef167017dfbcef":[13,0,0,3,1,18,0,2],
+"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3cc3714544e123bdef2eadb1a4d320e3":[13,0,0,3,1,18,0,0],
+"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a648ab915a76dfb7b9568e94de00da1e7":[13,0,0,3,1,18,0,1],
+"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a8be2bc49d42aa1a6ee1da93a8700ef5f":[13,0,0,3,1,18,0,4],
+"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5ac973dd9b04e094043ccc4cf875ef5644":[13,0,0,3,1,18,0,3],
+"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5af63296fc25f79e56946a56a8da132c13":[13,0,0,3,1,18,0,5],
+"icmp_8h.html#a49723e5e11c4bbc86197e58fdca7c119":[13,0,0,3,1,18,4],
+"icmp_8h.html#ac929e48a1dddf98050b73a2633fcaef1":[13,0,0,3,1,18,3],
+"icmp_8h.html#ae26c59eab4ce553964a0c9d43f534d06":[13,0,0,3,1,18,2],
+"ieee802154_8h.html":[13,0,0,3,2,4],
+"ieee_8h.html":[13,0,0,3,1,2,9],
+"if_8h.html":[13,0,0,3,0,0,1,0],
+"if__api_8c.html":[13,0,0,0,3],
+"if__api_8h.html":[13,0,0,3,1,20],
+"igmp_8c.html":[13,0,0,2,0,4],
+"igmp_8c.html#a065685cc25f2cc50f0d9659f4b086e1a":[13,0,0,2,0,4,1],
+"igmp_8c.html#a4418a22d37098f05d0c2fcfe288d0ca1":[13,0,0,2,0,4,10],
+"igmp_8c.html#a8228ddd10aa3f2518b16815d82d73448":[13,0,0,2,0,4,6],
+"igmp_8c.html#aac0fe91a589ba90b3f76e69cebf264f6":[13,0,0,2,0,4,8],
+"igmp_8c.html#aeb8103aa3091e35c966f0894fb54a2c8":[13,0,0,2,0,4,0],
+"igmp_8c.html#af06eeba0e984aab4a67a836eab577726":[13,0,0,2,0,4,7],
+"igmp_8c.html#afc19bd532855a64c021be08172065f84":[13,0,0,2,0,4,9],
+"igmp_8h.html":[13,0,0,3,1,21],
+"igmp_8h.html#a065685cc25f2cc50f0d9659f4b086e1a":[13,0,0,3,1,21,3],
+"igmp_8h.html#a4418a22d37098f05d0c2fcfe288d0ca1":[13,0,0,3,1,21,12],
+"igmp_8h.html#a8228ddd10aa3f2518b16815d82d73448":[13,0,0,3,1,21,8],
+"igmp_8h.html#aac0fe91a589ba90b3f76e69cebf264f6":[13,0,0,3,1,21,10],
+"igmp_8h.html#aeb8103aa3091e35c966f0894fb54a2c8":[13,0,0,3,1,21,2],
+"igmp_8h.html#af06eeba0e984aab4a67a836eab577726":[13,0,0,3,1,21,9],
+"igmp_8h.html#afc19bd532855a64c021be08172065f84":[13,0,0,3,1,21,11],
+"index.html":[],
+"index.html":[0],
+"inet6_8c.html":[13,0,0,2,1,3],
+"inet6_8c.html#af8c97553060738d9edd6bfeab13ef7c3":[13,0,0,2,1,3,0],
+"inet__chksum_8c.html":[13,0,0,2,7],
+"inet__chksum_8c.html#a102544bca5912c78649e25a45a7d0a88":[13,0,0,2,7,1],
+"inet__chksum_8c.html#ab35967a50418358e194e8f80fdc3c865":[13,0,0,2,7,0],
+"inet__chksum_8c.html#ae4218e08510fd92c9a699c4e5d9fc17b":[13,0,0,2,7,2],
+"inet__chksum_8h.html":[13,0,0,3,1,23],
+"inet__chksum_8h.html#a0196bd603262882d16b5264b52eafe18":[13,0,0,3,1,23,1],
+"inet__chksum_8h.html#a102544bca5912c78649e25a45a7d0a88":[13,0,0,3,1,23,3],
+"inet__chksum_8h.html#a6ffe83b4bdd1784a0671ee4778966a01":[13,0,0,3,1,23,0],
+"inet__chksum_8h.html#ab35967a50418358e194e8f80fdc3c865":[13,0,0,3,1,23,2],
+"inet__chksum_8h.html#ae4218e08510fd92c9a699c4e5d9fc17b":[13,0,0,3,1,23,4],
+"init_8c.html":[13,0,0,2,8],
+"init_8h.html":[13,0,0,3,1,24],
+"ip4_8c.html":[13,0,0,2,0,5],
+"ip4_8c.html#a0d912e400875396792a12ea443ecc1cf":[13,0,0,2,0,5,5],
+"ip4_8c.html#a185c7d6380711847105430931692b267":[13,0,0,2,0,5,0],
+"ip4_8c.html#a2943d118873e9eb1d8296e04a6740db7":[13,0,0,2,0,5,7],
+"ip4_8c.html#a9652ce304f893f6245c6ba9daea0a30f":[13,0,0,2,0,5,1],
+"ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917":[13,0,0,2,0,5,4],
+"ip4_8c.html#ab615a9ca8fdd99e697f52506fc440fba":[13,0,0,2,0,5,9],
+"ip4_8c.html#ac659f675356cfc1d4d13884946347e47":[13,0,0,2,0,5,8],
+"ip4_8c.html#ac87d296205eb5ac04058e609672d4ba8":[13,0,0,2,0,5,3],
+"ip4_8c.html#accd56b095730de4ad56728bfcb349940":[13,0,0,2,0,5,6],
+"ip4_8c.html#aff1f784c9f05f3d79cc1a921d840501b":[13,0,0,2,0,5,2],
+"ip4_8h.html":[13,0,0,3,1,26],
+"ip4_8h.html#a0d912e400875396792a12ea443ecc1cf":[13,0,0,3,1,26,4],
+"ip4_8h.html#a2943d118873e9eb1d8296e04a6740db7":[13,0,0,3,1,26,6],
+"ip4_8h.html#a516aa115f61c368cbe74fae2da2c6824":[13,0,0,3,1,26,0],
+"ip4_8h.html#ab220bc4ce4f48bdbba447358b3594917":[13,0,0,3,1,26,3],
+"ip4_8h.html#ab615a9ca8fdd99e697f52506fc440fba":[13,0,0,3,1,26,8],
+"ip4_8h.html#ac659f675356cfc1d4d13884946347e47":[13,0,0,3,1,26,7],
+"ip4_8h.html#ac87d296205eb5ac04058e609672d4ba8":[13,0,0,3,1,26,2],
+"ip4_8h.html#accd56b095730de4ad56728bfcb349940":[13,0,0,3,1,26,5],
+"ip4_8h.html#aff1f784c9f05f3d79cc1a921d840501b":[13,0,0,3,1,26,1],
+"ip4__addr_8c.html":[13,0,0,2,0,6],
+"ip4__addr_8c.html#a28620fdd443c5c98d15e5890cbd9059c":[13,0,0,2,0,6,3],
+"ip4__addr_8c.html#a2c05f9138da41115978409e547df9670":[13,0,0,2,0,6,5],
+"ip4__addr_8c.html#a3825d5b4786c207af971ceb287f101fd":[13,0,0,2,0,6,4],
+"ip4__addr_8c.html#ab3cd7e7fba28c29d35f3c17461071421":[13,0,0,2,0,6,0],
+"ip4__addr_8c.html#ab5810d404b0ad1b89ef1323ea1e78071":[13,0,0,2,0,6,1],
+"ip4__addr_8c.html#af66de98501e92c66714d58119b6d9e1a":[13,0,0,2,0,6,2],
+"ip4__addr_8h.html":[13,0,0,3,1,27],
+"ip4__addr_8h.html#a28620fdd443c5c98d15e5890cbd9059c":[13,0,0,3,1,27,22],
+"ip4__addr_8h.html#a2b2230516e7911dfacc9b87644ba30f1":[13,0,0,3,1,27,13],
+"ip4__addr_8h.html#a2c05f9138da41115978409e547df9670":[13,0,0,3,1,27,24],
+"ip4__addr_8h.html#a2f4e9c339e897e6ca5cb4a2f1e8394d5":[13,0,0,3,1,27,2],
+"ip4__addr_8h.html#a33a17a8d2025ce3715db835534868e88":[13,0,0,3,1,27,7],
+"ip4__addr_8h.html#a3825d5b4786c207af971ceb287f101fd":[13,0,0,3,1,27,23],
+"ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e":[13,0,0,3,1,27,18],
+"ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051":[13,0,0,3,1,27,5],
+"ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974":[13,0,0,3,1,27,1],
+"ip4__addr_8h.html#a5c7eae50a387987a7f56c29c74255c3c":[13,0,0,3,1,27,10],
+"ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e":[13,0,0,3,1,27,16],
+"ip4__addr_8h.html#a81658cb05ba504d13ee860e82dc444e9":[13,0,0,3,1,27,3],
+"ip4__addr_8h.html#a901850ec90b01b9bf6baf69561aa465a":[13,0,0,3,1,27,9],
+"ip4__addr_8h.html#a973b6ad98e037fc45f1e11d29cda99ea":[13,0,0,3,1,27,12],
+"ip4__addr_8h.html#ab3cd7e7fba28c29d35f3c17461071421":[13,0,0,3,1,27,19],
+"ip4__addr_8h.html#ab5810d404b0ad1b89ef1323ea1e78071":[13,0,0,3,1,27,20],
+"ip4__addr_8h.html#abc4b2e3531c4992f2ae4b8c0f9751544":[13,0,0,3,1,27,17],
+"ip4__addr_8h.html#ac661fca7e7d25e5cd379b811a767c29a":[13,0,0,3,1,27,15],
+"ip4__addr_8h.html#ad50d93464bbbda199b585c54869a3a4b":[13,0,0,3,1,27,4],
+"ip4__addr_8h.html#ad6ed0d622d61ecd6edd606e3b564f0a2":[13,0,0,3,1,27,14],
+"ip4__addr_8h.html#aeb39f58b38435f89219c8ccb509eb520":[13,0,0,3,1,27,11],
+"ip4__addr_8h.html#af66de98501e92c66714d58119b6d9e1a":[13,0,0,3,1,27,21],
+"ip4__addr_8h.html#afaaed3762ce8e9de14fcf73b19964567":[13,0,0,3,1,27,8],
+"ip4__addr_8h.html#afd43f6ceb2df8d50c84509ad1059f514":[13,0,0,3,1,27,6],
+"ip4__frag_8c.html":[13,0,0,2,0,7],
+"ip4__frag_8c.html#a510934accf149433bdcf683993e79080":[13,0,0,2,0,7,2],
+"ip4__frag_8c.html#a70872fd4c7aefec6b4eef0707e1a371c":[13,0,0,2,0,7,3],
+"ip4__frag_8c.html#a7debaa6366c0db4270d4f03219c75c05":[13,0,0,2,0,7,4],
+"ip4__frag_8c.html#abc7017eb20983f372e81de7376ebec88":[13,0,0,2,0,7,5],
+"ip4__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe":[13,0,0,2,0,7,1],
+"ip4__frag_8h.html":[13,0,0,3,1,28],
+"ip4__frag_8h.html#a70872fd4c7aefec6b4eef0707e1a371c":[13,0,0,3,1,28,2],
+"ip4__frag_8h.html#a7debaa6366c0db4270d4f03219c75c05":[13,0,0,3,1,28,3],
+"ip4__frag_8h.html#abc7017eb20983f372e81de7376ebec88":[13,0,0,3,1,28,4],
+"ip6_8c.html":[13,0,0,2,1,4],
+"ip6_8c.html#a1153bd9e8c45847282105ab6379e6e70":[13,0,0,2,1,4,5],
+"ip6_8c.html#a58bd3c9ce332731fac82b89c77be4f56":[13,0,0,2,1,4,4],
+"ip6_8c.html#a6bbbae5ea37a82c746dba2feb1abd094":[13,0,0,2,1,4,0],
+"ip6_8c.html#a7a8d47200bb6ccbec329be8f0979853e":[13,0,0,2,1,4,1],
+"ip6_8c.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4":[13,0,0,2,1,4,3],
+"ip6_8c.html#aec695e64536ac744e616c997deb84cda":[13,0,0,2,1,4,2],
+"ip6_8h.html":[13,0,0,3,1,29],
+"ip6_8h.html#a1153bd9e8c45847282105ab6379e6e70":[13,0,0,3,1,29,5],
+"ip6_8h.html#a58bd3c9ce332731fac82b89c77be4f56":[13,0,0,3,1,29,4],
+"ip6_8h.html#a6bbbae5ea37a82c746dba2feb1abd094":[13,0,0,3,1,29,0],
+"ip6_8h.html#a7a8d47200bb6ccbec329be8f0979853e":[13,0,0,3,1,29,1],
+"ip6_8h.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4":[13,0,0,3,1,29,3],
+"ip6_8h.html#aec695e64536ac744e616c997deb84cda":[13,0,0,3,1,29,2],
+"ip6__addr_8c.html":[13,0,0,2,1,5],
+"ip6__addr_8c.html#a3f555ae302eb056f28f6cb266a27036e":[13,0,0,2,1,5,0],
+"ip6__addr_8c.html#a64d442f35f34c43121bf91cfea2e77a2":[13,0,0,2,1,5,2],
+"ip6__addr_8c.html#adba4443e6629583d48e1d1c7c21a977e":[13,0,0,2,1,5,1],
+"ip6__addr_8h.html":[13,0,0,3,1,30],
+"ip6__addr_8h.html#a02f5271e922f34a09153ce84839ad292":[13,0,0,3,1,30,22],
+"ip6__addr_8h.html#a05575d46c233ffb13fb03a3a2c8a16b3":[13,0,0,3,1,30,14],
+"ip6__addr_8h.html#a116d7c5c8bf8531b27f8a9fa98e728c3":[13,0,0,3,1,30,7],
+"ip6__addr_8h.html#a11fe84789e3f039b3f71009e802946a8":[13,0,0,3,1,30,11],
+"ip6__addr_8h.html#a1d78feeb50aec8f2c07d840829f49ddd":[13,0,0,3,1,30,18],
+"ip6__addr_8h.html#a2a5d7de341ce708b7145ad4d72652c71":[13,0,0,3,1,30,5],
+"ip6__addr_8h.html#a30c92254d6abe631de6a5accfd491bc3":[13,0,0,3,1,30,1],
+"ip6__addr_8h.html#a3f555ae302eb056f28f6cb266a27036e":[13,0,0,3,1,30,25],
+"ip6__addr_8h.html#a56a11cfaa169389c319f8bd027ac524c":[13,0,0,3,1,30,6],
+"ip6__addr_8h.html#a6466b1c0edd03d6a5986dcc79f7d8bb6":[13,0,0,3,1,30,4],
+"ip6__addr_8h.html#a64d442f35f34c43121bf91cfea2e77a2":[13,0,0,3,1,30,27],
+"ip6__addr_8h.html#a6c46d12fa7d36c47b629d0ccdefa114b":[13,0,0,3,1,30,15],
+"ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2":[13,0,0,3,1,30,16],
+"ip6__addr_8h.html#a7b17e85a46bd8368ce27fc644e058073":[13,0,0,3,1,30,13],
+"ip6__addr_8h.html#a9193137423b6b936d25c2e6cf33b4921":[13,0,0,3,1,30,3],
+"ip6__addr_8h.html#aa7b4ba4202b5f64dee605fe159e9c3ad":[13,0,0,3,1,30,19],
+"ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762":[13,0,0,3,1,30,24],
+"ip6__addr_8h.html#ab87bee320ecc0e923931ee6f49802deb":[13,0,0,3,1,30,8],
+"ip6__addr_8h.html#acc1622ab895680da0a3b6e5e56070342":[13,0,0,3,1,30,17],
+"ip6__addr_8h.html#ad0fc088972d395839a7ad75d3dab8322":[13,0,0,3,1,30,12],
+"ip6__addr_8h.html#ad636c27d56d1b3deca9f780bc173d3c2":[13,0,0,3,1,30,21],
+"ip6__addr_8h.html#adba4443e6629583d48e1d1c7c21a977e":[13,0,0,3,1,30,26],
+"ip6__addr_8h.html#ae258ebfa66d18c8c428bf3d8fd0f969c":[13,0,0,3,1,30,2],
+"ip6__addr_8h.html#ae2d1ce50ec6dbee890e2f8ae64abdf6b":[13,0,0,3,1,30,20],
+"ip6__addr_8h.html#aea8d4c4134abff1c76bc997a91163fe1":[13,0,0,3,1,30,10],
+"ip6__addr_8h.html#af3d1f9876bf256ec964bd3809d7ed1b4":[13,0,0,3,1,30,9],
+"ip6__addr_8h.html#af696d3b81f4cb9c40ece912de73ed53c":[13,0,0,3,1,30,23],
+"ip6__frag_8c.html":[13,0,0,2,1,6],
+"ip6__frag_8c.html#a3ef87acbc615d5eb015104f83bbe7d37":[13,0,0,2,1,6,3],
+"ip6__frag_8c.html#a510934accf149433bdcf683993e79080":[13,0,0,2,1,6,2],
+"ip6__frag_8c.html#adbd666d01adcbbbc5966938f02025b7c":[13,0,0,2,1,6,4],
+"ip6__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe":[13,0,0,2,1,6,1],
+"ip6__frag_8h.html":[13,0,0,3,1,31],
+"ip6__frag_8h.html#a151e742cf7f0e5c3a08f31db0370cea7":[13,0,0,3,1,31,3],
+"ip6__frag_8h.html#a3ef87acbc615d5eb015104f83bbe7d37":[13,0,0,3,1,31,4],
+"ip6__frag_8h.html#ad0730ee4db9fbebdf071bb33d75698a2":[13,0,0,3,1,31,2],
+"ip6__frag_8h.html#adbd666d01adcbbbc5966938f02025b7c":[13,0,0,3,1,31,5],
+"ip6__zone_8h.html":[13,0,0,3,1,32],
+"ip_8c.html":[13,0,0,2,9],
+"ip_8c.html#ac944fb6564f181bc90bc7c2b8b00d94c":[13,0,0,2,9,4],
+"ip_8h.html":[13,0,0,3,1,25],
+"ip_8h.html#a13f48cf825c7f074dc05bea54e9d6a93":[13,0,0,3,1,25,27],
+"ip_8h.html#a176525c2192d37ee9eaeba8012c5d9c0":[13,0,0,3,1,25,4],
+"ip_8h.html#a26e077f52de4a97ff89c02415c084518":[13,0,0,3,1,25,16],
+"ip_8h.html#a2833c8d59910dd7c0e87ab3bb174e720":[13,0,0,3,1,25,1],
+"ip_8h.html#a2ca15ea285a10982294378cd7b8e83e2":[13,0,0,3,1,25,10],
+"ip_8h.html#a355679dba1c0d8ef07ce3abcd28e3063":[13,0,0,3,1,25,28],
+"ip_8h.html#a3ce482b7e08282effd670001198ecd87":[13,0,0,3,1,25,2],
+"ip_8h.html#a441c63f00c4b0cb69fc34ca6b55307cc":[13,0,0,3,1,25,25],
+"ip_8h.html#a4e35b7692c228c98e738892f0a215647":[13,0,0,3,1,25,14],
+"ip_8h.html#a4e35b7692c228c98e738892f0a215647":[13,0,0,3,1,25,15],
+"ip_8h.html#a68d25b5924b768cbf2f1a78bbabfce26":[13,0,0,3,1,25,18],
+"ip_8h.html#a8bdf4b5f674375e76cdd968826d80e53":[13,0,0,3,1,25,24],
+"ip_8h.html#a9135977868017c3deeec86b525e13997":[13,0,0,3,1,25,7],
+"ip_8h.html#a9135977868017c3deeec86b525e13997":[13,0,0,3,1,25,8],
+"ip_8h.html#aabecef3c7653a9767c79245c44fcab9f":[13,0,0,3,1,25,13],
+"ip_8h.html#aac608b92f8f226c3574d6bb855f12496":[13,0,0,3,1,25,22],
+"ip_8h.html#abc56623d434a204298a4e98352af1c9d":[13,0,0,3,1,25,12],
+"ip_8h.html#ac40a9e4a21ecf5bb39813bb6ca5bb245":[13,0,0,3,1,25,6],
+"ip_8h.html#ac944fb6564f181bc90bc7c2b8b00d94c":[13,0,0,3,1,25,30],
+"ip_8h.html#accbc01f37dd426a66de41693a5450207":[13,0,0,3,1,25,20],
+"ip_8h.html#ad2a62f96b9431a79f0258dc13058b160":[13,0,0,3,1,25,3],
+"ip_8h.html#ae214afa9d3f1b26fc8d538436b8fa3c4":[13,0,0,3,1,25,11],
+"ip_8h.html#af27c43c23b59d68a8463cd5ad035b20f":[13,0,0,3,1,25,9],
+"ip_8h.html#af9bf74750c9d7a219ee88d240300fe69":[13,0,0,3,1,25,5],
+"ip__addr_8h.html":[13,0,0,3,1,33],
+"ip__addr_8h.html#aecb93d575e65f835f1045a4e87e70ed9":[13,0,0,3,1,33,38],
+"lowpan6_8c.html":[13,0,0,4,4],
+"lowpan6_8c.html#ab33dc87f30aeda871845854511de9931":[13,0,0,4,4,2],
+"lowpan6_8c.html#ac8c3a4612aeb23f65e55c18faf5ad7d7":[13,0,0,4,4,8],
+"lowpan6_8h.html":[13,0,0,3,2,5],
+"lowpan6_8h.html#aa258ae16a937c40333c8f97a7f236797":[13,0,0,3,2,5,0],
+"lowpan6_8h.html#ab33dc87f30aeda871845854511de9931":[13,0,0,3,2,5,1],
+"lowpan6_8h.html#ac8c3a4612aeb23f65e55c18faf5ad7d7":[13,0,0,3,2,5,7],
+"lowpan6__ble_8c.html":[13,0,0,4,5],
+"lowpan6__ble_8c.html#a01b797f4fde59dfb803f0299e6a49593":[13,0,0,4,5,8],
+"lowpan6__ble_8c.html#a437b9f9e85be644bd7b939413e3c81d0":[13,0,0,4,5,9],
+"lowpan6__ble_8c.html#a53d4e8096dd714f94c69d67a6cd49ac2":[13,0,0,4,5,7],
+"lowpan6__ble_8c.html#a6ae90ad69f5d901eb44cf87b9120cd9a":[13,0,0,4,5,10],
+"lowpan6__ble_8c.html#a9c5b721f6fb28b4c999baab56a65d8e2":[13,0,0,4,5,6],
+"lowpan6__ble_8h.html":[13,0,0,3,2,6],
+"lowpan6__ble_8h.html#a01b797f4fde59dfb803f0299e6a49593":[13,0,0,3,2,6,8],
+"lowpan6__ble_8h.html#a437b9f9e85be644bd7b939413e3c81d0":[13,0,0,3,2,6,9],
+"lowpan6__ble_8h.html#a53d4e8096dd714f94c69d67a6cd49ac2":[13,0,0,3,2,6,7],
+"lowpan6__ble_8h.html#a6ae90ad69f5d901eb44cf87b9120cd9a":[13,0,0,3,2,6,10],
+"lowpan6__ble_8h.html#a9c5b721f6fb28b4c999baab56a65d8e2":[13,0,0,3,2,6,6],
+"lowpan6__common_8c.html":[13,0,0,4,6]
+};
diff --git a/doc/doxygen/output/html/navtreeindex13.js b/doc/doxygen/output/html/navtreeindex13.js
new file mode 100644
index 0000000..a63a7ad
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex13.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX13 =
+{
+"lowpan6__common_8h.html":[13,0,0,3,2,7],
+"lowpan6__opts_8h.html":[13,0,0,3,2,8],
+"lowpan6__opts_8h.html#a0f178a86d02e0ba4168cafe3de5f3afa":[13,0,0,3,2,8,3],
+"lowpan6__opts_8h.html#a231bc758484376dfd2ded6931c462df8":[13,0,0,3,2,8,8],
+"lowpan6__opts_8h.html#a4ffa89f39abf93cc599f78c5a8bb0a4a":[13,0,0,3,2,8,4],
+"lowpan6__opts_8h.html#a5b7a3e204d2edde5552ca3c8694419c1":[13,0,0,3,2,8,9],
+"lowpan6__opts_8h.html#a6a542cd72a6270b7231b8b93f8041207":[13,0,0,3,2,8,2],
+"lowpan6__opts_8h.html#a7f4db0bd3dbe36a19efbd24cd8b7fcf0":[13,0,0,3,2,8,7],
+"lowpan6__opts_8h.html#acf9a44be56d5dca9e45f644571d66f58":[13,0,0,3,2,8,5],
+"lowpan6__opts_8h.html#ad20840e31a0a6eeec8666e4d4a979f43":[13,0,0,3,2,8,1],
+"lowpan6__opts_8h.html#ae5bb9b8d695caec08930073edc7c6175":[13,0,0,3,2,8,0],
+"lowpan6__opts_8h.html#ae90ebb32999c6df5cc83705e133e1754":[13,0,0,3,2,8,6],
+"lowpan6__opts_8h.html#af4a4d962af3439b111a8e72e5eeaccf8":[13,0,0,3,2,8,10],
+"lwip_2errno_8h.html":[13,0,0,3,1,15],
+"lwip_2etharp_8h.html":[13,0,0,3,1,16],
+"lwip_2etharp_8h.html#a0f8ca87c5472fa165763c8c38b76174c":[13,0,0,3,1,16,4],
+"lwip_2etharp_8h.html#a19258c75a3778b6ed0c82f63a419502d":[13,0,0,3,1,16,7],
+"lwip_2etharp_8h.html#a3e56faced96841e615f88dd57d1b2b15":[13,0,0,3,1,16,9],
+"lwip_2etharp_8h.html#a540a5506979693ef9ac4496db9bfa7d6":[13,0,0,3,1,16,6],
+"lwip_2etharp_8h.html#a654f4dad71f7e2bc4820094648f37a26":[13,0,0,3,1,16,10],
+"lwip_2etharp_8h.html#a83947dea159baf3420922084072e631e":[13,0,0,3,1,16,2],
+"lwip_2etharp_8h.html#aaa3d8ed1eb1129f518345e37b38cfc37":[13,0,0,3,1,16,1],
+"lwip_2etharp_8h.html#ab93df7ccb26496100d45137541e863c8":[13,0,0,3,1,16,5],
+"lwip_2etharp_8h.html#ae180772e31346a0afeb707ad172dd19c":[13,0,0,3,1,16,8],
+"lwip_2etharp_8h.html#ae94677a2a5f3698276027c7475f6ca05":[13,0,0,3,1,16,3],
+"lwip_2inet_8h.html":[13,0,0,3,1,22],
+"lwip_2inet_8h.html#a1de876a356ee05a2e9427b741f99f49c":[13,0,0,3,1,22,0],
+"lwip_2inet_8h.html#a3d2472d6cf31b73eeb829110dd0fffea":[13,0,0,3,1,22,5],
+"lwip_2inet_8h.html#a4a725f61ded23ce8a7dff8e82ed51986":[13,0,0,3,1,22,3],
+"lwip_2inet_8h.html#a5562c81af19ee5988ddc5a5c6153cf37":[13,0,0,3,1,22,1],
+"lwip_2inet_8h.html#a5d1940045dc2e7de552f3d4ff13a74ab":[13,0,0,3,1,22,2],
+"lwip_2inet_8h.html#ae1ac25d7797666cff6d01d6c795c2378":[13,0,0,3,1,22,4],
+"lwip_2inet_8h.html#af8c97553060738d9edd6bfeab13ef7c3":[13,0,0,3,1,22,6],
+"lwip_2netdb_8h.html":[13,0,0,3,1,39],
+"lwip_2netdb_8h.html#a0bb00f48d6ba1e8c55b7d85c8e3a19a7":[13,0,0,3,1,39,0],
+"lwip_2netdb_8h.html#a2a1ce3f2040007303d36c0b682b5ac10":[13,0,0,3,1,39,9],
+"lwip_2netdb_8h.html#a7f65ff5982a0743849a644ef2cd15ef5":[13,0,0,3,1,39,5],
+"lwip_2netdb_8h.html#a8adc6d35c068a073369edde71c678cbc":[13,0,0,3,1,39,7],
+"lwip_2netdb_8h.html#af356989c172a51187e22b557f22d4165":[13,0,0,3,1,39,6],
+"lwip_2netdb_8h.html#afa229e90916f6c8d6308828f45351d2d":[13,0,0,3,1,39,8],
+"lwip_2prot_2etharp_8h.html":[13,0,0,3,1,2,4],
+"lwip_2prot_2etharp_8h.html#a7dff02ff186f844b731cecbe614b7419":[13,0,0,3,1,2,4,2],
+"lwip_2prot_2etharp_8h.html#a94f1c2a6ad7cecdfe759c0490ba7f030":[13,0,0,3,1,2,4,3],
+"lwip_2prot_2ethernet_8h.html":[13,0,0,3,1,2,5],
+"lwip_2prot_2ethernet_8h.html#a19c72ce98569e0fb55948a7587d704ee":[13,0,0,3,1,2,5,3],
+"lwip_2prot_2ethernet_8h.html#a8ebe93c6ad2d743e6c952539257679b6":[13,0,0,3,1,2,5,5],
+"lwip_2prot_2ethernet_8h.html#afaf6cbccf9477c3505660e3a17860e07":[13,0,0,3,1,2,5,4],
+"lwiperf_8c.html":[13,0,0,1,2,0],
+"lwiperf_8c.html#a06db7abdf1d4864ca2b367d9c89e3e2d":[13,0,0,1,2,0,6],
+"lwiperf_8c.html#a1351e47d0bdb7d0fe0efaf9f1b2b0f7a":[13,0,0,1,2,0,3],
+"lwiperf_8c.html#a4a794a0c1a90b889d54b1dacbce923f4":[13,0,0,1,2,0,5],
+"lwiperf_8c.html#a646d7e0b37c5cefdd6eef38a3fba4673":[13,0,0,1,2,0,4],
+"lwiperf_8c.html#af51dcfc53fe575411c26e18963f1b902":[13,0,0,1,2,0,2],
+"lwiperf_8h.html":[13,0,0,3,1,0,5],
+"lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd":[13,0,0,3,1,0,5,0],
+"lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76c":[13,0,0,3,1,0,5,1],
+"lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cab0381feca6655968e7380622e7a63ede":[13,0,0,3,1,0,5,1,1],
+"lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76caccdab7ee6e1b0981861e66f0755f7964":[13,0,0,3,1,0,5,1,2],
+"lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cae1862655ebaaea2e7e0261dff0173110":[13,0,0,3,1,0,5,1,0],
+"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6":[13,0,0,3,1,0,5,2],
+"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a3d4e1f5742d80aeafb6b22aa74d93e40":[13,0,0,3,1,0,5,2,4],
+"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a4f9bde0cad305eaab25d2c1d0196677b":[13,0,0,3,1,0,5,2,1],
+"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6aa52255236ad2983346311ce7f28210e5":[13,0,0,3,1,0,5,2,0],
+"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6abee2bf6da51a0845c15ac52b280203cb":[13,0,0,3,1,0,5,2,2],
+"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6adda7e5dbaf1e04eb04ec0fd2b05584a5":[13,0,0,3,1,0,5,2,3],
+"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6ae664c0f987584f07fb0f6f8896aada0d":[13,0,0,3,1,0,5,2,5],
+"mdns_8c.html":[13,0,0,1,3,0],
+"mdns_8c.html#a01f8850b9c2d2cd40ed77a1438c85bf1":[13,0,0,1,3,0,15],
+"mdns_8c.html#a17db69fa887515374452b945e959bbf9":[13,0,0,1,3,0,6],
+"mdns_8c.html#a52d8f70432ae998814f16b18431213cd":[13,0,0,1,3,0,7],
+"mdns_8c.html#ab5f49d9356a76879e0e6a14eb0643b23":[13,0,0,1,3,0,8],
+"mdns_8c.html#ab72e48cf076afd1e3a08030d1d0bff9e":[13,0,0,1,3,0,5],
+"mdns_8h.html":[13,0,0,3,1,0,6],
+"mdns_8h.html#a01f8850b9c2d2cd40ed77a1438c85bf1":[13,0,0,3,1,0,6,9],
+"mdns_8h.html#a19f12d7092de6fe90d5843e4ef8d4536":[13,0,0,3,1,0,6,1],
+"mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83":[13,0,0,3,1,0,6,2],
+"mdns__opts_8h.html":[13,0,0,3,1,0,7],
+"mdns__priv_8h.html":[13,0,0,3,1,0,8],
+"mdns__priv_8h.html#a17db69fa887515374452b945e959bbf9":[13,0,0,3,1,0,8,1],
+"mdns__priv_8h.html#a52d8f70432ae998814f16b18431213cd":[13,0,0,3,1,0,8,2],
+"mdns__priv_8h.html#ab5f49d9356a76879e0e6a14eb0643b23":[13,0,0,3,1,0,8,3],
+"mdns__priv_8h.html#ab72e48cf076afd1e3a08030d1d0bff9e":[13,0,0,3,1,0,8,0],
+"mem_8c.html":[13,0,0,2,10],
+"mem_8c.html#a278694c2333c9826f21ddd2c2d220f66":[13,0,0,2,10,1],
+"mem_8c.html#a44a136e3b70c36abb6f8dc060c778113":[13,0,0,2,10,4],
+"mem_8c.html#a65169147c44e9db60d997819af9b455c":[13,0,0,2,10,3],
+"mem_8c.html#a6da602f2bbf1d555556f9260b3b8ad5f":[13,0,0,2,10,7],
+"mem_8c.html#a7e6b7f11bb50bead9b35515d9a517124":[13,0,0,2,10,6],
+"mem_8c.html#ab0bdc525971701883f2065e7fb257a24":[13,0,0,2,10,2],
+"mem_8c.html#af418ade27d91d41e6143dba2cc246b0f":[13,0,0,2,10,5],
+"mem_8h.html":[13,0,0,3,1,34],
+"mem_8h.html#a2fd7aa1adf6e394d3be7c7734e7df41a":[13,0,0,3,1,34,1],
+"mem_8h.html#a44a136e3b70c36abb6f8dc060c778113":[13,0,0,3,1,34,2],
+"mem_8h.html#a5e39a108c44d8a72df0b30a117cb62e4":[13,0,0,3,1,34,4],
+"mem_8h.html#a932aa40d85b14cb7331625e012d12335":[13,0,0,3,1,34,3],
+"mem_8h.html#ab0bdc525971701883f2065e7fb257a24":[13,0,0,3,1,34,0],
+"mem__priv_8h.html":[13,0,0,3,1,1,2],
+"memp_8c.html":[13,0,0,2,11],
+"memp_8c.html#a2b00593d086313c267b54a976bf67aa5":[13,0,0,2,11,4],
+"memp_8c.html#a348c83ee972f1edf7296a1cdf1d75f22":[13,0,0,2,11,5],
+"memp_8c.html#a62f8c3c907743e34eee3cdac7fa1eaa5":[13,0,0,2,11,1],
+"memp_8c.html#a6416303426d05526bed33f241fa6ecd7":[13,0,0,2,11,3],
+"memp_8c.html#a9693e5b1ac2c6b9c0e7870522d45efa2":[13,0,0,2,11,2],
+"memp_8c.html#aecd94926b7c2a0e23ae195f4ae97581f":[13,0,0,2,11,0],
+"memp_8h.html":[13,0,0,3,1,35],
+"memp_8h.html#a2b00593d086313c267b54a976bf67aa5":[13,0,0,3,1,35,8],
+"memp_8h.html#a85a164b1f7764951cc685ea525114e57":[13,0,0,3,1,35,5],
+"memp_8h.html#a9693e5b1ac2c6b9c0e7870522d45efa2":[13,0,0,3,1,35,7],
+"memp_8h.html#aecd94926b7c2a0e23ae195f4ae97581f":[13,0,0,3,1,35,6],
+"memp__priv_8h.html":[13,0,0,3,1,1,3],
+"memp__priv_8h.html#a348c83ee972f1edf7296a1cdf1d75f22":[13,0,0,3,1,1,3,3],
+"memp__priv_8h.html#a62f8c3c907743e34eee3cdac7fa1eaa5":[13,0,0,3,1,1,3,1],
+"memp__priv_8h.html#a6416303426d05526bed33f241fa6ecd7":[13,0,0,3,1,1,3,2],
+"memp__std_8h.html":[13,0,0,3,1,1,4],
+"mld6_8c.html":[13,0,0,2,1,7],
+"mld6_8c.html#a2a08b95a7b3c82da05df1a3b50629686":[13,0,0,2,1,7,6],
+"mld6_8c.html#a4ddb496d0a6a466df5665dbed8bd6274":[13,0,0,2,1,7,8],
+"mld6_8c.html#a7c190ca25432d466b28f607c3574a841":[13,0,0,2,1,7,0],
+"mld6_8c.html#ab7197d123f21a8863b56cc3871fd5198":[13,0,0,2,1,7,7],
+"mld6_8c.html#ad2fbba6bc543dbf994961656d7431eb5":[13,0,0,2,1,7,5],
+"mld6_8h.html":[13,0,0,3,1,36],
+"mld6_8h.html#a2a08b95a7b3c82da05df1a3b50629686":[13,0,0,3,1,36,8],
+"mld6_8h.html#a4ddb496d0a6a466df5665dbed8bd6274":[13,0,0,3,1,36,10],
+"mld6_8h.html#a7c190ca25432d466b28f607c3574a841":[13,0,0,3,1,36,2],
+"mld6_8h.html#ab7197d123f21a8863b56cc3871fd5198":[13,0,0,3,1,36,9],
+"mld6_8h.html#ad2fbba6bc543dbf994961656d7431eb5":[13,0,0,3,1,36,7],
+"modules.html":[11],
+"mqtt_8c.html":[13,0,0,1,4,0],
+"mqtt_8c.html#a45c57ebd31832f1c128d847067c4688b":[13,0,0,1,4,0,0],
+"mqtt_8c.html#a4f6c42ed730546ff755e3bb99989dd12":[13,0,0,1,4,0,4],
+"mqtt_8c.html#a99c325e06cc17ee24e09dab251606f9d":[13,0,0,1,4,0,1],
+"mqtt_8c.html#ac243cf15beb51b2206e36da86c2f95f1":[13,0,0,1,4,0,5],
+"mqtt_8c.html#ad82b4039213ab3f1d9e4bcd3aa0c88a3":[13,0,0,1,4,0,3],
+"mqtt_8c.html#afba101fbf26b556c869060d3d013c8fa":[13,0,0,1,4,0,2],
+"mqtt_8h.html":[13,0,0,3,1,0,9],
+"mqtt__opts_8h.html":[13,0,0,3,1,0,10],
+"mqtt__priv_8h.html":[13,0,0,3,1,0,11],
+"multithreading.html":[8],
+"nd6_8c.html":[13,0,0,2,1,8],
+"nd6_8c.html#a27224542b8ffab81c2ed9f47752bb51e":[13,0,0,2,1,8,0],
+"nd6_8c.html#a4959990cae26a3996f638ec996f046df":[13,0,0,2,1,8,7],
+"nd6_8c.html#a64d7956cf2b0d45025b02661f3f62377":[13,0,0,2,1,8,2],
+"nd6_8c.html#a73d3192204da20be193e3c00c4a0cb54":[13,0,0,2,1,8,8],
+"nd6_8c.html#a754781b509e69c35a7a4ee7e380399fe":[13,0,0,2,1,8,9],
+"nd6_8c.html#a84f9f52cab7ae37b4dd343536156dc73":[13,0,0,2,1,8,1],
+"nd6_8c.html#abbb92837e715be0e7d99513a84995831":[13,0,0,2,1,8,6],
+"nd6_8c.html#ac5ce11eaecfb486c322641427f47cffe":[13,0,0,2,1,8,3],
+"nd6_8c.html#ae447c204ebbf71e6ebbc5ed727a73eb9":[13,0,0,2,1,8,5],
+"nd6_8c.html#af226438f4f9b4aa7c3a2bbdf3c1e948c":[13,0,0,2,1,8,4],
+"nd6_8h.html":[13,0,0,3,1,37],
+"nd6_8h.html#a27224542b8ffab81c2ed9f47752bb51e":[13,0,0,3,1,37,2],
+"nd6_8h.html#a2fec65c0785551bad3a282ddee4062ac":[13,0,0,3,1,37,0],
+"nd6_8h.html#a3250c1e32713635d588cf25865ebed56":[13,0,0,3,1,37,1],
+"nd6_8h.html#a4959990cae26a3996f638ec996f046df":[13,0,0,3,1,37,9],
+"nd6_8h.html#a64d7956cf2b0d45025b02661f3f62377":[13,0,0,3,1,37,4],
+"nd6_8h.html#a73d3192204da20be193e3c00c4a0cb54":[13,0,0,3,1,37,10],
+"nd6_8h.html#a754781b509e69c35a7a4ee7e380399fe":[13,0,0,3,1,37,11],
+"nd6_8h.html#a84f9f52cab7ae37b4dd343536156dc73":[13,0,0,3,1,37,3],
+"nd6_8h.html#abbb92837e715be0e7d99513a84995831":[13,0,0,3,1,37,8],
+"nd6_8h.html#ac5ce11eaecfb486c322641427f47cffe":[13,0,0,3,1,37,5],
+"nd6_8h.html#ae447c204ebbf71e6ebbc5ed727a73eb9":[13,0,0,3,1,37,7],
+"nd6_8h.html#af226438f4f9b4aa7c3a2bbdf3c1e948c":[13,0,0,3,1,37,6],
+"nd6__priv_8h.html":[13,0,0,3,1,1,5],
+"netbiosns_8c.html":[13,0,0,1,5,0],
+"netbiosns_8c.html#a35d43ea3290f6412e45598b610f03cf1":[13,0,0,1,5,0,8],
+"netbiosns_8c.html#a4b83658c5bbb9ac90aca4351086a9a00":[13,0,0,1,5,0,7],
+"netbiosns_8c.html#ae00d45caef5a670e3aedde2788b3f212":[13,0,0,1,5,0,6],
+"netbiosns_8c.html#af09685abf1739c802bc8772b35b7fb1c":[13,0,0,1,5,0,5],
+"netbiosns_8h.html":[13,0,0,3,1,0,12],
+"netbiosns__opts_8h.html":[13,0,0,3,1,0,13],
+"netbuf_8c.html":[13,0,0,0,4],
+"netbuf_8h.html":[13,0,0,3,1,38],
+"netbuf_8h.html#ab38abb4213df4c00b9b3ab844322a090":[13,0,0,3,1,38,2],
+"netbuf_8h.html#ab75db64a9e84eb67a382c30e382d417c":[13,0,0,3,1,38,1],
+"netdb_8c.html":[13,0,0,0,5],
+"netdb_8c.html#a2a1ce3f2040007303d36c0b682b5ac10":[13,0,0,0,5,7],
+"netdb_8c.html#a768ab8ead892d6454709680340cd070e":[13,0,0,0,5,2],
+"netdb_8c.html#a7f65ff5982a0743849a644ef2cd15ef5":[13,0,0,0,5,3],
+"netdb_8c.html#a8adc6d35c068a073369edde71c678cbc":[13,0,0,0,5,5],
+"netdb_8c.html#acfc1e988534c0e497599b904739f92fe":[13,0,0,0,5,1],
+"netdb_8c.html#af356989c172a51187e22b557f22d4165":[13,0,0,0,5,4],
+"netdb_8c.html#afa229e90916f6c8d6308828f45351d2d":[13,0,0,0,5,6],
+"netif_2ethernet_8h.html":[13,0,0,3,2,3],
+"netif_2ethernet_8h.html#a1ecae0406a3b714c02b632379f26a365":[13,0,0,3,2,3,0],
+"netif_8c.html":[13,0,0,2,12],
+"netif_8c.html#a0ec111195bcc452f77895ad35aedd7dc":[13,0,0,2,12,8],
+"netif_8c.html#a0fbaed78253d21e1b54e65651da3e327":[13,0,0,2,12,16],
+"netif_8c.html#a1c8141eaa98f6dc6dfddbb23a706656c":[13,0,0,2,12,32],
+"netif_8c.html#a3d0925cbce550ed461907aee816713ba":[13,0,0,2,12,31],
+"netif_8c.html#a75b5298b1c3c3794747d78a4ce95d81c":[13,0,0,2,12,11],
+"netif_8h.html":[13,0,0,3,1,40],
+"netif_8h.html#a0d70fe11cac43c8fa35827b8e607ccf6":[13,0,0,3,1,40,10],
+"netif_8h.html#a0ec111195bcc452f77895ad35aedd7dc":[13,0,0,3,1,40,60],
+"netif_8h.html#a0fbaed78253d21e1b54e65651da3e327":[13,0,0,3,1,40,68],
+"netif_8h.html#a1c8141eaa98f6dc6dfddbb23a706656c":[13,0,0,3,1,40,84],
+"netif_8h.html#a22400d2202581b4a7273cded712adf49":[13,0,0,3,1,40,7],
+"netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5":[13,0,0,3,1,40,43],
+"netif_8h.html#a302f24fbfe883ee4840ffc71f267ae2a":[13,0,0,3,1,40,36],
+"netif_8h.html#a343a5b14136a51957d552527384674b3":[13,0,0,3,1,40,49],
+"netif_8h.html#a3d0925cbce550ed461907aee816713ba":[13,0,0,3,1,40,83],
+"netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436":[13,0,0,3,1,40,50],
+"netif_8h.html#a4ff19a6f3045f65d0397d30b6609660a":[13,0,0,3,1,40,9],
+"netif_8h.html#a5ad7308195c0581680dd62fb148501cd":[13,0,0,3,1,40,12],
+"netif_8h.html#a6f406ee3ab60e8a4f27ae2483c96b8e2":[13,0,0,3,1,40,15],
+"netif_8h.html#a71cad3277efe29191eef3348f4bf21f7":[13,0,0,3,1,40,42],
+"netif_8h.html#a75b5298b1c3c3794747d78a4ce95d81c":[13,0,0,3,1,40,63],
+"netif_8h.html#a780be4c3fa9f7f2534f7865666c3a1b8":[13,0,0,3,1,40,33],
+"netif_8h.html#a7b4893aa2ed8c606a0cd7aa932fe5067":[13,0,0,3,1,40,48],
+"netif_8h.html#a8fb4317a77ee2e3848be80db15618666":[13,0,0,3,1,40,11],
+"netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0":[13,0,0,3,1,40,51],
+"netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a4186fbaf94be956ea1a3b02cd1cccb1f":[13,0,0,3,1,40,51,1],
+"netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a7ad3406353906deb4e64ebeed349e07e":[13,0,0,3,1,40,51,0],
+"netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e":[13,0,0,3,1,40,44],
+"netif_8h.html#ab75e9d808bc1b788bea84213e6a111ed":[13,0,0,3,1,40,45],
+"netif_8h.html#ab887a8ec553de1be1d04cf2961c63c41":[13,0,0,3,1,40,35],
+"netif_8h.html#ad747072771a887443ab33f90a12077d4":[13,0,0,3,1,40,8],
+"netif_8h.html#adbfecb47897cfe63d4f6366c1fed23b2":[13,0,0,3,1,40,13],
+"netif_8h.html#ae8e2dc87c19a03d481ae37bcf7ced5c9":[13,0,0,3,1,40,14],
+"netif_8h.html#aeb4e790199b02469aa04c044ef5cfa32":[13,0,0,3,1,40,6],
+"netif_8h.html#af2ed0716122b65e7feb43e0dd99ae468":[13,0,0,3,1,40,46],
+"netifapi_8c.html":[13,0,0,0,6],
+"netifapi_8c.html#a037c3d05c19b4d467b6ce06eb4639ee8":[13,0,0,0,6,1],
+"netifapi_8c.html#a26fd83042b53b2ff82e15262ed72f0a7":[13,0,0,0,6,3],
+"netifapi_8c.html#a62b0bdbb3783eb27aa73485081306119":[13,0,0,0,6,0],
+"netifapi_8h.html":[13,0,0,3,1,41],
+"netifapi_8h.html#a037c3d05c19b4d467b6ce06eb4639ee8":[13,0,0,3,1,41,15],
+"netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7":[13,0,0,3,1,41,17],
+"netifapi_8h.html#a62b0bdbb3783eb27aa73485081306119":[13,0,0,3,1,41,14],
+"opt_8h.html":[13,0,0,3,1,42],
+"optimization.html":[9],
+"pages.html":[],
+"pbuf_8c.html":[13,0,0,2,13],
+"pbuf_8c.html#a0f81deff4a0e6e8e0ff161a7b9871449":[13,0,0,2,13,17],
+"pbuf_8c.html#a25a3b8edc783896b03819a966d00845e":[13,0,0,2,13,14],
+"pbuf_8c.html#a32dc14bd88dcafa25e627ab18e801815":[13,0,0,2,13,0],
+"pbuf_8c.html#a5df7ac5ae59012fe9aeddba375a72190":[13,0,0,2,13,7],
+"pbuf_8c.html#a9ba3f7b705309ceadb147692fd5a1c7d":[13,0,0,2,13,26],
+"pbuf_8c.html#abf3d29c4f43986b4cb5eb314d5b9729d":[13,0,0,2,13,12],
+"pbuf_8c.html#aca0cd8b3f08fbb5e35bc91a663083cc1":[13,0,0,2,13,24],
+"pbuf_8c.html#ad0e64d6fbc423593461063da97da9ce6":[13,0,0,2,13,18],
+"pbuf_8c.html#ad4ef8c5fbbd1447db04f8f73923e7dee":[13,0,0,2,13,1],
+"pbuf_8h.html":[13,0,0,3,1,43],
+"pbuf_8h.html#a018a6499e357f8a1373321f802a82930":[13,0,0,3,1,43,10],
+"pbuf_8h.html#a02789ca67766def65000b58f7fe7d03b":[13,0,0,3,1,43,17],
+"pbuf_8h.html#a25a3b8edc783896b03819a966d00845e":[13,0,0,3,1,43,36],
+"pbuf_8h.html#a27480c41c34021d4417691d327163626":[13,0,0,3,1,43,40],
+"pbuf_8h.html#a32dc14bd88dcafa25e627ab18e801815":[13,0,0,3,1,43,22],
+"pbuf_8h.html#a36a915aa2f6a188baa2862881407971e":[13,0,0,3,1,43,11],
+"pbuf_8h.html#a426883d928f8f3e8fd066e616159d78f":[13,0,0,3,1,43,4],
+"pbuf_8h.html#a49ab2c0662378f268ed8209bd54aaedf":[13,0,0,3,1,43,18]
+};
diff --git a/doc/doxygen/output/html/navtreeindex14.js b/doc/doxygen/output/html/navtreeindex14.js
new file mode 100644
index 0000000..6403c73
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex14.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX14 =
+{
+"pbuf_8h.html#a567a0dfa01b0e5540f9416a200ed163f":[13,0,0,3,1,43,5],
+"pbuf_8h.html#a5df7ac5ae59012fe9aeddba375a72190":[13,0,0,3,1,43,29],
+"pbuf_8h.html#a64174c5169b48dc17674324afd9c63b9":[13,0,0,3,1,43,3],
+"pbuf_8h.html#a6772c16662bbb78597399add086500c0":[13,0,0,3,1,43,7],
+"pbuf_8h.html#a6d285ce1d910f25e511c8c38532a1dce":[13,0,0,3,1,43,19],
+"pbuf_8h.html#a97d4db8e0f127f61af0016c184c865ca":[13,0,0,3,1,43,14],
+"pbuf_8h.html#a9ba3f7b705309ceadb147692fd5a1c7d":[13,0,0,3,1,43,48],
+"pbuf_8h.html#aa1f62ba9dc5d462e67e33c4be64c601a":[13,0,0,3,1,43,16],
+"pbuf_8h.html#aaa17c1951cf2d207b6adfd3947d91f00":[13,0,0,3,1,43,39],
+"pbuf_8h.html#aad686ef346759a221abdb45f64649816":[13,0,0,3,1,43,15],
+"pbuf_8h.html#ab65da7cd8f7449b3b2e57d7fa1a74ef4":[13,0,0,3,1,43,46],
+"pbuf_8h.html#ab8ad153151a8c157335d9c0cedc007e6":[13,0,0,3,1,43,9],
+"pbuf_8h.html#abf3d29c4f43986b4cb5eb314d5b9729d":[13,0,0,3,1,43,34],
+"pbuf_8h.html#ac0d56cde47aca24ef410d730d7c89887":[13,0,0,3,1,43,8],
+"pbuf_8h.html#ac54b0f161128a32c7419c33b893a5106":[13,0,0,3,1,43,13],
+"pbuf_8h.html#ad4ef8c5fbbd1447db04f8f73923e7dee":[13,0,0,3,1,43,23],
+"pbuf_8h.html#af78a7e1815dc0e31884d095b666d997f":[13,0,0,3,1,43,6],
+"pitfalls.html":[4],
+"pppapi_8c.html":[13,0,0,4,0,0],
+"pppol2tp_8c.html":[13,0,0,4,0,1],
+"pppol2tp_8h.html":[13,0,0,3,2,0,0],
+"pppos_8c.html":[13,0,0,4,0,2],
+"pppos_8h.html":[13,0,0,3,2,0,1],
+"prot_2autoip_8h.html":[13,0,0,3,1,2,0],
+"prot_2dhcp6_8h.html":[13,0,0,3,1,2,2],
+"prot_2dhcp6_8h.html#a878a7734e159826e82e958fe3a5ca175":[13,0,0,3,1,2,2,2],
+"prot_2dhcp6_8h.html#afe33f98cb94e0f18892a41502cf54e36":[13,0,0,3,1,2,2,1],
+"prot_2dhcp_8h.html":[13,0,0,3,1,2,1],
+"prot_2dhcp_8h.html#ae99d4be0d03f6f9c8f02f63abde91a06":[13,0,0,3,1,2,1,1],
+"prot_2dns_8h.html":[13,0,0,3,1,2,3],
+"prot_2dns_8h.html#a62d67af5ac6c6b3f98a6566a42564276":[13,0,0,3,1,2,3,1],
+"prot_2dns_8h.html#a9266b48706648ecf0625a3e651095317":[13,0,0,3,1,2,3,2],
+"prot_2icmp6_8h.html":[13,0,0,3,1,2,8],
+"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccf":[13,0,0,3,1,2,8,2],
+"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa251961b990d0fbaf2c643f047c4f2532":[13,0,0,3,1,2,8,2,1],
+"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa28cc924ec6eaa761acb76ccef4adcba0":[13,0,0,3,1,2,8,2,4],
+"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa2aeed278149fb071a34beec89df03b5c":[13,0,0,3,1,2,8,2,6],
+"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa695bb4d92f32b504a9483ff137235a78":[13,0,0,3,1,2,8,2,0],
+"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa789ef8158d8750b0fa5a14ec9ecaa23a":[13,0,0,3,1,2,8,2,3],
+"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfabdb01a67c61da588872f5799ef75aa6e":[13,0,0,3,1,2,8,2,2],
+"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfac3c255282e0b49b5bbb3cd8f435bb763":[13,0,0,3,1,2,8,2,5],
+"prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023":[13,0,0,3,1,2,8,3],
+"prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a4aa4a79306a69fd4f60ad445cde4c2a9":[13,0,0,3,1,2,8,3,0],
+"prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a53884832d00d3c8f8de62cfdb4646932":[13,0,0,3,1,2,8,3,2],
+"prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023acbcc58901e2345ffc31df4098de60ff8":[13,0,0,3,1,2,8,3,1],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858":[13,0,0,3,1,2,8,5],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a04228a1d11f9f88bd165f3430188bfe7":[13,0,0,3,1,2,8,5,11],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0d8d8717c6c34053d1101932c23929fe":[13,0,0,3,1,2,8,5,14],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0f6702d62de5f873e0afe7431d878207":[13,0,0,3,1,2,8,5,16],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1d52ef5024a5822bd622bcb0b9da323d":[13,0,0,3,1,2,8,5,1],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1f99d333f425c28d3840e029cc9c46f3":[13,0,0,3,1,2,8,5,15],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a29281016d3bb58e3bfd90417bbce7aa0":[13,0,0,3,1,2,8,5,17],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a2c12d3244d837bd243ea647ec530600d":[13,0,0,3,1,2,8,5,22],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a425f4e64a7d1570228adbbe450650ab4":[13,0,0,3,1,2,8,5,18],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a63114feac8140031b74424d4a7cf6b26":[13,0,0,3,1,2,8,5,3],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a670d95494c9282f646ac442d81d9a780":[13,0,0,3,1,2,8,5,12],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a906dd689f0aa9b4796f49f299d4e3eb0":[13,0,0,3,1,2,8,5,10],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a9c9c358ebd5eb683a66819fd9ecf98c6":[13,0,0,3,1,2,8,5,20],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aad9d4f207459e4bbd0c33a25adf6fdd7":[13,0,0,3,1,2,8,5,0],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858abe61415e020b996220337f0cd002a28f":[13,0,0,3,1,2,8,5,6],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac6b91695c06bfc7fb2360310d7b8e78a":[13,0,0,3,1,2,8,5,8],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac7020c08a7b03ae2a198e4a8dcd31bd4":[13,0,0,3,1,2,8,5,4],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ad9794ae12b9ca196cc4fafaf6d834375":[13,0,0,3,1,2,8,5,9],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae4ae04be7df3a2cce614af0a5cdae951":[13,0,0,3,1,2,8,5,13],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae649aa45c97b885f28771688957528a3":[13,0,0,3,1,2,8,5,7],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aed14d280e5911098af914a94bd3ab22b":[13,0,0,3,1,2,8,5,5],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858af8ebe97c4f68b54c9ef0c43e98211df5":[13,0,0,3,1,2,8,5,21],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afae9848904bc4b4b4aa716a7a9a2d7fe":[13,0,0,3,1,2,8,5,2],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afb12a9d774f53deb15ec23041548f6fc":[13,0,0,3,1,2,8,5,19],
+"prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e":[13,0,0,3,1,2,8,4],
+"prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eacccbb5e776df1b35af4149e593240880":[13,0,0,3,1,2,8,4,0],
+"prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eaec493420d61c80a21981b1aa32befe1f":[13,0,0,3,1,2,8,4,1],
+"prot_2icmp_8h.html":[13,0,0,3,1,2,7],
+"prot_2igmp_8h.html":[13,0,0,3,1,2,10],
+"prot_2ip4_8h.html":[13,0,0,3,1,2,12],
+"prot_2ip6_8h.html":[13,0,0,3,1,2,13],
+"prot_2ip_8h.html":[13,0,0,3,1,2,11],
+"prot_2ip_8h.html#afc29766fb0707c63b64568c5fa44a374":[13,0,0,3,1,2,11,0],
+"prot_2mld6_8h.html":[13,0,0,3,1,2,14],
+"prot_2nd6_8h.html":[13,0,0,3,1,2,15],
+"prot_2nd6_8h.html#a0225d4c8911efdbdbc2b40de208906c2":[13,0,0,3,1,2,15,5],
+"prot_2nd6_8h.html#a3188b9704a8ca598f54b87c3db73272e":[13,0,0,3,1,2,15,6],
+"prot_2nd6_8h.html#a68ce8550a20cd30093d6e79e1ca51842":[13,0,0,3,1,2,15,9],
+"prot_2nd6_8h.html#a7fb1b330719d83b7525374f4beca51bc":[13,0,0,3,1,2,15,10],
+"prot_2nd6_8h.html#aab6c15c9bea51fbdcc660f718bb403a8":[13,0,0,3,1,2,15,4],
+"prot_2nd6_8h.html#aeaa575c1a66ccaa2dc62ff2c0bd71619":[13,0,0,3,1,2,15,7],
+"prot_2nd6_8h.html#aff2e03766ee1fa15263c4aeda5097d28":[13,0,0,3,1,2,15,8],
+"prot_2tcp_8h.html":[13,0,0,3,1,2,16],
+"prot_2udp_8h.html":[13,0,0,3,1,2,17],
+"raw_8c.html":[13,0,0,2,14],
+"raw_8c.html#a03c4582d9ecf687e1f31d597c7889553":[13,0,0,2,14,4],
+"raw_8c.html#a61dc42f18e34800643000e48be6543ab":[13,0,0,2,14,5],
+"raw_8h.html":[13,0,0,3,1,44],
+"raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd":[13,0,0,3,1,44,1],
+"raw__priv_8h.html":[13,0,0,3,1,1,6],
+"raw__priv_8h.html#a03c4582d9ecf687e1f31d597c7889553":[13,0,0,3,1,1,6,2],
+"raw__priv_8h.html#a2580ec946c4196127888d5405257866b":[13,0,0,3,1,1,6,1],
+"raw__priv_8h.html#a61dc42f18e34800643000e48be6543ab":[13,0,0,3,1,1,6,3],
+"raw__priv_8h.html#aebbdbaee89c38ad9c007a1d1a336e687":[13,0,0,3,1,1,6,0],
+"slipif_8c.html":[13,0,0,4,7],
+"slipif_8c.html#a2a9e9ed81732a6794a9b9a712f75a1cc":[13,0,0,4,7,1],
+"slipif_8c.html#accf448f9dabb0f33ef46b40355691cab":[13,0,0,4,7,0],
+"slipif_8h.html":[13,0,0,3,2,9],
+"slipif_8h.html#a198967c11f79cffc32192710294e8826":[13,0,0,3,2,9,1],
+"slipif_8h.html#a37ce8613535232db02bfd9ae9b51c668":[13,0,0,3,2,9,0],
+"smtp_8c.html":[13,0,0,1,6,0],
+"smtp_8c.html#a04947fff2d3a3803e6c716aecc7f2bae":[13,0,0,1,6,0,5],
+"smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e":[13,0,0,1,6,0,1],
+"smtp_8c.html#a6029851c4f71d98b00d6c49a17ea9ef6":[13,0,0,1,6,0,2],
+"smtp_8c.html#a73855e673457f748b6bcba49aab9b035":[13,0,0,1,6,0,4],
+"smtp_8c.html#ad853ab316a3b866b87c0454053febfe3":[13,0,0,1,6,0,3],
+"snmp_8h.html":[13,0,0,3,1,45],
+"snmp_8h.html#abe6b270482ca9af07c029f3136d8ec9c":[13,0,0,3,1,45,0],
+"snmp__asn1_8c.html":[13,0,0,1,7,0],
+"snmp__asn1_8c.html#a167b707051bbbeafea14eeca72449ac6":[13,0,0,1,7,0,9],
+"snmp__asn1_8c.html#a20343aef4524459a2b45704e18ef520d":[13,0,0,1,7,0,6],
+"snmp__asn1_8c.html#a25b3fe21becd08260ec56bef9299d3c6":[13,0,0,1,7,0,10],
+"snmp__asn1_8c.html#a31055a35285214ea0d4ad60c64c2f73e":[13,0,0,1,7,0,2],
+"snmp__asn1_8c.html#a51d36daf2935c246eb55fb749581e2bb":[13,0,0,1,7,0,3],
+"snmp__asn1_8c.html#a58965e0305884d550786440c84119ad4":[13,0,0,1,7,0,13],
+"snmp__asn1_8c.html#a7e3f63b155b06f7ade627060b55e4496":[13,0,0,1,7,0,4],
+"snmp__asn1_8c.html#a8bb84ec51c46a890b7ced016043b2908":[13,0,0,1,7,0,1],
+"snmp__asn1_8c.html#a8c74914532f1e0c219dfb1977fd0c22f":[13,0,0,1,7,0,11],
+"snmp__asn1_8c.html#aa54b4ee3c58ef66721df96fd8b1f66b2":[13,0,0,1,7,0,12],
+"snmp__asn1_8c.html#aa71260abd46fc2f682874016896fe218":[13,0,0,1,7,0,7],
+"snmp__asn1_8c.html#ab6fd58c1b41cb98117f00a11db7d226f":[13,0,0,1,7,0,8],
+"snmp__asn1_8c.html#ac04e08c19c40cfc3333a181018887a51":[13,0,0,1,7,0,5],
+"snmp__asn1_8c.html#af8e905a214936995d235789f359cf015":[13,0,0,1,7,0,0],
+"snmp__asn1_8h.html":[13,0,0,1,7,1],
+"snmp__asn1_8h.html#a167b707051bbbeafea14eeca72449ac6":[13,0,0,1,7,1,9],
+"snmp__asn1_8h.html#a20343aef4524459a2b45704e18ef520d":[13,0,0,1,7,1,6],
+"snmp__asn1_8h.html#a25b3fe21becd08260ec56bef9299d3c6":[13,0,0,1,7,1,10],
+"snmp__asn1_8h.html#a31055a35285214ea0d4ad60c64c2f73e":[13,0,0,1,7,1,2],
+"snmp__asn1_8h.html#a51d36daf2935c246eb55fb749581e2bb":[13,0,0,1,7,1,3],
+"snmp__asn1_8h.html#a58965e0305884d550786440c84119ad4":[13,0,0,1,7,1,13],
+"snmp__asn1_8h.html#a7e3f63b155b06f7ade627060b55e4496":[13,0,0,1,7,1,4],
+"snmp__asn1_8h.html#a8bb84ec51c46a890b7ced016043b2908":[13,0,0,1,7,1,1],
+"snmp__asn1_8h.html#a8c74914532f1e0c219dfb1977fd0c22f":[13,0,0,1,7,1,11],
+"snmp__asn1_8h.html#aa54b4ee3c58ef66721df96fd8b1f66b2":[13,0,0,1,7,1,12],
+"snmp__asn1_8h.html#aa71260abd46fc2f682874016896fe218":[13,0,0,1,7,1,7],
+"snmp__asn1_8h.html#ab6fd58c1b41cb98117f00a11db7d226f":[13,0,0,1,7,1,8],
+"snmp__asn1_8h.html#ac04e08c19c40cfc3333a181018887a51":[13,0,0,1,7,1,5],
+"snmp__asn1_8h.html#af8e905a214936995d235789f359cf015":[13,0,0,1,7,1,0],
+"snmp__core_8c.html":[13,0,0,1,7,2],
+"snmp__core_8c.html#a095efcd4202782e57625d7b1afcdbf77":[13,0,0,1,7,2,20],
+"snmp__core_8c.html#a18126b2b13f267306c27e851e9379983":[13,0,0,1,7,2,9],
+"snmp__core_8c.html#a21f02b239cc9abae586f5ef92923e507":[13,0,0,1,7,2,22],
+"snmp__core_8c.html#a32256b37b211b4f59d8f114cee364f39":[13,0,0,1,7,2,18],
+"snmp__core_8c.html#a41fd5e854d809499e28c66b4918481a6":[13,0,0,1,7,2,13],
+"snmp__core_8c.html#a4e01d395f0c8c38c2b5b681047969da1":[13,0,0,1,7,2,4],
+"snmp__core_8c.html#a5275903be5948b1c28bfadb365823504":[13,0,0,1,7,2,17],
+"snmp__core_8c.html#a53b01262de3d1c52faf88dd4bb702a27":[13,0,0,1,7,2,6],
+"snmp__core_8c.html#a5aa6c8dbfc93235b160afaf3a40c1c93":[13,0,0,1,7,2,12],
+"snmp__core_8c.html#a66aac86af921cd8aecb95eb252eb3e84":[13,0,0,1,7,2,19],
+"snmp__core_8c.html#a6edcb88d8162544333bcede301cf0904":[13,0,0,1,7,2,14],
+"snmp__core_8c.html#a8074765d5c2b809561f032d35e59e213":[13,0,0,1,7,2,10],
+"snmp__core_8c.html#a871aa636806c7d68cbe24572598e59de":[13,0,0,1,7,2,0],
+"snmp__core_8c.html#a909ed1b0da526a0acdf6fa57a06f351e":[13,0,0,1,7,2,7],
+"snmp__core_8c.html#a9768ecf81f01880dbf1cc1933bd9e60a":[13,0,0,1,7,2,11],
+"snmp__core_8c.html#aa1b651a1faf6f1ee0dfdbea48310ed09":[13,0,0,1,7,2,21],
+"snmp__core_8c.html#ac2b6821b3d4a25033433fc25ffd74c9e":[13,0,0,1,7,2,16],
+"snmp__core_8c.html#ad3ab34b13bb9fcc757c8d366fe520fdc":[13,0,0,1,7,2,1],
+"snmp__core_8c.html#ae6f5d0c38a7ec164a67fa55c87f1de03":[13,0,0,1,7,2,2],
+"snmp__core_8c.html#af041ab415e8063097c79be2b892174f8":[13,0,0,1,7,2,15],
+"snmp__core_8c.html#af1f327eef86765cce0253c94ec3c5ce9":[13,0,0,1,7,2,5],
+"snmp__core_8c.html#af42d6d2732a92017a43b83a07609fd1a":[13,0,0,1,7,2,8],
+"snmp__core_8h.html":[13,0,0,3,1,0,15],
+"snmp__core_8h.html#a095efcd4202782e57625d7b1afcdbf77":[13,0,0,3,1,0,15,30],
+"snmp__core_8h.html#a18126b2b13f267306c27e851e9379983":[13,0,0,3,1,0,15,19],
+"snmp__core_8h.html#a21f02b239cc9abae586f5ef92923e507":[13,0,0,3,1,0,15,32],
+"snmp__core_8h.html#a32256b37b211b4f59d8f114cee364f39":[13,0,0,3,1,0,15,28],
+"snmp__core_8h.html#a41fd5e854d809499e28c66b4918481a6":[13,0,0,3,1,0,15,23],
+"snmp__core_8h.html#a4e01d395f0c8c38c2b5b681047969da1":[13,0,0,3,1,0,15,15],
+"snmp__core_8h.html#a5275903be5948b1c28bfadb365823504":[13,0,0,3,1,0,15,27],
+"snmp__core_8h.html#a53b01262de3d1c52faf88dd4bb702a27":[13,0,0,3,1,0,15,17],
+"snmp__core_8h.html#a5aa6c8dbfc93235b160afaf3a40c1c93":[13,0,0,3,1,0,15,22],
+"snmp__core_8h.html#a66aac86af921cd8aecb95eb252eb3e84":[13,0,0,3,1,0,15,29],
+"snmp__core_8h.html#a6edcb88d8162544333bcede301cf0904":[13,0,0,3,1,0,15,24],
+"snmp__core_8h.html#a8074765d5c2b809561f032d35e59e213":[13,0,0,3,1,0,15,20],
+"snmp__core_8h.html#a871aa636806c7d68cbe24572598e59de":[13,0,0,3,1,0,15,12],
+"snmp__core_8h.html#a909ed1b0da526a0acdf6fa57a06f351e":[13,0,0,3,1,0,15,18],
+"snmp__core_8h.html#a9768ecf81f01880dbf1cc1933bd9e60a":[13,0,0,3,1,0,15,21],
+"snmp__core_8h.html#a9ee3aad9305fdd883abb37822be81b72":[13,0,0,3,1,0,15,9],
+"snmp__core_8h.html#aa1b651a1faf6f1ee0dfdbea48310ed09":[13,0,0,3,1,0,15,31],
+"snmp__core_8h.html#abaa9cdad345ad93da515d31625a54589":[13,0,0,3,1,0,15,11],
+"snmp__core_8h.html#ac2b6821b3d4a25033433fc25ffd74c9e":[13,0,0,3,1,0,15,26],
+"snmp__core_8h.html#ad3ab34b13bb9fcc757c8d366fe520fdc":[13,0,0,3,1,0,15,13],
+"snmp__core_8h.html#ad5a33687d1a6fcf970266b41b0633760":[13,0,0,3,1,0,15,10],
+"snmp__core_8h.html#ae6f5d0c38a7ec164a67fa55c87f1de03":[13,0,0,3,1,0,15,14],
+"snmp__core_8h.html#af041ab415e8063097c79be2b892174f8":[13,0,0,3,1,0,15,25],
+"snmp__core_8h.html#af1f327eef86765cce0253c94ec3c5ce9":[13,0,0,3,1,0,15,16],
+"snmp__mib2_8c.html":[13,0,0,1,7,3],
+"snmp__mib2_8h.html":[13,0,0,3,1,0,16],
+"snmp__mib2__icmp_8c.html":[13,0,0,1,7,4],
+"snmp__mib2__interfaces_8c.html":[13,0,0,1,7,5],
+"snmp__mib2__ip_8c.html":[13,0,0,1,7,6],
+"snmp__mib2__snmp_8c.html":[13,0,0,1,7,7],
+"snmp__mib2__system_8c.html":[13,0,0,1,7,8],
+"snmp__mib2__tcp_8c.html":[13,0,0,1,7,9],
+"snmp__mib2__udp_8c.html":[13,0,0,1,7,10],
+"snmp__msg_8c.html":[13,0,0,1,7,11],
+"snmp__msg_8c.html#a2d77485bb0b640c8e5f569ca756d3b04":[13,0,0,1,7,11,10],
+"snmp__msg_8c.html#a2e2007343d9492b8e31d363d2c6ad79b":[13,0,0,1,7,11,9],
+"snmp__msg_8c.html#ac1f684dada963f68b71a04a702f28fe5":[13,0,0,1,7,11,7],
+"snmp__msg_8c.html#ac6f810ab812c44c6ca1df1fdf926a9f6":[13,0,0,1,7,11,8],
+"snmp__msg_8h.html":[13,0,0,1,7,12],
+"snmp__msg_8h.html#a2d77485bb0b640c8e5f569ca756d3b04":[13,0,0,1,7,12,3],
+"snmp__msg_8h.html#ac1f684dada963f68b71a04a702f28fe5":[13,0,0,1,7,12,1],
+"snmp__msg_8h.html#ac6f810ab812c44c6ca1df1fdf926a9f6":[13,0,0,1,7,12,2],
+"snmp__msg_8h.html#ade16efa80e2c2a20236d3cb96b19c79a":[13,0,0,1,7,12,4],
+"snmp__netconn_8c.html":[13,0,0,1,7,13],
+"snmp__netconn_8c.html#ga4d88f2fc7655280384131d543e0d83e5":[13,0,0,1,7,13,0],
+"snmp__opts_8h.html":[13,0,0,3,1,0,17],
+"snmp__opts_8h.html#a1fe0e120f979ed400f649019edcefe2b":[13,0,0,3,1,0,17,1],
+"snmp__pbuf__stream_8c.html":[13,0,0,1,7,14],
+"snmp__pbuf__stream_8h.html":[13,0,0,1,7,15],
+"snmp__raw_8c.html":[13,0,0,1,7,16],
+"snmp__scalar_8c.html":[13,0,0,1,7,17],
+"snmp__scalar_8h.html":[13,0,0,3,1,0,18],
+"snmp__table_8c.html":[13,0,0,1,7,18],
+"snmp__table_8h.html":[13,0,0,3,1,0,19],
+"snmp__table_8h.html#af9b59f3ba7dccf338fe6e5bc1c4b1db5":[13,0,0,3,1,0,19,3],
+"snmp__threadsync_8c.html":[13,0,0,1,7,19],
+"snmp__threadsync_8c.html#a36e5b1dbb067641b7a6ac486b4ec15b6":[13,0,0,1,7,19,0],
+"snmp__threadsync_8h.html":[13,0,0,3,1,0,20],
+"snmp__threadsync_8h.html#a1971c27c8addf1c426abd1abac54c8d2":[13,0,0,3,1,0,20,3],
+"snmp__threadsync_8h.html#a36e5b1dbb067641b7a6ac486b4ec15b6":[13,0,0,3,1,0,20,4],
+"snmp__traps_8c.html":[13,0,0,1,7,20],
+"snmp__traps_8c.html#a2e2007343d9492b8e31d363d2c6ad79b":[13,0,0,1,7,20,9],
+"snmp__traps_8c.html#ade16efa80e2c2a20236d3cb96b19c79a":[13,0,0,1,7,20,10],
+"snmpv3_8c.html":[13,0,0,1,7,21],
+"snmpv3_8h.html":[13,0,0,3,1,0,21],
+"snmpv3__mbedtls_8c.html":[13,0,0,1,7,22],
+"snmpv3__priv_8h.html":[13,0,0,1,7,23],
+"sntp_8c.html":[13,0,0,1,8,0],
+"sntp_8c.html#aebe74c93643ac9b8c8a9c7d223192c8f":[13,0,0,1,8,0,4],
+"sntp_8h.html":[13,0,0,3,1,0,22],
+"sntp__opts_8h.html":[13,0,0,3,1,0,23],
+"socket_8h.html":[13,0,0,3,0,0,2,0],
+"sockets_8c.html":[13,0,0,0,7],
+"sockets_8c.html#a0a250b3b4d1827e3a3661327f5e80ae0":[13,0,0,0,7,6],
+"sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9":[13,0,0,0,7,1],
+"sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9a6c1eefa3e29a39b923c4b522eb1b3eb1":[13,0,0,0,7,1,2],
+"sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9aa9a8fe3199d00016f1f5ad639e1b28f7":[13,0,0,0,7,1,0],
+"sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9ab6511d3104f70c18fb4bd80f24cb867d":[13,0,0,0,7,1,1],
+"sockets_8c.html#ab8cd92b10dbe3fb33da03faed1ea98a7":[13,0,0,0,7,5],
+"sockets_8c.html#abee6ee286147cf334a1ba19f19b2e08b":[13,0,0,0,7,3],
+"sockets_8c.html#ade85c68b6673296c8fb67127b93fa4c1":[13,0,0,0,7,4],
+"sockets_8c.html#ae84296093574ec746f8f88321356388f":[13,0,0,0,7,2],
+"sockets_8h.html":[13,0,0,3,1,46]
+};
diff --git a/doc/doxygen/output/html/navtreeindex15.js b/doc/doxygen/output/html/navtreeindex15.js
new file mode 100644
index 0000000..7e37526
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex15.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX15 =
+{
+"sockets_8h.html#a0a250b3b4d1827e3a3661327f5e80ae0":[13,0,0,3,1,46,34],
+"sockets_8h.html#aaffd64f6887883ec6401e6bb684c40fa":[13,0,0,3,1,46,14],
+"sockets_8h.html#ab8cd92b10dbe3fb33da03faed1ea98a7":[13,0,0,3,1,46,33],
+"sockets_8h.html#abee6ee286147cf334a1ba19f19b2e08b":[13,0,0,3,1,46,31],
+"sockets_8h.html#ade85c68b6673296c8fb67127b93fa4c1":[13,0,0,3,1,46,32],
+"sockets_8h.html#ae84296093574ec746f8f88321356388f":[13,0,0,3,1,46,30],
+"sockets__priv_8h.html":[13,0,0,3,1,1,7],
+"sockets__priv_8h.html#a8f4d240733a9261c668fc66dc4ce8196":[13,0,0,3,1,1,7,2],
+"stats_8c.html":[13,0,0,2,15],
+"stats_8c.html#a614735db0145db9ba944ede600d1d19b":[13,0,0,2,15,1],
+"stats_8c.html#aeaa149d6c0445b22e944a063e0884d0d":[13,0,0,2,15,0],
+"stats_8h.html":[13,0,0,3,1,47],
+"stats_8h.html#a614735db0145db9ba944ede600d1d19b":[13,0,0,3,1,47,8],
+"stats_8h.html#aeaa149d6c0445b22e944a063e0884d0d":[13,0,0,3,1,47,7],
+"struct__lwiperf__settings.html":[12,0,0],
+"struct__lwiperf__state__tcp.html":[12,0,1],
+"structaltcp__allocator__s.html":[11,2,0,0,0,1],
+"structaltcp__allocator__s.html#a8d8aa48e9a105e9d25ad4b90d259d0b1":[11,2,0,0,0,1,1],
+"structaltcp__allocator__s.html#aaf07ebf181a11d0320381ef46d40e687":[11,2,0,0,0,1,0],
+"structapi__msg.html":[12,0,3],
+"structapi__msg.html#a1705127c6cd22c2c6dbbcc59834e41e0":[12,0,3,2],
+"structapi__msg.html#a1ceb9822ba49ba439e30d98492593612":[12,0,3,12],
+"structapi__msg.html#a36dedcbd9ecca67043a8e1d1e715be94":[12,0,3,0],
+"structapi__msg.html#a40624c398d1939bfee54bffa708a363e":[12,0,3,6],
+"structapi__msg.html#a4bd9382dd42b18120803e246a0203353":[12,0,3,9],
+"structapi__msg.html#a6387bddb309c218ac0ccc5ef6d7a033e":[12,0,3,5],
+"structapi__msg.html#a6896ae78ebddefdf2d8358ab5f21f444":[12,0,3,14],
+"structapi__msg.html#a8a71456d1199d10af5c1d8760cc0ce73":[12,0,3,15],
+"structapi__msg.html#a8c66bd95217fa627f13f2f0847bbb25f":[12,0,3,4],
+"structapi__msg.html#ab0abd60527e96cc24c2c20c835cdac05":[12,0,3,1],
+"structapi__msg.html#ab6f14157a3e6735b69a569249d3286a2":[12,0,3,13],
+"structapi__msg.html#abec5e33802d69f1b601543d60699f028":[12,0,3,3],
+"structapi__msg.html#ad5e8bf133bc5ba4c78822af297330ce4":[12,0,3,11],
+"structapi__msg.html#adbbfc2baa8088b31fc722365237e5807":[12,0,3,8],
+"structapi__msg.html#aebd72e07e711e7135294563b82c98cdf":[12,0,3,10],
+"structapi__msg.html#aef71459b5251d796434f741ca630d528":[12,0,3,7],
+"structautoip.html":[12,0,4],
+"structautoip.html#a13b5da8a86839b4cd9bd9f5400ac9dc7":[12,0,4,1],
+"structautoip.html#a2f51d8cde73e20d6e0ae3ec8053afb55":[12,0,4,0],
+"structautoip.html#a472f3d18c07b3df024a0cde8f4ffa853":[12,0,4,4],
+"structautoip.html#a51af55190548e378e310aeaddfa1fdef":[12,0,4,3],
+"structautoip.html#a7510d9a2961ea7c28ebfcde6390284bf":[12,0,4,5],
+"structautoip.html#a9d3e3bab2f12b7c7283177fbf039fb25":[12,0,4,2],
+"structbridgeif__initdata__s.html":[11,3,0,2],
+"structbridgeif__initdata__s.html#a0e0bb6a885967b5fcfef09a8f0adc63f":[11,3,0,2,3],
+"structbridgeif__initdata__s.html#a210915aa1b0436ccabc7e8d9fd3c3fe6":[11,3,0,2,2],
+"structbridgeif__initdata__s.html#a8e0048db5e021f5d79411492dc9330bc":[11,3,0,2,0],
+"structbridgeif__initdata__s.html#aeb312c2e698513c6416d5c8459ad622f":[11,3,0,2,1],
+"structdhcp6__msg.html":[12,0,6],
+"structdhcp__msg.html":[12,0,7],
+"structdns__answer.html":[12,0,8],
+"structdns__api__msg.html":[12,0,9],
+"structdns__api__msg.html#a15e01e675ebc46b5aede42342be445e2":[12,0,9,4],
+"structdns__api__msg.html#a217814594564077d21b0f2696280b2a8":[12,0,9,0],
+"structdns__api__msg.html#a6536d91adb146555461359bd451b30de":[12,0,9,2],
+"structdns__api__msg.html#ada44a0eb6c9181cac80cfbbee01d3b53":[12,0,9,3],
+"structdns__api__msg.html#afb2536a6c342bed4c4ad9d75982f7493":[12,0,9,1],
+"structdns__hdr.html":[12,0,10],
+"structdns__query.html":[12,0,11],
+"structdns__req__entry.html":[12,0,12],
+"structdns__table__entry.html":[12,0,13],
+"structeth__addr.html":[12,0,14],
+"structeth__hdr.html":[12,0,15],
+"structeth__vlan__hdr.html":[12,0,16],
+"structetharp__hdr.html":[12,0,17],
+"structetharp__q__entry.html":[12,0,18],
+"structgethostbyname__r__helper.html":[12,0,19],
+"structicmp6__echo__hdr.html":[12,0,20],
+"structicmp6__hdr.html":[12,0,21],
+"structicmp__echo__hdr.html":[12,0,22],
+"structieee__802154__hdr.html":[12,0,23],
+"structieee__802154__hdr.html#a1d1e2cef0e0c1b1e1fd02a8a5f07fb10":[12,0,23,2],
+"structieee__802154__hdr.html#a870001205f5a3ce45ce0b2f323275869":[12,0,23,3],
+"structieee__802154__hdr.html#a87ce59d2804cacc5a58411c8b6c47f33":[12,0,23,0],
+"structieee__802154__hdr.html#aa96c037381583756e79bc6ecede27937":[12,0,23,4],
+"structieee__802154__hdr.html#ab67fc612a7fd7dcaf46401e4719fa2b2":[12,0,23,5],
+"structieee__802154__hdr.html#ac1ad9159d3bb70b1a7223060c6c81efd":[12,0,23,1],
+"structigmp__group.html":[12,0,24],
+"structigmp__group.html#a8e2227e486652603fcd7f88681d4c75b":[12,0,24,4],
+"structigmp__group.html#a8fa72062d168d81c1c5ae5209eb0a874":[12,0,24,2],
+"structigmp__group.html#a95c41b9e7de6a14bb8a7910913395e78":[12,0,24,3],
+"structigmp__group.html#ab3625aeb3689e3626f73138eb0e41852":[12,0,24,5],
+"structigmp__group.html#add0d24f719ad4b598abad254689ad911":[12,0,24,1],
+"structigmp__group.html#ae26e6041f865880bf46cd21b6f9af854":[12,0,24,0],
+"structigmp__msg.html":[12,0,25],
+"structip4__addr.html":[12,0,26],
+"structip4__addr__packed.html":[12,0,27],
+"structip4__addr__wordaligned.html":[12,0,28],
+"structip6__addr.html":[12,0,29],
+"structip6__addr__packed.html":[12,0,30],
+"structip6__hdr.html":[12,0,31],
+"structip6__hdr.html#a9d225109d601ae8b34bab6ca3528fa94":[12,0,31,2],
+"structip6__hdr.html#abe3d612d4570864c922e18ed838292f6":[12,0,31,1],
+"structip6__hdr.html#ad3b638f503a3f7e7724cf4c7b2c0a0b5":[12,0,31,3],
+"structip6__hdr.html#af0df3214134f29827c27e66b2970c6ef":[12,0,31,4],
+"structip6__hdr.html#af9cbfa5fa280a7a982a1c6268fa13a5a":[12,0,31,0],
+"structip6__reass__helper.html":[12,0,32],
+"structip6__reassdata.html":[12,0,33],
+"structip__addr.html":[11,1,0,2],
+"structip__addr.html#a66eaa8e9051e7102bf9f0c195fbe555a":[11,1,0,2,0],
+"structip__globals.html":[12,0,35],
+"structip__globals.html#a04d85a3dc2c417050b3e088fa58a74b0":[12,0,35,5],
+"structip__globals.html#a0b4e54250c692c638408de54593d2aa1":[12,0,35,4],
+"structip__globals.html#a17004526e6f1a164c0bab01aeac5e34a":[12,0,35,3],
+"structip__globals.html#a2e810f97cf3e8e855e3baafc3be8c0d4":[12,0,35,1],
+"structip__globals.html#a7803dc5950d143e4433a0df689989bab":[12,0,35,6],
+"structip__globals.html#a7da899c663b1d560b61d92ba6d544701":[12,0,35,0],
+"structip__globals.html#aa5cfc3ac29dc746a4cbe844206b0ed41":[12,0,35,2],
+"structip__reass__helper.html":[12,0,36],
+"structip__reassdata.html":[12,0,37],
+"structlowpan6__ieee802154__data.html":[12,0,38],
+"structlowpan6__ieee802154__data.html#a017fc6f447215e4b65955ee7b1ed798f":[12,0,38,0],
+"structlowpan6__ieee802154__data.html#a190c9c06dfe1075abb7399f99553b507":[12,0,38,1],
+"structlowpan6__ieee802154__data.html#a64560b289f86efe1d39ece603cd14b5c":[12,0,38,3],
+"structlowpan6__ieee802154__data.html#a8c33e7a2026e6e93a2085f3d14378d35":[12,0,38,2],
+"structlowpan6__ieee802154__data.html#ad9cd994385c4d1d8ef0a22686c17720c":[12,0,38,4],
+"structlowpan6__link__addr.html":[12,0,39],
+"structlowpan6__reass__helper.html":[12,0,40],
+"structlwip__cyclic__timer.html":[12,0,41],
+"structlwip__select__cb.html":[12,0,42],
+"structlwip__select__cb.html#a1c00f1159e9e8eb7cca02c497605cd99":[12,0,42,7],
+"structlwip__select__cb.html#a21a98e316bb7001d8750b20f5a7d0aa7":[12,0,42,4],
+"structlwip__select__cb.html#a2a1e68993ed887fca326d1373ea6caed":[12,0,42,0],
+"structlwip__select__cb.html#a39c4980c261380481f79af2b536ebfba":[12,0,42,3],
+"structlwip__select__cb.html#a8694a2ce0dd5f91be84056982b96978e":[12,0,42,5],
+"structlwip__select__cb.html#a94128f0e164f895226f20fe75fddd35a":[12,0,42,1],
+"structlwip__select__cb.html#aa89638b1c2c6b2c88030560861aba04c":[12,0,42,8],
+"structlwip__select__cb.html#ac9e790cac8b5eae607a8ef95dcc68482":[12,0,42,6],
+"structlwip__select__cb.html#ae39fc1bef3938380d15085e0141639de":[12,0,42,2],
+"structlwip__sock.html":[12,0,43],
+"structlwip__sock.html#a3a3fee485b3361ed7054cde149355fb4":[12,0,43,0],
+"structlwip__sock.html#a7e282776681ea4b7bd389950a8a64fa8":[12,0,43,5],
+"structlwip__sock.html#a9245a7ab9471bfb6fac94c66d26fba5e":[12,0,43,1],
+"structlwip__sock.html#aa487ac16b7e5b6a2a618b7b5060247e1":[12,0,43,2],
+"structlwip__sock.html#aadbcf5ec3d50631d8821200163d88d38":[12,0,43,4],
+"structlwip__sock.html#af40d67cbaef4318d26e560988b6e1b3a":[12,0,43,3],
+"structmdns__host.html":[12,0,44],
+"structmdns__host.html#a4547e5a8375fc1f1372546268a80d51b":[12,0,44,0],
+"structmdns__host.html#a560447b364854eb5480e137e09d3cd24":[12,0,44,1],
+"structmdns__host.html#a750c31340c22e51375e4dc3e6e94f2ed":[12,0,44,4],
+"structmdns__host.html#ac8f6e3c6e1251bf73f043e489c840922":[12,0,44,2],
+"structmdns__host.html#af9ced31c35de6a281e5b13f01e5aae61":[12,0,44,3],
+"structmdns__outpacket.html":[12,0,45],
+"structmdns__outpacket.html#a0d402cde040728d361dec8f7d86f504c":[12,0,45,9],
+"structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035":[12,0,45,2],
+"structmdns__outpacket.html#a1fdc90b48d8cf1fc24895f0c7a5798e4":[12,0,45,4],
+"structmdns__outpacket.html#a68255725575af086a3afa76bc5c8e64d":[12,0,45,11],
+"structmdns__outpacket.html#a83d4504736f2bf315fc8b712c6a446e9":[12,0,45,8],
+"structmdns__outpacket.html#a8ead21e392b21c3e872c0cab874cdcf5":[12,0,45,12],
+"structmdns__outpacket.html#a9bd0fd91dda48baa2938dddd747d3195":[12,0,45,3],
+"structmdns__outpacket.html#aad2c24d4d5a935a209966ceace82f9ad":[12,0,45,1],
+"structmdns__outpacket.html#ac470f02a9f332f18e027437dc293d348":[12,0,45,10],
+"structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce":[12,0,45,0],
+"structmdns__outpacket.html#ad0bd066f127d35a0ce67193e1cd07430":[12,0,45,7],
+"structmdns__outpacket.html#aee97e98c4869aa63ffe348d38d87221f":[12,0,45,5],
+"structmdns__outpacket.html#aff8c520bffa87c78e0ee2440571bbd65":[12,0,45,6],
+"structmdns__packet.html":[12,0,46],
+"structmdns__packet.html#a09211e78f7f773c492b5856d31423699":[12,0,46,5],
+"structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00":[12,0,46,9],
+"structmdns__packet.html#a2ec02a67fd82f0df695e94745eddaf45":[12,0,46,4],
+"structmdns__packet.html#a4c3c3a28ac113b3ee40d5cf07d851f68":[12,0,46,3],
+"structmdns__packet.html#a56ba495a1458a21982e65d746468849d":[12,0,46,1],
+"structmdns__packet.html#a8659b4f582be0df84b6ae91308737377":[12,0,46,7],
+"structmdns__packet.html#a918feee242cfb3934d9f5c3de1c298e7":[12,0,46,0],
+"structmdns__packet.html#aaa64cc21495dc6bb76ed9125904dd07a":[12,0,46,8],
+"structmdns__packet.html#ac7307f344f654cb954f92d578dc7c989":[12,0,46,2],
+"structmdns__packet.html#afdb9c14dd0c915119b8adb584381a437":[12,0,46,6],
+"structmdns__rr__info.html":[12,0,47],
+"structmdns__service.html":[12,0,48],
+"structmdns__service.html#a35daff90a18d19b14f23fa02df424f94":[12,0,48,6],
+"structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad":[12,0,48,4],
+"structmdns__service.html#a5a939a4da01cb50c74cd53b352e4fa14":[12,0,48,0],
+"structmdns__service.html#a79bc4946c96a3b2d0713bc0897c4bd9c":[12,0,48,5],
+"structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d":[12,0,48,3],
+"structmdns__service.html#abbf317cde8fb7ba8d834ad9746dd780c":[12,0,48,2],
+"structmdns__service.html#ac6d92cf213e3647d3ca1520595c3b784":[12,0,48,1],
+"structmem.html":[12,0,49],
+"structmem.html#a5abf13a11156e92c417f7ff66ef0b5cf":[12,0,49,0],
+"structmem.html#a9d7722ed10adf965fa98563d502f98ac":[12,0,49,1],
+"structmem.html#aa76b6a39425617435978dce903f0d456":[12,0,49,2],
+"structmemp__desc.html":[12,0,50],
+"structmemp__desc.html#a05cb67eb408e4736cc0f5e32b5db7500":[12,0,50,3],
+"structmemp__desc.html#a1688d2bdd5a7b77700e1fa627f025ba3":[12,0,50,2],
+"structmemp__desc.html#a2c32db78e565b8812ca0e20fe929a8a7":[12,0,50,1],
+"structmemp__desc.html#a9aec58adcbcd88167247296ca4346558":[12,0,50,0],
+"structmemp__desc.html#a9d6b758ce5c3b47a67a7568d38fb3926":[12,0,50,4],
+"structmld__group.html":[12,0,51],
+"structmld__group.html#a21f31e845cb11d2aca4ae7120736f69a":[12,0,51,4],
+"structmld__group.html#a781abf78d835627ded1202166b44b88e":[12,0,51,0],
+"structmld__group.html#a9273a345a5754241bf26ddc835d27ddc":[12,0,51,3],
+"structmld__group.html#aa8eb75f4dfaefbf0d2853b0e31ceb53b":[12,0,51,2],
+"structmld__group.html#addc67094f83c9352fe039c392c480f9e":[12,0,51,5],
+"structmld__group.html#ae9cfd3f126257aa3aff4a24e05c04059":[12,0,51,1],
+"structmld__header.html":[12,0,52],
+"structmqtt__client__s.html":[12,0,53],
+"structmqtt__client__s.html#a1897eeefe64f9e2d2d953adca858f439":[12,0,53,7],
+"structmqtt__client__s.html#a26dc9112351c042594a41703197925a7":[12,0,53,3],
+"structmqtt__client__s.html#a6274ba2eb2fe6afa970b1c8a650d8cef":[12,0,53,2],
+"structmqtt__client__s.html#a667c1dc7a6008055b63877acb06f333c":[12,0,53,6],
+"structmqtt__client__s.html#a6c81d0dd14e786222425ea04fd060824":[12,0,53,4],
+"structmqtt__client__s.html#aae7bd1da3461efef9616934feb166aa5":[12,0,53,5],
+"structmqtt__client__s.html#ab4100f6e0867c212d5923f10024f2e32":[12,0,53,8],
+"structmqtt__client__s.html#ae6d53359ec6d70533dab7c0d2717ce1a":[12,0,53,1],
+"structmqtt__client__s.html#af4a07c1079e2e2a336f1939d8b9677e6":[12,0,53,0],
+"structmqtt__connect__client__info__t.html":[11,4,4,1],
+"structmqtt__connect__client__info__t.html#a07954934f4fecf54fa190997848229d9":[11,4,4,1,6],
+"structmqtt__connect__client__info__t.html#a32e77415460752ba0484eb3ba0faf0c8":[11,4,4,1,8],
+"structmqtt__connect__client__info__t.html#a45987acc116de5d27fff6856778e55b4":[11,4,4,1,4],
+"structmqtt__connect__client__info__t.html#a49c10873f44d7534140a63eef2a6a4e3":[11,4,4,1,7],
+"structmqtt__connect__client__info__t.html#a8f68efe91c5311418151256c96102d4b":[11,4,4,1,1],
+"structmqtt__connect__client__info__t.html#a925fcebd15555afdc0820e196e2fd3a7":[11,4,4,1,5],
+"structmqtt__connect__client__info__t.html#ac80262a7456812e9eefffd8c3b9ac21a":[11,4,4,1,3],
+"structmqtt__connect__client__info__t.html#ad35f7850df21f001d5c5ffaa1a18c05a":[11,4,4,1,0],
+"structmqtt__connect__client__info__t.html#aec961673d5c3e8dc853c91f30d9333b5":[11,4,4,1,2],
+"structmqtt__request__t.html":[12,0,55],
+"structmqtt__request__t.html#a32a4b14b0b8b5b8ce8db1074e53f4a79":[12,0,55,0],
+"structmqtt__request__t.html#a65a7292669bc1f2d9df8f30bbcd77073":[12,0,55,3],
+"structmqtt__request__t.html#aca8de21579f51e7742076a4975a4177b":[12,0,55,1],
+"structmqtt__request__t.html#af2dc3cd85cdad25b9b3e1534ecc0cb58":[12,0,55,2],
+"structmqtt__ringbuf__t.html":[12,0,56],
+"structna__header.html":[12,0,57],
+"structnd6__neighbor__cache__entry.html":[12,0,58],
+"structnd6__neighbor__cache__entry.html#a830674446a45eb200d38a45fbdd5c5df":[12,0,58,0],
+"structnd6__q__entry.html":[12,0,59],
+"structnetbios__answer.html":[12,0,60],
+"structnetbios__answer.html#a0069c9ae014881298828660787fa945e":[12,0,60,5],
+"structnetbios__answer.html#a0eab7dbe733cc50f515126649de596ea":[12,0,60,11],
+"structnetbios__answer.html#a151dce0f0bf626b2a54fbb75775237ba":[12,0,60,24],
+"structnetbios__answer.html#a1560e3864a0821acea9410e8c1d21408":[12,0,60,17],
+"structnetbios__answer.html#a2729b7249e3d23309624cb19fa0dbfc4":[12,0,60,1],
+"structnetbios__answer.html#a31ec9ea28b5801b9bb5f1b240d3412de":[12,0,60,18],
+"structnetbios__answer.html#a45b7aec200434d3aaabc3ea6ebc46c1e":[12,0,60,8],
+"structnetbios__answer.html#a4c7ea5d1839fd27232877880e43485a2":[12,0,60,22],
+"structnetbios__answer.html#a5828dc04e01a1f7b734019db428fd46d":[12,0,60,6],
+"structnetbios__answer.html#a58aba600ed34b7c689606c296ef57c8c":[12,0,60,3],
+"structnetbios__answer.html#a62946dd0f27e9f9b9f295dcde4d3ea42":[12,0,60,14],
+"structnetbios__answer.html#a66098747155d5bd56f1c92aa8da10c1d":[12,0,60,15],
+"structnetbios__answer.html#a69cd3e8b8265531a7ce3e5cbd4911683":[12,0,60,2],
+"structnetbios__answer.html#a91116fe26c8050ee166053f377b40c7f":[12,0,60,21],
+"structnetbios__answer.html#a9cf85c173fe0d99c1c4e7e09aaeed9b8":[12,0,60,4],
+"structnetbios__answer.html#aa024ce7e0e233c42393f5c3c378d3f9b":[12,0,60,19],
+"structnetbios__answer.html#aa6088bca2a59ffcd077a474330511abd":[12,0,60,12],
+"structnetbios__answer.html#ab175ad0f89102b3b3f81a41b5a72b321":[12,0,60,16],
+"structnetbios__answer.html#ab23a11db86a170b46aa8f8af434534d8":[12,0,60,9],
+"structnetbios__answer.html#ab4f9ff63bd5529418c07762506189ad2":[12,0,60,7],
+"structnetbios__answer.html#abec38f20bb460ddc2d6e8c9b9208608c":[12,0,60,20],
+"structnetbios__answer.html#abf746cd54add594216ddc3683c741406":[12,0,60,0],
+"structnetbios__answer.html#ac4a95ccabbb945c9470e0cfd470be491":[12,0,60,13],
+"structnetbios__answer.html#aeed6aa8ba4f8bb107d141b3b3d0a1787":[12,0,60,23],
+"structnetbios__answer.html#af41cbffb0ac6a9db3305b3fc64646219":[12,0,60,10]
+};
diff --git a/doc/doxygen/output/html/navtreeindex16.js b/doc/doxygen/output/html/navtreeindex16.js
new file mode 100644
index 0000000..fd21173
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex16.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX16 =
+{
+"structnetbios__hdr.html":[12,0,61],
+"structnetbios__name__hdr.html":[12,0,62],
+"structnetbios__question__hdr.html":[12,0,63],
+"structnetbios__resp.html":[12,0,64],
+"structnetbuf.html":[12,0,65],
+"structnetconn.html":[12,0,66],
+"structnetconn.html#a05b15a28b0803bea3729b1da2047541e":[12,0,66,8],
+"structnetconn.html#a25ed06d944da0b0b9e7db5265be3fa3d":[12,0,66,4],
+"structnetconn.html#a2a54e90fa370cf0df46dfd0b97f1cce7":[12,0,66,7],
+"structnetconn.html#a2af6773c9f6ee91e7f462dd8acc07de6":[12,0,66,6],
+"structnetconn.html#a44e55724482b8e447134f5ba4f01551a":[12,0,66,11],
+"structnetconn.html#a49ba09038b2f2563fd3a38e38f8b8ab9":[12,0,66,2],
+"structnetconn.html#a61af908d1d2e4e7345ac65d3b390d7b6":[12,0,66,14],
+"structnetconn.html#a6febc9717418ddba16f16e988061cfac":[12,0,66,9],
+"structnetconn.html#a936c33090ec35e5e8c0011be5515a589":[12,0,66,13],
+"structnetconn.html#a96cb9a3830248699bd07a1a447e5630c":[12,0,66,3],
+"structnetconn.html#a982506698a59f185ff3f16d1675ea4ae":[12,0,66,5],
+"structnetconn.html#a9b59188f300828d2b5814e27ab27cad0":[12,0,66,0],
+"structnetconn.html#a9f2bf6a3865b6a22a8a71ec2f3e770da":[12,0,66,10],
+"structnetconn.html#abe796060bb06e585333ca9a87862b624":[12,0,66,1],
+"structnetconn.html#ac8e05eb65774665e364a3dcf0f139b36":[12,0,66,12],
+"structnetif.html":[12,0,67],
+"structnetif.html#a1513e81d02557d2a950e965f18b53a45":[12,0,67,26],
+"structnetif.html#a1bb4e3aed6e0fd4b6b31ee82d806f971":[12,0,67,27],
+"structnetif.html#a1c171db6097bbb6f09f63549a66e00ea":[12,0,67,0],
+"structnetif.html#a26f6e26d4a54c998716c10b7b85c8230":[12,0,67,7],
+"structnetif.html#a32fca6ffd28bb9af3f891a378827a67e":[12,0,67,18],
+"structnetif.html#a4388cfadc8b4e9a9c1c93ce777bc3673":[12,0,67,10],
+"structnetif.html#a54e81344084e9840a51cc4abab3b059b":[12,0,67,6],
+"structnetif.html#a809cc57c0dff09c5c9ae45b02c2002f3":[12,0,67,25],
+"structnetif.html#a8e1dcfe65db487feecd244355f39215e":[12,0,67,21],
+"structnetif.html#a8fe4f1b7b0d710216287da9615164a5c":[12,0,67,4],
+"structnetif.html#a908452e854180941054ed89f52bb8094":[12,0,67,11],
+"structnetif.html#a9776aaee37ea8f07b9ddc0f8b4e7e866":[12,0,67,9],
+"structnetif.html#a9c1f9f28bde60aa868bc3296bee7b1b6":[12,0,67,24],
+"structnetif.html#ab32cbe1851154fd020bac4be558f5fd5":[12,0,67,14],
+"structnetif.html#ab7ef01e505dd2feb781fe86756b1c973":[12,0,67,20],
+"structnetif.html#ab7ef575d4ab398a182bc6e592f4d53a4":[12,0,67,5],
+"structnetif.html#abc67963ff9f574e98ef9c50138a3e470":[12,0,67,15],
+"structnetif.html#ac38383379cff22c402156fec71c19617":[12,0,67,22],
+"structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48":[12,0,67,16],
+"structnetif.html#acaaac9b415a7be73eb8a287c8ed18a8d":[12,0,67,13],
+"structnetif.html#acd78fca5dad6468605f38e327b3a5e72":[12,0,67,17],
+"structnetif.html#ad0ee2a2169e384a2977ece2c471e0062":[12,0,67,12],
+"structnetif.html#ad98bafb7733b40ef898e53d91fbfa20f":[12,0,67,8],
+"structnetif.html#ae06deb532ead2e3009ba4e58aae6ca07":[12,0,67,23],
+"structnetif.html#ae64e56581bf0f136601f24c5395c19f0":[12,0,67,3],
+"structnetif.html#ae77736b64df442242795220d76be6b86":[12,0,67,19],
+"structnetif.html#aee967965d999fc1a4c40a66709304e69":[12,0,67,1],
+"structnetif.html#afe1181561cb16241f3cb5ed01e567d42":[12,0,67,2],
+"structnetif__ext__callback__args__t_1_1ipv4__changed__s.html":[11,2,0,3,5,0],
+"structnetif__ext__callback__args__t_1_1ipv4__changed__s.html#a0f6e5c1318218d95f1d3dc8c29c30ade":[11,2,0,3,5,0,0],
+"structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html":[11,2,0,3,5,1],
+"structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#a9b58712e82a73803391523324e19a776":[11,2,0,3,5,1,2],
+"structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#acd24c243c866f8f9169b89af11974f17":[11,2,0,3,5,1,1],
+"structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#aebf2aa0b26b07ca1977c676a0404323f":[11,2,0,3,5,1,0],
+"structnetif__ext__callback__args__t_1_1ipv6__set__s.html":[11,2,0,3,5,2],
+"structnetif__ext__callback__args__t_1_1ipv6__set__s.html#aafda237ad0c20d25fa2ad83d63051226":[11,2,0,3,5,2,1],
+"structnetif__ext__callback__args__t_1_1ipv6__set__s.html#ad44a5f52ad695ea90b15a1e29ff823dd":[11,2,0,3,5,2,0],
+"structnetif__ext__callback__args__t_1_1link__changed__s.html":[11,2,0,3,5,3],
+"structnetif__ext__callback__args__t_1_1link__changed__s.html#a39870f966a2a64a7f51747b45977296c":[11,2,0,3,5,3,0],
+"structnetif__ext__callback__args__t_1_1status__changed__s.html":[11,2,0,3,5,4],
+"structnetif__ext__callback__args__t_1_1status__changed__s.html#a207d3afdf0a37d16a61d1253e264d7a7":[11,2,0,3,5,4,0],
+"structnetvector.html":[12,0,69],
+"structnetvector.html#a523362737ea7764f9aaa73a050a0b983":[12,0,69,1],
+"structnetvector.html#a8a95e6dcf57067e4354b9c2b6b391dbd":[12,0,69,0],
+"structns__header.html":[12,0,70],
+"structpbuf.html":[12,0,71],
+"structpbuf.html#a5259e7ec29bab9c0999b64f2e86b411f":[12,0,71,6],
+"structpbuf.html#a5e5763c94fd18d78937b0b58ce7df341":[12,0,71,3],
+"structpbuf.html#a61a26ac8393dc9e549016b86c2cf5131":[12,0,71,7],
+"structpbuf.html#a62fe38eb0cf31027dc1fb9cbe7b55ba7":[12,0,71,5],
+"structpbuf.html#a6a58e90efbb4751608e9a1fdbd91e697":[12,0,71,1],
+"structpbuf.html#a6f82449625e36e294f5d210268c0703f":[12,0,71,2],
+"structpbuf.html#a8d32dc3e964369d4eec638fc37fbc460":[12,0,71,4],
+"structpbuf.html#aa4d1af2cab3d9280d29212095b5b872a":[12,0,71,0],
+"structpbuf__custom.html":[12,0,72],
+"structpbuf__custom.html#a100e338f13464e76b46896647b962ed8":[12,0,72,1],
+"structpbuf__custom.html#af614d17874746cbbf778dc4ca9eac2e9":[12,0,72,0],
+"structpbuf__custom__ref.html":[12,0,73],
+"structpbuf__custom__ref.html#a135a1476908337d8073241fd7f68fa1d":[12,0,73,0],
+"structpbuf__custom__ref.html#af5884b6a7031d73406cb9596a51382b7":[12,0,73,1],
+"structpbuf__rom.html":[12,0,74],
+"structpbuf__rom.html#a5cd0dcc590038629644ad775d76230a1":[12,0,74,1],
+"structpbuf__rom.html#a5ffdf590ed65b217e2d96f648e1bd3e7":[12,0,74,0],
+"structraw__pcb.html":[12,0,75],
+"structraw__pcb.html#a2ecc77e919de9bb552d1c70e771e2cad":[12,0,75,1],
+"structraw__pcb.html#a5124a21e1523c774bd76c0eabc7c7ca8":[12,0,75,0],
+"structraw__pcb.html#a963b023239ad97c05536046ed7058a10":[12,0,75,2],
+"structredirect__header.html":[12,0,76],
+"structrs__header.html":[12,0,77],
+"structsmtp__send__request.html":[12,0,78],
+"structsmtp__send__request.html#a4d517ae8b29caa4f0b371923379d9ef4":[12,0,78,0],
+"structsmtp__session.html":[12,0,79],
+"structsmtp__session.html#a003dfd03ac58252b575a7c965e532461":[12,0,79,1],
+"structsmtp__session.html#a0da8b775ddfe5f8891464037a6b4bb4d":[12,0,79,3],
+"structsmtp__session.html#a191b09e7142414a671da82fece888e65":[12,0,79,8],
+"structsmtp__session.html#a24c13d621e18311a613ab68b856a7f7b":[12,0,79,6],
+"structsmtp__session.html#a42cedb495f7423b9e28979ce1e460c61":[12,0,79,16],
+"structsmtp__session.html#a568e3def9d0ec54e3c079f577717a6bb":[12,0,79,17],
+"structsmtp__session.html#a5884425cb5ce964d8383b29cc20208d7":[12,0,79,13],
+"structsmtp__session.html#a5893c61d863b4846a81d8a4bbcaebb5b":[12,0,79,4],
+"structsmtp__session.html#a66b8e1dd314976788e9ac9a81f59a402":[12,0,79,15],
+"structsmtp__session.html#a70b3753bc70e65f779279c246617faea":[12,0,79,14],
+"structsmtp__session.html#a7a5a3c00378ce076ce70236525afd431":[12,0,79,9],
+"structsmtp__session.html#a7bb4bf5cc209e073341b56845e5cbd49":[12,0,79,2],
+"structsmtp__session.html#a8dc4651c67618e33c56dc66790bc12ee":[12,0,79,7],
+"structsmtp__session.html#a9da4e424e22892fae51987665eca85a9":[12,0,79,0],
+"structsmtp__session.html#ab8240801e229ee260f3feeaa270520c7":[12,0,79,11],
+"structsmtp__session.html#aea48a6edd3ede02b26882c7b8d72646c":[12,0,79,12],
+"structsmtp__session.html#aed9c182738767279c2b58b1e3322db09":[12,0,79,10],
+"structsmtp__session.html#af0544df7a935a092d825d8f2380f970f":[12,0,79,5],
+"structsnmp__leaf__node.html":[12,0,80],
+"structsnmp__leaf__node.html#aa9e43030b5229d8425082c595c576992":[12,0,80,0],
+"structsnmp__mib.html":[12,0,81],
+"structsnmp__next__oid__state.html":[12,0,82],
+"structsnmp__node.html":[12,0,83],
+"structsnmp__node.html#a1af8e20a688943a419b307bf123b1851":[12,0,83,0],
+"structsnmp__node.html#ae7a3bb0eb49ac527d461be414937f271":[12,0,83,1],
+"structsnmp__node__instance.html":[12,0,84],
+"structsnmp__node__instance.html#a03c1fec3764f6b48337238b3355ee5bd":[12,0,84,8],
+"structsnmp__node__instance.html#a17aa954aa34672f4a399bf0d91c0a649":[12,0,84,2],
+"structsnmp__node__instance.html#a20a256c54fab19a455ecf6deff76c6de":[12,0,84,7],
+"structsnmp__node__instance.html#a4136f44404b25f4d4dacc6b6b76e77ac":[12,0,84,4],
+"structsnmp__node__instance.html#a4af17d17a971f1d11a186e6e1fc4411c":[12,0,84,0],
+"structsnmp__node__instance.html#a55f53419cd5b369b771153ca2598ebc5":[12,0,84,5],
+"structsnmp__node__instance.html#a55fb4cadefcab9c74c3fb529c2560834":[12,0,84,9],
+"structsnmp__node__instance.html#ad289957b34b4e55915fa79f37c4d9d54":[12,0,84,6],
+"structsnmp__node__instance.html#aedb358729c310c8e5b391dd256726a23":[12,0,84,3],
+"structsnmp__node__instance.html#af51206e0912a8402c395dcf3b623f8b9":[12,0,84,1],
+"structsnmp__obj__id.html":[12,0,85],
+"structsnmp__oid__range.html":[12,0,86],
+"structsnmp__scalar__array__node.html":[12,0,87],
+"structsnmp__scalar__array__node.html#a34753e75ec873c92381bf9b6d00d411b":[12,0,87,0],
+"structsnmp__scalar__array__node__def.html":[12,0,88],
+"structsnmp__scalar__node.html":[12,0,89],
+"structsnmp__scalar__node.html#a3c9e5cc0a5e22ececeeb3c512d25e3a1":[12,0,89,0],
+"structsnmp__table__col__def.html":[12,0,90],
+"structsnmp__table__node.html":[12,0,91],
+"structsnmp__table__node.html#a2a3e8ac0dcce64604fc17e1de3c5a804":[12,0,91,3],
+"structsnmp__table__node.html#a3f12334e8d1556c36ce3e2206001ab18":[12,0,91,1],
+"structsnmp__table__node.html#ac65c57e29faa456a9a710185109fe272":[12,0,91,0],
+"structsnmp__table__node.html#acfbc5fa3361117fc4fa83642dde8aef0":[12,0,91,2],
+"structsnmp__table__simple__node.html":[12,0,92],
+"structsnmp__threadsync__instance.html":[12,0,93],
+"structsnmp__threadsync__node.html":[12,0,94],
+"structsnmp__tree__node.html":[12,0,95],
+"structsnmp__tree__node.html#ad851f80c809606947c99cb26a9163386":[12,0,95,0],
+"structsnmp__varbind.html":[12,0,96],
+"structsnmp__varbind.html#a328227d7ae188a0a2feb95f8000aac45":[12,0,96,4],
+"structsnmp__varbind.html#a365abcc1f80d28dc8ffd07193099c760":[12,0,96,2],
+"structsnmp__varbind.html#a7388422ffb0607b209a39d6d3fcad40e":[12,0,96,0],
+"structsnmp__varbind.html#ab094577fac6c7cc16ad666c9970cdb85":[12,0,96,5],
+"structsnmp__varbind.html#ace3a9e4dcdc9a5ec79a20c84946418a4":[12,0,96,1],
+"structsnmp__varbind.html#ad63223e45e04c08ea97859b8ba767950":[12,0,96,3],
+"structsnmp__varbind__len.html":[12,0,97],
+"structsntp__msg.html":[12,0,99],
+"structsntp__server.html":[12,0,100],
+"structsntp__server.html#a2e9283bb8f94930fd2a2c3f24fc4b40d":[12,0,100,0],
+"structsntp__time.html":[12,0,101],
+"structsntp__timestamps.html":[12,0,102],
+"structstats__.html":[12,0,104],
+"structstats__.html#a10bc430163b0e6db91338aded5b7019a":[12,0,104,1],
+"structstats__.html#a25a6b5940e32d53a066aa1bbc2028c03":[12,0,104,2],
+"structstats__.html#a317123da6c92aa9d2fa40e8060357035":[12,0,104,14],
+"structstats__.html#a32ef1aaa427d62a5c7890de0ac23fe86":[12,0,104,15],
+"structstats__.html#a40f5b637d083896a07a3482ede23b7ed":[12,0,104,4],
+"structstats__.html#a626e03d4bded6480582789cfd17d4063":[12,0,104,16],
+"structstats__.html#a656444f95080c6a3d474f73a6fcd9b1c":[12,0,104,9],
+"structstats__.html#a67759c9b0059bf569f9f771df23924eb":[12,0,104,8],
+"structstats__.html#a7373df7bc44bb9913a42c0bc7b3039cf":[12,0,104,6],
+"structstats__.html#a81fcccf03ab0d4e31423f39d0c880302":[12,0,104,7],
+"structstats__.html#a877e369c2abef97f13492faa838e2271":[12,0,104,3],
+"structstats__.html#aa52547cb08dc828927494dc485bb69f3":[12,0,104,0],
+"structstats__.html#aa75d6b389e94b0f619b5db0daaf569fc":[12,0,104,10],
+"structstats__.html#ab0ad1d07dff25cd3e4a8e5be607497f8":[12,0,104,12],
+"structstats__.html#ab348a3a4b593b05d7df1293a06af8adf":[12,0,104,13],
+"structstats__.html#ac001c065c56c26c3952b19b9ce0d5832":[12,0,104,11],
+"structstats__.html#afc0942a5bc26735cf059099636b85336":[12,0,104,5],
+"structstats__igmp.html":[12,0,105],
+"structstats__mem.html":[12,0,106],
+"structstats__mib2.html":[12,0,107],
+"structstats__mib2__netif__ctrs.html":[11,2,0,3,4,0],
+"structstats__mib2__netif__ctrs.html#a111f08290b3c6944108237cefba066dd":[11,2,0,3,4,0,2],
+"structstats__mib2__netif__ctrs.html#a24151d13a55452518e5f7832f48bd5a7":[11,2,0,3,4,0,9],
+"structstats__mib2__netif__ctrs.html#a24aba9660a2951027b23d4118b57c471":[11,2,0,3,4,0,10],
+"structstats__mib2__netif__ctrs.html#a3a2aec508fd4466ca8bab10d8dc2c842":[11,2,0,3,4,0,6],
+"structstats__mib2__netif__ctrs.html#a4a767e6b835d5ad2f9b73751de2b0947":[11,2,0,3,4,0,0],
+"structstats__mib2__netif__ctrs.html#a7e9ddf9b4a17748a9d3f041c1d24ba8e":[11,2,0,3,4,0,3],
+"structstats__mib2__netif__ctrs.html#a91b60bb78759c9b655a74bb4fae3346e":[11,2,0,3,4,0,7],
+"structstats__mib2__netif__ctrs.html#a9ed42d6329a9616669ba21789fa001d8":[11,2,0,3,4,0,4],
+"structstats__mib2__netif__ctrs.html#ac34eb01b42f22b1e49ca7c9734e737aa":[11,2,0,3,4,0,5],
+"structstats__mib2__netif__ctrs.html#afd3264670c39cc0d721a35cb6650f8d7":[11,2,0,3,4,0,8],
+"structstats__mib2__netif__ctrs.html#afda1a14dc79bb65a33f97f9fb467ec1d":[11,2,0,3,4,0,1],
+"structstats__proto.html":[12,0,109],
+"structstats__sys.html":[12,0,110],
+"structstats__syselem.html":[12,0,111],
+"structt_c_g_i.html":[11,4,1,1],
+"structtcp__ext__arg__callbacks.html":[12,0,113],
+"structtcp__ext__arg__callbacks.html#a86b5816e8285378813963d09272b050a":[12,0,113,1],
+"structtcp__ext__arg__callbacks.html#ace586d5d376b42465927a4fd8688c24b":[12,0,113,0],
+"structtcp__pcb.html":[12,0,114],
+"structtcp__pcb.html#a0c4f101d55debee0d8fad86a7eb4f76f":[12,0,114,0],
+"structtcp__pcb.html#a2aed7ffb5fb83aabe68b36f097d99260":[12,0,114,1],
+"structtcp__pcb__listen.html":[12,0,115],
+"structtcp__pcb__listen.html#a0483d0c2a2758dcef18689be2efbdf34":[12,0,115,1],
+"structtcp__pcb__listen.html#a8a4f7b0551a0c6926a08ea5b6b3d5987":[12,0,115,0],
+"structtftp__context.html":[11,4,9,1],
+"structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c":[11,4,9,1,2],
+"structtftp__context.html#a9e6e4ec803ec9597822923369701754d":[11,4,9,1,3],
+"structtftp__context.html#ae70d64e8e20328cc492d766506df4cba":[11,4,9,1,1],
+"structtftp__context.html#ae9181c57d1cf89bc263f7671e5630a65":[11,4,9,1,0],
+"structthreadsync__data.html":[12,0,117],
+"structudp__pcb.html":[12,0,118],
+"structudp__pcb.html#a11e4c40b8868aa40d923756a60598cab":[12,0,118,7],
+"structudp__pcb.html#a1c32c7ebd76898cf8f1227c10d34dbe0":[12,0,118,4],
+"structudp__pcb.html#a5e2833df51760c83c6032608eb5d0d4d":[12,0,118,0],
+"structudp__pcb.html#a6160ea5e52f0d33e51b16b853ea1cd63":[12,0,118,1],
+"structudp__pcb.html#a8cc805631142eefc5593ae8ba3302d7c":[12,0,118,2],
+"structudp__pcb.html#aaab9255f7f1186aef12d45c9bb90d3f4":[12,0,118,5],
+"structudp__pcb.html#ac05dee75a3d6666267f7e626c2ec56a8":[12,0,118,6],
+"structudp__pcb.html#ac80ae56333b88cea08bfa3563b0dd3cd":[12,0,118,3],
+"structzepif__init.html":[12,0,119],
+"structzepif__init.html#a3d97bf90b6bd4dd8258a3b1caf7890e3":[12,0,119,3],
+"structzepif__init.html#a5a9a7ee6e687a7c1ae85b103d39de61d":[12,0,119,0],
+"structzepif__init.html#a851efb99a973348f1064a31b97ce779d":[12,0,119,1],
+"structzepif__init.html#a86c6229ed3010158e601666afe91a286":[12,0,119,2],
+"structzepif__init.html#ad739032585841b126b4c0eab5899d40f":[12,0,119,5],
+"structzepif__init.html#adbe989f1f5cba623d742187def36f02c":[12,0,119,4],
+"sys_8c.html":[13,0,0,2,16],
+"sys_8h.html":[13,0,0,3,1,48],
+"sys_8h.html#a2556e570f6973a6f4d57d0e76ef190d8":[13,0,0,3,1,48,9],
+"sys_8h.html#a7bada49634cd3b28b28bdcedd763a1e6":[13,0,0,3,1,48,0],
+"sys_8h.html#a84e7e4bc00255aee84e6e7289a985703":[13,0,0,3,1,48,11],
+"sys_8h.html#a9e8ad541356786936f23ab83b8f550cc":[13,0,0,3,1,48,10],
+"sys_8h.html#aae82640d0bdbeec7b9b6511b3f8d99cb":[13,0,0,3,1,48,8],
+"sys_8h.html#ab0571e67edca0132b144106e9b319ef9":[13,0,0,3,1,48,5],
+"sys_8h.html#ab7841780b31ba9c0a39a440aad1fca13":[13,0,0,3,1,48,7],
+"sys_8h.html#ac1495030a8ab5e1f3c89e42ced527c5b":[13,0,0,3,1,48,3],
+"sys_8h.html#ac89f307e8b360eaf821b461a4f26753a":[13,0,0,3,1,48,17],
+"sys_8h.html#ae293feebb61d36f2db99be53702b8203":[13,0,0,3,1,48,6],
+"sys_8h.html#ae30a77bf6bd69bfcc5f235eaad54f2b9":[13,0,0,3,1,48,12],
+"sys_init.html":[7],
+"tcp_8c.html":[13,0,0,2,17],
+"tcp_8c.html#a0075b56ad4b0eca7c9d439cf150e1973":[13,0,0,2,17,30],
+"tcp_8c.html#a08a3b5396c40f32dd8b21e7d63b3e1b3":[13,0,0,2,17,11],
+"tcp_8c.html#a0cb3f604fc8d20870d8cab291da5701c":[13,0,0,2,17,32],
+"tcp_8c.html#a1b42a7ac0fc173a42d575f86853d32a8":[13,0,0,2,17,45],
+"tcp_8c.html#a1dd6830a42b3c464b5a72f62ae312d0a":[13,0,0,2,17,3],
+"tcp_8c.html#a2c4234f1e95b6bde0e84d4ea97ae95bc":[13,0,0,2,17,38]
+};
diff --git a/doc/doxygen/output/html/navtreeindex17.js b/doc/doxygen/output/html/navtreeindex17.js
new file mode 100644
index 0000000..5d64c2d
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex17.js
@@ -0,0 +1,157 @@
+var NAVTREEINDEX17 =
+{
+"tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb":[13,0,0,2,17,41],
+"tcp_8c.html#a3d9bb9809769197bce9b2499d55cf28c":[13,0,0,2,17,36],
+"tcp_8c.html#a421fb42ef919018e14ae413adfee9905":[13,0,0,2,17,40],
+"tcp_8c.html#a44fc672b9d14a65e61040707c45302ba":[13,0,0,2,17,27],
+"tcp_8c.html#a4d0c2d1ad02134c79fc72fe95ee2a703":[13,0,0,2,17,23],
+"tcp_8c.html#a51515507dec664e9d69a870e6b627610":[13,0,0,2,17,47],
+"tcp_8c.html#a51de4ded7d342456d31722493c92c969":[13,0,0,2,17,20],
+"tcp_8c.html#a5265b1df024d04287ed3edc02b1b9ccc":[13,0,0,2,17,15],
+"tcp_8c.html#a569d79451d2570e4ef406775725ef6ef":[13,0,0,2,17,34],
+"tcp_8c.html#a5ae0268e59fda0665fdd08c6e77ec547":[13,0,0,2,17,42],
+"tcp_8c.html#a6d2c254b779db4e517cb34e41301588d":[13,0,0,2,17,43],
+"tcp_8c.html#a78c09dbae67ccc06b659d9f1a388f911":[13,0,0,2,17,44],
+"tcp_8c.html#a96fe1350e510d4308ac9969ffb4c9c81":[13,0,0,2,17,46],
+"tcp_8c.html#a9a522a66c5e1f1a4e28fe7a672cc64e3":[13,0,0,2,17,48],
+"tcp_8c.html#aa2b6b075c27c64dfb8c402ac961fb910":[13,0,0,2,17,19],
+"tcp_8c.html#aaaef096f6a03bf5b778329bb66ee06f6":[13,0,0,2,17,28],
+"tcp_8c.html#abf446b07e52161b8a53cea07bc6c366d":[13,0,0,2,17,18],
+"tcp_8c.html#ac6283651b26f74dba2444159aee88b20":[13,0,0,2,17,35],
+"tcp_8c.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe":[13,0,0,2,17,0],
+"tcp_8c.html#afd5dc2fa74855a84b2da642ba31059ea":[13,0,0,2,17,26],
+"tcp_8h.html":[13,0,0,3,1,49],
+"tcp_8h.html#a00517abce6856d6c82f0efebdafb734d":[13,0,0,3,1,49,11],
+"tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55":[13,0,0,3,1,49,13],
+"tcp_8h.html#a20881e537f5be7847d88fe2a0c8fd2cd":[13,0,0,3,1,49,15],
+"tcp_8h.html#a2c4234f1e95b6bde0e84d4ea97ae95bc":[13,0,0,3,1,49,42],
+"tcp_8h.html#a66deb97618a9cd9d57fca28c5245e073":[13,0,0,3,1,49,16],
+"tcp_8h.html#a780cfac08b02c66948ab94ea974202e8":[13,0,0,3,1,49,17],
+"tcp_8h.html#a874630045102fc5f1442704a790c8bb8":[13,0,0,3,1,49,8],
+"tcp_8h.html#a939867106bd492caf2d85852fb7f6ae8":[13,0,0,3,1,49,12],
+"tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18":[13,0,0,3,1,49,18],
+"tcp_8h.html#aba649c5bdf19d47e39643392b6d88588":[13,0,0,3,1,49,14],
+"tcp__in_8c.html":[13,0,0,2,18],
+"tcp__in_8c.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5":[13,0,0,2,18,1],
+"tcp__in_8c.html#aea174f2c6ca4cb0ad270dd8d0faf0c84":[13,0,0,2,18,0],
+"tcp__out_8c.html":[13,0,0,2,19],
+"tcp__out_8c.html#a0d8bb5fc8522515aa35d305774cc5332":[13,0,0,2,19,3],
+"tcp__out_8c.html#a1f318930bd6d49074343cc79c5166f39":[13,0,0,2,19,9],
+"tcp__out_8c.html#a25d7e9081baa5c84f2ebd34b0eb4169b":[13,0,0,2,19,0],
+"tcp__out_8c.html#a6c20490aa45c771c38ce8ad3031cbdf6":[13,0,0,2,19,15],
+"tcp__out_8c.html#a9ef9dc094e21bdf0779aed25ab0b08d4":[13,0,0,2,19,8],
+"tcp__out_8c.html#aa2ef22d2384225a1b5fee187411cc129":[13,0,0,2,19,1],
+"tcp__out_8c.html#aa7d5d552647d567095876aab202bfd1a":[13,0,0,2,19,2],
+"tcp__out_8c.html#aa90f8051c9633d3017c588245cdc4014":[13,0,0,2,19,10],
+"tcp__out_8c.html#ab5ef9c8ab4629eb721987ae316b9f30f":[13,0,0,2,19,7],
+"tcp__out_8c.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5":[13,0,0,2,19,13],
+"tcp__out_8c.html#adb6ee7b4d59f125cc8bfac3bb5ca3937":[13,0,0,2,19,6],
+"tcp__out_8c.html#aefde3e34b2cc8df9654986484c44a996":[13,0,0,2,19,11],
+"tcp__out_8c.html#af40ba9d645a8910436c3d7cf13dba342":[13,0,0,2,19,12],
+"tcp__out_8c.html#af75fefe4fe509845be156d6e424eb6f1":[13,0,0,2,19,5],
+"tcp__priv_8h.html":[13,0,0,3,1,1,8],
+"tcp__priv_8h.html#a0075b56ad4b0eca7c9d439cf150e1973":[13,0,0,3,1,1,8,19],
+"tcp__priv_8h.html#a08a3b5396c40f32dd8b21e7d63b3e1b3":[13,0,0,3,1,1,8,7],
+"tcp__priv_8h.html#a0cb3f604fc8d20870d8cab291da5701c":[13,0,0,3,1,1,8,20],
+"tcp__priv_8h.html#a0d8bb5fc8522515aa35d305774cc5332":[13,0,0,3,1,1,8,14],
+"tcp__priv_8h.html#a178a6e9966d03c3326b9e0568666bb69":[13,0,0,3,1,1,8,3],
+"tcp__priv_8h.html#a1b42a7ac0fc173a42d575f86853d32a8":[13,0,0,3,1,1,8,40],
+"tcp__priv_8h.html#a1dd6830a42b3c464b5a72f62ae312d0a":[13,0,0,3,1,1,8,6],
+"tcp__priv_8h.html#a1f318930bd6d49074343cc79c5166f39":[13,0,0,3,1,1,8,25],
+"tcp__priv_8h.html#a3846a756b13214ed88ea47d0ff8279eb":[13,0,0,3,1,1,8,35],
+"tcp__priv_8h.html#a3d9bb9809769197bce9b2499d55cf28c":[13,0,0,3,1,1,8,29],
+"tcp__priv_8h.html#a421fb42ef919018e14ae413adfee9905":[13,0,0,3,1,1,8,32],
+"tcp__priv_8h.html#a44fc672b9d14a65e61040707c45302ba":[13,0,0,3,1,1,8,17],
+"tcp__priv_8h.html#a4d0c2d1ad02134c79fc72fe95ee2a703":[13,0,0,3,1,1,8,15],
+"tcp__priv_8h.html#a51de4ded7d342456d31722493c92c969":[13,0,0,3,1,1,8,12],
+"tcp__priv_8h.html#a5265b1df024d04287ed3edc02b1b9ccc":[13,0,0,3,1,1,8,9],
+"tcp__priv_8h.html#a569d79451d2570e4ef406775725ef6ef":[13,0,0,3,1,1,8,27],
+"tcp__priv_8h.html#a5ae0268e59fda0665fdd08c6e77ec547":[13,0,0,3,1,1,8,36],
+"tcp__priv_8h.html#a6c20490aa45c771c38ce8ad3031cbdf6":[13,0,0,3,1,1,8,38],
+"tcp__priv_8h.html#a6d2c254b779db4e517cb34e41301588d":[13,0,0,3,1,1,8,37],
+"tcp__priv_8h.html#a78c09dbae67ccc06b659d9f1a388f911":[13,0,0,3,1,1,8,39],
+"tcp__priv_8h.html#a8181bc316fdf61b85f787c5cadfcd249":[13,0,0,3,1,1,8,34],
+"tcp__priv_8h.html#a96fe1350e510d4308ac9969ffb4c9c81":[13,0,0,3,1,1,8,41],
+"tcp__priv_8h.html#a9a522a66c5e1f1a4e28fe7a672cc64e3":[13,0,0,3,1,1,8,43],
+"tcp__priv_8h.html#a9ef9dc094e21bdf0779aed25ab0b08d4":[13,0,0,3,1,1,8,24],
+"tcp__priv_8h.html#aa2b6b075c27c64dfb8c402ac961fb910":[13,0,0,3,1,1,8,11],
+"tcp__priv_8h.html#aa7d5d552647d567095876aab202bfd1a":[13,0,0,3,1,1,8,8],
+"tcp__priv_8h.html#aa90f8051c9633d3017c588245cdc4014":[13,0,0,3,1,1,8,26],
+"tcp__priv_8h.html#aaaef096f6a03bf5b778329bb66ee06f6":[13,0,0,3,1,1,8,18],
+"tcp__priv_8h.html#ab5ef9c8ab4629eb721987ae316b9f30f":[13,0,0,3,1,1,8,23],
+"tcp__priv_8h.html#abdc99c343efc6c81abf60bb62b361dd8":[13,0,0,3,1,1,8,0],
+"tcp__priv_8h.html#abf446b07e52161b8a53cea07bc6c366d":[13,0,0,3,1,1,8,10],
+"tcp__priv_8h.html#ac6283651b26f74dba2444159aee88b20":[13,0,0,3,1,1,8,28],
+"tcp__priv_8h.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5":[13,0,0,3,1,1,8,33],
+"tcp__priv_8h.html#ac9dbdaeac3e25f5badf3a763a1b0b990":[13,0,0,3,1,1,8,4],
+"tcp__priv_8h.html#adb6ee7b4d59f125cc8bfac3bb5ca3937":[13,0,0,3,1,1,8,22],
+"tcp__priv_8h.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe":[13,0,0,3,1,1,8,5],
+"tcp__priv_8h.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5":[13,0,0,3,1,1,8,13],
+"tcp__priv_8h.html#aea0c47b916a8a25f82d2063335033aee":[13,0,0,3,1,1,8,1],
+"tcp__priv_8h.html#aefde3e34b2cc8df9654986484c44a996":[13,0,0,3,1,1,8,30],
+"tcp__priv_8h.html#af40ba9d645a8910436c3d7cf13dba342":[13,0,0,3,1,1,8,31],
+"tcp__priv_8h.html#af5e1079ab223e1cb27208c45e3c84df7":[13,0,0,3,1,1,8,42],
+"tcp__priv_8h.html#af75fefe4fe509845be156d6e424eb6f1":[13,0,0,3,1,1,8,21],
+"tcp__priv_8h.html#afbd7a2997e3a3b7569efc3298e2e409f":[13,0,0,3,1,1,8,2],
+"tcp__priv_8h.html#afd5dc2fa74855a84b2da642ba31059ea":[13,0,0,3,1,1,8,16],
+"tcpbase_8h.html":[13,0,0,3,1,50],
+"tcpip_8c.html":[13,0,0,0,8],
+"tcpip_8c.html#a12bdf37eddcd72c4178e3ea7d370395d":[13,0,0,0,8,11],
+"tcpip_8c.html#a3d42b0c46607f91aedcc7745ed466b08":[13,0,0,0,8,2],
+"tcpip_8c.html#a55b4de3765c6a37b3f2b26a11603771c":[13,0,0,0,8,0],
+"tcpip_8c.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c":[13,0,0,0,8,1],
+"tcpip_8c.html#a93043b3c66dbe4a15a60299c6199d102":[13,0,0,0,8,9],
+"tcpip_8c.html#acd7be2108e9a47fd8f1ab0a49f76241d":[13,0,0,0,8,13],
+"tcpip_8h.html":[13,0,0,3,1,51],
+"tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d":[13,0,0,3,1,51,3],
+"tcpip_8h.html#a4700525e737fc025fea4887b172e0c95":[13,0,0,3,1,51,0],
+"tcpip_8h.html#a55b4de3765c6a37b3f2b26a11603771c":[13,0,0,3,1,51,5],
+"tcpip_8h.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c":[13,0,0,3,1,51,6],
+"tcpip_8h.html#a5fe07216c441e27c3028bcac60fa0992":[13,0,0,3,1,51,4],
+"tcpip_8h.html#a915effea029b9c4891e1ec635eb1826d":[13,0,0,3,1,51,2],
+"tcpip_8h.html#a93043b3c66dbe4a15a60299c6199d102":[13,0,0,3,1,51,13],
+"tcpip_8h.html#acd7be2108e9a47fd8f1ab0a49f76241d":[13,0,0,3,1,51,16],
+"tcpip__priv_8h.html":[13,0,0,3,1,1,9],
+"tcpip__priv_8h.html#a12bdf37eddcd72c4178e3ea7d370395d":[13,0,0,3,1,1,9,1],
+"tcpip__priv_8h.html#a3d42b0c46607f91aedcc7745ed466b08":[13,0,0,3,1,1,9,0],
+"tftp__opts_8h.html":[13,0,0,3,1,0,24],
+"tftp__server_8c.html":[13,0,0,1,9,0],
+"tftp__server_8h.html":[13,0,0,3,1,0,25],
+"timeouts_8c.html":[13,0,0,2,20],
+"timeouts_8c.html#a60f42f167f496f6f740c8df48f4dd26c":[13,0,0,2,20,3],
+"timeouts_8c.html#a6913959cf264dbe876b7e7c4db1cc13e":[13,0,0,2,20,1],
+"timeouts_8c.html#a8181bc316fdf61b85f787c5cadfcd249":[13,0,0,2,20,6],
+"timeouts_8c.html#a8deed391626ec8b5423998e33782d7a8":[13,0,0,2,20,2],
+"timeouts_8c.html#a9d01f287a19f20b073d3a1c306ecbfcd":[13,0,0,2,20,8],
+"timeouts_8c.html#aa9971a14a5810cfeb1efd7104cde6664":[13,0,0,2,20,4],
+"timeouts_8c.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6":[13,0,0,2,20,5],
+"timeouts_8c.html#addc06ab816f051a0fe6f280972eed142":[13,0,0,2,20,7],
+"timeouts_8h.html":[13,0,0,3,1,52],
+"timeouts_8h.html#a2ab5bb8173f492563f70a519011b0ac1":[13,0,0,3,1,52,3],
+"timeouts_8h.html#a60f42f167f496f6f740c8df48f4dd26c":[13,0,0,3,1,52,7],
+"timeouts_8h.html#a6913959cf264dbe876b7e7c4db1cc13e":[13,0,0,3,1,52,5],
+"timeouts_8h.html#a8deed391626ec8b5423998e33782d7a8":[13,0,0,3,1,52,6],
+"timeouts_8h.html#a985c5d366b62bd179195e093ffcb7ecd":[13,0,0,3,1,52,2],
+"timeouts_8h.html#a9d01f287a19f20b073d3a1c306ecbfcd":[13,0,0,3,1,52,11],
+"timeouts_8h.html#a9e2b2593e709ff54c7e3c0b003f6f1b0":[13,0,0,3,1,52,1],
+"timeouts_8h.html#aa9971a14a5810cfeb1efd7104cde6664":[13,0,0,3,1,52,8],
+"timeouts_8h.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6":[13,0,0,3,1,52,9],
+"timeouts_8h.html#addc06ab816f051a0fe6f280972eed142":[13,0,0,3,1,52,10],
+"udp_8c.html":[13,0,0,2,21],
+"udp_8c.html#a7b338a5515606bd51976fbc5bcec9611":[13,0,0,2,21,5],
+"udp_8c.html#ab857f86a0b15d02b864292b161b2c3fc":[13,0,0,2,21,6],
+"udp_8c.html#ae7f7431ce99333577d7b82b26619309e":[13,0,0,2,21,4],
+"udp_8h.html":[13,0,0,3,1,53],
+"udp_8h.html#a7b338a5515606bd51976fbc5bcec9611":[13,0,0,3,1,53,7],
+"udp_8h.html#ab857f86a0b15d02b864292b161b2c3fc":[13,0,0,3,1,53,8],
+"udp_8h.html#ae7f7431ce99333577d7b82b26619309e":[13,0,0,3,1,53,6],
+"udp_8h.html#af0ec7feb31acdb6e11b928f438c8a64b":[13,0,0,3,1,53,1],
+"unionnetif__ext__callback__args__t.html":[11,2,0,3,5],
+"unionsnmp__variant__value.html":[12,0,98],
+"unionsockaddr__aligned.html":[12,0,103],
+"upgrading.html":[1],
+"zepif_8c.html":[13,0,0,4,8],
+"zepif_8c.html#a8cae594e71cf385076f7bda166729dcd":[13,0,0,4,8,0],
+"zepif_8h.html":[13,0,0,3,2,10],
+"zerocopyrx.html":[6]
+};
diff --git a/doc/doxygen/output/html/navtreeindex2.js b/doc/doxygen/output/html/navtreeindex2.js
new file mode 100644
index 0000000..379860c
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex2.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX2 =
+{
+"group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e":[11,0,2,4,5],
+"group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e":[13,0,0,3,1,7,5],
+"group__compiler__abstraction.html#ga33623da05bb55497534c3dc26ebebeb2":[11,0,2,4,24],
+"group__compiler__abstraction.html#ga33623da05bb55497534c3dc26ebebeb2":[13,0,0,3,1,7,24],
+"group__compiler__abstraction.html#ga4488578f18ad1a76e4fa8bc288c51446":[11,0,2,4,12],
+"group__compiler__abstraction.html#ga4488578f18ad1a76e4fa8bc288c51446":[13,0,0,3,1,7,12],
+"group__compiler__abstraction.html#ga465fef70f294e21cbf4ea51fc342f20e":[11,0,2,4,20],
+"group__compiler__abstraction.html#ga465fef70f294e21cbf4ea51fc342f20e":[13,0,0,3,1,7,20],
+"group__compiler__abstraction.html#ga53954d507c09e521ec0d44a2450bb89d":[11,0,2,4,10],
+"group__compiler__abstraction.html#ga53954d507c09e521ec0d44a2450bb89d":[13,0,0,3,1,7,10],
+"group__compiler__abstraction.html#ga57b90d36d8bea3798a5d1815945fd8ef":[11,0,2,4,25],
+"group__compiler__abstraction.html#ga57b90d36d8bea3798a5d1815945fd8ef":[13,0,0,3,1,7,25],
+"group__compiler__abstraction.html#ga5bf52d6f2729d0c8afd365f69d7d4373":[11,0,2,4,8],
+"group__compiler__abstraction.html#ga5bf52d6f2729d0c8afd365f69d7d4373":[13,0,0,3,1,7,8],
+"group__compiler__abstraction.html#ga651bb349041669fe717b19f127ef16c0":[11,0,2,4,3],
+"group__compiler__abstraction.html#ga651bb349041669fe717b19f127ef16c0":[13,0,0,3,1,7,3],
+"group__compiler__abstraction.html#ga683e5c35d3263fe3145e6a6bc546604a":[11,0,2,4,16],
+"group__compiler__abstraction.html#ga683e5c35d3263fe3145e6a6bc546604a":[13,0,0,3,1,7,16],
+"group__compiler__abstraction.html#ga6871ce1e92ae09cdad39a9b230a3a800":[11,0,2,4,7],
+"group__compiler__abstraction.html#ga6871ce1e92ae09cdad39a9b230a3a800":[13,0,0,3,1,7,7],
+"group__compiler__abstraction.html#ga70624a5deb8b9199406372a7f3603ecf":[11,0,2,4,18],
+"group__compiler__abstraction.html#ga70624a5deb8b9199406372a7f3603ecf":[13,0,0,3,1,7,18],
+"group__compiler__abstraction.html#ga73199061891adf1b912d20835c7d5e96":[11,0,2,4,19],
+"group__compiler__abstraction.html#ga73199061891adf1b912d20835c7d5e96":[13,0,0,3,1,7,19],
+"group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a":[11,0,2,4,17],
+"group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a":[13,0,0,3,1,7,17],
+"group__compiler__abstraction.html#ga7e8bcd0282525704d6dd596bdd1b47d0":[11,0,2,4,13],
+"group__compiler__abstraction.html#ga7e8bcd0282525704d6dd596bdd1b47d0":[13,0,0,3,1,7,13],
+"group__compiler__abstraction.html#ga8e2cba4c97dd38f4d517ed21cf109ade":[11,0,2,4,15],
+"group__compiler__abstraction.html#ga8e2cba4c97dd38f4d517ed21cf109ade":[13,0,0,3,1,7,15],
+"group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72":[11,0,2,4,2],
+"group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72":[13,0,0,3,1,7,2],
+"group__compiler__abstraction.html#gaa8e8724eb1c220cbbb90de9e175ce1dc":[11,0,2,4,4],
+"group__compiler__abstraction.html#gaa8e8724eb1c220cbbb90de9e175ce1dc":[13,0,0,3,1,7,4],
+"group__compiler__abstraction.html#gaa8f75e4117374c2d09fbda5566e40b62":[13,0,0,3,1,7,22],
+"group__compiler__abstraction.html#gaa8f75e4117374c2d09fbda5566e40b62":[11,0,2,4,22],
+"group__compiler__abstraction.html#gaab0b988124e37a978d9a88e7c1c778e0":[11,0,2,4,21],
+"group__compiler__abstraction.html#gaab0b988124e37a978d9a88e7c1c778e0":[13,0,0,3,1,7,21],
+"group__compiler__abstraction.html#gaade87973d72135b0b3afccfff4f62eb8":[11,0,2,4,1],
+"group__compiler__abstraction.html#gaade87973d72135b0b3afccfff4f62eb8":[13,0,0,3,1,7,1],
+"group__compiler__abstraction.html#gacc89e224363eb0ebca24b64d925c3cb7":[13,0,0,3,1,7,23],
+"group__compiler__abstraction.html#gacc89e224363eb0ebca24b64d925c3cb7":[11,0,2,4,23],
+"group__compiler__abstraction.html#gaccef167be13a500ce30036030a9b142b":[11,0,2,4,14],
+"group__compiler__abstraction.html#gaccef167be13a500ce30036030a9b142b":[13,0,0,3,1,7,14],
+"group__compiler__abstraction.html#gade9c8513419a799cd78a07ae894bb805":[11,0,2,4,9],
+"group__compiler__abstraction.html#gade9c8513419a799cd78a07ae894bb805":[13,0,0,3,1,7,9],
+"group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18":[11,0,2,4,6],
+"group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18":[13,0,0,3,1,7,6],
+"group__debugging__levels.html":[11,0,4,0,2,0],
+"group__debugging__levels.html#ga0269bdc51f1e8a5ecf9af72c6e1c996c":[11,0,4,0,2,0,3],
+"group__debugging__levels.html#ga0269bdc51f1e8a5ecf9af72c6e1c996c":[13,0,0,3,1,9,3],
+"group__debugging__levels.html#ga511ee3deb3240635f5ec6a1709c6d741":[11,0,4,0,2,0,8],
+"group__debugging__levels.html#ga511ee3deb3240635f5ec6a1709c6d741":[13,0,0,3,1,9,8],
+"group__debugging__levels.html#ga77c491e468bf7d9a1bc48430c1866a96":[11,0,4,0,2,0,5],
+"group__debugging__levels.html#ga77c491e468bf7d9a1bc48430c1866a96":[13,0,0,3,1,9,5],
+"group__debugging__levels.html#ga7d44d1804fa5e747aed86816e2a6cae0":[11,0,4,0,2,0,0],
+"group__debugging__levels.html#ga7d44d1804fa5e747aed86816e2a6cae0":[13,0,0,3,1,9,0],
+"group__debugging__levels.html#ga8ebaeb006b43f55897f3196b3617dc87":[11,0,4,0,2,0,2],
+"group__debugging__levels.html#ga8ebaeb006b43f55897f3196b3617dc87":[13,0,0,3,1,9,2],
+"group__debugging__levels.html#ga988147559b78642ac881815b66023646":[11,0,4,0,2,0,9],
+"group__debugging__levels.html#ga988147559b78642ac881815b66023646":[13,0,0,3,1,9,9],
+"group__debugging__levels.html#ga9e31b7cbbc8f46af8e62b548079acd4e":[11,0,4,0,2,0,7],
+"group__debugging__levels.html#ga9e31b7cbbc8f46af8e62b548079acd4e":[13,0,0,3,1,9,7],
+"group__debugging__levels.html#gaab41143277cd38047b6660d90e9cec3b":[11,0,4,0,2,0,4],
+"group__debugging__levels.html#gaab41143277cd38047b6660d90e9cec3b":[13,0,0,3,1,9,4],
+"group__debugging__levels.html#gab0a296414983155b30ad51871606b90f":[11,0,4,0,2,0,1],
+"group__debugging__levels.html#gab0a296414983155b30ad51871606b90f":[13,0,0,3,1,9,1],
+"group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1":[11,0,4,0,2,0,6],
+"group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1":[13,0,0,3,1,9,6],
+"group__dhcp4.html":[11,2,0,2,0,1],
+"group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f":[13,0,0,2,0,1,14],
+"group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f":[11,2,0,2,0,1,6],
+"group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f":[13,0,0,3,1,11,14],
+"group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64":[13,0,0,2,0,1,5],
+"group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64":[11,2,0,2,0,1,0],
+"group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64":[13,0,0,3,1,11,5],
+"group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8":[13,0,0,2,0,1,13],
+"group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8":[11,2,0,2,0,1,5],
+"group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8":[13,0,0,3,1,11,13],
+"group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947":[13,0,0,2,0,1,12],
+"group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947":[11,2,0,2,0,1,4],
+"group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947":[13,0,0,3,1,11,12],
+"group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312":[13,0,0,2,0,1,15],
+"group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312":[11,2,0,2,0,1,7],
+"group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312":[13,0,0,3,1,11,15],
+"group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad":[13,0,0,2,0,1,8],
+"group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad":[11,2,0,2,0,1,1],
+"group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad":[13,0,0,3,1,11,8],
+"group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece":[13,0,0,2,0,1,11],
+"group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece":[11,2,0,2,0,1,3],
+"group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece":[13,0,0,3,1,11,11],
+"group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4":[13,0,0,2,0,1,10],
+"group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4":[11,2,0,2,0,1,2],
+"group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4":[13,0,0,3,1,11,10],
+"group__dhcp6.html":[11,2,0,2,1,0],
+"group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453":[13,0,0,2,1,0,6],
+"group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453":[11,2,0,2,1,0,4],
+"group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453":[13,0,0,3,1,12,7],
+"group__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619":[13,0,0,2,1,0,3],
+"group__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619":[11,2,0,2,1,0,2],
+"group__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619":[13,0,0,3,1,12,4],
+"group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde":[13,0,0,2,1,0,1],
+"group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde":[11,2,0,2,1,0,0],
+"group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde":[13,0,0,3,1,12,2],
+"group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2":[13,0,0,2,1,0,2],
+"group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2":[11,2,0,2,1,0,1],
+"group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2":[13,0,0,3,1,12,3],
+"group__dhcp6.html#gaf3349463541e673fec33843eb019b18c":[13,0,0,2,1,0,4],
+"group__dhcp6.html#gaf3349463541e673fec33843eb019b18c":[11,2,0,2,1,0,3],
+"group__dhcp6.html#gaf3349463541e673fec33843eb019b18c":[13,0,0,3,1,12,5],
+"group__dns.html":[11,2,0,1],
+"group__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f":[13,0,0,2,6,7],
+"group__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f":[11,2,0,1,0],
+"group__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f":[13,0,0,3,1,13,2],
+"group__dns.html#gad02111a6b26b93f1c3580d5f41a59af3":[13,0,0,2,6,9],
+"group__dns.html#gad02111a6b26b93f1c3580d5f41a59af3":[11,2,0,1,2],
+"group__dns.html#gad02111a6b26b93f1c3580d5f41a59af3":[13,0,0,3,1,13,4],
+"group__dns.html#gae84449f60dca6b863142daca8e03ce79":[13,0,0,2,6,8],
+"group__dns.html#gae84449f60dca6b863142daca8e03ce79":[11,2,0,1,1],
+"group__dns.html#gae84449f60dca6b863142daca8e03ce79":[13,0,0,3,1,13,3],
+"group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584":[13,0,0,2,6,11],
+"group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584":[11,2,0,1,3],
+"group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584":[13,0,0,3,1,13,6],
+"group__ethernet.html":[11,2,0,7],
+"group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778":[13,0,0,3,2,3,2],
+"group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778":[13,0,0,4,3,1],
+"group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778":[11,2,0,7,0],
+"group__httpc.html":[11,4,0],
+"group__httpc.html#ga0452eb8007dbb5f139ec992e58e560dd":[11,4,0,3],
+"group__httpc.html#ga0452eb8007dbb5f139ec992e58e560dd":[13,0,0,3,1,0,2,3],
+"group__httpc.html#ga055b9a8bf8f4e2c18c621471773fa66c":[11,4,0,1],
+"group__httpc.html#ga055b9a8bf8f4e2c18c621471773fa66c":[13,0,0,3,1,0,2,1],
+"group__httpc.html#ga1e5b62519d6592c89ed3edfabd917472":[11,4,0,2],
+"group__httpc.html#ga1e5b62519d6592c89ed3edfabd917472":[13,0,0,3,1,0,2,2],
+"group__httpc.html#ga1f192f3009865e9f9a3cd83609c866c2":[11,4,0,0],
+"group__httpc.html#ga1f192f3009865e9f9a3cd83609c866c2":[13,0,0,3,1,0,2,0],
+"group__httpc.html#ga49e34884b272b1e0ddae8da46c31d9a3":[11,4,0,5],
+"group__httpc.html#ga49e34884b272b1e0ddae8da46c31d9a3":[13,0,0,3,1,0,2,5],
+"group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b":[11,4,0,6],
+"group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b":[13,0,0,3,1,0,2,6],
+"group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b":[13,0,0,1,1,1,3],
+"group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6":[11,4,0,7],
+"group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6":[13,0,0,3,1,0,2,7],
+"group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6":[13,0,0,1,1,1,4],
+"group__httpc.html#gac6713454283bff8e1187849e8d4bda18":[11,4,0,4],
+"group__httpc.html#gac6713454283bff8e1187849e8d4bda18":[13,0,0,3,1,0,2,4],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a49972833ec01c7a10dee734c7c69ed62":[11,4,0,5,7],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a49972833ec01c7a10dee734c7c69ed62":[13,0,0,3,1,0,2,5,7],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a5026187026abd1d242333ba6ff69ddbd":[13,0,0,3,1,0,2,5,1],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a5026187026abd1d242333ba6ff69ddbd":[11,4,0,5,1],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a6c8a4195834e1997a498a03bb47bb096":[11,4,0,5,9],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a6c8a4195834e1997a498a03bb47bb096":[13,0,0,3,1,0,2,5,9],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a89a6700abb14dd7cab9b4e0fd66e5fd6":[11,4,0,5,4],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a89a6700abb14dd7cab9b4e0fd66e5fd6":[13,0,0,3,1,0,2,5,4],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a8e6c597f88335b31e6a8b078a32fde33":[11,4,0,5,5],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a8e6c597f88335b31e6a8b078a32fde33":[13,0,0,3,1,0,2,5,5],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3aaa023a6f8069c02c87a826ba323c54b8":[11,4,0,5,6],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3aaa023a6f8069c02c87a826ba323c54b8":[13,0,0,3,1,0,2,5,6],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ab866d5433b4c4593c80b756d434e1d09":[11,4,0,5,2],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ab866d5433b4c4593c80b756d434e1d09":[13,0,0,3,1,0,2,5,2],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3adf4e45365923c16b6a6879bde5f60867":[11,4,0,5,8],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3adf4e45365923c16b6a6879bde5f60867":[13,0,0,3,1,0,2,5,8],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ae04714f90692c122e6c85e06083dbc6d":[11,4,0,5,3],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ae04714f90692c122e6c85e06083dbc6d":[13,0,0,3,1,0,2,5,3],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3af3173d4d272c9c0b5a5c9b5b027e3659":[11,4,0,5,0],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3af3173d4d272c9c0b5a5c9b5b027e3659":[13,0,0,3,1,0,2,5,0],
+"group__httpd.html":[11,4,1],
+"group__httpd.html#ga461409c8813c2a82ba63fde987c0e537":[11,4,1,11],
+"group__httpd.html#ga461409c8813c2a82ba63fde987c0e537":[13,0,0,3,1,0,3,10],
+"group__httpd.html#ga477473f7ead250fec71f1f8b9926fec5":[11,4,1,10],
+"group__httpd.html#ga477473f7ead250fec71f1f8b9926fec5":[13,0,0,3,1,0,3,9],
+"group__httpd.html#ga6cb33693ee8f0c054be82a968ceff582":[11,4,1,8],
+"group__httpd.html#ga6cb33693ee8f0c054be82a968ceff582":[13,0,0,3,1,0,3,7],
+"group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c":[11,4,1,5],
+"group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c":[13,0,0,3,1,0,3,4],
+"group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c":[13,0,0,1,1,2,4],
+"group__httpd.html#gac364305cee969a0be43c071722b136e6":[11,4,1,6],
+"group__httpd.html#gac364305cee969a0be43c071722b136e6":[13,0,0,3,1,0,3,5],
+"group__httpd.html#gac364305cee969a0be43c071722b136e6":[13,0,0,1,1,2,5],
+"group__httpd.html#gaca4357acf5c988b28123bc6f23540380":[11,4,1,9],
+"group__httpd.html#gaca4357acf5c988b28123bc6f23540380":[13,0,0,3,1,0,3,8],
+"group__httpd.html#gaca4357acf5c988b28123bc6f23540380":[13,0,0,1,1,2,7],
+"group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897":[11,4,1,4],
+"group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897":[13,0,0,3,1,0,3,3],
+"group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897":[13,0,0,1,1,2,3],
+"group__httpd.html#gaf88dacc4f18d299084cab75252001319":[11,4,1,3],
+"group__httpd.html#gaf88dacc4f18d299084cab75252001319":[13,0,0,3,1,0,3,2],
+"group__httpd.html#gafaedb1911a83854b1e9835132db64409":[11,4,1,7],
+"group__httpd.html#gafaedb1911a83854b1e9835132db64409":[13,0,0,3,1,0,3,6],
+"group__httpd.html#gafaedb1911a83854b1e9835132db64409":[13,0,0,1,1,2,6],
+"group__httpd.html#gafe011a487c5e8d03a6b2f629e14e6b5c":[11,4,1,2],
+"group__httpd.html#gafe011a487c5e8d03a6b2f629e14e6b5c":[13,0,0,3,1,0,3,1],
+"group__httpd__opts.html":[11,4,1,0],
+"group__httpd__opts.html#ga054db3f080715942967969c6ae30bb6a":[11,4,1,0,37],
+"group__httpd__opts.html#ga054db3f080715942967969c6ae30bb6a":[13,0,0,3,1,0,4,37],
+"group__httpd__opts.html#ga0bd0f9a89423fb3bbfea4e4c6141ae43":[11,4,1,0,35],
+"group__httpd__opts.html#ga0bd0f9a89423fb3bbfea4e4c6141ae43":[13,0,0,3,1,0,4,35],
+"group__httpd__opts.html#ga0d5074965efd40786182287895feb691":[11,4,1,0,20],
+"group__httpd__opts.html#ga0d5074965efd40786182287895feb691":[13,0,0,3,1,0,4,20],
+"group__httpd__opts.html#ga0ff20ebc4ab50d4aa6151c3241dacb3a":[11,4,1,0,12],
+"group__httpd__opts.html#ga0ff20ebc4ab50d4aa6151c3241dacb3a":[13,0,0,3,1,0,4,12],
+"group__httpd__opts.html#ga1ee8d7c975c7e3d1c9d9dd9b43660c79":[11,4,1,0,16],
+"group__httpd__opts.html#ga1ee8d7c975c7e3d1c9d9dd9b43660c79":[13,0,0,3,1,0,4,16],
+"group__httpd__opts.html#ga2b058c5d1bd67e5d7cb260166e3ace50":[11,4,1,0,8],
+"group__httpd__opts.html#ga2b058c5d1bd67e5d7cb260166e3ace50":[13,0,0,3,1,0,4,8],
+"group__httpd__opts.html#ga30dc71c59f3904df7daaf293f74f91f8":[13,0,0,3,1,0,4,21],
+"group__httpd__opts.html#ga30dc71c59f3904df7daaf293f74f91f8":[11,4,1,0,21],
+"group__httpd__opts.html#ga3167d52d20cf90857e2c809b92458bf0":[13,0,0,3,1,0,4,30],
+"group__httpd__opts.html#ga3167d52d20cf90857e2c809b92458bf0":[11,4,1,0,30],
+"group__httpd__opts.html#ga51cb673cb5cc362acc409f23c1e0a331":[11,4,1,0,19],
+"group__httpd__opts.html#ga51cb673cb5cc362acc409f23c1e0a331":[13,0,0,3,1,0,4,19],
+"group__httpd__opts.html#ga520858778b84d4d2fa125294c0f119e5":[13,0,0,3,1,0,4,31],
+"group__httpd__opts.html#ga520858778b84d4d2fa125294c0f119e5":[11,4,1,0,31],
+"group__httpd__opts.html#ga5f2642874f930798d975b1f7a6d2e1da":[11,4,1,0,1],
+"group__httpd__opts.html#ga5f2642874f930798d975b1f7a6d2e1da":[13,0,0,3,1,0,4,1],
+"group__httpd__opts.html#ga64dc2a10b1c2ec886e698fe9008e51e2":[11,4,1,0,2],
+"group__httpd__opts.html#ga64dc2a10b1c2ec886e698fe9008e51e2":[13,0,0,3,1,0,4,2],
+"group__httpd__opts.html#ga662e88120b507426374dd8ebbd54a048":[11,4,1,0,0],
+"group__httpd__opts.html#ga662e88120b507426374dd8ebbd54a048":[13,0,0,3,1,0,4,0],
+"group__httpd__opts.html#ga6e5de8515c89af12277e4cb011165103":[11,4,1,0,6],
+"group__httpd__opts.html#ga6e5de8515c89af12277e4cb011165103":[13,0,0,3,1,0,4,6],
+"group__httpd__opts.html#ga6f78487bc829f7f98274f1264020045e":[11,4,1,0,32],
+"group__httpd__opts.html#ga6f78487bc829f7f98274f1264020045e":[13,0,0,3,1,0,4,32],
+"group__httpd__opts.html#ga75932fc5eeb9abeddfdaf8413574c6d7":[13,0,0,3,1,0,4,17],
+"group__httpd__opts.html#ga75932fc5eeb9abeddfdaf8413574c6d7":[11,4,1,0,17],
+"group__httpd__opts.html#ga7a8f4ab787b6fb8482c8a36c9fd0c7dd":[11,4,1,0,36],
+"group__httpd__opts.html#ga7a8f4ab787b6fb8482c8a36c9fd0c7dd":[13,0,0,3,1,0,4,36],
+"group__httpd__opts.html#ga82a030ce2ecdcf741b02b7be41c012b3":[11,4,1,0,23],
+"group__httpd__opts.html#ga82a030ce2ecdcf741b02b7be41c012b3":[13,0,0,3,1,0,4,23],
+"group__httpd__opts.html#ga85ebddbc4236b1e31bfa68fa163f9b07":[11,4,1,0,33],
+"group__httpd__opts.html#ga85ebddbc4236b1e31bfa68fa163f9b07":[13,0,0,3,1,0,4,33],
+"group__httpd__opts.html#ga8dbe61a35228da0e7365a088197191b8":[11,4,1,0,25],
+"group__httpd__opts.html#ga8dbe61a35228da0e7365a088197191b8":[13,0,0,3,1,0,4,25],
+"group__httpd__opts.html#ga975961a6d22d1a077118fb85dfec809a":[11,4,1,0,29],
+"group__httpd__opts.html#ga975961a6d22d1a077118fb85dfec809a":[13,0,0,3,1,0,4,29],
+"group__httpd__opts.html#gaa27f7c5450392d10aeed033ca878cce3":[11,4,1,0,24],
+"group__httpd__opts.html#gaa27f7c5450392d10aeed033ca878cce3":[13,0,0,3,1,0,4,24],
+"group__httpd__opts.html#gaabd1f6319d04b8d5f2c93270794d5182":[11,4,1,0,10],
+"group__httpd__opts.html#gaabd1f6319d04b8d5f2c93270794d5182":[13,0,0,3,1,0,4,10],
+"group__httpd__opts.html#gaba2d4cfe4c1f5bdbe37b339084a7d466":[11,4,1,0,28],
+"group__httpd__opts.html#gaba2d4cfe4c1f5bdbe37b339084a7d466":[13,0,0,3,1,0,4,28],
+"group__httpd__opts.html#gabb13219495a813fceaafa954a238a924":[11,4,1,0,11],
+"group__httpd__opts.html#gabb13219495a813fceaafa954a238a924":[13,0,0,3,1,0,4,11],
+"group__httpd__opts.html#gaca4ef53e7a9abbd8d4bd8bc1ba7b486a":[13,0,0,3,1,0,4,22],
+"group__httpd__opts.html#gaca4ef53e7a9abbd8d4bd8bc1ba7b486a":[11,4,1,0,22],
+"group__httpd__opts.html#gacb70e0cdd30a940f8bce681c6cc63949":[13,0,0,3,1,0,4,27],
+"group__httpd__opts.html#gacb70e0cdd30a940f8bce681c6cc63949":[11,4,1,0,27],
+"group__httpd__opts.html#gacbea06ce33933e3ef2f2f1834a21cc2c":[11,4,1,0,34],
+"group__httpd__opts.html#gacbea06ce33933e3ef2f2f1834a21cc2c":[13,0,0,3,1,0,4,34],
+"group__httpd__opts.html#gacc3e7667baa2cfafd23de2b152df7a63":[11,4,1,0,5]
+};
diff --git a/doc/doxygen/output/html/navtreeindex3.js b/doc/doxygen/output/html/navtreeindex3.js
new file mode 100644
index 0000000..56aa77b
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex3.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX3 =
+{
+"group__httpd__opts.html#gacc3e7667baa2cfafd23de2b152df7a63":[13,0,0,3,1,0,4,5],
+"group__httpd__opts.html#gad3960bf65731bd0f1341867664afe860":[13,0,0,3,1,0,4,14],
+"group__httpd__opts.html#gad3960bf65731bd0f1341867664afe860":[11,4,1,0,14],
+"group__httpd__opts.html#gad68e8e06ea4c2be1b3508e813a49f7cc":[11,4,1,0,3],
+"group__httpd__opts.html#gad68e8e06ea4c2be1b3508e813a49f7cc":[13,0,0,3,1,0,4,3],
+"group__httpd__opts.html#gad92e78e19fd3ab2af42750e83ed73fd5":[13,0,0,3,1,0,4,4],
+"group__httpd__opts.html#gad92e78e19fd3ab2af42750e83ed73fd5":[11,4,1,0,4],
+"group__httpd__opts.html#gadadb70f5663cdf004bf879e3b5d326bd":[13,0,0,3,1,0,4,15],
+"group__httpd__opts.html#gadadb70f5663cdf004bf879e3b5d326bd":[11,4,1,0,15],
+"group__httpd__opts.html#gaedd0fa3d356170d8ca3557acb410fd7c":[11,4,1,0,18],
+"group__httpd__opts.html#gaedd0fa3d356170d8ca3557acb410fd7c":[13,0,0,3,1,0,4,18],
+"group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0":[13,0,0,3,1,0,4,26],
+"group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0":[11,4,1,0,26],
+"group__httpd__opts.html#gafb2115e763ed3163a3e204a0ba53edb9":[11,4,1,0,7],
+"group__httpd__opts.html#gafb2115e763ed3163a3e204a0ba53edb9":[13,0,0,3,1,0,4,7],
+"group__httpd__opts.html#gafb28f7c5fee75f013a199d427452372c":[11,4,1,0,13],
+"group__httpd__opts.html#gafb28f7c5fee75f013a199d427452372c":[13,0,0,3,1,0,4,13],
+"group__httpd__opts.html#gaffe653b08bf5ba25b276c655f6813441":[11,4,1,0,9],
+"group__httpd__opts.html#gaffe653b08bf5ba25b276c655f6813441":[13,0,0,3,1,0,4,9],
+"group__iana.html":[11,1,4],
+"group__iana.html#ga3d2bbfcb56c8adf3be8c8d12868cecfe":[11,1,4,0],
+"group__iana.html#ga3d2bbfcb56c8adf3be8c8d12868cecfe":[13,0,0,3,1,2,6,0],
+"group__iana.html#gac9396d90585e49e9a287179bf5aa9ba0":[11,1,4,1],
+"group__iana.html#gac9396d90585e49e9a287179bf5aa9ba0":[13,0,0,3,1,2,6,1],
+"group__iana.html#gga3d2bbfcb56c8adf3be8c8d12868cecfea89e82e6ac55811bb26fe66ec029f2a0c":[11,1,4,0,0],
+"group__iana.html#gga3d2bbfcb56c8adf3be8c8d12868cecfea89e82e6ac55811bb26fe66ec029f2a0c":[13,0,0,3,1,2,6,0,0],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22":[11,1,4,1,11],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22":[13,0,0,3,1,2,6,1,11],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618":[11,1,4,1,4],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618":[13,0,0,3,1,2,6,1,4],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb":[11,1,4,1,5],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb":[13,0,0,3,1,2,6,1,5],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050":[11,1,4,1,3],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050":[13,0,0,3,1,2,6,1,3],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a839da325f45916d7b27d53d5e5e97dc6":[11,1,4,1,12],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a839da325f45916d7b27d53d5e5e97dc6":[13,0,0,3,1,2,6,1,12],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a88f8872246977c6e24c617266ada1a3b":[11,1,4,1,10],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a88f8872246977c6e24c617266ada1a3b":[13,0,0,3,1,2,6,1,10],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a9fcae1f16758e1ac35dab343fc897f40":[11,1,4,1,2],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a9fcae1f16758e1ac35dab343fc897f40":[13,0,0,3,1,2,6,1,2],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601":[11,1,4,1,13],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601":[13,0,0,3,1,2,6,1,13],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ac70ae96c985cf3660e26aa496094916d":[11,1,4,1,1],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ac70ae96c985cf3660e26aa496094916d":[13,0,0,3,1,2,6,1,1],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88":[11,1,4,1,9],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88":[13,0,0,3,1,2,6,1,9],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae1cf6eaab024b31aff5bf407d38e0ede":[11,1,4,1,6],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae1cf6eaab024b31aff5bf407d38e0ede":[13,0,0,3,1,2,6,1,6],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae2645895203ca3c54005afad053a813c":[11,1,4,1,0],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae2645895203ca3c54005afad053a813c":[13,0,0,3,1,2,6,1,0],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aeb10a37f0c48e053b138f65b843c45d3":[11,1,4,1,7],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aeb10a37f0c48e053b138f65b843c45d3":[13,0,0,3,1,2,6,1,7],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aff60c0d3e8eca210b7e4faca3491f4a8":[11,1,4,1,8],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aff60c0d3e8eca210b7e4faca3491f4a8":[13,0,0,3,1,2,6,1,8],
+"group__ieee.html":[11,1,5],
+"group__ieee.html#gab3a7b97666b100584972d158acbbd1f4":[11,1,5,0],
+"group__ieee.html#gab3a7b97666b100584972d158acbbd1f4":[13,0,0,3,1,2,9,0],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a02eab0dd87f222a2d555ca38b1b8afcc":[11,1,5,0,11],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a02eab0dd87f222a2d555ca38b1b8afcc":[13,0,0,3,1,2,9,0,11],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a14292184cb41b279249319896d0e2b1f":[11,1,5,0,3],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a14292184cb41b279249319896d0e2b1f":[13,0,0,3,1,2,9,0,3],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a2511e8a31961bd742363b11b274b9dd1":[11,1,5,0,8],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a2511e8a31961bd742363b11b274b9dd1":[13,0,0,3,1,2,9,0,8],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a39a18006412cbb57536535bd9d378394":[11,1,5,0,15],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a39a18006412cbb57536535bd9d378394":[13,0,0,3,1,2,9,0,15],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a41217db03576ea59c44b28b248c39be5":[11,1,5,0,1],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a41217db03576ea59c44b28b248c39be5":[13,0,0,3,1,2,9,0,1],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a5085a5fd5f9c9506124e93ea43ad2d7c":[11,1,5,0,10],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a5085a5fd5f9c9506124e93ea43ad2d7c":[13,0,0,3,1,2,9,0,10],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a530a30feb9b87fd993da2bf83776cf9b":[11,1,5,0,2],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a530a30feb9b87fd993da2bf83776cf9b":[13,0,0,3,1,2,9,0,2],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a58c6f40d7cc3edb9455762938f3f6569":[11,1,5,0,6],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a58c6f40d7cc3edb9455762938f3f6569":[13,0,0,3,1,2,9,0,6],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a889eb8f716238d16ee3408f16a5cf19d":[11,1,5,0,9],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a889eb8f716238d16ee3408f16a5cf19d":[13,0,0,3,1,2,9,0,9],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a8c0e8f68b90134eb4f1f17d3d2eb6f8c":[11,1,5,0,7],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a8c0e8f68b90134eb4f1f17d3d2eb6f8c":[13,0,0,3,1,2,9,0,7],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aa3e9e834eef932d073028e28eb8793dc":[11,1,5,0,14],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aa3e9e834eef932d073028e28eb8793dc":[13,0,0,3,1,2,9,0,14],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aab26004eed559217be5dd466a79b1383":[11,1,5,0,5],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aab26004eed559217be5dd466a79b1383":[13,0,0,3,1,2,9,0,5],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ab93419f8edf5692e91629ab92fce8a14":[11,1,5,0,12],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ab93419f8edf5692e91629ab92fce8a14":[13,0,0,3,1,2,9,0,12],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ac95756b20fde70b868ef4185dd221c79":[11,1,5,0,0],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ac95756b20fde70b868ef4185dd221c79":[13,0,0,3,1,2,9,0,0],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad36caec44d8db59ff433a8bd3e92ad3e":[11,1,5,0,13],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad36caec44d8db59ff433a8bd3e92ad3e":[13,0,0,3,1,2,9,0,13],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad8f84826d52d92ac24a477d1f03e7903":[11,1,5,0,4],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad8f84826d52d92ac24a477d1f03e7903":[13,0,0,3,1,2,9,0,4],
+"group__if__api.html":[11,2,2,0],
+"group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be":[13,0,0,3,1,20,1],
+"group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be":[13,0,0,0,3,1],
+"group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be":[11,2,2,0,1],
+"group__if__api.html#gac68ad9ef70eb869525e0a1cc818f056b":[13,0,0,3,1,20,0],
+"group__if__api.html#gac68ad9ef70eb869525e0a1cc818f056b":[13,0,0,0,3,0],
+"group__if__api.html#gac68ad9ef70eb869525e0a1cc818f056b":[11,2,2,0,0],
+"group__igmp.html":[11,2,0,2,0,2],
+"group__igmp.html#ga21c572ba7481ca41eb873923a5346544":[13,0,0,2,0,4,4],
+"group__igmp.html#ga21c572ba7481ca41eb873923a5346544":[11,2,0,2,0,2,3],
+"group__igmp.html#ga21c572ba7481ca41eb873923a5346544":[13,0,0,3,1,21,6],
+"group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201":[13,0,0,2,0,4,5],
+"group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201":[11,2,0,2,0,2,4],
+"group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201":[13,0,0,3,1,21,7],
+"group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6":[13,0,0,2,0,4,3],
+"group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6":[11,2,0,2,0,2,2],
+"group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6":[13,0,0,3,1,21,5],
+"group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6":[13,0,0,2,0,4,2],
+"group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6":[11,2,0,2,0,2,1],
+"group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6":[13,0,0,3,1,21,4],
+"group__igmp.html#gad990dfc5ed8b644c16cc578c876e588d":[11,2,0,2,0,2,0],
+"group__igmp.html#gad990dfc5ed8b644c16cc578c876e588d":[13,0,0,3,1,21,1],
+"group__infrastructure.html":[11,1],
+"group__infrastructure__errors.html":[11,1,3],
+"group__infrastructure__errors.html#gae2e66c7d13afc90ffecd6151680fbadc":[11,1,3,1],
+"group__infrastructure__errors.html#gae2e66c7d13afc90ffecd6151680fbadc":[13,0,0,3,1,14,1],
+"group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb":[11,1,3,0],
+"group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb":[13,0,0,3,1,14,0],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca05c91366f1b5203a5db9a241b415cd63":[11,1,3,1,2],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca05c91366f1b5203a5db9a241b415cd63":[13,0,0,3,1,14,1,2],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca13e1dd0edca8a27b6abdf1524bde7929":[11,1,3,1,5],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca13e1dd0edca8a27b6abdf1524bde7929":[13,0,0,3,1,14,1,5],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca4ebdc2aa1dbd75f927845733a3fb1f8b":[11,1,3,1,8],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca4ebdc2aa1dbd75f927845733a3fb1f8b":[13,0,0,3,1,14,1,8],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca759030525f1768a23dc086a5fd45b4e5":[11,1,3,1,14],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca759030525f1768a23dc086a5fd45b4e5":[13,0,0,3,1,14,1,14],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca7d61d90449ae6788575e8e46d5d3bbc6":[11,1,3,1,12],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca7d61d90449ae6788575e8e46d5d3bbc6":[13,0,0,3,1,14,1,12],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca8543e1d6422fed7b318d97e08dcbaa33":[11,1,3,1,10],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca8543e1d6422fed7b318d97e08dcbaa33":[13,0,0,3,1,14,1,10],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca9448893187313c0c5a502ca9a9ad1c2a":[11,1,3,1,4],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca9448893187313c0c5a502ca9a9ad1c2a":[13,0,0,3,1,14,1,4],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb":[11,1,3,1,0],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb":[13,0,0,3,1,14,1,0],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa5176d9fecf8ec43d3bc49f4e6c3f7f5":[11,1,3,1,15],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa5176d9fecf8ec43d3bc49f4e6c3f7f5":[13,0,0,3,1,14,1,15],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa9a1c5a6fdeed0aad7fe41d538482bbd":[11,1,3,1,6],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa9a1c5a6fdeed0aad7fe41d538482bbd":[13,0,0,3,1,14,1,6],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaaaeafdbf3aecc46864daa3cd829c7e05":[11,1,3,1,1],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaaaeafdbf3aecc46864daa3cd829c7e05":[13,0,0,3,1,14,1,1],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab0036c51817b5200bfe8157cc4115b27":[11,1,3,1,11],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab0036c51817b5200bfe8157cc4115b27":[13,0,0,3,1,14,1,11],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab508ce0ebdf3ca735208b00a80a45c91":[11,1,3,1,16],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab508ce0ebdf3ca735208b00a80a45c91":[13,0,0,3,1,14,1,16],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab9dcf89d46668b072192278fb907b7ad":[11,1,3,1,7],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab9dcf89d46668b072192278fb907b7ad":[13,0,0,3,1,14,1,7],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcac568baeb6407ef5e2630084ccbc34be8":[11,1,3,1,3],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcac568baeb6407ef5e2630084ccbc34be8":[13,0,0,3,1,14,1,3],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcae6f9c1e4c18ca844f7934307d4cc30e5":[11,1,3,1,9],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcae6f9c1e4c18ca844f7934307d4cc30e5":[13,0,0,3,1,14,1,9],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaf316b2c5eee4079820f7100849115142":[11,1,3,1,13],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaf316b2c5eee4079820f7100849115142":[13,0,0,3,1,14,1,13],
+"group__ip.html":[11,2,0,2],
+"group__ip.html#ga0fa3afc2c00aea346889b476650adee3":[11,2,0,2,6],
+"group__ip.html#ga0fa3afc2c00aea346889b476650adee3":[13,0,0,3,1,25,26],
+"group__ip.html#ga4a4b9439c91eeec719692dfe10f14af0":[11,2,0,2,2],
+"group__ip.html#ga4a4b9439c91eeec719692dfe10f14af0":[13,0,0,3,1,25,17],
+"group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250":[11,2,0,2,4],
+"group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250":[13,0,0,3,1,25,21],
+"group__ip.html#gab9d45f846f796bd6ce1e0c780c392765":[11,2,0,2,5],
+"group__ip.html#gab9d45f846f796bd6ce1e0c780c392765":[13,0,0,3,1,25,23],
+"group__ip.html#gaf056aa43789c2964f091f8349bb83730":[11,2,0,2,3],
+"group__ip.html#gaf056aa43789c2964f091f8349bb83730":[13,0,0,3,1,25,19],
+"group__ip4.html":[11,2,0,2,0],
+"group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420":[11,2,0,2,0,3],
+"group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420":[13,0,0,2,0,5,10],
+"group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420":[13,0,0,3,1,26,9],
+"group__ip4addr.html":[11,1,0,0],
+"group__ip4addr.html#ga09c62e8a3bf599aa7f335e0ad0820e85":[13,0,0,3,1,33,19],
+"group__ip4addr.html#ga09c62e8a3bf599aa7f335e0ad0820e85":[11,1,0,0,8],
+"group__ip4addr.html#ga1eaffd17b4b3c56cc91a6d516e18118f":[13,0,0,3,1,33,46],
+"group__ip4addr.html#ga1eaffd17b4b3c56cc91a6d516e18118f":[11,1,0,0,13],
+"group__ip4addr.html#ga3e5e67b7292b156034560fef2202776c":[13,0,0,3,1,33,11],
+"group__ip4addr.html#ga3e5e67b7292b156034560fef2202776c":[11,1,0,0,5],
+"group__ip4addr.html#ga55cc3896c46564bd2941ee5806fe1e11":[13,0,0,3,1,33,47],
+"group__ip4addr.html#ga55cc3896c46564bd2941ee5806fe1e11":[11,1,0,0,14],
+"group__ip4addr.html#ga5efdf55ba72c2b1b5755b1fc6f559a1a":[13,0,0,3,1,33,3],
+"group__ip4addr.html#ga5efdf55ba72c2b1b5755b1fc6f559a1a":[11,1,0,0,2],
+"group__ip4addr.html#ga624b5010ccc04cc3d0de2acce44f1c9e":[13,0,0,3,1,33,33],
+"group__ip4addr.html#ga624b5010ccc04cc3d0de2acce44f1c9e":[11,1,0,0,10],
+"group__ip4addr.html#ga971516589980428bf51f37cefa4ddf66":[13,0,0,3,1,33,32],
+"group__ip4addr.html#ga971516589980428bf51f37cefa4ddf66":[11,1,0,0,9],
+"group__ip4addr.html#gaa3f65a42b68149e96e618600b2ca2e42":[13,0,0,3,1,33,2],
+"group__ip4addr.html#gaa3f65a42b68149e96e618600b2ca2e42":[11,1,0,0,1],
+"group__ip4addr.html#gab1a059f07bd9c50aa58447d963b823a1":[13,0,0,3,1,33,43],
+"group__ip4addr.html#gab1a059f07bd9c50aa58447d963b823a1":[11,1,0,0,12],
+"group__ip4addr.html#gabee5dab2191bb0f3355d7f30d1496f24":[13,0,0,3,1,33,42],
+"group__ip4addr.html#gabee5dab2191bb0f3355d7f30d1496f24":[11,1,0,0,11],
+"group__ip4addr.html#gad546955e48dada78b552375b873f6986":[13,0,0,3,1,33,12],
+"group__ip4addr.html#gad546955e48dada78b552375b873f6986":[11,1,0,0,6],
+"group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03":[13,0,0,3,1,33,6],
+"group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03":[11,1,0,0,3],
+"group__ip4addr.html#gadd2203c6cbfb6de8c2d9ce5bbfb2bd2a":[13,0,0,3,1,33,8],
+"group__ip4addr.html#gadd2203c6cbfb6de8c2d9ce5bbfb2bd2a":[11,1,0,0,4],
+"group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff":[13,0,0,3,1,33,1],
+"group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff":[11,1,0,0,0],
+"group__ip4addr.html#gaef063b2e975dae7ecf398770b04b14af":[13,0,0,3,1,33,16],
+"group__ip4addr.html#gaef063b2e975dae7ecf398770b04b14af":[11,1,0,0,7],
+"group__ip6.html":[11,2,0,2,1],
+"group__ip6.html#ga540ad82e2af4c4709f1852e63c36706a":[13,0,0,2,1,4,6],
+"group__ip6.html#ga540ad82e2af4c4709f1852e63c36706a":[11,2,0,2,1,3],
+"group__ip6.html#ga540ad82e2af4c4709f1852e63c36706a":[13,0,0,3,1,29,6],
+"group__ip6__zones.html":[11,2,0,2,1,2],
+"group__ip6__zones.html#ga1040a3d67498a1ef617bda8d9e0ba3a5":[11,2,0,2,1,2,0],
+"group__ip6__zones.html#ga1040a3d67498a1ef617bda8d9e0ba3a5":[13,0,0,3,1,32,0],
+"group__ip6__zones.html#ga1993c4b6a297b6e92d80a9ce46ddedfe":[11,2,0,2,1,2,15],
+"group__ip6__zones.html#ga1993c4b6a297b6e92d80a9ce46ddedfe":[13,0,0,3,1,32,15],
+"group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb":[11,2,0,2,1,2,12],
+"group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb":[13,0,0,3,1,32,12],
+"group__ip6__zones.html#ga213310b303dd050da7856d67da72abd6":[11,2,0,2,1,2,9],
+"group__ip6__zones.html#ga213310b303dd050da7856d67da72abd6":[13,0,0,3,1,32,9],
+"group__ip6__zones.html#ga7347729485d837bcff85ae4731bbf5c4":[11,2,0,2,1,2,3],
+"group__ip6__zones.html#ga7347729485d837bcff85ae4731bbf5c4":[13,0,0,3,1,32,3],
+"group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78":[11,2,0,2,1,2,6],
+"group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78":[13,0,0,3,1,32,6],
+"group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9":[11,2,0,2,1,2,13],
+"group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9":[13,0,0,3,1,32,13],
+"group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90":[11,2,0,2,1,2,5],
+"group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90":[13,0,0,3,1,32,5],
+"group__ip6__zones.html#gac3ec5f94e1cd62b1237efca3723dc06e":[11,2,0,2,1,2,10],
+"group__ip6__zones.html#gac3ec5f94e1cd62b1237efca3723dc06e":[13,0,0,3,1,32,10],
+"group__ip6__zones.html#gac83f3e7c8d65d3c784bffc9dec29b70c":[11,2,0,2,1,2,8],
+"group__ip6__zones.html#gac83f3e7c8d65d3c784bffc9dec29b70c":[13,0,0,3,1,32,8],
+"group__ip6__zones.html#gacbb8e1a7505d9772181defa0e75b8da9":[11,2,0,2,1,2,2],
+"group__ip6__zones.html#gacbb8e1a7505d9772181defa0e75b8da9":[13,0,0,3,1,32,2],
+"group__ip6__zones.html#gad963bf3e9695ba898271e314975f5c97":[11,2,0,2,1,2,7],
+"group__ip6__zones.html#gad963bf3e9695ba898271e314975f5c97":[13,0,0,3,1,32,7],
+"group__ip6__zones.html#gae0249db6cd2687f2dbc445e7778d37ad":[11,2,0,2,1,2,1],
+"group__ip6__zones.html#gae0249db6cd2687f2dbc445e7778d37ad":[13,0,0,3,1,32,1],
+"group__ip6__zones.html#gae677a65970f4b667156b256dd9a4924b":[11,2,0,2,1,2,14],
+"group__ip6__zones.html#gae677a65970f4b667156b256dd9a4924b":[13,0,0,3,1,32,14],
+"group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634":[11,2,0,2,1,2,11],
+"group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634":[13,0,0,3,1,32,11],
+"group__ip6__zones.html#gaeead8379cc3fd4c257be0bb654994a8f":[11,2,0,2,1,2,4],
+"group__ip6__zones.html#gaeead8379cc3fd4c257be0bb654994a8f":[13,0,0,3,1,32,4],
+"group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfea70cda997b66f3e120e925c5a41904809":[11,2,0,2,1,2,15,2],
+"group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfea70cda997b66f3e120e925c5a41904809":[13,0,0,3,1,32,15,2],
+"group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0":[11,2,0,2,1,2,15,1],
+"group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0":[13,0,0,3,1,32,15,1],
+"group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8":[11,2,0,2,1,2,15,0],
+"group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8":[13,0,0,3,1,32,15,0],
+"group__ip6addr.html":[11,1,0,1],
+"group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd":[13,0,0,3,1,33,7],
+"group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd":[11,1,0,1,2],
+"group__ip6addr.html#ga1266e500b1db0b7cdc4b269cace49746":[13,0,0,3,1,33,48],
+"group__ip6addr.html#ga1266e500b1db0b7cdc4b269cace49746":[11,1,0,1,10],
+"group__ip6addr.html#ga130ca0907497831677c130dbb3289e1e":[13,0,0,3,1,33,18],
+"group__ip6addr.html#ga130ca0907497831677c130dbb3289e1e":[11,1,0,1,6],
+"group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d":[13,0,0,3,1,33,45],
+"group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d":[11,1,0,1,9],
+"group__ip6addr.html#ga5181d2cb6b9254eb5ad4137f7b3635a0":[13,0,0,3,1,33,4]
+};
diff --git a/doc/doxygen/output/html/navtreeindex4.js b/doc/doxygen/output/html/navtreeindex4.js
new file mode 100644
index 0000000..e813f50
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex4.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX4 =
+{
+"group__ip6addr.html#ga5181d2cb6b9254eb5ad4137f7b3635a0":[11,1,0,1,0],
+"group__ip6addr.html#ga953cdd2592764ba2e6e021aea350ad43":[13,0,0,3,1,33,5],
+"group__ip6addr.html#ga953cdd2592764ba2e6e021aea350ad43":[11,1,0,1,1],
+"group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d":[13,0,0,3,1,33,44],
+"group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d":[11,1,0,1,8],
+"group__ip6addr.html#ga9ee53b601b89dcb517496ba0bccf9bd0":[13,0,0,3,1,33,9],
+"group__ip6addr.html#ga9ee53b601b89dcb517496ba0bccf9bd0":[11,1,0,1,3],
+"group__ip6addr.html#gabe6f7908ce8a91dc587e2ebc2172e651":[13,0,0,3,1,33,17],
+"group__ip6addr.html#gabe6f7908ce8a91dc587e2ebc2172e651":[11,1,0,1,5],
+"group__ip6addr.html#gabfb1ce44d6a8791336bf3ac06aa086ca":[13,0,0,3,1,33,10],
+"group__ip6addr.html#gabfb1ce44d6a8791336bf3ac06aa086ca":[11,1,0,1,4],
+"group__ip6addr.html#gadaff748da2b808995993dd3db5420f08":[13,0,0,3,1,33,49],
+"group__ip6addr.html#gadaff748da2b808995993dd3db5420f08":[11,1,0,1,11],
+"group__ip6addr.html#gafb3a0e5241683aff573e195f31ba8845":[13,0,0,3,1,33,39],
+"group__ip6addr.html#gafb3a0e5241683aff573e195f31ba8845":[11,1,0,1,7],
+"group__ipaddr.html":[11,1,0],
+"group__ipaddr.html#ga008c9c92d770cc030ea054e6b259835a":[13,0,0,3,1,33,13],
+"group__ipaddr.html#ga008c9c92d770cc030ea054e6b259835a":[11,1,0,4],
+"group__ipaddr.html#ga0fc8bf6662809274750868683b3a422e":[11,1,0,12],
+"group__ipaddr.html#ga0fc8bf6662809274750868683b3a422e":[13,0,0,3,1,33,25],
+"group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a":[11,1,0,28],
+"group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a":[13,0,0,3,1,33,53],
+"group__ipaddr.html#ga2170d3ee13dd22722222228e7b1c5752":[11,1,0,13],
+"group__ipaddr.html#ga2170d3ee13dd22722222228e7b1c5752":[13,0,0,3,1,33,26],
+"group__ipaddr.html#ga23b580930c0eb1d0fdeba2b109c077a5":[11,1,0,25],
+"group__ipaddr.html#ga23b580930c0eb1d0fdeba2b109c077a5":[13,0,0,3,1,33,50],
+"group__ipaddr.html#ga279118890e6a90aa740051fb8b0cc5f4":[11,1,0,8],
+"group__ipaddr.html#ga279118890e6a90aa740051fb8b0cc5f4":[13,0,0,3,1,33,21],
+"group__ipaddr.html#ga33bc079baaf513a9a7381b9531a1f653":[11,1,0,11],
+"group__ipaddr.html#ga33bc079baaf513a9a7381b9531a1f653":[13,0,0,3,1,33,24],
+"group__ipaddr.html#ga3528798be1d2f1ec6a6bccd35694edce":[11,1,0,18],
+"group__ipaddr.html#ga3528798be1d2f1ec6a6bccd35694edce":[13,0,0,3,1,33,31],
+"group__ipaddr.html#ga3684dabc0cae597ffb5b51d41f1d886f":[13,0,0,2,9,3],
+"group__ipaddr.html#ga3684dabc0cae597ffb5b51d41f1d886f":[11,1,0,32],
+"group__ipaddr.html#ga3684dabc0cae597ffb5b51d41f1d886f":[13,0,0,3,1,33,57],
+"group__ipaddr.html#ga3a2123f0bbf6fe843c8542e349c680eb":[11,1,0,14],
+"group__ipaddr.html#ga3a2123f0bbf6fe843c8542e349c680eb":[13,0,0,3,1,33,27],
+"group__ipaddr.html#ga40db7feae2b92f7a7a01d65a85b06e18":[11,1,0,15],
+"group__ipaddr.html#ga40db7feae2b92f7a7a01d65a85b06e18":[13,0,0,3,1,33,28],
+"group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151":[11,1,0,30],
+"group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151":[13,0,0,2,9,1],
+"group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151":[13,0,0,3,1,33,55],
+"group__ipaddr.html#ga66b5a64b12128e3716bcf04ff91b5a57":[11,1,0,27],
+"group__ipaddr.html#ga66b5a64b12128e3716bcf04ff91b5a57":[13,0,0,3,1,33,52],
+"group__ipaddr.html#ga77a933975db287f6aa5c2e70249ba18f":[13,0,0,3,1,33,15],
+"group__ipaddr.html#ga77a933975db287f6aa5c2e70249ba18f":[11,1,0,6],
+"group__ipaddr.html#ga83b17dbf7d1faf5c8f8c20b039db8bb8":[11,1,0,24],
+"group__ipaddr.html#ga83b17dbf7d1faf5c8f8c20b039db8bb8":[13,0,0,3,1,33,41],
+"group__ipaddr.html#ga8619278bcbf705844f584f36972fc758":[11,1,0,26],
+"group__ipaddr.html#ga8619278bcbf705844f584f36972fc758":[13,0,0,3,1,33,51],
+"group__ipaddr.html#ga8853fce54b1816dca3af90b48677e673":[11,1,0,16],
+"group__ipaddr.html#ga8853fce54b1816dca3af90b48677e673":[13,0,0,3,1,33,29],
+"group__ipaddr.html#ga8f9d56ac85cd87338a1823e4a58ba1da":[11,1,0,20],
+"group__ipaddr.html#ga8f9d56ac85cd87338a1823e4a58ba1da":[13,0,0,3,1,33,35],
+"group__ipaddr.html#ga93c7bf3f7487495472aa0f9b5fc25d1a":[11,1,0,17],
+"group__ipaddr.html#ga93c7bf3f7487495472aa0f9b5fc25d1a":[13,0,0,3,1,33,30],
+"group__ipaddr.html#gaa3345706e3aa8b32dd630c195b053e75":[11,1,0,10],
+"group__ipaddr.html#gaa3345706e3aa8b32dd630c195b053e75":[13,0,0,3,1,33,23],
+"group__ipaddr.html#gaae7edb585c062ae03bfbd3af7bf671bc":[11,1,0,22],
+"group__ipaddr.html#gaae7edb585c062ae03bfbd3af7bf671bc":[13,0,0,3,1,33,37],
+"group__ipaddr.html#gab5c5540ea05227bdd9207a47304bb2c1":[11,1,0,7],
+"group__ipaddr.html#gab5c5540ea05227bdd9207a47304bb2c1":[13,0,0,3,1,33,20],
+"group__ipaddr.html#gabe43b154533b73585c4e58f568370ede":[11,1,0,23],
+"group__ipaddr.html#gabe43b154533b73585c4e58f568370ede":[13,0,0,3,1,33,40],
+"group__ipaddr.html#gac1c5f897bbee217771b1a6ba18733042":[11,1,0,21],
+"group__ipaddr.html#gac1c5f897bbee217771b1a6ba18733042":[13,0,0,3,1,33,36],
+"group__ipaddr.html#gacd8f5aa151cff966fd28368b85f38c05":[11,1,0,9],
+"group__ipaddr.html#gacd8f5aa151cff966fd28368b85f38c05":[13,0,0,3,1,33,22],
+"group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1":[11,1,0,31],
+"group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1":[13,0,0,2,9,2],
+"group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1":[13,0,0,3,1,33,56],
+"group__ipaddr.html#gadb66f6d5fa926ed4b0e69db58dffcbe4":[13,0,0,3,1,33,14],
+"group__ipaddr.html#gadb66f6d5fa926ed4b0e69db58dffcbe4":[11,1,0,5],
+"group__ipaddr.html#gae5f26df8f5099f330ad1e506c74f06f7":[13,0,0,3,1,33,0],
+"group__ipaddr.html#gae5f26df8f5099f330ad1e506c74f06f7":[11,1,0,3],
+"group__ipaddr.html#gaea5e4795598bc33fa2db1773c8e6fbac":[11,1,0,19],
+"group__ipaddr.html#gaea5e4795598bc33fa2db1773c8e6fbac":[13,0,0,3,1,33,34],
+"group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c":[11,1,0,29],
+"group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c":[13,0,0,3,1,33,54],
+"group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02":[11,1,0,29,1],
+"group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02":[13,0,0,3,1,33,54,1],
+"group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e":[11,1,0,29,2],
+"group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e":[13,0,0,3,1,33,54,2],
+"group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049":[11,1,0,29,0],
+"group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049":[13,0,0,3,1,33,54,0],
+"group__iperf.html":[11,4,2],
+"group__iperf.html#ga85a487cf8ecbd0999382c9bff375d0da":[11,4,2,2],
+"group__iperf.html#ga85a487cf8ecbd0999382c9bff375d0da":[13,0,0,3,1,0,5,5],
+"group__iperf.html#ga85a487cf8ecbd0999382c9bff375d0da":[13,0,0,1,2,0,9],
+"group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004":[11,4,2,0],
+"group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004":[13,0,0,3,1,0,5,3],
+"group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004":[13,0,0,1,2,0,7],
+"group__iperf.html#gad8317f52289d8bb12a14627cd177a565":[11,4,2,1],
+"group__iperf.html#gad8317f52289d8bb12a14627cd177a565":[13,0,0,3,1,0,5,4],
+"group__iperf.html#gad8317f52289d8bb12a14627cd177a565":[13,0,0,1,2,0,8],
+"group__iperf.html#gad97bf77057e7f96d6d8def812deea202":[11,4,2,3],
+"group__iperf.html#gad97bf77057e7f96d6d8def812deea202":[13,0,0,3,1,0,5,6],
+"group__iperf.html#gad97bf77057e7f96d6d8def812deea202":[13,0,0,1,2,0,10],
+"group__iperf.html#gae1f30a02b86c4dd3d47810cd493baf26":[11,4,2,4],
+"group__iperf.html#gae1f30a02b86c4dd3d47810cd493baf26":[13,0,0,3,1,0,5,7],
+"group__iperf.html#gae1f30a02b86c4dd3d47810cd493baf26":[13,0,0,1,2,0,11],
+"group__lwip.html":[11,0],
+"group__lwip__assertions.html":[11,0,4,0,0],
+"group__lwip__assertions.html#ga71b7787802abbfc2218fb1f39f948a41":[13,0,0,3,1,9,11],
+"group__lwip__assertions.html#ga71b7787802abbfc2218fb1f39f948a41":[11,0,4,0,0,0],
+"group__lwip__nosys.html":[11,0,0],
+"group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9":[13,0,0,2,8,0],
+"group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9":[11,0,0,2],
+"group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9":[13,0,0,3,1,24,8],
+"group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26":[13,0,0,2,9,0],
+"group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26":[11,0,0,1],
+"group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26":[13,0,0,3,1,25,29],
+"group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385":[13,0,0,2,12,10],
+"group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385":[11,0,0,3],
+"group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385":[13,0,0,3,1,40,62],
+"group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff":[11,0,0,0],
+"group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff":[13,0,0,3,2,3,1],
+"group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff":[13,0,0,4,3,0],
+"group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883":[13,0,0,3,1,52,4],
+"group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883":[13,0,0,2,20,0],
+"group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883":[11,0,0,4],
+"group__lwip__opts.html":[11,0,4],
+"group__lwip__opts__arp.html":[11,0,4,4,0],
+"group__lwip__opts__arp.html#ga29f41a6ebdbb23f46688d381b3609fd1":[11,0,4,4,0,1],
+"group__lwip__opts__arp.html#ga29f41a6ebdbb23f46688d381b3609fd1":[13,0,0,3,1,42,3],
+"group__lwip__opts__arp.html#ga2f762eee309a545650f80fc8dcc19084":[11,0,4,4,0,7],
+"group__lwip__opts__arp.html#ga2f762eee309a545650f80fc8dcc19084":[13,0,0,3,1,42,40],
+"group__lwip__opts__arp.html#ga30e02dc217cc2995d0fd241d510c904f":[11,0,4,4,0,9],
+"group__lwip__opts__arp.html#ga30e02dc217cc2995d0fd241d510c904f":[13,0,0,3,1,42,92],
+"group__lwip__opts__arp.html#ga4675829464156f3d665f4de171c212d7":[11,0,4,4,0,5],
+"group__lwip__opts__arp.html#ga4675829464156f3d665f4de171c212d7":[13,0,0,3,1,42,38],
+"group__lwip__opts__arp.html#ga70ce0ecf56cf5fab000134e66d863f90":[11,0,4,4,0,6],
+"group__lwip__opts__arp.html#ga70ce0ecf56cf5fab000134e66d863f90":[13,0,0,3,1,42,39],
+"group__lwip__opts__arp.html#ga741a0710dc126ed3ae9e305472df3432":[11,0,4,4,0,0],
+"group__lwip__opts__arp.html#ga741a0710dc126ed3ae9e305472df3432":[13,0,0,3,1,42,2],
+"group__lwip__opts__arp.html#ga75837814536af29b6102508588d0ab58":[11,0,4,4,0,2],
+"group__lwip__opts__arp.html#ga75837814536af29b6102508588d0ab58":[13,0,0,3,1,42,4],
+"group__lwip__opts__arp.html#ga924936a814564dbdb0bc950d255a83b9":[11,0,4,4,0,3],
+"group__lwip__opts__arp.html#ga924936a814564dbdb0bc950d255a83b9":[13,0,0,3,1,42,5],
+"group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87":[11,0,4,4,0,8],
+"group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87":[13,0,0,3,1,42,70],
+"group__lwip__opts__arp.html#gad7fa3b356ca7e603e848b069c4cc6276":[11,0,4,4,0,4],
+"group__lwip__opts__arp.html#gad7fa3b356ca7e603e848b069c4cc6276":[13,0,0,3,1,42,35],
+"group__lwip__opts__autoip.html":[11,0,4,4,3],
+"group__lwip__opts__autoip.html#ga1a91e18dbb9777bc6e3963f52cb5f9fe":[11,0,4,4,3,1],
+"group__lwip__opts__autoip.html#ga1a91e18dbb9777bc6e3963f52cb5f9fe":[13,0,0,3,1,42,83],
+"group__lwip__opts__autoip.html#ga4ff3f941b4c71a04b0c30fbee5b198c2":[11,0,4,4,3,2],
+"group__lwip__opts__autoip.html#ga4ff3f941b4c71a04b0c30fbee5b198c2":[13,0,0,3,1,42,84],
+"group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069":[11,0,4,4,3,0],
+"group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069":[13,0,0,3,1,42,72],
+"group__lwip__opts__callback.html":[11,0,4,2],
+"group__lwip__opts__checksum.html":[11,0,4,1,9],
+"group__lwip__opts__checksum.html#ga005b1b9988b84a2cb844144cef22c11e":[11,0,4,1,9,2],
+"group__lwip__opts__checksum.html#ga005b1b9988b84a2cb844144cef22c11e":[13,0,0,3,1,42,9],
+"group__lwip__opts__checksum.html#ga2291ec5bec0a551545da6d5f9f9316b2":[11,0,4,1,9,5],
+"group__lwip__opts__checksum.html#ga2291ec5bec0a551545da6d5f9f9316b2":[13,0,0,3,1,42,12],
+"group__lwip__opts__checksum.html#ga3ecc5246a0c6ca5aed56c2d7899c1004":[11,0,4,1,9,10],
+"group__lwip__opts__checksum.html#ga3ecc5246a0c6ca5aed56c2d7899c1004":[13,0,0,3,1,42,74],
+"group__lwip__opts__checksum.html#ga6747f7b72abe544fd4dc184cc7fcad37":[13,0,0,3,1,42,11],
+"group__lwip__opts__checksum.html#ga6747f7b72abe544fd4dc184cc7fcad37":[11,0,4,1,9,4],
+"group__lwip__opts__checksum.html#ga79807171be8c20b69a5cd8de83566d25":[11,0,4,1,9,0],
+"group__lwip__opts__checksum.html#ga79807171be8c20b69a5cd8de83566d25":[13,0,0,3,1,42,7],
+"group__lwip__opts__checksum.html#ga7cd47a55af03b1048c5a4a5fe0e76013":[11,0,4,1,9,6],
+"group__lwip__opts__checksum.html#ga7cd47a55af03b1048c5a4a5fe0e76013":[13,0,0,3,1,42,13],
+"group__lwip__opts__checksum.html#ga800069963cc4552b99235237c22f00bb":[11,0,4,1,9,8],
+"group__lwip__opts__checksum.html#ga800069963cc4552b99235237c22f00bb":[13,0,0,3,1,42,15],
+"group__lwip__opts__checksum.html#ga8ddad81fc26268a13b35091781da2265":[11,0,4,1,9,7],
+"group__lwip__opts__checksum.html#ga8ddad81fc26268a13b35091781da2265":[13,0,0,3,1,42,14],
+"group__lwip__opts__checksum.html#ga98d460f8c2baed8bf62d5473831c0b2c":[11,0,4,1,9,9],
+"group__lwip__opts__checksum.html#ga98d460f8c2baed8bf62d5473831c0b2c":[13,0,0,3,1,42,16],
+"group__lwip__opts__checksum.html#ga9f60183f0442bdbeefd6b395c6647613":[11,0,4,1,9,11],
+"group__lwip__opts__checksum.html#ga9f60183f0442bdbeefd6b395c6647613":[13,0,0,3,1,42,75],
+"group__lwip__opts__checksum.html#gab676cc29571b7ffda12336482ad97699":[11,0,4,1,9,3],
+"group__lwip__opts__checksum.html#gab676cc29571b7ffda12336482ad97699":[13,0,0,3,1,42,10],
+"group__lwip__opts__checksum.html#gaf466a10b093489910a773fd1cec74c2d":[11,0,4,1,9,1],
+"group__lwip__opts__checksum.html#gaf466a10b093489910a773fd1cec74c2d":[13,0,0,3,1,42,8],
+"group__lwip__opts__debug.html":[11,0,4,0],
+"group__lwip__opts__debugmsg.html":[11,0,4,0,2],
+"group__lwip__opts__debugmsg.html#ga0393f312c5475a1c649b39ef9cfcaad4":[11,0,4,0,2,35],
+"group__lwip__opts__debugmsg.html#ga0393f312c5475a1c649b39ef9cfcaad4":[13,0,0,3,1,42,310],
+"group__lwip__opts__debugmsg.html#ga2043f599515774f8e571ba185dbcb9e7":[11,0,4,0,2,14],
+"group__lwip__opts__debugmsg.html#ga2043f599515774f8e571ba185dbcb9e7":[13,0,0,3,1,42,77],
+"group__lwip__opts__debugmsg.html#ga24a6644ba9cc82665a7bf209b3870c15":[11,0,4,0,2,34],
+"group__lwip__opts__debugmsg.html#ga24a6644ba9cc82665a7bf209b3870c15":[13,0,0,3,1,42,309],
+"group__lwip__opts__debugmsg.html#ga2960ae20008f05da8cc0714f36365642":[11,0,4,0,2,23],
+"group__lwip__opts__debugmsg.html#ga2960ae20008f05da8cc0714f36365642":[13,0,0,3,1,42,274],
+"group__lwip__opts__debugmsg.html#ga2d7bc380695eeedb1af50c3808613afe":[11,0,4,0,2,16],
+"group__lwip__opts__debugmsg.html#ga2d7bc380695eeedb1af50c3808613afe":[13,0,0,3,1,42,211],
+"group__lwip__opts__debugmsg.html#ga2dfad02b075a7f9a8791a66fe40864a4":[11,0,4,0,2,18],
+"group__lwip__opts__debugmsg.html#ga2dfad02b075a7f9a8791a66fe40864a4":[13,0,0,3,1,42,256],
+"group__lwip__opts__debugmsg.html#ga3704f433e947d6342da77c74e33627e1":[11,0,4,0,2,32],
+"group__lwip__opts__debugmsg.html#ga3704f433e947d6342da77c74e33627e1":[13,0,0,3,1,42,302],
+"group__lwip__opts__debugmsg.html#ga37596f7bbb9b7663826244ba54486679":[11,0,4,0,2,30],
+"group__lwip__opts__debugmsg.html#ga37596f7bbb9b7663826244ba54486679":[13,0,0,3,1,42,292],
+"group__lwip__opts__debugmsg.html#ga4279d7ff9f986b2ff3eb068bb012b697":[11,0,4,0,2,2],
+"group__lwip__opts__debugmsg.html#ga4279d7ff9f986b2ff3eb068bb012b697":[13,0,0,3,1,42,1],
+"group__lwip__opts__debugmsg.html#ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33":[11,0,4,0,2,13],
+"group__lwip__opts__debugmsg.html#ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33":[13,0,0,3,1,42,57],
+"group__lwip__opts__debugmsg.html#ga4f43bb8a430c7a52a1ad5086d3f2803c":[11,0,4,0,2,25],
+"group__lwip__opts__debugmsg.html#ga4f43bb8a430c7a52a1ad5086d3f2803c":[13,0,0,3,1,42,279],
+"group__lwip__opts__debugmsg.html#ga509594f3ba7d8b1356628b50b55a0934":[11,0,4,0,2,22],
+"group__lwip__opts__debugmsg.html#ga509594f3ba7d8b1356628b50b55a0934":[13,0,0,3,1,42,273],
+"group__lwip__opts__debugmsg.html#ga52d6c83451936c3de3b0338d4a3f921f":[11,0,4,0,2,33],
+"group__lwip__opts__debugmsg.html#ga52d6c83451936c3de3b0338d4a3f921f":[13,0,0,3,1,42,304],
+"group__lwip__opts__debugmsg.html#ga5895bee26e8e1a0b89d597e0f2580b23":[11,0,4,0,2,26],
+"group__lwip__opts__debugmsg.html#ga5895bee26e8e1a0b89d597e0f2580b23":[13,0,0,3,1,42,281],
+"group__lwip__opts__debugmsg.html#ga5c3d44a0ec3bb8bd66f776c70d5c6a6c":[11,0,4,0,2,19],
+"group__lwip__opts__debugmsg.html#ga5c3d44a0ec3bb8bd66f776c70d5c6a6c":[13,0,0,3,1,42,258],
+"group__lwip__opts__debugmsg.html#ga5d3348778951e7bc5cd397c6575eef3a":[11,0,4,0,2,12],
+"group__lwip__opts__debugmsg.html#ga5d3348778951e7bc5cd397c6575eef3a":[13,0,0,3,1,42,51],
+"group__lwip__opts__debugmsg.html#ga66df03d8192cd978d3321a9d68bf5411":[11,0,4,0,2,24],
+"group__lwip__opts__debugmsg.html#ga66df03d8192cd978d3321a9d68bf5411":[13,0,0,3,1,42,278],
+"group__lwip__opts__debugmsg.html#ga671009550216f7dc03e67ba5751e3160":[11,0,4,0,2,1],
+"group__lwip__opts__debugmsg.html#ga671009550216f7dc03e67ba5751e3160":[13,0,0,3,1,42,0],
+"group__lwip__opts__debugmsg.html#ga78140cbe70258a65cb5c9e381843e4f3":[11,0,4,0,2,10],
+"group__lwip__opts__debugmsg.html#ga78140cbe70258a65cb5c9e381843e4f3":[13,0,0,3,1,42,47],
+"group__lwip__opts__debugmsg.html#ga8da07508ee75704362d45eee3eb857fa":[11,0,4,0,2,9],
+"group__lwip__opts__debugmsg.html#ga8da07508ee75704362d45eee3eb857fa":[13,0,0,3,1,42,45],
+"group__lwip__opts__debugmsg.html#ga9595904a1cb9bfe0b9b1d958abdc923a":[11,0,4,0,2,8],
+"group__lwip__opts__debugmsg.html#ga9595904a1cb9bfe0b9b1d958abdc923a":[13,0,0,3,1,42,42],
+"group__lwip__opts__debugmsg.html#ga97927ceecabcdb5f41735bf372a05cee":[11,0,4,0,2,5],
+"group__lwip__opts__debugmsg.html#ga97927ceecabcdb5f41735bf372a05cee":[13,0,0,3,1,42,25],
+"group__lwip__opts__debugmsg.html#ga9f70601fdc1feee490772bf7fcdb74fb":[11,0,4,0,2,28],
+"group__lwip__opts__debugmsg.html#ga9f70601fdc1feee490772bf7fcdb74fb":[13,0,0,3,1,42,288],
+"group__lwip__opts__debugmsg.html#gab986f95183559d8678c6d80969b01857":[11,0,4,0,2,21],
+"group__lwip__opts__debugmsg.html#gab986f95183559d8678c6d80969b01857":[13,0,0,3,1,42,266],
+"group__lwip__opts__debugmsg.html#gaba55da2352c99d813767913e5e36be1f":[11,0,4,0,2,6],
+"group__lwip__opts__debugmsg.html#gaba55da2352c99d813767913e5e36be1f":[13,0,0,3,1,42,27],
+"group__lwip__opts__debugmsg.html#gabff5d1e0b334f5b45bd2b8bbb675411e":[13,0,0,3,1,42,36],
+"group__lwip__opts__debugmsg.html#gabff5d1e0b334f5b45bd2b8bbb675411e":[11,0,4,0,2,7],
+"group__lwip__opts__debugmsg.html#gac095d0e53f5eb5b326b2cccfd071d93d":[11,0,4,0,2,15],
+"group__lwip__opts__debugmsg.html#gac095d0e53f5eb5b326b2cccfd071d93d":[13,0,0,3,1,42,78],
+"group__lwip__opts__debugmsg.html#gac2f9726756b78d4d7c425b0422a776ce":[13,0,0,3,1,42,48],
+"group__lwip__opts__debugmsg.html#gac2f9726756b78d4d7c425b0422a776ce":[11,0,4,0,2,11],
+"group__lwip__opts__debugmsg.html#gacfc11be8b3bf6bb55e3e5c39ea8802d1":[11,0,4,0,2,4],
+"group__lwip__opts__debugmsg.html#gacfc11be8b3bf6bb55e3e5c39ea8802d1":[13,0,0,3,1,42,24],
+"group__lwip__opts__debugmsg.html#gad6e52e37415d0d0cbe4931a28f5a9662":[11,0,4,0,2,31],
+"group__lwip__opts__debugmsg.html#gad6e52e37415d0d0cbe4931a28f5a9662":[13,0,0,3,1,42,293],
+"group__lwip__opts__debugmsg.html#gad80231923f7a808d49eba5ec57d63616":[11,0,4,0,2,17],
+"group__lwip__opts__debugmsg.html#gad80231923f7a808d49eba5ec57d63616":[13,0,0,3,1,42,221],
+"group__lwip__opts__debugmsg.html#gae7980c7f8eb45cd411bf410ff0a3fc55":[11,0,4,0,2,29],
+"group__lwip__opts__debugmsg.html#gae7980c7f8eb45cd411bf410ff0a3fc55":[13,0,0,3,1,42,290],
+"group__lwip__opts__debugmsg.html#gaf0551bef83c0fc1baa57cf339d220e25":[11,0,4,0,2,20],
+"group__lwip__opts__debugmsg.html#gaf0551bef83c0fc1baa57cf339d220e25":[13,0,0,3,1,42,263],
+"group__lwip__opts__debugmsg.html#gaf51dc2563536de56470146749f715ba8":[11,0,4,0,2,27],
+"group__lwip__opts__debugmsg.html#gaf51dc2563536de56470146749f715ba8":[13,0,0,3,1,42,282],
+"group__lwip__opts__debugmsg.html#gafaee522e7f32d81022215e1805e303a5":[11,0,4,0,2,3],
+"group__lwip__opts__debugmsg.html#gafaee522e7f32d81022215e1805e303a5":[13,0,0,3,1,42,6],
+"group__lwip__opts__dhcp.html":[11,0,4,4,2],
+"group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83":[11,0,4,4,2,3]
+};
diff --git a/doc/doxygen/output/html/navtreeindex5.js b/doc/doxygen/output/html/navtreeindex5.js
new file mode 100644
index 0000000..1268052
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex5.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX5 =
+{
+"group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83":[13,0,0,3,1,42,86],
+"group__lwip__opts__dhcp.html#ga3c2983cbd228011dd3e18cb417e7e423":[11,0,4,4,2,2],
+"group__lwip__opts__dhcp.html#ga3c2983cbd228011dd3e18cb417e7e423":[13,0,0,3,1,42,85],
+"group__lwip__opts__dhcp.html#ga60ccc20fbb08be24b5d5f599dd47a6a6":[11,0,4,4,2,4],
+"group__lwip__opts__dhcp.html#ga60ccc20fbb08be24b5d5f599dd47a6a6":[13,0,0,3,1,42,87],
+"group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9":[11,0,4,4,2,1],
+"group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9":[13,0,0,3,1,42,79],
+"group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2":[13,0,0,3,1,42,88],
+"group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2":[11,0,4,4,2,5],
+"group__lwip__opts__dhcp.html#gab2d91de7b2fce879b0a213682e1b0b69":[11,0,4,4,2,0],
+"group__lwip__opts__dhcp.html#gab2d91de7b2fce879b0a213682e1b0b69":[13,0,0,3,1,42,26],
+"group__lwip__opts__dhcpv6.html":[11,0,4,7,3],
+"group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6":[11,0,4,7,3,3],
+"group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6":[13,0,0,3,1,42,128],
+"group__lwip__opts__dhcpv6.html#ga3fc9dbe8feae61621cac4952ac28e155":[11,0,4,7,3,4],
+"group__lwip__opts__dhcpv6.html#ga3fc9dbe8feae61621cac4952ac28e155":[13,0,0,3,1,42,129],
+"group__lwip__opts__dhcpv6.html#ga5d08f76a7472daa7bcfe17343243bd77":[13,0,0,3,1,42,80],
+"group__lwip__opts__dhcpv6.html#ga5d08f76a7472daa7bcfe17343243bd77":[11,0,4,7,3,0],
+"group__lwip__opts__dhcpv6.html#ga8d6bab14d580d2136430319aab6d7930":[11,0,4,7,3,5],
+"group__lwip__opts__dhcpv6.html#ga8d6bab14d580d2136430319aab6d7930":[13,0,0,3,1,42,130],
+"group__lwip__opts__dhcpv6.html#ga92c3bc242ad20a5f398c45d332864a29":[11,0,4,7,3,1],
+"group__lwip__opts__dhcpv6.html#ga92c3bc242ad20a5f398c45d332864a29":[13,0,0,3,1,42,81],
+"group__lwip__opts__dhcpv6.html#gaf3ac8e15d7a67429a02bc2317e16bcfe":[11,0,4,7,3,2],
+"group__lwip__opts__dhcpv6.html#gaf3ac8e15d7a67429a02bc2317e16bcfe":[13,0,0,3,1,42,82],
+"group__lwip__opts__dns.html":[11,0,4,2,1],
+"group__lwip__opts__dns.html#ga07ffd8e9106dae3b65347bd03811a4b6":[13,0,0,3,1,42,28],
+"group__lwip__opts__dns.html#ga07ffd8e9106dae3b65347bd03811a4b6":[11,0,4,2,1,0],
+"group__lwip__opts__dns.html#ga2384e76c1acdf969d883f3de08d340f7":[11,0,4,2,1,6],
+"group__lwip__opts__dns.html#ga2384e76c1acdf969d883f3de08d340f7":[13,0,0,3,1,42,34],
+"group__lwip__opts__dns.html#ga3b01c79902063c170ef57deb72f56124":[11,0,4,2,1,3],
+"group__lwip__opts__dns.html#ga3b01c79902063c170ef57deb72f56124":[13,0,0,3,1,42,31],
+"group__lwip__opts__dns.html#ga8235a5fb0a1c1cceeee670cf95612ba8":[11,0,4,2,1,2],
+"group__lwip__opts__dns.html#ga8235a5fb0a1c1cceeee670cf95612ba8":[13,0,0,3,1,42,30],
+"group__lwip__opts__dns.html#ga8979c30dfbfde609d5139f80aabdfcc5":[11,0,4,2,1,8],
+"group__lwip__opts__dns.html#ga8979c30dfbfde609d5139f80aabdfcc5":[13,0,0,3,1,42,90],
+"group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646":[11,0,4,2,1,7],
+"group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646":[13,0,0,3,1,42,89],
+"group__lwip__opts__dns.html#ga9f9881c887a8aceb9765820c2dbdf292":[11,0,4,2,1,5],
+"group__lwip__opts__dns.html#ga9f9881c887a8aceb9765820c2dbdf292":[13,0,0,3,1,42,33],
+"group__lwip__opts__dns.html#gaab73c241189335435f3f662aa6a00dba":[11,0,4,2,1,4],
+"group__lwip__opts__dns.html#gaab73c241189335435f3f662aa6a00dba":[13,0,0,3,1,42,32],
+"group__lwip__opts__dns.html#gacba1ac491c1b47b98dfbd0d5c1662659":[11,0,4,2,1,1],
+"group__lwip__opts__dns.html#gacba1ac491c1b47b98dfbd0d5c1662659":[13,0,0,3,1,42,29],
+"group__lwip__opts__dns.html#gafcbde5706a70ace562bd1f7d2d6f77cb":[11,0,4,2,1,9],
+"group__lwip__opts__dns.html#gafcbde5706a70ace562bd1f7d2d6f77cb":[13,0,0,3,1,42,91],
+"group__lwip__opts__hooks.html":[11,0,4,1,10],
+"group__lwip__opts__hooks.html#ga078d203053911cf3af178392700386a4":[11,0,4,1,10,17],
+"group__lwip__opts__hooks.html#ga078d203053911cf3af178392700386a4":[13,0,0,3,1,42,113],
+"group__lwip__opts__hooks.html#ga0ef31b749307b63c06633645d4de21f0":[11,0,4,1,10,18],
+"group__lwip__opts__hooks.html#ga0ef31b749307b63c06633645d4de21f0":[13,0,0,3,1,42,114],
+"group__lwip__opts__hooks.html#ga11ac9d637cb6afc0a32e8da7f51d0c0d":[11,0,4,1,10,4],
+"group__lwip__opts__hooks.html#ga11ac9d637cb6afc0a32e8da7f51d0c0d":[13,0,0,3,1,42,100],
+"group__lwip__opts__hooks.html#ga13e90672158221b40f8b12bf9d8b721f":[11,0,4,1,10,11],
+"group__lwip__opts__hooks.html#ga13e90672158221b40f8b12bf9d8b721f":[13,0,0,3,1,42,107],
+"group__lwip__opts__hooks.html#ga14ea9210c09da4dd33bc85bd8a01b48a":[11,0,4,1,10,15],
+"group__lwip__opts__hooks.html#ga14ea9210c09da4dd33bc85bd8a01b48a":[13,0,0,3,1,42,111],
+"group__lwip__opts__hooks.html#ga287544c3d74bc2a2d645bddbbc4fbdd0":[11,0,4,1,10,12],
+"group__lwip__opts__hooks.html#ga287544c3d74bc2a2d645bddbbc4fbdd0":[13,0,0,3,1,42,108],
+"group__lwip__opts__hooks.html#ga2b6e450b4934b95df9b9a9d2b9a4d57e":[11,0,4,1,10,22],
+"group__lwip__opts__hooks.html#ga2b6e450b4934b95df9b9a9d2b9a4d57e":[13,0,0,3,1,42,118],
+"group__lwip__opts__hooks.html#ga2b76f127325fd5ca8b80077a4b6160b1":[11,0,4,1,10,3],
+"group__lwip__opts__hooks.html#ga2b76f127325fd5ca8b80077a4b6160b1":[13,0,0,3,1,42,99],
+"group__lwip__opts__hooks.html#ga2f020543772368f8f4355f50f24c86a9":[11,0,4,1,10,21],
+"group__lwip__opts__hooks.html#ga2f020543772368f8f4355f50f24c86a9":[13,0,0,3,1,42,117],
+"group__lwip__opts__hooks.html#ga31c0694abe4eedf3ff039b7073c2293f":[11,0,4,1,10,19],
+"group__lwip__opts__hooks.html#ga31c0694abe4eedf3ff039b7073c2293f":[13,0,0,3,1,42,115],
+"group__lwip__opts__hooks.html#ga4068b3313e32f711ba016215fc2c886a":[11,0,4,1,10,0],
+"group__lwip__opts__hooks.html#ga4068b3313e32f711ba016215fc2c886a":[13,0,0,3,1,42,96],
+"group__lwip__opts__hooks.html#ga40e6c9aba06e66e5df1b4ca18329f9b4":[11,0,4,1,10,1],
+"group__lwip__opts__hooks.html#ga40e6c9aba06e66e5df1b4ca18329f9b4":[13,0,0,3,1,42,97],
+"group__lwip__opts__hooks.html#ga5d1061ad722a73012a28dbaf0f169b70":[11,0,4,1,10,7],
+"group__lwip__opts__hooks.html#ga5d1061ad722a73012a28dbaf0f169b70":[13,0,0,3,1,42,103],
+"group__lwip__opts__hooks.html#ga6cc92f5101dd7a0420e18e1f2101abf4":[11,0,4,1,10,20],
+"group__lwip__opts__hooks.html#ga6cc92f5101dd7a0420e18e1f2101abf4":[13,0,0,3,1,42,116],
+"group__lwip__opts__hooks.html#ga8245a4bc7ffb172e3bf32276f9d126ce":[11,0,4,1,10,10],
+"group__lwip__opts__hooks.html#ga8245a4bc7ffb172e3bf32276f9d126ce":[13,0,0,3,1,42,106],
+"group__lwip__opts__hooks.html#ga9124237c28e2f18f3b28d5be09e9ccb6":[11,0,4,1,10,6],
+"group__lwip__opts__hooks.html#ga9124237c28e2f18f3b28d5be09e9ccb6":[13,0,0,3,1,42,102],
+"group__lwip__opts__hooks.html#gaa410d9cbe1d4fa4c8a7f49af7b501024":[13,0,0,3,1,42,104],
+"group__lwip__opts__hooks.html#gaa410d9cbe1d4fa4c8a7f49af7b501024":[11,0,4,1,10,8],
+"group__lwip__opts__hooks.html#gabdaeb09ac9f441934e21a087544a1af1":[11,0,4,1,10,14],
+"group__lwip__opts__hooks.html#gabdaeb09ac9f441934e21a087544a1af1":[13,0,0,3,1,42,110],
+"group__lwip__opts__hooks.html#gabed8b1cda4aba2d108fa62cdd74895a2":[13,0,0,3,1,42,112],
+"group__lwip__opts__hooks.html#gabed8b1cda4aba2d108fa62cdd74895a2":[11,0,4,1,10,16],
+"group__lwip__opts__hooks.html#gaccbdd3d0250f7176dcd799ca06007f20":[11,0,4,1,10,9],
+"group__lwip__opts__hooks.html#gaccbdd3d0250f7176dcd799ca06007f20":[13,0,0,3,1,42,105],
+"group__lwip__opts__hooks.html#gae35e4b7374868dc748b12dedb8f807e5":[11,0,4,1,10,13],
+"group__lwip__opts__hooks.html#gae35e4b7374868dc748b12dedb8f807e5":[13,0,0,3,1,42,109],
+"group__lwip__opts__hooks.html#gaed848a98dbb5c8856a27e379986ea70d":[11,0,4,1,10,5],
+"group__lwip__opts__hooks.html#gaed848a98dbb5c8856a27e379986ea70d":[13,0,0,3,1,42,101],
+"group__lwip__opts__hooks.html#gafbbbc574863c0f88988936bd1434f2d2":[11,0,4,1,10,2],
+"group__lwip__opts__hooks.html#gafbbbc574863c0f88988936bd1434f2d2":[13,0,0,3,1,42,98],
+"group__lwip__opts__icmp.html":[11,0,4,4,1],
+"group__lwip__opts__icmp.html#ga8088cb56d1a84fe554b11bc15d84b2b9":[11,0,4,4,1,1],
+"group__lwip__opts__icmp.html#ga8088cb56d1a84fe554b11bc15d84b2b9":[13,0,0,3,1,42,73],
+"group__lwip__opts__icmp.html#gae1533f2bc39a5843989909555f6ce0cf":[11,0,4,4,1,0],
+"group__lwip__opts__icmp.html#gae1533f2bc39a5843989909555f6ce0cf":[13,0,0,3,1,42,44],
+"group__lwip__opts__icmp.html#gae4d45345c3ab8e5a355fda1d8d24fca6":[11,0,4,4,1,2],
+"group__lwip__opts__icmp.html#gae4d45345c3ab8e5a355fda1d8d24fca6":[13,0,0,3,1,42,119],
+"group__lwip__opts__icmp.html#gaf77baf0a83b04312eab4c006ef229661":[11,0,4,4,1,3],
+"group__lwip__opts__icmp.html#gaf77baf0a83b04312eab4c006ef229661":[13,0,0,3,1,42,145],
+"group__lwip__opts__icmp6.html":[11,0,4,7,0],
+"group__lwip__opts__icmp6.html#ga65ac8bcbad242cba3a2b557e1574b21f":[13,0,0,3,1,42,120],
+"group__lwip__opts__icmp6.html#ga65ac8bcbad242cba3a2b557e1574b21f":[11,0,4,7,0,0],
+"group__lwip__opts__icmp6.html#ga82193577b4045e1ac1533c4341a2bd79":[11,0,4,7,0,2],
+"group__lwip__opts__icmp6.html#ga82193577b4045e1ac1533c4341a2bd79":[13,0,0,3,1,42,122],
+"group__lwip__opts__icmp6.html#gaa88c55e37e5d7b865b91a9399313bbbf":[11,0,4,7,0,1],
+"group__lwip__opts__icmp6.html#gaa88c55e37e5d7b865b91a9399313bbbf":[13,0,0,3,1,42,121],
+"group__lwip__opts__igmp.html":[11,0,4,4,4],
+"group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923":[11,0,4,4,4,0],
+"group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923":[13,0,0,3,1,42,123],
+"group__lwip__opts__infrastructure.html":[11,0,4,1],
+"group__lwip__opts__ipv4.html":[11,0,4,4],
+"group__lwip__opts__ipv4.html#ga0b2c993fd940f5774108298933310384":[11,0,4,4,13],
+"group__lwip__opts__ipv4.html#ga0b2c993fd940f5774108298933310384":[13,0,0,3,1,42,61],
+"group__lwip__opts__ipv4.html#ga0f1fbf42d3344bf87cd056d48ddca3db":[11,0,4,4,14],
+"group__lwip__opts__ipv4.html#ga0f1fbf42d3344bf87cd056d48ddca3db":[13,0,0,3,1,42,62],
+"group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69":[11,0,4,4,12],
+"group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69":[13,0,0,3,1,42,60],
+"group__lwip__opts__ipv4.html#ga29084a46d7d4be30e8029d356bca0394":[11,0,4,4,10],
+"group__lwip__opts__ipv4.html#ga29084a46d7d4be30e8029d356bca0394":[13,0,0,3,1,42,58],
+"group__lwip__opts__ipv4.html#ga429e811a80ebb5157e14a854870c4410":[13,0,0,3,1,42,124],
+"group__lwip__opts__ipv4.html#ga429e811a80ebb5157e14a854870c4410":[11,0,4,4,15],
+"group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411":[11,0,4,4,5],
+"group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411":[13,0,0,3,1,42,52],
+"group__lwip__opts__ipv4.html#ga881d32ff5ee02af01f758953f1b51d59":[11,0,4,4,6],
+"group__lwip__opts__ipv4.html#ga881d32ff5ee02af01f758953f1b51d59":[13,0,0,3,1,42,53],
+"group__lwip__opts__ipv4.html#ga9e761df07c4e93901858741d4771dbc7":[11,0,4,4,7],
+"group__lwip__opts__ipv4.html#ga9e761df07c4e93901858741d4771dbc7":[13,0,0,3,1,42,54],
+"group__lwip__opts__ipv4.html#gaa956b0167c37a2265b55e2d0204a3933":[11,0,4,4,9],
+"group__lwip__opts__ipv4.html#gaa956b0167c37a2265b55e2d0204a3933":[13,0,0,3,1,42,56],
+"group__lwip__opts__ipv4.html#gad41122bd0b5485a18a4415c8f953727b":[13,0,0,3,1,42,59],
+"group__lwip__opts__ipv4.html#gad41122bd0b5485a18a4415c8f953727b":[11,0,4,4,11],
+"group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4":[13,0,0,3,1,42,55],
+"group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4":[11,0,4,4,8],
+"group__lwip__opts__ipv6.html":[11,0,4,7],
+"group__lwip__opts__ipv6.html#ga16c1b672604bfb0a66a6aeeb854589d3":[13,0,0,3,1,42,135],
+"group__lwip__opts__ipv6.html#ga16c1b672604bfb0a66a6aeeb854589d3":[11,0,4,7,11],
+"group__lwip__opts__ipv6.html#ga273ed2e1a4e6a43713a0e4a06a34ee5c":[11,0,4,7,15],
+"group__lwip__opts__ipv6.html#ga273ed2e1a4e6a43713a0e4a06a34ee5c":[13,0,0,3,1,42,139],
+"group__lwip__opts__ipv6.html#ga2c0127fca1073ad3f0a1e53f00ea8858":[11,0,4,7,6],
+"group__lwip__opts__ipv6.html#ga2c0127fca1073ad3f0a1e53f00ea8858":[13,0,0,3,1,42,126],
+"group__lwip__opts__ipv6.html#ga580039bf2baf49fcb9e504e5d2b40a03":[11,0,4,7,7],
+"group__lwip__opts__ipv6.html#ga580039bf2baf49fcb9e504e5d2b40a03":[13,0,0,3,1,42,127],
+"group__lwip__opts__ipv6.html#ga623ef29d27d98fb7be8732730a5ddf4b":[11,0,4,7,14],
+"group__lwip__opts__ipv6.html#ga623ef29d27d98fb7be8732730a5ddf4b":[13,0,0,3,1,42,138],
+"group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f":[13,0,0,3,1,42,125],
+"group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f":[11,0,4,7,5],
+"group__lwip__opts__ipv6.html#ga8adc0b7dbedd279387a21588f0e2c969":[11,0,4,7,4],
+"group__lwip__opts__ipv6.html#ga8adc0b7dbedd279387a21588f0e2c969":[13,0,0,3,1,42,65],
+"group__lwip__opts__ipv6.html#ga91d1e630059df3b3a296e2b6ff7aead5":[13,0,0,3,1,42,137],
+"group__lwip__opts__ipv6.html#ga91d1e630059df3b3a296e2b6ff7aead5":[11,0,4,7,13],
+"group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3":[11,0,4,7,10],
+"group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3":[13,0,0,3,1,42,133],
+"group__lwip__opts__ipv6.html#gac96c5802de6c75dd62ab38cff6d16a32":[11,0,4,7,9],
+"group__lwip__opts__ipv6.html#gac96c5802de6c75dd62ab38cff6d16a32":[13,0,0,3,1,42,132],
+"group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864":[11,0,4,7,12],
+"group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864":[13,0,0,3,1,42,136],
+"group__lwip__opts__ipv6.html#gad8489522d34f37e42b4001bab3781bcb":[13,0,0,3,1,42,131],
+"group__lwip__opts__ipv6.html#gad8489522d34f37e42b4001bab3781bcb":[11,0,4,7,8],
+"group__lwip__opts__lock.html":[11,0,4,1,3],
+"group__lwip__opts__lock.html#ga351beb1c06affe49e717bc9f76c66acf":[11,0,4,1,3,4],
+"group__lwip__opts__lock.html#ga351beb1c06affe49e717bc9f76c66acf":[13,0,0,3,1,42,202],
+"group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75":[13,0,0,3,1,42,71],
+"group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75":[11,0,4,1,3,0],
+"group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011":[11,0,4,1,3,3],
+"group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011":[13,0,0,3,1,42,201],
+"group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e":[11,0,4,1,3,1],
+"group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e":[13,0,0,3,1,42,142],
+"group__lwip__opts__lock.html#gae85efb3a5fcf8585c94b3c2669978959":[11,0,4,1,3,5],
+"group__lwip__opts__lock.html#gae85efb3a5fcf8585c94b3c2669978959":[13,0,0,3,1,42,275],
+"group__lwip__opts__lock.html#gae9afcefa5d233372abb9413188dd98c9":[11,0,4,1,3,2],
+"group__lwip__opts__lock.html#gae9afcefa5d233372abb9413188dd98c9":[13,0,0,3,1,42,144],
+"group__lwip__opts__loop.html":[11,0,4,6,0],
+"group__lwip__opts__loop.html#ga10a878b390c2fbe421d82502001c7300":[11,0,4,6,0,2],
+"group__lwip__opts__loop.html#ga10a878b390c2fbe421d82502001c7300":[13,0,0,3,1,42,141],
+"group__lwip__opts__loop.html#ga724a0ea765d5a47d026d529725f31c01":[11,0,4,6,0,3],
+"group__lwip__opts__loop.html#ga724a0ea765d5a47d026d529725f31c01":[13,0,0,3,1,42,171],
+"group__lwip__opts__loop.html#gaa28d13ddd5281b1912276991e7ea58c5":[11,0,4,6,0,4],
+"group__lwip__opts__loop.html#gaa28d13ddd5281b1912276991e7ea58c5":[13,0,0,3,1,42,172],
+"group__lwip__opts__loop.html#gaa2b1f736373cd896e212644aa453fbaf":[11,0,4,6,0,0],
+"group__lwip__opts__loop.html#gaa2b1f736373cd896e212644aa453fbaf":[13,0,0,3,1,42,95],
+"group__lwip__opts__loop.html#gaacc3ad5d0a771d45fb0a3e3a09b1dbea":[13,0,0,3,1,42,140],
+"group__lwip__opts__loop.html#gaacc3ad5d0a771d45fb0a3e3a09b1dbea":[11,0,4,6,0,1],
+"group__lwip__opts__mem.html":[11,0,4,1,4],
+"group__lwip__opts__mem.html#ga0838947193e222a9f46b582e01e5beff":[11,0,4,1,4,11],
+"group__lwip__opts__mem.html#ga0838947193e222a9f46b582e01e5beff":[13,0,0,3,1,42,250],
+"group__lwip__opts__mem.html#ga0a3ef6098813c103e5aba07da76e15e2":[11,0,4,1,4,0],
+"group__lwip__opts__mem.html#ga0a3ef6098813c103e5aba07da76e15e2":[13,0,0,3,1,42,67],
+"group__lwip__opts__mem.html#ga27fdd01194a42fc41a7716b72cdb49e3":[11,0,4,1,4,10],
+"group__lwip__opts__mem.html#ga27fdd01194a42fc41a7716b72cdb49e3":[13,0,0,3,1,42,249],
+"group__lwip__opts__mem.html#ga2dcf8c45f945dd0c4301a94700f2112c":[11,0,4,1,4,5],
+"group__lwip__opts__mem.html#ga2dcf8c45f945dd0c4301a94700f2112c":[13,0,0,3,1,42,215],
+"group__lwip__opts__mem.html#ga4ef345cc270912bd2230b1c5ec51dfc8":[11,0,4,1,4,2],
+"group__lwip__opts__mem.html#ga4ef345cc270912bd2230b1c5ec51dfc8":[13,0,0,3,1,42,212],
+"group__lwip__opts__mem.html#ga69de593b8ffd4f1c249f03e48e11983b":[11,0,4,1,4,12],
+"group__lwip__opts__mem.html#ga69de593b8ffd4f1c249f03e48e11983b":[13,0,0,3,1,42,252],
+"group__lwip__opts__mem.html#ga90b17afabb93986a162c327ed30bb4d3":[11,0,4,1,4,4],
+"group__lwip__opts__mem.html#ga90b17afabb93986a162c327ed30bb4d3":[13,0,0,3,1,42,214],
+"group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7":[13,0,0,3,1,42,210],
+"group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7":[11,0,4,1,4,1],
+"group__lwip__opts__mem.html#gaa2f25586972d1cbc1ff0dcdc6f15a1b0":[11,0,4,1,4,8],
+"group__lwip__opts__mem.html#gaa2f25586972d1cbc1ff0dcdc6f15a1b0":[13,0,0,3,1,42,222],
+"group__lwip__opts__mem.html#gaba8be68e8fd0716b723ce4569ed89f82":[11,0,4,1,4,7],
+"group__lwip__opts__mem.html#gaba8be68e8fd0716b723ce4569ed89f82":[13,0,0,3,1,42,218],
+"group__lwip__opts__mem.html#gaddca3141bc7037241769eb152b6f89ba":[11,0,4,1,4,6],
+"group__lwip__opts__mem.html#gaddca3141bc7037241769eb152b6f89ba":[13,0,0,3,1,42,217],
+"group__lwip__opts__mem.html#gae331a198bd06100b90ea020cd5f07f4e":[11,0,4,1,4,3],
+"group__lwip__opts__mem.html#gae331a198bd06100b90ea020cd5f07f4e":[13,0,0,3,1,42,213],
+"group__lwip__opts__mem.html#gae93af697d27bbcefa6a28052d90f2f38":[11,0,4,1,4,9],
+"group__lwip__opts__mem.html#gae93af697d27bbcefa6a28052d90f2f38":[13,0,0,3,1,42,223],
+"group__lwip__opts__memcpy.html":[11,0,4,1,2],
+"group__lwip__opts__memcpy.html#ga0e00bb235da5557fcbc049f732503863":[11,0,4,1,2,1],
+"group__lwip__opts__memcpy.html#ga0e00bb235da5557fcbc049f732503863":[13,0,0,3,1,42,220],
+"group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec":[11,0,4,1,2,2],
+"group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec":[13,0,0,3,1,42,270],
+"group__lwip__opts__memcpy.html#gaa1dd57a66b6de8c0593e9e3e8d1411f6":[13,0,0,3,1,42,219],
+"group__lwip__opts__memcpy.html#gaa1dd57a66b6de8c0593e9e3e8d1411f6":[11,0,4,1,2,0],
+"group__lwip__opts__memp.html":[11,0,4,1,5],
+"group__lwip__opts__memp.html#ga04fba6a249123513271dccb4ec26aa5a":[11,0,4,1,5,19],
+"group__lwip__opts__memp.html#ga04fba6a249123513271dccb4ec26aa5a":[13,0,0,3,1,42,244],
+"group__lwip__opts__memp.html#ga087b00ea20a7edebcad33a1a1353a5d7":[13,0,0,3,1,42,226],
+"group__lwip__opts__memp.html#ga087b00ea20a7edebcad33a1a1353a5d7":[11,0,4,1,5,3],
+"group__lwip__opts__memp.html#ga169436c5860253b90e25bdba9fdcac86":[11,0,4,1,5,14],
+"group__lwip__opts__memp.html#ga169436c5860253b90e25bdba9fdcac86":[13,0,0,3,1,42,239],
+"group__lwip__opts__memp.html#ga1f66051a654dcd7a4e19bc6aff240630":[11,0,4,1,5,5],
+"group__lwip__opts__memp.html#ga1f66051a654dcd7a4e19bc6aff240630":[13,0,0,3,1,42,228],
+"group__lwip__opts__memp.html#ga24f6737ee990990b81b0d16ef6e0dffd":[13,0,0,3,1,42,224],
+"group__lwip__opts__memp.html#ga24f6737ee990990b81b0d16ef6e0dffd":[11,0,4,1,5,1],
+"group__lwip__opts__memp.html#ga293bc22b60bf3f8e2520f60a88370e7a":[11,0,4,1,5,10],
+"group__lwip__opts__memp.html#ga293bc22b60bf3f8e2520f60a88370e7a":[13,0,0,3,1,42,235],
+"group__lwip__opts__memp.html#ga2c416da481ab09bd1ba257b75a0707eb":[11,0,4,1,5,23],
+"group__lwip__opts__memp.html#ga2c416da481ab09bd1ba257b75a0707eb":[13,0,0,3,1,42,248],
+"group__lwip__opts__memp.html#ga379bf92ed322cda54cb701337421e0d3":[11,0,4,1,5,13],
+"group__lwip__opts__memp.html#ga379bf92ed322cda54cb701337421e0d3":[13,0,0,3,1,42,238],
+"group__lwip__opts__memp.html#ga3b1f228c598529c62895ad04ff294980":[11,0,4,1,5,4],
+"group__lwip__opts__memp.html#ga3b1f228c598529c62895ad04ff294980":[13,0,0,3,1,42,227],
+"group__lwip__opts__memp.html#ga4afbdca581a58d57bc7a81118a95327e":[11,0,4,1,5,17],
+"group__lwip__opts__memp.html#ga4afbdca581a58d57bc7a81118a95327e":[13,0,0,3,1,42,242],
+"group__lwip__opts__memp.html#ga50eaadc4cad0716410332691e382c38a":[11,0,4,1,5,24],
+"group__lwip__opts__memp.html#ga50eaadc4cad0716410332691e382c38a":[13,0,0,3,1,42,262],
+"group__lwip__opts__memp.html#ga5a95abf3610c56e7c23cb035eb9c3444":[13,0,0,3,1,42,225],
+"group__lwip__opts__memp.html#ga5a95abf3610c56e7c23cb035eb9c3444":[11,0,4,1,5,2],
+"group__lwip__opts__memp.html#ga5d99df65869ac101ed6a611fc85016be":[11,0,4,1,5,8],
+"group__lwip__opts__memp.html#ga5d99df65869ac101ed6a611fc85016be":[13,0,0,3,1,42,233],
+"group__lwip__opts__memp.html#ga73beecc19cfbc3114768f9b32b2cd70e":[11,0,4,1,5,18],
+"group__lwip__opts__memp.html#ga73beecc19cfbc3114768f9b32b2cd70e":[13,0,0,3,1,42,243],
+"group__lwip__opts__memp.html#ga87a05debb46ff82093d0e6dc1aad8804":[11,0,4,1,5,0],
+"group__lwip__opts__memp.html#ga87a05debb46ff82093d0e6dc1aad8804":[13,0,0,3,1,42,177],
+"group__lwip__opts__memp.html#ga8e136f5811e6652c6c5d2fcf596f0893":[13,0,0,3,1,42,240]
+};
diff --git a/doc/doxygen/output/html/navtreeindex6.js b/doc/doxygen/output/html/navtreeindex6.js
new file mode 100644
index 0000000..d302f11
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex6.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX6 =
+{
+"group__lwip__opts__memp.html#ga8e136f5811e6652c6c5d2fcf596f0893":[11,0,4,1,5,15],
+"group__lwip__opts__memp.html#ga92b30aed958ec59334d936d4ca725418":[11,0,4,1,5,12],
+"group__lwip__opts__memp.html#ga92b30aed958ec59334d936d4ca725418":[13,0,0,3,1,42,237],
+"group__lwip__opts__memp.html#gaa35fb3a1a76661e3ffb9722a57092de3":[11,0,4,1,5,20],
+"group__lwip__opts__memp.html#gaa35fb3a1a76661e3ffb9722a57092de3":[13,0,0,3,1,42,245],
+"group__lwip__opts__memp.html#gaa9b0f949da12cbe8fe5f7aefc30290e0":[11,0,4,1,5,7],
+"group__lwip__opts__memp.html#gaa9b0f949da12cbe8fe5f7aefc30290e0":[13,0,0,3,1,42,230],
+"group__lwip__opts__memp.html#gab089a7088439e726c3801ba9e249d831":[13,0,0,3,1,42,247],
+"group__lwip__opts__memp.html#gab089a7088439e726c3801ba9e249d831":[11,0,4,1,5,22],
+"group__lwip__opts__memp.html#gab648ff95d8ffa4216b95f82a568a5d9a":[11,0,4,1,5,6],
+"group__lwip__opts__memp.html#gab648ff95d8ffa4216b95f82a568a5d9a":[13,0,0,3,1,42,229],
+"group__lwip__opts__memp.html#gacb40bd726b7e15593b20a628d298f456":[11,0,4,1,5,9],
+"group__lwip__opts__memp.html#gacb40bd726b7e15593b20a628d298f456":[13,0,0,3,1,42,234],
+"group__lwip__opts__memp.html#gacf9782dd26bf8a655044dc041a9de948":[13,0,0,3,1,42,241],
+"group__lwip__opts__memp.html#gacf9782dd26bf8a655044dc041a9de948":[11,0,4,1,5,16],
+"group__lwip__opts__memp.html#gadd5a973b98068ce9318ea2f96b5fa14c":[13,0,0,3,1,42,236],
+"group__lwip__opts__memp.html#gadd5a973b98068ce9318ea2f96b5fa14c":[11,0,4,1,5,11],
+"group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c":[11,0,4,1,5,21],
+"group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c":[13,0,0,3,1,42,246],
+"group__lwip__opts__mib2.html":[11,0,4,1,6],
+"group__lwip__opts__mib2.html#gad84d6a781880cec19a1ef4b2339fea29":[13,0,0,3,1,42,143],
+"group__lwip__opts__mib2.html#gad84d6a781880cec19a1ef4b2339fea29":[11,0,4,1,6,0],
+"group__lwip__opts__mld6.html":[11,0,4,7,1],
+"group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528":[11,0,4,7,1,0],
+"group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528":[13,0,0,3,1,42,134],
+"group__lwip__opts__mld6.html#ga89e92d8de8898696e797f13fdd169494":[11,0,4,7,1,1],
+"group__lwip__opts__mld6.html#ga89e92d8de8898696e797f13fdd169494":[13,0,0,3,1,42,231],
+"group__lwip__opts__multicast.html":[11,0,4,1,7],
+"group__lwip__opts__multicast.html#gab8d7d53247cc62caa76f54b2c5a5df30":[11,0,4,1,7,0],
+"group__lwip__opts__multicast.html#gab8d7d53247cc62caa76f54b2c5a5df30":[13,0,0,3,1,42,146],
+"group__lwip__opts__nd6.html":[11,0,4,7,2],
+"group__lwip__opts__nd6.html#ga0757a3c1b5d1563ad2d77228e1d8a60f":[11,0,4,7,2,10],
+"group__lwip__opts__nd6.html#ga0757a3c1b5d1563ad2d77228e1d8a60f":[13,0,0,3,1,42,157],
+"group__lwip__opts__nd6.html#ga269db9d61cdfc2fd3bc7b12c56261c74":[11,0,4,7,2,12],
+"group__lwip__opts__nd6.html#ga269db9d61cdfc2fd3bc7b12c56261c74":[13,0,0,3,1,42,159],
+"group__lwip__opts__nd6.html#ga315bd6d4a9d185766dfc3253cd9d7715":[11,0,4,7,2,1],
+"group__lwip__opts__nd6.html#ga315bd6d4a9d185766dfc3253cd9d7715":[13,0,0,3,1,42,148],
+"group__lwip__opts__nd6.html#ga461abcbeef1d236d1f3201827dd28ad9":[13,0,0,3,1,42,160],
+"group__lwip__opts__nd6.html#ga461abcbeef1d236d1f3201827dd28ad9":[11,0,4,7,2,13],
+"group__lwip__opts__nd6.html#ga75e81a96148f266c8fad8c0bcab2f36a":[13,0,0,3,1,42,156],
+"group__lwip__opts__nd6.html#ga75e81a96148f266c8fad8c0bcab2f36a":[11,0,4,7,2,9],
+"group__lwip__opts__nd6.html#ga86ab0cac87cdc7aeff09384ddbaaba2a":[11,0,4,7,2,4],
+"group__lwip__opts__nd6.html#ga86ab0cac87cdc7aeff09384ddbaaba2a":[13,0,0,3,1,42,151],
+"group__lwip__opts__nd6.html#ga960b8973df083fad53ae0eaa79f8c4df":[11,0,4,7,2,2],
+"group__lwip__opts__nd6.html#ga960b8973df083fad53ae0eaa79f8c4df":[13,0,0,3,1,42,149],
+"group__lwip__opts__nd6.html#ga980909018aed54adc10dd68be3572b30":[11,0,4,7,2,3],
+"group__lwip__opts__nd6.html#ga980909018aed54adc10dd68be3572b30":[13,0,0,3,1,42,150],
+"group__lwip__opts__nd6.html#ga9d7cb6fd447ef0f6726f565e2c7509c4":[11,0,4,7,2,14],
+"group__lwip__opts__nd6.html#ga9d7cb6fd447ef0f6726f565e2c7509c4":[13,0,0,3,1,42,161],
+"group__lwip__opts__nd6.html#gab2fe15bdb4e0a41f295eb5577b11ad16":[11,0,4,7,2,7],
+"group__lwip__opts__nd6.html#gab2fe15bdb4e0a41f295eb5577b11ad16":[13,0,0,3,1,42,154],
+"group__lwip__opts__nd6.html#gabfaf3d92d51e2a9d70c8360af2611fb2":[13,0,0,3,1,42,232],
+"group__lwip__opts__nd6.html#gabfaf3d92d51e2a9d70c8360af2611fb2":[11,0,4,7,2,15],
+"group__lwip__opts__nd6.html#gacad118b1ae886e80137a1d4f0fb19672":[13,0,0,3,1,42,153],
+"group__lwip__opts__nd6.html#gacad118b1ae886e80137a1d4f0fb19672":[11,0,4,7,2,6],
+"group__lwip__opts__nd6.html#gad35d10353ac7c7d2c8d4b83788cdc6d9":[13,0,0,3,1,42,147],
+"group__lwip__opts__nd6.html#gad35d10353ac7c7d2c8d4b83788cdc6d9":[11,0,4,7,2,0],
+"group__lwip__opts__nd6.html#gad9cc576b5951f1b5e1c2b0d0bb831d9a":[13,0,0,3,1,42,155],
+"group__lwip__opts__nd6.html#gad9cc576b5951f1b5e1c2b0d0bb831d9a":[11,0,4,7,2,8],
+"group__lwip__opts__nd6.html#gaea4d829c0b52cc6cc28925eee89a7429":[13,0,0,3,1,42,158],
+"group__lwip__opts__nd6.html#gaea4d829c0b52cc6cc28925eee89a7429":[11,0,4,7,2,11],
+"group__lwip__opts__nd6.html#gafa6f4c2d2c259ab0895fa03a6f08c691":[13,0,0,3,1,42,152],
+"group__lwip__opts__nd6.html#gafa6f4c2d2c259ab0895fa03a6f08c691":[11,0,4,7,2,5],
+"group__lwip__opts__netconn.html":[11,0,4,3,0],
+"group__lwip__opts__netconn.html#ga1cd8d15a42262a0defaedabed126ea99":[11,0,4,3,0,3],
+"group__lwip__opts__netconn.html#ga1cd8d15a42262a0defaedabed126ea99":[13,0,0,3,1,42,204],
+"group__lwip__opts__netconn.html#ga2543345adf7d2c307df78a54ac2ba8c4":[11,0,4,3,0,2],
+"group__lwip__opts__netconn.html#ga2543345adf7d2c307df78a54ac2ba8c4":[13,0,0,3,1,42,165],
+"group__lwip__opts__netconn.html#ga478041b8544461258f6961bf0f3c1a77":[11,0,4,3,0,0],
+"group__lwip__opts__netconn.html#ga478041b8544461258f6961bf0f3c1a77":[13,0,0,3,1,42,163],
+"group__lwip__opts__netconn.html#ga7bfe8487a3abffdd9d6730977d22c406":[11,0,4,3,0,1],
+"group__lwip__opts__netconn.html#ga7bfe8487a3abffdd9d6730977d22c406":[13,0,0,3,1,42,164],
+"group__lwip__opts__netif.html":[11,0,4,6],
+"group__lwip__opts__netif.html#ga090482867ba04d442ab5b8ad745c0e1e":[11,0,4,6,2],
+"group__lwip__opts__netif.html#ga090482867ba04d442ab5b8ad745c0e1e":[13,0,0,3,1,42,167],
+"group__lwip__opts__netif.html#ga1a446932dd927cc4136ba654c13bb97b":[13,0,0,3,1,42,170],
+"group__lwip__opts__netif.html#ga1a446932dd927cc4136ba654c13bb97b":[11,0,4,6,5],
+"group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be":[11,0,4,6,10],
+"group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be":[13,0,0,3,1,42,182],
+"group__lwip__opts__netif.html#ga94a35212616f9a9aae5c98741612b936":[11,0,4,6,9],
+"group__lwip__opts__netif.html#ga94a35212616f9a9aae5c98741612b936":[13,0,0,3,1,42,176],
+"group__lwip__opts__netif.html#ga9c942c2e9655b06d4f73c630d30f60bf":[11,0,4,6,6],
+"group__lwip__opts__netif.html#ga9c942c2e9655b06d4f73c630d30f60bf":[13,0,0,3,1,42,173],
+"group__lwip__opts__netif.html#gaa714dbfa66822ec4c6111bdb8cf753c1":[13,0,0,3,1,42,168],
+"group__lwip__opts__netif.html#gaa714dbfa66822ec4c6111bdb8cf753c1":[11,0,4,6,3],
+"group__lwip__opts__netif.html#gabafb9f64a80e51b56c0abbcfc1f7e04e":[11,0,4,6,8],
+"group__lwip__opts__netif.html#gabafb9f64a80e51b56c0abbcfc1f7e04e":[13,0,0,3,1,42,175],
+"group__lwip__opts__netif.html#gad1d5e878d94b56ba687cef69be936ad9":[11,0,4,6,4],
+"group__lwip__opts__netif.html#gad1d5e878d94b56ba687cef69be936ad9":[13,0,0,3,1,42,169],
+"group__lwip__opts__netif.html#gadd45fb65f2d0e6de5a0d14ff9e101b77":[11,0,4,6,1],
+"group__lwip__opts__netif.html#gadd45fb65f2d0e6de5a0d14ff9e101b77":[13,0,0,3,1,42,166],
+"group__lwip__opts__netif.html#gaffb97d89516c38d3fcb9e44e5d707f36":[13,0,0,3,1,42,174],
+"group__lwip__opts__netif.html#gaffb97d89516c38d3fcb9e44e5d707f36":[11,0,4,6,7],
+"group__lwip__opts__nosys.html":[11,0,4,1,0],
+"group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b":[11,0,4,1,0,0],
+"group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b":[13,0,0,3,1,42,257],
+"group__lwip__opts__pbuf.html":[11,0,4,5],
+"group__lwip__opts__pbuf.html#ga35998a3d56af9940e6a80bb372597685":[11,0,4,5,2],
+"group__lwip__opts__pbuf.html#ga35998a3d56af9940e6a80bb372597685":[13,0,0,3,1,42,260],
+"group__lwip__opts__pbuf.html#ga6e1ba1875ae5168a17b53d83597bc1de":[11,0,4,5,1],
+"group__lwip__opts__pbuf.html#ga6e1ba1875ae5168a17b53d83597bc1de":[13,0,0,3,1,42,259],
+"group__lwip__opts__pbuf.html#gaaefb80d6bf9257c0f4322c36e1272c38":[13,0,0,3,1,42,178],
+"group__lwip__opts__pbuf.html#gaaefb80d6bf9257c0f4322c36e1272c38":[11,0,4,5,0],
+"group__lwip__opts__pbuf.html#gae61f4491d56e805e79b79eb5d35a00e5":[11,0,4,5,3],
+"group__lwip__opts__pbuf.html#gae61f4491d56e805e79b79eb5d35a00e5":[13,0,0,3,1,42,261],
+"group__lwip__opts__perf.html":[11,0,4,0,3],
+"group__lwip__opts__perf.html#ga44acd95b33e2d58a74455279721298de":[11,0,4,0,3,0],
+"group__lwip__opts__perf.html#ga44acd95b33e2d58a74455279721298de":[13,0,0,3,1,42,179],
+"group__lwip__opts__raw.html":[11,0,4,2,0],
+"group__lwip__opts__raw.html#ga36e3ffa66073ca0d27d11c422778249c":[11,0,4,2,0,1],
+"group__lwip__opts__raw.html#ga36e3ffa66073ca0d27d11c422778249c":[13,0,0,3,1,42,264],
+"group__lwip__opts__raw.html#gaca452be5cb05d9666f8f57e582c39221":[11,0,4,2,0,0],
+"group__lwip__opts__raw.html#gaca452be5cb05d9666f8f57e582c39221":[13,0,0,3,1,42,181],
+"group__lwip__opts__socket.html":[11,0,4,3,1],
+"group__lwip__opts__socket.html#ga0543eea2abe390d0bdc843c33debd762":[13,0,0,3,1,42,94],
+"group__lwip__opts__socket.html#ga0543eea2abe390d0bdc843c33debd762":[11,0,4,3,1,1],
+"group__lwip__opts__socket.html#ga06390cebcf4d13d3d47a11365e5fcd28":[11,0,4,3,1,4],
+"group__lwip__opts__socket.html#ga06390cebcf4d13d3d47a11365e5fcd28":[13,0,0,3,1,42,184],
+"group__lwip__opts__socket.html#ga1162cb685f202d9b21c11344b8209a58":[11,0,4,3,1,7],
+"group__lwip__opts__socket.html#ga1162cb685f202d9b21c11344b8209a58":[13,0,0,3,1,42,187],
+"group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f":[11,0,4,3,1,8],
+"group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f":[13,0,0,3,1,42,188],
+"group__lwip__opts__socket.html#ga3e7498d5d2921f0df3792de72f384d36":[11,0,4,3,1,12],
+"group__lwip__opts__socket.html#ga3e7498d5d2921f0df3792de72f384d36":[13,0,0,3,1,42,195],
+"group__lwip__opts__socket.html#ga484c38ab08f60d5b3335d23d31f9a402":[11,0,4,3,1,2],
+"group__lwip__opts__socket.html#ga484c38ab08f60d5b3335d23d31f9a402":[13,0,0,3,1,42,180],
+"group__lwip__opts__socket.html#ga5b115bacb569763d8a3889a12229e942":[11,0,4,3,1,6],
+"group__lwip__opts__socket.html#ga5b115bacb569763d8a3889a12229e942":[13,0,0,3,1,42,186],
+"group__lwip__opts__socket.html#ga5dbd0a61f30ae6c6bfbda635095f138d":[11,0,4,3,1,14],
+"group__lwip__opts__socket.html#ga5dbd0a61f30ae6c6bfbda635095f138d":[13,0,0,3,1,42,265],
+"group__lwip__opts__socket.html#ga68417078b71b0be9735256f52933dcdb":[11,0,4,3,1,11],
+"group__lwip__opts__socket.html#ga68417078b71b0be9735256f52933dcdb":[13,0,0,3,1,42,191],
+"group__lwip__opts__socket.html#ga6c14d705e3321429683f24de9f5a7200":[11,0,4,3,1,10],
+"group__lwip__opts__socket.html#ga6c14d705e3321429683f24de9f5a7200":[13,0,0,3,1,42,190],
+"group__lwip__opts__socket.html#ga8b9369ab260f032686a81c77c5b4db77":[11,0,4,3,1,13],
+"group__lwip__opts__socket.html#ga8b9369ab260f032686a81c77c5b4db77":[13,0,0,3,1,42,196],
+"group__lwip__opts__socket.html#ga91af3ade95b20b9a60c65ed0380fa0ed":[11,0,4,3,1,5],
+"group__lwip__opts__socket.html#ga91af3ade95b20b9a60c65ed0380fa0ed":[13,0,0,3,1,42,185],
+"group__lwip__opts__socket.html#gaa91292d5d014dc1c6f1c1f4166269a1d":[13,0,0,3,1,42,183],
+"group__lwip__opts__socket.html#gaa91292d5d014dc1c6f1c1f4166269a1d":[11,0,4,3,1,3],
+"group__lwip__opts__socket.html#gad0197c845fbb44c920b272f0fef3b57e":[11,0,4,3,1,9],
+"group__lwip__opts__socket.html#gad0197c845fbb44c920b272f0fef3b57e":[13,0,0,3,1,42,189],
+"group__lwip__opts__socket.html#gae9395d83af89002343e5782130f52f44":[11,0,4,3,1,16],
+"group__lwip__opts__socket.html#gae9395d83af89002343e5782130f52f44":[13,0,0,3,1,42,272],
+"group__lwip__opts__socket.html#gaf3822feed320cf8439b083ee525e4942":[13,0,0,3,1,42,271],
+"group__lwip__opts__socket.html#gaf3822feed320cf8439b083ee525e4942":[11,0,4,3,1,15],
+"group__lwip__opts__socket.html#gafed2811f031822ec5afa1ee211fb7447":[13,0,0,3,1,42,76],
+"group__lwip__opts__socket.html#gafed2811f031822ec5afa1ee211fb7447":[11,0,4,3,1,0],
+"group__lwip__opts__stats.html":[11,0,4,0,1],
+"group__lwip__opts__stats.html#ga0173549afa76553583e5a02c6a791218":[13,0,0,3,1,42,276],
+"group__lwip__opts__stats.html#ga0173549afa76553583e5a02c6a791218":[11,0,4,0,1,16],
+"group__lwip__opts__stats.html#ga3a8359abf4fff8ffdc449e5007f93275":[11,0,4,0,1,0],
+"group__lwip__opts__stats.html#ga3a8359abf4fff8ffdc449e5007f93275":[13,0,0,3,1,42,37],
+"group__lwip__opts__stats.html#ga472ad3f6da741f5b287d66ad3051242b":[13,0,0,3,1,42,43],
+"group__lwip__opts__stats.html#ga472ad3f6da741f5b287d66ad3051242b":[11,0,4,0,1,2],
+"group__lwip__opts__stats.html#ga4d12af1356b9fd60717984be51e27740":[11,0,4,0,1,3],
+"group__lwip__opts__stats.html#ga4d12af1356b9fd60717984be51e27740":[13,0,0,3,1,42,46],
+"group__lwip__opts__stats.html#ga542b58734cc01902c5e099f6efdc5f1b":[13,0,0,3,1,42,192],
+"group__lwip__opts__stats.html#ga542b58734cc01902c5e099f6efdc5f1b":[11,0,4,0,1,9],
+"group__lwip__opts__stats.html#ga5b01047eeb149a0b0ffe33d760d8370f":[11,0,4,0,1,13],
+"group__lwip__opts__stats.html#ga5b01047eeb149a0b0ffe33d760d8370f":[13,0,0,3,1,42,253],
+"group__lwip__opts__stats.html#ga61ec04a08c4fde690d10819e582656a7":[13,0,0,3,1,42,216],
+"group__lwip__opts__stats.html#ga61ec04a08c4fde690d10819e582656a7":[11,0,4,0,1,11],
+"group__lwip__opts__stats.html#ga6a211b787c97bce3af4273b29c95d9c2":[13,0,0,3,1,42,50],
+"group__lwip__opts__stats.html#ga6a211b787c97bce3af4273b29c95d9c2":[11,0,4,0,1,5],
+"group__lwip__opts__stats.html#ga714006cd5c5b0eb333159d0f677616a0":[13,0,0,3,1,42,41],
+"group__lwip__opts__stats.html#ga714006cd5c5b0eb333159d0f677616a0":[11,0,4,0,1,1],
+"group__lwip__opts__stats.html#ga753161114df60299a28d51c092c756cf":[11,0,4,0,1,15],
+"group__lwip__opts__stats.html#ga753161114df60299a28d51c092c756cf":[13,0,0,3,1,42,255],
+"group__lwip__opts__stats.html#gaa02ec5c5bc0edebe418680c54d044f58":[11,0,4,0,1,17],
+"group__lwip__opts__stats.html#gaa02ec5c5bc0edebe418680c54d044f58":[13,0,0,3,1,42,298],
+"group__lwip__opts__stats.html#gaaa08a181c11ff8b471549e8f52c9939b":[13,0,0,3,1,42,49],
+"group__lwip__opts__stats.html#gaaa08a181c11ff8b471549e8f52c9939b":[11,0,4,0,1,4],
+"group__lwip__opts__stats.html#gab8c2430be0e567a7499a95454aaa6041":[13,0,0,3,1,42,251],
+"group__lwip__opts__stats.html#gab8c2430be0e567a7499a95454aaa6041":[11,0,4,0,1,12],
+"group__lwip__opts__stats.html#gac9a4fbb46df3c0f479a334d0e34fb74f":[11,0,4,0,1,7],
+"group__lwip__opts__stats.html#gac9a4fbb46df3c0f479a334d0e34fb74f":[13,0,0,3,1,42,64],
+"group__lwip__opts__stats.html#gacdc38ed58d1900b5d3d109a65be1c3d1":[13,0,0,3,1,42,193],
+"group__lwip__opts__stats.html#gacdc38ed58d1900b5d3d109a65be1c3d1":[11,0,4,0,1,10],
+"group__lwip__opts__stats.html#gae58b452782d0327ae728192686c5a84a":[13,0,0,3,1,42,66],
+"group__lwip__opts__stats.html#gae58b452782d0327ae728192686c5a84a":[11,0,4,0,1,8],
+"group__lwip__opts__stats.html#gaef64b11bf71f0d6d5bafaf6092462276":[11,0,4,0,1,18],
+"group__lwip__opts__stats.html#gaef64b11bf71f0d6d5bafaf6092462276":[13,0,0,3,1,42,311],
+"group__lwip__opts__stats.html#gaf263df10b63b38201cae3d2dd5fb0b9e":[11,0,4,0,1,14],
+"group__lwip__opts__stats.html#gaf263df10b63b38201cae3d2dd5fb0b9e":[13,0,0,3,1,42,254],
+"group__lwip__opts__stats.html#gaf50575a4895e26ea2c01d1f2269487be":[13,0,0,3,1,42,63],
+"group__lwip__opts__stats.html#gaf50575a4895e26ea2c01d1f2269487be":[11,0,4,0,1,6],
+"group__lwip__opts__tcp.html":[11,0,4,2,3],
+"group__lwip__opts__tcp.html#ga0dee0911197855bdf19ef79778c241a6":[11,0,4,2,3,12],
+"group__lwip__opts__tcp.html#ga0dee0911197855bdf19ef79778c241a6":[13,0,0,3,1,42,284],
+"group__lwip__opts__tcp.html#ga1f57d3859c4556f785708e5dc440617e":[11,0,4,2,3,15],
+"group__lwip__opts__tcp.html#ga1f57d3859c4556f785708e5dc440617e":[13,0,0,3,1,42,287],
+"group__lwip__opts__tcp.html#ga249bc450bb818cf2ef3cf1472ff354fd":[11,0,4,2,3,7],
+"group__lwip__opts__tcp.html#ga249bc450bb818cf2ef3cf1472ff354fd":[13,0,0,3,1,42,200],
+"group__lwip__opts__tcp.html#ga26dee0e5d9c51b1dda0adad29c770a77":[11,0,4,2,3,0],
+"group__lwip__opts__tcp.html#ga26dee0e5d9c51b1dda0adad29c770a77":[13,0,0,3,1,42,68],
+"group__lwip__opts__tcp.html#ga39f76e811117155be8525bb386ecddb7":[11,0,4,2,3,2],
+"group__lwip__opts__tcp.html#ga39f76e811117155be8525bb386ecddb7":[13,0,0,3,1,42,93],
+"group__lwip__opts__tcp.html#ga40b1cdad52eaa91a3f5c242fc92ee223":[11,0,4,2,3,5],
+"group__lwip__opts__tcp.html#ga40b1cdad52eaa91a3f5c242fc92ee223":[13,0,0,3,1,42,198],
+"group__lwip__opts__tcp.html#ga50b434a8541a4813f7b27f576c05d1b6":[11,0,4,2,3,22],
+"group__lwip__opts__tcp.html#ga50b434a8541a4813f7b27f576c05d1b6":[13,0,0,3,1,42,299],
+"group__lwip__opts__tcp.html#ga5648e2580bb55c0efdfbebcf3bad1eef":[11,0,4,2,3,16],
+"group__lwip__opts__tcp.html#ga5648e2580bb55c0efdfbebcf3bad1eef":[13,0,0,3,1,42,289],
+"group__lwip__opts__tcp.html#ga5d45732ba3a8438b141096d86e07ef8d":[13,0,0,3,1,42,303],
+"group__lwip__opts__tcp.html#ga5d45732ba3a8438b141096d86e07ef8d":[11,0,4,2,3,25],
+"group__lwip__opts__tcp.html#ga75659867592a6b01c198532ed1b65698":[11,0,4,2,3,21],
+"group__lwip__opts__tcp.html#ga75659867592a6b01c198532ed1b65698":[13,0,0,3,1,42,297],
+"group__lwip__opts__tcp.html#ga7f535a6efb5cdf86c3210e35ece1d6a7":[11,0,4,2,3,24],
+"group__lwip__opts__tcp.html#ga7f535a6efb5cdf86c3210e35ece1d6a7":[13,0,0,3,1,42,301],
+"group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd":[11,0,4,2,3,18],
+"group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd":[13,0,0,3,1,42,294],
+"group__lwip__opts__tcp.html#ga88dbbfeeeb41b129fdc8235fc08bb530":[11,0,4,2,3,8],
+"group__lwip__opts__tcp.html#ga88dbbfeeeb41b129fdc8235fc08bb530":[13,0,0,3,1,42,209],
+"group__lwip__opts__tcp.html#ga89ffd0d7d1529bdb26bfbad267d0ad75":[11,0,4,2,3,17],
+"group__lwip__opts__tcp.html#ga89ffd0d7d1529bdb26bfbad267d0ad75":[13,0,0,3,1,42,291],
+"group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf":[11,0,4,2,3,10],
+"group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf":[13,0,0,3,1,42,280],
+"group__lwip__opts__tcp.html#ga98b23e7cbd3281915c50a485cb61899d":[13,0,0,3,1,42,283],
+"group__lwip__opts__tcp.html#ga98b23e7cbd3281915c50a485cb61899d":[11,0,4,2,3,11],
+"group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904":[11,0,4,2,3,19],
+"group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904":[13,0,0,3,1,42,295],
+"group__lwip__opts__tcp.html#ga9d6d3219bb5fc0bc760a64114de13c25":[11,0,4,2,3,14],
+"group__lwip__opts__tcp.html#ga9d6d3219bb5fc0bc760a64114de13c25":[13,0,0,3,1,42,286],
+"group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9":[13,0,0,3,1,42,194],
+"group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9":[11,0,4,2,3,3],
+"group__lwip__opts__tcp.html#gaaac0e9f559a8e3c251f3504cebcf44dc":[11,0,4,2,3,4],
+"group__lwip__opts__tcp.html#gaaac0e9f559a8e3c251f3504cebcf44dc":[13,0,0,3,1,42,197],
+"group__lwip__opts__tcp.html#gab03ba0306cf0a99ccce3d100142f60c8":[11,0,4,2,3,1],
+"group__lwip__opts__tcp.html#gab03ba0306cf0a99ccce3d100142f60c8":[13,0,0,3,1,42,69],
+"group__lwip__opts__tcp.html#gac04b84d32251ac558f0c3a8af85ba3a5":[11,0,4,2,3,9],
+"group__lwip__opts__tcp.html#gac04b84d32251ac558f0c3a8af85ba3a5":[13,0,0,3,1,42,277],
+"group__lwip__opts__tcp.html#gacd5b25ea81d2894790d25da5393cdab4":[13,0,0,3,1,42,300],
+"group__lwip__opts__tcp.html#gacd5b25ea81d2894790d25da5393cdab4":[11,0,4,2,3,23],
+"group__lwip__opts__tcp.html#gae5c9866d7cd463ac7b36792182145aec":[13,0,0,3,1,42,296],
+"group__lwip__opts__tcp.html#gae5c9866d7cd463ac7b36792182145aec":[11,0,4,2,3,20],
+"group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b":[11,0,4,2,3,13],
+"group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b":[13,0,0,3,1,42,285],
+"group__lwip__opts__tcp.html#gaf1b6a015d29fea67b906c276e1e8314f":[11,0,4,2,3,6],
+"group__lwip__opts__tcp.html#gaf1b6a015d29fea67b906c276e1e8314f":[13,0,0,3,1,42,199],
+"group__lwip__opts__thread.html":[11,0,4,1,8],
+"group__lwip__opts__thread.html#ga09fe785559b3f0cf108da4440489e335":[13,0,0,3,1,42,23],
+"group__lwip__opts__thread.html#ga09fe785559b3f0cf108da4440489e335":[11,0,4,1,8,6],
+"group__lwip__opts__thread.html#ga1bd172938b9c8ba63156fcafc87e83c7":[11,0,4,1,8,2],
+"group__lwip__opts__thread.html#ga1bd172938b9c8ba63156fcafc87e83c7":[13,0,0,3,1,42,19],
+"group__lwip__opts__thread.html#ga3d8715b1fdd0449d6c214e4a40108456":[13,0,0,3,1,42,21],
+"group__lwip__opts__thread.html#ga3d8715b1fdd0449d6c214e4a40108456":[11,0,4,1,8,4],
+"group__lwip__opts__thread.html#ga405e604e4328e1feb878c6fe1798a587":[11,0,4,1,8,12],
+"group__lwip__opts__thread.html#ga405e604e4328e1feb878c6fe1798a587":[13,0,0,3,1,42,306],
+"group__lwip__opts__thread.html#ga42b2c7a3042d7c3efd00f367f5837435":[11,0,4,1,8,13]
+};
diff --git a/doc/doxygen/output/html/navtreeindex7.js b/doc/doxygen/output/html/navtreeindex7.js
new file mode 100644
index 0000000..f074cd4
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex7.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX7 =
+{
+"group__lwip__opts__thread.html#ga42b2c7a3042d7c3efd00f367f5837435":[13,0,0,3,1,42,307],
+"group__lwip__opts__thread.html#ga4ef8f046c957750056131310a1580df7":[13,0,0,3,1,42,18],
+"group__lwip__opts__thread.html#ga4ef8f046c957750056131310a1580df7":[11,0,4,1,8,1],
+"group__lwip__opts__thread.html#ga5d5a6e04abe2ec233c7acdb09f992461":[13,0,0,3,1,42,17],
+"group__lwip__opts__thread.html#ga5d5a6e04abe2ec233c7acdb09f992461":[11,0,4,1,8,0],
+"group__lwip__opts__thread.html#ga7f93dfeaed4021061959f822def602cb":[13,0,0,3,1,42,22],
+"group__lwip__opts__thread.html#ga7f93dfeaed4021061959f822def602cb":[11,0,4,1,8,5],
+"group__lwip__opts__thread.html#ga8b99d75d9e0a0868567d10c8522915bb":[13,0,0,3,1,42,203],
+"group__lwip__opts__thread.html#ga8b99d75d9e0a0868567d10c8522915bb":[11,0,4,1,8,7],
+"group__lwip__opts__thread.html#ga8cf210ad4e4bf616860a45fbd140fd06":[11,0,4,1,8,11],
+"group__lwip__opts__thread.html#ga8cf210ad4e4bf616860a45fbd140fd06":[13,0,0,3,1,42,305],
+"group__lwip__opts__thread.html#gaa02b84eafa0c8b09b158b97c96d79db0":[11,0,4,1,8,14],
+"group__lwip__opts__thread.html#gaa02b84eafa0c8b09b158b97c96d79db0":[13,0,0,3,1,42,308],
+"group__lwip__opts__thread.html#gab1b9fc2efcbf1f804bfd0191bc019c4e":[13,0,0,3,1,42,268],
+"group__lwip__opts__thread.html#gab1b9fc2efcbf1f804bfd0191bc019c4e":[11,0,4,1,8,9],
+"group__lwip__opts__thread.html#gaca13123a5c8271558353e04123957616":[13,0,0,3,1,42,20],
+"group__lwip__opts__thread.html#gaca13123a5c8271558353e04123957616":[11,0,4,1,8,3],
+"group__lwip__opts__thread.html#gae8ab54a25007ce997bbab6289815e258":[13,0,0,3,1,42,269],
+"group__lwip__opts__thread.html#gae8ab54a25007ce997bbab6289815e258":[11,0,4,1,8,10],
+"group__lwip__opts__thread.html#gae9cd260c56472324a2f0ee5f9597a675":[13,0,0,3,1,42,267],
+"group__lwip__opts__thread.html#gae9cd260c56472324a2f0ee5f9597a675":[11,0,4,1,8,8],
+"group__lwip__opts__threadsafe__apis.html":[11,0,4,3],
+"group__lwip__opts__timers.html":[11,0,4,1,1],
+"group__lwip__opts__timers.html#ga25a41610055f91cbd0960256240b8f2c":[11,0,4,1,1,0],
+"group__lwip__opts__timers.html#ga25a41610055f91cbd0960256240b8f2c":[13,0,0,3,1,42,205],
+"group__lwip__opts__timers.html#gaff0ea56f3e3d8e86c49b50557bc13815":[13,0,0,3,1,42,206],
+"group__lwip__opts__timers.html#gaff0ea56f3e3d8e86c49b50557bc13815":[11,0,4,1,1,1],
+"group__lwip__opts__udp.html":[11,0,4,2,2],
+"group__lwip__opts__udp.html#ga35731bc5f337943e474a15c1cd538a61":[11,0,4,2,2,2],
+"group__lwip__opts__udp.html#ga35731bc5f337943e474a15c1cd538a61":[13,0,0,3,1,42,208],
+"group__lwip__opts__udp.html#ga72021505969c5ce29e972486d7794baa":[13,0,0,3,1,42,162],
+"group__lwip__opts__udp.html#ga72021505969c5ce29e972486d7794baa":[11,0,4,2,2,0],
+"group__lwip__opts__udp.html#ga97908a317bcba89174b5d1ccbdca0096":[11,0,4,2,2,3],
+"group__lwip__opts__udp.html#ga97908a317bcba89174b5d1ccbdca0096":[13,0,0,3,1,42,312],
+"group__lwip__opts__udp.html#gab6030e96e72df649d2650fd32d7a67b3":[11,0,4,2,2,1],
+"group__lwip__opts__udp.html#gab6030e96e72df649d2650fd32d7a67b3":[13,0,0,3,1,42,207],
+"group__lwip__os.html":[11,0,1],
+"group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db":[13,0,0,3,1,51,12],
+"group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db":[13,0,0,0,8,8],
+"group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db":[11,0,1,6],
+"group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666":[13,0,0,3,1,51,11],
+"group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666":[13,0,0,0,8,7],
+"group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666":[11,0,1,5],
+"group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8":[13,0,0,3,1,51,10],
+"group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8":[13,0,0,0,8,6],
+"group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8":[11,0,1,4],
+"group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a":[13,0,0,3,1,51,7],
+"group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a":[13,0,0,0,8,3],
+"group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a":[11,0,1,1],
+"group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd":[13,0,0,3,1,51,8],
+"group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd":[13,0,0,0,8,4],
+"group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd":[11,0,1,2],
+"group__lwip__os.html#gacd0a865623921ada2dd08962eb82c9df":[13,0,0,3,1,51,1],
+"group__lwip__os.html#gacd0a865623921ada2dd08962eb82c9df":[11,0,1,0],
+"group__lwip__os.html#gae510f195171bed8499ae94e264a92717":[13,0,0,3,1,51,14],
+"group__lwip__os.html#gae510f195171bed8499ae94e264a92717":[13,0,0,0,8,10],
+"group__lwip__os.html#gae510f195171bed8499ae94e264a92717":[11,0,1,7],
+"group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020":[13,0,0,3,1,51,15],
+"group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020":[13,0,0,0,8,12],
+"group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020":[11,0,1,8],
+"group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac":[13,0,0,0,8,5],
+"group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac":[13,0,0,3,1,51,9],
+"group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac":[11,0,1,3],
+"group__lwip__version.html":[11,0,3],
+"group__lwip__version.html#ga0a0d322fad0a67aa5b8f1b8c9dfcfe59":[13,0,0,3,1,24,2],
+"group__lwip__version.html#ga0a0d322fad0a67aa5b8f1b8c9dfcfe59":[11,0,3,2],
+"group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50":[13,0,0,3,1,24,6],
+"group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50":[11,0,3,6],
+"group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034":[13,0,0,3,1,24,4],
+"group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034":[11,0,3,4],
+"group__lwip__version.html#ga375ee868e76ed7c458cdf249387bd469":[11,0,3,1],
+"group__lwip__version.html#ga375ee868e76ed7c458cdf249387bd469":[13,0,0,3,1,24,1],
+"group__lwip__version.html#ga4308c06ef36496e00c798d96d7d03246":[13,0,0,3,1,24,3],
+"group__lwip__version.html#ga4308c06ef36496e00c798d96d7d03246":[11,0,3,3],
+"group__lwip__version.html#ga9ca69b1a453eb72efd0bbda333f2a33b":[13,0,0,3,1,24,0],
+"group__lwip__version.html#ga9ca69b1a453eb72efd0bbda333f2a33b":[11,0,3,0],
+"group__lwip__version.html#gab47e87bc38eef94486db402813183ba7":[13,0,0,3,1,24,7],
+"group__lwip__version.html#gab47e87bc38eef94486db402813183ba7":[11,0,3,7],
+"group__lwip__version.html#gac1dc92d8f453a98560de7e2e00a221a1":[13,0,0,3,1,24,5],
+"group__lwip__version.html#gac1dc92d8f453a98560de7e2e00a221a1":[11,0,3,5],
+"group__mdns.html":[11,4,3],
+"group__mdns.html#ga01c85202f4b85edc8b571f2f419db576":[11,4,3,4],
+"group__mdns.html#ga01c85202f4b85edc8b571f2f419db576":[13,0,0,3,1,0,6,5],
+"group__mdns.html#ga01c85202f4b85edc8b571f2f419db576":[13,0,0,1,3,0,11],
+"group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85":[11,4,3,5],
+"group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85":[13,0,0,3,1,0,6,6],
+"group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85":[13,0,0,1,3,0,12],
+"group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad":[11,4,3,6],
+"group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad":[13,0,0,3,1,0,6,7],
+"group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad":[13,0,0,1,3,0,13],
+"group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3":[11,4,3,7],
+"group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3":[13,0,0,3,1,0,6,8],
+"group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3":[13,0,0,1,3,0,14],
+"group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e":[11,4,3,9],
+"group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e":[13,0,0,1,3,0,17],
+"group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e":[13,0,0,3,1,0,6,11],
+"group__mdns.html#ga824e992e94be216c8e059f48f49a59ce":[11,4,3,3],
+"group__mdns.html#ga824e992e94be216c8e059f48f49a59ce":[13,0,0,3,1,0,6,4],
+"group__mdns.html#ga824e992e94be216c8e059f48f49a59ce":[13,0,0,1,3,0,10],
+"group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a":[11,4,3,11],
+"group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a":[13,0,0,3,1,0,6,13],
+"group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a":[13,0,0,1,3,0,19],
+"group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb":[11,4,3,2],
+"group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb":[13,0,0,3,1,0,6,3],
+"group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb":[13,0,0,1,3,0,9],
+"group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c":[11,4,3,8],
+"group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c":[13,0,0,3,1,0,6,10],
+"group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c":[13,0,0,1,3,0,16],
+"group__mdns.html#gab2edba12d5cad1949f7ca040ae12beec":[11,4,3,1],
+"group__mdns.html#gab2edba12d5cad1949f7ca040ae12beec":[13,0,0,3,1,0,6,0],
+"group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9":[11,4,3,10],
+"group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9":[13,0,0,3,1,0,6,12],
+"group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9":[13,0,0,1,3,0,18],
+"group__mdns__opts.html":[11,4,3,0],
+"group__mdns__opts.html#ga172e579cd09a1db51cf224319c012396":[11,4,3,0,2],
+"group__mdns__opts.html#ga172e579cd09a1db51cf224319c012396":[13,0,0,3,1,0,7,2],
+"group__mdns__opts.html#ga53a97502efdcf1214cab4078f93a6dc9":[11,4,3,0,0],
+"group__mdns__opts.html#ga53a97502efdcf1214cab4078f93a6dc9":[13,0,0,3,1,0,7,0],
+"group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6":[11,4,3,0,1],
+"group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6":[13,0,0,3,1,0,7,1],
+"group__mempool.html":[11,1,1],
+"group__mempool.html#ga5b1fb3ce7942432d87cc948b1c5ed6cb":[11,1,1,1],
+"group__mempool.html#ga5b1fb3ce7942432d87cc948b1c5ed6cb":[13,0,0,3,1,35,1],
+"group__mempool.html#ga5e2498f6c17746c1fe7153de5f7f275a":[11,1,1,0],
+"group__mempool.html#ga5e2498f6c17746c1fe7153de5f7f275a":[13,0,0,3,1,35,0],
+"group__mempool.html#ga60b51c06d276f525b35d8b7abd4dcb41":[11,1,1,3],
+"group__mempool.html#ga60b51c06d276f525b35d8b7abd4dcb41":[13,0,0,3,1,35,3],
+"group__mempool.html#ga92fc8c29d0e2654f2a2ecc43b2b7fb13":[11,1,1,4],
+"group__mempool.html#ga92fc8c29d0e2654f2a2ecc43b2b7fb13":[13,0,0,3,1,35,4],
+"group__mempool.html#gaa43d114dd702fbd8f1db18474ea93a04":[11,1,1,2],
+"group__mempool.html#gaa43d114dd702fbd8f1db18474ea93a04":[13,0,0,3,1,35,2],
+"group__mld6.html":[11,2,0,2,1,1],
+"group__mld6.html#ga02a2259082f22c5989a3c929be95e641":[11,2,0,2,1,1,0],
+"group__mld6.html#ga02a2259082f22c5989a3c929be95e641":[13,0,0,3,1,36,1],
+"group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940":[13,0,0,2,1,7,2],
+"group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940":[11,2,0,2,1,1,2],
+"group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940":[13,0,0,3,1,36,4],
+"group__mld6.html#ga53560ab6e47163e4888070830bf912a8":[13,0,0,2,1,7,1],
+"group__mld6.html#ga53560ab6e47163e4888070830bf912a8":[13,0,0,3,1,36,3],
+"group__mld6.html#ga53560ab6e47163e4888070830bf912a8":[11,2,0,2,1,1,1],
+"group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5":[13,0,0,2,1,7,3],
+"group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5":[11,2,0,2,1,1,3],
+"group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5":[13,0,0,3,1,36,5],
+"group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22":[13,0,0,2,1,7,4],
+"group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22":[11,2,0,2,1,1,4],
+"group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22":[13,0,0,3,1,36,6],
+"group__mqtt.html":[11,4,4],
+"group__mqtt.html#ga0f133ef09cbe56c46ebe2cc21afccf3f":[11,4,4,5],
+"group__mqtt.html#ga0f133ef09cbe56c46ebe2cc21afccf3f":[13,0,0,3,1,0,9,3],
+"group__mqtt.html#ga6610174f17b9ecbcf2bc66a4fd5a6b0f":[11,4,4,4],
+"group__mqtt.html#ga6610174f17b9ecbcf2bc66a4fd5a6b0f":[13,0,0,3,1,0,9,2],
+"group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29":[11,4,4,8],
+"group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29":[13,0,0,3,1,0,9,6],
+"group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6":[11,4,4,15],
+"group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6":[13,0,0,3,1,0,9,14],
+"group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6":[13,0,0,1,4,0,10],
+"group__mqtt.html#ga83d6a6d811b201a74d793bc1b5d4e029":[11,4,4,3],
+"group__mqtt.html#ga83d6a6d811b201a74d793bc1b5d4e029":[13,0,0,3,1,0,9,1],
+"group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f":[11,4,4,6],
+"group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f":[13,0,0,3,1,0,9,4],
+"group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d":[11,4,4,10],
+"group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d":[13,0,0,3,1,0,9,9],
+"group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5":[11,4,4,13],
+"group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5":[13,0,0,3,1,0,9,12],
+"group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5":[13,0,0,1,4,0,8],
+"group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882":[11,4,4,12],
+"group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882":[13,0,0,3,1,0,9,11],
+"group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882":[13,0,0,1,4,0,7],
+"group__mqtt.html#gaa8632baff6bbb5004385998918f1e6bd":[11,4,4,2],
+"group__mqtt.html#gaa8632baff6bbb5004385998918f1e6bd":[13,0,0,3,1,0,9,0],
+"group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd":[11,4,4,9],
+"group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd":[13,0,0,3,1,0,9,7],
+"group__mqtt.html#gade9850d716e81fde572cb012be795d2f":[11,4,4,16],
+"group__mqtt.html#gade9850d716e81fde572cb012be795d2f":[13,0,0,1,4,0,11],
+"group__mqtt.html#gade9850d716e81fde572cb012be795d2f":[13,0,0,3,1,0,9,15],
+"group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0":[11,4,4,11],
+"group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0":[13,0,0,3,1,0,9,10],
+"group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0":[13,0,0,1,4,0,6],
+"group__mqtt.html#gae7e19e236eb6122c8c39e93db6f5f53f":[11,4,4,14],
+"group__mqtt.html#gae7e19e236eb6122c8c39e93db6f5f53f":[13,0,0,3,1,0,9,13],
+"group__mqtt.html#gae7e19e236eb6122c8c39e93db6f5f53f":[13,0,0,1,4,0,9],
+"group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103":[13,0,0,1,4,0,13],
+"group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103":[11,4,4,18],
+"group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103":[13,0,0,3,1,0,9,17],
+"group__mqtt.html#gafdfa0e65b217e92835d35858924565cf":[11,4,4,17],
+"group__mqtt.html#gafdfa0e65b217e92835d35858924565cf":[13,0,0,3,1,0,9,16],
+"group__mqtt.html#gafdfa0e65b217e92835d35858924565cf":[13,0,0,1,4,0,12],
+"group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81":[11,4,4,7],
+"group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81":[13,0,0,3,1,0,9,5],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da074dc1d289b8e8d4aad91f6a2cb93dc1":[11,4,4,10,0],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da074dc1d289b8e8d4aad91f6a2cb93dc1":[13,0,0,3,1,0,9,9,0],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da28ffe49b0175adaa2b9a27cb4873224a":[11,4,4,10,2],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da28ffe49b0175adaa2b9a27cb4873224a":[13,0,0,3,1,0,9,9,2],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da290cf9037054c42022cc864cfade896a":[11,4,4,10,4],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da290cf9037054c42022cc864cfade896a":[13,0,0,3,1,0,9,9,4],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da321f5ce31b173f235de1a517fcfd00dd":[11,4,4,10,6],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da321f5ce31b173f235de1a517fcfd00dd":[13,0,0,3,1,0,9,9,6],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da41f8aa97142be337cb639f94d9145190":[11,4,4,10,1],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da41f8aa97142be337cb639f94d9145190":[13,0,0,3,1,0,9,9,1],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62":[11,4,4,10,7],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62":[13,0,0,3,1,0,9,9,7],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a":[11,4,4,10,3],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a":[13,0,0,3,1,0,9,9,3],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dafc4888158dd6ee84269a5f0bfdc12b17":[11,4,4,10,5],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dafc4888158dd6ee84269a5f0bfdc12b17":[13,0,0,3,1,0,9,9,5],
+"group__mqtt.html#gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f":[11,4,4,9,0],
+"group__mqtt.html#gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f":[13,0,0,3,1,0,9,8],
+"group__mqtt__opts.html":[11,4,4,0],
+"group__mqtt__opts.html#ga1d89fda808c7047eab7a67d3785aea8e":[11,4,4,0,1],
+"group__mqtt__opts.html#ga1d89fda808c7047eab7a67d3785aea8e":[13,0,0,3,1,0,10,1],
+"group__mqtt__opts.html#ga262639f2b45f6e064fb53156396d6d0a":[11,4,4,0,4],
+"group__mqtt__opts.html#ga262639f2b45f6e064fb53156396d6d0a":[13,0,0,3,1,0,10,4],
+"group__mqtt__opts.html#ga70627bafaffa071875cee9edc38d942b":[11,4,4,0,2],
+"group__mqtt__opts.html#ga70627bafaffa071875cee9edc38d942b":[13,0,0,3,1,0,10,2],
+"group__mqtt__opts.html#ga8275ef78a85fb14c3ac1423c70e45805":[11,4,4,0,5],
+"group__mqtt__opts.html#ga8275ef78a85fb14c3ac1423c70e45805":[13,0,0,3,1,0,10,5],
+"group__mqtt__opts.html#gac5d0580d1caf57dac1cb56662e5d9f7b":[11,4,4,0,0],
+"group__mqtt__opts.html#gac5d0580d1caf57dac1cb56662e5d9f7b":[13,0,0,3,1,0,10,0],
+"group__mqtt__opts.html#gae82460b35de2291e9661e440c3458e8f":[11,4,4,0,3],
+"group__mqtt__opts.html#gae82460b35de2291e9661e440c3458e8f":[13,0,0,3,1,0,10,3],
+"group__netbiosns.html":[11,4,5],
+"group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b":[13,0,0,1,5,0,9],
+"group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b":[11,4,5,1],
+"group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b":[13,0,0,3,1,0,12,0],
+"group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806":[13,0,0,1,5,0,10],
+"group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806":[11,4,5,2],
+"group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806":[13,0,0,3,1,0,12,1],
+"group__netbiosns__opts.html":[11,4,5,0],
+"group__netbiosns__opts.html#ga468c2ae67a79ce082ee585a438f7373b":[11,4,5,0,1],
+"group__netbiosns__opts.html#ga468c2ae67a79ce082ee585a438f7373b":[13,0,0,3,1,0,13,1],
+"group__netbiosns__opts.html#gaa9dec8fc3dee5e72fbe9b854437bce84":[11,4,5,0,0],
+"group__netbiosns__opts.html#gaa9dec8fc3dee5e72fbe9b854437bce84":[13,0,0,3,1,0,13,0],
+"group__netbuf.html":[11,2,1,0,3],
+"group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b":[13,0,0,0,4,5],
+"group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b":[13,0,0,3,1,38,8],
+"group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b":[11,2,1,0,3,5],
+"group__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01":[13,0,0,0,4,2],
+"group__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01":[11,2,1,0,3,2],
+"group__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01":[13,0,0,3,1,38,5],
+"group__netbuf.html#ga0b831b80d3aa64938abdbfb6d89eaac0":[13,0,0,0,4,0],
+"group__netbuf.html#ga0b831b80d3aa64938abdbfb6d89eaac0":[11,2,1,0,3,0],
+"group__netbuf.html#ga0b831b80d3aa64938abdbfb6d89eaac0":[13,0,0,3,1,38,3],
+"group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51":[11,2,1,0,3,4],
+"group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51":[13,0,0,0,4,4],
+"group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51":[13,0,0,3,1,38,7],
+"group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602":[11,2,1,0,3,1],
+"group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602":[13,0,0,0,4,1],
+"group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602":[13,0,0,3,1,38,4],
+"group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d":[11,2,1,0,3,3],
+"group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d":[13,0,0,0,4,3]
+};
diff --git a/doc/doxygen/output/html/navtreeindex8.js b/doc/doxygen/output/html/navtreeindex8.js
new file mode 100644
index 0000000..4a1645e
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex8.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX8 =
+{
+"group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d":[13,0,0,3,1,38,6],
+"group__netbuf.html#gaaba704cd963e35e71145de9f5112991d":[11,2,1,0,3,6],
+"group__netbuf.html#gaaba704cd963e35e71145de9f5112991d":[13,0,0,3,1,38,9],
+"group__netbuf.html#gaaba704cd963e35e71145de9f5112991d":[13,0,0,0,4,6],
+"group__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2":[13,0,0,0,4,8],
+"group__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2":[11,2,1,0,3,8],
+"group__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2":[13,0,0,3,1,38,11],
+"group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715":[11,2,1,0,3,7],
+"group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715":[13,0,0,0,4,7],
+"group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715":[13,0,0,3,1,38,10],
+"group__netconn.html":[11,2,1,0],
+"group__netconn__common.html":[11,2,1,0,0],
+"group__netconn__common.html#ga1065e769f2276270722a7700182077bc":[13,0,0,3,1,6,16],
+"group__netconn__common.html#ga1065e769f2276270722a7700182077bc":[11,2,1,0,0,3],
+"group__netconn__common.html#ga37ec33522cfc26fa57251c33e4cebb3e":[13,0,0,3,1,6,3],
+"group__netconn__common.html#ga37ec33522cfc26fa57251c33e4cebb3e":[11,2,1,0,0,0],
+"group__netconn__common.html#ga50490bab058f4e740798beffcf48cabf":[11,2,1,0,0,13],
+"group__netconn__common.html#ga50490bab058f4e740798beffcf48cabf":[13,0,0,3,1,6,43],
+"group__netconn__common.html#ga50490bab058f4e740798beffcf48cabf":[13,0,0,0,0,15],
+"group__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230":[13,0,0,3,1,6,29],
+"group__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230":[13,0,0,0,0,1],
+"group__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230":[11,2,1,0,0,6],
+"group__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5":[13,0,0,3,1,6,30],
+"group__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5":[13,0,0,0,0,2],
+"group__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5":[11,2,1,0,0,7],
+"group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91":[13,0,0,3,1,6,27],
+"group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91":[11,2,1,0,0,5],
+"group__netconn__common.html#gab2bd1d5e633e14e428cfc0ca908d5e0c":[13,0,0,3,1,6,15],
+"group__netconn__common.html#gab2bd1d5e633e14e428cfc0ca908d5e0c":[11,2,1,0,0,2],
+"group__netconn__common.html#gab411221f912a6d9e4c82ac3963989403":[13,0,0,3,1,6,33],
+"group__netconn__common.html#gab411221f912a6d9e4c82ac3963989403":[13,0,0,0,0,5],
+"group__netconn__common.html#gab411221f912a6d9e4c82ac3963989403":[11,2,1,0,0,9],
+"group__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4":[13,0,0,3,1,6,35],
+"group__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4":[13,0,0,0,0,7],
+"group__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4":[11,2,1,0,0,10],
+"group__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77":[13,0,0,3,1,6,32],
+"group__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77":[13,0,0,0,0,4],
+"group__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77":[11,2,1,0,0,8],
+"group__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0":[13,0,0,3,1,6,42],
+"group__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0":[13,0,0,0,0,14],
+"group__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0":[11,2,1,0,0,12],
+"group__netconn__common.html#gae56911e2d92bebf43d73e116530e41f1":[13,0,0,3,1,6,17],
+"group__netconn__common.html#gae56911e2d92bebf43d73e116530e41f1":[11,2,1,0,0,4],
+"group__netconn__common.html#gaf001c7d5fbf97c04eb1d9ac7d14c9c31":[13,0,0,3,1,6,10],
+"group__netconn__common.html#gaf001c7d5fbf97c04eb1d9ac7d14c9c31":[11,2,1,0,0,1],
+"group__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5":[13,0,0,3,1,6,37],
+"group__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5":[13,0,0,0,0,9],
+"group__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5":[11,2,1,0,0,11],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a0d828a7e9c1614d4cae56602b09f39e9":[13,0,0,3,1,6,27,8],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a0d828a7e9c1614d4cae56602b09f39e9":[11,2,1,0,0,5,8],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a2c7f548d26f6c411f084b6c59247b60e":[13,0,0,3,1,6,27,7],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a2c7f548d26f6c411f084b6c59247b60e":[11,2,1,0,0,5,7],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a34ee1c89f6705462590a4fe2c9772d9e":[13,0,0,3,1,6,27,5],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a34ee1c89f6705462590a4fe2c9772d9e":[11,2,1,0,0,5,5],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a655e1625cc7e6a93f1e3d2646f56a1e4":[13,0,0,3,1,6,27,3],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a655e1625cc7e6a93f1e3d2646f56a1e4":[11,2,1,0,0,5,3],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a6b8ec191d69f7e639f4ab40779069636":[13,0,0,3,1,6,27,2],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a6b8ec191d69f7e639f4ab40779069636":[11,2,1,0,0,5,2],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a75d14318b91af7a452230189f47e5e1a":[13,0,0,3,1,6,27,0],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a75d14318b91af7a452230189f47e5e1a":[11,2,1,0,0,5,0],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a7e0c3f566b3d4321b36b711b6b1ad6de":[13,0,0,3,1,6,27,4],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a7e0c3f566b3d4321b36b711b6b1ad6de":[11,2,1,0,0,5,4],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91aa9cabc9d90606b5c5939fcc02ac588c7":[13,0,0,3,1,6,27,6],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91aa9cabc9d90606b5c5939fcc02ac588c7":[11,2,1,0,0,5,6],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91ae7efa7c4e50b7b381531a2136cd5a013":[13,0,0,3,1,6,27,1],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91ae7efa7c4e50b7b381531a2136cd5a013":[11,2,1,0,0,5,1],
+"group__netconn__tcp.html":[11,2,1,0,1],
+"group__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69":[11,2,1,0,1,2],
+"group__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69":[13,0,0,3,1,6,28],
+"group__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69":[13,0,0,0,0,0],
+"group__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624":[11,2,1,0,1,3],
+"group__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624":[13,0,0,3,1,6,31],
+"group__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624":[13,0,0,0,0,3],
+"group__netconn__tcp.html#ga43e3f4c2169dec0f666c502e490416b7":[11,2,1,0,1,0],
+"group__netconn__tcp.html#ga43e3f4c2169dec0f666c502e490416b7":[13,0,0,3,1,6,14],
+"group__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490":[11,2,1,0,1,5],
+"group__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490":[13,0,0,3,1,6,44],
+"group__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490":[13,0,0,0,0,16],
+"group__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63":[11,2,1,0,1,7],
+"group__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63":[13,0,0,3,1,6,50],
+"group__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63":[13,0,0,0,0,22],
+"group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d":[11,2,1,0,1,4],
+"group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d":[13,0,0,3,1,6,40],
+"group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d":[13,0,0,0,0,12],
+"group__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294":[13,0,0,3,1,6,45],
+"group__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294":[11,2,1,0,1,6],
+"group__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294":[13,0,0,0,0,17],
+"group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf":[11,2,1,0,1,8],
+"group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf":[13,0,0,3,1,6,51],
+"group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf":[13,0,0,0,0,23],
+"group__netconn__tcp.html#gafea5e9b90770a7c6cd0762ceb65e5b46":[11,2,1,0,1,1],
+"group__netconn__tcp.html#gafea5e9b90770a7c6cd0762ceb65e5b46":[13,0,0,3,1,6,22],
+"group__netconn__udp.html":[11,2,1,0,2],
+"group__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b":[13,0,0,3,1,6,39],
+"group__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b":[13,0,0,0,0,11],
+"group__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b":[11,2,1,0,2,2],
+"group__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c":[11,2,1,0,2,4],
+"group__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c":[13,0,0,3,1,6,49],
+"group__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c":[13,0,0,0,0,21],
+"group__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402":[13,0,0,3,1,6,34],
+"group__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402":[13,0,0,0,0,6],
+"group__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402":[11,2,1,0,2,0],
+"group__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed":[11,2,1,0,2,1],
+"group__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed":[13,0,0,3,1,6,38],
+"group__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed":[13,0,0,0,0,10],
+"group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238":[11,2,1,0,2,3],
+"group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238":[13,0,0,3,1,6,48],
+"group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238":[13,0,0,0,0,20],
+"group__netdbapi.html":[11,2,2,1],
+"group__netdbapi.html#ga39746b4b096060ca3e8c6ee7a7560b1d":[11,2,2,1,2],
+"group__netdbapi.html#ga39746b4b096060ca3e8c6ee7a7560b1d":[13,0,0,3,1,39,3],
+"group__netdbapi.html#ga558191530d91c101621b49e43bd5bbf5":[13,0,0,3,1,39,2],
+"group__netdbapi.html#ga558191530d91c101621b49e43bd5bbf5":[11,2,2,1,1],
+"group__netdbapi.html#ga76204a4d646dba393f88aa9b0980fc07":[11,2,2,1,3],
+"group__netdbapi.html#ga76204a4d646dba393f88aa9b0980fc07":[13,0,0,3,1,39,4],
+"group__netdbapi.html#gab28cd3049bcf6e2bc3a71e968a64a92d":[11,2,2,1,0],
+"group__netdbapi.html#gab28cd3049bcf6e2bc3a71e968a64a92d":[13,0,0,3,1,39,1],
+"group__netif.html":[11,2,0,3],
+"group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4":[13,0,0,2,12,24],
+"group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4":[11,2,0,3,25],
+"group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4":[13,0,0,3,1,40,76],
+"group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716":[13,0,0,2,12,18],
+"group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716":[11,2,0,3,22],
+"group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716":[13,0,0,3,1,40,70],
+"group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce":[13,0,0,2,12,28],
+"group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce":[11,2,0,3,28],
+"group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce":[13,0,0,3,1,40,80],
+"group__netif.html#ga3428b3f8195249c6cd8704a4db46b401":[13,0,0,3,1,40,39],
+"group__netif.html#ga3428b3f8195249c6cd8704a4db46b401":[11,2,0,3,9],
+"group__netif.html#ga34e37a1e8e358760dc1c43887922c7db":[13,0,0,2,12,25],
+"group__netif.html#ga34e37a1e8e358760dc1c43887922c7db":[11,2,0,3,26],
+"group__netif.html#ga34e37a1e8e358760dc1c43887922c7db":[13,0,0,3,1,40,77],
+"group__netif.html#ga3efc2b72f75936d50708247420c9d1d9":[13,0,0,2,12,1],
+"group__netif.html#ga3efc2b72f75936d50708247420c9d1d9":[11,2,0,3,14],
+"group__netif.html#ga3efc2b72f75936d50708247420c9d1d9":[13,0,0,3,1,40,53],
+"group__netif.html#ga3ff104d083914e87a7805a0b90a85755":[13,0,0,2,12,9],
+"group__netif.html#ga3ff104d083914e87a7805a0b90a85755":[11,2,0,3,18],
+"group__netif.html#ga3ff104d083914e87a7805a0b90a85755":[13,0,0,3,1,40,61],
+"group__netif.html#ga5a378ba73e60cd1e5235474f0db22978":[13,0,0,3,1,40,24],
+"group__netif.html#ga5a378ba73e60cd1e5235474f0db22978":[11,2,0,3,6],
+"group__netif.html#ga5e5d2c6fa5566a24dd848f3a2c7c957f":[13,0,0,3,1,40,38],
+"group__netif.html#ga5e5d2c6fa5566a24dd848f3a2c7c957f":[11,2,0,3,8],
+"group__netif.html#ga5ee213cea065424c89c66f138c008da1":[13,0,0,3,1,40,41],
+"group__netif.html#ga5ee213cea065424c89c66f138c008da1":[11,2,0,3,11],
+"group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf":[13,0,0,2,12,21],
+"group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf":[11,2,0,3,24],
+"group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf":[13,0,0,3,1,40,73],
+"group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2":[13,0,0,2,12,14],
+"group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2":[11,2,0,3,19],
+"group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2":[13,0,0,3,1,40,66],
+"group__netif.html#ga69c93a139e8a1f6ef4e3d076a2897def":[13,0,0,2,12,6],
+"group__netif.html#ga69c93a139e8a1f6ef4e3d076a2897def":[13,0,0,3,1,40,58],
+"group__netif.html#ga69c93a139e8a1f6ef4e3d076a2897def":[11,2,0,3,16],
+"group__netif.html#ga94a4c24c988afc0a577387730f303b19":[13,0,0,3,1,40,34],
+"group__netif.html#ga94a4c24c988afc0a577387730f303b19":[11,2,0,3,7],
+"group__netif.html#ga97f30bb5542e4c07d3b32e3c754e104c":[13,0,0,3,1,40,40],
+"group__netif.html#ga97f30bb5542e4c07d3b32e3c754e104c":[11,2,0,3,10],
+"group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979":[13,0,0,2,12,17],
+"group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979":[13,0,0,3,1,40,69],
+"group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979":[11,2,0,3,21],
+"group__netif.html#gab2b9387389513a02027c62e246723808":[13,0,0,3,1,40,47],
+"group__netif.html#gab2b9387389513a02027c62e246723808":[11,2,0,3,12],
+"group__netif.html#gac20150ac754ff1f88afeaa33be3552a4":[13,0,0,2,12,3],
+"group__netif.html#gac20150ac754ff1f88afeaa33be3552a4":[13,0,0,3,1,40,55],
+"group__netif.html#gac20150ac754ff1f88afeaa33be3552a4":[11,2,0,3,15],
+"group__netif.html#gac763a1f647fb9e8af4254418e813a6ae":[13,0,0,2,12,15],
+"group__netif.html#gac763a1f647fb9e8af4254418e813a6ae":[11,2,0,3,20],
+"group__netif.html#gac763a1f647fb9e8af4254418e813a6ae":[13,0,0,3,1,40,67],
+"group__netif.html#gac90f290edd005238d62aa94c4ac9dea3":[13,0,0,2,12,20],
+"group__netif.html#gac90f290edd005238d62aa94c4ac9dea3":[11,2,0,3,23],
+"group__netif.html#gac90f290edd005238d62aa94c4ac9dea3":[13,0,0,3,1,40,72],
+"group__netif.html#gadc8787b23ac0ee023979cbadf87813d4":[13,0,0,2,12,29],
+"group__netif.html#gadc8787b23ac0ee023979cbadf87813d4":[11,2,0,3,29],
+"group__netif.html#gadc8787b23ac0ee023979cbadf87813d4":[13,0,0,3,1,40,81],
+"group__netif.html#gade5498543e74067f28cc6bef0209e3be":[13,0,0,2,12,0],
+"group__netif.html#gade5498543e74067f28cc6bef0209e3be":[11,2,0,3,13],
+"group__netif.html#gade5498543e74067f28cc6bef0209e3be":[13,0,0,3,1,40,52],
+"group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea":[13,0,0,2,12,26],
+"group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea":[13,0,0,3,1,40,78],
+"group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea":[11,2,0,3,27],
+"group__netif.html#gae4df885347c800a5486d3bf25981300e":[13,0,0,2,12,7],
+"group__netif.html#gae4df885347c800a5486d3bf25981300e":[13,0,0,3,1,40,59],
+"group__netif.html#gae4df885347c800a5486d3bf25981300e":[11,2,0,3,17],
+"group__netif.html#gaf19693be401a265a52d2a56c65753121":[13,0,0,2,12,30],
+"group__netif.html#gaf19693be401a265a52d2a56c65753121":[13,0,0,3,1,40,82],
+"group__netif.html#gaf19693be401a265a52d2a56c65753121":[11,2,0,3,30],
+"group__netif__cd.html":[11,2,0,3,2],
+"group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5":[13,0,0,3,1,40,23],
+"group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5":[11,2,0,3,2,0],
+"group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978":[13,0,0,2,12,4],
+"group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978":[13,0,0,3,1,40,56],
+"group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978":[11,2,0,3,2,2],
+"group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f":[13,0,0,3,1,40,37],
+"group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f":[11,2,0,3,2,1],
+"group__netif__flags.html":[11,2,0,3,3],
+"group__netif__flags.html#ga75f5a2b9276c93e3bd18a568459fd2d8":[11,2,0,3,3,4],
+"group__netif__flags.html#ga75f5a2b9276c93e3bd18a568459fd2d8":[13,0,0,3,1,40,20],
+"group__netif__flags.html#ga76ad9d0cf9f029df0ab2a998c64040dc":[13,0,0,3,1,40,18],
+"group__netif__flags.html#ga76ad9d0cf9f029df0ab2a998c64040dc":[11,2,0,3,3,2],
+"group__netif__flags.html#ga92448dc510bc8d700c09e5c971ef0676":[11,2,0,3,3,1],
+"group__netif__flags.html#ga92448dc510bc8d700c09e5c971ef0676":[13,0,0,3,1,40,17],
+"group__netif__flags.html#gab14fbe1447d2fdbdf5abc87f51eb6508":[11,2,0,3,3,5],
+"group__netif__flags.html#gab14fbe1447d2fdbdf5abc87f51eb6508":[13,0,0,3,1,40,21],
+"group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e":[11,2,0,3,3,6],
+"group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e":[13,0,0,3,1,40,22],
+"group__netif__flags.html#gac9493b923d733c73f6006d9714826558":[11,2,0,3,3,3],
+"group__netif__flags.html#gac9493b923d733c73f6006d9714826558":[13,0,0,3,1,40,19],
+"group__netif__flags.html#gaef64fe15c82bc7b235366923e517104e":[11,2,0,3,3,0],
+"group__netif__flags.html#gaef64fe15c82bc7b235366923e517104e":[13,0,0,3,1,40,16],
+"group__netif__ip4.html":[11,2,0,3,0],
+"group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53":[13,0,0,2,12,27],
+"group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53":[13,0,0,3,1,40,79],
+"group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53":[11,2,0,3,0,9],
+"group__netif__ip4.html#ga54179a2f3b7cc35b23ee8d692d8d8022":[11,2,0,3,0,3],
+"group__netif__ip4.html#ga54179a2f3b7cc35b23ee8d692d8d8022":[13,0,0,3,1,40,29],
+"group__netif__ip4.html#ga58518602f388d2640985a01a312f0a51":[11,2,0,3,0,5],
+"group__netif__ip4.html#ga58518602f388d2640985a01a312f0a51":[13,0,0,3,1,40,32],
+"group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca":[13,0,0,2,12,23],
+"group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca":[13,0,0,3,1,40,75],
+"group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca":[11,2,0,3,0,8],
+"group__netif__ip4.html#ga7ea95478e000701423b7f6316e575a2a":[13,0,0,3,1,40,31],
+"group__netif__ip4.html#ga7ea95478e000701423b7f6316e575a2a":[11,2,0,3,0,4],
+"group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520":[13,0,0,2,12,22],
+"group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520":[13,0,0,3,1,40,74],
+"group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520":[11,2,0,3,0,7],
+"group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1":[13,0,0,2,12,19],
+"group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1":[13,0,0,3,1,40,71],
+"group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1":[11,2,0,3,0,6],
+"group__netif__ip4.html#ga86d69faf416765b7f8faf60a43cc50da":[13,0,0,3,1,40,26],
+"group__netif__ip4.html#ga86d69faf416765b7f8faf60a43cc50da":[11,2,0,3,0,1],
+"group__netif__ip4.html#ga952d1436f2428b92fc8197bcf2f8fca3":[11,2,0,3,0,2],
+"group__netif__ip4.html#ga952d1436f2428b92fc8197bcf2f8fca3":[13,0,0,3,1,40,27],
+"group__netif__ip4.html#gac9b6e63b5dd2968fe0a4813f3eefb55d":[11,2,0,3,0,0],
+"group__netif__ip4.html#gac9b6e63b5dd2968fe0a4813f3eefb55d":[13,0,0,3,1,40,25],
+"group__netif__ip6.html":[11,2,0,3,1],
+"group__netif__ip6.html#ga7ec0623f1a858a0cdb187beaa89df365":[13,0,0,3,1,40,28],
+"group__netif__ip6.html#ga7ec0623f1a858a0cdb187beaa89df365":[11,2,0,3,1,0],
+"group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f":[13,0,0,2,12,13],
+"group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f":[13,0,0,3,1,40,65],
+"group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f":[11,2,0,3,1,5],
+"group__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327":[13,0,0,2,12,2],
+"group__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327":[13,0,0,3,1,40,54],
+"group__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327":[11,2,0,3,1,2],
+"group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb":[13,0,0,2,12,12],
+"group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb":[13,0,0,3,1,40,64],
+"group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb":[11,2,0,3,1,4],
+"group__netif__ip6.html#gae424e336fe9f013b30d4065fd35c91ee":[13,0,0,3,1,40,30],
+"group__netif__ip6.html#gae424e336fe9f013b30d4065fd35c91ee":[11,2,0,3,1,1],
+"group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9":[13,0,0,3,1,40,57],
+"group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9":[13,0,0,2,12,5]
+};
diff --git a/doc/doxygen/output/html/navtreeindex9.js b/doc/doxygen/output/html/navtreeindex9.js
new file mode 100644
index 0000000..cc7a5f4
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex9.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX9 =
+{
+"group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9":[11,2,0,3,1,3],
+"group__netif__mib2.html":[11,2,0,3,4],
+"group__netif__mib2.html#ga05641438775014b7e13b9e55eba48bed":[11,2,0,3,4,2],
+"group__netif__mib2.html#ga05641438775014b7e13b9e55eba48bed":[13,0,0,3,1,45,2],
+"group__netif__mib2.html#ga15378b8dcd2a9dc2985142d864a767ba":[11,2,0,3,4,4],
+"group__netif__mib2.html#ga15378b8dcd2a9dc2985142d864a767ba":[13,0,0,3,1,45,4],
+"group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f":[11,2,0,3,4,3],
+"group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f":[13,0,0,3,1,45,3],
+"group__netif__mib2.html#ga5be1b8cba1d67bf6e7f8851ec91b10f0":[11,2,0,3,4,1],
+"group__netif__mib2.html#ga5be1b8cba1d67bf6e7f8851ec91b10f0":[13,0,0,3,1,45,1],
+"group__netifapi.html":[11,2,1,1],
+"group__netifapi__autoip.html":[11,2,1,1,2],
+"group__netifapi__autoip.html#gaca26bae2a21e0732a7599df14f880af2":[11,2,1,1,2,0],
+"group__netifapi__autoip.html#gaca26bae2a21e0732a7599df14f880af2":[13,0,0,3,1,41,0],
+"group__netifapi__autoip.html#gae604f96907a52557e4ebd1bd5d80071d":[11,2,1,1,2,1],
+"group__netifapi__autoip.html#gae604f96907a52557e4ebd1bd5d80071d":[13,0,0,3,1,41,1],
+"group__netifapi__dhcp4.html":[11,2,1,1,1],
+"group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134":[11,2,1,1,1,2],
+"group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134":[13,0,0,3,1,41,4],
+"group__netifapi__dhcp4.html#ga2322c0d0e3eb6c1097d6f3942905dbd5":[11,2,1,1,1,5],
+"group__netifapi__dhcp4.html#ga2322c0d0e3eb6c1097d6f3942905dbd5":[13,0,0,3,1,41,7],
+"group__netifapi__dhcp4.html#ga29108975e9aa6463b9a574de961317e0":[11,2,1,1,1,0],
+"group__netifapi__dhcp4.html#ga29108975e9aa6463b9a574de961317e0":[13,0,0,3,1,41,2],
+"group__netifapi__dhcp4.html#ga5aeaee24c11128df90a56fe091c9d409":[13,0,0,3,1,41,3],
+"group__netifapi__dhcp4.html#ga5aeaee24c11128df90a56fe091c9d409":[11,2,1,1,1,1],
+"group__netifapi__dhcp4.html#ga642390e5efa53ad3095e01331c6a936b":[11,2,1,1,1,3],
+"group__netifapi__dhcp4.html#ga642390e5efa53ad3095e01331c6a936b":[13,0,0,3,1,41,5],
+"group__netifapi__dhcp4.html#gae64d13afc6e3b0f21aae04b66d0e3765":[13,0,0,3,1,41,6],
+"group__netifapi__dhcp4.html#gae64d13afc6e3b0f21aae04b66d0e3765":[11,2,1,1,1,4],
+"group__netifapi__netif.html":[11,2,1,1,0],
+"group__netifapi__netif.html#ga0e3f522b900a0ba04421c4587e790373":[11,2,1,1,0,0],
+"group__netifapi__netif.html#ga0e3f522b900a0ba04421c4587e790373":[13,0,0,3,1,41,8],
+"group__netifapi__netif.html#ga22c02edde32743ccfd41924da0601a16":[13,0,0,3,1,41,10],
+"group__netifapi__netif.html#ga22c02edde32743ccfd41924da0601a16":[11,2,1,1,0,2],
+"group__netifapi__netif.html#ga2a9694804743f5466c4ecc400b7f07e4":[13,0,0,3,1,41,11],
+"group__netifapi__netif.html#ga2a9694804743f5466c4ecc400b7f07e4":[11,2,1,1,0,3],
+"group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973":[11,2,1,1,0,9],
+"group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973":[13,0,0,3,1,41,20],
+"group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973":[13,0,0,0,6,6],
+"group__netifapi__netif.html#ga6ce735fe79efe1739e53b7f0e975ac76":[11,2,1,1,0,5],
+"group__netifapi__netif.html#ga6ce735fe79efe1739e53b7f0e975ac76":[13,0,0,3,1,41,13],
+"group__netifapi__netif.html#ga862d6cfa5d36b2c36d7b1671e8d95ccf":[11,2,1,1,0,1],
+"group__netifapi__netif.html#ga862d6cfa5d36b2c36d7b1671e8d95ccf":[13,0,0,3,1,41,9],
+"group__netifapi__netif.html#gab7914d77d0a89fd6c31048feb0bdafb6":[13,0,0,0,6,4],
+"group__netifapi__netif.html#gab7914d77d0a89fd6c31048feb0bdafb6":[11,2,1,1,0,7],
+"group__netifapi__netif.html#gab7914d77d0a89fd6c31048feb0bdafb6":[13,0,0,3,1,41,18],
+"group__netifapi__netif.html#gac054a60a32447019913d34da63924853":[11,2,1,1,0,4],
+"group__netifapi__netif.html#gac054a60a32447019913d34da63924853":[13,0,0,3,1,41,12],
+"group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519":[13,0,0,0,6,2],
+"group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519":[11,2,1,1,0,6],
+"group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519":[13,0,0,3,1,41,16],
+"group__netifapi__netif.html#gad4a821182d01eafa4ca258f958fcb089":[13,0,0,0,6,5],
+"group__netifapi__netif.html#gad4a821182d01eafa4ca258f958fcb089":[11,2,1,1,0,8],
+"group__netifapi__netif.html#gad4a821182d01eafa4ca258f958fcb089":[13,0,0,3,1,41,19],
+"group__netifs.html":[11,3],
+"group__pbuf.html":[11,1,2],
+"group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448":[11,1,2,16],
+"group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448":[13,0,0,2,13,20],
+"group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448":[13,0,0,3,1,43,42],
+"group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974":[11,1,2,15],
+"group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974":[13,0,0,2,13,19],
+"group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974":[13,0,0,3,1,43,41],
+"group__pbuf.html#ga4caa46c6d560d9d0da2be845bc9c2fab":[11,1,2,4],
+"group__pbuf.html#ga4caa46c6d560d9d0da2be845bc9c2fab":[13,0,0,2,13,3],
+"group__pbuf.html#ga4caa46c6d560d9d0da2be845bc9c2fab":[13,0,0,3,1,43,25],
+"group__pbuf.html#ga50abfe830a33a1a47a562febee66015d":[11,1,2,18],
+"group__pbuf.html#ga50abfe830a33a1a47a562febee66015d":[13,0,0,2,13,22],
+"group__pbuf.html#ga50abfe830a33a1a47a562febee66015d":[13,0,0,3,1,43,44],
+"group__pbuf.html#ga54ac7b116c6f53c704cbf74f35a8b35c":[11,1,2,9],
+"group__pbuf.html#ga54ac7b116c6f53c704cbf74f35a8b35c":[13,0,0,2,13,9],
+"group__pbuf.html#ga54ac7b116c6f53c704cbf74f35a8b35c":[13,0,0,3,1,43,31],
+"group__pbuf.html#ga6a961522d81f0327aaf4d4ee6d96c583":[11,1,2,20],
+"group__pbuf.html#ga6a961522d81f0327aaf4d4ee6d96c583":[13,0,0,2,13,25],
+"group__pbuf.html#ga6a961522d81f0327aaf4d4ee6d96c583":[13,0,0,3,1,43,47],
+"group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6":[11,1,2,13],
+"group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6":[13,0,0,2,13,15],
+"group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6":[13,0,0,3,1,43,37],
+"group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e":[11,1,2,19],
+"group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e":[13,0,0,2,13,23],
+"group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e":[13,0,0,3,1,43,45],
+"group__pbuf.html#ga82429084fe29015509c9b4a072707cd4":[11,1,2,6],
+"group__pbuf.html#ga82429084fe29015509c9b4a072707cd4":[13,0,0,2,13,5],
+"group__pbuf.html#ga82429084fe29015509c9b4a072707cd4":[13,0,0,3,1,43,27],
+"group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891":[11,1,2,7],
+"group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891":[13,0,0,3,1,43,28],
+"group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891":[13,0,0,2,13,6],
+"group__pbuf.html#ga839f342803b0cf89049744124c5a98ad":[11,1,2,23],
+"group__pbuf.html#ga839f342803b0cf89049744124c5a98ad":[13,0,0,2,13,29],
+"group__pbuf.html#ga839f342803b0cf89049744124c5a98ad":[13,0,0,3,1,43,51],
+"group__pbuf.html#ga894d91d811fd986f3cc3da828fa7beb3":[11,1,2,0],
+"group__pbuf.html#ga894d91d811fd986f3cc3da828fa7beb3":[13,0,0,3,1,43,12],
+"group__pbuf.html#ga90fa2bbf6ea4a263ee8f7b77c75683c2":[11,1,2,5],
+"group__pbuf.html#ga90fa2bbf6ea4a263ee8f7b77c75683c2":[13,0,0,2,13,4],
+"group__pbuf.html#ga90fa2bbf6ea4a263ee8f7b77c75683c2":[13,0,0,3,1,43,26],
+"group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b":[11,1,2,12],
+"group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b":[13,0,0,2,13,13],
+"group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b":[13,0,0,3,1,43,35],
+"group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb":[11,1,2,2],
+"group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb":[13,0,0,3,1,43,21],
+"group__pbuf.html#gaba88511dee3df4b631fde691f421320d":[11,1,2,10],
+"group__pbuf.html#gaba88511dee3df4b631fde691f421320d":[13,0,0,2,13,10],
+"group__pbuf.html#gaba88511dee3df4b631fde691f421320d":[13,0,0,3,1,43,32],
+"group__pbuf.html#gac2f1f58fd36042e82af46f5015720899":[11,1,2,11],
+"group__pbuf.html#gac2f1f58fd36042e82af46f5015720899":[13,0,0,2,13,11],
+"group__pbuf.html#gac2f1f58fd36042e82af46f5015720899":[13,0,0,3,1,43,33],
+"group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47":[11,1,2,3],
+"group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47":[13,0,0,2,13,2],
+"group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47":[13,0,0,3,1,43,24],
+"group__pbuf.html#gad0357ae0be17b2aacd0c301cdc86fc39":[13,0,0,3,1,43,38],
+"group__pbuf.html#gad0357ae0be17b2aacd0c301cdc86fc39":[11,1,2,14],
+"group__pbuf.html#gad0357ae0be17b2aacd0c301cdc86fc39":[13,0,0,2,13,16],
+"group__pbuf.html#gad1e31e370271335b197272af2724ca85":[11,1,2,21],
+"group__pbuf.html#gad1e31e370271335b197272af2724ca85":[13,0,0,2,13,27],
+"group__pbuf.html#gad1e31e370271335b197272af2724ca85":[13,0,0,3,1,43,49],
+"group__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44":[11,1,2,22],
+"group__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44":[13,0,0,2,13,28],
+"group__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44":[13,0,0,3,1,43,50],
+"group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf":[11,1,2,1],
+"group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf":[13,0,0,3,1,43,20],
+"group__pbuf.html#gaf76863707dc02993eae116574b1ea03f":[13,0,0,3,1,43,43],
+"group__pbuf.html#gaf76863707dc02993eae116574b1ea03f":[11,1,2,17],
+"group__pbuf.html#gaf76863707dc02993eae116574b1ea03f":[13,0,0,2,13,21],
+"group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0":[11,1,2,8],
+"group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0":[13,0,0,2,13,8],
+"group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0":[13,0,0,3,1,43,30],
+"group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac120b0fe39efe35bb682e4aa3b82e2c9":[11,1,2,2,1],
+"group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac120b0fe39efe35bb682e4aa3b82e2c9":[13,0,0,3,1,43,21,1],
+"group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac5e9f28455bca98944a030d4b84ecfab":[11,1,2,2,0],
+"group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac5e9f28455bca98944a030d4b84ecfab":[13,0,0,3,1,43,21,0],
+"group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac9b6ba960fdea6f2e8f35c8313b77e4e":[11,1,2,2,2],
+"group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac9b6ba960fdea6f2e8f35c8313b77e4e":[13,0,0,3,1,43,21,2],
+"group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbae969347127387b9b59a23ccd24b76d21":[11,1,2,2,3],
+"group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbae969347127387b9b59a23ccd24b76d21":[13,0,0,3,1,43,21,3],
+"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa0ff039585f05f9208bcb66c2d37783e2":[11,1,2,1,3],
+"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa0ff039585f05f9208bcb66c2d37783e2":[13,0,0,3,1,43,20,3],
+"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba":[11,1,2,1,4],
+"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba":[13,0,0,3,1,43,20,4],
+"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa2ded3594a3977f8bf9cf09552be327b5":[11,1,2,1,0],
+"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa2ded3594a3977f8bf9cf09552be327b5":[13,0,0,3,1,43,20,0],
+"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfab4de441e737330558b609a990cd17346":[11,1,2,1,2],
+"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfab4de441e737330558b609a990cd17346":[13,0,0,3,1,43,20,2],
+"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfafcc1e506061ba69dfa142eb6b3da5f13":[11,1,2,1,1],
+"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfafcc1e506061ba69dfa142eb6b3da5f13":[13,0,0,3,1,43,20,1],
+"group__perf.html":[11,0,2,5],
+"group__ppp.html":[11,3,3],
+"group__raw__raw.html":[11,2,0,4],
+"group__raw__raw.html#ga09427456070fb610cc7795d23dedc159":[13,0,0,2,14,11],
+"group__raw__raw.html#ga09427456070fb610cc7795d23dedc159":[11,2,0,4,9],
+"group__raw__raw.html#ga09427456070fb610cc7795d23dedc159":[13,0,0,3,1,44,11],
+"group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1":[13,0,0,2,14,12],
+"group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1":[13,0,0,3,1,44,12],
+"group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1":[11,2,0,4,10],
+"group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168":[13,0,0,2,14,2],
+"group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168":[11,2,0,4,2],
+"group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168":[13,0,0,3,1,44,4],
+"group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f":[13,0,0,2,14,6],
+"group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f":[11,2,0,4,4],
+"group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f":[13,0,0,3,1,44,6],
+"group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11":[13,0,0,2,14,7],
+"group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11":[11,2,0,4,5],
+"group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11":[13,0,0,3,1,44,7],
+"group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef":[13,0,0,2,14,3],
+"group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef":[13,0,0,3,1,44,5],
+"group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef":[11,2,0,4,3],
+"group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4":[13,0,0,2,14,0],
+"group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4":[11,2,0,4,0],
+"group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4":[13,0,0,3,1,44,2],
+"group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16":[13,0,0,2,14,9],
+"group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16":[11,2,0,4,7],
+"group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16":[13,0,0,3,1,44,9],
+"group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a":[13,0,0,3,1,44,3],
+"group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a":[13,0,0,2,14,1],
+"group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a":[11,2,0,4,1],
+"group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d":[13,0,0,3,1,44,10],
+"group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d":[13,0,0,2,14,10],
+"group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d":[11,2,0,4,8],
+"group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426":[13,0,0,3,1,44,8],
+"group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426":[11,2,0,4,6],
+"group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426":[13,0,0,2,14,8],
+"group__rfc7668if.html":[11,3,2],
+"group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197":[11,3,2,3],
+"group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197":[13,0,0,4,5,3],
+"group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197":[13,0,0,3,2,6,3],
+"group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0":[11,3,2,4],
+"group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0":[13,0,0,3,2,6,4],
+"group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0":[13,0,0,4,5,4],
+"group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e":[11,3,2,5],
+"group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e":[13,0,0,4,5,5],
+"group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e":[13,0,0,3,2,6,5],
+"group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde":[11,3,2,2],
+"group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde":[13,0,0,3,2,6,2],
+"group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde":[13,0,0,4,5,2],
+"group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d":[11,3,2,1],
+"group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d":[13,0,0,4,5,1],
+"group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d":[13,0,0,3,2,6,1],
+"group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c":[11,3,2,0],
+"group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c":[13,0,0,3,2,6,0],
+"group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c":[13,0,0,4,5,0],
+"group__sequential__api.html":[11,2,1],
+"group__sixlowpan.html":[11,3,1],
+"group__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7":[11,3,1,0],
+"group__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7":[13,0,0,4,4,3],
+"group__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7":[13,0,0,3,2,5,2],
+"group__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94":[11,3,1,2],
+"group__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94":[13,0,0,3,2,5,4],
+"group__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94":[13,0,0,4,4,5],
+"group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b":[11,3,1,5],
+"group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b":[13,0,0,4,4,9],
+"group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b":[13,0,0,3,2,5,8],
+"group__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b":[11,3,1,1],
+"group__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b":[13,0,0,4,4,4],
+"group__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b":[13,0,0,3,2,5,3],
+"group__sixlowpan.html#gade00524e85d37a3521ea85359f801df3":[11,3,1,3],
+"group__sixlowpan.html#gade00524e85d37a3521ea85359f801df3":[13,0,0,3,2,5,5],
+"group__sixlowpan.html#gade00524e85d37a3521ea85359f801df3":[13,0,0,4,4,6],
+"group__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625":[11,3,1,4],
+"group__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625":[13,0,0,3,2,5,6],
+"group__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625":[13,0,0,4,4,7],
+"group__slipif.html":[11,3,4],
+"group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3":[13,0,0,3,2,9,5],
+"group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3":[13,0,0,4,7,5],
+"group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3":[11,3,4,3],
+"group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3":[11,3,4,0],
+"group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3":[13,0,0,3,2,9,2],
+"group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3":[13,0,0,4,7,2],
+"group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6":[11,3,4,1],
+"group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6":[13,0,0,4,7,3],
+"group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6":[13,0,0,3,2,9,3],
+"group__slipif.html#gabbee48569a513c90fe154632038eb6d6":[13,0,0,4,7,6],
+"group__slipif.html#gabbee48569a513c90fe154632038eb6d6":[13,0,0,3,2,9,6],
+"group__slipif.html#gabbee48569a513c90fe154632038eb6d6":[11,3,4,4],
+"group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946":[11,3,4,2],
+"group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946":[13,0,0,3,2,9,4],
+"group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946":[13,0,0,4,7,4],
+"group__smtp.html":[11,4,6],
+"group__smtp.html#ga06f6582701def2a62582373bb0be5788":[13,0,0,1,6,0,8],
+"group__smtp.html#ga06f6582701def2a62582373bb0be5788":[11,4,6,3],
+"group__smtp.html#ga1ccf4305461ec16cf41599341ec54983":[13,0,0,1,6,0,10],
+"group__smtp.html#ga1ccf4305461ec16cf41599341ec54983":[11,4,6,5],
+"group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f":[11,4,6,6],
+"group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f":[13,0,0,1,6,0,11],
+"group__smtp.html#ga79567a5a75e048a6b8addb5b038fc899":[13,0,0,1,6,0,9],
+"group__smtp.html#ga79567a5a75e048a6b8addb5b038fc899":[11,4,6,4],
+"group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243":[11,4,6,2],
+"group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243":[13,0,0,1,6,0,7],
+"group__smtp.html#gae43119480c4146df9eeff7ae80c767f7":[11,4,6,1],
+"group__smtp.html#gae43119480c4146df9eeff7ae80c767f7":[13,0,0,1,6,0,6],
+"group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e":[11,4,6,7],
+"group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e":[13,0,0,1,6,0,12],
+"group__smtp__opts.html":[11,4,6,0]
+};
diff --git a/doc/doxygen/output/html/nd6_8c.html b/doc/doxygen/output/html/nd6_8c.html
new file mode 100644
index 0000000..67e28ce
--- /dev/null
+++ b/doc/doxygen/output/html/nd6_8c.html
@@ -0,0 +1,468 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv6/nd6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('nd6_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">nd6.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 &quot;<a class="el" href="nd6_8h.html">lwip/nd6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="nd6__priv_8h.html">lwip/priv/nd6_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2nd6_8h.html">lwip/prot/nd6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2icmp6_8h.html">lwip/prot/icmp6.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="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="ip6_8h.html">lwip/ip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="inet__chksum_8h.html">lwip/inet_chksum.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="icmp6_8h.html">lwip/icmp6.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="dhcp6_8h.html">lwip/dhcp6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="dns_8h.html">lwip/dns.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;path/to/my/lwip_hooks.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:abbb92837e715be0e7d99513a84995831"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8c.html#abbb92837e715be0e7d99513a84995831">nd6_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:abbb92837e715be0e7d99513a84995831"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a754781b509e69c35a7a4ee7e380399fe"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8c.html#a754781b509e69c35a7a4ee7e380399fe">nd6_tmr</a> (void)</td></tr>
+<tr class="separator:a754781b509e69c35a7a4ee7e380399fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a64d7956cf2b0d45025b02661f3f62377"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8c.html#a64d7956cf2b0d45025b02661f3f62377">nd6_clear_destination_cache</a> (void)</td></tr>
+<tr class="separator:a64d7956cf2b0d45025b02661f3f62377"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac5ce11eaecfb486c322641427f47cffe"><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="nd6_8c.html#ac5ce11eaecfb486c322641427f47cffe">nd6_find_route</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ip6addr)</td></tr>
+<tr class="separator:ac5ce11eaecfb486c322641427f47cffe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae447c204ebbf71e6ebbc5ed727a73eb9"><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="nd6_8c.html#ae447c204ebbf71e6ebbc5ed727a73eb9">nd6_get_next_hop_addr_or_queue</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, const u8_t **hwaddrp)</td></tr>
+<tr class="separator:ae447c204ebbf71e6ebbc5ed727a73eb9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af226438f4f9b4aa7c3a2bbdf3c1e948c"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8c.html#af226438f4f9b4aa7c3a2bbdf3c1e948c">nd6_get_destination_mtu</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ip6addr, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:af226438f4f9b4aa7c3a2bbdf3c1e948c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4959990cae26a3996f638ec996f046df"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8c.html#a4959990cae26a3996f638ec996f046df">nd6_reachability_hint</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ip6addr)</td></tr>
+<tr class="separator:a4959990cae26a3996f638ec996f046df"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84f9f52cab7ae37b4dd343536156dc73"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8c.html#a84f9f52cab7ae37b4dd343536156dc73">nd6_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:a84f9f52cab7ae37b4dd343536156dc73"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a27224542b8ffab81c2ed9f47752bb51e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8c.html#a27224542b8ffab81c2ed9f47752bb51e">nd6_adjust_mld_membership</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, s8_t addr_idx, u8_t new_state)</td></tr>
+<tr class="separator:a27224542b8ffab81c2ed9f47752bb51e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a73d3192204da20be193e3c00c4a0cb54"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8c.html#a73d3192204da20be193e3c00c4a0cb54">nd6_restart_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a73d3192204da20be193e3c00c4a0cb54"><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>Neighbor discovery and stateless address autoconfiguration for IPv6. Aims to be compliant with RFC 4861 (Neighbor discovery) and RFC 4862 (Address autoconfiguration). </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a27224542b8ffab81c2ed9f47752bb51e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a27224542b8ffab81c2ed9f47752bb51e">&#9670;&nbsp;</a></span>nd6_adjust_mld_membership()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void nd6_adjust_mld_membership </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s8_t&#160;</td>
+          <td class="paramname"><em>addr_idx</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>new_state</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The state of a local IPv6 address entry is about to change. If needed, join or leave the solicited-node multicast group for the address.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The netif that owns the address. </td></tr>
+    <tr><td class="paramname">addr_idx</td><td>The index of the address. </td></tr>
+    <tr><td class="paramname">new_state</td><td>The new (IP6_ADDR_) state for the address. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a84f9f52cab7ae37b4dd343536156dc73"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a84f9f52cab7ae37b4dd343536156dc73">&#9670;&nbsp;</a></span>nd6_cleanup_netif()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void nd6_cleanup_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Remove all prefix, neighbor_cache and router entries of the specified netif.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>points to a network interface </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a64d7956cf2b0d45025b02661f3f62377"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a64d7956cf2b0d45025b02661f3f62377">&#9670;&nbsp;</a></span>nd6_clear_destination_cache()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void nd6_clear_destination_cache </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Clear the destination cache.</p>
+<p>This operation may be necessary for consistency in the light of changing local addresses and/or use of the gateway hook. </p>
+
+</div>
+</div>
+<a id="ac5ce11eaecfb486c322641427f47cffe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac5ce11eaecfb486c322641427f47cffe">&#9670;&nbsp;</a></span>nd6_find_route()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* nd6_find_route </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip6addr</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Find a router-announced route to the given destination. This route may be based on an on-link prefix or a default router.</p>
+<p>If a suitable route is found, the returned netif is guaranteed to be in a suitable state (up, link up) to be used for packet transmission.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ip6addr</td><td>the destination IPv6 address </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the netif to use for the destination, or NULL if none found </dd></dl>
+
+</div>
+</div>
+<a id="af226438f4f9b4aa7c3a2bbdf3c1e948c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af226438f4f9b4aa7c3a2bbdf3c1e948c">&#9670;&nbsp;</a></span>nd6_get_destination_mtu()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t nd6_get_destination_mtu </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip6addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get the Path MTU for a destination.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ip6addr</td><td>the destination address </td></tr>
+    <tr><td class="paramname">netif</td><td>the netif on which the packet will be sent </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the Path MTU, if known, or the netif default MTU </dd></dl>
+
+</div>
+</div>
+<a id="ae447c204ebbf71e6ebbc5ed727a73eb9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae447c204ebbf71e6ebbc5ed727a73eb9">&#9670;&nbsp;</a></span>nd6_get_next_hop_addr_or_queue()</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> nd6_get_next_hop_addr_or_queue </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>q</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ip6addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u8_t **&#160;</td>
+          <td class="paramname"><em>hwaddrp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A packet is to be transmitted to a specific IPv6 destination on a specific interface. Check if we can find the hardware address of the next hop to use for the packet. If so, give the hardware address to the caller, which should use it to send the packet right away. Otherwise, enqueue the packet for later transmission while looking up the hardware address, if possible.</p>
+<p>As such, this function returns one of three different possible results:</p>
+<ul>
+<li>ERR_OK with a non-NULL 'hwaddrp': the caller should send the packet now.</li>
+<li>ERR_OK with a NULL 'hwaddrp': the packet has been enqueued for later.</li>
+<li>not ERR_OK: something went wrong; forward the error upward in the stack.</li>
+</ul>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The lwIP network interface on which the IP packet will be sent. </td></tr>
+    <tr><td class="paramname">q</td><td>The <a class="el" href="structpbuf.html">pbuf(s)</a> containing the IP packet to be sent. </td></tr>
+    <tr><td class="paramname">ip6addr</td><td>The destination IPv6 address of the packet. </td></tr>
+    <tr><td class="paramname">hwaddrp</td><td>On success, filled with a pointer to a HW address or NULL (meaning the packet has been queued). </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><ul>
+<li>ERR_OK on success, ERR_RTE if no route was found for the packet, or ERR_MEM if low memory conditions prohibit sending the packet at all. </li>
+</ul>
+</dd></dl>
+
+</div>
+</div>
+<a id="abbb92837e715be0e7d99513a84995831"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abbb92837e715be0e7d99513a84995831">&#9670;&nbsp;</a></span>nd6_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void nd6_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Process an incoming neighbor discovery message</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the nd packet, p-&gt;payload pointing to the icmpv6 header </td></tr>
+    <tr><td class="paramname">inp</td><td>the netif on which this packet was received </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a4959990cae26a3996f638ec996f046df"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4959990cae26a3996f638ec996f046df">&#9670;&nbsp;</a></span>nd6_reachability_hint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void nd6_reachability_hint </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip6addr</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Provide the Neighbor discovery process with a hint that a destination is reachable. Called by tcp_receive when ACKs are received or sent (as per RFC). This is useful to avoid sending NS messages every 30 seconds.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ip6addr</td><td>the destination address which is know to be reachable by an upper layer protocol (TCP) </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a73d3192204da20be193e3c00c4a0cb54"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a73d3192204da20be193e3c00c4a0cb54">&#9670;&nbsp;</a></span>nd6_restart_netif()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void nd6_restart_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Netif was added, set up, or reconnected (link up) </p>
+
+</div>
+</div>
+<a id="a754781b509e69c35a7a4ee7e380399fe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a754781b509e69c35a7a4ee7e380399fe">&#9670;&nbsp;</a></span>nd6_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void nd6_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Periodic timer for Neighbor discovery functions:</p>
+<ul>
+<li>Update neighbor reachability states</li>
+<li>Update destination cache entries age</li>
+<li>Update invalidation timers of default routers and on-link prefixes</li>
+<li>Update lifetimes of our addresses</li>
+<li>Perform duplicate address detection (DAD) for our addresses</li>
+<li>Send router solicitations </li>
+</ul>
+
+</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_da9c6f43d3cd00be3de224bac907a425.html">ipv6</a></li><li class="navelem"><a class="el" href="nd6_8c.html">nd6.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/nd6_8c.js b/doc/doxygen/output/html/nd6_8c.js
new file mode 100644
index 0000000..42c9041
--- /dev/null
+++ b/doc/doxygen/output/html/nd6_8c.js
@@ -0,0 +1,13 @@
+var nd6_8c =
+[
+    [ "nd6_adjust_mld_membership", "nd6_8c.html#a27224542b8ffab81c2ed9f47752bb51e", null ],
+    [ "nd6_cleanup_netif", "nd6_8c.html#a84f9f52cab7ae37b4dd343536156dc73", null ],
+    [ "nd6_clear_destination_cache", "nd6_8c.html#a64d7956cf2b0d45025b02661f3f62377", null ],
+    [ "nd6_find_route", "nd6_8c.html#ac5ce11eaecfb486c322641427f47cffe", null ],
+    [ "nd6_get_destination_mtu", "nd6_8c.html#af226438f4f9b4aa7c3a2bbdf3c1e948c", null ],
+    [ "nd6_get_next_hop_addr_or_queue", "nd6_8c.html#ae447c204ebbf71e6ebbc5ed727a73eb9", null ],
+    [ "nd6_input", "nd6_8c.html#abbb92837e715be0e7d99513a84995831", null ],
+    [ "nd6_reachability_hint", "nd6_8c.html#a4959990cae26a3996f638ec996f046df", null ],
+    [ "nd6_restart_netif", "nd6_8c.html#a73d3192204da20be193e3c00c4a0cb54", null ],
+    [ "nd6_tmr", "nd6_8c.html#a754781b509e69c35a7a4ee7e380399fe", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/nd6_8h.html b/doc/doxygen/output/html/nd6_8h.html
new file mode 100644
index 0000000..49726ff
--- /dev/null
+++ b/doc/doxygen/output/html/nd6_8h.html
@@ -0,0 +1,490 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/nd6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('nd6_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">nd6.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="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="err_8h.html">lwip/err.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a3250c1e32713635d588cf25865ebed56"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8h.html#a3250c1e32713635d588cf25865ebed56">ND6_TMR_INTERVAL</a>&#160;&#160;&#160;1000</td></tr>
+<tr class="separator:a3250c1e32713635d588cf25865ebed56"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2fec65c0785551bad3a282ddee4062ac"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8h.html#a2fec65c0785551bad3a282ddee4062ac">ND6_RTR_SOLICITATION_INTERVAL</a>&#160;&#160;&#160;4000</td></tr>
+<tr class="separator:a2fec65c0785551bad3a282ddee4062ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a754781b509e69c35a7a4ee7e380399fe"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8h.html#a754781b509e69c35a7a4ee7e380399fe">nd6_tmr</a> (void)</td></tr>
+<tr class="separator:a754781b509e69c35a7a4ee7e380399fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abbb92837e715be0e7d99513a84995831"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8h.html#abbb92837e715be0e7d99513a84995831">nd6_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:abbb92837e715be0e7d99513a84995831"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a64d7956cf2b0d45025b02661f3f62377"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8h.html#a64d7956cf2b0d45025b02661f3f62377">nd6_clear_destination_cache</a> (void)</td></tr>
+<tr class="separator:a64d7956cf2b0d45025b02661f3f62377"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac5ce11eaecfb486c322641427f47cffe"><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="nd6_8h.html#ac5ce11eaecfb486c322641427f47cffe">nd6_find_route</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ip6addr)</td></tr>
+<tr class="separator:ac5ce11eaecfb486c322641427f47cffe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae447c204ebbf71e6ebbc5ed727a73eb9"><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="nd6_8h.html#ae447c204ebbf71e6ebbc5ed727a73eb9">nd6_get_next_hop_addr_or_queue</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, const u8_t **hwaddrp)</td></tr>
+<tr class="separator:ae447c204ebbf71e6ebbc5ed727a73eb9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af226438f4f9b4aa7c3a2bbdf3c1e948c"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8h.html#af226438f4f9b4aa7c3a2bbdf3c1e948c">nd6_get_destination_mtu</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ip6addr, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:af226438f4f9b4aa7c3a2bbdf3c1e948c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4959990cae26a3996f638ec996f046df"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8h.html#a4959990cae26a3996f638ec996f046df">nd6_reachability_hint</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ip6addr)</td></tr>
+<tr class="separator:a4959990cae26a3996f638ec996f046df"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84f9f52cab7ae37b4dd343536156dc73"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8h.html#a84f9f52cab7ae37b4dd343536156dc73">nd6_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:a84f9f52cab7ae37b4dd343536156dc73"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a27224542b8ffab81c2ed9f47752bb51e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8h.html#a27224542b8ffab81c2ed9f47752bb51e">nd6_adjust_mld_membership</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, s8_t addr_idx, u8_t new_state)</td></tr>
+<tr class="separator:a27224542b8ffab81c2ed9f47752bb51e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a73d3192204da20be193e3c00c4a0cb54"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nd6_8h.html#a73d3192204da20be193e3c00c4a0cb54">nd6_restart_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a73d3192204da20be193e3c00c4a0cb54"><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>Neighbor discovery and stateless address autoconfiguration for IPv6. Aims to be compliant with RFC 4861 (Neighbor discovery) and RFC 4862 (Address autoconfiguration). </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a2fec65c0785551bad3a282ddee4062ac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2fec65c0785551bad3a282ddee4062ac">&#9670;&nbsp;</a></span>ND6_RTR_SOLICITATION_INTERVAL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ND6_RTR_SOLICITATION_INTERVAL&#160;&#160;&#160;4000</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Router solicitations are sent in 4 second intervals (see RFC 4861, ch. 6.3.7) </p>
+
+</div>
+</div>
+<a id="a3250c1e32713635d588cf25865ebed56"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3250c1e32713635d588cf25865ebed56">&#9670;&nbsp;</a></span>ND6_TMR_INTERVAL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ND6_TMR_INTERVAL&#160;&#160;&#160;1000</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>1 second period </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a27224542b8ffab81c2ed9f47752bb51e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a27224542b8ffab81c2ed9f47752bb51e">&#9670;&nbsp;</a></span>nd6_adjust_mld_membership()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void nd6_adjust_mld_membership </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s8_t&#160;</td>
+          <td class="paramname"><em>addr_idx</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>new_state</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The state of a local IPv6 address entry is about to change. If needed, join or leave the solicited-node multicast group for the address.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The netif that owns the address. </td></tr>
+    <tr><td class="paramname">addr_idx</td><td>The index of the address. </td></tr>
+    <tr><td class="paramname">new_state</td><td>The new (IP6_ADDR_) state for the address. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a84f9f52cab7ae37b4dd343536156dc73"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a84f9f52cab7ae37b4dd343536156dc73">&#9670;&nbsp;</a></span>nd6_cleanup_netif()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void nd6_cleanup_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Remove all prefix, neighbor_cache and router entries of the specified netif.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>points to a network interface </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a64d7956cf2b0d45025b02661f3f62377"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a64d7956cf2b0d45025b02661f3f62377">&#9670;&nbsp;</a></span>nd6_clear_destination_cache()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void nd6_clear_destination_cache </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Clear the destination cache.</p>
+<p>This operation may be necessary for consistency in the light of changing local addresses and/or use of the gateway hook. </p>
+
+</div>
+</div>
+<a id="ac5ce11eaecfb486c322641427f47cffe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac5ce11eaecfb486c322641427f47cffe">&#9670;&nbsp;</a></span>nd6_find_route()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* nd6_find_route </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip6addr</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Find a router-announced route to the given destination. This route may be based on an on-link prefix or a default router.</p>
+<p>If a suitable route is found, the returned netif is guaranteed to be in a suitable state (up, link up) to be used for packet transmission.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ip6addr</td><td>the destination IPv6 address </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the netif to use for the destination, or NULL if none found </dd></dl>
+
+</div>
+</div>
+<a id="af226438f4f9b4aa7c3a2bbdf3c1e948c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af226438f4f9b4aa7c3a2bbdf3c1e948c">&#9670;&nbsp;</a></span>nd6_get_destination_mtu()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t nd6_get_destination_mtu </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip6addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get the Path MTU for a destination.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ip6addr</td><td>the destination address </td></tr>
+    <tr><td class="paramname">netif</td><td>the netif on which the packet will be sent </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the Path MTU, if known, or the netif default MTU </dd></dl>
+
+</div>
+</div>
+<a id="ae447c204ebbf71e6ebbc5ed727a73eb9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae447c204ebbf71e6ebbc5ed727a73eb9">&#9670;&nbsp;</a></span>nd6_get_next_hop_addr_or_queue()</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> nd6_get_next_hop_addr_or_queue </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>q</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ip6addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u8_t **&#160;</td>
+          <td class="paramname"><em>hwaddrp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A packet is to be transmitted to a specific IPv6 destination on a specific interface. Check if we can find the hardware address of the next hop to use for the packet. If so, give the hardware address to the caller, which should use it to send the packet right away. Otherwise, enqueue the packet for later transmission while looking up the hardware address, if possible.</p>
+<p>As such, this function returns one of three different possible results:</p>
+<ul>
+<li>ERR_OK with a non-NULL 'hwaddrp': the caller should send the packet now.</li>
+<li>ERR_OK with a NULL 'hwaddrp': the packet has been enqueued for later.</li>
+<li>not ERR_OK: something went wrong; forward the error upward in the stack.</li>
+</ul>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The lwIP network interface on which the IP packet will be sent. </td></tr>
+    <tr><td class="paramname">q</td><td>The <a class="el" href="structpbuf.html">pbuf(s)</a> containing the IP packet to be sent. </td></tr>
+    <tr><td class="paramname">ip6addr</td><td>The destination IPv6 address of the packet. </td></tr>
+    <tr><td class="paramname">hwaddrp</td><td>On success, filled with a pointer to a HW address or NULL (meaning the packet has been queued). </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><ul>
+<li>ERR_OK on success, ERR_RTE if no route was found for the packet, or ERR_MEM if low memory conditions prohibit sending the packet at all. </li>
+</ul>
+</dd></dl>
+
+</div>
+</div>
+<a id="abbb92837e715be0e7d99513a84995831"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abbb92837e715be0e7d99513a84995831">&#9670;&nbsp;</a></span>nd6_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void nd6_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Process an incoming neighbor discovery message</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the nd packet, p-&gt;payload pointing to the icmpv6 header </td></tr>
+    <tr><td class="paramname">inp</td><td>the netif on which this packet was received </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a4959990cae26a3996f638ec996f046df"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4959990cae26a3996f638ec996f046df">&#9670;&nbsp;</a></span>nd6_reachability_hint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void nd6_reachability_hint </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip6addr</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Provide the Neighbor discovery process with a hint that a destination is reachable. Called by tcp_receive when ACKs are received or sent (as per RFC). This is useful to avoid sending NS messages every 30 seconds.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ip6addr</td><td>the destination address which is know to be reachable by an upper layer protocol (TCP) </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a73d3192204da20be193e3c00c4a0cb54"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a73d3192204da20be193e3c00c4a0cb54">&#9670;&nbsp;</a></span>nd6_restart_netif()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void nd6_restart_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Netif was added, set up, or reconnected (link up) </p>
+
+</div>
+</div>
+<a id="a754781b509e69c35a7a4ee7e380399fe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a754781b509e69c35a7a4ee7e380399fe">&#9670;&nbsp;</a></span>nd6_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void nd6_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Periodic timer for Neighbor discovery functions:</p>
+<ul>
+<li>Update neighbor reachability states</li>
+<li>Update destination cache entries age</li>
+<li>Update invalidation timers of default routers and on-link prefixes</li>
+<li>Update lifetimes of our addresses</li>
+<li>Perform duplicate address detection (DAD) for our addresses</li>
+<li>Send router solicitations </li>
+</ul>
+
+</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="nd6_8h.html">nd6.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/nd6_8h.js b/doc/doxygen/output/html/nd6_8h.js
new file mode 100644
index 0000000..cfd3784
--- /dev/null
+++ b/doc/doxygen/output/html/nd6_8h.js
@@ -0,0 +1,15 @@
+var nd6_8h =
+[
+    [ "ND6_RTR_SOLICITATION_INTERVAL", "nd6_8h.html#a2fec65c0785551bad3a282ddee4062ac", null ],
+    [ "ND6_TMR_INTERVAL", "nd6_8h.html#a3250c1e32713635d588cf25865ebed56", null ],
+    [ "nd6_adjust_mld_membership", "nd6_8h.html#a27224542b8ffab81c2ed9f47752bb51e", null ],
+    [ "nd6_cleanup_netif", "nd6_8h.html#a84f9f52cab7ae37b4dd343536156dc73", null ],
+    [ "nd6_clear_destination_cache", "nd6_8h.html#a64d7956cf2b0d45025b02661f3f62377", null ],
+    [ "nd6_find_route", "nd6_8h.html#ac5ce11eaecfb486c322641427f47cffe", null ],
+    [ "nd6_get_destination_mtu", "nd6_8h.html#af226438f4f9b4aa7c3a2bbdf3c1e948c", null ],
+    [ "nd6_get_next_hop_addr_or_queue", "nd6_8h.html#ae447c204ebbf71e6ebbc5ed727a73eb9", null ],
+    [ "nd6_input", "nd6_8h.html#abbb92837e715be0e7d99513a84995831", null ],
+    [ "nd6_reachability_hint", "nd6_8h.html#a4959990cae26a3996f638ec996f046df", null ],
+    [ "nd6_restart_netif", "nd6_8h.html#a73d3192204da20be193e3c00c4a0cb54", null ],
+    [ "nd6_tmr", "nd6_8h.html#a754781b509e69c35a7a4ee7e380399fe", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/nd6__priv_8h.html b/doc/doxygen/output/html/nd6__priv_8h.html
new file mode 100644
index 0000000..6905bbe
--- /dev/null
+++ b/doc/doxygen/output/html/nd6__priv_8h.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/priv/nd6_priv.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('nd6__priv_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a>  </div>
+  <div class="headertitle">
+<div class="title">nd6_priv.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="pbuf_8h.html">lwip/pbuf.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.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 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="structnd6__q__entry.html">nd6_q_entry</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="structnd6__neighbor__cache__entry.html">nd6_neighbor_cache_entry</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>
+<div class="textblock"><p>Neighbor discovery and stateless address autoconfiguration for IPv6. Aims to be compliant with RFC 4861 (Neighbor discovery) and RFC 4862 (Address autoconfiguration). </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_460c501b2432fc107adcb38111835e48.html">priv</a></li><li class="navelem"><a class="el" href="nd6__priv_8h.html">nd6_priv.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/nd6__priv_8h.js b/doc/doxygen/output/html/nd6__priv_8h.js
new file mode 100644
index 0000000..7095e2b
--- /dev/null
+++ b/doc/doxygen/output/html/nd6__priv_8h.js
@@ -0,0 +1,5 @@
+var nd6__priv_8h =
+[
+    [ "nd6_q_entry", "structnd6__q__entry.html", null ],
+    [ "nd6_neighbor_cache_entry", "structnd6__neighbor__cache__entry.html", "structnd6__neighbor__cache__entry" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/netbiosns_8c.html b/doc/doxygen/output/html/netbiosns_8c.html
new file mode 100644
index 0000000..8044884
--- /dev/null
+++ b/doc/doxygen/output/html/netbiosns_8c.html
@@ -0,0 +1,208 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/netbiosns/netbiosns.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('netbiosns_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">netbiosns.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="netbiosns_8h.html">lwip/apps/netbiosns.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="udp_8h.html">lwip/udp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.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="iana_8h.html">lwip/prot/iana.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structnetbios__hdr.html">netbios_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="structnetbios__question__hdr.html">netbios_question_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="structnetbios__name__hdr.html">netbios_name_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="structnetbios__resp.html">netbios_resp</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="structnetbios__answer.html">netbios_answer</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a4b83658c5bbb9ac90aca4351086a9a00"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netbiosns_8c.html#a4b83658c5bbb9ac90aca4351086a9a00">NETBIOS_NAME_LEN</a>&#160;&#160;&#160;16</td></tr>
+<tr class="separator:a4b83658c5bbb9ac90aca4351086a9a00"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a35d43ea3290f6412e45598b610f03cf1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netbiosns_8c.html#a35d43ea3290f6412e45598b610f03cf1">NETBIOS_NAME_TTL</a>&#160;&#160;&#160;300000u</td></tr>
+<tr class="separator:a35d43ea3290f6412e45598b610f03cf1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af09685abf1739c802bc8772b35b7fb1c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netbiosns_8c.html#af09685abf1739c802bc8772b35b7fb1c">NETB_HFLAG_RESPONSE</a>&#160;&#160;&#160;0x8000U</td></tr>
+<tr class="separator:af09685abf1739c802bc8772b35b7fb1c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae00d45caef5a670e3aedde2788b3f212"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netbiosns_8c.html#ae00d45caef5a670e3aedde2788b3f212">NETB_NFLAG_UNIQUE</a>&#160;&#160;&#160;0x8000U</td></tr>
+<tr class="separator:ae00d45caef5a670e3aedde2788b3f212"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga0c696ea25a79e97715c8217901cff66b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b">netbiosns_init</a> (void)</td></tr>
+<tr class="separator:ga0c696ea25a79e97715c8217901cff66b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf82174943d25d67b04d44b7fba808806"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806">netbiosns_stop</a> (void)</td></tr>
+<tr class="separator:gaf82174943d25d67b04d44b7fba808806"><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>NetBIOS name service responder </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="af09685abf1739c802bc8772b35b7fb1c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af09685abf1739c802bc8772b35b7fb1c">&#9670;&nbsp;</a></span>NETB_HFLAG_RESPONSE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETB_HFLAG_RESPONSE&#160;&#160;&#160;0x8000U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>NetBIOS header flags </p>
+
+</div>
+</div>
+<a id="ae00d45caef5a670e3aedde2788b3f212"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae00d45caef5a670e3aedde2788b3f212">&#9670;&nbsp;</a></span>NETB_NFLAG_UNIQUE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETB_NFLAG_UNIQUE&#160;&#160;&#160;0x8000U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>NetBIOS name flags </p>
+
+</div>
+</div>
+<a id="a4b83658c5bbb9ac90aca4351086a9a00"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4b83658c5bbb9ac90aca4351086a9a00">&#9670;&nbsp;</a></span>NETBIOS_NAME_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETBIOS_NAME_LEN&#160;&#160;&#160;16</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>size of a NetBIOS name </p>
+
+</div>
+</div>
+<a id="a35d43ea3290f6412e45598b610f03cf1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a35d43ea3290f6412e45598b610f03cf1">&#9670;&nbsp;</a></span>NETBIOS_NAME_TTL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETBIOS_NAME_TTL&#160;&#160;&#160;300000u</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The Time-To-Live for NetBIOS name responds (in seconds) Default is 300000 seconds (3 days, 11 hours, 20 minutes) </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_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_56d2b6ddbb44630b0fd661af6321f9c4.html">netbiosns</a></li><li class="navelem"><a class="el" href="netbiosns_8c.html">netbiosns.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/netbiosns_8c.js b/doc/doxygen/output/html/netbiosns_8c.js
new file mode 100644
index 0000000..a9cd499
--- /dev/null
+++ b/doc/doxygen/output/html/netbiosns_8c.js
@@ -0,0 +1,14 @@
+var netbiosns_8c =
+[
+    [ "netbios_hdr", "structnetbios__hdr.html", null ],
+    [ "netbios_question_hdr", "structnetbios__question__hdr.html", null ],
+    [ "netbios_name_hdr", "structnetbios__name__hdr.html", null ],
+    [ "netbios_resp", "structnetbios__resp.html", null ],
+    [ "netbios_answer", "structnetbios__answer.html", "structnetbios__answer" ],
+    [ "NETB_HFLAG_RESPONSE", "netbiosns_8c.html#af09685abf1739c802bc8772b35b7fb1c", null ],
+    [ "NETB_NFLAG_UNIQUE", "netbiosns_8c.html#ae00d45caef5a670e3aedde2788b3f212", null ],
+    [ "NETBIOS_NAME_LEN", "netbiosns_8c.html#a4b83658c5bbb9ac90aca4351086a9a00", null ],
+    [ "NETBIOS_NAME_TTL", "netbiosns_8c.html#a35d43ea3290f6412e45598b610f03cf1", null ],
+    [ "netbiosns_init", "group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b", null ],
+    [ "netbiosns_stop", "group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/netbiosns_8h.html b/doc/doxygen/output/html/netbiosns_8h.html
new file mode 100644
index 0000000..bc78c47
--- /dev/null
+++ b/doc/doxygen/output/html/netbiosns_8h.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/netbiosns.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('netbiosns_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">netbiosns.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="netbiosns__opts_8h.html">lwip/apps/netbiosns_opts.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga0c696ea25a79e97715c8217901cff66b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b">netbiosns_init</a> (void)</td></tr>
+<tr class="separator:ga0c696ea25a79e97715c8217901cff66b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf82174943d25d67b04d44b7fba808806"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806">netbiosns_stop</a> (void)</td></tr>
+<tr class="separator:gaf82174943d25d67b04d44b7fba808806"><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>NETBIOS name service responder </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_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="netbiosns_8h.html">netbiosns.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/netbiosns_8h.js b/doc/doxygen/output/html/netbiosns_8h.js
new file mode 100644
index 0000000..a58a8ef
--- /dev/null
+++ b/doc/doxygen/output/html/netbiosns_8h.js
@@ -0,0 +1,5 @@
+var netbiosns_8h =
+[
+    [ "netbiosns_init", "group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b", null ],
+    [ "netbiosns_stop", "group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/netbiosns__opts_8h.html b/doc/doxygen/output/html/netbiosns__opts_8h.html
new file mode 100644
index 0000000..512fe18
--- /dev/null
+++ b/doc/doxygen/output/html/netbiosns__opts_8h.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/netbiosns_opts.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('netbiosns__opts_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">netbiosns_opts.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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga468c2ae67a79ce082ee585a438f7373b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbiosns__opts.html#ga468c2ae67a79ce082ee585a438f7373b">NETBIOS_LWIP_NAME</a>&#160;&#160;&#160;&quot;NETBIOSLWIPDEV&quot;</td></tr>
+<tr class="separator:ga468c2ae67a79ce082ee585a438f7373b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa9dec8fc3dee5e72fbe9b854437bce84"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbiosns__opts.html#gaa9dec8fc3dee5e72fbe9b854437bce84">LWIP_NETBIOS_RESPOND_NAME_QUERY</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaa9dec8fc3dee5e72fbe9b854437bce84"><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>NETBIOS name service responder options </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_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="netbiosns__opts_8h.html">netbiosns_opts.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/netbiosns__opts_8h.js b/doc/doxygen/output/html/netbiosns__opts_8h.js
new file mode 100644
index 0000000..c0a1244
--- /dev/null
+++ b/doc/doxygen/output/html/netbiosns__opts_8h.js
@@ -0,0 +1,5 @@
+var netbiosns__opts_8h =
+[
+    [ "LWIP_NETBIOS_RESPOND_NAME_QUERY", "group__netbiosns__opts.html#gaa9dec8fc3dee5e72fbe9b854437bce84", null ],
+    [ "NETBIOS_LWIP_NAME", "group__netbiosns__opts.html#ga468c2ae67a79ce082ee585a438f7373b", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/netbuf_8c.html b/doc/doxygen/output/html/netbuf_8c.html
new file mode 100644
index 0000000..c121b9c
--- /dev/null
+++ b/doc/doxygen/output/html/netbuf_8c.html
@@ -0,0 +1,130 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/api/netbuf.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('netbuf_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">netbuf.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 &quot;<a class="el" href="netbuf_8h.html">lwip/netbuf.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="memp_8h.html">lwip/memp.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaaba704cd963e35e71145de9f5112991d"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structnetbuf.html">netbuf</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#gaaba704cd963e35e71145de9f5112991d">netbuf_new</a> (void)</td></tr>
+<tr class="separator:gaaba704cd963e35e71145de9f5112991d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9dfd3ddfe0ec65009cb140c68404b09d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d">netbuf_delete</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf)</td></tr>
+<tr class="separator:ga9dfd3ddfe0ec65009cb140c68404b09d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0b831b80d3aa64938abdbfb6d89eaac0"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#ga0b831b80d3aa64938abdbfb6d89eaac0">netbuf_alloc</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf, u16_t size)</td></tr>
+<tr class="separator:ga0b831b80d3aa64938abdbfb6d89eaac0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga02f82348ac23431a4b1512feae25f26b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b">netbuf_free</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf)</td></tr>
+<tr class="separator:ga02f82348ac23431a4b1512feae25f26b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabdffa0401e4473c9d9100ecbf50e46d2"><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__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2">netbuf_ref</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf, const void *dataptr, u16_t size)</td></tr>
+<tr class="separator:gabdffa0401e4473c9d9100ecbf50e46d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga631e8bddd99b2397cd0b26973c659602"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602">netbuf_chain</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *head, struct <a class="el" href="structnetbuf.html">netbuf</a> *tail)</td></tr>
+<tr class="separator:ga631e8bddd99b2397cd0b26973c659602"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga04a54a8476b37c2a8804fed679b6cc01"><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__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01">netbuf_data</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf, void **dataptr, u16_t *len)</td></tr>
+<tr class="separator:ga04a54a8476b37c2a8804fed679b6cc01"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf4e3718d378bb11f2fc8af42ce7b3715"><td class="memItemLeft" align="right" valign="top">s8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715">netbuf_next</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf)</td></tr>
+<tr class="separator:gaf4e3718d378bb11f2fc8af42ce7b3715"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga222ad2a2eb871d603b216a87e9f9be51"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51">netbuf_first</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf)</td></tr>
+<tr class="separator:ga222ad2a2eb871d603b216a87e9f9be51"><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>Network buffer management </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_da61e3e9a357748887e3ca8d7c5a0c16.html">api</a></li><li class="navelem"><a class="el" href="netbuf_8c.html">netbuf.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/netbuf_8c.js b/doc/doxygen/output/html/netbuf_8c.js
new file mode 100644
index 0000000..dd171d8
--- /dev/null
+++ b/doc/doxygen/output/html/netbuf_8c.js
@@ -0,0 +1,12 @@
+var netbuf_8c =
+[
+    [ "netbuf_alloc", "group__netbuf.html#ga0b831b80d3aa64938abdbfb6d89eaac0", null ],
+    [ "netbuf_chain", "group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602", null ],
+    [ "netbuf_data", "group__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01", null ],
+    [ "netbuf_delete", "group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d", null ],
+    [ "netbuf_first", "group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51", null ],
+    [ "netbuf_free", "group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b", null ],
+    [ "netbuf_new", "group__netbuf.html#gaaba704cd963e35e71145de9f5112991d", null ],
+    [ "netbuf_next", "group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715", null ],
+    [ "netbuf_ref", "group__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/netbuf_8h.html b/doc/doxygen/output/html/netbuf_8h.html
new file mode 100644
index 0000000..c181110
--- /dev/null
+++ b/doc/doxygen/output/html/netbuf_8h.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/netbuf.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('netbuf_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">netbuf.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="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 />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structnetbuf.html">netbuf</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ab38abb4213df4c00b9b3ab844322a090"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netbuf_8h.html#ab38abb4213df4c00b9b3ab844322a090">NETBUF_FLAG_DESTADDR</a>&#160;&#160;&#160;0x01</td></tr>
+<tr class="separator:ab38abb4213df4c00b9b3ab844322a090"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab75db64a9e84eb67a382c30e382d417c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netbuf_8h.html#ab75db64a9e84eb67a382c30e382d417c">NETBUF_FLAG_CHKSUM</a>&#160;&#160;&#160;0x02</td></tr>
+<tr class="separator:ab75db64a9e84eb67a382c30e382d417c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaaba704cd963e35e71145de9f5112991d"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structnetbuf.html">netbuf</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#gaaba704cd963e35e71145de9f5112991d">netbuf_new</a> (void)</td></tr>
+<tr class="separator:gaaba704cd963e35e71145de9f5112991d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9dfd3ddfe0ec65009cb140c68404b09d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d">netbuf_delete</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf)</td></tr>
+<tr class="separator:ga9dfd3ddfe0ec65009cb140c68404b09d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0b831b80d3aa64938abdbfb6d89eaac0"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#ga0b831b80d3aa64938abdbfb6d89eaac0">netbuf_alloc</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf, u16_t size)</td></tr>
+<tr class="separator:ga0b831b80d3aa64938abdbfb6d89eaac0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga02f82348ac23431a4b1512feae25f26b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b">netbuf_free</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf)</td></tr>
+<tr class="separator:ga02f82348ac23431a4b1512feae25f26b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabdffa0401e4473c9d9100ecbf50e46d2"><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__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2">netbuf_ref</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf, const void *dataptr, u16_t size)</td></tr>
+<tr class="separator:gabdffa0401e4473c9d9100ecbf50e46d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga631e8bddd99b2397cd0b26973c659602"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602">netbuf_chain</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *head, struct <a class="el" href="structnetbuf.html">netbuf</a> *tail)</td></tr>
+<tr class="separator:ga631e8bddd99b2397cd0b26973c659602"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga04a54a8476b37c2a8804fed679b6cc01"><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__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01">netbuf_data</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf, void **dataptr, u16_t *len)</td></tr>
+<tr class="separator:ga04a54a8476b37c2a8804fed679b6cc01"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf4e3718d378bb11f2fc8af42ce7b3715"><td class="memItemLeft" align="right" valign="top">s8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715">netbuf_next</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf)</td></tr>
+<tr class="separator:gaf4e3718d378bb11f2fc8af42ce7b3715"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga222ad2a2eb871d603b216a87e9f9be51"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51">netbuf_first</a> (struct <a class="el" href="structnetbuf.html">netbuf</a> *buf)</td></tr>
+<tr class="separator:ga222ad2a2eb871d603b216a87e9f9be51"><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>netbuf API (for netconn API) </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ab75db64a9e84eb67a382c30e382d417c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab75db64a9e84eb67a382c30e382d417c">&#9670;&nbsp;</a></span>NETBUF_FLAG_CHKSUM</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETBUF_FLAG_CHKSUM&#160;&#160;&#160;0x02</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This netbuf includes a checksum </p>
+
+</div>
+</div>
+<a id="ab38abb4213df4c00b9b3ab844322a090"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab38abb4213df4c00b9b3ab844322a090">&#9670;&nbsp;</a></span>NETBUF_FLAG_DESTADDR</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETBUF_FLAG_DESTADDR&#160;&#160;&#160;0x01</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This netbuf has dest-addr/port set </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="netbuf_8h.html">netbuf.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/netbuf_8h.js b/doc/doxygen/output/html/netbuf_8h.js
new file mode 100644
index 0000000..a8b37fb
--- /dev/null
+++ b/doc/doxygen/output/html/netbuf_8h.js
@@ -0,0 +1,15 @@
+var netbuf_8h =
+[
+    [ "netbuf", "structnetbuf.html", null ],
+    [ "NETBUF_FLAG_CHKSUM", "netbuf_8h.html#ab75db64a9e84eb67a382c30e382d417c", null ],
+    [ "NETBUF_FLAG_DESTADDR", "netbuf_8h.html#ab38abb4213df4c00b9b3ab844322a090", null ],
+    [ "netbuf_alloc", "group__netbuf.html#ga0b831b80d3aa64938abdbfb6d89eaac0", null ],
+    [ "netbuf_chain", "group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602", null ],
+    [ "netbuf_data", "group__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01", null ],
+    [ "netbuf_delete", "group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d", null ],
+    [ "netbuf_first", "group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51", null ],
+    [ "netbuf_free", "group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b", null ],
+    [ "netbuf_new", "group__netbuf.html#gaaba704cd963e35e71145de9f5112991d", null ],
+    [ "netbuf_next", "group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715", null ],
+    [ "netbuf_ref", "group__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/netdb_8c.html b/doc/doxygen/output/html/netdb_8c.html
new file mode 100644
index 0000000..ed199d0
--- /dev/null
+++ b/doc/doxygen/output/html/netdb_8c.html
@@ -0,0 +1,361 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/api/netdb.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('netdb_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">netdb.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="lwip_2netdb_8h.html">lwip/netdb.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="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="ip__addr_8h.html">lwip/ip_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="api_8h.html">lwip/api.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="dns_8h.html">lwip/dns.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &lt;stdlib.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structgethostbyname__r__helper.html">gethostbyname_r_helper</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a768ab8ead892d6454709680340cd070e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netdb_8c.html#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"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netdb_8c.html#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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a8adc6d35c068a073369edde71c678cbc"><td class="memItemLeft" align="right" valign="top">struct hostent *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netdb_8c.html#a8adc6d35c068a073369edde71c678cbc">lwip_gethostbyname</a> (const char *name)</td></tr>
+<tr class="separator:a8adc6d35c068a073369edde71c678cbc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afa229e90916f6c8d6308828f45351d2d"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netdb_8c.html#afa229e90916f6c8d6308828f45351d2d">lwip_gethostbyname_r</a> (const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop)</td></tr>
+<tr class="separator:afa229e90916f6c8d6308828f45351d2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7f65ff5982a0743849a644ef2cd15ef5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netdb_8c.html#a7f65ff5982a0743849a644ef2cd15ef5">lwip_freeaddrinfo</a> (struct addrinfo *ai)</td></tr>
+<tr class="separator:a7f65ff5982a0743849a644ef2cd15ef5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af356989c172a51187e22b557f22d4165"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netdb_8c.html#af356989c172a51187e22b557f22d4165">lwip_getaddrinfo</a> (const char *nodename, const char *servname, const struct addrinfo *hints, struct addrinfo **res)</td></tr>
+<tr class="separator:af356989c172a51187e22b557f22d4165"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a2a1ce3f2040007303d36c0b682b5ac10"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netdb_8c.html#a2a1ce3f2040007303d36c0b682b5ac10">h_errno</a></td></tr>
+<tr class="separator:a2a1ce3f2040007303d36c0b682b5ac10"><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>API functions for name resolving </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="acfc1e988534c0e497599b904739f92fe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acfc1e988534c0e497599b904739f92fe">&#9670;&nbsp;</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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a768ab8ead892d6454709680340cd070e">&#9670;&nbsp;</a></span>LWIP_DNS_API_HOSTENT_STORAGE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DNS_API_HOSTENT_STORAGE&#160;&#160;&#160;0</td>
+        </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>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a7f65ff5982a0743849a644ef2cd15ef5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7f65ff5982a0743849a644ef2cd15ef5">&#9670;&nbsp;</a></span>lwip_freeaddrinfo()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_freeaddrinfo </td>
+          <td>(</td>
+          <td class="paramtype">struct addrinfo *&#160;</td>
+          <td class="paramname"><em>ai</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Frees one or more addrinfo structures returned by <a class="el" href="group__netdbapi.html#ga558191530d91c101621b49e43bd5bbf5">getaddrinfo()</a>, along with any additional storage associated with those structures. If the ai_next field of the structure is not null, the entire list of structures is freed.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ai</td><td>struct addrinfo to free </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="af356989c172a51187e22b557f22d4165"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af356989c172a51187e22b557f22d4165">&#9670;&nbsp;</a></span>lwip_getaddrinfo()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lwip_getaddrinfo </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>nodename</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>servname</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct addrinfo *&#160;</td>
+          <td class="paramname"><em>hints</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct addrinfo **&#160;</td>
+          <td class="paramname"><em>res</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Translates the name of a service location (for example, a host name) and/or a service name and returns a set of socket addresses and associated information to be used in creating a socket with which to address the specified service. Memory for the result is allocated internally and must be freed by calling <a class="el" href="netdb_8c.html#a7f65ff5982a0743849a644ef2cd15ef5">lwip_freeaddrinfo()</a>!</p>
+<p>Due to a limitation in dns_gethostbyname, only the first address of a host is returned. Also, service names are not supported (only port numbers)!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">nodename</td><td>descriptive name or address string of the host (may be NULL -&gt; local address) </td></tr>
+    <tr><td class="paramname">servname</td><td>port number as string of NULL </td></tr>
+    <tr><td class="paramname">hints</td><td>structure containing input values that set socktype and protocol </td></tr>
+    <tr><td class="paramname">res</td><td>pointer to a pointer where to store the result (set to NULL on failure) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero on failure</dd></dl>
+
+</div>
+</div>
+<a id="a8adc6d35c068a073369edde71c678cbc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8adc6d35c068a073369edde71c678cbc">&#9670;&nbsp;</a></span>lwip_gethostbyname()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct hostent* lwip_gethostbyname </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>name</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns an entry containing addresses of address family AF_INET for the host with name name. Due to dns_gethostbyname limitations, only one address is returned.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">name</td><td>the hostname to resolve </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>an entry containing addresses of address family AF_INET for the host with name name </dd></dl>
+
+</div>
+</div>
+<a id="afa229e90916f6c8d6308828f45351d2d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afa229e90916f6c8d6308828f45351d2d">&#9670;&nbsp;</a></span>lwip_gethostbyname_r()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lwip_gethostbyname_r </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct hostent *&#160;</td>
+          <td class="paramname"><em>ret</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>buflen</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct hostent **&#160;</td>
+          <td class="paramname"><em>result</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&#160;</td>
+          <td class="paramname"><em>h_errnop</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Thread-safe variant of lwip_gethostbyname: instead of using a static buffer, this function takes buffer and errno pointers as arguments and uses these for the result.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">name</td><td>the hostname to resolve </td></tr>
+    <tr><td class="paramname">ret</td><td>pre-allocated struct where to store the result </td></tr>
+    <tr><td class="paramname">buf</td><td>pre-allocated buffer where to store additional data </td></tr>
+    <tr><td class="paramname">buflen</td><td>the size of buf </td></tr>
+    <tr><td class="paramname">result</td><td>pointer to a hostent pointer that is set to ret on success and set to zero on error </td></tr>
+    <tr><td class="paramname">h_errnop</td><td>pointer to an int where to store errors (instead of modifying the global h_errno) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero on error, additional error information is stored in *h_errnop instead of h_errno to be thread-safe </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="a2a1ce3f2040007303d36c0b682b5ac10"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2a1ce3f2040007303d36c0b682b5ac10">&#9670;&nbsp;</a></span>h_errno</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int h_errno</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>h_errno is exported in netdb.h for access by applications. </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_da61e3e9a357748887e3ca8d7c5a0c16.html">api</a></li><li class="navelem"><a class="el" href="netdb_8c.html">netdb.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/netdb_8c.js b/doc/doxygen/output/html/netdb_8c.js
new file mode 100644
index 0000000..46b5732
--- /dev/null
+++ b/doc/doxygen/output/html/netdb_8c.js
@@ -0,0 +1,11 @@
+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 ],
+    [ "lwip_gethostbyname", "netdb_8c.html#a8adc6d35c068a073369edde71c678cbc", null ],
+    [ "lwip_gethostbyname_r", "netdb_8c.html#afa229e90916f6c8d6308828f45351d2d", null ],
+    [ "h_errno", "netdb_8c.html#a2a1ce3f2040007303d36c0b682b5ac10", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/netif_2ethernet_8h.html b/doc/doxygen/output/html/netif_2ethernet_8h.html
new file mode 100644
index 0000000..8c90ff5
--- /dev/null
+++ b/doc/doxygen/output/html/netif_2ethernet_8h.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/netif/ethernet.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('netif_2ethernet_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">ethernet.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="pbuf_8h.html">lwip/pbuf.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_2prot_2ethernet_8h.html">lwip/prot/ethernet.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a1ecae0406a3b714c02b632379f26a365"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_2ethernet_8h.html#a1ecae0406a3b714c02b632379f26a365">LWIP_ARP_FILTER_NETIF</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a1ecae0406a3b714c02b632379f26a365"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga6a10c58b82c56d02c48b3cfa2c2494ff"><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__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff">ethernet_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:ga6a10c58b82c56d02c48b3cfa2c2494ff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac9cad5802bfa3d885f13d2ba0f40b778"><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__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778">ethernet_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> *p, const struct <a class="el" href="structeth__addr.html">eth_addr</a> *src, const struct <a class="el" href="structeth__addr.html">eth_addr</a> *dst, u16_t eth_type)</td></tr>
+<tr class="separator:gac9cad5802bfa3d885f13d2ba0f40b778"><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>Ethernet input function - handles INCOMING ethernet level traffic To be used in most low-level netif implementations </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a1ecae0406a3b714c02b632379f26a365"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1ecae0406a3b714c02b632379f26a365">&#9670;&nbsp;</a></span>LWIP_ARP_FILTER_NETIF</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ARP_FILTER_NETIF&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Define this to 1 and define LWIP_ARP_FILTER_NETIF_FN(pbuf, netif, type) to a filter function that returns the correct netif when using multiple netifs on one hardware interface where the netif's low-level receive routine cannot decide for the correct netif (e.g. when mapping multiple IP addresses to one hardware interface). </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_c9a67764bf8a12cf6b427bb859cbcd0b.html">netif</a></li><li class="navelem"><a class="el" href="netif_2ethernet_8h.html">ethernet.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/netif_2ethernet_8h.js b/doc/doxygen/output/html/netif_2ethernet_8h.js
new file mode 100644
index 0000000..48c6637
--- /dev/null
+++ b/doc/doxygen/output/html/netif_2ethernet_8h.js
@@ -0,0 +1,6 @@
+var netif_2ethernet_8h =
+[
+    [ "LWIP_ARP_FILTER_NETIF", "netif_2ethernet_8h.html#a1ecae0406a3b714c02b632379f26a365", null ],
+    [ "ethernet_input", "group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff", null ],
+    [ "ethernet_output", "group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/netif_8c.html b/doc/doxygen/output/html/netif_8c.html
new file mode 100644
index 0000000..e63ab21
--- /dev/null
+++ b/doc/doxygen/output/html/netif_8c.html
@@ -0,0 +1,332 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/netif.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('netif_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">netif.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 &lt;stdlib.h&gt;</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="ip__addr_8h.html">lwip/ip_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_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="tcp__priv_8h.html">lwip/priv/tcp_priv.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="raw__priv_8h.html">lwip/priv/raw_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp_8h.html">lwip/snmp.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="lwip_2etharp_8h.html">lwip/etharp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.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="ip_8h.html">lwip/ip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tcpip_8h.html">lwip/tcpip.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 &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="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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga5532f93d68c874fb99c681bff2165385"><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__nosys.html#ga5532f93d68c874fb99c681bff2165385">netif_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:ga5532f93d68c874fb99c681bff2165385"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac20150ac754ff1f88afeaa33be3552a4"><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="group__netif.html#gac20150ac754ff1f88afeaa33be3552a4">netif_add_noaddr</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, 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:gac20150ac754ff1f88afeaa33be3552a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gade5498543e74067f28cc6bef0209e3be"><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="group__netif.html#gade5498543e74067f28cc6bef0209e3be">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:gade5498543e74067f28cc6bef0209e3be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga73b043a7ec0e4899aba8433ec9064cca"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca">netif_set_ipaddr</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:ga73b043a7ec0e4899aba8433ec9064cca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0bdd7c057c2f55f670853e3906014a53"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53">netif_set_netmask</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> *netmask)</td></tr>
+<tr class="separator:ga0bdd7c057c2f55f670853e3906014a53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga841876c274c3c90898579f9e12f3b520"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520">netif_set_gw</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> *gw)</td></tr>
+<tr class="separator:ga841876c274c3c90898579f9e12f3b520"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga85e31a68e96390dab2feffb11f4948a1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1">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>
+<tr class="separator:ga85e31a68e96390dab2feffb11f4948a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9c6e541f0c184e1ea61a5cd8afe3e979"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979">netif_remove</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga9c6e541f0c184e1ea61a5cd8afe3e979"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac90f290edd005238d62aa94c4ac9dea3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif_set_default</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gac90f290edd005238d62aa94c4ac9dea3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf19693be401a265a52d2a56c65753121"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gaf19693be401a265a52d2a56c65753121"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga641d07ed8c31fe5306bc01605a6790cf"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf">netif_set_down</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga641d07ed8c31fe5306bc01605a6790cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadc8787b23ac0ee023979cbadf87813d4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#gadc8787b23ac0ee023979cbadf87813d4">netif_set_status_callback</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, <a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a> status_callback)</td></tr>
+<tr class="separator:gadc8787b23ac0ee023979cbadf87813d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga319c88da0fdf25c1fee1595299bc35ce"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce">netif_set_remove_callback</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, <a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a> remove_callback)</td></tr>
+<tr class="separator:ga319c88da0fdf25c1fee1595299bc35ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae0d2975f189277990e9d5276fdd9e9ea"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_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:gae0d2975f189277990e9d5276fdd9e9ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga34e37a1e8e358760dc1c43887922c7db"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga34e37a1e8e358760dc1c43887922c7db">netif_set_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:ga34e37a1e8e358760dc1c43887922c7db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1cd45910add90e267e33d680bbc3f0f4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4">netif_set_link_callback</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, <a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a> link_callback)</td></tr>
+<tr class="separator:ga1cd45910add90e267e33d680bbc3f0f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga691f1cc7c9778ffa62a3843c184404b2"><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__netif.html#ga691f1cc7c9778ffa62a3843c184404b2">netif_loop_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> *p)</td></tr>
+<tr class="separator:ga691f1cc7c9778ffa62a3843c184404b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0fbaed78253d21e1b54e65651da3e327"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8c.html#a0fbaed78253d21e1b54e65651da3e327">netif_poll</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a0fbaed78253d21e1b54e65651da3e327"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga55d62d43b5a9a5527f0116ec38369978"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978">netif_alloc_client_data_id</a> (void)</td></tr>
+<tr class="separator:ga55d62d43b5a9a5527f0116ec38369978"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae21572fdbd8664d22a1b281a6c31c9bb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb">netif_ip6_addr_set</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, s8_t addr_idx, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *addr6)</td></tr>
+<tr class="separator:gae21572fdbd8664d22a1b281a6c31c9bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9cde7286535c7f037a9b16052561b91f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f">netif_ip6_addr_set_state</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, s8_t addr_idx, u8_t state)</td></tr>
+<tr class="separator:ga9cde7286535c7f037a9b16052561b91f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0ec111195bcc452f77895ad35aedd7dc"><td class="memItemLeft" align="right" valign="top">s8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8c.html#a0ec111195bcc452f77895ad35aedd7dc">netif_get_ip6_addr_match</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ip6addr)</td></tr>
+<tr class="separator:a0ec111195bcc452f77895ad35aedd7dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae864211a5eb052deb5da7bc7e3427fb9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9">netif_create_ip6_linklocal_address</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t from_mac_48bit)</td></tr>
+<tr class="separator:gae864211a5eb052deb5da7bc7e3427fb9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab0727fba5f5b3fed8d7013775506f327"><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__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327">netif_add_ip6_address</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ip6addr, s8_t *chosen_idx)</td></tr>
+<tr class="separator:gab0727fba5f5b3fed8d7013775506f327"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac763a1f647fb9e8af4254418e813a6ae"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#gac763a1f647fb9e8af4254418e813a6ae">netif_name_to_index</a> (const char *name)</td></tr>
+<tr class="separator:gac763a1f647fb9e8af4254418e813a6ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3ff104d083914e87a7805a0b90a85755"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga3ff104d083914e87a7805a0b90a85755">netif_index_to_name</a> (u8_t idx, char *name)</td></tr>
+<tr class="separator:ga3ff104d083914e87a7805a0b90a85755"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae4df885347c800a5486d3bf25981300e"><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="group__netif.html#gae4df885347c800a5486d3bf25981300e">netif_get_by_index</a> (u8_t idx)</td></tr>
+<tr class="separator:gae4df885347c800a5486d3bf25981300e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga69c93a139e8a1f6ef4e3d076a2897def"><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="group__netif.html#ga69c93a139e8a1f6ef4e3d076a2897def">netif_find</a> (const char *name)</td></tr>
+<tr class="separator:ga69c93a139e8a1f6ef4e3d076a2897def"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3efc2b72f75936d50708247420c9d1d9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga3efc2b72f75936d50708247420c9d1d9">netif_add_ext_callback</a> (netif_ext_callback_t *callback, <a class="el" href="group__netif.html#ga5ee213cea065424c89c66f138c008da1">netif_ext_callback_fn</a> fn)</td></tr>
+<tr class="separator:ga3efc2b72f75936d50708247420c9d1d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1d91ac26b0993a9a3466b317ab5ec716"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716">netif_remove_ext_callback</a> (netif_ext_callback_t *callback)</td></tr>
+<tr class="separator:ga1d91ac26b0993a9a3466b317ab5ec716"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75b5298b1c3c3794747d78a4ce95d81c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8c.html#a75b5298b1c3c3794747d78a4ce95d81c">netif_invoke_ext_callback</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, <a class="el" href="group__netif.html#gab2b9387389513a02027c62e246723808">netif_nsc_reason_t</a> reason, const <a class="el" href="unionnetif__ext__callback__args__t.html">netif_ext_callback_args_t</a> *args)</td></tr>
+<tr class="separator:a75b5298b1c3c3794747d78a4ce95d81c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a1c8141eaa98f6dc6dfddbb23a706656c"><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="netif_8c.html#a1c8141eaa98f6dc6dfddbb23a706656c">netif_list</a></td></tr>
+<tr class="separator:a1c8141eaa98f6dc6dfddbb23a706656c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d0925cbce550ed461907aee816713ba"><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="netif_8c.html#a3d0925cbce550ed461907aee816713ba">netif_default</a></td></tr>
+<tr class="separator:a3d0925cbce550ed461907aee816713ba"><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>lwIP network interface abstraction </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a0ec111195bcc452f77895ad35aedd7dc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0ec111195bcc452f77895ad35aedd7dc">&#9670;&nbsp;</a></span>netif_get_ip6_addr_match()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">s8_t netif_get_ip6_addr_match </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ip6addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Checks if a specific local address is present on the netif and returns its index. Depending on its state, it may or may not be assigned to the interface (as per RFC terminology).</p>
+<p>The given address may or may not be zoned (i.e., have a zone index other than IP6_NO_ZONE). If the address is zoned, it must have the correct zone for the given netif, or no match will be found.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the netif to check </td></tr>
+    <tr><td class="paramname">ip6addr</td><td>the IPv6 address to find </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>&gt;= 0: address found, this is its index -1: address not found on this netif </dd></dl>
+
+</div>
+</div>
+<a id="a75b5298b1c3c3794747d78a4ce95d81c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a75b5298b1c3c3794747d78a4ce95d81c">&#9670;&nbsp;</a></span>netif_invoke_ext_callback()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_invoke_ext_callback </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__netif.html#gab2b9387389513a02027c62e246723808">netif_nsc_reason_t</a>&#160;</td>
+          <td class="paramname"><em>reason</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="unionnetif__ext__callback__args__t.html">netif_ext_callback_args_t</a> *&#160;</td>
+          <td class="paramname"><em>args</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Invoke extended netif status event </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>netif that is affected by change </td></tr>
+    <tr><td class="paramname">reason</td><td>change reason </td></tr>
+    <tr><td class="paramname">args</td><td>depends on reason, see reason description </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a0fbaed78253d21e1b54e65651da3e327"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0fbaed78253d21e1b54e65651da3e327">&#9670;&nbsp;</a></span>netif_poll()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_poll </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Call <a class="el" href="netif_8c.html#a0fbaed78253d21e1b54e65651da3e327">netif_poll()</a> in the main loop of your application. This is to prevent reentering non-reentrant functions like <a class="el" href="tcp__in_8c.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5">tcp_input()</a>. Packets passed to <a class="el" href="group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2">netif_loop_output()</a> are put on a list that is passed to netif-&gt;input() by <a class="el" href="netif_8c.html#a0fbaed78253d21e1b54e65651da3e327">netif_poll()</a>. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="a3d0925cbce550ed461907aee816713ba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3d0925cbce550ed461907aee816713ba">&#9670;&nbsp;</a></span>netif_default</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* netif_default</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The default network interface. </p>
+
+</div>
+</div>
+<a id="a1c8141eaa98f6dc6dfddbb23a706656c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1c8141eaa98f6dc6dfddbb23a706656c">&#9670;&nbsp;</a></span>netif_list</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* netif_list</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The list of network interfaces. </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="netif_8c.html">netif.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/netif_8c.js b/doc/doxygen/output/html/netif_8c.js
new file mode 100644
index 0000000..d8d9f8f
--- /dev/null
+++ b/doc/doxygen/output/html/netif_8c.js
@@ -0,0 +1,36 @@
+var netif_8c =
+[
+    [ "netif_add", "group__netif.html#gade5498543e74067f28cc6bef0209e3be", null ],
+    [ "netif_add_ext_callback", "group__netif.html#ga3efc2b72f75936d50708247420c9d1d9", null ],
+    [ "netif_add_ip6_address", "group__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327", null ],
+    [ "netif_add_noaddr", "group__netif.html#gac20150ac754ff1f88afeaa33be3552a4", null ],
+    [ "netif_alloc_client_data_id", "group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978", null ],
+    [ "netif_create_ip6_linklocal_address", "group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9", null ],
+    [ "netif_find", "group__netif.html#ga69c93a139e8a1f6ef4e3d076a2897def", null ],
+    [ "netif_get_by_index", "group__netif.html#gae4df885347c800a5486d3bf25981300e", null ],
+    [ "netif_get_ip6_addr_match", "netif_8c.html#a0ec111195bcc452f77895ad35aedd7dc", null ],
+    [ "netif_index_to_name", "group__netif.html#ga3ff104d083914e87a7805a0b90a85755", null ],
+    [ "netif_input", "group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385", null ],
+    [ "netif_invoke_ext_callback", "netif_8c.html#a75b5298b1c3c3794747d78a4ce95d81c", null ],
+    [ "netif_ip6_addr_set", "group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb", null ],
+    [ "netif_ip6_addr_set_state", "group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f", null ],
+    [ "netif_loop_output", "group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2", null ],
+    [ "netif_name_to_index", "group__netif.html#gac763a1f647fb9e8af4254418e813a6ae", null ],
+    [ "netif_poll", "netif_8c.html#a0fbaed78253d21e1b54e65651da3e327", null ],
+    [ "netif_remove", "group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979", null ],
+    [ "netif_remove_ext_callback", "group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716", null ],
+    [ "netif_set_addr", "group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1", null ],
+    [ "netif_set_default", "group__netif.html#gac90f290edd005238d62aa94c4ac9dea3", null ],
+    [ "netif_set_down", "group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf", null ],
+    [ "netif_set_gw", "group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520", null ],
+    [ "netif_set_ipaddr", "group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca", null ],
+    [ "netif_set_link_callback", "group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4", null ],
+    [ "netif_set_link_down", "group__netif.html#ga34e37a1e8e358760dc1c43887922c7db", null ],
+    [ "netif_set_link_up", "group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea", null ],
+    [ "netif_set_netmask", "group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53", null ],
+    [ "netif_set_remove_callback", "group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce", null ],
+    [ "netif_set_status_callback", "group__netif.html#gadc8787b23ac0ee023979cbadf87813d4", null ],
+    [ "netif_set_up", "group__netif.html#gaf19693be401a265a52d2a56c65753121", null ],
+    [ "netif_default", "netif_8c.html#a3d0925cbce550ed461907aee816713ba", null ],
+    [ "netif_list", "netif_8c.html#a1c8141eaa98f6dc6dfddbb23a706656c", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/netif_8h.html b/doc/doxygen/output/html/netif_8h.html
new file mode 100644
index 0000000..7d2e088
--- /dev/null
+++ b/doc/doxygen/output/html/netif_8h.html
@@ -0,0 +1,821 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/netif.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('netif_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">netif.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="err_8h.html">lwip/err.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="pbuf_8h.html">lwip/pbuf.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structnetif.html">netif</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">union &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionnetif__ext__callback__args__t.html">netif_ext_callback_args_t</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="structnetif__ext__callback__args__t_1_1link__changed__s.html">netif_ext_callback_args_t::link_changed_s</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="structnetif__ext__callback__args__t_1_1status__changed__s.html">netif_ext_callback_args_t::status_changed_s</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="structnetif__ext__callback__args__t_1_1ipv4__changed__s.html">netif_ext_callback_args_t::ipv4_changed_s</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="structnetif__ext__callback__args__t_1_1ipv6__set__s.html">netif_ext_callback_args_t::ipv6_set_s</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="structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html">netif_ext_callback_args_t::ipv6_addr_state_changed_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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ab887a8ec553de1be1d04cf2961c63c41"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#ab887a8ec553de1be1d04cf2961c63c41">NETIF_MAX_HWADDR_LEN</a>&#160;&#160;&#160;6U</td></tr>
+<tr class="separator:ab887a8ec553de1be1d04cf2961c63c41"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a302f24fbfe883ee4840ffc71f267ae2a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#a302f24fbfe883ee4840ffc71f267ae2a">NETIF_NAMESIZE</a>&#160;&#160;&#160;6</td></tr>
+<tr class="separator:a302f24fbfe883ee4840ffc71f267ae2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab47d7d130693dc155f480a5bf447725e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e">NETIF_FLAG_UP</a>&#160;&#160;&#160;0x01U</td></tr>
+<tr class="separator:gab47d7d130693dc155f480a5bf447725e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaef64fe15c82bc7b235366923e517104e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__flags.html#gaef64fe15c82bc7b235366923e517104e">NETIF_FLAG_BROADCAST</a>&#160;&#160;&#160;0x02U</td></tr>
+<tr class="separator:gaef64fe15c82bc7b235366923e517104e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga75f5a2b9276c93e3bd18a568459fd2d8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__flags.html#ga75f5a2b9276c93e3bd18a568459fd2d8">NETIF_FLAG_LINK_UP</a>&#160;&#160;&#160;0x04U</td></tr>
+<tr class="separator:ga75f5a2b9276c93e3bd18a568459fd2d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga92448dc510bc8d700c09e5c971ef0676"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__flags.html#ga92448dc510bc8d700c09e5c971ef0676">NETIF_FLAG_ETHARP</a>&#160;&#160;&#160;0x08U</td></tr>
+<tr class="separator:ga92448dc510bc8d700c09e5c971ef0676"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga76ad9d0cf9f029df0ab2a998c64040dc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__flags.html#ga76ad9d0cf9f029df0ab2a998c64040dc">NETIF_FLAG_ETHERNET</a>&#160;&#160;&#160;0x10U</td></tr>
+<tr class="separator:ga76ad9d0cf9f029df0ab2a998c64040dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac9493b923d733c73f6006d9714826558"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__flags.html#gac9493b923d733c73f6006d9714826558">NETIF_FLAG_IGMP</a>&#160;&#160;&#160;0x20U</td></tr>
+<tr class="separator:gac9493b923d733c73f6006d9714826558"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab14fbe1447d2fdbdf5abc87f51eb6508"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__flags.html#gab14fbe1447d2fdbdf5abc87f51eb6508">NETIF_FLAG_MLD6</a>&#160;&#160;&#160;0x40U</td></tr>
+<tr class="separator:gab14fbe1447d2fdbdf5abc87f51eb6508"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5ce61a277e1951183f7b7d03742c231f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f">netif_set_client_data</a>(<a class="el" href="structnetif.html">netif</a>,  id,  data)&#160;&#160;&#160;<a class="el" href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a>(<a class="el" href="structnetif.html">netif</a>, id) = (data)</td></tr>
+<tr class="separator:ga5ce61a277e1951183f7b7d03742c231f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4bce01ddbf0fd70cb88431f773c91bc5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a>(<a class="el" href="structnetif.html">netif</a>,  id)&#160;&#160;&#160;(<a class="el" href="structnetif.html">netif</a>)-&gt;client_data[(id)]</td></tr>
+<tr class="separator:ga4bce01ddbf0fd70cb88431f773c91bc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac9b6e63b5dd2968fe0a4813f3eefb55d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#gac9b6e63b5dd2968fe0a4813f3eefb55d">netif_ip4_addr</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;((const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a>*)<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;<a class="el" href="structip__addr.html">ip_addr</a>)))</td></tr>
+<tr class="separator:gac9b6e63b5dd2968fe0a4813f3eefb55d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga952d1436f2428b92fc8197bcf2f8fca3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga952d1436f2428b92fc8197bcf2f8fca3">netif_ip4_netmask</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;((const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a>*)<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;netmask)))</td></tr>
+<tr class="separator:ga952d1436f2428b92fc8197bcf2f8fca3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga86d69faf416765b7f8faf60a43cc50da"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga86d69faf416765b7f8faf60a43cc50da">netif_ip4_gw</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;((const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a>*)<a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;gw)))</td></tr>
+<tr class="separator:ga86d69faf416765b7f8faf60a43cc50da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga54179a2f3b7cc35b23ee8d692d8d8022"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga54179a2f3b7cc35b23ee8d692d8d8022">netif_ip_addr4</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;((const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>*)&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;<a class="el" href="structip__addr.html">ip_addr</a>))</td></tr>
+<tr class="separator:ga54179a2f3b7cc35b23ee8d692d8d8022"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga58518602f388d2640985a01a312f0a51"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga58518602f388d2640985a01a312f0a51">netif_ip_netmask4</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;((const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>*)&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;netmask))</td></tr>
+<tr class="separator:ga58518602f388d2640985a01a312f0a51"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7ea95478e000701423b7f6316e575a2a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga7ea95478e000701423b7f6316e575a2a">netif_ip_gw4</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;((const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>*)&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;gw))</td></tr>
+<tr class="separator:ga7ea95478e000701423b7f6316e575a2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga94a4c24c988afc0a577387730f303b19"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga94a4c24c988afc0a577387730f303b19">netif_is_up</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;(((<a class="el" href="structnetif.html">netif</a>)-&gt;flags &amp; <a class="el" href="group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e">NETIF_FLAG_UP</a>) ? (u8_t)1 : (u8_t)0)</td></tr>
+<tr class="separator:ga94a4c24c988afc0a577387730f303b19"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a780be4c3fa9f7f2534f7865666c3a1b8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#a780be4c3fa9f7f2534f7865666c3a1b8">netif_is_link_up</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;(((<a class="el" href="structnetif.html">netif</a>)-&gt;flags &amp; <a class="el" href="group__netif__flags.html#ga75f5a2b9276c93e3bd18a568459fd2d8">NETIF_FLAG_LINK_UP</a>) ? (u8_t)1 : (u8_t)0)</td></tr>
+<tr class="separator:a780be4c3fa9f7f2534f7865666c3a1b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5e5d2c6fa5566a24dd848f3a2c7c957f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga5e5d2c6fa5566a24dd848f3a2c7c957f">netif_set_hostname</a>(<a class="el" href="structnetif.html">netif</a>,  name)&#160;&#160;&#160;do { if((<a class="el" href="structnetif.html">netif</a>) != NULL) { (<a class="el" href="structnetif.html">netif</a>)-&gt;hostname = name; }}while(0)</td></tr>
+<tr class="separator:ga5e5d2c6fa5566a24dd848f3a2c7c957f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5a378ba73e60cd1e5235474f0db22978"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga5a378ba73e60cd1e5235474f0db22978">netif_get_hostname</a>(<a class="el" href="structnetif.html">netif</a>)&#160;&#160;&#160;(((<a class="el" href="structnetif.html">netif</a>) != NULL) ? ((<a class="el" href="structnetif.html">netif</a>)-&gt;hostname) : NULL)</td></tr>
+<tr class="separator:ga5a378ba73e60cd1e5235474f0db22978"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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)&#160;&#160;&#160;do { if((<a class="el" href="structnetif.html">netif</a>) != NULL) { (<a class="el" href="structnetif.html">netif</a>)-&gt;igmp_mac_filter = function; }}while(0)</td></tr>
+<tr class="separator:ga3428b3f8195249c6cd8704a4db46b401"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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)&#160;&#160;&#160;do { if((<a class="el" href="structnetif.html">netif</a>) != NULL) { (<a class="el" href="structnetif.html">netif</a>)-&gt;mld_mac_filter = function; }}while(0)</td></tr>
+<tr class="separator:ga97f30bb5542e4c07d3b32e3c754e104c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae424e336fe9f013b30d4065fd35c91ee"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip6.html#gae424e336fe9f013b30d4065fd35c91ee">netif_ip_addr6</a>(<a class="el" href="structnetif.html">netif</a>,  i)&#160;&#160;&#160;((const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>*)(&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;<a class="el" href="structip6__addr.html">ip6_addr</a>[i])))</td></tr>
+<tr class="separator:gae424e336fe9f013b30d4065fd35c91ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7ec0623f1a858a0cdb187beaa89df365"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip6.html#ga7ec0623f1a858a0cdb187beaa89df365">netif_ip6_addr</a>(<a class="el" href="structnetif.html">netif</a>,  i)&#160;&#160;&#160;((const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a>*)<a class="el" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(&amp;((<a class="el" href="structnetif.html">netif</a>)-&gt;<a class="el" href="structip6__addr.html">ip6_addr</a>[i])))</td></tr>
+<tr class="separator:ga7ec0623f1a858a0cdb187beaa89df365"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adbfecb47897cfe63d4f6366c1fed23b2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#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"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#ae8e2dc87c19a03d481ae37bcf7ced5c9">LWIP_NSC_NETIF_REMOVED</a>&#160;&#160;&#160;0x0002</td></tr>
+<tr class="separator:ae8e2dc87c19a03d481ae37bcf7ced5c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ad7308195c0581680dd62fb148501cd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#a5ad7308195c0581680dd62fb148501cd">LWIP_NSC_LINK_CHANGED</a>&#160;&#160;&#160;0x0004</td></tr>
+<tr class="separator:a5ad7308195c0581680dd62fb148501cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6f406ee3ab60e8a4f27ae2483c96b8e2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#a6f406ee3ab60e8a4f27ae2483c96b8e2">LWIP_NSC_STATUS_CHANGED</a>&#160;&#160;&#160;0x0008</td></tr>
+<tr class="separator:a6f406ee3ab60e8a4f27ae2483c96b8e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeb4e790199b02469aa04c044ef5cfa32"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#aeb4e790199b02469aa04c044ef5cfa32">LWIP_NSC_IPV4_ADDRESS_CHANGED</a>&#160;&#160;&#160;0x0010</td></tr>
+<tr class="separator:aeb4e790199b02469aa04c044ef5cfa32"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a22400d2202581b4a7273cded712adf49"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#a22400d2202581b4a7273cded712adf49">LWIP_NSC_IPV4_GATEWAY_CHANGED</a>&#160;&#160;&#160;0x0020</td></tr>
+<tr class="separator:a22400d2202581b4a7273cded712adf49"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad747072771a887443ab33f90a12077d4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#ad747072771a887443ab33f90a12077d4">LWIP_NSC_IPV4_NETMASK_CHANGED</a>&#160;&#160;&#160;0x0040</td></tr>
+<tr class="separator:ad747072771a887443ab33f90a12077d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ff19a6f3045f65d0397d30b6609660a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#a4ff19a6f3045f65d0397d30b6609660a">LWIP_NSC_IPV4_SETTINGS_CHANGED</a>&#160;&#160;&#160;0x0080</td></tr>
+<tr class="separator:a4ff19a6f3045f65d0397d30b6609660a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8fb4317a77ee2e3848be80db15618666"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#a8fb4317a77ee2e3848be80db15618666">LWIP_NSC_IPV6_SET</a>&#160;&#160;&#160;0x0100</td></tr>
+<tr class="separator:a8fb4317a77ee2e3848be80db15618666"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0d70fe11cac43c8fa35827b8e607ccf6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#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>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a2b02a78a8769925ff8e4f83d34e5e1f5"><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5">netif_init_fn</a>) (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a2b02a78a8769925ff8e4f83d34e5e1f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab2302b1b64ac7b95f24c6bab754a575e"><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e">netif_input_fn</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:ab2302b1b64ac7b95f24c6bab754a575e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b4893aa2ed8c606a0cd7aa932fe5067"><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#a7b4893aa2ed8c606a0cd7aa932fe5067">netif_output_fn</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> *p, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr)</td></tr>
+<tr class="separator:a7b4893aa2ed8c606a0cd7aa932fe5067"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a343a5b14136a51957d552527384674b3"><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#a343a5b14136a51957d552527384674b3">netif_output_ip6_fn</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> *p, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ipaddr)</td></tr>
+<tr class="separator:a343a5b14136a51957d552527384674b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab75e9d808bc1b788bea84213e6a111ed"><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#ab75e9d808bc1b788bea84213e6a111ed">netif_linkoutput_fn</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> *p)</td></tr>
+<tr class="separator:ab75e9d808bc1b788bea84213e6a111ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a447d0a7e7c6e2396557c287b8b8c9436"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a>) (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a447d0a7e7c6e2396557c287b8b8c9436"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a71cad3277efe29191eef3348f4bf21f7"><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#a71cad3277efe29191eef3348f4bf21f7">netif_igmp_mac_filter_fn</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> *group, enum <a class="el" href="netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0">netif_mac_filter_action</a> action)</td></tr>
+<tr class="separator:a71cad3277efe29191eef3348f4bf21f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af2ed0716122b65e7feb43e0dd99ae468"><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#af2ed0716122b65e7feb43e0dd99ae468">netif_mld_mac_filter_fn</a>) (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *group, enum <a class="el" href="netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0">netif_mac_filter_action</a> action)</td></tr>
+<tr class="separator:af2ed0716122b65e7feb43e0dd99ae468"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab2b9387389513a02027c62e246723808"><td class="memItemLeft" align="right" valign="top">typedef u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#gab2b9387389513a02027c62e246723808">netif_nsc_reason_t</a></td></tr>
+<tr class="separator:gab2b9387389513a02027c62e246723808"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5ee213cea065424c89c66f138c008da1"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga5ee213cea065424c89c66f138c008da1">netif_ext_callback_fn</a>) (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, <a class="el" href="group__netif.html#gab2b9387389513a02027c62e246723808">netif_nsc_reason_t</a> reason, const <a class="el" href="unionnetif__ext__callback__args__t.html">netif_ext_callback_args_t</a> *args)</td></tr>
+<tr class="separator:ga5ee213cea065424c89c66f138c008da1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ab194ec4241fad8b6e9aac51e3ec23de0"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0">netif_mac_filter_action</a> { <a class="el" href="netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a7ad3406353906deb4e64ebeed349e07e">NETIF_DEL_MAC_FILTER</a> = 0, 
+<a class="el" href="netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a4186fbaf94be956ea1a3b02cd1cccb1f">NETIF_ADD_MAC_FILTER</a> = 1
+ }</td></tr>
+<tr class="separator:ab194ec4241fad8b6e9aac51e3ec23de0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga55d62d43b5a9a5527f0116ec38369978"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978">netif_alloc_client_data_id</a> (void)</td></tr>
+<tr class="separator:ga55d62d43b5a9a5527f0116ec38369978"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac20150ac754ff1f88afeaa33be3552a4"><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="group__netif.html#gac20150ac754ff1f88afeaa33be3552a4">netif_add_noaddr</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, 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:gac20150ac754ff1f88afeaa33be3552a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gade5498543e74067f28cc6bef0209e3be"><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="group__netif.html#gade5498543e74067f28cc6bef0209e3be">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:gade5498543e74067f28cc6bef0209e3be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga85e31a68e96390dab2feffb11f4948a1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1">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>
+<tr class="separator:ga85e31a68e96390dab2feffb11f4948a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9c6e541f0c184e1ea61a5cd8afe3e979"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979">netif_remove</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga9c6e541f0c184e1ea61a5cd8afe3e979"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga69c93a139e8a1f6ef4e3d076a2897def"><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="group__netif.html#ga69c93a139e8a1f6ef4e3d076a2897def">netif_find</a> (const char *name)</td></tr>
+<tr class="separator:ga69c93a139e8a1f6ef4e3d076a2897def"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac90f290edd005238d62aa94c4ac9dea3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif_set_default</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gac90f290edd005238d62aa94c4ac9dea3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga73b043a7ec0e4899aba8433ec9064cca"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca">netif_set_ipaddr</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:ga73b043a7ec0e4899aba8433ec9064cca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0bdd7c057c2f55f670853e3906014a53"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53">netif_set_netmask</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> *netmask)</td></tr>
+<tr class="separator:ga0bdd7c057c2f55f670853e3906014a53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga841876c274c3c90898579f9e12f3b520"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520">netif_set_gw</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> *gw)</td></tr>
+<tr class="separator:ga841876c274c3c90898579f9e12f3b520"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf19693be401a265a52d2a56c65753121"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gaf19693be401a265a52d2a56c65753121"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga641d07ed8c31fe5306bc01605a6790cf"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf">netif_set_down</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga641d07ed8c31fe5306bc01605a6790cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadc8787b23ac0ee023979cbadf87813d4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#gadc8787b23ac0ee023979cbadf87813d4">netif_set_status_callback</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, <a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a> status_callback)</td></tr>
+<tr class="separator:gadc8787b23ac0ee023979cbadf87813d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga319c88da0fdf25c1fee1595299bc35ce"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce">netif_set_remove_callback</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, <a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a> remove_callback)</td></tr>
+<tr class="separator:ga319c88da0fdf25c1fee1595299bc35ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae0d2975f189277990e9d5276fdd9e9ea"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_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:gae0d2975f189277990e9d5276fdd9e9ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga34e37a1e8e358760dc1c43887922c7db"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga34e37a1e8e358760dc1c43887922c7db">netif_set_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:ga34e37a1e8e358760dc1c43887922c7db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1cd45910add90e267e33d680bbc3f0f4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4">netif_set_link_callback</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, <a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a> link_callback)</td></tr>
+<tr class="separator:ga1cd45910add90e267e33d680bbc3f0f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga691f1cc7c9778ffa62a3843c184404b2"><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__netif.html#ga691f1cc7c9778ffa62a3843c184404b2">netif_loop_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> *p)</td></tr>
+<tr class="separator:ga691f1cc7c9778ffa62a3843c184404b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0fbaed78253d21e1b54e65651da3e327"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#a0fbaed78253d21e1b54e65651da3e327">netif_poll</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a0fbaed78253d21e1b54e65651da3e327"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5532f93d68c874fb99c681bff2165385"><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__nosys.html#ga5532f93d68c874fb99c681bff2165385">netif_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:ga5532f93d68c874fb99c681bff2165385"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae21572fdbd8664d22a1b281a6c31c9bb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb">netif_ip6_addr_set</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, s8_t addr_idx, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *addr6)</td></tr>
+<tr class="separator:gae21572fdbd8664d22a1b281a6c31c9bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9cde7286535c7f037a9b16052561b91f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f">netif_ip6_addr_set_state</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, s8_t addr_idx, u8_t state)</td></tr>
+<tr class="separator:ga9cde7286535c7f037a9b16052561b91f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0ec111195bcc452f77895ad35aedd7dc"><td class="memItemLeft" align="right" valign="top">s8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#a0ec111195bcc452f77895ad35aedd7dc">netif_get_ip6_addr_match</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ip6addr)</td></tr>
+<tr class="separator:a0ec111195bcc452f77895ad35aedd7dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae864211a5eb052deb5da7bc7e3427fb9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9">netif_create_ip6_linklocal_address</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t from_mac_48bit)</td></tr>
+<tr class="separator:gae864211a5eb052deb5da7bc7e3427fb9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab0727fba5f5b3fed8d7013775506f327"><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__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327">netif_add_ip6_address</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ip6addr, s8_t *chosen_idx)</td></tr>
+<tr class="separator:gab0727fba5f5b3fed8d7013775506f327"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac763a1f647fb9e8af4254418e813a6ae"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#gac763a1f647fb9e8af4254418e813a6ae">netif_name_to_index</a> (const char *name)</td></tr>
+<tr class="separator:gac763a1f647fb9e8af4254418e813a6ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3ff104d083914e87a7805a0b90a85755"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga3ff104d083914e87a7805a0b90a85755">netif_index_to_name</a> (u8_t idx, char *name)</td></tr>
+<tr class="separator:ga3ff104d083914e87a7805a0b90a85755"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae4df885347c800a5486d3bf25981300e"><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="group__netif.html#gae4df885347c800a5486d3bf25981300e">netif_get_by_index</a> (u8_t idx)</td></tr>
+<tr class="separator:gae4df885347c800a5486d3bf25981300e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3efc2b72f75936d50708247420c9d1d9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga3efc2b72f75936d50708247420c9d1d9">netif_add_ext_callback</a> (netif_ext_callback_t *callback, <a class="el" href="group__netif.html#ga5ee213cea065424c89c66f138c008da1">netif_ext_callback_fn</a> fn)</td></tr>
+<tr class="separator:ga3efc2b72f75936d50708247420c9d1d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1d91ac26b0993a9a3466b317ab5ec716"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716">netif_remove_ext_callback</a> (netif_ext_callback_t *callback)</td></tr>
+<tr class="separator:ga1d91ac26b0993a9a3466b317ab5ec716"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75b5298b1c3c3794747d78a4ce95d81c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="netif_8h.html#a75b5298b1c3c3794747d78a4ce95d81c">netif_invoke_ext_callback</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, <a class="el" href="group__netif.html#gab2b9387389513a02027c62e246723808">netif_nsc_reason_t</a> reason, const <a class="el" href="unionnetif__ext__callback__args__t.html">netif_ext_callback_args_t</a> *args)</td></tr>
+<tr class="separator:a75b5298b1c3c3794747d78a4ce95d81c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a1c8141eaa98f6dc6dfddbb23a706656c"><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="netif_8h.html#a1c8141eaa98f6dc6dfddbb23a706656c">netif_list</a></td></tr>
+<tr class="separator:a1c8141eaa98f6dc6dfddbb23a706656c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d0925cbce550ed461907aee816713ba"><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="netif_8h.html#a3d0925cbce550ed461907aee816713ba">netif_default</a></td></tr>
+<tr class="separator:a3d0925cbce550ed461907aee816713ba"><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>netif API (to be used from TCPIP thread) </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="aeb4e790199b02469aa04c044ef5cfa32"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeb4e790199b02469aa04c044ef5cfa32">&#9670;&nbsp;</a></span>LWIP_NSC_IPV4_ADDRESS_CHANGED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NSC_IPV4_ADDRESS_CHANGED&#160;&#160;&#160;0x0010</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IPv4 address has changed </p>
+
+</div>
+</div>
+<a id="a22400d2202581b4a7273cded712adf49"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a22400d2202581b4a7273cded712adf49">&#9670;&nbsp;</a></span>LWIP_NSC_IPV4_GATEWAY_CHANGED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NSC_IPV4_GATEWAY_CHANGED&#160;&#160;&#160;0x0020</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IPv4 gateway has changed </p>
+
+</div>
+</div>
+<a id="ad747072771a887443ab33f90a12077d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad747072771a887443ab33f90a12077d4">&#9670;&nbsp;</a></span>LWIP_NSC_IPV4_NETMASK_CHANGED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NSC_IPV4_NETMASK_CHANGED&#160;&#160;&#160;0x0040</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IPv4 netmask has changed </p>
+
+</div>
+</div>
+<a id="a4ff19a6f3045f65d0397d30b6609660a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4ff19a6f3045f65d0397d30b6609660a">&#9670;&nbsp;</a></span>LWIP_NSC_IPV4_SETTINGS_CHANGED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NSC_IPV4_SETTINGS_CHANGED&#160;&#160;&#160;0x0080</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>called AFTER IPv4 address/gateway/netmask changes have been applied </p>
+
+</div>
+</div>
+<a id="a0d70fe11cac43c8fa35827b8e607ccf6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0d70fe11cac43c8fa35827b8e607ccf6">&#9670;&nbsp;</a></span>LWIP_NSC_IPV6_ADDR_STATE_CHANGED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NSC_IPV6_ADDR_STATE_CHANGED&#160;&#160;&#160;0x0200</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IPv6 address state has changed </p>
+
+</div>
+</div>
+<a id="a8fb4317a77ee2e3848be80db15618666"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8fb4317a77ee2e3848be80db15618666">&#9670;&nbsp;</a></span>LWIP_NSC_IPV6_SET</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NSC_IPV6_SET&#160;&#160;&#160;0x0100</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IPv6 address was added </p>
+
+</div>
+</div>
+<a id="a5ad7308195c0581680dd62fb148501cd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5ad7308195c0581680dd62fb148501cd">&#9670;&nbsp;</a></span>LWIP_NSC_LINK_CHANGED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NSC_LINK_CHANGED&#160;&#160;&#160;0x0004</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>link changed </p>
+
+</div>
+</div>
+<a id="adbfecb47897cfe63d4f6366c1fed23b2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adbfecb47897cfe63d4f6366c1fed23b2">&#9670;&nbsp;</a></span>LWIP_NSC_NETIF_ADDED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NSC_NETIF_ADDED&#160;&#160;&#160;0x0001</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>netif was added. arg: NULL. Called AFTER netif was added. </p>
+
+</div>
+</div>
+<a id="ae8e2dc87c19a03d481ae37bcf7ced5c9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae8e2dc87c19a03d481ae37bcf7ced5c9">&#9670;&nbsp;</a></span>LWIP_NSC_NETIF_REMOVED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NSC_NETIF_REMOVED&#160;&#160;&#160;0x0002</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>netif was removed. arg: NULL. Called BEFORE netif is removed. </p>
+
+</div>
+</div>
+<a id="a6f406ee3ab60e8a4f27ae2483c96b8e2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6f406ee3ab60e8a4f27ae2483c96b8e2">&#9670;&nbsp;</a></span>LWIP_NSC_STATUS_CHANGED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NSC_STATUS_CHANGED&#160;&#160;&#160;0x0008</td>
+        </tr>
+      </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>
+
+</div>
+</div>
+<a id="a780be4c3fa9f7f2534f7865666c3a1b8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a780be4c3fa9f7f2534f7865666c3a1b8">&#9670;&nbsp;</a></span>netif_is_link_up</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_is_link_up</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><a class="el" href="structnetif.html">netif</a></td><td>)</td>
+          <td>&#160;&#160;&#160;(((<a class="el" href="structnetif.html">netif</a>)-&gt;flags &amp; <a class="el" href="group__netif__flags.html#ga75f5a2b9276c93e3bd18a568459fd2d8">NETIF_FLAG_LINK_UP</a>) ? (u8_t)1 : (u8_t)0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Ask if a link is up </p>
+
+</div>
+</div>
+<a id="ab887a8ec553de1be1d04cf2961c63c41"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab887a8ec553de1be1d04cf2961c63c41">&#9670;&nbsp;</a></span>NETIF_MAX_HWADDR_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETIF_MAX_HWADDR_LEN&#160;&#160;&#160;6U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Must be the maximum of all used hardware address lengths across all types of interfaces in use. This does not have to be changed, normally. </p>
+
+</div>
+</div>
+<a id="a302f24fbfe883ee4840ffc71f267ae2a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a302f24fbfe883ee4840ffc71f267ae2a">&#9670;&nbsp;</a></span>NETIF_NAMESIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NETIF_NAMESIZE&#160;&#160;&#160;6</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The size of a fully constructed netif name which the netif can be identified by in APIs. Composed of 2 chars, 3 (max) digits, and 1 \0 </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="a71cad3277efe29191eef3348f4bf21f7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a71cad3277efe29191eef3348f4bf21f7">&#9670;&nbsp;</a></span>netif_igmp_mac_filter_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(* netif_igmp_mac_filter_fn) (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> *group, enum <a class="el" href="netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0">netif_mac_filter_action</a> action)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for netif igmp_mac_filter functions </p>
+
+</div>
+</div>
+<a id="a2b02a78a8769925ff8e4f83d34e5e1f5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2b02a78a8769925ff8e4f83d34e5e1f5">&#9670;&nbsp;</a></span>netif_init_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(* netif_init_fn) (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for netif init functions. Set up flags and output/linkoutput callback functions in this function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The netif to initialize </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab2302b1b64ac7b95f24c6bab754a575e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab2302b1b64ac7b95f24c6bab754a575e">&#9670;&nbsp;</a></span>netif_input_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(* netif_input_fn) (struct <a class="el" href="structpbuf.html">pbuf</a> *p, struct <a class="el" href="structnetif.html">netif</a> *inp)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for netif-&gt;input functions. This function is saved as 'input' callback function in the netif struct. Call it when a packet has been received.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>The received packet, copied into a pbuf </td></tr>
+    <tr><td class="paramname">inp</td><td>The netif which received the packet </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the packet was handled != ERR_OK is the packet was NOT handled, in this case, the caller has to free the pbuf </dd></dl>
+
+</div>
+</div>
+<a id="ab75e9d808bc1b788bea84213e6a111ed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab75e9d808bc1b788bea84213e6a111ed">&#9670;&nbsp;</a></span>netif_linkoutput_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(* netif_linkoutput_fn) (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> *p)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for netif-&gt;linkoutput functions. Only used for ethernet netifs. This function is called by ARP when a packet shall be sent.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The netif which shall send a packet </td></tr>
+    <tr><td class="paramname">p</td><td>The packet to send (raw ethernet packet) </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="af2ed0716122b65e7feb43e0dd99ae468"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af2ed0716122b65e7feb43e0dd99ae468">&#9670;&nbsp;</a></span>netif_mld_mac_filter_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(* netif_mld_mac_filter_fn) (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *group, enum <a class="el" href="netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0">netif_mac_filter_action</a> action)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for netif mld_mac_filter functions </p>
+
+</div>
+</div>
+<a id="a7b4893aa2ed8c606a0cd7aa932fe5067"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7b4893aa2ed8c606a0cd7aa932fe5067">&#9670;&nbsp;</a></span>netif_output_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(* netif_output_fn) (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> *p, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for netif-&gt;output functions. Called by lwIP when a packet shall be sent. For ethernet netif, set this to 'etharp_output' and set 'linkoutput'.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The netif which shall send a packet </td></tr>
+    <tr><td class="paramname">p</td><td>The packet to send (p-&gt;payload points to IP header) </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>The IP address to which the packet shall be sent </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a343a5b14136a51957d552527384674b3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a343a5b14136a51957d552527384674b3">&#9670;&nbsp;</a></span>netif_output_ip6_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(* netif_output_ip6_fn) (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> *p, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ipaddr)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for netif-&gt;output_ip6 functions. Called by lwIP when a packet shall be sent. For ethernet netif, set this to 'ethip6_output' and set 'linkoutput'.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The netif which shall send a packet </td></tr>
+    <tr><td class="paramname">p</td><td>The packet to send (p-&gt;payload points to IP header) </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>The IPv6 address to which the packet shall be sent </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a447d0a7e7c6e2396557c287b8b8c9436"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a447d0a7e7c6e2396557c287b8b8c9436">&#9670;&nbsp;</a></span>netif_status_callback_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* netif_status_callback_fn) (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for netif status- or link-callback functions. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="ab194ec4241fad8b6e9aac51e3ec23de0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab194ec4241fad8b6e9aac51e3ec23de0">&#9670;&nbsp;</a></span>netif_mac_filter_action</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0">netif_mac_filter_action</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MAC Filter Actions, these are passed to a netif's igmp_mac_filter or mld_mac_filter callback function. </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="ab194ec4241fad8b6e9aac51e3ec23de0a7ad3406353906deb4e64ebeed349e07e"></a>NETIF_DEL_MAC_FILTER&#160;</td><td class="fielddoc"><p>Delete a filter entry </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ab194ec4241fad8b6e9aac51e3ec23de0a4186fbaf94be956ea1a3b02cd1cccb1f"></a>NETIF_ADD_MAC_FILTER&#160;</td><td class="fielddoc"><p>Add a filter entry </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a0ec111195bcc452f77895ad35aedd7dc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0ec111195bcc452f77895ad35aedd7dc">&#9670;&nbsp;</a></span>netif_get_ip6_addr_match()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">s8_t netif_get_ip6_addr_match </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ip6addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Checks if a specific local address is present on the netif and returns its index. Depending on its state, it may or may not be assigned to the interface (as per RFC terminology).</p>
+<p>The given address may or may not be zoned (i.e., have a zone index other than IP6_NO_ZONE). If the address is zoned, it must have the correct zone for the given netif, or no match will be found.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the netif to check </td></tr>
+    <tr><td class="paramname">ip6addr</td><td>the IPv6 address to find </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>&gt;= 0: address found, this is its index -1: address not found on this netif </dd></dl>
+
+</div>
+</div>
+<a id="a75b5298b1c3c3794747d78a4ce95d81c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a75b5298b1c3c3794747d78a4ce95d81c">&#9670;&nbsp;</a></span>netif_invoke_ext_callback()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_invoke_ext_callback </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__netif.html#gab2b9387389513a02027c62e246723808">netif_nsc_reason_t</a>&#160;</td>
+          <td class="paramname"><em>reason</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="unionnetif__ext__callback__args__t.html">netif_ext_callback_args_t</a> *&#160;</td>
+          <td class="paramname"><em>args</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Invoke extended netif status event </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>netif that is affected by change </td></tr>
+    <tr><td class="paramname">reason</td><td>change reason </td></tr>
+    <tr><td class="paramname">args</td><td>depends on reason, see reason description </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a0fbaed78253d21e1b54e65651da3e327"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0fbaed78253d21e1b54e65651da3e327">&#9670;&nbsp;</a></span>netif_poll()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void netif_poll </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Call <a class="el" href="netif_8c.html#a0fbaed78253d21e1b54e65651da3e327">netif_poll()</a> in the main loop of your application. This is to prevent reentering non-reentrant functions like <a class="el" href="tcp__in_8c.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5">tcp_input()</a>. Packets passed to <a class="el" href="group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2">netif_loop_output()</a> are put on a list that is passed to netif-&gt;input() by <a class="el" href="netif_8c.html#a0fbaed78253d21e1b54e65651da3e327">netif_poll()</a>. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="a3d0925cbce550ed461907aee816713ba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3d0925cbce550ed461907aee816713ba">&#9670;&nbsp;</a></span>netif_default</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* netif_default</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The default network interface. </p>
+
+</div>
+</div>
+<a id="a1c8141eaa98f6dc6dfddbb23a706656c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1c8141eaa98f6dc6dfddbb23a706656c">&#9670;&nbsp;</a></span>netif_list</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* netif_list</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The list of network interfaces. </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="netif_8h.html">netif.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/netif_8h.js b/doc/doxygen/output/html/netif_8h.js
new file mode 100644
index 0000000..0c0775d
--- /dev/null
+++ b/doc/doxygen/output/html/netif_8h.js
@@ -0,0 +1,91 @@
+var netif_8h =
+[
+    [ "netif", "structnetif.html", "structnetif" ],
+    [ "link_changed_s", "structnetif__ext__callback__args__t_1_1link__changed__s.html", "structnetif__ext__callback__args__t_1_1link__changed__s" ],
+    [ "status_changed_s", "structnetif__ext__callback__args__t_1_1status__changed__s.html", "structnetif__ext__callback__args__t_1_1status__changed__s" ],
+    [ "ipv4_changed_s", "structnetif__ext__callback__args__t_1_1ipv4__changed__s.html", "structnetif__ext__callback__args__t_1_1ipv4__changed__s" ],
+    [ "ipv6_set_s", "structnetif__ext__callback__args__t_1_1ipv6__set__s.html", "structnetif__ext__callback__args__t_1_1ipv6__set__s" ],
+    [ "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_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 ],
+    [ "LWIP_NSC_IPV4_SETTINGS_CHANGED", "netif_8h.html#a4ff19a6f3045f65d0397d30b6609660a", null ],
+    [ "LWIP_NSC_IPV6_ADDR_STATE_CHANGED", "netif_8h.html#a0d70fe11cac43c8fa35827b8e607ccf6", null ],
+    [ "LWIP_NSC_IPV6_SET", "netif_8h.html#a8fb4317a77ee2e3848be80db15618666", null ],
+    [ "LWIP_NSC_LINK_CHANGED", "netif_8h.html#a5ad7308195c0581680dd62fb148501cd", null ],
+    [ "LWIP_NSC_NETIF_ADDED", "netif_8h.html#adbfecb47897cfe63d4f6366c1fed23b2", null ],
+    [ "LWIP_NSC_NETIF_REMOVED", "netif_8h.html#ae8e2dc87c19a03d481ae37bcf7ced5c9", null ],
+    [ "LWIP_NSC_STATUS_CHANGED", "netif_8h.html#a6f406ee3ab60e8a4f27ae2483c96b8e2", null ],
+    [ "NETIF_FLAG_BROADCAST", "group__netif__flags.html#gaef64fe15c82bc7b235366923e517104e", null ],
+    [ "NETIF_FLAG_ETHARP", "group__netif__flags.html#ga92448dc510bc8d700c09e5c971ef0676", null ],
+    [ "NETIF_FLAG_ETHERNET", "group__netif__flags.html#ga76ad9d0cf9f029df0ab2a998c64040dc", null ],
+    [ "NETIF_FLAG_IGMP", "group__netif__flags.html#gac9493b923d733c73f6006d9714826558", null ],
+    [ "NETIF_FLAG_LINK_UP", "group__netif__flags.html#ga75f5a2b9276c93e3bd18a568459fd2d8", null ],
+    [ "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_hostname", "group__netif.html#ga5a378ba73e60cd1e5235474f0db22978", null ],
+    [ "netif_ip4_addr", "group__netif__ip4.html#gac9b6e63b5dd2968fe0a4813f3eefb55d", null ],
+    [ "netif_ip4_gw", "group__netif__ip4.html#ga86d69faf416765b7f8faf60a43cc50da", null ],
+    [ "netif_ip4_netmask", "group__netif__ip4.html#ga952d1436f2428b92fc8197bcf2f8fca3", null ],
+    [ "netif_ip6_addr", "group__netif__ip6.html#ga7ec0623f1a858a0cdb187beaa89df365", null ],
+    [ "netif_ip_addr4", "group__netif__ip4.html#ga54179a2f3b7cc35b23ee8d692d8d8022", null ],
+    [ "netif_ip_addr6", "group__netif__ip6.html#gae424e336fe9f013b30d4065fd35c91ee", null ],
+    [ "netif_ip_gw4", "group__netif__ip4.html#ga7ea95478e000701423b7f6316e575a2a", null ],
+    [ "netif_ip_netmask4", "group__netif__ip4.html#ga58518602f388d2640985a01a312f0a51", 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_hostname", "group__netif.html#ga5e5d2c6fa5566a24dd848f3a2c7c957f", 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 ],
+    [ "netif_input_fn", "netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e", null ],
+    [ "netif_linkoutput_fn", "netif_8h.html#ab75e9d808bc1b788bea84213e6a111ed", null ],
+    [ "netif_mld_mac_filter_fn", "netif_8h.html#af2ed0716122b65e7feb43e0dd99ae468", null ],
+    [ "netif_nsc_reason_t", "group__netif.html#gab2b9387389513a02027c62e246723808", null ],
+    [ "netif_output_fn", "netif_8h.html#a7b4893aa2ed8c606a0cd7aa932fe5067", null ],
+    [ "netif_output_ip6_fn", "netif_8h.html#a343a5b14136a51957d552527384674b3", null ],
+    [ "netif_status_callback_fn", "netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436", null ],
+    [ "netif_mac_filter_action", "netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0", [
+      [ "NETIF_DEL_MAC_FILTER", "netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a7ad3406353906deb4e64ebeed349e07e", null ],
+      [ "NETIF_ADD_MAC_FILTER", "netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a4186fbaf94be956ea1a3b02cd1cccb1f", null ]
+    ] ],
+    [ "netif_add", "group__netif.html#gade5498543e74067f28cc6bef0209e3be", null ],
+    [ "netif_add_ext_callback", "group__netif.html#ga3efc2b72f75936d50708247420c9d1d9", null ],
+    [ "netif_add_ip6_address", "group__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327", null ],
+    [ "netif_add_noaddr", "group__netif.html#gac20150ac754ff1f88afeaa33be3552a4", null ],
+    [ "netif_alloc_client_data_id", "group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978", null ],
+    [ "netif_create_ip6_linklocal_address", "group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9", null ],
+    [ "netif_find", "group__netif.html#ga69c93a139e8a1f6ef4e3d076a2897def", null ],
+    [ "netif_get_by_index", "group__netif.html#gae4df885347c800a5486d3bf25981300e", null ],
+    [ "netif_get_ip6_addr_match", "netif_8h.html#a0ec111195bcc452f77895ad35aedd7dc", null ],
+    [ "netif_index_to_name", "group__netif.html#ga3ff104d083914e87a7805a0b90a85755", null ],
+    [ "netif_input", "group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385", null ],
+    [ "netif_invoke_ext_callback", "netif_8h.html#a75b5298b1c3c3794747d78a4ce95d81c", null ],
+    [ "netif_ip6_addr_set", "group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb", null ],
+    [ "netif_ip6_addr_set_state", "group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f", null ],
+    [ "netif_loop_output", "group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2", null ],
+    [ "netif_name_to_index", "group__netif.html#gac763a1f647fb9e8af4254418e813a6ae", null ],
+    [ "netif_poll", "netif_8h.html#a0fbaed78253d21e1b54e65651da3e327", null ],
+    [ "netif_remove", "group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979", null ],
+    [ "netif_remove_ext_callback", "group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716", null ],
+    [ "netif_set_addr", "group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1", null ],
+    [ "netif_set_default", "group__netif.html#gac90f290edd005238d62aa94c4ac9dea3", null ],
+    [ "netif_set_down", "group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf", null ],
+    [ "netif_set_gw", "group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520", null ],
+    [ "netif_set_ipaddr", "group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca", null ],
+    [ "netif_set_link_callback", "group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4", null ],
+    [ "netif_set_link_down", "group__netif.html#ga34e37a1e8e358760dc1c43887922c7db", null ],
+    [ "netif_set_link_up", "group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea", null ],
+    [ "netif_set_netmask", "group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53", null ],
+    [ "netif_set_remove_callback", "group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce", null ],
+    [ "netif_set_status_callback", "group__netif.html#gadc8787b23ac0ee023979cbadf87813d4", null ],
+    [ "netif_set_up", "group__netif.html#gaf19693be401a265a52d2a56c65753121", null ],
+    [ "netif_default", "netif_8h.html#a3d0925cbce550ed461907aee816713ba", null ],
+    [ "netif_list", "netif_8h.html#a1c8141eaa98f6dc6dfddbb23a706656c", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/netifapi_8c.html b/doc/doxygen/output/html/netifapi_8c.html
new file mode 100644
index 0000000..27e6675
--- /dev/null
+++ b/doc/doxygen/output/html/netifapi_8c.html
@@ -0,0 +1,246 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/api/netifapi.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('netifapi_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">netifapi.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 &quot;<a class="el" href="lwip_2etharp_8h.html">lwip/etharp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="netifapi_8h.html">lwip/netifapi.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="tcpip__priv_8h.html">lwip/priv/tcpip_priv.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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="netifapi_8c.html#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"><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="netifapi_8c.html#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: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"><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>
+<tr class="separator:ga31755ea6dbb213236bfce19bcbe8c973"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a26fd83042b53b2ff82e15262ed72f0a7"><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="netifapi_8c.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, netifapi_void_fn voidfunc, netifapi_errt_fn errtfunc)</td></tr>
+<tr class="separator:a26fd83042b53b2ff82e15262ed72f0a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad4a821182d01eafa4ca258f958fcb089"><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#gad4a821182d01eafa4ca258f958fcb089">netifapi_netif_name_to_index</a> (const char *name, u8_t *idx)</td></tr>
+<tr class="separator:gad4a821182d01eafa4ca258f958fcb089"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab7914d77d0a89fd6c31048feb0bdafb6"><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#gab7914d77d0a89fd6c31048feb0bdafb6">netifapi_netif_index_to_name</a> (u8_t idx, char *name)</td></tr>
+<tr class="separator:gab7914d77d0a89fd6c31048feb0bdafb6"><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>Network Interface Sequential API module </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a62b0bdbb3783eb27aa73485081306119"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62b0bdbb3783eb27aa73485081306119">&#9670;&nbsp;</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> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structeth__addr.html">eth_addr</a> *&#160;</td>
+          <td class="paramname"><em>ethaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum netifapi_arp_entry&#160;</td>
+          <td class="paramname"><em>type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a037c3d05c19b4d467b6ce06eb4639ee8">&#9670;&nbsp;</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> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum netifapi_arp_entry&#160;</td>
+          <td class="paramname"><em>type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a26fd83042b53b2ff82e15262ed72f0a7">&#9670;&nbsp;</a></span>netifapi_netif_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> netifapi_netif_common </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">netifapi_void_fn&#160;</td>
+          <td class="paramname"><em>voidfunc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">netifapi_errt_fn&#160;</td>
+          <td class="paramname"><em>errtfunc</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>call the "errtfunc" (or the "voidfunc" if "errtfunc" is NULL) in a thread-safe way by running that function inside the tcpip_thread context.</p>
+<dl class="section note"><dt>Note</dt><dd>use only for functions where there is only "netif" parameter. </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_da61e3e9a357748887e3ca8d7c5a0c16.html">api</a></li><li class="navelem"><a class="el" href="netifapi_8c.html">netifapi.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/netifapi_8c.js b/doc/doxygen/output/html/netifapi_8c.js
new file mode 100644
index 0000000..ebbdb59
--- /dev/null
+++ b/doc/doxygen/output/html/netifapi_8c.js
@@ -0,0 +1,10 @@
+var netifapi_8c =
+[
+    [ "netifapi_arp_add", "netifapi_8c.html#a62b0bdbb3783eb27aa73485081306119", null ],
+    [ "netifapi_arp_remove", "netifapi_8c.html#a037c3d05c19b4d467b6ce06eb4639ee8", 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 ],
+    [ "netifapi_netif_name_to_index", "group__netifapi__netif.html#gad4a821182d01eafa4ca258f958fcb089", null ],
+    [ "netifapi_netif_set_addr", "group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/netifapi_8h.html b/doc/doxygen/output/html/netifapi_8h.html
new file mode 100644
index 0000000..cbeadc4
--- /dev/null
+++ b/doc/doxygen/output/html/netifapi_8h.html
@@ -0,0 +1,280 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/netifapi.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('netifapi_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">netifapi.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="sys_8h.html">lwip/sys.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="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="tcpip__priv_8h.html">lwip/priv/tcpip_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="api__msg_8h.html">lwip/priv/api_msg.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="lwip_2prot_2ethernet_8h.html">lwip/prot/ethernet.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga0e3f522b900a0ba04421c4587e790373"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__netif.html#ga0e3f522b900a0ba04421c4587e790373">netifapi_netif_remove</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979">netif_remove</a>, NULL)</td></tr>
+<tr class="separator:ga0e3f522b900a0ba04421c4587e790373"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6ce735fe79efe1739e53b7f0e975ac76"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__netif.html#ga6ce735fe79efe1739e53b7f0e975ac76">netifapi_netif_set_up</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up</a>, NULL)</td></tr>
+<tr class="separator:ga6ce735fe79efe1739e53b7f0e975ac76"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga22c02edde32743ccfd41924da0601a16"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__netif.html#ga22c02edde32743ccfd41924da0601a16">netifapi_netif_set_down</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf">netif_set_down</a>, NULL)</td></tr>
+<tr class="separator:ga22c02edde32743ccfd41924da0601a16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga862d6cfa5d36b2c36d7b1671e8d95ccf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__netif.html#ga862d6cfa5d36b2c36d7b1671e8d95ccf">netifapi_netif_set_default</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif_set_default</a>, NULL)</td></tr>
+<tr class="separator:ga862d6cfa5d36b2c36d7b1671e8d95ccf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac054a60a32447019913d34da63924853"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__netif.html#gac054a60a32447019913d34da63924853">netifapi_netif_set_link_up</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_link_up</a>, NULL)</td></tr>
+<tr class="separator:gac054a60a32447019913d34da63924853"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2a9694804743f5466c4ecc400b7f07e4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__netif.html#ga2a9694804743f5466c4ecc400b7f07e4">netifapi_netif_set_link_down</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__netif.html#ga34e37a1e8e358760dc1c43887922c7db">netif_set_link_down</a>, NULL)</td></tr>
+<tr class="separator:ga2a9694804743f5466c4ecc400b7f07e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae64d13afc6e3b0f21aae04b66d0e3765"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__dhcp4.html#gae64d13afc6e3b0f21aae04b66d0e3765">netifapi_dhcp_start</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="el" href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp_start</a>)</td></tr>
+<tr class="separator:gae64d13afc6e3b0f21aae04b66d0e3765"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2322c0d0e3eb6c1097d6f3942905dbd5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__dhcp4.html#ga2322c0d0e3eb6c1097d6f3942905dbd5">netifapi_dhcp_stop</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312">dhcp_stop</a>, NULL)</td></tr>
+<tr class="separator:ga2322c0d0e3eb6c1097d6f3942905dbd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga29108975e9aa6463b9a574de961317e0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__dhcp4.html#ga29108975e9aa6463b9a574de961317e0">netifapi_dhcp_inform</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad">dhcp_inform</a>, NULL)</td></tr>
+<tr class="separator:ga29108975e9aa6463b9a574de961317e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga642390e5efa53ad3095e01331c6a936b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__dhcp4.html#ga642390e5efa53ad3095e01331c6a936b">netifapi_dhcp_renew</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="el" href="group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947">dhcp_renew</a>)</td></tr>
+<tr class="separator:ga642390e5efa53ad3095e01331c6a936b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5aeaee24c11128df90a56fe091c9d409"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__dhcp4.html#ga5aeaee24c11128df90a56fe091c9d409">netifapi_dhcp_release</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="el" href="group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4">dhcp_release</a>)</td></tr>
+<tr class="separator:ga5aeaee24c11128df90a56fe091c9d409"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1971af04f882f5afdb3ade454a680134"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134">netifapi_dhcp_release_and_stop</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="el" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp_release_and_stop</a>, NULL)</td></tr>
+<tr class="separator:ga1971af04f882f5afdb3ade454a680134"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaca26bae2a21e0732a7599df14f880af2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__autoip.html#gaca26bae2a21e0732a7599df14f880af2">netifapi_autoip_start</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="el" href="group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8">autoip_start</a>)</td></tr>
+<tr class="separator:gaca26bae2a21e0732a7599df14f880af2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae604f96907a52557e4ebd1bd5d80071d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__autoip.html#gae604f96907a52557e4ebd1bd5d80071d">netifapi_autoip_stop</a>(n)&#160;&#160;&#160;<a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="el" href="group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4">autoip_stop</a>)</td></tr>
+<tr class="separator:gae604f96907a52557e4ebd1bd5d80071d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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="netifapi_8h.html#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"><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="netifapi_8h.html#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: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"><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>
+<tr class="separator:ga31755ea6dbb213236bfce19bcbe8c973"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a26fd83042b53b2ff82e15262ed72f0a7"><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="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, netifapi_void_fn voidfunc, netifapi_errt_fn errtfunc)</td></tr>
+<tr class="separator:a26fd83042b53b2ff82e15262ed72f0a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad4a821182d01eafa4ca258f958fcb089"><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#gad4a821182d01eafa4ca258f958fcb089">netifapi_netif_name_to_index</a> (const char *name, u8_t *idx)</td></tr>
+<tr class="separator:gad4a821182d01eafa4ca258f958fcb089"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab7914d77d0a89fd6c31048feb0bdafb6"><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#gab7914d77d0a89fd6c31048feb0bdafb6">netifapi_netif_index_to_name</a> (u8_t idx, char *name)</td></tr>
+<tr class="separator:gab7914d77d0a89fd6c31048feb0bdafb6"><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>netif API (to be used from non-TCPIP threads) </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a62b0bdbb3783eb27aa73485081306119"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62b0bdbb3783eb27aa73485081306119">&#9670;&nbsp;</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> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structeth__addr.html">eth_addr</a> *&#160;</td>
+          <td class="paramname"><em>ethaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum netifapi_arp_entry&#160;</td>
+          <td class="paramname"><em>type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a037c3d05c19b4d467b6ce06eb4639ee8">&#9670;&nbsp;</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> *&#160;</td>
+          <td class="paramname"><em>ipaddr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum netifapi_arp_entry&#160;</td>
+          <td class="paramname"><em>type</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a26fd83042b53b2ff82e15262ed72f0a7">&#9670;&nbsp;</a></span>netifapi_netif_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> netifapi_netif_common </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">netifapi_void_fn&#160;</td>
+          <td class="paramname"><em>voidfunc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">netifapi_errt_fn&#160;</td>
+          <td class="paramname"><em>errtfunc</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>call the "errtfunc" (or the "voidfunc" if "errtfunc" is NULL) in a thread-safe way by running that function inside the tcpip_thread context.</p>
+<dl class="section note"><dt>Note</dt><dd>use only for functions where there is only "netif" parameter. </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="netifapi_8h.html">netifapi.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/netifapi_8h.js b/doc/doxygen/output/html/netifapi_8h.js
new file mode 100644
index 0000000..20af8ed
--- /dev/null
+++ b/doc/doxygen/output/html/netifapi_8h.js
@@ -0,0 +1,24 @@
+var netifapi_8h =
+[
+    [ "netifapi_autoip_start", "group__netifapi__autoip.html#gaca26bae2a21e0732a7599df14f880af2", null ],
+    [ "netifapi_autoip_stop", "group__netifapi__autoip.html#gae604f96907a52557e4ebd1bd5d80071d", null ],
+    [ "netifapi_dhcp_inform", "group__netifapi__dhcp4.html#ga29108975e9aa6463b9a574de961317e0", null ],
+    [ "netifapi_dhcp_release", "group__netifapi__dhcp4.html#ga5aeaee24c11128df90a56fe091c9d409", null ],
+    [ "netifapi_dhcp_release_and_stop", "group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134", null ],
+    [ "netifapi_dhcp_renew", "group__netifapi__dhcp4.html#ga642390e5efa53ad3095e01331c6a936b", null ],
+    [ "netifapi_dhcp_start", "group__netifapi__dhcp4.html#gae64d13afc6e3b0f21aae04b66d0e3765", null ],
+    [ "netifapi_dhcp_stop", "group__netifapi__dhcp4.html#ga2322c0d0e3eb6c1097d6f3942905dbd5", null ],
+    [ "netifapi_netif_remove", "group__netifapi__netif.html#ga0e3f522b900a0ba04421c4587e790373", null ],
+    [ "netifapi_netif_set_default", "group__netifapi__netif.html#ga862d6cfa5d36b2c36d7b1671e8d95ccf", null ],
+    [ "netifapi_netif_set_down", "group__netifapi__netif.html#ga22c02edde32743ccfd41924da0601a16", null ],
+    [ "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_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 ],
+    [ "netifapi_netif_name_to_index", "group__netifapi__netif.html#gad4a821182d01eafa4ca258f958fcb089", null ],
+    [ "netifapi_netif_set_addr", "group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/opt_8h.html b/doc/doxygen/output/html/opt_8h.html
new file mode 100644
index 0000000..84b19f6
--- /dev/null
+++ b/doc/doxygen/output/html/opt_8h.html
@@ -0,0 +1,736 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/opt.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('opt_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">opt.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;lwipopts.h&quot;</code><br />
+<code>#include &quot;<a class="el" href="debug_8h.html">lwip/debug.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gae00ba99de94a5bf84d832be8976df59b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b">NO_SYS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gae00ba99de94a5bf84d832be8976df59b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga25a41610055f91cbd0960256240b8f2c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__timers.html#ga25a41610055f91cbd0960256240b8f2c">LWIP_TIMERS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga25a41610055f91cbd0960256240b8f2c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaff0ea56f3e3d8e86c49b50557bc13815"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__timers.html#gaff0ea56f3e3d8e86c49b50557bc13815">LWIP_TIMERS_CUSTOM</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaff0ea56f3e3d8e86c49b50557bc13815"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa1dd57a66b6de8c0593e9e3e8d1411f6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memcpy.html#gaa1dd57a66b6de8c0593e9e3e8d1411f6">MEMCPY</a>(dst,  src,  len)&#160;&#160;&#160;memcpy(dst,src,len)</td></tr>
+<tr class="separator:gaa1dd57a66b6de8c0593e9e3e8d1411f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8c6e3c1e4f74acb16376188dbf8909ec"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec">SMEMCPY</a>(dst,  src,  len)&#160;&#160;&#160;memcpy(dst,src,len)</td></tr>
+<tr class="separator:ga8c6e3c1e4f74acb16376188dbf8909ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0e00bb235da5557fcbc049f732503863"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memcpy.html#ga0e00bb235da5557fcbc049f732503863">MEMMOVE</a>(dst,  src,  len)&#160;&#160;&#160;memmove(dst,src,len)</td></tr>
+<tr class="separator:ga0e00bb235da5557fcbc049f732503863"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae9afcefa5d233372abb9413188dd98c9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__lock.html#gae9afcefa5d233372abb9413188dd98c9">LWIP_MPU_COMPATIBLE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gae9afcefa5d233372abb9413188dd98c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8e46232794349c209e8ed4e9e7e4f011"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011">LWIP_TCPIP_CORE_LOCKING</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga8e46232794349c209e8ed4e9e7e4f011"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga351beb1c06affe49e717bc9f76c66acf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__lock.html#ga351beb1c06affe49e717bc9f76c66acf">LWIP_TCPIP_CORE_LOCKING_INPUT</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga351beb1c06affe49e717bc9f76c66acf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae85efb3a5fcf8585c94b3c2669978959"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__lock.html#gae85efb3a5fcf8585c94b3c2669978959">SYS_LIGHTWEIGHT_PROT</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gae85efb3a5fcf8585c94b3c2669978959"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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"><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"><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>
+<tr class="separator:gae93af697d27bbcefa6a28052d90f2f38"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa2f25586972d1cbc1ff0dcdc6f15a1b0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#gaa2f25586972d1cbc1ff0dcdc6f15a1b0">MEMP_MEM_INIT</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaa2f25586972d1cbc1ff0dcdc6f15a1b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga97343214666ee6dcb18c0bd77b441ea7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga97343214666ee6dcb18c0bd77b441ea7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2dcf8c45f945dd0c4301a94700f2112c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#ga2dcf8c45f945dd0c4301a94700f2112c">MEM_SIZE</a>&#160;&#160;&#160;1600</td></tr>
+<tr class="separator:ga2dcf8c45f945dd0c4301a94700f2112c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga27fdd01194a42fc41a7716b72cdb49e3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#ga27fdd01194a42fc41a7716b72cdb49e3">MEMP_OVERFLOW_CHECK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga27fdd01194a42fc41a7716b72cdb49e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0838947193e222a9f46b582e01e5beff"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#ga0838947193e222a9f46b582e01e5beff">MEMP_SANITY_CHECK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga0838947193e222a9f46b582e01e5beff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae331a198bd06100b90ea020cd5f07f4e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#gae331a198bd06100b90ea020cd5f07f4e">MEM_OVERFLOW_CHECK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gae331a198bd06100b90ea020cd5f07f4e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga90b17afabb93986a162c327ed30bb4d3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#ga90b17afabb93986a162c327ed30bb4d3">MEM_SANITY_CHECK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga90b17afabb93986a162c327ed30bb4d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaddca3141bc7037241769eb152b6f89ba"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#gaddca3141bc7037241769eb152b6f89ba">MEM_USE_POOLS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaddca3141bc7037241769eb152b6f89ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaba8be68e8fd0716b723ce4569ed89f82"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#gaba8be68e8fd0716b723ce4569ed89f82">MEM_USE_POOLS_TRY_BIGGER_POOL</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaba8be68e8fd0716b723ce4569ed89f82"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga69de593b8ffd4f1c249f03e48e11983b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#ga69de593b8ffd4f1c249f03e48e11983b">MEMP_USE_CUSTOM_POOLS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga69de593b8ffd4f1c249f03e48e11983b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0a3ef6098813c103e5aba07da76e15e2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#ga0a3ef6098813c103e5aba07da76e15e2">LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga0a3ef6098813c103e5aba07da76e15e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga92b30aed958ec59334d936d4ca725418"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga92b30aed958ec59334d936d4ca725418">MEMP_NUM_PBUF</a>&#160;&#160;&#160;16</td></tr>
+<tr class="separator:ga92b30aed958ec59334d936d4ca725418"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga379bf92ed322cda54cb701337421e0d3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga379bf92ed322cda54cb701337421e0d3">MEMP_NUM_RAW_PCB</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:ga379bf92ed322cda54cb701337421e0d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2c416da481ab09bd1ba257b75a0707eb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga2c416da481ab09bd1ba257b75a0707eb">MEMP_NUM_UDP_PCB</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:ga2c416da481ab09bd1ba257b75a0707eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga73beecc19cfbc3114768f9b32b2cd70e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga73beecc19cfbc3114768f9b32b2cd70e">MEMP_NUM_TCP_PCB</a>&#160;&#160;&#160;5</td></tr>
+<tr class="separator:ga73beecc19cfbc3114768f9b32b2cd70e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga04fba6a249123513271dccb4ec26aa5a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga04fba6a249123513271dccb4ec26aa5a">MEMP_NUM_TCP_PCB_LISTEN</a>&#160;&#160;&#160;8</td></tr>
+<tr class="separator:ga04fba6a249123513271dccb4ec26aa5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa35fb3a1a76661e3ffb9722a57092de3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#gaa35fb3a1a76661e3ffb9722a57092de3">MEMP_NUM_TCP_SEG</a>&#160;&#160;&#160;16</td></tr>
+<tr class="separator:gaa35fb3a1a76661e3ffb9722a57092de3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga24f6737ee990990b81b0d16ef6e0dffd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga24f6737ee990990b81b0d16ef6e0dffd">MEMP_NUM_ALTCP_PCB</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memp.html#ga73beecc19cfbc3114768f9b32b2cd70e">MEMP_NUM_TCP_PCB</a></td></tr>
+<tr class="separator:ga24f6737ee990990b81b0d16ef6e0dffd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga169436c5860253b90e25bdba9fdcac86"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga169436c5860253b90e25bdba9fdcac86">MEMP_NUM_REASSDATA</a>&#160;&#160;&#160;5</td></tr>
+<tr class="separator:ga169436c5860253b90e25bdba9fdcac86"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1f66051a654dcd7a4e19bc6aff240630"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga1f66051a654dcd7a4e19bc6aff240630">MEMP_NUM_FRAG_PBUF</a>&#160;&#160;&#160;15</td></tr>
+<tr class="separator:ga1f66051a654dcd7a4e19bc6aff240630"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga087b00ea20a7edebcad33a1a1353a5d7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga087b00ea20a7edebcad33a1a1353a5d7">MEMP_NUM_ARP_QUEUE</a>&#160;&#160;&#160;30</td></tr>
+<tr class="separator:ga087b00ea20a7edebcad33a1a1353a5d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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="separator:ga87a05debb46ff82093d0e6dc1aad8804"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="memitem:ga5d99df65869ac101ed6a611fc85016be"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga5d99df65869ac101ed6a611fc85016be">MEMP_NUM_NETBUF</a>&#160;&#160;&#160;2</td></tr>
+<tr class="separator:ga5d99df65869ac101ed6a611fc85016be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacb40bd726b7e15593b20a628d298f456"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#gacb40bd726b7e15593b20a628d298f456">MEMP_NUM_NETCONN</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:gacb40bd726b7e15593b20a628d298f456"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8e136f5811e6652c6c5d2fcf596f0893"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga8e136f5811e6652c6c5d2fcf596f0893">MEMP_NUM_SELECT_CB</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:ga8e136f5811e6652c6c5d2fcf596f0893"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafbbfd6ce8536038cd00fa85bebae987c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c">MEMP_NUM_TCPIP_MSG_API</a>&#160;&#160;&#160;8</td></tr>
+<tr class="separator:gafbbfd6ce8536038cd00fa85bebae987c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab089a7088439e726c3801ba9e249d831"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#gab089a7088439e726c3801ba9e249d831">MEMP_NUM_TCPIP_MSG_INPKT</a>&#160;&#160;&#160;8</td></tr>
+<tr class="separator:gab089a7088439e726c3801ba9e249d831"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga293bc22b60bf3f8e2520f60a88370e7a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga293bc22b60bf3f8e2520f60a88370e7a">MEMP_NUM_NETDB</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga293bc22b60bf3f8e2520f60a88370e7a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa9b0f949da12cbe8fe5f7aefc30290e0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#gaa9b0f949da12cbe8fe5f7aefc30290e0">MEMP_NUM_LOCALHOSTLIST</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gaa9b0f949da12cbe8fe5f7aefc30290e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga50eaadc4cad0716410332691e382c38a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga50eaadc4cad0716410332691e382c38a">PBUF_POOL_SIZE</a>&#160;&#160;&#160;16</td></tr>
+<tr class="separator:ga50eaadc4cad0716410332691e382c38a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5a95abf3610c56e7c23cb035eb9c3444"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga5a95abf3610c56e7c23cb035eb9c3444">MEMP_NUM_API_MSG</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c">MEMP_NUM_TCPIP_MSG_API</a></td></tr>
+<tr class="separator:ga5a95abf3610c56e7c23cb035eb9c3444"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3b1f228c598529c62895ad04ff294980"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga3b1f228c598529c62895ad04ff294980">MEMP_NUM_DNS_API_MSG</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c">MEMP_NUM_TCPIP_MSG_API</a></td></tr>
+<tr class="separator:ga3b1f228c598529c62895ad04ff294980"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacf9782dd26bf8a655044dc041a9de948"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#gacf9782dd26bf8a655044dc041a9de948">MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c">MEMP_NUM_TCPIP_MSG_API</a></td></tr>
+<tr class="separator:gacf9782dd26bf8a655044dc041a9de948"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadd5a973b98068ce9318ea2f96b5fa14c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#gadd5a973b98068ce9318ea2f96b5fa14c">MEMP_NUM_NETIFAPI_MSG</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c">MEMP_NUM_TCPIP_MSG_API</a></td></tr>
+<tr class="separator:gadd5a973b98068ce9318ea2f96b5fa14c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9609a014bba4638cc191d6a8f9556c87"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">LWIP_ARP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga9609a014bba4638cc191d6a8f9556c87"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga924936a814564dbdb0bc950d255a83b9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga924936a814564dbdb0bc950d255a83b9">ARP_TABLE_SIZE</a>&#160;&#160;&#160;10</td></tr>
+<tr class="separator:ga924936a814564dbdb0bc950d255a83b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga741a0710dc126ed3ae9e305472df3432"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga741a0710dc126ed3ae9e305472df3432">ARP_MAXAGE</a>&#160;&#160;&#160;300</td></tr>
+<tr class="separator:ga741a0710dc126ed3ae9e305472df3432"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga75837814536af29b6102508588d0ab58"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga75837814536af29b6102508588d0ab58">ARP_QUEUEING</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga75837814536af29b6102508588d0ab58"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga29f41a6ebdbb23f46688d381b3609fd1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga29f41a6ebdbb23f46688d381b3609fd1">ARP_QUEUE_LEN</a>&#160;&#160;&#160;3</td></tr>
+<tr class="separator:ga29f41a6ebdbb23f46688d381b3609fd1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga70ce0ecf56cf5fab000134e66d863f90"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga70ce0ecf56cf5fab000134e66d863f90">ETHARP_SUPPORT_VLAN</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga70ce0ecf56cf5fab000134e66d863f90"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga30e02dc217cc2995d0fd241d510c904f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga30e02dc217cc2995d0fd241d510c904f">LWIP_ETHERNET</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">LWIP_ARP</a></td></tr>
+<tr class="separator:ga30e02dc217cc2995d0fd241d510c904f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad7fa3b356ca7e603e848b069c4cc6276"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#gad7fa3b356ca7e603e848b069c4cc6276">ETH_PAD_SIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gad7fa3b356ca7e603e848b069c4cc6276"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4675829464156f3d665f4de171c212d7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga4675829464156f3d665f4de171c212d7">ETHARP_SUPPORT_STATIC_ENTRIES</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga4675829464156f3d665f4de171c212d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2f762eee309a545650f80fc8dcc19084"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__arp.html#ga2f762eee309a545650f80fc8dcc19084">ETHARP_TABLE_MATCH_NETIF</a>&#160;&#160;&#160;!<a class="el" href="group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be">LWIP_SINGLE_NETIF</a></td></tr>
+<tr class="separator:ga2f762eee309a545650f80fc8dcc19084"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga429e811a80ebb5157e14a854870c4410"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#ga429e811a80ebb5157e14a854870c4410">LWIP_IPV4</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga429e811a80ebb5157e14a854870c4410"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga881d32ff5ee02af01f758953f1b51d59"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#ga881d32ff5ee02af01f758953f1b51d59">IP_FORWARD</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga881d32ff5ee02af01f758953f1b51d59"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1a31ab0e0f37b17d40fa7c35bc2c4f69"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69">IP_REASSEMBLY</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga1a31ab0e0f37b17d40fa7c35bc2c4f69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf85c8bdd5035b6cada790b4cc2a209a4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4">IP_FRAG</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gaf85c8bdd5035b6cada790b4cc2a209a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa956b0167c37a2265b55e2d0204a3933"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#gaa956b0167c37a2265b55e2d0204a3933">IP_OPTIONS_ALLOWED</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gaa956b0167c37a2265b55e2d0204a3933"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad41122bd0b5485a18a4415c8f953727b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#gad41122bd0b5485a18a4415c8f953727b">IP_REASS_MAXAGE</a>&#160;&#160;&#160;15</td></tr>
+<tr class="separator:gad41122bd0b5485a18a4415c8f953727b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga29084a46d7d4be30e8029d356bca0394"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#ga29084a46d7d4be30e8029d356bca0394">IP_REASS_MAX_PBUFS</a>&#160;&#160;&#160;10</td></tr>
+<tr class="separator:ga29084a46d7d4be30e8029d356bca0394"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga556b9b58fd02c0fdd126791baef77411"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411">IP_DEFAULT_TTL</a>&#160;&#160;&#160;255</td></tr>
+<tr class="separator:ga556b9b58fd02c0fdd126791baef77411"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0b2c993fd940f5774108298933310384"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#ga0b2c993fd940f5774108298933310384">IP_SOF_BROADCAST</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga0b2c993fd940f5774108298933310384"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0f1fbf42d3344bf87cd056d48ddca3db"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#ga0f1fbf42d3344bf87cd056d48ddca3db">IP_SOF_BROADCAST_RECV</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga0f1fbf42d3344bf87cd056d48ddca3db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9e761df07c4e93901858741d4771dbc7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv4.html#ga9e761df07c4e93901858741d4771dbc7">IP_FORWARD_ALLOW_TX_ON_RX_NETIF</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga9e761df07c4e93901858741d4771dbc7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae4d45345c3ab8e5a355fda1d8d24fca6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__icmp.html#gae4d45345c3ab8e5a355fda1d8d24fca6">LWIP_ICMP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gae4d45345c3ab8e5a355fda1d8d24fca6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae1533f2bc39a5843989909555f6ce0cf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__icmp.html#gae1533f2bc39a5843989909555f6ce0cf">ICMP_TTL</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411">IP_DEFAULT_TTL</a></td></tr>
+<tr class="separator:gae1533f2bc39a5843989909555f6ce0cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8088cb56d1a84fe554b11bc15d84b2b9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__icmp.html#ga8088cb56d1a84fe554b11bc15d84b2b9">LWIP_BROADCAST_PING</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga8088cb56d1a84fe554b11bc15d84b2b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf77baf0a83b04312eab4c006ef229661"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__icmp.html#gaf77baf0a83b04312eab4c006ef229661">LWIP_MULTICAST_PING</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaf77baf0a83b04312eab4c006ef229661"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaca452be5cb05d9666f8f57e582c39221"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__raw.html#gaca452be5cb05d9666f8f57e582c39221">LWIP_RAW</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaca452be5cb05d9666f8f57e582c39221"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga36e3ffa66073ca0d27d11c422778249c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__raw.html#ga36e3ffa66073ca0d27d11c422778249c">RAW_TTL</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411">IP_DEFAULT_TTL</a></td></tr>
+<tr class="separator:ga36e3ffa66073ca0d27d11c422778249c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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: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"><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>
+<tr class="separator:ga2cc18315edcd5ffc083d1256f7d22a83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9d014e3f7dc9e1e7c7decd8652ba65e2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2">LWIP_DHCP_MAX_NTP_SERVERS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga9d014e3f7dc9e1e7c7decd8652ba65e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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"><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"><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: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"><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>
+<tr class="separator:gab8d7d53247cc62caa76f54b2c5a5df30"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadaf25915ae1fd69c0943ef68cbb38923"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923">LWIP_IGMP</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gadaf25915ae1fd69c0943ef68cbb38923"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga98710dd81446b7cb2daac736bae6f646"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646">LWIP_DNS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga98710dd81446b7cb2daac736bae6f646"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2384e76c1acdf969d883f3de08d340f7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#ga2384e76c1acdf969d883f3de08d340f7">DNS_TABLE_SIZE</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:ga2384e76c1acdf969d883f3de08d340f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3b01c79902063c170ef57deb72f56124"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#ga3b01c79902063c170ef57deb72f56124">DNS_MAX_NAME_LENGTH</a>&#160;&#160;&#160;256</td></tr>
+<tr class="separator:ga3b01c79902063c170ef57deb72f56124"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9f9881c887a8aceb9765820c2dbdf292"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#ga9f9881c887a8aceb9765820c2dbdf292">DNS_MAX_SERVERS</a>&#160;&#160;&#160;2</td></tr>
+<tr class="separator:ga9f9881c887a8aceb9765820c2dbdf292"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaab73c241189335435f3f662aa6a00dba"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#gaab73c241189335435f3f662aa6a00dba">DNS_MAX_RETRIES</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:gaab73c241189335435f3f662aa6a00dba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga07ffd8e9106dae3b65347bd03811a4b6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#ga07ffd8e9106dae3b65347bd03811a4b6">DNS_DOES_NAME_CHECK</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga07ffd8e9106dae3b65347bd03811a4b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8979c30dfbfde609d5139f80aabdfcc5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#ga8979c30dfbfde609d5139f80aabdfcc5">LWIP_DNS_SECURE</a>&#160;&#160;&#160;(LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)</td></tr>
+<tr class="separator:ga8979c30dfbfde609d5139f80aabdfcc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacba1ac491c1b47b98dfbd0d5c1662659"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#gacba1ac491c1b47b98dfbd0d5c1662659">DNS_LOCAL_HOSTLIST</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gacba1ac491c1b47b98dfbd0d5c1662659"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8235a5fb0a1c1cceeee670cf95612ba8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#ga8235a5fb0a1c1cceeee670cf95612ba8">DNS_LOCAL_HOSTLIST_IS_DYNAMIC</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga8235a5fb0a1c1cceeee670cf95612ba8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafcbde5706a70ace562bd1f7d2d6f77cb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dns.html#gafcbde5706a70ace562bd1f7d2d6f77cb">LWIP_DNS_SUPPORT_MDNS_QUERIES</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gafcbde5706a70ace562bd1f7d2d6f77cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab6030e96e72df649d2650fd32d7a67b3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__udp.html#gab6030e96e72df649d2650fd32d7a67b3">LWIP_UDP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gab6030e96e72df649d2650fd32d7a67b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga35731bc5f337943e474a15c1cd538a61"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__udp.html#ga35731bc5f337943e474a15c1cd538a61">LWIP_UDPLITE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga35731bc5f337943e474a15c1cd538a61"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga97908a317bcba89174b5d1ccbdca0096"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__udp.html#ga97908a317bcba89174b5d1ccbdca0096">UDP_TTL</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411">IP_DEFAULT_TTL</a></td></tr>
+<tr class="separator:ga97908a317bcba89174b5d1ccbdca0096"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga72021505969c5ce29e972486d7794baa"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__udp.html#ga72021505969c5ce29e972486d7794baa">LWIP_NETBUF_RECVINFO</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga72021505969c5ce29e972486d7794baa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa4ed98deb97b77c633cb8870f34c71e9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">LWIP_TCP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gaa4ed98deb97b77c633cb8870f34c71e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacd5b25ea81d2894790d25da5393cdab4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#gacd5b25ea81d2894790d25da5393cdab4">TCP_TTL</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411">IP_DEFAULT_TTL</a></td></tr>
+<tr class="separator:gacd5b25ea81d2894790d25da5393cdab4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7f535a6efb5cdf86c3210e35ece1d6a7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga7f535a6efb5cdf86c3210e35ece1d6a7">TCP_WND</a>&#160;&#160;&#160;(4 * <a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a>)</td></tr>
+<tr class="separator:ga7f535a6efb5cdf86c3210e35ece1d6a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0dee0911197855bdf19ef79778c241a6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga0dee0911197855bdf19ef79778c241a6">TCP_MAXRTX</a>&#160;&#160;&#160;12</td></tr>
+<tr class="separator:ga0dee0911197855bdf19ef79778c241a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga50b434a8541a4813f7b27f576c05d1b6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga50b434a8541a4813f7b27f576c05d1b6">TCP_SYNMAXRTX</a>&#160;&#160;&#160;6</td></tr>
+<tr class="separator:ga50b434a8541a4813f7b27f576c05d1b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga89ffd0d7d1529bdb26bfbad267d0ad75"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga89ffd0d7d1529bdb26bfbad267d0ad75">TCP_QUEUE_OOSEQ</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">LWIP_TCP</a></td></tr>
+<tr class="separator:ga89ffd0d7d1529bdb26bfbad267d0ad75"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf1b6a015d29fea67b906c276e1e8314f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#gaf1b6a015d29fea67b906c276e1e8314f">LWIP_TCP_SACK_OUT</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaf1b6a015d29fea67b906c276e1e8314f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaac0e9f559a8e3c251f3504cebcf44dc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#gaaac0e9f559a8e3c251f3504cebcf44dc">LWIP_TCP_MAX_SACK_NUM</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:gaaac0e9f559a8e3c251f3504cebcf44dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf1ab7bb27860aa3677c387a2f3ba317b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a>&#160;&#160;&#160;536</td></tr>
+<tr class="separator:gaf1ab7bb27860aa3677c387a2f3ba317b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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"><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>
+<tr class="separator:ga9beaa47832ead4180981bfbf71074904"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae5c9866d7cd463ac7b36792182145aec"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#gae5c9866d7cd463ac7b36792182145aec">TCP_SNDLOWAT</a>&#160;&#160;&#160;LWIP_MIN(LWIP_MAX(((<a class="el" href="group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd">TCP_SND_BUF</a>)/2), (2 * <a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a>) + 1), (<a class="el" href="group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd">TCP_SND_BUF</a>) - 1)</td></tr>
+<tr class="separator:gae5c9866d7cd463ac7b36792182145aec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga75659867592a6b01c198532ed1b65698"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga75659867592a6b01c198532ed1b65698">TCP_SNDQUEUELOWAT</a>&#160;&#160;&#160;LWIP_MAX(((<a class="el" href="group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904">TCP_SND_QUEUELEN</a>)/2), 5)</td></tr>
+<tr class="separator:ga75659867592a6b01c198532ed1b65698"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9d6d3219bb5fc0bc760a64114de13c25"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga9d6d3219bb5fc0bc760a64114de13c25">TCP_OOSEQ_MAX_BYTES</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga9d6d3219bb5fc0bc760a64114de13c25"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1f57d3859c4556f785708e5dc440617e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga1f57d3859c4556f785708e5dc440617e">TCP_OOSEQ_MAX_PBUFS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga1f57d3859c4556f785708e5dc440617e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga98b23e7cbd3281915c50a485cb61899d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga98b23e7cbd3281915c50a485cb61899d">TCP_LISTEN_BACKLOG</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga98b23e7cbd3281915c50a485cb61899d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga93cce3f47e33df11248c908d1775bacf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf">TCP_DEFAULT_LISTEN_BACKLOG</a>&#160;&#160;&#160;0xff</td></tr>
+<tr class="separator:ga93cce3f47e33df11248c908d1775bacf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5648e2580bb55c0efdfbebcf3bad1eef"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga5648e2580bb55c0efdfbebcf3bad1eef">TCP_OVERSIZE</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a></td></tr>
+<tr class="separator:ga5648e2580bb55c0efdfbebcf3bad1eef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga249bc450bb818cf2ef3cf1472ff354fd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga249bc450bb818cf2ef3cf1472ff354fd">LWIP_TCP_TIMESTAMPS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga249bc450bb818cf2ef3cf1472ff354fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5d45732ba3a8438b141096d86e07ef8d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga5d45732ba3a8438b141096d86e07ef8d">TCP_WND_UPDATE_THRESHOLD</a>&#160;&#160;&#160;LWIP_MIN((<a class="el" href="group__lwip__opts__tcp.html#ga7f535a6efb5cdf86c3210e35ece1d6a7">TCP_WND</a> / 4), (<a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a> * 4))</td></tr>
+<tr class="separator:ga5d45732ba3a8438b141096d86e07ef8d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga39f76e811117155be8525bb386ecddb7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga39f76e811117155be8525bb386ecddb7">LWIP_EVENT_API</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga39f76e811117155be8525bb386ecddb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga88dbbfeeeb41b129fdc8235fc08bb530"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga88dbbfeeeb41b129fdc8235fc08bb530">LWIP_WND_SCALE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga88dbbfeeeb41b129fdc8235fc08bb530"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga40b1cdad52eaa91a3f5c242fc92ee223"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga40b1cdad52eaa91a3f5c242fc92ee223">LWIP_TCP_PCB_NUM_EXT_ARGS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga40b1cdad52eaa91a3f5c242fc92ee223"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga26dee0e5d9c51b1dda0adad29c770a77"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga26dee0e5d9c51b1dda0adad29c770a77">LWIP_ALTCP</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga26dee0e5d9c51b1dda0adad29c770a77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab03ba0306cf0a99ccce3d100142f60c8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#gab03ba0306cf0a99ccce3d100142f60c8">LWIP_ALTCP_TLS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gab03ba0306cf0a99ccce3d100142f60c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga35998a3d56af9940e6a80bb372597685"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__pbuf.html#ga35998a3d56af9940e6a80bb372597685">PBUF_LINK_HLEN</a>&#160;&#160;&#160;(14 + <a class="el" href="group__lwip__opts__arp.html#gad7fa3b356ca7e603e848b069c4cc6276">ETH_PAD_SIZE</a>)</td></tr>
+<tr class="separator:ga35998a3d56af9940e6a80bb372597685"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6e1ba1875ae5168a17b53d83597bc1de"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__pbuf.html#ga6e1ba1875ae5168a17b53d83597bc1de">PBUF_LINK_ENCAPSULATION_HLEN</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga6e1ba1875ae5168a17b53d83597bc1de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae61f4491d56e805e79b79eb5d35a00e5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__pbuf.html#gae61f4491d56e805e79b79eb5d35a00e5">PBUF_POOL_BUFSIZE</a>&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18">LWIP_MEM_ALIGN_SIZE</a>(<a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a>+40+<a class="el" href="group__lwip__opts__pbuf.html#ga6e1ba1875ae5168a17b53d83597bc1de">PBUF_LINK_ENCAPSULATION_HLEN</a>+<a class="el" href="group__lwip__opts__pbuf.html#ga35998a3d56af9940e6a80bb372597685">PBUF_LINK_HLEN</a>)</td></tr>
+<tr class="separator:gae61f4491d56e805e79b79eb5d35a00e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaefb80d6bf9257c0f4322c36e1272c38"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__pbuf.html#gaaefb80d6bf9257c0f4322c36e1272c38">LWIP_PBUF_REF_T</a>&#160;&#160;&#160;u8_t</td></tr>
+<tr class="separator:gaaefb80d6bf9257c0f4322c36e1272c38"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga943063b053eeac76b0b1bcef2ddd93be"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be">LWIP_SINGLE_NETIF</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga943063b053eeac76b0b1bcef2ddd93be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa714dbfa66822ec4c6111bdb8cf753c1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#gaa714dbfa66822ec4c6111bdb8cf753c1">LWIP_NETIF_HOSTNAME</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaa714dbfa66822ec4c6111bdb8cf753c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadd45fb65f2d0e6de5a0d14ff9e101b77"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#gadd45fb65f2d0e6de5a0d14ff9e101b77">LWIP_NETIF_API</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gadd45fb65f2d0e6de5a0d14ff9e101b77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaffb97d89516c38d3fcb9e44e5d707f36"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#gaffb97d89516c38d3fcb9e44e5d707f36">LWIP_NETIF_STATUS_CALLBACK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaffb97d89516c38d3fcb9e44e5d707f36"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga090482867ba04d442ab5b8ad745c0e1e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#ga090482867ba04d442ab5b8ad745c0e1e">LWIP_NETIF_EXT_STATUS_CALLBACK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga090482867ba04d442ab5b8ad745c0e1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1a446932dd927cc4136ba654c13bb97b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#ga1a446932dd927cc4136ba654c13bb97b">LWIP_NETIF_LINK_CALLBACK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga1a446932dd927cc4136ba654c13bb97b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9c942c2e9655b06d4f73c630d30f60bf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#ga9c942c2e9655b06d4f73c630d30f60bf">LWIP_NETIF_REMOVE_CALLBACK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga9c942c2e9655b06d4f73c630d30f60bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad1d5e878d94b56ba687cef69be936ad9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#gad1d5e878d94b56ba687cef69be936ad9">LWIP_NETIF_HWADDRHINT</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gad1d5e878d94b56ba687cef69be936ad9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabafb9f64a80e51b56c0abbcfc1f7e04e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#gabafb9f64a80e51b56c0abbcfc1f7e04e">LWIP_NETIF_TX_SINGLE_PBUF</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gabafb9f64a80e51b56c0abbcfc1f7e04e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga94a35212616f9a9aae5c98741612b936"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netif.html#ga94a35212616f9a9aae5c98741612b936">LWIP_NUM_NETIF_CLIENT_DATA</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga94a35212616f9a9aae5c98741612b936"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa2b1f736373cd896e212644aa453fbaf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__loop.html#gaa2b1f736373cd896e212644aa453fbaf">LWIP_HAVE_LOOPIF</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__loop.html#ga724a0ea765d5a47d026d529725f31c01">LWIP_NETIF_LOOPBACK</a> &amp;&amp; !<a class="el" href="group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be">LWIP_SINGLE_NETIF</a>)</td></tr>
+<tr class="separator:gaa2b1f736373cd896e212644aa453fbaf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga10a878b390c2fbe421d82502001c7300"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__loop.html#ga10a878b390c2fbe421d82502001c7300">LWIP_LOOPIF_MULTICAST</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga10a878b390c2fbe421d82502001c7300"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga724a0ea765d5a47d026d529725f31c01"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__loop.html#ga724a0ea765d5a47d026d529725f31c01">LWIP_NETIF_LOOPBACK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga724a0ea765d5a47d026d529725f31c01"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaacc3ad5d0a771d45fb0a3e3a09b1dbea"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__loop.html#gaacc3ad5d0a771d45fb0a3e3a09b1dbea">LWIP_LOOPBACK_MAX_PBUFS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaacc3ad5d0a771d45fb0a3e3a09b1dbea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa28d13ddd5281b1912276991e7ea58c5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__loop.html#gaa28d13ddd5281b1912276991e7ea58c5">LWIP_NETIF_LOOPBACK_MULTITHREADING</a>&#160;&#160;&#160;(!<a class="el" href="group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b">NO_SYS</a>)</td></tr>
+<tr class="separator:gaa28d13ddd5281b1912276991e7ea58c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga405e604e4328e1feb878c6fe1798a587"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga405e604e4328e1feb878c6fe1798a587">TCPIP_THREAD_NAME</a>&#160;&#160;&#160;&quot;tcpip_thread&quot;</td></tr>
+<tr class="separator:ga405e604e4328e1feb878c6fe1798a587"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa02b84eafa0c8b09b158b97c96d79db0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#gaa02b84eafa0c8b09b158b97c96d79db0">TCPIP_THREAD_STACKSIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaa02b84eafa0c8b09b158b97c96d79db0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga42b2c7a3042d7c3efd00f367f5837435"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga42b2c7a3042d7c3efd00f367f5837435">TCPIP_THREAD_PRIO</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga42b2c7a3042d7c3efd00f367f5837435"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8cf210ad4e4bf616860a45fbd140fd06"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga8cf210ad4e4bf616860a45fbd140fd06">TCPIP_MBOX_SIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga8cf210ad4e4bf616860a45fbd140fd06"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8b99d75d9e0a0868567d10c8522915bb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga8b99d75d9e0a0868567d10c8522915bb">LWIP_TCPIP_THREAD_ALIVE</a>()</td></tr>
+<tr class="separator:ga8b99d75d9e0a0868567d10c8522915bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae9cd260c56472324a2f0ee5f9597a675"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#gae9cd260c56472324a2f0ee5f9597a675">SLIPIF_THREAD_NAME</a>&#160;&#160;&#160;&quot;slipif_loop&quot;</td></tr>
+<tr class="separator:gae9cd260c56472324a2f0ee5f9597a675"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae8ab54a25007ce997bbab6289815e258"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#gae8ab54a25007ce997bbab6289815e258">SLIPIF_THREAD_STACKSIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gae8ab54a25007ce997bbab6289815e258"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab1b9fc2efcbf1f804bfd0191bc019c4e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#gab1b9fc2efcbf1f804bfd0191bc019c4e">SLIPIF_THREAD_PRIO</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gab1b9fc2efcbf1f804bfd0191bc019c4e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaca13123a5c8271558353e04123957616"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#gaca13123a5c8271558353e04123957616">DEFAULT_THREAD_NAME</a>&#160;&#160;&#160;&quot;lwIP&quot;</td></tr>
+<tr class="separator:gaca13123a5c8271558353e04123957616"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7f93dfeaed4021061959f822def602cb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga7f93dfeaed4021061959f822def602cb">DEFAULT_THREAD_STACKSIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga7f93dfeaed4021061959f822def602cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3d8715b1fdd0449d6c214e4a40108456"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga3d8715b1fdd0449d6c214e4a40108456">DEFAULT_THREAD_PRIO</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga3d8715b1fdd0449d6c214e4a40108456"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4ef8f046c957750056131310a1580df7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga4ef8f046c957750056131310a1580df7">DEFAULT_RAW_RECVMBOX_SIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga4ef8f046c957750056131310a1580df7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga09fe785559b3f0cf108da4440489e335"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga09fe785559b3f0cf108da4440489e335">DEFAULT_UDP_RECVMBOX_SIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga09fe785559b3f0cf108da4440489e335"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1bd172938b9c8ba63156fcafc87e83c7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga1bd172938b9c8ba63156fcafc87e83c7">DEFAULT_TCP_RECVMBOX_SIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga1bd172938b9c8ba63156fcafc87e83c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5d5a6e04abe2ec233c7acdb09f992461"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__thread.html#ga5d5a6e04abe2ec233c7acdb09f992461">DEFAULT_ACCEPTMBOX_SIZE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga5d5a6e04abe2ec233c7acdb09f992461"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga478041b8544461258f6961bf0f3c1a77"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netconn.html#ga478041b8544461258f6961bf0f3c1a77">LWIP_NETCONN</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga478041b8544461258f6961bf0f3c1a77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1cd8d15a42262a0defaedabed126ea99"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netconn.html#ga1cd8d15a42262a0defaedabed126ea99">LWIP_TCPIP_TIMEOUT</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga1cd8d15a42262a0defaedabed126ea99"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2543345adf7d2c307df78a54ac2ba8c4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netconn.html#ga2543345adf7d2c307df78a54ac2ba8c4">LWIP_NETCONN_SEM_PER_THREAD</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga2543345adf7d2c307df78a54ac2ba8c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7bfe8487a3abffdd9d6730977d22c406"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__netconn.html#ga7bfe8487a3abffdd9d6730977d22c406">LWIP_NETCONN_FULLDUPLEX</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga7bfe8487a3abffdd9d6730977d22c406"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1cb62ce61ac39d7d6728ae5d3d3b927f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f">LWIP_SOCKET</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga1cb62ce61ac39d7d6728ae5d3d3b927f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafed2811f031822ec5afa1ee211fb7447"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#gafed2811f031822ec5afa1ee211fb7447">LWIP_COMPAT_SOCKETS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gafed2811f031822ec5afa1ee211fb7447"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga484c38ab08f60d5b3335d23d31f9a402"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga484c38ab08f60d5b3335d23d31f9a402">LWIP_POSIX_SOCKETS_IO_NAMES</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga484c38ab08f60d5b3335d23d31f9a402"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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"><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>
+<tr class="separator:ga1162cb685f202d9b21c11344b8209a58"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga91af3ade95b20b9a60c65ed0380fa0ed"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga91af3ade95b20b9a60c65ed0380fa0ed">LWIP_SO_RCVTIMEO</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga91af3ade95b20b9a60c65ed0380fa0ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5b115bacb569763d8a3889a12229e942"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga5b115bacb569763d8a3889a12229e942">LWIP_SO_SNDRCVTIMEO_NONSTANDARD</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga5b115bacb569763d8a3889a12229e942"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga06390cebcf4d13d3d47a11365e5fcd28"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga06390cebcf4d13d3d47a11365e5fcd28">LWIP_SO_RCVBUF</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga06390cebcf4d13d3d47a11365e5fcd28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa91292d5d014dc1c6f1c1f4166269a1d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#gaa91292d5d014dc1c6f1c1f4166269a1d">LWIP_SO_LINGER</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaa91292d5d014dc1c6f1c1f4166269a1d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5dbd0a61f30ae6c6bfbda635095f138d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga5dbd0a61f30ae6c6bfbda635095f138d">RECV_BUFSIZE_DEFAULT</a>&#160;&#160;&#160;INT_MAX</td></tr>
+<tr class="separator:ga5dbd0a61f30ae6c6bfbda635095f138d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3e7498d5d2921f0df3792de72f384d36"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga3e7498d5d2921f0df3792de72f384d36">LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT</a>&#160;&#160;&#160;20000</td></tr>
+<tr class="separator:ga3e7498d5d2921f0df3792de72f384d36"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf3822feed320cf8439b083ee525e4942"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#gaf3822feed320cf8439b083ee525e4942">SO_REUSE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaf3822feed320cf8439b083ee525e4942"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae9395d83af89002343e5782130f52f44"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#gae9395d83af89002343e5782130f52f44">SO_REUSE_RXTOALL</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gae9395d83af89002343e5782130f52f44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0543eea2abe390d0bdc843c33debd762"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga0543eea2abe390d0bdc843c33debd762">LWIP_FIONREAD_LINUXMODE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga0543eea2abe390d0bdc843c33debd762"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga68417078b71b0be9735256f52933dcdb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga68417078b71b0be9735256f52933dcdb">LWIP_SOCKET_SELECT</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga68417078b71b0be9735256f52933dcdb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6c14d705e3321429683f24de9f5a7200"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga6c14d705e3321429683f24de9f5a7200">LWIP_SOCKET_POLL</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga6c14d705e3321429683f24de9f5a7200"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga542b58734cc01902c5e099f6efdc5f1b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga542b58734cc01902c5e099f6efdc5f1b">LWIP_STATS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga542b58734cc01902c5e099f6efdc5f1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacdc38ed58d1900b5d3d109a65be1c3d1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gacdc38ed58d1900b5d3d109a65be1c3d1">LWIP_STATS_DISPLAY</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gacdc38ed58d1900b5d3d109a65be1c3d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae58b452782d0327ae728192686c5a84a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gae58b452782d0327ae728192686c5a84a">LINK_STATS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gae58b452782d0327ae728192686c5a84a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3a8359abf4fff8ffdc449e5007f93275"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga3a8359abf4fff8ffdc449e5007f93275">ETHARP_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">LWIP_ARP</a>)</td></tr>
+<tr class="separator:ga3a8359abf4fff8ffdc449e5007f93275"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf50575a4895e26ea2c01d1f2269487be"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gaf50575a4895e26ea2c01d1f2269487be">IP_STATS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gaf50575a4895e26ea2c01d1f2269487be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac9a4fbb46df3c0f479a334d0e34fb74f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gac9a4fbb46df3c0f479a334d0e34fb74f">IPFRAG_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69">IP_REASSEMBLY</a> || <a class="el" href="group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4">IP_FRAG</a>)</td></tr>
+<tr class="separator:gac9a4fbb46df3c0f479a334d0e34fb74f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga472ad3f6da741f5b287d66ad3051242b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga472ad3f6da741f5b287d66ad3051242b">ICMP_STATS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga472ad3f6da741f5b287d66ad3051242b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4d12af1356b9fd60717984be51e27740"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga4d12af1356b9fd60717984be51e27740">IGMP_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923">LWIP_IGMP</a>)</td></tr>
+<tr class="separator:ga4d12af1356b9fd60717984be51e27740"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaef64b11bf71f0d6d5bafaf6092462276"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gaef64b11bf71f0d6d5bafaf6092462276">UDP_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__udp.html#gab6030e96e72df649d2650fd32d7a67b3">LWIP_UDP</a>)</td></tr>
+<tr class="separator:gaef64b11bf71f0d6d5bafaf6092462276"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa02ec5c5bc0edebe418680c54d044f58"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gaa02ec5c5bc0edebe418680c54d044f58">TCP_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">LWIP_TCP</a>)</td></tr>
+<tr class="separator:gaa02ec5c5bc0edebe418680c54d044f58"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga61ec04a08c4fde690d10819e582656a7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga61ec04a08c4fde690d10819e582656a7">MEM_STATS</a>&#160;&#160;&#160;((<a class="el" href="group__lwip__opts__mem.html#ga4ef345cc270912bd2230b1c5ec51dfc8">MEM_LIBC_MALLOC</a> == 0) &amp;&amp; (<a class="el" href="group__lwip__opts__mem.html#gaddca3141bc7037241769eb152b6f89ba">MEM_USE_POOLS</a> == 0))</td></tr>
+<tr class="separator:ga61ec04a08c4fde690d10819e582656a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab8c2430be0e567a7499a95454aaa6041"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gab8c2430be0e567a7499a95454aaa6041">MEMP_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__mem.html#gae93af697d27bbcefa6a28052d90f2f38">MEMP_MEM_MALLOC</a> == 0)</td></tr>
+<tr class="separator:gab8c2430be0e567a7499a95454aaa6041"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0173549afa76553583e5a02c6a791218"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga0173549afa76553583e5a02c6a791218">SYS_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b">NO_SYS</a> == 0)</td></tr>
+<tr class="separator:ga0173549afa76553583e5a02c6a791218"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6a211b787c97bce3af4273b29c95d9c2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga6a211b787c97bce3af4273b29c95d9c2">IP6_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a>)</td></tr>
+<tr class="separator:ga6a211b787c97bce3af4273b29c95d9c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga714006cd5c5b0eb333159d0f677616a0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga714006cd5c5b0eb333159d0f677616a0">ICMP6_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> &amp;&amp; <a class="el" href="group__lwip__opts__icmp6.html#ga65ac8bcbad242cba3a2b557e1574b21f">LWIP_ICMP6</a>)</td></tr>
+<tr class="separator:ga714006cd5c5b0eb333159d0f677616a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaa08a181c11ff8b471549e8f52c9939b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gaaa08a181c11ff8b471549e8f52c9939b">IP6_FRAG_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> &amp;&amp; (<a class="el" href="group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3">LWIP_IPV6_FRAG</a> || <a class="el" href="group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864">LWIP_IPV6_REASS</a>))</td></tr>
+<tr class="separator:gaaa08a181c11ff8b471549e8f52c9939b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf263df10b63b38201cae3d2dd5fb0b9e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#gaf263df10b63b38201cae3d2dd5fb0b9e">MLD6_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> &amp;&amp; <a class="el" href="group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528">LWIP_IPV6_MLD</a>)</td></tr>
+<tr class="separator:gaf263df10b63b38201cae3d2dd5fb0b9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga753161114df60299a28d51c092c756cf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga753161114df60299a28d51c092c756cf">ND6_STATS</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a>)</td></tr>
+<tr class="separator:ga753161114df60299a28d51c092c756cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5b01047eeb149a0b0ffe33d760d8370f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__stats.html#ga5b01047eeb149a0b0ffe33d760d8370f">MIB2_STATS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga5b01047eeb149a0b0ffe33d760d8370f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3ecc5246a0c6ca5aed56c2d7899c1004"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga3ecc5246a0c6ca5aed56c2d7899c1004">LWIP_CHECKSUM_CTRL_PER_NETIF</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga3ecc5246a0c6ca5aed56c2d7899c1004"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8ddad81fc26268a13b35091781da2265"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga8ddad81fc26268a13b35091781da2265">CHECKSUM_GEN_IP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga8ddad81fc26268a13b35091781da2265"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga98d460f8c2baed8bf62d5473831c0b2c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga98d460f8c2baed8bf62d5473831c0b2c">CHECKSUM_GEN_UDP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga98d460f8c2baed8bf62d5473831c0b2c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga800069963cc4552b99235237c22f00bb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga800069963cc4552b99235237c22f00bb">CHECKSUM_GEN_TCP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga800069963cc4552b99235237c22f00bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2291ec5bec0a551545da6d5f9f9316b2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga2291ec5bec0a551545da6d5f9f9316b2">CHECKSUM_GEN_ICMP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga2291ec5bec0a551545da6d5f9f9316b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7cd47a55af03b1048c5a4a5fe0e76013"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga7cd47a55af03b1048c5a4a5fe0e76013">CHECKSUM_GEN_ICMP6</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga7cd47a55af03b1048c5a4a5fe0e76013"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga005b1b9988b84a2cb844144cef22c11e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga005b1b9988b84a2cb844144cef22c11e">CHECKSUM_CHECK_IP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga005b1b9988b84a2cb844144cef22c11e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6747f7b72abe544fd4dc184cc7fcad37"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga6747f7b72abe544fd4dc184cc7fcad37">CHECKSUM_CHECK_UDP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga6747f7b72abe544fd4dc184cc7fcad37"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab676cc29571b7ffda12336482ad97699"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#gab676cc29571b7ffda12336482ad97699">CHECKSUM_CHECK_TCP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gab676cc29571b7ffda12336482ad97699"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga79807171be8c20b69a5cd8de83566d25"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga79807171be8c20b69a5cd8de83566d25">CHECKSUM_CHECK_ICMP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga79807171be8c20b69a5cd8de83566d25"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf466a10b093489910a773fd1cec74c2d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#gaf466a10b093489910a773fd1cec74c2d">CHECKSUM_CHECK_ICMP6</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gaf466a10b093489910a773fd1cec74c2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9f60183f0442bdbeefd6b395c6647613"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__checksum.html#ga9f60183f0442bdbeefd6b395c6647613">LWIP_CHECKSUM_ON_COPY</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga9f60183f0442bdbeefd6b395c6647613"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga872e3bb3fe2212156d66b18fccc9643f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga872e3bb3fe2212156d66b18fccc9643f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8adc0b7dbedd279387a21588f0e2c969"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga8adc0b7dbedd279387a21588f0e2c969">IPV6_REASS_MAXAGE</a>&#160;&#160;&#160;60</td></tr>
+<tr class="separator:ga8adc0b7dbedd279387a21588f0e2c969"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga91d1e630059df3b3a296e2b6ff7aead5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga91d1e630059df3b3a296e2b6ff7aead5">LWIP_IPV6_SCOPES</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> &amp;&amp; !<a class="el" href="group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be">LWIP_SINGLE_NETIF</a>)</td></tr>
+<tr class="separator:ga91d1e630059df3b3a296e2b6ff7aead5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga623ef29d27d98fb7be8732730a5ddf4b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga623ef29d27d98fb7be8732730a5ddf4b">LWIP_IPV6_SCOPES_DEBUG</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga623ef29d27d98fb7be8732730a5ddf4b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga16c1b672604bfb0a66a6aeeb854589d3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga16c1b672604bfb0a66a6aeeb854589d3">LWIP_IPV6_NUM_ADDRESSES</a>&#160;&#160;&#160;3</td></tr>
+<tr class="separator:ga16c1b672604bfb0a66a6aeeb854589d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac96c5802de6c75dd62ab38cff6d16a32"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#gac96c5802de6c75dd62ab38cff6d16a32">LWIP_IPV6_FORWARD</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gac96c5802de6c75dd62ab38cff6d16a32"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9ab6269f3087f6d9f7b2c7181ef043c3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3">LWIP_IPV6_FRAG</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga9ab6269f3087f6d9f7b2c7181ef043c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad0ef160d72e63b02c5e875b06ec53864"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864">LWIP_IPV6_REASS</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a></td></tr>
+<tr class="separator:gad0ef160d72e63b02c5e875b06ec53864"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga273ed2e1a4e6a43713a0e4a06a34ee5c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga273ed2e1a4e6a43713a0e4a06a34ee5c">LWIP_IPV6_SEND_ROUTER_SOLICIT</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga273ed2e1a4e6a43713a0e4a06a34ee5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga580039bf2baf49fcb9e504e5d2b40a03"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga580039bf2baf49fcb9e504e5d2b40a03">LWIP_IPV6_AUTOCONFIG</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a></td></tr>
+<tr class="separator:ga580039bf2baf49fcb9e504e5d2b40a03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2c0127fca1073ad3f0a1e53f00ea8858"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#ga2c0127fca1073ad3f0a1e53f00ea8858">LWIP_IPV6_ADDRESS_LIFETIMES</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga580039bf2baf49fcb9e504e5d2b40a03">LWIP_IPV6_AUTOCONFIG</a></td></tr>
+<tr class="separator:ga2c0127fca1073ad3f0a1e53f00ea8858"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad8489522d34f37e42b4001bab3781bcb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__ipv6.html#gad8489522d34f37e42b4001bab3781bcb">LWIP_IPV6_DUP_DETECT_ATTEMPTS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gad8489522d34f37e42b4001bab3781bcb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga65ac8bcbad242cba3a2b557e1574b21f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__icmp6.html#ga65ac8bcbad242cba3a2b557e1574b21f">LWIP_ICMP6</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a></td></tr>
+<tr class="separator:ga65ac8bcbad242cba3a2b557e1574b21f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa88c55e37e5d7b865b91a9399313bbbf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__icmp6.html#gaa88c55e37e5d7b865b91a9399313bbbf">LWIP_ICMP6_DATASIZE</a>&#160;&#160;&#160;8</td></tr>
+<tr class="separator:gaa88c55e37e5d7b865b91a9399313bbbf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga82193577b4045e1ac1533c4341a2bd79"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__icmp6.html#ga82193577b4045e1ac1533c4341a2bd79">LWIP_ICMP6_HL</a>&#160;&#160;&#160;255</td></tr>
+<tr class="separator:ga82193577b4045e1ac1533c4341a2bd79"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga44d8f24eaebbc50221ac1336212a3528"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528">LWIP_IPV6_MLD</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a></td></tr>
+<tr class="separator:ga44d8f24eaebbc50221ac1336212a3528"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga89e92d8de8898696e797f13fdd169494"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mld6.html#ga89e92d8de8898696e797f13fdd169494">MEMP_NUM_MLD6_GROUP</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:ga89e92d8de8898696e797f13fdd169494"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0757a3c1b5d1563ad2d77228e1d8a60f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga0757a3c1b5d1563ad2d77228e1d8a60f">LWIP_ND6_QUEUEING</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a></td></tr>
+<tr class="separator:ga0757a3c1b5d1563ad2d77228e1d8a60f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabfaf3d92d51e2a9d70c8360af2611fb2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#gabfaf3d92d51e2a9d70c8360af2611fb2">MEMP_NUM_ND6_QUEUE</a>&#160;&#160;&#160;20</td></tr>
+<tr class="separator:gabfaf3d92d51e2a9d70c8360af2611fb2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab2fe15bdb4e0a41f295eb5577b11ad16"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#gab2fe15bdb4e0a41f295eb5577b11ad16">LWIP_ND6_NUM_NEIGHBORS</a>&#160;&#160;&#160;10</td></tr>
+<tr class="separator:gab2fe15bdb4e0a41f295eb5577b11ad16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacad118b1ae886e80137a1d4f0fb19672"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#gacad118b1ae886e80137a1d4f0fb19672">LWIP_ND6_NUM_DESTINATIONS</a>&#160;&#160;&#160;10</td></tr>
+<tr class="separator:gacad118b1ae886e80137a1d4f0fb19672"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad9cc576b5951f1b5e1c2b0d0bb831d9a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#gad9cc576b5951f1b5e1c2b0d0bb831d9a">LWIP_ND6_NUM_PREFIXES</a>&#160;&#160;&#160;5</td></tr>
+<tr class="separator:gad9cc576b5951f1b5e1c2b0d0bb831d9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga75e81a96148f266c8fad8c0bcab2f36a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga75e81a96148f266c8fad8c0bcab2f36a">LWIP_ND6_NUM_ROUTERS</a>&#160;&#160;&#160;3</td></tr>
+<tr class="separator:ga75e81a96148f266c8fad8c0bcab2f36a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga980909018aed54adc10dd68be3572b30"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga980909018aed54adc10dd68be3572b30">LWIP_ND6_MAX_MULTICAST_SOLICIT</a>&#160;&#160;&#160;3</td></tr>
+<tr class="separator:ga980909018aed54adc10dd68be3572b30"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafa6f4c2d2c259ab0895fa03a6f08c691"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#gafa6f4c2d2c259ab0895fa03a6f08c691">LWIP_ND6_MAX_UNICAST_SOLICIT</a>&#160;&#160;&#160;3</td></tr>
+<tr class="separator:gafa6f4c2d2c259ab0895fa03a6f08c691"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga960b8973df083fad53ae0eaa79f8c4df"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga960b8973df083fad53ae0eaa79f8c4df">LWIP_ND6_MAX_ANYCAST_DELAY_TIME</a>&#160;&#160;&#160;1000</td></tr>
+<tr class="separator:ga960b8973df083fad53ae0eaa79f8c4df"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga86ab0cac87cdc7aeff09384ddbaaba2a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga86ab0cac87cdc7aeff09384ddbaaba2a">LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT</a>&#160;&#160;&#160;3</td></tr>
+<tr class="separator:ga86ab0cac87cdc7aeff09384ddbaaba2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga269db9d61cdfc2fd3bc7b12c56261c74"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga269db9d61cdfc2fd3bc7b12c56261c74">LWIP_ND6_REACHABLE_TIME</a>&#160;&#160;&#160;30000</td></tr>
+<tr class="separator:ga269db9d61cdfc2fd3bc7b12c56261c74"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga461abcbeef1d236d1f3201827dd28ad9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga461abcbeef1d236d1f3201827dd28ad9">LWIP_ND6_RETRANS_TIMER</a>&#160;&#160;&#160;1000</td></tr>
+<tr class="separator:ga461abcbeef1d236d1f3201827dd28ad9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga315bd6d4a9d185766dfc3253cd9d7715"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga315bd6d4a9d185766dfc3253cd9d7715">LWIP_ND6_DELAY_FIRST_PROBE_TIME</a>&#160;&#160;&#160;5000</td></tr>
+<tr class="separator:ga315bd6d4a9d185766dfc3253cd9d7715"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad35d10353ac7c7d2c8d4b83788cdc6d9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#gad35d10353ac7c7d2c8d4b83788cdc6d9">LWIP_ND6_ALLOW_RA_UPDATES</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gad35d10353ac7c7d2c8d4b83788cdc6d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9d7cb6fd447ef0f6726f565e2c7509c4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#ga9d7cb6fd447ef0f6726f565e2c7509c4">LWIP_ND6_TCP_REACHABILITY_HINTS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga9d7cb6fd447ef0f6726f565e2c7509c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaea4d829c0b52cc6cc28925eee89a7429"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__nd6.html#gaea4d829c0b52cc6cc28925eee89a7429">LWIP_ND6_RDNSS_MAX_DNS_SERVERS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaea4d829c0b52cc6cc28925eee89a7429"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1ba67b6665026ec0c688dc4b0df047a6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6">LWIP_IPV6_DHCP6</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga1ba67b6665026ec0c688dc4b0df047a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3fc9dbe8feae61621cac4952ac28e155"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcpv6.html#ga3fc9dbe8feae61621cac4952ac28e155">LWIP_IPV6_DHCP6_STATEFUL</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga3fc9dbe8feae61621cac4952ac28e155"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8d6bab14d580d2136430319aab6d7930"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcpv6.html#ga8d6bab14d580d2136430319aab6d7930">LWIP_IPV6_DHCP6_STATELESS</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6">LWIP_IPV6_DHCP6</a></td></tr>
+<tr class="separator:ga8d6bab14d580d2136430319aab6d7930"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5d08f76a7472daa7bcfe17343243bd77"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcpv6.html#ga5d08f76a7472daa7bcfe17343243bd77">LWIP_DHCP6_GET_NTP_SRV</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga5d08f76a7472daa7bcfe17343243bd77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf3ac8e15d7a67429a02bc2317e16bcfe"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcpv6.html#gaf3ac8e15d7a67429a02bc2317e16bcfe">LWIP_DHCP6_MAX_NTP_SERVERS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gaf3ac8e15d7a67429a02bc2317e16bcfe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga92c3bc242ad20a5f398c45d332864a29"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcpv6.html#ga92c3bc242ad20a5f398c45d332864a29">LWIP_DHCP6_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:ga92c3bc242ad20a5f398c45d332864a29"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga11ac9d637cb6afc0a32e8da7f51d0c0d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga11ac9d637cb6afc0a32e8da7f51d0c0d">LWIP_HOOK_FILENAME</a>&#160;&#160;&#160;&quot;path/to/my/lwip_hooks.h&quot;</td></tr>
+<tr class="separator:ga11ac9d637cb6afc0a32e8da7f51d0c0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga078d203053911cf3af178392700386a4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga078d203053911cf3af178392700386a4">LWIP_HOOK_TCP_ISN</a>(local_ip,  local_port,  remote_ip,  remote_port)</td></tr>
+<tr class="separator:ga078d203053911cf3af178392700386a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabed8b1cda4aba2d108fa62cdd74895a2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#gabed8b1cda4aba2d108fa62cdd74895a2">LWIP_HOOK_TCP_INPACKET_PCB</a>(pcb,  hdr,  optlen,  opt1len,  opt2,  p)</td></tr>
+<tr class="separator:gabed8b1cda4aba2d108fa62cdd74895a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga31c0694abe4eedf3ff039b7073c2293f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga31c0694abe4eedf3ff039b7073c2293f">LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH</a>(pcb,  internal_len)</td></tr>
+<tr class="separator:ga31c0694abe4eedf3ff039b7073c2293f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0ef31b749307b63c06633645d4de21f0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga0ef31b749307b63c06633645d4de21f0">LWIP_HOOK_TCP_OUT_ADD_TCPOPTS</a>(p,  hdr,  pcb,  opts)</td></tr>
+<tr class="separator:ga0ef31b749307b63c06633645d4de21f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9124237c28e2f18f3b28d5be09e9ccb6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga9124237c28e2f18f3b28d5be09e9ccb6">LWIP_HOOK_IP4_INPUT</a>(<a class="el" href="structpbuf.html">pbuf</a>,  input_netif)</td></tr>
+<tr class="separator:ga9124237c28e2f18f3b28d5be09e9ccb6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5d1061ad722a73012a28dbaf0f169b70"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga5d1061ad722a73012a28dbaf0f169b70">LWIP_HOOK_IP4_ROUTE</a>()</td></tr>
+<tr class="separator:ga5d1061ad722a73012a28dbaf0f169b70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa410d9cbe1d4fa4c8a7f49af7b501024"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#gaa410d9cbe1d4fa4c8a7f49af7b501024">LWIP_HOOK_IP4_ROUTE_SRC</a>(src,  dest)</td></tr>
+<tr class="separator:gaa410d9cbe1d4fa4c8a7f49af7b501024"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaed848a98dbb5c8856a27e379986ea70d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#gaed848a98dbb5c8856a27e379986ea70d">LWIP_HOOK_IP4_CANFORWARD</a>(src,  dest)</td></tr>
+<tr class="separator:gaed848a98dbb5c8856a27e379986ea70d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2b76f127325fd5ca8b80077a4b6160b1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga2b76f127325fd5ca8b80077a4b6160b1">LWIP_HOOK_ETHARP_GET_GW</a>(<a class="el" href="structnetif.html">netif</a>,  dest)</td></tr>
+<tr class="separator:ga2b76f127325fd5ca8b80077a4b6160b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaccbdd3d0250f7176dcd799ca06007f20"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#gaccbdd3d0250f7176dcd799ca06007f20">LWIP_HOOK_IP6_INPUT</a>(<a class="el" href="structpbuf.html">pbuf</a>,  input_netif)</td></tr>
+<tr class="separator:gaccbdd3d0250f7176dcd799ca06007f20"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8245a4bc7ffb172e3bf32276f9d126ce"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga8245a4bc7ffb172e3bf32276f9d126ce">LWIP_HOOK_IP6_ROUTE</a>(src,  dest)</td></tr>
+<tr class="separator:ga8245a4bc7ffb172e3bf32276f9d126ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga287544c3d74bc2a2d645bddbbc4fbdd0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga287544c3d74bc2a2d645bddbbc4fbdd0">LWIP_HOOK_ND6_GET_GW</a>(<a class="el" href="structnetif.html">netif</a>,  dest)</td></tr>
+<tr class="separator:ga287544c3d74bc2a2d645bddbbc4fbdd0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2f020543772368f8f4355f50f24c86a9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga2f020543772368f8f4355f50f24c86a9">LWIP_HOOK_VLAN_CHECK</a>(<a class="el" href="structnetif.html">netif</a>,  <a class="el" href="structeth__hdr.html">eth_hdr</a>,  vlan_hdr)</td></tr>
+<tr class="separator:ga2f020543772368f8f4355f50f24c86a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2b6e450b4934b95df9b9a9d2b9a4d57e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga2b6e450b4934b95df9b9a9d2b9a4d57e">LWIP_HOOK_VLAN_SET</a>(<a class="el" href="structnetif.html">netif</a>,  p,  src,  dst,  eth_type)</td></tr>
+<tr class="separator:ga2b6e450b4934b95df9b9a9d2b9a4d57e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga13e90672158221b40f8b12bf9d8b721f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga13e90672158221b40f8b12bf9d8b721f">LWIP_HOOK_MEMP_AVAILABLE</a>(memp_t_type)</td></tr>
+<tr class="separator:ga13e90672158221b40f8b12bf9d8b721f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6cc92f5101dd7a0420e18e1f2101abf4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga6cc92f5101dd7a0420e18e1f2101abf4">LWIP_HOOK_UNKNOWN_ETH_PROTOCOL</a>(<a class="el" href="structpbuf.html">pbuf</a>,  <a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga6cc92f5101dd7a0420e18e1f2101abf4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga40e6c9aba06e66e5df1b4ca18329f9b4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga40e6c9aba06e66e5df1b4ca18329f9b4">LWIP_HOOK_DHCP_APPEND_OPTIONS</a>(<a class="el" href="structnetif.html">netif</a>,  dhcp,  state,  msg,  msg_type,  options_len_ptr)</td></tr>
+<tr class="separator:ga40e6c9aba06e66e5df1b4ca18329f9b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafbbbc574863c0f88988936bd1434f2d2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#gafbbbc574863c0f88988936bd1434f2d2">LWIP_HOOK_DHCP_PARSE_OPTION</a>(<a class="el" href="structnetif.html">netif</a>,  dhcp,  state,  msg,  msg_type,  option,  len,  <a class="el" href="structpbuf.html">pbuf</a>,  offset)</td></tr>
+<tr class="separator:gafbbbc574863c0f88988936bd1434f2d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4068b3313e32f711ba016215fc2c886a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga4068b3313e32f711ba016215fc2c886a">LWIP_HOOK_DHCP6_APPEND_OPTIONS</a>(<a class="el" href="structnetif.html">netif</a>,  dhcp6,  state,  msg,  msg_type,  options_len_ptr,  max_len)</td></tr>
+<tr class="separator:ga4068b3313e32f711ba016215fc2c886a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga14ea9210c09da4dd33bc85bd8a01b48a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#ga14ea9210c09da4dd33bc85bd8a01b48a">LWIP_HOOK_SOCKETS_SETSOCKOPT</a>(s,  sock,  level,  optname,  optval,  optlen,  err)</td></tr>
+<tr class="separator:ga14ea9210c09da4dd33bc85bd8a01b48a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabdaeb09ac9f441934e21a087544a1af1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#gabdaeb09ac9f441934e21a087544a1af1">LWIP_HOOK_SOCKETS_GETSOCKOPT</a>(s,  sock,  level,  optname,  optval,  optlen,  err)</td></tr>
+<tr class="separator:gabdaeb09ac9f441934e21a087544a1af1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae35e4b7374868dc748b12dedb8f807e5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__hooks.html#gae35e4b7374868dc748b12dedb8f807e5">LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE</a>(name,  addr,  addrtype,  err)</td></tr>
+<tr class="separator:gae35e4b7374868dc748b12dedb8f807e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2043f599515774f8e571ba185dbcb9e7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga2043f599515774f8e571ba185dbcb9e7">LWIP_DBG_MIN_LEVEL</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#ga8ebaeb006b43f55897f3196b3617dc87">LWIP_DBG_LEVEL_ALL</a></td></tr>
+<tr class="separator:ga2043f599515774f8e571ba185dbcb9e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac095d0e53f5eb5b326b2cccfd071d93d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gac095d0e53f5eb5b326b2cccfd071d93d">LWIP_DBG_TYPES_ON</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#ga9e31b7cbbc8f46af8e62b548079acd4e">LWIP_DBG_ON</a></td></tr>
+<tr class="separator:gac095d0e53f5eb5b326b2cccfd071d93d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabff5d1e0b334f5b45bd2b8bbb675411e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gabff5d1e0b334f5b45bd2b8bbb675411e">ETHARP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gabff5d1e0b334f5b45bd2b8bbb675411e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2dfad02b075a7f9a8791a66fe40864a4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga2dfad02b075a7f9a8791a66fe40864a4">NETIF_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga2dfad02b075a7f9a8791a66fe40864a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5c3d44a0ec3bb8bd66f776c70d5c6a6c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga5c3d44a0ec3bb8bd66f776c70d5c6a6c">PBUF_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga5c3d44a0ec3bb8bd66f776c70d5c6a6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga671009550216f7dc03e67ba5751e3160"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga671009550216f7dc03e67ba5751e3160">API_LIB_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga671009550216f7dc03e67ba5751e3160"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4279d7ff9f986b2ff3eb068bb012b697"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga4279d7ff9f986b2ff3eb068bb012b697">API_MSG_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga4279d7ff9f986b2ff3eb068bb012b697"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga509594f3ba7d8b1356628b50b55a0934"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga509594f3ba7d8b1356628b50b55a0934">SOCKETS_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga509594f3ba7d8b1356628b50b55a0934"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9595904a1cb9bfe0b9b1d958abdc923a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga9595904a1cb9bfe0b9b1d958abdc923a">ICMP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga9595904a1cb9bfe0b9b1d958abdc923a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8da07508ee75704362d45eee3eb857fa"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga8da07508ee75704362d45eee3eb857fa">IGMP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga8da07508ee75704362d45eee3eb857fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga78140cbe70258a65cb5c9e381843e4f3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga78140cbe70258a65cb5c9e381843e4f3">INET_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga78140cbe70258a65cb5c9e381843e4f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5d3348778951e7bc5cd397c6575eef3a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga5d3348778951e7bc5cd397c6575eef3a">IP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga5d3348778951e7bc5cd397c6575eef3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33">IP_REASS_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf0551bef83c0fc1baa57cf339d220e25"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gaf0551bef83c0fc1baa57cf339d220e25">RAW_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gaf0551bef83c0fc1baa57cf339d220e25"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2d7bc380695eeedb1af50c3808613afe"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga2d7bc380695eeedb1af50c3808613afe">MEM_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga2d7bc380695eeedb1af50c3808613afe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad80231923f7a808d49eba5ec57d63616"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gad80231923f7a808d49eba5ec57d63616">MEMP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gad80231923f7a808d49eba5ec57d63616"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2960ae20008f05da8cc0714f36365642"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga2960ae20008f05da8cc0714f36365642">SYS_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga2960ae20008f05da8cc0714f36365642"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga24a6644ba9cc82665a7bf209b3870c15"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga24a6644ba9cc82665a7bf209b3870c15">TIMERS_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga24a6644ba9cc82665a7bf209b3870c15"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4f43bb8a430c7a52a1ad5086d3f2803c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga4f43bb8a430c7a52a1ad5086d3f2803c">TCP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga4f43bb8a430c7a52a1ad5086d3f2803c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf51dc2563536de56470146749f715ba8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gaf51dc2563536de56470146749f715ba8">TCP_INPUT_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gaf51dc2563536de56470146749f715ba8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5895bee26e8e1a0b89d597e0f2580b23"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga5895bee26e8e1a0b89d597e0f2580b23">TCP_FR_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga5895bee26e8e1a0b89d597e0f2580b23"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad6e52e37415d0d0cbe4931a28f5a9662"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gad6e52e37415d0d0cbe4931a28f5a9662">TCP_RTO_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gad6e52e37415d0d0cbe4931a28f5a9662"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga66df03d8192cd978d3321a9d68bf5411"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga66df03d8192cd978d3321a9d68bf5411">TCP_CWND_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga66df03d8192cd978d3321a9d68bf5411"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3704f433e947d6342da77c74e33627e1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga3704f433e947d6342da77c74e33627e1">TCP_WND_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga3704f433e947d6342da77c74e33627e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9f70601fdc1feee490772bf7fcdb74fb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga9f70601fdc1feee490772bf7fcdb74fb">TCP_OUTPUT_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga9f70601fdc1feee490772bf7fcdb74fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga37596f7bbb9b7663826244ba54486679"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga37596f7bbb9b7663826244ba54486679">TCP_RST_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga37596f7bbb9b7663826244ba54486679"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae7980c7f8eb45cd411bf410ff0a3fc55"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gae7980c7f8eb45cd411bf410ff0a3fc55">TCP_QLEN_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gae7980c7f8eb45cd411bf410ff0a3fc55"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0393f312c5475a1c649b39ef9cfcaad4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga0393f312c5475a1c649b39ef9cfcaad4">UDP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga0393f312c5475a1c649b39ef9cfcaad4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga52d6c83451936c3de3b0338d4a3f921f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga52d6c83451936c3de3b0338d4a3f921f">TCPIP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga52d6c83451936c3de3b0338d4a3f921f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab986f95183559d8678c6d80969b01857"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gab986f95183559d8678c6d80969b01857">SLIP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gab986f95183559d8678c6d80969b01857"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga97927ceecabcdb5f41735bf372a05cee"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga97927ceecabcdb5f41735bf372a05cee">DHCP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga97927ceecabcdb5f41735bf372a05cee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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"><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>
+<tr class="separator:gac2f9726756b78d4d7c425b0422a776ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacfc11be8b3bf6bb55e3e5c39ea8802d1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gacfc11be8b3bf6bb55e3e5c39ea8802d1">DHCP6_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gacfc11be8b3bf6bb55e3e5c39ea8802d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga44acd95b33e2d58a74455279721298de"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__perf.html#ga44acd95b33e2d58a74455279721298de">LWIP_PERF</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga44acd95b33e2d58a74455279721298de"><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>lwIP Options Configuration </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="opt_8h.html">opt.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/opt_8h.js b/doc/doxygen/output/html/opt_8h.js
new file mode 100644
index 0000000..e91b2f2
--- /dev/null
+++ b/doc/doxygen/output/html/opt_8h.js
@@ -0,0 +1,316 @@
+var opt_8h =
+[
+    [ "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 ],
+    [ "ARP_QUEUE_LEN", "group__lwip__opts__arp.html#ga29f41a6ebdbb23f46688d381b3609fd1", null ],
+    [ "ARP_QUEUEING", "group__lwip__opts__arp.html#ga75837814536af29b6102508588d0ab58", null ],
+    [ "ARP_TABLE_SIZE", "group__lwip__opts__arp.html#ga924936a814564dbdb0bc950d255a83b9", null ],
+    [ "AUTOIP_DEBUG", "group__lwip__opts__debugmsg.html#gafaee522e7f32d81022215e1805e303a5", null ],
+    [ "CHECKSUM_CHECK_ICMP", "group__lwip__opts__checksum.html#ga79807171be8c20b69a5cd8de83566d25", null ],
+    [ "CHECKSUM_CHECK_ICMP6", "group__lwip__opts__checksum.html#gaf466a10b093489910a773fd1cec74c2d", null ],
+    [ "CHECKSUM_CHECK_IP", "group__lwip__opts__checksum.html#ga005b1b9988b84a2cb844144cef22c11e", null ],
+    [ "CHECKSUM_CHECK_TCP", "group__lwip__opts__checksum.html#gab676cc29571b7ffda12336482ad97699", null ],
+    [ "CHECKSUM_CHECK_UDP", "group__lwip__opts__checksum.html#ga6747f7b72abe544fd4dc184cc7fcad37", null ],
+    [ "CHECKSUM_GEN_ICMP", "group__lwip__opts__checksum.html#ga2291ec5bec0a551545da6d5f9f9316b2", null ],
+    [ "CHECKSUM_GEN_ICMP6", "group__lwip__opts__checksum.html#ga7cd47a55af03b1048c5a4a5fe0e76013", null ],
+    [ "CHECKSUM_GEN_IP", "group__lwip__opts__checksum.html#ga8ddad81fc26268a13b35091781da2265", null ],
+    [ "CHECKSUM_GEN_TCP", "group__lwip__opts__checksum.html#ga800069963cc4552b99235237c22f00bb", null ],
+    [ "CHECKSUM_GEN_UDP", "group__lwip__opts__checksum.html#ga98d460f8c2baed8bf62d5473831c0b2c", null ],
+    [ "DEFAULT_ACCEPTMBOX_SIZE", "group__lwip__opts__thread.html#ga5d5a6e04abe2ec233c7acdb09f992461", null ],
+    [ "DEFAULT_RAW_RECVMBOX_SIZE", "group__lwip__opts__thread.html#ga4ef8f046c957750056131310a1580df7", null ],
+    [ "DEFAULT_TCP_RECVMBOX_SIZE", "group__lwip__opts__thread.html#ga1bd172938b9c8ba63156fcafc87e83c7", null ],
+    [ "DEFAULT_THREAD_NAME", "group__lwip__opts__thread.html#gaca13123a5c8271558353e04123957616", null ],
+    [ "DEFAULT_THREAD_PRIO", "group__lwip__opts__thread.html#ga3d8715b1fdd0449d6c214e4a40108456", null ],
+    [ "DEFAULT_THREAD_STACKSIZE", "group__lwip__opts__thread.html#ga7f93dfeaed4021061959f822def602cb", null ],
+    [ "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 ],
+    [ "DNS_LOCAL_HOSTLIST_IS_DYNAMIC", "group__lwip__opts__dns.html#ga8235a5fb0a1c1cceeee670cf95612ba8", null ],
+    [ "DNS_MAX_NAME_LENGTH", "group__lwip__opts__dns.html#ga3b01c79902063c170ef57deb72f56124", null ],
+    [ "DNS_MAX_RETRIES", "group__lwip__opts__dns.html#gaab73c241189335435f3f662aa6a00dba", null ],
+    [ "DNS_MAX_SERVERS", "group__lwip__opts__dns.html#ga9f9881c887a8aceb9765820c2dbdf292", null ],
+    [ "DNS_TABLE_SIZE", "group__lwip__opts__dns.html#ga2384e76c1acdf969d883f3de08d340f7", null ],
+    [ "ETH_PAD_SIZE", "group__lwip__opts__arp.html#gad7fa3b356ca7e603e848b069c4cc6276", null ],
+    [ "ETHARP_DEBUG", "group__lwip__opts__debugmsg.html#gabff5d1e0b334f5b45bd2b8bbb675411e", null ],
+    [ "ETHARP_STATS", "group__lwip__opts__stats.html#ga3a8359abf4fff8ffdc449e5007f93275", null ],
+    [ "ETHARP_SUPPORT_STATIC_ENTRIES", "group__lwip__opts__arp.html#ga4675829464156f3d665f4de171c212d7", null ],
+    [ "ETHARP_SUPPORT_VLAN", "group__lwip__opts__arp.html#ga70ce0ecf56cf5fab000134e66d863f90", null ],
+    [ "ETHARP_TABLE_MATCH_NETIF", "group__lwip__opts__arp.html#ga2f762eee309a545650f80fc8dcc19084", null ],
+    [ "ICMP6_STATS", "group__lwip__opts__stats.html#ga714006cd5c5b0eb333159d0f677616a0", null ],
+    [ "ICMP_DEBUG", "group__lwip__opts__debugmsg.html#ga9595904a1cb9bfe0b9b1d958abdc923a", null ],
+    [ "ICMP_STATS", "group__lwip__opts__stats.html#ga472ad3f6da741f5b287d66ad3051242b", null ],
+    [ "ICMP_TTL", "group__lwip__opts__icmp.html#gae1533f2bc39a5843989909555f6ce0cf", null ],
+    [ "IGMP_DEBUG", "group__lwip__opts__debugmsg.html#ga8da07508ee75704362d45eee3eb857fa", null ],
+    [ "IGMP_STATS", "group__lwip__opts__stats.html#ga4d12af1356b9fd60717984be51e27740", null ],
+    [ "INET_DEBUG", "group__lwip__opts__debugmsg.html#ga78140cbe70258a65cb5c9e381843e4f3", null ],
+    [ "IP6_DEBUG", "group__lwip__opts__debugmsg.html#gac2f9726756b78d4d7c425b0422a776ce", null ],
+    [ "IP6_FRAG_STATS", "group__lwip__opts__stats.html#gaaa08a181c11ff8b471549e8f52c9939b", null ],
+    [ "IP6_STATS", "group__lwip__opts__stats.html#ga6a211b787c97bce3af4273b29c95d9c2", null ],
+    [ "IP_DEBUG", "group__lwip__opts__debugmsg.html#ga5d3348778951e7bc5cd397c6575eef3a", null ],
+    [ "IP_DEFAULT_TTL", "group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411", null ],
+    [ "IP_FORWARD", "group__lwip__opts__ipv4.html#ga881d32ff5ee02af01f758953f1b51d59", null ],
+    [ "IP_FORWARD_ALLOW_TX_ON_RX_NETIF", "group__lwip__opts__ipv4.html#ga9e761df07c4e93901858741d4771dbc7", null ],
+    [ "IP_FRAG", "group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4", null ],
+    [ "IP_OPTIONS_ALLOWED", "group__lwip__opts__ipv4.html#gaa956b0167c37a2265b55e2d0204a3933", null ],
+    [ "IP_REASS_DEBUG", "group__lwip__opts__debugmsg.html#ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33", null ],
+    [ "IP_REASS_MAX_PBUFS", "group__lwip__opts__ipv4.html#ga29084a46d7d4be30e8029d356bca0394", null ],
+    [ "IP_REASS_MAXAGE", "group__lwip__opts__ipv4.html#gad41122bd0b5485a18a4415c8f953727b", null ],
+    [ "IP_REASSEMBLY", "group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69", null ],
+    [ "IP_SOF_BROADCAST", "group__lwip__opts__ipv4.html#ga0b2c993fd940f5774108298933310384", null ],
+    [ "IP_SOF_BROADCAST_RECV", "group__lwip__opts__ipv4.html#ga0f1fbf42d3344bf87cd056d48ddca3db", null ],
+    [ "IP_STATS", "group__lwip__opts__stats.html#gaf50575a4895e26ea2c01d1f2269487be", null ],
+    [ "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_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 ],
+    [ "LWIP_ARP", "group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87", null ],
+    [ "LWIP_ASSERT_CORE_LOCKED", "group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75", null ],
+    [ "LWIP_AUTOIP", "group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069", null ],
+    [ "LWIP_BROADCAST_PING", "group__lwip__opts__icmp.html#ga8088cb56d1a84fe554b11bc15d84b2b9", null ],
+    [ "LWIP_CHECKSUM_CTRL_PER_NETIF", "group__lwip__opts__checksum.html#ga3ecc5246a0c6ca5aed56c2d7899c1004", null ],
+    [ "LWIP_CHECKSUM_ON_COPY", "group__lwip__opts__checksum.html#ga9f60183f0442bdbeefd6b395c6647613", null ],
+    [ "LWIP_COMPAT_SOCKETS", "group__lwip__opts__socket.html#gafed2811f031822ec5afa1ee211fb7447", null ],
+    [ "LWIP_DBG_MIN_LEVEL", "group__lwip__opts__debugmsg.html#ga2043f599515774f8e571ba185dbcb9e7", null ],
+    [ "LWIP_DBG_TYPES_ON", "group__lwip__opts__debugmsg.html#gac095d0e53f5eb5b326b2cccfd071d93d", null ],
+    [ "LWIP_DHCP", "group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9", null ],
+    [ "LWIP_DHCP6_GET_NTP_SRV", "group__lwip__opts__dhcpv6.html#ga5d08f76a7472daa7bcfe17343243bd77", null ],
+    [ "LWIP_DHCP6_MAX_DNS_SERVERS", "group__lwip__opts__dhcpv6.html#ga92c3bc242ad20a5f398c45d332864a29", null ],
+    [ "LWIP_DHCP6_MAX_NTP_SERVERS", "group__lwip__opts__dhcpv6.html#gaf3ac8e15d7a67429a02bc2317e16bcfe", null ],
+    [ "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_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 ],
+    [ "LWIP_DNS", "group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646", null ],
+    [ "LWIP_DNS_SECURE", "group__lwip__opts__dns.html#ga8979c30dfbfde609d5139f80aabdfcc5", null ],
+    [ "LWIP_DNS_SUPPORT_MDNS_QUERIES", "group__lwip__opts__dns.html#gafcbde5706a70ace562bd1f7d2d6f77cb", null ],
+    [ "LWIP_ETHERNET", "group__lwip__opts__arp.html#ga30e02dc217cc2995d0fd241d510c904f", null ],
+    [ "LWIP_EVENT_API", "group__lwip__opts__tcp.html#ga39f76e811117155be8525bb386ecddb7", null ],
+    [ "LWIP_FIONREAD_LINUXMODE", "group__lwip__opts__socket.html#ga0543eea2abe390d0bdc843c33debd762", null ],
+    [ "LWIP_HAVE_LOOPIF", "group__lwip__opts__loop.html#gaa2b1f736373cd896e212644aa453fbaf", null ],
+    [ "LWIP_HOOK_DHCP6_APPEND_OPTIONS", "group__lwip__opts__hooks.html#ga4068b3313e32f711ba016215fc2c886a", null ],
+    [ "LWIP_HOOK_DHCP_APPEND_OPTIONS", "group__lwip__opts__hooks.html#ga40e6c9aba06e66e5df1b4ca18329f9b4", null ],
+    [ "LWIP_HOOK_DHCP_PARSE_OPTION", "group__lwip__opts__hooks.html#gafbbbc574863c0f88988936bd1434f2d2", null ],
+    [ "LWIP_HOOK_ETHARP_GET_GW", "group__lwip__opts__hooks.html#ga2b76f127325fd5ca8b80077a4b6160b1", null ],
+    [ "LWIP_HOOK_FILENAME", "group__lwip__opts__hooks.html#ga11ac9d637cb6afc0a32e8da7f51d0c0d", null ],
+    [ "LWIP_HOOK_IP4_CANFORWARD", "group__lwip__opts__hooks.html#gaed848a98dbb5c8856a27e379986ea70d", null ],
+    [ "LWIP_HOOK_IP4_INPUT", "group__lwip__opts__hooks.html#ga9124237c28e2f18f3b28d5be09e9ccb6", null ],
+    [ "LWIP_HOOK_IP4_ROUTE", "group__lwip__opts__hooks.html#ga5d1061ad722a73012a28dbaf0f169b70", null ],
+    [ "LWIP_HOOK_IP4_ROUTE_SRC", "group__lwip__opts__hooks.html#gaa410d9cbe1d4fa4c8a7f49af7b501024", null ],
+    [ "LWIP_HOOK_IP6_INPUT", "group__lwip__opts__hooks.html#gaccbdd3d0250f7176dcd799ca06007f20", null ],
+    [ "LWIP_HOOK_IP6_ROUTE", "group__lwip__opts__hooks.html#ga8245a4bc7ffb172e3bf32276f9d126ce", null ],
+    [ "LWIP_HOOK_MEMP_AVAILABLE", "group__lwip__opts__hooks.html#ga13e90672158221b40f8b12bf9d8b721f", null ],
+    [ "LWIP_HOOK_ND6_GET_GW", "group__lwip__opts__hooks.html#ga287544c3d74bc2a2d645bddbbc4fbdd0", null ],
+    [ "LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE", "group__lwip__opts__hooks.html#gae35e4b7374868dc748b12dedb8f807e5", null ],
+    [ "LWIP_HOOK_SOCKETS_GETSOCKOPT", "group__lwip__opts__hooks.html#gabdaeb09ac9f441934e21a087544a1af1", null ],
+    [ "LWIP_HOOK_SOCKETS_SETSOCKOPT", "group__lwip__opts__hooks.html#ga14ea9210c09da4dd33bc85bd8a01b48a", null ],
+    [ "LWIP_HOOK_TCP_INPACKET_PCB", "group__lwip__opts__hooks.html#gabed8b1cda4aba2d108fa62cdd74895a2", null ],
+    [ "LWIP_HOOK_TCP_ISN", "group__lwip__opts__hooks.html#ga078d203053911cf3af178392700386a4", null ],
+    [ "LWIP_HOOK_TCP_OUT_ADD_TCPOPTS", "group__lwip__opts__hooks.html#ga0ef31b749307b63c06633645d4de21f0", null ],
+    [ "LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH", "group__lwip__opts__hooks.html#ga31c0694abe4eedf3ff039b7073c2293f", null ],
+    [ "LWIP_HOOK_UNKNOWN_ETH_PROTOCOL", "group__lwip__opts__hooks.html#ga6cc92f5101dd7a0420e18e1f2101abf4", null ],
+    [ "LWIP_HOOK_VLAN_CHECK", "group__lwip__opts__hooks.html#ga2f020543772368f8f4355f50f24c86a9", null ],
+    [ "LWIP_HOOK_VLAN_SET", "group__lwip__opts__hooks.html#ga2b6e450b4934b95df9b9a9d2b9a4d57e", null ],
+    [ "LWIP_ICMP", "group__lwip__opts__icmp.html#gae4d45345c3ab8e5a355fda1d8d24fca6", null ],
+    [ "LWIP_ICMP6", "group__lwip__opts__icmp6.html#ga65ac8bcbad242cba3a2b557e1574b21f", null ],
+    [ "LWIP_ICMP6_DATASIZE", "group__lwip__opts__icmp6.html#gaa88c55e37e5d7b865b91a9399313bbbf", null ],
+    [ "LWIP_ICMP6_HL", "group__lwip__opts__icmp6.html#ga82193577b4045e1ac1533c4341a2bd79", null ],
+    [ "LWIP_IGMP", "group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923", null ],
+    [ "LWIP_IPV4", "group__lwip__opts__ipv4.html#ga429e811a80ebb5157e14a854870c4410", null ],
+    [ "LWIP_IPV6", "group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f", null ],
+    [ "LWIP_IPV6_ADDRESS_LIFETIMES", "group__lwip__opts__ipv6.html#ga2c0127fca1073ad3f0a1e53f00ea8858", null ],
+    [ "LWIP_IPV6_AUTOCONFIG", "group__lwip__opts__ipv6.html#ga580039bf2baf49fcb9e504e5d2b40a03", null ],
+    [ "LWIP_IPV6_DHCP6", "group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6", null ],
+    [ "LWIP_IPV6_DHCP6_STATEFUL", "group__lwip__opts__dhcpv6.html#ga3fc9dbe8feae61621cac4952ac28e155", null ],
+    [ "LWIP_IPV6_DHCP6_STATELESS", "group__lwip__opts__dhcpv6.html#ga8d6bab14d580d2136430319aab6d7930", null ],
+    [ "LWIP_IPV6_DUP_DETECT_ATTEMPTS", "group__lwip__opts__ipv6.html#gad8489522d34f37e42b4001bab3781bcb", null ],
+    [ "LWIP_IPV6_FORWARD", "group__lwip__opts__ipv6.html#gac96c5802de6c75dd62ab38cff6d16a32", null ],
+    [ "LWIP_IPV6_FRAG", "group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3", null ],
+    [ "LWIP_IPV6_MLD", "group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528", null ],
+    [ "LWIP_IPV6_NUM_ADDRESSES", "group__lwip__opts__ipv6.html#ga16c1b672604bfb0a66a6aeeb854589d3", null ],
+    [ "LWIP_IPV6_REASS", "group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864", null ],
+    [ "LWIP_IPV6_SCOPES", "group__lwip__opts__ipv6.html#ga91d1e630059df3b3a296e2b6ff7aead5", null ],
+    [ "LWIP_IPV6_SCOPES_DEBUG", "group__lwip__opts__ipv6.html#ga623ef29d27d98fb7be8732730a5ddf4b", null ],
+    [ "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 ],
+    [ "LWIP_MULTICAST_TX_OPTIONS", "group__lwip__opts__multicast.html#gab8d7d53247cc62caa76f54b2c5a5df30", null ],
+    [ "LWIP_ND6_ALLOW_RA_UPDATES", "group__lwip__opts__nd6.html#gad35d10353ac7c7d2c8d4b83788cdc6d9", null ],
+    [ "LWIP_ND6_DELAY_FIRST_PROBE_TIME", "group__lwip__opts__nd6.html#ga315bd6d4a9d185766dfc3253cd9d7715", null ],
+    [ "LWIP_ND6_MAX_ANYCAST_DELAY_TIME", "group__lwip__opts__nd6.html#ga960b8973df083fad53ae0eaa79f8c4df", null ],
+    [ "LWIP_ND6_MAX_MULTICAST_SOLICIT", "group__lwip__opts__nd6.html#ga980909018aed54adc10dd68be3572b30", null ],
+    [ "LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT", "group__lwip__opts__nd6.html#ga86ab0cac87cdc7aeff09384ddbaaba2a", null ],
+    [ "LWIP_ND6_MAX_UNICAST_SOLICIT", "group__lwip__opts__nd6.html#gafa6f4c2d2c259ab0895fa03a6f08c691", null ],
+    [ "LWIP_ND6_NUM_DESTINATIONS", "group__lwip__opts__nd6.html#gacad118b1ae886e80137a1d4f0fb19672", null ],
+    [ "LWIP_ND6_NUM_NEIGHBORS", "group__lwip__opts__nd6.html#gab2fe15bdb4e0a41f295eb5577b11ad16", null ],
+    [ "LWIP_ND6_NUM_PREFIXES", "group__lwip__opts__nd6.html#gad9cc576b5951f1b5e1c2b0d0bb831d9a", null ],
+    [ "LWIP_ND6_NUM_ROUTERS", "group__lwip__opts__nd6.html#ga75e81a96148f266c8fad8c0bcab2f36a", null ],
+    [ "LWIP_ND6_QUEUEING", "group__lwip__opts__nd6.html#ga0757a3c1b5d1563ad2d77228e1d8a60f", null ],
+    [ "LWIP_ND6_RDNSS_MAX_DNS_SERVERS", "group__lwip__opts__nd6.html#gaea4d829c0b52cc6cc28925eee89a7429", null ],
+    [ "LWIP_ND6_REACHABLE_TIME", "group__lwip__opts__nd6.html#ga269db9d61cdfc2fd3bc7b12c56261c74", null ],
+    [ "LWIP_ND6_RETRANS_TIMER", "group__lwip__opts__nd6.html#ga461abcbeef1d236d1f3201827dd28ad9", null ],
+    [ "LWIP_ND6_TCP_REACHABILITY_HINTS", "group__lwip__opts__nd6.html#ga9d7cb6fd447ef0f6726f565e2c7509c4", null ],
+    [ "LWIP_NETBUF_RECVINFO", "group__lwip__opts__udp.html#ga72021505969c5ce29e972486d7794baa", null ],
+    [ "LWIP_NETCONN", "group__lwip__opts__netconn.html#ga478041b8544461258f6961bf0f3c1a77", null ],
+    [ "LWIP_NETCONN_FULLDUPLEX", "group__lwip__opts__netconn.html#ga7bfe8487a3abffdd9d6730977d22c406", null ],
+    [ "LWIP_NETCONN_SEM_PER_THREAD", "group__lwip__opts__netconn.html#ga2543345adf7d2c307df78a54ac2ba8c4", null ],
+    [ "LWIP_NETIF_API", "group__lwip__opts__netif.html#gadd45fb65f2d0e6de5a0d14ff9e101b77", null ],
+    [ "LWIP_NETIF_EXT_STATUS_CALLBACK", "group__lwip__opts__netif.html#ga090482867ba04d442ab5b8ad745c0e1e", null ],
+    [ "LWIP_NETIF_HOSTNAME", "group__lwip__opts__netif.html#gaa714dbfa66822ec4c6111bdb8cf753c1", null ],
+    [ "LWIP_NETIF_HWADDRHINT", "group__lwip__opts__netif.html#gad1d5e878d94b56ba687cef69be936ad9", null ],
+    [ "LWIP_NETIF_LINK_CALLBACK", "group__lwip__opts__netif.html#ga1a446932dd927cc4136ba654c13bb97b", null ],
+    [ "LWIP_NETIF_LOOPBACK", "group__lwip__opts__loop.html#ga724a0ea765d5a47d026d529725f31c01", null ],
+    [ "LWIP_NETIF_LOOPBACK_MULTITHREADING", "group__lwip__opts__loop.html#gaa28d13ddd5281b1912276991e7ea58c5", null ],
+    [ "LWIP_NETIF_REMOVE_CALLBACK", "group__lwip__opts__netif.html#ga9c942c2e9655b06d4f73c630d30f60bf", null ],
+    [ "LWIP_NETIF_STATUS_CALLBACK", "group__lwip__opts__netif.html#gaffb97d89516c38d3fcb9e44e5d707f36", null ],
+    [ "LWIP_NETIF_TX_SINGLE_PBUF", "group__lwip__opts__netif.html#gabafb9f64a80e51b56c0abbcfc1f7e04e", null ],
+    [ "LWIP_NUM_NETIF_CLIENT_DATA", "group__lwip__opts__netif.html#ga94a35212616f9a9aae5c98741612b936", null ],
+    [ "LWIP_NUM_SYS_TIMEOUT_INTERNAL", "group__lwip__opts__memp.html#ga87a05debb46ff82093d0e6dc1aad8804", null ],
+    [ "LWIP_PBUF_REF_T", "group__lwip__opts__pbuf.html#gaaefb80d6bf9257c0f4322c36e1272c38", null ],
+    [ "LWIP_PERF", "group__lwip__opts__perf.html#ga44acd95b33e2d58a74455279721298de", null ],
+    [ "LWIP_POSIX_SOCKETS_IO_NAMES", "group__lwip__opts__socket.html#ga484c38ab08f60d5b3335d23d31f9a402", null ],
+    [ "LWIP_RAW", "group__lwip__opts__raw.html#gaca452be5cb05d9666f8f57e582c39221", null ],
+    [ "LWIP_SINGLE_NETIF", "group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be", null ],
+    [ "LWIP_SO_LINGER", "group__lwip__opts__socket.html#gaa91292d5d014dc1c6f1c1f4166269a1d", null ],
+    [ "LWIP_SO_RCVBUF", "group__lwip__opts__socket.html#ga06390cebcf4d13d3d47a11365e5fcd28", null ],
+    [ "LWIP_SO_RCVTIMEO", "group__lwip__opts__socket.html#ga91af3ade95b20b9a60c65ed0380fa0ed", null ],
+    [ "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_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 ],
+    [ "LWIP_STATS", "group__lwip__opts__stats.html#ga542b58734cc01902c5e099f6efdc5f1b", null ],
+    [ "LWIP_STATS_DISPLAY", "group__lwip__opts__stats.html#gacdc38ed58d1900b5d3d109a65be1c3d1", null ],
+    [ "LWIP_TCP", "group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9", null ],
+    [ "LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT", "group__lwip__opts__socket.html#ga3e7498d5d2921f0df3792de72f384d36", null ],
+    [ "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_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 ],
+    [ "LWIP_TCPIP_CORE_LOCKING_INPUT", "group__lwip__opts__lock.html#ga351beb1c06affe49e717bc9f76c66acf", null ],
+    [ "LWIP_TCPIP_THREAD_ALIVE", "group__lwip__opts__thread.html#ga8b99d75d9e0a0868567d10c8522915bb", null ],
+    [ "LWIP_TCPIP_TIMEOUT", "group__lwip__opts__netconn.html#ga1cd8d15a42262a0defaedabed126ea99", null ],
+    [ "LWIP_TIMERS", "group__lwip__opts__timers.html#ga25a41610055f91cbd0960256240b8f2c", null ],
+    [ "LWIP_TIMERS_CUSTOM", "group__lwip__opts__timers.html#gaff0ea56f3e3d8e86c49b50557bc13815", null ],
+    [ "LWIP_UDP", "group__lwip__opts__udp.html#gab6030e96e72df649d2650fd32d7a67b3", null ],
+    [ "LWIP_UDPLITE", "group__lwip__opts__udp.html#ga35731bc5f337943e474a15c1cd538a61", null ],
+    [ "LWIP_WND_SCALE", "group__lwip__opts__tcp.html#ga88dbbfeeeb41b129fdc8235fc08bb530", null ],
+    [ "MEM_ALIGNMENT", "group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7", null ],
+    [ "MEM_DEBUG", "group__lwip__opts__debugmsg.html#ga2d7bc380695eeedb1af50c3808613afe", null ],
+    [ "MEM_LIBC_MALLOC", "group__lwip__opts__mem.html#ga4ef345cc270912bd2230b1c5ec51dfc8", null ],
+    [ "MEM_OVERFLOW_CHECK", "group__lwip__opts__mem.html#gae331a198bd06100b90ea020cd5f07f4e", null ],
+    [ "MEM_SANITY_CHECK", "group__lwip__opts__mem.html#ga90b17afabb93986a162c327ed30bb4d3", null ],
+    [ "MEM_SIZE", "group__lwip__opts__mem.html#ga2dcf8c45f945dd0c4301a94700f2112c", null ],
+    [ "MEM_STATS", "group__lwip__opts__stats.html#ga61ec04a08c4fde690d10819e582656a7", null ],
+    [ "MEM_USE_POOLS", "group__lwip__opts__mem.html#gaddca3141bc7037241769eb152b6f89ba", null ],
+    [ "MEM_USE_POOLS_TRY_BIGGER_POOL", "group__lwip__opts__mem.html#gaba8be68e8fd0716b723ce4569ed89f82", null ],
+    [ "MEMCPY", "group__lwip__opts__memcpy.html#gaa1dd57a66b6de8c0593e9e3e8d1411f6", null ],
+    [ "MEMMOVE", "group__lwip__opts__memcpy.html#ga0e00bb235da5557fcbc049f732503863", null ],
+    [ "MEMP_DEBUG", "group__lwip__opts__debugmsg.html#gad80231923f7a808d49eba5ec57d63616", null ],
+    [ "MEMP_MEM_INIT", "group__lwip__opts__mem.html#gaa2f25586972d1cbc1ff0dcdc6f15a1b0", null ],
+    [ "MEMP_MEM_MALLOC", "group__lwip__opts__mem.html#gae93af697d27bbcefa6a28052d90f2f38", null ],
+    [ "MEMP_NUM_ALTCP_PCB", "group__lwip__opts__memp.html#ga24f6737ee990990b81b0d16ef6e0dffd", null ],
+    [ "MEMP_NUM_API_MSG", "group__lwip__opts__memp.html#ga5a95abf3610c56e7c23cb035eb9c3444", null ],
+    [ "MEMP_NUM_ARP_QUEUE", "group__lwip__opts__memp.html#ga087b00ea20a7edebcad33a1a1353a5d7", null ],
+    [ "MEMP_NUM_DNS_API_MSG", "group__lwip__opts__memp.html#ga3b1f228c598529c62895ad04ff294980", null ],
+    [ "MEMP_NUM_FRAG_PBUF", "group__lwip__opts__memp.html#ga1f66051a654dcd7a4e19bc6aff240630", null ],
+    [ "MEMP_NUM_IGMP_GROUP", "group__lwip__opts__memp.html#gab648ff95d8ffa4216b95f82a568a5d9a", null ],
+    [ "MEMP_NUM_LOCALHOSTLIST", "group__lwip__opts__memp.html#gaa9b0f949da12cbe8fe5f7aefc30290e0", null ],
+    [ "MEMP_NUM_MLD6_GROUP", "group__lwip__opts__mld6.html#ga89e92d8de8898696e797f13fdd169494", null ],
+    [ "MEMP_NUM_ND6_QUEUE", "group__lwip__opts__nd6.html#gabfaf3d92d51e2a9d70c8360af2611fb2", null ],
+    [ "MEMP_NUM_NETBUF", "group__lwip__opts__memp.html#ga5d99df65869ac101ed6a611fc85016be", null ],
+    [ "MEMP_NUM_NETCONN", "group__lwip__opts__memp.html#gacb40bd726b7e15593b20a628d298f456", null ],
+    [ "MEMP_NUM_NETDB", "group__lwip__opts__memp.html#ga293bc22b60bf3f8e2520f60a88370e7a", null ],
+    [ "MEMP_NUM_NETIFAPI_MSG", "group__lwip__opts__memp.html#gadd5a973b98068ce9318ea2f96b5fa14c", null ],
+    [ "MEMP_NUM_PBUF", "group__lwip__opts__memp.html#ga92b30aed958ec59334d936d4ca725418", null ],
+    [ "MEMP_NUM_RAW_PCB", "group__lwip__opts__memp.html#ga379bf92ed322cda54cb701337421e0d3", null ],
+    [ "MEMP_NUM_REASSDATA", "group__lwip__opts__memp.html#ga169436c5860253b90e25bdba9fdcac86", null ],
+    [ "MEMP_NUM_SELECT_CB", "group__lwip__opts__memp.html#ga8e136f5811e6652c6c5d2fcf596f0893", null ],
+    [ "MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA", "group__lwip__opts__memp.html#gacf9782dd26bf8a655044dc041a9de948", null ],
+    [ "MEMP_NUM_SYS_TIMEOUT", "group__lwip__opts__memp.html#ga4afbdca581a58d57bc7a81118a95327e", null ],
+    [ "MEMP_NUM_TCP_PCB", "group__lwip__opts__memp.html#ga73beecc19cfbc3114768f9b32b2cd70e", null ],
+    [ "MEMP_NUM_TCP_PCB_LISTEN", "group__lwip__opts__memp.html#ga04fba6a249123513271dccb4ec26aa5a", null ],
+    [ "MEMP_NUM_TCP_SEG", "group__lwip__opts__memp.html#gaa35fb3a1a76661e3ffb9722a57092de3", null ],
+    [ "MEMP_NUM_TCPIP_MSG_API", "group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c", null ],
+    [ "MEMP_NUM_TCPIP_MSG_INPKT", "group__lwip__opts__memp.html#gab089a7088439e726c3801ba9e249d831", null ],
+    [ "MEMP_NUM_UDP_PCB", "group__lwip__opts__memp.html#ga2c416da481ab09bd1ba257b75a0707eb", null ],
+    [ "MEMP_OVERFLOW_CHECK", "group__lwip__opts__mem.html#ga27fdd01194a42fc41a7716b72cdb49e3", null ],
+    [ "MEMP_SANITY_CHECK", "group__lwip__opts__mem.html#ga0838947193e222a9f46b582e01e5beff", null ],
+    [ "MEMP_STATS", "group__lwip__opts__stats.html#gab8c2430be0e567a7499a95454aaa6041", null ],
+    [ "MEMP_USE_CUSTOM_POOLS", "group__lwip__opts__mem.html#ga69de593b8ffd4f1c249f03e48e11983b", null ],
+    [ "MIB2_STATS", "group__lwip__opts__stats.html#ga5b01047eeb149a0b0ffe33d760d8370f", null ],
+    [ "MLD6_STATS", "group__lwip__opts__stats.html#gaf263df10b63b38201cae3d2dd5fb0b9e", null ],
+    [ "ND6_STATS", "group__lwip__opts__stats.html#ga753161114df60299a28d51c092c756cf", null ],
+    [ "NETIF_DEBUG", "group__lwip__opts__debugmsg.html#ga2dfad02b075a7f9a8791a66fe40864a4", null ],
+    [ "NO_SYS", "group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b", null ],
+    [ "PBUF_DEBUG", "group__lwip__opts__debugmsg.html#ga5c3d44a0ec3bb8bd66f776c70d5c6a6c", null ],
+    [ "PBUF_LINK_ENCAPSULATION_HLEN", "group__lwip__opts__pbuf.html#ga6e1ba1875ae5168a17b53d83597bc1de", null ],
+    [ "PBUF_LINK_HLEN", "group__lwip__opts__pbuf.html#ga35998a3d56af9940e6a80bb372597685", null ],
+    [ "PBUF_POOL_BUFSIZE", "group__lwip__opts__pbuf.html#gae61f4491d56e805e79b79eb5d35a00e5", null ],
+    [ "PBUF_POOL_SIZE", "group__lwip__opts__memp.html#ga50eaadc4cad0716410332691e382c38a", null ],
+    [ "RAW_DEBUG", "group__lwip__opts__debugmsg.html#gaf0551bef83c0fc1baa57cf339d220e25", null ],
+    [ "RAW_TTL", "group__lwip__opts__raw.html#ga36e3ffa66073ca0d27d11c422778249c", null ],
+    [ "RECV_BUFSIZE_DEFAULT", "group__lwip__opts__socket.html#ga5dbd0a61f30ae6c6bfbda635095f138d", null ],
+    [ "SLIP_DEBUG", "group__lwip__opts__debugmsg.html#gab986f95183559d8678c6d80969b01857", null ],
+    [ "SLIPIF_THREAD_NAME", "group__lwip__opts__thread.html#gae9cd260c56472324a2f0ee5f9597a675", null ],
+    [ "SLIPIF_THREAD_PRIO", "group__lwip__opts__thread.html#gab1b9fc2efcbf1f804bfd0191bc019c4e", null ],
+    [ "SLIPIF_THREAD_STACKSIZE", "group__lwip__opts__thread.html#gae8ab54a25007ce997bbab6289815e258", null ],
+    [ "SMEMCPY", "group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec", null ],
+    [ "SO_REUSE", "group__lwip__opts__socket.html#gaf3822feed320cf8439b083ee525e4942", null ],
+    [ "SO_REUSE_RXTOALL", "group__lwip__opts__socket.html#gae9395d83af89002343e5782130f52f44", null ],
+    [ "SOCKETS_DEBUG", "group__lwip__opts__debugmsg.html#ga509594f3ba7d8b1356628b50b55a0934", null ],
+    [ "SYS_DEBUG", "group__lwip__opts__debugmsg.html#ga2960ae20008f05da8cc0714f36365642", null ],
+    [ "SYS_LIGHTWEIGHT_PROT", "group__lwip__opts__lock.html#gae85efb3a5fcf8585c94b3c2669978959", null ],
+    [ "SYS_STATS", "group__lwip__opts__stats.html#ga0173549afa76553583e5a02c6a791218", null ],
+    [ "TCP_CALCULATE_EFF_SEND_MSS", "group__lwip__opts__tcp.html#gac04b84d32251ac558f0c3a8af85ba3a5", null ],
+    [ "TCP_CWND_DEBUG", "group__lwip__opts__debugmsg.html#ga66df03d8192cd978d3321a9d68bf5411", null ],
+    [ "TCP_DEBUG", "group__lwip__opts__debugmsg.html#ga4f43bb8a430c7a52a1ad5086d3f2803c", null ],
+    [ "TCP_DEFAULT_LISTEN_BACKLOG", "group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf", null ],
+    [ "TCP_FR_DEBUG", "group__lwip__opts__debugmsg.html#ga5895bee26e8e1a0b89d597e0f2580b23", null ],
+    [ "TCP_INPUT_DEBUG", "group__lwip__opts__debugmsg.html#gaf51dc2563536de56470146749f715ba8", null ],
+    [ "TCP_LISTEN_BACKLOG", "group__lwip__opts__tcp.html#ga98b23e7cbd3281915c50a485cb61899d", null ],
+    [ "TCP_MAXRTX", "group__lwip__opts__tcp.html#ga0dee0911197855bdf19ef79778c241a6", null ],
+    [ "TCP_MSS", "group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b", null ],
+    [ "TCP_OOSEQ_MAX_BYTES", "group__lwip__opts__tcp.html#ga9d6d3219bb5fc0bc760a64114de13c25", null ],
+    [ "TCP_OOSEQ_MAX_PBUFS", "group__lwip__opts__tcp.html#ga1f57d3859c4556f785708e5dc440617e", null ],
+    [ "TCP_OUTPUT_DEBUG", "group__lwip__opts__debugmsg.html#ga9f70601fdc1feee490772bf7fcdb74fb", null ],
+    [ "TCP_OVERSIZE", "group__lwip__opts__tcp.html#ga5648e2580bb55c0efdfbebcf3bad1eef", null ],
+    [ "TCP_QLEN_DEBUG", "group__lwip__opts__debugmsg.html#gae7980c7f8eb45cd411bf410ff0a3fc55", null ],
+    [ "TCP_QUEUE_OOSEQ", "group__lwip__opts__tcp.html#ga89ffd0d7d1529bdb26bfbad267d0ad75", null ],
+    [ "TCP_RST_DEBUG", "group__lwip__opts__debugmsg.html#ga37596f7bbb9b7663826244ba54486679", null ],
+    [ "TCP_RTO_DEBUG", "group__lwip__opts__debugmsg.html#gad6e52e37415d0d0cbe4931a28f5a9662", null ],
+    [ "TCP_SND_BUF", "group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd", null ],
+    [ "TCP_SND_QUEUELEN", "group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904", null ],
+    [ "TCP_SNDLOWAT", "group__lwip__opts__tcp.html#gae5c9866d7cd463ac7b36792182145aec", null ],
+    [ "TCP_SNDQUEUELOWAT", "group__lwip__opts__tcp.html#ga75659867592a6b01c198532ed1b65698", null ],
+    [ "TCP_STATS", "group__lwip__opts__stats.html#gaa02ec5c5bc0edebe418680c54d044f58", null ],
+    [ "TCP_SYNMAXRTX", "group__lwip__opts__tcp.html#ga50b434a8541a4813f7b27f576c05d1b6", null ],
+    [ "TCP_TTL", "group__lwip__opts__tcp.html#gacd5b25ea81d2894790d25da5393cdab4", null ],
+    [ "TCP_WND", "group__lwip__opts__tcp.html#ga7f535a6efb5cdf86c3210e35ece1d6a7", null ],
+    [ "TCP_WND_DEBUG", "group__lwip__opts__debugmsg.html#ga3704f433e947d6342da77c74e33627e1", null ],
+    [ "TCP_WND_UPDATE_THRESHOLD", "group__lwip__opts__tcp.html#ga5d45732ba3a8438b141096d86e07ef8d", null ],
+    [ "TCPIP_DEBUG", "group__lwip__opts__debugmsg.html#ga52d6c83451936c3de3b0338d4a3f921f", null ],
+    [ "TCPIP_MBOX_SIZE", "group__lwip__opts__thread.html#ga8cf210ad4e4bf616860a45fbd140fd06", null ],
+    [ "TCPIP_THREAD_NAME", "group__lwip__opts__thread.html#ga405e604e4328e1feb878c6fe1798a587", null ],
+    [ "TCPIP_THREAD_PRIO", "group__lwip__opts__thread.html#ga42b2c7a3042d7c3efd00f367f5837435", null ],
+    [ "TCPIP_THREAD_STACKSIZE", "group__lwip__opts__thread.html#gaa02b84eafa0c8b09b158b97c96d79db0", null ],
+    [ "TIMERS_DEBUG", "group__lwip__opts__debugmsg.html#ga24a6644ba9cc82665a7bf209b3870c15", null ],
+    [ "UDP_DEBUG", "group__lwip__opts__debugmsg.html#ga0393f312c5475a1c649b39ef9cfcaad4", null ],
+    [ "UDP_STATS", "group__lwip__opts__stats.html#gaef64b11bf71f0d6d5bafaf6092462276", null ],
+    [ "UDP_TTL", "group__lwip__opts__udp.html#ga97908a317bcba89174b5d1ccbdca0096", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/optimization.html b/doc/doxygen/output/html/optimization.html
new file mode 100644
index 0000000..13b6615
--- /dev/null
+++ b/doc/doxygen/output/html/optimization.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Optimization hints</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('optimization.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">Optimization hints </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>The first thing you want to optimize is the lwip_standard_checksum() routine from src/core/inet.c. You can override this standard function with the #define LWIP_CHKSUM your_checksum_routine().</p>
+<p>There are C examples given in inet.c or you might want to craft an assembly function for this. RFC1071 is a good introduction to this subject.</p>
+<p>Other significant improvements can be made by supplying assembly or inline replacements for htons() and htonl() if you're using a little-endian architecture. #define lwip_htons(x) your_htons() #define lwip_htonl(x) your_htonl() If you #define them to htons() and htonl(), you should #define LWIP_DONT_PROVIDE_BYTEORDER_FUNCTIONS to prevent lwIP from defining htonx / ntohx compatibility macros.</p>
+<p>Check your network interface driver if it reads at a higher speed than the maximum wire-speed. If the hardware isn't serviced frequently and fast enough buffer overflows are likely to occur.</p>
+<p>E.g. when using the cs8900 driver, call cs8900if_service(ethif) as frequently as possible. When using an RTOS let the cs8900 interrupt wake a high priority task that services your driver using a binary semaphore or event flag. Some drivers might allow additional tuning to match your application and network.</p>
+<p>For a production release it is recommended to set LWIP_STATS to 0. Note that speed performance isn't influenced much by simply setting high values to the memory options. </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="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/pages.html b/doc/doxygen/output/html/pages.html
new file mode 100644
index 0000000..e93060f
--- /dev/null
+++ b/doc/doxygen/output/html/pages.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Related Pages</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('pages.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">Related Pages</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all related documentation pages:</div><div class="directory">
+<table class="directory">
+<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_"><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_"><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="bugs.html" target="_self">Reporting bugs</a></td><td class="desc"></td></tr>
+<tr id="row_5_"><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_6_" class="even"><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_7_"><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_8_" 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_9_"><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 -->
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/pbuf_8c.html b/doc/doxygen/output/html/pbuf_8c.html
new file mode 100644
index 0000000..c24ccca
--- /dev/null
+++ b/doc/doxygen/output/html/pbuf_8c.html
@@ -0,0 +1,483 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/pbuf.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('pbuf_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">pbuf.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 &quot;<a class="el" href="pbuf_8h.html">lwip/pbuf.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.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="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="sys_8h.html">lwip/sys.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="tcp__priv_8h.html">lwip/priv/tcp_priv.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="tcpip_8h.html">lwip/tcpip.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gacfcb0a2af918658ba0afe36499c65f47"><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="group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47">pbuf_alloc</a> (<a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a> layer, u16_t length, <a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a> type)</td></tr>
+<tr class="separator:gacfcb0a2af918658ba0afe36499c65f47"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4caa46c6d560d9d0da2be845bc9c2fab"><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="group__pbuf.html#ga4caa46c6d560d9d0da2be845bc9c2fab">pbuf_alloc_reference</a> (void *payload, u16_t length, <a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a> type)</td></tr>
+<tr class="separator:ga4caa46c6d560d9d0da2be845bc9c2fab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga90fa2bbf6ea4a263ee8f7b77c75683c2"><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="group__pbuf.html#ga90fa2bbf6ea4a263ee8f7b77c75683c2">pbuf_alloced_custom</a> (<a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a> l, u16_t length, <a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a> type, struct <a class="el" href="structpbuf__custom.html">pbuf_custom</a> *p, void *payload_mem, u16_t payload_mem_len)</td></tr>
+<tr class="separator:ga90fa2bbf6ea4a263ee8f7b77c75683c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga50abfe830a33a1a47a562febee66015d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga50abfe830a33a1a47a562febee66015d">pbuf_realloc</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t new_len)</td></tr>
+<tr class="separator:ga50abfe830a33a1a47a562febee66015d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32dc14bd88dcafa25e627ab18e801815"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8c.html#a32dc14bd88dcafa25e627ab18e801815">pbuf_add_header</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, size_t header_size_increment)</td></tr>
+<tr class="separator:a32dc14bd88dcafa25e627ab18e801815"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad4ef8c5fbbd1447db04f8f73923e7dee"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8c.html#ad4ef8c5fbbd1447db04f8f73923e7dee">pbuf_add_header_force</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, size_t header_size_increment)</td></tr>
+<tr class="separator:ad4ef8c5fbbd1447db04f8f73923e7dee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aca0cd8b3f08fbb5e35bc91a663083cc1"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8c.html#aca0cd8b3f08fbb5e35bc91a663083cc1">pbuf_remove_header</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, size_t header_size_decrement)</td></tr>
+<tr class="separator:aca0cd8b3f08fbb5e35bc91a663083cc1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0f81deff4a0e6e8e0ff161a7b9871449"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8c.html#a0f81deff4a0e6e8e0ff161a7b9871449">pbuf_header</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, s16_t header_size_increment)</td></tr>
+<tr class="separator:a0f81deff4a0e6e8e0ff161a7b9871449"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad0e64d6fbc423593461063da97da9ce6"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8c.html#ad0e64d6fbc423593461063da97da9ce6">pbuf_header_force</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, s16_t header_size_increment)</td></tr>
+<tr class="separator:ad0e64d6fbc423593461063da97da9ce6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25a3b8edc783896b03819a966d00845e"><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="pbuf_8c.html#a25a3b8edc783896b03819a966d00845e">pbuf_free_header</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *q, u16_t size)</td></tr>
+<tr class="separator:a25a3b8edc783896b03819a966d00845e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab0dd696fb4b6bc65e548944584f1738b"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf_free</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:gab0dd696fb4b6bc65e548944584f1738b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5df7ac5ae59012fe9aeddba375a72190"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8c.html#a5df7ac5ae59012fe9aeddba375a72190">pbuf_clen</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:a5df7ac5ae59012fe9aeddba375a72190"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga77f6bbd69e45e542014d9c547c7da74e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e">pbuf_ref</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:ga77f6bbd69e45e542014d9c547c7da74e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga82429084fe29015509c9b4a072707cd4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga82429084fe29015509c9b4a072707cd4">pbuf_cat</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *h, struct <a class="el" href="structpbuf.html">pbuf</a> *t)</td></tr>
+<tr class="separator:ga82429084fe29015509c9b4a072707cd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga831c9a72bda1d3bd4c7b96f5a0e3b891"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891">pbuf_chain</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *h, struct <a class="el" href="structpbuf.html">pbuf</a> *t)</td></tr>
+<tr class="separator:ga831c9a72bda1d3bd4c7b96f5a0e3b891"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf3d29c4f43986b4cb5eb314d5b9729d"><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="pbuf_8c.html#abf3d29c4f43986b4cb5eb314d5b9729d">pbuf_dechain</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:abf3d29c4f43986b4cb5eb314d5b9729d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaba88511dee3df4b631fde691f421320d"><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__pbuf.html#gaba88511dee3df4b631fde691f421320d">pbuf_copy</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p_to, const struct <a class="el" href="structpbuf.html">pbuf</a> *p_from)</td></tr>
+<tr class="separator:gaba88511dee3df4b631fde691f421320d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac2f1f58fd36042e82af46f5015720899"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#gac2f1f58fd36042e82af46f5015720899">pbuf_copy_partial</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *buf, void *dataptr, u16_t len, u16_t offset)</td></tr>
+<tr class="separator:gac2f1f58fd36042e82af46f5015720899"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad0357ae0be17b2aacd0c301cdc86fc39"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#gad0357ae0be17b2aacd0c301cdc86fc39">pbuf_get_contiguous</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, void *buffer, size_t bufsize, u16_t len, u16_t offset)</td></tr>
+<tr class="separator:gad0357ae0be17b2aacd0c301cdc86fc39"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6a961522d81f0327aaf4d4ee6d96c583"><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="group__pbuf.html#ga6a961522d81f0327aaf4d4ee6d96c583">pbuf_skip</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *in, u16_t in_offset, u16_t *out_offset)</td></tr>
+<tr class="separator:ga6a961522d81f0327aaf4d4ee6d96c583"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad1e31e370271335b197272af2724ca85"><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__pbuf.html#gad1e31e370271335b197272af2724ca85">pbuf_take</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *buf, const void *dataptr, u16_t len)</td></tr>
+<tr class="separator:gad1e31e370271335b197272af2724ca85"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae1cf2bf7454ff87ff377b0b2262f9b44"><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__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44">pbuf_take_at</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *buf, const void *dataptr, u16_t len, u16_t offset)</td></tr>
+<tr class="separator:gae1cf2bf7454ff87ff377b0b2262f9b44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga54ac7b116c6f53c704cbf74f35a8b35c"><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="group__pbuf.html#ga54ac7b116c6f53c704cbf74f35a8b35c">pbuf_coalesce</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, <a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a> layer)</td></tr>
+<tr class="separator:ga54ac7b116c6f53c704cbf74f35a8b35c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafdb04fb0f37f0422fd44ec0fcec8ebd0"><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="group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0">pbuf_clone</a> (<a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a> layer, <a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a> type, struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:gafdb04fb0f37f0422fd44ec0fcec8ebd0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6d803d9945bffb7ad97743f2fa503da6"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6">pbuf_get_at</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t offset)</td></tr>
+<tr class="separator:ga6d803d9945bffb7ad97743f2fa503da6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga839f342803b0cf89049744124c5a98ad"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga839f342803b0cf89049744124c5a98ad">pbuf_try_get_at</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t offset)</td></tr>
+<tr class="separator:ga839f342803b0cf89049744124c5a98ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf76863707dc02993eae116574b1ea03f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#gaf76863707dc02993eae116574b1ea03f">pbuf_put_at</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t offset, u8_t data)</td></tr>
+<tr class="separator:gaf76863707dc02993eae116574b1ea03f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2170ccbbb13238380dbb203ee1b85974"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974">pbuf_memcmp</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t offset, const void *s2, u16_t n)</td></tr>
+<tr class="separator:ga2170ccbbb13238380dbb203ee1b85974"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga18c164a6e4a24d89ea9eb7571a886448"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448">pbuf_memfind</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, const void *<a class="el" href="structmem.html">mem</a>, u16_t mem_len, u16_t start_offset)</td></tr>
+<tr class="separator:ga18c164a6e4a24d89ea9eb7571a886448"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ba3f7b705309ceadb147692fd5a1c7d"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8c.html#a9ba3f7b705309ceadb147692fd5a1c7d">pbuf_strstr</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, const char *substr)</td></tr>
+<tr class="separator:a9ba3f7b705309ceadb147692fd5a1c7d"><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>Packet buffer management </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a32dc14bd88dcafa25e627ab18e801815"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a32dc14bd88dcafa25e627ab18e801815">&#9670;&nbsp;</a></span>pbuf_add_header()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t pbuf_add_header </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>header_size_increment</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Adjusts the payload pointer to reveal headers in the payload.</p>
+<p>Adjusts the -&gt;payload pointer so that space for a header appears in the pbuf payload.</p>
+<p>The -&gt;payload, -&gt;tot_len and -&gt;len fields are adjusted.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to change the header size. </td></tr>
+    <tr><td class="paramname">header_size_increment</td><td>Number of bytes to increment header size which increases the size of the pbuf. New space is on the front. If header_size_increment is 0, this function does nothing and returns successful.</td></tr>
+  </table>
+  </dd>
+</dl>
+<p>PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so the call will fail. A check is made that the increase in header size does not move the payload pointer in front of the start of the buffer.</p>
+<dl class="section return"><dt>Returns</dt><dd>non-zero on failure, zero on success. </dd></dl>
+
+</div>
+</div>
+<a id="ad4ef8c5fbbd1447db04f8f73923e7dee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad4ef8c5fbbd1447db04f8f73923e7dee">&#9670;&nbsp;</a></span>pbuf_add_header_force()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t pbuf_add_header_force </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>header_size_increment</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as <a class="el" href="pbuf_8h.html#a32dc14bd88dcafa25e627ab18e801815">pbuf_add_header</a> but does not check if 'header_size &gt; 0' is allowed. This is used internally only, to allow PBUF_REF for RX. </p>
+
+</div>
+</div>
+<a id="a5df7ac5ae59012fe9aeddba375a72190"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5df7ac5ae59012fe9aeddba375a72190">&#9670;&nbsp;</a></span>pbuf_clen()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t pbuf_clen </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Count number of pbufs in a chain</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>first pbuf of chain </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the number of pbufs in a chain </dd></dl>
+
+</div>
+</div>
+<a id="abf3d29c4f43986b4cb5eb314d5b9729d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abf3d29c4f43986b4cb5eb314d5b9729d">&#9670;&nbsp;</a></span>pbuf_dechain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* pbuf_dechain </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Dechains the first pbuf from its succeeding pbufs in the chain.</p>
+<p>Makes p-&gt;tot_len field equal to p-&gt;len. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to dechain </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>remainder of the pbuf chain, or NULL if it was de-allocated. </dd></dl>
+<dl class="section note"><dt>Note</dt><dd>May not be called on a packet queue. </dd></dl>
+
+</div>
+</div>
+<a id="a25a3b8edc783896b03819a966d00845e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a25a3b8edc783896b03819a966d00845e">&#9670;&nbsp;</a></span>pbuf_free_header()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* pbuf_free_header </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>q</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>size</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Similar to pbuf_header(-size) but de-refs header pbufs for (size &gt;= p-&gt;len)</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">q</td><td>pbufs to operate on </td></tr>
+    <tr><td class="paramname">size</td><td>The number of bytes to remove from the beginning of the pbuf list. While size &gt;= p-&gt;len, pbufs are freed. ATTENTION: this is the opposite direction as <a class="el" href="pbuf_8h.html#aaa17c1951cf2d207b6adfd3947d91f00">pbuf_header</a>, but takes an u16_t not s16_t! </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the new head pbuf </dd></dl>
+
+</div>
+</div>
+<a id="a0f81deff4a0e6e8e0ff161a7b9871449"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0f81deff4a0e6e8e0ff161a7b9871449">&#9670;&nbsp;</a></span>pbuf_header()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t pbuf_header </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s16_t&#160;</td>
+          <td class="paramname"><em>header_size_increment</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Adjusts the payload pointer to hide or reveal headers in the payload.</p>
+<p>Adjusts the -&gt;payload pointer so that space for a header (dis)appears in the pbuf payload.</p>
+<p>The -&gt;payload, -&gt;tot_len and -&gt;len fields are adjusted.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to change the header size. </td></tr>
+    <tr><td class="paramname">header_size_increment</td><td>Number of bytes to increment header size which increases the size of the pbuf. New space is on the front. (Using a negative value decreases the header size.) If header_size_increment is 0, this function does nothing and returns successful.</td></tr>
+  </table>
+  </dd>
+</dl>
+<p>PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so the call will fail. A check is made that the increase in header size does not move the payload pointer in front of the start of the buffer. </p><dl class="section return"><dt>Returns</dt><dd>non-zero on failure, zero on success. </dd></dl>
+
+</div>
+</div>
+<a id="ad0e64d6fbc423593461063da97da9ce6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad0e64d6fbc423593461063da97da9ce6">&#9670;&nbsp;</a></span>pbuf_header_force()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t pbuf_header_force </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s16_t&#160;</td>
+          <td class="paramname"><em>header_size_increment</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as pbuf_header but does not check if 'header_size &gt; 0' is allowed. This is used internally only, to allow PBUF_REF for RX. </p>
+
+</div>
+</div>
+<a id="aca0cd8b3f08fbb5e35bc91a663083cc1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aca0cd8b3f08fbb5e35bc91a663083cc1">&#9670;&nbsp;</a></span>pbuf_remove_header()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t pbuf_remove_header </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>header_size_decrement</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Adjusts the payload pointer to hide headers in the payload.</p>
+<p>Adjusts the -&gt;payload pointer so that space for a header disappears in the pbuf payload.</p>
+<p>The -&gt;payload, -&gt;tot_len and -&gt;len fields are adjusted.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to change the header size. </td></tr>
+    <tr><td class="paramname">header_size_decrement</td><td>Number of bytes to decrement header size which decreases the size of the pbuf. If header_size_decrement is 0, this function does nothing and returns successful. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>non-zero on failure, zero on success. </dd></dl>
+
+</div>
+</div>
+<a id="a9ba3f7b705309ceadb147692fd5a1c7d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ba3f7b705309ceadb147692fd5a1c7d">&#9670;&nbsp;</a></span>pbuf_strstr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t pbuf_strstr </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>substr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Find occurrence of substr with length substr_len in pbuf p, start at offset start_offset WARNING: in contrast to strstr(), this one does not stop at the first \0 in the pbuf/source string!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to search, maximum length is 0xFFFE since 0xFFFF is used as return value 'not found' </td></tr>
+    <tr><td class="paramname">substr</td><td>string to search for in p, maximum length is 0xFFFE </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0xFFFF if substr was not found in p or the index where it was found </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_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li><li class="navelem"><a class="el" href="pbuf_8c.html">pbuf.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/pbuf_8c.js b/doc/doxygen/output/html/pbuf_8c.js
new file mode 100644
index 0000000..ae3ccb4
--- /dev/null
+++ b/doc/doxygen/output/html/pbuf_8c.js
@@ -0,0 +1,33 @@
+var pbuf_8c =
+[
+    [ "pbuf_add_header", "pbuf_8c.html#a32dc14bd88dcafa25e627ab18e801815", null ],
+    [ "pbuf_add_header_force", "pbuf_8c.html#ad4ef8c5fbbd1447db04f8f73923e7dee", null ],
+    [ "pbuf_alloc", "group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47", null ],
+    [ "pbuf_alloc_reference", "group__pbuf.html#ga4caa46c6d560d9d0da2be845bc9c2fab", null ],
+    [ "pbuf_alloced_custom", "group__pbuf.html#ga90fa2bbf6ea4a263ee8f7b77c75683c2", null ],
+    [ "pbuf_cat", "group__pbuf.html#ga82429084fe29015509c9b4a072707cd4", null ],
+    [ "pbuf_chain", "group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891", null ],
+    [ "pbuf_clen", "pbuf_8c.html#a5df7ac5ae59012fe9aeddba375a72190", null ],
+    [ "pbuf_clone", "group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0", null ],
+    [ "pbuf_coalesce", "group__pbuf.html#ga54ac7b116c6f53c704cbf74f35a8b35c", null ],
+    [ "pbuf_copy", "group__pbuf.html#gaba88511dee3df4b631fde691f421320d", null ],
+    [ "pbuf_copy_partial", "group__pbuf.html#gac2f1f58fd36042e82af46f5015720899", null ],
+    [ "pbuf_dechain", "pbuf_8c.html#abf3d29c4f43986b4cb5eb314d5b9729d", null ],
+    [ "pbuf_free", "group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b", null ],
+    [ "pbuf_free_header", "pbuf_8c.html#a25a3b8edc783896b03819a966d00845e", null ],
+    [ "pbuf_get_at", "group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6", null ],
+    [ "pbuf_get_contiguous", "group__pbuf.html#gad0357ae0be17b2aacd0c301cdc86fc39", null ],
+    [ "pbuf_header", "pbuf_8c.html#a0f81deff4a0e6e8e0ff161a7b9871449", null ],
+    [ "pbuf_header_force", "pbuf_8c.html#ad0e64d6fbc423593461063da97da9ce6", null ],
+    [ "pbuf_memcmp", "group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974", null ],
+    [ "pbuf_memfind", "group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448", null ],
+    [ "pbuf_put_at", "group__pbuf.html#gaf76863707dc02993eae116574b1ea03f", null ],
+    [ "pbuf_realloc", "group__pbuf.html#ga50abfe830a33a1a47a562febee66015d", null ],
+    [ "pbuf_ref", "group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e", null ],
+    [ "pbuf_remove_header", "pbuf_8c.html#aca0cd8b3f08fbb5e35bc91a663083cc1", null ],
+    [ "pbuf_skip", "group__pbuf.html#ga6a961522d81f0327aaf4d4ee6d96c583", null ],
+    [ "pbuf_strstr", "pbuf_8c.html#a9ba3f7b705309ceadb147692fd5a1c7d", null ],
+    [ "pbuf_take", "group__pbuf.html#gad1e31e370271335b197272af2724ca85", null ],
+    [ "pbuf_take_at", "group__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44", null ],
+    [ "pbuf_try_get_at", "group__pbuf.html#ga839f342803b0cf89049744124c5a98ad", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/pbuf_8h.html b/doc/doxygen/output/html/pbuf_8h.html
new file mode 100644
index 0000000..3d07a99
--- /dev/null
+++ b/doc/doxygen/output/html/pbuf_8h.html
@@ -0,0 +1,788 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/pbuf.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('pbuf_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">pbuf.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="err_8h.html">lwip/err.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structpbuf.html">pbuf</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="structpbuf__rom.html">pbuf_rom</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="structpbuf__custom.html">pbuf_custom</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a64174c5169b48dc17674324afd9c63b9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#a64174c5169b48dc17674324afd9c63b9">LWIP_SUPPORT_CUSTOM_PBUF</a>&#160;&#160;&#160;((<a class="el" href="group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4">IP_FRAG</a> &amp;&amp; !<a class="el" href="group__lwip__opts__netif.html#gabafb9f64a80e51b56c0abbcfc1f7e04e">LWIP_NETIF_TX_SINGLE_PBUF</a>) || (<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> &amp;&amp; <a class="el" href="group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3">LWIP_IPV6_FRAG</a>))</td></tr>
+<tr class="separator:a64174c5169b48dc17674324afd9c63b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga894d91d811fd986f3cc3da828fa7beb3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga894d91d811fd986f3cc3da828fa7beb3">PBUF_NEEDS_COPY</a>(p)&#160;&#160;&#160;((p)-&gt;type_internal &amp; <a class="el" href="pbuf_8h.html#a02789ca67766def65000b58f7fe7d03b">PBUF_TYPE_FLAG_DATA_VOLATILE</a>)</td></tr>
+<tr class="separator:ga894d91d811fd986f3cc3da828fa7beb3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49ab2c0662378f268ed8209bd54aaedf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#a49ab2c0662378f268ed8209bd54aaedf">PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS</a>&#160;&#160;&#160;0x80</td></tr>
+<tr class="separator:a49ab2c0662378f268ed8209bd54aaedf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a02789ca67766def65000b58f7fe7d03b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#a02789ca67766def65000b58f7fe7d03b">PBUF_TYPE_FLAG_DATA_VOLATILE</a>&#160;&#160;&#160;0x40</td></tr>
+<tr class="separator:a02789ca67766def65000b58f7fe7d03b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97d4db8e0f127f61af0016c184c865ca"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#a97d4db8e0f127f61af0016c184c865ca">PBUF_TYPE_ALLOC_SRC_MASK</a>&#160;&#160;&#160;0x0F</td></tr>
+<tr class="separator:a97d4db8e0f127f61af0016c184c865ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a567a0dfa01b0e5540f9416a200ed163f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#a567a0dfa01b0e5540f9416a200ed163f">PBUF_ALLOC_FLAG_RX</a>&#160;&#160;&#160;0x0100</td></tr>
+<tr class="separator:a567a0dfa01b0e5540f9416a200ed163f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a426883d928f8f3e8fd066e616159d78f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#a426883d928f8f3e8fd066e616159d78f">PBUF_ALLOC_FLAG_DATA_CONTIGUOUS</a>&#160;&#160;&#160;0x0200</td></tr>
+<tr class="separator:a426883d928f8f3e8fd066e616159d78f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa1f62ba9dc5d462e67e33c4be64c601a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#aa1f62ba9dc5d462e67e33c4be64c601a">PBUF_TYPE_ALLOC_SRC_MASK_APP_MIN</a>&#160;&#160;&#160;0x03</td></tr>
+<tr class="separator:aa1f62ba9dc5d462e67e33c4be64c601a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aad686ef346759a221abdb45f64649816"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#aad686ef346759a221abdb45f64649816">PBUF_TYPE_ALLOC_SRC_MASK_APP_MAX</a>&#160;&#160;&#160;<a class="el" href="pbuf_8h.html#a97d4db8e0f127f61af0016c184c865ca">PBUF_TYPE_ALLOC_SRC_MASK</a></td></tr>
+<tr class="separator:aad686ef346759a221abdb45f64649816"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a018a6499e357f8a1373321f802a82930"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#a018a6499e357f8a1373321f802a82930">PBUF_FLAG_PUSH</a>&#160;&#160;&#160;0x01U</td></tr>
+<tr class="separator:a018a6499e357f8a1373321f802a82930"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af78a7e1815dc0e31884d095b666d997f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#af78a7e1815dc0e31884d095b666d997f">PBUF_FLAG_IS_CUSTOM</a>&#160;&#160;&#160;0x02U</td></tr>
+<tr class="separator:af78a7e1815dc0e31884d095b666d997f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab8ad153151a8c157335d9c0cedc007e6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#ab8ad153151a8c157335d9c0cedc007e6">PBUF_FLAG_MCASTLOOP</a>&#160;&#160;&#160;0x04U</td></tr>
+<tr class="separator:ab8ad153151a8c157335d9c0cedc007e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6772c16662bbb78597399add086500c0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#a6772c16662bbb78597399add086500c0">PBUF_FLAG_LLBCAST</a>&#160;&#160;&#160;0x08U</td></tr>
+<tr class="separator:a6772c16662bbb78597399add086500c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac0d56cde47aca24ef410d730d7c89887"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#ac0d56cde47aca24ef410d730d7c89887">PBUF_FLAG_LLMCAST</a>&#160;&#160;&#160;0x10U</td></tr>
+<tr class="separator:ac0d56cde47aca24ef410d730d7c89887"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a36a915aa2f6a188baa2862881407971e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#a36a915aa2f6a188baa2862881407971e">PBUF_FLAG_TCP_FIN</a>&#160;&#160;&#160;0x20U</td></tr>
+<tr class="separator:a36a915aa2f6a188baa2862881407971e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac54b0f161128a32c7419c33b893a5106"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#ac54b0f161128a32c7419c33b893a5106">PBUF_POOL_FREE_OOSEQ</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ac54b0f161128a32c7419c33b893a5106"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a6d285ce1d910f25e511c8c38532a1dce"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#a6d285ce1d910f25e511c8c38532a1dce">pbuf_free_custom_fn</a>) (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:a6d285ce1d910f25e511c8c38532a1dce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:gaee1baa59bb2f85ba575b5a8619ac1ebf"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a> { <br />
+&#160;&#160;<a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa2ded3594a3977f8bf9cf09552be327b5">PBUF_TRANSPORT</a> = 0 + (14 + 0 ) + 40 + 20, 
+<a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfafcc1e506061ba69dfa142eb6b3da5f13">PBUF_IP</a> = 0 + (14 + 0 ) + 40, 
+<a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfab4de441e737330558b609a990cd17346">PBUF_LINK</a> = 0 + (14 + 0 ), 
+<a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa0ff039585f05f9208bcb66c2d37783e2">PBUF_RAW_TX</a> = 0, 
+<br />
+&#160;&#160;<a class="el" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba">PBUF_RAW</a> = 0
+<br />
+ }</td></tr>
+<tr class="separator:gaee1baa59bb2f85ba575b5a8619ac1ebf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab7e0e32fcc292c0d7107721766ed92fb"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a> { <a class="el" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac5e9f28455bca98944a030d4b84ecfab">PBUF_RAM</a> = ( 0x0200 | 0x80 | 0x00 ), 
+<a class="el" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac120b0fe39efe35bb682e4aa3b82e2c9">PBUF_ROM</a> = 0x01, 
+<a class="el" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac9b6ba960fdea6f2e8f35c8313b77e4e">PBUF_REF</a> = ( 0x40 | 0x01 ), 
+<a class="el" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbae969347127387b9b59a23ccd24b76d21">PBUF_POOL</a> = ( 0x0100 | 0x80 | 0x02 )
+ }</td></tr>
+<tr class="separator:gab7e0e32fcc292c0d7107721766ed92fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gacfcb0a2af918658ba0afe36499c65f47"><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="group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47">pbuf_alloc</a> (<a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a> l, u16_t length, <a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a> type)</td></tr>
+<tr class="separator:gacfcb0a2af918658ba0afe36499c65f47"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4caa46c6d560d9d0da2be845bc9c2fab"><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="group__pbuf.html#ga4caa46c6d560d9d0da2be845bc9c2fab">pbuf_alloc_reference</a> (void *payload, u16_t length, <a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a> type)</td></tr>
+<tr class="separator:ga4caa46c6d560d9d0da2be845bc9c2fab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga90fa2bbf6ea4a263ee8f7b77c75683c2"><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="group__pbuf.html#ga90fa2bbf6ea4a263ee8f7b77c75683c2">pbuf_alloced_custom</a> (<a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a> l, u16_t length, <a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a> type, struct <a class="el" href="structpbuf__custom.html">pbuf_custom</a> *p, void *payload_mem, u16_t payload_mem_len)</td></tr>
+<tr class="separator:ga90fa2bbf6ea4a263ee8f7b77c75683c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga50abfe830a33a1a47a562febee66015d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga50abfe830a33a1a47a562febee66015d">pbuf_realloc</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t size)</td></tr>
+<tr class="separator:ga50abfe830a33a1a47a562febee66015d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaa17c1951cf2d207b6adfd3947d91f00"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#aaa17c1951cf2d207b6adfd3947d91f00">pbuf_header</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, s16_t header_size)</td></tr>
+<tr class="separator:aaa17c1951cf2d207b6adfd3947d91f00"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a27480c41c34021d4417691d327163626"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#a27480c41c34021d4417691d327163626">pbuf_header_force</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, s16_t header_size)</td></tr>
+<tr class="separator:a27480c41c34021d4417691d327163626"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32dc14bd88dcafa25e627ab18e801815"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#a32dc14bd88dcafa25e627ab18e801815">pbuf_add_header</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, size_t header_size_increment)</td></tr>
+<tr class="separator:a32dc14bd88dcafa25e627ab18e801815"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad4ef8c5fbbd1447db04f8f73923e7dee"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#ad4ef8c5fbbd1447db04f8f73923e7dee">pbuf_add_header_force</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, size_t header_size_increment)</td></tr>
+<tr class="separator:ad4ef8c5fbbd1447db04f8f73923e7dee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab65da7cd8f7449b3b2e57d7fa1a74ef4"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#ab65da7cd8f7449b3b2e57d7fa1a74ef4">pbuf_remove_header</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, size_t header_size)</td></tr>
+<tr class="separator:ab65da7cd8f7449b3b2e57d7fa1a74ef4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25a3b8edc783896b03819a966d00845e"><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="pbuf_8h.html#a25a3b8edc783896b03819a966d00845e">pbuf_free_header</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *q, u16_t size)</td></tr>
+<tr class="separator:a25a3b8edc783896b03819a966d00845e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga77f6bbd69e45e542014d9c547c7da74e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e">pbuf_ref</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:ga77f6bbd69e45e542014d9c547c7da74e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab0dd696fb4b6bc65e548944584f1738b"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf_free</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:gab0dd696fb4b6bc65e548944584f1738b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5df7ac5ae59012fe9aeddba375a72190"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#a5df7ac5ae59012fe9aeddba375a72190">pbuf_clen</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:a5df7ac5ae59012fe9aeddba375a72190"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga82429084fe29015509c9b4a072707cd4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga82429084fe29015509c9b4a072707cd4">pbuf_cat</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *head, struct <a class="el" href="structpbuf.html">pbuf</a> *tail)</td></tr>
+<tr class="separator:ga82429084fe29015509c9b4a072707cd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga831c9a72bda1d3bd4c7b96f5a0e3b891"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891">pbuf_chain</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *head, struct <a class="el" href="structpbuf.html">pbuf</a> *tail)</td></tr>
+<tr class="separator:ga831c9a72bda1d3bd4c7b96f5a0e3b891"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf3d29c4f43986b4cb5eb314d5b9729d"><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="pbuf_8h.html#abf3d29c4f43986b4cb5eb314d5b9729d">pbuf_dechain</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:abf3d29c4f43986b4cb5eb314d5b9729d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaba88511dee3df4b631fde691f421320d"><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__pbuf.html#gaba88511dee3df4b631fde691f421320d">pbuf_copy</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p_to, const struct <a class="el" href="structpbuf.html">pbuf</a> *p_from)</td></tr>
+<tr class="separator:gaba88511dee3df4b631fde691f421320d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac2f1f58fd36042e82af46f5015720899"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#gac2f1f58fd36042e82af46f5015720899">pbuf_copy_partial</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, void *dataptr, u16_t len, u16_t offset)</td></tr>
+<tr class="separator:gac2f1f58fd36042e82af46f5015720899"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad0357ae0be17b2aacd0c301cdc86fc39"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#gad0357ae0be17b2aacd0c301cdc86fc39">pbuf_get_contiguous</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, void *buffer, size_t bufsize, u16_t len, u16_t offset)</td></tr>
+<tr class="separator:gad0357ae0be17b2aacd0c301cdc86fc39"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad1e31e370271335b197272af2724ca85"><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__pbuf.html#gad1e31e370271335b197272af2724ca85">pbuf_take</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *buf, const void *dataptr, u16_t len)</td></tr>
+<tr class="separator:gad1e31e370271335b197272af2724ca85"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae1cf2bf7454ff87ff377b0b2262f9b44"><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__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44">pbuf_take_at</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *buf, const void *dataptr, u16_t len, u16_t offset)</td></tr>
+<tr class="separator:gae1cf2bf7454ff87ff377b0b2262f9b44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6a961522d81f0327aaf4d4ee6d96c583"><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="group__pbuf.html#ga6a961522d81f0327aaf4d4ee6d96c583">pbuf_skip</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *in, u16_t in_offset, u16_t *out_offset)</td></tr>
+<tr class="separator:ga6a961522d81f0327aaf4d4ee6d96c583"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga54ac7b116c6f53c704cbf74f35a8b35c"><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="group__pbuf.html#ga54ac7b116c6f53c704cbf74f35a8b35c">pbuf_coalesce</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, <a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a> layer)</td></tr>
+<tr class="separator:ga54ac7b116c6f53c704cbf74f35a8b35c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafdb04fb0f37f0422fd44ec0fcec8ebd0"><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="group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0">pbuf_clone</a> (<a class="el" href="group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf">pbuf_layer</a> l, <a class="el" href="group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb">pbuf_type</a> type, struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:gafdb04fb0f37f0422fd44ec0fcec8ebd0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6d803d9945bffb7ad97743f2fa503da6"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6">pbuf_get_at</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t offset)</td></tr>
+<tr class="separator:ga6d803d9945bffb7ad97743f2fa503da6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga839f342803b0cf89049744124c5a98ad"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga839f342803b0cf89049744124c5a98ad">pbuf_try_get_at</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t offset)</td></tr>
+<tr class="separator:ga839f342803b0cf89049744124c5a98ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf76863707dc02993eae116574b1ea03f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#gaf76863707dc02993eae116574b1ea03f">pbuf_put_at</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t offset, u8_t data)</td></tr>
+<tr class="separator:gaf76863707dc02993eae116574b1ea03f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2170ccbbb13238380dbb203ee1b85974"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974">pbuf_memcmp</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t offset, const void *s2, u16_t n)</td></tr>
+<tr class="separator:ga2170ccbbb13238380dbb203ee1b85974"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga18c164a6e4a24d89ea9eb7571a886448"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448">pbuf_memfind</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, const void *<a class="el" href="structmem.html">mem</a>, u16_t mem_len, u16_t start_offset)</td></tr>
+<tr class="separator:ga18c164a6e4a24d89ea9eb7571a886448"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ba3f7b705309ceadb147692fd5a1c7d"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pbuf_8h.html#a9ba3f7b705309ceadb147692fd5a1c7d">pbuf_strstr</a> (const struct <a class="el" href="structpbuf.html">pbuf</a> *p, const char *substr)</td></tr>
+<tr class="separator:a9ba3f7b705309ceadb147692fd5a1c7d"><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>pbuf API </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a64174c5169b48dc17674324afd9c63b9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a64174c5169b48dc17674324afd9c63b9">&#9670;&nbsp;</a></span>LWIP_SUPPORT_CUSTOM_PBUF</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_SUPPORT_CUSTOM_PBUF&#160;&#160;&#160;((<a class="el" href="group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4">IP_FRAG</a> &amp;&amp; !<a class="el" href="group__lwip__opts__netif.html#gabafb9f64a80e51b56c0abbcfc1f7e04e">LWIP_NETIF_TX_SINGLE_PBUF</a>) || (<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> &amp;&amp; <a class="el" href="group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3">LWIP_IPV6_FRAG</a>))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_SUPPORT_CUSTOM_PBUF==1: Custom pbufs behave much like their pbuf type but they are allocated by external code (initialised by calling <a class="el" href="group__pbuf.html#ga90fa2bbf6ea4a263ee8f7b77c75683c2">pbuf_alloced_custom()</a>) and when pbuf_free gives up their last reference, they are freed by calling pbuf_custom-&gt;custom_free_function(). Currently, the <a class="el" href="structpbuf__custom.html">pbuf_custom</a> code is only needed for one specific configuration of IP_FRAG, unless required by external driver/application code. </p>
+
+</div>
+</div>
+<a id="a426883d928f8f3e8fd066e616159d78f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a426883d928f8f3e8fd066e616159d78f">&#9670;&nbsp;</a></span>PBUF_ALLOC_FLAG_DATA_CONTIGUOUS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_ALLOC_FLAG_DATA_CONTIGUOUS&#160;&#160;&#160;0x0200</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Indicates the application needs the pbuf payload to be in one piece </p>
+
+</div>
+</div>
+<a id="a567a0dfa01b0e5540f9416a200ed163f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a567a0dfa01b0e5540f9416a200ed163f">&#9670;&nbsp;</a></span>PBUF_ALLOC_FLAG_RX</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_ALLOC_FLAG_RX&#160;&#160;&#160;0x0100</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Indicates this pbuf is used for RX (if not set, indicates use for TX). This information can be used to keep some spare RX buffers e.g. for receiving TCP ACKs to unblock a connection) </p>
+
+</div>
+</div>
+<a id="af78a7e1815dc0e31884d095b666d997f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af78a7e1815dc0e31884d095b666d997f">&#9670;&nbsp;</a></span>PBUF_FLAG_IS_CUSTOM</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_FLAG_IS_CUSTOM&#160;&#160;&#160;0x02U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>indicates this is a custom pbuf: pbuf_free calls pbuf_custom-&gt;custom_free_function() when the last reference is released (plus custom PBUF_RAM cannot be trimmed) </p>
+
+</div>
+</div>
+<a id="a6772c16662bbb78597399add086500c0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6772c16662bbb78597399add086500c0">&#9670;&nbsp;</a></span>PBUF_FLAG_LLBCAST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_FLAG_LLBCAST&#160;&#160;&#160;0x08U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>indicates this pbuf was received as link-level broadcast </p>
+
+</div>
+</div>
+<a id="ac0d56cde47aca24ef410d730d7c89887"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac0d56cde47aca24ef410d730d7c89887">&#9670;&nbsp;</a></span>PBUF_FLAG_LLMCAST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_FLAG_LLMCAST&#160;&#160;&#160;0x10U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>indicates this pbuf was received as link-level multicast </p>
+
+</div>
+</div>
+<a id="ab8ad153151a8c157335d9c0cedc007e6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab8ad153151a8c157335d9c0cedc007e6">&#9670;&nbsp;</a></span>PBUF_FLAG_MCASTLOOP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_FLAG_MCASTLOOP&#160;&#160;&#160;0x04U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>indicates this pbuf is UDP multicast to be looped back </p>
+
+</div>
+</div>
+<a id="a018a6499e357f8a1373321f802a82930"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a018a6499e357f8a1373321f802a82930">&#9670;&nbsp;</a></span>PBUF_FLAG_PUSH</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_FLAG_PUSH&#160;&#160;&#160;0x01U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>indicates this packet's data should be immediately passed to the application </p>
+
+</div>
+</div>
+<a id="a36a915aa2f6a188baa2862881407971e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a36a915aa2f6a188baa2862881407971e">&#9670;&nbsp;</a></span>PBUF_FLAG_TCP_FIN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_FLAG_TCP_FIN&#160;&#160;&#160;0x20U</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>indicates this pbuf includes a TCP FIN flag </p>
+
+</div>
+</div>
+<a id="ac54b0f161128a32c7419c33b893a5106"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac54b0f161128a32c7419c33b893a5106">&#9670;&nbsp;</a></span>PBUF_POOL_FREE_OOSEQ</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_POOL_FREE_OOSEQ&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Define this to 0 to prevent freeing ooseq pbufs when the PBUF_POOL is empty </p>
+
+</div>
+</div>
+<a id="a97d4db8e0f127f61af0016c184c865ca"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a97d4db8e0f127f61af0016c184c865ca">&#9670;&nbsp;</a></span>PBUF_TYPE_ALLOC_SRC_MASK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_TYPE_ALLOC_SRC_MASK&#160;&#160;&#160;0x0F</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>4 bits are reserved for 16 allocation sources (e.g. heap, pool1, pool2, etc) Internally, we use: 0=heap, 1=MEMP_PBUF, 2=MEMP_PBUF_POOL -&gt; 13 types free </p>
+
+</div>
+</div>
+<a id="aad686ef346759a221abdb45f64649816"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aad686ef346759a221abdb45f64649816">&#9670;&nbsp;</a></span>PBUF_TYPE_ALLOC_SRC_MASK_APP_MAX</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_TYPE_ALLOC_SRC_MASK_APP_MAX&#160;&#160;&#160;<a class="el" href="pbuf_8h.html#a97d4db8e0f127f61af0016c184c865ca">PBUF_TYPE_ALLOC_SRC_MASK</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Last pbuf allocation type for applications </p>
+
+</div>
+</div>
+<a id="aa1f62ba9dc5d462e67e33c4be64c601a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa1f62ba9dc5d462e67e33c4be64c601a">&#9670;&nbsp;</a></span>PBUF_TYPE_ALLOC_SRC_MASK_APP_MIN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_TYPE_ALLOC_SRC_MASK_APP_MIN&#160;&#160;&#160;0x03</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>First pbuf allocation type for applications </p>
+
+</div>
+</div>
+<a id="a02789ca67766def65000b58f7fe7d03b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a02789ca67766def65000b58f7fe7d03b">&#9670;&nbsp;</a></span>PBUF_TYPE_FLAG_DATA_VOLATILE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_TYPE_FLAG_DATA_VOLATILE&#160;&#160;&#160;0x40</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Indicates the data stored in this pbuf can change. If this pbuf needs to be queued, it must be copied/duplicated. </p>
+
+</div>
+</div>
+<a id="a49ab2c0662378f268ed8209bd54aaedf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a49ab2c0662378f268ed8209bd54aaedf">&#9670;&nbsp;</a></span>PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS&#160;&#160;&#160;0x80</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Indicates that the payload directly follows the struct pbuf. This makes <a class="el" href="pbuf_8h.html#aaa17c1951cf2d207b6adfd3947d91f00">pbuf_header</a> work in both directions. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="a6d285ce1d910f25e511c8c38532a1dce"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6d285ce1d910f25e511c8c38532a1dce">&#9670;&nbsp;</a></span>pbuf_free_custom_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* pbuf_free_custom_fn) (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Prototype for a function to free a custom pbuf </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a32dc14bd88dcafa25e627ab18e801815"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a32dc14bd88dcafa25e627ab18e801815">&#9670;&nbsp;</a></span>pbuf_add_header()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t pbuf_add_header </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>header_size_increment</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Adjusts the payload pointer to reveal headers in the payload.</p>
+<p>Adjusts the -&gt;payload pointer so that space for a header appears in the pbuf payload.</p>
+<p>The -&gt;payload, -&gt;tot_len and -&gt;len fields are adjusted.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to change the header size. </td></tr>
+    <tr><td class="paramname">header_size_increment</td><td>Number of bytes to increment header size which increases the size of the pbuf. New space is on the front. If header_size_increment is 0, this function does nothing and returns successful.</td></tr>
+  </table>
+  </dd>
+</dl>
+<p>PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so the call will fail. A check is made that the increase in header size does not move the payload pointer in front of the start of the buffer.</p>
+<dl class="section return"><dt>Returns</dt><dd>non-zero on failure, zero on success. </dd></dl>
+
+</div>
+</div>
+<a id="ad4ef8c5fbbd1447db04f8f73923e7dee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad4ef8c5fbbd1447db04f8f73923e7dee">&#9670;&nbsp;</a></span>pbuf_add_header_force()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t pbuf_add_header_force </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>header_size_increment</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as <a class="el" href="pbuf_8h.html#a32dc14bd88dcafa25e627ab18e801815">pbuf_add_header</a> but does not check if 'header_size &gt; 0' is allowed. This is used internally only, to allow PBUF_REF for RX. </p>
+
+</div>
+</div>
+<a id="a5df7ac5ae59012fe9aeddba375a72190"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5df7ac5ae59012fe9aeddba375a72190">&#9670;&nbsp;</a></span>pbuf_clen()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t pbuf_clen </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Count number of pbufs in a chain</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>first pbuf of chain </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the number of pbufs in a chain </dd></dl>
+
+</div>
+</div>
+<a id="abf3d29c4f43986b4cb5eb314d5b9729d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abf3d29c4f43986b4cb5eb314d5b9729d">&#9670;&nbsp;</a></span>pbuf_dechain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* pbuf_dechain </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Dechains the first pbuf from its succeeding pbufs in the chain.</p>
+<p>Makes p-&gt;tot_len field equal to p-&gt;len. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to dechain </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>remainder of the pbuf chain, or NULL if it was de-allocated. </dd></dl>
+<dl class="section note"><dt>Note</dt><dd>May not be called on a packet queue. </dd></dl>
+
+</div>
+</div>
+<a id="a25a3b8edc783896b03819a966d00845e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a25a3b8edc783896b03819a966d00845e">&#9670;&nbsp;</a></span>pbuf_free_header()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* pbuf_free_header </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>q</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>size</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Similar to pbuf_header(-size) but de-refs header pbufs for (size &gt;= p-&gt;len)</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">q</td><td>pbufs to operate on </td></tr>
+    <tr><td class="paramname">size</td><td>The number of bytes to remove from the beginning of the pbuf list. While size &gt;= p-&gt;len, pbufs are freed. ATTENTION: this is the opposite direction as <a class="el" href="pbuf_8h.html#aaa17c1951cf2d207b6adfd3947d91f00">pbuf_header</a>, but takes an u16_t not s16_t! </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the new head pbuf </dd></dl>
+
+</div>
+</div>
+<a id="aaa17c1951cf2d207b6adfd3947d91f00"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaa17c1951cf2d207b6adfd3947d91f00">&#9670;&nbsp;</a></span>pbuf_header()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t pbuf_header </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s16_t&#160;</td>
+          <td class="paramname"><em>header_size_increment</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Adjusts the payload pointer to hide or reveal headers in the payload.</p>
+<p>Adjusts the -&gt;payload pointer so that space for a header (dis)appears in the pbuf payload.</p>
+<p>The -&gt;payload, -&gt;tot_len and -&gt;len fields are adjusted.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to change the header size. </td></tr>
+    <tr><td class="paramname">header_size_increment</td><td>Number of bytes to increment header size which increases the size of the pbuf. New space is on the front. (Using a negative value decreases the header size.) If header_size_increment is 0, this function does nothing and returns successful.</td></tr>
+  </table>
+  </dd>
+</dl>
+<p>PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so the call will fail. A check is made that the increase in header size does not move the payload pointer in front of the start of the buffer. </p><dl class="section return"><dt>Returns</dt><dd>non-zero on failure, zero on success. </dd></dl>
+
+</div>
+</div>
+<a id="a27480c41c34021d4417691d327163626"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a27480c41c34021d4417691d327163626">&#9670;&nbsp;</a></span>pbuf_header_force()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t pbuf_header_force </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s16_t&#160;</td>
+          <td class="paramname"><em>header_size_increment</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as pbuf_header but does not check if 'header_size &gt; 0' is allowed. This is used internally only, to allow PBUF_REF for RX. </p>
+
+</div>
+</div>
+<a id="ab65da7cd8f7449b3b2e57d7fa1a74ef4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab65da7cd8f7449b3b2e57d7fa1a74ef4">&#9670;&nbsp;</a></span>pbuf_remove_header()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t pbuf_remove_header </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>header_size_decrement</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Adjusts the payload pointer to hide headers in the payload.</p>
+<p>Adjusts the -&gt;payload pointer so that space for a header disappears in the pbuf payload.</p>
+<p>The -&gt;payload, -&gt;tot_len and -&gt;len fields are adjusted.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to change the header size. </td></tr>
+    <tr><td class="paramname">header_size_decrement</td><td>Number of bytes to decrement header size which decreases the size of the pbuf. If header_size_decrement is 0, this function does nothing and returns successful. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>non-zero on failure, zero on success. </dd></dl>
+
+</div>
+</div>
+<a id="a9ba3f7b705309ceadb147692fd5a1c7d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ba3f7b705309ceadb147692fd5a1c7d">&#9670;&nbsp;</a></span>pbuf_strstr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t pbuf_strstr </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>substr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Find occurrence of substr with length substr_len in pbuf p, start at offset start_offset WARNING: in contrast to strstr(), this one does not stop at the first \0 in the pbuf/source string!</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to search, maximum length is 0xFFFE since 0xFFFF is used as return value 'not found' </td></tr>
+    <tr><td class="paramname">substr</td><td>string to search for in p, maximum length is 0xFFFE </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0xFFFF if substr was not found in p or the index where it was found </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="pbuf_8h.html">pbuf.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/pbuf_8h.js b/doc/doxygen/output/html/pbuf_8h.js
new file mode 100644
index 0000000..01b167c
--- /dev/null
+++ b/doc/doxygen/output/html/pbuf_8h.js
@@ -0,0 +1,66 @@
+var pbuf_8h =
+[
+    [ "pbuf", "structpbuf.html", "structpbuf" ],
+    [ "pbuf_rom", "structpbuf__rom.html", "structpbuf__rom" ],
+    [ "pbuf_custom", "structpbuf__custom.html", "structpbuf__custom" ],
+    [ "LWIP_SUPPORT_CUSTOM_PBUF", "pbuf_8h.html#a64174c5169b48dc17674324afd9c63b9", null ],
+    [ "PBUF_ALLOC_FLAG_DATA_CONTIGUOUS", "pbuf_8h.html#a426883d928f8f3e8fd066e616159d78f", null ],
+    [ "PBUF_ALLOC_FLAG_RX", "pbuf_8h.html#a567a0dfa01b0e5540f9416a200ed163f", null ],
+    [ "PBUF_FLAG_IS_CUSTOM", "pbuf_8h.html#af78a7e1815dc0e31884d095b666d997f", null ],
+    [ "PBUF_FLAG_LLBCAST", "pbuf_8h.html#a6772c16662bbb78597399add086500c0", null ],
+    [ "PBUF_FLAG_LLMCAST", "pbuf_8h.html#ac0d56cde47aca24ef410d730d7c89887", null ],
+    [ "PBUF_FLAG_MCASTLOOP", "pbuf_8h.html#ab8ad153151a8c157335d9c0cedc007e6", null ],
+    [ "PBUF_FLAG_PUSH", "pbuf_8h.html#a018a6499e357f8a1373321f802a82930", null ],
+    [ "PBUF_FLAG_TCP_FIN", "pbuf_8h.html#a36a915aa2f6a188baa2862881407971e", null ],
+    [ "PBUF_NEEDS_COPY", "group__pbuf.html#ga894d91d811fd986f3cc3da828fa7beb3", null ],
+    [ "PBUF_POOL_FREE_OOSEQ", "pbuf_8h.html#ac54b0f161128a32c7419c33b893a5106", null ],
+    [ "PBUF_TYPE_ALLOC_SRC_MASK", "pbuf_8h.html#a97d4db8e0f127f61af0016c184c865ca", null ],
+    [ "PBUF_TYPE_ALLOC_SRC_MASK_APP_MAX", "pbuf_8h.html#aad686ef346759a221abdb45f64649816", null ],
+    [ "PBUF_TYPE_ALLOC_SRC_MASK_APP_MIN", "pbuf_8h.html#aa1f62ba9dc5d462e67e33c4be64c601a", null ],
+    [ "PBUF_TYPE_FLAG_DATA_VOLATILE", "pbuf_8h.html#a02789ca67766def65000b58f7fe7d03b", null ],
+    [ "PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS", "pbuf_8h.html#a49ab2c0662378f268ed8209bd54aaedf", null ],
+    [ "pbuf_free_custom_fn", "pbuf_8h.html#a6d285ce1d910f25e511c8c38532a1dce", null ],
+    [ "pbuf_layer", "group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf", [
+      [ "PBUF_TRANSPORT", "group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa2ded3594a3977f8bf9cf09552be327b5", null ],
+      [ "PBUF_IP", "group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfafcc1e506061ba69dfa142eb6b3da5f13", null ],
+      [ "PBUF_LINK", "group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfab4de441e737330558b609a990cd17346", null ],
+      [ "PBUF_RAW_TX", "group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa0ff039585f05f9208bcb66c2d37783e2", null ],
+      [ "PBUF_RAW", "group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba", null ]
+    ] ],
+    [ "pbuf_type", "group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb", [
+      [ "PBUF_RAM", "group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac5e9f28455bca98944a030d4b84ecfab", null ],
+      [ "PBUF_ROM", "group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac120b0fe39efe35bb682e4aa3b82e2c9", null ],
+      [ "PBUF_REF", "group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac9b6ba960fdea6f2e8f35c8313b77e4e", null ],
+      [ "PBUF_POOL", "group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbae969347127387b9b59a23ccd24b76d21", null ]
+    ] ],
+    [ "pbuf_add_header", "pbuf_8h.html#a32dc14bd88dcafa25e627ab18e801815", null ],
+    [ "pbuf_add_header_force", "pbuf_8h.html#ad4ef8c5fbbd1447db04f8f73923e7dee", null ],
+    [ "pbuf_alloc", "group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47", null ],
+    [ "pbuf_alloc_reference", "group__pbuf.html#ga4caa46c6d560d9d0da2be845bc9c2fab", null ],
+    [ "pbuf_alloced_custom", "group__pbuf.html#ga90fa2bbf6ea4a263ee8f7b77c75683c2", null ],
+    [ "pbuf_cat", "group__pbuf.html#ga82429084fe29015509c9b4a072707cd4", null ],
+    [ "pbuf_chain", "group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891", null ],
+    [ "pbuf_clen", "pbuf_8h.html#a5df7ac5ae59012fe9aeddba375a72190", null ],
+    [ "pbuf_clone", "group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0", null ],
+    [ "pbuf_coalesce", "group__pbuf.html#ga54ac7b116c6f53c704cbf74f35a8b35c", null ],
+    [ "pbuf_copy", "group__pbuf.html#gaba88511dee3df4b631fde691f421320d", null ],
+    [ "pbuf_copy_partial", "group__pbuf.html#gac2f1f58fd36042e82af46f5015720899", null ],
+    [ "pbuf_dechain", "pbuf_8h.html#abf3d29c4f43986b4cb5eb314d5b9729d", null ],
+    [ "pbuf_free", "group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b", null ],
+    [ "pbuf_free_header", "pbuf_8h.html#a25a3b8edc783896b03819a966d00845e", null ],
+    [ "pbuf_get_at", "group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6", null ],
+    [ "pbuf_get_contiguous", "group__pbuf.html#gad0357ae0be17b2aacd0c301cdc86fc39", null ],
+    [ "pbuf_header", "pbuf_8h.html#aaa17c1951cf2d207b6adfd3947d91f00", null ],
+    [ "pbuf_header_force", "pbuf_8h.html#a27480c41c34021d4417691d327163626", null ],
+    [ "pbuf_memcmp", "group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974", null ],
+    [ "pbuf_memfind", "group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448", null ],
+    [ "pbuf_put_at", "group__pbuf.html#gaf76863707dc02993eae116574b1ea03f", null ],
+    [ "pbuf_realloc", "group__pbuf.html#ga50abfe830a33a1a47a562febee66015d", null ],
+    [ "pbuf_ref", "group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e", null ],
+    [ "pbuf_remove_header", "pbuf_8h.html#ab65da7cd8f7449b3b2e57d7fa1a74ef4", null ],
+    [ "pbuf_skip", "group__pbuf.html#ga6a961522d81f0327aaf4d4ee6d96c583", null ],
+    [ "pbuf_strstr", "pbuf_8h.html#a9ba3f7b705309ceadb147692fd5a1c7d", null ],
+    [ "pbuf_take", "group__pbuf.html#gad1e31e370271335b197272af2724ca85", null ],
+    [ "pbuf_take_at", "group__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44", null ],
+    [ "pbuf_try_get_at", "group__pbuf.html#ga839f342803b0cf89049744124c5a98ad", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/pitfalls.html b/doc/doxygen/output/html/pitfalls.html
new file mode 100644
index 0000000..7cbc93a
--- /dev/null
+++ b/doc/doxygen/output/html/pitfalls.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Common pitfalls</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('pitfalls.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">Common pitfalls </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><h1>Multiple Execution Contexts in lwIP code </h1>
+<p>The most common source of lwIP problems is to have multiple execution contexts inside the lwIP code.</p>
+<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>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>
+<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>
+<h2>DMA-capable ethernet hardware and cacheline alignment </h2>
+<p>Nice description about DMA capable hardware and buffer handling: <a href="http://www.pebblebay.com/a-guide-to-using-direct-memory-access-in-embedded-systems-part-two/">http://www.pebblebay.com/a-guide-to-using-direct-memory-access-in-embedded-systems-part-two/</a> Read especially sections "Cache coherency" and "Buffer alignment". </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="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/pppapi_8c.html b/doc/doxygen/output/html/pppapi_8c.html
new file mode 100644
index 0000000..cb147cc
--- /dev/null
+++ b/doc/doxygen/output/html/pppapi_8c.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/netif/ppp/pppapi.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('pppapi_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">pppapi.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;netif/ppp/ppp_opts.h&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Point To Point Protocol Sequential API module </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_900e6f7ff90690cb8edb53323dd38d80.html">netif</a></li><li class="navelem"><a class="el" href="dir_6aa605ad180e7b166767bf4f86888ab5.html">ppp</a></li><li class="navelem"><a class="el" href="pppapi_8c.html">pppapi.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/pppol2tp_8c.html b/doc/doxygen/output/html/pppol2tp_8c.html
new file mode 100644
index 0000000..30d96fd
--- /dev/null
+++ b/doc/doxygen/output/html/pppol2tp_8c.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/netif/ppp/pppol2tp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('pppol2tp_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">pppol2tp.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;netif/ppp/ppp_opts.h&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Network Point to Point Protocol over Layer 2 Tunneling Protocol program file. </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_900e6f7ff90690cb8edb53323dd38d80.html">netif</a></li><li class="navelem"><a class="el" href="dir_6aa605ad180e7b166767bf4f86888ab5.html">ppp</a></li><li class="navelem"><a class="el" href="pppol2tp_8c.html">pppol2tp.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/pppol2tp_8h.html b/doc/doxygen/output/html/pppol2tp_8h.html
new file mode 100644
index 0000000..7330c8c
--- /dev/null
+++ b/doc/doxygen/output/html/pppol2tp_8h.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/netif/ppp/pppol2tp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('pppol2tp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">pppol2tp.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;netif/ppp/ppp_opts.h&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Network Point to Point Protocol over Layer 2 Tunneling Protocol header file. </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_c9a67764bf8a12cf6b427bb859cbcd0b.html">netif</a></li><li class="navelem"><a class="el" href="dir_439fcb6f68ea6a3dc0078b338960fd8f.html">ppp</a></li><li class="navelem"><a class="el" href="pppol2tp_8h.html">pppol2tp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/pppos_8c.html b/doc/doxygen/output/html/pppos_8c.html
new file mode 100644
index 0000000..4296106
--- /dev/null
+++ b/doc/doxygen/output/html/pppos_8c.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/netif/ppp/pppos.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('pppos_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">pppos.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;netif/ppp/ppp_opts.h&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Network Point to Point Protocol over Serial file. </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_900e6f7ff90690cb8edb53323dd38d80.html">netif</a></li><li class="navelem"><a class="el" href="dir_6aa605ad180e7b166767bf4f86888ab5.html">ppp</a></li><li class="navelem"><a class="el" href="pppos_8c.html">pppos.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/pppos_8h.html b/doc/doxygen/output/html/pppos_8h.html
new file mode 100644
index 0000000..507c0ec
--- /dev/null
+++ b/doc/doxygen/output/html/pppos_8h.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/netif/ppp/pppos.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('pppos_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">pppos.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;netif/ppp/ppp_opts.h&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Network Point to Point Protocol over Serial header file. </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_c9a67764bf8a12cf6b427bb859cbcd0b.html">netif</a></li><li class="navelem"><a class="el" href="dir_439fcb6f68ea6a3dc0078b338960fd8f.html">ppp</a></li><li class="navelem"><a class="el" href="pppos_8h.html">pppos.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </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
new file mode 100644
index 0000000..bd5b0a0
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2autoip_8h.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/autoip.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('prot_2autoip_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">autoip.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>AutoIP 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_2autoip_8h.html">autoip.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/prot_2dhcp6_8h.html b/doc/doxygen/output/html/prot_2dhcp6_8h.html
new file mode 100644
index 0000000..c745aee
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2dhcp6_8h.html
@@ -0,0 +1,152 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/dhcp6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('prot_2dhcp6_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">dhcp6.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;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structdhcp6__msg.html">dhcp6_msg</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a878a7734e159826e82e958fe3a5ca175"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2dhcp6_8h.html#a878a7734e159826e82e958fe3a5ca175">DHCP6_STATUS_SUCCESS</a>&#160;&#160;&#160;0 /* Success. */</td></tr>
+<tr class="separator:a878a7734e159826e82e958fe3a5ca175"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe33f98cb94e0f18892a41502cf54e36"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2dhcp6_8h.html#afe33f98cb94e0f18892a41502cf54e36">DHCP6_DUID_LLT</a>&#160;&#160;&#160;1 /* LLT: Link-layer Address Plus Time */</td></tr>
+<tr class="separator:afe33f98cb94e0f18892a41502cf54e36"><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>DHCPv6 protocol definitions </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="afe33f98cb94e0f18892a41502cf54e36"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afe33f98cb94e0f18892a41502cf54e36">&#9670;&nbsp;</a></span>DHCP6_DUID_LLT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DHCP6_DUID_LLT&#160;&#160;&#160;1 /* LLT: Link-layer Address Plus Time */</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DHCPv6 DUID types </p>
+
+</div>
+</div>
+<a id="a878a7734e159826e82e958fe3a5ca175"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a878a7734e159826e82e958fe3a5ca175">&#9670;&nbsp;</a></span>DHCP6_STATUS_SUCCESS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DHCP6_STATUS_SUCCESS&#160;&#160;&#160;0 /* Success. */</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DHCPv6 status codes </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="dir_fa0f2b7ac208069fc8d28c28af349d8d.html">prot</a></li><li class="navelem"><a class="el" href="prot_2dhcp6_8h.html">dhcp6.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/prot_2dhcp6_8h.js b/doc/doxygen/output/html/prot_2dhcp6_8h.js
new file mode 100644
index 0000000..c4d51ba
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2dhcp6_8h.js
@@ -0,0 +1,6 @@
+var prot_2dhcp6_8h =
+[
+    [ "dhcp6_msg", "structdhcp6__msg.html", null ],
+    [ "DHCP6_DUID_LLT", "prot_2dhcp6_8h.html#afe33f98cb94e0f18892a41502cf54e36", null ],
+    [ "DHCP6_STATUS_SUCCESS", "prot_2dhcp6_8h.html#a878a7734e159826e82e958fe3a5ca175", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/prot_2dhcp_8h.html b/doc/doxygen/output/html/prot_2dhcp_8h.html
new file mode 100644
index 0000000..27e04ce
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2dhcp_8h.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/dhcp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('prot_2dhcp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">dhcp.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="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2ip4_8h.html">lwip/prot/ip4.h</a>&quot;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structdhcp__msg.html">dhcp_msg</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ae99d4be0d03f6f9c8f02f63abde91a06"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2dhcp_8h.html#ae99d4be0d03f6f9c8f02f63abde91a06">DHCP_OPTIONS_LEN</a>&#160;&#160;&#160;DHCP_MIN_OPTIONS_LEN</td></tr>
+<tr class="separator:ae99d4be0d03f6f9c8f02f63abde91a06"><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>DHCP protocol definitions </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ae99d4be0d03f6f9c8f02f63abde91a06"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae99d4be0d03f6f9c8f02f63abde91a06">&#9670;&nbsp;</a></span>DHCP_OPTIONS_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DHCP_OPTIONS_LEN&#160;&#160;&#160;DHCP_MIN_OPTIONS_LEN</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>make sure user does not configure this too small allow this to be configured in lwipopts.h, but not too small set this to be sufficient for your options in outgoing DHCP msgs </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="dir_fa0f2b7ac208069fc8d28c28af349d8d.html">prot</a></li><li class="navelem"><a class="el" href="prot_2dhcp_8h.html">dhcp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/prot_2dhcp_8h.js b/doc/doxygen/output/html/prot_2dhcp_8h.js
new file mode 100644
index 0000000..5752c24
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2dhcp_8h.js
@@ -0,0 +1,5 @@
+var prot_2dhcp_8h =
+[
+    [ "dhcp_msg", "structdhcp__msg.html", null ],
+    [ "DHCP_OPTIONS_LEN", "prot_2dhcp_8h.html#ae99d4be0d03f6f9c8f02f63abde91a06", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/prot_2dns_8h.html b/doc/doxygen/output/html/prot_2dns_8h.html
new file mode 100644
index 0000000..690609e
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2dns_8h.html
@@ -0,0 +1,152 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/dns.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('prot_2dns_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">dns.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structdns__hdr.html">dns_hdr</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a9266b48706648ecf0625a3e651095317"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2dns_8h.html#a9266b48706648ecf0625a3e651095317">DNS_SERVER_PORT</a>&#160;&#160;&#160;53</td></tr>
+<tr class="separator:a9266b48706648ecf0625a3e651095317"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62d67af5ac6c6b3f98a6566a42564276"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2dns_8h.html#a62d67af5ac6c6b3f98a6566a42564276">DNS_MQUERY_PORT</a>&#160;&#160;&#160;5353</td></tr>
+<tr class="separator:a62d67af5ac6c6b3f98a6566a42564276"><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>DNS - host name to IP address resolver. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a62d67af5ac6c6b3f98a6566a42564276"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62d67af5ac6c6b3f98a6566a42564276">&#9670;&nbsp;</a></span>DNS_MQUERY_PORT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DNS_MQUERY_PORT&#160;&#160;&#160;5353</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>UDP port for multicast DNS queries </p>
+
+</div>
+</div>
+<a id="a9266b48706648ecf0625a3e651095317"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9266b48706648ecf0625a3e651095317">&#9670;&nbsp;</a></span>DNS_SERVER_PORT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DNS_SERVER_PORT&#160;&#160;&#160;53</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DNS server port address </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="dir_fa0f2b7ac208069fc8d28c28af349d8d.html">prot</a></li><li class="navelem"><a class="el" href="prot_2dns_8h.html">dns.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/prot_2dns_8h.js b/doc/doxygen/output/html/prot_2dns_8h.js
new file mode 100644
index 0000000..8c194bc
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2dns_8h.js
@@ -0,0 +1,6 @@
+var prot_2dns_8h =
+[
+    [ "dns_hdr", "structdns__hdr.html", null ],
+    [ "DNS_MQUERY_PORT", "prot_2dns_8h.html#a62d67af5ac6c6b3f98a6566a42564276", null ],
+    [ "DNS_SERVER_PORT", "prot_2dns_8h.html#a9266b48706648ecf0625a3e651095317", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/prot_2icmp6_8h.html b/doc/doxygen/output/html/prot_2icmp6_8h.html
new file mode 100644
index 0000000..690c828
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2icmp6_8h.html
@@ -0,0 +1,311 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/icmp6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('prot_2icmp6_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#enum-members">Enumerations</a>  </div>
+  <div class="headertitle">
+<div class="title">icmp6.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structicmp6__hdr.html">icmp6_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="structicmp6__echo__hdr.html">icmp6_echo_hdr</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 name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:a6e10428d8f6102013b30013065716858"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858">icmp6_type</a> { <br />
+&#160;&#160;<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aad9d4f207459e4bbd0c33a25adf6fdd7">ICMP6_TYPE_DUR</a> = 1, 
+<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1d52ef5024a5822bd622bcb0b9da323d">ICMP6_TYPE_PTB</a> = 2, 
+<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afae9848904bc4b4b4aa716a7a9a2d7fe">ICMP6_TYPE_TE</a> = 3, 
+<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a63114feac8140031b74424d4a7cf6b26">ICMP6_TYPE_PP</a> = 4, 
+<br />
+&#160;&#160;<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac7020c08a7b03ae2a198e4a8dcd31bd4">ICMP6_TYPE_PE1</a> = 100, 
+<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aed14d280e5911098af914a94bd3ab22b">ICMP6_TYPE_PE2</a> = 101, 
+<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858abe61415e020b996220337f0cd002a28f">ICMP6_TYPE_RSV_ERR</a> = 127, 
+<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae649aa45c97b885f28771688957528a3">ICMP6_TYPE_EREQ</a> = 128, 
+<br />
+&#160;&#160;<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac6b91695c06bfc7fb2360310d7b8e78a">ICMP6_TYPE_EREP</a> = 129, 
+<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ad9794ae12b9ca196cc4fafaf6d834375">ICMP6_TYPE_MLQ</a> = 130, 
+<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a906dd689f0aa9b4796f49f299d4e3eb0">ICMP6_TYPE_MLR</a> = 131, 
+<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a04228a1d11f9f88bd165f3430188bfe7">ICMP6_TYPE_MLD</a> = 132, 
+<br />
+&#160;&#160;<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a670d95494c9282f646ac442d81d9a780">ICMP6_TYPE_RS</a> = 133, 
+<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae4ae04be7df3a2cce614af0a5cdae951">ICMP6_TYPE_RA</a> = 134, 
+<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0d8d8717c6c34053d1101932c23929fe">ICMP6_TYPE_NS</a> = 135, 
+<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1f99d333f425c28d3840e029cc9c46f3">ICMP6_TYPE_NA</a> = 136, 
+<br />
+&#160;&#160;<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0f6702d62de5f873e0afe7431d878207">ICMP6_TYPE_RD</a> = 137, 
+<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a29281016d3bb58e3bfd90417bbce7aa0">ICMP6_TYPE_MRA</a> = 151, 
+<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a425f4e64a7d1570228adbbe450650ab4">ICMP6_TYPE_MRS</a> = 152, 
+<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afb12a9d774f53deb15ec23041548f6fc">ICMP6_TYPE_MRT</a> = 153, 
+<br />
+&#160;&#160;<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a9c9c358ebd5eb683a66819fd9ecf98c6">ICMP6_TYPE_PE3</a> = 200, 
+<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858af8ebe97c4f68b54c9ef0c43e98211df5">ICMP6_TYPE_PE4</a> = 201, 
+<a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a2c12d3244d837bd243ea647ec530600d">ICMP6_TYPE_RSV_INF</a> = 255
+<br />
+ }</td></tr>
+<tr class="separator:a6e10428d8f6102013b30013065716858"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a11fe21b0a8c1bc73ee887a96bf416ccf"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccf">icmp6_dur_code</a> { <br />
+&#160;&#160;<a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa695bb4d92f32b504a9483ff137235a78">ICMP6_DUR_NO_ROUTE</a> = 0, 
+<a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa251961b990d0fbaf2c643f047c4f2532">ICMP6_DUR_PROHIBITED</a> = 1, 
+<a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfabdb01a67c61da588872f5799ef75aa6e">ICMP6_DUR_SCOPE</a> = 2, 
+<a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa789ef8158d8750b0fa5a14ec9ecaa23a">ICMP6_DUR_ADDRESS</a> = 3, 
+<br />
+&#160;&#160;<a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa28cc924ec6eaa761acb76ccef4adcba0">ICMP6_DUR_PORT</a> = 4, 
+<a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfac3c255282e0b49b5bbb3cd8f435bb763">ICMP6_DUR_POLICY</a> = 5, 
+<a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa2aeed278149fb071a34beec89df03b5c">ICMP6_DUR_REJECT_ROUTE</a> = 6
+<br />
+ }</td></tr>
+<tr class="separator:a11fe21b0a8c1bc73ee887a96bf416ccf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad06bbf4ee72635ece968db41cbe6869e"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e">icmp6_te_code</a> { <a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eacccbb5e776df1b35af4149e593240880">ICMP6_TE_HL</a> = 0, 
+<a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eaec493420d61c80a21981b1aa32befe1f">ICMP6_TE_FRAG</a> = 1
+ }</td></tr>
+<tr class="separator:ad06bbf4ee72635ece968db41cbe6869e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a817e777ebcfd705e8e5a1b4c5ae023"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023">icmp6_pp_code</a> { <a class="el" href="prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a4aa4a79306a69fd4f60ad445cde4c2a9">ICMP6_PP_FIELD</a> = 0, 
+<a class="el" href="prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023acbcc58901e2345ffc31df4098de60ff8">ICMP6_PP_HEADER</a> = 1, 
+<a class="el" href="prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a53884832d00d3c8f8de62cfdb4646932">ICMP6_PP_OPTION</a> = 2
+ }</td></tr>
+<tr class="separator:a3a817e777ebcfd705e8e5a1b4c5ae023"><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>ICMP6 protocol definitions </p>
+</div><h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="a11fe21b0a8c1bc73ee887a96bf416ccf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a11fe21b0a8c1bc73ee887a96bf416ccf">&#9670;&nbsp;</a></span>icmp6_dur_code</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccf">icmp6_dur_code</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ICMP destination unreachable codes </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a11fe21b0a8c1bc73ee887a96bf416ccfa695bb4d92f32b504a9483ff137235a78"></a>ICMP6_DUR_NO_ROUTE&#160;</td><td class="fielddoc"><p>No route to destination </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a11fe21b0a8c1bc73ee887a96bf416ccfa251961b990d0fbaf2c643f047c4f2532"></a>ICMP6_DUR_PROHIBITED&#160;</td><td class="fielddoc"><p>Communication with destination administratively prohibited </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a11fe21b0a8c1bc73ee887a96bf416ccfabdb01a67c61da588872f5799ef75aa6e"></a>ICMP6_DUR_SCOPE&#160;</td><td class="fielddoc"><p>Beyond scope of source address </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a11fe21b0a8c1bc73ee887a96bf416ccfa789ef8158d8750b0fa5a14ec9ecaa23a"></a>ICMP6_DUR_ADDRESS&#160;</td><td class="fielddoc"><p>Address unreachable </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a11fe21b0a8c1bc73ee887a96bf416ccfa28cc924ec6eaa761acb76ccef4adcba0"></a>ICMP6_DUR_PORT&#160;</td><td class="fielddoc"><p>Port unreachable </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a11fe21b0a8c1bc73ee887a96bf416ccfac3c255282e0b49b5bbb3cd8f435bb763"></a>ICMP6_DUR_POLICY&#160;</td><td class="fielddoc"><p>Source address failed ingress/egress policy </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a11fe21b0a8c1bc73ee887a96bf416ccfa2aeed278149fb071a34beec89df03b5c"></a>ICMP6_DUR_REJECT_ROUTE&#160;</td><td class="fielddoc"><p>Reject route to destination </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<a id="a3a817e777ebcfd705e8e5a1b4c5ae023"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3a817e777ebcfd705e8e5a1b4c5ae023">&#9670;&nbsp;</a></span>icmp6_pp_code</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023">icmp6_pp_code</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ICMP parameter code </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a3a817e777ebcfd705e8e5a1b4c5ae023a4aa4a79306a69fd4f60ad445cde4c2a9"></a>ICMP6_PP_FIELD&#160;</td><td class="fielddoc"><p>Erroneous header field encountered </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a3a817e777ebcfd705e8e5a1b4c5ae023acbcc58901e2345ffc31df4098de60ff8"></a>ICMP6_PP_HEADER&#160;</td><td class="fielddoc"><p>Unrecognized next header type encountered </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a3a817e777ebcfd705e8e5a1b4c5ae023a53884832d00d3c8f8de62cfdb4646932"></a>ICMP6_PP_OPTION&#160;</td><td class="fielddoc"><p>Unrecognized IPv6 option encountered </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<a id="ad06bbf4ee72635ece968db41cbe6869e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad06bbf4ee72635ece968db41cbe6869e">&#9670;&nbsp;</a></span>icmp6_te_code</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e">icmp6_te_code</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ICMP time exceeded codes </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="ad06bbf4ee72635ece968db41cbe6869eacccbb5e776df1b35af4149e593240880"></a>ICMP6_TE_HL&#160;</td><td class="fielddoc"><p>Hop limit exceeded in transit </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ad06bbf4ee72635ece968db41cbe6869eaec493420d61c80a21981b1aa32befe1f"></a>ICMP6_TE_FRAG&#160;</td><td class="fielddoc"><p>Fragment reassembly time exceeded </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<a id="a6e10428d8f6102013b30013065716858"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6e10428d8f6102013b30013065716858">&#9670;&nbsp;</a></span>icmp6_type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858">icmp6_type</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ICMP type </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858aad9d4f207459e4bbd0c33a25adf6fdd7"></a>ICMP6_TYPE_DUR&#160;</td><td class="fielddoc"><p>Destination unreachable </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858a1d52ef5024a5822bd622bcb0b9da323d"></a>ICMP6_TYPE_PTB&#160;</td><td class="fielddoc"><p>Packet too big </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858afae9848904bc4b4b4aa716a7a9a2d7fe"></a>ICMP6_TYPE_TE&#160;</td><td class="fielddoc"><p>Time exceeded </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858a63114feac8140031b74424d4a7cf6b26"></a>ICMP6_TYPE_PP&#160;</td><td class="fielddoc"><p>Parameter problem </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858ac7020c08a7b03ae2a198e4a8dcd31bd4"></a>ICMP6_TYPE_PE1&#160;</td><td class="fielddoc"><p>Private experimentation </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858aed14d280e5911098af914a94bd3ab22b"></a>ICMP6_TYPE_PE2&#160;</td><td class="fielddoc"><p>Private experimentation </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858abe61415e020b996220337f0cd002a28f"></a>ICMP6_TYPE_RSV_ERR&#160;</td><td class="fielddoc"><p>Reserved for expansion of error messages </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858ae649aa45c97b885f28771688957528a3"></a>ICMP6_TYPE_EREQ&#160;</td><td class="fielddoc"><p>Echo request </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858ac6b91695c06bfc7fb2360310d7b8e78a"></a>ICMP6_TYPE_EREP&#160;</td><td class="fielddoc"><p>Echo reply </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858ad9794ae12b9ca196cc4fafaf6d834375"></a>ICMP6_TYPE_MLQ&#160;</td><td class="fielddoc"><p>Multicast listener query </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858a906dd689f0aa9b4796f49f299d4e3eb0"></a>ICMP6_TYPE_MLR&#160;</td><td class="fielddoc"><p>Multicast listener report </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858a04228a1d11f9f88bd165f3430188bfe7"></a>ICMP6_TYPE_MLD&#160;</td><td class="fielddoc"><p>Multicast listener done </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858a670d95494c9282f646ac442d81d9a780"></a>ICMP6_TYPE_RS&#160;</td><td class="fielddoc"><p>Router solicitation </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858ae4ae04be7df3a2cce614af0a5cdae951"></a>ICMP6_TYPE_RA&#160;</td><td class="fielddoc"><p>Router advertisement </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858a0d8d8717c6c34053d1101932c23929fe"></a>ICMP6_TYPE_NS&#160;</td><td class="fielddoc"><p>Neighbor solicitation </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858a1f99d333f425c28d3840e029cc9c46f3"></a>ICMP6_TYPE_NA&#160;</td><td class="fielddoc"><p>Neighbor advertisement </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858a0f6702d62de5f873e0afe7431d878207"></a>ICMP6_TYPE_RD&#160;</td><td class="fielddoc"><p>Redirect </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858a29281016d3bb58e3bfd90417bbce7aa0"></a>ICMP6_TYPE_MRA&#160;</td><td class="fielddoc"><p>Multicast router advertisement </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858a425f4e64a7d1570228adbbe450650ab4"></a>ICMP6_TYPE_MRS&#160;</td><td class="fielddoc"><p>Multicast router solicitation </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858afb12a9d774f53deb15ec23041548f6fc"></a>ICMP6_TYPE_MRT&#160;</td><td class="fielddoc"><p>Multicast router termination </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858a9c9c358ebd5eb683a66819fd9ecf98c6"></a>ICMP6_TYPE_PE3&#160;</td><td class="fielddoc"><p>Private experimentation </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858af8ebe97c4f68b54c9ef0c43e98211df5"></a>ICMP6_TYPE_PE4&#160;</td><td class="fielddoc"><p>Private experimentation </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6e10428d8f6102013b30013065716858a2c12d3244d837bd243ea647ec530600d"></a>ICMP6_TYPE_RSV_INF&#160;</td><td class="fielddoc"><p>Reserved for expansion of informational messages </p>
+</td></tr>
+</table>
+
+</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_fa0f2b7ac208069fc8d28c28af349d8d.html">prot</a></li><li class="navelem"><a class="el" href="prot_2icmp6_8h.html">icmp6.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/prot_2icmp6_8h.js b/doc/doxygen/output/html/prot_2icmp6_8h.js
new file mode 100644
index 0000000..3f6856b
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2icmp6_8h.js
@@ -0,0 +1,48 @@
+var prot_2icmp6_8h =
+[
+    [ "icmp6_hdr", "structicmp6__hdr.html", null ],
+    [ "icmp6_echo_hdr", "structicmp6__echo__hdr.html", null ],
+    [ "icmp6_dur_code", "prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccf", [
+      [ "ICMP6_DUR_NO_ROUTE", "prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa695bb4d92f32b504a9483ff137235a78", null ],
+      [ "ICMP6_DUR_PROHIBITED", "prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa251961b990d0fbaf2c643f047c4f2532", null ],
+      [ "ICMP6_DUR_SCOPE", "prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfabdb01a67c61da588872f5799ef75aa6e", null ],
+      [ "ICMP6_DUR_ADDRESS", "prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa789ef8158d8750b0fa5a14ec9ecaa23a", null ],
+      [ "ICMP6_DUR_PORT", "prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa28cc924ec6eaa761acb76ccef4adcba0", null ],
+      [ "ICMP6_DUR_POLICY", "prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfac3c255282e0b49b5bbb3cd8f435bb763", null ],
+      [ "ICMP6_DUR_REJECT_ROUTE", "prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa2aeed278149fb071a34beec89df03b5c", null ]
+    ] ],
+    [ "icmp6_pp_code", "prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023", [
+      [ "ICMP6_PP_FIELD", "prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a4aa4a79306a69fd4f60ad445cde4c2a9", null ],
+      [ "ICMP6_PP_HEADER", "prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023acbcc58901e2345ffc31df4098de60ff8", null ],
+      [ "ICMP6_PP_OPTION", "prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a53884832d00d3c8f8de62cfdb4646932", null ]
+    ] ],
+    [ "icmp6_te_code", "prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e", [
+      [ "ICMP6_TE_HL", "prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eacccbb5e776df1b35af4149e593240880", null ],
+      [ "ICMP6_TE_FRAG", "prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eaec493420d61c80a21981b1aa32befe1f", null ]
+    ] ],
+    [ "icmp6_type", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858", [
+      [ "ICMP6_TYPE_DUR", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aad9d4f207459e4bbd0c33a25adf6fdd7", null ],
+      [ "ICMP6_TYPE_PTB", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1d52ef5024a5822bd622bcb0b9da323d", null ],
+      [ "ICMP6_TYPE_TE", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afae9848904bc4b4b4aa716a7a9a2d7fe", null ],
+      [ "ICMP6_TYPE_PP", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a63114feac8140031b74424d4a7cf6b26", null ],
+      [ "ICMP6_TYPE_PE1", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac7020c08a7b03ae2a198e4a8dcd31bd4", null ],
+      [ "ICMP6_TYPE_PE2", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aed14d280e5911098af914a94bd3ab22b", null ],
+      [ "ICMP6_TYPE_RSV_ERR", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858abe61415e020b996220337f0cd002a28f", null ],
+      [ "ICMP6_TYPE_EREQ", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae649aa45c97b885f28771688957528a3", null ],
+      [ "ICMP6_TYPE_EREP", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac6b91695c06bfc7fb2360310d7b8e78a", null ],
+      [ "ICMP6_TYPE_MLQ", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ad9794ae12b9ca196cc4fafaf6d834375", null ],
+      [ "ICMP6_TYPE_MLR", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a906dd689f0aa9b4796f49f299d4e3eb0", null ],
+      [ "ICMP6_TYPE_MLD", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a04228a1d11f9f88bd165f3430188bfe7", null ],
+      [ "ICMP6_TYPE_RS", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a670d95494c9282f646ac442d81d9a780", null ],
+      [ "ICMP6_TYPE_RA", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae4ae04be7df3a2cce614af0a5cdae951", null ],
+      [ "ICMP6_TYPE_NS", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0d8d8717c6c34053d1101932c23929fe", null ],
+      [ "ICMP6_TYPE_NA", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1f99d333f425c28d3840e029cc9c46f3", null ],
+      [ "ICMP6_TYPE_RD", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0f6702d62de5f873e0afe7431d878207", null ],
+      [ "ICMP6_TYPE_MRA", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a29281016d3bb58e3bfd90417bbce7aa0", null ],
+      [ "ICMP6_TYPE_MRS", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a425f4e64a7d1570228adbbe450650ab4", null ],
+      [ "ICMP6_TYPE_MRT", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afb12a9d774f53deb15ec23041548f6fc", null ],
+      [ "ICMP6_TYPE_PE3", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a9c9c358ebd5eb683a66819fd9ecf98c6", null ],
+      [ "ICMP6_TYPE_PE4", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858af8ebe97c4f68b54c9ef0c43e98211df5", null ],
+      [ "ICMP6_TYPE_RSV_INF", "prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a2c12d3244d837bd243ea647ec530600d", null ]
+    ] ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/prot_2icmp_8h.html b/doc/doxygen/output/html/prot_2icmp_8h.html
new file mode 100644
index 0000000..1215ba3
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2icmp_8h.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/icmp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('prot_2icmp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a>  </div>
+  <div class="headertitle">
+<div class="title">icmp.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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__echo__hdr.html">icmp_echo_hdr</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>
+<div class="textblock"><p>ICMP 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_2icmp_8h.html">icmp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/prot_2icmp_8h.js b/doc/doxygen/output/html/prot_2icmp_8h.js
new file mode 100644
index 0000000..808f385
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2icmp_8h.js
@@ -0,0 +1,4 @@
+var prot_2icmp_8h =
+[
+    [ "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
new file mode 100644
index 0000000..66d6fce
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2igmp_8h.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/igmp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('prot_2igmp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a>  </div>
+  <div class="headertitle">
+<div class="title">igmp.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2ip4_8h.html">lwip/prot/ip4.h</a>&quot;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structigmp__msg.html">igmp_msg</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>
+<div class="textblock"><p>IGMP 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_2igmp_8h.html">igmp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/prot_2igmp_8h.js b/doc/doxygen/output/html/prot_2igmp_8h.js
new file mode 100644
index 0000000..94299b3
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2igmp_8h.js
@@ -0,0 +1,4 @@
+var prot_2igmp_8h =
+[
+    [ "igmp_msg", "structigmp__msg.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/prot_2ip4_8h.html b/doc/doxygen/output/html/prot_2ip4_8h.html
new file mode 100644
index 0000000..5aa5770
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2ip4_8h.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/ip4.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('prot_2ip4_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a>  </div>
+  <div class="headertitle">
+<div class="title">ip4.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip4__addr_8h.html">lwip/ip4_addr.h</a>&quot;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structip4__addr__packed.html">ip4_addr_packed</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>
+<div class="textblock"><p>IPv4 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_2ip4_8h.html">ip4.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/prot_2ip4_8h.js b/doc/doxygen/output/html/prot_2ip4_8h.js
new file mode 100644
index 0000000..630cc97
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2ip4_8h.js
@@ -0,0 +1,4 @@
+var prot_2ip4_8h =
+[
+    [ "ip4_addr_packed", "structip4__addr__packed.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/prot_2ip6_8h.html b/doc/doxygen/output/html/prot_2ip6_8h.html
new file mode 100644
index 0000000..97f6a5d
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2ip6_8h.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/ip6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('prot_2ip6_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a>  </div>
+  <div class="headertitle">
+<div class="title">ip6.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structip6__addr__packed.html">ip6_addr_packed</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="structip6__hdr.html">ip6_hdr</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>
+<div class="textblock"><p>IPv6 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_2ip6_8h.html">ip6.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/prot_2ip6_8h.js b/doc/doxygen/output/html/prot_2ip6_8h.js
new file mode 100644
index 0000000..7b54375
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2ip6_8h.js
@@ -0,0 +1,5 @@
+var prot_2ip6_8h =
+[
+    [ "ip6_addr_packed", "structip6__addr__packed.html", null ],
+    [ "ip6_hdr", "structip6__hdr.html", "structip6__hdr" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/prot_2ip_8h.html b/doc/doxygen/output/html/prot_2ip_8h.html
new file mode 100644
index 0000000..bcb663c
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2ip_8h.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/ip.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('prot_2ip_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">ip.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:afc29766fb0707c63b64568c5fa44a374"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2ip_8h.html#afc29766fb0707c63b64568c5fa44a374">IP_HDR_GET_VERSION</a>(ptr)&#160;&#160;&#160;((*(u8_t*)(ptr)) &gt;&gt; 4)</td></tr>
+<tr class="separator:afc29766fb0707c63b64568c5fa44a374"><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>IP protocol definitions </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="afc29766fb0707c63b64568c5fa44a374"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afc29766fb0707c63b64568c5fa44a374">&#9670;&nbsp;</a></span>IP_HDR_GET_VERSION</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_HDR_GET_VERSION</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ptr</td><td>)</td>
+          <td>&#160;&#160;&#160;((*(u8_t*)(ptr)) &gt;&gt; 4)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This operates on a void* by loading the first byte </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="dir_fa0f2b7ac208069fc8d28c28af349d8d.html">prot</a></li><li class="navelem"><a class="el" href="prot_2ip_8h.html">ip.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/prot_2ip_8h.js b/doc/doxygen/output/html/prot_2ip_8h.js
new file mode 100644
index 0000000..04efcab
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2ip_8h.js
@@ -0,0 +1,4 @@
+var prot_2ip_8h =
+[
+    [ "IP_HDR_GET_VERSION", "prot_2ip_8h.html#afc29766fb0707c63b64568c5fa44a374", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/prot_2mld6_8h.html b/doc/doxygen/output/html/prot_2mld6_8h.html
new file mode 100644
index 0000000..228ccd2
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2mld6_8h.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/mld6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('prot_2mld6_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a>  </div>
+  <div class="headertitle">
+<div class="title">mld6.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2ip6_8h.html">lwip/prot/ip6.h</a>&quot;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structmld__header.html">mld_header</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>
+<div class="textblock"><p>MLD6 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_2mld6_8h.html">mld6.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/prot_2mld6_8h.js b/doc/doxygen/output/html/prot_2mld6_8h.js
new file mode 100644
index 0000000..ad8930d
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2mld6_8h.js
@@ -0,0 +1,4 @@
+var prot_2mld6_8h =
+[
+    [ "mld_header", "structmld__header.html", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/prot_2nd6_8h.html b/doc/doxygen/output/html/prot_2nd6_8h.html
new file mode 100644
index 0000000..a387060
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2nd6_8h.html
@@ -0,0 +1,245 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/nd6.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('prot_2nd6_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">nd6.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2ip6_8h.html">lwip/prot/ip6.h</a>&quot;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structns__header.html">ns_header</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="structna__header.html">na_header</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="structrs__header.html">rs_header</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="structredirect__header.html">redirect_header</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a7fb1b330719d83b7525374f4beca51bc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2nd6_8h.html#a7fb1b330719d83b7525374f4beca51bc">ND6_RA_FLAG_MANAGED_ADDR_CONFIG</a>&#160;&#160;&#160;(0x80)</td></tr>
+<tr class="separator:a7fb1b330719d83b7525374f4beca51bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a68ce8550a20cd30093d6e79e1ca51842"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2nd6_8h.html#a68ce8550a20cd30093d6e79e1ca51842">ND6_OPTION_TYPE_SOURCE_LLADDR</a>&#160;&#160;&#160;(0x01)</td></tr>
+<tr class="separator:a68ce8550a20cd30093d6e79e1ca51842"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0225d4c8911efdbdbc2b40de208906c2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2nd6_8h.html#a0225d4c8911efdbdbc2b40de208906c2">ND6_OPTION_TYPE_PREFIX_INFO</a>&#160;&#160;&#160;(0x03)</td></tr>
+<tr class="separator:a0225d4c8911efdbdbc2b40de208906c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeaa575c1a66ccaa2dc62ff2c0bd71619"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2nd6_8h.html#aeaa575c1a66ccaa2dc62ff2c0bd71619">ND6_OPTION_TYPE_REDIR_HDR</a>&#160;&#160;&#160;(0x04)</td></tr>
+<tr class="separator:aeaa575c1a66ccaa2dc62ff2c0bd71619"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab6c15c9bea51fbdcc660f718bb403a8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2nd6_8h.html#aab6c15c9bea51fbdcc660f718bb403a8">ND6_OPTION_TYPE_MTU</a>&#160;&#160;&#160;(0x05)</td></tr>
+<tr class="separator:aab6c15c9bea51fbdcc660f718bb403a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff2e03766ee1fa15263c4aeda5097d28"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2nd6_8h.html#aff2e03766ee1fa15263c4aeda5097d28">ND6_OPTION_TYPE_ROUTE_INFO</a>&#160;&#160;&#160;(24)</td></tr>
+<tr class="separator:aff2e03766ee1fa15263c4aeda5097d28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3188b9704a8ca598f54b87c3db73272e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2nd6_8h.html#a3188b9704a8ca598f54b87c3db73272e">ND6_OPTION_TYPE_RDNSS</a>&#160;&#160;&#160;(25)</td></tr>
+<tr class="separator:a3188b9704a8ca598f54b87c3db73272e"><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>ND6 protocol definitions </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="aab6c15c9bea51fbdcc660f718bb403a8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aab6c15c9bea51fbdcc660f718bb403a8">&#9670;&nbsp;</a></span>ND6_OPTION_TYPE_MTU</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ND6_OPTION_TYPE_MTU&#160;&#160;&#160;(0x05)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MTU option. </p>
+
+</div>
+</div>
+<a id="a0225d4c8911efdbdbc2b40de208906c2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0225d4c8911efdbdbc2b40de208906c2">&#9670;&nbsp;</a></span>ND6_OPTION_TYPE_PREFIX_INFO</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ND6_OPTION_TYPE_PREFIX_INFO&#160;&#160;&#160;(0x03)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Prefix information option. </p>
+
+</div>
+</div>
+<a id="a3188b9704a8ca598f54b87c3db73272e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3188b9704a8ca598f54b87c3db73272e">&#9670;&nbsp;</a></span>ND6_OPTION_TYPE_RDNSS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ND6_OPTION_TYPE_RDNSS&#160;&#160;&#160;(25)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Recursive DNS Server Option. </p>
+
+</div>
+</div>
+<a id="aeaa575c1a66ccaa2dc62ff2c0bd71619"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeaa575c1a66ccaa2dc62ff2c0bd71619">&#9670;&nbsp;</a></span>ND6_OPTION_TYPE_REDIR_HDR</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ND6_OPTION_TYPE_REDIR_HDR&#160;&#160;&#160;(0x04)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Redirected header option. </p>
+
+</div>
+</div>
+<a id="aff2e03766ee1fa15263c4aeda5097d28"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aff2e03766ee1fa15263c4aeda5097d28">&#9670;&nbsp;</a></span>ND6_OPTION_TYPE_ROUTE_INFO</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ND6_OPTION_TYPE_ROUTE_INFO&#160;&#160;&#160;(24)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Route information option. </p>
+
+</div>
+</div>
+<a id="a68ce8550a20cd30093d6e79e1ca51842"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a68ce8550a20cd30093d6e79e1ca51842">&#9670;&nbsp;</a></span>ND6_OPTION_TYPE_SOURCE_LLADDR</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ND6_OPTION_TYPE_SOURCE_LLADDR&#160;&#160;&#160;(0x01)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Link-layer address option. </p>
+
+</div>
+</div>
+<a id="a7fb1b330719d83b7525374f4beca51bc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7fb1b330719d83b7525374f4beca51bc">&#9670;&nbsp;</a></span>ND6_RA_FLAG_MANAGED_ADDR_CONFIG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ND6_RA_FLAG_MANAGED_ADDR_CONFIG&#160;&#160;&#160;(0x80)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Router advertisement message header. </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="dir_fa0f2b7ac208069fc8d28c28af349d8d.html">prot</a></li><li class="navelem"><a class="el" href="prot_2nd6_8h.html">nd6.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/prot_2nd6_8h.js b/doc/doxygen/output/html/prot_2nd6_8h.js
new file mode 100644
index 0000000..888167f
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2nd6_8h.js
@@ -0,0 +1,14 @@
+var prot_2nd6_8h =
+[
+    [ "ns_header", "structns__header.html", null ],
+    [ "na_header", "structna__header.html", null ],
+    [ "rs_header", "structrs__header.html", null ],
+    [ "redirect_header", "structredirect__header.html", null ],
+    [ "ND6_OPTION_TYPE_MTU", "prot_2nd6_8h.html#aab6c15c9bea51fbdcc660f718bb403a8", null ],
+    [ "ND6_OPTION_TYPE_PREFIX_INFO", "prot_2nd6_8h.html#a0225d4c8911efdbdbc2b40de208906c2", null ],
+    [ "ND6_OPTION_TYPE_RDNSS", "prot_2nd6_8h.html#a3188b9704a8ca598f54b87c3db73272e", null ],
+    [ "ND6_OPTION_TYPE_REDIR_HDR", "prot_2nd6_8h.html#aeaa575c1a66ccaa2dc62ff2c0bd71619", null ],
+    [ "ND6_OPTION_TYPE_ROUTE_INFO", "prot_2nd6_8h.html#aff2e03766ee1fa15263c4aeda5097d28", null ],
+    [ "ND6_OPTION_TYPE_SOURCE_LLADDR", "prot_2nd6_8h.html#a68ce8550a20cd30093d6e79e1ca51842", null ],
+    [ "ND6_RA_FLAG_MANAGED_ADDR_CONFIG", "prot_2nd6_8h.html#a7fb1b330719d83b7525374f4beca51bc", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/prot_2tcp_8h.html b/doc/doxygen/output/html/prot_2tcp_8h.html
new file mode 100644
index 0000000..9263070
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2tcp_8h.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/tcp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('prot_2tcp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">tcp.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>TCP 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_2tcp_8h.html">tcp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/prot_2udp_8h.html b/doc/doxygen/output/html/prot_2udp_8h.html
new file mode 100644
index 0000000..d8266cc
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2udp_8h.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/udp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('prot_2udp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">udp.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>UDP 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_2udp_8h.html">udp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/raw_8c.html b/doc/doxygen/output/html/raw_8c.html
new file mode 100644
index 0000000..f60a028
--- /dev/null
+++ b/doc/doxygen/output/html/raw_8c.html
@@ -0,0 +1,224 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/raw.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('raw_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">raw.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 &quot;<a class="el" href="def_8h.html">lwip/def.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="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="raw_8h.html">lwip/raw.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="raw__priv_8h.html">lwip/priv/raw_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6_8h.html">lwip/ip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="inet__chksum_8h.html">lwip/inet_chksum.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a03c4582d9ecf687e1f31d597c7889553"><td class="memItemLeft" align="right" valign="top"><a class="el" href="raw__priv_8h.html#aebbdbaee89c38ad9c007a1d1a336e687">raw_input_state_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="raw_8c.html#a03c4582d9ecf687e1f31d597c7889553">raw_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:a03c4582d9ecf687e1f31d597c7889553"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8576dbbc7f03797525d2cdb7ec3b9fe4"><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__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4">raw_bind</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr)</td></tr>
+<tr class="separator:ga8576dbbc7f03797525d2cdb7ec3b9fe4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa124ac8a9479aebefe2c953629df591a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a">raw_bind_netif</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, const struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gaa124ac8a9479aebefe2c953629df591a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga31bb29c964d5e2f734e563485fc25168"><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__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168">raw_connect</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr)</td></tr>
+<tr class="separator:ga31bb29c964d5e2f734e563485fc25168"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7634c0306e2c6f8040e35f6547e8d3ef"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef">raw_disconnect</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga7634c0306e2c6f8040e35f6547e8d3ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadf84e4e6911ce3c0d7f5669b6edac426"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426">raw_recv</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, <a class="el" href="raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd">raw_recv_fn</a> <a class="el" href="group__socket.html#gadd7ae45df7c005619eb1126542231e9b">recv</a>, void *recv_arg)</td></tr>
+<tr class="separator:gadf84e4e6911ce3c0d7f5669b6edac426"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga09427456070fb610cc7795d23dedc159"><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__raw__raw.html#ga09427456070fb610cc7795d23dedc159">raw_sendto</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr)</td></tr>
+<tr class="separator:ga09427456070fb610cc7795d23dedc159"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2fe3765ae938a3f7c53dc7051b7ab0b1"><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__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1">raw_sendto_if_src</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dst_ip, 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#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *src_ip)</td></tr>
+<tr class="separator:ga2fe3765ae938a3f7c53dc7051b7ab0b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabbc2e7c7a1b4429f420562d4f31b3a9d"><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__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d">raw_send</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:gabbc2e7c7a1b4429f420562d4f31b3a9d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8db62f7d75f722a653b5368305a47e16"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16">raw_remove</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga8db62f7d75f722a653b5368305a47e16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3217f096ea86728e011f91b249933e8f"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f">raw_new</a> (u8_t proto)</td></tr>
+<tr class="separator:ga3217f096ea86728e011f91b249933e8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3292b7ed2271ac29983edcef16dcbc11"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11">raw_new_ip_type</a> (u8_t type, u8_t proto)</td></tr>
+<tr class="separator:ga3292b7ed2271ac29983edcef16dcbc11"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61dc42f18e34800643000e48be6543ab"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="raw_8c.html#a61dc42f18e34800643000e48be6543ab">raw_netif_ip_addr_changed</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *old_addr, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *new_addr)</td></tr>
+<tr class="separator:a61dc42f18e34800643000e48be6543ab"><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>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>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a03c4582d9ecf687e1f31d597c7889553"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a03c4582d9ecf687e1f31d597c7889553">&#9670;&nbsp;</a></span>raw_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="raw__priv_8h.html#aebbdbaee89c38ad9c007a1d1a336e687">raw_input_state_t</a> raw_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Determine if in incoming IP packet is covered by a RAW PCB and if so, pass it to a user-provided receive callback function.</p>
+<p>Given an incoming IP datagram (as a chain of pbufs) this function finds a corresponding RAW PCB and calls the corresponding receive callback function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to be demultiplexed to a RAW PCB. </td></tr>
+    <tr><td class="paramname">inp</td><td>network interface on which the datagram was received. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>- 1 if the packet has been eaten by a RAW PCB receive callback function. The caller MAY NOT not reference the packet any longer, and MAY NOT call <a class="el" href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf_free()</a>. </dd>
+<dd>
+- 0 if packet is not eaten (pbuf is still referenced by the caller). </dd></dl>
+
+</div>
+</div>
+<a id="a61dc42f18e34800643000e48be6543ab"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a61dc42f18e34800643000e48be6543ab">&#9670;&nbsp;</a></span>raw_netif_ip_addr_changed()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void raw_netif_ip_addr_changed </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>old_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>new_addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called from <a class="el" href="netif_8c.html">netif.c</a> when address is changed</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">old_addr</td><td>IP address of the netif before change </td></tr>
+    <tr><td class="paramname">new_addr</td><td>IP address of the netif after change </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_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li><li class="navelem"><a class="el" href="raw_8c.html">raw.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/raw_8c.js b/doc/doxygen/output/html/raw_8c.js
new file mode 100644
index 0000000..fed5e65
--- /dev/null
+++ b/doc/doxygen/output/html/raw_8c.js
@@ -0,0 +1,16 @@
+var raw_8c =
+[
+    [ "raw_bind", "group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4", null ],
+    [ "raw_bind_netif", "group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a", null ],
+    [ "raw_connect", "group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168", null ],
+    [ "raw_disconnect", "group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef", null ],
+    [ "raw_input", "raw_8c.html#a03c4582d9ecf687e1f31d597c7889553", null ],
+    [ "raw_netif_ip_addr_changed", "raw_8c.html#a61dc42f18e34800643000e48be6543ab", null ],
+    [ "raw_new", "group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f", null ],
+    [ "raw_new_ip_type", "group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11", null ],
+    [ "raw_recv", "group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426", null ],
+    [ "raw_remove", "group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16", null ],
+    [ "raw_send", "group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d", null ],
+    [ "raw_sendto", "group__raw__raw.html#ga09427456070fb610cc7795d23dedc159", null ],
+    [ "raw_sendto_if_src", "group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/raw_8h.html b/doc/doxygen/output/html/raw_8h.html
new file mode 100644
index 0000000..4a2a72b
--- /dev/null
+++ b/doc/doxygen/output/html/raw_8h.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/raw.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('raw_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">raw.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="pbuf_8h.html">lwip/pbuf.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="ip_8h.html">lwip/ip.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="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structraw__pcb.html">raw_pcb</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 name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a17edd059f34f45a770fe2fa458ecf4dd"><td class="memItemLeft" align="right" valign="top">typedef u8_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd">raw_recv_fn</a>) (void *arg, struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr)</td></tr>
+<tr class="separator:a17edd059f34f45a770fe2fa458ecf4dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga3217f096ea86728e011f91b249933e8f"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f">raw_new</a> (u8_t proto)</td></tr>
+<tr class="separator:ga3217f096ea86728e011f91b249933e8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3292b7ed2271ac29983edcef16dcbc11"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11">raw_new_ip_type</a> (u8_t type, u8_t proto)</td></tr>
+<tr class="separator:ga3292b7ed2271ac29983edcef16dcbc11"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8db62f7d75f722a653b5368305a47e16"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16">raw_remove</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga8db62f7d75f722a653b5368305a47e16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8576dbbc7f03797525d2cdb7ec3b9fe4"><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__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4">raw_bind</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr)</td></tr>
+<tr class="separator:ga8576dbbc7f03797525d2cdb7ec3b9fe4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa124ac8a9479aebefe2c953629df591a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a">raw_bind_netif</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, const struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gaa124ac8a9479aebefe2c953629df591a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga31bb29c964d5e2f734e563485fc25168"><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__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168">raw_connect</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr)</td></tr>
+<tr class="separator:ga31bb29c964d5e2f734e563485fc25168"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7634c0306e2c6f8040e35f6547e8d3ef"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef">raw_disconnect</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga7634c0306e2c6f8040e35f6547e8d3ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga09427456070fb610cc7795d23dedc159"><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__raw__raw.html#ga09427456070fb610cc7795d23dedc159">raw_sendto</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr)</td></tr>
+<tr class="separator:ga09427456070fb610cc7795d23dedc159"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2fe3765ae938a3f7c53dc7051b7ab0b1"><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__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1">raw_sendto_if_src</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dst_ip, 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#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *src_ip)</td></tr>
+<tr class="separator:ga2fe3765ae938a3f7c53dc7051b7ab0b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabbc2e7c7a1b4429f420562d4f31b3a9d"><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__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d">raw_send</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:gabbc2e7c7a1b4429f420562d4f31b3a9d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadf84e4e6911ce3c0d7f5669b6edac426"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426">raw_recv</a> (struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, <a class="el" href="raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd">raw_recv_fn</a> <a class="el" href="group__socket.html#gadd7ae45df7c005619eb1126542231e9b">recv</a>, void *recv_arg)</td></tr>
+<tr class="separator:gadf84e4e6911ce3c0d7f5669b6edac426"><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>raw API (to be used from TCPIP thread)<br />
+See also <a class="el" href="group__raw__raw.html">RAW</a> </p>
+</div><h2 class="groupheader">Typedef Documentation</h2>
+<a id="a17edd059f34f45a770fe2fa458ecf4dd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a17edd059f34f45a770fe2fa458ecf4dd">&#9670;&nbsp;</a></span>raw_recv_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef u8_t(* raw_recv_fn) (void *arg, struct <a class="el" href="structraw__pcb.html">raw_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for raw pcb receive callback functions. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>user supplied argument (raw_pcb.recv_arg) </td></tr>
+    <tr><td class="paramname">pcb</td><td>the <a class="el" href="structraw__pcb.html">raw_pcb</a> which received data </td></tr>
+    <tr><td class="paramname">p</td><td>the packet buffer that was received </td></tr>
+    <tr><td class="paramname">addr</td><td>the remote IP address from which the packet was received </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if the packet was 'eaten' (aka. deleted), 0 if the packet lives on If returning 1, the callback is responsible for freeing the pbuf if it's not used any more. </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="raw_8h.html">raw.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/raw_8h.js b/doc/doxygen/output/html/raw_8h.js
new file mode 100644
index 0000000..ff09a65
--- /dev/null
+++ b/doc/doxygen/output/html/raw_8h.js
@@ -0,0 +1,16 @@
+var raw_8h =
+[
+    [ "raw_pcb", "structraw__pcb.html", "structraw__pcb" ],
+    [ "raw_recv_fn", "raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd", null ],
+    [ "raw_bind", "group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4", null ],
+    [ "raw_bind_netif", "group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a", null ],
+    [ "raw_connect", "group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168", null ],
+    [ "raw_disconnect", "group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef", null ],
+    [ "raw_new", "group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f", null ],
+    [ "raw_new_ip_type", "group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11", null ],
+    [ "raw_recv", "group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426", null ],
+    [ "raw_remove", "group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16", null ],
+    [ "raw_send", "group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d", null ],
+    [ "raw_sendto", "group__raw__raw.html#ga09427456070fb610cc7795d23dedc159", null ],
+    [ "raw_sendto_if_src", "group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/raw__priv_8h.html b/doc/doxygen/output/html/raw__priv_8h.html
new file mode 100644
index 0000000..cd7f0a9
--- /dev/null
+++ b/doc/doxygen/output/html/raw__priv_8h.html
@@ -0,0 +1,235 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/priv/raw_priv.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('raw__priv_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">raw_priv.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="raw_8h.html">lwip/raw.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:aebbdbaee89c38ad9c007a1d1a336e687"><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="raw__priv_8h.html#a2580ec946c4196127888d5405257866b">raw_input_state</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="raw__priv_8h.html#aebbdbaee89c38ad9c007a1d1a336e687">raw_input_state_t</a></td></tr>
+<tr class="separator:aebbdbaee89c38ad9c007a1d1a336e687"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:a2580ec946c4196127888d5405257866b"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="raw__priv_8h.html#a2580ec946c4196127888d5405257866b">raw_input_state</a> </td></tr>
+<tr class="separator:a2580ec946c4196127888d5405257866b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a03c4582d9ecf687e1f31d597c7889553"><td class="memItemLeft" align="right" valign="top"><a class="el" href="raw__priv_8h.html#aebbdbaee89c38ad9c007a1d1a336e687">raw_input_state_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="raw__priv_8h.html#a03c4582d9ecf687e1f31d597c7889553">raw_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:a03c4582d9ecf687e1f31d597c7889553"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61dc42f18e34800643000e48be6543ab"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="raw__priv_8h.html#a61dc42f18e34800643000e48be6543ab">raw_netif_ip_addr_changed</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *old_addr, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *new_addr)</td></tr>
+<tr class="separator:a61dc42f18e34800643000e48be6543ab"><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>raw API internal implementations (do not use in application code) </p>
+</div><h2 class="groupheader">Typedef Documentation</h2>
+<a id="aebbdbaee89c38ad9c007a1d1a336e687"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aebbdbaee89c38ad9c007a1d1a336e687">&#9670;&nbsp;</a></span>raw_input_state_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef enum <a class="el" href="raw__priv_8h.html#a2580ec946c4196127888d5405257866b">raw_input_state</a>  <a class="el" href="raw__priv_8h.html#aebbdbaee89c38ad9c007a1d1a336e687">raw_input_state_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>return codes for raw_input </p>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="a2580ec946c4196127888d5405257866b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2580ec946c4196127888d5405257866b">&#9670;&nbsp;</a></span>raw_input_state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="raw__priv_8h.html#a2580ec946c4196127888d5405257866b">raw_input_state</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>return codes for raw_input </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a03c4582d9ecf687e1f31d597c7889553"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a03c4582d9ecf687e1f31d597c7889553">&#9670;&nbsp;</a></span>raw_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="raw__priv_8h.html#aebbdbaee89c38ad9c007a1d1a336e687">raw_input_state_t</a> raw_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Determine if in incoming IP packet is covered by a RAW PCB and if so, pass it to a user-provided receive callback function.</p>
+<p>Given an incoming IP datagram (as a chain of pbufs) this function finds a corresponding RAW PCB and calls the corresponding receive callback function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to be demultiplexed to a RAW PCB. </td></tr>
+    <tr><td class="paramname">inp</td><td>network interface on which the datagram was received. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>- 1 if the packet has been eaten by a RAW PCB receive callback function. The caller MAY NOT not reference the packet any longer, and MAY NOT call <a class="el" href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf_free()</a>. </dd>
+<dd>
+- 0 if packet is not eaten (pbuf is still referenced by the caller). </dd></dl>
+
+</div>
+</div>
+<a id="a61dc42f18e34800643000e48be6543ab"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a61dc42f18e34800643000e48be6543ab">&#9670;&nbsp;</a></span>raw_netif_ip_addr_changed()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void raw_netif_ip_addr_changed </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>old_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>new_addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called from <a class="el" href="netif_8c.html">netif.c</a> when address is changed</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">old_addr</td><td>IP address of the netif before change </td></tr>
+    <tr><td class="paramname">new_addr</td><td>IP address of the netif after change </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_460c501b2432fc107adcb38111835e48.html">priv</a></li><li class="navelem"><a class="el" href="raw__priv_8h.html">raw_priv.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/raw__priv_8h.js b/doc/doxygen/output/html/raw__priv_8h.js
new file mode 100644
index 0000000..e6b0296
--- /dev/null
+++ b/doc/doxygen/output/html/raw__priv_8h.js
@@ -0,0 +1,7 @@
+var raw__priv_8h =
+[
+    [ "raw_input_state_t", "raw__priv_8h.html#aebbdbaee89c38ad9c007a1d1a336e687", null ],
+    [ "raw_input_state", "raw__priv_8h.html#a2580ec946c4196127888d5405257866b", null ],
+    [ "raw_input", "raw__priv_8h.html#a03c4582d9ecf687e1f31d597c7889553", null ],
+    [ "raw_netif_ip_addr_changed", "raw__priv_8h.html#a61dc42f18e34800643000e48be6543ab", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/resize.js b/doc/doxygen/output/html/resize.js
new file mode 100644
index 0000000..56e4a02
--- /dev/null
+++ b/doc/doxygen/output/html/resize.js
@@ -0,0 +1,114 @@
+function initResizable()
+{
+  var cookie_namespace = 'doxygen';
+  var sidenav,navtree,content,header,collapsed,collapsedWidth=0,barWidth=6,desktop_vp=768,titleHeight;
+
+  function readCookie(cookie)
+  {
+    var myCookie = cookie_namespace+"_"+cookie+"=";
+    if (document.cookie) {
+      var index = document.cookie.indexOf(myCookie);
+      if (index != -1) {
+        var valStart = index + myCookie.length;
+        var valEnd = document.cookie.indexOf(";", valStart);
+        if (valEnd == -1) {
+          valEnd = document.cookie.length;
+        }
+        var val = document.cookie.substring(valStart, valEnd);
+        return val;
+      }
+    }
+    return 0;
+  }
+
+  function writeCookie(cookie, val, expiration)
+  {
+    if (val==undefined) return;
+    if (expiration == null) {
+      var date = new Date();
+      date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week
+      expiration = date.toGMTString();
+    }
+    document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; expires=" + expiration+"; path=/";
+  }
+
+  function resizeWidth()
+  {
+    var windowWidth = $(window).width() + "px";
+    var sidenavWidth = $(sidenav).outerWidth();
+    content.css({marginLeft:parseInt(sidenavWidth)+"px"});
+    writeCookie('width',sidenavWidth-barWidth, null);
+  }
+
+  function restoreWidth(navWidth)
+  {
+    var windowWidth = $(window).width() + "px";
+    content.css({marginLeft:parseInt(navWidth)+barWidth+"px"});
+    sidenav.css({width:navWidth + "px"});
+  }
+
+  function resizeHeight()
+  {
+    var headerHeight = header.outerHeight();
+    var footerHeight = footer.outerHeight();
+    var windowHeight = $(window).height() - headerHeight - footerHeight;
+    content.css({height:windowHeight + "px"});
+    navtree.css({height:windowHeight + "px"});
+    sidenav.css({height:windowHeight + "px"});
+    var width=$(window).width();
+    if (width!=collapsedWidth) {
+      if (width<desktop_vp && collapsedWidth>=desktop_vp) {
+        if (!collapsed) {
+          collapseExpand();
+        }
+      } else if (width>desktop_vp && collapsedWidth<desktop_vp) {
+        if (collapsed) {
+          collapseExpand();
+        }
+      }
+      collapsedWidth=width;
+    }
+  }
+
+  function collapseExpand()
+  {
+    if (sidenav.width()>0) {
+      restoreWidth(0);
+      collapsed=true;
+    }
+    else {
+      var width = readCookie('width');
+      if (width>200 && width<$(window).width()) { restoreWidth(width); } else { restoreWidth(200); }
+      collapsed=false;
+    }
+  }
+
+  header  = $("#top");
+  sidenav = $("#side-nav");
+  content = $("#doc-content");
+  navtree = $("#nav-tree");
+  footer  = $("#nav-path");
+  $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } });
+  $(sidenav).resizable({ minWidth: 0 });
+  $(window).resize(function() { resizeHeight(); });
+  var device = navigator.userAgent.toLowerCase();
+  var touch_device = device.match(/(iphone|ipod|ipad|android)/);
+  if (touch_device) { /* wider split bar for touch only devices */
+    $(sidenav).css({ paddingRight:'20px' });
+    $('.ui-resizable-e').css({ width:'20px' });
+    $('#nav-sync').css({ right:'34px' });
+    barWidth=20;
+  }
+  var width = readCookie('width');
+  if (width) { restoreWidth(width); } else { resizeWidth(); }
+  resizeHeight();
+  var url = location.href;
+  var i=url.indexOf("#");
+  if (i>=0) window.location.hash=url.substr(i);
+  var _preventDefault = function(evt) { evt.preventDefault(); };
+  $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault);
+  $(".ui-resizable-handle").dblclick(collapseExpand);
+  $(window).load(resizeHeight);
+}
+
+
diff --git a/doc/doxygen/output/html/search/all_0.html b/doc/doxygen/output/html/search/all_0.html
new file mode 100644
index 0000000..f25360b
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_0.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_0.js b/doc/doxygen/output/html/search/all_0.js
new file mode 100644
index 0000000..d15c401
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_0.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['6lowpan_20over_20ble_20_28rfc7668_29',['6LoWPAN over BLE (RFC7668)',['../group__rfc7668if.html',1,'']]],
+  ['6lowpan_20_28rfc4944_29',['6LoWPAN (RFC4944)',['../group__sixlowpan.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/all_1.html b/doc/doxygen/output/html/search/all_1.html
new file mode 100644
index 0000000..b13f0f7
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_1.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_1.js b/doc/doxygen/output/html/search/all_1.js
new file mode 100644
index 0000000..f3738f2
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_1.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+  ['_5fhoplim',['_hoplim',['../structip6__hdr.html#af9cbfa5fa280a7a982a1c6268fa13a5a',1,'ip6_hdr']]],
+  ['_5flwiperf_5fsettings',['_lwiperf_settings',['../struct__lwiperf__settings.html',1,'']]],
+  ['_5flwiperf_5fstate_5ftcp',['_lwiperf_state_tcp',['../struct__lwiperf__state__tcp.html',1,'']]],
+  ['_5fnexth',['_nexth',['../structip6__hdr.html#abe3d612d4570864c922e18ed838292f6',1,'ip6_hdr']]],
+  ['_5fplen',['_plen',['../structip6__hdr.html#a9d225109d601ae8b34bab6ca3528fa94',1,'ip6_hdr']]],
+  ['_5fv_5ftc_5ffl',['_v_tc_fl',['../structip6__hdr.html#ad3b638f503a3f7e7724cf4c7b2c0a0b5',1,'ip6_hdr']]]
+];
diff --git a/doc/doxygen/output/html/search/all_10.html b/doc/doxygen/output/html/search/all_10.html
new file mode 100644
index 0000000..d1345a1
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_10.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_10.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_10.js b/doc/doxygen/output/html/search/all_10.js
new file mode 100644
index 0000000..0cbbe1d
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_10.js
@@ -0,0 +1,27 @@
+var searchData=
+[
+  ['options',['Options',['../group__bridgeif__opts.html',1,'']]],
+  ['options',['Options',['../group__httpd__opts.html',1,'']]],
+  ['overview',['Overview',['../index.html',1,'']]],
+  ['options_20_28lwipopts_2eh_29',['Options (lwipopts.h)',['../group__lwip__opts.html',1,'']]],
+  ['os_20mode_20_28tcpip_20thread_29',['OS mode (TCPIP thread)',['../group__lwip__os.html',1,'']]],
+  ['options',['Options',['../group__mdns__opts.html',1,'']]],
+  ['options',['Options',['../group__mqtt__opts.html',1,'']]],
+  ['options',['Options',['../group__netbiosns__opts.html',1,'']]],
+  ['offset',['offset',['../structapi__msg.html#a4bd9382dd42b18120803e246a0203353',1,'api_msg']]],
+  ['oid',['oid',['../structsnmp__varbind.html#ace3a9e4dcdc9a5ec79a20c84946418a4',1,'snmp_varbind::oid()'],['../structsnmp__node.html#ae7a3bb0eb49ac527d461be414937f271',1,'snmp_node::oid()']]],
+  ['old_5faddress',['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',['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',['op_completed',['../structnetconn.html#a982506698a59f185ff3f16d1675ea4ae',1,'netconn']]],
+  ['open',['open',['../structtftp__context.html#ae70d64e8e20328cc492d766506df4cba',1,'tftp_context']]],
+  ['opt_2eh',['opt.h',['../opt_8h.html',1,'']]],
+  ['optimization_20hints',['Optimization hints',['../optimization.html',1,'']]],
+  ['original',['original',['../structpbuf__custom__ref.html#a135a1476908337d8073241fd7f68fa1d',1,'pbuf_custom_ref']]],
+  ['output',['output',['../structmqtt__client__s.html#a667c1dc7a6008055b63877acb06f333c',1,'mqtt_client_s::output()'],['../structnetif.html#a8e1dcfe65db487feecd244355f39215e',1,'netif::output()']]],
+  ['output_5fip6',['output_ip6',['../structnetif.html#ac38383379cff22c402156fec71c19617',1,'netif']]],
+  ['options',['Options',['../group__smtp__opts.html',1,'']]],
+  ['options',['Options',['../group__snmp__opts.html',1,'']]],
+  ['options',['Options',['../group__sntp__opts.html',1,'']]],
+  ['os_20abstraction_20layer',['OS abstraction layer',['../group__sys__os.html',1,'']]],
+  ['options',['Options',['../group__tftp__opts.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/all_11.html b/doc/doxygen/output/html/search/all_11.html
new file mode 100644
index 0000000..2be8b71
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_11.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_11.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_11.js b/doc/doxygen/output/html/search/all_11.js
new file mode 100644
index 0000000..8dd1312
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_11.js
@@ -0,0 +1,107 @@
+var searchData=
+[
+  ['pbuf',['PBUF',['../group__lwip__opts__pbuf.html',1,'']]],
+  ['performance',['Performance',['../group__lwip__opts__perf.html',1,'']]],
+  ['pack_5fstruct_5fbegin',['PACK_STRUCT_BEGIN',['../group__compiler__abstraction.html#ga73199061891adf1b912d20835c7d5e96',1,'arch.h']]],
+  ['pack_5fstruct_5fend',['PACK_STRUCT_END',['../group__compiler__abstraction.html#ga465fef70f294e21cbf4ea51fc342f20e',1,'arch.h']]],
+  ['pack_5fstruct_5ffield',['PACK_STRUCT_FIELD',['../group__compiler__abstraction.html#gaab0b988124e37a978d9a88e7c1c778e0',1,'arch.h']]],
+  ['pack_5fstruct_5ffld_5f8',['PACK_STRUCT_FLD_8',['../group__compiler__abstraction.html#gaa8f75e4117374c2d09fbda5566e40b62',1,'arch.h']]],
+  ['pack_5fstruct_5ffld_5fs',['PACK_STRUCT_FLD_S',['../group__compiler__abstraction.html#gacc89e224363eb0ebca24b64d925c3cb7',1,'arch.h']]],
+  ['pack_5fstruct_5fstruct',['PACK_STRUCT_STRUCT',['../group__compiler__abstraction.html#ga33623da05bb55497534c3dc26ebebeb2',1,'arch.h']]],
+  ['pack_5fstruct_5fuse_5fincludes',['PACK_STRUCT_USE_INCLUDES',['../group__compiler__abstraction.html#ga57b90d36d8bea3798a5d1815945fd8ef',1,'arch.h']]],
+  ['parse_5foffset',['parse_offset',['../structmdns__packet.html#a4c3c3a28ac113b3ee40d5cf07d851f68',1,'mdns_packet']]],
+  ['pass',['pass',['../structsmtp__session.html#a7a5a3c00378ce076ce70236525afd431',1,'smtp_session']]],
+  ['passive_5fopen',['passive_open',['../structtcp__ext__arg__callbacks.html#a86b5816e8285378813963d09272b050a',1,'tcp_ext_arg_callbacks']]],
+  ['payload',['payload',['../structpbuf.html#a8d32dc3e964369d4eec638fc37fbc460',1,'pbuf::payload()'],['../structpbuf__rom.html#a5cd0dcc590038629644ad775d76230a1',1,'pbuf_rom::payload()']]],
+  ['pbuf',['pbuf',['../structpbuf.html',1,'pbuf'],['../structmdns__packet.html#a2ec02a67fd82f0df695e94745eddaf45',1,'mdns_packet::pbuf()'],['../structmdns__outpacket.html#a83d4504736f2bf315fc8b712c6a446e9',1,'mdns_outpacket::pbuf()'],['../structpbuf__custom.html#a100e338f13464e76b46896647b962ed8',1,'pbuf_custom::pbuf()'],['../group__pbuf.html',1,'(Global Namespace)']]],
+  ['pbuf_2ec',['pbuf.c',['../pbuf_8c.html',1,'']]],
+  ['pbuf_2eh',['pbuf.h',['../pbuf_8h.html',1,'']]],
+  ['pbuf_5fadd_5fheader',['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',['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',['pbuf_alloc',['../group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47',1,'pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type):&#160;pbuf.c'],['../group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47',1,'pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type):&#160;pbuf.c']]],
+  ['pbuf_5falloc_5fflag_5fdata_5fcontiguous',['PBUF_ALLOC_FLAG_DATA_CONTIGUOUS',['../pbuf_8h.html#a426883d928f8f3e8fd066e616159d78f',1,'pbuf.h']]],
+  ['pbuf_5falloc_5fflag_5frx',['PBUF_ALLOC_FLAG_RX',['../pbuf_8h.html#a567a0dfa01b0e5540f9416a200ed163f',1,'pbuf.h']]],
+  ['pbuf_5falloc_5freference',['pbuf_alloc_reference',['../group__pbuf.html#ga4caa46c6d560d9d0da2be845bc9c2fab',1,'pbuf_alloc_reference(void *payload, u16_t length, pbuf_type type):&#160;pbuf.c'],['../group__pbuf.html#ga4caa46c6d560d9d0da2be845bc9c2fab',1,'pbuf_alloc_reference(void *payload, u16_t length, pbuf_type type):&#160;pbuf.c']]],
+  ['pbuf_5falloced_5fcustom',['pbuf_alloced_custom',['../group__pbuf.html#ga90fa2bbf6ea4a263ee8f7b77c75683c2',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#ga90fa2bbf6ea4a263ee8f7b77c75683c2',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',['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',['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',['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',['pbuf_clone',['../group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0',1,'pbuf_clone(pbuf_layer layer, pbuf_type type, struct pbuf *p):&#160;pbuf.c'],['../group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0',1,'pbuf_clone(pbuf_layer l, pbuf_type type, struct pbuf *p):&#160;pbuf.c']]],
+  ['pbuf_5fcoalesce',['pbuf_coalesce',['../group__pbuf.html#ga54ac7b116c6f53c704cbf74f35a8b35c',1,'pbuf_coalesce(struct pbuf *p, pbuf_layer layer):&#160;pbuf.c'],['../group__pbuf.html#ga54ac7b116c6f53c704cbf74f35a8b35c',1,'pbuf_coalesce(struct pbuf *p, pbuf_layer layer):&#160;pbuf.c']]],
+  ['pbuf_5fcopy',['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',['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_5fcustom',['pbuf_custom',['../structpbuf__custom.html',1,'']]],
+  ['pbuf_5fcustom_5fref',['pbuf_custom_ref',['../structpbuf__custom__ref.html',1,'']]],
+  ['pbuf_5fdebug',['PBUF_DEBUG',['../group__lwip__opts__debugmsg.html#ga5c3d44a0ec3bb8bd66f776c70d5c6a6c',1,'opt.h']]],
+  ['pbuf_5fdechain',['pbuf_dechain',['../pbuf_8c.html#abf3d29c4f43986b4cb5eb314d5b9729d',1,'pbuf_dechain(struct pbuf *p):&#160;pbuf.c'],['../pbuf_8h.html#abf3d29c4f43986b4cb5eb314d5b9729d',1,'pbuf_dechain(struct pbuf *p):&#160;pbuf.c']]],
+  ['pbuf_5fflag_5fis_5fcustom',['PBUF_FLAG_IS_CUSTOM',['../pbuf_8h.html#af78a7e1815dc0e31884d095b666d997f',1,'pbuf.h']]],
+  ['pbuf_5fflag_5fllbcast',['PBUF_FLAG_LLBCAST',['../pbuf_8h.html#a6772c16662bbb78597399add086500c0',1,'pbuf.h']]],
+  ['pbuf_5fflag_5fllmcast',['PBUF_FLAG_LLMCAST',['../pbuf_8h.html#ac0d56cde47aca24ef410d730d7c89887',1,'pbuf.h']]],
+  ['pbuf_5fflag_5fmcastloop',['PBUF_FLAG_MCASTLOOP',['../pbuf_8h.html#ab8ad153151a8c157335d9c0cedc007e6',1,'pbuf.h']]],
+  ['pbuf_5fflag_5fpush',['PBUF_FLAG_PUSH',['../pbuf_8h.html#a018a6499e357f8a1373321f802a82930',1,'pbuf.h']]],
+  ['pbuf_5fflag_5ftcp_5ffin',['PBUF_FLAG_TCP_FIN',['../pbuf_8h.html#a36a915aa2f6a188baa2862881407971e',1,'pbuf.h']]],
+  ['pbuf_5ffree',['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',['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_5fcustom_5ffn',['pbuf_free_custom_fn',['../pbuf_8h.html#a6d285ce1d910f25e511c8c38532a1dce',1,'pbuf.h']]],
+  ['pbuf_5ffree_5fheader',['pbuf_free_header',['../pbuf_8c.html#a25a3b8edc783896b03819a966d00845e',1,'pbuf_free_header(struct pbuf *q, u16_t size):&#160;pbuf.c'],['../pbuf_8h.html#a25a3b8edc783896b03819a966d00845e',1,'pbuf_free_header(struct pbuf *q, u16_t size):&#160;pbuf.c']]],
+  ['pbuf_5fget_5fat',['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',['pbuf_get_contiguous',['../group__pbuf.html#gad0357ae0be17b2aacd0c301cdc86fc39',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#gad0357ae0be17b2aacd0c301cdc86fc39',1,'pbuf_get_contiguous(const struct pbuf *p, void *buffer, size_t bufsize, u16_t len, u16_t offset):&#160;pbuf.c']]],
+  ['pbuf_5fheader',['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',['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_5fip',['PBUF_IP',['../group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfafcc1e506061ba69dfa142eb6b3da5f13',1,'pbuf.h']]],
+  ['pbuf_5flayer',['pbuf_layer',['../group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf',1,'pbuf.h']]],
+  ['pbuf_5flink',['PBUF_LINK',['../group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfab4de441e737330558b609a990cd17346',1,'pbuf.h']]],
+  ['pbuf_5flink_5fencapsulation_5fhlen',['PBUF_LINK_ENCAPSULATION_HLEN',['../group__lwip__opts__pbuf.html#ga6e1ba1875ae5168a17b53d83597bc1de',1,'opt.h']]],
+  ['pbuf_5flink_5fhlen',['PBUF_LINK_HLEN',['../group__lwip__opts__pbuf.html#ga35998a3d56af9940e6a80bb372597685',1,'opt.h']]],
+  ['pbuf_5fmemcmp',['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',['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_5fneeds_5fcopy',['PBUF_NEEDS_COPY',['../group__pbuf.html#ga894d91d811fd986f3cc3da828fa7beb3',1,'pbuf.h']]],
+  ['pbuf_5fpool',['PBUF_POOL',['../group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbae969347127387b9b59a23ccd24b76d21',1,'pbuf.h']]],
+  ['pbuf_5fpool_5fbufsize',['PBUF_POOL_BUFSIZE',['../group__lwip__opts__pbuf.html#gae61f4491d56e805e79b79eb5d35a00e5',1,'opt.h']]],
+  ['pbuf_5fpool_5ffree_5fooseq',['PBUF_POOL_FREE_OOSEQ',['../pbuf_8h.html#ac54b0f161128a32c7419c33b893a5106',1,'pbuf.h']]],
+  ['pbuf_5fpool_5fsize',['PBUF_POOL_SIZE',['../group__lwip__opts__memp.html#ga50eaadc4cad0716410332691e382c38a',1,'opt.h']]],
+  ['pbuf_5fput_5fat',['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_5fram',['PBUF_RAM',['../group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac5e9f28455bca98944a030d4b84ecfab',1,'pbuf.h']]],
+  ['pbuf_5fraw',['PBUF_RAW',['../group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba',1,'pbuf.h']]],
+  ['pbuf_5fraw_5ftx',['PBUF_RAW_TX',['../group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa0ff039585f05f9208bcb66c2d37783e2',1,'pbuf.h']]],
+  ['pbuf_5frealloc',['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',['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'],['../group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac9b6ba960fdea6f2e8f35c8313b77e4e',1,'PBUF_REF():&#160;pbuf.h']]],
+  ['pbuf_5fremove_5fheader',['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_5from',['pbuf_rom',['../structpbuf__rom.html',1,'pbuf_rom'],['../group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac120b0fe39efe35bb682e4aa3b82e2c9',1,'PBUF_ROM():&#160;pbuf.h']]],
+  ['pbuf_5fskip',['pbuf_skip',['../group__pbuf.html#ga6a961522d81f0327aaf4d4ee6d96c583',1,'pbuf_skip(struct pbuf *in, u16_t in_offset, u16_t *out_offset):&#160;pbuf.c'],['../group__pbuf.html#ga6a961522d81f0327aaf4d4ee6d96c583',1,'pbuf_skip(struct pbuf *in, u16_t in_offset, u16_t *out_offset):&#160;pbuf.c']]],
+  ['pbuf_5fstrstr',['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',['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',['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_5ftransport',['PBUF_TRANSPORT',['../group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa2ded3594a3977f8bf9cf09552be327b5',1,'pbuf.h']]],
+  ['pbuf_5ftry_5fget_5fat',['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']]],
+  ['pbuf_5ftype',['pbuf_type',['../group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb',1,'pbuf.h']]],
+  ['pbuf_5ftype_5falloc_5fsrc_5fmask',['PBUF_TYPE_ALLOC_SRC_MASK',['../pbuf_8h.html#a97d4db8e0f127f61af0016c184c865ca',1,'pbuf.h']]],
+  ['pbuf_5ftype_5falloc_5fsrc_5fmask_5fapp_5fmax',['PBUF_TYPE_ALLOC_SRC_MASK_APP_MAX',['../pbuf_8h.html#aad686ef346759a221abdb45f64649816',1,'pbuf.h']]],
+  ['pbuf_5ftype_5falloc_5fsrc_5fmask_5fapp_5fmin',['PBUF_TYPE_ALLOC_SRC_MASK_APP_MIN',['../pbuf_8h.html#aa1f62ba9dc5d462e67e33c4be64c601a',1,'pbuf.h']]],
+  ['pbuf_5ftype_5fflag_5fdata_5fvolatile',['PBUF_TYPE_FLAG_DATA_VOLATILE',['../pbuf_8h.html#a02789ca67766def65000b58f7fe7d03b',1,'pbuf.h']]],
+  ['pbuf_5ftype_5fflag_5fstruct_5fdata_5fcontiguous',['PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS',['../pbuf_8h.html#a49ab2c0662378f268ed8209bd54aaedf',1,'pbuf.h']]],
+  ['pc',['pc',['../structpbuf__custom__ref.html#af5884b6a7031d73406cb9596a51382b7',1,'pbuf_custom_ref']]],
+  ['pcb',['pcb',['../structnetconn.html#a2af6773c9f6ee91e7f462dd8acc07de6',1,'netconn']]],
+  ['pend_5freq_5fqueue',['pend_req_queue',['../structmqtt__client__s.html#a1897eeefe64f9e2d2d953adca858f439',1,'mqtt_client_s']]],
+  ['pending_5ferr',['pending_err',['../structnetconn.html#a2a54e90fa370cf0df46dfd0b97f1cce7',1,'netconn']]],
+  ['performance_20measurement',['Performance measurement',['../group__perf.html',1,'']]],
+  ['period_5fof_5fstatistics',['period_of_statistics',['../structnetbios__answer.html#a31ec9ea28b5801b9bb5f1b240d3412de',1,'netbios_answer']]],
+  ['pkt_5fid',['pkt_id',['../structmqtt__request__t.html#af2dc3cd85cdad25b9b3e1534ecc0cb58',1,'mqtt_request_t']]],
+  ['pkt_5fid_5fseq',['pkt_id_seq',['../structmqtt__client__s.html#ab4100f6e0867c212d5923f10024f2e32',1,'mqtt_client_s']]],
+  ['poll',['poll',['../group__socket.html#ga80ae38841b0e64e60618cd8bf857f617',1,'sockets.h']]],
+  ['poll_5ffds',['poll_fds',['../structlwip__select__cb.html#ae39fc1bef3938380d15085e0141639de',1,'lwip_select_cb']]],
+  ['poll_5fnfds',['poll_nfds',['../structlwip__select__cb.html#a39c4980c261380481f79af2b536ebfba',1,'lwip_select_cb']]],
+  ['port',['port',['../structmdns__service.html#abbf317cde8fb7ba8d834ad9746dd780c',1,'mdns_service']]],
+  ['ppp',['PPP',['../group__ppp.html',1,'']]],
+  ['pppapi_2ec',['pppapi.c',['../pppapi_8c.html',1,'']]],
+  ['pppol2tp_2ec',['pppol2tp.c',['../pppol2tp_8c.html',1,'']]],
+  ['pppol2tp_2eh',['pppol2tp.h',['../pppol2tp_8h.html',1,'']]],
+  ['pppos_2ec',['pppos.c',['../pppos_8c.html',1,'']]],
+  ['pppos_2eh',['pppos.h',['../pppos_8h.html',1,'']]],
+  ['prev',['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',['probes_sent',['../structmdns__host.html#ac8f6e3c6e1251bf73f043e489c840922',1,'mdns_host']]],
+  ['probing_5fstate',['probing_state',['../structmdns__host.html#af9ced31c35de6a281e5b13f01e5aae61',1,'mdns_host']]],
+  ['proto',['proto',['../structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d',1,'mdns_service']]],
+  ['ptr',['ptr',['../structnetvector.html#a523362737ea7764f9aaa73a050a0b983',1,'netvector']]],
+  ['porting_20_28system_20abstraction_20layer_29',['Porting (system abstraction layer)',['../group__sys__layer.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/all_12.html b/doc/doxygen/output/html/search/all_12.html
new file mode 100644
index 0000000..13c5263
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_12.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_12.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_12.js b/doc/doxygen/output/html/search/all_12.js
new file mode 100644
index 0000000..8d63e1c
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_12.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+  ['q',['q',['../structnd6__neighbor__cache__entry.html#a830674446a45eb200d38a45fbdd5c5df',1,'nd6_neighbor_cache_entry']]],
+  ['query_5fname',['query_name',['../structnetbios__answer.html#aa024ce7e0e233c42393f5c3c378d3f9b',1,'netbios_answer']]],
+  ['questions',['questions',['../structmdns__packet.html#a09211e78f7f773c492b5856d31423699',1,'mdns_packet::questions()'],['../structmdns__outpacket.html#a0d402cde040728d361dec8f7d86f504c',1,'mdns_outpacket::questions()']]],
+  ['questions_5fleft',['questions_left',['../structmdns__packet.html#afdb9c14dd0c915119b8adb584381a437',1,'mdns_packet']]]
+];
diff --git a/doc/doxygen/output/html/search/all_13.html b/doc/doxygen/output/html/search/all_13.html
new file mode 100644
index 0000000..b4a8bca
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_13.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_13.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_13.js b/doc/doxygen/output/html/search/all_13.js
new file mode 100644
index 0000000..636f9e9
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_13.js
@@ -0,0 +1,61 @@
+var searchData=
+[
+  ['reporting_20bugs',['Reporting bugs',['../bugs.html',1,'']]],
+  ['raw',['RAW',['../group__lwip__opts__raw.html',1,'']]],
+  ['r',['r',['../structapi__msg.html#aebd72e07e711e7135294563b82c98cdf',1,'api_msg']]],
+  ['ram_5fheap',['ram_heap',['../mem_8c.html#a6da602f2bbf1d555556f9260b3b8ad5f',1,'mem.c']]],
+  ['raw_2ec',['raw.c',['../raw_8c.html',1,'']]],
+  ['raw_2eh',['raw.h',['../raw_8h.html',1,'']]],
+  ['raw_5fbind',['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',['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',['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',['RAW_DEBUG',['../group__lwip__opts__debugmsg.html#gaf0551bef83c0fc1baa57cf339d220e25',1,'opt.h']]],
+  ['raw_5fdisconnect',['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',['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',['raw_input_state',['../raw__priv_8h.html#a2580ec946c4196127888d5405257866b',1,'raw_priv.h']]],
+  ['raw_5finput_5fstate_5ft',['raw_input_state_t',['../raw__priv_8h.html#aebbdbaee89c38ad9c007a1d1a336e687',1,'raw_priv.h']]],
+  ['raw_5fnetif_5fip_5faddr_5fchanged',['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',['raw_new',['../group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f',1,'raw_new(u8_t proto):&#160;raw.c'],['../group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f',1,'raw_new(u8_t proto):&#160;raw.c']]],
+  ['raw_5fnew_5fip_5ftype',['raw_new_ip_type',['../group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11',1,'raw_new_ip_type(u8_t type, u8_t proto):&#160;raw.c'],['../group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11',1,'raw_new_ip_type(u8_t type, u8_t proto):&#160;raw.c']]],
+  ['raw_5fpcb',['raw_pcb',['../structraw__pcb.html',1,'']]],
+  ['raw_5fpriv_2eh',['raw_priv.h',['../raw__priv_8h.html',1,'']]],
+  ['raw',['RAW',['../group__raw__raw.html',1,'']]],
+  ['raw_5frecv',['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',['raw_recv_fn',['../raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd',1,'raw.h']]],
+  ['raw_5fremove',['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',['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',['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',['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',['RAW_TTL',['../group__lwip__opts__raw.html#ga36e3ffa66073ca0d27d11c422778249c',1,'opt.h']]],
+  ['rcvevent',['rcvevent',['../structlwip__sock.html#af40d67cbaef4318d26e560988b6e1b3a',1,'lwip_sock']]],
+  ['reachability',['reachability',['../structsntp__server.html#a2e9283bb8f94930fd2a2c3f24fc4b40d',1,'sntp_server']]],
+  ['read',['read',['../structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c',1,'tftp_context::read()'],['../group__socket.html#ga822040573319cf87bfe6758d511be57f',1,'read():&#160;sockets.h']]],
+  ['readset',['readset',['../structlwip__select__cb.html#a8694a2ce0dd5f91be84056982b96978e',1,'lwip_select_cb']]],
+  ['readv',['readv',['../group__socket.html#ga86788b3c690d38699fdbaea523ddec9d',1,'sockets.h']]],
+  ['reass_5flist',['reass_list',['../structlowpan6__ieee802154__data.html#a8c33e7a2026e6e93a2085f3d14378d35',1,'lowpan6_ieee802154_data']]],
+  ['recv',['recv',['../structraw__pcb.html#a963b023239ad97c05536046ed7058a10',1,'raw_pcb::recv()'],['../structudp__pcb.html#ac05dee75a3d6666267f7e626c2ec56a8',1,'udp_pcb::recv()'],['../group__socket.html#gadd7ae45df7c005619eb1126542231e9b',1,'recv():&#160;sockets.h']]],
+  ['recv_5farg',['recv_arg',['../structudp__pcb.html#a11e4c40b8868aa40d923756a60598cab',1,'udp_pcb']]],
+  ['recv_5favail',['recv_avail',['../structnetconn.html#a05b15a28b0803bea3729b1da2047541e',1,'netconn']]],
+  ['recv_5fbufsize',['recv_bufsize',['../structnetconn.html#a6febc9717418ddba16f16e988061cfac',1,'netconn']]],
+  ['recv_5fbufsize_5fdefault',['RECV_BUFSIZE_DEFAULT',['../group__lwip__opts__socket.html#ga5dbd0a61f30ae6c6bfbda635095f138d',1,'opt.h']]],
+  ['recv_5funicast',['recv_unicast',['../structmdns__packet.html#a8659b4f582be0df84b6ae91308737377',1,'mdns_packet']]],
+  ['recvfrom',['recvfrom',['../group__socket.html#ga5e5f7bcda6562bae815e188ea1a81ecd',1,'sockets.h']]],
+  ['recvmbox',['recvmbox',['../structnetconn.html#a9f2bf6a3865b6a22a8a71ec2f3e770da',1,'netconn']]],
+  ['recvmsg',['recvmsg',['../group__socket.html#gaecfc7d524105e52604829c66ced752b8',1,'sockets.h']]],
+  ['redirect_5fheader',['redirect_header',['../structredirect__header.html',1,'']]],
+  ['ref',['ref',['../structpbuf.html#a62fe38eb0cf31027dc1fb9cbe7b55ba7',1,'pbuf']]],
+  ['reference',['reference',['../structsnmp__node__instance.html#a55f53419cd5b369b771153ca2598ebc5',1,'snmp_node_instance']]],
+  ['reference_5flen',['reference_len',['../structsnmp__node__instance.html#ad289957b34b4e55915fa79f37c4d9d54',1,'snmp_node_instance']]],
+  ['release_5finstance',['release_instance',['../structsnmp__node__instance.html#a20a256c54fab19a455ecf6deff76c6de',1,'snmp_node_instance']]],
+  ['remove_5fcallback',['remove_callback',['../structnetif.html#ae06deb532ead2e3009ba4e58aae6ca07',1,'netif']]],
+  ['rfc7668_5fif_5finit',['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',['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',['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',['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',['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',['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',['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',['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',['rs_count',['../structnetif.html#a9c1f9f28bde60aa868bc3296bee7b1b6',1,'netif']]],
+  ['rs_5fheader',['rs_header',['../structrs__header.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/all_14.html b/doc/doxygen/output/html/search/all_14.html
new file mode 100644
index 0000000..fb4d0ec
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_14.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_14.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_14.js b/doc/doxygen/output/html/search/all_14.js
new file mode 100644
index 0000000..444a50d
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_14.js
@@ -0,0 +1,344 @@
+var searchData=
+[
+  ['snmp_20mib2_20callbacks',['SNMP MIB2 callbacks',['../group__lwip__opts__mib2.html',1,'']]],
+  ['sockets',['Sockets',['../group__lwip__opts__socket.html',1,'']]],
+  ['statistics',['Statistics',['../group__lwip__opts__stats.html',1,'']]],
+  ['sd',['sd',['../structapi__msg.html#ad5e8bf133bc5ba4c78822af297330ce4',1,'api_msg']]],
+  ['select',['select',['../group__socket.html#gac332b9b9b2cd877a6189ef838de49e33',1,'sockets.h']]],
+  ['select_5fwaiting',['select_waiting',['../structlwip__sock.html#aadbcf5ec3d50631d8821200163d88d38',1,'lwip_sock']]],
+  ['selwait_5ft',['SELWAIT_T',['../sockets__priv_8h.html#a8f4d240733a9261c668fc66dc4ce8196',1,'sockets_priv.h']]],
+  ['sem',['sem',['../structdns__api__msg.html#a15e01e675ebc46b5aede42342be445e2',1,'dns_api_msg::sem()'],['../structlwip__select__cb.html#ac9e790cac8b5eae607a8ef95dcc68482',1,'lwip_select_cb::sem()']]],
+  ['sem_5fsignalled',['sem_signalled',['../structlwip__select__cb.html#a1c00f1159e9e8eb7cca02c497605cd99',1,'lwip_select_cb']]],
+  ['send',['send',['../group__socket.html#ga19024690fdfd3512d24dcaa9b80d24ed',1,'sockets.h']]],
+  ['send_5ftimeout',['send_timeout',['../structnetconn.html#a44e55724482b8e447134f5ba4f01551a',1,'netconn']]],
+  ['sendevent',['sendevent',['../structlwip__sock.html#a7e282776681ea4b7bd389950a8a64fa8',1,'lwip_sock']]],
+  ['sendmsg',['sendmsg',['../group__socket.html#gaad99bea090b1fe4743234fcee15a5d28',1,'sockets.h']]],
+  ['sendto',['sendto',['../group__socket.html#gaaa17499d76ef421821fe72fd29fe38f7',1,'sockets.h']]],
+  ['sent_5fnum',['sent_num',['../structautoip.html#a9d3e3bab2f12b7c7283177fbf039fb25',1,'autoip']]],
+  ['sequence_5fnumber',['sequence_number',['../structieee__802154__hdr.html#a870001205f5a3ce45ce0b2f323275869',1,'ieee_802154_hdr']]],
+  ['sequential_2dstyle_20apis',['Sequential-style APIs',['../group__sequential__api.html',1,'']]],
+  ['service',['service',['../structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad',1,'mdns_service']]],
+  ['service_5fget_5ftxt_5ffn_5ft',['service_get_txt_fn_t',['../mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83',1,'mdns.h']]],
+  ['services',['services',['../structmdns__host.html#a750c31340c22e51375e4dc3e6e94f2ed',1,'mdns_host']]],
+  ['session_5fdata_5fpacket_5fsize',['session_data_packet_size',['../structnetbios__answer.html#abec38f20bb460ddc2d6e8c9b9208608c',1,'netbios_answer']]],
+  ['set_5ftest',['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',['set_value',['../structsnmp__node__instance.html#a55fb4cadefcab9c74c3fb529c2560834',1,'snmp_node_instance::set_value()'],['../structsnmp__table__node.html#a2a3e8ac0dcce64604fc17e1de3c5a804',1,'snmp_table_node::set_value()']]],
+  ['setsockopt',['setsockopt',['../group__socket.html#ga115d74cd1953e7bafc2e34157c697df1',1,'sockets.h']]],
+  ['shutdown',['shutdown',['../group__socket.html#ga7d832f77cfad97cf901640f243c6e682',1,'sockets.h']]],
+  ['size',['size',['../structmemp__desc.html#a1688d2bdd5a7b77700e1fa627f025ba3',1,'memp_desc']]],
+  ['slip_5fdebug',['SLIP_DEBUG',['../group__lwip__opts__debugmsg.html#gab986f95183559d8678c6d80969b01857',1,'opt.h']]],
+  ['slip_5fmax_5fsize',['SLIP_MAX_SIZE',['../slipif_8c.html#accf448f9dabb0f33ef46b40355691cab',1,'slipif.c']]],
+  ['slip_5frx_5fqueue',['SLIP_RX_QUEUE',['../slipif_8h.html#a37ce8613535232db02bfd9ae9b51c668',1,'slipif.h']]],
+  ['slip_5fsio_5fspeed',['SLIP_SIO_SPEED',['../slipif_8c.html#a2a9e9ed81732a6794a9b9a712f75a1cc',1,'slipif.c']]],
+  ['slip_5fuse_5frx_5fthread',['SLIP_USE_RX_THREAD',['../slipif_8h.html#a198967c11f79cffc32192710294e8826',1,'slipif.h']]],
+  ['slip',['SLIP',['../group__slipif.html',1,'']]],
+  ['slipif_2ec',['slipif.c',['../slipif_8c.html',1,'']]],
+  ['slipif_2eh',['slipif.h',['../slipif_8h.html',1,'']]],
+  ['slipif_5finit',['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',['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',['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',['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',['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',['SLIPIF_THREAD_NAME',['../group__lwip__opts__thread.html#gae9cd260c56472324a2f0ee5f9597a675',1,'opt.h']]],
+  ['slipif_5fthread_5fprio',['SLIPIF_THREAD_PRIO',['../group__lwip__opts__thread.html#gab1b9fc2efcbf1f804bfd0191bc019c4e',1,'opt.h']]],
+  ['slipif_5fthread_5fstacksize',['SLIPIF_THREAD_STACKSIZE',['../group__lwip__opts__thread.html#gae8ab54a25007ce997bbab6289815e258',1,'opt.h']]],
+  ['smemcpy',['SMEMCPY',['../group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec',1,'opt.h']]],
+  ['smtp_20client',['SMTP client',['../group__smtp.html',1,'']]],
+  ['smtp_2ec',['smtp.c',['../smtp_8c.html',1,'']]],
+  ['smtp_5fbodydh',['SMTP_BODYDH',['../group__smtp__opts.html#ga4b1667149354b7819847cb4f5f1ff144',1,'smtp_opts.h']]],
+  ['smtp_5fcheck_5fdata',['SMTP_CHECK_DATA',['../group__smtp__opts.html#ga021d8133159895a2dbf5fb0b243da9fa',1,'smtp_opts.h']]],
+  ['smtp_5fcopy_5fauthdata',['SMTP_COPY_AUTHDATA',['../group__smtp__opts.html#gab5559a7c976e72204d9391f655bcc07e',1,'smtp_opts.h']]],
+  ['smtp_5fdebug',['SMTP_DEBUG',['../group__smtp__opts.html#gae7ea4f31c521947d5127e268ae02c317',1,'smtp_opts.h']]],
+  ['smtp_5fmax_5fpass_5flen',['SMTP_MAX_PASS_LEN',['../group__smtp__opts.html#ga9aa5f5529121a8266947f33c5e424ccc',1,'smtp_opts.h']]],
+  ['smtp_5fmax_5fservername_5flen',['SMTP_MAX_SERVERNAME_LEN',['../group__smtp__opts.html#gaee3b273524a2253ce5fb44b240b0371b',1,'smtp_opts.h']]],
+  ['smtp_5fmax_5fusername_5flen',['SMTP_MAX_USERNAME_LEN',['../group__smtp__opts.html#gafa0c84e5279b8eb8a5dbea6fe97aa099',1,'smtp_opts.h']]],
+  ['smtp_5fpoll_5finterval',['SMTP_POLL_INTERVAL',['../smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e',1,'smtp.c']]],
+  ['smtp_5fsend_5fmail',['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',['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',['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',['smtp_send_request',['../structsmtp__send__request.html',1,'']]],
+  ['smtp_5fsession',['smtp_session',['../structsmtp__session.html',1,'']]],
+  ['smtp_5fsession_5fstate',['smtp_session_state',['../smtp_8c.html#a04947fff2d3a3803e6c716aecc7f2bae',1,'smtp.c']]],
+  ['smtp_5fset_5fauth',['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',['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',['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',['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',['SMTP_SUPPORT_AUTH_LOGIN',['../group__smtp__opts.html#ga7a83e686b109fa59557c13736aeeab3b',1,'smtp_opts.h']]],
+  ['smtp_5fsupport_5fauth_5fplain',['SMTP_SUPPORT_AUTH_PLAIN',['../group__smtp__opts.html#ga2e6c8313006592884e89bbcf353cf5ac',1,'smtp_opts.h']]],
+  ['smtp_5ftimeout',['SMTP_TIMEOUT',['../smtp_8c.html#a6029851c4f71d98b00d6c49a17ea9ef6',1,'smtp.c']]],
+  ['smtp_5ftimeout_5fdatablock',['SMTP_TIMEOUT_DATABLOCK',['../smtp_8c.html#ad853ab316a3b866b87c0454053febfe3',1,'smtp.c']]],
+  ['smtp_5ftimeout_5fdataterm',['SMTP_TIMEOUT_DATATERM',['../smtp_8c.html#a73855e673457f748b6bcba49aab9b035',1,'smtp.c']]],
+  ['snmpv2c_2fv3_20agent',['SNMPv2c/v3 agent',['../group__snmp.html',1,'']]],
+  ['snmp_2eh',['snmp.h',['../apps_2snmp_8h.html',1,'(Global Namespace)'],['../snmp_8h.html',1,'(Global Namespace)']]],
+  ['snmp_5faccess_5ft',['snmp_access_t',['../snmp__core_8h.html#ad5a33687d1a6fcf970266b41b0633760',1,'snmp_core.h']]],
+  ['snmp_5fans1_5fenc_5ftlv',['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',['snmp_asn1.c',['../snmp__asn1_8c.html',1,'']]],
+  ['snmp_5fasn1_2eh',['snmp_asn1.h',['../snmp__asn1_8h.html',1,'']]],
+  ['snmp_5fasn1_5fdec_5foid',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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'],['../group__snmp__opts.html#ga316c1e1f06f0c7ca56589563809e64db',1,'SNMP_COMMUNITY():&#160;snmp_opts.h']]],
+  ['snmp_5fcommunity_5ftrap',['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'],['../group__snmp__opts.html#gaaefc9dda5f8e5c296018a463cdbac39b',1,'SNMP_COMMUNITY_TRAP():&#160;snmp_opts.h']]],
+  ['snmp_5fcommunity_5fwrite',['SNMP_COMMUNITY_WRITE',['../group__snmp__opts.html#gafb9414dc7a33978b62a3a9838b659464',1,'SNMP_COMMUNITY_WRITE():&#160;snmp_opts.h'],['../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',['snmp_core.c',['../snmp__core_8c.html',1,'']]],
+  ['snmp_5fcore_2eh',['snmp_core.h',['../snmp__core_8h.html',1,'']]],
+  ['snmp_5fcreate_5fthread_5fsync_5fnode',['SNMP_CREATE_THREAD_SYNC_NODE',['../snmp__threadsync_8h.html#a1971c27c8addf1c426abd1abac54c8d2',1,'snmp_threadsync.h']]],
+  ['snmp_5fdebug',['SNMP_DEBUG',['../group__snmp__opts.html#gac041000361342f51ad5ee5d8f6254e02',1,'snmp_opts.h']]],
+  ['snmp_5fdecode_5fbits',['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',['SNMP_DEVICE_ENTERPRISE_OID',['../group__snmp__opts.html#ga09118b734e85df152af098744e888b34',1,'snmp_opts.h']]],
+  ['snmp_5fdevice_5fenterprise_5foid_5flen',['SNMP_DEVICE_ENTERPRISE_OID_LEN',['../group__snmp__opts.html#ga9e39ba5308f5c7ac5296c7d05fdfa97f',1,'snmp_opts.h']]],
+  ['snmp_5fencode_5fbits',['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',['snmp_err_t',['../snmp__core_8h.html#abaa9cdad345ad93da515d31625a54589',1,'snmp_core.h']]],
+  ['snmp_5fgentrap_5fauth_5ffailure',['SNMP_GENTRAP_AUTH_FAILURE',['../apps_2snmp_8h.html#aaf312d8bdbeed2c02560321ab24a022f',1,'snmp.h']]],
+  ['snmp_5fgentrap_5fcoldstart',['SNMP_GENTRAP_COLDSTART',['../apps_2snmp_8h.html#ae9310bbe1948b3c3bc64c073d4621019',1,'snmp.h']]],
+  ['snmp_5fgentrap_5fegp_5fneighbor_5floss',['SNMP_GENTRAP_EGP_NEIGHBOR_LOSS',['../apps_2snmp_8h.html#ac1cd822650d9ac66d0333a5ad600cfee',1,'snmp.h']]],
+  ['snmp_5fgentrap_5fenterprise_5fspecific',['SNMP_GENTRAP_ENTERPRISE_SPECIFIC',['../apps_2snmp_8h.html#ab3691cecfa911baa52ccf6054022ba43',1,'snmp.h']]],
+  ['snmp_5fgentrap_5flinkdown',['SNMP_GENTRAP_LINKDOWN',['../apps_2snmp_8h.html#a1856efbe83199f456c34a4e5139dfb16',1,'snmp.h']]],
+  ['snmp_5fgentrap_5flinkup',['SNMP_GENTRAP_LINKUP',['../apps_2snmp_8h.html#afa665cdc02ccd5ee9fe0c4cb1b792186',1,'snmp.h']]],
+  ['snmp_5fgentrap_5fwarmstart',['SNMP_GENTRAP_WARMSTART',['../apps_2snmp_8h.html#a9a2e5824deab50e639b01181307a0926',1,'snmp.h']]],
+  ['snmp_5fget_5fauth_5ftraps_5fenabled',['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',['snmp_get_community',['../group__snmp__core.html#gacf277cbca915275190426aeef4cfb103',1,'snmp_get_community(void):&#160;snmp_msg.c'],['../group__snmp__core.html#gacf277cbca915275190426aeef4cfb103',1,'snmp_get_community(void):&#160;snmp_msg.c']]],
+  ['snmp_5fget_5fcommunity_5ftrap',['snmp_get_community_trap',['../group__snmp__traps.html#gafdd3299e145f53cc826cc11a469f8409',1,'snmp_get_community_trap(void):&#160;snmp_msg.c'],['../group__snmp__traps.html#gafdd3299e145f53cc826cc11a469f8409',1,'snmp_get_community_trap(void):&#160;snmp_msg.c']]],
+  ['snmp_5fget_5fcommunity_5fwrite',['snmp_get_community_write',['../group__snmp__core.html#gaba31b6f1816661df5a3b7f2076ee6ec0',1,'snmp_get_community_write(void):&#160;snmp_msg.c'],['../group__snmp__core.html#gaba31b6f1816661df5a3b7f2076ee6ec0',1,'snmp_get_community_write(void):&#160;snmp_msg.c']]],
+  ['snmp_5fget_5fdevice_5fenterprise_5foid',['snmp_get_device_enterprise_oid',['../group__snmp__core.html#ga4dff82dda2553b9554a9f98561852a50',1,'snmp_get_device_enterprise_oid(void):&#160;snmp_core.c'],['../group__snmp__core.html#ga4dff82dda2553b9554a9f98561852a50',1,'snmp_get_device_enterprise_oid(void):&#160;snmp_core.c']]],
+  ['snmp_5fiftype',['snmp_ifType',['../group__netif__mib2.html#ga15378b8dcd2a9dc2985142d864a767ba',1,'snmp.h']]],
+  ['snmp_5finit',['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',['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',['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',['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',['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',['snmp_leaf_node',['../structsnmp__leaf__node.html',1,'']]],
+  ['snmp_5flwip_5fenterprise_5foid',['SNMP_LWIP_ENTERPRISE_OID',['../group__snmp__opts.html#ga868bfef6efe05515c86291137a633479',1,'snmp_opts.h']]],
+  ['snmp_5flwip_5fgetbulk_5fmax_5frepetitions',['SNMP_LWIP_GETBULK_MAX_REPETITIONS',['../group__snmp__opts.html#ga5a24152aa5f3c2837b9a3145aa3c59f3',1,'snmp_opts.h']]],
+  ['snmp_5flwip_5fmib2',['SNMP_LWIP_MIB2',['../group__snmp__opts.html#gaab667d48f48ee89f8bdbc7f134e6037d',1,'snmp_opts.h']]],
+  ['snmp_5flwip_5fmib2_5fsyscontact',['SNMP_LWIP_MIB2_SYSCONTACT',['../group__snmp__opts.html#ga1a57501c615b630d363e0af1a504e683',1,'snmp_opts.h']]],
+  ['snmp_5flwip_5fmib2_5fsysdesc',['SNMP_LWIP_MIB2_SYSDESC',['../group__snmp__opts.html#gae93a105b421a2ca91e862da5087cec73',1,'snmp_opts.h']]],
+  ['snmp_5flwip_5fmib2_5fsyslocation',['SNMP_LWIP_MIB2_SYSLOCATION',['../group__snmp__opts.html#ga311cec98c8f7e4851d325fffe96cf8d9',1,'snmp_opts.h']]],
+  ['snmp_5flwip_5fmib2_5fsysname',['SNMP_LWIP_MIB2_SYSNAME',['../group__snmp__opts.html#ga80ba46f9517a51b5477f13082b2bcf98',1,'snmp_opts.h']]],
+  ['snmp_5fmax_5fcommunity_5fstr_5flen',['SNMP_MAX_COMMUNITY_STR_LEN',['../group__snmp__opts.html#ga0e98b58159a77688f87f9f50479177fd',1,'snmp_opts.h']]],
+  ['snmp_5fmax_5fobj_5fid_5flen',['SNMP_MAX_OBJ_ID_LEN',['../group__snmp__opts.html#ga3ad9d293f90e3c885c4e3263a9064a41',1,'snmp_opts.h']]],
+  ['snmp_5fmax_5foctet_5fstring_5flen',['SNMP_MAX_OCTET_STRING_LEN',['../group__snmp__opts.html#gae50cdd09697aa54a8b9f26432ac55ac2',1,'snmp_opts.h']]],
+  ['snmp_5fmax_5fvalue_5fsize',['SNMP_MAX_VALUE_SIZE',['../group__snmp__opts.html#gafb4362575bc50476a7401a1ed14787f0',1,'snmp_opts.h']]],
+  ['snmp_5fmib',['snmp_mib',['../structsnmp__mib.html',1,'']]],
+  ['snmp_5fmib2_2ec',['snmp_mib2.c',['../snmp__mib2_8c.html',1,'']]],
+  ['snmp_5fmib2_2eh',['snmp_mib2.h',['../snmp__mib2_8h.html',1,'']]],
+  ['snmp_5fmib2_5ficmp_2ec',['snmp_mib2_icmp.c',['../snmp__mib2__icmp_8c.html',1,'']]],
+  ['snmp_5fmib2_5finterfaces_2ec',['snmp_mib2_interfaces.c',['../snmp__mib2__interfaces_8c.html',1,'']]],
+  ['snmp_5fmib2_5fip_2ec',['snmp_mib2_ip.c',['../snmp__mib2__ip_8c.html',1,'']]],
+  ['snmp_5fmib2_5fset_5fsyscontact',['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',['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',['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',['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',['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',['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',['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',['snmp_mib2_snmp.c',['../snmp__mib2__snmp_8c.html',1,'']]],
+  ['snmp_5fmib2_5fsystem_2ec',['snmp_mib2_system.c',['../snmp__mib2__system_8c.html',1,'']]],
+  ['snmp_5fmib2_5ftcp_2ec',['snmp_mib2_tcp.c',['../snmp__mib2__tcp_8c.html',1,'']]],
+  ['snmp_5fmib2_5fudp_2ec',['snmp_mib2_udp.c',['../snmp__mib2__udp_8c.html',1,'']]],
+  ['snmp_5fmib_5fdebug',['SNMP_MIB_DEBUG',['../group__snmp__opts.html#gac12240265db443eaf9d31d187e586c16',1,'snmp_opts.h']]],
+  ['snmp_5fmib_5ftree_5fresolve_5fexact',['snmp_mib_tree_resolve_exact',['../snmp__core_8c.html#af42d6d2732a92017a43b83a07609fd1a',1,'snmp_core.c']]],
+  ['snmp_5fmin_5fvalue_5fsize',['SNMP_MIN_VALUE_SIZE',['../group__snmp__opts.html#gac815d0dbe576299546ac612e7eaf3f90',1,'snmp_opts.h']]],
+  ['snmp_5fmsg_2ec',['snmp_msg.c',['../snmp__msg_8c.html',1,'']]],
+  ['snmp_5fmsg_2eh',['snmp_msg.h',['../snmp__msg_8h.html',1,'']]],
+  ['snmp_5fnetconn_2ec',['snmp_netconn.c',['../snmp__netconn_8c.html',1,'']]],
+  ['snmp_5fnext_5foid_5fcheck',['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',['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',['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',['snmp_next_oid_state',['../structsnmp__next__oid__state.html',1,'']]],
+  ['snmp_5fnode',['snmp_node',['../structsnmp__node.html',1,'']]],
+  ['snmp_5fnode_5finstance',['snmp_node_instance',['../structsnmp__node__instance.html',1,'']]],
+  ['snmp_5fnode_5ftree',['SNMP_NODE_TREE',['../snmp__core_8h.html#a9ee3aad9305fdd883abb37822be81b72',1,'snmp_core.h']]],
+  ['snmp_5fobj_5fid',['snmp_obj_id',['../structsnmp__obj__id.html',1,'']]],
+  ['snmp_5foid_5fappend',['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',['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',['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',['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',['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',['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',['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',['snmp_oid_range',['../structsnmp__oid__range.html',1,'']]],
+  ['snmp_5foid_5fto_5fip',['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',['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',['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',['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',['snmp_opts.h',['../snmp__opts_8h.html',1,'']]],
+  ['snmp_5fpbuf_5fstream_2ec',['snmp_pbuf_stream.c',['../snmp__pbuf__stream_8c.html',1,'']]],
+  ['snmp_5fpbuf_5fstream_2eh',['snmp_pbuf_stream.h',['../snmp__pbuf__stream_8h.html',1,'']]],
+  ['snmp_5fraw_2ec',['snmp_raw.c',['../snmp__raw_8c.html',1,'']]],
+  ['snmp_5fsafe_5frequests',['SNMP_SAFE_REQUESTS',['../group__snmp__opts.html#ga95e39047b9bcb385780b06b35af49261',1,'snmp_opts.h']]],
+  ['snmp_5fscalar_2ec',['snmp_scalar.c',['../snmp__scalar_8c.html',1,'']]],
+  ['snmp_5fscalar_2eh',['snmp_scalar.h',['../snmp__scalar_8h.html',1,'']]],
+  ['snmp_5fscalar_5farray_5fnode',['snmp_scalar_array_node',['../structsnmp__scalar__array__node.html',1,'']]],
+  ['snmp_5fscalar_5farray_5fnode_5fdef',['snmp_scalar_array_node_def',['../structsnmp__scalar__array__node__def.html',1,'']]],
+  ['snmp_5fscalar_5fnode',['snmp_scalar_node',['../structsnmp__scalar__node.html',1,'']]],
+  ['snmp_5fsend_5ftrap',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['SNMP_STACK_SIZE',['../group__snmp__opts.html#ga0dcacdccc61216c6773943ad3fd31242',1,'snmp_opts.h']]],
+  ['snmp_5ftable_2ec',['snmp_table.c',['../snmp__table_8c.html',1,'']]],
+  ['snmp_5ftable_2eh',['snmp_table.h',['../snmp__table_8h.html',1,'']]],
+  ['snmp_5ftable_5fcol_5fdef',['snmp_table_col_def',['../structsnmp__table__col__def.html',1,'']]],
+  ['snmp_5ftable_5fcolumn_5fdata_5ftype_5ft',['snmp_table_column_data_type_t',['../snmp__table_8h.html#af9b59f3ba7dccf338fe6e5bc1c4b1db5',1,'snmp_table.h']]],
+  ['snmp_5ftable_5fnode',['snmp_table_node',['../structsnmp__table__node.html',1,'']]],
+  ['snmp_5ftable_5fsimple_5fnode',['snmp_table_simple_node',['../structsnmp__table__simple__node.html',1,'']]],
+  ['snmp_5fthread_5fprio',['SNMP_THREAD_PRIO',['../group__snmp__opts.html#gad9bce0d9c05ed4607d72de7b75f2a80b',1,'snmp_opts.h']]],
+  ['snmp_5fthreadsync_2ec',['snmp_threadsync.c',['../snmp__threadsync_8c.html',1,'']]],
+  ['snmp_5fthreadsync_2eh',['snmp_threadsync.h',['../snmp__threadsync_8h.html',1,'']]],
+  ['snmp_5fthreadsync_5finit',['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',['snmp_threadsync_instance',['../structsnmp__threadsync__instance.html',1,'']]],
+  ['snmp_5fthreadsync_5fnode',['snmp_threadsync_node',['../structsnmp__threadsync__node.html',1,'']]],
+  ['snmp_5ftrap_5fdestinations',['SNMP_TRAP_DESTINATIONS',['../group__snmp__opts.html#ga692343b0cc555c302fd713003d4f8a08',1,'snmp_opts.h']]],
+  ['snmp_5ftrap_5fdst_5fenable',['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',['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',['snmp_traps.c',['../snmp__traps_8c.html',1,'']]],
+  ['snmp_5ftraps_5fhandle',['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',['snmp_tree_node',['../structsnmp__tree__node.html',1,'']]],
+  ['snmp_5fuse_5fnetconn',['SNMP_USE_NETCONN',['../group__snmp__opts.html#gaf02e8b4b69e99df784e9953401477078',1,'snmp_opts.h']]],
+  ['snmp_5fuse_5fraw',['SNMP_USE_RAW',['../group__snmp__opts.html#ga8c93f4260af2eb3c50d4bc603f716f1f',1,'snmp_opts.h']]],
+  ['snmp_5fvarbind',['snmp_varbind',['../structsnmp__varbind.html',1,'']]],
+  ['snmp_5fvarbind_5flen',['snmp_varbind_len',['../structsnmp__varbind__len.html',1,'']]],
+  ['snmp_5fvarbind_5flength',['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',['snmp_variant_value',['../unionsnmp__variant__value.html',1,'']]],
+  ['snmpv3_2ec',['snmpv3.c',['../snmpv3_8c.html',1,'']]],
+  ['snmpv3_2eh',['snmpv3.h',['../snmpv3_8h.html',1,'']]],
+  ['snmpv3_5fmbedtls_2ec',['snmpv3_mbedtls.c',['../snmpv3__mbedtls_8c.html',1,'']]],
+  ['snmpv3_5fpriv_2eh',['snmpv3_priv.h',['../snmpv3__priv_8h.html',1,'']]],
+  ['sntp',['SNTP',['../group__sntp.html',1,'']]],
+  ['sntp_2ec',['sntp.c',['../sntp_8c.html',1,'']]],
+  ['sntp_2eh',['sntp.h',['../sntp_8h.html',1,'']]],
+  ['sntp_5fcheck_5fresponse',['SNTP_CHECK_RESPONSE',['../group__sntp__opts.html#ga7d4e12d90912d486e64f289d7f3ca446',1,'sntp_opts.h']]],
+  ['sntp_5fcomp_5froundtrip',['SNTP_COMP_ROUNDTRIP',['../group__sntp__opts.html#ga1e21781705d3549a305339fd7fca63e7',1,'sntp_opts.h']]],
+  ['sntp_5fdebug',['SNTP_DEBUG',['../group__sntp__opts.html#ga25c6f9c14c17e218d110d826b09f8d91',1,'sntp_opts.h']]],
+  ['sntp_5fenabled',['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',['SNTP_FRAC_TO_US',['../sntp_8c.html#aebe74c93643ac9b8c8a9c7d223192c8f',1,'sntp.c']]],
+  ['sntp_5fget_5fservers_5ffrom_5fdhcp',['SNTP_GET_SERVERS_FROM_DHCP',['../group__sntp__opts.html#ga961a61eef942ab5378cff1e3742b3ade',1,'sntp_opts.h']]],
+  ['sntp_5fget_5fsystem_5ftime',['SNTP_GET_SYSTEM_TIME',['../group__sntp__opts.html#gab0ea385479a5c5c8c173f165ded2fb63',1,'sntp_opts.h']]],
+  ['sntp_5fgetoperatingmode',['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',['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',['sntp_getserver',['../group__sntp.html#ga2a28523cb9f2b5b025a4818bc2c1afc1',1,'sntp_getserver(u8_t idx):&#160;sntp.c'],['../group__sntp.html#ga2a28523cb9f2b5b025a4818bc2c1afc1',1,'sntp_getserver(u8_t idx):&#160;sntp.c']]],
+  ['sntp_5finit',['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',['SNTP_MAX_SERVERS',['../group__sntp__opts.html#ga5d9dc0827f402849f5c18d44e311dbc2',1,'sntp_opts.h']]],
+  ['sntp_5fmonitor_5fserver_5freachability',['SNTP_MONITOR_SERVER_REACHABILITY',['../group__sntp__opts.html#ga5782f21ef24ebddd5ba2ce9a889094e3',1,'sntp_opts.h']]],
+  ['sntp_5fmsg',['sntp_msg',['../structsntp__msg.html',1,'']]],
+  ['sntp_5fopts_2eh',['sntp_opts.h',['../sntp__opts_8h.html',1,'']]],
+  ['sntp_5fport',['SNTP_PORT',['../group__sntp__opts.html#gacbee62c27f54371fc2c5259a834a0f9b',1,'sntp_opts.h']]],
+  ['sntp_5frecv_5ftimeout',['SNTP_RECV_TIMEOUT',['../group__sntp__opts.html#ga44cf26b9b19832d88599244711a12d08',1,'sntp_opts.h']]],
+  ['sntp_5fretry_5ftimeout',['SNTP_RETRY_TIMEOUT',['../group__sntp__opts.html#ga86d651d8eb07687208308deef95a23ba',1,'sntp_opts.h']]],
+  ['sntp_5fretry_5ftimeout_5fexp',['SNTP_RETRY_TIMEOUT_EXP',['../group__sntp__opts.html#gafdb7e98f608cc429188d7dac356614c2',1,'sntp_opts.h']]],
+  ['sntp_5fretry_5ftimeout_5fmax',['SNTP_RETRY_TIMEOUT_MAX',['../group__sntp__opts.html#gafde10b3ed7cb4bb2cd2c4daa389db699',1,'sntp_opts.h']]],
+  ['sntp_5fserver',['sntp_server',['../structsntp__server.html',1,'']]],
+  ['sntp_5fserver_5fdns',['SNTP_SERVER_DNS',['../group__sntp__opts.html#gaef477c145ae404d77188b26b79b6996f',1,'sntp_opts.h']]],
+  ['sntp_5fset_5fsystem_5ftime',['SNTP_SET_SYSTEM_TIME',['../group__sntp__opts.html#gafe340b98c52dedcbc041267fe13b2da6',1,'sntp_opts.h']]],
+  ['sntp_5fsetoperatingmode',['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',['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',['SNTP_STARTUP_DELAY',['../group__sntp__opts.html#ga22017d43da7d4bf8d42e786b4ced4dfa',1,'sntp_opts.h']]],
+  ['sntp_5fstartup_5fdelay_5ffunc',['SNTP_STARTUP_DELAY_FUNC',['../group__sntp__opts.html#gae082c2f3044d500ca5e1be1d4928de75',1,'sntp_opts.h']]],
+  ['sntp_5fstop',['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',['sntp_time',['../structsntp__time.html',1,'']]],
+  ['sntp_5ftimestamps',['sntp_timestamps',['../structsntp__timestamps.html',1,'']]],
+  ['sntp_5fupdate_5fdelay',['SNTP_UPDATE_DELAY',['../group__sntp__opts.html#ga9232c56443115be05a2f852eba21979c',1,'sntp_opts.h']]],
+  ['so_5freuse',['SO_REUSE',['../group__lwip__opts__socket.html#gaf3822feed320cf8439b083ee525e4942',1,'opt.h']]],
+  ['so_5freuse_5frxtoall',['SO_REUSE_RXTOALL',['../group__lwip__opts__socket.html#gae9395d83af89002343e5782130f52f44',1,'opt.h']]],
+  ['sockaddr_5faligned',['sockaddr_aligned',['../unionsockaddr__aligned.html',1,'']]],
+  ['socket',['socket',['../structnetconn.html#ac8e05eb65774665e364a3dcf0f139b36',1,'netconn::socket()'],['../group__socket.html#ga862d8f4070c66dddb979540ce9ba6a83',1,'socket():&#160;sockets.h'],['../group__socket.html',1,'(Global Namespace)']]],
+  ['socket_2eh',['socket.h',['../socket_8h.html',1,'']]],
+  ['sockets_2ec',['sockets.c',['../sockets_8c.html',1,'']]],
+  ['sockets_2eh',['sockets.h',['../sockets_8h.html',1,'']]],
+  ['sockets_5fdebug',['SOCKETS_DEBUG',['../group__lwip__opts__debugmsg.html#ga509594f3ba7d8b1356628b50b55a0934',1,'opt.h']]],
+  ['sockets_5fpriv_2eh',['sockets_priv.h',['../sockets__priv_8h.html',1,'']]],
+  ['source_5faddr',['source_addr',['../structmdns__packet.html#aaa64cc21495dc6bb76ed9125904dd07a',1,'mdns_packet']]],
+  ['source_5faddress',['source_address',['../structieee__802154__hdr.html#aa96c037381583756e79bc6ecede27937',1,'ieee_802154_hdr']]],
+  ['source_5fpan_5fid',['source_pan_id',['../structieee__802154__hdr.html#ab67fc612a7fd7dcaf46401e4719fa2b2',1,'ieee_802154_hdr']]],
+  ['src',['src',['../structip6__hdr.html#af0df3214134f29827c27e66b2970c6ef',1,'ip6_hdr']]],
+  ['state',['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',['static_data',['../structsmtp__send__request.html#a4d517ae8b29caa4f0b371923379d9ef4',1,'smtp_send_request']]],
+  ['stats',['stats',['../structmemp__desc.html#a05cb67eb408e4736cc0f5e32b5db7500',1,'memp_desc']]],
+  ['stats_2ec',['stats.c',['../stats_8c.html',1,'']]],
+  ['stats_2eh',['stats.h',['../stats_8h.html',1,'']]],
+  ['stats_5f',['stats_',['../structstats__.html',1,'']]],
+  ['stats_5figmp',['stats_igmp',['../structstats__igmp.html',1,'']]],
+  ['stats_5finit',['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',['stats_mem',['../structstats__mem.html',1,'']]],
+  ['stats_5fmib2',['stats_mib2',['../structstats__mib2.html',1,'']]],
+  ['stats_5fmib2_5fnetif_5fctrs',['stats_mib2_netif_ctrs',['../structstats__mib2__netif__ctrs.html',1,'']]],
+  ['stats_5fproto',['stats_proto',['../structstats__proto.html',1,'']]],
+  ['stats_5fsys',['stats_sys',['../structstats__sys.html',1,'']]],
+  ['stats_5fsyselem',['stats_syselem',['../structstats__syselem.html',1,'']]],
+  ['status_5fcallback',['status_callback',['../structnetif.html#a1513e81d02557d2a950e965f18b53a45',1,'netif']]],
+  ['status_5fchanged_5fs',['status_changed_s',['../structnetif__ext__callback__args__t_1_1status__changed__s.html',1,'netif_ext_callback_args_t']]],
+  ['subject',['subject',['../structsmtp__session.html#ab8240801e229ee260f3feeaa270520c7',1,'smtp_session']]],
+  ['subject_5flen',['subject_len',['../structsmtp__session.html#aea48a6edd3ede02b26882c7b8d72646c',1,'smtp_session']]],
+  ['swap_5fbytes_5fin_5fword',['SWAP_BYTES_IN_WORD',['../inet__chksum_8h.html#a0196bd603262882d16b5264b52eafe18',1,'inet_chksum.h']]],
+  ['sys',['sys',['../structstats__.html#a317123da6c92aa9d2fa40e8060357035',1,'stats_']]],
+  ['sys_2ec',['sys.c',['../sys_8c.html',1,'']]],
+  ['sys_2eh',['sys.h',['../sys_8h.html',1,'']]],
+  ['sys_5farch_5fdecl_5fprotect',['SYS_ARCH_DECL_PROTECT',['../group__sys__prot.html#ga945395fa326214fc9736487242710a90',1,'sys.h']]],
+  ['sys_5farch_5fmbox_5ffetch',['sys_arch_mbox_fetch',['../group__sys__mbox.html#ga6464cd77cf6799bd8b3d6c840166a2e8',1,'sys.h']]],
+  ['sys_5farch_5fmbox_5ftryfetch',['sys_arch_mbox_tryfetch',['../group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c',1,'sys.h']]],
+  ['sys_5farch_5fprotect',['SYS_ARCH_PROTECT',['../group__sys__prot.html#ga3d0e48feafd378e9c26c64567ecd8bab',1,'sys.h']]],
+  ['sys_5farch_5fsem_5fwait',['sys_arch_sem_wait',['../group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f',1,'sys.h']]],
+  ['sys_5farch_5ftimeout',['SYS_ARCH_TIMEOUT',['../sys_8h.html#ac1495030a8ab5e1f3c89e42ced527c5b',1,'sys.h']]],
+  ['sys_5farch_5funprotect',['SYS_ARCH_UNPROTECT',['../group__sys__prot.html#ga2f48e97047945642ddeb27e65bf4ffe2',1,'sys.h']]],
+  ['sys_5fcheck_5ftimeouts',['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',['SYS_DEBUG',['../group__lwip__opts__debugmsg.html#ga2960ae20008f05da8cc0714f36365642',1,'opt.h']]],
+  ['sys_5finit',['sys_init',['../group__sys__misc.html#gaf411a8bc6b7ed4b0af9114e10c959448',1,'sys_init(void):&#160;sys.h'],['../sys_init.html',1,'(Global Namespace)']]],
+  ['sys_5fjiffies',['sys_jiffies',['../sys_8h.html#ac89f307e8b360eaf821b461a4f26753a',1,'sys.h']]],
+  ['sys_5flightweight_5fprot',['SYS_LIGHTWEIGHT_PROT',['../group__lwip__opts__lock.html#gae85efb3a5fcf8585c94b3c2669978959',1,'opt.h']]],
+  ['sys_5fmbox_5fempty',['SYS_MBOX_EMPTY',['../sys_8h.html#ab0571e67edca0132b144106e9b319ef9',1,'sys.h']]],
+  ['sys_5fmbox_5ffree',['sys_mbox_free',['../group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f',1,'sys.h']]],
+  ['sys_5fmbox_5fnew',['sys_mbox_new',['../group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc',1,'sys.h']]],
+  ['sys_5fmbox_5fpost',['sys_mbox_post',['../group__sys__mbox.html#ga9d068386a3c53dd01b8af99c3ef77555',1,'sys.h']]],
+  ['sys_5fmbox_5fset_5finvalid',['sys_mbox_set_invalid',['../group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172',1,'sys.h']]],
+  ['sys_5fmbox_5fset_5finvalid_5fval',['sys_mbox_set_invalid_val',['../sys_8h.html#ae293feebb61d36f2db99be53702b8203',1,'sys.h']]],
+  ['sys_5fmbox_5ftryfetch',['sys_mbox_tryfetch',['../sys_8h.html#ab7841780b31ba9c0a39a440aad1fca13',1,'sys.h']]],
+  ['sys_5fmbox_5ftrypost',['sys_mbox_trypost',['../group__sys__mbox.html#gaa36345e48a49d67cbb0878cd4cbd2195',1,'sys.h']]],
+  ['sys_5fmbox_5ftrypost_5ffromisr',['sys_mbox_trypost_fromisr',['../group__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a',1,'sys.h']]],
+  ['sys_5fmbox_5fvalid',['sys_mbox_valid',['../group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d',1,'sys.h']]],
+  ['sys_5fmbox_5fvalid_5fval',['sys_mbox_valid_val',['../sys_8h.html#aae82640d0bdbeec7b9b6511b3f8d99cb',1,'sys.h']]],
+  ['sys_5fmsleep',['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',['sys_mutex_free',['../group__sys__mutex.html#ga16336ce68b741e98204102ca4bc84dd9',1,'sys.h']]],
+  ['sys_5fmutex_5flock',['sys_mutex_lock',['../group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a',1,'sys.h']]],
+  ['sys_5fmutex_5fnew',['sys_mutex_new',['../group__sys__mutex.html#ga38e7dae1fd88b338eb1cd97f110f3897',1,'sys.h']]],
+  ['sys_5fmutex_5fset_5finvalid',['sys_mutex_set_invalid',['../group__sys__mutex.html#ga3f392725971dc837aa56dd7e45fa7ca8',1,'sys.h']]],
+  ['sys_5fmutex_5funlock',['sys_mutex_unlock',['../group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb',1,'sys.h']]],
+  ['sys_5fmutex_5fvalid',['sys_mutex_valid',['../group__sys__mutex.html#gaebe83ba90a6d9c23cdb3eb5d49562c4a',1,'sys.h']]],
+  ['sys_5fnow',['sys_now',['../group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199',1,'sys.h']]],
+  ['sys_5frestart_5ftimeouts',['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']]],
+  ['semaphores',['Semaphores',['../group__sys__sem.html',1,'']]],
+  ['sys_5fsem_5ffree',['sys_sem_free',['../group__sys__sem.html#ga83b781f96c30e915c752065a757da283',1,'sys.h']]],
+  ['sys_5fsem_5fnew',['sys_sem_new',['../group__sys__sem.html#gaf99da9e34a71855285c535183133dfde',1,'sys.h']]],
+  ['sys_5fsem_5fset_5finvalid',['sys_sem_set_invalid',['../group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33',1,'sys.h']]],
+  ['sys_5fsem_5fset_5finvalid_5fval',['sys_sem_set_invalid_val',['../sys_8h.html#a2556e570f6973a6f4d57d0e76ef190d8',1,'sys.h']]],
+  ['sys_5fsem_5fsignal',['sys_sem_signal',['../group__sys__sem.html#gaaf800273061fcc3f8200fd4e1b9ca875',1,'sys.h']]],
+  ['sys_5fsem_5fvalid',['sys_sem_valid',['../group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4',1,'sys.h']]],
+  ['sys_5fsem_5fvalid_5fval',['sys_sem_valid_val',['../sys_8h.html#a9e8ad541356786936f23ab83b8f550cc',1,'sys.h']]],
+  ['sys_5fsem_5fwait',['sys_sem_wait',['../sys_8h.html#a84e7e4bc00255aee84e6e7289a985703',1,'sys.h']]],
+  ['sys_5fstats',['SYS_STATS',['../group__lwip__opts__stats.html#ga0173549afa76553583e5a02c6a791218',1,'opt.h']]],
+  ['sys_5fthread_5fnew',['sys_thread_new',['../group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a',1,'sys.h']]],
+  ['sys_5ftimeout',['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',['sys_timeout_handler',['../timeouts_8h.html#a2ab5bb8173f492563f70a519011b0ac1',1,'timeouts.h']]],
+  ['sys_5ftimeouts_5finit',['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',['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',['SYS_TIMEOUTS_SLEEPTIME_INFINITE',['../timeouts_8h.html#a9e2b2593e709ff54c7e3c0b003f6f1b0',1,'timeouts.h']]],
+  ['sys_5funtimeout',['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/all_15.html b/doc/doxygen/output/html/search/all_15.html
new file mode 100644
index 0000000..8afe9a0
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_15.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_15.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_15.js b/doc/doxygen/output/html/search/all_15.js
new file mode 100644
index 0000000..ddc1378
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_15.js
@@ -0,0 +1,201 @@
+var searchData=
+[
+  ['tls_20layer',['TLS layer',['../group__altcp__tls.html',1,'']]],
+  ['tcp',['TCP',['../group__lwip__opts__tcp.html',1,'']]],
+  ['threading',['Threading',['../group__lwip__opts__thread.html',1,'']]],
+  ['thread_2dsafe_20apis',['Thread-safe APIs',['../group__lwip__opts__threadsafe__apis.html',1,'']]],
+  ['timers',['Timers',['../group__lwip__opts__timers.html',1,'']]],
+  ['tcp_20only',['TCP only',['../group__netconn__tcp.html',1,'']]],
+  ['traps',['Traps',['../group__snmp__traps.html',1,'']]],
+  ['time',['Time',['../group__sys__time.html',1,'']]],
+  ['tab',['tab',['../structmemp__desc.html#a9d6b758ce5c3b47a67a7568d38fb3926',1,'memp_desc']]],
+  ['tcgi',['tCGI',['../structt_c_g_i.html',1,'']]],
+  ['tcgihandler',['tCGIHandler',['../group__httpd.html#gafe011a487c5e8d03a6b2f629e14e6b5c',1,'httpd.h']]],
+  ['tcp',['tcp',['../structstats__.html#a32ef1aaa427d62a5c7890de0ac23fe86',1,'stats_']]],
+  ['tcp_2ec',['tcp.c',['../tcp_8c.html',1,'']]],
+  ['tcp_2eh',['tcp.h',['../prot_2tcp_8h.html',1,'(Global Namespace)'],['../tcp_8h.html',1,'(Global Namespace)']]],
+  ['tcp_5fabandon',['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',['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',['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_5faccept_5ffn',['tcp_accept_fn',['../tcp_8h.html#a00517abce6856d6c82f0efebdafb734d',1,'tcp.h']]],
+  ['tcp_5factive_5fpcbs',['tcp_active_pcbs',['../tcp_8c.html#a78c09dbae67ccc06b659d9f1a388f911',1,'tcp_active_pcbs():&#160;tcp.c'],['../tcp__priv_8h.html#a78c09dbae67ccc06b659d9f1a388f911',1,'tcp_active_pcbs():&#160;tcp.c']]],
+  ['tcp_5falloc',['tcp_alloc',['../tcp_8c.html#a1dd6830a42b3c464b5a72f62ae312d0a',1,'tcp_alloc(u8_t prio):&#160;tcp.c'],['../tcp__priv_8h.html#a1dd6830a42b3c464b5a72f62ae312d0a',1,'tcp_alloc(u8_t prio):&#160;tcp.c']]],
+  ['tcp_5farg',['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',['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',['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',['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',['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_5fbound_5fpcbs',['tcp_bound_pcbs',['../tcp_8c.html#a1b42a7ac0fc173a42d575f86853d32a8',1,'tcp_bound_pcbs():&#160;tcp.c'],['../tcp__priv_8h.html#a1b42a7ac0fc173a42d575f86853d32a8',1,'tcp_bound_pcbs():&#160;tcp.c']]],
+  ['tcp_5fbuild_5fmss_5foption',['TCP_BUILD_MSS_OPTION',['../tcp__priv_8h.html#abdc99c343efc6c81abf60bb62b361dd8',1,'tcp_priv.h']]],
+  ['tcp_5fcalculate_5feff_5fsend_5fmss',['TCP_CALCULATE_EFF_SEND_MSS',['../group__lwip__opts__tcp.html#gac04b84d32251ac558f0c3a8af85ba3a5',1,'opt.h']]],
+  ['tcp_5fchecksum_5fon_5fcopy',['TCP_CHECKSUM_ON_COPY',['../tcp__priv_8h.html#aea0c47b916a8a25f82d2063335033aee',1,'tcp_priv.h']]],
+  ['tcp_5fchecksum_5fon_5fcopy_5fsanity_5fcheck',['TCP_CHECKSUM_ON_COPY_SANITY_CHECK',['../tcp__out_8c.html#a25d7e9081baa5c84f2ebd34b0eb4169b',1,'tcp_out.c']]],
+  ['tcp_5fclose',['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',['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_5fconnected_5ffn',['tcp_connected_fn',['../tcp_8h.html#a939867106bd492caf2d85852fb7f6ae8',1,'tcp.h']]],
+  ['tcp_5fcwnd_5fdebug',['TCP_CWND_DEBUG',['../group__lwip__opts__debugmsg.html#ga66df03d8192cd978d3321a9d68bf5411',1,'opt.h']]],
+  ['tcp_5fdebug',['TCP_DEBUG',['../group__lwip__opts__debugmsg.html#ga4f43bb8a430c7a52a1ad5086d3f2803c',1,'opt.h']]],
+  ['tcp_5fdefault_5flisten_5fbacklog',['TCP_DEFAULT_LISTEN_BACKLOG',['../group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf',1,'opt.h']]],
+  ['tcp_5fdo_5foutput_5fnagle',['tcp_do_output_nagle',['../tcp__priv_8h.html#afbd7a2997e3a3b7569efc3298e2e409f',1,'tcp_priv.h']]],
+  ['tcp_5feff_5fsend_5fmss_5fnetif',['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',['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',['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_5ferr_5ffn',['tcp_err_fn',['../tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55',1,'tcp.h']]],
+  ['tcp_5fext_5farg_5falloc_5fid',['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',['tcp_ext_arg_callbacks',['../structtcp__ext__arg__callbacks.html',1,'']]],
+  ['tcp_5fext_5farg_5fget',['tcp_ext_arg_get',['../group__tcp__raw__extargs.html#gaa8ac7a74407cb3e0e01a30314805f990',1,'tcp_ext_arg_get(const struct tcp_pcb *pcb, uint8_t id):&#160;tcp.c'],['../group__tcp__raw__extargs.html#gaa8ac7a74407cb3e0e01a30314805f990',1,'tcp_ext_arg_get(const struct tcp_pcb *pcb, uint8_t id):&#160;tcp.c']]],
+  ['tcp_5fext_5farg_5finvoke_5fcallbacks_5fpassive_5fopen',['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',['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',['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_5fextarg_5fcallback_5fpassive_5fopen_5ffn',['tcp_extarg_callback_passive_open_fn',['../tcp_8h.html#aba649c5bdf19d47e39643392b6d88588',1,'tcp.h']]],
+  ['tcp_5fextarg_5fcallback_5fpcb_5fdestroyed_5ffn',['tcp_extarg_callback_pcb_destroyed_fn',['../tcp_8h.html#a20881e537f5be7847d88fe2a0c8fd2cd',1,'tcp.h']]],
+  ['tcp_5ffasttmr',['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_5ffr_5fdebug',['TCP_FR_DEBUG',['../group__lwip__opts__debugmsg.html#ga5895bee26e8e1a0b89d597e0f2580b23',1,'opt.h']]],
+  ['tcp_5ffree',['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_5fin_2ec',['tcp_in.c',['../tcp__in_8c.html',1,'']]],
+  ['tcp_5finit',['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',['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_5finput_5fdebug',['TCP_INPUT_DEBUG',['../group__lwip__opts__debugmsg.html#gaf51dc2563536de56470146749f715ba8',1,'opt.h']]],
+  ['tcp_5fkeepalive',['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',['tcp_listen',['../group__tcp__raw.html#ga6b2a4efb1fc15d7d85cb71cb2a1d1066',1,'tcp.h']]],
+  ['tcp_5flisten_5fbacklog',['TCP_LISTEN_BACKLOG',['../group__lwip__opts__tcp.html#ga98b23e7cbd3281915c50a485cb61899d',1,'opt.h']]],
+  ['tcp_5flisten_5fpcbs',['tcp_listen_pcbs',['../tcp_8c.html#a96fe1350e510d4308ac9969ffb4c9c81',1,'tcp_listen_pcbs():&#160;tcp.c'],['../tcp__priv_8h.html#a96fe1350e510d4308ac9969ffb4c9c81',1,'tcp_listen_pcbs():&#160;tcp.c']]],
+  ['tcp_5flisten_5fwith_5fbacklog',['tcp_listen_with_backlog',['../group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338',1,'tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog):&#160;tcp.c'],['../group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338',1,'tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog):&#160;tcp.c']]],
+  ['tcp_5flisten_5fwith_5fbacklog_5fand_5ferr',['tcp_listen_with_backlog_and_err',['../group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436',1,'tcp_listen_with_backlog_and_err(struct tcp_pcb *pcb, u8_t backlog, err_t *err):&#160;tcp.c'],['../group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436',1,'tcp_listen_with_backlog_and_err(struct tcp_pcb *pcb, u8_t backlog, err_t *err):&#160;tcp.c']]],
+  ['tcp_5fmaxrtx',['TCP_MAXRTX',['../group__lwip__opts__tcp.html#ga0dee0911197855bdf19ef79778c241a6',1,'opt.h']]],
+  ['tcp_5fmss',['TCP_MSS',['../group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b',1,'TCP_MSS():&#160;opt.h'],['../group__tcp__raw.html#gab0b45a01dcd461e5b8df2a1d9ddda134',1,'tcp_mss():&#160;tcp.h']]],
+  ['tcp_5fnagle_5fdisable',['tcp_nagle_disable',['../group__tcp__raw.html#ga5b5c0093efff4466bda06d45f12a4633',1,'tcp.h']]],
+  ['tcp_5fnagle_5fdisabled',['tcp_nagle_disabled',['../group__tcp__raw.html#ga9398061411b4af900160233aa3b1a286',1,'tcp.h']]],
+  ['tcp_5fnagle_5fenable',['tcp_nagle_enable',['../group__tcp__raw.html#ga9dfcdb8a05533b07dca91cf7e784f88f',1,'tcp.h']]],
+  ['tcp_5fnetif_5fip_5faddr_5fchanged',['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',['tcp_new',['../group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943',1,'tcp_new(void):&#160;tcp.c'],['../group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943',1,'tcp_new(void):&#160;tcp.c']]],
+  ['tcp_5fnew_5fip_5ftype',['tcp_new_ip_type',['../group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937',1,'tcp_new_ip_type(u8_t type):&#160;tcp.c'],['../group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937',1,'tcp_new_ip_type(u8_t type):&#160;tcp.c']]],
+  ['tcp_5fnext_5fiss',['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_5fooseq_5fmax_5fbytes',['TCP_OOSEQ_MAX_BYTES',['../group__lwip__opts__tcp.html#ga9d6d3219bb5fc0bc760a64114de13c25',1,'opt.h']]],
+  ['tcp_5fooseq_5fmax_5fpbufs',['TCP_OOSEQ_MAX_PBUFS',['../group__lwip__opts__tcp.html#ga1f57d3859c4556f785708e5dc440617e',1,'opt.h']]],
+  ['tcp_5fout_2ec',['tcp_out.c',['../tcp__out_8c.html',1,'']]],
+  ['tcp_5foutput',['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_5foutput_5fdebug',['TCP_OUTPUT_DEBUG',['../group__lwip__opts__debugmsg.html#ga9f70601fdc1feee490772bf7fcdb74fb',1,'opt.h']]],
+  ['tcp_5foversize',['TCP_OVERSIZE',['../group__lwip__opts__tcp.html#ga5648e2580bb55c0efdfbebcf3bad1eef',1,'opt.h']]],
+  ['tcp_5foversize_5fcalc_5flength',['TCP_OVERSIZE_CALC_LENGTH',['../tcp__out_8c.html#aa2ef22d2384225a1b5fee187411cc129',1,'tcp_out.c']]],
+  ['tcp_5foversize_5fdbgcheck',['TCP_OVERSIZE_DBGCHECK',['../tcp__priv_8h.html#a178a6e9966d03c3326b9e0568666bb69',1,'tcp_priv.h']]],
+  ['tcp_5fpcb',['tcp_pcb',['../structtcp__pcb.html',1,'']]],
+  ['tcp_5fpcb_5fcommon',['TCP_PCB_COMMON',['../tcp_8h.html#a874630045102fc5f1442704a790c8bb8',1,'tcp.h']]],
+  ['tcp_5fpcb_5flisten',['tcp_pcb_listen',['../structtcp__pcb__listen.html',1,'']]],
+  ['tcp_5fpcb_5flists',['tcp_pcb_lists',['../tcp_8c.html#a51515507dec664e9d69a870e6b627610',1,'tcp_pcb_lists():&#160;tcp.c'],['../tcp__priv_8h.html#af5e1079ab223e1cb27208c45e3c84df7',1,'tcp_pcb_lists():&#160;tcp.c']]],
+  ['tcp_5fpcb_5fpurge',['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',['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',['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_5fpoll_5ffn',['tcp_poll_fn',['../tcp_8h.html#a66deb97618a9cd9d57fca28c5245e073',1,'tcp.h']]],
+  ['tcp_5fpriv_2eh',['tcp_priv.h',['../tcp__priv_8h.html',1,'']]],
+  ['tcp_5fprocess_5frefused_5fdata',['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_5fqlen_5fdebug',['TCP_QLEN_DEBUG',['../group__lwip__opts__debugmsg.html#gae7980c7f8eb45cd411bf410ff0a3fc55',1,'opt.h']]],
+  ['tcp_5fqueue_5fooseq',['TCP_QUEUE_OOSEQ',['../group__lwip__opts__tcp.html#ga89ffd0d7d1529bdb26bfbad267d0ad75',1,'opt.h']]],
+  ['tcp',['TCP',['../group__tcp__raw.html',1,'']]],
+  ['tcp_5frecv',['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_5ffn',['tcp_recv_fn',['../tcp_8h.html#a780cfac08b02c66948ab94ea974202e8',1,'tcp.h']]],
+  ['tcp_5frecv_5fnull',['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',['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',['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',['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',['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',['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',['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',['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',['TCP_RST_DEBUG',['../group__lwip__opts__debugmsg.html#ga37596f7bbb9b7663826244ba54486679',1,'opt.h']]],
+  ['tcp_5frto_5fdebug',['TCP_RTO_DEBUG',['../group__lwip__opts__debugmsg.html#gad6e52e37415d0d0cbe4931a28f5a9662',1,'opt.h']]],
+  ['tcp_5fseg_5fcopy',['tcp_seg_copy',['../tcp_8c.html#a569d79451d2570e4ef406775725ef6ef',1,'tcp_seg_copy(struct tcp_seg *seg):&#160;tcp.c'],['../tcp__priv_8h.html#a569d79451d2570e4ef406775725ef6ef',1,'tcp_seg_copy(struct tcp_seg *seg):&#160;tcp.c']]],
+  ['tcp_5fseg_5ffree',['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',['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',['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',['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',['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',['tcp_sent_fn',['../tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18',1,'tcp.h']]],
+  ['tcp_5fsetprio',['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',['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',['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',['TCP_SND_BUF',['../group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd',1,'opt.h']]],
+  ['tcp_5fsnd_5fqueuelen',['TCP_SND_QUEUELEN',['../group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904',1,'opt.h']]],
+  ['tcp_5fsndbuf',['tcp_sndbuf',['../group__tcp__raw.html#gad1a95f09deb49cd7341d35527d6d3e2f',1,'tcp.h']]],
+  ['tcp_5fsndlowat',['TCP_SNDLOWAT',['../group__lwip__opts__tcp.html#gae5c9866d7cd463ac7b36792182145aec',1,'opt.h']]],
+  ['tcp_5fsndqueuelen',['tcp_sndqueuelen',['../group__tcp__raw.html#ga53ee4364718e84dc42cb1e0179deb1f4',1,'tcp.h']]],
+  ['tcp_5fsndqueuelowat',['TCP_SNDQUEUELOWAT',['../group__lwip__opts__tcp.html#ga75659867592a6b01c198532ed1b65698',1,'opt.h']]],
+  ['tcp_5fsplit_5funsent_5fseg',['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',['TCP_STATS',['../group__lwip__opts__stats.html#gaa02ec5c5bc0edebe418680c54d044f58',1,'opt.h']]],
+  ['tcp_5fsynmaxrtx',['TCP_SYNMAXRTX',['../group__lwip__opts__tcp.html#ga50b434a8541a4813f7b27f576c05d1b6',1,'opt.h']]],
+  ['tcp_5ftimer_5fneeded',['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',['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',['TCP_TTL',['../group__lwip__opts__tcp.html#gacd5b25ea81d2894790d25da5393cdab4',1,'opt.h']]],
+  ['tcp_5ftw_5fpcbs',['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',['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',['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',['TCP_WND',['../group__lwip__opts__tcp.html#ga7f535a6efb5cdf86c3210e35ece1d6a7',1,'opt.h']]],
+  ['tcp_5fwnd_5fdebug',['TCP_WND_DEBUG',['../group__lwip__opts__debugmsg.html#ga3704f433e947d6342da77c74e33627e1',1,'opt.h']]],
+  ['tcp_5fwnd_5fupdate_5fthreshold',['TCP_WND_UPDATE_THRESHOLD',['../group__lwip__opts__tcp.html#ga5d45732ba3a8438b141096d86e07ef8d',1,'opt.h']]],
+  ['tcp_5fwrite',['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',['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',['tcpbase.h',['../tcpbase_8h.html',1,'']]],
+  ['tcpip_2ec',['tcpip.c',['../tcpip_8c.html',1,'']]],
+  ['tcpip_2eh',['tcpip.h',['../tcpip_8h.html',1,'']]],
+  ['tcpip_5f6lowpan_5finput',['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',['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',['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',['tcpip_callback_fn',['../tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d',1,'tcpip.h']]],
+  ['tcpip_5fcallback_5fwith_5fblock',['tcpip_callback_with_block',['../group__lwip__os.html#gacd0a865623921ada2dd08962eb82c9df',1,'tcpip.h']]],
+  ['tcpip_5fcallbackmsg_5fdelete',['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',['tcpip_callbackmsg_new',['../group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac',1,'tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx):&#160;tcpip.c'],['../group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac',1,'tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx):&#160;tcpip.c']]],
+  ['tcpip_5fcallbackmsg_5ftrycallback',['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',['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',['TCPIP_DEBUG',['../group__lwip__opts__debugmsg.html#ga52d6c83451936c3de3b0338d4a3f921f',1,'opt.h']]],
+  ['tcpip_5finit',['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',['tcpip_init_done_fn',['../tcpip_8h.html#a5fe07216c441e27c3028bcac60fa0992',1,'tcpip.h']]],
+  ['tcpip_5finpkt',['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',['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',['TCPIP_MBOX_SIZE',['../group__lwip__opts__thread.html#ga8cf210ad4e4bf616860a45fbd140fd06',1,'opt.h']]],
+  ['tcpip_5fpriv_2eh',['tcpip_priv.h',['../tcpip__priv_8h.html',1,'']]],
+  ['tcpip_5frfc7668_5finput',['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',['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',['TCPIP_THREAD_NAME',['../group__lwip__opts__thread.html#ga405e604e4328e1feb878c6fe1798a587',1,'opt.h']]],
+  ['tcpip_5fthread_5fprio',['TCPIP_THREAD_PRIO',['../group__lwip__opts__thread.html#ga42b2c7a3042d7c3efd00f367f5837435',1,'opt.h']]],
+  ['tcpip_5fthread_5fstacksize',['TCPIP_THREAD_STACKSIZE',['../group__lwip__opts__thread.html#gaa02b84eafa0c8b09b158b97c96d79db0',1,'opt.h']]],
+  ['tcpip_5ftry_5fcallback',['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',['test_result',['../structnetbios__answer.html#a91116fe26c8050ee166053f377b40c7f',1,'netbios_answer']]],
+  ['tf_5freset',['TF_RESET',['../tcp__priv_8h.html#ac9dbdaeac3e25f5badf3a763a1b0b990',1,'tcp_priv.h']]],
+  ['tftp_20server',['TFTP server',['../group__tftp.html',1,'']]],
+  ['tftp_5fcleanup',['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',['tftp_context',['../structtftp__context.html',1,'']]],
+  ['tftp_5fdebug',['TFTP_DEBUG',['../group__tftp__opts.html#ga2dd54a1d0c3006527b8a7a8604b81981',1,'tftp_opts.h']]],
+  ['tftp_5finit',['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',['TFTP_MAX_FILENAME_LEN',['../group__tftp__opts.html#ga8e975900b4397313f1a649ff76a3063b',1,'tftp_opts.h']]],
+  ['tftp_5fmax_5fmode_5flen',['TFTP_MAX_MODE_LEN',['../group__tftp__opts.html#gaa8a449c25e37be757f5efccd422c9055',1,'tftp_opts.h']]],
+  ['tftp_5fmax_5fretries',['TFTP_MAX_RETRIES',['../group__tftp__opts.html#ga6a01757ad942eb602e8a87e2be42d313',1,'tftp_opts.h']]],
+  ['tftp_5fopts_2eh',['tftp_opts.h',['../tftp__opts_8h.html',1,'']]],
+  ['tftp_5fport',['TFTP_PORT',['../group__tftp__opts.html#gad9230620a5d3bb87a7ac280ff99875d1',1,'tftp_opts.h']]],
+  ['tftp_5fserver_2ec',['tftp_server.c',['../tftp__server_8c.html',1,'']]],
+  ['tftp_5fserver_2eh',['tftp_server.h',['../tftp__server_8h.html',1,'']]],
+  ['tftp_5ftimeout_5fmsecs',['TFTP_TIMEOUT_MSECS',['../group__tftp__opts.html#ga36986e5465dc2ccb6184fc57f9a37d63',1,'tftp_opts.h']]],
+  ['tftp_5ftimer_5fmsecs',['TFTP_TIMER_MSECS',['../group__tftp__opts.html#ga3e6caacb3f4d43f780b2d68ffe4258ea',1,'tftp_opts.h']]],
+  ['threadsync_5fdata',['threadsync_data',['../structthreadsync__data.html',1,'']]],
+  ['timeout_5fdiff',['timeout_diff',['../structmqtt__request__t.html#a65a7292669bc1f2d9df8f30bbcd77073',1,'mqtt_request_t']]],
+  ['timeouts_2ec',['timeouts.c',['../timeouts_8c.html',1,'']]],
+  ['timeouts_2eh',['timeouts.h',['../timeouts_8h.html',1,'']]],
+  ['timer',['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_5fdebug',['TIMERS_DEBUG',['../group__lwip__opts__debugmsg.html#ga24a6644ba9cc82665a7bf209b3870c15',1,'opt.h']]],
+  ['tls_5fconfig',['tls_config',['../structmqtt__connect__client__info__t.html#a45987acc116de5d27fff6856778e55b4',1,'mqtt_connect_client_info_t']]],
+  ['to',['to',['../structsmtp__session.html#a70b3753bc70e65f779279c246617faea',1,'smtp_session']]],
+  ['to_5flen',['to_len',['../structsmtp__session.html#a66b8e1dd314976788e9ac9a81f59a402',1,'smtp_session']]],
+  ['tot_5flen',['tot_len',['../structpbuf.html#a5259e7ec29bab9c0999b64f2e86b411f',1,'pbuf']]],
+  ['total_5fnumber_5fof_5fcommand_5fblocks',['total_number_of_command_blocks',['../structnetbios__answer.html#a4c7ea5d1839fd27232877880e43485a2',1,'netbios_answer']]],
+  ['tried_5fllipaddr',['tried_llipaddr',['../structautoip.html#a472f3d18c07b3df024a0cde8f4ffa853',1,'autoip']]],
+  ['ts',['ts',['../structnetif.html#a1bb4e3aed6e0fd4b6b31ee82d806f971',1,'netif']]],
+  ['tssihandler',['tSSIHandler',['../group__httpd.html#gaf88dacc4f18d299084cab75252001319',1,'httpd.h']]],
+  ['ttw',['ttw',['../structautoip.html#a7510d9a2961ea7c28ebfcde6390284bf',1,'autoip']]],
+  ['tx_5fbuf',['tx_buf',['../structsmtp__session.html#a42cedb495f7423b9e28979ce1e460c61',1,'smtp_session']]],
+  ['tx_5fdatagram_5ftag',['tx_datagram_tag',['../structlowpan6__ieee802154__data.html#a64560b289f86efe1d39ece603cd14b5c',1,'lowpan6_ieee802154_data']]],
+  ['tx_5fframe_5fseq_5fnum',['tx_frame_seq_num',['../structlowpan6__ieee802154__data.html#ad9cd994385c4d1d8ef0a22686c17720c',1,'lowpan6_ieee802154_data']]],
+  ['tx_5fid',['tx_id',['../structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00',1,'mdns_packet::tx_id()'],['../structmdns__outpacket.html#ac470f02a9f332f18e027437dc293d348',1,'mdns_outpacket::tx_id()']]],
+  ['txt_5ffn',['txt_fn',['../structmdns__service.html#a79bc4946c96a3b2d0713bc0897c4bd9c',1,'mdns_service']]],
+  ['txtdata',['txtdata',['../structmdns__service.html#a35daff90a18d19b14f23fa02df424f94',1,'mdns_service']]],
+  ['type',['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',['type_internal',['../structpbuf.html#a61a26ac8393dc9e549016b86c2cf5131',1,'pbuf']]]
+];
diff --git a/doc/doxygen/output/html/search/all_16.html b/doc/doxygen/output/html/search/all_16.html
new file mode 100644
index 0000000..e511edb
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_16.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_16.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_16.js b/doc/doxygen/output/html/search/all_16.js
new file mode 100644
index 0000000..3435bf5
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_16.js
@@ -0,0 +1,37 @@
+var searchData=
+[
+  ['udp',['UDP',['../group__lwip__opts__udp.html',1,'']]],
+  ['udp_20only',['UDP only',['../group__netconn__udp.html',1,'']]],
+  ['udp',['udp',['../structstats__.html#a626e03d4bded6480582789cfd17d4063',1,'stats_']]],
+  ['udp_2ec',['udp.c',['../udp_8c.html',1,'']]],
+  ['udp_2eh',['udp.h',['../prot_2udp_8h.html',1,'(Global Namespace)'],['../udp_8h.html',1,'(Global Namespace)']]],
+  ['udp_5fbind',['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',['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',['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_5fdebug',['UDP_DEBUG',['../group__lwip__opts__debugmsg.html#ga0393f312c5475a1c649b39ef9cfcaad4',1,'opt.h']]],
+  ['udp_5fdisconnect',['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',['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',['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',['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',['udp_new',['../group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209',1,'udp_new(void):&#160;udp.c'],['../group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209',1,'udp_new(void):&#160;udp.c']]],
+  ['udp_5fnew_5fip_5ftype',['udp_new_ip_type',['../group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88',1,'udp_new_ip_type(u8_t type):&#160;udp.c'],['../group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88',1,'udp_new_ip_type(u8_t type):&#160;udp.c']]],
+  ['udp_5fpcb',['udp_pcb',['../structudp__pcb.html',1,'']]],
+  ['udp',['UDP',['../group__udp__raw.html',1,'']]],
+  ['udp_5frecv',['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_5frecv_5ffn',['udp_recv_fn',['../udp_8h.html#af0ec7feb31acdb6e11b928f438c8a64b',1,'udp.h']]],
+  ['udp_5fremove',['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',['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',['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',['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',['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',['UDP_STATS',['../group__lwip__opts__stats.html#gaef64b11bf71f0d6d5bafaf6092462276',1,'opt.h']]],
+  ['udp_5fttl',['UDP_TTL',['../group__lwip__opts__udp.html#ga97908a317bcba89174b5d1ccbdca0096',1,'opt.h']]],
+  ['unicast_5freply',['unicast_reply',['../structmdns__outpacket.html#a68255725575af086a3afa76bc5c8e64d',1,'mdns_outpacket']]],
+  ['unit_5fid',['unit_id',['../structnetbios__answer.html#aeed6aa8ba4f8bb107d141b3b3d0a1787',1,'netbios_answer']]],
+  ['unlock_5ftcpip_5fcore',['UNLOCK_TCPIP_CORE',['../tcpip_8h.html#a915effea029b9c4891e1ec635eb1826d',1,'tcpip.h']]],
+  ['unmap_5fipv4_5fmapped_5fipv6',['unmap_ipv4_mapped_ipv6',['../group__ipaddr.html#ga66b5a64b12128e3716bcf04ff91b5a57',1,'ip_addr.h']]],
+  ['upgrading',['Upgrading',['../upgrading.html',1,'']]],
+  ['use',['use',['../structigmp__group.html#ab3625aeb3689e3626f73138eb0e41852',1,'igmp_group::use()'],['../structmld__group.html#addc67094f83c9352fe039c392c480f9e',1,'mld_group::use()']]],
+  ['used',['used',['../structmem.html#aa76b6a39425617435978dce903f0d456',1,'mem']]],
+  ['username',['username',['../structsmtp__session.html#a568e3def9d0ec54e3c079f577717a6bb',1,'smtp_session']]]
+];
diff --git a/doc/doxygen/output/html/search/all_17.html b/doc/doxygen/output/html/search/all_17.html
new file mode 100644
index 0000000..5ca9efd
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_17.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_17.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_17.js b/doc/doxygen/output/html/search/all_17.js
new file mode 100644
index 0000000..b970844
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_17.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+  ['version',['Version',['../group__lwip__version.html',1,'']]],
+  ['value',['value',['../structsnmp__varbind.html#a328227d7ae188a0a2feb95f8000aac45',1,'snmp_varbind']]],
+  ['value_5flen',['value_len',['../structsnmp__varbind.html#ab094577fac6c7cc16ad666c9970cdb85',1,'snmp_varbind']]],
+  ['vector',['vector',['../structapi__msg.html#a1ceb9822ba49ba439e30d98492593612',1,'api_msg']]],
+  ['vector_5fcnt',['vector_cnt',['../structapi__msg.html#ab6f14157a3e6735b69a569249d3286a2',1,'api_msg']]],
+  ['vector_5foff',['vector_off',['../structapi__msg.html#a6896ae78ebddefdf2d8358ab5f21f444',1,'api_msg']]],
+  ['version_5fnumber',['version_number',['../structnetbios__answer.html#a151dce0f0bf626b2a54fbb75775237ba',1,'netbios_answer']]]
+];
diff --git a/doc/doxygen/output/html/search/all_18.html b/doc/doxygen/output/html/search/all_18.html
new file mode 100644
index 0000000..069edeb
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_18.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_18.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_18.js b/doc/doxygen/output/html/search/all_18.js
new file mode 100644
index 0000000..29f1b90
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_18.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+  ['w',['w',['../structapi__msg.html#a8a71456d1199d10af5c1d8760cc0ce73',1,'api_msg']]],
+  ['will_5fmsg',['will_msg',['../structmqtt__connect__client__info__t.html#a925fcebd15555afdc0820e196e2fd3a7',1,'mqtt_connect_client_info_t']]],
+  ['will_5fqos',['will_qos',['../structmqtt__connect__client__info__t.html#a07954934f4fecf54fa190997848229d9',1,'mqtt_connect_client_info_t']]],
+  ['will_5fretain',['will_retain',['../structmqtt__connect__client__info__t.html#a49c10873f44d7534140a63eef2a6a4e3',1,'mqtt_connect_client_info_t']]],
+  ['will_5ftopic',['will_topic',['../structmqtt__connect__client__info__t.html#a32e77415460752ba0484eb3ba0faf0c8',1,'mqtt_connect_client_info_t']]],
+  ['write',['write',['../structtftp__context.html#a9e6e4ec803ec9597822923369701754d',1,'tftp_context::write()'],['../group__socket.html#ga0a651eb5fb5e6127f5e5153ce2251f3d',1,'write():&#160;sockets.h']]],
+  ['write_5foffset',['write_offset',['../structmdns__outpacket.html#a8ead21e392b21c3e872c0cab874cdcf5',1,'mdns_outpacket']]],
+  ['writeset',['writeset',['../structlwip__select__cb.html#aa89638b1c2c6b2c88030560861aba04c',1,'lwip_select_cb']]],
+  ['writev',['writev',['../group__socket.html#ga697fd916a65a10b4dcb54b8199346fee',1,'sockets.h']]]
+];
diff --git a/doc/doxygen/output/html/search/all_19.html b/doc/doxygen/output/html/search/all_19.html
new file mode 100644
index 0000000..4fdfe46
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_19.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_19.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_19.js b/doc/doxygen/output/html/search/all_19.js
new file mode 100644
index 0000000..05a6bf6
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_19.js
@@ -0,0 +1,14 @@
+var searchData=
+[
+  ['zep_5fdst_5fip_5faddr',['zep_dst_ip_addr',['../structzepif__init.html#a851efb99a973348f1064a31b97ce779d',1,'zepif_init']]],
+  ['zep_5fdst_5fudp_5fport',['zep_dst_udp_port',['../structzepif__init.html#a86c6229ed3010158e601666afe91a286',1,'zepif_init']]],
+  ['zep_5fnetif',['zep_netif',['../structzepif__init.html#a3d97bf90b6bd4dd8258a3b1caf7890e3',1,'zepif_init']]],
+  ['zep_5fsrc_5fip_5faddr',['zep_src_ip_addr',['../structzepif__init.html#adbe989f1f5cba623d742187def36f02c',1,'zepif_init']]],
+  ['zep_5fsrc_5fudp_5fport',['zep_src_udp_port',['../structzepif__init.html#ad739032585841b126b4c0eab5899d40f',1,'zepif_init']]],
+  ['zep_20_2d_20zigbee_20encapsulation_20protocol',['ZEP - ZigBee Encapsulation Protocol',['../group__zepif.html',1,'']]],
+  ['zepif_2ec',['zepif.c',['../zepif_8c.html',1,'']]],
+  ['zepif_2eh',['zepif.h',['../zepif_8h.html',1,'']]],
+  ['zepif_5finit',['zepif_init',['../structzepif__init.html',1,'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']]],
+  ['zepif_5floopback',['ZEPIF_LOOPBACK',['../zepif_8c.html#a8cae594e71cf385076f7bda166729dcd',1,'zepif.c']]],
+  ['zero_2dcopy_20rx',['Zero-copy RX',['../zerocopyrx.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/all_2.html b/doc/doxygen/output/html/search/all_2.html
new file mode 100644
index 0000000..9543c57
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_2.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_2.js b/doc/doxygen/output/html/search/all_2.js
new file mode 100644
index 0000000..7bd4977
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_2.js
@@ -0,0 +1,115 @@
+var searchData=
+[
+  ['accept',['accept',['../group__socket.html#gade2b17671b5a4b18e941fbf7e1060310',1,'sockets.h']]],
+  ['acceptmbox',['acceptmbox',['../structnetconn.html#a9b59188f300828d2b5814e27ab27cad0',1,'netconn']]],
+  ['access',['access',['../structsnmp__node__instance.html#a4af17d17a971f1d11a186e6e1fc4411c',1,'snmp_node_instance']]],
+  ['ad',['ad',['../structapi__msg.html#a36dedcbd9ecca67043a8e1d1e715be94',1,'api_msg']]],
+  ['additional',['additional',['../structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce',1,'mdns_outpacket']]],
+  ['addr',['addr',['../structdns__api__msg.html#a217814594564077d21b0f2696280b2a8',1,'dns_api_msg::addr()'],['../structzepif__init.html#a5a9a7ee6e687a7c1ae85b103d39de61d',1,'zepif_init::addr()']]],
+  ['addr_5findex',['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',['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',['alloc',['../structaltcp__allocator__s.html#aaf07ebf181a11d0320381ef46d40e687',1,'altcp_allocator_s']]],
+  ['application_20layered_20tcp_20functions',['Application layered TCP Functions',['../group__altcp.html',1,'']]],
+  ['altcp_2ec',['altcp.c',['../altcp_8c.html',1,'']]],
+  ['altcp_2eh',['altcp.h',['../altcp_8h.html',1,'']]],
+  ['altcp_5fabort',['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',['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',['altcp_alloc',['../altcp_8c.html#a6a99f8757c18fbc9b9f30925afbcf4c2',1,'altcp_alloc(void):&#160;altcp.c'],['../altcp__priv_8h.html#a6a99f8757c18fbc9b9f30925afbcf4c2',1,'altcp_alloc(void):&#160;altcp.c']]],
+  ['altcp_5falloc_2ec',['altcp_alloc.c',['../altcp__alloc_8c.html',1,'']]],
+  ['altcp_5fallocator_5fs',['altcp_allocator_s',['../structaltcp__allocator__s.html',1,'']]],
+  ['altcp_5fallocator_5ft',['altcp_allocator_t',['../group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8',1,'altcp.h']]],
+  ['application_20layered_20tcp_20introduction',['Application layered TCP Introduction',['../group__altcp__api.html',1,'']]],
+  ['altcp_5farg',['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',['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',['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',['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',['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',['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',['altcp_listen',['../group__altcp.html#ga96c22e15230b5216b3a95dc9e2ca42c8',1,'altcp.h']]],
+  ['altcp_5flisten_5fwith_5fbacklog_5fand_5ferr',['altcp_listen_with_backlog_and_err',['../group__altcp.html#gac69722b86b1198916f2527fb9f132c2b',1,'altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err):&#160;altcp.c'],['../group__altcp.html#gac69722b86b1198916f2527fb9f132c2b',1,'altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err):&#160;altcp.c']]],
+  ['altcp_5fmbedtls_5fdebug',['ALTCP_MBEDTLS_DEBUG',['../altcp__tls__mbedtls__opts_8h.html#a7727456eeb0b3311213936413d238989',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5fsession_5fcache_5ftimeout_5fseconds',['ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS',['../altcp__tls__mbedtls__opts_8h.html#a6acb28346f87b2310fc00ec1fccba2b6',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmss',['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',['altcp_new',['../group__altcp.html#ga86843287b0ad0099c067817cfb7aa336',1,'altcp_new(altcp_allocator_t *allocator):&#160;altcp.c'],['../group__altcp.html#ga86843287b0ad0099c067817cfb7aa336',1,'altcp_new(altcp_allocator_t *allocator):&#160;altcp.c']]],
+  ['altcp_5fnew_5fip6',['altcp_new_ip6',['../group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1',1,'altcp_new_ip6(altcp_allocator_t *allocator):&#160;altcp.c'],['../group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1',1,'altcp_new_ip6(altcp_allocator_t *allocator):&#160;altcp.c']]],
+  ['altcp_5fnew_5fip_5ftype',['altcp_new_ip_type',['../group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21',1,'altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type):&#160;altcp.c'],['../group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21',1,'altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type):&#160;altcp.c']]],
+  ['altcp_5foutput',['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',['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',['altcp_priv.h',['../altcp__priv_8h.html',1,'']]],
+  ['altcp_5fproxyconnect_2ec',['altcp_proxyconnect.c',['../altcp__proxyconnect_8c.html',1,'']]],
+  ['altcp_5fproxyconnect_2eh',['altcp_proxyconnect.h',['../altcp__proxyconnect_8h.html',1,'']]],
+  ['altcp_5fproxyconnect_5falloc',['altcp_proxyconnect_alloc',['../altcp__proxyconnect_8c.html#a3d3af45390467ceeaa064b7e28dd43a9',1,'altcp_proxyconnect_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#a3d3af45390467ceeaa064b7e28dd43a9',1,'altcp_proxyconnect_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
+  ['altcp_5fproxyconnect_5fclient_5fagent',['ALTCP_PROXYCONNECT_CLIENT_AGENT',['../altcp__proxyconnect_8c.html#a344227f22aa1b58f7ed737a2d4f4636f',1,'altcp_proxyconnect.c']]],
+  ['altcp_5fproxyconnect_5fnew',['altcp_proxyconnect_new',['../altcp__proxyconnect_8c.html#ae774782064a92d0f58ce07b57a5360d1',1,'altcp_proxyconnect_new(struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#ae774782064a92d0f58ce07b57a5360d1',1,'altcp_proxyconnect_new(struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb):&#160;altcp_proxyconnect.c']]],
+  ['altcp_5fproxyconnect_5fnew_5ftcp',['altcp_proxyconnect_new_tcp',['../altcp__proxyconnect_8c.html#a24e122d2bc2c0b9f86074c1e8d5ccfe4',1,'altcp_proxyconnect_new_tcp(struct altcp_proxyconnect_config *config, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#a24e122d2bc2c0b9f86074c1e8d5ccfe4',1,'altcp_proxyconnect_new_tcp(struct altcp_proxyconnect_config *config, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
+  ['altcp_5fproxyconnect_5ftls_5falloc',['altcp_proxyconnect_tls_alloc',['../altcp__proxyconnect_8c.html#a5ff49bcd035847a8915f18deef4172a9',1,'altcp_proxyconnect_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#a5ff49bcd035847a8915f18deef4172a9',1,'altcp_proxyconnect_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
+  ['altcp_5frecv',['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',['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',['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',['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',['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',['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',['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',['altcp_tcp.c',['../altcp__tcp_8c.html',1,'']]],
+  ['altcp_5ftcp_2eh',['altcp_tcp.h',['../altcp__tcp_8h.html',1,'']]],
+  ['altcp_5ftcp_5falloc',['altcp_tcp_alloc',['../altcp__tcp_8c.html#a211215e43cb40bd204a20c34316b7caa',1,'altcp_tcp_alloc(void *arg, u8_t ip_type):&#160;altcp_tcp.c'],['../altcp__tcp_8h.html#a211215e43cb40bd204a20c34316b7caa',1,'altcp_tcp_alloc(void *arg, u8_t ip_type):&#160;altcp_tcp.c']]],
+  ['altcp_5ftls_2eh',['altcp_tls.h',['../altcp__tls_8h.html',1,'']]],
+  ['altcp_5ftls_5falloc',['altcp_tls_alloc',['../group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391',1,'altcp_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_alloc.c'],['../group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391',1,'altcp_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_alloc.c']]],
+  ['altcp_5ftls_5fcontext',['altcp_tls_context',['../group__altcp__tls.html#gabc1741530d5089c3093889416430bc76',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fcreate_5fconfig_5fclient',['altcp_tls_create_config_client',['../group__altcp__tls.html#ga2b249447e10c8599b6d723d403086c35',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fcreate_5fconfig_5fclient_5f2wayauth',['altcp_tls_create_config_client_2wayauth',['../group__altcp__tls.html#ga7352a4600fee89e167541cf0776c01fb',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fcreate_5fconfig_5fserver_5fprivkey_5fcert',['altcp_tls_create_config_server_privkey_cert',['../group__altcp__tls.html#ga700dc0320e93cea337673e7d4295e161',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5ffree_5fconfig',['altcp_tls_free_config',['../group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fmbedtls_2ec',['altcp_tls_mbedtls.c',['../altcp__tls__mbedtls_8c.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_5fmem_2ec',['altcp_tls_mbedtls_mem.c',['../altcp__tls__mbedtls__mem_8c.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_5fmem_2eh',['altcp_tls_mbedtls_mem.h',['../altcp__tls__mbedtls__mem_8h.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_5fopts_2eh',['altcp_tls_mbedtls_opts.h',['../altcp__tls__mbedtls__opts_8h.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_5fstructs_2eh',['altcp_tls_mbedtls_structs.h',['../altcp__tls__mbedtls__structs_8h.html',1,'']]],
+  ['altcp_5ftls_5fnew',['altcp_tls_new',['../group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a',1,'altcp_tls_new(struct altcp_tls_config *config, u8_t ip_type):&#160;altcp_alloc.c'],['../group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a',1,'altcp_tls_new(struct altcp_tls_config *config, u8_t ip_type):&#160;altcp_alloc.c']]],
+  ['altcp_5ftls_5fwrap',['altcp_tls_wrap',['../group__altcp__tls.html#gab874adb7f87984c0520bd032c2108c47',1,'altcp_tls.h']]],
+  ['altcp_5fwrite',['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']]],
+  ['answer_5fname',['answer_name',['../structnetbios__answer.html#abf746cd54add594216ddc3683c741406',1,'netbios_answer']]],
+  ['answer_5fname_5fflags',['answer_name_flags',['../structnetbios__answer.html#a2729b7249e3d23309624cb19fa0dbfc4',1,'netbios_answer']]],
+  ['answers',['answers',['../structmdns__packet.html#a918feee242cfb3934d9f5c3de1c298e7',1,'mdns_packet::answers()'],['../structmdns__outpacket.html#aad2c24d4d5a935a209966ceace82f9ad',1,'mdns_outpacket::answers()']]],
+  ['answers_5fleft',['answers_left',['../structmdns__packet.html#a56ba495a1458a21982e65d746468849d',1,'mdns_packet']]],
+  ['apis',['APIs',['../group__api.html',1,'']]],
+  ['api_2eh',['api.h',['../api_8h.html',1,'']]],
+  ['api_5fevent',['API_EVENT',['../api_8h.html#a3ce590f58be8f60dbde361920863b26d',1,'api.h']]],
+  ['api_5flib_2ec',['api_lib.c',['../api__lib_8c.html',1,'']]],
+  ['api_5flib_5fdebug',['API_LIB_DEBUG',['../group__lwip__opts__debugmsg.html#ga671009550216f7dc03e67ba5751e3160',1,'opt.h']]],
+  ['api_5fmsg',['api_msg',['../structapi__msg.html',1,'']]],
+  ['api_5fmsg_2ec',['api_msg.c',['../api__msg_8c.html',1,'']]],
+  ['api_5fmsg_2eh',['api_msg.h',['../api__msg_8h.html',1,'']]],
+  ['api_5fmsg_5fdebug',['API_MSG_DEBUG',['../group__lwip__opts__debugmsg.html#ga4279d7ff9f986b2ff3eb068bb012b697',1,'opt.h']]],
+  ['applications',['Applications',['../group__apps.html',1,'']]],
+  ['arch_2eh',['arch.h',['../arch_8h.html',1,'']]],
+  ['arg',['arg',['../structaltcp__allocator__s.html#a8d8aa48e9a105e9d25ad4b90d259d0b1',1,'altcp_allocator_s']]],
+  ['arp_5fage_5frerequest_5fused_5funicast',['ARP_AGE_REREQUEST_USED_UNICAST',['../etharp_8c.html#ac71515a6f140b25de49e9bf432b2bb2a',1,'etharp.c']]],
+  ['arp_5fmaxage',['ARP_MAXAGE',['../group__lwip__opts__arp.html#ga741a0710dc126ed3ae9e305472df3432',1,'opt.h']]],
+  ['arp_5fmaxpending',['ARP_MAXPENDING',['../etharp_8c.html#a0a03fea13e060da5a53a10a75a96def9',1,'etharp.c']]],
+  ['arp_5fqueue_5flen',['ARP_QUEUE_LEN',['../group__lwip__opts__arp.html#ga29f41a6ebdbb23f46688d381b3609fd1',1,'opt.h']]],
+  ['arp_5fqueueing',['ARP_QUEUEING',['../group__lwip__opts__arp.html#ga75837814536af29b6102508588d0ab58',1,'opt.h']]],
+  ['arp_5ftable_5fsize',['ARP_TABLE_SIZE',['../group__lwip__opts__arp.html#ga924936a814564dbdb0bc950d255a83b9',1,'opt.h']]],
+  ['arp_5ftmr_5finterval',['ARP_TMR_INTERVAL',['../lwip_2etharp_8h.html#aaa3d8ed1eb1129f518345e37b38cfc37',1,'etharp.h']]],
+  ['asn1_5ftype',['asn1_type',['../structsnmp__node__instance.html#af51206e0912a8402c395dcf3b623f8b9',1,'snmp_node_instance']]],
+  ['auth_5fplain',['auth_plain',['../structsmtp__session.html#a9da4e424e22892fae51987665eca85a9',1,'smtp_session']]],
+  ['auth_5fplain_5flen',['auth_plain_len',['../structsmtp__session.html#a003dfd03ac58252b575a7c965e532461',1,'smtp_session']]],
+  ['authoritative',['authoritative',['../structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035',1,'mdns_outpacket']]],
+  ['autoip',['autoip',['../structautoip.html',1,'autoip'],['../group__autoip.html',1,'(Global Namespace)']]],
+  ['autoip_2ec',['autoip.c',['../autoip_8c.html',1,'']]],
+  ['autoip_2eh',['autoip.h',['../autoip_8h.html',1,'(Global Namespace)'],['../prot_2autoip_8h.html',1,'(Global Namespace)']]],
+  ['autoip_5farp_5freply',['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',['AUTOIP_DEBUG',['../group__lwip__opts__debugmsg.html#gafaee522e7f32d81022215e1805e303a5',1,'opt.h']]],
+  ['autoip_5fnetwork_5fchanged',['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',['autoip_remove_struct',['../autoip_8h.html#aaeb4b778fce078bee84144ab50916b15',1,'autoip.h']]],
+  ['autoip_5fset_5fstruct',['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',['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',['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',['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',['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',['AUTOIP_TMR_INTERVAL',['../autoip_8h.html#a8986919a452ab77eec9a199ff6668e92',1,'autoip.h']]],
+  ['assertion_20handling',['Assertion handling',['../group__lwip__assertions.html',1,'']]],
+  ['arp',['ARP',['../group__lwip__opts__arp.html',1,'']]],
+  ['autoip',['AUTOIP',['../group__lwip__opts__autoip.html',1,'']]],
+  ['autoip',['AUTOIP',['../group__netifapi__autoip.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/all_3.html b/doc/doxygen/output/html/search/all_3.html
new file mode 100644
index 0000000..03405c0
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_3.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_3.js b/doc/doxygen/output/html/search/all_3.js
new file mode 100644
index 0000000..18d879f
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_3.js
@@ -0,0 +1,32 @@
+var searchData=
+[
+  ['b',['b',['../structapi__msg.html#ab0abd60527e96cc24c2c20c835cdac05',1,'api_msg']]],
+  ['base',['base',['../structmemp__desc.html#a9aec58adcbcd88167247296ca4346558',1,'memp_desc']]],
+  ['bc',['bc',['../structapi__msg.html#a1705127c6cd22c2c6dbbcc59834e41e0',1,'api_msg']]],
+  ['bind',['bind',['../group__socket.html#ga4a88bb849aa7203b24bb245a193997a6',1,'sockets.h']]],
+  ['ble_5faddr_5fto_5feui64',['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']]],
+  ['body',['body',['../structsmtp__session.html#a7bb4bf5cc209e073341b56845e5cbd49',1,'smtp_session']]],
+  ['body_5flen',['body_len',['../structsmtp__session.html#a0da8b775ddfe5f8891464037a6b4bb4d',1,'smtp_session']]],
+  ['body_5fsent',['body_sent',['../structsmtp__session.html#a5893c61d863b4846a81d8a4bbcaebb5b',1,'smtp_session']]],
+  ['bridgeif_2ec',['bridgeif.c',['../bridgeif_8c.html',1,'']]],
+  ['bridgeif_2eh',['bridgeif.h',['../bridgeif_8h.html',1,'']]],
+  ['bridgeif_5fadd_5fport',['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_5fdebug',['BRIDGEIF_DEBUG',['../group__bridgeif__opts.html#gaab45e20e9b09a98217994082968cec73',1,'bridgeif_opts.h']]],
+  ['bridgeif_5ffdb_2ec',['bridgeif_fdb.c',['../bridgeif__fdb_8c.html',1,'']]],
+  ['bridgeif_5ffdb_5fadd',['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_5fdebug',['BRIDGEIF_FDB_DEBUG',['../group__bridgeif__opts.html#ga72e389f592470dc50288a68f3db70730',1,'bridgeif_opts.h']]],
+  ['bridgeif_5ffdb_5fget_5fdst_5fports',['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']]],
+  ['bridgeif_5ffdb_5finit',['bridgeif_fdb_init',['../group__bridgeif__fdb.html#gaf7935226ee7f99f964bf0135b6cb9ca0',1,'bridgeif_fdb_init(u16_t max_fdb_entries):&#160;bridgeif_fdb.c'],['../group__bridgeif__fdb.html#gaf7935226ee7f99f964bf0135b6cb9ca0',1,'bridgeif_fdb_init(u16_t max_fdb_entries):&#160;bridgeif_fdb.c']]],
+  ['bridgeif_5ffdb_5fremove',['bridgeif_fdb_remove',['../group__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8',1,'bridgeif_fdb_remove(struct netif *bridgeif, const struct eth_addr *addr):&#160;bridgeif.c'],['../group__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8',1,'bridgeif_fdb_remove(struct netif *bridgeif, const struct eth_addr *addr):&#160;bridgeif.c']]],
+  ['bridgeif_5ffdb_5fupdate_5fsrc',['bridgeif_fdb_update_src',['../group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39',1,'bridgeif_fdb_update_src(void *fdb_ptr, struct eth_addr *src_addr, u8_t port_idx):&#160;bridgeif_fdb.c'],['../group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39',1,'bridgeif_fdb_update_src(void *fdb_ptr, struct eth_addr *src_addr, u8_t port_idx):&#160;bridgeif_fdb.c']]],
+  ['bridgeif_5ffw_5fdebug',['BRIDGEIF_FW_DEBUG',['../group__bridgeif__opts.html#gac456e97b1b0e9a57449596a2b229763a',1,'bridgeif_opts.h']]],
+  ['bridgeif_5finit',['bridgeif_init',['../group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c',1,'bridgeif_init(struct netif *netif):&#160;bridgeif.c'],['../group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c',1,'bridgeif_init(struct netif *netif):&#160;bridgeif.c']]],
+  ['bridgeif_5finitdata1',['BRIDGEIF_INITDATA1',['../group__bridgeif.html#ga3d41c7905b61aef3a3b8c61b3af7879f',1,'bridgeif.h']]],
+  ['bridgeif_5finitdata2',['BRIDGEIF_INITDATA2',['../group__bridgeif.html#gaaaeb47fbf1dd6c30cb502343fa0d0741',1,'bridgeif.h']]],
+  ['bridgeif_5finitdata_5fs',['bridgeif_initdata_s',['../structbridgeif__initdata__s.html',1,'']]],
+  ['bridgeif_5finitdata_5ft',['bridgeif_initdata_t',['../group__bridgeif.html#gac47f8ce66bc6dad5dd9829467f93a1bb',1,'bridgeif.h']]],
+  ['bridgeif_5fmax_5fports',['BRIDGEIF_MAX_PORTS',['../group__bridgeif__opts.html#ga6fe03b84359150b7dea3dfca942b6414',1,'bridgeif_opts.h']]],
+  ['bridgeif_5fopts_2eh',['bridgeif_opts.h',['../bridgeif__opts_8h.html',1,'']]],
+  ['bridgeif_5fport_5fnetifs_5foutput_5fdirect',['BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT',['../group__bridgeif__opts.html#ga5aed5cd9b01ba1345b47845cd04ca30d',1,'bridgeif_opts.h']]],
+  ['byte_5forder',['BYTE_ORDER',['../group__compiler__abstraction.html#ga1771b7fb65ee640524d0052f229768c3',1,'arch.h']]]
+];
diff --git a/doc/doxygen/output/html/search/all_4.html b/doc/doxygen/output/html/search/all_4.html
new file mode 100644
index 0000000..8e1f4b9
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_4.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_4.js b/doc/doxygen/output/html/search/all_4.js
new file mode 100644
index 0000000..69733dd
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_4.js
@@ -0,0 +1,48 @@
+var searchData=
+[
+  ['cache_5fflush',['cache_flush',['../structmdns__outpacket.html#a9bd0fd91dda48baa2938dddd747d3195',1,'mdns_outpacket']]],
+  ['callback',['callback',['../structnetconn.html#abe796060bb06e585333ca9a87862b624',1,'netconn']]],
+  ['callback_5farg',['callback_arg',['../structsmtp__session.html#af0544df7a935a092d825d8f2380f970f',1,'smtp_session']]],
+  ['callback_5ffn',['callback_fn',['../structsmtp__session.html#a24c13d621e18311a613ab68b856a7f7b',1,'smtp_session']]],
+  ['cb',['cb',['../structmqtt__request__t.html#a32a4b14b0b8b5b8ce8db1074e53f4a79',1,'mqtt_request_t']]],
+  ['changelog',['Changelog',['../changelog.html',1,'']]],
+  ['checksum_5fcheck_5ficmp',['CHECKSUM_CHECK_ICMP',['../group__lwip__opts__checksum.html#ga79807171be8c20b69a5cd8de83566d25',1,'opt.h']]],
+  ['checksum_5fcheck_5ficmp6',['CHECKSUM_CHECK_ICMP6',['../group__lwip__opts__checksum.html#gaf466a10b093489910a773fd1cec74c2d',1,'opt.h']]],
+  ['checksum_5fcheck_5fip',['CHECKSUM_CHECK_IP',['../group__lwip__opts__checksum.html#ga005b1b9988b84a2cb844144cef22c11e',1,'opt.h']]],
+  ['checksum_5fcheck_5ftcp',['CHECKSUM_CHECK_TCP',['../group__lwip__opts__checksum.html#gab676cc29571b7ffda12336482ad97699',1,'opt.h']]],
+  ['checksum_5fcheck_5fudp',['CHECKSUM_CHECK_UDP',['../group__lwip__opts__checksum.html#ga6747f7b72abe544fd4dc184cc7fcad37',1,'opt.h']]],
+  ['checksum_5fgen_5ficmp',['CHECKSUM_GEN_ICMP',['../group__lwip__opts__checksum.html#ga2291ec5bec0a551545da6d5f9f9316b2',1,'opt.h']]],
+  ['checksum_5fgen_5ficmp6',['CHECKSUM_GEN_ICMP6',['../group__lwip__opts__checksum.html#ga7cd47a55af03b1048c5a4a5fe0e76013',1,'opt.h']]],
+  ['checksum_5fgen_5fip',['CHECKSUM_GEN_IP',['../group__lwip__opts__checksum.html#ga8ddad81fc26268a13b35091781da2265',1,'opt.h']]],
+  ['checksum_5fgen_5ftcp',['CHECKSUM_GEN_TCP',['../group__lwip__opts__checksum.html#ga800069963cc4552b99235237c22f00bb',1,'opt.h']]],
+  ['checksum_5fgen_5fudp',['CHECKSUM_GEN_UDP',['../group__lwip__opts__checksum.html#ga98d460f8c2baed8bf62d5473831c0b2c',1,'opt.h']]],
+  ['chksum_5flen_5frx',['chksum_len_rx',['../structudp__pcb.html#a5e2833df51760c83c6032608eb5d0d4d',1,'udp_pcb']]],
+  ['client_5fid',['client_id',['../structmqtt__connect__client__info__t.html#ad35f7850df21f001d5c5ffaa1a18c05a',1,'mqtt_connect_client_info_t']]],
+  ['client_5fpass',['client_pass',['../structmqtt__connect__client__info__t.html#a8f68efe91c5311418151256c96102d4b',1,'mqtt_connect_client_info_t']]],
+  ['client_5fuser',['client_user',['../structmqtt__connect__client__info__t.html#aec961673d5c3e8dc853c91f30d9333b5',1,'mqtt_connect_client_info_t']]],
+  ['close',['close',['../structtftp__context.html#ae9181c57d1cf89bc263f7671e5630a65',1,'tftp_context::close()'],['../group__socket.html#ga4ef17e85ec4d3acdcee5ce23f8ed93c4',1,'close():&#160;sockets.h']]],
+  ['closesocket',['closesocket',['../group__socket.html#ga5a3eb971b466278ada4f7f87399a537c',1,'sockets.h']]],
+  ['compiler_2fplatform_20abstraction',['Compiler/platform abstraction',['../group__compiler__abstraction.html',1,'']]],
+  ['conn',['conn',['../structapi__msg.html#abec5e33802d69f1b601543d60699f028',1,'api_msg::conn()'],['../structlwip__sock.html#a3a3fee485b3361ed7054cde149355fb4',1,'lwip_sock::conn()']]],
+  ['conn_5fstate',['conn_state',['../structmqtt__client__s.html#af4a07c1079e2e2a336f1939d8b9677e6',1,'mqtt_client_s']]],
+  ['connect',['connect',['../group__socket.html#gae3d13671f622e17c17317c9a16dfd0ee',1,'sockets.h']]],
+  ['connect_5farg',['connect_arg',['../structmqtt__client__s.html#ae6d53359ec6d70533dab7c0d2717ce1a',1,'mqtt_client_s']]],
+  ['current_5finput_5fnetif',['current_input_netif',['../structip__globals.html#a7da899c663b1d560b61d92ba6d544701',1,'ip_globals']]],
+  ['current_5fip4_5fheader',['current_ip4_header',['../structip__globals.html#a2e810f97cf3e8e855e3baafc3be8c0d4',1,'ip_globals']]],
+  ['current_5fip6_5fheader',['current_ip6_header',['../structip__globals.html#aa5cfc3ac29dc746a4cbe844206b0ed41',1,'ip_globals']]],
+  ['current_5fip_5fheader_5ftot_5flen',['current_ip_header_tot_len',['../structip__globals.html#a17004526e6f1a164c0bab01aeac5e34a',1,'ip_globals']]],
+  ['current_5fiphdr_5fdest',['current_iphdr_dest',['../structip__globals.html#a0b4e54250c692c638408de54593d2aa1',1,'ip_globals']]],
+  ['current_5fiphdr_5fsrc',['current_iphdr_src',['../structip__globals.html#a04d85a3dc2c417050b3e088fa58a74b0',1,'ip_globals']]],
+  ['current_5fmsg',['current_msg',['../structnetconn.html#a49ba09038b2f2563fd3a38e38f8b8ab9',1,'netconn']]],
+  ['current_5fnetif',['current_netif',['../structip__globals.html#a7803dc5950d143e4433a0df689989bab',1,'ip_globals']]],
+  ['custom_5ffree_5ffunction',['custom_free_function',['../structpbuf__custom.html#af614d17874746cbbf778dc4ca9eac2e9',1,'pbuf_custom']]],
+  ['cyclic_5ftick',['cyclic_tick',['../structmqtt__client__s.html#a6274ba2eb2fe6afa970b1c8a650d8cef',1,'mqtt_client_s']]],
+  ['callback_2dstyle_20apis',['Callback-style APIs',['../group__lwip__opts__callback.html',1,'']]],
+  ['checksum',['Checksum',['../group__lwip__opts__checksum.html',1,'']]],
+  ['core_20locking_20and_20mpu',['Core locking and MPU',['../group__lwip__opts__lock.html',1,'']]],
+  ['common_20functions',['Common functions',['../group__netconn__common.html',1,'']]],
+  ['client_20data_20handling',['Client data handling',['../group__netif__cd.html',1,'']]],
+  ['common_20pitfalls',['Common pitfalls',['../pitfalls.html',1,'']]],
+  ['core',['Core',['../group__snmp__core.html',1,'']]],
+  ['critical_20sections',['Critical sections',['../group__sys__prot.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/all_5.html b/doc/doxygen/output/html/search/all_5.html
new file mode 100644
index 0000000..89a879e
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_5.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_5.js b/doc/doxygen/output/html/search/all_5.js
new file mode 100644
index 0000000..13bb70e
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_5.js
@@ -0,0 +1,106 @@
+var searchData=
+[
+  ['data_5fcb',['data_cb',['../structmqtt__client__s.html#a26dc9112351c042594a41703197925a7',1,'mqtt_client_s']]],
+  ['debug_2eh',['debug.h',['../debug_8h.html',1,'']]],
+  ['def_2ec',['def.c',['../def_8c.html',1,'']]],
+  ['def_2eh',['def.h',['../def_8h.html',1,'']]],
+  ['default_5facceptmbox_5fsize',['DEFAULT_ACCEPTMBOX_SIZE',['../group__lwip__opts__thread.html#ga5d5a6e04abe2ec233c7acdb09f992461',1,'opt.h']]],
+  ['default_5fraw_5frecvmbox_5fsize',['DEFAULT_RAW_RECVMBOX_SIZE',['../group__lwip__opts__thread.html#ga4ef8f046c957750056131310a1580df7',1,'opt.h']]],
+  ['default_5ftcp_5frecvmbox_5fsize',['DEFAULT_TCP_RECVMBOX_SIZE',['../group__lwip__opts__thread.html#ga1bd172938b9c8ba63156fcafc87e83c7',1,'opt.h']]],
+  ['default_5fthread_5fname',['DEFAULT_THREAD_NAME',['../group__lwip__opts__thread.html#gaca13123a5c8271558353e04123957616',1,'opt.h']]],
+  ['default_5fthread_5fprio',['DEFAULT_THREAD_PRIO',['../group__lwip__opts__thread.html#ga3d8715b1fdd0449d6c214e4a40108456',1,'opt.h']]],
+  ['default_5fthread_5fstacksize',['DEFAULT_THREAD_STACKSIZE',['../group__lwip__opts__thread.html#ga7f93dfeaed4021061959f822def602cb',1,'opt.h']]],
+  ['default_5fudp_5frecvmbox_5fsize',['DEFAULT_UDP_RECVMBOX_SIZE',['../group__lwip__opts__thread.html#ga09fe785559b3f0cf108da4440489e335',1,'opt.h']]],
+  ['deprecated_20list',['Deprecated List',['../deprecated.html',1,'']]],
+  ['dest_5faddr',['dest_addr',['../structmdns__outpacket.html#a1fdc90b48d8cf1fc24895f0c7a5798e4',1,'mdns_outpacket']]],
+  ['destination_5faddress',['destination_address',['../structieee__802154__hdr.html#a87ce59d2804cacc5a58411c8b6c47f33',1,'ieee_802154_hdr']]],
+  ['destination_5fpan_5fid',['destination_pan_id',['../structieee__802154__hdr.html#ac1ad9159d3bb70b1a7223060c6c81efd',1,'ieee_802154_hdr']]],
+  ['destroy',['destroy',['../structtcp__ext__arg__callbacks.html#ace586d5d376b42465927a4fd8688c24b',1,'tcp_ext_arg_callbacks']]],
+  ['dhcp_2ec',['dhcp.c',['../dhcp_8c.html',1,'']]],
+  ['dhcp_2eh',['dhcp.h',['../dhcp_8h.html',1,'(Global Namespace)'],['../prot_2dhcp_8h.html',1,'(Global Namespace)']]],
+  ['dhcpv4',['DHCPv4',['../group__dhcp4.html',1,'']]],
+  ['dhcpv6',['DHCPv6',['../group__dhcp6.html',1,'']]],
+  ['dhcp6_2ec',['dhcp6.c',['../dhcp6_8c.html',1,'']]],
+  ['dhcp6_2eh',['dhcp6.h',['../dhcp6_8h.html',1,'(Global Namespace)'],['../prot_2dhcp6_8h.html',1,'(Global Namespace)']]],
+  ['dhcp6_5fcleanup',['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',['DHCP6_DEBUG',['../group__lwip__opts__debugmsg.html#gacfc11be8b3bf6bb55e3e5c39ea8802d1',1,'opt.h']]],
+  ['dhcp6_5fdisable',['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',['DHCP6_DUID_LLT',['../prot_2dhcp6_8h.html#afe33f98cb94e0f18892a41502cf54e36',1,'dhcp6.h']]],
+  ['dhcp6_5fenable_5fstateful',['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',['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',['dhcp6_msg',['../structdhcp6__msg.html',1,'']]],
+  ['dhcp6_5fnd6_5fra_5ftrigger',['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',['dhcp6_option_idx',['../dhcp6_8c.html#ac4c519a2e10067f277d6b09e60919e9a',1,'dhcp6.c']]],
+  ['dhcp6_5fremove_5fstruct',['dhcp6_remove_struct',['../dhcp6_8h.html#a76941ddba22fe00dfc47d2f339f7aca3',1,'dhcp6.h']]],
+  ['dhcp6_5frx_5foptions',['dhcp6_rx_options',['../dhcp6_8c.html#abcce06f078da4b03265d20c0bc1bdce0',1,'dhcp6.c']]],
+  ['dhcp6_5fset_5fstruct',['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',['DHCP6_STATUS_SUCCESS',['../prot_2dhcp6_8h.html#a878a7734e159826e82e958fe3a5ca175',1,'dhcp6.h']]],
+  ['dhcp6_5ftimer_5fmsecs',['DHCP6_TIMER_MSECS',['../dhcp6_8h.html#afdd69327dc7d9f5cc4f029d706f60c8f',1,'dhcp6.h']]],
+  ['dhcp6_5ftmr',['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',['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',['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',['DHCP_COARSE_TIMER_MSECS',['../dhcp_8h.html#ad84b8f4deec421bbf6fd85e8fae047d6',1,'dhcp.h']]],
+  ['dhcp_5fcoarse_5ftimer_5fsecs',['DHCP_COARSE_TIMER_SECS',['../dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e',1,'dhcp.h']]],
+  ['dhcp_5fcoarse_5ftmr',['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',['DHCP_CREATE_RAND_XID',['../dhcp_8c.html#ad6de9c5120654454a330bf5de53c4835',1,'dhcp.c']]],
+  ['dhcp_5fdebug',['DHCP_DEBUG',['../group__lwip__opts__debugmsg.html#ga97927ceecabcdb5f41735bf372a05cee',1,'opt.h']]],
+  ['dhcp_5fdoes_5farp_5fcheck',['DHCP_DOES_ARP_CHECK',['../group__lwip__opts__dhcp.html#gab2d91de7b2fce879b0a213682e1b0b69',1,'opt.h']]],
+  ['dhcp_5ffine_5ftimer_5fmsecs',['DHCP_FINE_TIMER_MSECS',['../dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f',1,'dhcp.h']]],
+  ['dhcp_5ffine_5ftmr',['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',['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',['DHCP_MAX_MSG_LEN',['../dhcp_8c.html#a63e9ec4517b80d8576f218d905e31a9b',1,'dhcp.c']]],
+  ['dhcp_5fmin_5freply_5flen',['DHCP_MIN_REPLY_LEN',['../dhcp_8c.html#aa52c2b64ef42fbad84a3bcd58052caab',1,'dhcp.c']]],
+  ['dhcp_5fmsg',['dhcp_msg',['../structdhcp__msg.html',1,'']]],
+  ['dhcp_5fnetwork_5fchanged',['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',['dhcp_option_idx',['../dhcp_8c.html#a8c3b584d223b995b48613ad96cb776a0',1,'dhcp.c']]],
+  ['dhcp_5foptions_5flen',['DHCP_OPTIONS_LEN',['../prot_2dhcp_8h.html#ae99d4be0d03f6f9c8f02f63abde91a06',1,'dhcp.h']]],
+  ['dhcp_5frelease',['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',['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',['dhcp_remove_struct',['../dhcp_8h.html#aa92284faa099dac4331c1fc0b997dabc',1,'dhcp.h']]],
+  ['dhcp_5frenew',['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',['dhcp_rx_options_given',['../dhcp_8c.html#a058b71e1d26b3758b29d16d9f892c8cc',1,'dhcp.c']]],
+  ['dhcp_5frx_5foptions_5fval',['dhcp_rx_options_val',['../dhcp_8c.html#a5abd232496063bddcbc6692c0e8f9c1f',1,'dhcp.c']]],
+  ['dhcp_5fset_5fstruct',['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',['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',['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',['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',['DNS',['../group__dns.html',1,'']]],
+  ['dns_2ec',['dns.c',['../dns_8c.html',1,'']]],
+  ['dns_2eh',['dns.h',['../dns_8h.html',1,'(Global Namespace)'],['../prot_2dns_8h.html',1,'(Global Namespace)']]],
+  ['dns_5faddrtype',['dns_addrtype',['../structdns__api__msg.html#afb2536a6c342bed4c4ad9d75982f7493',1,'dns_api_msg']]],
+  ['dns_5fanswer',['dns_answer',['../structdns__answer.html',1,'']]],
+  ['dns_5fapi_5fmsg',['dns_api_msg',['../structdns__api__msg.html',1,'']]],
+  ['dns_5fdebug',['DNS_DEBUG',['../group__lwip__opts__debugmsg.html#gaba55da2352c99d813767913e5e36be1f',1,'opt.h']]],
+  ['dns_5fdoes_5fname_5fcheck',['DNS_DOES_NAME_CHECK',['../group__lwip__opts__dns.html#ga07ffd8e9106dae3b65347bd03811a4b6',1,'opt.h']]],
+  ['dns_5ffound_5fcallback',['dns_found_callback',['../dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae',1,'dns.h']]],
+  ['dns_5fgethostbyname',['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',['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',['dns_getserver',['../group__dns.html#gad02111a6b26b93f1c3580d5f41a59af3',1,'dns_getserver(u8_t numdns):&#160;dns.c'],['../group__dns.html#gad02111a6b26b93f1c3580d5f41a59af3',1,'dns_getserver(u8_t numdns):&#160;dns.c']]],
+  ['dns_5fhdr',['dns_hdr',['../structdns__hdr.html',1,'']]],
+  ['dns_5finit',['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_5flocal_5fhostlist',['DNS_LOCAL_HOSTLIST',['../group__lwip__opts__dns.html#gacba1ac491c1b47b98dfbd0d5c1662659',1,'opt.h']]],
+  ['dns_5flocal_5fhostlist_5fis_5fdynamic',['DNS_LOCAL_HOSTLIST_IS_DYNAMIC',['../group__lwip__opts__dns.html#ga8235a5fb0a1c1cceeee670cf95612ba8',1,'opt.h']]],
+  ['dns_5fmax_5fname_5flength',['DNS_MAX_NAME_LENGTH',['../group__lwip__opts__dns.html#ga3b01c79902063c170ef57deb72f56124',1,'opt.h']]],
+  ['dns_5fmax_5fretries',['DNS_MAX_RETRIES',['../group__lwip__opts__dns.html#gaab73c241189335435f3f662aa6a00dba',1,'opt.h']]],
+  ['dns_5fmax_5fservers',['DNS_MAX_SERVERS',['../group__lwip__opts__dns.html#ga9f9881c887a8aceb9765820c2dbdf292',1,'opt.h']]],
+  ['dns_5fmax_5fttl',['DNS_MAX_TTL',['../dns_8c.html#a7f5553dc4a0d2bf99ba1282a86df31e2',1,'dns.c']]],
+  ['dns_5fmquery_5fport',['DNS_MQUERY_PORT',['../prot_2dns_8h.html#a62d67af5ac6c6b3f98a6566a42564276',1,'dns.h']]],
+  ['dns_5fport_5fallowed',['DNS_PORT_ALLOWED',['../dns_8c.html#a97f3b0c56aeee091fdf2f07faf864ce0',1,'dns.c']]],
+  ['dns_5fquery',['dns_query',['../structdns__query.html',1,'']]],
+  ['dns_5frand_5ftxid',['DNS_RAND_TXID',['../dns_8c.html#a9209c204996270af5cfdfd6e391267a1',1,'dns.c']]],
+  ['dns_5freq_5fentry',['dns_req_entry',['../structdns__req__entry.html',1,'']]],
+  ['dns_5fserver_5fport',['DNS_SERVER_PORT',['../prot_2dns_8h.html#a9266b48706648ecf0625a3e651095317',1,'dns.h']]],
+  ['dns_5fsetserver',['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_5ftable_5fentry',['dns_table_entry',['../structdns__table__entry.html',1,'']]],
+  ['dns_5ftable_5fsize',['DNS_TABLE_SIZE',['../group__lwip__opts__dns.html#ga2384e76c1acdf969d883f3de08d340f7',1,'opt.h']]],
+  ['dns_5ftmr',['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',['DNS_TMR_INTERVAL',['../dns_8h.html#a464a7435c4c00735af59033d2acd83bb',1,'dns.h']]],
+  ['dns_5fttl',['dns_ttl',['../structmdns__service.html#a5a939a4da01cb50c74cd53b352e4fa14',1,'mdns_service::dns_ttl()'],['../structmdns__host.html#a4547e5a8375fc1f1372546268a80d51b',1,'mdns_host::dns_ttl()']]],
+  ['domain_5foffsets',['domain_offsets',['../structmdns__outpacket.html#aee97e98c4869aa63ffe348d38d87221f',1,'mdns_outpacket']]],
+  ['debugging',['Debugging',['../group__lwip__opts__debug.html',1,'']]],
+  ['debug_20messages',['Debug messages',['../group__lwip__opts__debugmsg.html',1,'']]],
+  ['dhcp',['DHCP',['../group__lwip__opts__dhcp.html',1,'']]],
+  ['dhcpv6',['DHCPv6',['../group__lwip__opts__dhcpv6.html',1,'']]],
+  ['dns',['DNS',['../group__lwip__opts__dns.html',1,'']]],
+  ['dhcpv4',['DHCPv4',['../group__netifapi__dhcp4.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/all_6.html b/doc/doxygen/output/html/search/all_6.html
new file mode 100644
index 0000000..6afac06
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_6.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_6.js b/doc/doxygen/output/html/search/all_6.js
new file mode 100644
index 0000000..57dd6dc
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_6.js
@@ -0,0 +1,83 @@
+var searchData=
+[
+  ['eai_5fnoname',['EAI_NONAME',['../lwip_2netdb_8h.html#a0bb00f48d6ba1e8c55b7d85c8e3a19a7',1,'netdb.h']]],
+  ['ehttpc_5fresult',['ehttpc_result',['../group__httpc.html#ga49e34884b272b1e0ddae8da46c31d9a3',1,'http_client.h']]],
+  ['err',['err',['../structapi__msg.html#a8c66bd95217fa627f13f2f0847bbb25f',1,'api_msg::err()'],['../structdns__api__msg.html#a6536d91adb146555461359bd451b30de',1,'dns_api_msg::err()']]],
+  ['err_2ec',['err.c',['../err_8c.html',1,'']]],
+  ['err_2eh',['err.h',['../err_8h.html',1,'']]],
+  ['err_5fabrt',['ERR_ABRT',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaf316b2c5eee4079820f7100849115142',1,'err.h']]],
+  ['err_5falready',['ERR_ALREADY',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcae6f9c1e4c18ca844f7934307d4cc30e5',1,'err.h']]],
+  ['err_5farg',['ERR_ARG',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab508ce0ebdf3ca735208b00a80a45c91',1,'err.h']]],
+  ['err_5fbuf',['ERR_BUF',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca05c91366f1b5203a5db9a241b415cd63',1,'err.h']]],
+  ['err_5fclsd',['ERR_CLSD',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa5176d9fecf8ec43d3bc49f4e6c3f7f5',1,'err.h']]],
+  ['err_5fconn',['ERR_CONN',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab0036c51817b5200bfe8157cc4115b27',1,'err.h']]],
+  ['err_5fenum_5ft',['err_enum_t',['../group__infrastructure__errors.html#gae2e66c7d13afc90ffecd6151680fbadc',1,'err.h']]],
+  ['err_5fif',['ERR_IF',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca7d61d90449ae6788575e8e46d5d3bbc6',1,'err.h']]],
+  ['err_5finprogress',['ERR_INPROGRESS',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca13e1dd0edca8a27b6abdf1524bde7929',1,'err.h']]],
+  ['err_5fisconn',['ERR_ISCONN',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca8543e1d6422fed7b318d97e08dcbaa33',1,'err.h']]],
+  ['err_5fmem',['ERR_MEM',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaaaeafdbf3aecc46864daa3cd829c7e05',1,'err.h']]],
+  ['err_5fok',['ERR_OK',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb',1,'err.h']]],
+  ['err_5frst',['ERR_RST',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca759030525f1768a23dc086a5fd45b4e5',1,'err.h']]],
+  ['err_5frte',['ERR_RTE',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca9448893187313c0c5a502ca9a9ad1c2a',1,'err.h']]],
+  ['err_5ft',['err_t',['../group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb',1,'err.h']]],
+  ['err_5ftimeout',['ERR_TIMEOUT',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcac568baeb6407ef5e2630084ccbc34be8',1,'err.h']]],
+  ['err_5fuse',['ERR_USE',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca4ebdc2aa1dbd75f927845733a3fb1f8b',1,'err.h']]],
+  ['err_5fval',['ERR_VAL',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa9a1c5a6fdeed0aad7fe41d538482bbd',1,'err.h']]],
+  ['err_5fwouldblock',['ERR_WOULDBLOCK',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab9dcf89d46668b072192278fb907b7ad',1,'err.h']]],
+  ['errevent',['errevent',['../structlwip__sock.html#a9245a7ab9471bfb6fac94c66d26fba5e',1,'lwip_sock']]],
+  ['errno_2eh',['errno.h',['../compat_2stdc_2errno_8h.html',1,'(Global Namespace)'],['../lwip_2errno_8h.html',1,'(Global Namespace)']]],
+  ['eth_5faddr',['eth_addr',['../structeth__addr.html',1,'eth_addr'],['../lwip_2prot_2ethernet_8h.html#a19c72ce98569e0fb55948a7587d704ee',1,'ETH_ADDR():&#160;ethernet.h']]],
+  ['eth_5fhdr',['eth_hdr',['../structeth__hdr.html',1,'']]],
+  ['eth_5fpad_5fsize',['ETH_PAD_SIZE',['../group__lwip__opts__arp.html#gad7fa3b356ca7e603e848b069c4cc6276',1,'opt.h']]],
+  ['eth_5fvlan_5fhdr',['eth_vlan_hdr',['../structeth__vlan__hdr.html',1,'']]],
+  ['ethaddr',['ethaddr',['../structbridgeif__initdata__s.html#a8e0048db5e021f5d79411492dc9330bc',1,'bridgeif_initdata_s']]],
+  ['etharp',['etharp',['../structstats__.html#aa52547cb08dc828927494dc485bb69f3',1,'stats_']]],
+  ['etharp_2ec',['etharp.c',['../etharp_8c.html',1,'']]],
+  ['etharp_2eh',['etharp.h',['../lwip_2etharp_8h.html',1,'(Global Namespace)'],['../lwip_2prot_2etharp_8h.html',1,'(Global Namespace)']]],
+  ['etharp_5fcleanup_5fnetif',['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',['ETHARP_DEBUG',['../group__lwip__opts__debugmsg.html#gabff5d1e0b334f5b45bd2b8bbb675411e',1,'opt.h']]],
+  ['etharp_5ffind_5faddr',['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',['ETHARP_FLAG_TRY_HARD',['../etharp_8c.html#a96f8787ca623e704da1d32ca7dd6d6d9',1,'etharp.c']]],
+  ['etharp_5fget_5fentry',['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',['etharp_gratuitous',['../lwip_2etharp_8h.html#a83947dea159baf3420922084072e631e',1,'etharp.h']]],
+  ['etharp_5fhdr',['etharp_hdr',['../structetharp__hdr.html',1,'']]],
+  ['etharp_5finput',['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',['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',['etharp_q_entry',['../structetharp__q__entry.html',1,'']]],
+  ['etharp_5fquery',['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',['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',['etharp_state',['../etharp_8c.html#ae95dee9363e6d3417298e07380b2d383',1,'etharp.c']]],
+  ['etharp_5fstats',['ETHARP_STATS',['../group__lwip__opts__stats.html#ga3a8359abf4fff8ffdc449e5007f93275',1,'opt.h']]],
+  ['etharp_5fsupport_5fstatic_5fentries',['ETHARP_SUPPORT_STATIC_ENTRIES',['../group__lwip__opts__arp.html#ga4675829464156f3d665f4de171c212d7',1,'opt.h']]],
+  ['etharp_5fsupport_5fvlan',['ETHARP_SUPPORT_VLAN',['../group__lwip__opts__arp.html#ga70ce0ecf56cf5fab000134e66d863f90',1,'opt.h']]],
+  ['etharp_5ftable_5fmatch_5fnetif',['ETHARP_TABLE_MATCH_NETIF',['../group__lwip__opts__arp.html#ga2f762eee309a545650f80fc8dcc19084',1,'opt.h']]],
+  ['etharp_5ftmr',['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',['Ethernet',['../group__ethernet.html',1,'']]],
+  ['ethernet_2ec',['ethernet.c',['../ethernet_8c.html',1,'']]],
+  ['ethernet_2eh',['ethernet.h',['../lwip_2prot_2ethernet_8h.html',1,'(Global Namespace)'],['../netif_2ethernet_8h.html',1,'(Global Namespace)']]],
+  ['ethernet_5finput',['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',['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',['ethip6.c',['../ethip6_8c.html',1,'']]],
+  ['ethip6_2eh',['ethip6.h',['../ethip6_8h.html',1,'']]],
+  ['ethip6_5foutput',['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',['ETHTYPE_ARP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a41217db03576ea59c44b28b248c39be5',1,'ieee.h']]],
+  ['ethtype_5fethercat',['ETHTYPE_ETHERCAT',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a5085a5fd5f9c9506124e93ea43ad2d7c',1,'ieee.h']]],
+  ['ethtype_5fip',['ETHTYPE_IP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ac95756b20fde70b868ef4185dd221c79',1,'ieee.h']]],
+  ['ethtype_5fipv6',['ETHTYPE_IPV6',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aab26004eed559217be5dd466a79b1383',1,'ieee.h']]],
+  ['ethtype_5fjumbo',['ETHTYPE_JUMBO',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a2511e8a31961bd742363b11b274b9dd1',1,'ieee.h']]],
+  ['ethtype_5flldp',['ETHTYPE_LLDP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a02eab0dd87f222a2d555ca38b1b8afcc',1,'ieee.h']]],
+  ['ethtype_5fmrp',['ETHTYPE_MRP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad36caec44d8db59ff433a8bd3e92ad3e',1,'ieee.h']]],
+  ['ethtype_5fpppoe',['ETHTYPE_PPPOE',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a8c0e8f68b90134eb4f1f17d3d2eb6f8c',1,'ieee.h']]],
+  ['ethtype_5fpppoedisc',['ETHTYPE_PPPOEDISC',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a58c6f40d7cc3edb9455762938f3f6569',1,'ieee.h']]],
+  ['ethtype_5fprofinet',['ETHTYPE_PROFINET',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a889eb8f716238d16ee3408f16a5cf19d',1,'ieee.h']]],
+  ['ethtype_5fptp',['ETHTYPE_PTP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aa3e9e834eef932d073028e28eb8793dc',1,'ieee.h']]],
+  ['ethtype_5fqinq',['ETHTYPE_QINQ',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a39a18006412cbb57536535bd9d378394',1,'ieee.h']]],
+  ['ethtype_5frarp',['ETHTYPE_RARP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a14292184cb41b279249319896d0e2b1f',1,'ieee.h']]],
+  ['ethtype_5fsercos',['ETHTYPE_SERCOS',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ab93419f8edf5692e91629ab92fce8a14',1,'ieee.h']]],
+  ['ethtype_5fvlan',['ETHTYPE_VLAN',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad8f84826d52d92ac24a477d1f03e7903',1,'ieee.h']]],
+  ['ethtype_5fwol',['ETHTYPE_WOL',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a530a30feb9b87fd993da2bf83776cf9b',1,'ieee.h']]],
+  ['eui64_5fto_5fble_5faddr',['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']]],
+  ['exceptset',['exceptset',['../structlwip__select__cb.html#a2a1e68993ed887fca326d1373ea6caed',1,'lwip_select_cb']]],
+  ['error_20codes',['Error codes',['../group__infrastructure__errors.html',1,'']]],
+  ['ext_20arguments',['ext arguments',['../group__tcp__raw__extargs.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/all_7.html b/doc/doxygen/output/html/search/all_7.html
new file mode 100644
index 0000000..de19107
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_7.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_7.js b/doc/doxygen/output/html/search/all_7.js
new file mode 100644
index 0000000..e3c43e6
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_7.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+  ['fdb_20example_20code',['FDB example code',['../group__bridgeif__fdb.html',1,'']]],
+  ['fcntl',['fcntl',['../group__socket.html#gaaa2b0e00cab161fcc4b31ee0d06e7eb3',1,'sockets.h']]],
+  ['flags',['flags',['../structnetconn.html#a96cb9a3830248699bd07a1a447e5630c',1,'netconn::flags()'],['../structnetif.html#a1c171db6097bbb6f09f63549a66e00ea',1,'netif::flags()'],['../structpbuf.html#aa4d1af2cab3d9280d29212095b5b872a',1,'pbuf::flags()']]],
+  ['fold_5fu32t',['FOLD_U32T',['../inet__chksum_8h.html#a6ffe83b4bdd1784a0671ee4778966a01',1,'inet_chksum.h']]],
+  ['frame_5fcontrol',['frame_control',['../structieee__802154__hdr.html#a1d1e2cef0e0c1b1e1fd02a8a5f07fb10',1,'ieee_802154_hdr']]],
+  ['freeaddrinfo',['freeaddrinfo',['../group__netdbapi.html#gab28cd3049bcf6e2bc3a71e968a64a92d',1,'netdb.h']]],
+  ['from',['from',['../structsmtp__session.html#a8dc4651c67618e33c56dc66790bc12ee',1,'smtp_session']]],
+  ['from_5flen',['from_len',['../structsmtp__session.html#a191b09e7142414a671da82fece888e65',1,'smtp_session']]],
+  ['flags',['Flags',['../group__netif__flags.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/all_8.html b/doc/doxygen/output/html/search/all_8.html
new file mode 100644
index 0000000..11e27cd
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_8.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_8.js b/doc/doxygen/output/html/search/all_8.js
new file mode 100644
index 0000000..739a417
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_8.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+  ['get_5fvalue',['get_value',['../structsnmp__node__instance.html#a17aa954aa34672f4a399bf0d91c0a649',1,'snmp_node_instance::get_value()'],['../structsnmp__table__node.html#ac65c57e29faa456a9a710185109fe272',1,'snmp_table_node::get_value()']]],
+  ['getaddrinfo',['getaddrinfo',['../group__netdbapi.html#ga558191530d91c101621b49e43bd5bbf5',1,'netdb.h']]],
+  ['gethostbyname',['gethostbyname',['../group__netdbapi.html#ga39746b4b096060ca3e8c6ee7a7560b1d',1,'netdb.h']]],
+  ['gethostbyname_5fr',['gethostbyname_r',['../group__netdbapi.html#ga76204a4d646dba393f88aa9b0980fc07',1,'netdb.h']]],
+  ['gethostbyname_5fr_5fhelper',['gethostbyname_r_helper',['../structgethostbyname__r__helper.html',1,'']]],
+  ['getpeername',['getpeername',['../group__socket.html#ga33bf1b7f5b11de02d0db32531cd940b8',1,'sockets.h']]],
+  ['getsockname',['getsockname',['../group__socket.html#gab096fb7dbc3f84be1699a87dce980f2f',1,'sockets.h']]],
+  ['getsockopt',['getsockopt',['../group__socket.html#gad2de02b35dbbf2334d1befb137ede821',1,'sockets.h']]],
+  ['group_5faddress',['group_address',['../structigmp__group.html#ae26e6041f865880bf46cd21b6f9af854',1,'igmp_group::group_address()'],['../structmld__group.html#a781abf78d835627ded1202166b44b88e',1,'mld_group::group_address()']]],
+  ['group_5fstate',['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_9.html b/doc/doxygen/output/html/search/all_9.html
new file mode 100644
index 0000000..f8abbbe
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_9.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_9.js b/doc/doxygen/output/html/search/all_9.js
new file mode 100644
index 0000000..526952e
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_9.js
@@ -0,0 +1,59 @@
+var searchData=
+[
+  ['how_20to_20contribute_20to_20lwip',['How to contribute to lwIP',['../contrib.html',1,'']]],
+  ['h_5ferrno',['h_errno',['../netdb_8c.html#a2a1ce3f2040007303d36c0b682b5ac10',1,'h_errno():&#160;netdb.c'],['../lwip_2netdb_8h.html#a2a1ce3f2040007303d36c0b682b5ac10',1,'h_errno():&#160;netdb.c']]],
+  ['hostent_5fstorage',['HOSTENT_STORAGE',['../netdb_8c.html#acfc1e988534c0e497599b904739f92fe',1,'netdb.c']]],
+  ['http_5fclient_2ec',['http_client.c',['../http__client_8c.html',1,'']]],
+  ['http_5fclient_2eh',['http_client.h',['../http__client_8h.html',1,'']]],
+  ['http_5fdefault_5fport',['HTTP_DEFAULT_PORT',['../group__httpc.html#ga1f192f3009865e9f9a3cd83609c866c2',1,'http_client.h']]],
+  ['http_5fis_5fdata_5fvolatile',['HTTP_IS_DATA_VOLATILE',['../httpd_8c.html#aa93d60e8af23b915b5b9652ff71e1300',1,'httpd.c']]],
+  ['http_5fis_5fhdr_5fvolatile',['HTTP_IS_HDR_VOLATILE',['../httpd_8c.html#af281bc4a762d56243e0b85dd4197174a',1,'httpd.c']]],
+  ['http_5fis_5ftag_5fvolatile',['HTTP_IS_TAG_VOLATILE',['../group__httpd__opts.html#ga662e88120b507426374dd8ebbd54a048',1,'httpd_opts.h']]],
+  ['http_5fset_5fcgi_5fhandlers',['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',['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']]],
+  ['http_20client',['HTTP client',['../group__httpc.html',1,'']]],
+  ['httpc_5fclient_5fagent',['HTTPC_CLIENT_AGENT',['../http__client_8c.html#aeda6122d341b879ba8b0fb2df834276a',1,'http_client.c']]],
+  ['httpc_5fdebug',['HTTPC_DEBUG',['../http__client_8c.html#a32d4c0e6e42327e21fb59dabdc152dd1',1,'http_client.c']]],
+  ['httpc_5fdebug_5frequest',['HTTPC_DEBUG_REQUEST',['../http__client_8c.html#ad2ec42c8e7adaef67266a5bd12c4ad2a',1,'http_client.c']]],
+  ['httpc_5fget_5ffile',['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',['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',['httpc_headers_done_fn',['../group__httpc.html#ga1e5b62519d6592c89ed3edfabd917472',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5fclosed',['HTTPC_RESULT_ERR_CLOSED',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a89a6700abb14dd7cab9b4e0fd66e5fd6',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5fconnect',['HTTPC_RESULT_ERR_CONNECT',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ab866d5433b4c4593c80b756d434e1d09',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5fcontent_5flen',['HTTPC_RESULT_ERR_CONTENT_LEN',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a6c8a4195834e1997a498a03bb47bb096',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5fhostname',['HTTPC_RESULT_ERR_HOSTNAME',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ae04714f90692c122e6c85e06083dbc6d',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5fmem',['HTTPC_RESULT_ERR_MEM',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a49972833ec01c7a10dee734c7c69ed62',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5fsvr_5fresp',['HTTPC_RESULT_ERR_SVR_RESP',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3aaa023a6f8069c02c87a826ba323c54b8',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5ftimeout',['HTTPC_RESULT_ERR_TIMEOUT',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a8e6c597f88335b31e6a8b078a32fde33',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5funknown',['HTTPC_RESULT_ERR_UNKNOWN',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a5026187026abd1d242333ba6ff69ddbd',1,'http_client.h']]],
+  ['httpc_5fresult_5ffn',['httpc_result_fn',['../group__httpc.html#ga0452eb8007dbb5f139ec992e58e560dd',1,'http_client.h']]],
+  ['httpc_5fresult_5flocal_5fabort',['HTTPC_RESULT_LOCAL_ABORT',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3adf4e45365923c16b6a6879bde5f60867',1,'http_client.h']]],
+  ['httpc_5fresult_5fok',['HTTPC_RESULT_OK',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3af3173d4d272c9c0b5a5c9b5b027e3659',1,'http_client.h']]],
+  ['httpc_5fresult_5ft',['httpc_result_t',['../group__httpc.html#gac6713454283bff8e1187849e8d4bda18',1,'http_client.h']]],
+  ['http_20server',['HTTP server',['../group__httpd.html',1,'']]],
+  ['httpd_2ec',['httpd.c',['../httpd_8c.html',1,'']]],
+  ['httpd_2eh',['httpd.h',['../httpd_8h.html',1,'']]],
+  ['httpd_5fdebug_5ftiming',['HTTPD_DEBUG_TIMING',['../group__httpd__opts.html#ga5f2642874f930798d975b1f7a6d2e1da',1,'httpd_opts.h']]],
+  ['httpd_5fenable_5fhttps',['HTTPD_ENABLE_HTTPS',['../group__httpd__opts.html#ga64dc2a10b1c2ec886e698fe9008e51e2',1,'httpd_opts.h']]],
+  ['httpd_5ffsdata_5ffile',['HTTPD_FSDATA_FILE',['../group__httpd__opts.html#gad68e8e06ea4c2be1b3508e813a49f7cc',1,'httpd_opts.h']]],
+  ['httpd_5finit',['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',['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',['HTTPD_MAX_RETRIES',['../group__httpd__opts.html#gad92e78e19fd3ab2af42750e83ed73fd5',1,'httpd_opts.h']]],
+  ['httpd_5fopts_2eh',['httpd_opts.h',['../httpd__opts_8h.html',1,'']]],
+  ['httpd_5fpoll_5finterval',['HTTPD_POLL_INTERVAL',['../group__httpd__opts.html#gacc3e7667baa2cfafd23de2b152df7a63',1,'httpd_opts.h']]],
+  ['httpd_5fpost_5fbegin',['httpd_post_begin',['../group__httpd.html#ga6cb33693ee8f0c054be82a968ceff582',1,'httpd.h']]],
+  ['httpd_5fpost_5fdata_5frecved',['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',['httpd_post_finished',['../group__httpd.html#ga477473f7ead250fec71f1f8b9926fec5',1,'httpd.h']]],
+  ['httpd_5fpost_5freceive_5fdata',['httpd_post_receive_data',['../group__httpd.html#ga461409c8813c2a82ba63fde987c0e537',1,'httpd.h']]],
+  ['httpd_5fprecalculated_5fchecksum',['HTTPD_PRECALCULATED_CHECKSUM',['../group__httpd__opts.html#ga6e5de8515c89af12277e4cb011165103',1,'httpd_opts.h']]],
+  ['httpd_5fserver_5fagent',['HTTPD_SERVER_AGENT',['../group__httpd__opts.html#gafb2115e763ed3163a3e204a0ba53edb9',1,'httpd_opts.h']]],
+  ['httpd_5fserver_5fport',['HTTPD_SERVER_PORT',['../group__httpd__opts.html#ga2b058c5d1bd67e5d7cb260166e3ace50',1,'httpd_opts.h']]],
+  ['httpd_5fserver_5fport_5fhttps',['HTTPD_SERVER_PORT_HTTPS',['../group__httpd__opts.html#gaffe653b08bf5ba25b276c655f6813441',1,'httpd_opts.h']]],
+  ['httpd_5fssi_5ftag_5funknown',['HTTPD_SSI_TAG_UNKNOWN',['../httpd_8h.html#aeb00bcd99ec9627b108832f0b58891ca',1,'httpd.h']]],
+  ['httpd_5ftcp_5fprio',['HTTPD_TCP_PRIO',['../group__httpd__opts.html#gaabd1f6319d04b8d5f2c93270794d5182',1,'httpd_opts.h']]],
+  ['httpd_5fuse_5fmem_5fpool',['HTTPD_USE_MEM_POOL',['../group__httpd__opts.html#gabb13219495a813fceaafa954a238a924',1,'httpd_opts.h']]],
+  ['hwaddr',['hwaddr',['../structnetif.html#aee967965d999fc1a4c40a66709304e69',1,'netif']]],
+  ['hwaddr_5flen',['hwaddr_len',['../structnetif.html#afe1181561cb16241f3cb5ed01e567d42',1,'netif']]],
+  ['hooks',['Hooks',['../group__lwip__opts__hooks.html',1,'']]],
+  ['heap_20and_20memory_20pools',['Heap and memory pools',['../group__lwip__opts__mem.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/all_a.html b/doc/doxygen/output/html/search/all_a.html
new file mode 100644
index 0000000..9601fce
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_a.js b/doc/doxygen/output/html/search/all_a.js
new file mode 100644
index 0000000..2ab029d
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_a.js
@@ -0,0 +1,394 @@
+var searchData=
+[
+  ['ieee_20802_2e1d_20bridge',['IEEE 802.1D bridge',['../group__bridgeif.html',1,'']]],
+  ['iana_20assigned_20numbers',['IANA assigned numbers',['../group__iana.html',1,'']]],
+  ['iana_2eh',['iana.h',['../iana_8h.html',1,'']]],
+  ['icmp',['icmp',['../structstats__.html#a10bc430163b0e6db91338aded5b7019a',1,'stats_']]],
+  ['icmp_2ec',['icmp.c',['../icmp_8c.html',1,'']]],
+  ['icmp_2eh',['icmp.h',['../icmp_8h.html',1,'(Global Namespace)'],['../prot_2icmp_8h.html',1,'(Global Namespace)']]],
+  ['icmp6',['icmp6',['../structstats__.html#a25a6b5940e32d53a066aa1bbc2028c03',1,'stats_']]],
+  ['icmp6_2ec',['icmp6.c',['../icmp6_8c.html',1,'']]],
+  ['icmp6_2eh',['icmp6.h',['../icmp6_8h.html',1,'(Global Namespace)'],['../prot_2icmp6_8h.html',1,'(Global Namespace)']]],
+  ['icmp6_5fdest_5funreach',['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_5fdur_5faddress',['ICMP6_DUR_ADDRESS',['../prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa789ef8158d8750b0fa5a14ec9ecaa23a',1,'icmp6.h']]],
+  ['icmp6_5fdur_5fcode',['icmp6_dur_code',['../prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccf',1,'icmp6.h']]],
+  ['icmp6_5fdur_5fno_5froute',['ICMP6_DUR_NO_ROUTE',['../prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa695bb4d92f32b504a9483ff137235a78',1,'icmp6.h']]],
+  ['icmp6_5fdur_5fpolicy',['ICMP6_DUR_POLICY',['../prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfac3c255282e0b49b5bbb3cd8f435bb763',1,'icmp6.h']]],
+  ['icmp6_5fdur_5fport',['ICMP6_DUR_PORT',['../prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa28cc924ec6eaa761acb76ccef4adcba0',1,'icmp6.h']]],
+  ['icmp6_5fdur_5fprohibited',['ICMP6_DUR_PROHIBITED',['../prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa251961b990d0fbaf2c643f047c4f2532',1,'icmp6.h']]],
+  ['icmp6_5fdur_5freject_5froute',['ICMP6_DUR_REJECT_ROUTE',['../prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa2aeed278149fb071a34beec89df03b5c',1,'icmp6.h']]],
+  ['icmp6_5fdur_5fscope',['ICMP6_DUR_SCOPE',['../prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfabdb01a67c61da588872f5799ef75aa6e',1,'icmp6.h']]],
+  ['icmp6_5fecho_5fhdr',['icmp6_echo_hdr',['../structicmp6__echo__hdr.html',1,'']]],
+  ['icmp6_5fhdr',['icmp6_hdr',['../structicmp6__hdr.html',1,'']]],
+  ['icmp6_5finput',['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',['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',['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_5fpp_5fcode',['icmp6_pp_code',['../prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023',1,'icmp6.h']]],
+  ['icmp6_5fpp_5ffield',['ICMP6_PP_FIELD',['../prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a4aa4a79306a69fd4f60ad445cde4c2a9',1,'icmp6.h']]],
+  ['icmp6_5fpp_5fheader',['ICMP6_PP_HEADER',['../prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023acbcc58901e2345ffc31df4098de60ff8',1,'icmp6.h']]],
+  ['icmp6_5fpp_5foption',['ICMP6_PP_OPTION',['../prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a53884832d00d3c8f8de62cfdb4646932',1,'icmp6.h']]],
+  ['icmp6_5fstats',['ICMP6_STATS',['../group__lwip__opts__stats.html#ga714006cd5c5b0eb333159d0f677616a0',1,'opt.h']]],
+  ['icmp6_5fte_5fcode',['icmp6_te_code',['../prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e',1,'icmp6.h']]],
+  ['icmp6_5fte_5ffrag',['ICMP6_TE_FRAG',['../prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eaec493420d61c80a21981b1aa32befe1f',1,'icmp6.h']]],
+  ['icmp6_5fte_5fhl',['ICMP6_TE_HL',['../prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eacccbb5e776df1b35af4149e593240880',1,'icmp6.h']]],
+  ['icmp6_5ftime_5fexceeded',['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',['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']]],
+  ['icmp6_5ftype',['icmp6_type',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fdur',['ICMP6_TYPE_DUR',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aad9d4f207459e4bbd0c33a25adf6fdd7',1,'icmp6.h']]],
+  ['icmp6_5ftype_5ferep',['ICMP6_TYPE_EREP',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac6b91695c06bfc7fb2360310d7b8e78a',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fereq',['ICMP6_TYPE_EREQ',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae649aa45c97b885f28771688957528a3',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fmld',['ICMP6_TYPE_MLD',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a04228a1d11f9f88bd165f3430188bfe7',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fmlq',['ICMP6_TYPE_MLQ',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ad9794ae12b9ca196cc4fafaf6d834375',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fmlr',['ICMP6_TYPE_MLR',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a906dd689f0aa9b4796f49f299d4e3eb0',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fmra',['ICMP6_TYPE_MRA',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a29281016d3bb58e3bfd90417bbce7aa0',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fmrs',['ICMP6_TYPE_MRS',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a425f4e64a7d1570228adbbe450650ab4',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fmrt',['ICMP6_TYPE_MRT',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afb12a9d774f53deb15ec23041548f6fc',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fna',['ICMP6_TYPE_NA',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1f99d333f425c28d3840e029cc9c46f3',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fns',['ICMP6_TYPE_NS',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0d8d8717c6c34053d1101932c23929fe',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fpe1',['ICMP6_TYPE_PE1',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac7020c08a7b03ae2a198e4a8dcd31bd4',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fpe2',['ICMP6_TYPE_PE2',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aed14d280e5911098af914a94bd3ab22b',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fpe3',['ICMP6_TYPE_PE3',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a9c9c358ebd5eb683a66819fd9ecf98c6',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fpe4',['ICMP6_TYPE_PE4',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858af8ebe97c4f68b54c9ef0c43e98211df5',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fpp',['ICMP6_TYPE_PP',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a63114feac8140031b74424d4a7cf6b26',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fptb',['ICMP6_TYPE_PTB',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1d52ef5024a5822bd622bcb0b9da323d',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fra',['ICMP6_TYPE_RA',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae4ae04be7df3a2cce614af0a5cdae951',1,'icmp6.h']]],
+  ['icmp6_5ftype_5frd',['ICMP6_TYPE_RD',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0f6702d62de5f873e0afe7431d878207',1,'icmp6.h']]],
+  ['icmp6_5ftype_5frs',['ICMP6_TYPE_RS',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a670d95494c9282f646ac442d81d9a780',1,'icmp6.h']]],
+  ['icmp6_5ftype_5frsv_5ferr',['ICMP6_TYPE_RSV_ERR',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858abe61415e020b996220337f0cd002a28f',1,'icmp6.h']]],
+  ['icmp6_5ftype_5frsv_5finf',['ICMP6_TYPE_RSV_INF',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a2c12d3244d837bd243ea647ec530600d',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fte',['ICMP6_TYPE_TE',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afae9848904bc4b4b4aa716a7a9a2d7fe',1,'icmp6.h']]],
+  ['icmp_5fdebug',['ICMP_DEBUG',['../group__lwip__opts__debugmsg.html#ga9595904a1cb9bfe0b9b1d958abdc923a',1,'opt.h']]],
+  ['icmp_5fdest_5funreach',['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_5fdur_5ffrag',['ICMP_DUR_FRAG',['../icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a8be2bc49d42aa1a6ee1da93a8700ef5f',1,'icmp.h']]],
+  ['icmp_5fdur_5fhost',['ICMP_DUR_HOST',['../icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a648ab915a76dfb7b9568e94de00da1e7',1,'icmp.h']]],
+  ['icmp_5fdur_5fnet',['ICMP_DUR_NET',['../icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3cc3714544e123bdef2eadb1a4d320e3',1,'icmp.h']]],
+  ['icmp_5fdur_5fport',['ICMP_DUR_PORT',['../icmp_8h.html#a17637465f209385e5d19ef47fd9266a5ac973dd9b04e094043ccc4cf875ef5644',1,'icmp.h']]],
+  ['icmp_5fdur_5fproto',['ICMP_DUR_PROTO',['../icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3c7bbd13b613990413ef167017dfbcef',1,'icmp.h']]],
+  ['icmp_5fdur_5fsr',['ICMP_DUR_SR',['../icmp_8h.html#a17637465f209385e5d19ef47fd9266a5af63296fc25f79e56946a56a8da132c13',1,'icmp.h']]],
+  ['icmp_5fdur_5ftype',['icmp_dur_type',['../icmp_8h.html#a17637465f209385e5d19ef47fd9266a5',1,'icmp.h']]],
+  ['icmp_5fecho_5fhdr',['icmp_echo_hdr',['../structicmp__echo__hdr.html',1,'']]],
+  ['icmp_5finput',['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',['ICMP_STATS',['../group__lwip__opts__stats.html#ga472ad3f6da741f5b287d66ad3051242b',1,'opt.h']]],
+  ['icmp_5fte_5ffrag',['ICMP_TE_FRAG',['../icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa4d351874c3e2d4a4cf46569df28cd796',1,'icmp.h']]],
+  ['icmp_5fte_5fttl',['ICMP_TE_TTL',['../icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa827a1f8705826a6cc3c22e2571acf02c',1,'icmp.h']]],
+  ['icmp_5fte_5ftype',['icmp_te_type',['../icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324a',1,'icmp.h']]],
+  ['icmp_5ftime_5fexceeded',['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',['ICMP_TTL',['../group__lwip__opts__icmp.html#gae1533f2bc39a5843989909555f6ce0cf',1,'opt.h']]],
+  ['ieee_20assigned_20numbers',['IEEE assigned numbers',['../group__ieee.html',1,'']]],
+  ['ieee_2eh',['ieee.h',['../ieee_8h.html',1,'']]],
+  ['ieee802154_2eh',['ieee802154.h',['../ieee802154_8h.html',1,'']]],
+  ['ieee_5f802154_5fhdr',['ieee_802154_hdr',['../structieee__802154__hdr.html',1,'']]],
+  ['ieee_5f802154_5fpan_5fid',['ieee_802154_pan_id',['../structlowpan6__ieee802154__data.html#a017fc6f447215e4b65955ee7b1ed798f',1,'lowpan6_ieee802154_data']]],
+  ['if_2eh',['if.h',['../if_8h.html',1,'']]],
+  ['interface_20identification_20api',['Interface Identification API',['../group__if__api.html',1,'']]],
+  ['if_5fapi_2ec',['if_api.c',['../if__api_8c.html',1,'']]],
+  ['if_5fapi_2eh',['if_api.h',['../if__api_8h.html',1,'']]],
+  ['if_5fidx',['if_idx',['../structpbuf.html#a6a58e90efbb4751608e9a1fdbd91e697',1,'pbuf']]],
+  ['ifindiscards',['ifindiscards',['../structstats__mib2__netif__ctrs.html#a4a767e6b835d5ad2f9b73751de2b0947',1,'stats_mib2_netif_ctrs']]],
+  ['ifinerrors',['ifinerrors',['../structstats__mib2__netif__ctrs.html#afda1a14dc79bb65a33f97f9fb467ec1d',1,'stats_mib2_netif_ctrs']]],
+  ['ifinnucastpkts',['ifinnucastpkts',['../structstats__mib2__netif__ctrs.html#a111f08290b3c6944108237cefba066dd',1,'stats_mib2_netif_ctrs']]],
+  ['ifinoctets',['ifinoctets',['../structstats__mib2__netif__ctrs.html#a7e9ddf9b4a17748a9d3f041c1d24ba8e',1,'stats_mib2_netif_ctrs']]],
+  ['ifinucastpkts',['ifinucastpkts',['../structstats__mib2__netif__ctrs.html#a9ed42d6329a9616669ba21789fa001d8',1,'stats_mib2_netif_ctrs']]],
+  ['ifinunknownprotos',['ifinunknownprotos',['../structstats__mib2__netif__ctrs.html#ac34eb01b42f22b1e49ca7c9734e737aa',1,'stats_mib2_netif_ctrs']]],
+  ['ifoutdiscards',['ifoutdiscards',['../structstats__mib2__netif__ctrs.html#a3a2aec508fd4466ca8bab10d8dc2c842',1,'stats_mib2_netif_ctrs']]],
+  ['ifouterrors',['ifouterrors',['../structstats__mib2__netif__ctrs.html#a91b60bb78759c9b655a74bb4fae3346e',1,'stats_mib2_netif_ctrs']]],
+  ['ifoutnucastpkts',['ifoutnucastpkts',['../structstats__mib2__netif__ctrs.html#afd3264670c39cc0d721a35cb6650f8d7',1,'stats_mib2_netif_ctrs']]],
+  ['ifoutoctets',['ifoutoctets',['../structstats__mib2__netif__ctrs.html#a24151d13a55452518e5f7832f48bd5a7',1,'stats_mib2_netif_ctrs']]],
+  ['ifoutucastpkts',['ifoutucastpkts',['../structstats__mib2__netif__ctrs.html#a24aba9660a2951027b23d4118b57c471',1,'stats_mib2_netif_ctrs']]],
+  ['igmp',['igmp',['../structstats__.html#a877e369c2abef97f13492faa838e2271',1,'stats_::igmp()'],['../group__igmp.html',1,'(Global Namespace)']]],
+  ['igmp_2ec',['igmp.c',['../igmp_8c.html',1,'']]],
+  ['igmp_2eh',['igmp.h',['../igmp_8h.html',1,'(Global Namespace)'],['../prot_2igmp_8h.html',1,'(Global Namespace)']]],
+  ['igmp_5fdebug',['IGMP_DEBUG',['../group__lwip__opts__debugmsg.html#ga8da07508ee75704362d45eee3eb857fa',1,'opt.h']]],
+  ['igmp_5fgroup',['igmp_group',['../structigmp__group.html',1,'']]],
+  ['igmp_5finit',['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',['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',['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',['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',['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',['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',['igmp_lookfor_group',['../igmp_8c.html#a8228ddd10aa3f2518b16815d82d73448',1,'igmp_lookfor_group(struct netif *ifp, const ip4_addr_t *addr):&#160;igmp.c'],['../igmp_8h.html#a8228ddd10aa3f2518b16815d82d73448',1,'igmp_lookfor_group(struct netif *ifp, const ip4_addr_t *addr):&#160;igmp.c']]],
+  ['igmp_5fmac_5ffilter',['igmp_mac_filter',['../structnetif.html#ae64e56581bf0f136601f24c5395c19f0',1,'netif']]],
+  ['igmp_5fmsg',['igmp_msg',['../structigmp__msg.html',1,'']]],
+  ['igmp_5freport_5fgroups',['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',['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',['IGMP_STATS',['../group__lwip__opts__stats.html#ga4d12af1356b9fd60717984be51e27740',1,'opt.h']]],
+  ['igmp_5fstop',['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',['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',['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',['IN6ADDR_ANY_INIT',['../lwip_2inet_8h.html#a1de876a356ee05a2e9427b741f99f49c',1,'inet.h']]],
+  ['in6addr_5floopback_5finit',['IN6ADDR_LOOPBACK_INIT',['../lwip_2inet_8h.html#a5562c81af19ee5988ddc5a5c6153cf37',1,'inet.h']]],
+  ['inaddr_5fany',['INADDR_ANY',['../lwip_2inet_8h.html#a5d1940045dc2e7de552f3d4ff13a74ab',1,'inet.h']]],
+  ['inaddr_5fbroadcast',['INADDR_BROADCAST',['../lwip_2inet_8h.html#a4a725f61ded23ce8a7dff8e82ed51986',1,'inet.h']]],
+  ['inaddr_5floopback',['INADDR_LOOPBACK',['../lwip_2inet_8h.html#ae1ac25d7797666cff6d01d6c795c2378',1,'inet.h']]],
+  ['inaddr_5fnone',['INADDR_NONE',['../lwip_2inet_8h.html#a3d2472d6cf31b73eeb829110dd0fffea',1,'inet.h']]],
+  ['inet_2eh',['inet.h',['../compat_2posix_2arpa_2inet_8h.html',1,'(Global Namespace)'],['../lwip_2inet_8h.html',1,'(Global Namespace)']]],
+  ['inet6_2ec',['inet6.c',['../inet6_8c.html',1,'']]],
+  ['inet_5fchksum_2ec',['inet_chksum.c',['../inet__chksum_8c.html',1,'']]],
+  ['inet_5fchksum_2eh',['inet_chksum.h',['../inet__chksum_8h.html',1,'']]],
+  ['inet_5fchksum_5fpbuf',['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',['INET_DEBUG',['../group__lwip__opts__debugmsg.html#ga78140cbe70258a65cb5c9e381843e4f3',1,'opt.h']]],
+  ['inet_5fntop',['inet_ntop',['../group__socket.html#gaa40bf11abb409097e68aa3a6982eb52b',1,'sockets.h']]],
+  ['inet_5fpton',['inet_pton',['../group__socket.html#ga90d2b417d82e8da981c940a665324fd5',1,'sockets.h']]],
+  ['infrastructure',['Infrastructure',['../group__infrastructure.html',1,'']]],
+  ['init_2ec',['init.c',['../init_8c.html',1,'']]],
+  ['init_2eh',['init.h',['../init_8h.html',1,'']]],
+  ['inpub_5fpkt_5fid',['inpub_pkt_id',['../structmqtt__client__s.html#a6c81d0dd14e786222425ea04fd060824',1,'mqtt_client_s']]],
+  ['input',['input',['../structnetif.html#a8fe4f1b7b0d710216287da9615164a5c',1,'netif']]],
+  ['instance_5foid',['instance_oid',['../structsnmp__node__instance.html#aedb358729c310c8e5b391dd256726a23',1,'snmp_node_instance']]],
+  ['ioctl',['ioctl',['../group__socket.html#ga50a83956bc3a96e6274a21ec0d4d6338',1,'sockets.h']]],
+  ['ioctlsocket',['ioctlsocket',['../group__socket.html#ga19e714443d0238cfd79b71059ec92378',1,'sockets.h']]],
+  ['ip',['ip',['../structstats__.html#a40f5b637d083896a07a3482ede23b7ed',1,'stats_::ip()'],['../group__ip.html',1,'(Global Namespace)']]],
+  ['ip_2ec',['ip.c',['../ip_8c.html',1,'']]],
+  ['ip_2eh',['ip.h',['../ip_8h.html',1,'(Global Namespace)'],['../prot_2ip_8h.html',1,'(Global Namespace)']]],
+  ['ipv4',['IPv4',['../group__ip4.html',1,'']]],
+  ['ip4_2ec',['ip4.c',['../ip4_8c.html',1,'']]],
+  ['ip4_2eh',['ip4.h',['../ip4_8h.html',1,'(Global Namespace)'],['../prot_2ip4_8h.html',1,'(Global Namespace)']]],
+  ['ip4_5f2_5fipv4_5fmapped_5fipv6',['ip4_2_ipv4_mapped_ipv6',['../group__ipaddr.html#gae5f26df8f5099f330ad1e506c74f06f7',1,'ip_addr.h']]],
+  ['ip4_5faddr',['ip4_addr',['../structip4__addr.html',1,'ip4_addr'],['../ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974',1,'IP4_ADDR():&#160;ip4_addr.h']]],
+  ['ip4_5faddr_2ec',['ip4_addr.c',['../ip4__addr_8c.html',1,'']]],
+  ['ip4_5faddr_2eh',['ip4_addr.h',['../ip4__addr_8h.html',1,'']]],
+  ['ip4_5faddr_5fany',['IP4_ADDR_ANY',['../group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff',1,'ip_addr.h']]],
+  ['ip4_5faddr_5fany4',['IP4_ADDR_ANY4',['../group__ip4addr.html#gaa3f65a42b68149e96e618600b2ca2e42',1,'ip_addr.h']]],
+  ['ip4_5faddr_5fbroadcast',['IP4_ADDR_BROADCAST',['../group__ip4addr.html#ga5efdf55ba72c2b1b5755b1fc6f559a1a',1,'ip_addr.h']]],
+  ['ip4_5faddr_5fcopy',['ip4_addr_copy',['../ip4__addr_8h.html#a2f4e9c339e897e6ca5cb4a2f1e8394d5',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fget_5fnetwork',['ip4_addr_get_network',['../ip4__addr_8h.html#a81658cb05ba504d13ee860e82dc444e9',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fget_5fu32',['ip4_addr_get_u32',['../ip4__addr_8h.html#ad50d93464bbbda199b585c54869a3a4b',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fisbroadcast_5fu32',['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',['ip4_addr_isloopback',['../ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fnetcmp',['ip4_addr_netcmp',['../ip4__addr_8h.html#afd43f6ceb2df8d50c84509ad1059f514',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fnetmask_5fvalid',['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',['ip4_addr_packed',['../structip4__addr__packed.html',1,'']]],
+  ['ip4_5faddr_5fset',['ip4_addr_set',['../ip4__addr_8h.html#a33a17a8d2025ce3715db835534868e88',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5fany',['ip4_addr_set_any',['../ip4__addr_8h.html#afaaed3762ce8e9de14fcf73b19964567',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5fhton',['ip4_addr_set_hton',['../ip4__addr_8h.html#a901850ec90b01b9bf6baf69561aa465a',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5floopback',['ip4_addr_set_loopback',['../ip4__addr_8h.html#a5c7eae50a387987a7f56c29c74255c3c',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5fu32',['ip4_addr_set_u32',['../ip4__addr_8h.html#aeb39f58b38435f89219c8ccb509eb520',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5fzero',['ip4_addr_set_zero',['../ip4__addr_8h.html#a973b6ad98e037fc45f1e11d29cda99ea',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5ft',['ip4_addr_t',['../ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fwordaligned',['ip4_addr_wordaligned',['../structip4__addr__wordaligned.html',1,'']]],
+  ['ip4_5fcurrent_5fdest_5faddr',['ip4_current_dest_addr',['../ip_8h.html#a2833c8d59910dd7c0e87ab3bb174e720',1,'ip.h']]],
+  ['ip4_5fcurrent_5fheader',['ip4_current_header',['../ip_8h.html#a3ce482b7e08282effd670001198ecd87',1,'ip.h']]],
+  ['ip4_5fcurrent_5fsrc_5faddr',['ip4_current_src_addr',['../ip_8h.html#ad2a62f96b9431a79f0258dc13058b160',1,'ip.h']]],
+  ['ip4_5ffrag',['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',['ip4_frag.c',['../ip4__frag_8c.html',1,'']]],
+  ['ip4_5ffrag_2eh',['ip4_frag.h',['../ip4__frag_8h.html',1,'']]],
+  ['ip4_5finput',['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',['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',['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',['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',['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',['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',['ip4_reass',['../ip4__frag_8c.html#a7debaa6366c0db4270d4f03219c75c05',1,'ip4_reass(struct pbuf *p):&#160;ip4_frag.c'],['../ip4__frag_8h.html#a7debaa6366c0db4270d4f03219c75c05',1,'ip4_reass(struct pbuf *p):&#160;ip4_frag.c']]],
+  ['ip4_5froute',['ip4_route',['../ip4_8c.html#ac659f675356cfc1d4d13884946347e47',1,'ip4_route(const ip4_addr_t *dest):&#160;ip4.c'],['../ip4_8h.html#ac659f675356cfc1d4d13884946347e47',1,'ip4_route(const ip4_addr_t *dest):&#160;ip4.c']]],
+  ['ip4_5froute_5fsrc',['ip4_route_src',['../ip4_8c.html#ab615a9ca8fdd99e697f52506fc440fba',1,'ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest):&#160;ip4.c'],['../ip4_8h.html#ab615a9ca8fdd99e697f52506fc440fba',1,'ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest):&#160;ip4.c']]],
+  ['ip4_5fset_5fdefault_5fmulticast_5fnetif',['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']]],
+  ['ipv4_20only',['IPv4 only',['../group__ip4addr.html',1,'']]],
+  ['ip4addr_5faton',['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',['ip4addr_ntoa',['../ip4__addr_8c.html#a28620fdd443c5c98d15e5890cbd9059c',1,'ip4addr_ntoa(const ip4_addr_t *addr):&#160;ip4_addr.c'],['../ip4__addr_8h.html#a28620fdd443c5c98d15e5890cbd9059c',1,'ip4addr_ntoa(const ip4_addr_t *addr):&#160;ip4_addr.c']]],
+  ['ip4addr_5fntoa_5fr',['ip4addr_ntoa_r',['../ip4__addr_8c.html#a3825d5b4786c207af971ceb287f101fd',1,'ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen):&#160;ip4_addr.c'],['../ip4__addr_8h.html#a3825d5b4786c207af971ceb287f101fd',1,'ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen):&#160;ip4_addr.c']]],
+  ['ip6',['ip6',['../structstats__.html#afc0942a5bc26735cf059099636b85336',1,'stats_::ip6()'],['../group__ip6.html',1,'(Global Namespace)']]],
+  ['ip6_2ec',['ip6.c',['../ip6_8c.html',1,'']]],
+  ['ip6_2eh',['ip6.h',['../ip6_8h.html',1,'(Global Namespace)'],['../prot_2ip6_8h.html',1,'(Global Namespace)']]],
+  ['ip6_5faddr',['ip6_addr',['../structip6__addr.html',1,'ip6_addr'],['../structnetif.html#ab7ef575d4ab398a182bc6e592f4d53a4',1,'netif::ip6_addr()'],['../ip6__addr_8h.html#a30c92254d6abe631de6a5accfd491bc3',1,'IP6_ADDR():&#160;ip6_addr.h']]],
+  ['ip6_5faddr_2ec',['ip6_addr.c',['../ip6__addr_8c.html',1,'']]],
+  ['ip6_5faddr_2eh',['ip6_addr.h',['../ip6__addr_8h.html',1,'']]],
+  ['ip6_5faddr_5fany',['IP6_ADDR_ANY',['../group__ip6addr.html#ga5181d2cb6b9254eb5ad4137f7b3635a0',1,'ip_addr.h']]],
+  ['ip6_5faddr_5fany6',['IP6_ADDR_ANY6',['../group__ip6addr.html#ga953cdd2592764ba2e6e021aea350ad43',1,'ip_addr.h']]],
+  ['ip6_5faddr_5fassign_5fzone',['ip6_addr_assign_zone',['../group__ip6__zones.html#ga1040a3d67498a1ef617bda8d9e0ba3a5',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fblock1',['IP6_ADDR_BLOCK1',['../ip6__addr_8h.html#ae258ebfa66d18c8c428bf3d8fd0f969c',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock2',['IP6_ADDR_BLOCK2',['../ip6__addr_8h.html#a9193137423b6b936d25c2e6cf33b4921',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock3',['IP6_ADDR_BLOCK3',['../ip6__addr_8h.html#a6466b1c0edd03d6a5986dcc79f7d8bb6',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock4',['IP6_ADDR_BLOCK4',['../ip6__addr_8h.html#a2a5d7de341ce708b7145ad4d72652c71',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock5',['IP6_ADDR_BLOCK5',['../ip6__addr_8h.html#a56a11cfaa169389c319f8bd027ac524c',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock6',['IP6_ADDR_BLOCK6',['../ip6__addr_8h.html#a116d7c5c8bf8531b27f8a9fa98e728c3',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock7',['IP6_ADDR_BLOCK7',['../ip6__addr_8h.html#ab87bee320ecc0e923931ee6f49802deb',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock8',['IP6_ADDR_BLOCK8',['../ip6__addr_8h.html#af3d1f9876bf256ec964bd3809d7ed1b4',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fclear_5fzone',['ip6_addr_clear_zone',['../group__ip6__zones.html#gae0249db6cd2687f2dbc445e7778d37ad',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fcmp',['ip6_addr_cmp',['../ip6__addr_8h.html#aea8d4c4134abff1c76bc997a91163fe1',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcmp_5fpacked',['ip6_addr_cmp_packed',['../ip6__addr_8h.html#a11fe84789e3f039b3f71009e802946a8',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcmp_5fzone',['ip6_addr_cmp_zone',['../group__ip6__zones.html#gacbb8e1a7505d9772181defa0e75b8da9',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fcmp_5fzoneless',['ip6_addr_cmp_zoneless',['../ip6__addr_8h.html#ad0fc088972d395839a7ad75d3dab8322',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcopy',['ip6_addr_copy',['../ip6__addr_8h.html#a7b17e85a46bd8368ce27fc644e058073',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcopy_5ffrom_5fpacked',['ip6_addr_copy_from_packed',['../ip6__addr_8h.html#a05575d46c233ffb13fb03a3a2c8a16b3',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcopy_5fto_5fpacked',['ip6_addr_copy_to_packed',['../ip6__addr_8h.html#a6c46d12fa7d36c47b629d0ccdefa114b',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcopy_5fzone',['ip6_addr_copy_zone',['../group__ip6__zones.html#ga7347729485d837bcff85ae4731bbf5c4',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fequals_5fzone',['ip6_addr_equals_zone',['../group__ip6__zones.html#gaeead8379cc3fd4c257be0bb654994a8f',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fhas_5fscope',['ip6_addr_has_scope',['../group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fhas_5fzone',['ip6_addr_has_zone',['../group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5flacks_5fzone',['ip6_addr_lacks_zone',['../group__ip6__zones.html#gad963bf3e9695ba898271e314975f5c97',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fnetcmp',['ip6_addr_netcmp',['../ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fnetcmp_5fzoneless',['ip6_addr_netcmp_zoneless',['../ip6__addr_8h.html#acc1622ab895680da0a3b6e5e56070342',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fpacked',['ip6_addr_packed',['../structip6__addr__packed.html',1,'']]],
+  ['ip6_5faddr_5fpart',['IP6_ADDR_PART',['../ip6__addr_8h.html#a1d78feeb50aec8f2c07d840829f49ddd',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fselect_5fzone',['ip6_addr_select_zone',['../group__ip6__zones.html#gac83f3e7c8d65d3c784bffc9dec29b70c',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fset',['ip6_addr_set',['../ip6__addr_8h.html#aa7b4ba4202b5f64dee605fe159e9c3ad',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5fany',['ip6_addr_set_any',['../ip6__addr_8h.html#ae2d1ce50ec6dbee890e2f8ae64abdf6b',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5fhton',['ip6_addr_set_hton',['../ip6__addr_8h.html#ad636c27d56d1b3deca9f780bc173d3c2',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5floopback',['ip6_addr_set_loopback',['../ip6__addr_8h.html#a02f5271e922f34a09153ce84839ad292',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5fzero',['ip6_addr_set_zero',['../ip6__addr_8h.html#af696d3b81f4cb9c40ece912de73ed53c',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5fzone',['ip6_addr_set_zone',['../group__ip6__zones.html#ga213310b303dd050da7856d67da72abd6',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fstate',['ip6_addr_state',['../structnetif.html#a54e81344084e9840a51cc4abab3b059b',1,'netif']]],
+  ['ip6_5faddr_5ft',['ip6_addr_t',['../ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5ftest_5fzone',['ip6_addr_test_zone',['../group__ip6__zones.html#gac3ec5f94e1cd62b1237efca3723dc06e',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fvalid_5flife',['ip6_addr_valid_life',['../structnetif.html#a26f6e26d4a54c998716c10b7b85c8230',1,'netif']]],
+  ['ip6_5faddr_5fzone',['ip6_addr_zone',['../group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634',1,'ip6_zone.h']]],
+  ['ip6_5fautoconfig_5fenabled',['ip6_autoconfig_enabled',['../structnetif.html#ad98bafb7733b40ef898e53d91fbfa20f',1,'netif']]],
+  ['ip6_5fchksum_5fpseudo',['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',['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',['ip6_current_dest_addr',['../ip_8h.html#a176525c2192d37ee9eaeba8012c5d9c0',1,'ip.h']]],
+  ['ip6_5fcurrent_5fheader',['ip6_current_header',['../ip_8h.html#af9bf74750c9d7a219ee88d240300fe69',1,'ip.h']]],
+  ['ip6_5fcurrent_5fsrc_5faddr',['ip6_current_src_addr',['../ip_8h.html#ac40a9e4a21ecf5bb39813bb6ca5bb245',1,'ip.h']]],
+  ['ip6_5fdebug',['IP6_DEBUG',['../group__lwip__opts__debugmsg.html#gac2f9726756b78d4d7c425b0422a776ce',1,'opt.h']]],
+  ['ip6_5ffrag',['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',['ip6_frag.c',['../ip6__frag_8c.html',1,'']]],
+  ['ip6_5ffrag_2eh',['ip6_frag.h',['../ip6__frag_8h.html',1,'']]],
+  ['ip6_5ffrag_5fstats',['IP6_FRAG_STATS',['../group__lwip__opts__stats.html#gaaa08a181c11ff8b471549e8f52c9939b',1,'opt.h']]],
+  ['ip6_5fhdr',['ip6_hdr',['../structip6__hdr.html',1,'']]],
+  ['ip6_5finput',['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',['IP6_MULTICAST',['../group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfea70cda997b66f3e120e925c5a41904809',1,'ip6_zone.h']]],
+  ['ip6_5fno_5fzone',['IP6_NO_ZONE',['../group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb',1,'ip6_zone.h']]],
+  ['ip6_5foptions_5fadd_5fhbh_5fra',['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',['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',['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',['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',['ip6_reass',['../ip6__frag_8c.html#adbd666d01adcbbbc5966938f02025b7c',1,'ip6_reass(struct pbuf *p):&#160;ip6_frag.c'],['../ip6__frag_8h.html#adbd666d01adcbbbc5966938f02025b7c',1,'ip6_reass(struct pbuf *p):&#160;ip6_frag.c']]],
+  ['ip6_5freass_5fhelper',['ip6_reass_helper',['../structip6__reass__helper.html',1,'']]],
+  ['ip6_5freass_5ftmr_5finterval',['IP6_REASS_TMR_INTERVAL',['../ip6__frag_8h.html#ad0730ee4db9fbebdf071bb33d75698a2',1,'ip6_frag.h']]],
+  ['ip6_5freassdata',['ip6_reassdata',['../structip6__reassdata.html',1,'']]],
+  ['ip6_5froute',['ip6_route',['../ip6_8c.html#a1153bd9e8c45847282105ab6379e6e70',1,'ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest):&#160;ip6.c'],['../ip6_8h.html#a1153bd9e8c45847282105ab6379e6e70',1,'ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest):&#160;ip6.c']]],
+  ['ip6_5fselect_5fsource_5faddress',['ip6_select_source_address',['../group__ip6.html#ga540ad82e2af4c4709f1852e63c36706a',1,'ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest):&#160;ip6.c'],['../group__ip6.html#ga540ad82e2af4c4709f1852e63c36706a',1,'ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest):&#160;ip6.c']]],
+  ['ip6_5fstats',['IP6_STATS',['../group__lwip__opts__stats.html#ga6a211b787c97bce3af4273b29c95d9c2',1,'opt.h']]],
+  ['ip6_5funicast',['IP6_UNICAST',['../group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0',1,'ip6_zone.h']]],
+  ['ip6_5funknown',['IP6_UNKNOWN',['../group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8',1,'ip6_zone.h']]],
+  ['ip6_5fzone_2eh',['ip6_zone.h',['../ip6__zone_8h.html',1,'']]],
+  ['ipv6_20zones',['IPv6 Zones',['../group__ip6__zones.html',1,'']]],
+  ['ipv6_20only',['IPv6 only',['../group__ip6addr.html',1,'']]],
+  ['ip6addr_5faton',['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',['ip6addr_ntoa',['../ip6__addr_8c.html#adba4443e6629583d48e1d1c7c21a977e',1,'ip6addr_ntoa(const ip6_addr_t *addr):&#160;ip6_addr.c'],['../ip6__addr_8h.html#adba4443e6629583d48e1d1c7c21a977e',1,'ip6addr_ntoa(const ip6_addr_t *addr):&#160;ip6_addr.c']]],
+  ['ip6addr_5fntoa_5fr',['ip6addr_ntoa_r',['../ip6__addr_8c.html#a64d442f35f34c43121bf91cfea2e77a2',1,'ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen):&#160;ip6_addr.c'],['../ip6__addr_8h.html#a64d442f35f34c43121bf91cfea2e77a2',1,'ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen):&#160;ip6_addr.c']]],
+  ['ip_5f2_5fip4',['ip_2_ip4',['../group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03',1,'ip_addr.h']]],
+  ['ip_5f2_5fip6',['ip_2_ip6',['../group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd',1,'ip_addr.h']]],
+  ['ip_5faccept_5flink_5flayer_5faddressed_5fport',['IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT',['../ip4_8c.html#a185c7d6380711847105430931692b267',1,'ip4.c']]],
+  ['ip_5faddr',['ip_addr',['../structip__addr.html',1,'ip_addr'],['../structnetif.html#a9776aaee37ea8f07b9ddc0f8b4e7e866',1,'netif::ip_addr()']]],
+  ['ip_5faddr_2eh',['ip_addr.h',['../ip__addr_8h.html',1,'']]],
+  ['ip_5faddr4',['IP_ADDR4',['../group__ip4addr.html#gadd2203c6cbfb6de8c2d9ce5bbfb2bd2a',1,'ip_addr.h']]],
+  ['ip_5faddr6',['IP_ADDR6',['../group__ip6addr.html#ga9ee53b601b89dcb517496ba0bccf9bd0',1,'ip_addr.h']]],
+  ['ip_5faddr6_5fhost',['IP_ADDR6_HOST',['../group__ip6addr.html#gabfb1ce44d6a8791336bf3ac06aa086ca',1,'ip_addr.h']]],
+  ['ip_5faddr_5fany',['IP_ADDR_ANY',['../group__ip4addr.html#ga3e5e67b7292b156034560fef2202776c',1,'ip_addr.h']]],
+  ['ip_5faddr_5fbroadcast',['IP_ADDR_BROADCAST',['../group__ip4addr.html#gad546955e48dada78b552375b873f6986',1,'ip_addr.h']]],
+  ['ip_5faddr_5fcmp',['ip_addr_cmp',['../group__ipaddr.html#ga008c9c92d770cc030ea054e6b259835a',1,'ip_addr.h']]],
+  ['ip_5faddr_5fcmp_5fzoneless',['ip_addr_cmp_zoneless',['../group__ipaddr.html#gadb66f6d5fa926ed4b0e69db58dffcbe4',1,'ip_addr.h']]],
+  ['ip_5faddr_5fcopy',['ip_addr_copy',['../group__ipaddr.html#ga77a933975db287f6aa5c2e70249ba18f',1,'ip_addr.h']]],
+  ['ip_5faddr_5fcopy_5ffrom_5fip4',['ip_addr_copy_from_ip4',['../group__ip4addr.html#gaef063b2e975dae7ecf398770b04b14af',1,'ip_addr.h']]],
+  ['ip_5faddr_5fcopy_5ffrom_5fip6',['ip_addr_copy_from_ip6',['../group__ip6addr.html#gabe6f7908ce8a91dc587e2ebc2172e651',1,'ip_addr.h']]],
+  ['ip_5faddr_5fcopy_5ffrom_5fip6_5fpacked',['ip_addr_copy_from_ip6_packed',['../group__ip6addr.html#ga130ca0907497831677c130dbb3289e1e',1,'ip_addr.h']]],
+  ['ip_5faddr_5fget_5fip4_5fu32',['ip_addr_get_ip4_u32',['../group__ip4addr.html#ga09c62e8a3bf599aa7f335e0ad0820e85',1,'ip_addr.h']]],
+  ['ip_5faddr_5fget_5fnetwork',['ip_addr_get_network',['../group__ipaddr.html#gab5c5540ea05227bdd9207a47304bb2c1',1,'ip_addr.h']]],
+  ['ip_5faddr_5fisany',['ip_addr_isany',['../group__ipaddr.html#ga279118890e6a90aa740051fb8b0cc5f4',1,'ip_addr.h']]],
+  ['ip_5faddr_5fisany_5fval',['ip_addr_isany_val',['../group__ipaddr.html#gacd8f5aa151cff966fd28368b85f38c05',1,'ip_addr.h']]],
+  ['ip_5faddr_5fisbroadcast',['ip_addr_isbroadcast',['../group__ipaddr.html#gaa3345706e3aa8b32dd630c195b053e75',1,'ip_addr.h']]],
+  ['ip_5faddr_5fislinklocal',['ip_addr_islinklocal',['../group__ipaddr.html#ga33bc079baaf513a9a7381b9531a1f653',1,'ip_addr.h']]],
+  ['ip_5faddr_5fisloopback',['ip_addr_isloopback',['../group__ipaddr.html#ga0fc8bf6662809274750868683b3a422e',1,'ip_addr.h']]],
+  ['ip_5faddr_5fismulticast',['ip_addr_ismulticast',['../group__ipaddr.html#ga2170d3ee13dd22722222228e7b1c5752',1,'ip_addr.h']]],
+  ['ip_5faddr_5fnetcmp',['ip_addr_netcmp',['../group__ipaddr.html#ga3a2123f0bbf6fe843c8542e349c680eb',1,'ip_addr.h']]],
+  ['ip_5faddr_5fset',['ip_addr_set',['../group__ipaddr.html#ga40db7feae2b92f7a7a01d65a85b06e18',1,'ip_addr.h']]],
+  ['ip_5faddr_5fset_5fany',['ip_addr_set_any',['../group__ipaddr.html#ga8853fce54b1816dca3af90b48677e673',1,'ip_addr.h']]],
+  ['ip_5faddr_5fset_5fany_5fval',['ip_addr_set_any_val',['../group__ipaddr.html#ga93c7bf3f7487495472aa0f9b5fc25d1a',1,'ip_addr.h']]],
+  ['ip_5faddr_5fset_5fhton',['ip_addr_set_hton',['../group__ipaddr.html#ga3528798be1d2f1ec6a6bccd35694edce',1,'ip_addr.h']]],
+  ['ip_5faddr_5fset_5fip4_5fu32',['ip_addr_set_ip4_u32',['../group__ip4addr.html#ga971516589980428bf51f37cefa4ddf66',1,'ip_addr.h']]],
+  ['ip_5faddr_5fset_5fip4_5fu32_5fval',['ip_addr_set_ip4_u32_val',['../group__ip4addr.html#ga624b5010ccc04cc3d0de2acce44f1c9e',1,'ip_addr.h']]],
+  ['ip_5faddr_5fset_5fipaddr',['ip_addr_set_ipaddr',['../group__ipaddr.html#gaea5e4795598bc33fa2db1773c8e6fbac',1,'ip_addr.h']]],
+  ['ip_5faddr_5fset_5floopback',['ip_addr_set_loopback',['../group__ipaddr.html#ga8f9d56ac85cd87338a1823e4a58ba1da',1,'ip_addr.h']]],
+  ['ip_5faddr_5fset_5floopback_5fval',['ip_addr_set_loopback_val',['../group__ipaddr.html#gac1c5f897bbee217771b1a6ba18733042',1,'ip_addr.h']]],
+  ['ip_5faddr_5fset_5fzero',['ip_addr_set_zero',['../group__ipaddr.html#gaae7edb585c062ae03bfbd3af7bf671bc',1,'ip_addr.h']]],
+  ['ip_5faddr_5fset_5fzero_5fip4',['ip_addr_set_zero_ip4',['../ip__addr_8h.html#aecb93d575e65f835f1045a4e87e70ed9',1,'ip_addr.h']]],
+  ['ip_5faddr_5fset_5fzero_5fip6',['ip_addr_set_zero_ip6',['../group__ip6addr.html#gafb3a0e5241683aff573e195f31ba8845',1,'ip_addr.h']]],
+  ['ip_5faddr_5ft',['ip_addr_t',['../group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a',1,'ip_addr.h']]],
+  ['ip_5fany_5ftype',['IP_ANY_TYPE',['../group__ipaddr.html#gabe43b154533b73585c4e58f568370ede',1,'ip_addr.h']]],
+  ['ip_5fcurrent_5fdest_5faddr',['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',['ip_current_header_proto',['../ip_8h.html#af27c43c23b59d68a8463cd5ad035b20f',1,'ip.h']]],
+  ['ip_5fcurrent_5fheader_5ftot_5flen',['ip_current_header_tot_len',['../ip_8h.html#a2ca15ea285a10982294378cd7b8e83e2',1,'ip.h']]],
+  ['ip_5fcurrent_5finput_5fnetif',['ip_current_input_netif',['../ip_8h.html#ae214afa9d3f1b26fc8d538436b8fa3c4',1,'ip.h']]],
+  ['ip_5fcurrent_5fis_5fv6',['ip_current_is_v6',['../ip_8h.html#abc56623d434a204298a4e98352af1c9d',1,'ip.h']]],
+  ['ip_5fcurrent_5fnetif',['ip_current_netif',['../ip_8h.html#aabecef3c7653a9767c79245c44fcab9f',1,'ip.h']]],
+  ['ip_5fcurrent_5fsrc_5faddr',['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',['ip_data',['../ip_8c.html#ac944fb6564f181bc90bc7c2b8b00d94c',1,'ip_data():&#160;ip.c'],['../ip_8h.html#ac944fb6564f181bc90bc7c2b8b00d94c',1,'ip_data():&#160;ip.c']]],
+  ['ip_5fdebug',['IP_DEBUG',['../group__lwip__opts__debugmsg.html#ga5d3348778951e7bc5cd397c6575eef3a',1,'opt.h']]],
+  ['ip_5fdefault_5fttl',['IP_DEFAULT_TTL',['../group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411',1,'opt.h']]],
+  ['ip_5fforward',['IP_FORWARD',['../group__lwip__opts__ipv4.html#ga881d32ff5ee02af01f758953f1b51d59',1,'opt.h']]],
+  ['ip_5fforward_5fallow_5ftx_5fon_5frx_5fnetif',['IP_FORWARD_ALLOW_TX_ON_RX_NETIF',['../group__lwip__opts__ipv4.html#ga9e761df07c4e93901858741d4771dbc7',1,'opt.h']]],
+  ['ip_5ffrag',['ip_frag',['../structstats__.html#a81fcccf03ab0d4e31423f39d0c880302',1,'stats_::ip_frag()'],['../group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4',1,'IP_FRAG():&#160;opt.h']]],
+  ['ip_5fget_5foption',['ip_get_option',['../ip_8h.html#a26e077f52de4a97ff89c02415c084518',1,'ip.h']]],
+  ['ip_5fglobals',['ip_globals',['../structip__globals.html',1,'']]],
+  ['ip_5fhdr_5fget_5fversion',['IP_HDR_GET_VERSION',['../prot_2ip_8h.html#afc29766fb0707c63b64568c5fa44a374',1,'ip.h']]],
+  ['ip_5finput',['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_5fis_5fany_5ftype_5fval',['IP_IS_ANY_TYPE_VAL',['../group__ipaddr.html#ga83b17dbf7d1faf5c8f8c20b039db8bb8',1,'ip_addr.h']]],
+  ['ip_5fis_5fv4',['IP_IS_V4',['../group__ip4addr.html#gabee5dab2191bb0f3355d7f30d1496f24',1,'ip_addr.h']]],
+  ['ip_5fis_5fv4_5fval',['IP_IS_V4_VAL',['../group__ip4addr.html#gab1a059f07bd9c50aa58447d963b823a1',1,'ip_addr.h']]],
+  ['ip_5fis_5fv6',['IP_IS_V6',['../group__ip6addr.html#ga9bac7e938757f1d24df2404e8b57cb7d',1,'ip_addr.h']]],
+  ['ip_5fis_5fv6_5fval',['IP_IS_V6_VAL',['../group__ip6addr.html#ga1578e34703e86711a7fb7dcc3857004d',1,'ip_addr.h']]],
+  ['ip_5fnetif_5fget_5flocal_5fip',['ip_netif_get_local_ip',['../group__ip.html#ga4a4b9439c91eeec719692dfe10f14af0',1,'ip.h']]],
+  ['ip_5fnext_5fheader_5fptr',['ip_next_header_ptr',['../ip_8h.html#a68d25b5924b768cbf2f1a78bbabfce26',1,'ip.h']]],
+  ['ip_5fntoa',['ip_ntoa',['../ip4__addr_8h.html#a2b2230516e7911dfacc9b87644ba30f1',1,'ip4_addr.h']]],
+  ['ip_5foptions_5fallowed',['IP_OPTIONS_ALLOWED',['../group__lwip__opts__ipv4.html#gaa956b0167c37a2265b55e2d0204a3933',1,'opt.h']]],
+  ['ip_5foptions_5fsend',['IP_OPTIONS_SEND',['../ip4_8h.html#a516aa115f61c368cbe74fae2da2c6824',1,'ip4.h']]],
+  ['ip_5foutput',['ip_output',['../group__ip.html#gaf056aa43789c2964f091f8349bb83730',1,'ip.h']]],
+  ['ip_5foutput_5fhinted',['ip_output_hinted',['../ip_8h.html#accbc01f37dd426a66de41693a5450207',1,'ip.h']]],
+  ['ip_5foutput_5fif',['ip_output_if',['../group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250',1,'ip.h']]],
+  ['ip_5foutput_5fif_5fhdrincl',['ip_output_if_hdrincl',['../ip_8h.html#aac608b92f8f226c3574d6bb855f12496',1,'ip.h']]],
+  ['ip_5foutput_5fif_5fsrc',['ip_output_if_src',['../group__ip.html#gab9d45f846f796bd6ce1e0c780c392765',1,'ip.h']]],
+  ['ip_5fpcb',['IP_PCB',['../ip_8h.html#a8bdf4b5f674375e76cdd968826d80e53',1,'ip.h']]],
+  ['ip_5freass_5fcheck_5foverlap',['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',['IP_REASS_DEBUG',['../group__lwip__opts__debugmsg.html#ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33',1,'opt.h']]],
+  ['ip_5freass_5ffree_5foldest',['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',['ip_reass_helper',['../structip__reass__helper.html',1,'']]],
+  ['ip_5freass_5fmax_5fpbufs',['IP_REASS_MAX_PBUFS',['../group__lwip__opts__ipv4.html#ga29084a46d7d4be30e8029d356bca0394',1,'opt.h']]],
+  ['ip_5freass_5fmaxage',['IP_REASS_MAXAGE',['../group__lwip__opts__ipv4.html#gad41122bd0b5485a18a4415c8f953727b',1,'opt.h']]],
+  ['ip_5freass_5ftmr',['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',['ip_reassdata',['../structip__reassdata.html',1,'']]],
+  ['ip_5freassembly',['IP_REASSEMBLY',['../group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69',1,'opt.h']]],
+  ['ip_5freset_5foption',['ip_reset_option',['../ip_8h.html#a441c63f00c4b0cb69fc34ca6b55307cc',1,'ip.h']]],
+  ['ip_5froute',['ip_route',['../group__ip.html#ga0fa3afc2c00aea346889b476650adee3',1,'ip.h']]],
+  ['ip_5fset_5foption',['ip_set_option',['../ip_8h.html#a13f48cf825c7f074dc05bea54e9d6a93',1,'ip.h']]],
+  ['ip_5fsof_5fbroadcast',['IP_SOF_BROADCAST',['../group__lwip__opts__ipv4.html#ga0b2c993fd940f5774108298933310384',1,'opt.h']]],
+  ['ip_5fsof_5fbroadcast_5frecv',['IP_SOF_BROADCAST_RECV',['../group__lwip__opts__ipv4.html#ga0f1fbf42d3344bf87cd056d48ddca3db',1,'opt.h']]],
+  ['ip_5fstats',['IP_STATS',['../group__lwip__opts__stats.html#gaf50575a4895e26ea2c01d1f2269487be',1,'opt.h']]],
+  ['ip_20address_20handling',['IP address handling',['../group__ipaddr.html',1,'']]],
+  ['ipaddr4_5finit',['IPADDR4_INIT',['../group__ip4addr.html#ga1eaffd17b4b3c56cc91a6d516e18118f',1,'ip_addr.h']]],
+  ['ipaddr4_5finit_5fbytes',['IPADDR4_INIT_BYTES',['../group__ip4addr.html#ga55cc3896c46564bd2941ee5806fe1e11',1,'ip_addr.h']]],
+  ['ipaddr6_5finit',['IPADDR6_INIT',['../group__ip6addr.html#ga1266e500b1db0b7cdc4b269cace49746',1,'ip_addr.h']]],
+  ['ipaddr6_5finit_5fhost',['IPADDR6_INIT_HOST',['../group__ip6addr.html#gadaff748da2b808995993dd3db5420f08',1,'ip_addr.h']]],
+  ['ipaddr6_5fzone_5finit',['IPADDR6_ZONE_INIT',['../group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9',1,'ip6_zone.h']]],
+  ['ipaddr_5faddr',['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',['IPADDR_ANY',['../ip4__addr_8h.html#ad6ed0d622d61ecd6edd606e3b564f0a2',1,'ip4_addr.h']]],
+  ['ipaddr_5fany_5ftype_5finit',['IPADDR_ANY_TYPE_INIT',['../group__ipaddr.html#ga23b580930c0eb1d0fdeba2b109c077a5',1,'ip_addr.h']]],
+  ['ipaddr_5faton',['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',['IPADDR_BROADCAST',['../ip4__addr_8h.html#ac661fca7e7d25e5cd379b811a767c29a',1,'ip4_addr.h']]],
+  ['ipaddr_5floopback',['IPADDR_LOOPBACK',['../ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e',1,'ip4_addr.h']]],
+  ['ipaddr_5fnone',['IPADDR_NONE',['../ip4__addr_8h.html#abc4b2e3531c4992f2ae4b8c0f9751544',1,'ip4_addr.h']]],
+  ['ipaddr_5fntoa',['ipaddr_ntoa',['../group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1',1,'ipaddr_ntoa(const ip_addr_t *addr):&#160;ip.c'],['../group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1',1,'ipaddr_ntoa(const ip_addr_t *addr):&#160;ip.c']]],
+  ['ipaddr_5fntoa_5fr',['ipaddr_ntoa_r',['../group__ipaddr.html#ga3684dabc0cae597ffb5b51d41f1d886f',1,'ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen):&#160;ip.c'],['../group__ipaddr.html#ga3684dabc0cae597ffb5b51d41f1d886f',1,'ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen):&#160;ip.c']]],
+  ['ipaddr_5fstrlen_5fmax',['IPADDR_STRLEN_MAX',['../group__ipaddr.html#ga8619278bcbf705844f584f36972fc758',1,'ip_addr.h']]],
+  ['ipaddr_5ftype_5fany',['IPADDR_TYPE_ANY',['../group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e',1,'ip_addr.h']]],
+  ['ipaddr_5ftype_5fv4',['IPADDR_TYPE_V4',['../group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049',1,'ip_addr.h']]],
+  ['ipaddr_5ftype_5fv6',['IPADDR_TYPE_V6',['../group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02',1,'ip_addr.h']]],
+  ['ipaddr_5fwordaligned_5fcopy_5ffrom_5fip4_5faddr_5ft',['IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T',['../lwip_2prot_2etharp_8h.html#a7dff02ff186f844b731cecbe614b7419',1,'etharp.h']]],
+  ['ipaddr_5fwordaligned_5fcopy_5fto_5fip4_5faddr_5ft',['IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T',['../lwip_2prot_2etharp_8h.html#a94f1c2a6ad7cecdfe759c0490ba7f030',1,'etharp.h']]],
+  ['iperf_20server',['Iperf server',['../group__iperf.html',1,'']]],
+  ['ipfrag_5fstats',['IPFRAG_STATS',['../group__lwip__opts__stats.html#gac9a4fbb46df3c0f479a334d0e34fb74f',1,'opt.h']]],
+  ['ipv4_5fchanged_5fs',['ipv4_changed_s',['../structnetif__ext__callback__args__t_1_1ipv4__changed__s.html',1,'netif_ext_callback_args_t']]],
+  ['ipv6_5faddr_5fstate_5fchanged_5fs',['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',['IPV6_CUSTOM_SCOPES',['../group__ip6__zones.html#gae677a65970f4b667156b256dd9a4924b',1,'ip6_zone.h']]],
+  ['ipv6_5ffrag_5fcopyheader',['IPV6_FRAG_COPYHEADER',['../ip6__frag_8h.html#a151e742cf7f0e5c3a08f31db0370cea7',1,'ip6_frag.h']]],
+  ['ipv6_5freass_5fmaxage',['IPV6_REASS_MAXAGE',['../group__lwip__opts__ipv6.html#ga8adc0b7dbedd279387a21588f0e2c969',1,'opt.h']]],
+  ['ipv6_5fset_5fs',['ipv6_set_s',['../structnetif__ext__callback__args__t_1_1ipv6__set__s.html',1,'netif_ext_callback_args_t']]],
+  ['icmp',['ICMP',['../group__lwip__opts__icmp.html',1,'']]],
+  ['icmp6',['ICMP6',['../group__lwip__opts__icmp6.html',1,'']]],
+  ['igmp',['IGMP',['../group__lwip__opts__igmp.html',1,'']]],
+  ['infrastructure',['Infrastructure',['../group__lwip__opts__infrastructure.html',1,'']]],
+  ['ipv4',['IPv4',['../group__lwip__opts__ipv4.html',1,'']]],
+  ['ipv6',['IPv6',['../group__lwip__opts__ipv6.html',1,'']]],
+  ['internal_20memory_20pools',['Internal memory pools',['../group__lwip__opts__memp.html',1,'']]],
+  ['ipv4_20address_20handling',['IPv4 address handling',['../group__netif__ip4.html',1,'']]],
+  ['ipv6_20address_20handling',['IPv6 address handling',['../group__netif__ip6.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/all_b.html b/doc/doxygen/output/html/search/all_b.html
new file mode 100644
index 0000000..0814e4e
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_b.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_b.js b/doc/doxygen/output/html/search/all_b.js
new file mode 100644
index 0000000..8c223f4
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_b.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['jl',['jl',['../structapi__msg.html#a6387bddb309c218ac0ccc5ef6d7a033e',1,'api_msg']]],
+  ['jumpers',['jumpers',['../structnetbios__answer.html#a69cd3e8b8265531a7ce3e5cbd4911683',1,'netbios_answer']]]
+];
diff --git a/doc/doxygen/output/html/search/all_c.html b/doc/doxygen/output/html/search/all_c.html
new file mode 100644
index 0000000..da08c38
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_c.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_c.js b/doc/doxygen/output/html/search/all_c.js
new file mode 100644
index 0000000..c8680df
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_c.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['keep_5falive',['keep_alive',['../structmqtt__connect__client__info__t.html#ac80262a7456812e9eefffd8c3b9ac21a',1,'mqtt_connect_client_info_t']]]
+];
diff --git a/doc/doxygen/output/html/search/all_d.html b/doc/doxygen/output/html/search/all_d.html
new file mode 100644
index 0000000..9986c9c
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_d.js b/doc/doxygen/output/html/search/all_d.js
new file mode 100644
index 0000000..dd37291
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_d.js
@@ -0,0 +1,384 @@
+var searchData=
+[
+  ['lwip_5fdbg_5fmin_5flevel_20and_20lwip_5fdbg_5ftypes_5fon_20values',['LWIP_DBG_MIN_LEVEL and LWIP_DBG_TYPES_ON values',['../group__debugging__levels.html',1,'']]],
+  ['last_5freporter_5fflag',['last_reporter_flag',['../structigmp__group.html#a8fa72062d168d81c1c5ae5209eb0a874',1,'igmp_group::last_reporter_flag()'],['../structmld__group.html#aa8eb75f4dfaefbf0d2853b0e31ceb53b',1,'mld_group::last_reporter_flag()']]],
+  ['lastconflict',['lastconflict',['../structautoip.html#a2f51d8cde73e20d6e0ae3ec8053afb55',1,'autoip']]],
+  ['lastdata',['lastdata',['../structlwip__sock.html#aa487ac16b7e5b6a2a618b7b5060247e1',1,'lwip_sock']]],
+  ['legacy_5fquery',['legacy_query',['../structmdns__outpacket.html#aff8c520bffa87c78e0ee2440571bbd65',1,'mdns_outpacket']]],
+  ['len',['len',['../structnetvector.html#a8a95e6dcf57067e4354b9c2b6b391dbd',1,'netvector::len()'],['../structpbuf.html#a6f82449625e36e294f5d210268c0703f',1,'pbuf::len()'],['../structapi__msg.html#a40624c398d1939bfee54bffa708a363e',1,'api_msg::len()']]],
+  ['linger',['linger',['../structnetconn.html#a25ed06d944da0b0b9e7db5265be3fa3d',1,'netconn']]],
+  ['link',['link',['../structstats__.html#a67759c9b0059bf569f9f771df23924eb',1,'stats_']]],
+  ['link_5fcallback',['link_callback',['../structnetif.html#a4388cfadc8b4e9a9c1c93ce777bc3673',1,'netif']]],
+  ['link_5fchanged_5fs',['link_changed_s',['../structnetif__ext__callback__args__t_1_1link__changed__s.html',1,'netif_ext_callback_args_t']]],
+  ['link_5fspeed',['link_speed',['../structnetif.html#a908452e854180941054ed89f52bb8094',1,'netif']]],
+  ['link_5fstats',['LINK_STATS',['../group__lwip__opts__stats.html#gae58b452782d0327ae728192686c5a84a',1,'opt.h']]],
+  ['link_5ftype',['link_type',['../structnetif.html#ad0ee2a2169e384a2977ece2c471e0062',1,'netif']]],
+  ['linkoutput',['linkoutput',['../structnetif.html#acaaac9b415a7be73eb8a287c8ed18a8d',1,'netif']]],
+  ['listen',['listen',['../group__socket.html#gae6e6de5a20bed9fc7078f0e6c9c4aca4',1,'sockets.h']]],
+  ['ll_5fip4_5fmulticast_5faddr_5f0',['LL_IP4_MULTICAST_ADDR_0',['../lwip_2prot_2ethernet_8h.html#afaf6cbccf9477c3505660e3a17860e07',1,'ethernet.h']]],
+  ['ll_5fip6_5fmulticast_5faddr_5f0',['LL_IP6_MULTICAST_ADDR_0',['../lwip_2prot_2ethernet_8h.html#a8ebe93c6ad2d743e6c952539257679b6',1,'ethernet.h']]],
+  ['llipaddr',['llipaddr',['../structautoip.html#a13b5da8a86839b4cd9bd9f5400ac9dc7',1,'autoip']]],
+  ['local_5fip',['local_ip',['../structtcp__pcb__listen.html#a8a4f7b0551a0c6926a08ea5b6b3d5987',1,'tcp_pcb_listen::local_ip()'],['../structtcp__pcb.html#a0c4f101d55debee0d8fad86a7eb4f76f',1,'tcp_pcb::local_ip()'],['../structudp__pcb.html#a6160ea5e52f0d33e51b16b853ea1cd63',1,'udp_pcb::local_ip()']]],
+  ['local_5fport',['local_port',['../structudp__pcb.html#a8cc805631142eefc5593ae8ba3302d7c',1,'udp_pcb']]],
+  ['lock_5ftcpip_5fcore',['LOCK_TCPIP_CORE',['../tcpip_8h.html#a4700525e737fc025fea4887b172e0c95',1,'LOCK_TCPIP_CORE():&#160;tcpip.h'],['../tcpip_8c.html#acd7be2108e9a47fd8f1ab0a49f76241d',1,'lock_tcpip_core():&#160;tcpip.c'],['../tcpip_8h.html#acd7be2108e9a47fd8f1ab0a49f76241d',1,'lock_tcpip_core():&#160;tcpip.c']]],
+  ['lowpan6_2ec',['lowpan6.c',['../lowpan6_8c.html',1,'']]],
+  ['lowpan6_2eh',['lowpan6.h',['../lowpan6_8h.html',1,'']]],
+  ['lowpan6_5fble_2ec',['lowpan6_ble.c',['../lowpan6__ble_8c.html',1,'']]],
+  ['lowpan6_5fble_2eh',['lowpan6_ble.h',['../lowpan6__ble_8h.html',1,'']]],
+  ['lowpan6_5fcalc_5fcrc',['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_5fcommon_2ec',['lowpan6_common.c',['../lowpan6__common_8c.html',1,'']]],
+  ['lowpan6_5fcommon_2eh',['lowpan6_common.h',['../lowpan6__common_8h.html',1,'']]],
+  ['lowpan6_5fcontext',['lowpan6_context',['../structlowpan6__ieee802154__data.html#a190c9c06dfe1075abb7399f99553b507',1,'lowpan6_ieee802154_data']]],
+  ['lowpan6_5fieee802154_5fdata',['lowpan6_ieee802154_data',['../structlowpan6__ieee802154__data.html',1,'']]],
+  ['lowpan6_5finput',['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_5flink_5faddr',['lowpan6_link_addr',['../structlowpan6__link__addr.html',1,'']]],
+  ['lowpan6_5fopts_2eh',['lowpan6_opts.h',['../lowpan6__opts_8h.html',1,'']]],
+  ['lowpan6_5foutput',['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_5freass_5fhelper',['lowpan6_reass_helper',['../structlowpan6__reass__helper.html',1,'']]],
+  ['lowpan6_5fset_5fcontext',['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',['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',['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',['lowpan6_tmr',['../lowpan6_8h.html#ac8c3a4612aeb23f65e55c18faf5ad7d7',1,'lowpan6_tmr(void):&#160;lowpan6.c'],['../lowpan6_8c.html#ac8c3a4612aeb23f65e55c18faf5ad7d7',1,'lowpan6_tmr(void):&#160;lowpan6.c']]],
+  ['lowpan6_5ftmr_5finterval',['LOWPAN6_TMR_INTERVAL',['../lowpan6_8h.html#aa258ae16a937c40333c8f97a7f236797',1,'lowpan6.h']]],
+  ['lwip',['lwIP',['../group__lwip.html',1,'']]],
+  ['lwip_5f6lowpan_5f802154_5fhw_5fcrc',['LWIP_6LOWPAN_802154_HW_CRC',['../lowpan6__opts_8h.html#ae5bb9b8d695caec08930073edc7c6175',1,'lowpan6_opts.h']]],
+  ['lwip_5f6lowpan_5fcalc_5fcrc',['LWIP_6LOWPAN_CALC_CRC',['../lowpan6__opts_8h.html#ad20840e31a0a6eeec8666e4d4a979f43',1,'lowpan6_opts.h']]],
+  ['lwip_5f6lowpan_5finfer_5fshort_5faddress',['LWIP_6LOWPAN_INFER_SHORT_ADDRESS',['../lowpan6__opts_8h.html#a6a542cd72a6270b7231b8b93f8041207',1,'lowpan6_opts.h']]],
+  ['lwip_5f6lowpan_5fiphc',['LWIP_6LOWPAN_IPHC',['../lowpan6__opts_8h.html#a0f178a86d02e0ba4168cafe3de5f3afa',1,'lowpan6_opts.h']]],
+  ['lwip_5f6lowpan_5fnum_5fcontexts',['LWIP_6LOWPAN_NUM_CONTEXTS',['../lowpan6__opts_8h.html#a4ffa89f39abf93cc599f78c5a8bb0a4a',1,'lowpan6_opts.h']]],
+  ['lwip_5falignment_5fcast',['LWIP_ALIGNMENT_CAST',['../group__compiler__abstraction.html#gaade87973d72135b0b3afccfff4f62eb8',1,'arch.h']]],
+  ['lwip_5fallow_5fmem_5ffree_5ffrom_5fother_5fcontext',['LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT',['../group__lwip__opts__mem.html#ga0a3ef6098813c103e5aba07da76e15e2',1,'opt.h']]],
+  ['lwip_5faltcp',['LWIP_ALTCP',['../group__lwip__opts__tcp.html#ga26dee0e5d9c51b1dda0adad29c770a77',1,'opt.h']]],
+  ['lwip_5faltcp_5ftls',['LWIP_ALTCP_TLS',['../group__lwip__opts__tcp.html#gab03ba0306cf0a99ccce3d100142f60c8',1,'opt.h']]],
+  ['lwip_5faltcp_5ftls_5fmbedtls',['LWIP_ALTCP_TLS_MBEDTLS',['../altcp__tls__mbedtls__opts_8h.html#ac8dbfe10a4a9a64c1e2c62ea97e48639',1,'altcp_tls_mbedtls_opts.h']]],
+  ['lwip_5farp',['LWIP_ARP',['../group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87',1,'opt.h']]],
+  ['lwip_5farp_5ffilter_5fnetif',['LWIP_ARP_FILTER_NETIF',['../netif_2ethernet_8h.html#a1ecae0406a3b714c02b632379f26a365',1,'ethernet.h']]],
+  ['lwip_5fassert_5fcore_5flocked',['LWIP_ASSERT_CORE_LOCKED',['../group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75',1,'opt.h']]],
+  ['lwip_5fautoip',['LWIP_AUTOIP',['../group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069',1,'opt.h']]],
+  ['lwip_5fautoip_5fcreate_5fseed_5faddr',['LWIP_AUTOIP_CREATE_SEED_ADDR',['../autoip_8c.html#acec75069f6e6ecbe200c5691e56ecd43',1,'autoip.c']]],
+  ['lwip_5fautoip_5frand',['LWIP_AUTOIP_RAND',['../autoip_8c.html#a634535156cc1a8cf9f04d3d5c74f8a59',1,'autoip.c']]],
+  ['lwip_5fbroadcast_5fping',['LWIP_BROADCAST_PING',['../group__lwip__opts__icmp.html#ga8088cb56d1a84fe554b11bc15d84b2b9',1,'opt.h']]],
+  ['lwip_5fchecksum_5fctrl_5fper_5fnetif',['LWIP_CHECKSUM_CTRL_PER_NETIF',['../group__lwip__opts__checksum.html#ga3ecc5246a0c6ca5aed56c2d7899c1004',1,'opt.h']]],
+  ['lwip_5fchecksum_5fon_5fcopy',['LWIP_CHECKSUM_ON_COPY',['../group__lwip__opts__checksum.html#ga9f60183f0442bdbeefd6b395c6647613',1,'opt.h']]],
+  ['lwip_5fcompat_5fmutex',['LWIP_COMPAT_MUTEX',['../sys_8h.html#a7bada49634cd3b28b28bdcedd763a1e6',1,'sys.h']]],
+  ['lwip_5fcompat_5fsockets',['LWIP_COMPAT_SOCKETS',['../group__lwip__opts__socket.html#gafed2811f031822ec5afa1ee211fb7447',1,'opt.h']]],
+  ['lwip_5fconst_5fcast',['LWIP_CONST_CAST',['../group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72',1,'arch.h']]],
+  ['lwip_5fcyclic_5ftimer',['lwip_cyclic_timer',['../structlwip__cyclic__timer.html',1,'']]],
+  ['lwip_5fcyclic_5ftimer_5fhandler',['lwip_cyclic_timer_handler',['../timeouts_8h.html#a985c5d366b62bd179195e093ffcb7ecd',1,'timeouts.h']]],
+  ['lwip_5fcyclic_5ftimers',['lwip_cyclic_timers',['../timeouts_8c.html#addc06ab816f051a0fe6f280972eed142',1,'lwip_cyclic_timers():&#160;timeouts.c'],['../timeouts_8h.html#addc06ab816f051a0fe6f280972eed142',1,'lwip_cyclic_timers():&#160;timeouts.c']]],
+  ['lwip_5fdbg_5ffresh',['LWIP_DBG_FRESH',['../group__debugging__levels.html#ga7d44d1804fa5e747aed86816e2a6cae0',1,'debug.h']]],
+  ['lwip_5fdbg_5fhalt',['LWIP_DBG_HALT',['../group__debugging__levels.html#gab0a296414983155b30ad51871606b90f',1,'debug.h']]],
+  ['lwip_5fdbg_5flevel_5fall',['LWIP_DBG_LEVEL_ALL',['../group__debugging__levels.html#ga8ebaeb006b43f55897f3196b3617dc87',1,'debug.h']]],
+  ['lwip_5fdbg_5flevel_5fserious',['LWIP_DBG_LEVEL_SERIOUS',['../group__debugging__levels.html#ga0269bdc51f1e8a5ecf9af72c6e1c996c',1,'debug.h']]],
+  ['lwip_5fdbg_5flevel_5fsevere',['LWIP_DBG_LEVEL_SEVERE',['../group__debugging__levels.html#gaab41143277cd38047b6660d90e9cec3b',1,'debug.h']]],
+  ['lwip_5fdbg_5flevel_5fwarning',['LWIP_DBG_LEVEL_WARNING',['../group__debugging__levels.html#ga77c491e468bf7d9a1bc48430c1866a96',1,'debug.h']]],
+  ['lwip_5fdbg_5fmin_5flevel',['LWIP_DBG_MIN_LEVEL',['../group__lwip__opts__debugmsg.html#ga2043f599515774f8e571ba185dbcb9e7',1,'opt.h']]],
+  ['lwip_5fdbg_5foff',['LWIP_DBG_OFF',['../group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1',1,'debug.h']]],
+  ['lwip_5fdbg_5fon',['LWIP_DBG_ON',['../group__debugging__levels.html#ga9e31b7cbbc8f46af8e62b548079acd4e',1,'debug.h']]],
+  ['lwip_5fdbg_5fstate',['LWIP_DBG_STATE',['../group__debugging__levels.html#ga511ee3deb3240635f5ec6a1709c6d741',1,'debug.h']]],
+  ['lwip_5fdbg_5ftrace',['LWIP_DBG_TRACE',['../group__debugging__levels.html#ga988147559b78642ac881815b66023646',1,'debug.h']]],
+  ['lwip_5fdbg_5ftypes_5fon',['LWIP_DBG_TYPES_ON',['../group__lwip__opts__debugmsg.html#gac095d0e53f5eb5b326b2cccfd071d93d',1,'opt.h']]],
+  ['lwip_5fdebug',['LWIP_DEBUG',['../debug_8h.html#a957d947c94fda9b85d4aee0aab72952a',1,'debug.h']]],
+  ['lwip_5fdeclare_5fmemory_5faligned',['LWIP_DECLARE_MEMORY_ALIGNED',['../group__compiler__abstraction.html#ga651bb349041669fe717b19f127ef16c0',1,'arch.h']]],
+  ['lwip_5fdhcp',['LWIP_DHCP',['../group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9',1,'opt.h']]],
+  ['lwip_5fdhcp6_5fget_5fntp_5fsrv',['LWIP_DHCP6_GET_NTP_SRV',['../group__lwip__opts__dhcpv6.html#ga5d08f76a7472daa7bcfe17343243bd77',1,'opt.h']]],
+  ['lwip_5fdhcp6_5fmax_5fdns_5fservers',['LWIP_DHCP6_MAX_DNS_SERVERS',['../group__lwip__opts__dhcpv6.html#ga92c3bc242ad20a5f398c45d332864a29',1,'opt.h']]],
+  ['lwip_5fdhcp6_5fmax_5fntp_5fservers',['LWIP_DHCP6_MAX_NTP_SERVERS',['../group__lwip__opts__dhcpv6.html#gaf3ac8e15d7a67429a02bc2317e16bcfe',1,'opt.h']]],
+  ['lwip_5fdhcp_5fautoip_5fcoop',['LWIP_DHCP_AUTOIP_COOP',['../group__lwip__opts__autoip.html#ga1a91e18dbb9777bc6e3963f52cb5f9fe',1,'opt.h']]],
+  ['lwip_5fdhcp_5fautoip_5fcoop_5ftries',['LWIP_DHCP_AUTOIP_COOP_TRIES',['../group__lwip__opts__autoip.html#ga4ff3f941b4c71a04b0c30fbee5b198c2',1,'opt.h']]],
+  ['lwip_5fdhcp_5fbootp_5ffile',['LWIP_DHCP_BOOTP_FILE',['../group__lwip__opts__dhcp.html#ga3c2983cbd228011dd3e18cb417e7e423',1,'opt.h']]],
+  ['lwip_5fdhcp_5fget_5fntp_5fsrv',['LWIP_DHCP_GET_NTP_SRV',['../group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83',1,'opt.h']]],
+  ['lwip_5fdhcp_5fmax_5fdns_5fservers',['LWIP_DHCP_MAX_DNS_SERVERS',['../group__lwip__opts__dhcp.html#ga60ccc20fbb08be24b5d5f599dd47a6a6',1,'opt.h']]],
+  ['lwip_5fdhcp_5fmax_5fntp_5fservers',['LWIP_DHCP_MAX_NTP_SERVERS',['../group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2',1,'opt.h']]],
+  ['lwip_5fdns',['LWIP_DNS',['../group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646',1,'opt.h']]],
+  ['lwip_5fdns_5fapi_5fhostent_5fstorage',['LWIP_DNS_API_HOSTENT_STORAGE',['../netdb_8c.html#a768ab8ead892d6454709680340cd070e',1,'netdb.c']]],
+  ['lwip_5fdns_5fsecure',['LWIP_DNS_SECURE',['../group__lwip__opts__dns.html#ga8979c30dfbfde609d5139f80aabdfcc5',1,'opt.h']]],
+  ['lwip_5fdns_5fsupport_5fmdns_5fqueries',['LWIP_DNS_SUPPORT_MDNS_QUERIES',['../group__lwip__opts__dns.html#gafcbde5706a70ace562bd1f7d2d6f77cb',1,'opt.h']]],
+  ['lwip_5fethernet',['LWIP_ETHERNET',['../group__lwip__opts__arp.html#ga30e02dc217cc2995d0fd241d510c904f',1,'opt.h']]],
+  ['lwip_5fevent_5fapi',['LWIP_EVENT_API',['../group__lwip__opts__tcp.html#ga39f76e811117155be8525bb386ecddb7',1,'opt.h']]],
+  ['lwip_5ffcntl',['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',['LWIP_FIONREAD_LINUXMODE',['../group__lwip__opts__socket.html#ga0543eea2abe390d0bdc843c33debd762',1,'opt.h']]],
+  ['lwip_5ffreeaddrinfo',['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',['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',['lwip_gethostbyname',['../netdb_8c.html#a8adc6d35c068a073369edde71c678cbc',1,'lwip_gethostbyname(const char *name):&#160;netdb.c'],['../lwip_2netdb_8h.html#a8adc6d35c068a073369edde71c678cbc',1,'lwip_gethostbyname(const char *name):&#160;netdb.c']]],
+  ['lwip_5fgethostbyname_5fr',['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',['LWIP_HAVE_LOOPIF',['../group__lwip__opts__loop.html#gaa2b1f736373cd896e212644aa453fbaf',1,'opt.h']]],
+  ['lwip_5fhook_5fdhcp6_5fappend_5foptions',['LWIP_HOOK_DHCP6_APPEND_OPTIONS',['../group__lwip__opts__hooks.html#ga4068b3313e32f711ba016215fc2c886a',1,'opt.h']]],
+  ['lwip_5fhook_5fdhcp_5fappend_5foptions',['LWIP_HOOK_DHCP_APPEND_OPTIONS',['../group__lwip__opts__hooks.html#ga40e6c9aba06e66e5df1b4ca18329f9b4',1,'opt.h']]],
+  ['lwip_5fhook_5fdhcp_5fparse_5foption',['LWIP_HOOK_DHCP_PARSE_OPTION',['../group__lwip__opts__hooks.html#gafbbbc574863c0f88988936bd1434f2d2',1,'opt.h']]],
+  ['lwip_5fhook_5fetharp_5fget_5fgw',['LWIP_HOOK_ETHARP_GET_GW',['../group__lwip__opts__hooks.html#ga2b76f127325fd5ca8b80077a4b6160b1',1,'opt.h']]],
+  ['lwip_5fhook_5ffilename',['LWIP_HOOK_FILENAME',['../group__lwip__opts__hooks.html#ga11ac9d637cb6afc0a32e8da7f51d0c0d',1,'opt.h']]],
+  ['lwip_5fhook_5fip4_5fcanforward',['LWIP_HOOK_IP4_CANFORWARD',['../group__lwip__opts__hooks.html#gaed848a98dbb5c8856a27e379986ea70d',1,'opt.h']]],
+  ['lwip_5fhook_5fip4_5finput',['LWIP_HOOK_IP4_INPUT',['../group__lwip__opts__hooks.html#ga9124237c28e2f18f3b28d5be09e9ccb6',1,'opt.h']]],
+  ['lwip_5fhook_5fip4_5froute',['LWIP_HOOK_IP4_ROUTE',['../group__lwip__opts__hooks.html#ga5d1061ad722a73012a28dbaf0f169b70',1,'opt.h']]],
+  ['lwip_5fhook_5fip4_5froute_5fsrc',['LWIP_HOOK_IP4_ROUTE_SRC',['../group__lwip__opts__hooks.html#gaa410d9cbe1d4fa4c8a7f49af7b501024',1,'opt.h']]],
+  ['lwip_5fhook_5fip6_5finput',['LWIP_HOOK_IP6_INPUT',['../group__lwip__opts__hooks.html#gaccbdd3d0250f7176dcd799ca06007f20',1,'opt.h']]],
+  ['lwip_5fhook_5fip6_5froute',['LWIP_HOOK_IP6_ROUTE',['../group__lwip__opts__hooks.html#ga8245a4bc7ffb172e3bf32276f9d126ce',1,'opt.h']]],
+  ['lwip_5fhook_5fmemp_5favailable',['LWIP_HOOK_MEMP_AVAILABLE',['../group__lwip__opts__hooks.html#ga13e90672158221b40f8b12bf9d8b721f',1,'opt.h']]],
+  ['lwip_5fhook_5fnd6_5fget_5fgw',['LWIP_HOOK_ND6_GET_GW',['../group__lwip__opts__hooks.html#ga287544c3d74bc2a2d645bddbbc4fbdd0',1,'opt.h']]],
+  ['lwip_5fhook_5fnetconn_5fexternal_5fresolve',['LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE',['../group__lwip__opts__hooks.html#gae35e4b7374868dc748b12dedb8f807e5',1,'opt.h']]],
+  ['lwip_5fhook_5fsockets_5fgetsockopt',['LWIP_HOOK_SOCKETS_GETSOCKOPT',['../group__lwip__opts__hooks.html#gabdaeb09ac9f441934e21a087544a1af1',1,'opt.h']]],
+  ['lwip_5fhook_5fsockets_5fsetsockopt',['LWIP_HOOK_SOCKETS_SETSOCKOPT',['../group__lwip__opts__hooks.html#ga14ea9210c09da4dd33bc85bd8a01b48a',1,'opt.h']]],
+  ['lwip_5fhook_5ftcp_5finpacket_5fpcb',['LWIP_HOOK_TCP_INPACKET_PCB',['../group__lwip__opts__hooks.html#gabed8b1cda4aba2d108fa62cdd74895a2',1,'opt.h']]],
+  ['lwip_5fhook_5ftcp_5fisn',['LWIP_HOOK_TCP_ISN',['../group__lwip__opts__hooks.html#ga078d203053911cf3af178392700386a4',1,'opt.h']]],
+  ['lwip_5fhook_5ftcp_5fout_5fadd_5ftcpopts',['LWIP_HOOK_TCP_OUT_ADD_TCPOPTS',['../group__lwip__opts__hooks.html#ga0ef31b749307b63c06633645d4de21f0',1,'opt.h']]],
+  ['lwip_5fhook_5ftcp_5fout_5ftcpopt_5flength',['LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH',['../group__lwip__opts__hooks.html#ga31c0694abe4eedf3ff039b7073c2293f',1,'opt.h']]],
+  ['lwip_5fhook_5funknown_5feth_5fprotocol',['LWIP_HOOK_UNKNOWN_ETH_PROTOCOL',['../group__lwip__opts__hooks.html#ga6cc92f5101dd7a0420e18e1f2101abf4',1,'opt.h']]],
+  ['lwip_5fhook_5fvlan_5fcheck',['LWIP_HOOK_VLAN_CHECK',['../group__lwip__opts__hooks.html#ga2f020543772368f8f4355f50f24c86a9',1,'opt.h']]],
+  ['lwip_5fhook_5fvlan_5fset',['LWIP_HOOK_VLAN_SET',['../group__lwip__opts__hooks.html#ga2b6e450b4934b95df9b9a9d2b9a4d57e',1,'opt.h']]],
+  ['lwip_5fhtonl',['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',['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',['LWIP_HTTPC_HAVE_FILE_IO',['../group__httpc.html#ga055b9a8bf8f4e2c18c621471773fa66c',1,'http_client.h']]],
+  ['lwip_5fhttpd_5fabort_5fon_5fclose_5fmem_5ferror',['LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR',['../group__httpd__opts.html#ga0ff20ebc4ab50d4aa6151c3241dacb3a',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fcgi',['LWIP_HTTPD_CGI',['../group__httpd__opts.html#gafb28f7c5fee75f013a199d427452372c',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fcgi_5fssi',['LWIP_HTTPD_CGI_SSI',['../group__httpd__opts.html#gad3960bf65731bd0f1341867664afe860',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fcustom_5ffiles',['LWIP_HTTPD_CUSTOM_FILES',['../group__httpd__opts.html#gadadb70f5663cdf004bf879e3b5d326bd',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fdynamic_5ffile_5fread',['LWIP_HTTPD_DYNAMIC_FILE_READ',['../group__httpd__opts.html#ga1ee8d7c975c7e3d1c9d9dd9b43660c79',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fdynamic_5fheaders',['LWIP_HTTPD_DYNAMIC_HEADERS',['../group__httpd__opts.html#ga75932fc5eeb9abeddfdaf8413574c6d7',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5ffile_5fstate',['LWIP_HTTPD_FILE_STATE',['../group__httpd__opts.html#gaedd0fa3d356170d8ca3557acb410fd7c',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5ffs_5fasync_5fread',['LWIP_HTTPD_FS_ASYNC_READ',['../group__httpd__opts.html#ga51cb673cb5cc362acc409f23c1e0a331',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fkill_5fold_5fon_5fconnections_5fexceeded',['LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED',['../group__httpd__opts.html#ga0d5074965efd40786182287895feb691',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fmax_5freq_5flength',['LWIP_HTTPD_MAX_REQ_LENGTH',['../group__httpd__opts.html#ga30dc71c59f3904df7daaf293f74f91f8',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fmax_5frequest_5furi_5flen',['LWIP_HTTPD_MAX_REQUEST_URI_LEN',['../group__httpd__opts.html#gaca4ef53e7a9abbd8d4bd8bc1ba7b486a',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fomit_5fheader_5ffor_5fextensionless_5furi',['LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI',['../group__httpd__opts.html#ga82a030ce2ecdcf741b02b7be41c012b3',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fpost_5fmax_5fresponse_5furi_5flen',['LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN',['../group__httpd__opts.html#gaa27f7c5450392d10aeed033ca878cce3',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5freq_5fbufsize',['LWIP_HTTPD_REQ_BUFSIZE',['../group__httpd__opts.html#ga8dbe61a35228da0e7365a088197191b8',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5freq_5fqueuelen',['LWIP_HTTPD_REQ_QUEUELEN',['../group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fssi',['LWIP_HTTPD_SSI',['../group__httpd__opts.html#gacb70e0cdd30a940f8bce681c6cc63949',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fssi_5fby_5ffile_5fextension',['LWIP_HTTPD_SSI_BY_FILE_EXTENSION',['../group__httpd__opts.html#gaba2d4cfe4c1f5bdbe37b339084a7d466',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fssi_5finclude_5ftag',['LWIP_HTTPD_SSI_INCLUDE_TAG',['../group__httpd__opts.html#ga975961a6d22d1a077118fb85dfec809a',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fssi_5fmultipart',['LWIP_HTTPD_SSI_MULTIPART',['../group__httpd__opts.html#ga3167d52d20cf90857e2c809b92458bf0',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fssi_5fraw',['LWIP_HTTPD_SSI_RAW',['../group__httpd__opts.html#ga520858778b84d4d2fa125294c0f119e5',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fsupport_5f11_5fkeepalive',['LWIP_HTTPD_SUPPORT_11_KEEPALIVE',['../group__httpd__opts.html#ga6f78487bc829f7f98274f1264020045e',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fsupport_5fextstatus',['LWIP_HTTPD_SUPPORT_EXTSTATUS',['../group__httpd__opts.html#ga85ebddbc4236b1e31bfa68fa163f9b07',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fsupport_5fpost',['LWIP_HTTPD_SUPPORT_POST',['../group__httpd__opts.html#gacbea06ce33933e3ef2f2f1834a21cc2c',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fsupport_5frequestlist',['LWIP_HTTPD_SUPPORT_REQUESTLIST',['../group__httpd__opts.html#ga0bd0f9a89423fb3bbfea4e4c6141ae43',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fsupport_5fv09',['LWIP_HTTPD_SUPPORT_V09',['../group__httpd__opts.html#ga7a8f4ab787b6fb8482c8a36c9fd0c7dd',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5ftiming',['LWIP_HTTPD_TIMING',['../group__httpd__opts.html#ga054db3f080715942967969c6ae30bb6a',1,'httpd_opts.h']]],
+  ['lwip_5fiana_5fhwtype',['lwip_iana_hwtype',['../group__iana.html#ga3d2bbfcb56c8adf3be8c8d12868cecfe',1,'iana.h']]],
+  ['lwip_5fiana_5fhwtype_5fethernet',['LWIP_IANA_HWTYPE_ETHERNET',['../group__iana.html#gga3d2bbfcb56c8adf3be8c8d12868cecfea89e82e6ac55811bb26fe66ec029f2a0c',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fdhcp_5fclient',['LWIP_IANA_PORT_DHCP_CLIENT',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a9fcae1f16758e1ac35dab343fc897f40',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fdhcp_5fserver',['LWIP_IANA_PORT_DHCP_SERVER',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ac70ae96c985cf3660e26aa496094916d',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fhttp',['LWIP_IANA_PORT_HTTP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fhttps',['LWIP_IANA_PORT_HTTPS',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fmdns',['LWIP_IANA_PORT_MDNS',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a839da325f45916d7b27d53d5e5e97dc6',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fmqtt',['LWIP_IANA_PORT_MQTT',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fnetbios',['LWIP_IANA_PORT_NETBIOS',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae1cf6eaab024b31aff5bf407d38e0ede',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fnumber',['lwip_iana_port_number',['../group__iana.html#gac9396d90585e49e9a287179bf5aa9ba0',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsecure_5fmqtt',['LWIP_IANA_PORT_SECURE_MQTT',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsmtp',['LWIP_IANA_PORT_SMTP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae2645895203ca3c54005afad053a813c',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsmtps',['LWIP_IANA_PORT_SMTPS',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a88f8872246977c6e24c617266ada1a3b',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsnmp',['LWIP_IANA_PORT_SNMP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aeb10a37f0c48e053b138f65b843c45d3',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsnmp_5ftrap',['LWIP_IANA_PORT_SNMP_TRAP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aff60c0d3e8eca210b7e4faca3491f4a8',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsntp',['LWIP_IANA_PORT_SNTP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5ftftp',['LWIP_IANA_PORT_TFTP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050',1,'iana.h']]],
+  ['lwip_5ficmp',['LWIP_ICMP',['../group__lwip__opts__icmp.html#gae4d45345c3ab8e5a355fda1d8d24fca6',1,'opt.h']]],
+  ['lwip_5ficmp6',['LWIP_ICMP6',['../group__lwip__opts__icmp6.html#ga65ac8bcbad242cba3a2b557e1574b21f',1,'opt.h']]],
+  ['lwip_5ficmp6_5fdatasize',['LWIP_ICMP6_DATASIZE',['../group__lwip__opts__icmp6.html#gaa88c55e37e5d7b865b91a9399313bbbf',1,'opt.h']]],
+  ['lwip_5ficmp6_5fhl',['LWIP_ICMP6_HL',['../group__lwip__opts__icmp6.html#ga82193577b4045e1ac1533c4341a2bd79',1,'opt.h']]],
+  ['lwip_5ficmp_5fecho_5fcheck_5finput_5fpbuf_5flen',['LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN',['../icmp_8c.html#a6b9fd6be0a7dcf301bc86b9e96e3857e',1,'icmp.c']]],
+  ['lwip_5fieee_5feth_5ftype',['lwip_ieee_eth_type',['../group__ieee.html#gab3a7b97666b100584972d158acbbd1f4',1,'ieee.h']]],
+  ['lwip_5fif_5findextoname',['lwip_if_indextoname',['../group__if__api.html#gac68ad9ef70eb869525e0a1cc818f056b',1,'lwip_if_indextoname(unsigned int ifindex, char *ifname):&#160;if_api.c'],['../group__if__api.html#gac68ad9ef70eb869525e0a1cc818f056b',1,'lwip_if_indextoname(unsigned int ifindex, char *ifname):&#160;if_api.c']]],
+  ['lwip_5fif_5fnametoindex',['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',['LWIP_IGMP',['../group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923',1,'opt.h']]],
+  ['lwip_5finit',['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',['LWIP_INLINE_IP_CHKSUM',['../ip4_8c.html#a9652ce304f893f6245c6ba9daea0a30f',1,'ip4.c']]],
+  ['lwip_5fip_5faddr_5ftype',['lwip_ip_addr_type',['../group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c',1,'ip_addr.h']]],
+  ['lwip_5fip_5fcheck_5fpbuf_5fref_5fcount_5ffor_5ftx',['LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX',['../ip_8h.html#a355679dba1c0d8ef07ce3abcd28e3063',1,'ip.h']]],
+  ['lwip_5fipv4',['LWIP_IPV4',['../group__lwip__opts__ipv4.html#ga429e811a80ebb5157e14a854870c4410',1,'opt.h']]],
+  ['lwip_5fipv6',['LWIP_IPV6',['../group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f',1,'opt.h']]],
+  ['lwip_5fipv6_5faddress_5flifetimes',['LWIP_IPV6_ADDRESS_LIFETIMES',['../group__lwip__opts__ipv6.html#ga2c0127fca1073ad3f0a1e53f00ea8858',1,'opt.h']]],
+  ['lwip_5fipv6_5fautoconfig',['LWIP_IPV6_AUTOCONFIG',['../group__lwip__opts__ipv6.html#ga580039bf2baf49fcb9e504e5d2b40a03',1,'opt.h']]],
+  ['lwip_5fipv6_5fdhcp6',['LWIP_IPV6_DHCP6',['../group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6',1,'opt.h']]],
+  ['lwip_5fipv6_5fdhcp6_5fstateful',['LWIP_IPV6_DHCP6_STATEFUL',['../group__lwip__opts__dhcpv6.html#ga3fc9dbe8feae61621cac4952ac28e155',1,'opt.h']]],
+  ['lwip_5fipv6_5fdhcp6_5fstateless',['LWIP_IPV6_DHCP6_STATELESS',['../group__lwip__opts__dhcpv6.html#ga8d6bab14d580d2136430319aab6d7930',1,'opt.h']]],
+  ['lwip_5fipv6_5fdup_5fdetect_5fattempts',['LWIP_IPV6_DUP_DETECT_ATTEMPTS',['../group__lwip__opts__ipv6.html#gad8489522d34f37e42b4001bab3781bcb',1,'opt.h']]],
+  ['lwip_5fipv6_5fforward',['LWIP_IPV6_FORWARD',['../group__lwip__opts__ipv6.html#gac96c5802de6c75dd62ab38cff6d16a32',1,'opt.h']]],
+  ['lwip_5fipv6_5ffrag',['LWIP_IPV6_FRAG',['../group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3',1,'opt.h']]],
+  ['lwip_5fipv6_5fmld',['LWIP_IPV6_MLD',['../group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528',1,'opt.h']]],
+  ['lwip_5fipv6_5fnum_5faddresses',['LWIP_IPV6_NUM_ADDRESSES',['../group__lwip__opts__ipv6.html#ga16c1b672604bfb0a66a6aeeb854589d3',1,'opt.h']]],
+  ['lwip_5fipv6_5freass',['LWIP_IPV6_REASS',['../group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864',1,'opt.h']]],
+  ['lwip_5fipv6_5fscope_5ftype',['lwip_ipv6_scope_type',['../group__ip6__zones.html#ga1993c4b6a297b6e92d80a9ce46ddedfe',1,'ip6_zone.h']]],
+  ['lwip_5fipv6_5fscopes',['LWIP_IPV6_SCOPES',['../group__lwip__opts__ipv6.html#ga91d1e630059df3b3a296e2b6ff7aead5',1,'opt.h']]],
+  ['lwip_5fipv6_5fscopes_5fdebug',['LWIP_IPV6_SCOPES_DEBUG',['../group__lwip__opts__ipv6.html#ga623ef29d27d98fb7be8732730a5ddf4b',1,'opt.h']]],
+  ['lwip_5fipv6_5fsend_5frouter_5fsolicit',['LWIP_IPV6_SEND_ROUTER_SOLICIT',['../group__lwip__opts__ipv6.html#ga273ed2e1a4e6a43713a0e4a06a34ee5c',1,'opt.h']]],
+  ['lwip_5fitoa',['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',['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',['LWIP_LOOPBACK_MAX_PBUFS',['../group__lwip__opts__loop.html#gaacc3ad5d0a771d45fb0a3e3a09b1dbea',1,'opt.h']]],
+  ['lwip_5floopif_5fmulticast',['LWIP_LOOPIF_MULTICAST',['../group__lwip__opts__loop.html#ga10a878b390c2fbe421d82502001c7300',1,'opt.h']]],
+  ['lwip_5flowpan6_5f802154_5fdebug',['LWIP_LOWPAN6_802154_DEBUG',['../lowpan6__opts_8h.html#acf9a44be56d5dca9e45f644571d66f58',1,'lowpan6_opts.h']]],
+  ['lwip_5flowpan6_5fdebug',['LWIP_LOWPAN6_DEBUG',['../lowpan6__opts_8h.html#ae90ebb32999c6df5cc83705e133e1754',1,'lowpan6_opts.h']]],
+  ['lwip_5flowpan6_5fdecompression_5fdebug',['LWIP_LOWPAN6_DECOMPRESSION_DEBUG',['../lowpan6__opts_8h.html#a7f4db0bd3dbe36a19efbd24cd8b7fcf0',1,'lowpan6_opts.h']]],
+  ['lwip_5flowpan6_5fip_5fcompressed_5fdebug',['LWIP_LOWPAN6_IP_COMPRESSED_DEBUG',['../lowpan6__opts_8h.html#a231bc758484376dfd2ded6931c462df8',1,'lowpan6_opts.h']]],
+  ['lwip_5fmakeu32',['LWIP_MAKEU32',['../def_8h.html#acf56d3da92a0a7a8a62a617e793e948c',1,'def.h']]],
+  ['lwip_5fmark_5ftcpip_5fthread',['LWIP_MARK_TCPIP_THREAD',['../group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e',1,'opt.h']]],
+  ['lwip_5fmem_5falign',['LWIP_MEM_ALIGN',['../group__compiler__abstraction.html#gaa8e8724eb1c220cbbb90de9e175ce1dc',1,'arch.h']]],
+  ['lwip_5fmem_5falign_5fbuffer',['LWIP_MEM_ALIGN_BUFFER',['../group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e',1,'arch.h']]],
+  ['lwip_5fmem_5falign_5fsize',['LWIP_MEM_ALIGN_SIZE',['../group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18',1,'arch.h']]],
+  ['lwip_5fmempool_5falloc',['LWIP_MEMPOOL_ALLOC',['../group__mempool.html#ga5e2498f6c17746c1fe7153de5f7f275a',1,'memp.h']]],
+  ['lwip_5fmempool_5fdeclare',['LWIP_MEMPOOL_DECLARE',['../group__mempool.html#ga5b1fb3ce7942432d87cc948b1c5ed6cb',1,'memp.h']]],
+  ['lwip_5fmempool_5ffree',['LWIP_MEMPOOL_FREE',['../group__mempool.html#gaa43d114dd702fbd8f1db18474ea93a04',1,'memp.h']]],
+  ['lwip_5fmempool_5finit',['LWIP_MEMPOOL_INIT',['../group__mempool.html#ga60b51c06d276f525b35d8b7abd4dcb41',1,'memp.h']]],
+  ['lwip_5fmempool_5fprototype',['LWIP_MEMPOOL_PROTOTYPE',['../group__mempool.html#ga92fc8c29d0e2654f2a2ecc43b2b7fb13',1,'memp.h']]],
+  ['lwip_5fmib2_5fcallbacks',['LWIP_MIB2_CALLBACKS',['../group__lwip__opts__mib2.html#gad84d6a781880cec19a1ef4b2339fea29',1,'opt.h']]],
+  ['lwip_5fmpu_5fcompatible',['LWIP_MPU_COMPATIBLE',['../group__lwip__opts__lock.html#gae9afcefa5d233372abb9413188dd98c9',1,'opt.h']]],
+  ['lwip_5fmulticast_5fping',['LWIP_MULTICAST_PING',['../group__lwip__opts__icmp.html#gaf77baf0a83b04312eab4c006ef229661',1,'opt.h']]],
+  ['lwip_5fmulticast_5ftx_5foptions',['LWIP_MULTICAST_TX_OPTIONS',['../group__lwip__opts__multicast.html#gab8d7d53247cc62caa76f54b2c5a5df30',1,'opt.h']]],
+  ['lwip_5fnd6_5fallow_5fra_5fupdates',['LWIP_ND6_ALLOW_RA_UPDATES',['../group__lwip__opts__nd6.html#gad35d10353ac7c7d2c8d4b83788cdc6d9',1,'opt.h']]],
+  ['lwip_5fnd6_5fdelay_5ffirst_5fprobe_5ftime',['LWIP_ND6_DELAY_FIRST_PROBE_TIME',['../group__lwip__opts__nd6.html#ga315bd6d4a9d185766dfc3253cd9d7715',1,'opt.h']]],
+  ['lwip_5fnd6_5fmax_5fanycast_5fdelay_5ftime',['LWIP_ND6_MAX_ANYCAST_DELAY_TIME',['../group__lwip__opts__nd6.html#ga960b8973df083fad53ae0eaa79f8c4df',1,'opt.h']]],
+  ['lwip_5fnd6_5fmax_5fmulticast_5fsolicit',['LWIP_ND6_MAX_MULTICAST_SOLICIT',['../group__lwip__opts__nd6.html#ga980909018aed54adc10dd68be3572b30',1,'opt.h']]],
+  ['lwip_5fnd6_5fmax_5fneighbor_5fadvertisement',['LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT',['../group__lwip__opts__nd6.html#ga86ab0cac87cdc7aeff09384ddbaaba2a',1,'opt.h']]],
+  ['lwip_5fnd6_5fmax_5funicast_5fsolicit',['LWIP_ND6_MAX_UNICAST_SOLICIT',['../group__lwip__opts__nd6.html#gafa6f4c2d2c259ab0895fa03a6f08c691',1,'opt.h']]],
+  ['lwip_5fnd6_5fnum_5fdestinations',['LWIP_ND6_NUM_DESTINATIONS',['../group__lwip__opts__nd6.html#gacad118b1ae886e80137a1d4f0fb19672',1,'opt.h']]],
+  ['lwip_5fnd6_5fnum_5fneighbors',['LWIP_ND6_NUM_NEIGHBORS',['../group__lwip__opts__nd6.html#gab2fe15bdb4e0a41f295eb5577b11ad16',1,'opt.h']]],
+  ['lwip_5fnd6_5fnum_5fprefixes',['LWIP_ND6_NUM_PREFIXES',['../group__lwip__opts__nd6.html#gad9cc576b5951f1b5e1c2b0d0bb831d9a',1,'opt.h']]],
+  ['lwip_5fnd6_5fnum_5frouters',['LWIP_ND6_NUM_ROUTERS',['../group__lwip__opts__nd6.html#ga75e81a96148f266c8fad8c0bcab2f36a',1,'opt.h']]],
+  ['lwip_5fnd6_5fqueueing',['LWIP_ND6_QUEUEING',['../group__lwip__opts__nd6.html#ga0757a3c1b5d1563ad2d77228e1d8a60f',1,'opt.h']]],
+  ['lwip_5fnd6_5frdnss_5fmax_5fdns_5fservers',['LWIP_ND6_RDNSS_MAX_DNS_SERVERS',['../group__lwip__opts__nd6.html#gaea4d829c0b52cc6cc28925eee89a7429',1,'opt.h']]],
+  ['lwip_5fnd6_5freachable_5ftime',['LWIP_ND6_REACHABLE_TIME',['../group__lwip__opts__nd6.html#ga269db9d61cdfc2fd3bc7b12c56261c74',1,'opt.h']]],
+  ['lwip_5fnd6_5fretrans_5ftimer',['LWIP_ND6_RETRANS_TIMER',['../group__lwip__opts__nd6.html#ga461abcbeef1d236d1f3201827dd28ad9',1,'opt.h']]],
+  ['lwip_5fnd6_5ftcp_5freachability_5fhints',['LWIP_ND6_TCP_REACHABILITY_HINTS',['../group__lwip__opts__nd6.html#ga9d7cb6fd447ef0f6726f565e2c7509c4',1,'opt.h']]],
+  ['lwip_5fnetbios_5frespond_5fname_5fquery',['LWIP_NETBIOS_RESPOND_NAME_QUERY',['../group__netbiosns__opts.html#gaa9dec8fc3dee5e72fbe9b854437bce84',1,'netbiosns_opts.h']]],
+  ['lwip_5fnetbuf_5frecvinfo',['LWIP_NETBUF_RECVINFO',['../group__lwip__opts__udp.html#ga72021505969c5ce29e972486d7794baa',1,'opt.h']]],
+  ['lwip_5fnetconn',['LWIP_NETCONN',['../group__lwip__opts__netconn.html#ga478041b8544461258f6961bf0f3c1a77',1,'opt.h']]],
+  ['lwip_5fnetconn_5fdo_5faccepted',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['LWIP_NETCONN_FULLDUPLEX',['../group__lwip__opts__netconn.html#ga7bfe8487a3abffdd9d6730977d22c406',1,'opt.h']]],
+  ['lwip_5fnetconn_5fsem_5fper_5fthread',['LWIP_NETCONN_SEM_PER_THREAD',['../group__lwip__opts__netconn.html#ga2543345adf7d2c307df78a54ac2ba8c4',1,'opt.h']]],
+  ['lwip_5fnetif_5fapi',['LWIP_NETIF_API',['../group__lwip__opts__netif.html#gadd45fb65f2d0e6de5a0d14ff9e101b77',1,'opt.h']]],
+  ['lwip_5fnetif_5fext_5fstatus_5fcallback',['LWIP_NETIF_EXT_STATUS_CALLBACK',['../group__lwip__opts__netif.html#ga090482867ba04d442ab5b8ad745c0e1e',1,'opt.h']]],
+  ['lwip_5fnetif_5fhostname',['LWIP_NETIF_HOSTNAME',['../group__lwip__opts__netif.html#gaa714dbfa66822ec4c6111bdb8cf753c1',1,'opt.h']]],
+  ['lwip_5fnetif_5fhwaddrhint',['LWIP_NETIF_HWADDRHINT',['../group__lwip__opts__netif.html#gad1d5e878d94b56ba687cef69be936ad9',1,'opt.h']]],
+  ['lwip_5fnetif_5flink_5fcallback',['LWIP_NETIF_LINK_CALLBACK',['../group__lwip__opts__netif.html#ga1a446932dd927cc4136ba654c13bb97b',1,'opt.h']]],
+  ['lwip_5fnetif_5floopback',['LWIP_NETIF_LOOPBACK',['../group__lwip__opts__loop.html#ga724a0ea765d5a47d026d529725f31c01',1,'opt.h']]],
+  ['lwip_5fnetif_5floopback_5fmultithreading',['LWIP_NETIF_LOOPBACK_MULTITHREADING',['../group__lwip__opts__loop.html#gaa28d13ddd5281b1912276991e7ea58c5',1,'opt.h']]],
+  ['lwip_5fnetif_5fremove_5fcallback',['LWIP_NETIF_REMOVE_CALLBACK',['../group__lwip__opts__netif.html#ga9c942c2e9655b06d4f73c630d30f60bf',1,'opt.h']]],
+  ['lwip_5fnetif_5fstatus_5fcallback',['LWIP_NETIF_STATUS_CALLBACK',['../group__lwip__opts__netif.html#gaffb97d89516c38d3fcb9e44e5d707f36',1,'opt.h']]],
+  ['lwip_5fnetif_5ftx_5fsingle_5fpbuf',['LWIP_NETIF_TX_SINGLE_PBUF',['../group__lwip__opts__netif.html#gabafb9f64a80e51b56c0abbcfc1f7e04e',1,'opt.h']]],
+  ['lwip_5fno_5fctype_5fh',['LWIP_NO_CTYPE_H',['../group__compiler__abstraction.html#ga6871ce1e92ae09cdad39a9b230a3a800',1,'arch.h']]],
+  ['lwip_5fno_5finttypes_5fh',['LWIP_NO_INTTYPES_H',['../group__compiler__abstraction.html#ga5bf52d6f2729d0c8afd365f69d7d4373',1,'arch.h']]],
+  ['lwip_5fno_5flimits_5fh',['LWIP_NO_LIMITS_H',['../group__compiler__abstraction.html#gade9c8513419a799cd78a07ae894bb805',1,'arch.h']]],
+  ['lwip_5fno_5fstddef_5fh',['LWIP_NO_STDDEF_H',['../group__compiler__abstraction.html#ga53954d507c09e521ec0d44a2450bb89d',1,'arch.h']]],
+  ['lwip_5fno_5fstdint_5fh',['LWIP_NO_STDINT_H',['../group__compiler__abstraction.html#ga122c754db96ecad23bc6f4541d6360c1',1,'arch.h']]],
+  ['lwip_5fnoassert',['LWIP_NOASSERT',['../group__lwip__assertions.html#ga71b7787802abbfc2218fb1f39f948a41',1,'debug.h']]],
+  ['lwip_5fnsc_5fipv4_5faddress_5fchanged',['LWIP_NSC_IPV4_ADDRESS_CHANGED',['../netif_8h.html#aeb4e790199b02469aa04c044ef5cfa32',1,'netif.h']]],
+  ['lwip_5fnsc_5fipv4_5fgateway_5fchanged',['LWIP_NSC_IPV4_GATEWAY_CHANGED',['../netif_8h.html#a22400d2202581b4a7273cded712adf49',1,'netif.h']]],
+  ['lwip_5fnsc_5fipv4_5fnetmask_5fchanged',['LWIP_NSC_IPV4_NETMASK_CHANGED',['../netif_8h.html#ad747072771a887443ab33f90a12077d4',1,'netif.h']]],
+  ['lwip_5fnsc_5fipv4_5fsettings_5fchanged',['LWIP_NSC_IPV4_SETTINGS_CHANGED',['../netif_8h.html#a4ff19a6f3045f65d0397d30b6609660a',1,'netif.h']]],
+  ['lwip_5fnsc_5fipv6_5faddr_5fstate_5fchanged',['LWIP_NSC_IPV6_ADDR_STATE_CHANGED',['../netif_8h.html#a0d70fe11cac43c8fa35827b8e607ccf6',1,'netif.h']]],
+  ['lwip_5fnsc_5fipv6_5fset',['LWIP_NSC_IPV6_SET',['../netif_8h.html#a8fb4317a77ee2e3848be80db15618666',1,'netif.h']]],
+  ['lwip_5fnsc_5flink_5fchanged',['LWIP_NSC_LINK_CHANGED',['../netif_8h.html#a5ad7308195c0581680dd62fb148501cd',1,'netif.h']]],
+  ['lwip_5fnsc_5fnetif_5fadded',['LWIP_NSC_NETIF_ADDED',['../netif_8h.html#adbfecb47897cfe63d4f6366c1fed23b2',1,'netif.h']]],
+  ['lwip_5fnsc_5fnetif_5fremoved',['LWIP_NSC_NETIF_REMOVED',['../netif_8h.html#ae8e2dc87c19a03d481ae37bcf7ced5c9',1,'netif.h']]],
+  ['lwip_5fnsc_5fstatus_5fchanged',['LWIP_NSC_STATUS_CHANGED',['../netif_8h.html#a6f406ee3ab60e8a4f27ae2483c96b8e2',1,'netif.h']]],
+  ['lwip_5fnum_5fcyclic_5ftimers',['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',['LWIP_NUM_NETIF_CLIENT_DATA',['../group__lwip__opts__netif.html#ga94a35212616f9a9aae5c98741612b936',1,'opt.h']]],
+  ['lwip_5fnum_5fsys_5ftimeout_5finternal',['LWIP_NUM_SYS_TIMEOUT_INTERNAL',['../group__lwip__opts__memp.html#ga87a05debb46ff82093d0e6dc1aad8804',1,'opt.h']]],
+  ['loopback_20interface',['Loopback interface',['../group__lwip__opts__loop.html',1,'']]],
+  ['lwip_5fpacked_5fcast',['LWIP_PACKED_CAST',['../group__compiler__abstraction.html#ga4488578f18ad1a76e4fa8bc288c51446',1,'arch.h']]],
+  ['lwip_5fpbuf_5fref_5ft',['LWIP_PBUF_REF_T',['../group__lwip__opts__pbuf.html#gaaefb80d6bf9257c0f4322c36e1272c38',1,'opt.h']]],
+  ['lwip_5fperf',['LWIP_PERF',['../group__lwip__opts__perf.html#ga44acd95b33e2d58a74455279721298de',1,'opt.h']]],
+  ['lwip_5fplatform_5fassert',['LWIP_PLATFORM_ASSERT',['../group__compiler__abstraction.html#ga7e8bcd0282525704d6dd596bdd1b47d0',1,'arch.h']]],
+  ['lwip_5fplatform_5fdiag',['LWIP_PLATFORM_DIAG',['../group__compiler__abstraction.html#gaccef167be13a500ce30036030a9b142b',1,'arch.h']]],
+  ['lwip_5fpollscan_5fclear',['LWIP_POLLSCAN_CLEAR',['../sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9aa9a8fe3199d00016f1f5ad639e1b28f7',1,'sockets.c']]],
+  ['lwip_5fpollscan_5fdec_5fwait',['LWIP_POLLSCAN_DEC_WAIT',['../sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9a6c1eefa3e29a39b923c4b522eb1b3eb1',1,'sockets.c']]],
+  ['lwip_5fpollscan_5finc_5fwait',['LWIP_POLLSCAN_INC_WAIT',['../sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9ab6511d3104f70c18fb4bd80f24cb867d',1,'sockets.c']]],
+  ['lwip_5fpollscan_5fopts',['lwip_pollscan_opts',['../sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9',1,'sockets.c']]],
+  ['lwip_5fposix_5fsockets_5fio_5fnames',['LWIP_POSIX_SOCKETS_IO_NAMES',['../group__lwip__opts__socket.html#ga484c38ab08f60d5b3335d23d31f9a402',1,'opt.h']]],
+  ['lwip_5fprovide_5ferrno',['LWIP_PROVIDE_ERRNO',['../group__compiler__abstraction.html#ga8e2cba4c97dd38f4d517ed21cf109ade',1,'arch.h']]],
+  ['lwip_5fptr_5fnumeric_5fcast',['LWIP_PTR_NUMERIC_CAST',['../group__compiler__abstraction.html#ga683e5c35d3263fe3145e6a6bc546604a',1,'arch.h']]],
+  ['lwip_5frand',['LWIP_RAND',['../group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a',1,'arch.h']]],
+  ['lwip_5fraw',['LWIP_RAW',['../group__lwip__opts__raw.html#gaca452be5cb05d9666f8f57e582c39221',1,'opt.h']]],
+  ['lwip_5frc_5fdevelopment',['LWIP_RC_DEVELOPMENT',['../group__lwip__version.html#ga9ca69b1a453eb72efd0bbda333f2a33b',1,'init.h']]],
+  ['lwip_5frc_5frelease',['LWIP_RC_RELEASE',['../group__lwip__version.html#ga375ee868e76ed7c458cdf249387bd469',1,'init.h']]],
+  ['lwip_5frfc7668_5fip_5funcompressed_5fdebug',['LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG',['../lowpan6__opts_8h.html#a5b7a3e204d2edde5552ca3c8694419c1',1,'lowpan6_opts.h']]],
+  ['lwip_5frfc7668_5flinux_5fworkaround_5fpublic_5faddress',['LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS',['../lowpan6__opts_8h.html#af4a4d962af3439b111a8e72e5eeaccf8',1,'lowpan6_opts.h']]],
+  ['lwip_5fselect_5fcb',['lwip_select_cb',['../structlwip__select__cb.html',1,'']]],
+  ['lwip_5fshutdown',['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',['LWIP_SINGLE_NETIF',['../group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be',1,'opt.h']]],
+  ['lwip_5fsnmp',['LWIP_SNMP',['../group__snmp__opts.html#gaf4900859dc53f19f5f67cc34e48ad68c',1,'snmp_opts.h']]],
+  ['lwip_5fsnmp_5fv3',['LWIP_SNMP_V3',['../snmp__opts_8h.html#a1fe0e120f979ed400f649019edcefe2b',1,'snmp_opts.h']]],
+  ['lwip_5fso_5flinger',['LWIP_SO_LINGER',['../group__lwip__opts__socket.html#gaa91292d5d014dc1c6f1c1f4166269a1d',1,'opt.h']]],
+  ['lwip_5fso_5frcvbuf',['LWIP_SO_RCVBUF',['../group__lwip__opts__socket.html#ga06390cebcf4d13d3d47a11365e5fcd28',1,'opt.h']]],
+  ['lwip_5fso_5frcvtimeo',['LWIP_SO_RCVTIMEO',['../group__lwip__opts__socket.html#ga91af3ade95b20b9a60c65ed0380fa0ed',1,'opt.h']]],
+  ['lwip_5fso_5fsndrcvtimeo_5fnonstandard',['LWIP_SO_SNDRCVTIMEO_NONSTANDARD',['../group__lwip__opts__socket.html#ga5b115bacb569763d8a3889a12229e942',1,'opt.h']]],
+  ['lwip_5fso_5fsndtimeo',['LWIP_SO_SNDTIMEO',['../group__lwip__opts__socket.html#ga1162cb685f202d9b21c11344b8209a58',1,'opt.h']]],
+  ['lwip_5fsock',['lwip_sock',['../structlwip__sock.html',1,'']]],
+  ['lwip_5fsocket',['LWIP_SOCKET',['../group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f',1,'opt.h']]],
+  ['lwip_5fsocket_5foffset',['LWIP_SOCKET_OFFSET',['../group__lwip__opts__socket.html#gad0197c845fbb44c920b272f0fef3b57e',1,'opt.h']]],
+  ['lwip_5fsocket_5fpoll',['LWIP_SOCKET_POLL',['../group__lwip__opts__socket.html#ga6c14d705e3321429683f24de9f5a7200',1,'opt.h']]],
+  ['lwip_5fsocket_5fselect',['LWIP_SOCKET_SELECT',['../group__lwip__opts__socket.html#ga68417078b71b0be9735256f52933dcdb',1,'opt.h']]],
+  ['lwip_5fsocket_5fthread_5fcleanup',['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',['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',['lwip_stats',['../stats_8c.html#a614735db0145db9ba944ede600d1d19b',1,'lwip_stats():&#160;stats.c'],['../stats_8h.html#a614735db0145db9ba944ede600d1d19b',1,'lwip_stats():&#160;stats.c'],['../group__lwip__opts__stats.html#ga542b58734cc01902c5e099f6efdc5f1b',1,'LWIP_STATS():&#160;opt.h']]],
+  ['lwip_5fstats_5fdisplay',['LWIP_STATS_DISPLAY',['../group__lwip__opts__stats.html#gacdc38ed58d1900b5d3d109a65be1c3d1',1,'opt.h']]],
+  ['lwip_5fstricmp',['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',['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',['lwip_strnstr',['../group__sys__nonstandard.html#gaeece028198cdaea2f0d2f1d691752c02',1,'lwip_strnstr(const char *buffer, const char *token, size_t n):&#160;def.c'],['../group__sys__nonstandard.html#gaeece028198cdaea2f0d2f1d691752c02',1,'lwip_strnstr(const char *buffer, const char *token, size_t n):&#160;def.c']]],
+  ['lwip_5fsupport_5fcustom_5fpbuf',['LWIP_SUPPORT_CUSTOM_PBUF',['../pbuf_8h.html#a64174c5169b48dc17674324afd9c63b9',1,'pbuf.h']]],
+  ['lwip_5ftcp',['LWIP_TCP',['../group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9',1,'opt.h']]],
+  ['lwip_5ftcp_5fcalc_5finitial_5fcwnd',['LWIP_TCP_CALC_INITIAL_CWND',['../tcp__in_8c.html#aea174f2c6ca4cb0ad270dd8d0faf0c84',1,'tcp_in.c']]],
+  ['lwip_5ftcp_5fclose_5ftimeout_5fms_5fdefault',['LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT',['../group__lwip__opts__socket.html#ga3e7498d5d2921f0df3792de72f384d36',1,'opt.h']]],
+  ['lwip_5ftcp_5fkeepalive',['LWIP_TCP_KEEPALIVE',['../group__lwip__opts__socket.html#ga8b9369ab260f032686a81c77c5b4db77',1,'opt.h']]],
+  ['lwip_5ftcp_5fmax_5fsack_5fnum',['LWIP_TCP_MAX_SACK_NUM',['../group__lwip__opts__tcp.html#gaaac0e9f559a8e3c251f3504cebcf44dc',1,'opt.h']]],
+  ['lwip_5ftcp_5fpcb_5fnum_5fext_5fargs',['LWIP_TCP_PCB_NUM_EXT_ARGS',['../group__lwip__opts__tcp.html#ga40b1cdad52eaa91a3f5c242fc92ee223',1,'opt.h']]],
+  ['lwip_5ftcp_5fsack_5fout',['LWIP_TCP_SACK_OUT',['../group__lwip__opts__tcp.html#gaf1b6a015d29fea67b906c276e1e8314f',1,'opt.h']]],
+  ['lwip_5ftcp_5ftimestamps',['LWIP_TCP_TIMESTAMPS',['../group__lwip__opts__tcp.html#ga249bc450bb818cf2ef3cf1472ff354fd',1,'opt.h']]],
+  ['lwip_5ftcpip_5fcore_5flocking',['LWIP_TCPIP_CORE_LOCKING',['../group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011',1,'opt.h']]],
+  ['lwip_5ftcpip_5fcore_5flocking_5finput',['LWIP_TCPIP_CORE_LOCKING_INPUT',['../group__lwip__opts__lock.html#ga351beb1c06affe49e717bc9f76c66acf',1,'opt.h']]],
+  ['lwip_5ftcpip_5fthread_5falive',['LWIP_TCPIP_THREAD_ALIVE',['../group__lwip__opts__thread.html#ga8b99d75d9e0a0868567d10c8522915bb',1,'opt.h']]],
+  ['lwip_5ftcpip_5ftimeout',['LWIP_TCPIP_TIMEOUT',['../group__lwip__opts__netconn.html#ga1cd8d15a42262a0defaedabed126ea99',1,'opt.h']]],
+  ['lwip_5fthread_5ffn',['lwip_thread_fn',['../sys_8h.html#ae30a77bf6bd69bfcc5f235eaad54f2b9',1,'sys.h']]],
+  ['lwip_5ftimers',['LWIP_TIMERS',['../group__lwip__opts__timers.html#ga25a41610055f91cbd0960256240b8f2c',1,'opt.h']]],
+  ['lwip_5ftimers_5fcustom',['LWIP_TIMERS_CUSTOM',['../group__lwip__opts__timers.html#gaff0ea56f3e3d8e86c49b50557bc13815',1,'opt.h']]],
+  ['lwip_5ftimeval_5fprivate',['LWIP_TIMEVAL_PRIVATE',['../sockets_8h.html#aaffd64f6887883ec6401e6bb684c40fa',1,'sockets.h']]],
+  ['lwip_5fudp',['LWIP_UDP',['../group__lwip__opts__udp.html#gab6030e96e72df649d2650fd32d7a67b3',1,'opt.h']]],
+  ['lwip_5fudplite',['LWIP_UDPLITE',['../group__lwip__opts__udp.html#ga35731bc5f337943e474a15c1cd538a61',1,'opt.h']]],
+  ['lwip_5funused_5farg',['LWIP_UNUSED_ARG',['../group__compiler__abstraction.html#ga70624a5deb8b9199406372a7f3603ecf',1,'arch.h']]],
+  ['lwip_5fversion',['LWIP_VERSION',['../group__lwip__version.html#ga0a0d322fad0a67aa5b8f1b8c9dfcfe59',1,'init.h']]],
+  ['lwip_5fversion_5fmajor',['LWIP_VERSION_MAJOR',['../group__lwip__version.html#ga4308c06ef36496e00c798d96d7d03246',1,'init.h']]],
+  ['lwip_5fversion_5fminor',['LWIP_VERSION_MINOR',['../group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034',1,'init.h']]],
+  ['lwip_5fversion_5frc',['LWIP_VERSION_RC',['../group__lwip__version.html#gac1dc92d8f453a98560de7e2e00a221a1',1,'init.h']]],
+  ['lwip_5fversion_5frevision',['LWIP_VERSION_REVISION',['../group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50',1,'init.h']]],
+  ['lwip_5fversion_5fstring',['LWIP_VERSION_STRING',['../group__lwip__version.html#gab47e87bc38eef94486db402813183ba7',1,'init.h']]],
+  ['lwip_5fwnd_5fscale',['LWIP_WND_SCALE',['../group__lwip__opts__tcp.html#ga88dbbfeeeb41b129fdc8235fc08bb530',1,'opt.h']]],
+  ['lwiperf_2ec',['lwiperf.c',['../lwiperf_8c.html',1,'']]],
+  ['lwiperf_2eh',['lwiperf.h',['../lwiperf_8h.html',1,'']]],
+  ['lwiperf_5fabort',['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',['LWIPERF_CHECK_RX_DATA',['../lwiperf_8c.html#af51dcfc53fe575411c26e18963f1b902',1,'lwiperf.c']]],
+  ['lwiperf_5fclient',['LWIPERF_CLIENT',['../lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cae1862655ebaaea2e7e0261dff0173110',1,'lwiperf.h']]],
+  ['lwiperf_5fclient_5ftype',['lwiperf_client_type',['../lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76c',1,'lwiperf.h']]],
+  ['lwiperf_5fdual',['LWIPERF_DUAL',['../lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cab0381feca6655968e7380622e7a63ede',1,'lwiperf.h']]],
+  ['lwiperf_5freport_5ffn',['lwiperf_report_fn',['../lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd',1,'lwiperf.h']]],
+  ['lwiperf_5freport_5ftype',['lwiperf_report_type',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6',1,'lwiperf.h']]],
+  ['lwiperf_5fserver_5fip_5ftype',['LWIPERF_SERVER_IP_TYPE',['../lwiperf_8c.html#a1351e47d0bdb7d0fe0efaf9f1b2b0f7a',1,'lwiperf.c']]],
+  ['lwiperf_5fsettings_5ft',['lwiperf_settings_t',['../lwiperf_8c.html#a4a794a0c1a90b889d54b1dacbce923f4',1,'lwiperf.c']]],
+  ['lwiperf_5fstart_5ftcp_5fclient',['lwiperf_start_tcp_client',['../group__iperf.html#gad8317f52289d8bb12a14627cd177a565',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#gad8317f52289d8bb12a14627cd177a565',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',['lwiperf_start_tcp_client_default',['../group__iperf.html#ga85a487cf8ecbd0999382c9bff375d0da',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#ga85a487cf8ecbd0999382c9bff375d0da',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',['lwiperf_start_tcp_server',['../group__iperf.html#gad97bf77057e7f96d6d8def812deea202',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#gad97bf77057e7f96d6d8def812deea202',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',['lwiperf_start_tcp_server_default',['../group__iperf.html#gae1f30a02b86c4dd3d47810cd493baf26',1,'lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#gae1f30a02b86c4dd3d47810cd493baf26',1,'lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c']]],
+  ['lwiperf_5fstate_5ftcp_5ft',['lwiperf_state_tcp_t',['../lwiperf_8c.html#a06db7abdf1d4864ca2b367d9c89e3e2d',1,'lwiperf.c']]],
+  ['lwiperf_5ftcp_5faborted_5flocal',['LWIPERF_TCP_ABORTED_LOCAL',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6abee2bf6da51a0845c15ac52b280203cb',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5faborted_5flocal_5fdataerror',['LWIPERF_TCP_ABORTED_LOCAL_DATAERROR',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6adda7e5dbaf1e04eb04ec0fd2b05584a5',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5faborted_5flocal_5ftxerror',['LWIPERF_TCP_ABORTED_LOCAL_TXERROR',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a3d4e1f5742d80aeafb6b22aa74d93e40',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5faborted_5fremote',['LWIPERF_TCP_ABORTED_REMOTE',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6ae664c0f987584f07fb0f6f8896aada0d',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5fdone_5fclient',['LWIPERF_TCP_DONE_CLIENT',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a4f9bde0cad305eaab25d2c1d0196677b',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5fdone_5fserver',['LWIPERF_TCP_DONE_SERVER',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6aa52255236ad2983346311ce7f28210e5',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5fmax_5fidle_5fsec',['LWIPERF_TCP_MAX_IDLE_SEC',['../lwiperf_8c.html#a646d7e0b37c5cefdd6eef38a3fba4673',1,'lwiperf.c']]],
+  ['lwiperf_5ftradeoff',['LWIPERF_TRADEOFF',['../lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76caccdab7ee6e1b0981861e66f0755f7964',1,'lwiperf.h']]]
+];
diff --git a/doc/doxygen/output/html/search/all_e.html b/doc/doxygen/output/html/search/all_e.html
new file mode 100644
index 0000000..9fa42bb
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_e.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_e.js b/doc/doxygen/output/html/search/all_e.js
new file mode 100644
index 0000000..0476552
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_e.js
@@ -0,0 +1,195 @@
+var searchData=
+[
+  ['mainloop_20mode_20_28_22no_5fsys_22_29',['Mainloop mode (&quot;NO_SYS&quot;)',['../group__lwip__nosys.html',1,'']]],
+  ['memcpy',['memcpy',['../group__lwip__opts__memcpy.html',1,'']]],
+  ['multicast_20listener_20discovery',['Multicast listener discovery',['../group__lwip__opts__mld6.html',1,'']]],
+  ['multicast',['Multicast',['../group__lwip__opts__multicast.html',1,'']]],
+  ['max_5ffdb_5fdynamic_5fentries',['max_fdb_dynamic_entries',['../structbridgeif__initdata__s.html#aeb312c2e698513c6416d5c8459ad622f',1,'bridgeif_initdata_s']]],
+  ['max_5ffdb_5fstatic_5fentries',['max_fdb_static_entries',['../structbridgeif__initdata__s.html#a210915aa1b0436ccabc7e8d9fd3c3fe6',1,'bridgeif_initdata_s']]],
+  ['max_5fnumber_5fof_5fpending_5fsessions',['max_number_of_pending_sessions',['../structnetbios__answer.html#a58aba600ed34b7c689606c296ef57c8c',1,'netbios_answer']]],
+  ['max_5fports',['max_ports',['../structbridgeif__initdata__s.html#a0e0bb6a885967b5fcfef09a8f0adc63f',1,'bridgeif_initdata_s']]],
+  ['max_5ftotal_5fnumber_5fof_5fcommand_5fblocks',['max_total_number_of_command_blocks',['../structnetbios__answer.html#a9cf85c173fe0d99c1c4e7e09aaeed9b8',1,'netbios_answer']]],
+  ['max_5ftotal_5fsessions_5fpossible',['max_total_sessions_possible',['../structnetbios__answer.html#a0069c9ae014881298828660787fa945e',1,'netbios_answer']]],
+  ['mcast_5fifindex',['mcast_ifindex',['../structraw__pcb.html#a5124a21e1523c774bd76c0eabc7c7ca8',1,'raw_pcb::mcast_ifindex()'],['../structudp__pcb.html#ac80ae56333b88cea08bfa3563b0dd3cd',1,'udp_pcb::mcast_ifindex()']]],
+  ['mcast_5fip4',['mcast_ip4',['../structudp__pcb.html#a1c32c7ebd76898cf8f1227c10d34dbe0',1,'udp_pcb']]],
+  ['mcast_5fttl',['mcast_ttl',['../structraw__pcb.html#a2ecc77e919de9bb552d1c70e771e2cad',1,'raw_pcb::mcast_ttl()'],['../structudp__pcb.html#aaab9255f7f1186aef12d45c9bb90d3f4',1,'udp_pcb::mcast_ttl()']]],
+  ['mdns',['MDNS',['../group__mdns.html',1,'']]],
+  ['mdns_2ec',['mdns.c',['../mdns_8c.html',1,'']]],
+  ['mdns_2eh',['mdns.h',['../mdns_8h.html',1,'']]],
+  ['mdns_5fcompress_5fdomain',['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',['MDNS_DEBUG',['../group__mdns__opts.html#ga53a97502efdcf1214cab4078f93a6dc9',1,'mdns_opts.h']]],
+  ['mdns_5fdomain_5fadd_5flabel',['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',['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',['mdns_host',['../structmdns__host.html',1,'']]],
+  ['mdns_5fmax_5fservices',['MDNS_MAX_SERVICES',['../group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6',1,'mdns_opts.h']]],
+  ['mdns_5fname_5fresult_5fcb_5ft',['mdns_name_result_cb_t',['../mdns_8h.html#a19f12d7092de6fe90d5843e4ef8d4536',1,'mdns.h']]],
+  ['mdns_5fopts_2eh',['mdns_opts.h',['../mdns__opts_8h.html',1,'']]],
+  ['mdns_5foutpacket',['mdns_outpacket',['../structmdns__outpacket.html',1,'']]],
+  ['mdns_5fpacket',['mdns_packet',['../structmdns__packet.html',1,'']]],
+  ['mdns_5fpriv_2eh',['mdns_priv.h',['../mdns__priv_8h.html',1,'']]],
+  ['mdns_5freadname',['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',['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',['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',['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',['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',['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',['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',['mdns_resp_netif_settings_changed',['../group__mdns.html#gab2edba12d5cad1949f7ca040ae12beec',1,'mdns.h']]],
+  ['mdns_5fresp_5fregister_5fname_5fresult_5fcb',['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',['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',['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',['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',['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',['MDNS_RESP_USENETIF_EXTCALLBACK',['../group__mdns__opts.html#ga172e579cd09a1db51cf224319c012396',1,'mdns_opts.h']]],
+  ['mdns_5frr_5finfo',['mdns_rr_info',['../structmdns__rr__info.html',1,'']]],
+  ['mdns_5fservice',['mdns_service',['../structmdns__service.html',1,'']]],
+  ['mem',['mem',['../structmem.html',1,'mem'],['../structstats__.html#a656444f95080c6a3d474f73a6fcd9b1c',1,'stats_::mem()']]],
+  ['mem_2ec',['mem.c',['../mem_8c.html',1,'']]],
+  ['mem_2eh',['mem.h',['../mem_8h.html',1,'']]],
+  ['mem_5falignment',['MEM_ALIGNMENT',['../group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7',1,'opt.h']]],
+  ['mem_5fcalloc',['mem_calloc',['../mem_8c.html#ab0bdc525971701883f2065e7fb257a24',1,'mem_calloc(mem_size_t count, mem_size_t size):&#160;mem.c'],['../mem_8h.html#ab0bdc525971701883f2065e7fb257a24',1,'mem_calloc(mem_size_t count, mem_size_t size):&#160;mem.c']]],
+  ['mem_5fdebug',['MEM_DEBUG',['../group__lwip__opts__debugmsg.html#ga2d7bc380695eeedb1af50c3808613afe',1,'opt.h']]],
+  ['mem_5ffree',['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',['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',['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',['MEM_LIBC_MALLOC',['../group__lwip__opts__mem.html#ga4ef345cc270912bd2230b1c5ec51dfc8',1,'opt.h']]],
+  ['mem_5fmalloc',['mem_malloc',['../mem_8c.html#af418ade27d91d41e6143dba2cc246b0f',1,'mem_malloc(mem_size_t size_in):&#160;mem.c'],['../mem_8h.html#a932aa40d85b14cb7331625e012d12335',1,'mem_malloc(mem_size_t size):&#160;mem.c']]],
+  ['mem_5foverflow_5fcheck',['MEM_OVERFLOW_CHECK',['../group__lwip__opts__mem.html#gae331a198bd06100b90ea020cd5f07f4e',1,'opt.h']]],
+  ['mem_5fpriv_2eh',['mem_priv.h',['../mem__priv_8h.html',1,'']]],
+  ['mem_5fsanity_5fcheck',['MEM_SANITY_CHECK',['../group__lwip__opts__mem.html#ga90b17afabb93986a162c327ed30bb4d3',1,'opt.h']]],
+  ['mem_5fsize',['MEM_SIZE',['../group__lwip__opts__mem.html#ga2dcf8c45f945dd0c4301a94700f2112c',1,'opt.h']]],
+  ['mem_5fstats',['MEM_STATS',['../group__lwip__opts__stats.html#ga61ec04a08c4fde690d10819e582656a7',1,'opt.h']]],
+  ['mem_5ftrim',['mem_trim',['../mem_8c.html#a7e6b7f11bb50bead9b35515d9a517124',1,'mem_trim(void *rmem, mem_size_t new_size):&#160;mem.c'],['../mem_8h.html#a5e39a108c44d8a72df0b30a117cb62e4',1,'mem_trim(void *mem, mem_size_t size):&#160;mem.c']]],
+  ['mem_5fuse_5fpools',['MEM_USE_POOLS',['../group__lwip__opts__mem.html#gaddca3141bc7037241769eb152b6f89ba',1,'opt.h']]],
+  ['mem_5fuse_5fpools_5ftry_5fbigger_5fpool',['MEM_USE_POOLS_TRY_BIGGER_POOL',['../group__lwip__opts__mem.html#gaba8be68e8fd0716b723ce4569ed89f82',1,'opt.h']]],
+  ['memcpy',['MEMCPY',['../group__lwip__opts__memcpy.html#gaa1dd57a66b6de8c0593e9e3e8d1411f6',1,'opt.h']]],
+  ['memmove',['MEMMOVE',['../group__lwip__opts__memcpy.html#ga0e00bb235da5557fcbc049f732503863',1,'opt.h']]],
+  ['memp',['memp',['../structstats__.html#aa75d6b389e94b0f619b5db0daaf569fc',1,'stats_']]],
+  ['memp_2ec',['memp.c',['../memp_8c.html',1,'']]],
+  ['memp_2eh',['memp.h',['../memp_8h.html',1,'']]],
+  ['memp_5fdebug',['MEMP_DEBUG',['../group__lwip__opts__debugmsg.html#gad80231923f7a808d49eba5ec57d63616',1,'opt.h']]],
+  ['memp_5fdesc',['memp_desc',['../structmemp__desc.html',1,'']]],
+  ['memp_5ffree',['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',['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',['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',['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',['memp_malloc',['../memp_8c.html#a2b00593d086313c267b54a976bf67aa5',1,'memp_malloc(memp_t type):&#160;memp.c'],['../memp_8h.html#a2b00593d086313c267b54a976bf67aa5',1,'memp_malloc(memp_t type):&#160;memp.c']]],
+  ['memp_5fmalloc_5fpool',['memp_malloc_pool',['../memp_8c.html#a348c83ee972f1edf7296a1cdf1d75f22',1,'memp_malloc_pool(const struct memp_desc *desc):&#160;memp.c'],['../memp__priv_8h.html#a348c83ee972f1edf7296a1cdf1d75f22',1,'memp_malloc_pool(const struct memp_desc *desc):&#160;memp.c']]],
+  ['memp_5fmem_5finit',['MEMP_MEM_INIT',['../group__lwip__opts__mem.html#gaa2f25586972d1cbc1ff0dcdc6f15a1b0',1,'opt.h']]],
+  ['memp_5fmem_5fmalloc',['MEMP_MEM_MALLOC',['../group__lwip__opts__mem.html#gae93af697d27bbcefa6a28052d90f2f38',1,'opt.h']]],
+  ['memp_5fnum_5faltcp_5fpcb',['MEMP_NUM_ALTCP_PCB',['../group__lwip__opts__memp.html#ga24f6737ee990990b81b0d16ef6e0dffd',1,'opt.h']]],
+  ['memp_5fnum_5fapi_5fmsg',['MEMP_NUM_API_MSG',['../group__lwip__opts__memp.html#ga5a95abf3610c56e7c23cb035eb9c3444',1,'opt.h']]],
+  ['memp_5fnum_5farp_5fqueue',['MEMP_NUM_ARP_QUEUE',['../group__lwip__opts__memp.html#ga087b00ea20a7edebcad33a1a1353a5d7',1,'opt.h']]],
+  ['memp_5fnum_5fdns_5fapi_5fmsg',['MEMP_NUM_DNS_API_MSG',['../group__lwip__opts__memp.html#ga3b1f228c598529c62895ad04ff294980',1,'opt.h']]],
+  ['memp_5fnum_5ffrag_5fpbuf',['MEMP_NUM_FRAG_PBUF',['../group__lwip__opts__memp.html#ga1f66051a654dcd7a4e19bc6aff240630',1,'opt.h']]],
+  ['memp_5fnum_5figmp_5fgroup',['MEMP_NUM_IGMP_GROUP',['../group__lwip__opts__memp.html#gab648ff95d8ffa4216b95f82a568a5d9a',1,'opt.h']]],
+  ['memp_5fnum_5flocalhostlist',['MEMP_NUM_LOCALHOSTLIST',['../group__lwip__opts__memp.html#gaa9b0f949da12cbe8fe5f7aefc30290e0',1,'opt.h']]],
+  ['memp_5fnum_5fmld6_5fgroup',['MEMP_NUM_MLD6_GROUP',['../group__lwip__opts__mld6.html#ga89e92d8de8898696e797f13fdd169494',1,'opt.h']]],
+  ['memp_5fnum_5fnd6_5fqueue',['MEMP_NUM_ND6_QUEUE',['../group__lwip__opts__nd6.html#gabfaf3d92d51e2a9d70c8360af2611fb2',1,'opt.h']]],
+  ['memp_5fnum_5fnetbuf',['MEMP_NUM_NETBUF',['../group__lwip__opts__memp.html#ga5d99df65869ac101ed6a611fc85016be',1,'opt.h']]],
+  ['memp_5fnum_5fnetconn',['MEMP_NUM_NETCONN',['../group__lwip__opts__memp.html#gacb40bd726b7e15593b20a628d298f456',1,'opt.h']]],
+  ['memp_5fnum_5fnetdb',['MEMP_NUM_NETDB',['../group__lwip__opts__memp.html#ga293bc22b60bf3f8e2520f60a88370e7a',1,'opt.h']]],
+  ['memp_5fnum_5fnetifapi_5fmsg',['MEMP_NUM_NETIFAPI_MSG',['../group__lwip__opts__memp.html#gadd5a973b98068ce9318ea2f96b5fa14c',1,'opt.h']]],
+  ['memp_5fnum_5fpbuf',['MEMP_NUM_PBUF',['../group__lwip__opts__memp.html#ga92b30aed958ec59334d936d4ca725418',1,'opt.h']]],
+  ['memp_5fnum_5fraw_5fpcb',['MEMP_NUM_RAW_PCB',['../group__lwip__opts__memp.html#ga379bf92ed322cda54cb701337421e0d3',1,'opt.h']]],
+  ['memp_5fnum_5freassdata',['MEMP_NUM_REASSDATA',['../group__lwip__opts__memp.html#ga169436c5860253b90e25bdba9fdcac86',1,'opt.h']]],
+  ['memp_5fnum_5fselect_5fcb',['MEMP_NUM_SELECT_CB',['../group__lwip__opts__memp.html#ga8e136f5811e6652c6c5d2fcf596f0893',1,'opt.h']]],
+  ['memp_5fnum_5fsocket_5fsetgetsockopt_5fdata',['MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA',['../group__lwip__opts__memp.html#gacf9782dd26bf8a655044dc041a9de948',1,'opt.h']]],
+  ['memp_5fnum_5fsys_5ftimeout',['MEMP_NUM_SYS_TIMEOUT',['../group__lwip__opts__memp.html#ga4afbdca581a58d57bc7a81118a95327e',1,'opt.h']]],
+  ['memp_5fnum_5ftcp_5fpcb',['MEMP_NUM_TCP_PCB',['../group__lwip__opts__memp.html#ga73beecc19cfbc3114768f9b32b2cd70e',1,'opt.h']]],
+  ['memp_5fnum_5ftcp_5fpcb_5flisten',['MEMP_NUM_TCP_PCB_LISTEN',['../group__lwip__opts__memp.html#ga04fba6a249123513271dccb4ec26aa5a',1,'opt.h']]],
+  ['memp_5fnum_5ftcp_5fseg',['MEMP_NUM_TCP_SEG',['../group__lwip__opts__memp.html#gaa35fb3a1a76661e3ffb9722a57092de3',1,'opt.h']]],
+  ['memp_5fnum_5ftcpip_5fmsg_5fapi',['MEMP_NUM_TCPIP_MSG_API',['../group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c',1,'opt.h']]],
+  ['memp_5fnum_5ftcpip_5fmsg_5finpkt',['MEMP_NUM_TCPIP_MSG_INPKT',['../group__lwip__opts__memp.html#gab089a7088439e726c3801ba9e249d831',1,'opt.h']]],
+  ['memp_5fnum_5fudp_5fpcb',['MEMP_NUM_UDP_PCB',['../group__lwip__opts__memp.html#ga2c416da481ab09bd1ba257b75a0707eb',1,'opt.h']]],
+  ['memp_5foverflow_5fcheck',['MEMP_OVERFLOW_CHECK',['../group__lwip__opts__mem.html#ga27fdd01194a42fc41a7716b72cdb49e3',1,'opt.h']]],
+  ['memp_5fpriv_2eh',['memp_priv.h',['../memp__priv_8h.html',1,'']]],
+  ['memp_5fsanity_5fcheck',['MEMP_SANITY_CHECK',['../group__lwip__opts__mem.html#ga0838947193e222a9f46b582e01e5beff',1,'opt.h']]],
+  ['memp_5fstats',['MEMP_STATS',['../group__lwip__opts__stats.html#gab8c2430be0e567a7499a95454aaa6041',1,'opt.h']]],
+  ['memp_5fstd_2eh',['memp_std.h',['../memp__std_8h.html',1,'']]],
+  ['memp_5ft',['memp_t',['../memp_8h.html#a85a164b1f7764951cc685ea525114e57',1,'memp.h']]],
+  ['memp_5fuse_5fcustom_5fpools',['MEMP_USE_CUSTOM_POOLS',['../group__lwip__opts__mem.html#ga69de593b8ffd4f1c249f03e48e11983b',1,'opt.h']]],
+  ['memory_20pools',['Memory pools',['../group__mempool.html',1,'']]],
+  ['mib2',['mib2',['../structstats__.html#ac001c065c56c26c3952b19b9ce0d5832',1,'stats_']]],
+  ['mib2_5fcopy_5fsysuptime_5fto',['MIB2_COPY_SYSUPTIME_TO',['../snmp_8h.html#abe6b270482ca9af07c029f3136d8ec9c',1,'snmp.h']]],
+  ['mib2_5fcounters',['mib2_counters',['../structnetif.html#ab32cbe1851154fd020bac4be558f5fd5',1,'netif']]],
+  ['mib2_5finit_5fnetif',['MIB2_INIT_NETIF',['../group__netif__mib2.html#ga5be1b8cba1d67bf6e7f8851ec91b10f0',1,'snmp.h']]],
+  ['mib2_5fstats',['MIB2_STATS',['../group__lwip__opts__stats.html#ga5b01047eeb149a0b0ffe33d760d8370f',1,'opt.h']]],
+  ['mib2_5fstats_5fnetif_5fadd',['MIB2_STATS_NETIF_ADD',['../group__netif__mib2.html#ga05641438775014b7e13b9e55eba48bed',1,'snmp.h']]],
+  ['mib2_5fstats_5fnetif_5finc',['MIB2_STATS_NETIF_INC',['../group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f',1,'snmp.h']]],
+  ['min_5freq_5flen',['MIN_REQ_LEN',['../httpd_8c.html#aa8e2f3e13ac1fcacd85c558d6e40e40a',1,'httpd.c']]],
+  ['min_5fsize',['MIN_SIZE',['../mem_8c.html#a278694c2333c9826f21ddd2c2d220f66',1,'mem.c']]],
+  ['mld6',['mld6',['../structstats__.html#ab0ad1d07dff25cd3e4a8e5be607497f8',1,'stats_::mld6()'],['../group__mld6.html',1,'(Global Namespace)']]],
+  ['mld6_2ec',['mld6.c',['../mld6_8c.html',1,'']]],
+  ['mld6_2eh',['mld6.h',['../mld6_8h.html',1,'(Global Namespace)'],['../prot_2mld6_8h.html',1,'(Global Namespace)']]],
+  ['mld6_5finput',['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',['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',['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',['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',['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',['mld6_lookfor_group',['../mld6_8c.html#ad2fbba6bc543dbf994961656d7431eb5',1,'mld6_lookfor_group(struct netif *ifp, const ip6_addr_t *addr):&#160;mld6.c'],['../mld6_8h.html#ad2fbba6bc543dbf994961656d7431eb5',1,'mld6_lookfor_group(struct netif *ifp, const ip6_addr_t *addr):&#160;mld6.c']]],
+  ['mld6_5freport_5fgroups',['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',['MLD6_STATS',['../group__lwip__opts__stats.html#gaf263df10b63b38201cae3d2dd5fb0b9e',1,'opt.h']]],
+  ['mld6_5fstop',['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',['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',['mld_group',['../structmld__group.html',1,'']]],
+  ['mld_5fheader',['mld_header',['../structmld__header.html',1,'']]],
+  ['mld_5fmac_5ffilter',['mld_mac_filter',['../structnetif.html#abc67963ff9f574e98ef9c50138a3e470',1,'netif']]],
+  ['mqtt_20client',['MQTT client',['../group__mqtt.html',1,'']]],
+  ['mqtt_2ec',['mqtt.c',['../mqtt_8c.html',1,'']]],
+  ['mqtt_2eh',['mqtt.h',['../mqtt_8h.html',1,'']]],
+  ['mqtt_5fclient_5fconnect',['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',['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',['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',['mqtt_client_new',['../group__mqtt.html#gae7e19e236eb6122c8c39e93db6f5f53f',1,'mqtt_client_new(void):&#160;mqtt.c'],['../group__mqtt.html#gae7e19e236eb6122c8c39e93db6f5f53f',1,'mqtt_client_new(void):&#160;mqtt.c']]],
+  ['mqtt_5fclient_5fs',['mqtt_client_s',['../structmqtt__client__s.html',1,'']]],
+  ['mqtt_5fconnect_5faccepted',['MQTT_CONNECT_ACCEPTED',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da074dc1d289b8e8d4aad91f6a2cb93dc1',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5fclient_5finfo_5ft',['mqtt_connect_client_info_t',['../structmqtt__connect__client__info__t.html',1,'']]],
+  ['mqtt_5fconnect_5fdisconnected',['MQTT_CONNECT_DISCONNECTED',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da321f5ce31b173f235de1a517fcfd00dd',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5fflag',['mqtt_connect_flag',['../mqtt_8c.html#a4f6c42ed730546ff755e3bb99989dd12',1,'mqtt.c']]],
+  ['mqtt_5fconnect_5frefused_5fidentifier',['MQTT_CONNECT_REFUSED_IDENTIFIER',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da28ffe49b0175adaa2b9a27cb4873224a',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5frefused_5fnot_5fauthorized_5f',['MQTT_CONNECT_REFUSED_NOT_AUTHORIZED_',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dafc4888158dd6ee84269a5f0bfdc12b17',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5frefused_5fprotocol_5fversion',['MQTT_CONNECT_REFUSED_PROTOCOL_VERSION',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da41f8aa97142be337cb639f94d9145190',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5frefused_5fserver',['MQTT_CONNECT_REFUSED_SERVER',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5frefused_5fusername_5fpass',['MQTT_CONNECT_REFUSED_USERNAME_PASS',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da290cf9037054c42022cc864cfade896a',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5ftimeout',['MQTT_CONNECT_TIMEOUT',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5ftimout',['MQTT_CONNECT_TIMOUT',['../group__mqtt__opts.html#gac5d0580d1caf57dac1cb56662e5d9f7b',1,'mqtt_opts.h']]],
+  ['mqtt_5fconnection_5fcb_5ft',['mqtt_connection_cb_t',['../group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f',1,'mqtt.h']]],
+  ['mqtt_5fconnection_5fstatus_5ft',['mqtt_connection_status_t',['../group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d',1,'mqtt.h']]],
+  ['mqtt_5fctl_5fpacket_5ftype',['MQTT_CTL_PACKET_TYPE',['../mqtt_8c.html#a45c57ebd31832f1c128d847067c4688b',1,'mqtt.c']]],
+  ['mqtt_5fcyclic_5ftimer_5finterval',['MQTT_CYCLIC_TIMER_INTERVAL',['../group__mqtt__opts.html#ga1d89fda808c7047eab7a67d3785aea8e',1,'mqtt_opts.h']]],
+  ['mqtt_5fdata_5fflag_5flast',['MQTT_DATA_FLAG_LAST',['../group__mqtt.html#gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f',1,'mqtt.h']]],
+  ['mqtt_5fdebug',['MQTT_DEBUG',['../mqtt_8c.html#a99c325e06cc17ee24e09dab251606f9d',1,'mqtt.c']]],
+  ['mqtt_5fdisconnect',['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',['mqtt_incoming_data_cb_t',['../group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81',1,'mqtt.h']]],
+  ['mqtt_5fincoming_5fpublish_5fcb_5ft',['mqtt_incoming_publish_cb_t',['../group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29',1,'mqtt.h']]],
+  ['mqtt_5fmessage_5ftype',['mqtt_message_type',['../mqtt_8c.html#ac243cf15beb51b2206e36da86c2f95f1',1,'mqtt.c']]],
+  ['mqtt_5fopts_2eh',['mqtt_opts.h',['../mqtt__opts_8h.html',1,'']]],
+  ['mqtt_5foutput_5fringbuf_5fsize',['MQTT_OUTPUT_RINGBUF_SIZE',['../group__mqtt__opts.html#ga70627bafaffa071875cee9edc38d942b',1,'mqtt_opts.h']]],
+  ['mqtt_5fport',['MQTT_PORT',['../group__mqtt.html#gaa8632baff6bbb5004385998918f1e6bd',1,'mqtt.h']]],
+  ['mqtt_5fpriv_2eh',['mqtt_priv.h',['../mqtt__priv_8h.html',1,'']]],
+  ['mqtt_5fpublish',['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',['MQTT_REQ_MAX_IN_FLIGHT',['../group__mqtt__opts.html#gae82460b35de2291e9661e440c3458e8f',1,'mqtt_opts.h']]],
+  ['mqtt_5freq_5ftimeout',['MQTT_REQ_TIMEOUT',['../group__mqtt__opts.html#ga262639f2b45f6e064fb53156396d6d0a',1,'mqtt_opts.h']]],
+  ['mqtt_5frequest_5fcb_5ft',['mqtt_request_cb_t',['../group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd',1,'mqtt.h']]],
+  ['mqtt_5frequest_5ft',['mqtt_request_t',['../structmqtt__request__t.html',1,'']]],
+  ['mqtt_5fringbuf_5ffree',['mqtt_ringbuf_free',['../mqtt_8c.html#afba101fbf26b556c869060d3d013c8fa',1,'mqtt.c']]],
+  ['mqtt_5fringbuf_5flinear_5fread_5flength',['mqtt_ringbuf_linear_read_length',['../mqtt_8c.html#ad82b4039213ab3f1d9e4bcd3aa0c88a3',1,'mqtt.c']]],
+  ['mqtt_5fringbuf_5ft',['mqtt_ringbuf_t',['../structmqtt__ringbuf__t.html',1,'']]],
+  ['mqtt_5fset_5finpub_5fcallback',['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',['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',['mqtt_subscribe',['../group__mqtt.html#ga83d6a6d811b201a74d793bc1b5d4e029',1,'mqtt.h']]],
+  ['mqtt_5ftls_5fport',['MQTT_TLS_PORT',['../group__mqtt.html#ga6610174f17b9ecbcf2bc66a4fd5a6b0f',1,'mqtt.h']]],
+  ['mqtt_5funsubscribe',['mqtt_unsubscribe',['../group__mqtt.html#ga0f133ef09cbe56c46ebe2cc21afccf3f',1,'mqtt.h']]],
+  ['mqtt_5fvar_5fheader_5fbuffer_5flen',['MQTT_VAR_HEADER_BUFFER_LEN',['../group__mqtt__opts.html#ga8275ef78a85fb14c3ac1423c70e45805',1,'mqtt_opts.h']]],
+  ['msg',['msg',['../structapi__msg.html#aef71459b5251d796434f741ca630d528',1,'api_msg']]],
+  ['msg_5fidx',['msg_idx',['../structmqtt__client__s.html#aae7bd1da3461efef9616934feb166aa5',1,'mqtt_client_s']]],
+  ['mtu',['mtu',['../structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48',1,'netif']]],
+  ['mtu6',['mtu6',['../structnetif.html#acd78fca5dad6468605f38e327b3a5e72',1,'netif']]],
+  ['multithreading',['Multithreading',['../multithreading.html',1,'']]],
+  ['mib2_20statistics',['MIB2 statistics',['../group__netif__mib2.html',1,'']]],
+  ['mib2',['MIB2',['../group__snmp__mib2.html',1,'']]],
+  ['mailboxes',['Mailboxes',['../group__sys__mbox.html',1,'']]],
+  ['misc',['Misc',['../group__sys__misc.html',1,'']]],
+  ['mutexes',['Mutexes',['../group__sys__mutex.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/all_f.html b/doc/doxygen/output/html/search/all_f.html
new file mode 100644
index 0000000..6ecfc0e
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/all_f.js b/doc/doxygen/output/html/search/all_f.js
new file mode 100644
index 0000000..24f8267
--- /dev/null
+++ b/doc/doxygen/output/html/search/all_f.js
@@ -0,0 +1,255 @@
+var searchData=
+[
+  ['neighbor_20discovery',['Neighbor discovery',['../group__lwip__opts__nd6.html',1,'']]],
+  ['netconn',['Netconn',['../group__lwip__opts__netconn.html',1,'']]],
+  ['netif',['NETIF',['../group__lwip__opts__netif.html',1,'']]],
+  ['no_5fsys',['NO_SYS',['../group__lwip__opts__nosys.html',1,'']]],
+  ['n',['n',['../structapi__msg.html#adbbfc2baa8088b31fc722365237e5807',1,'api_msg']]],
+  ['na_5fheader',['na_header',['../structna__header.html',1,'']]],
+  ['name',['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',['name_size',['../structnetbios__answer.html#a5828dc04e01a1f7b734019db428fd46d',1,'netbios_answer']]],
+  ['nd6',['nd6',['../structstats__.html#ab348a3a4b593b05d7df1293a06af8adf',1,'stats_']]],
+  ['nd6_2ec',['nd6.c',['../nd6_8c.html',1,'']]],
+  ['nd6_2eh',['nd6.h',['../nd6_8h.html',1,'(Global Namespace)'],['../prot_2nd6_8h.html',1,'(Global Namespace)']]],
+  ['nd6_5fadjust_5fmld_5fmembership',['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',['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',['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',['nd6_find_route',['../nd6_8c.html#ac5ce11eaecfb486c322641427f47cffe',1,'nd6_find_route(const ip6_addr_t *ip6addr):&#160;nd6.c'],['../nd6_8h.html#ac5ce11eaecfb486c322641427f47cffe',1,'nd6_find_route(const ip6_addr_t *ip6addr):&#160;nd6.c']]],
+  ['nd6_5fget_5fdestination_5fmtu',['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',['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',['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_5fneighbor_5fcache_5fentry',['nd6_neighbor_cache_entry',['../structnd6__neighbor__cache__entry.html',1,'']]],
+  ['nd6_5foption_5ftype_5fmtu',['ND6_OPTION_TYPE_MTU',['../prot_2nd6_8h.html#aab6c15c9bea51fbdcc660f718bb403a8',1,'nd6.h']]],
+  ['nd6_5foption_5ftype_5fprefix_5finfo',['ND6_OPTION_TYPE_PREFIX_INFO',['../prot_2nd6_8h.html#a0225d4c8911efdbdbc2b40de208906c2',1,'nd6.h']]],
+  ['nd6_5foption_5ftype_5frdnss',['ND6_OPTION_TYPE_RDNSS',['../prot_2nd6_8h.html#a3188b9704a8ca598f54b87c3db73272e',1,'nd6.h']]],
+  ['nd6_5foption_5ftype_5fredir_5fhdr',['ND6_OPTION_TYPE_REDIR_HDR',['../prot_2nd6_8h.html#aeaa575c1a66ccaa2dc62ff2c0bd71619',1,'nd6.h']]],
+  ['nd6_5foption_5ftype_5froute_5finfo',['ND6_OPTION_TYPE_ROUTE_INFO',['../prot_2nd6_8h.html#aff2e03766ee1fa15263c4aeda5097d28',1,'nd6.h']]],
+  ['nd6_5foption_5ftype_5fsource_5flladdr',['ND6_OPTION_TYPE_SOURCE_LLADDR',['../prot_2nd6_8h.html#a68ce8550a20cd30093d6e79e1ca51842',1,'nd6.h']]],
+  ['nd6_5fpriv_2eh',['nd6_priv.h',['../nd6__priv_8h.html',1,'']]],
+  ['nd6_5fq_5fentry',['nd6_q_entry',['../structnd6__q__entry.html',1,'']]],
+  ['nd6_5fra_5fflag_5fmanaged_5faddr_5fconfig',['ND6_RA_FLAG_MANAGED_ADDR_CONFIG',['../prot_2nd6_8h.html#a7fb1b330719d83b7525374f4beca51bc',1,'nd6.h']]],
+  ['nd6_5freachability_5fhint',['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',['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_5frtr_5fsolicitation_5finterval',['ND6_RTR_SOLICITATION_INTERVAL',['../nd6_8h.html#a2fec65c0785551bad3a282ddee4062ac',1,'nd6.h']]],
+  ['nd6_5fstats',['ND6_STATS',['../group__lwip__opts__stats.html#ga753161114df60299a28d51c092c756cf',1,'opt.h']]],
+  ['nd6_5ftmr',['nd6_tmr',['../nd6_8c.html#a754781b509e69c35a7a4ee7e380399fe',1,'nd6_tmr(void):&#160;nd6.c'],['../nd6_8h.html#a754781b509e69c35a7a4ee7e380399fe',1,'nd6_tmr(void):&#160;nd6.c']]],
+  ['nd6_5ftmr_5finterval',['ND6_TMR_INTERVAL',['../nd6_8h.html#a3250c1e32713635d588cf25865ebed56',1,'nd6.h']]],
+  ['netb_5fhflag_5fresponse',['NETB_HFLAG_RESPONSE',['../netbiosns_8c.html#af09685abf1739c802bc8772b35b7fb1c',1,'netbiosns.c']]],
+  ['netb_5fnflag_5funique',['NETB_NFLAG_UNIQUE',['../netbiosns_8c.html#ae00d45caef5a670e3aedde2788b3f212',1,'netbiosns.c']]],
+  ['netbios_5fanswer',['netbios_answer',['../structnetbios__answer.html',1,'']]],
+  ['netbios_5fhdr',['netbios_hdr',['../structnetbios__hdr.html',1,'']]],
+  ['netbios_5flwip_5fname',['NETBIOS_LWIP_NAME',['../group__netbiosns__opts.html#ga468c2ae67a79ce082ee585a438f7373b',1,'netbiosns_opts.h']]],
+  ['netbios_5fname_5fhdr',['netbios_name_hdr',['../structnetbios__name__hdr.html',1,'']]],
+  ['netbios_5fname_5flen',['NETBIOS_NAME_LEN',['../netbiosns_8c.html#a4b83658c5bbb9ac90aca4351086a9a00',1,'netbiosns.c']]],
+  ['netbios_5fname_5fttl',['NETBIOS_NAME_TTL',['../netbiosns_8c.html#a35d43ea3290f6412e45598b610f03cf1',1,'netbiosns.c']]],
+  ['netbios_5fquestion_5fhdr',['netbios_question_hdr',['../structnetbios__question__hdr.html',1,'']]],
+  ['netbios_5fresp',['netbios_resp',['../structnetbios__resp.html',1,'']]],
+  ['netbios_20responder',['NETBIOS responder',['../group__netbiosns.html',1,'']]],
+  ['netbiosns_2ec',['netbiosns.c',['../netbiosns_8c.html',1,'']]],
+  ['netbiosns_2eh',['netbiosns.h',['../netbiosns_8h.html',1,'']]],
+  ['netbiosns_5finit',['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_5fopts_2eh',['netbiosns_opts.h',['../netbiosns__opts_8h.html',1,'']]],
+  ['netbiosns_5fstop',['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',['netbuf',['../structnetbuf.html',1,'netbuf'],['../group__netbuf.html',1,'(Global Namespace)']]],
+  ['netbuf_2ec',['netbuf.c',['../netbuf_8c.html',1,'']]],
+  ['netbuf_2eh',['netbuf.h',['../netbuf_8h.html',1,'']]],
+  ['netbuf_5falloc',['netbuf_alloc',['../group__netbuf.html#ga0b831b80d3aa64938abdbfb6d89eaac0',1,'netbuf_alloc(struct netbuf *buf, u16_t size):&#160;netbuf.c'],['../group__netbuf.html#ga0b831b80d3aa64938abdbfb6d89eaac0',1,'netbuf_alloc(struct netbuf *buf, u16_t size):&#160;netbuf.c']]],
+  ['netbuf_5fchain',['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',['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',['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',['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_5fflag_5fchksum',['NETBUF_FLAG_CHKSUM',['../netbuf_8h.html#ab75db64a9e84eb67a382c30e382d417c',1,'netbuf.h']]],
+  ['netbuf_5fflag_5fdestaddr',['NETBUF_FLAG_DESTADDR',['../netbuf_8h.html#ab38abb4213df4c00b9b3ab844322a090',1,'netbuf.h']]],
+  ['netbuf_5ffree',['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',['netbuf_new',['../group__netbuf.html#gaaba704cd963e35e71145de9f5112991d',1,'netbuf_new(void):&#160;netbuf.c'],['../group__netbuf.html#gaaba704cd963e35e71145de9f5112991d',1,'netbuf_new(void):&#160;netbuf.c']]],
+  ['netbuf_5fnext',['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',['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',['netconn',['../structnetconn.html',1,'netconn'],['../group__netconn.html',1,'(Global Namespace)']]],
+  ['netconn_5faccept',['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_5faddr',['netconn_addr',['../group__netconn__common.html#ga37ec33522cfc26fa57251c33e4cebb3e',1,'api.h']]],
+  ['netconn_5falloc',['netconn_alloc',['../api__msg_8c.html#a919865fa64270a3e4cb719ddff2fead9',1,'netconn_alloc(enum netconn_type t, netconn_callback callback):&#160;api_msg.c'],['../api__msg_8h.html#a919865fa64270a3e4cb719ddff2fead9',1,'netconn_alloc(enum netconn_type t, netconn_callback callback):&#160;api_msg.c']]],
+  ['netconn_5fbind',['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',['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_5fcallback',['netconn_callback',['../api_8h.html#a3e130339f00202b3ab714af502163a2d',1,'api.h']]],
+  ['netconn_5fclose',['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',['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',['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',['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',['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_5fevt',['netconn_evt',['../api_8h.html#af722260882d14c49afb765293ffb0155',1,'api.h']]],
+  ['netconn_5ffin_5frx_5fpending',['NETCONN_FIN_RX_PENDING',['../api_8h.html#a24d62a2a03ba421fcf2bdce1ea89b949',1,'api.h']]],
+  ['netconn_5fflag_5fcheck_5fwritespace',['NETCONN_FLAG_CHECK_WRITESPACE',['../api_8h.html#a9d791955a4256a0589a3844e4e6f0f9c',1,'api.h']]],
+  ['netconn_5fflag_5fin_5fnonblocking_5fconnect',['NETCONN_FLAG_IN_NONBLOCKING_CONNECT',['../api_8h.html#a70bb861ee643b60ee402fd48f581f58d',1,'api.h']]],
+  ['netconn_5fflag_5fipv6_5fv6only',['NETCONN_FLAG_IPV6_V6ONLY',['../api_8h.html#a60892e4eb139f10157847fea4266bf5b',1,'api.h']]],
+  ['netconn_5fflag_5fmboxclosed',['NETCONN_FLAG_MBOXCLOSED',['../api_8h.html#af77be7590d3712259e78103c1dddf63f',1,'api.h']]],
+  ['netconn_5fflag_5fnon_5fblocking',['NETCONN_FLAG_NON_BLOCKING',['../api_8h.html#abee57aa0ba63e35742d411bc5224900a',1,'api.h']]],
+  ['netconn_5ffree',['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_5fget_5fipv6only',['netconn_get_ipv6only',['../group__netconn__common.html#gaf001c7d5fbf97c04eb1d9ac7d14c9c31',1,'api.h']]],
+  ['netconn_5fget_5frecvbufsize',['netconn_get_recvbufsize',['../api_8h.html#ac0298c287dc3823047c378c014ff1eb0',1,'api.h']]],
+  ['netconn_5fget_5fsendtimeout',['netconn_get_sendtimeout',['../api_8h.html#a7d6e84458eec796b0b0ce1bb247f323f',1,'api.h']]],
+  ['netconn_5fgetaddr',['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',['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_5figmp',['netconn_igmp',['../api_8h.html#a5c6ded2c082de1536019b197a0a912db',1,'api.h']]],
+  ['netconn_5fis_5fnonblocking',['netconn_is_nonblocking',['../api_8h.html#a5789f0030b895b40625a74deb5a1092f',1,'api.h']]],
+  ['netconn_5fjoin_5fleave_5fgroup',['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',['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',['netconn_listen',['../group__netconn__tcp.html#ga43e3f4c2169dec0f666c502e490416b7',1,'api.h']]],
+  ['netconn_5flisten_5fwith_5fbacklog',['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',['netconn_new',['../group__netconn__common.html#gab2bd1d5e633e14e428cfc0ca908d5e0c',1,'api.h']]],
+  ['netconn_5fnew_5fwith_5fproto_5fand_5fcallback',['netconn_new_with_proto_and_callback',['../api__lib_8c.html#ad0a0434e5ff08bb350740cb840e2aca8',1,'netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback):&#160;api_lib.c'],['../api_8h.html#ad0a0434e5ff08bb350740cb840e2aca8',1,'netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback):&#160;api_lib.c']]],
+  ['netconn_5fpeer',['netconn_peer',['../group__netconn__common.html#ga1065e769f2276270722a7700182077bc',1,'api.h']]],
+  ['netconn_5fprepare_5fdelete',['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_5fraw',['NETCONN_RAW',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a0d828a7e9c1614d4cae56602b09f39e9',1,'api.h']]],
+  ['netconn_5frecv',['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',['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',['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',['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',['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',['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',['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_5fset_5fipv6only',['netconn_set_ipv6only',['../group__netconn__common.html#gae56911e2d92bebf43d73e116530e41f1',1,'api.h']]],
+  ['netconn_5fset_5fnonblocking',['netconn_set_nonblocking',['../api_8h.html#a6a578dd5b55e4457e0d23574ec9c55bb',1,'api.h']]],
+  ['netconn_5fset_5frecvbufsize',['netconn_set_recvbufsize',['../api_8h.html#a04785274634a5b504c760731c2e70725',1,'api.h']]],
+  ['netconn_5fset_5fsendtimeout',['netconn_set_sendtimeout',['../api_8h.html#a3ce3ad9f660e99b11fec20cafaf8f016',1,'api.h']]],
+  ['netconn_5fshutdown',['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_5fstate',['netconn_state',['../api_8h.html#a2c6c9c1869f443c5ec7b31180a44fada',1,'api.h']]],
+  ['netconn_5ftcp',['NETCONN_TCP',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a75d14318b91af7a452230189f47e5e1a',1,'api.h']]],
+  ['netconn_5ftcp_5fipv6',['NETCONN_TCP_IPV6',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91ae7efa7c4e50b7b381531a2136cd5a013',1,'api.h']]],
+  ['netconn_5ftype',['netconn_type',['../api_8h.html#a62cd17ad03bb2817cb0c419e1c9790b1',1,'netconn_type():&#160;api.h'],['../group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91',1,'netconn_type():&#160;api.h']]],
+  ['netconn_5fudp',['NETCONN_UDP',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a6b8ec191d69f7e639f4ab40779069636',1,'api.h']]],
+  ['netconn_5fudp_5fipv6',['NETCONN_UDP_IPV6',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a34ee1c89f6705462590a4fe2c9772d9e',1,'api.h']]],
+  ['netconn_5fudplite',['NETCONN_UDPLITE',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a655e1625cc7e6a93f1e3d2646f56a1e4',1,'api.h']]],
+  ['netconn_5fudplite_5fipv6',['NETCONN_UDPLITE_IPV6',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91aa9cabc9d90606b5c5939fcc02ac588c7',1,'api.h']]],
+  ['netconn_5fudpnochksum',['NETCONN_UDPNOCHKSUM',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a7e0c3f566b3d4321b36b711b6b1ad6de',1,'api.h']]],
+  ['netconn_5fudpnochksum_5fipv6',['NETCONN_UDPNOCHKSUM_IPV6',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a2c7f548d26f6c411f084b6c59247b60e',1,'api.h']]],
+  ['netconn_5fwrite',['netconn_write',['../group__netconn__tcp.html#gafea5e9b90770a7c6cd0762ceb65e5b46',1,'api.h']]],
+  ['netconn_5fwrite_5fpartly',['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',['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']]],
+  ['netdb_2ec',['netdb.c',['../netdb_8c.html',1,'']]],
+  ['netdb_2eh',['netdb.h',['../compat_2posix_2netdb_8h.html',1,'(Global Namespace)'],['../lwip_2netdb_8h.html',1,'(Global Namespace)']]],
+  ['netdb_20api',['NETDB API',['../group__netdbapi.html',1,'']]],
+  ['netif',['netif',['../structnetif.html',1,'netif'],['../structmdns__packet.html#ac7307f344f654cb954f92d578dc7c989',1,'mdns_packet::netif()'],['../structmdns__outpacket.html#ad0bd066f127d35a0ce67193e1cd07430',1,'mdns_outpacket::netif()'],['../group__netif.html',1,'(Global Namespace)']]],
+  ['netif_2ec',['netif.c',['../netif_8c.html',1,'']]],
+  ['netif_2eh',['netif.h',['../netif_8h.html',1,'']]],
+  ['netif_5fadd',['netif_add',['../group__netif.html#gade5498543e74067f28cc6bef0209e3be',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#gade5498543e74067f28cc6bef0209e3be',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',['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',['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_5fmac_5ffilter',['NETIF_ADD_MAC_FILTER',['../netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a4186fbaf94be956ea1a3b02cd1cccb1f',1,'netif.h']]],
+  ['netif_5fadd_5fnoaddr',['netif_add_noaddr',['../group__netif.html#gac20150ac754ff1f88afeaa33be3552a4',1,'netif_add_noaddr(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input):&#160;netif.c'],['../group__netif.html#gac20150ac754ff1f88afeaa33be3552a4',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',['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',['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_5fdebug',['NETIF_DEBUG',['../group__lwip__opts__debugmsg.html#ga2dfad02b075a7f9a8791a66fe40864a4',1,'opt.h']]],
+  ['netif_5fdefault',['netif_default',['../netif_8c.html#a3d0925cbce550ed461907aee816713ba',1,'netif_default():&#160;netif.c'],['../netif_8h.html#a3d0925cbce550ed461907aee816713ba',1,'netif_default():&#160;netif.c']]],
+  ['netif_5fdel_5fmac_5ffilter',['NETIF_DEL_MAC_FILTER',['../netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a7ad3406353906deb4e64ebeed349e07e',1,'netif.h']]],
+  ['netif_5fext_5fcallback_5fargs_5ft',['netif_ext_callback_args_t',['../unionnetif__ext__callback__args__t.html',1,'']]],
+  ['netif_5fext_5fcallback_5ffn',['netif_ext_callback_fn',['../group__netif.html#ga5ee213cea065424c89c66f138c008da1',1,'netif.h']]],
+  ['netif_5ffind',['netif_find',['../group__netif.html#ga69c93a139e8a1f6ef4e3d076a2897def',1,'netif_find(const char *name):&#160;netif.c'],['../group__netif.html#ga69c93a139e8a1f6ef4e3d076a2897def',1,'netif_find(const char *name):&#160;netif.c']]],
+  ['netif_5fflag_5fbroadcast',['NETIF_FLAG_BROADCAST',['../group__netif__flags.html#gaef64fe15c82bc7b235366923e517104e',1,'netif.h']]],
+  ['netif_5fflag_5fetharp',['NETIF_FLAG_ETHARP',['../group__netif__flags.html#ga92448dc510bc8d700c09e5c971ef0676',1,'netif.h']]],
+  ['netif_5fflag_5fethernet',['NETIF_FLAG_ETHERNET',['../group__netif__flags.html#ga76ad9d0cf9f029df0ab2a998c64040dc',1,'netif.h']]],
+  ['netif_5fflag_5figmp',['NETIF_FLAG_IGMP',['../group__netif__flags.html#gac9493b923d733c73f6006d9714826558',1,'netif.h']]],
+  ['netif_5fflag_5flink_5fup',['NETIF_FLAG_LINK_UP',['../group__netif__flags.html#ga75f5a2b9276c93e3bd18a568459fd2d8',1,'netif.h']]],
+  ['netif_5fflag_5fmld6',['NETIF_FLAG_MLD6',['../group__netif__flags.html#gab14fbe1447d2fdbdf5abc87f51eb6508',1,'netif.h']]],
+  ['netif_5fflag_5fup',['NETIF_FLAG_UP',['../group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e',1,'netif.h']]],
+  ['netif_5fget_5fby_5findex',['netif_get_by_index',['../group__netif.html#gae4df885347c800a5486d3bf25981300e',1,'netif_get_by_index(u8_t idx):&#160;netif.c'],['../group__netif.html#gae4df885347c800a5486d3bf25981300e',1,'netif_get_by_index(u8_t idx):&#160;netif.c']]],
+  ['netif_5fget_5fclient_5fdata',['netif_get_client_data',['../group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5',1,'netif.h']]],
+  ['netif_5fget_5fhostname',['netif_get_hostname',['../group__netif.html#ga5a378ba73e60cd1e5235474f0db22978',1,'netif.h']]],
+  ['netif_5fget_5fip6_5faddr_5fmatch',['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',['netif_igmp_data',['../group__igmp.html#gad990dfc5ed8b644c16cc578c876e588d',1,'igmp.h']]],
+  ['netif_5figmp_5fmac_5ffilter_5ffn',['netif_igmp_mac_filter_fn',['../netif_8h.html#a71cad3277efe29191eef3348f4bf21f7',1,'netif.h']]],
+  ['netif_5findex_5fto_5fname',['netif_index_to_name',['../group__netif.html#ga3ff104d083914e87a7805a0b90a85755',1,'netif_index_to_name(u8_t idx, char *name):&#160;netif.c'],['../group__netif.html#ga3ff104d083914e87a7805a0b90a85755',1,'netif_index_to_name(u8_t idx, char *name):&#160;netif.c']]],
+  ['netif_5finit_5ffn',['netif_init_fn',['../netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5',1,'netif.h']]],
+  ['netif_5finput',['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',['netif_input_fn',['../netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e',1,'netif.h']]],
+  ['netif_5finvoke_5fext_5fcallback',['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_5fip4_5faddr',['netif_ip4_addr',['../group__netif__ip4.html#gac9b6e63b5dd2968fe0a4813f3eefb55d',1,'netif.h']]],
+  ['netif_5fip4_5fgw',['netif_ip4_gw',['../group__netif__ip4.html#ga86d69faf416765b7f8faf60a43cc50da',1,'netif.h']]],
+  ['netif_5fip4_5fnetmask',['netif_ip4_netmask',['../group__netif__ip4.html#ga952d1436f2428b92fc8197bcf2f8fca3',1,'netif.h']]],
+  ['netif_5fip6_5faddr',['netif_ip6_addr',['../group__netif__ip6.html#ga7ec0623f1a858a0cdb187beaa89df365',1,'netif.h']]],
+  ['netif_5fip6_5faddr_5fset',['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',['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_5fip_5faddr4',['netif_ip_addr4',['../group__netif__ip4.html#ga54179a2f3b7cc35b23ee8d692d8d8022',1,'netif.h']]],
+  ['netif_5fip_5faddr6',['netif_ip_addr6',['../group__netif__ip6.html#gae424e336fe9f013b30d4065fd35c91ee',1,'netif.h']]],
+  ['netif_5fip_5fgw4',['netif_ip_gw4',['../group__netif__ip4.html#ga7ea95478e000701423b7f6316e575a2a',1,'netif.h']]],
+  ['netif_5fip_5fnetmask4',['netif_ip_netmask4',['../group__netif__ip4.html#ga58518602f388d2640985a01a312f0a51',1,'netif.h']]],
+  ['netif_5fis_5flink_5fup',['netif_is_link_up',['../netif_8h.html#a780be4c3fa9f7f2534f7865666c3a1b8',1,'netif.h']]],
+  ['netif_5fis_5fup',['netif_is_up',['../group__netif.html#ga94a4c24c988afc0a577387730f303b19',1,'netif.h']]],
+  ['netif_5flinkoutput_5ffn',['netif_linkoutput_fn',['../netif_8h.html#ab75e9d808bc1b788bea84213e6a111ed',1,'netif.h']]],
+  ['netif_5flist',['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',['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',['netif_mac_filter_action',['../netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0',1,'netif.h']]],
+  ['netif_5fmax_5fhwaddr_5flen',['NETIF_MAX_HWADDR_LEN',['../netif_8h.html#ab887a8ec553de1be1d04cf2961c63c41',1,'netif.h']]],
+  ['netif_5fmld6_5fdata',['netif_mld6_data',['../group__mld6.html#ga02a2259082f22c5989a3c929be95e641',1,'mld6.h']]],
+  ['netif_5fmld_5fmac_5ffilter_5ffn',['netif_mld_mac_filter_fn',['../netif_8h.html#af2ed0716122b65e7feb43e0dd99ae468',1,'netif.h']]],
+  ['netif_5fname_5fto_5findex',['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',['NETIF_NAMESIZE',['../netif_8h.html#a302f24fbfe883ee4840ffc71f267ae2a',1,'netif.h']]],
+  ['netif_5fnsc_5freason_5ft',['netif_nsc_reason_t',['../group__netif.html#gab2b9387389513a02027c62e246723808',1,'netif.h']]],
+  ['netif_5foutput_5ffn',['netif_output_fn',['../netif_8h.html#a7b4893aa2ed8c606a0cd7aa932fe5067',1,'netif.h']]],
+  ['netif_5foutput_5fip6_5ffn',['netif_output_ip6_fn',['../netif_8h.html#a343a5b14136a51957d552527384674b3',1,'netif.h']]],
+  ['netif_5fpoll',['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',['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',['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',['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',['netif_set_client_data',['../group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f',1,'netif.h']]],
+  ['netif_5fset_5fdefault',['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',['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',['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_5fhostname',['netif_set_hostname',['../group__netif.html#ga5e5d2c6fa5566a24dd848f3a2c7c957f',1,'netif.h']]],
+  ['netif_5fset_5figmp_5fmac_5ffilter',['netif_set_igmp_mac_filter',['../group__netif.html#ga3428b3f8195249c6cd8704a4db46b401',1,'netif.h']]],
+  ['netif_5fset_5fipaddr',['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',['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',['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',['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',['netif_set_mld_mac_filter',['../group__netif.html#ga97f30bb5542e4c07d3b32e3c754e104c',1,'netif.h']]],
+  ['netif_5fset_5fnetmask',['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',['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',['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',['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',['netif_status_callback_fn',['../netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436',1,'netif.h']]],
+  ['netif_5fto_5fnum',['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']]],
+  ['netif_20api',['NETIF API',['../group__netifapi.html',1,'']]],
+  ['netifapi_2ec',['netifapi.c',['../netifapi_8c.html',1,'']]],
+  ['netifapi_2eh',['netifapi.h',['../netifapi_8h.html',1,'']]],
+  ['netifapi_5farp_5fadd',['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',['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',['netifapi_autoip_start',['../group__netifapi__autoip.html#gaca26bae2a21e0732a7599df14f880af2',1,'netifapi.h']]],
+  ['netifapi_5fautoip_5fstop',['netifapi_autoip_stop',['../group__netifapi__autoip.html#gae604f96907a52557e4ebd1bd5d80071d',1,'netifapi.h']]],
+  ['netifapi_5fdhcp_5finform',['netifapi_dhcp_inform',['../group__netifapi__dhcp4.html#ga29108975e9aa6463b9a574de961317e0',1,'netifapi.h']]],
+  ['netifapi_5fdhcp_5frelease',['netifapi_dhcp_release',['../group__netifapi__dhcp4.html#ga5aeaee24c11128df90a56fe091c9d409',1,'netifapi.h']]],
+  ['netifapi_5fdhcp_5frelease_5fand_5fstop',['netifapi_dhcp_release_and_stop',['../group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134',1,'netifapi.h']]],
+  ['netifapi_5fdhcp_5frenew',['netifapi_dhcp_renew',['../group__netifapi__dhcp4.html#ga642390e5efa53ad3095e01331c6a936b',1,'netifapi.h']]],
+  ['netifapi_5fdhcp_5fstart',['netifapi_dhcp_start',['../group__netifapi__dhcp4.html#gae64d13afc6e3b0f21aae04b66d0e3765',1,'netifapi.h']]],
+  ['netifapi_5fdhcp_5fstop',['netifapi_dhcp_stop',['../group__netifapi__dhcp4.html#ga2322c0d0e3eb6c1097d6f3942905dbd5',1,'netifapi.h']]],
+  ['netif_20related',['NETIF related',['../group__netifapi__netif.html',1,'']]],
+  ['netifapi_5fnetif_5fadd',['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',['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',['netifapi_netif_index_to_name',['../group__netifapi__netif.html#gab7914d77d0a89fd6c31048feb0bdafb6',1,'netifapi.c']]],
+  ['netifapi_5fnetif_5fname_5fto_5findex',['netifapi_netif_name_to_index',['../group__netifapi__netif.html#gad4a821182d01eafa4ca258f958fcb089',1,'netifapi.c']]],
+  ['netifapi_5fnetif_5fremove',['netifapi_netif_remove',['../group__netifapi__netif.html#ga0e3f522b900a0ba04421c4587e790373',1,'netifapi.h']]],
+  ['netifapi_5fnetif_5fset_5faddr',['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',['netifapi_netif_set_default',['../group__netifapi__netif.html#ga862d6cfa5d36b2c36d7b1671e8d95ccf',1,'netifapi.h']]],
+  ['netifapi_5fnetif_5fset_5fdown',['netifapi_netif_set_down',['../group__netifapi__netif.html#ga22c02edde32743ccfd41924da0601a16',1,'netifapi.h']]],
+  ['netifapi_5fnetif_5fset_5flink_5fdown',['netifapi_netif_set_link_down',['../group__netifapi__netif.html#ga2a9694804743f5466c4ecc400b7f07e4',1,'netifapi.h']]],
+  ['netifapi_5fnetif_5fset_5flink_5fup',['netifapi_netif_set_link_up',['../group__netifapi__netif.html#gac054a60a32447019913d34da63924853',1,'netifapi.h']]],
+  ['netifapi_5fnetif_5fset_5fup',['netifapi_netif_set_up',['../group__netifapi__netif.html#ga6ce735fe79efe1739e53b7f0e975ac76',1,'netifapi.h']]],
+  ['netifs',['NETIFs',['../group__netifs.html',1,'']]],
+  ['netvector',['netvector',['../structnetvector.html',1,'']]],
+  ['next',['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',['NO_SYS',['../group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b',1,'opt.h']]],
+  ['node',['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',['node_type',['../structsnmp__node.html#a1af8e20a688943a419b307bf123b1851',1,'snmp_node']]],
+  ['ns_5fheader',['ns_header',['../structns__header.html',1,'']]],
+  ['num',['num',['../structnetif.html#ab7ef01e505dd2feb781fe86756b1c973',1,'netif::num()'],['../structmemp__desc.html#a2c32db78e565b8812ca0e20fe929a8a7',1,'memp_desc::num()']]],
+  ['number_5fof_5falignment_5ferrors',['number_of_alignment_errors',['../structnetbios__answer.html#ab4f9ff63bd5529418c07762506189ad2',1,'netbios_answer']]],
+  ['number_5fof_5fcollisions',['number_of_collisions',['../structnetbios__answer.html#a45b7aec200434d3aaabc3ea6ebc46c1e',1,'netbios_answer']]],
+  ['number_5fof_5fcrcs',['number_of_crcs',['../structnetbios__answer.html#ab23a11db86a170b46aa8f8af434534d8',1,'netbios_answer']]],
+  ['number_5fof_5ffree_5fcommand_5fblocks',['number_of_free_command_blocks',['../structnetbios__answer.html#af41cbffb0ac6a9db3305b3fc64646219',1,'netbios_answer']]],
+  ['number_5fof_5fgood_5freceives',['number_of_good_receives',['../structnetbios__answer.html#a0eab7dbe733cc50f515126649de596ea',1,'netbios_answer']]],
+  ['number_5fof_5fgood_5fsends',['number_of_good_sends',['../structnetbios__answer.html#aa6088bca2a59ffcd077a474330511abd',1,'netbios_answer']]],
+  ['number_5fof_5fnames',['number_of_names',['../structnetbios__answer.html#ac4a95ccabbb945c9470e0cfd470be491',1,'netbios_answer']]],
+  ['number_5fof_5fno_5fresource_5fcondition',['number_of_no_resource_condition',['../structnetbios__answer.html#a62946dd0f27e9f9b9f295dcde4d3ea42',1,'netbios_answer']]],
+  ['number_5fof_5fpending_5fsessions',['number_of_pending_sessions',['../structnetbios__answer.html#a66098747155d5bd56f1c92aa8da10c1d',1,'netbios_answer']]],
+  ['number_5fof_5fretransmits',['number_of_retransmits',['../structnetbios__answer.html#ab175ad0f89102b3b3f81a41b5a72b321',1,'netbios_answer']]],
+  ['number_5fof_5fsend_5faborts',['number_of_send_aborts',['../structnetbios__answer.html#a1560e3864a0821acea9410e8c1d21408',1,'netbios_answer']]],
+  ['non_2dstandard_20functions',['Non-standard functions',['../group__sys__nonstandard.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/classes_0.html b/doc/doxygen/output/html/search/classes_0.html
new file mode 100644
index 0000000..1c3e406
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_0.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/classes_0.js b/doc/doxygen/output/html/search/classes_0.js
new file mode 100644
index 0000000..ef7d18e
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_0.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['_5flwiperf_5fsettings',['_lwiperf_settings',['../struct__lwiperf__settings.html',1,'']]],
+  ['_5flwiperf_5fstate_5ftcp',['_lwiperf_state_tcp',['../struct__lwiperf__state__tcp.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/classes_1.html b/doc/doxygen/output/html/search/classes_1.html
new file mode 100644
index 0000000..a8e7069
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_1.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/classes_1.js b/doc/doxygen/output/html/search/classes_1.js
new file mode 100644
index 0000000..29709ff
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_1.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+  ['altcp_5fallocator_5fs',['altcp_allocator_s',['../structaltcp__allocator__s.html',1,'']]],
+  ['api_5fmsg',['api_msg',['../structapi__msg.html',1,'']]],
+  ['autoip',['autoip',['../structautoip.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/classes_2.html b/doc/doxygen/output/html/search/classes_2.html
new file mode 100644
index 0000000..5c09c96
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_2.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/classes_2.js b/doc/doxygen/output/html/search/classes_2.js
new file mode 100644
index 0000000..64321cc
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_2.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['bridgeif_5finitdata_5fs',['bridgeif_initdata_s',['../structbridgeif__initdata__s.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/classes_3.html b/doc/doxygen/output/html/search/classes_3.html
new file mode 100644
index 0000000..5faaeba
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_3.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/classes_3.js b/doc/doxygen/output/html/search/classes_3.js
new file mode 100644
index 0000000..53426c2
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_3.js
@@ -0,0 +1,11 @@
+var searchData=
+[
+  ['dhcp6_5fmsg',['dhcp6_msg',['../structdhcp6__msg.html',1,'']]],
+  ['dhcp_5fmsg',['dhcp_msg',['../structdhcp__msg.html',1,'']]],
+  ['dns_5fanswer',['dns_answer',['../structdns__answer.html',1,'']]],
+  ['dns_5fapi_5fmsg',['dns_api_msg',['../structdns__api__msg.html',1,'']]],
+  ['dns_5fhdr',['dns_hdr',['../structdns__hdr.html',1,'']]],
+  ['dns_5fquery',['dns_query',['../structdns__query.html',1,'']]],
+  ['dns_5freq_5fentry',['dns_req_entry',['../structdns__req__entry.html',1,'']]],
+  ['dns_5ftable_5fentry',['dns_table_entry',['../structdns__table__entry.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/classes_4.html b/doc/doxygen/output/html/search/classes_4.html
new file mode 100644
index 0000000..b3f11bc
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_4.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/classes_4.js b/doc/doxygen/output/html/search/classes_4.js
new file mode 100644
index 0000000..c760ffd
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_4.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+  ['eth_5faddr',['eth_addr',['../structeth__addr.html',1,'']]],
+  ['eth_5fhdr',['eth_hdr',['../structeth__hdr.html',1,'']]],
+  ['eth_5fvlan_5fhdr',['eth_vlan_hdr',['../structeth__vlan__hdr.html',1,'']]],
+  ['etharp_5fhdr',['etharp_hdr',['../structetharp__hdr.html',1,'']]],
+  ['etharp_5fq_5fentry',['etharp_q_entry',['../structetharp__q__entry.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/classes_5.html b/doc/doxygen/output/html/search/classes_5.html
new file mode 100644
index 0000000..952ace6
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_5.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/classes_5.js b/doc/doxygen/output/html/search/classes_5.js
new file mode 100644
index 0000000..d3e6206
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_5.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['gethostbyname_5fr_5fhelper',['gethostbyname_r_helper',['../structgethostbyname__r__helper.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/classes_6.html b/doc/doxygen/output/html/search/classes_6.html
new file mode 100644
index 0000000..75eef9f
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_6.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/classes_6.js b/doc/doxygen/output/html/search/classes_6.js
new file mode 100644
index 0000000..e5db105
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_6.js
@@ -0,0 +1,24 @@
+var searchData=
+[
+  ['icmp6_5fecho_5fhdr',['icmp6_echo_hdr',['../structicmp6__echo__hdr.html',1,'']]],
+  ['icmp6_5fhdr',['icmp6_hdr',['../structicmp6__hdr.html',1,'']]],
+  ['icmp_5fecho_5fhdr',['icmp_echo_hdr',['../structicmp__echo__hdr.html',1,'']]],
+  ['ieee_5f802154_5fhdr',['ieee_802154_hdr',['../structieee__802154__hdr.html',1,'']]],
+  ['igmp_5fgroup',['igmp_group',['../structigmp__group.html',1,'']]],
+  ['igmp_5fmsg',['igmp_msg',['../structigmp__msg.html',1,'']]],
+  ['ip4_5faddr',['ip4_addr',['../structip4__addr.html',1,'']]],
+  ['ip4_5faddr_5fpacked',['ip4_addr_packed',['../structip4__addr__packed.html',1,'']]],
+  ['ip4_5faddr_5fwordaligned',['ip4_addr_wordaligned',['../structip4__addr__wordaligned.html',1,'']]],
+  ['ip6_5faddr',['ip6_addr',['../structip6__addr.html',1,'']]],
+  ['ip6_5faddr_5fpacked',['ip6_addr_packed',['../structip6__addr__packed.html',1,'']]],
+  ['ip6_5fhdr',['ip6_hdr',['../structip6__hdr.html',1,'']]],
+  ['ip6_5freass_5fhelper',['ip6_reass_helper',['../structip6__reass__helper.html',1,'']]],
+  ['ip6_5freassdata',['ip6_reassdata',['../structip6__reassdata.html',1,'']]],
+  ['ip_5faddr',['ip_addr',['../structip__addr.html',1,'']]],
+  ['ip_5fglobals',['ip_globals',['../structip__globals.html',1,'']]],
+  ['ip_5freass_5fhelper',['ip_reass_helper',['../structip__reass__helper.html',1,'']]],
+  ['ip_5freassdata',['ip_reassdata',['../structip__reassdata.html',1,'']]],
+  ['ipv4_5fchanged_5fs',['ipv4_changed_s',['../structnetif__ext__callback__args__t_1_1ipv4__changed__s.html',1,'netif_ext_callback_args_t']]],
+  ['ipv6_5faddr_5fstate_5fchanged_5fs',['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',['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_7.html b/doc/doxygen/output/html/search/classes_7.html
new file mode 100644
index 0000000..745f5f2
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_7.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/classes_7.js b/doc/doxygen/output/html/search/classes_7.js
new file mode 100644
index 0000000..925b3bd
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_7.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+  ['link_5fchanged_5fs',['link_changed_s',['../structnetif__ext__callback__args__t_1_1link__changed__s.html',1,'netif_ext_callback_args_t']]],
+  ['lowpan6_5fieee802154_5fdata',['lowpan6_ieee802154_data',['../structlowpan6__ieee802154__data.html',1,'']]],
+  ['lowpan6_5flink_5faddr',['lowpan6_link_addr',['../structlowpan6__link__addr.html',1,'']]],
+  ['lowpan6_5freass_5fhelper',['lowpan6_reass_helper',['../structlowpan6__reass__helper.html',1,'']]],
+  ['lwip_5fcyclic_5ftimer',['lwip_cyclic_timer',['../structlwip__cyclic__timer.html',1,'']]],
+  ['lwip_5fselect_5fcb',['lwip_select_cb',['../structlwip__select__cb.html',1,'']]],
+  ['lwip_5fsock',['lwip_sock',['../structlwip__sock.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/classes_8.html b/doc/doxygen/output/html/search/classes_8.html
new file mode 100644
index 0000000..5a443d9
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_8.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/classes_8.js b/doc/doxygen/output/html/search/classes_8.js
new file mode 100644
index 0000000..643301a
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_8.js
@@ -0,0 +1,16 @@
+var searchData=
+[
+  ['mdns_5fhost',['mdns_host',['../structmdns__host.html',1,'']]],
+  ['mdns_5foutpacket',['mdns_outpacket',['../structmdns__outpacket.html',1,'']]],
+  ['mdns_5fpacket',['mdns_packet',['../structmdns__packet.html',1,'']]],
+  ['mdns_5frr_5finfo',['mdns_rr_info',['../structmdns__rr__info.html',1,'']]],
+  ['mdns_5fservice',['mdns_service',['../structmdns__service.html',1,'']]],
+  ['mem',['mem',['../structmem.html',1,'']]],
+  ['memp_5fdesc',['memp_desc',['../structmemp__desc.html',1,'']]],
+  ['mld_5fgroup',['mld_group',['../structmld__group.html',1,'']]],
+  ['mld_5fheader',['mld_header',['../structmld__header.html',1,'']]],
+  ['mqtt_5fclient_5fs',['mqtt_client_s',['../structmqtt__client__s.html',1,'']]],
+  ['mqtt_5fconnect_5fclient_5finfo_5ft',['mqtt_connect_client_info_t',['../structmqtt__connect__client__info__t.html',1,'']]],
+  ['mqtt_5frequest_5ft',['mqtt_request_t',['../structmqtt__request__t.html',1,'']]],
+  ['mqtt_5fringbuf_5ft',['mqtt_ringbuf_t',['../structmqtt__ringbuf__t.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/classes_9.html b/doc/doxygen/output/html/search/classes_9.html
new file mode 100644
index 0000000..9cb55be
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_9.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/classes_9.js b/doc/doxygen/output/html/search/classes_9.js
new file mode 100644
index 0000000..aa95809
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_9.js
@@ -0,0 +1,17 @@
+var searchData=
+[
+  ['na_5fheader',['na_header',['../structna__header.html',1,'']]],
+  ['nd6_5fneighbor_5fcache_5fentry',['nd6_neighbor_cache_entry',['../structnd6__neighbor__cache__entry.html',1,'']]],
+  ['nd6_5fq_5fentry',['nd6_q_entry',['../structnd6__q__entry.html',1,'']]],
+  ['netbios_5fanswer',['netbios_answer',['../structnetbios__answer.html',1,'']]],
+  ['netbios_5fhdr',['netbios_hdr',['../structnetbios__hdr.html',1,'']]],
+  ['netbios_5fname_5fhdr',['netbios_name_hdr',['../structnetbios__name__hdr.html',1,'']]],
+  ['netbios_5fquestion_5fhdr',['netbios_question_hdr',['../structnetbios__question__hdr.html',1,'']]],
+  ['netbios_5fresp',['netbios_resp',['../structnetbios__resp.html',1,'']]],
+  ['netbuf',['netbuf',['../structnetbuf.html',1,'']]],
+  ['netconn',['netconn',['../structnetconn.html',1,'']]],
+  ['netif',['netif',['../structnetif.html',1,'']]],
+  ['netif_5fext_5fcallback_5fargs_5ft',['netif_ext_callback_args_t',['../unionnetif__ext__callback__args__t.html',1,'']]],
+  ['netvector',['netvector',['../structnetvector.html',1,'']]],
+  ['ns_5fheader',['ns_header',['../structns__header.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/classes_a.html b/doc/doxygen/output/html/search/classes_a.html
new file mode 100644
index 0000000..54940d7
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/classes_a.js b/doc/doxygen/output/html/search/classes_a.js
new file mode 100644
index 0000000..712c690
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_a.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+  ['pbuf',['pbuf',['../structpbuf.html',1,'']]],
+  ['pbuf_5fcustom',['pbuf_custom',['../structpbuf__custom.html',1,'']]],
+  ['pbuf_5fcustom_5fref',['pbuf_custom_ref',['../structpbuf__custom__ref.html',1,'']]],
+  ['pbuf_5from',['pbuf_rom',['../structpbuf__rom.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/classes_b.html b/doc/doxygen/output/html/search/classes_b.html
new file mode 100644
index 0000000..6071ae0
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_b.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/classes_b.js b/doc/doxygen/output/html/search/classes_b.js
new file mode 100644
index 0000000..49ddae4
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_b.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+  ['raw_5fpcb',['raw_pcb',['../structraw__pcb.html',1,'']]],
+  ['redirect_5fheader',['redirect_header',['../structredirect__header.html',1,'']]],
+  ['rs_5fheader',['rs_header',['../structrs__header.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/classes_c.html b/doc/doxygen/output/html/search/classes_c.html
new file mode 100644
index 0000000..6cf1d00
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_c.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/classes_c.js b/doc/doxygen/output/html/search/classes_c.js
new file mode 100644
index 0000000..7bb553b
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_c.js
@@ -0,0 +1,38 @@
+var searchData=
+[
+  ['smtp_5fsend_5frequest',['smtp_send_request',['../structsmtp__send__request.html',1,'']]],
+  ['smtp_5fsession',['smtp_session',['../structsmtp__session.html',1,'']]],
+  ['snmp_5fleaf_5fnode',['snmp_leaf_node',['../structsnmp__leaf__node.html',1,'']]],
+  ['snmp_5fmib',['snmp_mib',['../structsnmp__mib.html',1,'']]],
+  ['snmp_5fnext_5foid_5fstate',['snmp_next_oid_state',['../structsnmp__next__oid__state.html',1,'']]],
+  ['snmp_5fnode',['snmp_node',['../structsnmp__node.html',1,'']]],
+  ['snmp_5fnode_5finstance',['snmp_node_instance',['../structsnmp__node__instance.html',1,'']]],
+  ['snmp_5fobj_5fid',['snmp_obj_id',['../structsnmp__obj__id.html',1,'']]],
+  ['snmp_5foid_5frange',['snmp_oid_range',['../structsnmp__oid__range.html',1,'']]],
+  ['snmp_5fscalar_5farray_5fnode',['snmp_scalar_array_node',['../structsnmp__scalar__array__node.html',1,'']]],
+  ['snmp_5fscalar_5farray_5fnode_5fdef',['snmp_scalar_array_node_def',['../structsnmp__scalar__array__node__def.html',1,'']]],
+  ['snmp_5fscalar_5fnode',['snmp_scalar_node',['../structsnmp__scalar__node.html',1,'']]],
+  ['snmp_5ftable_5fcol_5fdef',['snmp_table_col_def',['../structsnmp__table__col__def.html',1,'']]],
+  ['snmp_5ftable_5fnode',['snmp_table_node',['../structsnmp__table__node.html',1,'']]],
+  ['snmp_5ftable_5fsimple_5fnode',['snmp_table_simple_node',['../structsnmp__table__simple__node.html',1,'']]],
+  ['snmp_5fthreadsync_5finstance',['snmp_threadsync_instance',['../structsnmp__threadsync__instance.html',1,'']]],
+  ['snmp_5fthreadsync_5fnode',['snmp_threadsync_node',['../structsnmp__threadsync__node.html',1,'']]],
+  ['snmp_5ftree_5fnode',['snmp_tree_node',['../structsnmp__tree__node.html',1,'']]],
+  ['snmp_5fvarbind',['snmp_varbind',['../structsnmp__varbind.html',1,'']]],
+  ['snmp_5fvarbind_5flen',['snmp_varbind_len',['../structsnmp__varbind__len.html',1,'']]],
+  ['snmp_5fvariant_5fvalue',['snmp_variant_value',['../unionsnmp__variant__value.html',1,'']]],
+  ['sntp_5fmsg',['sntp_msg',['../structsntp__msg.html',1,'']]],
+  ['sntp_5fserver',['sntp_server',['../structsntp__server.html',1,'']]],
+  ['sntp_5ftime',['sntp_time',['../structsntp__time.html',1,'']]],
+  ['sntp_5ftimestamps',['sntp_timestamps',['../structsntp__timestamps.html',1,'']]],
+  ['sockaddr_5faligned',['sockaddr_aligned',['../unionsockaddr__aligned.html',1,'']]],
+  ['stats_5f',['stats_',['../structstats__.html',1,'']]],
+  ['stats_5figmp',['stats_igmp',['../structstats__igmp.html',1,'']]],
+  ['stats_5fmem',['stats_mem',['../structstats__mem.html',1,'']]],
+  ['stats_5fmib2',['stats_mib2',['../structstats__mib2.html',1,'']]],
+  ['stats_5fmib2_5fnetif_5fctrs',['stats_mib2_netif_ctrs',['../structstats__mib2__netif__ctrs.html',1,'']]],
+  ['stats_5fproto',['stats_proto',['../structstats__proto.html',1,'']]],
+  ['stats_5fsys',['stats_sys',['../structstats__sys.html',1,'']]],
+  ['stats_5fsyselem',['stats_syselem',['../structstats__syselem.html',1,'']]],
+  ['status_5fchanged_5fs',['status_changed_s',['../structnetif__ext__callback__args__t_1_1status__changed__s.html',1,'netif_ext_callback_args_t']]]
+];
diff --git a/doc/doxygen/output/html/search/classes_d.html b/doc/doxygen/output/html/search/classes_d.html
new file mode 100644
index 0000000..d4a7ed7
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/classes_d.js b/doc/doxygen/output/html/search/classes_d.js
new file mode 100644
index 0000000..2ffecb6
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_d.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+  ['tcgi',['tCGI',['../structt_c_g_i.html',1,'']]],
+  ['tcp_5fext_5farg_5fcallbacks',['tcp_ext_arg_callbacks',['../structtcp__ext__arg__callbacks.html',1,'']]],
+  ['tcp_5fpcb',['tcp_pcb',['../structtcp__pcb.html',1,'']]],
+  ['tcp_5fpcb_5flisten',['tcp_pcb_listen',['../structtcp__pcb__listen.html',1,'']]],
+  ['tftp_5fcontext',['tftp_context',['../structtftp__context.html',1,'']]],
+  ['threadsync_5fdata',['threadsync_data',['../structthreadsync__data.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/classes_e.html b/doc/doxygen/output/html/search/classes_e.html
new file mode 100644
index 0000000..9a9f48c
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_e.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/classes_e.js b/doc/doxygen/output/html/search/classes_e.js
new file mode 100644
index 0000000..e1de147
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_e.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['udp_5fpcb',['udp_pcb',['../structudp__pcb.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/classes_f.html b/doc/doxygen/output/html/search/classes_f.html
new file mode 100644
index 0000000..a128d60
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/classes_f.js b/doc/doxygen/output/html/search/classes_f.js
new file mode 100644
index 0000000..2be8600
--- /dev/null
+++ b/doc/doxygen/output/html/search/classes_f.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['zepif_5finit',['zepif_init',['../structzepif__init.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/defines_0.html b/doc/doxygen/output/html/search/defines_0.html
new file mode 100644
index 0000000..5b25204
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_0.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/defines_0.js b/doc/doxygen/output/html/search/defines_0.js
new file mode 100644
index 0000000..f388cfa
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_0.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+  ['altcp_5fmbedtls_5fdebug',['ALTCP_MBEDTLS_DEBUG',['../altcp__tls__mbedtls__opts_8h.html#a7727456eeb0b3311213936413d238989',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5fsession_5fcache_5ftimeout_5fseconds',['ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS',['../altcp__tls__mbedtls__opts_8h.html#a6acb28346f87b2310fc00ec1fccba2b6',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fproxyconnect_5fclient_5fagent',['ALTCP_PROXYCONNECT_CLIENT_AGENT',['../altcp__proxyconnect_8c.html#a344227f22aa1b58f7ed737a2d4f4636f',1,'altcp_proxyconnect.c']]],
+  ['api_5fevent',['API_EVENT',['../api_8h.html#a3ce590f58be8f60dbde361920863b26d',1,'api.h']]],
+  ['arp_5fage_5frerequest_5fused_5funicast',['ARP_AGE_REREQUEST_USED_UNICAST',['../etharp_8c.html#ac71515a6f140b25de49e9bf432b2bb2a',1,'etharp.c']]],
+  ['arp_5fmaxpending',['ARP_MAXPENDING',['../etharp_8c.html#a0a03fea13e060da5a53a10a75a96def9',1,'etharp.c']]],
+  ['arp_5ftmr_5finterval',['ARP_TMR_INTERVAL',['../lwip_2etharp_8h.html#aaa3d8ed1eb1129f518345e37b38cfc37',1,'etharp.h']]],
+  ['autoip_5fremove_5fstruct',['autoip_remove_struct',['../autoip_8h.html#aaeb4b778fce078bee84144ab50916b15',1,'autoip.h']]],
+  ['autoip_5ftmr_5finterval',['AUTOIP_TMR_INTERVAL',['../autoip_8h.html#a8986919a452ab77eec9a199ff6668e92',1,'autoip.h']]]
+];
diff --git a/doc/doxygen/output/html/search/defines_1.html b/doc/doxygen/output/html/search/defines_1.html
new file mode 100644
index 0000000..91488cb
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_1.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/defines_1.js b/doc/doxygen/output/html/search/defines_1.js
new file mode 100644
index 0000000..69cff08
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_1.js
@@ -0,0 +1,21 @@
+var searchData=
+[
+  ['dhcp6_5fduid_5fllt',['DHCP6_DUID_LLT',['../prot_2dhcp6_8h.html#afe33f98cb94e0f18892a41502cf54e36',1,'dhcp6.h']]],
+  ['dhcp6_5fremove_5fstruct',['dhcp6_remove_struct',['../dhcp6_8h.html#a76941ddba22fe00dfc47d2f339f7aca3',1,'dhcp6.h']]],
+  ['dhcp6_5fstatus_5fsuccess',['DHCP6_STATUS_SUCCESS',['../prot_2dhcp6_8h.html#a878a7734e159826e82e958fe3a5ca175',1,'dhcp6.h']]],
+  ['dhcp6_5ftimer_5fmsecs',['DHCP6_TIMER_MSECS',['../dhcp6_8h.html#afdd69327dc7d9f5cc4f029d706f60c8f',1,'dhcp6.h']]],
+  ['dhcp_5fcoarse_5ftimer_5fmsecs',['DHCP_COARSE_TIMER_MSECS',['../dhcp_8h.html#ad84b8f4deec421bbf6fd85e8fae047d6',1,'dhcp.h']]],
+  ['dhcp_5fcoarse_5ftimer_5fsecs',['DHCP_COARSE_TIMER_SECS',['../dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e',1,'dhcp.h']]],
+  ['dhcp_5fcreate_5frand_5fxid',['DHCP_CREATE_RAND_XID',['../dhcp_8c.html#ad6de9c5120654454a330bf5de53c4835',1,'dhcp.c']]],
+  ['dhcp_5ffine_5ftimer_5fmsecs',['DHCP_FINE_TIMER_MSECS',['../dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f',1,'dhcp.h']]],
+  ['dhcp_5fmax_5fmsg_5flen',['DHCP_MAX_MSG_LEN',['../dhcp_8c.html#a63e9ec4517b80d8576f218d905e31a9b',1,'dhcp.c']]],
+  ['dhcp_5fmin_5freply_5flen',['DHCP_MIN_REPLY_LEN',['../dhcp_8c.html#aa52c2b64ef42fbad84a3bcd58052caab',1,'dhcp.c']]],
+  ['dhcp_5foptions_5flen',['DHCP_OPTIONS_LEN',['../prot_2dhcp_8h.html#ae99d4be0d03f6f9c8f02f63abde91a06',1,'dhcp.h']]],
+  ['dhcp_5fremove_5fstruct',['dhcp_remove_struct',['../dhcp_8h.html#aa92284faa099dac4331c1fc0b997dabc',1,'dhcp.h']]],
+  ['dns_5fmax_5fttl',['DNS_MAX_TTL',['../dns_8c.html#a7f5553dc4a0d2bf99ba1282a86df31e2',1,'dns.c']]],
+  ['dns_5fmquery_5fport',['DNS_MQUERY_PORT',['../prot_2dns_8h.html#a62d67af5ac6c6b3f98a6566a42564276',1,'dns.h']]],
+  ['dns_5fport_5fallowed',['DNS_PORT_ALLOWED',['../dns_8c.html#a97f3b0c56aeee091fdf2f07faf864ce0',1,'dns.c']]],
+  ['dns_5frand_5ftxid',['DNS_RAND_TXID',['../dns_8c.html#a9209c204996270af5cfdfd6e391267a1',1,'dns.c']]],
+  ['dns_5fserver_5fport',['DNS_SERVER_PORT',['../prot_2dns_8h.html#a9266b48706648ecf0625a3e651095317',1,'dns.h']]],
+  ['dns_5ftmr_5finterval',['DNS_TMR_INTERVAL',['../dns_8h.html#a464a7435c4c00735af59033d2acd83bb',1,'dns.h']]]
+];
diff --git a/doc/doxygen/output/html/search/defines_2.html b/doc/doxygen/output/html/search/defines_2.html
new file mode 100644
index 0000000..8655993
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_2.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/defines_2.js b/doc/doxygen/output/html/search/defines_2.js
new file mode 100644
index 0000000..bb1f845
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_2.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+  ['eai_5fnoname',['EAI_NONAME',['../lwip_2netdb_8h.html#a0bb00f48d6ba1e8c55b7d85c8e3a19a7',1,'netdb.h']]],
+  ['eth_5faddr',['ETH_ADDR',['../lwip_2prot_2ethernet_8h.html#a19c72ce98569e0fb55948a7587d704ee',1,'ethernet.h']]],
+  ['etharp_5fflag_5ftry_5fhard',['ETHARP_FLAG_TRY_HARD',['../etharp_8c.html#a96f8787ca623e704da1d32ca7dd6d6d9',1,'etharp.c']]],
+  ['etharp_5fgratuitous',['etharp_gratuitous',['../lwip_2etharp_8h.html#a83947dea159baf3420922084072e631e',1,'etharp.h']]]
+];
diff --git a/doc/doxygen/output/html/search/defines_3.html b/doc/doxygen/output/html/search/defines_3.html
new file mode 100644
index 0000000..a55d3ff
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_3.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/defines_3.js b/doc/doxygen/output/html/search/defines_3.js
new file mode 100644
index 0000000..c38eb67
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_3.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['fold_5fu32t',['FOLD_U32T',['../inet__chksum_8h.html#a6ffe83b4bdd1784a0671ee4778966a01',1,'inet_chksum.h']]]
+];
diff --git a/doc/doxygen/output/html/search/defines_4.html b/doc/doxygen/output/html/search/defines_4.html
new file mode 100644
index 0000000..54da39a
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_4.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/defines_4.js b/doc/doxygen/output/html/search/defines_4.js
new file mode 100644
index 0000000..21e32bd
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_4.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+  ['hostent_5fstorage',['HOSTENT_STORAGE',['../netdb_8c.html#acfc1e988534c0e497599b904739f92fe',1,'netdb.c']]],
+  ['http_5fis_5fdata_5fvolatile',['HTTP_IS_DATA_VOLATILE',['../httpd_8c.html#aa93d60e8af23b915b5b9652ff71e1300',1,'httpd.c']]],
+  ['http_5fis_5fhdr_5fvolatile',['HTTP_IS_HDR_VOLATILE',['../httpd_8c.html#af281bc4a762d56243e0b85dd4197174a',1,'httpd.c']]],
+  ['httpc_5fclient_5fagent',['HTTPC_CLIENT_AGENT',['../http__client_8c.html#aeda6122d341b879ba8b0fb2df834276a',1,'http_client.c']]],
+  ['httpc_5fdebug',['HTTPC_DEBUG',['../http__client_8c.html#a32d4c0e6e42327e21fb59dabdc152dd1',1,'http_client.c']]],
+  ['httpc_5fdebug_5frequest',['HTTPC_DEBUG_REQUEST',['../http__client_8c.html#ad2ec42c8e7adaef67266a5bd12c4ad2a',1,'http_client.c']]],
+  ['httpd_5fssi_5ftag_5funknown',['HTTPD_SSI_TAG_UNKNOWN',['../httpd_8h.html#aeb00bcd99ec9627b108832f0b58891ca',1,'httpd.h']]]
+];
diff --git a/doc/doxygen/output/html/search/defines_5.html b/doc/doxygen/output/html/search/defines_5.html
new file mode 100644
index 0000000..dd7bfdc
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_5.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/defines_5.js b/doc/doxygen/output/html/search/defines_5.js
new file mode 100644
index 0000000..bc4e370
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_5.js
@@ -0,0 +1,79 @@
+var searchData=
+[
+  ['in6addr_5fany_5finit',['IN6ADDR_ANY_INIT',['../lwip_2inet_8h.html#a1de876a356ee05a2e9427b741f99f49c',1,'inet.h']]],
+  ['in6addr_5floopback_5finit',['IN6ADDR_LOOPBACK_INIT',['../lwip_2inet_8h.html#a5562c81af19ee5988ddc5a5c6153cf37',1,'inet.h']]],
+  ['inaddr_5fany',['INADDR_ANY',['../lwip_2inet_8h.html#a5d1940045dc2e7de552f3d4ff13a74ab',1,'inet.h']]],
+  ['inaddr_5fbroadcast',['INADDR_BROADCAST',['../lwip_2inet_8h.html#a4a725f61ded23ce8a7dff8e82ed51986',1,'inet.h']]],
+  ['inaddr_5floopback',['INADDR_LOOPBACK',['../lwip_2inet_8h.html#ae1ac25d7797666cff6d01d6c795c2378',1,'inet.h']]],
+  ['inaddr_5fnone',['INADDR_NONE',['../lwip_2inet_8h.html#a3d2472d6cf31b73eeb829110dd0fffea',1,'inet.h']]],
+  ['ip4_5faddr',['IP4_ADDR',['../ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fcopy',['ip4_addr_copy',['../ip4__addr_8h.html#a2f4e9c339e897e6ca5cb4a2f1e8394d5',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fget_5fnetwork',['ip4_addr_get_network',['../ip4__addr_8h.html#a81658cb05ba504d13ee860e82dc444e9',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fget_5fu32',['ip4_addr_get_u32',['../ip4__addr_8h.html#ad50d93464bbbda199b585c54869a3a4b',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fisloopback',['ip4_addr_isloopback',['../ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fnetcmp',['ip4_addr_netcmp',['../ip4__addr_8h.html#afd43f6ceb2df8d50c84509ad1059f514',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset',['ip4_addr_set',['../ip4__addr_8h.html#a33a17a8d2025ce3715db835534868e88',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5fany',['ip4_addr_set_any',['../ip4__addr_8h.html#afaaed3762ce8e9de14fcf73b19964567',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5fhton',['ip4_addr_set_hton',['../ip4__addr_8h.html#a901850ec90b01b9bf6baf69561aa465a',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5floopback',['ip4_addr_set_loopback',['../ip4__addr_8h.html#a5c7eae50a387987a7f56c29c74255c3c',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5fu32',['ip4_addr_set_u32',['../ip4__addr_8h.html#aeb39f58b38435f89219c8ccb509eb520',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5fzero',['ip4_addr_set_zero',['../ip4__addr_8h.html#a973b6ad98e037fc45f1e11d29cda99ea',1,'ip4_addr.h']]],
+  ['ip4_5fcurrent_5fdest_5faddr',['ip4_current_dest_addr',['../ip_8h.html#a2833c8d59910dd7c0e87ab3bb174e720',1,'ip.h']]],
+  ['ip4_5fcurrent_5fheader',['ip4_current_header',['../ip_8h.html#a3ce482b7e08282effd670001198ecd87',1,'ip.h']]],
+  ['ip4_5fcurrent_5fsrc_5faddr',['ip4_current_src_addr',['../ip_8h.html#ad2a62f96b9431a79f0258dc13058b160',1,'ip.h']]],
+  ['ip6_5faddr',['IP6_ADDR',['../ip6__addr_8h.html#a30c92254d6abe631de6a5accfd491bc3',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock1',['IP6_ADDR_BLOCK1',['../ip6__addr_8h.html#ae258ebfa66d18c8c428bf3d8fd0f969c',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock2',['IP6_ADDR_BLOCK2',['../ip6__addr_8h.html#a9193137423b6b936d25c2e6cf33b4921',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock3',['IP6_ADDR_BLOCK3',['../ip6__addr_8h.html#a6466b1c0edd03d6a5986dcc79f7d8bb6',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock4',['IP6_ADDR_BLOCK4',['../ip6__addr_8h.html#a2a5d7de341ce708b7145ad4d72652c71',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock5',['IP6_ADDR_BLOCK5',['../ip6__addr_8h.html#a56a11cfaa169389c319f8bd027ac524c',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock6',['IP6_ADDR_BLOCK6',['../ip6__addr_8h.html#a116d7c5c8bf8531b27f8a9fa98e728c3',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock7',['IP6_ADDR_BLOCK7',['../ip6__addr_8h.html#ab87bee320ecc0e923931ee6f49802deb',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock8',['IP6_ADDR_BLOCK8',['../ip6__addr_8h.html#af3d1f9876bf256ec964bd3809d7ed1b4',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcmp',['ip6_addr_cmp',['../ip6__addr_8h.html#aea8d4c4134abff1c76bc997a91163fe1',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcmp_5fpacked',['ip6_addr_cmp_packed',['../ip6__addr_8h.html#a11fe84789e3f039b3f71009e802946a8',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcmp_5fzoneless',['ip6_addr_cmp_zoneless',['../ip6__addr_8h.html#ad0fc088972d395839a7ad75d3dab8322',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcopy',['ip6_addr_copy',['../ip6__addr_8h.html#a7b17e85a46bd8368ce27fc644e058073',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcopy_5ffrom_5fpacked',['ip6_addr_copy_from_packed',['../ip6__addr_8h.html#a05575d46c233ffb13fb03a3a2c8a16b3',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcopy_5fto_5fpacked',['ip6_addr_copy_to_packed',['../ip6__addr_8h.html#a6c46d12fa7d36c47b629d0ccdefa114b',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fnetcmp',['ip6_addr_netcmp',['../ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fnetcmp_5fzoneless',['ip6_addr_netcmp_zoneless',['../ip6__addr_8h.html#acc1622ab895680da0a3b6e5e56070342',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fpart',['IP6_ADDR_PART',['../ip6__addr_8h.html#a1d78feeb50aec8f2c07d840829f49ddd',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset',['ip6_addr_set',['../ip6__addr_8h.html#aa7b4ba4202b5f64dee605fe159e9c3ad',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5fany',['ip6_addr_set_any',['../ip6__addr_8h.html#ae2d1ce50ec6dbee890e2f8ae64abdf6b',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5fhton',['ip6_addr_set_hton',['../ip6__addr_8h.html#ad636c27d56d1b3deca9f780bc173d3c2',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5floopback',['ip6_addr_set_loopback',['../ip6__addr_8h.html#a02f5271e922f34a09153ce84839ad292',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5fzero',['ip6_addr_set_zero',['../ip6__addr_8h.html#af696d3b81f4cb9c40ece912de73ed53c',1,'ip6_addr.h']]],
+  ['ip6_5fcurrent_5fdest_5faddr',['ip6_current_dest_addr',['../ip_8h.html#a176525c2192d37ee9eaeba8012c5d9c0',1,'ip.h']]],
+  ['ip6_5fcurrent_5fheader',['ip6_current_header',['../ip_8h.html#af9bf74750c9d7a219ee88d240300fe69',1,'ip.h']]],
+  ['ip6_5fcurrent_5fsrc_5faddr',['ip6_current_src_addr',['../ip_8h.html#ac40a9e4a21ecf5bb39813bb6ca5bb245',1,'ip.h']]],
+  ['ip6_5freass_5ftmr_5finterval',['IP6_REASS_TMR_INTERVAL',['../ip6__frag_8h.html#ad0730ee4db9fbebdf071bb33d75698a2',1,'ip6_frag.h']]],
+  ['ip_5faccept_5flink_5flayer_5faddressed_5fport',['IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT',['../ip4_8c.html#a185c7d6380711847105430931692b267',1,'ip4.c']]],
+  ['ip_5faddr_5fset_5fzero_5fip4',['ip_addr_set_zero_ip4',['../ip__addr_8h.html#aecb93d575e65f835f1045a4e87e70ed9',1,'ip_addr.h']]],
+  ['ip_5fcurrent_5fdest_5faddr',['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',['ip_current_header_proto',['../ip_8h.html#af27c43c23b59d68a8463cd5ad035b20f',1,'ip.h']]],
+  ['ip_5fcurrent_5fheader_5ftot_5flen',['ip_current_header_tot_len',['../ip_8h.html#a2ca15ea285a10982294378cd7b8e83e2',1,'ip.h']]],
+  ['ip_5fcurrent_5finput_5fnetif',['ip_current_input_netif',['../ip_8h.html#ae214afa9d3f1b26fc8d538436b8fa3c4',1,'ip.h']]],
+  ['ip_5fcurrent_5fis_5fv6',['ip_current_is_v6',['../ip_8h.html#abc56623d434a204298a4e98352af1c9d',1,'ip.h']]],
+  ['ip_5fcurrent_5fnetif',['ip_current_netif',['../ip_8h.html#aabecef3c7653a9767c79245c44fcab9f',1,'ip.h']]],
+  ['ip_5fcurrent_5fsrc_5faddr',['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',['ip_get_option',['../ip_8h.html#a26e077f52de4a97ff89c02415c084518',1,'ip.h']]],
+  ['ip_5fhdr_5fget_5fversion',['IP_HDR_GET_VERSION',['../prot_2ip_8h.html#afc29766fb0707c63b64568c5fa44a374',1,'ip.h']]],
+  ['ip_5fnext_5fheader_5fptr',['ip_next_header_ptr',['../ip_8h.html#a68d25b5924b768cbf2f1a78bbabfce26',1,'ip.h']]],
+  ['ip_5fntoa',['ip_ntoa',['../ip4__addr_8h.html#a2b2230516e7911dfacc9b87644ba30f1',1,'ip4_addr.h']]],
+  ['ip_5foptions_5fsend',['IP_OPTIONS_SEND',['../ip4_8h.html#a516aa115f61c368cbe74fae2da2c6824',1,'ip4.h']]],
+  ['ip_5foutput_5fhinted',['ip_output_hinted',['../ip_8h.html#accbc01f37dd426a66de41693a5450207',1,'ip.h']]],
+  ['ip_5foutput_5fif_5fhdrincl',['ip_output_if_hdrincl',['../ip_8h.html#aac608b92f8f226c3574d6bb855f12496',1,'ip.h']]],
+  ['ip_5fpcb',['IP_PCB',['../ip_8h.html#a8bdf4b5f674375e76cdd968826d80e53',1,'ip.h']]],
+  ['ip_5freass_5fcheck_5foverlap',['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',['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',['ip_reset_option',['../ip_8h.html#a441c63f00c4b0cb69fc34ca6b55307cc',1,'ip.h']]],
+  ['ip_5fset_5foption',['ip_set_option',['../ip_8h.html#a13f48cf825c7f074dc05bea54e9d6a93',1,'ip.h']]],
+  ['ipaddr_5fany',['IPADDR_ANY',['../ip4__addr_8h.html#ad6ed0d622d61ecd6edd606e3b564f0a2',1,'ip4_addr.h']]],
+  ['ipaddr_5fbroadcast',['IPADDR_BROADCAST',['../ip4__addr_8h.html#ac661fca7e7d25e5cd379b811a767c29a',1,'ip4_addr.h']]],
+  ['ipaddr_5floopback',['IPADDR_LOOPBACK',['../ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e',1,'ip4_addr.h']]],
+  ['ipaddr_5fnone',['IPADDR_NONE',['../ip4__addr_8h.html#abc4b2e3531c4992f2ae4b8c0f9751544',1,'ip4_addr.h']]],
+  ['ipaddr_5fwordaligned_5fcopy_5ffrom_5fip4_5faddr_5ft',['IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T',['../lwip_2prot_2etharp_8h.html#a7dff02ff186f844b731cecbe614b7419',1,'etharp.h']]],
+  ['ipaddr_5fwordaligned_5fcopy_5fto_5fip4_5faddr_5ft',['IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T',['../lwip_2prot_2etharp_8h.html#a94f1c2a6ad7cecdfe759c0490ba7f030',1,'etharp.h']]],
+  ['ipv6_5ffrag_5fcopyheader',['IPV6_FRAG_COPYHEADER',['../ip6__frag_8h.html#a151e742cf7f0e5c3a08f31db0370cea7',1,'ip6_frag.h']]]
+];
diff --git a/doc/doxygen/output/html/search/defines_6.html b/doc/doxygen/output/html/search/defines_6.html
new file mode 100644
index 0000000..58d00e9
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_6.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/defines_6.js b/doc/doxygen/output/html/search/defines_6.js
new file mode 100644
index 0000000..0284d92
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_6.js
@@ -0,0 +1,46 @@
+var searchData=
+[
+  ['ll_5fip4_5fmulticast_5faddr_5f0',['LL_IP4_MULTICAST_ADDR_0',['../lwip_2prot_2ethernet_8h.html#afaf6cbccf9477c3505660e3a17860e07',1,'ethernet.h']]],
+  ['ll_5fip6_5fmulticast_5faddr_5f0',['LL_IP6_MULTICAST_ADDR_0',['../lwip_2prot_2ethernet_8h.html#a8ebe93c6ad2d743e6c952539257679b6',1,'ethernet.h']]],
+  ['lock_5ftcpip_5fcore',['LOCK_TCPIP_CORE',['../tcpip_8h.html#a4700525e737fc025fea4887b172e0c95',1,'tcpip.h']]],
+  ['lowpan6_5ftmr_5finterval',['LOWPAN6_TMR_INTERVAL',['../lowpan6_8h.html#aa258ae16a937c40333c8f97a7f236797',1,'lowpan6.h']]],
+  ['lwip_5f6lowpan_5f802154_5fhw_5fcrc',['LWIP_6LOWPAN_802154_HW_CRC',['../lowpan6__opts_8h.html#ae5bb9b8d695caec08930073edc7c6175',1,'lowpan6_opts.h']]],
+  ['lwip_5f6lowpan_5fcalc_5fcrc',['LWIP_6LOWPAN_CALC_CRC',['../lowpan6__opts_8h.html#ad20840e31a0a6eeec8666e4d4a979f43',1,'lowpan6_opts.h']]],
+  ['lwip_5f6lowpan_5finfer_5fshort_5faddress',['LWIP_6LOWPAN_INFER_SHORT_ADDRESS',['../lowpan6__opts_8h.html#a6a542cd72a6270b7231b8b93f8041207',1,'lowpan6_opts.h']]],
+  ['lwip_5f6lowpan_5fiphc',['LWIP_6LOWPAN_IPHC',['../lowpan6__opts_8h.html#a0f178a86d02e0ba4168cafe3de5f3afa',1,'lowpan6_opts.h']]],
+  ['lwip_5f6lowpan_5fnum_5fcontexts',['LWIP_6LOWPAN_NUM_CONTEXTS',['../lowpan6__opts_8h.html#a4ffa89f39abf93cc599f78c5a8bb0a4a',1,'lowpan6_opts.h']]],
+  ['lwip_5faltcp_5ftls_5fmbedtls',['LWIP_ALTCP_TLS_MBEDTLS',['../altcp__tls__mbedtls__opts_8h.html#ac8dbfe10a4a9a64c1e2c62ea97e48639',1,'altcp_tls_mbedtls_opts.h']]],
+  ['lwip_5farp_5ffilter_5fnetif',['LWIP_ARP_FILTER_NETIF',['../netif_2ethernet_8h.html#a1ecae0406a3b714c02b632379f26a365',1,'ethernet.h']]],
+  ['lwip_5fautoip_5fcreate_5fseed_5faddr',['LWIP_AUTOIP_CREATE_SEED_ADDR',['../autoip_8c.html#acec75069f6e6ecbe200c5691e56ecd43',1,'autoip.c']]],
+  ['lwip_5fautoip_5frand',['LWIP_AUTOIP_RAND',['../autoip_8c.html#a634535156cc1a8cf9f04d3d5c74f8a59',1,'autoip.c']]],
+  ['lwip_5fcompat_5fmutex',['LWIP_COMPAT_MUTEX',['../sys_8h.html#a7bada49634cd3b28b28bdcedd763a1e6',1,'sys.h']]],
+  ['lwip_5fdebug',['LWIP_DEBUG',['../debug_8h.html#a957d947c94fda9b85d4aee0aab72952a',1,'debug.h']]],
+  ['lwip_5fdns_5fapi_5fhostent_5fstorage',['LWIP_DNS_API_HOSTENT_STORAGE',['../netdb_8c.html#a768ab8ead892d6454709680340cd070e',1,'netdb.c']]],
+  ['lwip_5ficmp_5fecho_5fcheck_5finput_5fpbuf_5flen',['LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN',['../icmp_8c.html#a6b9fd6be0a7dcf301bc86b9e96e3857e',1,'icmp.c']]],
+  ['lwip_5finline_5fip_5fchksum',['LWIP_INLINE_IP_CHKSUM',['../ip4_8c.html#a9652ce304f893f6245c6ba9daea0a30f',1,'ip4.c']]],
+  ['lwip_5fip_5fcheck_5fpbuf_5fref_5fcount_5ffor_5ftx',['LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX',['../ip_8h.html#a355679dba1c0d8ef07ce3abcd28e3063',1,'ip.h']]],
+  ['lwip_5flowpan6_5f802154_5fdebug',['LWIP_LOWPAN6_802154_DEBUG',['../lowpan6__opts_8h.html#acf9a44be56d5dca9e45f644571d66f58',1,'lowpan6_opts.h']]],
+  ['lwip_5flowpan6_5fdebug',['LWIP_LOWPAN6_DEBUG',['../lowpan6__opts_8h.html#ae90ebb32999c6df5cc83705e133e1754',1,'lowpan6_opts.h']]],
+  ['lwip_5flowpan6_5fdecompression_5fdebug',['LWIP_LOWPAN6_DECOMPRESSION_DEBUG',['../lowpan6__opts_8h.html#a7f4db0bd3dbe36a19efbd24cd8b7fcf0',1,'lowpan6_opts.h']]],
+  ['lwip_5flowpan6_5fip_5fcompressed_5fdebug',['LWIP_LOWPAN6_IP_COMPRESSED_DEBUG',['../lowpan6__opts_8h.html#a231bc758484376dfd2ded6931c462df8',1,'lowpan6_opts.h']]],
+  ['lwip_5fmakeu32',['LWIP_MAKEU32',['../def_8h.html#acf56d3da92a0a7a8a62a617e793e948c',1,'def.h']]],
+  ['lwip_5fnsc_5fipv4_5faddress_5fchanged',['LWIP_NSC_IPV4_ADDRESS_CHANGED',['../netif_8h.html#aeb4e790199b02469aa04c044ef5cfa32',1,'netif.h']]],
+  ['lwip_5fnsc_5fipv4_5fgateway_5fchanged',['LWIP_NSC_IPV4_GATEWAY_CHANGED',['../netif_8h.html#a22400d2202581b4a7273cded712adf49',1,'netif.h']]],
+  ['lwip_5fnsc_5fipv4_5fnetmask_5fchanged',['LWIP_NSC_IPV4_NETMASK_CHANGED',['../netif_8h.html#ad747072771a887443ab33f90a12077d4',1,'netif.h']]],
+  ['lwip_5fnsc_5fipv4_5fsettings_5fchanged',['LWIP_NSC_IPV4_SETTINGS_CHANGED',['../netif_8h.html#a4ff19a6f3045f65d0397d30b6609660a',1,'netif.h']]],
+  ['lwip_5fnsc_5fipv6_5faddr_5fstate_5fchanged',['LWIP_NSC_IPV6_ADDR_STATE_CHANGED',['../netif_8h.html#a0d70fe11cac43c8fa35827b8e607ccf6',1,'netif.h']]],
+  ['lwip_5fnsc_5fipv6_5fset',['LWIP_NSC_IPV6_SET',['../netif_8h.html#a8fb4317a77ee2e3848be80db15618666',1,'netif.h']]],
+  ['lwip_5fnsc_5flink_5fchanged',['LWIP_NSC_LINK_CHANGED',['../netif_8h.html#a5ad7308195c0581680dd62fb148501cd',1,'netif.h']]],
+  ['lwip_5fnsc_5fnetif_5fadded',['LWIP_NSC_NETIF_ADDED',['../netif_8h.html#adbfecb47897cfe63d4f6366c1fed23b2',1,'netif.h']]],
+  ['lwip_5fnsc_5fnetif_5fremoved',['LWIP_NSC_NETIF_REMOVED',['../netif_8h.html#ae8e2dc87c19a03d481ae37bcf7ced5c9',1,'netif.h']]],
+  ['lwip_5fnsc_5fstatus_5fchanged',['LWIP_NSC_STATUS_CHANGED',['../netif_8h.html#a6f406ee3ab60e8a4f27ae2483c96b8e2',1,'netif.h']]],
+  ['lwip_5frfc7668_5fip_5funcompressed_5fdebug',['LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG',['../lowpan6__opts_8h.html#a5b7a3e204d2edde5552ca3c8694419c1',1,'lowpan6_opts.h']]],
+  ['lwip_5frfc7668_5flinux_5fworkaround_5fpublic_5faddress',['LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS',['../lowpan6__opts_8h.html#af4a4d962af3439b111a8e72e5eeaccf8',1,'lowpan6_opts.h']]],
+  ['lwip_5fsnmp_5fv3',['LWIP_SNMP_V3',['../snmp__opts_8h.html#a1fe0e120f979ed400f649019edcefe2b',1,'snmp_opts.h']]],
+  ['lwip_5fsupport_5fcustom_5fpbuf',['LWIP_SUPPORT_CUSTOM_PBUF',['../pbuf_8h.html#a64174c5169b48dc17674324afd9c63b9',1,'pbuf.h']]],
+  ['lwip_5ftcp_5fcalc_5finitial_5fcwnd',['LWIP_TCP_CALC_INITIAL_CWND',['../tcp__in_8c.html#aea174f2c6ca4cb0ad270dd8d0faf0c84',1,'tcp_in.c']]],
+  ['lwip_5ftimeval_5fprivate',['LWIP_TIMEVAL_PRIVATE',['../sockets_8h.html#aaffd64f6887883ec6401e6bb684c40fa',1,'sockets.h']]],
+  ['lwiperf_5fcheck_5frx_5fdata',['LWIPERF_CHECK_RX_DATA',['../lwiperf_8c.html#af51dcfc53fe575411c26e18963f1b902',1,'lwiperf.c']]],
+  ['lwiperf_5fserver_5fip_5ftype',['LWIPERF_SERVER_IP_TYPE',['../lwiperf_8c.html#a1351e47d0bdb7d0fe0efaf9f1b2b0f7a',1,'lwiperf.c']]],
+  ['lwiperf_5ftcp_5fmax_5fidle_5fsec',['LWIPERF_TCP_MAX_IDLE_SEC',['../lwiperf_8c.html#a646d7e0b37c5cefdd6eef38a3fba4673',1,'lwiperf.c']]]
+];
diff --git a/doc/doxygen/output/html/search/defines_7.html b/doc/doxygen/output/html/search/defines_7.html
new file mode 100644
index 0000000..275e1b3
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_7.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/defines_7.js b/doc/doxygen/output/html/search/defines_7.js
new file mode 100644
index 0000000..6d6428a
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_7.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+  ['mib2_5fcopy_5fsysuptime_5fto',['MIB2_COPY_SYSUPTIME_TO',['../snmp_8h.html#abe6b270482ca9af07c029f3136d8ec9c',1,'snmp.h']]],
+  ['min_5freq_5flen',['MIN_REQ_LEN',['../httpd_8c.html#aa8e2f3e13ac1fcacd85c558d6e40e40a',1,'httpd.c']]],
+  ['min_5fsize',['MIN_SIZE',['../mem_8c.html#a278694c2333c9826f21ddd2c2d220f66',1,'mem.c']]],
+  ['mqtt_5fctl_5fpacket_5ftype',['MQTT_CTL_PACKET_TYPE',['../mqtt_8c.html#a45c57ebd31832f1c128d847067c4688b',1,'mqtt.c']]],
+  ['mqtt_5fdebug',['MQTT_DEBUG',['../mqtt_8c.html#a99c325e06cc17ee24e09dab251606f9d',1,'mqtt.c']]],
+  ['mqtt_5fringbuf_5ffree',['mqtt_ringbuf_free',['../mqtt_8c.html#afba101fbf26b556c869060d3d013c8fa',1,'mqtt.c']]],
+  ['mqtt_5fringbuf_5flinear_5fread_5flength',['mqtt_ringbuf_linear_read_length',['../mqtt_8c.html#ad82b4039213ab3f1d9e4bcd3aa0c88a3',1,'mqtt.c']]]
+];
diff --git a/doc/doxygen/output/html/search/defines_8.html b/doc/doxygen/output/html/search/defines_8.html
new file mode 100644
index 0000000..de651d9
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_8.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/defines_8.js b/doc/doxygen/output/html/search/defines_8.js
new file mode 100644
index 0000000..0a197eb
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_8.js
@@ -0,0 +1,34 @@
+var searchData=
+[
+  ['nd6_5foption_5ftype_5fmtu',['ND6_OPTION_TYPE_MTU',['../prot_2nd6_8h.html#aab6c15c9bea51fbdcc660f718bb403a8',1,'nd6.h']]],
+  ['nd6_5foption_5ftype_5fprefix_5finfo',['ND6_OPTION_TYPE_PREFIX_INFO',['../prot_2nd6_8h.html#a0225d4c8911efdbdbc2b40de208906c2',1,'nd6.h']]],
+  ['nd6_5foption_5ftype_5frdnss',['ND6_OPTION_TYPE_RDNSS',['../prot_2nd6_8h.html#a3188b9704a8ca598f54b87c3db73272e',1,'nd6.h']]],
+  ['nd6_5foption_5ftype_5fredir_5fhdr',['ND6_OPTION_TYPE_REDIR_HDR',['../prot_2nd6_8h.html#aeaa575c1a66ccaa2dc62ff2c0bd71619',1,'nd6.h']]],
+  ['nd6_5foption_5ftype_5froute_5finfo',['ND6_OPTION_TYPE_ROUTE_INFO',['../prot_2nd6_8h.html#aff2e03766ee1fa15263c4aeda5097d28',1,'nd6.h']]],
+  ['nd6_5foption_5ftype_5fsource_5flladdr',['ND6_OPTION_TYPE_SOURCE_LLADDR',['../prot_2nd6_8h.html#a68ce8550a20cd30093d6e79e1ca51842',1,'nd6.h']]],
+  ['nd6_5fra_5fflag_5fmanaged_5faddr_5fconfig',['ND6_RA_FLAG_MANAGED_ADDR_CONFIG',['../prot_2nd6_8h.html#a7fb1b330719d83b7525374f4beca51bc',1,'nd6.h']]],
+  ['nd6_5frtr_5fsolicitation_5finterval',['ND6_RTR_SOLICITATION_INTERVAL',['../nd6_8h.html#a2fec65c0785551bad3a282ddee4062ac',1,'nd6.h']]],
+  ['nd6_5ftmr_5finterval',['ND6_TMR_INTERVAL',['../nd6_8h.html#a3250c1e32713635d588cf25865ebed56',1,'nd6.h']]],
+  ['netb_5fhflag_5fresponse',['NETB_HFLAG_RESPONSE',['../netbiosns_8c.html#af09685abf1739c802bc8772b35b7fb1c',1,'netbiosns.c']]],
+  ['netb_5fnflag_5funique',['NETB_NFLAG_UNIQUE',['../netbiosns_8c.html#ae00d45caef5a670e3aedde2788b3f212',1,'netbiosns.c']]],
+  ['netbios_5fname_5flen',['NETBIOS_NAME_LEN',['../netbiosns_8c.html#a4b83658c5bbb9ac90aca4351086a9a00',1,'netbiosns.c']]],
+  ['netbios_5fname_5fttl',['NETBIOS_NAME_TTL',['../netbiosns_8c.html#a35d43ea3290f6412e45598b610f03cf1',1,'netbiosns.c']]],
+  ['netbuf_5fflag_5fchksum',['NETBUF_FLAG_CHKSUM',['../netbuf_8h.html#ab75db64a9e84eb67a382c30e382d417c',1,'netbuf.h']]],
+  ['netbuf_5fflag_5fdestaddr',['NETBUF_FLAG_DESTADDR',['../netbuf_8h.html#ab38abb4213df4c00b9b3ab844322a090',1,'netbuf.h']]],
+  ['netconn_5ffin_5frx_5fpending',['NETCONN_FIN_RX_PENDING',['../api_8h.html#a24d62a2a03ba421fcf2bdce1ea89b949',1,'api.h']]],
+  ['netconn_5fflag_5fcheck_5fwritespace',['NETCONN_FLAG_CHECK_WRITESPACE',['../api_8h.html#a9d791955a4256a0589a3844e4e6f0f9c',1,'api.h']]],
+  ['netconn_5fflag_5fin_5fnonblocking_5fconnect',['NETCONN_FLAG_IN_NONBLOCKING_CONNECT',['../api_8h.html#a70bb861ee643b60ee402fd48f581f58d',1,'api.h']]],
+  ['netconn_5fflag_5fipv6_5fv6only',['NETCONN_FLAG_IPV6_V6ONLY',['../api_8h.html#a60892e4eb139f10157847fea4266bf5b',1,'api.h']]],
+  ['netconn_5fflag_5fmboxclosed',['NETCONN_FLAG_MBOXCLOSED',['../api_8h.html#af77be7590d3712259e78103c1dddf63f',1,'api.h']]],
+  ['netconn_5fflag_5fnon_5fblocking',['NETCONN_FLAG_NON_BLOCKING',['../api_8h.html#abee57aa0ba63e35742d411bc5224900a',1,'api.h']]],
+  ['netconn_5fget_5frecvbufsize',['netconn_get_recvbufsize',['../api_8h.html#ac0298c287dc3823047c378c014ff1eb0',1,'api.h']]],
+  ['netconn_5fget_5fsendtimeout',['netconn_get_sendtimeout',['../api_8h.html#a7d6e84458eec796b0b0ce1bb247f323f',1,'api.h']]],
+  ['netconn_5fis_5fnonblocking',['netconn_is_nonblocking',['../api_8h.html#a5789f0030b895b40625a74deb5a1092f',1,'api.h']]],
+  ['netconn_5fset_5fnonblocking',['netconn_set_nonblocking',['../api_8h.html#a6a578dd5b55e4457e0d23574ec9c55bb',1,'api.h']]],
+  ['netconn_5fset_5frecvbufsize',['netconn_set_recvbufsize',['../api_8h.html#a04785274634a5b504c760731c2e70725',1,'api.h']]],
+  ['netconn_5fset_5fsendtimeout',['netconn_set_sendtimeout',['../api_8h.html#a3ce3ad9f660e99b11fec20cafaf8f016',1,'api.h']]],
+  ['netconn_5ftype',['netconn_type',['../api_8h.html#a62cd17ad03bb2817cb0c419e1c9790b1',1,'api.h']]],
+  ['netif_5fis_5flink_5fup',['netif_is_link_up',['../netif_8h.html#a780be4c3fa9f7f2534f7865666c3a1b8',1,'netif.h']]],
+  ['netif_5fmax_5fhwaddr_5flen',['NETIF_MAX_HWADDR_LEN',['../netif_8h.html#ab887a8ec553de1be1d04cf2961c63c41',1,'netif.h']]],
+  ['netif_5fnamesize',['NETIF_NAMESIZE',['../netif_8h.html#a302f24fbfe883ee4840ffc71f267ae2a',1,'netif.h']]]
+];
diff --git a/doc/doxygen/output/html/search/defines_9.html b/doc/doxygen/output/html/search/defines_9.html
new file mode 100644
index 0000000..a93bb53
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_9.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/defines_9.js b/doc/doxygen/output/html/search/defines_9.js
new file mode 100644
index 0000000..1580aef
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_9.js
@@ -0,0 +1,17 @@
+var searchData=
+[
+  ['pbuf_5falloc_5fflag_5fdata_5fcontiguous',['PBUF_ALLOC_FLAG_DATA_CONTIGUOUS',['../pbuf_8h.html#a426883d928f8f3e8fd066e616159d78f',1,'pbuf.h']]],
+  ['pbuf_5falloc_5fflag_5frx',['PBUF_ALLOC_FLAG_RX',['../pbuf_8h.html#a567a0dfa01b0e5540f9416a200ed163f',1,'pbuf.h']]],
+  ['pbuf_5fflag_5fis_5fcustom',['PBUF_FLAG_IS_CUSTOM',['../pbuf_8h.html#af78a7e1815dc0e31884d095b666d997f',1,'pbuf.h']]],
+  ['pbuf_5fflag_5fllbcast',['PBUF_FLAG_LLBCAST',['../pbuf_8h.html#a6772c16662bbb78597399add086500c0',1,'pbuf.h']]],
+  ['pbuf_5fflag_5fllmcast',['PBUF_FLAG_LLMCAST',['../pbuf_8h.html#ac0d56cde47aca24ef410d730d7c89887',1,'pbuf.h']]],
+  ['pbuf_5fflag_5fmcastloop',['PBUF_FLAG_MCASTLOOP',['../pbuf_8h.html#ab8ad153151a8c157335d9c0cedc007e6',1,'pbuf.h']]],
+  ['pbuf_5fflag_5fpush',['PBUF_FLAG_PUSH',['../pbuf_8h.html#a018a6499e357f8a1373321f802a82930',1,'pbuf.h']]],
+  ['pbuf_5fflag_5ftcp_5ffin',['PBUF_FLAG_TCP_FIN',['../pbuf_8h.html#a36a915aa2f6a188baa2862881407971e',1,'pbuf.h']]],
+  ['pbuf_5fpool_5ffree_5fooseq',['PBUF_POOL_FREE_OOSEQ',['../pbuf_8h.html#ac54b0f161128a32c7419c33b893a5106',1,'pbuf.h']]],
+  ['pbuf_5ftype_5falloc_5fsrc_5fmask',['PBUF_TYPE_ALLOC_SRC_MASK',['../pbuf_8h.html#a97d4db8e0f127f61af0016c184c865ca',1,'pbuf.h']]],
+  ['pbuf_5ftype_5falloc_5fsrc_5fmask_5fapp_5fmax',['PBUF_TYPE_ALLOC_SRC_MASK_APP_MAX',['../pbuf_8h.html#aad686ef346759a221abdb45f64649816',1,'pbuf.h']]],
+  ['pbuf_5ftype_5falloc_5fsrc_5fmask_5fapp_5fmin',['PBUF_TYPE_ALLOC_SRC_MASK_APP_MIN',['../pbuf_8h.html#aa1f62ba9dc5d462e67e33c4be64c601a',1,'pbuf.h']]],
+  ['pbuf_5ftype_5fflag_5fdata_5fvolatile',['PBUF_TYPE_FLAG_DATA_VOLATILE',['../pbuf_8h.html#a02789ca67766def65000b58f7fe7d03b',1,'pbuf.h']]],
+  ['pbuf_5ftype_5fflag_5fstruct_5fdata_5fcontiguous',['PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS',['../pbuf_8h.html#a49ab2c0662378f268ed8209bd54aaedf',1,'pbuf.h']]]
+];
diff --git a/doc/doxygen/output/html/search/defines_a.html b/doc/doxygen/output/html/search/defines_a.html
new file mode 100644
index 0000000..cf4841d
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/defines_a.js b/doc/doxygen/output/html/search/defines_a.js
new file mode 100644
index 0000000..c0ffaf2
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_a.js
@@ -0,0 +1,32 @@
+var searchData=
+[
+  ['selwait_5ft',['SELWAIT_T',['../sockets__priv_8h.html#a8f4d240733a9261c668fc66dc4ce8196',1,'sockets_priv.h']]],
+  ['slip_5fmax_5fsize',['SLIP_MAX_SIZE',['../slipif_8c.html#accf448f9dabb0f33ef46b40355691cab',1,'slipif.c']]],
+  ['slip_5frx_5fqueue',['SLIP_RX_QUEUE',['../slipif_8h.html#a37ce8613535232db02bfd9ae9b51c668',1,'slipif.h']]],
+  ['slip_5fsio_5fspeed',['SLIP_SIO_SPEED',['../slipif_8c.html#a2a9e9ed81732a6794a9b9a712f75a1cc',1,'slipif.c']]],
+  ['slip_5fuse_5frx_5fthread',['SLIP_USE_RX_THREAD',['../slipif_8h.html#a198967c11f79cffc32192710294e8826',1,'slipif.h']]],
+  ['smtp_5fpoll_5finterval',['SMTP_POLL_INTERVAL',['../smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e',1,'smtp.c']]],
+  ['smtp_5ftimeout',['SMTP_TIMEOUT',['../smtp_8c.html#a6029851c4f71d98b00d6c49a17ea9ef6',1,'smtp.c']]],
+  ['smtp_5ftimeout_5fdatablock',['SMTP_TIMEOUT_DATABLOCK',['../smtp_8c.html#ad853ab316a3b866b87c0454053febfe3',1,'smtp.c']]],
+  ['smtp_5ftimeout_5fdataterm',['SMTP_TIMEOUT_DATATERM',['../smtp_8c.html#a73855e673457f748b6bcba49aab9b035',1,'smtp.c']]],
+  ['snmp_5fcreate_5fthread_5fsync_5fnode',['SNMP_CREATE_THREAD_SYNC_NODE',['../snmp__threadsync_8h.html#a1971c27c8addf1c426abd1abac54c8d2',1,'snmp_threadsync.h']]],
+  ['snmp_5fgentrap_5fauth_5ffailure',['SNMP_GENTRAP_AUTH_FAILURE',['../apps_2snmp_8h.html#aaf312d8bdbeed2c02560321ab24a022f',1,'snmp.h']]],
+  ['snmp_5fgentrap_5fcoldstart',['SNMP_GENTRAP_COLDSTART',['../apps_2snmp_8h.html#ae9310bbe1948b3c3bc64c073d4621019',1,'snmp.h']]],
+  ['snmp_5fgentrap_5fegp_5fneighbor_5floss',['SNMP_GENTRAP_EGP_NEIGHBOR_LOSS',['../apps_2snmp_8h.html#ac1cd822650d9ac66d0333a5ad600cfee',1,'snmp.h']]],
+  ['snmp_5fgentrap_5fenterprise_5fspecific',['SNMP_GENTRAP_ENTERPRISE_SPECIFIC',['../apps_2snmp_8h.html#ab3691cecfa911baa52ccf6054022ba43',1,'snmp.h']]],
+  ['snmp_5fgentrap_5flinkdown',['SNMP_GENTRAP_LINKDOWN',['../apps_2snmp_8h.html#a1856efbe83199f456c34a4e5139dfb16',1,'snmp.h']]],
+  ['snmp_5fgentrap_5flinkup',['SNMP_GENTRAP_LINKUP',['../apps_2snmp_8h.html#afa665cdc02ccd5ee9fe0c4cb1b792186',1,'snmp.h']]],
+  ['snmp_5fgentrap_5fwarmstart',['SNMP_GENTRAP_WARMSTART',['../apps_2snmp_8h.html#a9a2e5824deab50e639b01181307a0926',1,'snmp.h']]],
+  ['snmp_5fnode_5ftree',['SNMP_NODE_TREE',['../snmp__core_8h.html#a9ee3aad9305fdd883abb37822be81b72',1,'snmp_core.h']]],
+  ['sntp_5ffrac_5fto_5fus',['SNTP_FRAC_TO_US',['../sntp_8c.html#aebe74c93643ac9b8c8a9c7d223192c8f',1,'sntp.c']]],
+  ['swap_5fbytes_5fin_5fword',['SWAP_BYTES_IN_WORD',['../inet__chksum_8h.html#a0196bd603262882d16b5264b52eafe18',1,'inet_chksum.h']]],
+  ['sys_5farch_5ftimeout',['SYS_ARCH_TIMEOUT',['../sys_8h.html#ac1495030a8ab5e1f3c89e42ced527c5b',1,'sys.h']]],
+  ['sys_5fmbox_5fempty',['SYS_MBOX_EMPTY',['../sys_8h.html#ab0571e67edca0132b144106e9b319ef9',1,'sys.h']]],
+  ['sys_5fmbox_5fset_5finvalid_5fval',['sys_mbox_set_invalid_val',['../sys_8h.html#ae293feebb61d36f2db99be53702b8203',1,'sys.h']]],
+  ['sys_5fmbox_5ftryfetch',['sys_mbox_tryfetch',['../sys_8h.html#ab7841780b31ba9c0a39a440aad1fca13',1,'sys.h']]],
+  ['sys_5fmbox_5fvalid_5fval',['sys_mbox_valid_val',['../sys_8h.html#aae82640d0bdbeec7b9b6511b3f8d99cb',1,'sys.h']]],
+  ['sys_5fsem_5fset_5finvalid_5fval',['sys_sem_set_invalid_val',['../sys_8h.html#a2556e570f6973a6f4d57d0e76ef190d8',1,'sys.h']]],
+  ['sys_5fsem_5fvalid_5fval',['sys_sem_valid_val',['../sys_8h.html#a9e8ad541356786936f23ab83b8f550cc',1,'sys.h']]],
+  ['sys_5fsem_5fwait',['sys_sem_wait',['../sys_8h.html#a84e7e4bc00255aee84e6e7289a985703',1,'sys.h']]],
+  ['sys_5ftimeouts_5fsleeptime_5finfinite',['SYS_TIMEOUTS_SLEEPTIME_INFINITE',['../timeouts_8h.html#a9e2b2593e709ff54c7e3c0b003f6f1b0',1,'timeouts.h']]]
+];
diff --git a/doc/doxygen/output/html/search/defines_b.html b/doc/doxygen/output/html/search/defines_b.html
new file mode 100644
index 0000000..26cf44f
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_b.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/defines_b.js b/doc/doxygen/output/html/search/defines_b.js
new file mode 100644
index 0000000..b509ab7
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_b.js
@@ -0,0 +1,11 @@
+var searchData=
+[
+  ['tcp_5fbuild_5fmss_5foption',['TCP_BUILD_MSS_OPTION',['../tcp__priv_8h.html#abdc99c343efc6c81abf60bb62b361dd8',1,'tcp_priv.h']]],
+  ['tcp_5fchecksum_5fon_5fcopy',['TCP_CHECKSUM_ON_COPY',['../tcp__priv_8h.html#aea0c47b916a8a25f82d2063335033aee',1,'tcp_priv.h']]],
+  ['tcp_5fchecksum_5fon_5fcopy_5fsanity_5fcheck',['TCP_CHECKSUM_ON_COPY_SANITY_CHECK',['../tcp__out_8c.html#a25d7e9081baa5c84f2ebd34b0eb4169b',1,'tcp_out.c']]],
+  ['tcp_5fdo_5foutput_5fnagle',['tcp_do_output_nagle',['../tcp__priv_8h.html#afbd7a2997e3a3b7569efc3298e2e409f',1,'tcp_priv.h']]],
+  ['tcp_5foversize_5fcalc_5flength',['TCP_OVERSIZE_CALC_LENGTH',['../tcp__out_8c.html#aa2ef22d2384225a1b5fee187411cc129',1,'tcp_out.c']]],
+  ['tcp_5foversize_5fdbgcheck',['TCP_OVERSIZE_DBGCHECK',['../tcp__priv_8h.html#a178a6e9966d03c3326b9e0568666bb69',1,'tcp_priv.h']]],
+  ['tcp_5fpcb_5fcommon',['TCP_PCB_COMMON',['../tcp_8h.html#a874630045102fc5f1442704a790c8bb8',1,'tcp.h']]],
+  ['tf_5freset',['TF_RESET',['../tcp__priv_8h.html#ac9dbdaeac3e25f5badf3a763a1b0b990',1,'tcp_priv.h']]]
+];
diff --git a/doc/doxygen/output/html/search/defines_c.html b/doc/doxygen/output/html/search/defines_c.html
new file mode 100644
index 0000000..eca33be
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_c.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/defines_c.js b/doc/doxygen/output/html/search/defines_c.js
new file mode 100644
index 0000000..0d12169
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_c.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['unlock_5ftcpip_5fcore',['UNLOCK_TCPIP_CORE',['../tcpip_8h.html#a915effea029b9c4891e1ec635eb1826d',1,'tcpip.h']]]
+];
diff --git a/doc/doxygen/output/html/search/defines_d.html b/doc/doxygen/output/html/search/defines_d.html
new file mode 100644
index 0000000..bdb5500
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/defines_d.js b/doc/doxygen/output/html/search/defines_d.js
new file mode 100644
index 0000000..5f00ca9
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_d.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['zepif_5floopback',['ZEPIF_LOOPBACK',['../zepif_8c.html#a8cae594e71cf385076f7bda166729dcd',1,'zepif.c']]]
+];
diff --git a/doc/doxygen/output/html/search/enums_0.html b/doc/doxygen/output/html/search/enums_0.html
new file mode 100644
index 0000000..ee343ac
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_0.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enums_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/enums_0.js b/doc/doxygen/output/html/search/enums_0.js
new file mode 100644
index 0000000..bf45d70
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_0.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['dhcp6_5foption_5fidx',['dhcp6_option_idx',['../dhcp6_8c.html#ac4c519a2e10067f277d6b09e60919e9a',1,'dhcp6.c']]],
+  ['dhcp_5foption_5fidx',['dhcp_option_idx',['../dhcp_8c.html#a8c3b584d223b995b48613ad96cb776a0',1,'dhcp.c']]]
+];
diff --git a/doc/doxygen/output/html/search/enums_1.html b/doc/doxygen/output/html/search/enums_1.html
new file mode 100644
index 0000000..3fd210a
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_1.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enums_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/enums_1.js b/doc/doxygen/output/html/search/enums_1.js
new file mode 100644
index 0000000..133fafb
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_1.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+  ['ehttpc_5fresult',['ehttpc_result',['../group__httpc.html#ga49e34884b272b1e0ddae8da46c31d9a3',1,'http_client.h']]],
+  ['err_5fenum_5ft',['err_enum_t',['../group__infrastructure__errors.html#gae2e66c7d13afc90ffecd6151680fbadc',1,'err.h']]],
+  ['etharp_5fstate',['etharp_state',['../etharp_8c.html#ae95dee9363e6d3417298e07380b2d383',1,'etharp.c']]]
+];
diff --git a/doc/doxygen/output/html/search/enums_2.html b/doc/doxygen/output/html/search/enums_2.html
new file mode 100644
index 0000000..a042e52
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_2.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enums_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/enums_2.js b/doc/doxygen/output/html/search/enums_2.js
new file mode 100644
index 0000000..5d2a622
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_2.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+  ['icmp6_5fdur_5fcode',['icmp6_dur_code',['../prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccf',1,'icmp6.h']]],
+  ['icmp6_5fpp_5fcode',['icmp6_pp_code',['../prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023',1,'icmp6.h']]],
+  ['icmp6_5fte_5fcode',['icmp6_te_code',['../prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e',1,'icmp6.h']]],
+  ['icmp6_5ftype',['icmp6_type',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858',1,'icmp6.h']]],
+  ['icmp_5fdur_5ftype',['icmp_dur_type',['../icmp_8h.html#a17637465f209385e5d19ef47fd9266a5',1,'icmp.h']]],
+  ['icmp_5fte_5ftype',['icmp_te_type',['../icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324a',1,'icmp.h']]]
+];
diff --git a/doc/doxygen/output/html/search/enums_3.html b/doc/doxygen/output/html/search/enums_3.html
new file mode 100644
index 0000000..265e0cb
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_3.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enums_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/enums_3.js b/doc/doxygen/output/html/search/enums_3.js
new file mode 100644
index 0000000..7f6c20e
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_3.js
@@ -0,0 +1,11 @@
+var searchData=
+[
+  ['lwip_5fiana_5fhwtype',['lwip_iana_hwtype',['../group__iana.html#ga3d2bbfcb56c8adf3be8c8d12868cecfe',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fnumber',['lwip_iana_port_number',['../group__iana.html#gac9396d90585e49e9a287179bf5aa9ba0',1,'iana.h']]],
+  ['lwip_5fieee_5feth_5ftype',['lwip_ieee_eth_type',['../group__ieee.html#gab3a7b97666b100584972d158acbbd1f4',1,'ieee.h']]],
+  ['lwip_5fip_5faddr_5ftype',['lwip_ip_addr_type',['../group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c',1,'ip_addr.h']]],
+  ['lwip_5fipv6_5fscope_5ftype',['lwip_ipv6_scope_type',['../group__ip6__zones.html#ga1993c4b6a297b6e92d80a9ce46ddedfe',1,'ip6_zone.h']]],
+  ['lwip_5fpollscan_5fopts',['lwip_pollscan_opts',['../sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9',1,'sockets.c']]],
+  ['lwiperf_5fclient_5ftype',['lwiperf_client_type',['../lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76c',1,'lwiperf.h']]],
+  ['lwiperf_5freport_5ftype',['lwiperf_report_type',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6',1,'lwiperf.h']]]
+];
diff --git a/doc/doxygen/output/html/search/enums_4.html b/doc/doxygen/output/html/search/enums_4.html
new file mode 100644
index 0000000..97ee07f
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_4.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enums_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/enums_4.js b/doc/doxygen/output/html/search/enums_4.js
new file mode 100644
index 0000000..c569e5c
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_4.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+  ['memp_5ft',['memp_t',['../memp_8h.html#a85a164b1f7764951cc685ea525114e57',1,'memp.h']]],
+  ['mqtt_5fconnect_5fflag',['mqtt_connect_flag',['../mqtt_8c.html#a4f6c42ed730546ff755e3bb99989dd12',1,'mqtt.c']]],
+  ['mqtt_5fconnection_5fstatus_5ft',['mqtt_connection_status_t',['../group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d',1,'mqtt.h']]],
+  ['mqtt_5fmessage_5ftype',['mqtt_message_type',['../mqtt_8c.html#ac243cf15beb51b2206e36da86c2f95f1',1,'mqtt.c']]]
+];
diff --git a/doc/doxygen/output/html/search/enums_5.html b/doc/doxygen/output/html/search/enums_5.html
new file mode 100644
index 0000000..f837d25
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_5.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enums_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/enums_5.js b/doc/doxygen/output/html/search/enums_5.js
new file mode 100644
index 0000000..0cdf324
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_5.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+  ['netconn_5fevt',['netconn_evt',['../api_8h.html#af722260882d14c49afb765293ffb0155',1,'api.h']]],
+  ['netconn_5figmp',['netconn_igmp',['../api_8h.html#a5c6ded2c082de1536019b197a0a912db',1,'api.h']]],
+  ['netconn_5fstate',['netconn_state',['../api_8h.html#a2c6c9c1869f443c5ec7b31180a44fada',1,'api.h']]],
+  ['netconn_5ftype',['netconn_type',['../group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91',1,'api.h']]],
+  ['netif_5fmac_5ffilter_5faction',['netif_mac_filter_action',['../netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0',1,'netif.h']]]
+];
diff --git a/doc/doxygen/output/html/search/enums_6.html b/doc/doxygen/output/html/search/enums_6.html
new file mode 100644
index 0000000..56491ab
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_6.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enums_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/enums_6.js b/doc/doxygen/output/html/search/enums_6.js
new file mode 100644
index 0000000..e88cbe8
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_6.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['pbuf_5flayer',['pbuf_layer',['../group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf',1,'pbuf.h']]],
+  ['pbuf_5ftype',['pbuf_type',['../group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb',1,'pbuf.h']]]
+];
diff --git a/doc/doxygen/output/html/search/enums_7.html b/doc/doxygen/output/html/search/enums_7.html
new file mode 100644
index 0000000..5851773
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_7.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enums_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/enums_7.js b/doc/doxygen/output/html/search/enums_7.js
new file mode 100644
index 0000000..f42f375
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_7.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['raw_5finput_5fstate',['raw_input_state',['../raw__priv_8h.html#a2580ec946c4196127888d5405257866b',1,'raw_priv.h']]]
+];
diff --git a/doc/doxygen/output/html/search/enums_8.html b/doc/doxygen/output/html/search/enums_8.html
new file mode 100644
index 0000000..74b2e21
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_8.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enums_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/enums_8.js b/doc/doxygen/output/html/search/enums_8.js
new file mode 100644
index 0000000..ac7822f
--- /dev/null
+++ b/doc/doxygen/output/html/search/enums_8.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+  ['smtp_5fsession_5fstate',['smtp_session_state',['../smtp_8c.html#a04947fff2d3a3803e6c716aecc7f2bae',1,'smtp.c']]],
+  ['snmp_5faccess_5ft',['snmp_access_t',['../snmp__core_8h.html#ad5a33687d1a6fcf970266b41b0633760',1,'snmp_core.h']]],
+  ['snmp_5ferr_5ft',['snmp_err_t',['../snmp__core_8h.html#abaa9cdad345ad93da515d31625a54589',1,'snmp_core.h']]],
+  ['snmp_5fiftype',['snmp_ifType',['../group__netif__mib2.html#ga15378b8dcd2a9dc2985142d864a767ba',1,'snmp.h']]],
+  ['snmp_5ftable_5fcolumn_5fdata_5ftype_5ft',['snmp_table_column_data_type_t',['../snmp__table_8h.html#af9b59f3ba7dccf338fe6e5bc1c4b1db5',1,'snmp_table.h']]]
+];
diff --git a/doc/doxygen/output/html/search/enumvalues_0.html b/doc/doxygen/output/html/search/enumvalues_0.html
new file mode 100644
index 0000000..9387b6a
--- /dev/null
+++ b/doc/doxygen/output/html/search/enumvalues_0.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enumvalues_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/enumvalues_0.js b/doc/doxygen/output/html/search/enumvalues_0.js
new file mode 100644
index 0000000..7171eaa
--- /dev/null
+++ b/doc/doxygen/output/html/search/enumvalues_0.js
@@ -0,0 +1,36 @@
+var searchData=
+[
+  ['err_5fabrt',['ERR_ABRT',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaf316b2c5eee4079820f7100849115142',1,'err.h']]],
+  ['err_5falready',['ERR_ALREADY',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcae6f9c1e4c18ca844f7934307d4cc30e5',1,'err.h']]],
+  ['err_5farg',['ERR_ARG',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab508ce0ebdf3ca735208b00a80a45c91',1,'err.h']]],
+  ['err_5fbuf',['ERR_BUF',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca05c91366f1b5203a5db9a241b415cd63',1,'err.h']]],
+  ['err_5fclsd',['ERR_CLSD',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa5176d9fecf8ec43d3bc49f4e6c3f7f5',1,'err.h']]],
+  ['err_5fconn',['ERR_CONN',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab0036c51817b5200bfe8157cc4115b27',1,'err.h']]],
+  ['err_5fif',['ERR_IF',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca7d61d90449ae6788575e8e46d5d3bbc6',1,'err.h']]],
+  ['err_5finprogress',['ERR_INPROGRESS',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca13e1dd0edca8a27b6abdf1524bde7929',1,'err.h']]],
+  ['err_5fisconn',['ERR_ISCONN',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca8543e1d6422fed7b318d97e08dcbaa33',1,'err.h']]],
+  ['err_5fmem',['ERR_MEM',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaaaeafdbf3aecc46864daa3cd829c7e05',1,'err.h']]],
+  ['err_5fok',['ERR_OK',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb',1,'err.h']]],
+  ['err_5frst',['ERR_RST',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca759030525f1768a23dc086a5fd45b4e5',1,'err.h']]],
+  ['err_5frte',['ERR_RTE',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca9448893187313c0c5a502ca9a9ad1c2a',1,'err.h']]],
+  ['err_5ftimeout',['ERR_TIMEOUT',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcac568baeb6407ef5e2630084ccbc34be8',1,'err.h']]],
+  ['err_5fuse',['ERR_USE',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca4ebdc2aa1dbd75f927845733a3fb1f8b',1,'err.h']]],
+  ['err_5fval',['ERR_VAL',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa9a1c5a6fdeed0aad7fe41d538482bbd',1,'err.h']]],
+  ['err_5fwouldblock',['ERR_WOULDBLOCK',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab9dcf89d46668b072192278fb907b7ad',1,'err.h']]],
+  ['ethtype_5farp',['ETHTYPE_ARP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a41217db03576ea59c44b28b248c39be5',1,'ieee.h']]],
+  ['ethtype_5fethercat',['ETHTYPE_ETHERCAT',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a5085a5fd5f9c9506124e93ea43ad2d7c',1,'ieee.h']]],
+  ['ethtype_5fip',['ETHTYPE_IP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ac95756b20fde70b868ef4185dd221c79',1,'ieee.h']]],
+  ['ethtype_5fipv6',['ETHTYPE_IPV6',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aab26004eed559217be5dd466a79b1383',1,'ieee.h']]],
+  ['ethtype_5fjumbo',['ETHTYPE_JUMBO',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a2511e8a31961bd742363b11b274b9dd1',1,'ieee.h']]],
+  ['ethtype_5flldp',['ETHTYPE_LLDP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a02eab0dd87f222a2d555ca38b1b8afcc',1,'ieee.h']]],
+  ['ethtype_5fmrp',['ETHTYPE_MRP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad36caec44d8db59ff433a8bd3e92ad3e',1,'ieee.h']]],
+  ['ethtype_5fpppoe',['ETHTYPE_PPPOE',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a8c0e8f68b90134eb4f1f17d3d2eb6f8c',1,'ieee.h']]],
+  ['ethtype_5fpppoedisc',['ETHTYPE_PPPOEDISC',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a58c6f40d7cc3edb9455762938f3f6569',1,'ieee.h']]],
+  ['ethtype_5fprofinet',['ETHTYPE_PROFINET',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a889eb8f716238d16ee3408f16a5cf19d',1,'ieee.h']]],
+  ['ethtype_5fptp',['ETHTYPE_PTP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aa3e9e834eef932d073028e28eb8793dc',1,'ieee.h']]],
+  ['ethtype_5fqinq',['ETHTYPE_QINQ',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a39a18006412cbb57536535bd9d378394',1,'ieee.h']]],
+  ['ethtype_5frarp',['ETHTYPE_RARP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a14292184cb41b279249319896d0e2b1f',1,'ieee.h']]],
+  ['ethtype_5fsercos',['ETHTYPE_SERCOS',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ab93419f8edf5692e91629ab92fce8a14',1,'ieee.h']]],
+  ['ethtype_5fvlan',['ETHTYPE_VLAN',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad8f84826d52d92ac24a477d1f03e7903',1,'ieee.h']]],
+  ['ethtype_5fwol',['ETHTYPE_WOL',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a530a30feb9b87fd993da2bf83776cf9b',1,'ieee.h']]]
+];
diff --git a/doc/doxygen/output/html/search/enumvalues_1.html b/doc/doxygen/output/html/search/enumvalues_1.html
new file mode 100644
index 0000000..f622aba
--- /dev/null
+++ b/doc/doxygen/output/html/search/enumvalues_1.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enumvalues_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/enumvalues_1.js b/doc/doxygen/output/html/search/enumvalues_1.js
new file mode 100644
index 0000000..c2631fb
--- /dev/null
+++ b/doc/doxygen/output/html/search/enumvalues_1.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+  ['httpc_5fresult_5ferr_5fclosed',['HTTPC_RESULT_ERR_CLOSED',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a89a6700abb14dd7cab9b4e0fd66e5fd6',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5fconnect',['HTTPC_RESULT_ERR_CONNECT',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ab866d5433b4c4593c80b756d434e1d09',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5fcontent_5flen',['HTTPC_RESULT_ERR_CONTENT_LEN',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a6c8a4195834e1997a498a03bb47bb096',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5fhostname',['HTTPC_RESULT_ERR_HOSTNAME',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ae04714f90692c122e6c85e06083dbc6d',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5fmem',['HTTPC_RESULT_ERR_MEM',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a49972833ec01c7a10dee734c7c69ed62',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5fsvr_5fresp',['HTTPC_RESULT_ERR_SVR_RESP',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3aaa023a6f8069c02c87a826ba323c54b8',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5ftimeout',['HTTPC_RESULT_ERR_TIMEOUT',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a8e6c597f88335b31e6a8b078a32fde33',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5funknown',['HTTPC_RESULT_ERR_UNKNOWN',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a5026187026abd1d242333ba6ff69ddbd',1,'http_client.h']]],
+  ['httpc_5fresult_5flocal_5fabort',['HTTPC_RESULT_LOCAL_ABORT',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3adf4e45365923c16b6a6879bde5f60867',1,'http_client.h']]],
+  ['httpc_5fresult_5fok',['HTTPC_RESULT_OK',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3af3173d4d272c9c0b5a5c9b5b027e3659',1,'http_client.h']]]
+];
diff --git a/doc/doxygen/output/html/search/enumvalues_2.html b/doc/doxygen/output/html/search/enumvalues_2.html
new file mode 100644
index 0000000..d499078
--- /dev/null
+++ b/doc/doxygen/output/html/search/enumvalues_2.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enumvalues_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/enumvalues_2.js b/doc/doxygen/output/html/search/enumvalues_2.js
new file mode 100644
index 0000000..f8fcbf3
--- /dev/null
+++ b/doc/doxygen/output/html/search/enumvalues_2.js
@@ -0,0 +1,52 @@
+var searchData=
+[
+  ['icmp6_5fdur_5faddress',['ICMP6_DUR_ADDRESS',['../prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa789ef8158d8750b0fa5a14ec9ecaa23a',1,'icmp6.h']]],
+  ['icmp6_5fdur_5fno_5froute',['ICMP6_DUR_NO_ROUTE',['../prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa695bb4d92f32b504a9483ff137235a78',1,'icmp6.h']]],
+  ['icmp6_5fdur_5fpolicy',['ICMP6_DUR_POLICY',['../prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfac3c255282e0b49b5bbb3cd8f435bb763',1,'icmp6.h']]],
+  ['icmp6_5fdur_5fport',['ICMP6_DUR_PORT',['../prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa28cc924ec6eaa761acb76ccef4adcba0',1,'icmp6.h']]],
+  ['icmp6_5fdur_5fprohibited',['ICMP6_DUR_PROHIBITED',['../prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa251961b990d0fbaf2c643f047c4f2532',1,'icmp6.h']]],
+  ['icmp6_5fdur_5freject_5froute',['ICMP6_DUR_REJECT_ROUTE',['../prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa2aeed278149fb071a34beec89df03b5c',1,'icmp6.h']]],
+  ['icmp6_5fdur_5fscope',['ICMP6_DUR_SCOPE',['../prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfabdb01a67c61da588872f5799ef75aa6e',1,'icmp6.h']]],
+  ['icmp6_5fpp_5ffield',['ICMP6_PP_FIELD',['../prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a4aa4a79306a69fd4f60ad445cde4c2a9',1,'icmp6.h']]],
+  ['icmp6_5fpp_5fheader',['ICMP6_PP_HEADER',['../prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023acbcc58901e2345ffc31df4098de60ff8',1,'icmp6.h']]],
+  ['icmp6_5fpp_5foption',['ICMP6_PP_OPTION',['../prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a53884832d00d3c8f8de62cfdb4646932',1,'icmp6.h']]],
+  ['icmp6_5fte_5ffrag',['ICMP6_TE_FRAG',['../prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eaec493420d61c80a21981b1aa32befe1f',1,'icmp6.h']]],
+  ['icmp6_5fte_5fhl',['ICMP6_TE_HL',['../prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eacccbb5e776df1b35af4149e593240880',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fdur',['ICMP6_TYPE_DUR',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aad9d4f207459e4bbd0c33a25adf6fdd7',1,'icmp6.h']]],
+  ['icmp6_5ftype_5ferep',['ICMP6_TYPE_EREP',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac6b91695c06bfc7fb2360310d7b8e78a',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fereq',['ICMP6_TYPE_EREQ',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae649aa45c97b885f28771688957528a3',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fmld',['ICMP6_TYPE_MLD',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a04228a1d11f9f88bd165f3430188bfe7',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fmlq',['ICMP6_TYPE_MLQ',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ad9794ae12b9ca196cc4fafaf6d834375',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fmlr',['ICMP6_TYPE_MLR',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a906dd689f0aa9b4796f49f299d4e3eb0',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fmra',['ICMP6_TYPE_MRA',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a29281016d3bb58e3bfd90417bbce7aa0',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fmrs',['ICMP6_TYPE_MRS',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a425f4e64a7d1570228adbbe450650ab4',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fmrt',['ICMP6_TYPE_MRT',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afb12a9d774f53deb15ec23041548f6fc',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fna',['ICMP6_TYPE_NA',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1f99d333f425c28d3840e029cc9c46f3',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fns',['ICMP6_TYPE_NS',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0d8d8717c6c34053d1101932c23929fe',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fpe1',['ICMP6_TYPE_PE1',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac7020c08a7b03ae2a198e4a8dcd31bd4',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fpe2',['ICMP6_TYPE_PE2',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aed14d280e5911098af914a94bd3ab22b',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fpe3',['ICMP6_TYPE_PE3',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a9c9c358ebd5eb683a66819fd9ecf98c6',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fpe4',['ICMP6_TYPE_PE4',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858af8ebe97c4f68b54c9ef0c43e98211df5',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fpp',['ICMP6_TYPE_PP',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a63114feac8140031b74424d4a7cf6b26',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fptb',['ICMP6_TYPE_PTB',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1d52ef5024a5822bd622bcb0b9da323d',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fra',['ICMP6_TYPE_RA',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae4ae04be7df3a2cce614af0a5cdae951',1,'icmp6.h']]],
+  ['icmp6_5ftype_5frd',['ICMP6_TYPE_RD',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0f6702d62de5f873e0afe7431d878207',1,'icmp6.h']]],
+  ['icmp6_5ftype_5frs',['ICMP6_TYPE_RS',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a670d95494c9282f646ac442d81d9a780',1,'icmp6.h']]],
+  ['icmp6_5ftype_5frsv_5ferr',['ICMP6_TYPE_RSV_ERR',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858abe61415e020b996220337f0cd002a28f',1,'icmp6.h']]],
+  ['icmp6_5ftype_5frsv_5finf',['ICMP6_TYPE_RSV_INF',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a2c12d3244d837bd243ea647ec530600d',1,'icmp6.h']]],
+  ['icmp6_5ftype_5fte',['ICMP6_TYPE_TE',['../prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afae9848904bc4b4b4aa716a7a9a2d7fe',1,'icmp6.h']]],
+  ['icmp_5fdur_5ffrag',['ICMP_DUR_FRAG',['../icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a8be2bc49d42aa1a6ee1da93a8700ef5f',1,'icmp.h']]],
+  ['icmp_5fdur_5fhost',['ICMP_DUR_HOST',['../icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a648ab915a76dfb7b9568e94de00da1e7',1,'icmp.h']]],
+  ['icmp_5fdur_5fnet',['ICMP_DUR_NET',['../icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3cc3714544e123bdef2eadb1a4d320e3',1,'icmp.h']]],
+  ['icmp_5fdur_5fport',['ICMP_DUR_PORT',['../icmp_8h.html#a17637465f209385e5d19ef47fd9266a5ac973dd9b04e094043ccc4cf875ef5644',1,'icmp.h']]],
+  ['icmp_5fdur_5fproto',['ICMP_DUR_PROTO',['../icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3c7bbd13b613990413ef167017dfbcef',1,'icmp.h']]],
+  ['icmp_5fdur_5fsr',['ICMP_DUR_SR',['../icmp_8h.html#a17637465f209385e5d19ef47fd9266a5af63296fc25f79e56946a56a8da132c13',1,'icmp.h']]],
+  ['icmp_5fte_5ffrag',['ICMP_TE_FRAG',['../icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa4d351874c3e2d4a4cf46569df28cd796',1,'icmp.h']]],
+  ['icmp_5fte_5fttl',['ICMP_TE_TTL',['../icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa827a1f8705826a6cc3c22e2571acf02c',1,'icmp.h']]],
+  ['ip6_5fmulticast',['IP6_MULTICAST',['../group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfea70cda997b66f3e120e925c5a41904809',1,'ip6_zone.h']]],
+  ['ip6_5funicast',['IP6_UNICAST',['../group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0',1,'ip6_zone.h']]],
+  ['ip6_5funknown',['IP6_UNKNOWN',['../group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8',1,'ip6_zone.h']]],
+  ['ipaddr_5ftype_5fany',['IPADDR_TYPE_ANY',['../group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e',1,'ip_addr.h']]],
+  ['ipaddr_5ftype_5fv4',['IPADDR_TYPE_V4',['../group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049',1,'ip_addr.h']]],
+  ['ipaddr_5ftype_5fv6',['IPADDR_TYPE_V6',['../group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02',1,'ip_addr.h']]]
+];
diff --git a/doc/doxygen/output/html/search/enumvalues_3.html b/doc/doxygen/output/html/search/enumvalues_3.html
new file mode 100644
index 0000000..b4fc3ee
--- /dev/null
+++ b/doc/doxygen/output/html/search/enumvalues_3.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enumvalues_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/enumvalues_3.js b/doc/doxygen/output/html/search/enumvalues_3.js
new file mode 100644
index 0000000..07de56e
--- /dev/null
+++ b/doc/doxygen/output/html/search/enumvalues_3.js
@@ -0,0 +1,30 @@
+var searchData=
+[
+  ['lwip_5fiana_5fhwtype_5fethernet',['LWIP_IANA_HWTYPE_ETHERNET',['../group__iana.html#gga3d2bbfcb56c8adf3be8c8d12868cecfea89e82e6ac55811bb26fe66ec029f2a0c',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fdhcp_5fclient',['LWIP_IANA_PORT_DHCP_CLIENT',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a9fcae1f16758e1ac35dab343fc897f40',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fdhcp_5fserver',['LWIP_IANA_PORT_DHCP_SERVER',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ac70ae96c985cf3660e26aa496094916d',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fhttp',['LWIP_IANA_PORT_HTTP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fhttps',['LWIP_IANA_PORT_HTTPS',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fmdns',['LWIP_IANA_PORT_MDNS',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a839da325f45916d7b27d53d5e5e97dc6',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fmqtt',['LWIP_IANA_PORT_MQTT',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fnetbios',['LWIP_IANA_PORT_NETBIOS',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae1cf6eaab024b31aff5bf407d38e0ede',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsecure_5fmqtt',['LWIP_IANA_PORT_SECURE_MQTT',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsmtp',['LWIP_IANA_PORT_SMTP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae2645895203ca3c54005afad053a813c',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsmtps',['LWIP_IANA_PORT_SMTPS',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a88f8872246977c6e24c617266ada1a3b',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsnmp',['LWIP_IANA_PORT_SNMP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aeb10a37f0c48e053b138f65b843c45d3',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsnmp_5ftrap',['LWIP_IANA_PORT_SNMP_TRAP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aff60c0d3e8eca210b7e4faca3491f4a8',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsntp',['LWIP_IANA_PORT_SNTP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5ftftp',['LWIP_IANA_PORT_TFTP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050',1,'iana.h']]],
+  ['lwip_5fpollscan_5fclear',['LWIP_POLLSCAN_CLEAR',['../sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9aa9a8fe3199d00016f1f5ad639e1b28f7',1,'sockets.c']]],
+  ['lwip_5fpollscan_5fdec_5fwait',['LWIP_POLLSCAN_DEC_WAIT',['../sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9a6c1eefa3e29a39b923c4b522eb1b3eb1',1,'sockets.c']]],
+  ['lwip_5fpollscan_5finc_5fwait',['LWIP_POLLSCAN_INC_WAIT',['../sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9ab6511d3104f70c18fb4bd80f24cb867d',1,'sockets.c']]],
+  ['lwiperf_5fclient',['LWIPERF_CLIENT',['../lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cae1862655ebaaea2e7e0261dff0173110',1,'lwiperf.h']]],
+  ['lwiperf_5fdual',['LWIPERF_DUAL',['../lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cab0381feca6655968e7380622e7a63ede',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5faborted_5flocal',['LWIPERF_TCP_ABORTED_LOCAL',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6abee2bf6da51a0845c15ac52b280203cb',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5faborted_5flocal_5fdataerror',['LWIPERF_TCP_ABORTED_LOCAL_DATAERROR',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6adda7e5dbaf1e04eb04ec0fd2b05584a5',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5faborted_5flocal_5ftxerror',['LWIPERF_TCP_ABORTED_LOCAL_TXERROR',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a3d4e1f5742d80aeafb6b22aa74d93e40',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5faborted_5fremote',['LWIPERF_TCP_ABORTED_REMOTE',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6ae664c0f987584f07fb0f6f8896aada0d',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5fdone_5fclient',['LWIPERF_TCP_DONE_CLIENT',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a4f9bde0cad305eaab25d2c1d0196677b',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5fdone_5fserver',['LWIPERF_TCP_DONE_SERVER',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6aa52255236ad2983346311ce7f28210e5',1,'lwiperf.h']]],
+  ['lwiperf_5ftradeoff',['LWIPERF_TRADEOFF',['../lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76caccdab7ee6e1b0981861e66f0755f7964',1,'lwiperf.h']]]
+];
diff --git a/doc/doxygen/output/html/search/enumvalues_4.html b/doc/doxygen/output/html/search/enumvalues_4.html
new file mode 100644
index 0000000..d6f69ac
--- /dev/null
+++ b/doc/doxygen/output/html/search/enumvalues_4.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enumvalues_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/enumvalues_4.js b/doc/doxygen/output/html/search/enumvalues_4.js
new file mode 100644
index 0000000..00eca2b
--- /dev/null
+++ b/doc/doxygen/output/html/search/enumvalues_4.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+  ['mqtt_5fconnect_5faccepted',['MQTT_CONNECT_ACCEPTED',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da074dc1d289b8e8d4aad91f6a2cb93dc1',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5fdisconnected',['MQTT_CONNECT_DISCONNECTED',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da321f5ce31b173f235de1a517fcfd00dd',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5frefused_5fidentifier',['MQTT_CONNECT_REFUSED_IDENTIFIER',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da28ffe49b0175adaa2b9a27cb4873224a',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5frefused_5fnot_5fauthorized_5f',['MQTT_CONNECT_REFUSED_NOT_AUTHORIZED_',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dafc4888158dd6ee84269a5f0bfdc12b17',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5frefused_5fprotocol_5fversion',['MQTT_CONNECT_REFUSED_PROTOCOL_VERSION',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da41f8aa97142be337cb639f94d9145190',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5frefused_5fserver',['MQTT_CONNECT_REFUSED_SERVER',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5frefused_5fusername_5fpass',['MQTT_CONNECT_REFUSED_USERNAME_PASS',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da290cf9037054c42022cc864cfade896a',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5ftimeout',['MQTT_CONNECT_TIMEOUT',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62',1,'mqtt.h']]],
+  ['mqtt_5fdata_5fflag_5flast',['MQTT_DATA_FLAG_LAST',['../group__mqtt.html#gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f',1,'mqtt.h']]]
+];
diff --git a/doc/doxygen/output/html/search/enumvalues_5.html b/doc/doxygen/output/html/search/enumvalues_5.html
new file mode 100644
index 0000000..43a28d1
--- /dev/null
+++ b/doc/doxygen/output/html/search/enumvalues_5.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enumvalues_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/enumvalues_5.js b/doc/doxygen/output/html/search/enumvalues_5.js
new file mode 100644
index 0000000..28edce9
--- /dev/null
+++ b/doc/doxygen/output/html/search/enumvalues_5.js
@@ -0,0 +1,14 @@
+var searchData=
+[
+  ['netconn_5fraw',['NETCONN_RAW',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a0d828a7e9c1614d4cae56602b09f39e9',1,'api.h']]],
+  ['netconn_5ftcp',['NETCONN_TCP',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a75d14318b91af7a452230189f47e5e1a',1,'api.h']]],
+  ['netconn_5ftcp_5fipv6',['NETCONN_TCP_IPV6',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91ae7efa7c4e50b7b381531a2136cd5a013',1,'api.h']]],
+  ['netconn_5fudp',['NETCONN_UDP',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a6b8ec191d69f7e639f4ab40779069636',1,'api.h']]],
+  ['netconn_5fudp_5fipv6',['NETCONN_UDP_IPV6',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a34ee1c89f6705462590a4fe2c9772d9e',1,'api.h']]],
+  ['netconn_5fudplite',['NETCONN_UDPLITE',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a655e1625cc7e6a93f1e3d2646f56a1e4',1,'api.h']]],
+  ['netconn_5fudplite_5fipv6',['NETCONN_UDPLITE_IPV6',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91aa9cabc9d90606b5c5939fcc02ac588c7',1,'api.h']]],
+  ['netconn_5fudpnochksum',['NETCONN_UDPNOCHKSUM',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a7e0c3f566b3d4321b36b711b6b1ad6de',1,'api.h']]],
+  ['netconn_5fudpnochksum_5fipv6',['NETCONN_UDPNOCHKSUM_IPV6',['../group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a2c7f548d26f6c411f084b6c59247b60e',1,'api.h']]],
+  ['netif_5fadd_5fmac_5ffilter',['NETIF_ADD_MAC_FILTER',['../netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a4186fbaf94be956ea1a3b02cd1cccb1f',1,'netif.h']]],
+  ['netif_5fdel_5fmac_5ffilter',['NETIF_DEL_MAC_FILTER',['../netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a7ad3406353906deb4e64ebeed349e07e',1,'netif.h']]]
+];
diff --git a/doc/doxygen/output/html/search/enumvalues_6.html b/doc/doxygen/output/html/search/enumvalues_6.html
new file mode 100644
index 0000000..7439ee1
--- /dev/null
+++ b/doc/doxygen/output/html/search/enumvalues_6.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="enumvalues_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/enumvalues_6.js b/doc/doxygen/output/html/search/enumvalues_6.js
new file mode 100644
index 0000000..68c7097
--- /dev/null
+++ b/doc/doxygen/output/html/search/enumvalues_6.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+  ['pbuf_5fip',['PBUF_IP',['../group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfafcc1e506061ba69dfa142eb6b3da5f13',1,'pbuf.h']]],
+  ['pbuf_5flink',['PBUF_LINK',['../group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfab4de441e737330558b609a990cd17346',1,'pbuf.h']]],
+  ['pbuf_5fpool',['PBUF_POOL',['../group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbae969347127387b9b59a23ccd24b76d21',1,'pbuf.h']]],
+  ['pbuf_5fram',['PBUF_RAM',['../group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac5e9f28455bca98944a030d4b84ecfab',1,'pbuf.h']]],
+  ['pbuf_5fraw',['PBUF_RAW',['../group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba',1,'pbuf.h']]],
+  ['pbuf_5fraw_5ftx',['PBUF_RAW_TX',['../group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa0ff039585f05f9208bcb66c2d37783e2',1,'pbuf.h']]],
+  ['pbuf_5fref',['PBUF_REF',['../group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac9b6ba960fdea6f2e8f35c8313b77e4e',1,'pbuf.h']]],
+  ['pbuf_5from',['PBUF_ROM',['../group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac120b0fe39efe35bb682e4aa3b82e2c9',1,'pbuf.h']]],
+  ['pbuf_5ftransport',['PBUF_TRANSPORT',['../group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa2ded3594a3977f8bf9cf09552be327b5',1,'pbuf.h']]]
+];
diff --git a/doc/doxygen/output/html/search/files_0.html b/doc/doxygen/output/html/search/files_0.html
new file mode 100644
index 0000000..4f272b8
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_0.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/files_0.js b/doc/doxygen/output/html/search/files_0.js
new file mode 100644
index 0000000..8bafdeb
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_0.js
@@ -0,0 +1,24 @@
+var searchData=
+[
+  ['altcp_2ec',['altcp.c',['../altcp_8c.html',1,'']]],
+  ['altcp_2eh',['altcp.h',['../altcp_8h.html',1,'']]],
+  ['altcp_5falloc_2ec',['altcp_alloc.c',['../altcp__alloc_8c.html',1,'']]],
+  ['altcp_5fpriv_2eh',['altcp_priv.h',['../altcp__priv_8h.html',1,'']]],
+  ['altcp_5fproxyconnect_2ec',['altcp_proxyconnect.c',['../altcp__proxyconnect_8c.html',1,'']]],
+  ['altcp_5fproxyconnect_2eh',['altcp_proxyconnect.h',['../altcp__proxyconnect_8h.html',1,'']]],
+  ['altcp_5ftcp_2ec',['altcp_tcp.c',['../altcp__tcp_8c.html',1,'']]],
+  ['altcp_5ftcp_2eh',['altcp_tcp.h',['../altcp__tcp_8h.html',1,'']]],
+  ['altcp_5ftls_2eh',['altcp_tls.h',['../altcp__tls_8h.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_2ec',['altcp_tls_mbedtls.c',['../altcp__tls__mbedtls_8c.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_5fmem_2ec',['altcp_tls_mbedtls_mem.c',['../altcp__tls__mbedtls__mem_8c.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_5fmem_2eh',['altcp_tls_mbedtls_mem.h',['../altcp__tls__mbedtls__mem_8h.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_5fopts_2eh',['altcp_tls_mbedtls_opts.h',['../altcp__tls__mbedtls__opts_8h.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_5fstructs_2eh',['altcp_tls_mbedtls_structs.h',['../altcp__tls__mbedtls__structs_8h.html',1,'']]],
+  ['api_2eh',['api.h',['../api_8h.html',1,'']]],
+  ['api_5flib_2ec',['api_lib.c',['../api__lib_8c.html',1,'']]],
+  ['api_5fmsg_2ec',['api_msg.c',['../api__msg_8c.html',1,'']]],
+  ['api_5fmsg_2eh',['api_msg.h',['../api__msg_8h.html',1,'']]],
+  ['arch_2eh',['arch.h',['../arch_8h.html',1,'']]],
+  ['autoip_2ec',['autoip.c',['../autoip_8c.html',1,'']]],
+  ['autoip_2eh',['autoip.h',['../autoip_8h.html',1,'(Global Namespace)'],['../prot_2autoip_8h.html',1,'(Global Namespace)']]]
+];
diff --git a/doc/doxygen/output/html/search/files_1.html b/doc/doxygen/output/html/search/files_1.html
new file mode 100644
index 0000000..dcce422
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_1.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/files_1.js b/doc/doxygen/output/html/search/files_1.js
new file mode 100644
index 0000000..00e7f12
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_1.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+  ['bridgeif_2ec',['bridgeif.c',['../bridgeif_8c.html',1,'']]],
+  ['bridgeif_2eh',['bridgeif.h',['../bridgeif_8h.html',1,'']]],
+  ['bridgeif_5ffdb_2ec',['bridgeif_fdb.c',['../bridgeif__fdb_8c.html',1,'']]],
+  ['bridgeif_5fopts_2eh',['bridgeif_opts.h',['../bridgeif__opts_8h.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/files_2.html b/doc/doxygen/output/html/search/files_2.html
new file mode 100644
index 0000000..d5c6c3b
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_2.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/files_2.js b/doc/doxygen/output/html/search/files_2.js
new file mode 100644
index 0000000..608188f
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_2.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+  ['debug_2eh',['debug.h',['../debug_8h.html',1,'']]],
+  ['def_2ec',['def.c',['../def_8c.html',1,'']]],
+  ['def_2eh',['def.h',['../def_8h.html',1,'']]],
+  ['dhcp_2ec',['dhcp.c',['../dhcp_8c.html',1,'']]],
+  ['dhcp_2eh',['dhcp.h',['../dhcp_8h.html',1,'(Global Namespace)'],['../prot_2dhcp_8h.html',1,'(Global Namespace)']]],
+  ['dhcp6_2ec',['dhcp6.c',['../dhcp6_8c.html',1,'']]],
+  ['dhcp6_2eh',['dhcp6.h',['../dhcp6_8h.html',1,'(Global Namespace)'],['../prot_2dhcp6_8h.html',1,'(Global Namespace)']]],
+  ['dns_2ec',['dns.c',['../dns_8c.html',1,'']]],
+  ['dns_2eh',['dns.h',['../dns_8h.html',1,'(Global Namespace)'],['../prot_2dns_8h.html',1,'(Global Namespace)']]]
+];
diff --git a/doc/doxygen/output/html/search/files_3.html b/doc/doxygen/output/html/search/files_3.html
new file mode 100644
index 0000000..d5a9528
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_3.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/files_3.js b/doc/doxygen/output/html/search/files_3.js
new file mode 100644
index 0000000..2a23659
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_3.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+  ['err_2ec',['err.c',['../err_8c.html',1,'']]],
+  ['err_2eh',['err.h',['../err_8h.html',1,'']]],
+  ['errno_2eh',['errno.h',['../compat_2stdc_2errno_8h.html',1,'(Global Namespace)'],['../lwip_2errno_8h.html',1,'(Global Namespace)']]],
+  ['etharp_2ec',['etharp.c',['../etharp_8c.html',1,'']]],
+  ['etharp_2eh',['etharp.h',['../lwip_2etharp_8h.html',1,'(Global Namespace)'],['../lwip_2prot_2etharp_8h.html',1,'(Global Namespace)']]],
+  ['ethernet_2ec',['ethernet.c',['../ethernet_8c.html',1,'']]],
+  ['ethernet_2eh',['ethernet.h',['../lwip_2prot_2ethernet_8h.html',1,'(Global Namespace)'],['../netif_2ethernet_8h.html',1,'(Global Namespace)']]],
+  ['ethip6_2ec',['ethip6.c',['../ethip6_8c.html',1,'']]],
+  ['ethip6_2eh',['ethip6.h',['../ethip6_8h.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/files_4.html b/doc/doxygen/output/html/search/files_4.html
new file mode 100644
index 0000000..7b4c42a
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_4.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/files_4.js b/doc/doxygen/output/html/search/files_4.js
new file mode 100644
index 0000000..e9bef30
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_4.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+  ['http_5fclient_2ec',['http_client.c',['../http__client_8c.html',1,'']]],
+  ['http_5fclient_2eh',['http_client.h',['../http__client_8h.html',1,'']]],
+  ['httpd_2ec',['httpd.c',['../httpd_8c.html',1,'']]],
+  ['httpd_2eh',['httpd.h',['../httpd_8h.html',1,'']]],
+  ['httpd_5fopts_2eh',['httpd_opts.h',['../httpd__opts_8h.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/files_5.html b/doc/doxygen/output/html/search/files_5.html
new file mode 100644
index 0000000..1f77bb1
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_5.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/files_5.js b/doc/doxygen/output/html/search/files_5.js
new file mode 100644
index 0000000..b9c9e1f
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_5.js
@@ -0,0 +1,37 @@
+var searchData=
+[
+  ['iana_2eh',['iana.h',['../iana_8h.html',1,'']]],
+  ['icmp_2ec',['icmp.c',['../icmp_8c.html',1,'']]],
+  ['icmp_2eh',['icmp.h',['../icmp_8h.html',1,'(Global Namespace)'],['../prot_2icmp_8h.html',1,'(Global Namespace)']]],
+  ['icmp6_2ec',['icmp6.c',['../icmp6_8c.html',1,'']]],
+  ['icmp6_2eh',['icmp6.h',['../icmp6_8h.html',1,'(Global Namespace)'],['../prot_2icmp6_8h.html',1,'(Global Namespace)']]],
+  ['ieee_2eh',['ieee.h',['../ieee_8h.html',1,'']]],
+  ['ieee802154_2eh',['ieee802154.h',['../ieee802154_8h.html',1,'']]],
+  ['if_2eh',['if.h',['../if_8h.html',1,'']]],
+  ['if_5fapi_2ec',['if_api.c',['../if__api_8c.html',1,'']]],
+  ['if_5fapi_2eh',['if_api.h',['../if__api_8h.html',1,'']]],
+  ['igmp_2ec',['igmp.c',['../igmp_8c.html',1,'']]],
+  ['igmp_2eh',['igmp.h',['../igmp_8h.html',1,'(Global Namespace)'],['../prot_2igmp_8h.html',1,'(Global Namespace)']]],
+  ['inet_2eh',['inet.h',['../compat_2posix_2arpa_2inet_8h.html',1,'(Global Namespace)'],['../lwip_2inet_8h.html',1,'(Global Namespace)']]],
+  ['inet6_2ec',['inet6.c',['../inet6_8c.html',1,'']]],
+  ['inet_5fchksum_2ec',['inet_chksum.c',['../inet__chksum_8c.html',1,'']]],
+  ['inet_5fchksum_2eh',['inet_chksum.h',['../inet__chksum_8h.html',1,'']]],
+  ['init_2ec',['init.c',['../init_8c.html',1,'']]],
+  ['init_2eh',['init.h',['../init_8h.html',1,'']]],
+  ['ip_2ec',['ip.c',['../ip_8c.html',1,'']]],
+  ['ip_2eh',['ip.h',['../ip_8h.html',1,'(Global Namespace)'],['../prot_2ip_8h.html',1,'(Global Namespace)']]],
+  ['ip4_2ec',['ip4.c',['../ip4_8c.html',1,'']]],
+  ['ip4_2eh',['ip4.h',['../ip4_8h.html',1,'(Global Namespace)'],['../prot_2ip4_8h.html',1,'(Global Namespace)']]],
+  ['ip4_5faddr_2ec',['ip4_addr.c',['../ip4__addr_8c.html',1,'']]],
+  ['ip4_5faddr_2eh',['ip4_addr.h',['../ip4__addr_8h.html',1,'']]],
+  ['ip4_5ffrag_2ec',['ip4_frag.c',['../ip4__frag_8c.html',1,'']]],
+  ['ip4_5ffrag_2eh',['ip4_frag.h',['../ip4__frag_8h.html',1,'']]],
+  ['ip6_2ec',['ip6.c',['../ip6_8c.html',1,'']]],
+  ['ip6_2eh',['ip6.h',['../ip6_8h.html',1,'(Global Namespace)'],['../prot_2ip6_8h.html',1,'(Global Namespace)']]],
+  ['ip6_5faddr_2ec',['ip6_addr.c',['../ip6__addr_8c.html',1,'']]],
+  ['ip6_5faddr_2eh',['ip6_addr.h',['../ip6__addr_8h.html',1,'']]],
+  ['ip6_5ffrag_2ec',['ip6_frag.c',['../ip6__frag_8c.html',1,'']]],
+  ['ip6_5ffrag_2eh',['ip6_frag.h',['../ip6__frag_8h.html',1,'']]],
+  ['ip6_5fzone_2eh',['ip6_zone.h',['../ip6__zone_8h.html',1,'']]],
+  ['ip_5faddr_2eh',['ip_addr.h',['../ip__addr_8h.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/files_6.html b/doc/doxygen/output/html/search/files_6.html
new file mode 100644
index 0000000..7573254
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_6.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/files_6.js b/doc/doxygen/output/html/search/files_6.js
new file mode 100644
index 0000000..ee950a5
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_6.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+  ['lowpan6_2ec',['lowpan6.c',['../lowpan6_8c.html',1,'']]],
+  ['lowpan6_2eh',['lowpan6.h',['../lowpan6_8h.html',1,'']]],
+  ['lowpan6_5fble_2ec',['lowpan6_ble.c',['../lowpan6__ble_8c.html',1,'']]],
+  ['lowpan6_5fble_2eh',['lowpan6_ble.h',['../lowpan6__ble_8h.html',1,'']]],
+  ['lowpan6_5fcommon_2ec',['lowpan6_common.c',['../lowpan6__common_8c.html',1,'']]],
+  ['lowpan6_5fcommon_2eh',['lowpan6_common.h',['../lowpan6__common_8h.html',1,'']]],
+  ['lowpan6_5fopts_2eh',['lowpan6_opts.h',['../lowpan6__opts_8h.html',1,'']]],
+  ['lwiperf_2ec',['lwiperf.c',['../lwiperf_8c.html',1,'']]],
+  ['lwiperf_2eh',['lwiperf.h',['../lwiperf_8h.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/files_7.html b/doc/doxygen/output/html/search/files_7.html
new file mode 100644
index 0000000..214b329
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_7.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/files_7.js b/doc/doxygen/output/html/search/files_7.js
new file mode 100644
index 0000000..3c9a2c9
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_7.js
@@ -0,0 +1,20 @@
+var searchData=
+[
+  ['mdns_2ec',['mdns.c',['../mdns_8c.html',1,'']]],
+  ['mdns_2eh',['mdns.h',['../mdns_8h.html',1,'']]],
+  ['mdns_5fopts_2eh',['mdns_opts.h',['../mdns__opts_8h.html',1,'']]],
+  ['mdns_5fpriv_2eh',['mdns_priv.h',['../mdns__priv_8h.html',1,'']]],
+  ['mem_2ec',['mem.c',['../mem_8c.html',1,'']]],
+  ['mem_2eh',['mem.h',['../mem_8h.html',1,'']]],
+  ['mem_5fpriv_2eh',['mem_priv.h',['../mem__priv_8h.html',1,'']]],
+  ['memp_2ec',['memp.c',['../memp_8c.html',1,'']]],
+  ['memp_2eh',['memp.h',['../memp_8h.html',1,'']]],
+  ['memp_5fpriv_2eh',['memp_priv.h',['../memp__priv_8h.html',1,'']]],
+  ['memp_5fstd_2eh',['memp_std.h',['../memp__std_8h.html',1,'']]],
+  ['mld6_2ec',['mld6.c',['../mld6_8c.html',1,'']]],
+  ['mld6_2eh',['mld6.h',['../mld6_8h.html',1,'(Global Namespace)'],['../prot_2mld6_8h.html',1,'(Global Namespace)']]],
+  ['mqtt_2ec',['mqtt.c',['../mqtt_8c.html',1,'']]],
+  ['mqtt_2eh',['mqtt.h',['../mqtt_8h.html',1,'']]],
+  ['mqtt_5fopts_2eh',['mqtt_opts.h',['../mqtt__opts_8h.html',1,'']]],
+  ['mqtt_5fpriv_2eh',['mqtt_priv.h',['../mqtt__priv_8h.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/files_8.html b/doc/doxygen/output/html/search/files_8.html
new file mode 100644
index 0000000..6720c7c
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_8.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/files_8.js b/doc/doxygen/output/html/search/files_8.js
new file mode 100644
index 0000000..d0751f1
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_8.js
@@ -0,0 +1,17 @@
+var searchData=
+[
+  ['nd6_2ec',['nd6.c',['../nd6_8c.html',1,'']]],
+  ['nd6_2eh',['nd6.h',['../nd6_8h.html',1,'(Global Namespace)'],['../prot_2nd6_8h.html',1,'(Global Namespace)']]],
+  ['nd6_5fpriv_2eh',['nd6_priv.h',['../nd6__priv_8h.html',1,'']]],
+  ['netbiosns_2ec',['netbiosns.c',['../netbiosns_8c.html',1,'']]],
+  ['netbiosns_2eh',['netbiosns.h',['../netbiosns_8h.html',1,'']]],
+  ['netbiosns_5fopts_2eh',['netbiosns_opts.h',['../netbiosns__opts_8h.html',1,'']]],
+  ['netbuf_2ec',['netbuf.c',['../netbuf_8c.html',1,'']]],
+  ['netbuf_2eh',['netbuf.h',['../netbuf_8h.html',1,'']]],
+  ['netdb_2ec',['netdb.c',['../netdb_8c.html',1,'']]],
+  ['netdb_2eh',['netdb.h',['../compat_2posix_2netdb_8h.html',1,'(Global Namespace)'],['../lwip_2netdb_8h.html',1,'(Global Namespace)']]],
+  ['netif_2ec',['netif.c',['../netif_8c.html',1,'']]],
+  ['netif_2eh',['netif.h',['../netif_8h.html',1,'']]],
+  ['netifapi_2ec',['netifapi.c',['../netifapi_8c.html',1,'']]],
+  ['netifapi_2eh',['netifapi.h',['../netifapi_8h.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/files_9.html b/doc/doxygen/output/html/search/files_9.html
new file mode 100644
index 0000000..fc95877
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_9.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/files_9.js b/doc/doxygen/output/html/search/files_9.js
new file mode 100644
index 0000000..05d8df7
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_9.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['opt_2eh',['opt.h',['../opt_8h.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/files_a.html b/doc/doxygen/output/html/search/files_a.html
new file mode 100644
index 0000000..ffe3e9d
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/files_a.js b/doc/doxygen/output/html/search/files_a.js
new file mode 100644
index 0000000..2a66df7
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_a.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+  ['pbuf_2ec',['pbuf.c',['../pbuf_8c.html',1,'']]],
+  ['pbuf_2eh',['pbuf.h',['../pbuf_8h.html',1,'']]],
+  ['pppapi_2ec',['pppapi.c',['../pppapi_8c.html',1,'']]],
+  ['pppol2tp_2ec',['pppol2tp.c',['../pppol2tp_8c.html',1,'']]],
+  ['pppol2tp_2eh',['pppol2tp.h',['../pppol2tp_8h.html',1,'']]],
+  ['pppos_2ec',['pppos.c',['../pppos_8c.html',1,'']]],
+  ['pppos_2eh',['pppos.h',['../pppos_8h.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/files_b.html b/doc/doxygen/output/html/search/files_b.html
new file mode 100644
index 0000000..32cd2be
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_b.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/files_b.js b/doc/doxygen/output/html/search/files_b.js
new file mode 100644
index 0000000..eba968a
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_b.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+  ['raw_2ec',['raw.c',['../raw_8c.html',1,'']]],
+  ['raw_2eh',['raw.h',['../raw_8h.html',1,'']]],
+  ['raw_5fpriv_2eh',['raw_priv.h',['../raw__priv_8h.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/files_c.html b/doc/doxygen/output/html/search/files_c.html
new file mode 100644
index 0000000..bb83608
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_c.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/files_c.js b/doc/doxygen/output/html/search/files_c.js
new file mode 100644
index 0000000..8b27e4c
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_c.js
@@ -0,0 +1,49 @@
+var searchData=
+[
+  ['slipif_2ec',['slipif.c',['../slipif_8c.html',1,'']]],
+  ['slipif_2eh',['slipif.h',['../slipif_8h.html',1,'']]],
+  ['smtp_2ec',['smtp.c',['../smtp_8c.html',1,'']]],
+  ['snmp_2eh',['snmp.h',['../apps_2snmp_8h.html',1,'(Global Namespace)'],['../snmp_8h.html',1,'(Global Namespace)']]],
+  ['snmp_5fasn1_2ec',['snmp_asn1.c',['../snmp__asn1_8c.html',1,'']]],
+  ['snmp_5fasn1_2eh',['snmp_asn1.h',['../snmp__asn1_8h.html',1,'']]],
+  ['snmp_5fcore_2ec',['snmp_core.c',['../snmp__core_8c.html',1,'']]],
+  ['snmp_5fcore_2eh',['snmp_core.h',['../snmp__core_8h.html',1,'']]],
+  ['snmp_5fmib2_2ec',['snmp_mib2.c',['../snmp__mib2_8c.html',1,'']]],
+  ['snmp_5fmib2_2eh',['snmp_mib2.h',['../snmp__mib2_8h.html',1,'']]],
+  ['snmp_5fmib2_5ficmp_2ec',['snmp_mib2_icmp.c',['../snmp__mib2__icmp_8c.html',1,'']]],
+  ['snmp_5fmib2_5finterfaces_2ec',['snmp_mib2_interfaces.c',['../snmp__mib2__interfaces_8c.html',1,'']]],
+  ['snmp_5fmib2_5fip_2ec',['snmp_mib2_ip.c',['../snmp__mib2__ip_8c.html',1,'']]],
+  ['snmp_5fmib2_5fsnmp_2ec',['snmp_mib2_snmp.c',['../snmp__mib2__snmp_8c.html',1,'']]],
+  ['snmp_5fmib2_5fsystem_2ec',['snmp_mib2_system.c',['../snmp__mib2__system_8c.html',1,'']]],
+  ['snmp_5fmib2_5ftcp_2ec',['snmp_mib2_tcp.c',['../snmp__mib2__tcp_8c.html',1,'']]],
+  ['snmp_5fmib2_5fudp_2ec',['snmp_mib2_udp.c',['../snmp__mib2__udp_8c.html',1,'']]],
+  ['snmp_5fmsg_2ec',['snmp_msg.c',['../snmp__msg_8c.html',1,'']]],
+  ['snmp_5fmsg_2eh',['snmp_msg.h',['../snmp__msg_8h.html',1,'']]],
+  ['snmp_5fnetconn_2ec',['snmp_netconn.c',['../snmp__netconn_8c.html',1,'']]],
+  ['snmp_5fopts_2eh',['snmp_opts.h',['../snmp__opts_8h.html',1,'']]],
+  ['snmp_5fpbuf_5fstream_2ec',['snmp_pbuf_stream.c',['../snmp__pbuf__stream_8c.html',1,'']]],
+  ['snmp_5fpbuf_5fstream_2eh',['snmp_pbuf_stream.h',['../snmp__pbuf__stream_8h.html',1,'']]],
+  ['snmp_5fraw_2ec',['snmp_raw.c',['../snmp__raw_8c.html',1,'']]],
+  ['snmp_5fscalar_2ec',['snmp_scalar.c',['../snmp__scalar_8c.html',1,'']]],
+  ['snmp_5fscalar_2eh',['snmp_scalar.h',['../snmp__scalar_8h.html',1,'']]],
+  ['snmp_5ftable_2ec',['snmp_table.c',['../snmp__table_8c.html',1,'']]],
+  ['snmp_5ftable_2eh',['snmp_table.h',['../snmp__table_8h.html',1,'']]],
+  ['snmp_5fthreadsync_2ec',['snmp_threadsync.c',['../snmp__threadsync_8c.html',1,'']]],
+  ['snmp_5fthreadsync_2eh',['snmp_threadsync.h',['../snmp__threadsync_8h.html',1,'']]],
+  ['snmp_5ftraps_2ec',['snmp_traps.c',['../snmp__traps_8c.html',1,'']]],
+  ['snmpv3_2ec',['snmpv3.c',['../snmpv3_8c.html',1,'']]],
+  ['snmpv3_2eh',['snmpv3.h',['../snmpv3_8h.html',1,'']]],
+  ['snmpv3_5fmbedtls_2ec',['snmpv3_mbedtls.c',['../snmpv3__mbedtls_8c.html',1,'']]],
+  ['snmpv3_5fpriv_2eh',['snmpv3_priv.h',['../snmpv3__priv_8h.html',1,'']]],
+  ['sntp_2ec',['sntp.c',['../sntp_8c.html',1,'']]],
+  ['sntp_2eh',['sntp.h',['../sntp_8h.html',1,'']]],
+  ['sntp_5fopts_2eh',['sntp_opts.h',['../sntp__opts_8h.html',1,'']]],
+  ['socket_2eh',['socket.h',['../socket_8h.html',1,'']]],
+  ['sockets_2ec',['sockets.c',['../sockets_8c.html',1,'']]],
+  ['sockets_2eh',['sockets.h',['../sockets_8h.html',1,'']]],
+  ['sockets_5fpriv_2eh',['sockets_priv.h',['../sockets__priv_8h.html',1,'']]],
+  ['stats_2ec',['stats.c',['../stats_8c.html',1,'']]],
+  ['stats_2eh',['stats.h',['../stats_8h.html',1,'']]],
+  ['sys_2ec',['sys.c',['../sys_8c.html',1,'']]],
+  ['sys_2eh',['sys.h',['../sys_8h.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/files_d.html b/doc/doxygen/output/html/search/files_d.html
new file mode 100644
index 0000000..38bf2b3
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/files_d.js b/doc/doxygen/output/html/search/files_d.js
new file mode 100644
index 0000000..a9d7bbe
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_d.js
@@ -0,0 +1,17 @@
+var searchData=
+[
+  ['tcp_2ec',['tcp.c',['../tcp_8c.html',1,'']]],
+  ['tcp_2eh',['tcp.h',['../prot_2tcp_8h.html',1,'(Global Namespace)'],['../tcp_8h.html',1,'(Global Namespace)']]],
+  ['tcp_5fin_2ec',['tcp_in.c',['../tcp__in_8c.html',1,'']]],
+  ['tcp_5fout_2ec',['tcp_out.c',['../tcp__out_8c.html',1,'']]],
+  ['tcp_5fpriv_2eh',['tcp_priv.h',['../tcp__priv_8h.html',1,'']]],
+  ['tcpbase_2eh',['tcpbase.h',['../tcpbase_8h.html',1,'']]],
+  ['tcpip_2ec',['tcpip.c',['../tcpip_8c.html',1,'']]],
+  ['tcpip_2eh',['tcpip.h',['../tcpip_8h.html',1,'']]],
+  ['tcpip_5fpriv_2eh',['tcpip_priv.h',['../tcpip__priv_8h.html',1,'']]],
+  ['tftp_5fopts_2eh',['tftp_opts.h',['../tftp__opts_8h.html',1,'']]],
+  ['tftp_5fserver_2ec',['tftp_server.c',['../tftp__server_8c.html',1,'']]],
+  ['tftp_5fserver_2eh',['tftp_server.h',['../tftp__server_8h.html',1,'']]],
+  ['timeouts_2ec',['timeouts.c',['../timeouts_8c.html',1,'']]],
+  ['timeouts_2eh',['timeouts.h',['../timeouts_8h.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/files_e.html b/doc/doxygen/output/html/search/files_e.html
new file mode 100644
index 0000000..6f84762
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_e.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/files_e.js b/doc/doxygen/output/html/search/files_e.js
new file mode 100644
index 0000000..0919264
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_e.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['udp_2ec',['udp.c',['../udp_8c.html',1,'']]],
+  ['udp_2eh',['udp.h',['../prot_2udp_8h.html',1,'(Global Namespace)'],['../udp_8h.html',1,'(Global Namespace)']]]
+];
diff --git a/doc/doxygen/output/html/search/files_f.html b/doc/doxygen/output/html/search/files_f.html
new file mode 100644
index 0000000..7568063
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/files_f.js b/doc/doxygen/output/html/search/files_f.js
new file mode 100644
index 0000000..f0c60f6
--- /dev/null
+++ b/doc/doxygen/output/html/search/files_f.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['zepif_2ec',['zepif.c',['../zepif_8c.html',1,'']]],
+  ['zepif_2eh',['zepif.h',['../zepif_8h.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/functions_0.html b/doc/doxygen/output/html/search/functions_0.html
new file mode 100644
index 0000000..4e6d87d
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_0.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/functions_0.js b/doc/doxygen/output/html/search/functions_0.js
new file mode 100644
index 0000000..c87e453
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_0.js
@@ -0,0 +1,47 @@
+var searchData=
+[
+  ['altcp_5fabort',['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',['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',['altcp_alloc',['../altcp_8c.html#a6a99f8757c18fbc9b9f30925afbcf4c2',1,'altcp_alloc(void):&#160;altcp.c'],['../altcp__priv_8h.html#a6a99f8757c18fbc9b9f30925afbcf4c2',1,'altcp_alloc(void):&#160;altcp.c']]],
+  ['altcp_5farg',['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',['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',['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',['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',['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',['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',['altcp_listen_with_backlog_and_err',['../group__altcp.html#gac69722b86b1198916f2527fb9f132c2b',1,'altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err):&#160;altcp.c'],['../group__altcp.html#gac69722b86b1198916f2527fb9f132c2b',1,'altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err):&#160;altcp.c']]],
+  ['altcp_5fmss',['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',['altcp_new',['../group__altcp.html#ga86843287b0ad0099c067817cfb7aa336',1,'altcp_new(altcp_allocator_t *allocator):&#160;altcp.c'],['../group__altcp.html#ga86843287b0ad0099c067817cfb7aa336',1,'altcp_new(altcp_allocator_t *allocator):&#160;altcp.c']]],
+  ['altcp_5fnew_5fip6',['altcp_new_ip6',['../group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1',1,'altcp_new_ip6(altcp_allocator_t *allocator):&#160;altcp.c'],['../group__altcp.html#gaa51a47bcb334b188c82a1b99db49f1f1',1,'altcp_new_ip6(altcp_allocator_t *allocator):&#160;altcp.c']]],
+  ['altcp_5fnew_5fip_5ftype',['altcp_new_ip_type',['../group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21',1,'altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type):&#160;altcp.c'],['../group__altcp.html#gab631f6f92d7f6c58d9db27b7b415bc21',1,'altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type):&#160;altcp.c']]],
+  ['altcp_5foutput',['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',['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',['altcp_proxyconnect_alloc',['../altcp__proxyconnect_8c.html#a3d3af45390467ceeaa064b7e28dd43a9',1,'altcp_proxyconnect_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#a3d3af45390467ceeaa064b7e28dd43a9',1,'altcp_proxyconnect_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
+  ['altcp_5fproxyconnect_5fnew',['altcp_proxyconnect_new',['../altcp__proxyconnect_8c.html#ae774782064a92d0f58ce07b57a5360d1',1,'altcp_proxyconnect_new(struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#ae774782064a92d0f58ce07b57a5360d1',1,'altcp_proxyconnect_new(struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb):&#160;altcp_proxyconnect.c']]],
+  ['altcp_5fproxyconnect_5fnew_5ftcp',['altcp_proxyconnect_new_tcp',['../altcp__proxyconnect_8c.html#a24e122d2bc2c0b9f86074c1e8d5ccfe4',1,'altcp_proxyconnect_new_tcp(struct altcp_proxyconnect_config *config, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#a24e122d2bc2c0b9f86074c1e8d5ccfe4',1,'altcp_proxyconnect_new_tcp(struct altcp_proxyconnect_config *config, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
+  ['altcp_5fproxyconnect_5ftls_5falloc',['altcp_proxyconnect_tls_alloc',['../altcp__proxyconnect_8c.html#a5ff49bcd035847a8915f18deef4172a9',1,'altcp_proxyconnect_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#a5ff49bcd035847a8915f18deef4172a9',1,'altcp_proxyconnect_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
+  ['altcp_5frecv',['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',['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',['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',['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',['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',['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',['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',['altcp_tcp_alloc',['../altcp__tcp_8c.html#a211215e43cb40bd204a20c34316b7caa',1,'altcp_tcp_alloc(void *arg, u8_t ip_type):&#160;altcp_tcp.c'],['../altcp__tcp_8h.html#a211215e43cb40bd204a20c34316b7caa',1,'altcp_tcp_alloc(void *arg, u8_t ip_type):&#160;altcp_tcp.c']]],
+  ['altcp_5ftls_5falloc',['altcp_tls_alloc',['../group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391',1,'altcp_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_alloc.c'],['../group__altcp__tls.html#ga09e6ca8f144ee94ef21d7e5760aa4391',1,'altcp_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_alloc.c']]],
+  ['altcp_5ftls_5fcontext',['altcp_tls_context',['../group__altcp__tls.html#gabc1741530d5089c3093889416430bc76',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fcreate_5fconfig_5fclient',['altcp_tls_create_config_client',['../group__altcp__tls.html#ga2b249447e10c8599b6d723d403086c35',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fcreate_5fconfig_5fclient_5f2wayauth',['altcp_tls_create_config_client_2wayauth',['../group__altcp__tls.html#ga7352a4600fee89e167541cf0776c01fb',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fcreate_5fconfig_5fserver_5fprivkey_5fcert',['altcp_tls_create_config_server_privkey_cert',['../group__altcp__tls.html#ga700dc0320e93cea337673e7d4295e161',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5ffree_5fconfig',['altcp_tls_free_config',['../group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fnew',['altcp_tls_new',['../group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a',1,'altcp_tls_new(struct altcp_tls_config *config, u8_t ip_type):&#160;altcp_alloc.c'],['../group__altcp__tls.html#ga028316a8257cf8dcace9cd063de79c0a',1,'altcp_tls_new(struct altcp_tls_config *config, u8_t ip_type):&#160;altcp_alloc.c']]],
+  ['altcp_5ftls_5fwrap',['altcp_tls_wrap',['../group__altcp__tls.html#gab874adb7f87984c0520bd032c2108c47',1,'altcp_tls.h']]],
+  ['altcp_5fwrite',['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',['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',['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',['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',['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',['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',['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',['autoip_tmr',['../autoip_8c.html#a746fc1d7db1bf1617afae166c9d92c2d',1,'autoip_tmr(void):&#160;autoip.c'],['../autoip_8h.html#a746fc1d7db1bf1617afae166c9d92c2d',1,'autoip_tmr(void):&#160;autoip.c']]]
+];
diff --git a/doc/doxygen/output/html/search/functions_1.html b/doc/doxygen/output/html/search/functions_1.html
new file mode 100644
index 0000000..b343e2d
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_1.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/functions_1.js b/doc/doxygen/output/html/search/functions_1.js
new file mode 100644
index 0000000..673c6a0
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_1.js
@@ -0,0 +1,11 @@
+var searchData=
+[
+  ['ble_5faddr_5fto_5feui64',['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']]],
+  ['bridgeif_5fadd_5fport',['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',['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',['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']]],
+  ['bridgeif_5ffdb_5finit',['bridgeif_fdb_init',['../group__bridgeif__fdb.html#gaf7935226ee7f99f964bf0135b6cb9ca0',1,'bridgeif_fdb_init(u16_t max_fdb_entries):&#160;bridgeif_fdb.c'],['../group__bridgeif__fdb.html#gaf7935226ee7f99f964bf0135b6cb9ca0',1,'bridgeif_fdb_init(u16_t max_fdb_entries):&#160;bridgeif_fdb.c']]],
+  ['bridgeif_5ffdb_5fremove',['bridgeif_fdb_remove',['../group__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8',1,'bridgeif_fdb_remove(struct netif *bridgeif, const struct eth_addr *addr):&#160;bridgeif.c'],['../group__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8',1,'bridgeif_fdb_remove(struct netif *bridgeif, const struct eth_addr *addr):&#160;bridgeif.c']]],
+  ['bridgeif_5ffdb_5fupdate_5fsrc',['bridgeif_fdb_update_src',['../group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39',1,'bridgeif_fdb_update_src(void *fdb_ptr, struct eth_addr *src_addr, u8_t port_idx):&#160;bridgeif_fdb.c'],['../group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39',1,'bridgeif_fdb_update_src(void *fdb_ptr, struct eth_addr *src_addr, u8_t port_idx):&#160;bridgeif_fdb.c']]],
+  ['bridgeif_5finit',['bridgeif_init',['../group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c',1,'bridgeif_init(struct netif *netif):&#160;bridgeif.c'],['../group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c',1,'bridgeif_init(struct netif *netif):&#160;bridgeif.c']]]
+];
diff --git a/doc/doxygen/output/html/search/functions_2.html b/doc/doxygen/output/html/search/functions_2.html
new file mode 100644
index 0000000..ecce2f3
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_2.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/functions_2.js b/doc/doxygen/output/html/search/functions_2.js
new file mode 100644
index 0000000..585d49d
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_2.js
@@ -0,0 +1,29 @@
+var searchData=
+[
+  ['dhcp6_5fcleanup',['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_5fdisable',['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_5fenable_5fstateful',['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',['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_5fnd6_5fra_5ftrigger',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['dns_getserver',['../group__dns.html#gad02111a6b26b93f1c3580d5f41a59af3',1,'dns_getserver(u8_t numdns):&#160;dns.c'],['../group__dns.html#gad02111a6b26b93f1c3580d5f41a59af3',1,'dns_getserver(u8_t numdns):&#160;dns.c']]],
+  ['dns_5finit',['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',['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',['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.html b/doc/doxygen/output/html/search/functions_3.html
new file mode 100644
index 0000000..15f06ab
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_3.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/functions_3.js b/doc/doxygen/output/html/search/functions_3.js
new file mode 100644
index 0000000..628c10e
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_3.js
@@ -0,0 +1,15 @@
+var searchData=
+[
+  ['etharp_5fcleanup_5fnetif',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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']]]
+];
diff --git a/doc/doxygen/output/html/search/functions_4.html b/doc/doxygen/output/html/search/functions_4.html
new file mode 100644
index 0000000..8985ff2
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_4.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/functions_4.js b/doc/doxygen/output/html/search/functions_4.js
new file mode 100644
index 0000000..b8857d7
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_4.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+  ['http_5fset_5fcgi_5fhandlers',['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',['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',['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',['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',['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',['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',['httpd_post_begin',['../group__httpd.html#ga6cb33693ee8f0c054be82a968ceff582',1,'httpd.h']]],
+  ['httpd_5fpost_5fdata_5frecved',['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',['httpd_post_finished',['../group__httpd.html#ga477473f7ead250fec71f1f8b9926fec5',1,'httpd.h']]],
+  ['httpd_5fpost_5freceive_5fdata',['httpd_post_receive_data',['../group__httpd.html#ga461409c8813c2a82ba63fde987c0e537',1,'httpd.h']]]
+];
diff --git a/doc/doxygen/output/html/search/functions_5.html b/doc/doxygen/output/html/search/functions_5.html
new file mode 100644
index 0000000..0314918
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_5.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/functions_5.js b/doc/doxygen/output/html/search/functions_5.js
new file mode 100644
index 0000000..14c2fb0
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_5.js
@@ -0,0 +1,60 @@
+var searchData=
+[
+  ['icmp6_5fdest_5funreach',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['igmp_lookfor_group',['../igmp_8c.html#a8228ddd10aa3f2518b16815d82d73448',1,'igmp_lookfor_group(struct netif *ifp, const ip4_addr_t *addr):&#160;igmp.c'],['../igmp_8h.html#a8228ddd10aa3f2518b16815d82d73448',1,'igmp_lookfor_group(struct netif *ifp, const ip4_addr_t *addr):&#160;igmp.c']]],
+  ['igmp_5freport_5fgroups',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['ip4_reass',['../ip4__frag_8c.html#a7debaa6366c0db4270d4f03219c75c05',1,'ip4_reass(struct pbuf *p):&#160;ip4_frag.c'],['../ip4__frag_8h.html#a7debaa6366c0db4270d4f03219c75c05',1,'ip4_reass(struct pbuf *p):&#160;ip4_frag.c']]],
+  ['ip4_5froute',['ip4_route',['../ip4_8c.html#ac659f675356cfc1d4d13884946347e47',1,'ip4_route(const ip4_addr_t *dest):&#160;ip4.c'],['../ip4_8h.html#ac659f675356cfc1d4d13884946347e47',1,'ip4_route(const ip4_addr_t *dest):&#160;ip4.c']]],
+  ['ip4_5froute_5fsrc',['ip4_route_src',['../ip4_8c.html#ab615a9ca8fdd99e697f52506fc440fba',1,'ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest):&#160;ip4.c'],['../ip4_8h.html#ab615a9ca8fdd99e697f52506fc440fba',1,'ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest):&#160;ip4.c']]],
+  ['ip4_5fset_5fdefault_5fmulticast_5fnetif',['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',['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',['ip4addr_ntoa',['../ip4__addr_8c.html#a28620fdd443c5c98d15e5890cbd9059c',1,'ip4addr_ntoa(const ip4_addr_t *addr):&#160;ip4_addr.c'],['../ip4__addr_8h.html#a28620fdd443c5c98d15e5890cbd9059c',1,'ip4addr_ntoa(const ip4_addr_t *addr):&#160;ip4_addr.c']]],
+  ['ip4addr_5fntoa_5fr',['ip4addr_ntoa_r',['../ip4__addr_8c.html#a3825d5b4786c207af971ceb287f101fd',1,'ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen):&#160;ip4_addr.c'],['../ip4__addr_8h.html#a3825d5b4786c207af971ceb287f101fd',1,'ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen):&#160;ip4_addr.c']]],
+  ['ip6_5fchksum_5fpseudo',['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',['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',['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',['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',['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',['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',['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',['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',['ip6_reass',['../ip6__frag_8c.html#adbd666d01adcbbbc5966938f02025b7c',1,'ip6_reass(struct pbuf *p):&#160;ip6_frag.c'],['../ip6__frag_8h.html#adbd666d01adcbbbc5966938f02025b7c',1,'ip6_reass(struct pbuf *p):&#160;ip6_frag.c']]],
+  ['ip6_5froute',['ip6_route',['../ip6_8c.html#a1153bd9e8c45847282105ab6379e6e70',1,'ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest):&#160;ip6.c'],['../ip6_8h.html#a1153bd9e8c45847282105ab6379e6e70',1,'ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest):&#160;ip6.c']]],
+  ['ip6_5fselect_5fsource_5faddress',['ip6_select_source_address',['../group__ip6.html#ga540ad82e2af4c4709f1852e63c36706a',1,'ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest):&#160;ip6.c'],['../group__ip6.html#ga540ad82e2af4c4709f1852e63c36706a',1,'ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest):&#160;ip6.c']]],
+  ['ip6addr_5faton',['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',['ip6addr_ntoa',['../ip6__addr_8c.html#adba4443e6629583d48e1d1c7c21a977e',1,'ip6addr_ntoa(const ip6_addr_t *addr):&#160;ip6_addr.c'],['../ip6__addr_8h.html#adba4443e6629583d48e1d1c7c21a977e',1,'ip6addr_ntoa(const ip6_addr_t *addr):&#160;ip6_addr.c']]],
+  ['ip6addr_5fntoa_5fr',['ip6addr_ntoa_r',['../ip6__addr_8c.html#a64d442f35f34c43121bf91cfea2e77a2',1,'ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen):&#160;ip6_addr.c'],['../ip6__addr_8h.html#a64d442f35f34c43121bf91cfea2e77a2',1,'ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen):&#160;ip6_addr.c']]],
+  ['ip_5finput',['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',['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',['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',['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',['ipaddr_ntoa',['../group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1',1,'ipaddr_ntoa(const ip_addr_t *addr):&#160;ip.c'],['../group__ipaddr.html#gace12d28aef35bb15962e8563aea571b1',1,'ipaddr_ntoa(const ip_addr_t *addr):&#160;ip.c']]],
+  ['ipaddr_5fntoa_5fr',['ipaddr_ntoa_r',['../group__ipaddr.html#ga3684dabc0cae597ffb5b51d41f1d886f',1,'ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen):&#160;ip.c'],['../group__ipaddr.html#ga3684dabc0cae597ffb5b51d41f1d886f',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_6.html b/doc/doxygen/output/html/search/functions_6.html
new file mode 100644
index 0000000..c506123
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_6.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/functions_6.js b/doc/doxygen/output/html/search/functions_6.js
new file mode 100644
index 0000000..e7fc6ca
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_6.js
@@ -0,0 +1,49 @@
+var searchData=
+[
+  ['lowpan6_5fcalc_5fcrc',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['lwip_gethostbyname',['../netdb_8c.html#a8adc6d35c068a073369edde71c678cbc',1,'lwip_gethostbyname(const char *name):&#160;netdb.c'],['../lwip_2netdb_8h.html#a8adc6d35c068a073369edde71c678cbc',1,'lwip_gethostbyname(const char *name):&#160;netdb.c']]],
+  ['lwip_5fgethostbyname_5fr',['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',['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',['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',['lwip_if_indextoname',['../group__if__api.html#gac68ad9ef70eb869525e0a1cc818f056b',1,'lwip_if_indextoname(unsigned int ifindex, char *ifname):&#160;if_api.c'],['../group__if__api.html#gac68ad9ef70eb869525e0a1cc818f056b',1,'lwip_if_indextoname(unsigned int ifindex, char *ifname):&#160;if_api.c']]],
+  ['lwip_5fif_5fnametoindex',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['lwip_strnstr',['../group__sys__nonstandard.html#gaeece028198cdaea2f0d2f1d691752c02',1,'lwip_strnstr(const char *buffer, const char *token, size_t n):&#160;def.c'],['../group__sys__nonstandard.html#gaeece028198cdaea2f0d2f1d691752c02',1,'lwip_strnstr(const char *buffer, const char *token, size_t n):&#160;def.c']]],
+  ['lwiperf_5fabort',['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',['lwiperf_start_tcp_client',['../group__iperf.html#gad8317f52289d8bb12a14627cd177a565',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#gad8317f52289d8bb12a14627cd177a565',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',['lwiperf_start_tcp_client_default',['../group__iperf.html#ga85a487cf8ecbd0999382c9bff375d0da',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#ga85a487cf8ecbd0999382c9bff375d0da',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',['lwiperf_start_tcp_server',['../group__iperf.html#gad97bf77057e7f96d6d8def812deea202',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#gad97bf77057e7f96d6d8def812deea202',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',['lwiperf_start_tcp_server_default',['../group__iperf.html#gae1f30a02b86c4dd3d47810cd493baf26',1,'lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#gae1f30a02b86c4dd3d47810cd493baf26',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_7.html b/doc/doxygen/output/html/search/functions_7.html
new file mode 100644
index 0000000..83a7b84
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_7.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/functions_7.js b/doc/doxygen/output/html/search/functions_7.js
new file mode 100644
index 0000000..80cf5fc
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_7.js
@@ -0,0 +1,47 @@
+var searchData=
+[
+  ['mdns_5fcompress_5fdomain',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['mem_calloc',['../mem_8c.html#ab0bdc525971701883f2065e7fb257a24',1,'mem_calloc(mem_size_t count, mem_size_t size):&#160;mem.c'],['../mem_8h.html#ab0bdc525971701883f2065e7fb257a24',1,'mem_calloc(mem_size_t count, mem_size_t size):&#160;mem.c']]],
+  ['mem_5ffree',['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',['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',['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',['mem_malloc',['../mem_8c.html#af418ade27d91d41e6143dba2cc246b0f',1,'mem_malloc(mem_size_t size_in):&#160;mem.c'],['../mem_8h.html#a932aa40d85b14cb7331625e012d12335',1,'mem_malloc(mem_size_t size):&#160;mem.c']]],
+  ['mem_5ftrim',['mem_trim',['../mem_8c.html#a7e6b7f11bb50bead9b35515d9a517124',1,'mem_trim(void *rmem, mem_size_t new_size):&#160;mem.c'],['../mem_8h.html#a5e39a108c44d8a72df0b30a117cb62e4',1,'mem_trim(void *mem, mem_size_t size):&#160;mem.c']]],
+  ['memp_5ffree',['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',['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',['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',['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',['memp_malloc',['../memp_8c.html#a2b00593d086313c267b54a976bf67aa5',1,'memp_malloc(memp_t type):&#160;memp.c'],['../memp_8h.html#a2b00593d086313c267b54a976bf67aa5',1,'memp_malloc(memp_t type):&#160;memp.c']]],
+  ['memp_5fmalloc_5fpool',['memp_malloc_pool',['../memp_8c.html#a348c83ee972f1edf7296a1cdf1d75f22',1,'memp_malloc_pool(const struct memp_desc *desc):&#160;memp.c'],['../memp__priv_8h.html#a348c83ee972f1edf7296a1cdf1d75f22',1,'memp_malloc_pool(const struct memp_desc *desc):&#160;memp.c']]],
+  ['mld6_5finput',['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',['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',['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',['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',['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',['mld6_lookfor_group',['../mld6_8c.html#ad2fbba6bc543dbf994961656d7431eb5',1,'mld6_lookfor_group(struct netif *ifp, const ip6_addr_t *addr):&#160;mld6.c'],['../mld6_8h.html#ad2fbba6bc543dbf994961656d7431eb5',1,'mld6_lookfor_group(struct netif *ifp, const ip6_addr_t *addr):&#160;mld6.c']]],
+  ['mld6_5freport_5fgroups',['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',['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',['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',['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',['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',['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',['mqtt_client_new',['../group__mqtt.html#gae7e19e236eb6122c8c39e93db6f5f53f',1,'mqtt_client_new(void):&#160;mqtt.c'],['../group__mqtt.html#gae7e19e236eb6122c8c39e93db6f5f53f',1,'mqtt_client_new(void):&#160;mqtt.c']]],
+  ['mqtt_5fdisconnect',['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',['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',['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',['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_8.html b/doc/doxygen/output/html/search/functions_8.html
new file mode 100644
index 0000000..b55f0e6
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_8.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/functions_8.js b/doc/doxygen/output/html/search/functions_8.js
new file mode 100644
index 0000000..b2af023
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_8.js
@@ -0,0 +1,90 @@
+var searchData=
+[
+  ['nd6_5fadjust_5fmld_5fmembership',['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',['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',['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',['nd6_find_route',['../nd6_8c.html#ac5ce11eaecfb486c322641427f47cffe',1,'nd6_find_route(const ip6_addr_t *ip6addr):&#160;nd6.c'],['../nd6_8h.html#ac5ce11eaecfb486c322641427f47cffe',1,'nd6_find_route(const ip6_addr_t *ip6addr):&#160;nd6.c']]],
+  ['nd6_5fget_5fdestination_5fmtu',['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',['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',['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',['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',['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',['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',['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',['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',['netbuf_alloc',['../group__netbuf.html#ga0b831b80d3aa64938abdbfb6d89eaac0',1,'netbuf_alloc(struct netbuf *buf, u16_t size):&#160;netbuf.c'],['../group__netbuf.html#ga0b831b80d3aa64938abdbfb6d89eaac0',1,'netbuf_alloc(struct netbuf *buf, u16_t size):&#160;netbuf.c']]],
+  ['netbuf_5fchain',['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',['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',['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',['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',['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',['netbuf_new',['../group__netbuf.html#gaaba704cd963e35e71145de9f5112991d',1,'netbuf_new(void):&#160;netbuf.c'],['../group__netbuf.html#gaaba704cd963e35e71145de9f5112991d',1,'netbuf_new(void):&#160;netbuf.c']]],
+  ['netbuf_5fnext',['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',['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',['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',['netconn_alloc',['../api__msg_8c.html#a919865fa64270a3e4cb719ddff2fead9',1,'netconn_alloc(enum netconn_type t, netconn_callback callback):&#160;api_msg.c'],['../api__msg_8h.html#a919865fa64270a3e4cb719ddff2fead9',1,'netconn_alloc(enum netconn_type t, netconn_callback callback):&#160;api_msg.c']]],
+  ['netconn_5fbind',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['netconn_new_with_proto_and_callback',['../api__lib_8c.html#ad0a0434e5ff08bb350740cb840e2aca8',1,'netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback):&#160;api_lib.c'],['../api_8h.html#ad0a0434e5ff08bb350740cb840e2aca8',1,'netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback):&#160;api_lib.c']]],
+  ['netconn_5fprepare_5fdelete',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['netif_add',['../group__netif.html#gade5498543e74067f28cc6bef0209e3be',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#gade5498543e74067f28cc6bef0209e3be',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',['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',['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',['netif_add_noaddr',['../group__netif.html#gac20150ac754ff1f88afeaa33be3552a4',1,'netif_add_noaddr(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input):&#160;netif.c'],['../group__netif.html#gac20150ac754ff1f88afeaa33be3552a4',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',['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',['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',['netif_find',['../group__netif.html#ga69c93a139e8a1f6ef4e3d076a2897def',1,'netif_find(const char *name):&#160;netif.c'],['../group__netif.html#ga69c93a139e8a1f6ef4e3d076a2897def',1,'netif_find(const char *name):&#160;netif.c']]],
+  ['netif_5fget_5fby_5findex',['netif_get_by_index',['../group__netif.html#gae4df885347c800a5486d3bf25981300e',1,'netif_get_by_index(u8_t idx):&#160;netif.c'],['../group__netif.html#gae4df885347c800a5486d3bf25981300e',1,'netif_get_by_index(u8_t idx):&#160;netif.c']]],
+  ['netif_5fget_5fip6_5faddr_5fmatch',['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',['netif_index_to_name',['../group__netif.html#ga3ff104d083914e87a7805a0b90a85755',1,'netif_index_to_name(u8_t idx, char *name):&#160;netif.c'],['../group__netif.html#ga3ff104d083914e87a7805a0b90a85755',1,'netif_index_to_name(u8_t idx, char *name):&#160;netif.c']]],
+  ['netif_5finput',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['netifapi_netif_index_to_name',['../group__netifapi__netif.html#gab7914d77d0a89fd6c31048feb0bdafb6',1,'netifapi.c']]],
+  ['netifapi_5fnetif_5fname_5fto_5findex',['netifapi_netif_name_to_index',['../group__netifapi__netif.html#gad4a821182d01eafa4ca258f958fcb089',1,'netifapi.c']]],
+  ['netifapi_5fnetif_5fset_5faddr',['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_9.html b/doc/doxygen/output/html/search/functions_9.html
new file mode 100644
index 0000000..c73f07b
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_9.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/functions_9.js b/doc/doxygen/output/html/search/functions_9.js
new file mode 100644
index 0000000..ba6e7ff
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_9.js
@@ -0,0 +1,34 @@
+var searchData=
+[
+  ['pbuf_5fadd_5fheader',['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',['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',['pbuf_alloc',['../group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47',1,'pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type):&#160;pbuf.c'],['../group__pbuf.html#gacfcb0a2af918658ba0afe36499c65f47',1,'pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type):&#160;pbuf.c']]],
+  ['pbuf_5falloc_5freference',['pbuf_alloc_reference',['../group__pbuf.html#ga4caa46c6d560d9d0da2be845bc9c2fab',1,'pbuf_alloc_reference(void *payload, u16_t length, pbuf_type type):&#160;pbuf.c'],['../group__pbuf.html#ga4caa46c6d560d9d0da2be845bc9c2fab',1,'pbuf_alloc_reference(void *payload, u16_t length, pbuf_type type):&#160;pbuf.c']]],
+  ['pbuf_5falloced_5fcustom',['pbuf_alloced_custom',['../group__pbuf.html#ga90fa2bbf6ea4a263ee8f7b77c75683c2',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#ga90fa2bbf6ea4a263ee8f7b77c75683c2',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',['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',['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',['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',['pbuf_clone',['../group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0',1,'pbuf_clone(pbuf_layer layer, pbuf_type type, struct pbuf *p):&#160;pbuf.c'],['../group__pbuf.html#gafdb04fb0f37f0422fd44ec0fcec8ebd0',1,'pbuf_clone(pbuf_layer l, pbuf_type type, struct pbuf *p):&#160;pbuf.c']]],
+  ['pbuf_5fcoalesce',['pbuf_coalesce',['../group__pbuf.html#ga54ac7b116c6f53c704cbf74f35a8b35c',1,'pbuf_coalesce(struct pbuf *p, pbuf_layer layer):&#160;pbuf.c'],['../group__pbuf.html#ga54ac7b116c6f53c704cbf74f35a8b35c',1,'pbuf_coalesce(struct pbuf *p, pbuf_layer layer):&#160;pbuf.c']]],
+  ['pbuf_5fcopy',['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',['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_5fdechain',['pbuf_dechain',['../pbuf_8c.html#abf3d29c4f43986b4cb5eb314d5b9729d',1,'pbuf_dechain(struct pbuf *p):&#160;pbuf.c'],['../pbuf_8h.html#abf3d29c4f43986b4cb5eb314d5b9729d',1,'pbuf_dechain(struct pbuf *p):&#160;pbuf.c']]],
+  ['pbuf_5ffree',['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',['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',['pbuf_free_header',['../pbuf_8c.html#a25a3b8edc783896b03819a966d00845e',1,'pbuf_free_header(struct pbuf *q, u16_t size):&#160;pbuf.c'],['../pbuf_8h.html#a25a3b8edc783896b03819a966d00845e',1,'pbuf_free_header(struct pbuf *q, u16_t size):&#160;pbuf.c']]],
+  ['pbuf_5fget_5fat',['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',['pbuf_get_contiguous',['../group__pbuf.html#gad0357ae0be17b2aacd0c301cdc86fc39',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#gad0357ae0be17b2aacd0c301cdc86fc39',1,'pbuf_get_contiguous(const struct pbuf *p, void *buffer, size_t bufsize, u16_t len, u16_t offset):&#160;pbuf.c']]],
+  ['pbuf_5fheader',['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',['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',['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',['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',['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',['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',['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',['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',['pbuf_skip',['../group__pbuf.html#ga6a961522d81f0327aaf4d4ee6d96c583',1,'pbuf_skip(struct pbuf *in, u16_t in_offset, u16_t *out_offset):&#160;pbuf.c'],['../group__pbuf.html#ga6a961522d81f0327aaf4d4ee6d96c583',1,'pbuf_skip(struct pbuf *in, u16_t in_offset, u16_t *out_offset):&#160;pbuf.c']]],
+  ['pbuf_5fstrstr',['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',['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',['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',['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_a.html b/doc/doxygen/output/html/search/functions_a.html
new file mode 100644
index 0000000..f10ad63
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/functions_a.js b/doc/doxygen/output/html/search/functions_a.js
new file mode 100644
index 0000000..7800d64
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_a.js
@@ -0,0 +1,24 @@
+var searchData=
+[
+  ['raw_5fbind',['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',['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',['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',['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',['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',['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',['raw_new',['../group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f',1,'raw_new(u8_t proto):&#160;raw.c'],['../group__raw__raw.html#ga3217f096ea86728e011f91b249933e8f',1,'raw_new(u8_t proto):&#160;raw.c']]],
+  ['raw_5fnew_5fip_5ftype',['raw_new_ip_type',['../group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11',1,'raw_new_ip_type(u8_t type, u8_t proto):&#160;raw.c'],['../group__raw__raw.html#ga3292b7ed2271ac29983edcef16dcbc11',1,'raw_new_ip_type(u8_t type, u8_t proto):&#160;raw.c']]],
+  ['raw_5frecv',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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_b.html b/doc/doxygen/output/html/search/functions_b.html
new file mode 100644
index 0000000..172ea1b
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_b.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/functions_b.js b/doc/doxygen/output/html/search/functions_b.js
new file mode 100644
index 0000000..3408c5b
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_b.js
@@ -0,0 +1,120 @@
+var searchData=
+[
+  ['slipif_5finit',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['snmp_get_community',['../group__snmp__core.html#gacf277cbca915275190426aeef4cfb103',1,'snmp_get_community(void):&#160;snmp_msg.c'],['../group__snmp__core.html#gacf277cbca915275190426aeef4cfb103',1,'snmp_get_community(void):&#160;snmp_msg.c']]],
+  ['snmp_5fget_5fcommunity_5ftrap',['snmp_get_community_trap',['../group__snmp__traps.html#gafdd3299e145f53cc826cc11a469f8409',1,'snmp_get_community_trap(void):&#160;snmp_msg.c'],['../group__snmp__traps.html#gafdd3299e145f53cc826cc11a469f8409',1,'snmp_get_community_trap(void):&#160;snmp_msg.c']]],
+  ['snmp_5fget_5fcommunity_5fwrite',['snmp_get_community_write',['../group__snmp__core.html#gaba31b6f1816661df5a3b7f2076ee6ec0',1,'snmp_get_community_write(void):&#160;snmp_msg.c'],['../group__snmp__core.html#gaba31b6f1816661df5a3b7f2076ee6ec0',1,'snmp_get_community_write(void):&#160;snmp_msg.c']]],
+  ['snmp_5fget_5fdevice_5fenterprise_5foid',['snmp_get_device_enterprise_oid',['../group__snmp__core.html#ga4dff82dda2553b9554a9f98561852a50',1,'snmp_get_device_enterprise_oid(void):&#160;snmp_core.c'],['../group__snmp__core.html#ga4dff82dda2553b9554a9f98561852a50',1,'snmp_get_device_enterprise_oid(void):&#160;snmp_core.c']]],
+  ['snmp_5finit',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['snmp_mib_tree_resolve_exact',['../snmp__core_8c.html#af42d6d2732a92017a43b83a07609fd1a',1,'snmp_core.c']]],
+  ['snmp_5fnext_5foid_5fcheck',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['sntp_getserver',['../group__sntp.html#ga2a28523cb9f2b5b025a4818bc2c1afc1',1,'sntp_getserver(u8_t idx):&#160;sntp.c'],['../group__sntp.html#ga2a28523cb9f2b5b025a4818bc2c1afc1',1,'sntp_getserver(u8_t idx):&#160;sntp.c']]],
+  ['sntp_5finit',['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',['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',['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',['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',['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',['sys_arch_mbox_fetch',['../group__sys__mbox.html#ga6464cd77cf6799bd8b3d6c840166a2e8',1,'sys.h']]],
+  ['sys_5farch_5fmbox_5ftryfetch',['sys_arch_mbox_tryfetch',['../group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c',1,'sys.h']]],
+  ['sys_5farch_5fsem_5fwait',['sys_arch_sem_wait',['../group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f',1,'sys.h']]],
+  ['sys_5fcheck_5ftimeouts',['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',['sys_init',['../group__sys__misc.html#gaf411a8bc6b7ed4b0af9114e10c959448',1,'sys.h']]],
+  ['sys_5fjiffies',['sys_jiffies',['../sys_8h.html#ac89f307e8b360eaf821b461a4f26753a',1,'sys.h']]],
+  ['sys_5fmbox_5ffree',['sys_mbox_free',['../group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f',1,'sys.h']]],
+  ['sys_5fmbox_5fnew',['sys_mbox_new',['../group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc',1,'sys.h']]],
+  ['sys_5fmbox_5fpost',['sys_mbox_post',['../group__sys__mbox.html#ga9d068386a3c53dd01b8af99c3ef77555',1,'sys.h']]],
+  ['sys_5fmbox_5fset_5finvalid',['sys_mbox_set_invalid',['../group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172',1,'sys.h']]],
+  ['sys_5fmbox_5ftrypost',['sys_mbox_trypost',['../group__sys__mbox.html#gaa36345e48a49d67cbb0878cd4cbd2195',1,'sys.h']]],
+  ['sys_5fmbox_5ftrypost_5ffromisr',['sys_mbox_trypost_fromisr',['../group__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a',1,'sys.h']]],
+  ['sys_5fmbox_5fvalid',['sys_mbox_valid',['../group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d',1,'sys.h']]],
+  ['sys_5fmsleep',['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',['sys_mutex_free',['../group__sys__mutex.html#ga16336ce68b741e98204102ca4bc84dd9',1,'sys.h']]],
+  ['sys_5fmutex_5flock',['sys_mutex_lock',['../group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a',1,'sys.h']]],
+  ['sys_5fmutex_5fnew',['sys_mutex_new',['../group__sys__mutex.html#ga38e7dae1fd88b338eb1cd97f110f3897',1,'sys.h']]],
+  ['sys_5fmutex_5fset_5finvalid',['sys_mutex_set_invalid',['../group__sys__mutex.html#ga3f392725971dc837aa56dd7e45fa7ca8',1,'sys.h']]],
+  ['sys_5fmutex_5funlock',['sys_mutex_unlock',['../group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb',1,'sys.h']]],
+  ['sys_5fmutex_5fvalid',['sys_mutex_valid',['../group__sys__mutex.html#gaebe83ba90a6d9c23cdb3eb5d49562c4a',1,'sys.h']]],
+  ['sys_5fnow',['sys_now',['../group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199',1,'sys.h']]],
+  ['sys_5frestart_5ftimeouts',['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',['sys_sem_free',['../group__sys__sem.html#ga83b781f96c30e915c752065a757da283',1,'sys.h']]],
+  ['sys_5fsem_5fnew',['sys_sem_new',['../group__sys__sem.html#gaf99da9e34a71855285c535183133dfde',1,'sys.h']]],
+  ['sys_5fsem_5fset_5finvalid',['sys_sem_set_invalid',['../group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33',1,'sys.h']]],
+  ['sys_5fsem_5fsignal',['sys_sem_signal',['../group__sys__sem.html#gaaf800273061fcc3f8200fd4e1b9ca875',1,'sys.h']]],
+  ['sys_5fsem_5fvalid',['sys_sem_valid',['../group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4',1,'sys.h']]],
+  ['sys_5fthread_5fnew',['sys_thread_new',['../group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a',1,'sys.h']]],
+  ['sys_5ftimeout',['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',['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',['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',['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_c.html b/doc/doxygen/output/html/search/functions_c.html
new file mode 100644
index 0000000..99492ba
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_c.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/functions_c.js b/doc/doxygen/output/html/search/functions_c.js
new file mode 100644
index 0000000..0c6fb33
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_c.js
@@ -0,0 +1,78 @@
+var searchData=
+[
+  ['tcp_5fabandon',['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',['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',['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',['tcp_alloc',['../tcp_8c.html#a1dd6830a42b3c464b5a72f62ae312d0a',1,'tcp_alloc(u8_t prio):&#160;tcp.c'],['../tcp__priv_8h.html#a1dd6830a42b3c464b5a72f62ae312d0a',1,'tcp_alloc(u8_t prio):&#160;tcp.c']]],
+  ['tcp_5farg',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['tcp_ext_arg_get',['../group__tcp__raw__extargs.html#gaa8ac7a74407cb3e0e01a30314805f990',1,'tcp_ext_arg_get(const struct tcp_pcb *pcb, uint8_t id):&#160;tcp.c'],['../group__tcp__raw__extargs.html#gaa8ac7a74407cb3e0e01a30314805f990',1,'tcp_ext_arg_get(const struct tcp_pcb *pcb, uint8_t id):&#160;tcp.c']]],
+  ['tcp_5fext_5farg_5finvoke_5fcallbacks_5fpassive_5fopen',['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',['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',['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',['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',['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',['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',['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',['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',['tcp_listen_with_backlog',['../group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338',1,'tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog):&#160;tcp.c'],['../group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338',1,'tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog):&#160;tcp.c']]],
+  ['tcp_5flisten_5fwith_5fbacklog_5fand_5ferr',['tcp_listen_with_backlog_and_err',['../group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436',1,'tcp_listen_with_backlog_and_err(struct tcp_pcb *pcb, u8_t backlog, err_t *err):&#160;tcp.c'],['../group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436',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',['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',['tcp_new',['../group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943',1,'tcp_new(void):&#160;tcp.c'],['../group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943',1,'tcp_new(void):&#160;tcp.c']]],
+  ['tcp_5fnew_5fip_5ftype',['tcp_new_ip_type',['../group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937',1,'tcp_new_ip_type(u8_t type):&#160;tcp.c'],['../group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937',1,'tcp_new_ip_type(u8_t type):&#160;tcp.c']]],
+  ['tcp_5fnext_5fiss',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['tcp_seg_copy',['../tcp_8c.html#a569d79451d2570e4ef406775725ef6ef',1,'tcp_seg_copy(struct tcp_seg *seg):&#160;tcp.c'],['../tcp__priv_8h.html#a569d79451d2570e4ef406775725ef6ef',1,'tcp_seg_copy(struct tcp_seg *seg):&#160;tcp.c']]],
+  ['tcp_5fseg_5ffree',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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',['tcpip_callbackmsg_new',['../group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac',1,'tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx):&#160;tcpip.c'],['../group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac',1,'tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx):&#160;tcpip.c']]],
+  ['tcpip_5fcallbackmsg_5ftrycallback',['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',['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',['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',['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',['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',['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',['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',['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',['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',['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']]]
+];
diff --git a/doc/doxygen/output/html/search/functions_d.html b/doc/doxygen/output/html/search/functions_d.html
new file mode 100644
index 0000000..5be9ecc
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/functions_d.js b/doc/doxygen/output/html/search/functions_d.js
new file mode 100644
index 0000000..13fda59
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_d.js
@@ -0,0 +1,18 @@
+var searchData=
+[
+  ['udp_5fbind',['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',['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',['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',['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',['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',['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',['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',['udp_new',['../group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209',1,'udp_new(void):&#160;udp.c'],['../group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209',1,'udp_new(void):&#160;udp.c']]],
+  ['udp_5fnew_5fip_5ftype',['udp_new_ip_type',['../group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88',1,'udp_new_ip_type(u8_t type):&#160;udp.c'],['../group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88',1,'udp_new_ip_type(u8_t type):&#160;udp.c']]],
+  ['udp_5frecv',['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',['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',['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',['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',['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',['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_e.html b/doc/doxygen/output/html/search/functions_e.html
new file mode 100644
index 0000000..e256cb6
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_e.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/functions_e.js b/doc/doxygen/output/html/search/functions_e.js
new file mode 100644
index 0000000..babc6c0
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_e.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['zepif_5finit',['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_0.html b/doc/doxygen/output/html/search/groups_0.html
new file mode 100644
index 0000000..1ede28d
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_0.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_0.js b/doc/doxygen/output/html/search/groups_0.js
new file mode 100644
index 0000000..d15c401
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_0.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['6lowpan_20over_20ble_20_28rfc7668_29',['6LoWPAN over BLE (RFC7668)',['../group__rfc7668if.html',1,'']]],
+  ['6lowpan_20_28rfc4944_29',['6LoWPAN (RFC4944)',['../group__sixlowpan.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_1.html b/doc/doxygen/output/html/search/groups_1.html
new file mode 100644
index 0000000..3c05216
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_1.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_1.js b/doc/doxygen/output/html/search/groups_1.js
new file mode 100644
index 0000000..b3451eb
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_1.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+  ['application_20layered_20tcp_20functions',['Application layered TCP Functions',['../group__altcp.html',1,'']]],
+  ['application_20layered_20tcp_20introduction',['Application layered TCP Introduction',['../group__altcp__api.html',1,'']]],
+  ['apis',['APIs',['../group__api.html',1,'']]],
+  ['applications',['Applications',['../group__apps.html',1,'']]],
+  ['autoip',['AUTOIP',['../group__autoip.html',1,'']]],
+  ['assertion_20handling',['Assertion handling',['../group__lwip__assertions.html',1,'']]],
+  ['arp',['ARP',['../group__lwip__opts__arp.html',1,'']]],
+  ['autoip',['AUTOIP',['../group__lwip__opts__autoip.html',1,'']]],
+  ['autoip',['AUTOIP',['../group__netifapi__autoip.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_10.html b/doc/doxygen/output/html/search/groups_10.html
new file mode 100644
index 0000000..b5d2c6b
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_10.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_10.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_10.js b/doc/doxygen/output/html/search/groups_10.js
new file mode 100644
index 0000000..d45fde9
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_10.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+  ['udp',['UDP',['../group__lwip__opts__udp.html',1,'']]],
+  ['udp_20only',['UDP only',['../group__netconn__udp.html',1,'']]],
+  ['udp',['UDP',['../group__udp__raw.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_11.html b/doc/doxygen/output/html/search/groups_11.html
new file mode 100644
index 0000000..be44d3d
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_11.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_11.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_11.js b/doc/doxygen/output/html/search/groups_11.js
new file mode 100644
index 0000000..f234255
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_11.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['version',['Version',['../group__lwip__version.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_12.html b/doc/doxygen/output/html/search/groups_12.html
new file mode 100644
index 0000000..f425e78
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_12.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_12.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_12.js b/doc/doxygen/output/html/search/groups_12.js
new file mode 100644
index 0000000..b8b708b
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_12.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['zep_20_2d_20zigbee_20encapsulation_20protocol',['ZEP - ZigBee Encapsulation Protocol',['../group__zepif.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_2.html b/doc/doxygen/output/html/search/groups_2.html
new file mode 100644
index 0000000..7191495
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_2.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_2.js b/doc/doxygen/output/html/search/groups_2.js
new file mode 100644
index 0000000..f583148
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_2.js
@@ -0,0 +1,11 @@
+var searchData=
+[
+  ['compiler_2fplatform_20abstraction',['Compiler/platform abstraction',['../group__compiler__abstraction.html',1,'']]],
+  ['callback_2dstyle_20apis',['Callback-style APIs',['../group__lwip__opts__callback.html',1,'']]],
+  ['checksum',['Checksum',['../group__lwip__opts__checksum.html',1,'']]],
+  ['core_20locking_20and_20mpu',['Core locking and MPU',['../group__lwip__opts__lock.html',1,'']]],
+  ['common_20functions',['Common functions',['../group__netconn__common.html',1,'']]],
+  ['client_20data_20handling',['Client data handling',['../group__netif__cd.html',1,'']]],
+  ['core',['Core',['../group__snmp__core.html',1,'']]],
+  ['critical_20sections',['Critical sections',['../group__sys__prot.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_3.html b/doc/doxygen/output/html/search/groups_3.html
new file mode 100644
index 0000000..3af27ea
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_3.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_3.js b/doc/doxygen/output/html/search/groups_3.js
new file mode 100644
index 0000000..cbab017
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_3.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+  ['dhcpv4',['DHCPv4',['../group__dhcp4.html',1,'']]],
+  ['dhcpv6',['DHCPv6',['../group__dhcp6.html',1,'']]],
+  ['dns',['DNS',['../group__dns.html',1,'']]],
+  ['debugging',['Debugging',['../group__lwip__opts__debug.html',1,'']]],
+  ['debug_20messages',['Debug messages',['../group__lwip__opts__debugmsg.html',1,'']]],
+  ['dhcp',['DHCP',['../group__lwip__opts__dhcp.html',1,'']]],
+  ['dhcpv6',['DHCPv6',['../group__lwip__opts__dhcpv6.html',1,'']]],
+  ['dns',['DNS',['../group__lwip__opts__dns.html',1,'']]],
+  ['dhcpv4',['DHCPv4',['../group__netifapi__dhcp4.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_4.html b/doc/doxygen/output/html/search/groups_4.html
new file mode 100644
index 0000000..e7abc74
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_4.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_4.js b/doc/doxygen/output/html/search/groups_4.js
new file mode 100644
index 0000000..6e13660
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_4.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+  ['ethernet',['Ethernet',['../group__ethernet.html',1,'']]],
+  ['error_20codes',['Error codes',['../group__infrastructure__errors.html',1,'']]],
+  ['ext_20arguments',['ext arguments',['../group__tcp__raw__extargs.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_5.html b/doc/doxygen/output/html/search/groups_5.html
new file mode 100644
index 0000000..edc563e
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_5.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_5.js b/doc/doxygen/output/html/search/groups_5.js
new file mode 100644
index 0000000..58b0b0d
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_5.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['fdb_20example_20code',['FDB example code',['../group__bridgeif__fdb.html',1,'']]],
+  ['flags',['Flags',['../group__netif__flags.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_6.html b/doc/doxygen/output/html/search/groups_6.html
new file mode 100644
index 0000000..176b61a
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_6.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_6.js b/doc/doxygen/output/html/search/groups_6.js
new file mode 100644
index 0000000..0a8f1a9
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_6.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+  ['http_20client',['HTTP client',['../group__httpc.html',1,'']]],
+  ['http_20server',['HTTP server',['../group__httpd.html',1,'']]],
+  ['hooks',['Hooks',['../group__lwip__opts__hooks.html',1,'']]],
+  ['heap_20and_20memory_20pools',['Heap and memory pools',['../group__lwip__opts__mem.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_7.html b/doc/doxygen/output/html/search/groups_7.html
new file mode 100644
index 0000000..0b8fa02
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_7.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_7.js b/doc/doxygen/output/html/search/groups_7.js
new file mode 100644
index 0000000..b80fdf4
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_7.js
@@ -0,0 +1,26 @@
+var searchData=
+[
+  ['ieee_20802_2e1d_20bridge',['IEEE 802.1D bridge',['../group__bridgeif.html',1,'']]],
+  ['iana_20assigned_20numbers',['IANA assigned numbers',['../group__iana.html',1,'']]],
+  ['ieee_20assigned_20numbers',['IEEE assigned numbers',['../group__ieee.html',1,'']]],
+  ['interface_20identification_20api',['Interface Identification API',['../group__if__api.html',1,'']]],
+  ['igmp',['IGMP',['../group__igmp.html',1,'']]],
+  ['infrastructure',['Infrastructure',['../group__infrastructure.html',1,'']]],
+  ['ip',['IP',['../group__ip.html',1,'']]],
+  ['ipv4',['IPv4',['../group__ip4.html',1,'']]],
+  ['ipv4_20only',['IPv4 only',['../group__ip4addr.html',1,'']]],
+  ['ipv6',['IPv6',['../group__ip6.html',1,'']]],
+  ['ipv6_20zones',['IPv6 Zones',['../group__ip6__zones.html',1,'']]],
+  ['ipv6_20only',['IPv6 only',['../group__ip6addr.html',1,'']]],
+  ['ip_20address_20handling',['IP address handling',['../group__ipaddr.html',1,'']]],
+  ['iperf_20server',['Iperf server',['../group__iperf.html',1,'']]],
+  ['icmp',['ICMP',['../group__lwip__opts__icmp.html',1,'']]],
+  ['icmp6',['ICMP6',['../group__lwip__opts__icmp6.html',1,'']]],
+  ['igmp',['IGMP',['../group__lwip__opts__igmp.html',1,'']]],
+  ['infrastructure',['Infrastructure',['../group__lwip__opts__infrastructure.html',1,'']]],
+  ['ipv4',['IPv4',['../group__lwip__opts__ipv4.html',1,'']]],
+  ['ipv6',['IPv6',['../group__lwip__opts__ipv6.html',1,'']]],
+  ['internal_20memory_20pools',['Internal memory pools',['../group__lwip__opts__memp.html',1,'']]],
+  ['ipv4_20address_20handling',['IPv4 address handling',['../group__netif__ip4.html',1,'']]],
+  ['ipv6_20address_20handling',['IPv6 address handling',['../group__netif__ip6.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_8.html b/doc/doxygen/output/html/search/groups_8.html
new file mode 100644
index 0000000..5bee592
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_8.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_8.js b/doc/doxygen/output/html/search/groups_8.js
new file mode 100644
index 0000000..e0d2697
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_8.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+  ['lwip_5fdbg_5fmin_5flevel_20and_20lwip_5fdbg_5ftypes_5fon_20values',['LWIP_DBG_MIN_LEVEL and LWIP_DBG_TYPES_ON values',['../group__debugging__levels.html',1,'']]],
+  ['lwip',['lwIP',['../group__lwip.html',1,'']]],
+  ['loopback_20interface',['Loopback interface',['../group__lwip__opts__loop.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_9.html b/doc/doxygen/output/html/search/groups_9.html
new file mode 100644
index 0000000..00d9cb3
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_9.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_9.js b/doc/doxygen/output/html/search/groups_9.js
new file mode 100644
index 0000000..99327d3
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_9.js
@@ -0,0 +1,16 @@
+var searchData=
+[
+  ['mainloop_20mode_20_28_22no_5fsys_22_29',['Mainloop mode (&quot;NO_SYS&quot;)',['../group__lwip__nosys.html',1,'']]],
+  ['memcpy',['memcpy',['../group__lwip__opts__memcpy.html',1,'']]],
+  ['multicast_20listener_20discovery',['Multicast listener discovery',['../group__lwip__opts__mld6.html',1,'']]],
+  ['multicast',['Multicast',['../group__lwip__opts__multicast.html',1,'']]],
+  ['mdns',['MDNS',['../group__mdns.html',1,'']]],
+  ['memory_20pools',['Memory pools',['../group__mempool.html',1,'']]],
+  ['mld6',['MLD6',['../group__mld6.html',1,'']]],
+  ['mqtt_20client',['MQTT client',['../group__mqtt.html',1,'']]],
+  ['mib2_20statistics',['MIB2 statistics',['../group__netif__mib2.html',1,'']]],
+  ['mib2',['MIB2',['../group__snmp__mib2.html',1,'']]],
+  ['mailboxes',['Mailboxes',['../group__sys__mbox.html',1,'']]],
+  ['misc',['Misc',['../group__sys__misc.html',1,'']]],
+  ['mutexes',['Mutexes',['../group__sys__mutex.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_a.html b/doc/doxygen/output/html/search/groups_a.html
new file mode 100644
index 0000000..4949930
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_a.js b/doc/doxygen/output/html/search/groups_a.js
new file mode 100644
index 0000000..b81af57
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_a.js
@@ -0,0 +1,16 @@
+var searchData=
+[
+  ['neighbor_20discovery',['Neighbor discovery',['../group__lwip__opts__nd6.html',1,'']]],
+  ['netconn',['Netconn',['../group__lwip__opts__netconn.html',1,'']]],
+  ['netif',['NETIF',['../group__lwip__opts__netif.html',1,'']]],
+  ['no_5fsys',['NO_SYS',['../group__lwip__opts__nosys.html',1,'']]],
+  ['netbios_20responder',['NETBIOS responder',['../group__netbiosns.html',1,'']]],
+  ['network_20buffers',['Network buffers',['../group__netbuf.html',1,'']]],
+  ['netconn_20api',['Netconn API',['../group__netconn.html',1,'']]],
+  ['netdb_20api',['NETDB API',['../group__netdbapi.html',1,'']]],
+  ['network_20interface_20_28netif_29',['Network interface (NETIF)',['../group__netif.html',1,'']]],
+  ['netif_20api',['NETIF API',['../group__netifapi.html',1,'']]],
+  ['netif_20related',['NETIF related',['../group__netifapi__netif.html',1,'']]],
+  ['netifs',['NETIFs',['../group__netifs.html',1,'']]],
+  ['non_2dstandard_20functions',['Non-standard functions',['../group__sys__nonstandard.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_b.html b/doc/doxygen/output/html/search/groups_b.html
new file mode 100644
index 0000000..cc59f7f
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_b.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_b.js b/doc/doxygen/output/html/search/groups_b.js
new file mode 100644
index 0000000..1df0486
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_b.js
@@ -0,0 +1,15 @@
+var searchData=
+[
+  ['options',['Options',['../group__bridgeif__opts.html',1,'']]],
+  ['options',['Options',['../group__httpd__opts.html',1,'']]],
+  ['options_20_28lwipopts_2eh_29',['Options (lwipopts.h)',['../group__lwip__opts.html',1,'']]],
+  ['os_20mode_20_28tcpip_20thread_29',['OS mode (TCPIP thread)',['../group__lwip__os.html',1,'']]],
+  ['options',['Options',['../group__mdns__opts.html',1,'']]],
+  ['options',['Options',['../group__mqtt__opts.html',1,'']]],
+  ['options',['Options',['../group__netbiosns__opts.html',1,'']]],
+  ['options',['Options',['../group__smtp__opts.html',1,'']]],
+  ['options',['Options',['../group__snmp__opts.html',1,'']]],
+  ['options',['Options',['../group__sntp__opts.html',1,'']]],
+  ['os_20abstraction_20layer',['OS abstraction layer',['../group__sys__os.html',1,'']]],
+  ['options',['Options',['../group__tftp__opts.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_c.html b/doc/doxygen/output/html/search/groups_c.html
new file mode 100644
index 0000000..07a0716
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_c.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_c.js b/doc/doxygen/output/html/search/groups_c.js
new file mode 100644
index 0000000..af3e141
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_c.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+  ['pbuf',['PBUF',['../group__lwip__opts__pbuf.html',1,'']]],
+  ['performance',['Performance',['../group__lwip__opts__perf.html',1,'']]],
+  ['packet_20buffers_20_28pbuf_29',['Packet buffers (PBUF)',['../group__pbuf.html',1,'']]],
+  ['performance_20measurement',['Performance measurement',['../group__perf.html',1,'']]],
+  ['ppp',['PPP',['../group__ppp.html',1,'']]],
+  ['porting_20_28system_20abstraction_20layer_29',['Porting (system abstraction layer)',['../group__sys__layer.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_d.html b/doc/doxygen/output/html/search/groups_d.html
new file mode 100644
index 0000000..1713df4
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_d.js b/doc/doxygen/output/html/search/groups_d.js
new file mode 100644
index 0000000..c44b733
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_d.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['raw',['RAW',['../group__lwip__opts__raw.html',1,'']]],
+  ['raw',['RAW',['../group__raw__raw.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_e.html b/doc/doxygen/output/html/search/groups_e.html
new file mode 100644
index 0000000..459d030
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_e.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_e.js b/doc/doxygen/output/html/search/groups_e.js
new file mode 100644
index 0000000..486ca25
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_e.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+  ['snmp_20mib2_20callbacks',['SNMP MIB2 callbacks',['../group__lwip__opts__mib2.html',1,'']]],
+  ['sockets',['Sockets',['../group__lwip__opts__socket.html',1,'']]],
+  ['statistics',['Statistics',['../group__lwip__opts__stats.html',1,'']]],
+  ['sequential_2dstyle_20apis',['Sequential-style APIs',['../group__sequential__api.html',1,'']]],
+  ['slip',['SLIP',['../group__slipif.html',1,'']]],
+  ['smtp_20client',['SMTP client',['../group__smtp.html',1,'']]],
+  ['snmpv2c_2fv3_20agent',['SNMPv2c/v3 agent',['../group__snmp.html',1,'']]],
+  ['sntp',['SNTP',['../group__sntp.html',1,'']]],
+  ['socket_20api',['Socket API',['../group__socket.html',1,'']]],
+  ['semaphores',['Semaphores',['../group__sys__sem.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_f.html b/doc/doxygen/output/html/search/groups_f.html
new file mode 100644
index 0000000..9689c57
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="groups_f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/groups_f.js b/doc/doxygen/output/html/search/groups_f.js
new file mode 100644
index 0000000..f0e816c
--- /dev/null
+++ b/doc/doxygen/output/html/search/groups_f.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+  ['tls_20layer',['TLS layer',['../group__altcp__tls.html',1,'']]],
+  ['tcp',['TCP',['../group__lwip__opts__tcp.html',1,'']]],
+  ['threading',['Threading',['../group__lwip__opts__thread.html',1,'']]],
+  ['thread_2dsafe_20apis',['Thread-safe APIs',['../group__lwip__opts__threadsafe__apis.html',1,'']]],
+  ['timers',['Timers',['../group__lwip__opts__timers.html',1,'']]],
+  ['tcp_20only',['TCP only',['../group__netconn__tcp.html',1,'']]],
+  ['traps',['Traps',['../group__snmp__traps.html',1,'']]],
+  ['time',['Time',['../group__sys__time.html',1,'']]],
+  ['tcp',['TCP',['../group__tcp__raw.html',1,'']]],
+  ['tftp_20server',['TFTP server',['../group__tftp.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/nomatches.html b/doc/doxygen/output/html/search/nomatches.html
new file mode 100644
index 0000000..b1ded27
--- /dev/null
+++ b/doc/doxygen/output/html/search/nomatches.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/pages_0.html b/doc/doxygen/output/html/search/pages_0.html
new file mode 100644
index 0000000..4955b9e
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_0.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/pages_0.js b/doc/doxygen/output/html/search/pages_0.js
new file mode 100644
index 0000000..d6c1967
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_0.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['changelog',['Changelog',['../changelog.html',1,'']]],
+  ['common_20pitfalls',['Common pitfalls',['../pitfalls.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/pages_1.html b/doc/doxygen/output/html/search/pages_1.html
new file mode 100644
index 0000000..aedb14e
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_1.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/pages_1.js b/doc/doxygen/output/html/search/pages_1.js
new file mode 100644
index 0000000..038da54
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_1.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['deprecated_20list',['Deprecated List',['../deprecated.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/pages_2.html b/doc/doxygen/output/html/search/pages_2.html
new file mode 100644
index 0000000..bd91593
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_2.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/pages_2.js b/doc/doxygen/output/html/search/pages_2.js
new file mode 100644
index 0000000..92a9f3d
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_2.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['how_20to_20contribute_20to_20lwip',['How to contribute to lwIP',['../contrib.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/pages_3.html b/doc/doxygen/output/html/search/pages_3.html
new file mode 100644
index 0000000..bc0e37f
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_3.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/pages_3.js b/doc/doxygen/output/html/search/pages_3.js
new file mode 100644
index 0000000..2e2afba
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_3.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['multithreading',['Multithreading',['../multithreading.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/pages_4.html b/doc/doxygen/output/html/search/pages_4.html
new file mode 100644
index 0000000..d4c3e8e
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_4.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/pages_4.js b/doc/doxygen/output/html/search/pages_4.js
new file mode 100644
index 0000000..fce55ed
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_4.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['overview',['Overview',['../index.html',1,'']]],
+  ['optimization_20hints',['Optimization hints',['../optimization.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/pages_5.html b/doc/doxygen/output/html/search/pages_5.html
new file mode 100644
index 0000000..af17efe
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_5.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/pages_5.js b/doc/doxygen/output/html/search/pages_5.js
new file mode 100644
index 0000000..9f888bf
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_5.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['reporting_20bugs',['Reporting bugs',['../bugs.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/pages_6.html b/doc/doxygen/output/html/search/pages_6.html
new file mode 100644
index 0000000..52583b3
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_6.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/pages_6.js b/doc/doxygen/output/html/search/pages_6.js
new file mode 100644
index 0000000..53e8a96
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_6.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['system_20initalization',['System initalization',['../sys_init.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/pages_7.html b/doc/doxygen/output/html/search/pages_7.html
new file mode 100644
index 0000000..7d4b8fe
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_7.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/pages_7.js b/doc/doxygen/output/html/search/pages_7.js
new file mode 100644
index 0000000..3d8a2b7
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_7.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['upgrading',['Upgrading',['../upgrading.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/pages_8.html b/doc/doxygen/output/html/search/pages_8.html
new file mode 100644
index 0000000..b704407
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_8.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/pages_8.js b/doc/doxygen/output/html/search/pages_8.js
new file mode 100644
index 0000000..ab360e0
--- /dev/null
+++ b/doc/doxygen/output/html/search/pages_8.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['zero_2dcopy_20rx',['Zero-copy RX',['../zerocopyrx.html',1,'']]]
+];
diff --git a/doc/doxygen/output/html/search/search.css b/doc/doxygen/output/html/search/search.css
new file mode 100644
index 0000000..3cf9df9
--- /dev/null
+++ b/doc/doxygen/output/html/search/search.css
@@ -0,0 +1,271 @@
+/*---------------- Search Box */
+
+#FSearchBox {
+    float: left;
+}
+
+#MSearchBox {
+    white-space : nowrap;
+    float: none;
+    margin-top: 8px;
+    right: 0px;
+    width: 170px;
+    height: 24px;
+    z-index: 102;
+}
+
+#MSearchBox .left
+{
+    display:block;
+    position:absolute;
+    left:10px;
+    width:20px;
+    height:19px;
+    background:url('search_l.png') no-repeat;
+    background-position:right;
+}
+
+#MSearchSelect {
+    display:block;
+    position:absolute;
+    width:20px;
+    height:19px;
+}
+
+.left #MSearchSelect {
+    left:4px;
+}
+
+.right #MSearchSelect {
+    right:5px;
+}
+
+#MSearchField {
+    display:block;
+    position:absolute;
+    height:19px;
+    background:url('search_m.png') repeat-x;
+    border:none;
+    width:115px;
+    margin-left:20px;
+    padding-left:4px;
+    color: #909090;
+    outline: none;
+    font: 9pt Arial, Verdana, sans-serif;
+    -webkit-border-radius: 0px;
+}
+
+#FSearchBox #MSearchField {
+    margin-left:15px;
+}
+
+#MSearchBox .right {
+    display:block;
+    position:absolute;
+    right:10px;
+    top:8px;
+    width:20px;
+    height:19px;
+    background:url('search_r.png') no-repeat;
+    background-position:left;
+}
+
+#MSearchClose {
+    display: none;
+    position: absolute;
+    top: 4px;
+    background : none;
+    border: none;
+    margin: 0px 4px 0px 0px;
+    padding: 0px 0px;
+    outline: none;
+}
+
+.left #MSearchClose {
+    left: 6px;
+}
+
+.right #MSearchClose {
+    right: 2px;
+}
+
+.MSearchBoxActive #MSearchField {
+    color: #000000;
+}
+
+/*---------------- Search filter selection */
+
+#MSearchSelectWindow {
+    display: none;
+    position: absolute;
+    left: 0; top: 0;
+    border: 1px solid #90A5CE;
+    background-color: #F9FAFC;
+    z-index: 10001;
+    padding-top: 4px;
+    padding-bottom: 4px;
+    -moz-border-radius: 4px;
+    -webkit-border-top-left-radius: 4px;
+    -webkit-border-top-right-radius: 4px;
+    -webkit-border-bottom-left-radius: 4px;
+    -webkit-border-bottom-right-radius: 4px;
+    -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+.SelectItem {
+    font: 8pt Arial, Verdana, sans-serif;
+    padding-left:  2px;
+    padding-right: 12px;
+    border: 0px;
+}
+
+span.SelectionMark {
+    margin-right: 4px;
+    font-family: monospace;
+    outline-style: none;
+    text-decoration: none;
+}
+
+a.SelectItem {
+    display: block;
+    outline-style: none;
+    color: #000000; 
+    text-decoration: none;
+    padding-left:   6px;
+    padding-right: 12px;
+}
+
+a.SelectItem:focus,
+a.SelectItem:active {
+    color: #000000; 
+    outline-style: none;
+    text-decoration: none;
+}
+
+a.SelectItem:hover {
+    color: #FFFFFF;
+    background-color: #3D578C;
+    outline-style: none;
+    text-decoration: none;
+    cursor: pointer;
+    display: block;
+}
+
+/*---------------- Search results window */
+
+iframe#MSearchResults {
+    width: 60ex;
+    height: 15em;
+}
+
+#MSearchResultsWindow {
+    display: none;
+    position: absolute;
+    left: 0; top: 0;
+    border: 1px solid #000;
+    background-color: #EEF1F7;
+    z-index:10000;
+}
+
+/* ----------------------------------- */
+
+
+#SRIndex {
+    clear:both; 
+    padding-bottom: 15px;
+}
+
+.SREntry {
+    font-size: 10pt;
+    padding-left: 1ex;
+}
+
+.SRPage .SREntry {
+    font-size: 8pt;
+    padding: 1px 5px;
+}
+
+body.SRPage {
+    margin: 5px 2px;
+}
+
+.SRChildren {
+    padding-left: 3ex; padding-bottom: .5em 
+}
+
+.SRPage .SRChildren {
+    display: none;
+}
+
+.SRSymbol {
+    font-weight: bold; 
+    color: #425E97;
+    font-family: Arial, Verdana, sans-serif;
+    text-decoration: none;
+    outline: none;
+}
+
+a.SRScope {
+    display: block;
+    color: #425E97; 
+    font-family: Arial, Verdana, sans-serif;
+    text-decoration: none;
+    outline: none;
+}
+
+a.SRSymbol:focus, a.SRSymbol:active,
+a.SRScope:focus, a.SRScope:active {
+    text-decoration: underline;
+}
+
+span.SRScope {
+    padding-left: 4px;
+}
+
+.SRPage .SRStatus {
+    padding: 2px 5px;
+    font-size: 8pt;
+    font-style: italic;
+}
+
+.SRResult {
+    display: none;
+}
+
+DIV.searchresults {
+    margin-left: 10px;
+    margin-right: 10px;
+}
+
+/*---------------- External search page results */
+
+.searchresult {
+    background-color: #F0F3F8;
+}
+
+.pages b {
+   color: white;
+   padding: 5px 5px 3px 5px;
+   background-image: url("../tab_a.png");
+   background-repeat: repeat-x;
+   text-shadow: 0 1px 1px #000000;
+}
+
+.pages {
+    line-height: 17px;
+    margin-left: 4px;
+    text-decoration: none;
+}
+
+.hl {
+    font-weight: bold;
+}
+
+#searchresults {
+    margin-bottom: 20px;
+}
+
+.searchpages {
+    margin-top: 10px;
+}
+
diff --git a/doc/doxygen/output/html/search/search.js b/doc/doxygen/output/html/search/search.js
new file mode 100644
index 0000000..dedce3b
--- /dev/null
+++ b/doc/doxygen/output/html/search/search.js
@@ -0,0 +1,791 @@
+function convertToId(search)
+{
+  var result = '';
+  for (i=0;i<search.length;i++)
+  {
+    var c = search.charAt(i);
+    var cn = c.charCodeAt(0);
+    if (c.match(/[a-z0-9\u0080-\uFFFF]/))
+    {
+      result+=c;
+    }
+    else if (cn<16)
+    {
+      result+="_0"+cn.toString(16);
+    }
+    else
+    {
+      result+="_"+cn.toString(16);
+    }
+  }
+  return result;
+}
+
+function getXPos(item)
+{
+  var x = 0;
+  if (item.offsetWidth)
+  {
+    while (item && item!=document.body)
+    {
+      x   += item.offsetLeft;
+      item = item.offsetParent;
+    }
+  }
+  return x;
+}
+
+function getYPos(item)
+{
+  var y = 0;
+  if (item.offsetWidth)
+  {
+     while (item && item!=document.body)
+     {
+       y   += item.offsetTop;
+       item = item.offsetParent;
+     }
+  }
+  return y;
+}
+
+/* A class handling everything associated with the search panel.
+
+   Parameters:
+   name - The name of the global variable that will be
+          storing this instance.  Is needed to be able to set timeouts.
+   resultPath - path to use for external files
+*/
+function SearchBox(name, resultsPath, inFrame, label)
+{
+  if (!name || !resultsPath) {  alert("Missing parameters to SearchBox."); }
+
+  // ---------- Instance variables
+  this.name                  = name;
+  this.resultsPath           = resultsPath;
+  this.keyTimeout            = 0;
+  this.keyTimeoutLength      = 500;
+  this.closeSelectionTimeout = 300;
+  this.lastSearchValue       = "";
+  this.lastResultsPage       = "";
+  this.hideTimeout           = 0;
+  this.searchIndex           = 0;
+  this.searchActive          = false;
+  this.insideFrame           = inFrame;
+  this.searchLabel           = label;
+
+  // ----------- DOM Elements
+
+  this.DOMSearchField = function()
+  {  return document.getElementById("MSearchField");  }
+
+  this.DOMSearchSelect = function()
+  {  return document.getElementById("MSearchSelect");  }
+
+  this.DOMSearchSelectWindow = function()
+  {  return document.getElementById("MSearchSelectWindow");  }
+
+  this.DOMPopupSearchResults = function()
+  {  return document.getElementById("MSearchResults");  }
+
+  this.DOMPopupSearchResultsWindow = function()
+  {  return document.getElementById("MSearchResultsWindow");  }
+
+  this.DOMSearchClose = function()
+  {  return document.getElementById("MSearchClose"); }
+
+  this.DOMSearchBox = function()
+  {  return document.getElementById("MSearchBox");  }
+
+  // ------------ Event Handlers
+
+  // Called when focus is added or removed from the search field.
+  this.OnSearchFieldFocus = function(isActive)
+  {
+    this.Activate(isActive);
+  }
+
+  this.OnSearchSelectShow = function()
+  {
+    var searchSelectWindow = this.DOMSearchSelectWindow();
+    var searchField        = this.DOMSearchSelect();
+
+    if (this.insideFrame)
+    {
+      var left = getXPos(searchField);
+      var top  = getYPos(searchField);
+      left += searchField.offsetWidth + 6;
+      top += searchField.offsetHeight;
+
+      // show search selection popup
+      searchSelectWindow.style.display='block';
+      left -= searchSelectWindow.offsetWidth;
+      searchSelectWindow.style.left =  left + 'px';
+      searchSelectWindow.style.top  =  top  + 'px';
+    }
+    else
+    {
+      var left = getXPos(searchField);
+      var top  = getYPos(searchField);
+      top += searchField.offsetHeight;
+
+      // show search selection popup
+      searchSelectWindow.style.display='block';
+      searchSelectWindow.style.left =  left + 'px';
+      searchSelectWindow.style.top  =  top  + 'px';
+    }
+
+    // stop selection hide timer
+    if (this.hideTimeout)
+    {
+      clearTimeout(this.hideTimeout);
+      this.hideTimeout=0;
+    }
+    return false; // to avoid "image drag" default event
+  }
+
+  this.OnSearchSelectHide = function()
+  {
+    this.hideTimeout = setTimeout(this.name +".CloseSelectionWindow()",
+                                  this.closeSelectionTimeout);
+  }
+
+  // Called when the content of the search field is changed.
+  this.OnSearchFieldChange = function(evt)
+  {
+    if (this.keyTimeout) // kill running timer
+    {
+      clearTimeout(this.keyTimeout);
+      this.keyTimeout = 0;
+    }
+
+    var e  = (evt) ? evt : window.event; // for IE
+    if (e.keyCode==40 || e.keyCode==13)
+    {
+      if (e.shiftKey==1)
+      {
+        this.OnSearchSelectShow();
+        var win=this.DOMSearchSelectWindow();
+        for (i=0;i<win.childNodes.length;i++)
+        {
+          var child = win.childNodes[i]; // get span within a
+          if (child.className=='SelectItem')
+          {
+            child.focus();
+            return;
+          }
+        }
+        return;
+      }
+      else if (window.frames.MSearchResults.searchResults)
+      {
+        var elem = window.frames.MSearchResults.searchResults.NavNext(0);
+        if (elem) elem.focus();
+      }
+    }
+    else if (e.keyCode==27) // Escape out of the search field
+    {
+      this.DOMSearchField().blur();
+      this.DOMPopupSearchResultsWindow().style.display = 'none';
+      this.DOMSearchClose().style.display = 'none';
+      this.lastSearchValue = '';
+      this.Activate(false);
+      return;
+    }
+
+    // strip whitespaces
+    var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+
+    if (searchValue != this.lastSearchValue) // search value has changed
+    {
+      if (searchValue != "") // non-empty search
+      {
+        // set timer for search update
+        this.keyTimeout = setTimeout(this.name + '.Search()',
+                                     this.keyTimeoutLength);
+      }
+      else // empty search field
+      {
+        this.DOMPopupSearchResultsWindow().style.display = 'none';
+        this.DOMSearchClose().style.display = 'none';
+        this.lastSearchValue = '';
+      }
+    }
+  }
+
+  this.SelectItemCount = function(id)
+  {
+    var count=0;
+    var win=this.DOMSearchSelectWindow();
+    for (i=0;i<win.childNodes.length;i++)
+    {
+      var child = win.childNodes[i]; // get span within a
+      if (child.className=='SelectItem')
+      {
+        count++;
+      }
+    }
+    return count;
+  }
+
+  this.SelectItemSet = function(id)
+  {
+    var i,j=0;
+    var win=this.DOMSearchSelectWindow();
+    for (i=0;i<win.childNodes.length;i++)
+    {
+      var child = win.childNodes[i]; // get span within a
+      if (child.className=='SelectItem')
+      {
+        var node = child.firstChild;
+        if (j==id)
+        {
+          node.innerHTML='&#8226;';
+        }
+        else
+        {
+          node.innerHTML='&#160;';
+        }
+        j++;
+      }
+    }
+  }
+
+  // Called when an search filter selection is made.
+  // set item with index id as the active item
+  this.OnSelectItem = function(id)
+  {
+    this.searchIndex = id;
+    this.SelectItemSet(id);
+    var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+    if (searchValue!="" && this.searchActive) // something was found -> do a search
+    {
+      this.Search();
+    }
+  }
+
+  this.OnSearchSelectKey = function(evt)
+  {
+    var e = (evt) ? evt : window.event; // for IE
+    if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down
+    {
+      this.searchIndex++;
+      this.OnSelectItem(this.searchIndex);
+    }
+    else if (e.keyCode==38 && this.searchIndex>0) // Up
+    {
+      this.searchIndex--;
+      this.OnSelectItem(this.searchIndex);
+    }
+    else if (e.keyCode==13 || e.keyCode==27)
+    {
+      this.OnSelectItem(this.searchIndex);
+      this.CloseSelectionWindow();
+      this.DOMSearchField().focus();
+    }
+    return false;
+  }
+
+  // --------- Actions
+
+  // Closes the results window.
+  this.CloseResultsWindow = function()
+  {
+    this.DOMPopupSearchResultsWindow().style.display = 'none';
+    this.DOMSearchClose().style.display = 'none';
+    this.Activate(false);
+  }
+
+  this.CloseSelectionWindow = function()
+  {
+    this.DOMSearchSelectWindow().style.display = 'none';
+  }
+
+  // Performs a search.
+  this.Search = function()
+  {
+    this.keyTimeout = 0;
+
+    // strip leading whitespace
+    var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
+
+    var code = searchValue.toLowerCase().charCodeAt(0);
+    var idxChar = searchValue.substr(0, 1).toLowerCase();
+    if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair
+    {
+      idxChar = searchValue.substr(0, 2);
+    }
+
+    var resultsPage;
+    var resultsPageWithSearch;
+    var hasResultsPage;
+
+    var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);
+    if (idx!=-1)
+    {
+       var hexCode=idx.toString(16);
+       resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
+       resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
+       hasResultsPage = true;
+    }
+    else // nothing available for this search term
+    {
+       resultsPage = this.resultsPath + '/nomatches.html';
+       resultsPageWithSearch = resultsPage;
+       hasResultsPage = false;
+    }
+
+    window.frames.MSearchResults.location = resultsPageWithSearch;
+    var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
+
+    if (domPopupSearchResultsWindow.style.display!='block')
+    {
+       var domSearchBox = this.DOMSearchBox();
+       this.DOMSearchClose().style.display = 'inline';
+       if (this.insideFrame)
+       {
+         var domPopupSearchResults = this.DOMPopupSearchResults();
+         domPopupSearchResultsWindow.style.position = 'relative';
+         domPopupSearchResultsWindow.style.display  = 'block';
+         var width = document.body.clientWidth - 8; // the -8 is for IE :-(
+         domPopupSearchResultsWindow.style.width    = width + 'px';
+         domPopupSearchResults.style.width          = width + 'px';
+       }
+       else
+       {
+         var domPopupSearchResults = this.DOMPopupSearchResults();
+         var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
+         var top  = getYPos(domSearchBox) + 20;  // domSearchBox.offsetHeight + 1;
+         domPopupSearchResultsWindow.style.display = 'block';
+         left -= domPopupSearchResults.offsetWidth;
+         domPopupSearchResultsWindow.style.top     = top  + 'px';
+         domPopupSearchResultsWindow.style.left    = left + 'px';
+       }
+    }
+
+    this.lastSearchValue = searchValue;
+    this.lastResultsPage = resultsPage;
+  }
+
+  // -------- Activation Functions
+
+  // Activates or deactivates the search panel, resetting things to
+  // their default values if necessary.
+  this.Activate = function(isActive)
+  {
+    if (isActive || // open it
+        this.DOMPopupSearchResultsWindow().style.display == 'block'
+       )
+    {
+      this.DOMSearchBox().className = 'MSearchBoxActive';
+
+      var searchField = this.DOMSearchField();
+
+      if (searchField.value == this.searchLabel) // clear "Search" term upon entry
+      {
+        searchField.value = '';
+        this.searchActive = true;
+      }
+    }
+    else if (!isActive) // directly remove the panel
+    {
+      this.DOMSearchBox().className = 'MSearchBoxInactive';
+      this.DOMSearchField().value   = this.searchLabel;
+      this.searchActive             = false;
+      this.lastSearchValue          = ''
+      this.lastResultsPage          = '';
+    }
+  }
+}
+
+// -----------------------------------------------------------------------
+
+// The class that handles everything on the search results page.
+function SearchResults(name)
+{
+    // The number of matches from the last run of <Search()>.
+    this.lastMatchCount = 0;
+    this.lastKey = 0;
+    this.repeatOn = false;
+
+    // Toggles the visibility of the passed element ID.
+    this.FindChildElement = function(id)
+    {
+      var parentElement = document.getElementById(id);
+      var element = parentElement.firstChild;
+
+      while (element && element!=parentElement)
+      {
+        if (element.nodeName == 'DIV' && element.className == 'SRChildren')
+        {
+          return element;
+        }
+
+        if (element.nodeName == 'DIV' && element.hasChildNodes())
+        {
+           element = element.firstChild;
+        }
+        else if (element.nextSibling)
+        {
+           element = element.nextSibling;
+        }
+        else
+        {
+          do
+          {
+            element = element.parentNode;
+          }
+          while (element && element!=parentElement && !element.nextSibling);
+
+          if (element && element!=parentElement)
+          {
+            element = element.nextSibling;
+          }
+        }
+      }
+    }
+
+    this.Toggle = function(id)
+    {
+      var element = this.FindChildElement(id);
+      if (element)
+      {
+        if (element.style.display == 'block')
+        {
+          element.style.display = 'none';
+        }
+        else
+        {
+          element.style.display = 'block';
+        }
+      }
+    }
+
+    // Searches for the passed string.  If there is no parameter,
+    // it takes it from the URL query.
+    //
+    // Always returns true, since other documents may try to call it
+    // and that may or may not be possible.
+    this.Search = function(search)
+    {
+      if (!search) // get search word from URL
+      {
+        search = window.location.search;
+        search = search.substring(1);  // Remove the leading '?'
+        search = unescape(search);
+      }
+
+      search = search.replace(/^ +/, ""); // strip leading spaces
+      search = search.replace(/ +$/, ""); // strip trailing spaces
+      search = search.toLowerCase();
+      search = convertToId(search);
+
+      var resultRows = document.getElementsByTagName("div");
+      var matches = 0;
+
+      var i = 0;
+      while (i < resultRows.length)
+      {
+        var row = resultRows.item(i);
+        if (row.className == "SRResult")
+        {
+          var rowMatchName = row.id.toLowerCase();
+          rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
+
+          if (search.length<=rowMatchName.length &&
+             rowMatchName.substr(0, search.length)==search)
+          {
+            row.style.display = 'block';
+            matches++;
+          }
+          else
+          {
+            row.style.display = 'none';
+          }
+        }
+        i++;
+      }
+      document.getElementById("Searching").style.display='none';
+      if (matches == 0) // no results
+      {
+        document.getElementById("NoMatches").style.display='block';
+      }
+      else // at least one result
+      {
+        document.getElementById("NoMatches").style.display='none';
+      }
+      this.lastMatchCount = matches;
+      return true;
+    }
+
+    // return the first item with index index or higher that is visible
+    this.NavNext = function(index)
+    {
+      var focusItem;
+      while (1)
+      {
+        var focusName = 'Item'+index;
+        focusItem = document.getElementById(focusName);
+        if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+        {
+          break;
+        }
+        else if (!focusItem) // last element
+        {
+          break;
+        }
+        focusItem=null;
+        index++;
+      }
+      return focusItem;
+    }
+
+    this.NavPrev = function(index)
+    {
+      var focusItem;
+      while (1)
+      {
+        var focusName = 'Item'+index;
+        focusItem = document.getElementById(focusName);
+        if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+        {
+          break;
+        }
+        else if (!focusItem) // last element
+        {
+          break;
+        }
+        focusItem=null;
+        index--;
+      }
+      return focusItem;
+    }
+
+    this.ProcessKeys = function(e)
+    {
+      if (e.type == "keydown")
+      {
+        this.repeatOn = false;
+        this.lastKey = e.keyCode;
+      }
+      else if (e.type == "keypress")
+      {
+        if (!this.repeatOn)
+        {
+          if (this.lastKey) this.repeatOn = true;
+          return false; // ignore first keypress after keydown
+        }
+      }
+      else if (e.type == "keyup")
+      {
+        this.lastKey = 0;
+        this.repeatOn = false;
+      }
+      return this.lastKey!=0;
+    }
+
+    this.Nav = function(evt,itemIndex)
+    {
+      var e  = (evt) ? evt : window.event; // for IE
+      if (e.keyCode==13) return true;
+      if (!this.ProcessKeys(e)) return false;
+
+      if (this.lastKey==38) // Up
+      {
+        var newIndex = itemIndex-1;
+        var focusItem = this.NavPrev(newIndex);
+        if (focusItem)
+        {
+          var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
+          if (child && child.style.display == 'block') // children visible
+          {
+            var n=0;
+            var tmpElem;
+            while (1) // search for last child
+            {
+              tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
+              if (tmpElem)
+              {
+                focusItem = tmpElem;
+              }
+              else // found it!
+              {
+                break;
+              }
+              n++;
+            }
+          }
+        }
+        if (focusItem)
+        {
+          focusItem.focus();
+        }
+        else // return focus to search field
+        {
+           parent.document.getElementById("MSearchField").focus();
+        }
+      }
+      else if (this.lastKey==40) // Down
+      {
+        var newIndex = itemIndex+1;
+        var focusItem;
+        var item = document.getElementById('Item'+itemIndex);
+        var elem = this.FindChildElement(item.parentNode.parentNode.id);
+        if (elem && elem.style.display == 'block') // children visible
+        {
+          focusItem = document.getElementById('Item'+itemIndex+'_c0');
+        }
+        if (!focusItem) focusItem = this.NavNext(newIndex);
+        if (focusItem)  focusItem.focus();
+      }
+      else if (this.lastKey==39) // Right
+      {
+        var item = document.getElementById('Item'+itemIndex);
+        var elem = this.FindChildElement(item.parentNode.parentNode.id);
+        if (elem) elem.style.display = 'block';
+      }
+      else if (this.lastKey==37) // Left
+      {
+        var item = document.getElementById('Item'+itemIndex);
+        var elem = this.FindChildElement(item.parentNode.parentNode.id);
+        if (elem) elem.style.display = 'none';
+      }
+      else if (this.lastKey==27) // Escape
+      {
+        parent.searchBox.CloseResultsWindow();
+        parent.document.getElementById("MSearchField").focus();
+      }
+      else if (this.lastKey==13) // Enter
+      {
+        return true;
+      }
+      return false;
+    }
+
+    this.NavChild = function(evt,itemIndex,childIndex)
+    {
+      var e  = (evt) ? evt : window.event; // for IE
+      if (e.keyCode==13) return true;
+      if (!this.ProcessKeys(e)) return false;
+
+      if (this.lastKey==38) // Up
+      {
+        if (childIndex>0)
+        {
+          var newIndex = childIndex-1;
+          document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
+        }
+        else // already at first child, jump to parent
+        {
+          document.getElementById('Item'+itemIndex).focus();
+        }
+      }
+      else if (this.lastKey==40) // Down
+      {
+        var newIndex = childIndex+1;
+        var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
+        if (!elem) // last child, jump to parent next parent
+        {
+          elem = this.NavNext(itemIndex+1);
+        }
+        if (elem)
+        {
+          elem.focus();
+        }
+      }
+      else if (this.lastKey==27) // Escape
+      {
+        parent.searchBox.CloseResultsWindow();
+        parent.document.getElementById("MSearchField").focus();
+      }
+      else if (this.lastKey==13) // Enter
+      {
+        return true;
+      }
+      return false;
+    }
+}
+
+function setKeyActions(elem,action)
+{
+  elem.setAttribute('onkeydown',action);
+  elem.setAttribute('onkeypress',action);
+  elem.setAttribute('onkeyup',action);
+}
+
+function setClassAttr(elem,attr)
+{
+  elem.setAttribute('class',attr);
+  elem.setAttribute('className',attr);
+}
+
+function createResults()
+{
+  var results = document.getElementById("SRResults");
+  for (var e=0; e<searchData.length; e++)
+  {
+    var id = searchData[e][0];
+    var srResult = document.createElement('div');
+    srResult.setAttribute('id','SR_'+id);
+    setClassAttr(srResult,'SRResult');
+    var srEntry = document.createElement('div');
+    setClassAttr(srEntry,'SREntry');
+    var srLink = document.createElement('a');
+    srLink.setAttribute('id','Item'+e);
+    setKeyActions(srLink,'return searchResults.Nav(event,'+e+')');
+    setClassAttr(srLink,'SRSymbol');
+    srLink.innerHTML = searchData[e][1][0];
+    srEntry.appendChild(srLink);
+    if (searchData[e][1].length==2) // single result
+    {
+      srLink.setAttribute('href',searchData[e][1][1][0]);
+      if (searchData[e][1][1][1])
+      {
+       srLink.setAttribute('target','_parent');
+      }
+      var srScope = document.createElement('span');
+      setClassAttr(srScope,'SRScope');
+      srScope.innerHTML = searchData[e][1][1][2];
+      srEntry.appendChild(srScope);
+    }
+    else // multiple results
+    {
+      srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")');
+      var srChildren = document.createElement('div');
+      setClassAttr(srChildren,'SRChildren');
+      for (var c=0; c<searchData[e][1].length-1; c++)
+      {
+        var srChild = document.createElement('a');
+        srChild.setAttribute('id','Item'+e+'_c'+c);
+        setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');
+        setClassAttr(srChild,'SRScope');
+        srChild.setAttribute('href',searchData[e][1][c+1][0]);
+        if (searchData[e][1][c+1][1])
+        {
+         srChild.setAttribute('target','_parent');
+        }
+        srChild.innerHTML = searchData[e][1][c+1][2];
+        srChildren.appendChild(srChild);
+      }
+      srEntry.appendChild(srChildren);
+    }
+    srResult.appendChild(srEntry);
+    results.appendChild(srResult);
+  }
+}
+
+function init_search()
+{
+  var results = document.getElementById("MSearchSelectWindow");
+  for (var key in indexSectionLabels)
+  {
+    var link = document.createElement('a');
+    link.setAttribute('class','SelectItem');
+    link.setAttribute('onclick','searchBox.OnSelectItem('+key+')');
+    link.href='javascript:void(0)';
+    link.innerHTML='<span class="SelectionMark">&#160;</span>'+indexSectionLabels[key];
+    results.appendChild(link);
+  }
+  searchBox.OnSelectItem(0);
+}
+
diff --git a/doc/doxygen/output/html/search/searchdata.js b/doc/doxygen/output/html/search/searchdata.js
new file mode 100644
index 0000000..d1664d7
--- /dev/null
+++ b/doc/doxygen/output/html/search/searchdata.js
@@ -0,0 +1,45 @@
+var indexSectionsWithContent =
+{
+  0: "6_abcdefghijklmnopqrstuvwz",
+  1: "_abdegilmnprstuz",
+  2: "abdehilmnoprstuz",
+  3: "abdehilmnprstuz",
+  4: "_abcdefghijklmnopqrstuvwz",
+  5: "abdehilmnprstu",
+  6: "deilmnprs",
+  7: "ehilmnp",
+  8: "adefhilmnpstuz",
+  9: "6acdefhilmnoprstuvz",
+  10: "cdhmorsuz"
+};
+
+var indexSectionNames =
+{
+  0: "all",
+  1: "classes",
+  2: "files",
+  3: "functions",
+  4: "variables",
+  5: "typedefs",
+  6: "enums",
+  7: "enumvalues",
+  8: "defines",
+  9: "groups",
+  10: "pages"
+};
+
+var indexSectionLabels =
+{
+  0: "All",
+  1: "Data Structures",
+  2: "Files",
+  3: "Functions",
+  4: "Variables",
+  5: "Typedefs",
+  6: "Enumerations",
+  7: "Enumerator",
+  8: "Macros",
+  9: "Modules",
+  10: "Pages"
+};
+
diff --git a/doc/doxygen/output/html/search/typedefs_0.html b/doc/doxygen/output/html/search/typedefs_0.html
new file mode 100644
index 0000000..05722e1
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_0.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/typedefs_0.js b/doc/doxygen/output/html/search/typedefs_0.js
new file mode 100644
index 0000000..4e801d7
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_0.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['altcp_5fallocator_5ft',['altcp_allocator_t',['../group__altcp.html#ga9ddf490e24b1472a96ab2b4cedd171f8',1,'altcp.h']]]
+];
diff --git a/doc/doxygen/output/html/search/typedefs_1.html b/doc/doxygen/output/html/search/typedefs_1.html
new file mode 100644
index 0000000..b77c533
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_1.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/typedefs_1.js b/doc/doxygen/output/html/search/typedefs_1.js
new file mode 100644
index 0000000..bd7eae7
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_1.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['bridgeif_5finitdata_5ft',['bridgeif_initdata_t',['../group__bridgeif.html#gac47f8ce66bc6dad5dd9829467f93a1bb',1,'bridgeif.h']]]
+];
diff --git a/doc/doxygen/output/html/search/typedefs_2.html b/doc/doxygen/output/html/search/typedefs_2.html
new file mode 100644
index 0000000..076311d
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_2.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/typedefs_2.js b/doc/doxygen/output/html/search/typedefs_2.js
new file mode 100644
index 0000000..f713521
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_2.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['dns_5ffound_5fcallback',['dns_found_callback',['../dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae',1,'dns.h']]]
+];
diff --git a/doc/doxygen/output/html/search/typedefs_3.html b/doc/doxygen/output/html/search/typedefs_3.html
new file mode 100644
index 0000000..a4a727f
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_3.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/typedefs_3.js b/doc/doxygen/output/html/search/typedefs_3.js
new file mode 100644
index 0000000..0e3641f
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_3.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['err_5ft',['err_t',['../group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb',1,'err.h']]]
+];
diff --git a/doc/doxygen/output/html/search/typedefs_4.html b/doc/doxygen/output/html/search/typedefs_4.html
new file mode 100644
index 0000000..be033cd
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_4.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/typedefs_4.js b/doc/doxygen/output/html/search/typedefs_4.js
new file mode 100644
index 0000000..21cc781
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_4.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+  ['httpc_5fheaders_5fdone_5ffn',['httpc_headers_done_fn',['../group__httpc.html#ga1e5b62519d6592c89ed3edfabd917472',1,'http_client.h']]],
+  ['httpc_5fresult_5ffn',['httpc_result_fn',['../group__httpc.html#ga0452eb8007dbb5f139ec992e58e560dd',1,'http_client.h']]],
+  ['httpc_5fresult_5ft',['httpc_result_t',['../group__httpc.html#gac6713454283bff8e1187849e8d4bda18',1,'http_client.h']]]
+];
diff --git a/doc/doxygen/output/html/search/typedefs_5.html b/doc/doxygen/output/html/search/typedefs_5.html
new file mode 100644
index 0000000..e10c325
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_5.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/typedefs_5.js b/doc/doxygen/output/html/search/typedefs_5.js
new file mode 100644
index 0000000..87fd03e
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_5.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+  ['ip4_5faddr_5ft',['ip4_addr_t',['../ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e',1,'ip4_addr.h']]],
+  ['ip6_5faddr_5ft',['ip6_addr_t',['../ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762',1,'ip6_addr.h']]],
+  ['ip_5faddr_5ft',['ip_addr_t',['../group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a',1,'ip_addr.h']]]
+];
diff --git a/doc/doxygen/output/html/search/typedefs_6.html b/doc/doxygen/output/html/search/typedefs_6.html
new file mode 100644
index 0000000..4e206e8
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_6.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/typedefs_6.js b/doc/doxygen/output/html/search/typedefs_6.js
new file mode 100644
index 0000000..d744e0f
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_6.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+  ['lwip_5fcyclic_5ftimer_5fhandler',['lwip_cyclic_timer_handler',['../timeouts_8h.html#a985c5d366b62bd179195e093ffcb7ecd',1,'timeouts.h']]],
+  ['lwip_5fthread_5ffn',['lwip_thread_fn',['../sys_8h.html#ae30a77bf6bd69bfcc5f235eaad54f2b9',1,'sys.h']]],
+  ['lwiperf_5freport_5ffn',['lwiperf_report_fn',['../lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd',1,'lwiperf.h']]],
+  ['lwiperf_5fsettings_5ft',['lwiperf_settings_t',['../lwiperf_8c.html#a4a794a0c1a90b889d54b1dacbce923f4',1,'lwiperf.c']]],
+  ['lwiperf_5fstate_5ftcp_5ft',['lwiperf_state_tcp_t',['../lwiperf_8c.html#a06db7abdf1d4864ca2b367d9c89e3e2d',1,'lwiperf.c']]]
+];
diff --git a/doc/doxygen/output/html/search/typedefs_7.html b/doc/doxygen/output/html/search/typedefs_7.html
new file mode 100644
index 0000000..cc182ee
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_7.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/typedefs_7.js b/doc/doxygen/output/html/search/typedefs_7.js
new file mode 100644
index 0000000..59d9346
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_7.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+  ['mdns_5fname_5fresult_5fcb_5ft',['mdns_name_result_cb_t',['../mdns_8h.html#a19f12d7092de6fe90d5843e4ef8d4536',1,'mdns.h']]],
+  ['mqtt_5fconnection_5fcb_5ft',['mqtt_connection_cb_t',['../group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f',1,'mqtt.h']]],
+  ['mqtt_5fincoming_5fdata_5fcb_5ft',['mqtt_incoming_data_cb_t',['../group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81',1,'mqtt.h']]],
+  ['mqtt_5fincoming_5fpublish_5fcb_5ft',['mqtt_incoming_publish_cb_t',['../group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29',1,'mqtt.h']]],
+  ['mqtt_5frequest_5fcb_5ft',['mqtt_request_cb_t',['../group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd',1,'mqtt.h']]]
+];
diff --git a/doc/doxygen/output/html/search/typedefs_8.html b/doc/doxygen/output/html/search/typedefs_8.html
new file mode 100644
index 0000000..9379676
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_8.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/typedefs_8.js b/doc/doxygen/output/html/search/typedefs_8.js
new file mode 100644
index 0000000..00d0d24
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_8.js
@@ -0,0 +1,14 @@
+var searchData=
+[
+  ['netconn_5fcallback',['netconn_callback',['../api_8h.html#a3e130339f00202b3ab714af502163a2d',1,'api.h']]],
+  ['netif_5fext_5fcallback_5ffn',['netif_ext_callback_fn',['../group__netif.html#ga5ee213cea065424c89c66f138c008da1',1,'netif.h']]],
+  ['netif_5figmp_5fmac_5ffilter_5ffn',['netif_igmp_mac_filter_fn',['../netif_8h.html#a71cad3277efe29191eef3348f4bf21f7',1,'netif.h']]],
+  ['netif_5finit_5ffn',['netif_init_fn',['../netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5',1,'netif.h']]],
+  ['netif_5finput_5ffn',['netif_input_fn',['../netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e',1,'netif.h']]],
+  ['netif_5flinkoutput_5ffn',['netif_linkoutput_fn',['../netif_8h.html#ab75e9d808bc1b788bea84213e6a111ed',1,'netif.h']]],
+  ['netif_5fmld_5fmac_5ffilter_5ffn',['netif_mld_mac_filter_fn',['../netif_8h.html#af2ed0716122b65e7feb43e0dd99ae468',1,'netif.h']]],
+  ['netif_5fnsc_5freason_5ft',['netif_nsc_reason_t',['../group__netif.html#gab2b9387389513a02027c62e246723808',1,'netif.h']]],
+  ['netif_5foutput_5ffn',['netif_output_fn',['../netif_8h.html#a7b4893aa2ed8c606a0cd7aa932fe5067',1,'netif.h']]],
+  ['netif_5foutput_5fip6_5ffn',['netif_output_ip6_fn',['../netif_8h.html#a343a5b14136a51957d552527384674b3',1,'netif.h']]],
+  ['netif_5fstatus_5fcallback_5ffn',['netif_status_callback_fn',['../netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436',1,'netif.h']]]
+];
diff --git a/doc/doxygen/output/html/search/typedefs_9.html b/doc/doxygen/output/html/search/typedefs_9.html
new file mode 100644
index 0000000..6f2b9ea
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_9.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/typedefs_9.js b/doc/doxygen/output/html/search/typedefs_9.js
new file mode 100644
index 0000000..29f6dd6
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_9.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['pbuf_5ffree_5fcustom_5ffn',['pbuf_free_custom_fn',['../pbuf_8h.html#a6d285ce1d910f25e511c8c38532a1dce',1,'pbuf.h']]]
+];
diff --git a/doc/doxygen/output/html/search/typedefs_a.html b/doc/doxygen/output/html/search/typedefs_a.html
new file mode 100644
index 0000000..b897e1c
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/typedefs_a.js b/doc/doxygen/output/html/search/typedefs_a.js
new file mode 100644
index 0000000..c1b2be9
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_a.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['raw_5finput_5fstate_5ft',['raw_input_state_t',['../raw__priv_8h.html#aebbdbaee89c38ad9c007a1d1a336e687',1,'raw_priv.h']]],
+  ['raw_5frecv_5ffn',['raw_recv_fn',['../raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd',1,'raw.h']]]
+];
diff --git a/doc/doxygen/output/html/search/typedefs_b.html b/doc/doxygen/output/html/search/typedefs_b.html
new file mode 100644
index 0000000..23bfdac
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_b.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/typedefs_b.js b/doc/doxygen/output/html/search/typedefs_b.js
new file mode 100644
index 0000000..0382cc8
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_b.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['service_5fget_5ftxt_5ffn_5ft',['service_get_txt_fn_t',['../mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83',1,'mdns.h']]],
+  ['sys_5ftimeout_5fhandler',['sys_timeout_handler',['../timeouts_8h.html#a2ab5bb8173f492563f70a519011b0ac1',1,'timeouts.h']]]
+];
diff --git a/doc/doxygen/output/html/search/typedefs_c.html b/doc/doxygen/output/html/search/typedefs_c.html
new file mode 100644
index 0000000..28f5aad
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_c.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/typedefs_c.js b/doc/doxygen/output/html/search/typedefs_c.js
new file mode 100644
index 0000000..1e1e0f1
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_c.js
@@ -0,0 +1,15 @@
+var searchData=
+[
+  ['tcgihandler',['tCGIHandler',['../group__httpd.html#gafe011a487c5e8d03a6b2f629e14e6b5c',1,'httpd.h']]],
+  ['tcp_5faccept_5ffn',['tcp_accept_fn',['../tcp_8h.html#a00517abce6856d6c82f0efebdafb734d',1,'tcp.h']]],
+  ['tcp_5fconnected_5ffn',['tcp_connected_fn',['../tcp_8h.html#a939867106bd492caf2d85852fb7f6ae8',1,'tcp.h']]],
+  ['tcp_5ferr_5ffn',['tcp_err_fn',['../tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55',1,'tcp.h']]],
+  ['tcp_5fextarg_5fcallback_5fpassive_5fopen_5ffn',['tcp_extarg_callback_passive_open_fn',['../tcp_8h.html#aba649c5bdf19d47e39643392b6d88588',1,'tcp.h']]],
+  ['tcp_5fextarg_5fcallback_5fpcb_5fdestroyed_5ffn',['tcp_extarg_callback_pcb_destroyed_fn',['../tcp_8h.html#a20881e537f5be7847d88fe2a0c8fd2cd',1,'tcp.h']]],
+  ['tcp_5fpoll_5ffn',['tcp_poll_fn',['../tcp_8h.html#a66deb97618a9cd9d57fca28c5245e073',1,'tcp.h']]],
+  ['tcp_5frecv_5ffn',['tcp_recv_fn',['../tcp_8h.html#a780cfac08b02c66948ab94ea974202e8',1,'tcp.h']]],
+  ['tcp_5fsent_5ffn',['tcp_sent_fn',['../tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18',1,'tcp.h']]],
+  ['tcpip_5fcallback_5ffn',['tcpip_callback_fn',['../tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d',1,'tcpip.h']]],
+  ['tcpip_5finit_5fdone_5ffn',['tcpip_init_done_fn',['../tcpip_8h.html#a5fe07216c441e27c3028bcac60fa0992',1,'tcpip.h']]],
+  ['tssihandler',['tSSIHandler',['../group__httpd.html#gaf88dacc4f18d299084cab75252001319',1,'httpd.h']]]
+];
diff --git a/doc/doxygen/output/html/search/typedefs_d.html b/doc/doxygen/output/html/search/typedefs_d.html
new file mode 100644
index 0000000..1579482
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
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..fd122a7
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_d.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['udp_5frecv_5ffn',['udp_recv_fn',['../udp_8h.html#af0ec7feb31acdb6e11b928f438c8a64b',1,'udp.h']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_0.html b/doc/doxygen/output/html/search/variables_0.html
new file mode 100644
index 0000000..74ce807
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_0.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_0.js b/doc/doxygen/output/html/search/variables_0.js
new file mode 100644
index 0000000..92b66e2
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_0.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+  ['_5fhoplim',['_hoplim',['../structip6__hdr.html#af9cbfa5fa280a7a982a1c6268fa13a5a',1,'ip6_hdr']]],
+  ['_5fnexth',['_nexth',['../structip6__hdr.html#abe3d612d4570864c922e18ed838292f6',1,'ip6_hdr']]],
+  ['_5fplen',['_plen',['../structip6__hdr.html#a9d225109d601ae8b34bab6ca3528fa94',1,'ip6_hdr']]],
+  ['_5fv_5ftc_5ffl',['_v_tc_fl',['../structip6__hdr.html#ad3b638f503a3f7e7724cf4c7b2c0a0b5',1,'ip6_hdr']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_1.html b/doc/doxygen/output/html/search/variables_1.html
new file mode 100644
index 0000000..84237b6
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_1.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_1.js b/doc/doxygen/output/html/search/variables_1.js
new file mode 100644
index 0000000..0fa3730
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_1.js
@@ -0,0 +1,20 @@
+var searchData=
+[
+  ['acceptmbox',['acceptmbox',['../structnetconn.html#a9b59188f300828d2b5814e27ab27cad0',1,'netconn']]],
+  ['access',['access',['../structsnmp__node__instance.html#a4af17d17a971f1d11a186e6e1fc4411c',1,'snmp_node_instance']]],
+  ['ad',['ad',['../structapi__msg.html#a36dedcbd9ecca67043a8e1d1e715be94',1,'api_msg']]],
+  ['additional',['additional',['../structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce',1,'mdns_outpacket']]],
+  ['addr',['addr',['../structdns__api__msg.html#a217814594564077d21b0f2696280b2a8',1,'dns_api_msg::addr()'],['../structzepif__init.html#a5a9a7ee6e687a7c1ae85b103d39de61d',1,'zepif_init::addr()']]],
+  ['addr_5findex',['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',['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',['alloc',['../structaltcp__allocator__s.html#aaf07ebf181a11d0320381ef46d40e687',1,'altcp_allocator_s']]],
+  ['answer_5fname',['answer_name',['../structnetbios__answer.html#abf746cd54add594216ddc3683c741406',1,'netbios_answer']]],
+  ['answer_5fname_5fflags',['answer_name_flags',['../structnetbios__answer.html#a2729b7249e3d23309624cb19fa0dbfc4',1,'netbios_answer']]],
+  ['answers',['answers',['../structmdns__packet.html#a918feee242cfb3934d9f5c3de1c298e7',1,'mdns_packet::answers()'],['../structmdns__outpacket.html#aad2c24d4d5a935a209966ceace82f9ad',1,'mdns_outpacket::answers()']]],
+  ['answers_5fleft',['answers_left',['../structmdns__packet.html#a56ba495a1458a21982e65d746468849d',1,'mdns_packet']]],
+  ['arg',['arg',['../structaltcp__allocator__s.html#a8d8aa48e9a105e9d25ad4b90d259d0b1',1,'altcp_allocator_s']]],
+  ['asn1_5ftype',['asn1_type',['../structsnmp__node__instance.html#af51206e0912a8402c395dcf3b623f8b9',1,'snmp_node_instance']]],
+  ['auth_5fplain',['auth_plain',['../structsmtp__session.html#a9da4e424e22892fae51987665eca85a9',1,'smtp_session']]],
+  ['auth_5fplain_5flen',['auth_plain_len',['../structsmtp__session.html#a003dfd03ac58252b575a7c965e532461',1,'smtp_session']]],
+  ['authoritative',['authoritative',['../structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035',1,'mdns_outpacket']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_10.html b/doc/doxygen/output/html/search/variables_10.html
new file mode 100644
index 0000000..548ac84
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_10.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_10.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_10.js b/doc/doxygen/output/html/search/variables_10.js
new file mode 100644
index 0000000..64deac0
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_10.js
@@ -0,0 +1,23 @@
+var searchData=
+[
+  ['parse_5foffset',['parse_offset',['../structmdns__packet.html#a4c3c3a28ac113b3ee40d5cf07d851f68',1,'mdns_packet']]],
+  ['pass',['pass',['../structsmtp__session.html#a7a5a3c00378ce076ce70236525afd431',1,'smtp_session']]],
+  ['passive_5fopen',['passive_open',['../structtcp__ext__arg__callbacks.html#a86b5816e8285378813963d09272b050a',1,'tcp_ext_arg_callbacks']]],
+  ['payload',['payload',['../structpbuf.html#a8d32dc3e964369d4eec638fc37fbc460',1,'pbuf::payload()'],['../structpbuf__rom.html#a5cd0dcc590038629644ad775d76230a1',1,'pbuf_rom::payload()']]],
+  ['pbuf',['pbuf',['../structmdns__packet.html#a2ec02a67fd82f0df695e94745eddaf45',1,'mdns_packet::pbuf()'],['../structmdns__outpacket.html#a83d4504736f2bf315fc8b712c6a446e9',1,'mdns_outpacket::pbuf()'],['../structpbuf__custom.html#a100e338f13464e76b46896647b962ed8',1,'pbuf_custom::pbuf()']]],
+  ['pc',['pc',['../structpbuf__custom__ref.html#af5884b6a7031d73406cb9596a51382b7',1,'pbuf_custom_ref']]],
+  ['pcb',['pcb',['../structnetconn.html#a2af6773c9f6ee91e7f462dd8acc07de6',1,'netconn']]],
+  ['pend_5freq_5fqueue',['pend_req_queue',['../structmqtt__client__s.html#a1897eeefe64f9e2d2d953adca858f439',1,'mqtt_client_s']]],
+  ['pending_5ferr',['pending_err',['../structnetconn.html#a2a54e90fa370cf0df46dfd0b97f1cce7',1,'netconn']]],
+  ['period_5fof_5fstatistics',['period_of_statistics',['../structnetbios__answer.html#a31ec9ea28b5801b9bb5f1b240d3412de',1,'netbios_answer']]],
+  ['pkt_5fid',['pkt_id',['../structmqtt__request__t.html#af2dc3cd85cdad25b9b3e1534ecc0cb58',1,'mqtt_request_t']]],
+  ['pkt_5fid_5fseq',['pkt_id_seq',['../structmqtt__client__s.html#ab4100f6e0867c212d5923f10024f2e32',1,'mqtt_client_s']]],
+  ['poll_5ffds',['poll_fds',['../structlwip__select__cb.html#ae39fc1bef3938380d15085e0141639de',1,'lwip_select_cb']]],
+  ['poll_5fnfds',['poll_nfds',['../structlwip__select__cb.html#a39c4980c261380481f79af2b536ebfba',1,'lwip_select_cb']]],
+  ['port',['port',['../structmdns__service.html#abbf317cde8fb7ba8d834ad9746dd780c',1,'mdns_service']]],
+  ['prev',['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',['probes_sent',['../structmdns__host.html#ac8f6e3c6e1251bf73f043e489c840922',1,'mdns_host']]],
+  ['probing_5fstate',['probing_state',['../structmdns__host.html#af9ced31c35de6a281e5b13f01e5aae61',1,'mdns_host']]],
+  ['proto',['proto',['../structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d',1,'mdns_service']]],
+  ['ptr',['ptr',['../structnetvector.html#a523362737ea7764f9aaa73a050a0b983',1,'netvector']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_11.html b/doc/doxygen/output/html/search/variables_11.html
new file mode 100644
index 0000000..d5be914
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_11.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_11.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_11.js b/doc/doxygen/output/html/search/variables_11.js
new file mode 100644
index 0000000..8d63e1c
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_11.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+  ['q',['q',['../structnd6__neighbor__cache__entry.html#a830674446a45eb200d38a45fbdd5c5df',1,'nd6_neighbor_cache_entry']]],
+  ['query_5fname',['query_name',['../structnetbios__answer.html#aa024ce7e0e233c42393f5c3c378d3f9b',1,'netbios_answer']]],
+  ['questions',['questions',['../structmdns__packet.html#a09211e78f7f773c492b5856d31423699',1,'mdns_packet::questions()'],['../structmdns__outpacket.html#a0d402cde040728d361dec8f7d86f504c',1,'mdns_outpacket::questions()']]],
+  ['questions_5fleft',['questions_left',['../structmdns__packet.html#afdb9c14dd0c915119b8adb584381a437',1,'mdns_packet']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_12.html b/doc/doxygen/output/html/search/variables_12.html
new file mode 100644
index 0000000..b62e1ee
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_12.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_12.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_12.js b/doc/doxygen/output/html/search/variables_12.js
new file mode 100644
index 0000000..b9bb42a
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_12.js
@@ -0,0 +1,22 @@
+var searchData=
+[
+  ['r',['r',['../structapi__msg.html#aebd72e07e711e7135294563b82c98cdf',1,'api_msg']]],
+  ['ram_5fheap',['ram_heap',['../mem_8c.html#a6da602f2bbf1d555556f9260b3b8ad5f',1,'mem.c']]],
+  ['rcvevent',['rcvevent',['../structlwip__sock.html#af40d67cbaef4318d26e560988b6e1b3a',1,'lwip_sock']]],
+  ['reachability',['reachability',['../structsntp__server.html#a2e9283bb8f94930fd2a2c3f24fc4b40d',1,'sntp_server']]],
+  ['read',['read',['../structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c',1,'tftp_context']]],
+  ['readset',['readset',['../structlwip__select__cb.html#a8694a2ce0dd5f91be84056982b96978e',1,'lwip_select_cb']]],
+  ['reass_5flist',['reass_list',['../structlowpan6__ieee802154__data.html#a8c33e7a2026e6e93a2085f3d14378d35',1,'lowpan6_ieee802154_data']]],
+  ['recv',['recv',['../structraw__pcb.html#a963b023239ad97c05536046ed7058a10',1,'raw_pcb::recv()'],['../structudp__pcb.html#ac05dee75a3d6666267f7e626c2ec56a8',1,'udp_pcb::recv()']]],
+  ['recv_5farg',['recv_arg',['../structudp__pcb.html#a11e4c40b8868aa40d923756a60598cab',1,'udp_pcb']]],
+  ['recv_5favail',['recv_avail',['../structnetconn.html#a05b15a28b0803bea3729b1da2047541e',1,'netconn']]],
+  ['recv_5fbufsize',['recv_bufsize',['../structnetconn.html#a6febc9717418ddba16f16e988061cfac',1,'netconn']]],
+  ['recv_5funicast',['recv_unicast',['../structmdns__packet.html#a8659b4f582be0df84b6ae91308737377',1,'mdns_packet']]],
+  ['recvmbox',['recvmbox',['../structnetconn.html#a9f2bf6a3865b6a22a8a71ec2f3e770da',1,'netconn']]],
+  ['ref',['ref',['../structpbuf.html#a62fe38eb0cf31027dc1fb9cbe7b55ba7',1,'pbuf']]],
+  ['reference',['reference',['../structsnmp__node__instance.html#a55f53419cd5b369b771153ca2598ebc5',1,'snmp_node_instance']]],
+  ['reference_5flen',['reference_len',['../structsnmp__node__instance.html#ad289957b34b4e55915fa79f37c4d9d54',1,'snmp_node_instance']]],
+  ['release_5finstance',['release_instance',['../structsnmp__node__instance.html#a20a256c54fab19a455ecf6deff76c6de',1,'snmp_node_instance']]],
+  ['remove_5fcallback',['remove_callback',['../structnetif.html#ae06deb532ead2e3009ba4e58aae6ca07',1,'netif']]],
+  ['rs_5fcount',['rs_count',['../structnetif.html#a9c1f9f28bde60aa868bc3296bee7b1b6',1,'netif']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_13.html b/doc/doxygen/output/html/search/variables_13.html
new file mode 100644
index 0000000..15437be
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_13.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_13.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_13.js b/doc/doxygen/output/html/search/variables_13.js
new file mode 100644
index 0000000..b3c40c2
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_13.js
@@ -0,0 +1,33 @@
+var searchData=
+[
+  ['sd',['sd',['../structapi__msg.html#ad5e8bf133bc5ba4c78822af297330ce4',1,'api_msg']]],
+  ['select_5fwaiting',['select_waiting',['../structlwip__sock.html#aadbcf5ec3d50631d8821200163d88d38',1,'lwip_sock']]],
+  ['sem',['sem',['../structdns__api__msg.html#a15e01e675ebc46b5aede42342be445e2',1,'dns_api_msg::sem()'],['../structlwip__select__cb.html#ac9e790cac8b5eae607a8ef95dcc68482',1,'lwip_select_cb::sem()']]],
+  ['sem_5fsignalled',['sem_signalled',['../structlwip__select__cb.html#a1c00f1159e9e8eb7cca02c497605cd99',1,'lwip_select_cb']]],
+  ['send_5ftimeout',['send_timeout',['../structnetconn.html#a44e55724482b8e447134f5ba4f01551a',1,'netconn']]],
+  ['sendevent',['sendevent',['../structlwip__sock.html#a7e282776681ea4b7bd389950a8a64fa8',1,'lwip_sock']]],
+  ['sent_5fnum',['sent_num',['../structautoip.html#a9d3e3bab2f12b7c7283177fbf039fb25',1,'autoip']]],
+  ['sequence_5fnumber',['sequence_number',['../structieee__802154__hdr.html#a870001205f5a3ce45ce0b2f323275869',1,'ieee_802154_hdr']]],
+  ['service',['service',['../structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad',1,'mdns_service']]],
+  ['services',['services',['../structmdns__host.html#a750c31340c22e51375e4dc3e6e94f2ed',1,'mdns_host']]],
+  ['session_5fdata_5fpacket_5fsize',['session_data_packet_size',['../structnetbios__answer.html#abec38f20bb460ddc2d6e8c9b9208608c',1,'netbios_answer']]],
+  ['set_5ftest',['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',['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',['size',['../structmemp__desc.html#a1688d2bdd5a7b77700e1fa627f025ba3',1,'memp_desc']]],
+  ['snmp_5fcommunity',['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',['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',['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',['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',['socket',['../structnetconn.html#ac8e05eb65774665e364a3dcf0f139b36',1,'netconn']]],
+  ['source_5faddr',['source_addr',['../structmdns__packet.html#aaa64cc21495dc6bb76ed9125904dd07a',1,'mdns_packet']]],
+  ['source_5faddress',['source_address',['../structieee__802154__hdr.html#aa96c037381583756e79bc6ecede27937',1,'ieee_802154_hdr']]],
+  ['source_5fpan_5fid',['source_pan_id',['../structieee__802154__hdr.html#ab67fc612a7fd7dcaf46401e4719fa2b2',1,'ieee_802154_hdr']]],
+  ['src',['src',['../structip6__hdr.html#af0df3214134f29827c27e66b2970c6ef',1,'ip6_hdr']]],
+  ['state',['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',['static_data',['../structsmtp__send__request.html#a4d517ae8b29caa4f0b371923379d9ef4',1,'smtp_send_request']]],
+  ['stats',['stats',['../structmemp__desc.html#a05cb67eb408e4736cc0f5e32b5db7500',1,'memp_desc']]],
+  ['status_5fcallback',['status_callback',['../structnetif.html#a1513e81d02557d2a950e965f18b53a45',1,'netif']]],
+  ['subject',['subject',['../structsmtp__session.html#ab8240801e229ee260f3feeaa270520c7',1,'smtp_session']]],
+  ['subject_5flen',['subject_len',['../structsmtp__session.html#aea48a6edd3ede02b26882c7b8d72646c',1,'smtp_session']]],
+  ['sys',['sys',['../structstats__.html#a317123da6c92aa9d2fa40e8060357035',1,'stats_']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_14.html b/doc/doxygen/output/html/search/variables_14.html
new file mode 100644
index 0000000..3745fec
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_14.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_14.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_14.js b/doc/doxygen/output/html/search/variables_14.js
new file mode 100644
index 0000000..7daea01
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_14.js
@@ -0,0 +1,29 @@
+var searchData=
+[
+  ['tab',['tab',['../structmemp__desc.html#a9d6b758ce5c3b47a67a7568d38fb3926',1,'memp_desc']]],
+  ['tcp',['tcp',['../structstats__.html#a32ef1aaa427d62a5c7890de0ac23fe86',1,'stats_']]],
+  ['tcp_5factive_5fpcbs',['tcp_active_pcbs',['../tcp_8c.html#a78c09dbae67ccc06b659d9f1a388f911',1,'tcp_active_pcbs():&#160;tcp.c'],['../tcp__priv_8h.html#a78c09dbae67ccc06b659d9f1a388f911',1,'tcp_active_pcbs():&#160;tcp.c']]],
+  ['tcp_5fbound_5fpcbs',['tcp_bound_pcbs',['../tcp_8c.html#a1b42a7ac0fc173a42d575f86853d32a8',1,'tcp_bound_pcbs():&#160;tcp.c'],['../tcp__priv_8h.html#a1b42a7ac0fc173a42d575f86853d32a8',1,'tcp_bound_pcbs():&#160;tcp.c']]],
+  ['tcp_5flisten_5fpcbs',['tcp_listen_pcbs',['../tcp_8c.html#a96fe1350e510d4308ac9969ffb4c9c81',1,'tcp_listen_pcbs():&#160;tcp.c'],['../tcp__priv_8h.html#a96fe1350e510d4308ac9969ffb4c9c81',1,'tcp_listen_pcbs():&#160;tcp.c']]],
+  ['tcp_5fpcb_5flists',['tcp_pcb_lists',['../tcp_8c.html#a51515507dec664e9d69a870e6b627610',1,'tcp_pcb_lists():&#160;tcp.c'],['../tcp__priv_8h.html#af5e1079ab223e1cb27208c45e3c84df7',1,'tcp_pcb_lists():&#160;tcp.c']]],
+  ['tcp_5ftw_5fpcbs',['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']]],
+  ['test_5fresult',['test_result',['../structnetbios__answer.html#a91116fe26c8050ee166053f377b40c7f',1,'netbios_answer']]],
+  ['timeout_5fdiff',['timeout_diff',['../structmqtt__request__t.html#a65a7292669bc1f2d9df8f30bbcd77073',1,'mqtt_request_t']]],
+  ['timer',['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()']]],
+  ['tls_5fconfig',['tls_config',['../structmqtt__connect__client__info__t.html#a45987acc116de5d27fff6856778e55b4',1,'mqtt_connect_client_info_t']]],
+  ['to',['to',['../structsmtp__session.html#a70b3753bc70e65f779279c246617faea',1,'smtp_session']]],
+  ['to_5flen',['to_len',['../structsmtp__session.html#a66b8e1dd314976788e9ac9a81f59a402',1,'smtp_session']]],
+  ['tot_5flen',['tot_len',['../structpbuf.html#a5259e7ec29bab9c0999b64f2e86b411f',1,'pbuf']]],
+  ['total_5fnumber_5fof_5fcommand_5fblocks',['total_number_of_command_blocks',['../structnetbios__answer.html#a4c7ea5d1839fd27232877880e43485a2',1,'netbios_answer']]],
+  ['tried_5fllipaddr',['tried_llipaddr',['../structautoip.html#a472f3d18c07b3df024a0cde8f4ffa853',1,'autoip']]],
+  ['ts',['ts',['../structnetif.html#a1bb4e3aed6e0fd4b6b31ee82d806f971',1,'netif']]],
+  ['ttw',['ttw',['../structautoip.html#a7510d9a2961ea7c28ebfcde6390284bf',1,'autoip']]],
+  ['tx_5fbuf',['tx_buf',['../structsmtp__session.html#a42cedb495f7423b9e28979ce1e460c61',1,'smtp_session']]],
+  ['tx_5fdatagram_5ftag',['tx_datagram_tag',['../structlowpan6__ieee802154__data.html#a64560b289f86efe1d39ece603cd14b5c',1,'lowpan6_ieee802154_data']]],
+  ['tx_5fframe_5fseq_5fnum',['tx_frame_seq_num',['../structlowpan6__ieee802154__data.html#ad9cd994385c4d1d8ef0a22686c17720c',1,'lowpan6_ieee802154_data']]],
+  ['tx_5fid',['tx_id',['../structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00',1,'mdns_packet::tx_id()'],['../structmdns__outpacket.html#ac470f02a9f332f18e027437dc293d348',1,'mdns_outpacket::tx_id()']]],
+  ['txt_5ffn',['txt_fn',['../structmdns__service.html#a79bc4946c96a3b2d0713bc0897c4bd9c',1,'mdns_service']]],
+  ['txtdata',['txtdata',['../structmdns__service.html#a35daff90a18d19b14f23fa02df424f94',1,'mdns_service']]],
+  ['type',['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',['type_internal',['../structpbuf.html#a61a26ac8393dc9e549016b86c2cf5131',1,'pbuf']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_15.html b/doc/doxygen/output/html/search/variables_15.html
new file mode 100644
index 0000000..7432fd7
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_15.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_15.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_15.js b/doc/doxygen/output/html/search/variables_15.js
new file mode 100644
index 0000000..acc17f5
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_15.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+  ['udp',['udp',['../structstats__.html#a626e03d4bded6480582789cfd17d4063',1,'stats_']]],
+  ['unicast_5freply',['unicast_reply',['../structmdns__outpacket.html#a68255725575af086a3afa76bc5c8e64d',1,'mdns_outpacket']]],
+  ['unit_5fid',['unit_id',['../structnetbios__answer.html#aeed6aa8ba4f8bb107d141b3b3d0a1787',1,'netbios_answer']]],
+  ['use',['use',['../structigmp__group.html#ab3625aeb3689e3626f73138eb0e41852',1,'igmp_group::use()'],['../structmld__group.html#addc67094f83c9352fe039c392c480f9e',1,'mld_group::use()']]],
+  ['used',['used',['../structmem.html#aa76b6a39425617435978dce903f0d456',1,'mem']]],
+  ['username',['username',['../structsmtp__session.html#a568e3def9d0ec54e3c079f577717a6bb',1,'smtp_session']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_16.html b/doc/doxygen/output/html/search/variables_16.html
new file mode 100644
index 0000000..737584f
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_16.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_16.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_16.js b/doc/doxygen/output/html/search/variables_16.js
new file mode 100644
index 0000000..edc8ed0
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_16.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+  ['value',['value',['../structsnmp__varbind.html#a328227d7ae188a0a2feb95f8000aac45',1,'snmp_varbind']]],
+  ['value_5flen',['value_len',['../structsnmp__varbind.html#ab094577fac6c7cc16ad666c9970cdb85',1,'snmp_varbind']]],
+  ['vector',['vector',['../structapi__msg.html#a1ceb9822ba49ba439e30d98492593612',1,'api_msg']]],
+  ['vector_5fcnt',['vector_cnt',['../structapi__msg.html#ab6f14157a3e6735b69a569249d3286a2',1,'api_msg']]],
+  ['vector_5foff',['vector_off',['../structapi__msg.html#a6896ae78ebddefdf2d8358ab5f21f444',1,'api_msg']]],
+  ['version_5fnumber',['version_number',['../structnetbios__answer.html#a151dce0f0bf626b2a54fbb75775237ba',1,'netbios_answer']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_17.html b/doc/doxygen/output/html/search/variables_17.html
new file mode 100644
index 0000000..fe5c7ef
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_17.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_17.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_17.js b/doc/doxygen/output/html/search/variables_17.js
new file mode 100644
index 0000000..ec40cf2
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_17.js
@@ -0,0 +1,11 @@
+var searchData=
+[
+  ['w',['w',['../structapi__msg.html#a8a71456d1199d10af5c1d8760cc0ce73',1,'api_msg']]],
+  ['will_5fmsg',['will_msg',['../structmqtt__connect__client__info__t.html#a925fcebd15555afdc0820e196e2fd3a7',1,'mqtt_connect_client_info_t']]],
+  ['will_5fqos',['will_qos',['../structmqtt__connect__client__info__t.html#a07954934f4fecf54fa190997848229d9',1,'mqtt_connect_client_info_t']]],
+  ['will_5fretain',['will_retain',['../structmqtt__connect__client__info__t.html#a49c10873f44d7534140a63eef2a6a4e3',1,'mqtt_connect_client_info_t']]],
+  ['will_5ftopic',['will_topic',['../structmqtt__connect__client__info__t.html#a32e77415460752ba0484eb3ba0faf0c8',1,'mqtt_connect_client_info_t']]],
+  ['write',['write',['../structtftp__context.html#a9e6e4ec803ec9597822923369701754d',1,'tftp_context']]],
+  ['write_5foffset',['write_offset',['../structmdns__outpacket.html#a8ead21e392b21c3e872c0cab874cdcf5',1,'mdns_outpacket']]],
+  ['writeset',['writeset',['../structlwip__select__cb.html#aa89638b1c2c6b2c88030560861aba04c',1,'lwip_select_cb']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_18.html b/doc/doxygen/output/html/search/variables_18.html
new file mode 100644
index 0000000..56aa0a7
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_18.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_18.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_18.js b/doc/doxygen/output/html/search/variables_18.js
new file mode 100644
index 0000000..e1e8257
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_18.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+  ['zep_5fdst_5fip_5faddr',['zep_dst_ip_addr',['../structzepif__init.html#a851efb99a973348f1064a31b97ce779d',1,'zepif_init']]],
+  ['zep_5fdst_5fudp_5fport',['zep_dst_udp_port',['../structzepif__init.html#a86c6229ed3010158e601666afe91a286',1,'zepif_init']]],
+  ['zep_5fnetif',['zep_netif',['../structzepif__init.html#a3d97bf90b6bd4dd8258a3b1caf7890e3',1,'zepif_init']]],
+  ['zep_5fsrc_5fip_5faddr',['zep_src_ip_addr',['../structzepif__init.html#adbe989f1f5cba623d742187def36f02c',1,'zepif_init']]],
+  ['zep_5fsrc_5fudp_5fport',['zep_src_udp_port',['../structzepif__init.html#ad739032585841b126b4c0eab5899d40f',1,'zepif_init']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_2.html b/doc/doxygen/output/html/search/variables_2.html
new file mode 100644
index 0000000..5c9de1a
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_2.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_2.js b/doc/doxygen/output/html/search/variables_2.js
new file mode 100644
index 0000000..ebb1bce
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_2.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+  ['b',['b',['../structapi__msg.html#ab0abd60527e96cc24c2c20c835cdac05',1,'api_msg']]],
+  ['base',['base',['../structmemp__desc.html#a9aec58adcbcd88167247296ca4346558',1,'memp_desc']]],
+  ['bc',['bc',['../structapi__msg.html#a1705127c6cd22c2c6dbbcc59834e41e0',1,'api_msg']]],
+  ['body',['body',['../structsmtp__session.html#a7bb4bf5cc209e073341b56845e5cbd49',1,'smtp_session']]],
+  ['body_5flen',['body_len',['../structsmtp__session.html#a0da8b775ddfe5f8891464037a6b4bb4d',1,'smtp_session']]],
+  ['body_5fsent',['body_sent',['../structsmtp__session.html#a5893c61d863b4846a81d8a4bbcaebb5b',1,'smtp_session']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_3.html b/doc/doxygen/output/html/search/variables_3.html
new file mode 100644
index 0000000..f95e34c
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_3.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_3.js b/doc/doxygen/output/html/search/variables_3.js
new file mode 100644
index 0000000..248f702
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_3.js
@@ -0,0 +1,26 @@
+var searchData=
+[
+  ['cache_5fflush',['cache_flush',['../structmdns__outpacket.html#a9bd0fd91dda48baa2938dddd747d3195',1,'mdns_outpacket']]],
+  ['callback',['callback',['../structnetconn.html#abe796060bb06e585333ca9a87862b624',1,'netconn']]],
+  ['callback_5farg',['callback_arg',['../structsmtp__session.html#af0544df7a935a092d825d8f2380f970f',1,'smtp_session']]],
+  ['callback_5ffn',['callback_fn',['../structsmtp__session.html#a24c13d621e18311a613ab68b856a7f7b',1,'smtp_session']]],
+  ['cb',['cb',['../structmqtt__request__t.html#a32a4b14b0b8b5b8ce8db1074e53f4a79',1,'mqtt_request_t']]],
+  ['chksum_5flen_5frx',['chksum_len_rx',['../structudp__pcb.html#a5e2833df51760c83c6032608eb5d0d4d',1,'udp_pcb']]],
+  ['client_5fid',['client_id',['../structmqtt__connect__client__info__t.html#ad35f7850df21f001d5c5ffaa1a18c05a',1,'mqtt_connect_client_info_t']]],
+  ['client_5fpass',['client_pass',['../structmqtt__connect__client__info__t.html#a8f68efe91c5311418151256c96102d4b',1,'mqtt_connect_client_info_t']]],
+  ['client_5fuser',['client_user',['../structmqtt__connect__client__info__t.html#aec961673d5c3e8dc853c91f30d9333b5',1,'mqtt_connect_client_info_t']]],
+  ['close',['close',['../structtftp__context.html#ae9181c57d1cf89bc263f7671e5630a65',1,'tftp_context']]],
+  ['conn',['conn',['../structapi__msg.html#abec5e33802d69f1b601543d60699f028',1,'api_msg::conn()'],['../structlwip__sock.html#a3a3fee485b3361ed7054cde149355fb4',1,'lwip_sock::conn()']]],
+  ['conn_5fstate',['conn_state',['../structmqtt__client__s.html#af4a07c1079e2e2a336f1939d8b9677e6',1,'mqtt_client_s']]],
+  ['connect_5farg',['connect_arg',['../structmqtt__client__s.html#ae6d53359ec6d70533dab7c0d2717ce1a',1,'mqtt_client_s']]],
+  ['current_5finput_5fnetif',['current_input_netif',['../structip__globals.html#a7da899c663b1d560b61d92ba6d544701',1,'ip_globals']]],
+  ['current_5fip4_5fheader',['current_ip4_header',['../structip__globals.html#a2e810f97cf3e8e855e3baafc3be8c0d4',1,'ip_globals']]],
+  ['current_5fip6_5fheader',['current_ip6_header',['../structip__globals.html#aa5cfc3ac29dc746a4cbe844206b0ed41',1,'ip_globals']]],
+  ['current_5fip_5fheader_5ftot_5flen',['current_ip_header_tot_len',['../structip__globals.html#a17004526e6f1a164c0bab01aeac5e34a',1,'ip_globals']]],
+  ['current_5fiphdr_5fdest',['current_iphdr_dest',['../structip__globals.html#a0b4e54250c692c638408de54593d2aa1',1,'ip_globals']]],
+  ['current_5fiphdr_5fsrc',['current_iphdr_src',['../structip__globals.html#a04d85a3dc2c417050b3e088fa58a74b0',1,'ip_globals']]],
+  ['current_5fmsg',['current_msg',['../structnetconn.html#a49ba09038b2f2563fd3a38e38f8b8ab9',1,'netconn']]],
+  ['current_5fnetif',['current_netif',['../structip__globals.html#a7803dc5950d143e4433a0df689989bab',1,'ip_globals']]],
+  ['custom_5ffree_5ffunction',['custom_free_function',['../structpbuf__custom.html#af614d17874746cbbf778dc4ca9eac2e9',1,'pbuf_custom']]],
+  ['cyclic_5ftick',['cyclic_tick',['../structmqtt__client__s.html#a6274ba2eb2fe6afa970b1c8a650d8cef',1,'mqtt_client_s']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_4.html b/doc/doxygen/output/html/search/variables_4.html
new file mode 100644
index 0000000..d7db285
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_4.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_4.js b/doc/doxygen/output/html/search/variables_4.js
new file mode 100644
index 0000000..8004b90
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_4.js
@@ -0,0 +1,14 @@
+var searchData=
+[
+  ['data_5fcb',['data_cb',['../structmqtt__client__s.html#a26dc9112351c042594a41703197925a7',1,'mqtt_client_s']]],
+  ['dest_5faddr',['dest_addr',['../structmdns__outpacket.html#a1fdc90b48d8cf1fc24895f0c7a5798e4',1,'mdns_outpacket']]],
+  ['destination_5faddress',['destination_address',['../structieee__802154__hdr.html#a87ce59d2804cacc5a58411c8b6c47f33',1,'ieee_802154_hdr']]],
+  ['destination_5fpan_5fid',['destination_pan_id',['../structieee__802154__hdr.html#ac1ad9159d3bb70b1a7223060c6c81efd',1,'ieee_802154_hdr']]],
+  ['destroy',['destroy',['../structtcp__ext__arg__callbacks.html#ace586d5d376b42465927a4fd8688c24b',1,'tcp_ext_arg_callbacks']]],
+  ['dhcp6_5frx_5foptions',['dhcp6_rx_options',['../dhcp6_8c.html#abcce06f078da4b03265d20c0bc1bdce0',1,'dhcp6.c']]],
+  ['dhcp_5frx_5foptions_5fgiven',['dhcp_rx_options_given',['../dhcp_8c.html#a058b71e1d26b3758b29d16d9f892c8cc',1,'dhcp.c']]],
+  ['dhcp_5frx_5foptions_5fval',['dhcp_rx_options_val',['../dhcp_8c.html#a5abd232496063bddcbc6692c0e8f9c1f',1,'dhcp.c']]],
+  ['dns_5faddrtype',['dns_addrtype',['../structdns__api__msg.html#afb2536a6c342bed4c4ad9d75982f7493',1,'dns_api_msg']]],
+  ['dns_5fttl',['dns_ttl',['../structmdns__service.html#a5a939a4da01cb50c74cd53b352e4fa14',1,'mdns_service::dns_ttl()'],['../structmdns__host.html#a4547e5a8375fc1f1372546268a80d51b',1,'mdns_host::dns_ttl()']]],
+  ['domain_5foffsets',['domain_offsets',['../structmdns__outpacket.html#aee97e98c4869aa63ffe348d38d87221f',1,'mdns_outpacket']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_5.html b/doc/doxygen/output/html/search/variables_5.html
new file mode 100644
index 0000000..7bbceeb
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_5.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_5.js b/doc/doxygen/output/html/search/variables_5.js
new file mode 100644
index 0000000..ac86601
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_5.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+  ['err',['err',['../structapi__msg.html#a8c66bd95217fa627f13f2f0847bbb25f',1,'api_msg::err()'],['../structdns__api__msg.html#a6536d91adb146555461359bd451b30de',1,'dns_api_msg::err()']]],
+  ['errevent',['errevent',['../structlwip__sock.html#a9245a7ab9471bfb6fac94c66d26fba5e',1,'lwip_sock']]],
+  ['ethaddr',['ethaddr',['../structbridgeif__initdata__s.html#a8e0048db5e021f5d79411492dc9330bc',1,'bridgeif_initdata_s']]],
+  ['etharp',['etharp',['../structstats__.html#aa52547cb08dc828927494dc485bb69f3',1,'stats_']]],
+  ['exceptset',['exceptset',['../structlwip__select__cb.html#a2a1e68993ed887fca326d1373ea6caed',1,'lwip_select_cb']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_6.html b/doc/doxygen/output/html/search/variables_6.html
new file mode 100644
index 0000000..4eb162d
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_6.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_6.js b/doc/doxygen/output/html/search/variables_6.js
new file mode 100644
index 0000000..c489f6a
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_6.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+  ['flags',['flags',['../structnetconn.html#a96cb9a3830248699bd07a1a447e5630c',1,'netconn::flags()'],['../structnetif.html#a1c171db6097bbb6f09f63549a66e00ea',1,'netif::flags()'],['../structpbuf.html#aa4d1af2cab3d9280d29212095b5b872a',1,'pbuf::flags()']]],
+  ['frame_5fcontrol',['frame_control',['../structieee__802154__hdr.html#a1d1e2cef0e0c1b1e1fd02a8a5f07fb10',1,'ieee_802154_hdr']]],
+  ['from',['from',['../structsmtp__session.html#a8dc4651c67618e33c56dc66790bc12ee',1,'smtp_session']]],
+  ['from_5flen',['from_len',['../structsmtp__session.html#a191b09e7142414a671da82fece888e65',1,'smtp_session']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_7.html b/doc/doxygen/output/html/search/variables_7.html
new file mode 100644
index 0000000..0408829
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_7.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_7.js b/doc/doxygen/output/html/search/variables_7.js
new file mode 100644
index 0000000..0c3fc91
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_7.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+  ['get_5fvalue',['get_value',['../structsnmp__node__instance.html#a17aa954aa34672f4a399bf0d91c0a649',1,'snmp_node_instance::get_value()'],['../structsnmp__table__node.html#ac65c57e29faa456a9a710185109fe272',1,'snmp_table_node::get_value()']]],
+  ['group_5faddress',['group_address',['../structigmp__group.html#ae26e6041f865880bf46cd21b6f9af854',1,'igmp_group::group_address()'],['../structmld__group.html#a781abf78d835627ded1202166b44b88e',1,'mld_group::group_address()']]],
+  ['group_5fstate',['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/variables_8.html b/doc/doxygen/output/html/search/variables_8.html
new file mode 100644
index 0000000..d54d096
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_8.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_8.js b/doc/doxygen/output/html/search/variables_8.js
new file mode 100644
index 0000000..9a30316
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_8.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+  ['h_5ferrno',['h_errno',['../netdb_8c.html#a2a1ce3f2040007303d36c0b682b5ac10',1,'h_errno():&#160;netdb.c'],['../lwip_2netdb_8h.html#a2a1ce3f2040007303d36c0b682b5ac10',1,'h_errno():&#160;netdb.c']]],
+  ['hwaddr',['hwaddr',['../structnetif.html#aee967965d999fc1a4c40a66709304e69',1,'netif']]],
+  ['hwaddr_5flen',['hwaddr_len',['../structnetif.html#afe1181561cb16241f3cb5ed01e567d42',1,'netif']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_9.html b/doc/doxygen/output/html/search/variables_9.html
new file mode 100644
index 0000000..234dc60
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_9.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_9.js b/doc/doxygen/output/html/search/variables_9.js
new file mode 100644
index 0000000..5dc94c8
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_9.js
@@ -0,0 +1,34 @@
+var searchData=
+[
+  ['icmp',['icmp',['../structstats__.html#a10bc430163b0e6db91338aded5b7019a',1,'stats_']]],
+  ['icmp6',['icmp6',['../structstats__.html#a25a6b5940e32d53a066aa1bbc2028c03',1,'stats_']]],
+  ['ieee_5f802154_5fpan_5fid',['ieee_802154_pan_id',['../structlowpan6__ieee802154__data.html#a017fc6f447215e4b65955ee7b1ed798f',1,'lowpan6_ieee802154_data']]],
+  ['if_5fidx',['if_idx',['../structpbuf.html#a6a58e90efbb4751608e9a1fdbd91e697',1,'pbuf']]],
+  ['ifindiscards',['ifindiscards',['../structstats__mib2__netif__ctrs.html#a4a767e6b835d5ad2f9b73751de2b0947',1,'stats_mib2_netif_ctrs']]],
+  ['ifinerrors',['ifinerrors',['../structstats__mib2__netif__ctrs.html#afda1a14dc79bb65a33f97f9fb467ec1d',1,'stats_mib2_netif_ctrs']]],
+  ['ifinnucastpkts',['ifinnucastpkts',['../structstats__mib2__netif__ctrs.html#a111f08290b3c6944108237cefba066dd',1,'stats_mib2_netif_ctrs']]],
+  ['ifinoctets',['ifinoctets',['../structstats__mib2__netif__ctrs.html#a7e9ddf9b4a17748a9d3f041c1d24ba8e',1,'stats_mib2_netif_ctrs']]],
+  ['ifinucastpkts',['ifinucastpkts',['../structstats__mib2__netif__ctrs.html#a9ed42d6329a9616669ba21789fa001d8',1,'stats_mib2_netif_ctrs']]],
+  ['ifinunknownprotos',['ifinunknownprotos',['../structstats__mib2__netif__ctrs.html#ac34eb01b42f22b1e49ca7c9734e737aa',1,'stats_mib2_netif_ctrs']]],
+  ['ifoutdiscards',['ifoutdiscards',['../structstats__mib2__netif__ctrs.html#a3a2aec508fd4466ca8bab10d8dc2c842',1,'stats_mib2_netif_ctrs']]],
+  ['ifouterrors',['ifouterrors',['../structstats__mib2__netif__ctrs.html#a91b60bb78759c9b655a74bb4fae3346e',1,'stats_mib2_netif_ctrs']]],
+  ['ifoutnucastpkts',['ifoutnucastpkts',['../structstats__mib2__netif__ctrs.html#afd3264670c39cc0d721a35cb6650f8d7',1,'stats_mib2_netif_ctrs']]],
+  ['ifoutoctets',['ifoutoctets',['../structstats__mib2__netif__ctrs.html#a24151d13a55452518e5f7832f48bd5a7',1,'stats_mib2_netif_ctrs']]],
+  ['ifoutucastpkts',['ifoutucastpkts',['../structstats__mib2__netif__ctrs.html#a24aba9660a2951027b23d4118b57c471',1,'stats_mib2_netif_ctrs']]],
+  ['igmp',['igmp',['../structstats__.html#a877e369c2abef97f13492faa838e2271',1,'stats_']]],
+  ['igmp_5fmac_5ffilter',['igmp_mac_filter',['../structnetif.html#ae64e56581bf0f136601f24c5395c19f0',1,'netif']]],
+  ['in6addr_5fany',['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',['inpub_pkt_id',['../structmqtt__client__s.html#a6c81d0dd14e786222425ea04fd060824',1,'mqtt_client_s']]],
+  ['input',['input',['../structnetif.html#a8fe4f1b7b0d710216287da9615164a5c',1,'netif']]],
+  ['instance_5foid',['instance_oid',['../structsnmp__node__instance.html#aedb358729c310c8e5b391dd256726a23',1,'snmp_node_instance']]],
+  ['ip',['ip',['../structstats__.html#a40f5b637d083896a07a3482ede23b7ed',1,'stats_']]],
+  ['ip6',['ip6',['../structstats__.html#afc0942a5bc26735cf059099636b85336',1,'stats_']]],
+  ['ip6_5faddr',['ip6_addr',['../structnetif.html#ab7ef575d4ab398a182bc6e592f4d53a4',1,'netif']]],
+  ['ip6_5faddr_5fstate',['ip6_addr_state',['../structnetif.html#a54e81344084e9840a51cc4abab3b059b',1,'netif']]],
+  ['ip6_5faddr_5fvalid_5flife',['ip6_addr_valid_life',['../structnetif.html#a26f6e26d4a54c998716c10b7b85c8230',1,'netif']]],
+  ['ip6_5fautoconfig_5fenabled',['ip6_autoconfig_enabled',['../structnetif.html#ad98bafb7733b40ef898e53d91fbfa20f',1,'netif']]],
+  ['ip6_5ffrag',['ip6_frag',['../structstats__.html#a7373df7bc44bb9913a42c0bc7b3039cf',1,'stats_']]],
+  ['ip_5faddr',['ip_addr',['../structnetif.html#a9776aaee37ea8f07b9ddc0f8b4e7e866',1,'netif']]],
+  ['ip_5fdata',['ip_data',['../ip_8c.html#ac944fb6564f181bc90bc7c2b8b00d94c',1,'ip_data():&#160;ip.c'],['../ip_8h.html#ac944fb6564f181bc90bc7c2b8b00d94c',1,'ip_data():&#160;ip.c']]],
+  ['ip_5ffrag',['ip_frag',['../structstats__.html#a81fcccf03ab0d4e31423f39d0c880302',1,'stats_']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_a.html b/doc/doxygen/output/html/search/variables_a.html
new file mode 100644
index 0000000..0892488
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_a.js b/doc/doxygen/output/html/search/variables_a.js
new file mode 100644
index 0000000..8c223f4
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_a.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['jl',['jl',['../structapi__msg.html#a6387bddb309c218ac0ccc5ef6d7a033e',1,'api_msg']]],
+  ['jumpers',['jumpers',['../structnetbios__answer.html#a69cd3e8b8265531a7ce3e5cbd4911683',1,'netbios_answer']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_b.html b/doc/doxygen/output/html/search/variables_b.html
new file mode 100644
index 0000000..ea46965
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_b.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_b.js b/doc/doxygen/output/html/search/variables_b.js
new file mode 100644
index 0000000..c8680df
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_b.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['keep_5falive',['keep_alive',['../structmqtt__connect__client__info__t.html#ac80262a7456812e9eefffd8c3b9ac21a',1,'mqtt_connect_client_info_t']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_c.html b/doc/doxygen/output/html/search/variables_c.html
new file mode 100644
index 0000000..94bf1a6
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_c.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_c.js b/doc/doxygen/output/html/search/variables_c.js
new file mode 100644
index 0000000..b0f7147
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_c.js
@@ -0,0 +1,22 @@
+var searchData=
+[
+  ['last_5freporter_5fflag',['last_reporter_flag',['../structigmp__group.html#a8fa72062d168d81c1c5ae5209eb0a874',1,'igmp_group::last_reporter_flag()'],['../structmld__group.html#aa8eb75f4dfaefbf0d2853b0e31ceb53b',1,'mld_group::last_reporter_flag()']]],
+  ['lastconflict',['lastconflict',['../structautoip.html#a2f51d8cde73e20d6e0ae3ec8053afb55',1,'autoip']]],
+  ['lastdata',['lastdata',['../structlwip__sock.html#aa487ac16b7e5b6a2a618b7b5060247e1',1,'lwip_sock']]],
+  ['legacy_5fquery',['legacy_query',['../structmdns__outpacket.html#aff8c520bffa87c78e0ee2440571bbd65',1,'mdns_outpacket']]],
+  ['len',['len',['../structnetvector.html#a8a95e6dcf57067e4354b9c2b6b391dbd',1,'netvector::len()'],['../structpbuf.html#a6f82449625e36e294f5d210268c0703f',1,'pbuf::len()'],['../structapi__msg.html#a40624c398d1939bfee54bffa708a363e',1,'api_msg::len()']]],
+  ['linger',['linger',['../structnetconn.html#a25ed06d944da0b0b9e7db5265be3fa3d',1,'netconn']]],
+  ['link',['link',['../structstats__.html#a67759c9b0059bf569f9f771df23924eb',1,'stats_']]],
+  ['link_5fcallback',['link_callback',['../structnetif.html#a4388cfadc8b4e9a9c1c93ce777bc3673',1,'netif']]],
+  ['link_5fspeed',['link_speed',['../structnetif.html#a908452e854180941054ed89f52bb8094',1,'netif']]],
+  ['link_5ftype',['link_type',['../structnetif.html#ad0ee2a2169e384a2977ece2c471e0062',1,'netif']]],
+  ['linkoutput',['linkoutput',['../structnetif.html#acaaac9b415a7be73eb8a287c8ed18a8d',1,'netif']]],
+  ['llipaddr',['llipaddr',['../structautoip.html#a13b5da8a86839b4cd9bd9f5400ac9dc7',1,'autoip']]],
+  ['local_5fip',['local_ip',['../structtcp__pcb__listen.html#a8a4f7b0551a0c6926a08ea5b6b3d5987',1,'tcp_pcb_listen::local_ip()'],['../structtcp__pcb.html#a0c4f101d55debee0d8fad86a7eb4f76f',1,'tcp_pcb::local_ip()'],['../structudp__pcb.html#a6160ea5e52f0d33e51b16b853ea1cd63',1,'udp_pcb::local_ip()']]],
+  ['local_5fport',['local_port',['../structudp__pcb.html#a8cc805631142eefc5593ae8ba3302d7c',1,'udp_pcb']]],
+  ['lock_5ftcpip_5fcore',['lock_tcpip_core',['../tcpip_8c.html#acd7be2108e9a47fd8f1ab0a49f76241d',1,'lock_tcpip_core():&#160;tcpip.c'],['../tcpip_8h.html#acd7be2108e9a47fd8f1ab0a49f76241d',1,'lock_tcpip_core():&#160;tcpip.c']]],
+  ['lowpan6_5fcontext',['lowpan6_context',['../structlowpan6__ieee802154__data.html#a190c9c06dfe1075abb7399f99553b507',1,'lowpan6_ieee802154_data']]],
+  ['lwip_5fcyclic_5ftimers',['lwip_cyclic_timers',['../timeouts_8c.html#addc06ab816f051a0fe6f280972eed142',1,'lwip_cyclic_timers():&#160;timeouts.c'],['../timeouts_8h.html#addc06ab816f051a0fe6f280972eed142',1,'lwip_cyclic_timers():&#160;timeouts.c']]],
+  ['lwip_5fnum_5fcyclic_5ftimers',['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_5fstats',['lwip_stats',['../stats_8c.html#a614735db0145db9ba944ede600d1d19b',1,'lwip_stats():&#160;stats.c'],['../stats_8h.html#a614735db0145db9ba944ede600d1d19b',1,'lwip_stats():&#160;stats.c']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_d.html b/doc/doxygen/output/html/search/variables_d.html
new file mode 100644
index 0000000..b9381e9
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_d.js b/doc/doxygen/output/html/search/variables_d.js
new file mode 100644
index 0000000..6e327b1
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_d.js
@@ -0,0 +1,22 @@
+var searchData=
+[
+  ['max_5ffdb_5fdynamic_5fentries',['max_fdb_dynamic_entries',['../structbridgeif__initdata__s.html#aeb312c2e698513c6416d5c8459ad622f',1,'bridgeif_initdata_s']]],
+  ['max_5ffdb_5fstatic_5fentries',['max_fdb_static_entries',['../structbridgeif__initdata__s.html#a210915aa1b0436ccabc7e8d9fd3c3fe6',1,'bridgeif_initdata_s']]],
+  ['max_5fnumber_5fof_5fpending_5fsessions',['max_number_of_pending_sessions',['../structnetbios__answer.html#a58aba600ed34b7c689606c296ef57c8c',1,'netbios_answer']]],
+  ['max_5fports',['max_ports',['../structbridgeif__initdata__s.html#a0e0bb6a885967b5fcfef09a8f0adc63f',1,'bridgeif_initdata_s']]],
+  ['max_5ftotal_5fnumber_5fof_5fcommand_5fblocks',['max_total_number_of_command_blocks',['../structnetbios__answer.html#a9cf85c173fe0d99c1c4e7e09aaeed9b8',1,'netbios_answer']]],
+  ['max_5ftotal_5fsessions_5fpossible',['max_total_sessions_possible',['../structnetbios__answer.html#a0069c9ae014881298828660787fa945e',1,'netbios_answer']]],
+  ['mcast_5fifindex',['mcast_ifindex',['../structraw__pcb.html#a5124a21e1523c774bd76c0eabc7c7ca8',1,'raw_pcb::mcast_ifindex()'],['../structudp__pcb.html#ac80ae56333b88cea08bfa3563b0dd3cd',1,'udp_pcb::mcast_ifindex()']]],
+  ['mcast_5fip4',['mcast_ip4',['../structudp__pcb.html#a1c32c7ebd76898cf8f1227c10d34dbe0',1,'udp_pcb']]],
+  ['mcast_5fttl',['mcast_ttl',['../structraw__pcb.html#a2ecc77e919de9bb552d1c70e771e2cad',1,'raw_pcb::mcast_ttl()'],['../structudp__pcb.html#aaab9255f7f1186aef12d45c9bb90d3f4',1,'udp_pcb::mcast_ttl()']]],
+  ['mem',['mem',['../structstats__.html#a656444f95080c6a3d474f73a6fcd9b1c',1,'stats_']]],
+  ['memp',['memp',['../structstats__.html#aa75d6b389e94b0f619b5db0daaf569fc',1,'stats_']]],
+  ['mib2',['mib2',['../structstats__.html#ac001c065c56c26c3952b19b9ce0d5832',1,'stats_']]],
+  ['mib2_5fcounters',['mib2_counters',['../structnetif.html#ab32cbe1851154fd020bac4be558f5fd5',1,'netif']]],
+  ['mld6',['mld6',['../structstats__.html#ab0ad1d07dff25cd3e4a8e5be607497f8',1,'stats_']]],
+  ['mld_5fmac_5ffilter',['mld_mac_filter',['../structnetif.html#abc67963ff9f574e98ef9c50138a3e470',1,'netif']]],
+  ['msg',['msg',['../structapi__msg.html#aef71459b5251d796434f741ca630d528',1,'api_msg']]],
+  ['msg_5fidx',['msg_idx',['../structmqtt__client__s.html#aae7bd1da3461efef9616934feb166aa5',1,'mqtt_client_s']]],
+  ['mtu',['mtu',['../structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48',1,'netif']]],
+  ['mtu6',['mtu6',['../structnetif.html#acd78fca5dad6468605f38e327b3a5e72',1,'netif']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_e.html b/doc/doxygen/output/html/search/variables_e.html
new file mode 100644
index 0000000..375ad70
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_e.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_e.js b/doc/doxygen/output/html/search/variables_e.js
new file mode 100644
index 0000000..58a49ab
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_e.js
@@ -0,0 +1,25 @@
+var searchData=
+[
+  ['n',['n',['../structapi__msg.html#adbbfc2baa8088b31fc722365237e5807',1,'api_msg']]],
+  ['name',['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',['name_size',['../structnetbios__answer.html#a5828dc04e01a1f7b734019db428fd46d',1,'netbios_answer']]],
+  ['nd6',['nd6',['../structstats__.html#ab348a3a4b593b05d7df1293a06af8adf',1,'stats_']]],
+  ['netif',['netif',['../structmdns__packet.html#ac7307f344f654cb954f92d578dc7c989',1,'mdns_packet::netif()'],['../structmdns__outpacket.html#ad0bd066f127d35a0ce67193e1cd07430',1,'mdns_outpacket::netif()']]],
+  ['netif_5fdefault',['netif_default',['../netif_8c.html#a3d0925cbce550ed461907aee816713ba',1,'netif_default():&#160;netif.c'],['../netif_8h.html#a3d0925cbce550ed461907aee816713ba',1,'netif_default():&#160;netif.c']]],
+  ['netif_5flist',['netif_list',['../netif_8c.html#a1c8141eaa98f6dc6dfddbb23a706656c',1,'netif_list():&#160;netif.c'],['../netif_8h.html#a1c8141eaa98f6dc6dfddbb23a706656c',1,'netif_list():&#160;netif.c']]],
+  ['next',['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',['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',['node_type',['../structsnmp__node.html#a1af8e20a688943a419b307bf123b1851',1,'snmp_node']]],
+  ['num',['num',['../structnetif.html#ab7ef01e505dd2feb781fe86756b1c973',1,'netif::num()'],['../structmemp__desc.html#a2c32db78e565b8812ca0e20fe929a8a7',1,'memp_desc::num()']]],
+  ['number_5fof_5falignment_5ferrors',['number_of_alignment_errors',['../structnetbios__answer.html#ab4f9ff63bd5529418c07762506189ad2',1,'netbios_answer']]],
+  ['number_5fof_5fcollisions',['number_of_collisions',['../structnetbios__answer.html#a45b7aec200434d3aaabc3ea6ebc46c1e',1,'netbios_answer']]],
+  ['number_5fof_5fcrcs',['number_of_crcs',['../structnetbios__answer.html#ab23a11db86a170b46aa8f8af434534d8',1,'netbios_answer']]],
+  ['number_5fof_5ffree_5fcommand_5fblocks',['number_of_free_command_blocks',['../structnetbios__answer.html#af41cbffb0ac6a9db3305b3fc64646219',1,'netbios_answer']]],
+  ['number_5fof_5fgood_5freceives',['number_of_good_receives',['../structnetbios__answer.html#a0eab7dbe733cc50f515126649de596ea',1,'netbios_answer']]],
+  ['number_5fof_5fgood_5fsends',['number_of_good_sends',['../structnetbios__answer.html#aa6088bca2a59ffcd077a474330511abd',1,'netbios_answer']]],
+  ['number_5fof_5fnames',['number_of_names',['../structnetbios__answer.html#ac4a95ccabbb945c9470e0cfd470be491',1,'netbios_answer']]],
+  ['number_5fof_5fno_5fresource_5fcondition',['number_of_no_resource_condition',['../structnetbios__answer.html#a62946dd0f27e9f9b9f295dcde4d3ea42',1,'netbios_answer']]],
+  ['number_5fof_5fpending_5fsessions',['number_of_pending_sessions',['../structnetbios__answer.html#a66098747155d5bd56f1c92aa8da10c1d',1,'netbios_answer']]],
+  ['number_5fof_5fretransmits',['number_of_retransmits',['../structnetbios__answer.html#ab175ad0f89102b3b3f81a41b5a72b321',1,'netbios_answer']]],
+  ['number_5fof_5fsend_5faborts',['number_of_send_aborts',['../structnetbios__answer.html#a1560e3864a0821acea9410e8c1d21408',1,'netbios_answer']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_f.html b/doc/doxygen/output/html/search/variables_f.html
new file mode 100644
index 0000000..d371418
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/search/variables_f.js b/doc/doxygen/output/html/search/variables_f.js
new file mode 100644
index 0000000..80559e1
--- /dev/null
+++ b/doc/doxygen/output/html/search/variables_f.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+  ['offset',['offset',['../structapi__msg.html#a4bd9382dd42b18120803e246a0203353',1,'api_msg']]],
+  ['oid',['oid',['../structsnmp__varbind.html#ace3a9e4dcdc9a5ec79a20c84946418a4',1,'snmp_varbind::oid()'],['../structsnmp__node.html#ae7a3bb0eb49ac527d461be414937f271',1,'snmp_node::oid()']]],
+  ['old_5faddress',['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',['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',['op_completed',['../structnetconn.html#a982506698a59f185ff3f16d1675ea4ae',1,'netconn']]],
+  ['open',['open',['../structtftp__context.html#ae70d64e8e20328cc492d766506df4cba',1,'tftp_context']]],
+  ['original',['original',['../structpbuf__custom__ref.html#a135a1476908337d8073241fd7f68fa1d',1,'pbuf_custom_ref']]],
+  ['output',['output',['../structmqtt__client__s.html#a667c1dc7a6008055b63877acb06f333c',1,'mqtt_client_s::output()'],['../structnetif.html#a8e1dcfe65db487feecd244355f39215e',1,'netif::output()']]],
+  ['output_5fip6',['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
new file mode 100644
index 0000000..6840e96
--- /dev/null
+++ b/doc/doxygen/output/html/slipif_8c.html
@@ -0,0 +1,169 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/netif/slipif.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('slipif_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">slipif.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="slipif_8h.html">netif/slipif.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="opt_8h.html">lwip/opt.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="pbuf_8h.html">lwip/pbuf.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp_8h.html">lwip/snmp.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;lwip/sio.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:accf448f9dabb0f33ef46b40355691cab"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="slipif_8c.html#accf448f9dabb0f33ef46b40355691cab">SLIP_MAX_SIZE</a>&#160;&#160;&#160;1500</td></tr>
+<tr class="separator:accf448f9dabb0f33ef46b40355691cab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2a9e9ed81732a6794a9b9a712f75a1cc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="slipif_8c.html#a2a9e9ed81732a6794a9b9a712f75a1cc">SLIP_SIO_SPEED</a>(sio_fd)&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a2a9e9ed81732a6794a9b9a712f75a1cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga687973ba82dab13a5b9d38d7399aeee3"><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__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3">slipif_init</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga687973ba82dab13a5b9d38d7399aeee3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7b036fd1cde9b299139cac62f52d15a6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6">slipif_poll</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga7b036fd1cde9b299139cac62f52d15a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae135be7d61e5bb49ab72476b0aa70946"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946">slipif_process_rxqueue</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gae135be7d61e5bb49ab72476b0aa70946"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3f2f5e2fa4a816dc27a46f3ee91cf1b3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3">slipif_received_byte</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t data)</td></tr>
+<tr class="separator:ga3f2f5e2fa4a816dc27a46f3ee91cf1b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabbee48569a513c90fe154632038eb6d6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__slipif.html#gabbee48569a513c90fe154632038eb6d6">slipif_received_bytes</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t *data, u8_t len)</td></tr>
+<tr class="separator:gabbee48569a513c90fe154632038eb6d6"><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>SLIP Interface </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="accf448f9dabb0f33ef46b40355691cab"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#accf448f9dabb0f33ef46b40355691cab">&#9670;&nbsp;</a></span>SLIP_MAX_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SLIP_MAX_SIZE&#160;&#160;&#160;1500</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Maximum packet size that is received by this netif </p>
+
+</div>
+</div>
+<a id="a2a9e9ed81732a6794a9b9a712f75a1cc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2a9e9ed81732a6794a9b9a712f75a1cc">&#9670;&nbsp;</a></span>SLIP_SIO_SPEED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SLIP_SIO_SPEED</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">sio_fd</td><td>)</td>
+          <td>&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Define this to the interface speed for SNMP (sio_fd is the sio_fd_t returned by sio_open). The default value of zero means 'unknown'. </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_900e6f7ff90690cb8edb53323dd38d80.html">netif</a></li><li class="navelem"><a class="el" href="slipif_8c.html">slipif.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/slipif_8c.js b/doc/doxygen/output/html/slipif_8c.js
new file mode 100644
index 0000000..fa8dc34
--- /dev/null
+++ b/doc/doxygen/output/html/slipif_8c.js
@@ -0,0 +1,10 @@
+var slipif_8c =
+[
+    [ "SLIP_MAX_SIZE", "slipif_8c.html#accf448f9dabb0f33ef46b40355691cab", null ],
+    [ "SLIP_SIO_SPEED", "slipif_8c.html#a2a9e9ed81732a6794a9b9a712f75a1cc", null ],
+    [ "slipif_init", "group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3", null ],
+    [ "slipif_poll", "group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6", null ],
+    [ "slipif_process_rxqueue", "group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946", null ],
+    [ "slipif_received_byte", "group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3", null ],
+    [ "slipif_received_bytes", "group__slipif.html#gabbee48569a513c90fe154632038eb6d6", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/slipif_8h.html b/doc/doxygen/output/html/slipif_8h.html
new file mode 100644
index 0000000..a502500
--- /dev/null
+++ b/doc/doxygen/output/html/slipif_8h.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/netif/slipif.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('slipif_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">slipif.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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a198967c11f79cffc32192710294e8826"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="slipif_8h.html#a198967c11f79cffc32192710294e8826">SLIP_USE_RX_THREAD</a>&#160;&#160;&#160;!<a class="el" href="group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b">NO_SYS</a></td></tr>
+<tr class="separator:a198967c11f79cffc32192710294e8826"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a37ce8613535232db02bfd9ae9b51c668"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="slipif_8h.html#a37ce8613535232db02bfd9ae9b51c668">SLIP_RX_QUEUE</a>&#160;&#160;&#160;SLIP_RX_FROM_ISR</td></tr>
+<tr class="separator:a37ce8613535232db02bfd9ae9b51c668"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga687973ba82dab13a5b9d38d7399aeee3"><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__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3">slipif_init</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga687973ba82dab13a5b9d38d7399aeee3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7b036fd1cde9b299139cac62f52d15a6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6">slipif_poll</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga7b036fd1cde9b299139cac62f52d15a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae135be7d61e5bb49ab72476b0aa70946"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946">slipif_process_rxqueue</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gae135be7d61e5bb49ab72476b0aa70946"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3f2f5e2fa4a816dc27a46f3ee91cf1b3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3">slipif_received_byte</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t data)</td></tr>
+<tr class="separator:ga3f2f5e2fa4a816dc27a46f3ee91cf1b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabbee48569a513c90fe154632038eb6d6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__slipif.html#gabbee48569a513c90fe154632038eb6d6">slipif_received_bytes</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t *data, u8_t len)</td></tr>
+<tr class="separator:gabbee48569a513c90fe154632038eb6d6"><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>SLIP netif API </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a37ce8613535232db02bfd9ae9b51c668"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a37ce8613535232db02bfd9ae9b51c668">&#9670;&nbsp;</a></span>SLIP_RX_QUEUE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SLIP_RX_QUEUE&#160;&#160;&#160;SLIP_RX_FROM_ISR</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to enable functions to pass in RX bytes from ISR context. If enabled, slipif_received_byte[s]() process incoming bytes and put assembled packets on a queue, which is fed into lwIP from <a class="el" href="group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6">slipif_poll()</a>. If disabled, <a class="el" href="group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6">slipif_poll()</a> polls the serial line (using sio_tryread()). Set this to 1 (default for SLIP_RX_FROM_ISR) to queue incoming packets received by slipif_received_byte[s]() as long as PBUF_POOL pbufs are available. If disabled, packets will be dropped if more than one packet is received. </p>
+
+</div>
+</div>
+<a id="a198967c11f79cffc32192710294e8826"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a198967c11f79cffc32192710294e8826">&#9670;&nbsp;</a></span>SLIP_USE_RX_THREAD</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SLIP_USE_RX_THREAD&#160;&#160;&#160;!<a class="el" href="group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b">NO_SYS</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to start a thread that blocks reading on the serial line (using sio_read()). </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_c9a67764bf8a12cf6b427bb859cbcd0b.html">netif</a></li><li class="navelem"><a class="el" href="slipif_8h.html">slipif.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/slipif_8h.js b/doc/doxygen/output/html/slipif_8h.js
new file mode 100644
index 0000000..c6f8b6e
--- /dev/null
+++ b/doc/doxygen/output/html/slipif_8h.js
@@ -0,0 +1,10 @@
+var slipif_8h =
+[
+    [ "SLIP_RX_QUEUE", "slipif_8h.html#a37ce8613535232db02bfd9ae9b51c668", null ],
+    [ "SLIP_USE_RX_THREAD", "slipif_8h.html#a198967c11f79cffc32192710294e8826", null ],
+    [ "slipif_init", "group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3", null ],
+    [ "slipif_poll", "group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6", null ],
+    [ "slipif_process_rxqueue", "group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946", null ],
+    [ "slipif_received_byte", "group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3", null ],
+    [ "slipif_received_bytes", "group__slipif.html#gabbee48569a513c90fe154632038eb6d6", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/smtp_8c.html b/doc/doxygen/output/html/smtp_8c.html
new file mode 100644
index 0000000..211af0c
--- /dev/null
+++ b/doc/doxygen/output/html/smtp_8c.html
@@ -0,0 +1,234 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/smtp/smtp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('smtp_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">smtp.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;lwip/apps/smtp.h&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="sockets_8h.html">lwip/sockets.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="dns_8h.html">lwip/dns.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="altcp__tcp_8h.html">lwip/altcp_tcp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="altcp__tls_8h.html">lwip/altcp_tls.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &lt;stdlib.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structsmtp__session.html">smtp_session</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a19ebd0b9a82b87fd205fed0dba06649e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e">SMTP_POLL_INTERVAL</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:a19ebd0b9a82b87fd205fed0dba06649e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad853ab316a3b866b87c0454053febfe3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="smtp_8c.html#ad853ab316a3b866b87c0454053febfe3">SMTP_TIMEOUT_DATABLOCK</a>&#160;&#160;&#160;( 3 * 60 * <a class="el" href="smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e">SMTP_POLL_INTERVAL</a> / 2)</td></tr>
+<tr class="separator:ad853ab316a3b866b87c0454053febfe3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a73855e673457f748b6bcba49aab9b035"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="smtp_8c.html#a73855e673457f748b6bcba49aab9b035">SMTP_TIMEOUT_DATATERM</a>&#160;&#160;&#160;(10 * 60 * <a class="el" href="smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e">SMTP_POLL_INTERVAL</a> / 2)</td></tr>
+<tr class="separator:a73855e673457f748b6bcba49aab9b035"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6029851c4f71d98b00d6c49a17ea9ef6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="smtp_8c.html#a6029851c4f71d98b00d6c49a17ea9ef6">SMTP_TIMEOUT</a>&#160;&#160;&#160;( 2 * 60 * <a class="el" href="smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e">SMTP_POLL_INTERVAL</a> / 2)</td></tr>
+<tr class="separator:a6029851c4f71d98b00d6c49a17ea9ef6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:a04947fff2d3a3803e6c716aecc7f2bae"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="smtp_8c.html#a04947fff2d3a3803e6c716aecc7f2bae">smtp_session_state</a> </td></tr>
+<tr class="separator:a04947fff2d3a3803e6c716aecc7f2bae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga1ccf4305461ec16cf41599341ec54983"><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__smtp.html#ga1ccf4305461ec16cf41599341ec54983">smtp_set_server_addr</a> (const char *server)</td></tr>
+<tr class="separator:ga1ccf4305461ec16cf41599341ec54983"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4b0606e7ad64d8215cebbea43f08759f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f">smtp_set_server_port</a> (u16_t port)</td></tr>
+<tr class="separator:ga4b0606e7ad64d8215cebbea43f08759f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae72a8a0ec42ecae1be401978e224c39e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e">smtp_set_tls_config</a> (struct altcp_tls_config *tls_config)</td></tr>
+<tr class="separator:gae72a8a0ec42ecae1be401978e224c39e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga79567a5a75e048a6b8addb5b038fc899"><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__smtp.html#ga79567a5a75e048a6b8addb5b038fc899">smtp_set_auth</a> (const char *username, const char *pass)</td></tr>
+<tr class="separator:ga79567a5a75e048a6b8addb5b038fc899"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae43119480c4146df9eeff7ae80c767f7"><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__smtp.html#gae43119480c4146df9eeff7ae80c767f7">smtp_send_mail</a> (const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg)</td></tr>
+<tr class="separator:gae43119480c4146df9eeff7ae80c767f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga06f6582701def2a62582373bb0be5788"><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__smtp.html#ga06f6582701def2a62582373bb0be5788">smtp_send_mail_static</a> (const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg)</td></tr>
+<tr class="separator:ga06f6582701def2a62582373bb0be5788"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa9331cc8c6d73a8cd7e6e4466aca9243"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243">smtp_send_mail_int</a> (void *arg)</td></tr>
+<tr class="separator:gaa9331cc8c6d73a8cd7e6e4466aca9243"><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>SMTP client module</p>
+<p>Author: Simon Goldschmidt </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a19ebd0b9a82b87fd205fed0dba06649e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a19ebd0b9a82b87fd205fed0dba06649e">&#9670;&nbsp;</a></span>SMTP_POLL_INTERVAL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SMTP_POLL_INTERVAL&#160;&#160;&#160;4</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP poll interval. Unit is 0.5 sec. </p>
+
+</div>
+</div>
+<a id="a6029851c4f71d98b00d6c49a17ea9ef6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6029851c4f71d98b00d6c49a17ea9ef6">&#9670;&nbsp;</a></span>SMTP_TIMEOUT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SMTP_TIMEOUT&#160;&#160;&#160;( 2 * 60 * <a class="el" href="smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e">SMTP_POLL_INTERVAL</a> / 2)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP poll timeout while not sending the body. This is somewhat lower than the RFC states (5 minutes for initial, MAIL and RCPT) but still OK for us here. 2 minutes </p>
+
+</div>
+</div>
+<a id="ad853ab316a3b866b87c0454053febfe3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad853ab316a3b866b87c0454053febfe3">&#9670;&nbsp;</a></span>SMTP_TIMEOUT_DATABLOCK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SMTP_TIMEOUT_DATABLOCK&#160;&#160;&#160;( 3 * 60 * <a class="el" href="smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e">SMTP_POLL_INTERVAL</a> / 2)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP poll timeout while sending message body, reset after every successful write. 3 minutes </p>
+
+</div>
+</div>
+<a id="a73855e673457f748b6bcba49aab9b035"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a73855e673457f748b6bcba49aab9b035">&#9670;&nbsp;</a></span>SMTP_TIMEOUT_DATATERM</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SMTP_TIMEOUT_DATATERM&#160;&#160;&#160;(10 * 60 * <a class="el" href="smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e">SMTP_POLL_INTERVAL</a> / 2)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP poll timeout while waiting for confirmation after sending the body. 10 minutes </p>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="a04947fff2d3a3803e6c716aecc7f2bae"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a04947fff2d3a3803e6c716aecc7f2bae">&#9670;&nbsp;</a></span>smtp_session_state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="smtp_8c.html#a04947fff2d3a3803e6c716aecc7f2bae">smtp_session_state</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>State for SMTP client state machine </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_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_149963277126306875d8bfe8322084f3.html">smtp</a></li><li class="navelem"><a class="el" href="smtp_8c.html">smtp.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/smtp_8c.js b/doc/doxygen/output/html/smtp_8c.js
new file mode 100644
index 0000000..e88b388
--- /dev/null
+++ b/doc/doxygen/output/html/smtp_8c.js
@@ -0,0 +1,16 @@
+var smtp_8c =
+[
+    [ "smtp_session", "structsmtp__session.html", "structsmtp__session" ],
+    [ "SMTP_POLL_INTERVAL", "smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e", null ],
+    [ "SMTP_TIMEOUT", "smtp_8c.html#a6029851c4f71d98b00d6c49a17ea9ef6", null ],
+    [ "SMTP_TIMEOUT_DATABLOCK", "smtp_8c.html#ad853ab316a3b866b87c0454053febfe3", null ],
+    [ "SMTP_TIMEOUT_DATATERM", "smtp_8c.html#a73855e673457f748b6bcba49aab9b035", null ],
+    [ "smtp_session_state", "smtp_8c.html#a04947fff2d3a3803e6c716aecc7f2bae", null ],
+    [ "smtp_send_mail", "group__smtp.html#gae43119480c4146df9eeff7ae80c767f7", null ],
+    [ "smtp_send_mail_int", "group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243", null ],
+    [ "smtp_send_mail_static", "group__smtp.html#ga06f6582701def2a62582373bb0be5788", null ],
+    [ "smtp_set_auth", "group__smtp.html#ga79567a5a75e048a6b8addb5b038fc899", null ],
+    [ "smtp_set_server_addr", "group__smtp.html#ga1ccf4305461ec16cf41599341ec54983", null ],
+    [ "smtp_set_server_port", "group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f", null ],
+    [ "smtp_set_tls_config", "group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmp_8h.html b/doc/doxygen/output/html/snmp_8h.html
new file mode 100644
index 0000000..a69a607
--- /dev/null
+++ b/doc/doxygen/output/html/snmp_8h.html
@@ -0,0 +1,144 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/snmp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#enum-members">Enumerations</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp.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="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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:abe6b270482ca9af07c029f3136d8ec9c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp_8h.html#abe6b270482ca9af07c029f3136d8ec9c">MIB2_COPY_SYSUPTIME_TO</a>(ptrToVal)&#160;&#160;&#160;(*(ptrToVal) = (<a class="el" href="group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199">sys_now</a>() / 10))</td></tr>
+<tr class="separator:abe6b270482ca9af07c029f3136d8ec9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3c52caf566d37705c6547f2d025afd9f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f">MIB2_STATS_NETIF_INC</a>(n,  x)&#160;&#160;&#160;do { ++(n)-&gt;mib2_counters.x; } while(0)</td></tr>
+<tr class="separator:ga3c52caf566d37705c6547f2d025afd9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga05641438775014b7e13b9e55eba48bed"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__mib2.html#ga05641438775014b7e13b9e55eba48bed">MIB2_STATS_NETIF_ADD</a>(n,  x,  val)&#160;&#160;&#160;do { (n)-&gt;mib2_counters.x += (val); } while(0)</td></tr>
+<tr class="separator:ga05641438775014b7e13b9e55eba48bed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5be1b8cba1d67bf6e7f8851ec91b10f0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__mib2.html#ga5be1b8cba1d67bf6e7f8851ec91b10f0">MIB2_INIT_NETIF</a>(<a class="el" href="structnetif.html">netif</a>,  type,  speed)</td></tr>
+<tr class="separator:ga5be1b8cba1d67bf6e7f8851ec91b10f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga15378b8dcd2a9dc2985142d864a767ba"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif__mib2.html#ga15378b8dcd2a9dc2985142d864a767ba">snmp_ifType</a> </td></tr>
+<tr class="separator:ga15378b8dcd2a9dc2985142d864a767ba"><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 support API for implementing netifs and statitics for MIB2 </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="abe6b270482ca9af07c029f3136d8ec9c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abe6b270482ca9af07c029f3136d8ec9c">&#9670;&nbsp;</a></span>MIB2_COPY_SYSUPTIME_TO</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MIB2_COPY_SYSUPTIME_TO</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ptrToVal</td><td>)</td>
+          <td>&#160;&#160;&#160;(*(ptrToVal) = (<a class="el" href="group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199">sys_now</a>() / 10))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This macro has a precision of ~49 days because sys_now returns u32_t. #define your own if you want ~490 days. </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="snmp_8h.html">snmp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp_8h.js b/doc/doxygen/output/html/snmp_8h.js
new file mode 100644
index 0000000..35a6c87
--- /dev/null
+++ b/doc/doxygen/output/html/snmp_8h.js
@@ -0,0 +1,8 @@
+var snmp_8h =
+[
+    [ "MIB2_COPY_SYSUPTIME_TO", "snmp_8h.html#abe6b270482ca9af07c029f3136d8ec9c", null ],
+    [ "MIB2_INIT_NETIF", "group__netif__mib2.html#ga5be1b8cba1d67bf6e7f8851ec91b10f0", null ],
+    [ "MIB2_STATS_NETIF_ADD", "group__netif__mib2.html#ga05641438775014b7e13b9e55eba48bed", null ],
+    [ "MIB2_STATS_NETIF_INC", "group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f", null ],
+    [ "snmp_ifType", "group__netif__mib2.html#ga15378b8dcd2a9dc2985142d864a767ba", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmp__asn1_8c.html b/doc/doxygen/output/html/snmp__asn1_8c.html
new file mode 100644
index 0000000..2d5b6e3
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__asn1_8c.html
@@ -0,0 +1,750 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_asn1.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__asn1_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_asn1.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__asn1_8h.html">snmp_asn1.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af8e905a214936995d235789f359cf015"><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="snmp__asn1_8c.html#af8e905a214936995d235789f359cf015">snmp_ans1_enc_tlv</a> (struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv)</td></tr>
+<tr class="separator:af8e905a214936995d235789f359cf015"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a167b707051bbbeafea14eeca72449ac6"><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="snmp__asn1_8c.html#a167b707051bbbeafea14eeca72449ac6">snmp_asn1_enc_raw</a> (struct snmp_pbuf_stream *pbuf_stream, const u8_t *raw, u16_t raw_len)</td></tr>
+<tr class="separator:a167b707051bbbeafea14eeca72449ac6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa54b4ee3c58ef66721df96fd8b1f66b2"><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="snmp__asn1_8c.html#aa54b4ee3c58ef66721df96fd8b1f66b2">snmp_asn1_enc_u32t</a> (struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u32_t value)</td></tr>
+<tr class="separator:aa54b4ee3c58ef66721df96fd8b1f66b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25b3fe21becd08260ec56bef9299d3c6"><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="snmp__asn1_8c.html#a25b3fe21becd08260ec56bef9299d3c6">snmp_asn1_enc_s32t</a> (struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, s32_t value)</td></tr>
+<tr class="separator:a25b3fe21becd08260ec56bef9299d3c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa71260abd46fc2f682874016896fe218"><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="snmp__asn1_8c.html#aa71260abd46fc2f682874016896fe218">snmp_asn1_enc_oid</a> (struct snmp_pbuf_stream *pbuf_stream, const u32_t *oid, u16_t oid_len)</td></tr>
+<tr class="separator:aa71260abd46fc2f682874016896fe218"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a20343aef4524459a2b45704e18ef520d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__asn1_8c.html#a20343aef4524459a2b45704e18ef520d">snmp_asn1_enc_length_cnt</a> (u16_t length, u8_t *octets_needed)</td></tr>
+<tr class="separator:a20343aef4524459a2b45704e18ef520d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a58965e0305884d550786440c84119ad4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__asn1_8c.html#a58965e0305884d550786440c84119ad4">snmp_asn1_enc_u32t_cnt</a> (u32_t value, u16_t *octets_needed)</td></tr>
+<tr class="separator:a58965e0305884d550786440c84119ad4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8c74914532f1e0c219dfb1977fd0c22f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__asn1_8c.html#a8c74914532f1e0c219dfb1977fd0c22f">snmp_asn1_enc_s32t_cnt</a> (s32_t value, u16_t *octets_needed)</td></tr>
+<tr class="separator:a8c74914532f1e0c219dfb1977fd0c22f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab6fd58c1b41cb98117f00a11db7d226f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__asn1_8c.html#ab6fd58c1b41cb98117f00a11db7d226f">snmp_asn1_enc_oid_cnt</a> (const u32_t *oid, u16_t oid_len, u16_t *octets_needed)</td></tr>
+<tr class="separator:ab6fd58c1b41cb98117f00a11db7d226f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e3f63b155b06f7ade627060b55e4496"><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="snmp__asn1_8c.html#a7e3f63b155b06f7ade627060b55e4496">snmp_asn1_dec_tlv</a> (struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv)</td></tr>
+<tr class="separator:a7e3f63b155b06f7ade627060b55e4496"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac04e08c19c40cfc3333a181018887a51"><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="snmp__asn1_8c.html#ac04e08c19c40cfc3333a181018887a51">snmp_asn1_dec_u32t</a> (struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value)</td></tr>
+<tr class="separator:ac04e08c19c40cfc3333a181018887a51"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a51d36daf2935c246eb55fb749581e2bb"><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="snmp__asn1_8c.html#a51d36daf2935c246eb55fb749581e2bb">snmp_asn1_dec_s32t</a> (struct snmp_pbuf_stream *pbuf_stream, u16_t len, s32_t *value)</td></tr>
+<tr class="separator:a51d36daf2935c246eb55fb749581e2bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8bb84ec51c46a890b7ced016043b2908"><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="snmp__asn1_8c.html#a8bb84ec51c46a890b7ced016043b2908">snmp_asn1_dec_oid</a> (struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *oid, u8_t *oid_len, u8_t oid_max_len)</td></tr>
+<tr class="separator:a8bb84ec51c46a890b7ced016043b2908"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a31055a35285214ea0d4ad60c64c2f73e"><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="snmp__asn1_8c.html#a31055a35285214ea0d4ad60c64c2f73e">snmp_asn1_dec_raw</a> (struct snmp_pbuf_stream *pbuf_stream, u16_t len, u8_t *buf, u16_t *buf_len, u16_t buf_max_len)</td></tr>
+<tr class="separator:a31055a35285214ea0d4ad60c64c2f73e"><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>Abstract Syntax Notation One (ISO 8824, 8825) encoding</p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="af8e905a214936995d235789f359cf015"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af8e905a214936995d235789f359cf015">&#9670;&nbsp;</a></span>snmp_ans1_enc_tlv()</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_ans1_enc_tlv </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct snmp_asn1_tlv *&#160;</td>
+          <td class="paramname"><em>tlv</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Encodes a TLV into a pbuf stream.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">tlv</td><td>TLV to encode </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) encode </dd></dl>
+
+</div>
+</div>
+<a id="a8bb84ec51c46a890b7ced016043b2908"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8bb84ec51c46a890b7ced016043b2908">&#9670;&nbsp;</a></span>snmp_asn1_dec_oid()</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_asn1_dec_oid </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t *&#160;</td>
+          <td class="paramname"><em>oid_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_max_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Decodes object identifier from incoming message into array of u32_t.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">len</td><td>length of the coded object identifier </td></tr>
+    <tr><td class="paramname">oid</td><td>return decoded object identifier </td></tr>
+    <tr><td class="paramname">oid_len</td><td>return decoded object identifier length </td></tr>
+    <tr><td class="paramname">oid_max_len</td><td>size of oid buffer </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) decode </dd></dl>
+
+</div>
+</div>
+<a id="a31055a35285214ea0d4ad60c64c2f73e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a31055a35285214ea0d4ad60c64c2f73e">&#9670;&nbsp;</a></span>snmp_asn1_dec_raw()</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_asn1_dec_raw </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>buf_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>buf_max_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Decodes (copies) raw data (ip-addresses, octet strings, opaque encoding) from incoming message into array.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">len</td><td>length of the coded raw data (zero is valid, e.g. empty string!) </td></tr>
+    <tr><td class="paramname">buf</td><td>return raw bytes </td></tr>
+    <tr><td class="paramname">buf_len</td><td>returns length of the raw return value </td></tr>
+    <tr><td class="paramname">buf_max_len</td><td>buffer size </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) decode </dd></dl>
+
+</div>
+</div>
+<a id="a51d36daf2935c246eb55fb749581e2bb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a51d36daf2935c246eb55fb749581e2bb">&#9670;&nbsp;</a></span>snmp_asn1_dec_s32t()</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_asn1_dec_s32t </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s32_t *&#160;</td>
+          <td class="paramname"><em>value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Decodes integer into s32_t.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">len</td><td>length of the coded integer field </td></tr>
+    <tr><td class="paramname">value</td><td>return host order integer </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) decode</dd></dl>
+<dl class="section note"><dt>Note</dt><dd>ASN coded integers are <em>always</em> signed! </dd></dl>
+
+</div>
+</div>
+<a id="a7e3f63b155b06f7ade627060b55e4496"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7e3f63b155b06f7ade627060b55e4496">&#9670;&nbsp;</a></span>snmp_asn1_dec_tlv()</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_asn1_dec_tlv </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct snmp_asn1_tlv *&#160;</td>
+          <td class="paramname"><em>tlv</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Decodes a TLV from a pbuf stream.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">tlv</td><td>returns decoded TLV </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_VAL if we can't decode </dd></dl>
+
+</div>
+</div>
+<a id="ac04e08c19c40cfc3333a181018887a51"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac04e08c19c40cfc3333a181018887a51">&#9670;&nbsp;</a></span>snmp_asn1_dec_u32t()</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_asn1_dec_u32t </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t *&#160;</td>
+          <td class="paramname"><em>value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Decodes positive integer (counter, gauge, timeticks) into u32_t.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">len</td><td>length of the coded integer field </td></tr>
+    <tr><td class="paramname">value</td><td>return host order integer </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) decode</dd></dl>
+<dl class="section note"><dt>Note</dt><dd>ASN coded integers are <em>always</em> signed. E.g. +0xFFFF is coded as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!! </dd></dl>
+
+</div>
+</div>
+<a id="a20343aef4524459a2b45704e18ef520d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a20343aef4524459a2b45704e18ef520d">&#9670;&nbsp;</a></span>snmp_asn1_enc_length_cnt()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_asn1_enc_length_cnt </td>
+          <td>(</td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>length</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t *&#160;</td>
+          <td class="paramname"><em>octets_needed</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns octet count for length.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">length</td><td>parameter length </td></tr>
+    <tr><td class="paramname">octets_needed</td><td>points to the return value </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aa71260abd46fc2f682874016896fe218"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa71260abd46fc2f682874016896fe218">&#9670;&nbsp;</a></span>snmp_asn1_enc_oid()</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_asn1_enc_oid </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Encodes object identifier into a pbuf chained ASN1 msg.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">oid</td><td>points to object identifier array </td></tr>
+    <tr><td class="paramname">oid_len</td><td>object identifier array length </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) encode </dd></dl>
+
+</div>
+</div>
+<a id="ab6fd58c1b41cb98117f00a11db7d226f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab6fd58c1b41cb98117f00a11db7d226f">&#9670;&nbsp;</a></span>snmp_asn1_enc_oid_cnt()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_asn1_enc_oid_cnt </td>
+          <td>(</td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>octets_needed</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns octet count for an object identifier.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">oid</td><td>points to object identifier array </td></tr>
+    <tr><td class="paramname">oid_len</td><td>object identifier array length </td></tr>
+    <tr><td class="paramname">octets_needed</td><td>points to the return value </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a167b707051bbbeafea14eeca72449ac6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a167b707051bbbeafea14eeca72449ac6">&#9670;&nbsp;</a></span>snmp_asn1_enc_raw()</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_asn1_enc_raw </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>raw</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>raw_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Encodes raw data (octet string, opaque) into a pbuf chained ASN1 msg.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">raw_len</td><td>raw data length </td></tr>
+    <tr><td class="paramname">raw</td><td>points raw data </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) encode </dd></dl>
+
+</div>
+</div>
+<a id="a25b3fe21becd08260ec56bef9299d3c6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a25b3fe21becd08260ec56bef9299d3c6">&#9670;&nbsp;</a></span>snmp_asn1_enc_s32t()</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_asn1_enc_s32t </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>octets_needed</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s32_t&#160;</td>
+          <td class="paramname"><em>value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Encodes s32_t integer into a pbuf chained ASN1 msg.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">octets_needed</td><td>encoding length (from <a class="el" href="snmp__asn1_8c.html#a8c74914532f1e0c219dfb1977fd0c22f">snmp_asn1_enc_s32t_cnt()</a>) </td></tr>
+    <tr><td class="paramname">value</td><td>is the host order s32_t value to be encoded </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) encode</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="snmp__asn1_8c.html#a8c74914532f1e0c219dfb1977fd0c22f">snmp_asn1_enc_s32t_cnt()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a8c74914532f1e0c219dfb1977fd0c22f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8c74914532f1e0c219dfb1977fd0c22f">&#9670;&nbsp;</a></span>snmp_asn1_enc_s32t_cnt()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_asn1_enc_s32t_cnt </td>
+          <td>(</td>
+          <td class="paramtype">s32_t&#160;</td>
+          <td class="paramname"><em>value</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>octets_needed</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns octet count for an s32_t.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">value</td><td>value to be encoded </td></tr>
+    <tr><td class="paramname">octets_needed</td><td>points to the return value</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>ASN coded integers are <em>always</em> signed. </dd></dl>
+
+</div>
+</div>
+<a id="aa54b4ee3c58ef66721df96fd8b1f66b2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa54b4ee3c58ef66721df96fd8b1f66b2">&#9670;&nbsp;</a></span>snmp_asn1_enc_u32t()</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_asn1_enc_u32t </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>octets_needed</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Encodes u32_t (counter, gauge, timeticks) into a pbuf chained ASN1 msg.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">octets_needed</td><td>encoding length (from <a class="el" href="snmp__asn1_8c.html#a58965e0305884d550786440c84119ad4">snmp_asn1_enc_u32t_cnt()</a>) </td></tr>
+    <tr><td class="paramname">value</td><td>is the host order u32_t value to be encoded </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) encode</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="snmp__asn1_8c.html#a58965e0305884d550786440c84119ad4">snmp_asn1_enc_u32t_cnt()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a58965e0305884d550786440c84119ad4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a58965e0305884d550786440c84119ad4">&#9670;&nbsp;</a></span>snmp_asn1_enc_u32t_cnt()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_asn1_enc_u32t_cnt </td>
+          <td>(</td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>value</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>octets_needed</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns octet count for an u32_t.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">value</td><td>value to be encoded </td></tr>
+    <tr><td class="paramname">octets_needed</td><td>points to the return value</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>ASN coded integers are <em>always</em> signed. E.g. +0xFFFF is coded as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!! </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__asn1_8c.html">snmp_asn1.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__asn1_8c.js b/doc/doxygen/output/html/snmp__asn1_8c.js
new file mode 100644
index 0000000..520692e
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__asn1_8c.js
@@ -0,0 +1,17 @@
+var snmp__asn1_8c =
+[
+    [ "snmp_ans1_enc_tlv", "snmp__asn1_8c.html#af8e905a214936995d235789f359cf015", null ],
+    [ "snmp_asn1_dec_oid", "snmp__asn1_8c.html#a8bb84ec51c46a890b7ced016043b2908", null ],
+    [ "snmp_asn1_dec_raw", "snmp__asn1_8c.html#a31055a35285214ea0d4ad60c64c2f73e", null ],
+    [ "snmp_asn1_dec_s32t", "snmp__asn1_8c.html#a51d36daf2935c246eb55fb749581e2bb", null ],
+    [ "snmp_asn1_dec_tlv", "snmp__asn1_8c.html#a7e3f63b155b06f7ade627060b55e4496", null ],
+    [ "snmp_asn1_dec_u32t", "snmp__asn1_8c.html#ac04e08c19c40cfc3333a181018887a51", null ],
+    [ "snmp_asn1_enc_length_cnt", "snmp__asn1_8c.html#a20343aef4524459a2b45704e18ef520d", null ],
+    [ "snmp_asn1_enc_oid", "snmp__asn1_8c.html#aa71260abd46fc2f682874016896fe218", null ],
+    [ "snmp_asn1_enc_oid_cnt", "snmp__asn1_8c.html#ab6fd58c1b41cb98117f00a11db7d226f", null ],
+    [ "snmp_asn1_enc_raw", "snmp__asn1_8c.html#a167b707051bbbeafea14eeca72449ac6", null ],
+    [ "snmp_asn1_enc_s32t", "snmp__asn1_8c.html#a25b3fe21becd08260ec56bef9299d3c6", null ],
+    [ "snmp_asn1_enc_s32t_cnt", "snmp__asn1_8c.html#a8c74914532f1e0c219dfb1977fd0c22f", null ],
+    [ "snmp_asn1_enc_u32t", "snmp__asn1_8c.html#aa54b4ee3c58ef66721df96fd8b1f66b2", null ],
+    [ "snmp_asn1_enc_u32t_cnt", "snmp__asn1_8c.html#a58965e0305884d550786440c84119ad4", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmp__asn1_8h.html b/doc/doxygen/output/html/snmp__asn1_8h.html
new file mode 100644
index 0000000..6acc16c
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__asn1_8h.html
@@ -0,0 +1,752 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_asn1.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__asn1_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_asn1.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_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="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__pbuf__stream_8h.html">snmp_pbuf_stream.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a7e3f63b155b06f7ade627060b55e4496"><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="snmp__asn1_8h.html#a7e3f63b155b06f7ade627060b55e4496">snmp_asn1_dec_tlv</a> (struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv)</td></tr>
+<tr class="separator:a7e3f63b155b06f7ade627060b55e4496"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac04e08c19c40cfc3333a181018887a51"><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="snmp__asn1_8h.html#ac04e08c19c40cfc3333a181018887a51">snmp_asn1_dec_u32t</a> (struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value)</td></tr>
+<tr class="separator:ac04e08c19c40cfc3333a181018887a51"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a51d36daf2935c246eb55fb749581e2bb"><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="snmp__asn1_8h.html#a51d36daf2935c246eb55fb749581e2bb">snmp_asn1_dec_s32t</a> (struct snmp_pbuf_stream *pbuf_stream, u16_t len, s32_t *value)</td></tr>
+<tr class="separator:a51d36daf2935c246eb55fb749581e2bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8bb84ec51c46a890b7ced016043b2908"><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="snmp__asn1_8h.html#a8bb84ec51c46a890b7ced016043b2908">snmp_asn1_dec_oid</a> (struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *oid, u8_t *oid_len, u8_t oid_max_len)</td></tr>
+<tr class="separator:a8bb84ec51c46a890b7ced016043b2908"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a31055a35285214ea0d4ad60c64c2f73e"><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="snmp__asn1_8h.html#a31055a35285214ea0d4ad60c64c2f73e">snmp_asn1_dec_raw</a> (struct snmp_pbuf_stream *pbuf_stream, u16_t len, u8_t *buf, u16_t *buf_len, u16_t buf_max_len)</td></tr>
+<tr class="separator:a31055a35285214ea0d4ad60c64c2f73e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af8e905a214936995d235789f359cf015"><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="snmp__asn1_8h.html#af8e905a214936995d235789f359cf015">snmp_ans1_enc_tlv</a> (struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv)</td></tr>
+<tr class="separator:af8e905a214936995d235789f359cf015"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a20343aef4524459a2b45704e18ef520d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__asn1_8h.html#a20343aef4524459a2b45704e18ef520d">snmp_asn1_enc_length_cnt</a> (u16_t length, u8_t *octets_needed)</td></tr>
+<tr class="separator:a20343aef4524459a2b45704e18ef520d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a58965e0305884d550786440c84119ad4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__asn1_8h.html#a58965e0305884d550786440c84119ad4">snmp_asn1_enc_u32t_cnt</a> (u32_t value, u16_t *octets_needed)</td></tr>
+<tr class="separator:a58965e0305884d550786440c84119ad4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8c74914532f1e0c219dfb1977fd0c22f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__asn1_8h.html#a8c74914532f1e0c219dfb1977fd0c22f">snmp_asn1_enc_s32t_cnt</a> (s32_t value, u16_t *octets_needed)</td></tr>
+<tr class="separator:a8c74914532f1e0c219dfb1977fd0c22f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab6fd58c1b41cb98117f00a11db7d226f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__asn1_8h.html#ab6fd58c1b41cb98117f00a11db7d226f">snmp_asn1_enc_oid_cnt</a> (const u32_t *oid, u16_t oid_len, u16_t *octets_needed)</td></tr>
+<tr class="separator:ab6fd58c1b41cb98117f00a11db7d226f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa71260abd46fc2f682874016896fe218"><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="snmp__asn1_8h.html#aa71260abd46fc2f682874016896fe218">snmp_asn1_enc_oid</a> (struct snmp_pbuf_stream *pbuf_stream, const u32_t *oid, u16_t oid_len)</td></tr>
+<tr class="separator:aa71260abd46fc2f682874016896fe218"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25b3fe21becd08260ec56bef9299d3c6"><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="snmp__asn1_8h.html#a25b3fe21becd08260ec56bef9299d3c6">snmp_asn1_enc_s32t</a> (struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, s32_t value)</td></tr>
+<tr class="separator:a25b3fe21becd08260ec56bef9299d3c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa54b4ee3c58ef66721df96fd8b1f66b2"><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="snmp__asn1_8h.html#aa54b4ee3c58ef66721df96fd8b1f66b2">snmp_asn1_enc_u32t</a> (struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u32_t value)</td></tr>
+<tr class="separator:aa54b4ee3c58ef66721df96fd8b1f66b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a167b707051bbbeafea14eeca72449ac6"><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="snmp__asn1_8h.html#a167b707051bbbeafea14eeca72449ac6">snmp_asn1_enc_raw</a> (struct snmp_pbuf_stream *pbuf_stream, const u8_t *raw, u16_t raw_len)</td></tr>
+<tr class="separator:a167b707051bbbeafea14eeca72449ac6"><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>Abstract Syntax Notation One (ISO 8824, 8825) codec. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="af8e905a214936995d235789f359cf015"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af8e905a214936995d235789f359cf015">&#9670;&nbsp;</a></span>snmp_ans1_enc_tlv()</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_ans1_enc_tlv </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct snmp_asn1_tlv *&#160;</td>
+          <td class="paramname"><em>tlv</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Encodes a TLV into a pbuf stream.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">tlv</td><td>TLV to encode </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) encode </dd></dl>
+
+</div>
+</div>
+<a id="a8bb84ec51c46a890b7ced016043b2908"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8bb84ec51c46a890b7ced016043b2908">&#9670;&nbsp;</a></span>snmp_asn1_dec_oid()</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_asn1_dec_oid </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t *&#160;</td>
+          <td class="paramname"><em>oid_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_max_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Decodes object identifier from incoming message into array of u32_t.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">len</td><td>length of the coded object identifier </td></tr>
+    <tr><td class="paramname">oid</td><td>return decoded object identifier </td></tr>
+    <tr><td class="paramname">oid_len</td><td>return decoded object identifier length </td></tr>
+    <tr><td class="paramname">oid_max_len</td><td>size of oid buffer </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) decode </dd></dl>
+
+</div>
+</div>
+<a id="a31055a35285214ea0d4ad60c64c2f73e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a31055a35285214ea0d4ad60c64c2f73e">&#9670;&nbsp;</a></span>snmp_asn1_dec_raw()</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_asn1_dec_raw </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>buf_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>buf_max_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Decodes (copies) raw data (ip-addresses, octet strings, opaque encoding) from incoming message into array.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">len</td><td>length of the coded raw data (zero is valid, e.g. empty string!) </td></tr>
+    <tr><td class="paramname">buf</td><td>return raw bytes </td></tr>
+    <tr><td class="paramname">buf_len</td><td>returns length of the raw return value </td></tr>
+    <tr><td class="paramname">buf_max_len</td><td>buffer size </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) decode </dd></dl>
+
+</div>
+</div>
+<a id="a51d36daf2935c246eb55fb749581e2bb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a51d36daf2935c246eb55fb749581e2bb">&#9670;&nbsp;</a></span>snmp_asn1_dec_s32t()</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_asn1_dec_s32t </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s32_t *&#160;</td>
+          <td class="paramname"><em>value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Decodes integer into s32_t.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">len</td><td>length of the coded integer field </td></tr>
+    <tr><td class="paramname">value</td><td>return host order integer </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) decode</dd></dl>
+<dl class="section note"><dt>Note</dt><dd>ASN coded integers are <em>always</em> signed! </dd></dl>
+
+</div>
+</div>
+<a id="a7e3f63b155b06f7ade627060b55e4496"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7e3f63b155b06f7ade627060b55e4496">&#9670;&nbsp;</a></span>snmp_asn1_dec_tlv()</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_asn1_dec_tlv </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct snmp_asn1_tlv *&#160;</td>
+          <td class="paramname"><em>tlv</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Decodes a TLV from a pbuf stream.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">tlv</td><td>returns decoded TLV </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_VAL if we can't decode </dd></dl>
+
+</div>
+</div>
+<a id="ac04e08c19c40cfc3333a181018887a51"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac04e08c19c40cfc3333a181018887a51">&#9670;&nbsp;</a></span>snmp_asn1_dec_u32t()</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_asn1_dec_u32t </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t *&#160;</td>
+          <td class="paramname"><em>value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Decodes positive integer (counter, gauge, timeticks) into u32_t.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">len</td><td>length of the coded integer field </td></tr>
+    <tr><td class="paramname">value</td><td>return host order integer </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) decode</dd></dl>
+<dl class="section note"><dt>Note</dt><dd>ASN coded integers are <em>always</em> signed. E.g. +0xFFFF is coded as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!! </dd></dl>
+
+</div>
+</div>
+<a id="a20343aef4524459a2b45704e18ef520d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a20343aef4524459a2b45704e18ef520d">&#9670;&nbsp;</a></span>snmp_asn1_enc_length_cnt()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_asn1_enc_length_cnt </td>
+          <td>(</td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>length</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t *&#160;</td>
+          <td class="paramname"><em>octets_needed</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns octet count for length.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">length</td><td>parameter length </td></tr>
+    <tr><td class="paramname">octets_needed</td><td>points to the return value </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aa71260abd46fc2f682874016896fe218"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa71260abd46fc2f682874016896fe218">&#9670;&nbsp;</a></span>snmp_asn1_enc_oid()</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_asn1_enc_oid </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Encodes object identifier into a pbuf chained ASN1 msg.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">oid</td><td>points to object identifier array </td></tr>
+    <tr><td class="paramname">oid_len</td><td>object identifier array length </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) encode </dd></dl>
+
+</div>
+</div>
+<a id="ab6fd58c1b41cb98117f00a11db7d226f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab6fd58c1b41cb98117f00a11db7d226f">&#9670;&nbsp;</a></span>snmp_asn1_enc_oid_cnt()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_asn1_enc_oid_cnt </td>
+          <td>(</td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>octets_needed</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns octet count for an object identifier.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">oid</td><td>points to object identifier array </td></tr>
+    <tr><td class="paramname">oid_len</td><td>object identifier array length </td></tr>
+    <tr><td class="paramname">octets_needed</td><td>points to the return value </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a167b707051bbbeafea14eeca72449ac6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a167b707051bbbeafea14eeca72449ac6">&#9670;&nbsp;</a></span>snmp_asn1_enc_raw()</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_asn1_enc_raw </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>raw</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>raw_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Encodes raw data (octet string, opaque) into a pbuf chained ASN1 msg.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">raw_len</td><td>raw data length </td></tr>
+    <tr><td class="paramname">raw</td><td>points raw data </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) encode </dd></dl>
+
+</div>
+</div>
+<a id="a25b3fe21becd08260ec56bef9299d3c6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a25b3fe21becd08260ec56bef9299d3c6">&#9670;&nbsp;</a></span>snmp_asn1_enc_s32t()</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_asn1_enc_s32t </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>octets_needed</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s32_t&#160;</td>
+          <td class="paramname"><em>value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Encodes s32_t integer into a pbuf chained ASN1 msg.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">octets_needed</td><td>encoding length (from <a class="el" href="snmp__asn1_8c.html#a8c74914532f1e0c219dfb1977fd0c22f">snmp_asn1_enc_s32t_cnt()</a>) </td></tr>
+    <tr><td class="paramname">value</td><td>is the host order s32_t value to be encoded </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) encode</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="snmp__asn1_8c.html#a8c74914532f1e0c219dfb1977fd0c22f">snmp_asn1_enc_s32t_cnt()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a8c74914532f1e0c219dfb1977fd0c22f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8c74914532f1e0c219dfb1977fd0c22f">&#9670;&nbsp;</a></span>snmp_asn1_enc_s32t_cnt()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_asn1_enc_s32t_cnt </td>
+          <td>(</td>
+          <td class="paramtype">s32_t&#160;</td>
+          <td class="paramname"><em>value</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>octets_needed</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns octet count for an s32_t.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">value</td><td>value to be encoded </td></tr>
+    <tr><td class="paramname">octets_needed</td><td>points to the return value</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>ASN coded integers are <em>always</em> signed. </dd></dl>
+
+</div>
+</div>
+<a id="aa54b4ee3c58ef66721df96fd8b1f66b2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa54b4ee3c58ef66721df96fd8b1f66b2">&#9670;&nbsp;</a></span>snmp_asn1_enc_u32t()</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_asn1_enc_u32t </td>
+          <td>(</td>
+          <td class="paramtype">struct snmp_pbuf_stream *&#160;</td>
+          <td class="paramname"><em>pbuf_stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>octets_needed</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Encodes u32_t (counter, gauge, timeticks) into a pbuf chained ASN1 msg.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf_stream</td><td>points to a pbuf stream </td></tr>
+    <tr><td class="paramname">octets_needed</td><td>encoding length (from <a class="el" href="snmp__asn1_8c.html#a58965e0305884d550786440c84119ad4">snmp_asn1_enc_u32t_cnt()</a>) </td></tr>
+    <tr><td class="paramname">value</td><td>is the host order u32_t value to be encoded </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if we can't (or won't) encode</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="snmp__asn1_8c.html#a58965e0305884d550786440c84119ad4">snmp_asn1_enc_u32t_cnt()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a58965e0305884d550786440c84119ad4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a58965e0305884d550786440c84119ad4">&#9670;&nbsp;</a></span>snmp_asn1_enc_u32t_cnt()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_asn1_enc_u32t_cnt </td>
+          <td>(</td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>value</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>octets_needed</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns octet count for an u32_t.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">value</td><td>value to be encoded </td></tr>
+    <tr><td class="paramname">octets_needed</td><td>points to the return value</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>ASN coded integers are <em>always</em> signed. E.g. +0xFFFF is coded as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!! </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__asn1_8h.html">snmp_asn1.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__asn1_8h.js b/doc/doxygen/output/html/snmp__asn1_8h.js
new file mode 100644
index 0000000..169ce98
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__asn1_8h.js
@@ -0,0 +1,17 @@
+var snmp__asn1_8h =
+[
+    [ "snmp_ans1_enc_tlv", "snmp__asn1_8h.html#af8e905a214936995d235789f359cf015", null ],
+    [ "snmp_asn1_dec_oid", "snmp__asn1_8h.html#a8bb84ec51c46a890b7ced016043b2908", null ],
+    [ "snmp_asn1_dec_raw", "snmp__asn1_8h.html#a31055a35285214ea0d4ad60c64c2f73e", null ],
+    [ "snmp_asn1_dec_s32t", "snmp__asn1_8h.html#a51d36daf2935c246eb55fb749581e2bb", null ],
+    [ "snmp_asn1_dec_tlv", "snmp__asn1_8h.html#a7e3f63b155b06f7ade627060b55e4496", null ],
+    [ "snmp_asn1_dec_u32t", "snmp__asn1_8h.html#ac04e08c19c40cfc3333a181018887a51", null ],
+    [ "snmp_asn1_enc_length_cnt", "snmp__asn1_8h.html#a20343aef4524459a2b45704e18ef520d", null ],
+    [ "snmp_asn1_enc_oid", "snmp__asn1_8h.html#aa71260abd46fc2f682874016896fe218", null ],
+    [ "snmp_asn1_enc_oid_cnt", "snmp__asn1_8h.html#ab6fd58c1b41cb98117f00a11db7d226f", null ],
+    [ "snmp_asn1_enc_raw", "snmp__asn1_8h.html#a167b707051bbbeafea14eeca72449ac6", null ],
+    [ "snmp_asn1_enc_s32t", "snmp__asn1_8h.html#a25b3fe21becd08260ec56bef9299d3c6", null ],
+    [ "snmp_asn1_enc_s32t_cnt", "snmp__asn1_8h.html#a8c74914532f1e0c219dfb1977fd0c22f", null ],
+    [ "snmp_asn1_enc_u32t", "snmp__asn1_8h.html#aa54b4ee3c58ef66721df96fd8b1f66b2", null ],
+    [ "snmp_asn1_enc_u32t_cnt", "snmp__asn1_8h.html#a58965e0305884d550786440c84119ad4", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmp__core_8c.html b/doc/doxygen/output/html/snmp__core_8c.html
new file mode 100644
index 0000000..bb33308
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__core_8c.html
@@ -0,0 +1,1087 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_core.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__core_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_core.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="apps_2snmp_8h.html">lwip/apps/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+<code>#include &quot;snmp_core_priv.h&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="snmp__mib2_8h.html">lwip/apps/snmp_mib2.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga29c76474971f25d038fd486447c70e21"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#ga29c76474971f25d038fd486447c70e21">snmp_set_mibs</a> (const struct <a class="el" href="structsnmp__mib.html">snmp_mib</a> **mibs, u8_t num_mibs)</td></tr>
+<tr class="separator:ga29c76474971f25d038fd486447c70e21"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacc71ac857bf9215f06a624dda09abe3a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a">snmp_set_device_enterprise_oid</a> (const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *device_enterprise_oid)</td></tr>
+<tr class="separator:gacc71ac857bf9215f06a624dda09abe3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4dff82dda2553b9554a9f98561852a50"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#ga4dff82dda2553b9554a9f98561852a50">snmp_get_device_enterprise_oid</a> (void)</td></tr>
+<tr class="separator:ga4dff82dda2553b9554a9f98561852a50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a095efcd4202782e57625d7b1afcdbf77"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#a095efcd4202782e57625d7b1afcdbf77">snmp_oid_to_ip4</a> (const u32_t *oid, <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ip)</td></tr>
+<tr class="separator:a095efcd4202782e57625d7b1afcdbf77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e01d395f0c8c38c2b5b681047969da1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#a4e01d395f0c8c38c2b5b681047969da1">snmp_ip4_to_oid</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ip, u32_t *oid)</td></tr>
+<tr class="separator:a4e01d395f0c8c38c2b5b681047969da1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa1b651a1faf6f1ee0dfdbea48310ed09"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#aa1b651a1faf6f1ee0dfdbea48310ed09">snmp_oid_to_ip6</a> (const u32_t *oid, <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ip)</td></tr>
+<tr class="separator:aa1b651a1faf6f1ee0dfdbea48310ed09"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af1f327eef86765cce0253c94ec3c5ce9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#af1f327eef86765cce0253c94ec3c5ce9">snmp_ip6_to_oid</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ip, u32_t *oid)</td></tr>
+<tr class="separator:af1f327eef86765cce0253c94ec3c5ce9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a53b01262de3d1c52faf88dd4bb702a27"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#a53b01262de3d1c52faf88dd4bb702a27">snmp_ip_port_to_oid</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ip, u16_t port, u32_t *oid)</td></tr>
+<tr class="separator:a53b01262de3d1c52faf88dd4bb702a27"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a909ed1b0da526a0acdf6fa57a06f351e"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#a909ed1b0da526a0acdf6fa57a06f351e">snmp_ip_to_oid</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ip, u32_t *oid)</td></tr>
+<tr class="separator:a909ed1b0da526a0acdf6fa57a06f351e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a66aac86af921cd8aecb95eb252eb3e84"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#a66aac86af921cd8aecb95eb252eb3e84">snmp_oid_to_ip</a> (const u32_t *oid, u8_t oid_len, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ip)</td></tr>
+<tr class="separator:a66aac86af921cd8aecb95eb252eb3e84"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a21f02b239cc9abae586f5ef92923e507"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#a21f02b239cc9abae586f5ef92923e507">snmp_oid_to_ip_port</a> (const u32_t *oid, u8_t oid_len, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ip, u16_t *port)</td></tr>
+<tr class="separator:a21f02b239cc9abae586f5ef92923e507"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a41fd5e854d809499e28c66b4918481a6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#a41fd5e854d809499e28c66b4918481a6">snmp_oid_assign</a> (struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *target, const u32_t *oid, u8_t oid_len)</td></tr>
+<tr class="separator:a41fd5e854d809499e28c66b4918481a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32256b37b211b4f59d8f114cee364f39"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#a32256b37b211b4f59d8f114cee364f39">snmp_oid_prefix</a> (struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *target, const u32_t *oid, u8_t oid_len)</td></tr>
+<tr class="separator:a32256b37b211b4f59d8f114cee364f39"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6edcb88d8162544333bcede301cf0904"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#a6edcb88d8162544333bcede301cf0904">snmp_oid_combine</a> (struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len)</td></tr>
+<tr class="separator:a6edcb88d8162544333bcede301cf0904"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5aa6c8dbfc93235b160afaf3a40c1c93"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#a5aa6c8dbfc93235b160afaf3a40c1c93">snmp_oid_append</a> (struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *target, const u32_t *oid, u8_t oid_len)</td></tr>
+<tr class="separator:a5aa6c8dbfc93235b160afaf3a40c1c93"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af041ab415e8063097c79be2b892174f8"><td class="memItemLeft" align="right" valign="top">s8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#af041ab415e8063097c79be2b892174f8">snmp_oid_compare</a> (const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len)</td></tr>
+<tr class="separator:af041ab415e8063097c79be2b892174f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac2b6821b3d4a25033433fc25ffd74c9e"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#ac2b6821b3d4a25033433fc25ffd74c9e">snmp_oid_equal</a> (const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len)</td></tr>
+<tr class="separator:ac2b6821b3d4a25033433fc25ffd74c9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a871aa636806c7d68cbe24572598e59de"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#a871aa636806c7d68cbe24572598e59de">netif_to_num</a> (const struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a871aa636806c7d68cbe24572598e59de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af42d6d2732a92017a43b83a07609fd1a"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structsnmp__node.html">snmp_node</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#af42d6d2732a92017a43b83a07609fd1a">snmp_mib_tree_resolve_exact</a> (const struct <a class="el" href="structsnmp__mib.html">snmp_mib</a> *mib, const u32_t *oid, u8_t oid_len, u8_t *oid_instance_len)</td></tr>
+<tr class="separator:af42d6d2732a92017a43b83a07609fd1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8074765d5c2b809561f032d35e59e213"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#a8074765d5c2b809561f032d35e59e213">snmp_next_oid_init</a> (struct <a class="el" href="structsnmp__next__oid__state.html">snmp_next_oid_state</a> *state, const u32_t *start_oid, u8_t start_oid_len, u32_t *next_oid_buf, u8_t next_oid_max_len)</td></tr>
+<tr class="separator:a8074765d5c2b809561f032d35e59e213"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9768ecf81f01880dbf1cc1933bd9e60a"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#a9768ecf81f01880dbf1cc1933bd9e60a">snmp_next_oid_precheck</a> (struct <a class="el" href="structsnmp__next__oid__state.html">snmp_next_oid_state</a> *state, const u32_t *oid, u8_t oid_len)</td></tr>
+<tr class="separator:a9768ecf81f01880dbf1cc1933bd9e60a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a18126b2b13f267306c27e851e9379983"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#a18126b2b13f267306c27e851e9379983">snmp_next_oid_check</a> (struct <a class="el" href="structsnmp__next__oid__state.html">snmp_next_oid_state</a> *state, const u32_t *oid, u8_t oid_len, void *reference)</td></tr>
+<tr class="separator:a18126b2b13f267306c27e851e9379983"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5275903be5948b1c28bfadb365823504"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#a5275903be5948b1c28bfadb365823504">snmp_oid_in_range</a> (const u32_t *oid_in, u8_t oid_len, const struct <a class="el" href="structsnmp__oid__range.html">snmp_oid_range</a> *oid_ranges, u8_t oid_ranges_len)</td></tr>
+<tr class="separator:a5275903be5948b1c28bfadb365823504"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad3ab34b13bb9fcc757c8d366fe520fdc"><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="snmp__core_8c.html#ad3ab34b13bb9fcc757c8d366fe520fdc">snmp_decode_bits</a> (const u8_t *buf, u32_t buf_len, u32_t *bit_value)</td></tr>
+<tr class="separator:ad3ab34b13bb9fcc757c8d366fe520fdc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae6f5d0c38a7ec164a67fa55c87f1de03"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8c.html#ae6f5d0c38a7ec164a67fa55c87f1de03">snmp_encode_bits</a> (u8_t *buf, u32_t buf_len, u32_t bit_value, u8_t bit_count)</td></tr>
+<tr class="separator:ae6f5d0c38a7ec164a67fa55c87f1de03"><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>MIB tree access/construction functions. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a871aa636806c7d68cbe24572598e59de"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a871aa636806c7d68cbe24572598e59de">&#9670;&nbsp;</a></span>netif_to_num()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netif_to_num </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert netif to interface index </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>netif </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>index </dd></dl>
+
+</div>
+</div>
+<a id="ad3ab34b13bb9fcc757c8d366fe520fdc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad3ab34b13bb9fcc757c8d366fe520fdc">&#9670;&nbsp;</a></span>snmp_decode_bits()</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_decode_bits </td>
+          <td>(</td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>buf_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t *&#160;</td>
+          <td class="paramname"><em>bit_value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Decodes BITS pseudotype value from ASN.1 OctetString.</p>
+<dl class="section note"><dt>Note</dt><dd>Because BITS pseudo type is encoded as OCTET STRING, it cannot directly be encoded/decoded by the agent. Instead call this function as required from get/test/set methods.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buf</td><td>points to a buffer holding the ASN1 octet string </td></tr>
+    <tr><td class="paramname">buf_len</td><td>length of octet string </td></tr>
+    <tr><td class="paramname">bit_value</td><td>decoded Bit value with Bit0 == LSB </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if bit value contains more than 32 bit </dd></dl>
+
+</div>
+</div>
+<a id="ae6f5d0c38a7ec164a67fa55c87f1de03"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae6f5d0c38a7ec164a67fa55c87f1de03">&#9670;&nbsp;</a></span>snmp_encode_bits()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_encode_bits </td>
+          <td>(</td>
+          <td class="paramtype">u8_t *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>buf_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>bit_value</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>bit_count</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Encodes BITS pseudotype value into ASN.1 OctetString.</p>
+<dl class="section note"><dt>Note</dt><dd>Because BITS pseudo type is encoded as OCTET STRING, it cannot directly be encoded/decoded by the agent. Instead call this function as required from get/test/set methods.</dd></dl>
+<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">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>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>number of bytes used from buffer to store the resulting OctetString </dd></dl>
+
+</div>
+</div>
+<a id="a4e01d395f0c8c38c2b5b681047969da1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4e01d395f0c8c38c2b5b681047969da1">&#9670;&nbsp;</a></span>snmp_ip4_to_oid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_ip4_to_oid </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert <a class="el" href="structip4__addr.html">ip4_addr</a> to InetAddressIPv4 (no InetAddressType) </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ip</td><td>points to input struct </td></tr>
+    <tr><td class="paramname">oid</td><td>points to u32_t ident[4] output </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="af1f327eef86765cce0253c94ec3c5ce9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af1f327eef86765cce0253c94ec3c5ce9">&#9670;&nbsp;</a></span>snmp_ip6_to_oid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_ip6_to_oid </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert <a class="el" href="structip6__addr.html">ip6_addr</a> to InetAddressIPv6 (no InetAddressType) </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ip</td><td>points to input struct </td></tr>
+    <tr><td class="paramname">oid</td><td>points to u32_t ident[16] output </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a53b01262de3d1c52faf88dd4bb702a27"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a53b01262de3d1c52faf88dd4bb702a27">&#9670;&nbsp;</a></span>snmp_ip_port_to_oid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_ip_port_to_oid </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert to InetAddressType+InetAddress+InetPortNumber </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ip</td><td>IP address </td></tr>
+    <tr><td class="paramname">port</td><td>Port </td></tr>
+    <tr><td class="paramname">oid</td><td>OID </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>OID length </dd></dl>
+
+</div>
+</div>
+<a id="a909ed1b0da526a0acdf6fa57a06f351e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a909ed1b0da526a0acdf6fa57a06f351e">&#9670;&nbsp;</a></span>snmp_ip_to_oid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_ip_to_oid </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert to InetAddressType+InetAddress </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ip</td><td>IP address </td></tr>
+    <tr><td class="paramname">oid</td><td>OID </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>OID length </dd></dl>
+
+</div>
+</div>
+<a id="af42d6d2732a92017a43b83a07609fd1a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af42d6d2732a92017a43b83a07609fd1a">&#9670;&nbsp;</a></span>snmp_mib_tree_resolve_exact()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const struct <a class="el" href="structsnmp__node.html">snmp_node</a>* snmp_mib_tree_resolve_exact </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structsnmp__mib.html">snmp_mib</a> *&#160;</td>
+          <td class="paramname"><em>mib</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t *&#160;</td>
+          <td class="paramname"><em>oid_instance_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Searches tree for the supplied object identifier. </p>
+
+</div>
+</div>
+<a id="a18126b2b13f267306c27e851e9379983"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a18126b2b13f267306c27e851e9379983">&#9670;&nbsp;</a></span>snmp_next_oid_check()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_next_oid_check </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__next__oid__state.html">snmp_next_oid_state</a> *&#160;</td>
+          <td class="paramname"><em>state</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>reference</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>checks the passed OID if it is a candidate to be the next one (get_next); returns !=0 if passed oid is currently closest, otherwise 0 </p>
+
+</div>
+</div>
+<a id="a8074765d5c2b809561f032d35e59e213"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8074765d5c2b809561f032d35e59e213">&#9670;&nbsp;</a></span>snmp_next_oid_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_next_oid_init </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__next__oid__state.html">snmp_next_oid_state</a> *&#160;</td>
+          <td class="paramname"><em>state</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>start_oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>start_oid_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t *&#160;</td>
+          <td class="paramname"><em>next_oid_buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>next_oid_max_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>initialize struct next_oid_state using this function before passing it to next_oid_check </p>
+
+</div>
+</div>
+<a id="a9768ecf81f01880dbf1cc1933bd9e60a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9768ecf81f01880dbf1cc1933bd9e60a">&#9670;&nbsp;</a></span>snmp_next_oid_precheck()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_next_oid_precheck </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__next__oid__state.html">snmp_next_oid_state</a> *&#160;</td>
+          <td class="paramname"><em>state</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </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>
+
+</div>
+</div>
+<a id="a5aa6c8dbfc93235b160afaf3a40c1c93"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5aa6c8dbfc93235b160afaf3a40c1c93">&#9670;&nbsp;</a></span>snmp_oid_append()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_oid_append </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *&#160;</td>
+          <td class="paramname"><em>target</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Append OIDs to struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">target</td><td>Assignment target to append to </td></tr>
+    <tr><td class="paramname">oid</td><td>OID </td></tr>
+    <tr><td class="paramname">oid_len</td><td>OID length </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a41fd5e854d809499e28c66b4918481a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a41fd5e854d809499e28c66b4918481a6">&#9670;&nbsp;</a></span>snmp_oid_assign()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_oid_assign </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *&#160;</td>
+          <td class="paramname"><em>target</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Assign an OID to struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">target</td><td>Assignment target </td></tr>
+    <tr><td class="paramname">oid</td><td>OID </td></tr>
+    <tr><td class="paramname">oid_len</td><td>OID length </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a6edcb88d8162544333bcede301cf0904"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6edcb88d8162544333bcede301cf0904">&#9670;&nbsp;</a></span>snmp_oid_combine()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_oid_combine </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *&#160;</td>
+          <td class="paramname"><em>target</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid1_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid2_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Combine two OIDs into struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">target</td><td>Assignmet target </td></tr>
+    <tr><td class="paramname">oid1</td><td>OID 1 </td></tr>
+    <tr><td class="paramname">oid1_len</td><td>OID 1 length </td></tr>
+    <tr><td class="paramname">oid2</td><td>OID 2 </td></tr>
+    <tr><td class="paramname">oid2_len</td><td>OID 2 length </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="af041ab415e8063097c79be2b892174f8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af041ab415e8063097c79be2b892174f8">&#9670;&nbsp;</a></span>snmp_oid_compare()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">s8_t snmp_oid_compare </td>
+          <td>(</td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid1_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid2_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Compare two OIDs </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">oid1</td><td>OID 1 </td></tr>
+    <tr><td class="paramname">oid1_len</td><td>OID 1 length </td></tr>
+    <tr><td class="paramname">oid2</td><td>OID 2 </td></tr>
+    <tr><td class="paramname">oid2_len</td><td>OID 2 length </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1: OID1&lt;OID2 1: OID1 &gt;OID2 0: equal </dd></dl>
+
+</div>
+</div>
+<a id="ac2b6821b3d4a25033433fc25ffd74c9e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac2b6821b3d4a25033433fc25ffd74c9e">&#9670;&nbsp;</a></span>snmp_oid_equal()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_oid_equal </td>
+          <td>(</td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid1_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid2_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Check of two OIDs are equal </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">oid1</td><td>OID 1 </td></tr>
+    <tr><td class="paramname">oid1_len</td><td>OID 1 length </td></tr>
+    <tr><td class="paramname">oid2</td><td>OID 2 </td></tr>
+    <tr><td class="paramname">oid2_len</td><td>OID 2 length </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1: equal 0: non-equal </dd></dl>
+
+</div>
+</div>
+<a id="a5275903be5948b1c28bfadb365823504"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5275903be5948b1c28bfadb365823504">&#9670;&nbsp;</a></span>snmp_oid_in_range()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_oid_in_range </td>
+          <td>(</td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid_in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structsnmp__oid__range.html">snmp_oid_range</a> *&#160;</td>
+          <td class="paramname"><em>oid_ranges</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_ranges_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>checks if incoming OID length and values are in allowed ranges </p>
+
+</div>
+</div>
+<a id="a32256b37b211b4f59d8f114cee364f39"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a32256b37b211b4f59d8f114cee364f39">&#9670;&nbsp;</a></span>snmp_oid_prefix()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_oid_prefix </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *&#160;</td>
+          <td class="paramname"><em>target</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Prefix an OID to OID in struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">target</td><td>Assignment target to prefix </td></tr>
+    <tr><td class="paramname">oid</td><td>OID </td></tr>
+    <tr><td class="paramname">oid_len</td><td>OID length </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a66aac86af921cd8aecb95eb252eb3e84"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a66aac86af921cd8aecb95eb252eb3e84">&#9670;&nbsp;</a></span>snmp_oid_to_ip()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_oid_to_ip </td>
+          <td>(</td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert from InetAddressType+InetAddress to ip_addr_t </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">oid</td><td>OID </td></tr>
+    <tr><td class="paramname">oid_len</td><td>OID length </td></tr>
+    <tr><td class="paramname">ip</td><td>IP address </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Parsed OID length </dd></dl>
+
+</div>
+</div>
+<a id="a095efcd4202782e57625d7b1afcdbf77"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a095efcd4202782e57625d7b1afcdbf77">&#9670;&nbsp;</a></span>snmp_oid_to_ip4()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_oid_to_ip4 </td>
+          <td>(</td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ip</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Conversion from InetAddressIPv4 oid to lwIP <a class="el" href="structip4__addr.html">ip4_addr</a> </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">oid</td><td>points to u32_t ident[4] input </td></tr>
+    <tr><td class="paramname">ip</td><td>points to output struct </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aa1b651a1faf6f1ee0dfdbea48310ed09"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa1b651a1faf6f1ee0dfdbea48310ed09">&#9670;&nbsp;</a></span>snmp_oid_to_ip6()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_oid_to_ip6 </td>
+          <td>(</td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Conversion from InetAddressIPv6 oid to lwIP <a class="el" href="structip6__addr.html">ip6_addr</a> </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">oid</td><td>points to u32_t oid[16] input </td></tr>
+    <tr><td class="paramname">ip</td><td>points to output struct </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a21f02b239cc9abae586f5ef92923e507"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a21f02b239cc9abae586f5ef92923e507">&#9670;&nbsp;</a></span>snmp_oid_to_ip_port()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_oid_to_ip_port </td>
+          <td>(</td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>port</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert from InetAddressType+InetAddress+InetPortNumber to ip_addr_t and u16_t </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">oid</td><td>OID </td></tr>
+    <tr><td class="paramname">oid_len</td><td>OID length </td></tr>
+    <tr><td class="paramname">ip</td><td>IP address </td></tr>
+    <tr><td class="paramname">port</td><td>Port </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Parsed OID length </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__core_8c.html">snmp_core.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__core_8c.js b/doc/doxygen/output/html/snmp__core_8c.js
new file mode 100644
index 0000000..c6d9f5c
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__core_8c.js
@@ -0,0 +1,28 @@
+var snmp__core_8c =
+[
+    [ "netif_to_num", "snmp__core_8c.html#a871aa636806c7d68cbe24572598e59de", null ],
+    [ "snmp_decode_bits", "snmp__core_8c.html#ad3ab34b13bb9fcc757c8d366fe520fdc", null ],
+    [ "snmp_encode_bits", "snmp__core_8c.html#ae6f5d0c38a7ec164a67fa55c87f1de03", null ],
+    [ "snmp_get_device_enterprise_oid", "group__snmp__core.html#ga4dff82dda2553b9554a9f98561852a50", null ],
+    [ "snmp_ip4_to_oid", "snmp__core_8c.html#a4e01d395f0c8c38c2b5b681047969da1", null ],
+    [ "snmp_ip6_to_oid", "snmp__core_8c.html#af1f327eef86765cce0253c94ec3c5ce9", null ],
+    [ "snmp_ip_port_to_oid", "snmp__core_8c.html#a53b01262de3d1c52faf88dd4bb702a27", null ],
+    [ "snmp_ip_to_oid", "snmp__core_8c.html#a909ed1b0da526a0acdf6fa57a06f351e", null ],
+    [ "snmp_mib_tree_resolve_exact", "snmp__core_8c.html#af42d6d2732a92017a43b83a07609fd1a", null ],
+    [ "snmp_next_oid_check", "snmp__core_8c.html#a18126b2b13f267306c27e851e9379983", null ],
+    [ "snmp_next_oid_init", "snmp__core_8c.html#a8074765d5c2b809561f032d35e59e213", null ],
+    [ "snmp_next_oid_precheck", "snmp__core_8c.html#a9768ecf81f01880dbf1cc1933bd9e60a", null ],
+    [ "snmp_oid_append", "snmp__core_8c.html#a5aa6c8dbfc93235b160afaf3a40c1c93", null ],
+    [ "snmp_oid_assign", "snmp__core_8c.html#a41fd5e854d809499e28c66b4918481a6", null ],
+    [ "snmp_oid_combine", "snmp__core_8c.html#a6edcb88d8162544333bcede301cf0904", null ],
+    [ "snmp_oid_compare", "snmp__core_8c.html#af041ab415e8063097c79be2b892174f8", null ],
+    [ "snmp_oid_equal", "snmp__core_8c.html#ac2b6821b3d4a25033433fc25ffd74c9e", null ],
+    [ "snmp_oid_in_range", "snmp__core_8c.html#a5275903be5948b1c28bfadb365823504", null ],
+    [ "snmp_oid_prefix", "snmp__core_8c.html#a32256b37b211b4f59d8f114cee364f39", null ],
+    [ "snmp_oid_to_ip", "snmp__core_8c.html#a66aac86af921cd8aecb95eb252eb3e84", null ],
+    [ "snmp_oid_to_ip4", "snmp__core_8c.html#a095efcd4202782e57625d7b1afcdbf77", null ],
+    [ "snmp_oid_to_ip6", "snmp__core_8c.html#aa1b651a1faf6f1ee0dfdbea48310ed09", null ],
+    [ "snmp_oid_to_ip_port", "snmp__core_8c.html#a21f02b239cc9abae586f5ef92923e507", null ],
+    [ "snmp_set_device_enterprise_oid", "group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a", null ],
+    [ "snmp_set_mibs", "group__snmp__core.html#ga29c76474971f25d038fd486447c70e21", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmp__core_8h.html b/doc/doxygen/output/html/snmp__core_8h.html
new file mode 100644
index 0000000..e8040b5
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__core_8h.html
@@ -0,0 +1,1117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/snmp_core.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__core_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_core.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.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="err_8h.html">lwip/err.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structsnmp__obj__id.html">snmp_obj_id</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">union &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionsnmp__variant__value.html">snmp_variant_value</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="structsnmp__node.html">snmp_node</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="structsnmp__node__instance.html">snmp_node_instance</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="structsnmp__tree__node.html">snmp_tree_node</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="structsnmp__leaf__node.html">snmp_leaf_node</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="structsnmp__mib.html">snmp_mib</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="structsnmp__oid__range.html">snmp_oid_range</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="structsnmp__next__oid__state.html">snmp_next_oid_state</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a9ee3aad9305fdd883abb37822be81b72"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#a9ee3aad9305fdd883abb37822be81b72">SNMP_NODE_TREE</a>&#160;&#160;&#160;0x00</td></tr>
+<tr class="separator:a9ee3aad9305fdd883abb37822be81b72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:abaa9cdad345ad93da515d31625a54589"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#abaa9cdad345ad93da515d31625a54589">snmp_err_t</a> </td></tr>
+<tr class="separator:abaa9cdad345ad93da515d31625a54589"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad5a33687d1a6fcf970266b41b0633760"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#ad5a33687d1a6fcf970266b41b0633760">snmp_access_t</a> </td></tr>
+<tr class="separator:ad5a33687d1a6fcf970266b41b0633760"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a5275903be5948b1c28bfadb365823504"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#a5275903be5948b1c28bfadb365823504">snmp_oid_in_range</a> (const u32_t *oid_in, u8_t oid_len, const struct <a class="el" href="structsnmp__oid__range.html">snmp_oid_range</a> *oid_ranges, u8_t oid_ranges_len)</td></tr>
+<tr class="separator:a5275903be5948b1c28bfadb365823504"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8074765d5c2b809561f032d35e59e213"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#a8074765d5c2b809561f032d35e59e213">snmp_next_oid_init</a> (struct <a class="el" href="structsnmp__next__oid__state.html">snmp_next_oid_state</a> *state, const u32_t *start_oid, u8_t start_oid_len, u32_t *next_oid_buf, u8_t next_oid_max_len)</td></tr>
+<tr class="separator:a8074765d5c2b809561f032d35e59e213"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9768ecf81f01880dbf1cc1933bd9e60a"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#a9768ecf81f01880dbf1cc1933bd9e60a">snmp_next_oid_precheck</a> (struct <a class="el" href="structsnmp__next__oid__state.html">snmp_next_oid_state</a> *state, const u32_t *oid, u8_t oid_len)</td></tr>
+<tr class="separator:a9768ecf81f01880dbf1cc1933bd9e60a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a18126b2b13f267306c27e851e9379983"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#a18126b2b13f267306c27e851e9379983">snmp_next_oid_check</a> (struct <a class="el" href="structsnmp__next__oid__state.html">snmp_next_oid_state</a> *state, const u32_t *oid, u8_t oid_len, void *reference)</td></tr>
+<tr class="separator:a18126b2b13f267306c27e851e9379983"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a41fd5e854d809499e28c66b4918481a6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#a41fd5e854d809499e28c66b4918481a6">snmp_oid_assign</a> (struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *target, const u32_t *oid, u8_t oid_len)</td></tr>
+<tr class="separator:a41fd5e854d809499e28c66b4918481a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6edcb88d8162544333bcede301cf0904"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#a6edcb88d8162544333bcede301cf0904">snmp_oid_combine</a> (struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len)</td></tr>
+<tr class="separator:a6edcb88d8162544333bcede301cf0904"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32256b37b211b4f59d8f114cee364f39"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#a32256b37b211b4f59d8f114cee364f39">snmp_oid_prefix</a> (struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *target, const u32_t *oid, u8_t oid_len)</td></tr>
+<tr class="separator:a32256b37b211b4f59d8f114cee364f39"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5aa6c8dbfc93235b160afaf3a40c1c93"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#a5aa6c8dbfc93235b160afaf3a40c1c93">snmp_oid_append</a> (struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *target, const u32_t *oid, u8_t oid_len)</td></tr>
+<tr class="separator:a5aa6c8dbfc93235b160afaf3a40c1c93"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac2b6821b3d4a25033433fc25ffd74c9e"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#ac2b6821b3d4a25033433fc25ffd74c9e">snmp_oid_equal</a> (const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len)</td></tr>
+<tr class="separator:ac2b6821b3d4a25033433fc25ffd74c9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af041ab415e8063097c79be2b892174f8"><td class="memItemLeft" align="right" valign="top">s8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#af041ab415e8063097c79be2b892174f8">snmp_oid_compare</a> (const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len)</td></tr>
+<tr class="separator:af041ab415e8063097c79be2b892174f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a095efcd4202782e57625d7b1afcdbf77"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#a095efcd4202782e57625d7b1afcdbf77">snmp_oid_to_ip4</a> (const u32_t *oid, <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ip)</td></tr>
+<tr class="separator:a095efcd4202782e57625d7b1afcdbf77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e01d395f0c8c38c2b5b681047969da1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#a4e01d395f0c8c38c2b5b681047969da1">snmp_ip4_to_oid</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ip, u32_t *oid)</td></tr>
+<tr class="separator:a4e01d395f0c8c38c2b5b681047969da1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa1b651a1faf6f1ee0dfdbea48310ed09"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#aa1b651a1faf6f1ee0dfdbea48310ed09">snmp_oid_to_ip6</a> (const u32_t *oid, <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ip)</td></tr>
+<tr class="separator:aa1b651a1faf6f1ee0dfdbea48310ed09"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af1f327eef86765cce0253c94ec3c5ce9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#af1f327eef86765cce0253c94ec3c5ce9">snmp_ip6_to_oid</a> (const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ip, u32_t *oid)</td></tr>
+<tr class="separator:af1f327eef86765cce0253c94ec3c5ce9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a909ed1b0da526a0acdf6fa57a06f351e"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#a909ed1b0da526a0acdf6fa57a06f351e">snmp_ip_to_oid</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ip, u32_t *oid)</td></tr>
+<tr class="separator:a909ed1b0da526a0acdf6fa57a06f351e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a53b01262de3d1c52faf88dd4bb702a27"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#a53b01262de3d1c52faf88dd4bb702a27">snmp_ip_port_to_oid</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ip, u16_t port, u32_t *oid)</td></tr>
+<tr class="separator:a53b01262de3d1c52faf88dd4bb702a27"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a66aac86af921cd8aecb95eb252eb3e84"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#a66aac86af921cd8aecb95eb252eb3e84">snmp_oid_to_ip</a> (const u32_t *oid, u8_t oid_len, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ip)</td></tr>
+<tr class="separator:a66aac86af921cd8aecb95eb252eb3e84"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a21f02b239cc9abae586f5ef92923e507"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#a21f02b239cc9abae586f5ef92923e507">snmp_oid_to_ip_port</a> (const u32_t *oid, u8_t oid_len, <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ip, u16_t *port)</td></tr>
+<tr class="separator:a21f02b239cc9abae586f5ef92923e507"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a871aa636806c7d68cbe24572598e59de"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#a871aa636806c7d68cbe24572598e59de">netif_to_num</a> (const struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a871aa636806c7d68cbe24572598e59de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad3ab34b13bb9fcc757c8d366fe520fdc"><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="snmp__core_8h.html#ad3ab34b13bb9fcc757c8d366fe520fdc">snmp_decode_bits</a> (const u8_t *buf, u32_t buf_len, u32_t *bit_value)</td></tr>
+<tr class="separator:ad3ab34b13bb9fcc757c8d366fe520fdc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae6f5d0c38a7ec164a67fa55c87f1de03"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__core_8h.html#ae6f5d0c38a7ec164a67fa55c87f1de03">snmp_encode_bits</a> (u8_t *buf, u32_t buf_len, u32_t bit_value, u8_t bit_count)</td></tr>
+<tr class="separator:ae6f5d0c38a7ec164a67fa55c87f1de03"><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 core API for implementing MIBs </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a9ee3aad9305fdd883abb37822be81b72"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ee3aad9305fdd883abb37822be81b72">&#9670;&nbsp;</a></span>SNMP_NODE_TREE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_NODE_TREE&#160;&#160;&#160;0x00</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SNMP MIB node types tree node is the only node the stack can process in order to walk the tree, all other nodes are assumed to be leaf nodes. This cannot be an enum because users may want to define their own node types. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="ad5a33687d1a6fcf970266b41b0633760"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad5a33687d1a6fcf970266b41b0633760">&#9670;&nbsp;</a></span>snmp_access_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="snmp__core_8h.html#ad5a33687d1a6fcf970266b41b0633760">snmp_access_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SNMP node instance access types </p>
+
+</div>
+</div>
+<a id="abaa9cdad345ad93da515d31625a54589"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abaa9cdad345ad93da515d31625a54589">&#9670;&nbsp;</a></span>snmp_err_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="snmp__core_8h.html#abaa9cdad345ad93da515d31625a54589">snmp_err_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>error codes predefined by SNMP prot. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a871aa636806c7d68cbe24572598e59de"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a871aa636806c7d68cbe24572598e59de">&#9670;&nbsp;</a></span>netif_to_num()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netif_to_num </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>netif</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert netif to interface index </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>netif </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>index </dd></dl>
+
+</div>
+</div>
+<a id="ad3ab34b13bb9fcc757c8d366fe520fdc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad3ab34b13bb9fcc757c8d366fe520fdc">&#9670;&nbsp;</a></span>snmp_decode_bits()</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_decode_bits </td>
+          <td>(</td>
+          <td class="paramtype">const u8_t *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>buf_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t *&#160;</td>
+          <td class="paramname"><em>bit_value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Decodes BITS pseudotype value from ASN.1 OctetString.</p>
+<dl class="section note"><dt>Note</dt><dd>Because BITS pseudo type is encoded as OCTET STRING, it cannot directly be encoded/decoded by the agent. Instead call this function as required from get/test/set methods.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buf</td><td>points to a buffer holding the ASN1 octet string </td></tr>
+    <tr><td class="paramname">buf_len</td><td>length of octet string </td></tr>
+    <tr><td class="paramname">bit_value</td><td>decoded Bit value with Bit0 == LSB </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful, ERR_ARG if bit value contains more than 32 bit </dd></dl>
+
+</div>
+</div>
+<a id="ae6f5d0c38a7ec164a67fa55c87f1de03"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae6f5d0c38a7ec164a67fa55c87f1de03">&#9670;&nbsp;</a></span>snmp_encode_bits()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_encode_bits </td>
+          <td>(</td>
+          <td class="paramtype">u8_t *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>buf_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>bit_value</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>bit_count</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Encodes BITS pseudotype value into ASN.1 OctetString.</p>
+<dl class="section note"><dt>Note</dt><dd>Because BITS pseudo type is encoded as OCTET STRING, it cannot directly be encoded/decoded by the agent. Instead call this function as required from get/test/set methods.</dd></dl>
+<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">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>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>number of bytes used from buffer to store the resulting OctetString </dd></dl>
+
+</div>
+</div>
+<a id="a4e01d395f0c8c38c2b5b681047969da1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4e01d395f0c8c38c2b5b681047969da1">&#9670;&nbsp;</a></span>snmp_ip4_to_oid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_ip4_to_oid </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert <a class="el" href="structip4__addr.html">ip4_addr</a> to InetAddressIPv4 (no InetAddressType) </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ip</td><td>points to input struct </td></tr>
+    <tr><td class="paramname">oid</td><td>points to u32_t ident[4] output </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="af1f327eef86765cce0253c94ec3c5ce9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af1f327eef86765cce0253c94ec3c5ce9">&#9670;&nbsp;</a></span>snmp_ip6_to_oid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_ip6_to_oid </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert <a class="el" href="structip6__addr.html">ip6_addr</a> to InetAddressIPv6 (no InetAddressType) </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ip</td><td>points to input struct </td></tr>
+    <tr><td class="paramname">oid</td><td>points to u32_t ident[16] output </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a53b01262de3d1c52faf88dd4bb702a27"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a53b01262de3d1c52faf88dd4bb702a27">&#9670;&nbsp;</a></span>snmp_ip_port_to_oid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_ip_port_to_oid </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert to InetAddressType+InetAddress+InetPortNumber </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ip</td><td>IP address </td></tr>
+    <tr><td class="paramname">port</td><td>Port </td></tr>
+    <tr><td class="paramname">oid</td><td>OID </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>OID length </dd></dl>
+
+</div>
+</div>
+<a id="a909ed1b0da526a0acdf6fa57a06f351e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a909ed1b0da526a0acdf6fa57a06f351e">&#9670;&nbsp;</a></span>snmp_ip_to_oid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_ip_to_oid </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert to InetAddressType+InetAddress </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ip</td><td>IP address </td></tr>
+    <tr><td class="paramname">oid</td><td>OID </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>OID length </dd></dl>
+
+</div>
+</div>
+<a id="a18126b2b13f267306c27e851e9379983"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a18126b2b13f267306c27e851e9379983">&#9670;&nbsp;</a></span>snmp_next_oid_check()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_next_oid_check </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__next__oid__state.html">snmp_next_oid_state</a> *&#160;</td>
+          <td class="paramname"><em>state</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>reference</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>checks the passed OID if it is a candidate to be the next one (get_next); returns !=0 if passed oid is currently closest, otherwise 0 </p>
+
+</div>
+</div>
+<a id="a8074765d5c2b809561f032d35e59e213"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8074765d5c2b809561f032d35e59e213">&#9670;&nbsp;</a></span>snmp_next_oid_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_next_oid_init </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__next__oid__state.html">snmp_next_oid_state</a> *&#160;</td>
+          <td class="paramname"><em>state</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>start_oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>start_oid_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t *&#160;</td>
+          <td class="paramname"><em>next_oid_buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>next_oid_max_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>initialize struct next_oid_state using this function before passing it to next_oid_check </p>
+
+</div>
+</div>
+<a id="a9768ecf81f01880dbf1cc1933bd9e60a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9768ecf81f01880dbf1cc1933bd9e60a">&#9670;&nbsp;</a></span>snmp_next_oid_precheck()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_next_oid_precheck </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__next__oid__state.html">snmp_next_oid_state</a> *&#160;</td>
+          <td class="paramname"><em>state</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </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>
+
+</div>
+</div>
+<a id="a5aa6c8dbfc93235b160afaf3a40c1c93"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5aa6c8dbfc93235b160afaf3a40c1c93">&#9670;&nbsp;</a></span>snmp_oid_append()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_oid_append </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *&#160;</td>
+          <td class="paramname"><em>target</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Append OIDs to struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">target</td><td>Assignment target to append to </td></tr>
+    <tr><td class="paramname">oid</td><td>OID </td></tr>
+    <tr><td class="paramname">oid_len</td><td>OID length </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a41fd5e854d809499e28c66b4918481a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a41fd5e854d809499e28c66b4918481a6">&#9670;&nbsp;</a></span>snmp_oid_assign()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_oid_assign </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *&#160;</td>
+          <td class="paramname"><em>target</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Assign an OID to struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">target</td><td>Assignment target </td></tr>
+    <tr><td class="paramname">oid</td><td>OID </td></tr>
+    <tr><td class="paramname">oid_len</td><td>OID length </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a6edcb88d8162544333bcede301cf0904"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6edcb88d8162544333bcede301cf0904">&#9670;&nbsp;</a></span>snmp_oid_combine()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_oid_combine </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *&#160;</td>
+          <td class="paramname"><em>target</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid1_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid2_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Combine two OIDs into struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">target</td><td>Assignmet target </td></tr>
+    <tr><td class="paramname">oid1</td><td>OID 1 </td></tr>
+    <tr><td class="paramname">oid1_len</td><td>OID 1 length </td></tr>
+    <tr><td class="paramname">oid2</td><td>OID 2 </td></tr>
+    <tr><td class="paramname">oid2_len</td><td>OID 2 length </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="af041ab415e8063097c79be2b892174f8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af041ab415e8063097c79be2b892174f8">&#9670;&nbsp;</a></span>snmp_oid_compare()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">s8_t snmp_oid_compare </td>
+          <td>(</td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid1_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid2_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Compare two OIDs </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">oid1</td><td>OID 1 </td></tr>
+    <tr><td class="paramname">oid1_len</td><td>OID 1 length </td></tr>
+    <tr><td class="paramname">oid2</td><td>OID 2 </td></tr>
+    <tr><td class="paramname">oid2_len</td><td>OID 2 length </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1: OID1&lt;OID2 1: OID1 &gt;OID2 0: equal </dd></dl>
+
+</div>
+</div>
+<a id="ac2b6821b3d4a25033433fc25ffd74c9e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac2b6821b3d4a25033433fc25ffd74c9e">&#9670;&nbsp;</a></span>snmp_oid_equal()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_oid_equal </td>
+          <td>(</td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid1_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid2_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Check of two OIDs are equal </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">oid1</td><td>OID 1 </td></tr>
+    <tr><td class="paramname">oid1_len</td><td>OID 1 length </td></tr>
+    <tr><td class="paramname">oid2</td><td>OID 2 </td></tr>
+    <tr><td class="paramname">oid2_len</td><td>OID 2 length </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1: equal 0: non-equal </dd></dl>
+
+</div>
+</div>
+<a id="a5275903be5948b1c28bfadb365823504"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5275903be5948b1c28bfadb365823504">&#9670;&nbsp;</a></span>snmp_oid_in_range()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_oid_in_range </td>
+          <td>(</td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid_in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structsnmp__oid__range.html">snmp_oid_range</a> *&#160;</td>
+          <td class="paramname"><em>oid_ranges</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_ranges_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>checks if incoming OID length and values are in allowed ranges </p>
+
+</div>
+</div>
+<a id="a32256b37b211b4f59d8f114cee364f39"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a32256b37b211b4f59d8f114cee364f39">&#9670;&nbsp;</a></span>snmp_oid_prefix()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_oid_prefix </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *&#160;</td>
+          <td class="paramname"><em>target</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Prefix an OID to OID in struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">target</td><td>Assignment target to prefix </td></tr>
+    <tr><td class="paramname">oid</td><td>OID </td></tr>
+    <tr><td class="paramname">oid_len</td><td>OID length </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a66aac86af921cd8aecb95eb252eb3e84"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a66aac86af921cd8aecb95eb252eb3e84">&#9670;&nbsp;</a></span>snmp_oid_to_ip()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_oid_to_ip </td>
+          <td>(</td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert from InetAddressType+InetAddress to ip_addr_t </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">oid</td><td>OID </td></tr>
+    <tr><td class="paramname">oid_len</td><td>OID length </td></tr>
+    <tr><td class="paramname">ip</td><td>IP address </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Parsed OID length </dd></dl>
+
+</div>
+</div>
+<a id="a095efcd4202782e57625d7b1afcdbf77"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a095efcd4202782e57625d7b1afcdbf77">&#9670;&nbsp;</a></span>snmp_oid_to_ip4()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_oid_to_ip4 </td>
+          <td>(</td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </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> *&#160;</td>
+          <td class="paramname"><em>ip</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Conversion from InetAddressIPv4 oid to lwIP <a class="el" href="structip4__addr.html">ip4_addr</a> </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">oid</td><td>points to u32_t ident[4] input </td></tr>
+    <tr><td class="paramname">ip</td><td>points to output struct </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aa1b651a1faf6f1ee0dfdbea48310ed09"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa1b651a1faf6f1ee0dfdbea48310ed09">&#9670;&nbsp;</a></span>snmp_oid_to_ip6()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_oid_to_ip6 </td>
+          <td>(</td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Conversion from InetAddressIPv6 oid to lwIP <a class="el" href="structip6__addr.html">ip6_addr</a> </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">oid</td><td>points to u32_t oid[16] input </td></tr>
+    <tr><td class="paramname">ip</td><td>points to output struct </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a21f02b239cc9abae586f5ef92923e507"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a21f02b239cc9abae586f5ef92923e507">&#9670;&nbsp;</a></span>snmp_oid_to_ip_port()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_oid_to_ip_port </td>
+          <td>(</td>
+          <td class="paramtype">const u32_t *&#160;</td>
+          <td class="paramname"><em>oid</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>oid_len</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *&#160;</td>
+          <td class="paramname"><em>port</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert from InetAddressType+InetAddress+InetPortNumber to ip_addr_t and u16_t </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">oid</td><td>OID </td></tr>
+    <tr><td class="paramname">oid_len</td><td>OID length </td></tr>
+    <tr><td class="paramname">ip</td><td>IP address </td></tr>
+    <tr><td class="paramname">port</td><td>Port </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Parsed OID length </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="snmp__core_8h.html">snmp_core.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__core_8h.js b/doc/doxygen/output/html/snmp__core_8h.js
new file mode 100644
index 0000000..d0a83ad
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__core_8h.js
@@ -0,0 +1,36 @@
+var snmp__core_8h =
+[
+    [ "snmp_obj_id", "structsnmp__obj__id.html", null ],
+    [ "snmp_variant_value", "unionsnmp__variant__value.html", null ],
+    [ "snmp_node", "structsnmp__node.html", "structsnmp__node" ],
+    [ "snmp_node_instance", "structsnmp__node__instance.html", "structsnmp__node__instance" ],
+    [ "snmp_tree_node", "structsnmp__tree__node.html", "structsnmp__tree__node" ],
+    [ "snmp_leaf_node", "structsnmp__leaf__node.html", "structsnmp__leaf__node" ],
+    [ "snmp_mib", "structsnmp__mib.html", null ],
+    [ "snmp_oid_range", "structsnmp__oid__range.html", null ],
+    [ "snmp_next_oid_state", "structsnmp__next__oid__state.html", null ],
+    [ "SNMP_NODE_TREE", "snmp__core_8h.html#a9ee3aad9305fdd883abb37822be81b72", null ],
+    [ "snmp_access_t", "snmp__core_8h.html#ad5a33687d1a6fcf970266b41b0633760", null ],
+    [ "snmp_err_t", "snmp__core_8h.html#abaa9cdad345ad93da515d31625a54589", null ],
+    [ "netif_to_num", "snmp__core_8h.html#a871aa636806c7d68cbe24572598e59de", null ],
+    [ "snmp_decode_bits", "snmp__core_8h.html#ad3ab34b13bb9fcc757c8d366fe520fdc", null ],
+    [ "snmp_encode_bits", "snmp__core_8h.html#ae6f5d0c38a7ec164a67fa55c87f1de03", null ],
+    [ "snmp_ip4_to_oid", "snmp__core_8h.html#a4e01d395f0c8c38c2b5b681047969da1", null ],
+    [ "snmp_ip6_to_oid", "snmp__core_8h.html#af1f327eef86765cce0253c94ec3c5ce9", null ],
+    [ "snmp_ip_port_to_oid", "snmp__core_8h.html#a53b01262de3d1c52faf88dd4bb702a27", null ],
+    [ "snmp_ip_to_oid", "snmp__core_8h.html#a909ed1b0da526a0acdf6fa57a06f351e", null ],
+    [ "snmp_next_oid_check", "snmp__core_8h.html#a18126b2b13f267306c27e851e9379983", null ],
+    [ "snmp_next_oid_init", "snmp__core_8h.html#a8074765d5c2b809561f032d35e59e213", null ],
+    [ "snmp_next_oid_precheck", "snmp__core_8h.html#a9768ecf81f01880dbf1cc1933bd9e60a", null ],
+    [ "snmp_oid_append", "snmp__core_8h.html#a5aa6c8dbfc93235b160afaf3a40c1c93", null ],
+    [ "snmp_oid_assign", "snmp__core_8h.html#a41fd5e854d809499e28c66b4918481a6", null ],
+    [ "snmp_oid_combine", "snmp__core_8h.html#a6edcb88d8162544333bcede301cf0904", null ],
+    [ "snmp_oid_compare", "snmp__core_8h.html#af041ab415e8063097c79be2b892174f8", null ],
+    [ "snmp_oid_equal", "snmp__core_8h.html#ac2b6821b3d4a25033433fc25ffd74c9e", null ],
+    [ "snmp_oid_in_range", "snmp__core_8h.html#a5275903be5948b1c28bfadb365823504", null ],
+    [ "snmp_oid_prefix", "snmp__core_8h.html#a32256b37b211b4f59d8f114cee364f39", null ],
+    [ "snmp_oid_to_ip", "snmp__core_8h.html#a66aac86af921cd8aecb95eb252eb3e84", null ],
+    [ "snmp_oid_to_ip4", "snmp__core_8h.html#a095efcd4202782e57625d7b1afcdbf77", null ],
+    [ "snmp_oid_to_ip6", "snmp__core_8h.html#aa1b651a1faf6f1ee0dfdbea48310ed09", null ],
+    [ "snmp_oid_to_ip_port", "snmp__core_8h.html#a21f02b239cc9abae586f5ef92923e507", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmp__mib2_8c.html b/doc/doxygen/output/html/snmp__mib2_8c.html
new file mode 100644
index 0000000..e4e1256
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__mib2_8c.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_mib2.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__mib2_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_mib2.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp_8h.html">lwip/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="apps_2snmp_8h.html">lwip/apps/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__mib2_8h.html">lwip/apps/snmp_mib2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__scalar_8h.html">lwip/apps/snmp_scalar.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tcpip_8h.html">lwip/tcpip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tcpip__priv_8h.html">lwip/priv/tcpip_priv.h</a>&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Management Information Base II (RFC1213) objects and functions. </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__mib2_8c.html">snmp_mib2.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__mib2_8h.html b/doc/doxygen/output/html/snmp__mib2_8h.html
new file mode 100644
index 0000000..aba7ed2
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__mib2_8h.html
@@ -0,0 +1,125 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/snmp_mib2.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__mib2_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_mib2.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__threadsync_8h.html">lwip/apps/snmp_threadsync.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gacde87dc1d3bd669b19d834b028f490cc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc">snmp_mib2_set_sysdescr</a> (const u8_t *str, const u16_t *len)</td></tr>
+<tr class="separator:gacde87dc1d3bd669b19d834b028f490cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf96002d9d10bcae27a95b2367674249e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e">snmp_mib2_set_syscontact</a> (u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize)</td></tr>
+<tr class="separator:gaf96002d9d10bcae27a95b2367674249e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga53339a03d720c745790837905bc2171a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a">snmp_mib2_set_syscontact_readonly</a> (const u8_t *ocstr, const u16_t *ocstrlen)</td></tr>
+<tr class="separator:ga53339a03d720c745790837905bc2171a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae7ce98a6ecc0bb92aaa2b330599a2db7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7">snmp_mib2_set_sysname</a> (u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize)</td></tr>
+<tr class="separator:gae7ce98a6ecc0bb92aaa2b330599a2db7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab95eb687492fa0e7d762f911c442bdc5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5">snmp_mib2_set_sysname_readonly</a> (const u8_t *ocstr, const u16_t *ocstrlen)</td></tr>
+<tr class="separator:gab95eb687492fa0e7d762f911c442bdc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4248e004a27344b7260574c3a51882f2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2">snmp_mib2_set_syslocation</a> (u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize)</td></tr>
+<tr class="separator:ga4248e004a27344b7260574c3a51882f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac1759d5b0640943697be2ad538325267"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267">snmp_mib2_set_syslocation_readonly</a> (const u8_t *ocstr, const u16_t *ocstrlen)</td></tr>
+<tr class="separator:gac1759d5b0640943697be2ad538325267"><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 MIB2 API </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_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="snmp__mib2_8h.html">snmp_mib2.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__mib2_8h.js b/doc/doxygen/output/html/snmp__mib2_8h.js
new file mode 100644
index 0000000..b44b408
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__mib2_8h.js
@@ -0,0 +1,10 @@
+var snmp__mib2_8h =
+[
+    [ "snmp_mib2_set_syscontact", "group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e", null ],
+    [ "snmp_mib2_set_syscontact_readonly", "group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a", null ],
+    [ "snmp_mib2_set_sysdescr", "group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc", null ],
+    [ "snmp_mib2_set_syslocation", "group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2", null ],
+    [ "snmp_mib2_set_syslocation_readonly", "group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267", null ],
+    [ "snmp_mib2_set_sysname", "group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7", null ],
+    [ "snmp_mib2_set_sysname_readonly", "group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmp__mib2__icmp_8c.html b/doc/doxygen/output/html/snmp__mib2__icmp_8c.html
new file mode 100644
index 0000000..24abfa9
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__mib2__icmp_8c.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_mib2_icmp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__mib2__icmp_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_mib2_icmp.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp_8h.html">lwip/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="apps_2snmp_8h.html">lwip/apps/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__mib2_8h.html">lwip/apps/snmp_mib2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__table_8h.html">lwip/apps/snmp_table.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__scalar_8h.html">lwip/apps/snmp_scalar.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="icmp_8h.html">lwip/icmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Management Information Base II (RFC1213) ICMP objects and functions. </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__mib2__icmp_8c.html">snmp_mib2_icmp.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__mib2__interfaces_8c.html b/doc/doxygen/output/html/snmp__mib2__interfaces_8c.html
new file mode 100644
index 0000000..26ca3c2
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__mib2__interfaces_8c.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_mib2_interfaces.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__mib2__interfaces_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_mib2_interfaces.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp_8h.html">lwip/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="apps_2snmp_8h.html">lwip/apps/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__mib2_8h.html">lwip/apps/snmp_mib2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__table_8h.html">lwip/apps/snmp_table.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__scalar_8h.html">lwip/apps/snmp_scalar.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="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Management Information Base II (RFC1213) INTERFACES objects and functions. </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__mib2__interfaces_8c.html">snmp_mib2_interfaces.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__mib2__ip_8c.html b/doc/doxygen/output/html/snmp__mib2__ip_8c.html
new file mode 100644
index 0000000..8ebc726
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__mib2__ip_8c.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_mib2_ip.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__mib2__ip_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_mib2_ip.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp_8h.html">lwip/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="apps_2snmp_8h.html">lwip/apps/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__mib2_8h.html">lwip/apps/snmp_mib2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__table_8h.html">lwip/apps/snmp_table.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__scalar_8h.html">lwip/apps/snmp_scalar.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.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="ip_8h.html">lwip/ip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="lwip_2etharp_8h.html">lwip/etharp.h</a>&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Management Information Base II (RFC1213) IP objects and functions. </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__mib2__ip_8c.html">snmp_mib2_ip.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__mib2__snmp_8c.html b/doc/doxygen/output/html/snmp__mib2__snmp_8c.html
new file mode 100644
index 0000000..9d81cfc
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__mib2__snmp_8c.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_mib2_snmp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__mib2__snmp_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_mib2_snmp.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp_8h.html">lwip/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="apps_2snmp_8h.html">lwip/apps/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__mib2_8h.html">lwip/apps/snmp_mib2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__scalar_8h.html">lwip/apps/snmp_scalar.h</a>&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Management Information Base II (RFC1213) SNMP objects and functions. </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__mib2__snmp_8c.html">snmp_mib2_snmp.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__mib2__system_8c.html b/doc/doxygen/output/html/snmp__mib2__system_8c.html
new file mode 100644
index 0000000..ba1b7c5
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__mib2__system_8c.html
@@ -0,0 +1,130 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_mib2_system.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__mib2__system_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_mib2_system.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp_8h.html">lwip/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="apps_2snmp_8h.html">lwip/apps/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__mib2_8h.html">lwip/apps/snmp_mib2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__table_8h.html">lwip/apps/snmp_table.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__scalar_8h.html">lwip/apps/snmp_scalar.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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gacde87dc1d3bd669b19d834b028f490cc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc">snmp_mib2_set_sysdescr</a> (const u8_t *str, const u16_t *len)</td></tr>
+<tr class="separator:gacde87dc1d3bd669b19d834b028f490cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf96002d9d10bcae27a95b2367674249e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e">snmp_mib2_set_syscontact</a> (u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize)</td></tr>
+<tr class="separator:gaf96002d9d10bcae27a95b2367674249e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga53339a03d720c745790837905bc2171a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a">snmp_mib2_set_syscontact_readonly</a> (const u8_t *ocstr, const u16_t *ocstrlen)</td></tr>
+<tr class="separator:ga53339a03d720c745790837905bc2171a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae7ce98a6ecc0bb92aaa2b330599a2db7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7">snmp_mib2_set_sysname</a> (u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize)</td></tr>
+<tr class="separator:gae7ce98a6ecc0bb92aaa2b330599a2db7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab95eb687492fa0e7d762f911c442bdc5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5">snmp_mib2_set_sysname_readonly</a> (const u8_t *ocstr, const u16_t *ocstrlen)</td></tr>
+<tr class="separator:gab95eb687492fa0e7d762f911c442bdc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4248e004a27344b7260574c3a51882f2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2">snmp_mib2_set_syslocation</a> (u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize)</td></tr>
+<tr class="separator:ga4248e004a27344b7260574c3a51882f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac1759d5b0640943697be2ad538325267"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267">snmp_mib2_set_syslocation_readonly</a> (const u8_t *ocstr, const u16_t *ocstrlen)</td></tr>
+<tr class="separator:gac1759d5b0640943697be2ad538325267"><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>Management Information Base II (RFC1213) SYSTEM objects and functions. </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__mib2__system_8c.html">snmp_mib2_system.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__mib2__system_8c.js b/doc/doxygen/output/html/snmp__mib2__system_8c.js
new file mode 100644
index 0000000..de9f86f
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__mib2__system_8c.js
@@ -0,0 +1,10 @@
+var snmp__mib2__system_8c =
+[
+    [ "snmp_mib2_set_syscontact", "group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e", null ],
+    [ "snmp_mib2_set_syscontact_readonly", "group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a", null ],
+    [ "snmp_mib2_set_sysdescr", "group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc", null ],
+    [ "snmp_mib2_set_syslocation", "group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2", null ],
+    [ "snmp_mib2_set_syslocation_readonly", "group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267", null ],
+    [ "snmp_mib2_set_sysname", "group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7", null ],
+    [ "snmp_mib2_set_sysname_readonly", "group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmp__mib2__tcp_8c.html b/doc/doxygen/output/html/snmp__mib2__tcp_8c.html
new file mode 100644
index 0000000..bae273b
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__mib2__tcp_8c.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_mib2_tcp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__mib2__tcp_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_mib2_tcp.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp_8h.html">lwip/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="apps_2snmp_8h.html">lwip/apps/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__mib2_8h.html">lwip/apps/snmp_mib2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__table_8h.html">lwip/apps/snmp_table.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__scalar_8h.html">lwip/apps/snmp_scalar.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="tcp__priv_8h.html">lwip/priv/tcp_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Management Information Base II (RFC1213) TCP objects and functions. </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__mib2__tcp_8c.html">snmp_mib2_tcp.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__mib2__udp_8c.html b/doc/doxygen/output/html/snmp__mib2__udp_8c.html
new file mode 100644
index 0000000..5a075cb
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__mib2__udp_8c.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_mib2_udp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__mib2__udp_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_mib2_udp.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp_8h.html">lwip/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="apps_2snmp_8h.html">lwip/apps/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__mib2_8h.html">lwip/apps/snmp_mib2.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__table_8h.html">lwip/apps/snmp_table.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__scalar_8h.html">lwip/apps/snmp_scalar.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="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Management Information Base II (RFC1213) UDP objects and functions. </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__mib2__udp_8c.html">snmp_mib2_udp.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__msg_8c.html b/doc/doxygen/output/html/snmp__msg_8c.html
new file mode 100644
index 0000000..3d16298
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__msg_8c.html
@@ -0,0 +1,217 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_msg.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__msg_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_msg.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__msg_8h.html">snmp_msg.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__asn1_8h.html">snmp_asn1.h</a>&quot;</code><br />
+<code>#include &quot;snmp_core_priv.h&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="stats_8h.html">lwip/stats.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gacf277cbca915275190426aeef4cfb103"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#gacf277cbca915275190426aeef4cfb103">snmp_get_community</a> (void)</td></tr>
+<tr class="separator:gacf277cbca915275190426aeef4cfb103"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga30cc587a260757fdb2b81d462f430ef1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1">snmp_set_community</a> (const char *const community)</td></tr>
+<tr class="separator:ga30cc587a260757fdb2b81d462f430ef1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaba31b6f1816661df5a3b7f2076ee6ec0"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#gaba31b6f1816661df5a3b7f2076ee6ec0">snmp_get_community_write</a> (void)</td></tr>
+<tr class="separator:gaba31b6f1816661df5a3b7f2076ee6ec0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafdd3299e145f53cc826cc11a469f8409"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#gafdd3299e145f53cc826cc11a469f8409">snmp_get_community_trap</a> (void)</td></tr>
+<tr class="separator:gafdd3299e145f53cc826cc11a469f8409"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga341461766863cff46a44e5f431f2da01"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#ga341461766863cff46a44e5f431f2da01">snmp_set_community_write</a> (const char *const community)</td></tr>
+<tr class="separator:ga341461766863cff46a44e5f431f2da01"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5631711f357b6610be7e93b1c6d87760"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760">snmp_set_community_trap</a> (const char *const community)</td></tr>
+<tr class="separator:ga5631711f357b6610be7e93b1c6d87760"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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="snmp__msg_8c.html#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">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:ac6f810ab812c44c6ca1df1fdf926a9f6"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__msg_8c.html#ac6f810ab812c44c6ca1df1fdf926a9f6">snmp_community</a> = &quot;public&quot;</td></tr>
+<tr class="separator:ac6f810ab812c44c6ca1df1fdf926a9f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2d77485bb0b640c8e5f569ca756d3b04"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__msg_8c.html#a2d77485bb0b640c8e5f569ca756d3b04">snmp_community_write</a> = &quot;private&quot;</td></tr>
+<tr class="separator:a2d77485bb0b640c8e5f569ca756d3b04"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e2007343d9492b8e31d363d2c6ad79b"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__msg_8c.html#a2e2007343d9492b8e31d363d2c6ad79b">snmp_community_trap</a> = &quot;public&quot;</td></tr>
+<tr class="separator:a2e2007343d9492b8e31d363d2c6ad79b"><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 message processing (RFC1157). </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ac1f684dada963f68b71a04a702f28fe5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac1f684dada963f68b71a04a702f28fe5">&#9670;&nbsp;</a></span>snmp_varbind_length()</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_varbind_length </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *&#160;</td>
+          <td class="paramname"><em>varbind</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__varbind__len.html">snmp_varbind_len</a> *&#160;</td>
+          <td class="paramname"><em>len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Calculate the length of a varbind list </p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="ac6f810ab812c44c6ca1df1fdf926a9f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac6f810ab812c44c6ca1df1fdf926a9f6">&#9670;&nbsp;</a></span>snmp_community</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* snmp_community = &quot;public&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SNMP community string </p>
+
+</div>
+</div>
+<a id="a2e2007343d9492b8e31d363d2c6ad79b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2e2007343d9492b8e31d363d2c6ad79b">&#9670;&nbsp;</a></span>snmp_community_trap</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* snmp_community_trap = &quot;public&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SNMP community string for sending traps </p>
+
+</div>
+</div>
+<a id="a2d77485bb0b640c8e5f569ca756d3b04"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2d77485bb0b640c8e5f569ca756d3b04">&#9670;&nbsp;</a></span>snmp_community_write</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* snmp_community_write = &quot;private&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SNMP community string for write access </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_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__msg_8c.html">snmp_msg.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__msg_8c.js b/doc/doxygen/output/html/snmp__msg_8c.js
new file mode 100644
index 0000000..2c8a603
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__msg_8c.js
@@ -0,0 +1,14 @@
+var snmp__msg_8c =
+[
+    [ "snmp_get_community", "group__snmp__core.html#gacf277cbca915275190426aeef4cfb103", null ],
+    [ "snmp_get_community_trap", "group__snmp__traps.html#gafdd3299e145f53cc826cc11a469f8409", null ],
+    [ "snmp_get_community_write", "group__snmp__core.html#gaba31b6f1816661df5a3b7f2076ee6ec0", 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_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 ],
+    [ "snmp_community_trap", "snmp__msg_8c.html#a2e2007343d9492b8e31d363d2c6ad79b", null ],
+    [ "snmp_community_write", "snmp__msg_8c.html#a2d77485bb0b640c8e5f569ca756d3b04", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmp__msg_8h.html b/doc/doxygen/output/html/snmp__msg_8h.html
new file mode 100644
index 0000000..5448d61
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__msg_8h.html
@@ -0,0 +1,210 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_msg.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__msg_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_msg.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="apps_2snmp_8h.html">lwip/apps/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__pbuf__stream_8h.html">snmp_pbuf_stream.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="err_8h.html">lwip/err.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structsnmp__varbind__len.html">snmp_varbind_len</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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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="snmp__msg_8h.html#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">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:ac6f810ab812c44c6ca1df1fdf926a9f6"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__msg_8h.html#ac6f810ab812c44c6ca1df1fdf926a9f6">snmp_community</a></td></tr>
+<tr class="separator:ac6f810ab812c44c6ca1df1fdf926a9f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2d77485bb0b640c8e5f569ca756d3b04"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__msg_8h.html#a2d77485bb0b640c8e5f569ca756d3b04">snmp_community_write</a></td></tr>
+<tr class="separator:a2d77485bb0b640c8e5f569ca756d3b04"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ade16efa80e2c2a20236d3cb96b19c79a"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__msg_8h.html#ade16efa80e2c2a20236d3cb96b19c79a">snmp_traps_handle</a></td></tr>
+<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>SNMP Agent message handling structures (internal API, do not use in client code). </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ac1f684dada963f68b71a04a702f28fe5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac1f684dada963f68b71a04a702f28fe5">&#9670;&nbsp;</a></span>snmp_varbind_length()</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_varbind_length </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *&#160;</td>
+          <td class="paramname"><em>varbind</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__varbind__len.html">snmp_varbind_len</a> *&#160;</td>
+          <td class="paramname"><em>len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Calculate the length of a varbind list </p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="ac6f810ab812c44c6ca1df1fdf926a9f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac6f810ab812c44c6ca1df1fdf926a9f6">&#9670;&nbsp;</a></span>snmp_community</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* snmp_community</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Agent community string</p>
+<p>SNMP community string </p>
+
+</div>
+</div>
+<a id="a2d77485bb0b640c8e5f569ca756d3b04"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2d77485bb0b640c8e5f569ca756d3b04">&#9670;&nbsp;</a></span>snmp_community_write</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* snmp_community_write</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Agent community string for write access</p>
+<p>SNMP community string for write access </p>
+
+</div>
+</div>
+<a id="ade16efa80e2c2a20236d3cb96b19c79a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ade16efa80e2c2a20236d3cb96b19c79a">&#9670;&nbsp;</a></span>snmp_traps_handle</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* snmp_traps_handle</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>handle for sending traps </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_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__msg_8h.html">snmp_msg.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__msg_8h.js b/doc/doxygen/output/html/snmp__msg_8h.js
new file mode 100644
index 0000000..8787d71
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__msg_8h.js
@@ -0,0 +1,8 @@
+var snmp__msg_8h =
+[
+    [ "snmp_varbind_len", "structsnmp__varbind__len.html", null ],
+    [ "snmp_varbind_length", "snmp__msg_8h.html#ac1f684dada963f68b71a04a702f28fe5", null ],
+    [ "snmp_community", "snmp__msg_8h.html#ac6f810ab812c44c6ca1df1fdf926a9f6", null ],
+    [ "snmp_community_write", "snmp__msg_8h.html#a2d77485bb0b640c8e5f569ca756d3b04", null ],
+    [ "snmp_traps_handle", "snmp__msg_8h.html#ade16efa80e2c2a20236d3cb96b19c79a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmp__netconn_8c.html b/doc/doxygen/output/html/snmp__netconn_8c.html
new file mode 100644
index 0000000..66a7d03
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__netconn_8c.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_netconn.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__netconn_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_netconn.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="api_8h.html">lwip/api.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.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="snmp__msg_8h.html">snmp_msg.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="iana_8h.html">lwip/prot/iana.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga4d88f2fc7655280384131d543e0d83e5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__netconn_8c.html#ga4d88f2fc7655280384131d543e0d83e5">snmp_init</a> (void)</td></tr>
+<tr class="separator:ga4d88f2fc7655280384131d543e0d83e5"><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 netconn frontend. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ga4d88f2fc7655280384131d543e0d83e5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4d88f2fc7655280384131d543e0d83e5">&#9670;&nbsp;</a></span>snmp_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Starts SNMP Agent.</p>
+<p>Agent setup, start listening to port 161. </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_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__netconn_8c.html">snmp_netconn.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__netconn_8c.js b/doc/doxygen/output/html/snmp__netconn_8c.js
new file mode 100644
index 0000000..c46b6da
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__netconn_8c.js
@@ -0,0 +1,4 @@
+var snmp__netconn_8c =
+[
+    [ "snmp_init", "snmp__netconn_8c.html#ga4d88f2fc7655280384131d543e0d83e5", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmp__opts_8h.html b/doc/doxygen/output/html/snmp__opts_8h.html
new file mode 100644
index 0000000..3336988
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__opts_8h.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/snmp_opts.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__opts_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_opts.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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gaf4900859dc53f19f5f67cc34e48ad68c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gaf4900859dc53f19f5f67cc34e48ad68c">LWIP_SNMP</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaf4900859dc53f19f5f67cc34e48ad68c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf02e8b4b69e99df784e9953401477078"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gaf02e8b4b69e99df784e9953401477078">SNMP_USE_NETCONN</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaf02e8b4b69e99df784e9953401477078"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8c93f4260af2eb3c50d4bc603f716f1f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga8c93f4260af2eb3c50d4bc603f716f1f">SNMP_USE_RAW</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga8c93f4260af2eb3c50d4bc603f716f1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0dcacdccc61216c6773943ad3fd31242"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga0dcacdccc61216c6773943ad3fd31242">SNMP_STACK_SIZE</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__thread.html#ga7f93dfeaed4021061959f822def602cb">DEFAULT_THREAD_STACKSIZE</a></td></tr>
+<tr class="separator:ga0dcacdccc61216c6773943ad3fd31242"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad9bce0d9c05ed4607d72de7b75f2a80b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gad9bce0d9c05ed4607d72de7b75f2a80b">SNMP_THREAD_PRIO</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__thread.html#ga3d8715b1fdd0449d6c214e4a40108456">DEFAULT_THREAD_PRIO</a></td></tr>
+<tr class="separator:gad9bce0d9c05ed4607d72de7b75f2a80b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga692343b0cc555c302fd713003d4f8a08"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga692343b0cc555c302fd713003d4f8a08">SNMP_TRAP_DESTINATIONS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga692343b0cc555c302fd713003d4f8a08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga95e39047b9bcb385780b06b35af49261"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga95e39047b9bcb385780b06b35af49261">SNMP_SAFE_REQUESTS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga95e39047b9bcb385780b06b35af49261"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae50cdd09697aa54a8b9f26432ac55ac2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gae50cdd09697aa54a8b9f26432ac55ac2">SNMP_MAX_OCTET_STRING_LEN</a>&#160;&#160;&#160;127</td></tr>
+<tr class="separator:gae50cdd09697aa54a8b9f26432ac55ac2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3ad9d293f90e3c885c4e3263a9064a41"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga3ad9d293f90e3c885c4e3263a9064a41">SNMP_MAX_OBJ_ID_LEN</a>&#160;&#160;&#160;50</td></tr>
+<tr class="separator:ga3ad9d293f90e3c885c4e3263a9064a41"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac815d0dbe576299546ac612e7eaf3f90"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gac815d0dbe576299546ac612e7eaf3f90">SNMP_MIN_VALUE_SIZE</a>&#160;&#160;&#160;(2 * sizeof(u32_t*)) /* size required to store the basic types (8 bytes for counter64) */</td></tr>
+<tr class="separator:gac815d0dbe576299546ac612e7eaf3f90"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafb4362575bc50476a7401a1ed14787f0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gafb4362575bc50476a7401a1ed14787f0">SNMP_MAX_VALUE_SIZE</a>&#160;&#160;&#160;LWIP_MAX(LWIP_MAX((<a class="el" href="group__snmp__opts.html#gae50cdd09697aa54a8b9f26432ac55ac2">SNMP_MAX_OCTET_STRING_LEN</a>), sizeof(u32_t)*(<a class="el" href="group__snmp__opts.html#ga3ad9d293f90e3c885c4e3263a9064a41">SNMP_MAX_OBJ_ID_LEN</a>)), <a class="el" href="group__snmp__opts.html#gac815d0dbe576299546ac612e7eaf3f90">SNMP_MIN_VALUE_SIZE</a>)</td></tr>
+<tr class="separator:gafb4362575bc50476a7401a1ed14787f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga316c1e1f06f0c7ca56589563809e64db"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga316c1e1f06f0c7ca56589563809e64db">SNMP_COMMUNITY</a>&#160;&#160;&#160;&quot;public&quot;</td></tr>
+<tr class="separator:ga316c1e1f06f0c7ca56589563809e64db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafb9414dc7a33978b62a3a9838b659464"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gafb9414dc7a33978b62a3a9838b659464">SNMP_COMMUNITY_WRITE</a>&#160;&#160;&#160;&quot;private&quot;</td></tr>
+<tr class="separator:gafb9414dc7a33978b62a3a9838b659464"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaefc9dda5f8e5c296018a463cdbac39b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gaaefc9dda5f8e5c296018a463cdbac39b">SNMP_COMMUNITY_TRAP</a>&#160;&#160;&#160;&quot;public&quot;</td></tr>
+<tr class="separator:gaaefc9dda5f8e5c296018a463cdbac39b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0e98b58159a77688f87f9f50479177fd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga0e98b58159a77688f87f9f50479177fd">SNMP_MAX_COMMUNITY_STR_LEN</a>&#160;&#160;&#160;LWIP_MAX(LWIP_MAX(sizeof(<a class="el" href="group__snmp__opts.html#ga316c1e1f06f0c7ca56589563809e64db">SNMP_COMMUNITY</a>), sizeof(<a class="el" href="group__snmp__opts.html#gafb9414dc7a33978b62a3a9838b659464">SNMP_COMMUNITY_WRITE</a>)), sizeof(<a class="el" href="group__snmp__opts.html#gaaefc9dda5f8e5c296018a463cdbac39b">SNMP_COMMUNITY_TRAP</a>))</td></tr>
+<tr class="separator:ga0e98b58159a77688f87f9f50479177fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga868bfef6efe05515c86291137a633479"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga868bfef6efe05515c86291137a633479">SNMP_LWIP_ENTERPRISE_OID</a>&#160;&#160;&#160;26381</td></tr>
+<tr class="separator:ga868bfef6efe05515c86291137a633479"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga09118b734e85df152af098744e888b34"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga09118b734e85df152af098744e888b34">SNMP_DEVICE_ENTERPRISE_OID</a>&#160;&#160;&#160;{1, 3, 6, 1, 4, 1, <a class="el" href="group__snmp__opts.html#ga868bfef6efe05515c86291137a633479">SNMP_LWIP_ENTERPRISE_OID</a>}</td></tr>
+<tr class="separator:ga09118b734e85df152af098744e888b34"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9e39ba5308f5c7ac5296c7d05fdfa97f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga9e39ba5308f5c7ac5296c7d05fdfa97f">SNMP_DEVICE_ENTERPRISE_OID_LEN</a>&#160;&#160;&#160;7</td></tr>
+<tr class="separator:ga9e39ba5308f5c7ac5296c7d05fdfa97f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac041000361342f51ad5ee5d8f6254e02"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gac041000361342f51ad5ee5d8f6254e02">SNMP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gac041000361342f51ad5ee5d8f6254e02"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac12240265db443eaf9d31d187e586c16"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gac12240265db443eaf9d31d187e586c16">SNMP_MIB_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:gac12240265db443eaf9d31d187e586c16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaab667d48f48ee89f8bdbc7f134e6037d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gaab667d48f48ee89f8bdbc7f134e6037d">SNMP_LWIP_MIB2</a>&#160;&#160;&#160;<a class="el" href="group__snmp__opts.html#gaf4900859dc53f19f5f67cc34e48ad68c">LWIP_SNMP</a></td></tr>
+<tr class="separator:gaab667d48f48ee89f8bdbc7f134e6037d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae93a105b421a2ca91e862da5087cec73"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#gae93a105b421a2ca91e862da5087cec73">SNMP_LWIP_MIB2_SYSDESC</a>&#160;&#160;&#160;&quot;lwIP&quot;</td></tr>
+<tr class="separator:gae93a105b421a2ca91e862da5087cec73"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga80ba46f9517a51b5477f13082b2bcf98"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga80ba46f9517a51b5477f13082b2bcf98">SNMP_LWIP_MIB2_SYSNAME</a>&#160;&#160;&#160;&quot;FQDN-unk&quot;</td></tr>
+<tr class="separator:ga80ba46f9517a51b5477f13082b2bcf98"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1a57501c615b630d363e0af1a504e683"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga1a57501c615b630d363e0af1a504e683">SNMP_LWIP_MIB2_SYSCONTACT</a>&#160;&#160;&#160;&quot;&quot;</td></tr>
+<tr class="separator:ga1a57501c615b630d363e0af1a504e683"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga311cec98c8f7e4851d325fffe96cf8d9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga311cec98c8f7e4851d325fffe96cf8d9">SNMP_LWIP_MIB2_SYSLOCATION</a>&#160;&#160;&#160;&quot;&quot;</td></tr>
+<tr class="separator:ga311cec98c8f7e4851d325fffe96cf8d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5a24152aa5f3c2837b9a3145aa3c59f3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__opts.html#ga5a24152aa5f3c2837b9a3145aa3c59f3">SNMP_LWIP_GETBULK_MAX_REPETITIONS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga5a24152aa5f3c2837b9a3145aa3c59f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1fe0e120f979ed400f649019edcefe2b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__opts_8h.html#a1fe0e120f979ed400f649019edcefe2b">LWIP_SNMP_V3</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a1fe0e120f979ed400f649019edcefe2b"><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 server options list </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a1fe0e120f979ed400f649019edcefe2b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1fe0e120f979ed400f649019edcefe2b">&#9670;&nbsp;</a></span>LWIP_SNMP_V3</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_SNMP_V3&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_SNMP_V3==1: This enables EXPERIMENTAL SNMPv3 support. LWIP_SNMP must also be enabled. THIS IS UNDER DEVELOPMENT AND SHOULD NOT BE ENABLED IN PRODUCTS. </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="dir_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="snmp__opts_8h.html">snmp_opts.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__opts_8h.js b/doc/doxygen/output/html/snmp__opts_8h.js
new file mode 100644
index 0000000..6d8536c
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__opts_8h.js
@@ -0,0 +1,30 @@
+var snmp__opts_8h =
+[
+    [ "LWIP_SNMP", "group__snmp__opts.html#gaf4900859dc53f19f5f67cc34e48ad68c", null ],
+    [ "LWIP_SNMP_V3", "snmp__opts_8h.html#a1fe0e120f979ed400f649019edcefe2b", null ],
+    [ "SNMP_COMMUNITY", "group__snmp__opts.html#ga316c1e1f06f0c7ca56589563809e64db", null ],
+    [ "SNMP_COMMUNITY_TRAP", "group__snmp__opts.html#gaaefc9dda5f8e5c296018a463cdbac39b", null ],
+    [ "SNMP_COMMUNITY_WRITE", "group__snmp__opts.html#gafb9414dc7a33978b62a3a9838b659464", null ],
+    [ "SNMP_DEBUG", "group__snmp__opts.html#gac041000361342f51ad5ee5d8f6254e02", null ],
+    [ "SNMP_DEVICE_ENTERPRISE_OID", "group__snmp__opts.html#ga09118b734e85df152af098744e888b34", null ],
+    [ "SNMP_DEVICE_ENTERPRISE_OID_LEN", "group__snmp__opts.html#ga9e39ba5308f5c7ac5296c7d05fdfa97f", null ],
+    [ "SNMP_LWIP_ENTERPRISE_OID", "group__snmp__opts.html#ga868bfef6efe05515c86291137a633479", null ],
+    [ "SNMP_LWIP_GETBULK_MAX_REPETITIONS", "group__snmp__opts.html#ga5a24152aa5f3c2837b9a3145aa3c59f3", null ],
+    [ "SNMP_LWIP_MIB2", "group__snmp__opts.html#gaab667d48f48ee89f8bdbc7f134e6037d", null ],
+    [ "SNMP_LWIP_MIB2_SYSCONTACT", "group__snmp__opts.html#ga1a57501c615b630d363e0af1a504e683", null ],
+    [ "SNMP_LWIP_MIB2_SYSDESC", "group__snmp__opts.html#gae93a105b421a2ca91e862da5087cec73", null ],
+    [ "SNMP_LWIP_MIB2_SYSLOCATION", "group__snmp__opts.html#ga311cec98c8f7e4851d325fffe96cf8d9", null ],
+    [ "SNMP_LWIP_MIB2_SYSNAME", "group__snmp__opts.html#ga80ba46f9517a51b5477f13082b2bcf98", null ],
+    [ "SNMP_MAX_COMMUNITY_STR_LEN", "group__snmp__opts.html#ga0e98b58159a77688f87f9f50479177fd", null ],
+    [ "SNMP_MAX_OBJ_ID_LEN", "group__snmp__opts.html#ga3ad9d293f90e3c885c4e3263a9064a41", null ],
+    [ "SNMP_MAX_OCTET_STRING_LEN", "group__snmp__opts.html#gae50cdd09697aa54a8b9f26432ac55ac2", null ],
+    [ "SNMP_MAX_VALUE_SIZE", "group__snmp__opts.html#gafb4362575bc50476a7401a1ed14787f0", null ],
+    [ "SNMP_MIB_DEBUG", "group__snmp__opts.html#gac12240265db443eaf9d31d187e586c16", null ],
+    [ "SNMP_MIN_VALUE_SIZE", "group__snmp__opts.html#gac815d0dbe576299546ac612e7eaf3f90", null ],
+    [ "SNMP_SAFE_REQUESTS", "group__snmp__opts.html#ga95e39047b9bcb385780b06b35af49261", null ],
+    [ "SNMP_STACK_SIZE", "group__snmp__opts.html#ga0dcacdccc61216c6773943ad3fd31242", null ],
+    [ "SNMP_THREAD_PRIO", "group__snmp__opts.html#gad9bce0d9c05ed4607d72de7b75f2a80b", null ],
+    [ "SNMP_TRAP_DESTINATIONS", "group__snmp__opts.html#ga692343b0cc555c302fd713003d4f8a08", null ],
+    [ "SNMP_USE_NETCONN", "group__snmp__opts.html#gaf02e8b4b69e99df784e9953401477078", null ],
+    [ "SNMP_USE_RAW", "group__snmp__opts.html#ga8c93f4260af2eb3c50d4bc603f716f1f", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmp__pbuf__stream_8c.html b/doc/doxygen/output/html/snmp__pbuf__stream_8c.html
new file mode 100644
index 0000000..ae495ee
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__pbuf__stream_8c.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_pbuf_stream.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__pbuf__stream_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_pbuf_stream.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__pbuf__stream_8h.html">snmp_pbuf_stream.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="def_8h.html">lwip/def.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SNMP pbuf stream wrapper implementation (internal API, do not use in client code). </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__pbuf__stream_8c.html">snmp_pbuf_stream.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__pbuf__stream_8h.html b/doc/doxygen/output/html/snmp__pbuf__stream_8h.html
new file mode 100644
index 0000000..d2c3970
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__pbuf__stream_8h.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_pbuf_stream.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__pbuf__stream_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_pbuf_stream.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_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><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SNMP pbuf stream wrapper (internal API, do not use in client code). </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__pbuf__stream_8h.html">snmp_pbuf_stream.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__raw_8c.html b/doc/doxygen/output/html/snmp__raw_8c.html
new file mode 100644
index 0000000..8ccc5f9
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__raw_8c.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_raw.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__raw_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_raw.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.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="udp_8h.html">lwip/udp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.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="snmp__msg_8h.html">snmp_msg.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga4d88f2fc7655280384131d543e0d83e5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5">snmp_init</a> (void)</td></tr>
+<tr class="separator:ga4d88f2fc7655280384131d543e0d83e5"><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 RAW API frontend. </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__raw_8c.html">snmp_raw.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__raw_8c.js b/doc/doxygen/output/html/snmp__raw_8c.js
new file mode 100644
index 0000000..3d725fa
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__raw_8c.js
@@ -0,0 +1,4 @@
+var snmp__raw_8c =
+[
+    [ "snmp_init", "group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmp__scalar_8c.html b/doc/doxygen/output/html/snmp__scalar_8c.html
new file mode 100644
index 0000000..5696c20
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__scalar_8c.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_scalar.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__scalar_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_scalar.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__scalar_8h.html">lwip/apps/snmp_scalar.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SNMP scalar node support implementation. </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__scalar_8c.html">snmp_scalar.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__scalar_8h.html b/doc/doxygen/output/html/snmp__scalar_8h.html
new file mode 100644
index 0000000..646dfa1
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__scalar_8h.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/snmp_scalar.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__scalar_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_scalar.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structsnmp__scalar__node.html">snmp_scalar_node</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="structsnmp__scalar__array__node__def.html">snmp_scalar_array_node_def</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="structsnmp__scalar__array__node.html">snmp_scalar_array_node</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>
+<div class="textblock"><p>SNMP server MIB API to implement scalar nodes </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_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="snmp__scalar_8h.html">snmp_scalar.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__scalar_8h.js b/doc/doxygen/output/html/snmp__scalar_8h.js
new file mode 100644
index 0000000..1d2ebb7
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__scalar_8h.js
@@ -0,0 +1,6 @@
+var snmp__scalar_8h =
+[
+    [ "snmp_scalar_node", "structsnmp__scalar__node.html", "structsnmp__scalar__node" ],
+    [ "snmp_scalar_array_node_def", "structsnmp__scalar__array__node__def.html", null ],
+    [ "snmp_scalar_array_node", "structsnmp__scalar__array__node.html", "structsnmp__scalar__array__node" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmp__table_8c.html b/doc/doxygen/output/html/snmp__table_8c.html
new file mode 100644
index 0000000..9b2e5a3
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__table_8c.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_table.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__table_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_table.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__table_8h.html">lwip/apps/snmp_table.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SNMP table support implementation. </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__table_8c.html">snmp_table.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__table_8h.html b/doc/doxygen/output/html/snmp__table_8h.html
new file mode 100644
index 0000000..dabf1fc
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__table_8h.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/snmp_table.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__table_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#enum-members">Enumerations</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_table.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structsnmp__table__col__def.html">snmp_table_col_def</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="structsnmp__table__node.html">snmp_table_node</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="structsnmp__table__simple__node.html">snmp_table_simple_node</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 name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:af9b59f3ba7dccf338fe6e5bc1c4b1db5"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__table_8h.html#af9b59f3ba7dccf338fe6e5bc1c4b1db5">snmp_table_column_data_type_t</a> </td></tr>
+<tr class="separator:af9b59f3ba7dccf338fe6e5bc1c4b1db5"><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 server MIB API to implement table nodes </p>
+</div><h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="af9b59f3ba7dccf338fe6e5bc1c4b1db5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af9b59f3ba7dccf338fe6e5bc1c4b1db5">&#9670;&nbsp;</a></span>snmp_table_column_data_type_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="snmp__table_8h.html#af9b59f3ba7dccf338fe6e5bc1c4b1db5">snmp_table_column_data_type_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>simple read-only table </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="dir_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="snmp__table_8h.html">snmp_table.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__table_8h.js b/doc/doxygen/output/html/snmp__table_8h.js
new file mode 100644
index 0000000..fd773ec
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__table_8h.js
@@ -0,0 +1,7 @@
+var snmp__table_8h =
+[
+    [ "snmp_table_col_def", "structsnmp__table__col__def.html", null ],
+    [ "snmp_table_node", "structsnmp__table__node.html", "structsnmp__table__node" ],
+    [ "snmp_table_simple_node", "structsnmp__table__simple__node.html", null ],
+    [ "snmp_table_column_data_type_t", "snmp__table_8h.html#af9b59f3ba7dccf338fe6e5bc1c4b1db5", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmp__threadsync_8c.html b/doc/doxygen/output/html/snmp__threadsync_8c.html
new file mode 100644
index 0000000..5fcf440
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__threadsync_8c.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_threadsync.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__threadsync_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_threadsync.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__threadsync_8h.html">lwip/apps/snmp_threadsync.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a36e5b1dbb067641b7a6ac486b4ec15b6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__threadsync_8c.html#a36e5b1dbb067641b7a6ac486b4ec15b6">snmp_threadsync_init</a> (struct <a class="el" href="structsnmp__threadsync__instance.html">snmp_threadsync_instance</a> *instance, snmp_threadsync_synchronizer_fn sync_fn)</td></tr>
+<tr class="separator:a36e5b1dbb067641b7a6ac486b4ec15b6"><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 thread synchronization implementation. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a36e5b1dbb067641b7a6ac486b4ec15b6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a36e5b1dbb067641b7a6ac486b4ec15b6">&#9670;&nbsp;</a></span>snmp_threadsync_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_threadsync_init </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__threadsync__instance.html">snmp_threadsync_instance</a> *&#160;</td>
+          <td class="paramname"><em>instance</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">snmp_threadsync_synchronizer_fn&#160;</td>
+          <td class="paramname"><em>sync_fn</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initializes thread synchronization instance </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_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__threadsync_8c.html">snmp_threadsync.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__threadsync_8c.js b/doc/doxygen/output/html/snmp__threadsync_8c.js
new file mode 100644
index 0000000..0e5cb2b
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__threadsync_8c.js
@@ -0,0 +1,4 @@
+var snmp__threadsync_8c =
+[
+    [ "snmp_threadsync_init", "snmp__threadsync_8c.html#a36e5b1dbb067641b7a6ac486b4ec15b6", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmp__threadsync_8h.html b/doc/doxygen/output/html/snmp__threadsync_8h.html
new file mode 100644
index 0000000..66cadce
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__threadsync_8h.html
@@ -0,0 +1,196 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/snmp_threadsync.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__threadsync_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">snmp_threadsync.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="sys_8h.html">lwip/sys.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structthreadsync__data.html">threadsync_data</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="structsnmp__threadsync__instance.html">snmp_threadsync_instance</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="structsnmp__threadsync__node.html">snmp_threadsync_node</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a1971c27c8addf1c426abd1abac54c8d2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__threadsync_8h.html#a1971c27c8addf1c426abd1abac54c8d2">SNMP_CREATE_THREAD_SYNC_NODE</a>(oid,  target_leaf_node,  threadsync_instance)</td></tr>
+<tr class="separator:a1971c27c8addf1c426abd1abac54c8d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a36e5b1dbb067641b7a6ac486b4ec15b6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__threadsync_8h.html#a36e5b1dbb067641b7a6ac486b4ec15b6">snmp_threadsync_init</a> (struct <a class="el" href="structsnmp__threadsync__instance.html">snmp_threadsync_instance</a> *instance, snmp_threadsync_synchronizer_fn sync_fn)</td></tr>
+<tr class="separator:a36e5b1dbb067641b7a6ac486b4ec15b6"><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 server MIB API to implement thread synchronization </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a1971c27c8addf1c426abd1abac54c8d2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1971c27c8addf1c426abd1abac54c8d2">&#9670;&nbsp;</a></span>SNMP_CREATE_THREAD_SYNC_NODE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNMP_CREATE_THREAD_SYNC_NODE</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">oid, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">target_leaf_node, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">threadsync_instance&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">{{{ SNMP_NODE_THREADSYNC, (oid) }, \</div><div class="line">    snmp_threadsync_get_instance, \</div><div class="line">    snmp_threadsync_get_next_instance }, \</div><div class="line">    (target_leaf_node), \</div><div class="line">    (threadsync_instance) }</div></div><!-- fragment --><p>Create thread sync proxy node </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a36e5b1dbb067641b7a6ac486b4ec15b6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a36e5b1dbb067641b7a6ac486b4ec15b6">&#9670;&nbsp;</a></span>snmp_threadsync_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_threadsync_init </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__threadsync__instance.html">snmp_threadsync_instance</a> *&#160;</td>
+          <td class="paramname"><em>instance</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">snmp_threadsync_synchronizer_fn&#160;</td>
+          <td class="paramname"><em>sync_fn</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create thread sync instance data</p>
+<p>Initializes thread synchronization instance </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="dir_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="snmp__threadsync_8h.html">snmp_threadsync.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__threadsync_8h.js b/doc/doxygen/output/html/snmp__threadsync_8h.js
new file mode 100644
index 0000000..78284bc
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__threadsync_8h.js
@@ -0,0 +1,8 @@
+var snmp__threadsync_8h =
+[
+    [ "threadsync_data", "structthreadsync__data.html", null ],
+    [ "snmp_threadsync_instance", "structsnmp__threadsync__instance.html", null ],
+    [ "snmp_threadsync_node", "structsnmp__threadsync__node.html", null ],
+    [ "SNMP_CREATE_THREAD_SYNC_NODE", "snmp__threadsync_8h.html#a1971c27c8addf1c426abd1abac54c8d2", null ],
+    [ "snmp_threadsync_init", "snmp__threadsync_8h.html#a36e5b1dbb067641b7a6ac486b4ec15b6", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmp__traps_8c.html b/doc/doxygen/output/html/snmp__traps_8c.html
new file mode 100644
index 0000000..00a54b8
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__traps_8c.html
@@ -0,0 +1,176 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmp_traps.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmp__traps_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_traps.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="snmp_8h.html">lwip/snmp.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="apps_2snmp_8h.html">lwip/apps/snmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__core_8h.html">lwip/apps/snmp_core.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="snmp__msg_8h.html">snmp_msg.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__asn1_8h.html">snmp_asn1.h</a>&quot;</code><br />
+<code>#include &quot;snmp_core_priv.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gab101505be59778cf0f2f1ac40bcf3f32"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32">snmp_trap_dst_enable</a> (u8_t dst_idx, u8_t enable)</td></tr>
+<tr class="separator:gab101505be59778cf0f2f1ac40bcf3f32"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga15e4afbf80ed2260850842e6608c6d86"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86">snmp_trap_dst_ip_set</a> (u8_t dst_idx, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dst)</td></tr>
+<tr class="separator:ga15e4afbf80ed2260850842e6608c6d86"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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"><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: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"><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:gaa8a49d1a6a207740ba44e27b5bbc22be"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be">snmp_coldstart_trap</a> (void)</td></tr>
+<tr class="separator:gaa8a49d1a6a207740ba44e27b5bbc22be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a2e2007343d9492b8e31d363d2c6ad79b"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__traps_8c.html#a2e2007343d9492b8e31d363d2c6ad79b">snmp_community_trap</a></td></tr>
+<tr class="separator:a2e2007343d9492b8e31d363d2c6ad79b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ade16efa80e2c2a20236d3cb96b19c79a"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="snmp__traps_8c.html#ade16efa80e2c2a20236d3cb96b19c79a">snmp_traps_handle</a></td></tr>
+<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><h2 class="groupheader">Variable Documentation</h2>
+<a id="a2e2007343d9492b8e31d363d2c6ad79b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2e2007343d9492b8e31d363d2c6ad79b">&#9670;&nbsp;</a></span>snmp_community_trap</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* snmp_community_trap</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Agent community string for sending traps</p>
+<p>SNMP community string for sending traps </p>
+
+</div>
+</div>
+<a id="ade16efa80e2c2a20236d3cb96b19c79a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ade16efa80e2c2a20236d3cb96b19c79a">&#9670;&nbsp;</a></span>snmp_traps_handle</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* snmp_traps_handle</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>handle for sending traps </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_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmp__traps_8c.html">snmp_traps.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmp__traps_8c.js b/doc/doxygen/output/html/snmp__traps_8c.js
new file mode 100644
index 0000000..be7fdd9
--- /dev/null
+++ b/doc/doxygen/output/html/snmp__traps_8c.js
@@ -0,0 +1,14 @@
+var snmp__traps_8c =
+[
+    [ "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_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_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 ],
+    [ "snmp_traps_handle", "snmp__traps_8c.html#ade16efa80e2c2a20236d3cb96b19c79a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/snmpv3_8c.html b/doc/doxygen/output/html/snmpv3_8c.html
new file mode 100644
index 0000000..4e78383
--- /dev/null
+++ b/doc/doxygen/output/html/snmpv3_8c.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmpv3.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmpv3_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmpv3.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmpv3__priv_8h.html">snmpv3_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmpv3_8h.html">lwip/apps/snmpv3.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 />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Additional SNMPv3 functionality RFC3414 and RFC3826. </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmpv3_8c.html">snmpv3.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmpv3_8h.html b/doc/doxygen/output/html/snmpv3_8h.html
new file mode 100644
index 0000000..e42d9b5
--- /dev/null
+++ b/doc/doxygen/output/html/snmpv3_8h.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/snmpv3.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmpv3_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmpv3.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="err_8h.html">lwip/err.h</a>&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Additional SNMPv3 functionality RFC3414 and RFC3826. </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_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="snmpv3_8h.html">snmpv3.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmpv3__mbedtls_8c.html b/doc/doxygen/output/html/snmpv3__mbedtls_8c.html
new file mode 100644
index 0000000..d56dd61
--- /dev/null
+++ b/doc/doxygen/output/html/snmpv3__mbedtls_8c.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmpv3_mbedtls.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmpv3__mbedtls_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmpv3_mbedtls.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmpv3_8h.html">lwip/apps/snmpv3.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmpv3__priv_8h.html">snmpv3_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="arch_8h.html">lwip/arch.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="snmp__msg_8h.html">snmp_msg.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 />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SNMPv3 crypto/auth functions implemented for ARM mbedtls. </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmpv3__mbedtls_8c.html">snmpv3_mbedtls.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/snmpv3__priv_8h.html b/doc/doxygen/output/html/snmpv3__priv_8h.html
new file mode 100644
index 0000000..f472925
--- /dev/null
+++ b/doc/doxygen/output/html/snmpv3__priv_8h.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/snmp/snmpv3_priv.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('snmpv3__priv_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmpv3_priv.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="snmp__opts_8h.html">lwip/apps/snmp_opts.h</a>&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Additional SNMPv3 functionality RFC3414 and RFC3826 (internal API, do not use in client code). </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_fb3f7e43f39ddb210bd1444e66d055f1.html">snmp</a></li><li class="navelem"><a class="el" href="snmpv3__priv_8h.html">snmpv3_priv.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/sntp_8c.html b/doc/doxygen/output/html/sntp_8c.html
new file mode 100644
index 0000000..bb5a49f
--- /dev/null
+++ b/doc/doxygen/output/html/sntp_8c.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/sntp/sntp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('sntp_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">sntp.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="sntp_8h.html">lwip/apps/sntp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="opt_8h.html">lwip/opt.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="udp_8h.html">lwip/udp.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="ip__addr_8h.html">lwip/ip_addr.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="dhcp_8h.html">lwip/dhcp.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &lt;time.h&gt;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structsntp__time.html">sntp_time</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="structsntp__timestamps.html">sntp_timestamps</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="structsntp__msg.html">sntp_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="structsntp__server.html">sntp_server</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:aebe74c93643ac9b8c8a9c7d223192c8f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sntp_8c.html#aebe74c93643ac9b8c8a9c7d223192c8f">SNTP_FRAC_TO_US</a>(f)&#160;&#160;&#160;((u32_t)(f) / 4295)</td></tr>
+<tr class="separator:aebe74c93643ac9b8c8a9c7d223192c8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga9b300c6616de60524c85ea40bf70e2ba"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba">sntp_init</a> (void)</td></tr>
+<tr class="separator:ga9b300c6616de60524c85ea40bf70e2ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8119fc2d1ff7ff6eba511cc9c7167488"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488">sntp_stop</a> (void)</td></tr>
+<tr class="separator:ga8119fc2d1ff7ff6eba511cc9c7167488"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3fe5254e5a056fca80802d9f26b9c3c5"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5">sntp_enabled</a> (void)</td></tr>
+<tr class="separator:ga3fe5254e5a056fca80802d9f26b9c3c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaae94fb2adadbf9667e9597f8a45bf120"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120">sntp_setoperatingmode</a> (u8_t operating_mode)</td></tr>
+<tr class="separator:gaae94fb2adadbf9667e9597f8a45bf120"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae66404a551d5cef420cf844a71356fae"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#gae66404a551d5cef420cf844a71356fae">sntp_getoperatingmode</a> (void)</td></tr>
+<tr class="separator:gae66404a551d5cef420cf844a71356fae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="memitem:ga4fa038dcea66349fafdbe1cc3e52ff3a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a">sntp_setserver</a> (u8_t idx, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *server)</td></tr>
+<tr class="separator:ga4fa038dcea66349fafdbe1cc3e52ff3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2a28523cb9f2b5b025a4818bc2c1afc1"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#ga2a28523cb9f2b5b025a4818bc2c1afc1">sntp_getserver</a> (u8_t idx)</td></tr>
+<tr class="separator:ga2a28523cb9f2b5b025a4818bc2c1afc1"><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>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="aebe74c93643ac9b8c8a9c7d223192c8f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aebe74c93643ac9b8c8a9c7d223192c8f">&#9670;&nbsp;</a></span>SNTP_FRAC_TO_US</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SNTP_FRAC_TO_US</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">f</td><td>)</td>
+          <td>&#160;&#160;&#160;((u32_t)(f) / 4295)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert NTP timestamp fraction to microseconds. </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_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_e7856a6aeaebbc124e80ad9550aedba4.html">sntp</a></li><li class="navelem"><a class="el" href="sntp_8c.html">sntp.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/sntp_8c.js b/doc/doxygen/output/html/sntp_8c.js
new file mode 100644
index 0000000..1140fef
--- /dev/null
+++ b/doc/doxygen/output/html/sntp_8c.js
@@ -0,0 +1,16 @@
+var sntp_8c =
+[
+    [ "sntp_time", "structsntp__time.html", null ],
+    [ "sntp_timestamps", "structsntp__timestamps.html", null ],
+    [ "sntp_msg", "structsntp__msg.html", null ],
+    [ "sntp_server", "structsntp__server.html", "structsntp__server" ],
+    [ "SNTP_FRAC_TO_US", "sntp_8c.html#aebe74c93643ac9b8c8a9c7d223192c8f", null ],
+    [ "sntp_enabled", "group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5", null ],
+    [ "sntp_getoperatingmode", "group__sntp.html#gae66404a551d5cef420cf844a71356fae", null ],
+    [ "sntp_getreachability", "group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e", null ],
+    [ "sntp_getserver", "group__sntp.html#ga2a28523cb9f2b5b025a4818bc2c1afc1", null ],
+    [ "sntp_init", "group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba", null ],
+    [ "sntp_setoperatingmode", "group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120", null ],
+    [ "sntp_setserver", "group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a", null ],
+    [ "sntp_stop", "group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/sntp_8h.html b/doc/doxygen/output/html/sntp_8h.html
new file mode 100644
index 0000000..3a72115
--- /dev/null
+++ b/doc/doxygen/output/html/sntp_8h.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/sntp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('sntp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">sntp.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="sntp__opts_8h.html">lwip/apps/sntp_opts.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaae94fb2adadbf9667e9597f8a45bf120"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120">sntp_setoperatingmode</a> (u8_t operating_mode)</td></tr>
+<tr class="separator:gaae94fb2adadbf9667e9597f8a45bf120"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae66404a551d5cef420cf844a71356fae"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#gae66404a551d5cef420cf844a71356fae">sntp_getoperatingmode</a> (void)</td></tr>
+<tr class="separator:gae66404a551d5cef420cf844a71356fae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9b300c6616de60524c85ea40bf70e2ba"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba">sntp_init</a> (void)</td></tr>
+<tr class="separator:ga9b300c6616de60524c85ea40bf70e2ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8119fc2d1ff7ff6eba511cc9c7167488"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488">sntp_stop</a> (void)</td></tr>
+<tr class="separator:ga8119fc2d1ff7ff6eba511cc9c7167488"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3fe5254e5a056fca80802d9f26b9c3c5"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5">sntp_enabled</a> (void)</td></tr>
+<tr class="separator:ga3fe5254e5a056fca80802d9f26b9c3c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4fa038dcea66349fafdbe1cc3e52ff3a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a">sntp_setserver</a> (u8_t idx, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr)</td></tr>
+<tr class="separator:ga4fa038dcea66349fafdbe1cc3e52ff3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2a28523cb9f2b5b025a4818bc2c1afc1"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#ga2a28523cb9f2b5b025a4818bc2c1afc1">sntp_getserver</a> (u8_t idx)</td></tr>
+<tr class="separator:ga2a28523cb9f2b5b025a4818bc2c1afc1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SNTP client API </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_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="sntp_8h.html">sntp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/sntp_8h.js b/doc/doxygen/output/html/sntp_8h.js
new file mode 100644
index 0000000..df73f8f
--- /dev/null
+++ b/doc/doxygen/output/html/sntp_8h.js
@@ -0,0 +1,11 @@
+var sntp_8h =
+[
+    [ "sntp_enabled", "group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5", null ],
+    [ "sntp_getoperatingmode", "group__sntp.html#gae66404a551d5cef420cf844a71356fae", null ],
+    [ "sntp_getreachability", "group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e", null ],
+    [ "sntp_getserver", "group__sntp.html#ga2a28523cb9f2b5b025a4818bc2c1afc1", null ],
+    [ "sntp_init", "group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba", null ],
+    [ "sntp_setoperatingmode", "group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120", null ],
+    [ "sntp_setserver", "group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a", null ],
+    [ "sntp_stop", "group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/sntp__opts_8h.html b/doc/doxygen/output/html/sntp__opts_8h.html
new file mode 100644
index 0000000..db2d432
--- /dev/null
+++ b/doc/doxygen/output/html/sntp__opts_8h.html
@@ -0,0 +1,144 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/sntp_opts.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('sntp__opts_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">sntp_opts.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="iana_8h.html">lwip/prot/iana.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:gafe340b98c52dedcbc041267fe13b2da6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#gafe340b98c52dedcbc041267fe13b2da6">SNTP_SET_SYSTEM_TIME</a>(sec)&#160;&#160;&#160;<a class="el" href="group__compiler__abstraction.html#ga70624a5deb8b9199406372a7f3603ecf">LWIP_UNUSED_ARG</a>(sec)</td></tr>
+<tr class="separator:gafe340b98c52dedcbc041267fe13b2da6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5d9dc0827f402849f5c18d44e311dbc2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga5d9dc0827f402849f5c18d44e311dbc2">SNTP_MAX_SERVERS</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2">LWIP_DHCP_MAX_NTP_SERVERS</a></td></tr>
+<tr class="separator:ga5d9dc0827f402849f5c18d44e311dbc2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga961a61eef942ab5378cff1e3742b3ade"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga961a61eef942ab5378cff1e3742b3ade">SNTP_GET_SERVERS_FROM_DHCP</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83">LWIP_DHCP_GET_NTP_SRV</a></td></tr>
+<tr class="separator:ga961a61eef942ab5378cff1e3742b3ade"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaef477c145ae404d77188b26b79b6996f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#gaef477c145ae404d77188b26b79b6996f">SNTP_SERVER_DNS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaef477c145ae404d77188b26b79b6996f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga25c6f9c14c17e218d110d826b09f8d91"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga25c6f9c14c17e218d110d826b09f8d91">SNTP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga25c6f9c14c17e218d110d826b09f8d91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacbee62c27f54371fc2c5259a834a0f9b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#gacbee62c27f54371fc2c5259a834a0f9b">SNTP_PORT</a>&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb">LWIP_IANA_PORT_SNTP</a></td></tr>
+<tr class="separator:gacbee62c27f54371fc2c5259a834a0f9b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7d4e12d90912d486e64f289d7f3ca446"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga7d4e12d90912d486e64f289d7f3ca446">SNTP_CHECK_RESPONSE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga7d4e12d90912d486e64f289d7f3ca446"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1e21781705d3549a305339fd7fca63e7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga1e21781705d3549a305339fd7fca63e7">SNTP_COMP_ROUNDTRIP</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga1e21781705d3549a305339fd7fca63e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga22017d43da7d4bf8d42e786b4ced4dfa"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga22017d43da7d4bf8d42e786b4ced4dfa">SNTP_STARTUP_DELAY</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga22017d43da7d4bf8d42e786b4ced4dfa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae082c2f3044d500ca5e1be1d4928de75"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#gae082c2f3044d500ca5e1be1d4928de75">SNTP_STARTUP_DELAY_FUNC</a>&#160;&#160;&#160;(<a class="el" href="group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a">LWIP_RAND</a>() % 5000)</td></tr>
+<tr class="separator:gae082c2f3044d500ca5e1be1d4928de75"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga44cf26b9b19832d88599244711a12d08"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga44cf26b9b19832d88599244711a12d08">SNTP_RECV_TIMEOUT</a>&#160;&#160;&#160;15000</td></tr>
+<tr class="separator:ga44cf26b9b19832d88599244711a12d08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9232c56443115be05a2f852eba21979c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga9232c56443115be05a2f852eba21979c">SNTP_UPDATE_DELAY</a>&#160;&#160;&#160;3600000</td></tr>
+<tr class="separator:ga9232c56443115be05a2f852eba21979c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab0ea385479a5c5c8c173f165ded2fb63"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#gab0ea385479a5c5c8c173f165ded2fb63">SNTP_GET_SYSTEM_TIME</a>(sec,  us)&#160;&#160;&#160;do { (sec) = 0; (us) = 0; } while(0)</td></tr>
+<tr class="separator:gab0ea385479a5c5c8c173f165ded2fb63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga86d651d8eb07687208308deef95a23ba"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga86d651d8eb07687208308deef95a23ba">SNTP_RETRY_TIMEOUT</a>&#160;&#160;&#160;<a class="el" href="group__sntp__opts.html#ga44cf26b9b19832d88599244711a12d08">SNTP_RECV_TIMEOUT</a></td></tr>
+<tr class="separator:ga86d651d8eb07687208308deef95a23ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafde10b3ed7cb4bb2cd2c4daa389db699"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#gafde10b3ed7cb4bb2cd2c4daa389db699">SNTP_RETRY_TIMEOUT_MAX</a>&#160;&#160;&#160;(<a class="el" href="group__sntp__opts.html#ga86d651d8eb07687208308deef95a23ba">SNTP_RETRY_TIMEOUT</a> * 10)</td></tr>
+<tr class="separator:gafde10b3ed7cb4bb2cd2c4daa389db699"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafdb7e98f608cc429188d7dac356614c2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#gafdb7e98f608cc429188d7dac356614c2">SNTP_RETRY_TIMEOUT_EXP</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gafdb7e98f608cc429188d7dac356614c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5782f21ef24ebddd5ba2ce9a889094e3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp__opts.html#ga5782f21ef24ebddd5ba2ce9a889094e3">SNTP_MONITOR_SERVER_REACHABILITY</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ga5782f21ef24ebddd5ba2ce9a889094e3"><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 options list </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_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="sntp__opts_8h.html">sntp_opts.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/sntp__opts_8h.js b/doc/doxygen/output/html/sntp__opts_8h.js
new file mode 100644
index 0000000..b76c438
--- /dev/null
+++ b/doc/doxygen/output/html/sntp__opts_8h.js
@@ -0,0 +1,20 @@
+var sntp__opts_8h =
+[
+    [ "SNTP_CHECK_RESPONSE", "group__sntp__opts.html#ga7d4e12d90912d486e64f289d7f3ca446", null ],
+    [ "SNTP_COMP_ROUNDTRIP", "group__sntp__opts.html#ga1e21781705d3549a305339fd7fca63e7", null ],
+    [ "SNTP_DEBUG", "group__sntp__opts.html#ga25c6f9c14c17e218d110d826b09f8d91", null ],
+    [ "SNTP_GET_SERVERS_FROM_DHCP", "group__sntp__opts.html#ga961a61eef942ab5378cff1e3742b3ade", null ],
+    [ "SNTP_GET_SYSTEM_TIME", "group__sntp__opts.html#gab0ea385479a5c5c8c173f165ded2fb63", null ],
+    [ "SNTP_MAX_SERVERS", "group__sntp__opts.html#ga5d9dc0827f402849f5c18d44e311dbc2", null ],
+    [ "SNTP_MONITOR_SERVER_REACHABILITY", "group__sntp__opts.html#ga5782f21ef24ebddd5ba2ce9a889094e3", null ],
+    [ "SNTP_PORT", "group__sntp__opts.html#gacbee62c27f54371fc2c5259a834a0f9b", null ],
+    [ "SNTP_RECV_TIMEOUT", "group__sntp__opts.html#ga44cf26b9b19832d88599244711a12d08", null ],
+    [ "SNTP_RETRY_TIMEOUT", "group__sntp__opts.html#ga86d651d8eb07687208308deef95a23ba", null ],
+    [ "SNTP_RETRY_TIMEOUT_EXP", "group__sntp__opts.html#gafdb7e98f608cc429188d7dac356614c2", null ],
+    [ "SNTP_RETRY_TIMEOUT_MAX", "group__sntp__opts.html#gafde10b3ed7cb4bb2cd2c4daa389db699", null ],
+    [ "SNTP_SERVER_DNS", "group__sntp__opts.html#gaef477c145ae404d77188b26b79b6996f", null ],
+    [ "SNTP_SET_SYSTEM_TIME", "group__sntp__opts.html#gafe340b98c52dedcbc041267fe13b2da6", null ],
+    [ "SNTP_STARTUP_DELAY", "group__sntp__opts.html#ga22017d43da7d4bf8d42e786b4ced4dfa", null ],
+    [ "SNTP_STARTUP_DELAY_FUNC", "group__sntp__opts.html#gae082c2f3044d500ca5e1be1d4928de75", null ],
+    [ "SNTP_UPDATE_DELAY", "group__sntp__opts.html#ga9232c56443115be05a2f852eba21979c", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/socket_8h.html b/doc/doxygen/output/html/socket_8h.html
new file mode 100644
index 0000000..6880bdb
--- /dev/null
+++ b/doc/doxygen/output/html/socket_8h.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/compat/posix/sys/socket.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('socket_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">socket.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="sockets_8h.html">lwip/sockets.h</a>&quot;</code><br />
+</div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This file is a posix wrapper for <a class="el" href="sockets_8h.html">lwip/sockets.h</a>. </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_1e445e767c368c70d58af8a0b7552719.html">compat</a></li><li class="navelem"><a class="el" href="dir_fe219fca207b878205c0dd92278d118b.html">posix</a></li><li class="navelem"><a class="el" href="dir_8da39adb2a11af660bdd7075b7323870.html">sys</a></li><li class="navelem"><a class="el" href="socket_8h.html">socket.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/sockets_8c.html b/doc/doxygen/output/html/sockets_8c.html
new file mode 100644
index 0000000..bc2cee4
--- /dev/null
+++ b/doc/doxygen/output/html/sockets_8c.html
@@ -0,0 +1,313 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/api/sockets.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('sockets_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">sockets.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 &quot;<a class="el" href="sockets_8h.html">lwip/sockets.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="sockets__priv_8h.html">lwip/priv/sockets_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="api_8h.html">lwip/api.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="lwip_2inet_8h.html">lwip/inet.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="raw_8h.html">lwip/raw.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="memp_8h.html">lwip/memp.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="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tcpip__priv_8h.html">lwip/priv/tcpip_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mld6_8h.html">lwip/mld6.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;path/to/my/lwip_hooks.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">union &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionsockaddr__aligned.html">sockaddr_aligned</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 name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:a2f15a466e75cbaaea0c31e63116870f9"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9">lwip_pollscan_opts</a> { <a class="el" href="sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9aa9a8fe3199d00016f1f5ad639e1b28f7">LWIP_POLLSCAN_CLEAR</a> = 1, 
+<a class="el" href="sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9ab6511d3104f70c18fb4bd80f24cb867d">LWIP_POLLSCAN_INC_WAIT</a> = 2, 
+<a class="el" href="sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9a6c1eefa3e29a39b923c4b522eb1b3eb1">LWIP_POLLSCAN_DEC_WAIT</a> = 4
+ }</td></tr>
+<tr class="separator:a2f15a466e75cbaaea0c31e63116870f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0a250b3b4d1827e3a3661327f5e80ae0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sockets_8c.html#a0a250b3b4d1827e3a3661327f5e80ae0">lwip_socket_thread_init</a> (void)</td></tr>
+<tr class="separator:a0a250b3b4d1827e3a3661327f5e80ae0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab8cd92b10dbe3fb33da03faed1ea98a7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sockets_8c.html#ab8cd92b10dbe3fb33da03faed1ea98a7">lwip_socket_thread_cleanup</a> (void)</td></tr>
+<tr class="separator:ab8cd92b10dbe3fb33da03faed1ea98a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abee6ee286147cf334a1ba19f19b2e08b"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sockets_8c.html#abee6ee286147cf334a1ba19f19b2e08b">lwip_listen</a> (int s, int backlog)</td></tr>
+<tr class="separator:abee6ee286147cf334a1ba19f19b2e08b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ade85c68b6673296c8fb67127b93fa4c1"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sockets_8c.html#ade85c68b6673296c8fb67127b93fa4c1">lwip_shutdown</a> (int s, int how)</td></tr>
+<tr class="separator:ade85c68b6673296c8fb67127b93fa4c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae84296093574ec746f8f88321356388f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sockets_8c.html#ae84296093574ec746f8f88321356388f">lwip_fcntl</a> (int s, int cmd, int val)</td></tr>
+<tr class="separator:ae84296093574ec746f8f88321356388f"><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>Sockets BSD-Like API module </p>
+</div><h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="a2f15a466e75cbaaea0c31e63116870f9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2f15a466e75cbaaea0c31e63116870f9">&#9670;&nbsp;</a></span>lwip_pollscan_opts</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9">lwip_pollscan_opts</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Options for the lwip_pollscan function. </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a2f15a466e75cbaaea0c31e63116870f9aa9a8fe3199d00016f1f5ad639e1b28f7"></a>LWIP_POLLSCAN_CLEAR&#160;</td><td class="fielddoc"><p>Clear revents in each struct pollfd. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a2f15a466e75cbaaea0c31e63116870f9ab6511d3104f70c18fb4bd80f24cb867d"></a>LWIP_POLLSCAN_INC_WAIT&#160;</td><td class="fielddoc"><p>Increment select_waiting in each struct <a class="el" href="structlwip__sock.html">lwip_sock</a>. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a2f15a466e75cbaaea0c31e63116870f9a6c1eefa3e29a39b923c4b522eb1b3eb1"></a>LWIP_POLLSCAN_DEC_WAIT&#160;</td><td class="fielddoc"><p>Decrement select_waiting in each struct <a class="el" href="structlwip__sock.html">lwip_sock</a>. </p>
+</td></tr>
+</table>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ae84296093574ec746f8f88321356388f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae84296093574ec746f8f88321356388f">&#9670;&nbsp;</a></span>lwip_fcntl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lwip_fcntl </td>
+          <td>(</td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>s</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>cmd</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>val</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A minimal implementation of fcntl. Currently only the commands F_GETFL and F_SETFL are implemented. The flag O_NONBLOCK and access modes are supported for F_GETFL, only the flag O_NONBLOCK is implemented for F_SETFL. </p>
+
+</div>
+</div>
+<a id="abee6ee286147cf334a1ba19f19b2e08b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abee6ee286147cf334a1ba19f19b2e08b">&#9670;&nbsp;</a></span>lwip_listen()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lwip_listen </td>
+          <td>(</td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>s</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>backlog</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set a socket into listen mode. The socket may not have been used for another connection previously.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">s</td><td>the socket to set to listening mode </td></tr>
+    <tr><td class="paramname">backlog</td><td>(ATTENTION: needs TCP_LISTEN_BACKLOG=1) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero on failure </dd></dl>
+
+</div>
+</div>
+<a id="ade85c68b6673296c8fb67127b93fa4c1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ade85c68b6673296c8fb67127b93fa4c1">&#9670;&nbsp;</a></span>lwip_shutdown()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lwip_shutdown </td>
+          <td>(</td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>s</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>how</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Close one end of a full-duplex connection. </p>
+
+</div>
+</div>
+<a id="ab8cd92b10dbe3fb33da03faed1ea98a7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab8cd92b10dbe3fb33da03faed1ea98a7">&#9670;&nbsp;</a></span>lwip_socket_thread_cleanup()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_socket_thread_cleanup </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETCONN_SEM_PER_THREAD==1: destroy thread-local semaphore </p>
+
+</div>
+</div>
+<a id="a0a250b3b4d1827e3a3661327f5e80ae0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0a250b3b4d1827e3a3661327f5e80ae0">&#9670;&nbsp;</a></span>lwip_socket_thread_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_socket_thread_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETCONN_SEM_PER_THREAD==1: initialize thread-local semaphore </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_da61e3e9a357748887e3ca8d7c5a0c16.html">api</a></li><li class="navelem"><a class="el" href="sockets_8c.html">sockets.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/sockets_8c.js b/doc/doxygen/output/html/sockets_8c.js
new file mode 100644
index 0000000..b5c847c
--- /dev/null
+++ b/doc/doxygen/output/html/sockets_8c.js
@@ -0,0 +1,14 @@
+var sockets_8c =
+[
+    [ "sockaddr_aligned", "unionsockaddr__aligned.html", null ],
+    [ "lwip_pollscan_opts", "sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9", [
+      [ "LWIP_POLLSCAN_CLEAR", "sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9aa9a8fe3199d00016f1f5ad639e1b28f7", null ],
+      [ "LWIP_POLLSCAN_INC_WAIT", "sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9ab6511d3104f70c18fb4bd80f24cb867d", null ],
+      [ "LWIP_POLLSCAN_DEC_WAIT", "sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9a6c1eefa3e29a39b923c4b522eb1b3eb1", null ]
+    ] ],
+    [ "lwip_fcntl", "sockets_8c.html#ae84296093574ec746f8f88321356388f", null ],
+    [ "lwip_listen", "sockets_8c.html#abee6ee286147cf334a1ba19f19b2e08b", null ],
+    [ "lwip_shutdown", "sockets_8c.html#ade85c68b6673296c8fb67127b93fa4c1", null ],
+    [ "lwip_socket_thread_cleanup", "sockets_8c.html#ab8cd92b10dbe3fb33da03faed1ea98a7", null ],
+    [ "lwip_socket_thread_init", "sockets_8c.html#a0a250b3b4d1827e3a3661327f5e80ae0", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/sockets_8h.html b/doc/doxygen/output/html/sockets_8h.html
new file mode 100644
index 0000000..f1ad96d
--- /dev/null
+++ b/doc/doxygen/output/html/sockets_8h.html
@@ -0,0 +1,345 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/sockets.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('sockets_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">sockets.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="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="err_8h.html">lwip/err.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 &quot;<a class="el" href="lwip_2errno_8h.html">lwip/errno.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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:aaffd64f6887883ec6401e6bb684c40fa"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sockets_8h.html#aaffd64f6887883ec6401e6bb684c40fa">LWIP_TIMEVAL_PRIVATE</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:aaffd64f6887883ec6401e6bb684c40fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gade2b17671b5a4b18e941fbf7e1060310"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gade2b17671b5a4b18e941fbf7e1060310">accept</a>(s,  addr,  addrlen)&#160;&#160;&#160;lwip_accept(s,addr,addrlen)</td></tr>
+<tr class="separator:gade2b17671b5a4b18e941fbf7e1060310"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4a88bb849aa7203b24bb245a193997a6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga4a88bb849aa7203b24bb245a193997a6">bind</a>(s,  name,  namelen)&#160;&#160;&#160;lwip_bind(s,name,namelen)</td></tr>
+<tr class="separator:ga4a88bb849aa7203b24bb245a193997a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7d832f77cfad97cf901640f243c6e682"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga7d832f77cfad97cf901640f243c6e682">shutdown</a>(s,  how)&#160;&#160;&#160;<a class="el" href="sockets_8h.html#ade85c68b6673296c8fb67127b93fa4c1">lwip_shutdown</a>(s,how)</td></tr>
+<tr class="separator:ga7d832f77cfad97cf901640f243c6e682"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga33bf1b7f5b11de02d0db32531cd940b8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga33bf1b7f5b11de02d0db32531cd940b8">getpeername</a>(s,  name,  namelen)&#160;&#160;&#160;lwip_getpeername(s,name,namelen)</td></tr>
+<tr class="separator:ga33bf1b7f5b11de02d0db32531cd940b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab096fb7dbc3f84be1699a87dce980f2f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gab096fb7dbc3f84be1699a87dce980f2f">getsockname</a>(s,  name,  namelen)&#160;&#160;&#160;lwip_getsockname(s,name,namelen)</td></tr>
+<tr class="separator:gab096fb7dbc3f84be1699a87dce980f2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga115d74cd1953e7bafc2e34157c697df1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga115d74cd1953e7bafc2e34157c697df1">setsockopt</a>(s,  level,  optname,  opval,  optlen)&#160;&#160;&#160;lwip_setsockopt(s,level,optname,opval,optlen)</td></tr>
+<tr class="separator:ga115d74cd1953e7bafc2e34157c697df1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad2de02b35dbbf2334d1befb137ede821"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gad2de02b35dbbf2334d1befb137ede821">getsockopt</a>(s,  level,  optname,  opval,  optlen)&#160;&#160;&#160;lwip_getsockopt(s,level,optname,opval,optlen)</td></tr>
+<tr class="separator:gad2de02b35dbbf2334d1befb137ede821"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5a3eb971b466278ada4f7f87399a537c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga5a3eb971b466278ada4f7f87399a537c">closesocket</a>(s)&#160;&#160;&#160;lwip_close(s)</td></tr>
+<tr class="separator:ga5a3eb971b466278ada4f7f87399a537c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae3d13671f622e17c17317c9a16dfd0ee"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gae3d13671f622e17c17317c9a16dfd0ee">connect</a>(s,  name,  namelen)&#160;&#160;&#160;lwip_connect(s,name,namelen)</td></tr>
+<tr class="separator:gae3d13671f622e17c17317c9a16dfd0ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae6e6de5a20bed9fc7078f0e6c9c4aca4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gae6e6de5a20bed9fc7078f0e6c9c4aca4">listen</a>(s,  backlog)&#160;&#160;&#160;<a class="el" href="sockets_8h.html#abee6ee286147cf334a1ba19f19b2e08b">lwip_listen</a>(s,backlog)</td></tr>
+<tr class="separator:gae6e6de5a20bed9fc7078f0e6c9c4aca4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadd7ae45df7c005619eb1126542231e9b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gadd7ae45df7c005619eb1126542231e9b">recv</a>(s,  <a class="el" href="structmem.html">mem</a>,  len,  flags)&#160;&#160;&#160;lwip_recv(s,<a class="el" href="structmem.html">mem</a>,len,flags)</td></tr>
+<tr class="separator:gadd7ae45df7c005619eb1126542231e9b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaecfc7d524105e52604829c66ced752b8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gaecfc7d524105e52604829c66ced752b8">recvmsg</a>(s,  message,  flags)&#160;&#160;&#160;lwip_recvmsg(s,message,flags)</td></tr>
+<tr class="separator:gaecfc7d524105e52604829c66ced752b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5e5f7bcda6562bae815e188ea1a81ecd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga5e5f7bcda6562bae815e188ea1a81ecd">recvfrom</a>(s,  <a class="el" href="structmem.html">mem</a>,  len,  flags,  from,  fromlen)&#160;&#160;&#160;lwip_recvfrom(s,<a class="el" href="structmem.html">mem</a>,len,flags,from,fromlen)</td></tr>
+<tr class="separator:ga5e5f7bcda6562bae815e188ea1a81ecd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga19024690fdfd3512d24dcaa9b80d24ed"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga19024690fdfd3512d24dcaa9b80d24ed">send</a>(s,  dataptr,  size,  flags)&#160;&#160;&#160;lwip_send(s,dataptr,size,flags)</td></tr>
+<tr class="separator:ga19024690fdfd3512d24dcaa9b80d24ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaad99bea090b1fe4743234fcee15a5d28"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gaad99bea090b1fe4743234fcee15a5d28">sendmsg</a>(s,  message,  flags)&#160;&#160;&#160;lwip_sendmsg(s,message,flags)</td></tr>
+<tr class="separator:gaad99bea090b1fe4743234fcee15a5d28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaa17499d76ef421821fe72fd29fe38f7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gaaa17499d76ef421821fe72fd29fe38f7">sendto</a>(s,  dataptr,  size,  flags,  to,  tolen)&#160;&#160;&#160;lwip_sendto(s,dataptr,size,flags,to,tolen)</td></tr>
+<tr class="separator:gaaa17499d76ef421821fe72fd29fe38f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga862d8f4070c66dddb979540ce9ba6a83"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga862d8f4070c66dddb979540ce9ba6a83">socket</a>(domain,  type,  protocol)&#160;&#160;&#160;lwip_socket(domain,type,protocol)</td></tr>
+<tr class="separator:ga862d8f4070c66dddb979540ce9ba6a83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac332b9b9b2cd877a6189ef838de49e33"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gac332b9b9b2cd877a6189ef838de49e33">select</a>(maxfdp1,  readset,  writeset,  exceptset,  timeout)&#160;&#160;&#160;lwip_select(maxfdp1,readset,writeset,exceptset,timeout)</td></tr>
+<tr class="separator:gac332b9b9b2cd877a6189ef838de49e33"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga80ae38841b0e64e60618cd8bf857f617"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga80ae38841b0e64e60618cd8bf857f617">poll</a>(fds,  nfds,  timeout)&#160;&#160;&#160;lwip_poll(fds,nfds,timeout)</td></tr>
+<tr class="separator:ga80ae38841b0e64e60618cd8bf857f617"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga19e714443d0238cfd79b71059ec92378"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga19e714443d0238cfd79b71059ec92378">ioctlsocket</a>(s,  cmd,  argp)&#160;&#160;&#160;lwip_ioctl(s,cmd,argp)</td></tr>
+<tr class="separator:ga19e714443d0238cfd79b71059ec92378"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa40bf11abb409097e68aa3a6982eb52b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gaa40bf11abb409097e68aa3a6982eb52b">inet_ntop</a>(af,  src,  dst,  size)&#160;&#160;&#160;lwip_inet_ntop(af,src,dst,size)</td></tr>
+<tr class="separator:gaa40bf11abb409097e68aa3a6982eb52b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga90d2b417d82e8da981c940a665324fd5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga90d2b417d82e8da981c940a665324fd5">inet_pton</a>(af,  src,  dst)&#160;&#160;&#160;lwip_inet_pton(af,src,dst)</td></tr>
+<tr class="separator:ga90d2b417d82e8da981c940a665324fd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga822040573319cf87bfe6758d511be57f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga822040573319cf87bfe6758d511be57f">read</a>(s,  <a class="el" href="structmem.html">mem</a>,  len)&#160;&#160;&#160;lwip_read(s,<a class="el" href="structmem.html">mem</a>,len)</td></tr>
+<tr class="separator:ga822040573319cf87bfe6758d511be57f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga86788b3c690d38699fdbaea523ddec9d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga86788b3c690d38699fdbaea523ddec9d">readv</a>(s,  iov,  iovcnt)&#160;&#160;&#160;lwip_readv(s,iov,iovcnt)</td></tr>
+<tr class="separator:ga86788b3c690d38699fdbaea523ddec9d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0a651eb5fb5e6127f5e5153ce2251f3d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga0a651eb5fb5e6127f5e5153ce2251f3d">write</a>(s,  dataptr,  len)&#160;&#160;&#160;lwip_write(s,dataptr,len)</td></tr>
+<tr class="separator:ga0a651eb5fb5e6127f5e5153ce2251f3d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga697fd916a65a10b4dcb54b8199346fee"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga697fd916a65a10b4dcb54b8199346fee">writev</a>(s,  iov,  iovcnt)&#160;&#160;&#160;lwip_writev(s,iov,iovcnt)</td></tr>
+<tr class="separator:ga697fd916a65a10b4dcb54b8199346fee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4ef17e85ec4d3acdcee5ce23f8ed93c4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga4ef17e85ec4d3acdcee5ce23f8ed93c4">close</a>(s)&#160;&#160;&#160;lwip_close(s)</td></tr>
+<tr class="separator:ga4ef17e85ec4d3acdcee5ce23f8ed93c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaa2b0e00cab161fcc4b31ee0d06e7eb3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#gaaa2b0e00cab161fcc4b31ee0d06e7eb3">fcntl</a>(s,  cmd,  val)&#160;&#160;&#160;<a class="el" href="sockets_8h.html#ae84296093574ec746f8f88321356388f">lwip_fcntl</a>(s,cmd,val)</td></tr>
+<tr class="separator:gaaa2b0e00cab161fcc4b31ee0d06e7eb3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga50a83956bc3a96e6274a21ec0d4d6338"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__socket.html#ga50a83956bc3a96e6274a21ec0d4d6338">ioctl</a>(s,  cmd,  argp)&#160;&#160;&#160;lwip_ioctl(s,cmd,argp)</td></tr>
+<tr class="separator:ga50a83956bc3a96e6274a21ec0d4d6338"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0a250b3b4d1827e3a3661327f5e80ae0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sockets_8h.html#a0a250b3b4d1827e3a3661327f5e80ae0">lwip_socket_thread_init</a> (void)</td></tr>
+<tr class="separator:a0a250b3b4d1827e3a3661327f5e80ae0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab8cd92b10dbe3fb33da03faed1ea98a7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sockets_8h.html#ab8cd92b10dbe3fb33da03faed1ea98a7">lwip_socket_thread_cleanup</a> (void)</td></tr>
+<tr class="separator:ab8cd92b10dbe3fb33da03faed1ea98a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ade85c68b6673296c8fb67127b93fa4c1"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sockets_8h.html#ade85c68b6673296c8fb67127b93fa4c1">lwip_shutdown</a> (int s, int how)</td></tr>
+<tr class="separator:ade85c68b6673296c8fb67127b93fa4c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abee6ee286147cf334a1ba19f19b2e08b"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sockets_8h.html#abee6ee286147cf334a1ba19f19b2e08b">lwip_listen</a> (int s, int backlog)</td></tr>
+<tr class="separator:abee6ee286147cf334a1ba19f19b2e08b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae84296093574ec746f8f88321356388f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sockets_8h.html#ae84296093574ec746f8f88321356388f">lwip_fcntl</a> (int s, int cmd, int val)</td></tr>
+<tr class="separator:ae84296093574ec746f8f88321356388f"><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>Socket API (to be used from non-TCPIP threads) </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="aaffd64f6887883ec6401e6bb684c40fa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaffd64f6887883ec6401e6bb684c40fa">&#9670;&nbsp;</a></span>LWIP_TIMEVAL_PRIVATE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_TIMEVAL_PRIVATE&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided by your system, set this to 0 and include &lt;sys/time.h&gt; in cc.h </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ae84296093574ec746f8f88321356388f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae84296093574ec746f8f88321356388f">&#9670;&nbsp;</a></span>lwip_fcntl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lwip_fcntl </td>
+          <td>(</td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>s</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>cmd</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>val</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A minimal implementation of fcntl. Currently only the commands F_GETFL and F_SETFL are implemented. The flag O_NONBLOCK and access modes are supported for F_GETFL, only the flag O_NONBLOCK is implemented for F_SETFL. </p>
+
+</div>
+</div>
+<a id="abee6ee286147cf334a1ba19f19b2e08b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abee6ee286147cf334a1ba19f19b2e08b">&#9670;&nbsp;</a></span>lwip_listen()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lwip_listen </td>
+          <td>(</td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>s</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>backlog</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set a socket into listen mode. The socket may not have been used for another connection previously.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">s</td><td>the socket to set to listening mode </td></tr>
+    <tr><td class="paramname">backlog</td><td>(ATTENTION: needs TCP_LISTEN_BACKLOG=1) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero on failure </dd></dl>
+
+</div>
+</div>
+<a id="ade85c68b6673296c8fb67127b93fa4c1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ade85c68b6673296c8fb67127b93fa4c1">&#9670;&nbsp;</a></span>lwip_shutdown()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lwip_shutdown </td>
+          <td>(</td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>s</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>how</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Close one end of a full-duplex connection. </p>
+
+</div>
+</div>
+<a id="ab8cd92b10dbe3fb33da03faed1ea98a7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab8cd92b10dbe3fb33da03faed1ea98a7">&#9670;&nbsp;</a></span>lwip_socket_thread_cleanup()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_socket_thread_cleanup </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETCONN_SEM_PER_THREAD==1: destroy thread-local semaphore </p>
+
+</div>
+</div>
+<a id="a0a250b3b4d1827e3a3661327f5e80ae0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0a250b3b4d1827e3a3661327f5e80ae0">&#9670;&nbsp;</a></span>lwip_socket_thread_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lwip_socket_thread_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_NETCONN_SEM_PER_THREAD==1: initialize thread-local semaphore </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="sockets_8h.html">sockets.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/sockets_8h.js b/doc/doxygen/output/html/sockets_8h.js
new file mode 100644
index 0000000..7463dff
--- /dev/null
+++ b/doc/doxygen/output/html/sockets_8h.js
@@ -0,0 +1,38 @@
+var sockets_8h =
+[
+    [ "accept", "group__socket.html#gade2b17671b5a4b18e941fbf7e1060310", null ],
+    [ "bind", "group__socket.html#ga4a88bb849aa7203b24bb245a193997a6", null ],
+    [ "close", "group__socket.html#ga4ef17e85ec4d3acdcee5ce23f8ed93c4", null ],
+    [ "closesocket", "group__socket.html#ga5a3eb971b466278ada4f7f87399a537c", null ],
+    [ "connect", "group__socket.html#gae3d13671f622e17c17317c9a16dfd0ee", null ],
+    [ "fcntl", "group__socket.html#gaaa2b0e00cab161fcc4b31ee0d06e7eb3", null ],
+    [ "getpeername", "group__socket.html#ga33bf1b7f5b11de02d0db32531cd940b8", null ],
+    [ "getsockname", "group__socket.html#gab096fb7dbc3f84be1699a87dce980f2f", null ],
+    [ "getsockopt", "group__socket.html#gad2de02b35dbbf2334d1befb137ede821", null ],
+    [ "inet_ntop", "group__socket.html#gaa40bf11abb409097e68aa3a6982eb52b", null ],
+    [ "inet_pton", "group__socket.html#ga90d2b417d82e8da981c940a665324fd5", null ],
+    [ "ioctl", "group__socket.html#ga50a83956bc3a96e6274a21ec0d4d6338", null ],
+    [ "ioctlsocket", "group__socket.html#ga19e714443d0238cfd79b71059ec92378", null ],
+    [ "listen", "group__socket.html#gae6e6de5a20bed9fc7078f0e6c9c4aca4", null ],
+    [ "LWIP_TIMEVAL_PRIVATE", "sockets_8h.html#aaffd64f6887883ec6401e6bb684c40fa", null ],
+    [ "poll", "group__socket.html#ga80ae38841b0e64e60618cd8bf857f617", null ],
+    [ "read", "group__socket.html#ga822040573319cf87bfe6758d511be57f", null ],
+    [ "readv", "group__socket.html#ga86788b3c690d38699fdbaea523ddec9d", null ],
+    [ "recv", "group__socket.html#gadd7ae45df7c005619eb1126542231e9b", null ],
+    [ "recvfrom", "group__socket.html#ga5e5f7bcda6562bae815e188ea1a81ecd", null ],
+    [ "recvmsg", "group__socket.html#gaecfc7d524105e52604829c66ced752b8", null ],
+    [ "select", "group__socket.html#gac332b9b9b2cd877a6189ef838de49e33", null ],
+    [ "send", "group__socket.html#ga19024690fdfd3512d24dcaa9b80d24ed", null ],
+    [ "sendmsg", "group__socket.html#gaad99bea090b1fe4743234fcee15a5d28", null ],
+    [ "sendto", "group__socket.html#gaaa17499d76ef421821fe72fd29fe38f7", null ],
+    [ "setsockopt", "group__socket.html#ga115d74cd1953e7bafc2e34157c697df1", null ],
+    [ "shutdown", "group__socket.html#ga7d832f77cfad97cf901640f243c6e682", null ],
+    [ "socket", "group__socket.html#ga862d8f4070c66dddb979540ce9ba6a83", null ],
+    [ "write", "group__socket.html#ga0a651eb5fb5e6127f5e5153ce2251f3d", null ],
+    [ "writev", "group__socket.html#ga697fd916a65a10b4dcb54b8199346fee", null ],
+    [ "lwip_fcntl", "sockets_8h.html#ae84296093574ec746f8f88321356388f", null ],
+    [ "lwip_listen", "sockets_8h.html#abee6ee286147cf334a1ba19f19b2e08b", null ],
+    [ "lwip_shutdown", "sockets_8h.html#ade85c68b6673296c8fb67127b93fa4c1", null ],
+    [ "lwip_socket_thread_cleanup", "sockets_8h.html#ab8cd92b10dbe3fb33da03faed1ea98a7", null ],
+    [ "lwip_socket_thread_init", "sockets_8h.html#a0a250b3b4d1827e3a3661327f5e80ae0", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/sockets__priv_8h.html b/doc/doxygen/output/html/sockets__priv_8h.html
new file mode 100644
index 0000000..7a8a9a4
--- /dev/null
+++ b/doc/doxygen/output/html/sockets__priv_8h.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/priv/sockets_priv.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('sockets__priv_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">sockets_priv.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="err_8h.html">lwip/err.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="sockets_8h.html">lwip/sockets.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="sys_8h.html">lwip/sys.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structlwip__sock.html">lwip_sock</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="structlwip__select__cb.html">lwip_select_cb</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a8f4d240733a9261c668fc66dc4ce8196"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sockets__priv_8h.html#a8f4d240733a9261c668fc66dc4ce8196">SELWAIT_T</a>&#160;&#160;&#160;u8_t</td></tr>
+<tr class="separator:a8f4d240733a9261c668fc66dc4ce8196"><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>Sockets API internal implementations (do not use in application code) </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a8f4d240733a9261c668fc66dc4ce8196"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8f4d240733a9261c668fc66dc4ce8196">&#9670;&nbsp;</a></span>SELWAIT_T</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SELWAIT_T&#160;&#160;&#160;u8_t</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This is overridable for the rare case where more than 255 threads select on the same socket... </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="dir_460c501b2432fc107adcb38111835e48.html">priv</a></li><li class="navelem"><a class="el" href="sockets__priv_8h.html">sockets_priv.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/sockets__priv_8h.js b/doc/doxygen/output/html/sockets__priv_8h.js
new file mode 100644
index 0000000..237eb68
--- /dev/null
+++ b/doc/doxygen/output/html/sockets__priv_8h.js
@@ -0,0 +1,6 @@
+var sockets__priv_8h =
+[
+    [ "lwip_sock", "structlwip__sock.html", "structlwip__sock" ],
+    [ "lwip_select_cb", "structlwip__select__cb.html", "structlwip__select__cb" ],
+    [ "SELWAIT_T", "sockets__priv_8h.html#a8f4d240733a9261c668fc66dc4ce8196", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/stats_8c.html b/doc/doxygen/output/html/stats_8c.html
new file mode 100644
index 0000000..a6e90e5
--- /dev/null
+++ b/doc/doxygen/output/html/stats_8c.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/stats.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('stats_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">stats.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 &quot;<a class="el" href="def_8h.html">lwip/def.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.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="debug_8h.html">lwip/debug.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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aeaa149d6c0445b22e944a063e0884d0d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stats_8c.html#aeaa149d6c0445b22e944a063e0884d0d">stats_init</a> (void)</td></tr>
+<tr class="separator:aeaa149d6c0445b22e944a063e0884d0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a614735db0145db9ba944ede600d1d19b"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__.html">stats_</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stats_8c.html#a614735db0145db9ba944ede600d1d19b">lwip_stats</a></td></tr>
+<tr class="separator:a614735db0145db9ba944ede600d1d19b"><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>Statistics module </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="aeaa149d6c0445b22e944a063e0884d0d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeaa149d6c0445b22e944a063e0884d0d">&#9670;&nbsp;</a></span>stats_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void stats_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Init statistics </p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="a614735db0145db9ba944ede600d1d19b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a614735db0145db9ba944ede600d1d19b">&#9670;&nbsp;</a></span>lwip_stats</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__.html">stats_</a> lwip_stats</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Global variable containing lwIP internal statistics. Add this to your debugger's watchlist. </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="stats_8c.html">stats.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/stats_8c.js b/doc/doxygen/output/html/stats_8c.js
new file mode 100644
index 0000000..ffdbbc2
--- /dev/null
+++ b/doc/doxygen/output/html/stats_8c.js
@@ -0,0 +1,5 @@
+var stats_8c =
+[
+    [ "stats_init", "stats_8c.html#aeaa149d6c0445b22e944a063e0884d0d", null ],
+    [ "lwip_stats", "stats_8c.html#a614735db0145db9ba944ede600d1d19b", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/stats_8h.html b/doc/doxygen/output/html/stats_8h.html
new file mode 100644
index 0000000..9348e94
--- /dev/null
+++ b/doc/doxygen/output/html/stats_8h.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/stats.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('stats_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">stats.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="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 />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structstats__proto.html">stats_proto</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="structstats__igmp.html">stats_igmp</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="structstats__mem.html">stats_mem</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="structstats__syselem.html">stats_syselem</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="structstats__sys.html">stats_sys</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="structstats__mib2.html">stats_mib2</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="structstats__mib2__netif__ctrs.html">stats_mib2_netif_ctrs</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="structstats__.html">stats_</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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aeaa149d6c0445b22e944a063e0884d0d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stats_8h.html#aeaa149d6c0445b22e944a063e0884d0d">stats_init</a> (void)</td></tr>
+<tr class="separator:aeaa149d6c0445b22e944a063e0884d0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a614735db0145db9ba944ede600d1d19b"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__.html">stats_</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stats_8h.html#a614735db0145db9ba944ede600d1d19b">lwip_stats</a></td></tr>
+<tr class="separator:a614735db0145db9ba944ede600d1d19b"><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>Statistics API (to be used from TCPIP thread) </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="aeaa149d6c0445b22e944a063e0884d0d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeaa149d6c0445b22e944a063e0884d0d">&#9670;&nbsp;</a></span>stats_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void stats_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Init statistics </p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="a614735db0145db9ba944ede600d1d19b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a614735db0145db9ba944ede600d1d19b">&#9670;&nbsp;</a></span>lwip_stats</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__.html">stats_</a> lwip_stats</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Global variable containing lwIP internal statistics. Add this to your debugger's watchlist. </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="stats_8h.html">stats.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/stats_8h.js b/doc/doxygen/output/html/stats_8h.js
new file mode 100644
index 0000000..f293e4f
--- /dev/null
+++ b/doc/doxygen/output/html/stats_8h.js
@@ -0,0 +1,12 @@
+var stats_8h =
+[
+    [ "stats_proto", "structstats__proto.html", null ],
+    [ "stats_igmp", "structstats__igmp.html", null ],
+    [ "stats_mem", "structstats__mem.html", null ],
+    [ "stats_syselem", "structstats__syselem.html", null ],
+    [ "stats_sys", "structstats__sys.html", null ],
+    [ "stats_mib2", "structstats__mib2.html", null ],
+    [ "stats_", "structstats__.html", "structstats__" ],
+    [ "stats_init", "stats_8h.html#aeaa149d6c0445b22e944a063e0884d0d", null ],
+    [ "lwip_stats", "stats_8h.html#a614735db0145db9ba944ede600d1d19b", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/struct__lwiperf__settings.html b/doc/doxygen/output/html/struct__lwiperf__settings.html
new file mode 100644
index 0000000..e552e8d
--- /dev/null
+++ b/doc/doxygen/output/html/struct__lwiperf__settings.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: _lwiperf_settings 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('struct__lwiperf__settings.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">_lwiperf_settings Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This is the Iperf settings struct sent from the client </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/apps/lwiperf/<a class="el" href="lwiperf_8c.html">lwiperf.c</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="struct__lwiperf__settings.html">_lwiperf_settings</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/struct__lwiperf__state__tcp.html b/doc/doxygen/output/html/struct__lwiperf__state__tcp.html
new file mode 100644
index 0000000..002e31b
--- /dev/null
+++ b/doc/doxygen/output/html/struct__lwiperf__state__tcp.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: _lwiperf_state_tcp 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('struct__lwiperf__state__tcp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">_lwiperf_state_tcp Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Connection handle for a TCP iperf session </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/apps/lwiperf/<a class="el" href="lwiperf_8c.html">lwiperf.c</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="struct__lwiperf__state__tcp.html">_lwiperf_state_tcp</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
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..9908bb2
--- /dev/null
+++ b/doc/doxygen/output/html/structaltcp__allocator__s.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structaltcp__allocator__s.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:aaf07ebf181a11d0320381ef46d40e687"><td class="memItemLeft" align="right" valign="top">altcp_new_fn&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structaltcp__allocator__s.html#aaf07ebf181a11d0320381ef46d40e687">alloc</a></td></tr>
+<tr class="separator:aaf07ebf181a11d0320381ef46d40e687"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d8aa48e9a105e9d25ad4b90d259d0b1"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structaltcp__allocator__s.html#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"></div><h2 class="groupheader">Field Documentation</h2>
+<a id="aaf07ebf181a11d0320381ef46d40e687"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaf07ebf181a11d0320381ef46d40e687">&#9670;&nbsp;</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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8d8aa48e9a105e9d25ad4b90d259d0b1">&#9670;&nbsp;</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </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
new file mode 100644
index 0000000..d0f5175
--- /dev/null
+++ b/doc/doxygen/output/html/structapi__msg.html
@@ -0,0 +1,394 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: api_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structapi__msg.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">api_msg Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;api_msg.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:abec5e33802d69f1b601543d60699f028"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structapi__msg.html#abec5e33802d69f1b601543d60699f028">conn</a></td></tr>
+<tr class="separator:abec5e33802d69f1b601543d60699f028"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="structapi__msg.html#a8c66bd95217fa627f13f2f0847bbb25f">err</a></td></tr>
+<tr class="separator:a8c66bd95217fa627f13f2f0847bbb25f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef71459b5251d796434f741ca630d528"><td class="memItemLeft" >union {</td></tr>
+<tr class="memitem:a4b3f4b921f7d95aace6d59656f6423d5"><td class="memItemLeft" >&#160;&#160;&#160;struct <a class="el" href="structnetbuf.html">netbuf</a> *&#160;&#160;&#160;<a class="el" href="structapi__msg.html#ab0abd60527e96cc24c2c20c835cdac05">b</a></td></tr>
+<tr class="separator:a4b3f4b921f7d95aace6d59656f6423d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c31b98d3203137d2d57df9a2c4e0e12"><td class="memItemLeft" >&#160;&#160;&#160;struct {</td></tr>
+<tr class="memitem:a7c31b98d3203137d2d57df9a2c4e0e12"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="structapi__msg.html#adbbfc2baa8088b31fc722365237e5807">n</a></td></tr>
+<tr class="separator:a7c31b98d3203137d2d57df9a2c4e0e12"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a07719d511c7737ead9d19f83a91a7e49"><td class="memItemLeft" >&#160;&#160;&#160;struct {</td></tr>
+<tr class="memitem:a07719d511c7737ead9d19f83a91a7e49"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="structapi__msg.html#a1705127c6cd22c2c6dbbcc59834e41e0">bc</a></td></tr>
+<tr class="separator:a07719d511c7737ead9d19f83a91a7e49"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa8b7047653a2722b94f559cb549966f6"><td class="memItemLeft" >&#160;&#160;&#160;struct {</td></tr>
+<tr class="memitem:aa8b7047653a2722b94f559cb549966f6"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="structapi__msg.html#a36dedcbd9ecca67043a8e1d1e715be94">ad</a></td></tr>
+<tr class="separator:aa8b7047653a2722b94f559cb549966f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab1226d50647bc5a0431adbfbaf1dd450"><td class="memItemLeft" >&#160;&#160;&#160;struct {</td></tr>
+<tr class="memitem: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="structapi__msg.html#a1ceb9822ba49ba439e30d98492593612">vector</a></td></tr>
+<tr class="separator:a20e17a02c95bf44d80a92aaf3a8bf95e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96c09ae2234151a29c3f6a4a9aa16a53"><td class="memItemLeft" >&#160;&#160;&#160;&#160;&#160;&#160;u16_t&#160;&#160;&#160;<a class="el" href="structapi__msg.html#ab6f14157a3e6735b69a569249d3286a2">vector_cnt</a></td></tr>
+<tr class="separator:a96c09ae2234151a29c3f6a4a9aa16a53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afa1b53759c1b1a4b27ca3d2aa4395443"><td class="memItemLeft" >&#160;&#160;&#160;&#160;&#160;&#160;size_t&#160;&#160;&#160;<a class="el" href="structapi__msg.html#a6896ae78ebddefdf2d8358ab5f21f444">vector_off</a></td></tr>
+<tr class="separator:afa1b53759c1b1a4b27ca3d2aa4395443"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa117e5e841efeedc4a904e1e92d69700"><td class="memItemLeft" >&#160;&#160;&#160;&#160;&#160;&#160;size_t&#160;&#160;&#160;<a class="el" href="structapi__msg.html#a40624c398d1939bfee54bffa708a363e">len</a></td></tr>
+<tr class="separator:aa117e5e841efeedc4a904e1e92d69700"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a756b5c1fec59e5cc4a9f7394b5f1676f"><td class="memItemLeft" >&#160;&#160;&#160;&#160;&#160;&#160;size_t&#160;&#160;&#160;<a class="el" href="structapi__msg.html#a4bd9382dd42b18120803e246a0203353">offset</a></td></tr>
+<tr class="separator:a756b5c1fec59e5cc4a9f7394b5f1676f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab1226d50647bc5a0431adbfbaf1dd450"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="structapi__msg.html#a8a71456d1199d10af5c1d8760cc0ce73">w</a></td></tr>
+<tr class="separator:ab1226d50647bc5a0431adbfbaf1dd450"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb83f179e2d9b908cee2e193a5dca341"><td class="memItemLeft" >&#160;&#160;&#160;struct {</td></tr>
+<tr class="memitem:acb83f179e2d9b908cee2e193a5dca341"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="structapi__msg.html#aebd72e07e711e7135294563b82c98cdf">r</a></td></tr>
+<tr class="separator:acb83f179e2d9b908cee2e193a5dca341"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b0349f1bc8f08056eff2de65644bc28"><td class="memItemLeft" >&#160;&#160;&#160;struct {</td></tr>
+<tr class="memitem:a4b0349f1bc8f08056eff2de65644bc28"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="structapi__msg.html#ad5e8bf133bc5ba4c78822af297330ce4">sd</a></td></tr>
+<tr class="separator:a4b0349f1bc8f08056eff2de65644bc28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae8ee876cff38abe9517876271b1681e"><td class="memItemLeft" >&#160;&#160;&#160;struct {</td></tr>
+<tr class="memitem:aae8ee876cff38abe9517876271b1681e"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="structapi__msg.html#a6387bddb309c218ac0ccc5ef6d7a033e">jl</a></td></tr>
+<tr class="separator:aae8ee876cff38abe9517876271b1681e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef71459b5251d796434f741ca630d528"><td class="memItemLeft" valign="top">}&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structapi__msg.html#aef71459b5251d796434f741ca630d528">msg</a></td></tr>
+<tr class="separator:aef71459b5251d796434f741ca630d528"><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="a36dedcbd9ecca67043a8e1d1e715be94"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a36dedcbd9ecca67043a8e1d1e715be94">&#9670;&nbsp;</a></span>ad</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct { ... }   api_msg::ad</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>used for lwip_netconn_do_getaddr </p>
+
+</div>
+</div>
+<a id="ab0abd60527e96cc24c2c20c835cdac05"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab0abd60527e96cc24c2c20c835cdac05">&#9670;&nbsp;</a></span>b</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetbuf.html">netbuf</a>* api_msg::b</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>used for lwip_netconn_do_send </p>
+
+</div>
+</div>
+<a id="a1705127c6cd22c2c6dbbcc59834e41e0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1705127c6cd22c2c6dbbcc59834e41e0">&#9670;&nbsp;</a></span>bc</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct { ... }   api_msg::bc</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>used for lwip_netconn_do_bind and lwip_netconn_do_connect </p>
+
+</div>
+</div>
+<a id="abec5e33802d69f1b601543d60699f028"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abec5e33802d69f1b601543d60699f028">&#9670;&nbsp;</a></span>conn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetconn.html">netconn</a>* api_msg::conn</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The netconn which to process - always needed: it includes the semaphore which is used to block the application thread until the function finished. </p>
+
+</div>
+</div>
+<a id="a8c66bd95217fa627f13f2f0847bbb25f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8c66bd95217fa627f13f2f0847bbb25f">&#9670;&nbsp;</a></span>err</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> api_msg::err</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The return value of the function executed in tcpip_thread. </p>
+
+</div>
+</div>
+<a id="a6387bddb309c218ac0ccc5ef6d7a033e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6387bddb309c218ac0ccc5ef6d7a033e">&#9670;&nbsp;</a></span>jl</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct { ... }   api_msg::jl</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>used for lwip_netconn_do_join_leave_group </p>
+
+</div>
+</div>
+<a id="a40624c398d1939bfee54bffa708a363e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a40624c398d1939bfee54bffa708a363e">&#9670;&nbsp;</a></span>len</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t api_msg::len</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>total length across vectors </p>
+
+</div>
+</div>
+<a id="aef71459b5251d796434f741ca630d528"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aef71459b5251d796434f741ca630d528">&#9670;&nbsp;</a></span>msg</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">union { ... }   api_msg::msg</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Depending on the executed function, one of these union members is used </p>
+
+</div>
+</div>
+<a id="adbbfc2baa8088b31fc722365237e5807"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adbbfc2baa8088b31fc722365237e5807">&#9670;&nbsp;</a></span>n</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct { ... }   api_msg::n</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>used for lwip_netconn_do_newconn </p>
+
+</div>
+</div>
+<a id="a4bd9382dd42b18120803e246a0203353"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4bd9382dd42b18120803e246a0203353">&#9670;&nbsp;</a></span>offset</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t api_msg::offset</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>offset into total length/output of bytes written when err == ERR_OK </p>
+
+</div>
+</div>
+<a id="aebd72e07e711e7135294563b82c98cdf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aebd72e07e711e7135294563b82c98cdf">&#9670;&nbsp;</a></span>r</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct { ... }   api_msg::r</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>used for lwip_netconn_do_recv </p>
+
+</div>
+</div>
+<a id="ad5e8bf133bc5ba4c78822af297330ce4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad5e8bf133bc5ba4c78822af297330ce4">&#9670;&nbsp;</a></span>sd</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct { ... }   api_msg::sd</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>used for lwip_netconn_do_close (/shutdown) </p>
+
+</div>
+</div>
+<a id="a1ceb9822ba49ba439e30d98492593612"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1ceb9822ba49ba439e30d98492593612">&#9670;&nbsp;</a></span>vector</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const struct <a class="el" href="structnetvector.html">netvector</a>* api_msg::vector</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>current vector to write </p>
+
+</div>
+</div>
+<a id="ab6f14157a3e6735b69a569249d3286a2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab6f14157a3e6735b69a569249d3286a2">&#9670;&nbsp;</a></span>vector_cnt</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t api_msg::vector_cnt</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>number of unwritten vectors </p>
+
+</div>
+</div>
+<a id="a6896ae78ebddefdf2d8358ab5f21f444"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6896ae78ebddefdf2d8358ab5f21f444">&#9670;&nbsp;</a></span>vector_off</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t api_msg::vector_off</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>offset into current vector </p>
+
+</div>
+</div>
+<a id="a8a71456d1199d10af5c1d8760cc0ce73"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8a71456d1199d10af5c1d8760cc0ce73">&#9670;&nbsp;</a></span>w</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct { ... }   api_msg::w</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>used for lwip_netconn_do_write </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/priv/<a class="el" href="api__msg_8h.html">api_msg.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="structapi__msg.html">api_msg</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structapi__msg.js b/doc/doxygen/output/html/structapi__msg.js
new file mode 100644
index 0000000..da05cbc
--- /dev/null
+++ b/doc/doxygen/output/html/structapi__msg.js
@@ -0,0 +1,19 @@
+var structapi__msg =
+[
+    [ "ad", "structapi__msg.html#a36dedcbd9ecca67043a8e1d1e715be94", null ],
+    [ "b", "structapi__msg.html#ab0abd60527e96cc24c2c20c835cdac05", null ],
+    [ "bc", "structapi__msg.html#a1705127c6cd22c2c6dbbcc59834e41e0", null ],
+    [ "conn", "structapi__msg.html#abec5e33802d69f1b601543d60699f028", null ],
+    [ "err", "structapi__msg.html#a8c66bd95217fa627f13f2f0847bbb25f", null ],
+    [ "jl", "structapi__msg.html#a6387bddb309c218ac0ccc5ef6d7a033e", null ],
+    [ "len", "structapi__msg.html#a40624c398d1939bfee54bffa708a363e", null ],
+    [ "msg", "structapi__msg.html#aef71459b5251d796434f741ca630d528", null ],
+    [ "n", "structapi__msg.html#adbbfc2baa8088b31fc722365237e5807", null ],
+    [ "offset", "structapi__msg.html#a4bd9382dd42b18120803e246a0203353", null ],
+    [ "r", "structapi__msg.html#aebd72e07e711e7135294563b82c98cdf", null ],
+    [ "sd", "structapi__msg.html#ad5e8bf133bc5ba4c78822af297330ce4", 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#a8a71456d1199d10af5c1d8760cc0ce73", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structautoip.html b/doc/doxygen/output/html/structautoip.html
new file mode 100644
index 0000000..f4e8cb0
--- /dev/null
+++ b/doc/doxygen/output/html/structautoip.html
@@ -0,0 +1,216 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: autoip 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structautoip.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">autoip Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;autoip.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a13b5da8a86839b4cd9bd9f5400ac9dc7"><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="structautoip.html#a13b5da8a86839b4cd9bd9f5400ac9dc7">llipaddr</a></td></tr>
+<tr class="separator:a13b5da8a86839b4cd9bd9f5400ac9dc7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a51af55190548e378e310aeaddfa1fdef"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structautoip.html#a51af55190548e378e310aeaddfa1fdef">state</a></td></tr>
+<tr class="separator:a51af55190548e378e310aeaddfa1fdef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d3e3bab2f12b7c7283177fbf039fb25"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structautoip.html#a9d3e3bab2f12b7c7283177fbf039fb25">sent_num</a></td></tr>
+<tr class="separator:a9d3e3bab2f12b7c7283177fbf039fb25"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7510d9a2961ea7c28ebfcde6390284bf"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structautoip.html#a7510d9a2961ea7c28ebfcde6390284bf">ttw</a></td></tr>
+<tr class="separator:a7510d9a2961ea7c28ebfcde6390284bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f51d8cde73e20d6e0ae3ec8053afb55"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structautoip.html#a2f51d8cde73e20d6e0ae3ec8053afb55">lastconflict</a></td></tr>
+<tr class="separator:a2f51d8cde73e20d6e0ae3ec8053afb55"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a472f3d18c07b3df024a0cde8f4ffa853"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structautoip.html#a472f3d18c07b3df024a0cde8f4ffa853">tried_llipaddr</a></td></tr>
+<tr class="separator:a472f3d18c07b3df024a0cde8f4ffa853"><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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2f51d8cde73e20d6e0ae3ec8053afb55">&#9670;&nbsp;</a></span>lastconflict</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t autoip::lastconflict</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ticks until a conflict can be solved by defending </p>
+
+</div>
+</div>
+<a id="a13b5da8a86839b4cd9bd9f5400ac9dc7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a13b5da8a86839b4cd9bd9f5400ac9dc7">&#9670;&nbsp;</a></span>llipaddr</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> autoip::llipaddr</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>the currently selected, probed, announced or used LL IP-Address </p>
+
+</div>
+</div>
+<a id="a9d3e3bab2f12b7c7283177fbf039fb25"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9d3e3bab2f12b7c7283177fbf039fb25">&#9670;&nbsp;</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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a51af55190548e378e310aeaddfa1fdef">&#9670;&nbsp;</a></span>state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t autoip::state</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>current AutoIP state machine state </p>
+
+</div>
+</div>
+<a id="a472f3d18c07b3df024a0cde8f4ffa853"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a472f3d18c07b3df024a0cde8f4ffa853">&#9670;&nbsp;</a></span>tried_llipaddr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t autoip::tried_llipaddr</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>total number of probed/used Link Local IP-Addresses </p>
+
+</div>
+</div>
+<a id="a7510d9a2961ea7c28ebfcde6390284bf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7510d9a2961ea7c28ebfcde6390284bf">&#9670;&nbsp;</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>
+</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="structautoip.html">autoip</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structautoip.js b/doc/doxygen/output/html/structautoip.js
new file mode 100644
index 0000000..efcee3b
--- /dev/null
+++ b/doc/doxygen/output/html/structautoip.js
@@ -0,0 +1,9 @@
+var structautoip =
+[
+    [ "lastconflict", "structautoip.html#a2f51d8cde73e20d6e0ae3ec8053afb55", 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 ]
+];
\ 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
new file mode 100644
index 0000000..ea094e3
--- /dev/null
+++ b/doc/doxygen/output/html/structbridgeif__initdata__s.html
@@ -0,0 +1,182 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: bridgeif_initdata_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structbridgeif__initdata__s.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">bridgeif_initdata_s Struct Reference<div class="ingroups"><a class="el" href="group__netifs.html">NETIFs</a> &raquo; <a class="el" href="group__bridgeif.html">IEEE 802.1D bridge</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;bridgeif.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a8e0048db5e021f5d79411492dc9330bc"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structeth__addr.html">eth_addr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structbridgeif__initdata__s.html#a8e0048db5e021f5d79411492dc9330bc">ethaddr</a></td></tr>
+<tr class="separator:a8e0048db5e021f5d79411492dc9330bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e0bb6a885967b5fcfef09a8f0adc63f"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structbridgeif__initdata__s.html#a0e0bb6a885967b5fcfef09a8f0adc63f">max_ports</a></td></tr>
+<tr class="separator:a0e0bb6a885967b5fcfef09a8f0adc63f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeb312c2e698513c6416d5c8459ad622f"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structbridgeif__initdata__s.html#aeb312c2e698513c6416d5c8459ad622f">max_fdb_dynamic_entries</a></td></tr>
+<tr class="separator:aeb312c2e698513c6416d5c8459ad622f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a210915aa1b0436ccabc7e8d9fd3c3fe6"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structbridgeif__initdata__s.html#a210915aa1b0436ccabc7e8d9fd3c3fe6">max_fdb_static_entries</a></td></tr>
+<tr class="separator:a210915aa1b0436ccabc7e8d9fd3c3fe6"><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>Initialisation data for <a class="el" href="group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c">bridgeif_init</a>. An instance of this type must be passed as parameter 'state' to <a class="el" href="group__netif.html#gade5498543e74067f28cc6bef0209e3be">netif_add</a> when the bridge is added. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a8e0048db5e021f5d79411492dc9330bc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8e0048db5e021f5d79411492dc9330bc">&#9670;&nbsp;</a></span>ethaddr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structeth__addr.html">eth_addr</a> bridgeif_initdata_s::ethaddr</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MAC address of the bridge (cannot use the netif's addresses) </p>
+
+</div>
+</div>
+<a id="aeb312c2e698513c6416d5c8459ad622f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeb312c2e698513c6416d5c8459ad622f">&#9670;&nbsp;</a></span>max_fdb_dynamic_entries</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t bridgeif_initdata_s::max_fdb_dynamic_entries</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Maximum number of dynamic/learning entries in the bridge's forwarding database. In the default implementation, this controls memory consumption only. </p>
+
+</div>
+</div>
+<a id="a210915aa1b0436ccabc7e8d9fd3c3fe6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a210915aa1b0436ccabc7e8d9fd3c3fe6">&#9670;&nbsp;</a></span>max_fdb_static_entries</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t bridgeif_initdata_s::max_fdb_static_entries</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Maximum number of static forwarding entries. Influences memory consumption! </p>
+
+</div>
+</div>
+<a id="a0e0bb6a885967b5fcfef09a8f0adc63f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0e0bb6a885967b5fcfef09a8f0adc63f">&#9670;&nbsp;</a></span>max_ports</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t bridgeif_initdata_s::max_ports</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Maximum number of ports in the bridge (ports are stored in an array, this influences memory allocated for netif-&gt;state of the bridge netif). </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/netif/<a class="el" href="bridgeif_8h.html">bridgeif.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="structbridgeif__initdata__s.html">bridgeif_initdata_s</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structbridgeif__initdata__s.js b/doc/doxygen/output/html/structbridgeif__initdata__s.js
new file mode 100644
index 0000000..c852cb2
--- /dev/null
+++ b/doc/doxygen/output/html/structbridgeif__initdata__s.js
@@ -0,0 +1,7 @@
+var structbridgeif__initdata__s =
+[
+    [ "ethaddr", "structbridgeif__initdata__s.html#a8e0048db5e021f5d79411492dc9330bc", null ],
+    [ "max_fdb_dynamic_entries", "structbridgeif__initdata__s.html#aeb312c2e698513c6416d5c8459ad622f", null ],
+    [ "max_fdb_static_entries", "structbridgeif__initdata__s.html#a210915aa1b0436ccabc7e8d9fd3c3fe6", null ],
+    [ "max_ports", "structbridgeif__initdata__s.html#a0e0bb6a885967b5fcfef09a8f0adc63f", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structdhcp6__msg.html b/doc/doxygen/output/html/structdhcp6__msg.html
new file mode 100644
index 0000000..bb86b16
--- /dev/null
+++ b/doc/doxygen/output/html/structdhcp6__msg.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: dhcp6_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structdhcp6__msg.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">dhcp6_msg Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;dhcp6.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>minimum set of fields of any DHCPv6 message </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_2dhcp6_8h.html">dhcp6.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="structdhcp6__msg.html">dhcp6_msg</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structdhcp__msg.html b/doc/doxygen/output/html/structdhcp__msg.html
new file mode 100644
index 0000000..3ca2262
--- /dev/null
+++ b/doc/doxygen/output/html/structdhcp__msg.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: dhcp_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structdhcp__msg.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">dhcp_msg Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;dhcp.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>minimum set of fields of any DHCP message </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_2dhcp_8h.html">dhcp.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="structdhcp__msg.html">dhcp_msg</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structdns__answer.html b/doc/doxygen/output/html/structdns__answer.html
new file mode 100644
index 0000000..0742e9f
--- /dev/null
+++ b/doc/doxygen/output/html/structdns__answer.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: dns_answer 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structdns__answer.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">dns_answer Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>DNS answer message structure. No packing needed: only used locally on the stack. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/core/<a class="el" href="dns_8c.html">dns.c</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="structdns__answer.html">dns_answer</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structdns__api__msg.html b/doc/doxygen/output/html/structdns__api__msg.html
new file mode 100644
index 0000000..da979f8
--- /dev/null
+++ b/doc/doxygen/output/html/structdns__api__msg.html
@@ -0,0 +1,199 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: dns_api_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structdns__api__msg.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">dns_api_msg Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;api_msg.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ada44a0eb6c9181cac80cfbbee01d3b53"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structdns__api__msg.html#ada44a0eb6c9181cac80cfbbee01d3b53">name</a></td></tr>
+<tr class="separator:ada44a0eb6c9181cac80cfbbee01d3b53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a217814594564077d21b0f2696280b2a8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structdns__api__msg.html#a217814594564077d21b0f2696280b2a8">addr</a></td></tr>
+<tr class="separator:a217814594564077d21b0f2696280b2a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afb2536a6c342bed4c4ad9d75982f7493"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structdns__api__msg.html#afb2536a6c342bed4c4ad9d75982f7493">dns_addrtype</a></td></tr>
+<tr class="separator:afb2536a6c342bed4c4ad9d75982f7493"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a15e01e675ebc46b5aede42342be445e2"><td class="memItemLeft" align="right" valign="top">sys_sem_t *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structdns__api__msg.html#a15e01e675ebc46b5aede42342be445e2">sem</a></td></tr>
+<tr class="separator:a15e01e675ebc46b5aede42342be445e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6536d91adb146555461359bd451b30de"><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="structdns__api__msg.html#a6536d91adb146555461359bd451b30de">err</a></td></tr>
+<tr class="separator:a6536d91adb146555461359bd451b30de"><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>As lwip_netconn_do_gethostbyname requires more arguments but doesn't require a netconn, it has its own struct (to avoid struct <a class="el" href="structapi__msg.html">api_msg</a> getting bigger than necessary). lwip_netconn_do_gethostbyname must be called using tcpip_callback instead of tcpip_apimsg (see netconn_gethostbyname). </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a217814594564077d21b0f2696280b2a8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a217814594564077d21b0f2696280b2a8">&#9670;&nbsp;</a></span>addr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>* dns_api_msg::addr</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The resolved address is stored here </p>
+
+</div>
+</div>
+<a id="afb2536a6c342bed4c4ad9d75982f7493"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afb2536a6c342bed4c4ad9d75982f7493">&#9670;&nbsp;</a></span>dns_addrtype</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t dns_api_msg::dns_addrtype</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Type of resolve call </p>
+
+</div>
+</div>
+<a id="a6536d91adb146555461359bd451b30de"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6536d91adb146555461359bd451b30de">&#9670;&nbsp;</a></span>err</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>* dns_api_msg::err</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Errors are given back here </p>
+
+</div>
+</div>
+<a id="ada44a0eb6c9181cac80cfbbee01d3b53"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ada44a0eb6c9181cac80cfbbee01d3b53">&#9670;&nbsp;</a></span>name</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* dns_api_msg::name</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Hostname to query or dotted IP address string </p>
+
+</div>
+</div>
+<a id="a15e01e675ebc46b5aede42342be445e2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a15e01e675ebc46b5aede42342be445e2">&#9670;&nbsp;</a></span>sem</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">sys_sem_t* dns_api_msg::sem</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This semaphore is posted when the name is resolved, the application thread should wait on it. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/priv/<a class="el" href="api__msg_8h.html">api_msg.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="structdns__api__msg.html">dns_api_msg</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structdns__api__msg.js b/doc/doxygen/output/html/structdns__api__msg.js
new file mode 100644
index 0000000..5ea0e4c
--- /dev/null
+++ b/doc/doxygen/output/html/structdns__api__msg.js
@@ -0,0 +1,8 @@
+var structdns__api__msg =
+[
+    [ "addr", "structdns__api__msg.html#a217814594564077d21b0f2696280b2a8", null ],
+    [ "dns_addrtype", "structdns__api__msg.html#afb2536a6c342bed4c4ad9d75982f7493", null ],
+    [ "err", "structdns__api__msg.html#a6536d91adb146555461359bd451b30de", null ],
+    [ "name", "structdns__api__msg.html#ada44a0eb6c9181cac80cfbbee01d3b53", null ],
+    [ "sem", "structdns__api__msg.html#a15e01e675ebc46b5aede42342be445e2", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structdns__hdr.html b/doc/doxygen/output/html/structdns__hdr.html
new file mode 100644
index 0000000..8eb3e2d
--- /dev/null
+++ b/doc/doxygen/output/html/structdns__hdr.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: dns_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structdns__hdr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">dns_hdr Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;dns.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>DNS message header </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_2dns_8h.html">dns.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="structdns__hdr.html">dns_hdr</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structdns__query.html b/doc/doxygen/output/html/structdns__query.html
new file mode 100644
index 0000000..6b823a9
--- /dev/null
+++ b/doc/doxygen/output/html/structdns__query.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: dns_query 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structdns__query.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">dns_query Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>DNS query message structure. No packing needed: only used locally on the stack. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/core/<a class="el" href="dns_8c.html">dns.c</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="structdns__query.html">dns_query</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structdns__req__entry.html b/doc/doxygen/output/html/structdns__req__entry.html
new file mode 100644
index 0000000..8e041ca
--- /dev/null
+++ b/doc/doxygen/output/html/structdns__req__entry.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: dns_req_entry 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structdns__req__entry.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">dns_req_entry Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>DNS request table entry: used when dns_gehostbyname cannot answer the request from the DNS table </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/core/<a class="el" href="dns_8c.html">dns.c</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="structdns__req__entry.html">dns_req_entry</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structdns__table__entry.html b/doc/doxygen/output/html/structdns__table__entry.html
new file mode 100644
index 0000000..b7d2e81
--- /dev/null
+++ b/doc/doxygen/output/html/structdns__table__entry.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: dns_table_entry 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structdns__table__entry.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">dns_table_entry Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>DNS table entry </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/core/<a class="el" href="dns_8c.html">dns.c</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="structdns__table__entry.html">dns_table_entry</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structeth__addr.html b/doc/doxygen/output/html/structeth__addr.html
new file mode 100644
index 0000000..5b91343
--- /dev/null
+++ b/doc/doxygen/output/html/structeth__addr.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: eth_addr 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structeth__addr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">eth_addr Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;ethernet.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>An Ethernet MAC address </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/prot/<a class="el" href="lwip_2prot_2ethernet_8h.html">ethernet.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="structeth__addr.html">eth_addr</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structeth__hdr.html b/doc/doxygen/output/html/structeth__hdr.html
new file mode 100644
index 0000000..299c039
--- /dev/null
+++ b/doc/doxygen/output/html/structeth__hdr.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: eth_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structeth__hdr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">eth_hdr Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;ethernet.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Ethernet header </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/prot/<a class="el" href="lwip_2prot_2ethernet_8h.html">ethernet.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="structeth__hdr.html">eth_hdr</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structeth__vlan__hdr.html b/doc/doxygen/output/html/structeth__vlan__hdr.html
new file mode 100644
index 0000000..6a3acc6
--- /dev/null
+++ b/doc/doxygen/output/html/structeth__vlan__hdr.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: eth_vlan_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structeth__vlan__hdr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">eth_vlan_hdr Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;ethernet.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>VLAN header inserted between ethernet header and payload if 'type' in ethernet header is ETHTYPE_VLAN. See IEEE802.Q </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/prot/<a class="el" href="lwip_2prot_2ethernet_8h.html">ethernet.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="structeth__vlan__hdr.html">eth_vlan_hdr</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structetharp__hdr.html b/doc/doxygen/output/html/structetharp__hdr.html
new file mode 100644
index 0000000..8613579
--- /dev/null
+++ b/doc/doxygen/output/html/structetharp__hdr.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: etharp_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structetharp__hdr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">etharp_hdr Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;etharp.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>the ARP message, see RFC 826 ("Packet format") </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/prot/<a class="el" href="lwip_2prot_2etharp_8h.html">etharp.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="structetharp__hdr.html">etharp_hdr</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structetharp__q__entry.html b/doc/doxygen/output/html/structetharp__q__entry.html
new file mode 100644
index 0000000..2d904d9
--- /dev/null
+++ b/doc/doxygen/output/html/structetharp__q__entry.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: etharp_q_entry 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structetharp__q__entry.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">etharp_q_entry Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;etharp.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct for queueing outgoing packets for unknown address defined here to be accessed by <a class="el" href="memp_8h.html">memp.h</a> </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="lwip_2etharp_8h.html">etharp.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="structetharp__q__entry.html">etharp_q_entry</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structgethostbyname__r__helper.html b/doc/doxygen/output/html/structgethostbyname__r__helper.html
new file mode 100644
index 0000000..81d219f
--- /dev/null
+++ b/doc/doxygen/output/html/structgethostbyname__r__helper.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: gethostbyname_r_helper 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structgethostbyname__r__helper.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">gethostbyname_r_helper Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>helper struct for gethostbyname_r to access the char* buffer </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/api/<a class="el" href="netdb_8c.html">netdb.c</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="structgethostbyname__r__helper.html">gethostbyname_r_helper</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structicmp6__echo__hdr.html b/doc/doxygen/output/html/structicmp6__echo__hdr.html
new file mode 100644
index 0000000..ed5a4bd
--- /dev/null
+++ b/doc/doxygen/output/html/structicmp6__echo__hdr.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: icmp6_echo_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structicmp6__echo__hdr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">icmp6_echo_hdr Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;icmp6.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This is the ICMP6 header adapted for echo req/resp. </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_2icmp6_8h.html">icmp6.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="structicmp6__echo__hdr.html">icmp6_echo_hdr</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structicmp6__hdr.html b/doc/doxygen/output/html/structicmp6__hdr.html
new file mode 100644
index 0000000..563fcc6
--- /dev/null
+++ b/doc/doxygen/output/html/structicmp6__hdr.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: icmp6_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structicmp6__hdr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">icmp6_hdr Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;icmp6.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This is the standard ICMP6 header. </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_2icmp6_8h.html">icmp6.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="structicmp6__hdr.html">icmp6_hdr</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structicmp__echo__hdr.html b/doc/doxygen/output/html/structicmp__echo__hdr.html
new file mode 100644
index 0000000..776032b
--- /dev/null
+++ b/doc/doxygen/output/html/structicmp__echo__hdr.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: icmp_echo_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structicmp__echo__hdr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">icmp_echo_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>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><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__echo__hdr.html">icmp_echo_hdr</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </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
new file mode 100644
index 0000000..ddf85f4
--- /dev/null
+++ b/doc/doxygen/output/html/structieee__802154__hdr.html
@@ -0,0 +1,216 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ieee_802154_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structieee__802154__hdr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">ieee_802154_hdr Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;ieee802154.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a1d1e2cef0e0c1b1e1fd02a8a5f07fb10"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structieee__802154__hdr.html#a1d1e2cef0e0c1b1e1fd02a8a5f07fb10">frame_control</a></td></tr>
+<tr class="separator:a1d1e2cef0e0c1b1e1fd02a8a5f07fb10"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a870001205f5a3ce45ce0b2f323275869"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structieee__802154__hdr.html#a870001205f5a3ce45ce0b2f323275869">sequence_number</a></td></tr>
+<tr class="separator:a870001205f5a3ce45ce0b2f323275869"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac1ad9159d3bb70b1a7223060c6c81efd"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structieee__802154__hdr.html#ac1ad9159d3bb70b1a7223060c6c81efd">destination_pan_id</a></td></tr>
+<tr class="separator:ac1ad9159d3bb70b1a7223060c6c81efd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87ce59d2804cacc5a58411c8b6c47f33"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structieee__802154__hdr.html#a87ce59d2804cacc5a58411c8b6c47f33">destination_address</a> [8]</td></tr>
+<tr class="separator:a87ce59d2804cacc5a58411c8b6c47f33"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab67fc612a7fd7dcaf46401e4719fa2b2"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structieee__802154__hdr.html#ab67fc612a7fd7dcaf46401e4719fa2b2">source_pan_id</a></td></tr>
+<tr class="separator:ab67fc612a7fd7dcaf46401e4719fa2b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa96c037381583756e79bc6ecede27937"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structieee__802154__hdr.html#aa96c037381583756e79bc6ecede27937">source_address</a> [8]</td></tr>
+<tr class="separator:aa96c037381583756e79bc6ecede27937"><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>General MAC frame format This shows the full featured header, mainly for documentation. Some fields are omitted or shortened to achieve frame compression. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a87ce59d2804cacc5a58411c8b6c47f33"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a87ce59d2804cacc5a58411c8b6c47f33">&#9670;&nbsp;</a></span>destination_address</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t ieee_802154_hdr::destination_address[8]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Destination Address is omitted if Destination Addressing Mode is 0 </p>
+
+</div>
+</div>
+<a id="ac1ad9159d3bb70b1a7223060c6c81efd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac1ad9159d3bb70b1a7223060c6c81efd">&#9670;&nbsp;</a></span>destination_pan_id</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t ieee_802154_hdr::destination_pan_id</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Destination PAN ID is omitted if Destination Addressing Mode is 0 </p>
+
+</div>
+</div>
+<a id="a1d1e2cef0e0c1b1e1fd02a8a5f07fb10"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1d1e2cef0e0c1b1e1fd02a8a5f07fb10">&#9670;&nbsp;</a></span>frame_control</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t ieee_802154_hdr::frame_control</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>See IEEE_802154_FC_* defines </p>
+
+</div>
+</div>
+<a id="a870001205f5a3ce45ce0b2f323275869"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a870001205f5a3ce45ce0b2f323275869">&#9670;&nbsp;</a></span>sequence_number</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t ieee_802154_hdr::sequence_number</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sequence number is omitted if IEEE_802154_FC_SEQNO_SUPPR is set in frame_control </p>
+
+</div>
+</div>
+<a id="aa96c037381583756e79bc6ecede27937"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa96c037381583756e79bc6ecede27937">&#9670;&nbsp;</a></span>source_address</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t ieee_802154_hdr::source_address[8]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Source Address is omitted if Source Addressing Mode is 0 </p>
+
+</div>
+</div>
+<a id="ab67fc612a7fd7dcaf46401e4719fa2b2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab67fc612a7fd7dcaf46401e4719fa2b2">&#9670;&nbsp;</a></span>source_pan_id</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t ieee_802154_hdr::source_pan_id</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Source PAN ID is omitted if Source Addressing Mode is 0 or if IEEE_802154_FC_PANID_COMPR is set in frame control </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/netif/<a class="el" href="ieee802154_8h.html">ieee802154.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="structieee__802154__hdr.html">ieee_802154_hdr</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structieee__802154__hdr.js b/doc/doxygen/output/html/structieee__802154__hdr.js
new file mode 100644
index 0000000..aeaa83c
--- /dev/null
+++ b/doc/doxygen/output/html/structieee__802154__hdr.js
@@ -0,0 +1,9 @@
+var structieee__802154__hdr =
+[
+    [ "destination_address", "structieee__802154__hdr.html#a87ce59d2804cacc5a58411c8b6c47f33", null ],
+    [ "destination_pan_id", "structieee__802154__hdr.html#ac1ad9159d3bb70b1a7223060c6c81efd", null ],
+    [ "frame_control", "structieee__802154__hdr.html#a1d1e2cef0e0c1b1e1fd02a8a5f07fb10", null ],
+    [ "sequence_number", "structieee__802154__hdr.html#a870001205f5a3ce45ce0b2f323275869", null ],
+    [ "source_address", "structieee__802154__hdr.html#aa96c037381583756e79bc6ecede27937", null ],
+    [ "source_pan_id", "structieee__802154__hdr.html#ab67fc612a7fd7dcaf46401e4719fa2b2", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structigmp__group.html b/doc/doxygen/output/html/structigmp__group.html
new file mode 100644
index 0000000..a6a2d40
--- /dev/null
+++ b/doc/doxygen/output/html/structigmp__group.html
@@ -0,0 +1,217 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: igmp_group 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structigmp__group.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">igmp_group Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;igmp.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a95c41b9e7de6a14bb8a7910913395e78"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structigmp__group.html">igmp_group</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structigmp__group.html#a95c41b9e7de6a14bb8a7910913395e78">next</a></td></tr>
+<tr class="separator:a95c41b9e7de6a14bb8a7910913395e78"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae26e6041f865880bf46cd21b6f9af854"><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="structigmp__group.html#ae26e6041f865880bf46cd21b6f9af854">group_address</a></td></tr>
+<tr class="separator:ae26e6041f865880bf46cd21b6f9af854"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8fa72062d168d81c1c5ae5209eb0a874"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structigmp__group.html#a8fa72062d168d81c1c5ae5209eb0a874">last_reporter_flag</a></td></tr>
+<tr class="separator:a8fa72062d168d81c1c5ae5209eb0a874"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:add0d24f719ad4b598abad254689ad911"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structigmp__group.html#add0d24f719ad4b598abad254689ad911">group_state</a></td></tr>
+<tr class="separator:add0d24f719ad4b598abad254689ad911"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8e2227e486652603fcd7f88681d4c75b"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structigmp__group.html#a8e2227e486652603fcd7f88681d4c75b">timer</a></td></tr>
+<tr class="separator:a8e2227e486652603fcd7f88681d4c75b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3625aeb3689e3626f73138eb0e41852"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structigmp__group.html#ab3625aeb3689e3626f73138eb0e41852">use</a></td></tr>
+<tr class="separator:ab3625aeb3689e3626f73138eb0e41852"><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>igmp group structure - there is a list of groups for each interface these should really be linked from the interface, but if we keep them separate we will not affect the lwip original code too much</p>
+<p>There will be a group for the all systems group address but this will not run the state machine as it is used to kick off reports from all the other groups </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="ae26e6041f865880bf46cd21b6f9af854"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae26e6041f865880bf46cd21b6f9af854">&#9670;&nbsp;</a></span>group_address</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> igmp_group::group_address</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>multicast address </p>
+
+</div>
+</div>
+<a id="add0d24f719ad4b598abad254689ad911"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#add0d24f719ad4b598abad254689ad911">&#9670;&nbsp;</a></span>group_state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t igmp_group::group_state</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>current state of the group </p>
+
+</div>
+</div>
+<a id="a8fa72062d168d81c1c5ae5209eb0a874"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8fa72062d168d81c1c5ae5209eb0a874">&#9670;&nbsp;</a></span>last_reporter_flag</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t igmp_group::last_reporter_flag</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>signifies we were the last person to report </p>
+
+</div>
+</div>
+<a id="a95c41b9e7de6a14bb8a7910913395e78"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a95c41b9e7de6a14bb8a7910913395e78">&#9670;&nbsp;</a></span>next</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structigmp__group.html">igmp_group</a>* igmp_group::next</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>next link </p>
+
+</div>
+</div>
+<a id="a8e2227e486652603fcd7f88681d4c75b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8e2227e486652603fcd7f88681d4c75b">&#9670;&nbsp;</a></span>timer</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t igmp_group::timer</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>timer for reporting, negative is OFF </p>
+
+</div>
+</div>
+<a id="ab3625aeb3689e3626f73138eb0e41852"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab3625aeb3689e3626f73138eb0e41852">&#9670;&nbsp;</a></span>use</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t igmp_group::use</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>counter of simultaneous uses </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="igmp_8h.html">igmp.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="structigmp__group.html">igmp_group</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structigmp__group.js b/doc/doxygen/output/html/structigmp__group.js
new file mode 100644
index 0000000..8a511a9
--- /dev/null
+++ b/doc/doxygen/output/html/structigmp__group.js
@@ -0,0 +1,9 @@
+var structigmp__group =
+[
+    [ "group_address", "structigmp__group.html#ae26e6041f865880bf46cd21b6f9af854", null ],
+    [ "group_state", "structigmp__group.html#add0d24f719ad4b598abad254689ad911", null ],
+    [ "last_reporter_flag", "structigmp__group.html#a8fa72062d168d81c1c5ae5209eb0a874", null ],
+    [ "next", "structigmp__group.html#a95c41b9e7de6a14bb8a7910913395e78", null ],
+    [ "timer", "structigmp__group.html#a8e2227e486652603fcd7f88681d4c75b", null ],
+    [ "use", "structigmp__group.html#ab3625aeb3689e3626f73138eb0e41852", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structigmp__msg.html b/doc/doxygen/output/html/structigmp__msg.html
new file mode 100644
index 0000000..6e589e0
--- /dev/null
+++ b/doc/doxygen/output/html/structigmp__msg.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: igmp_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structigmp__msg.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">igmp_msg Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;igmp.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>IGMP packet format. </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_2igmp_8h.html">igmp.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="structigmp__msg.html">igmp_msg</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structip4__addr.html b/doc/doxygen/output/html/structip4__addr.html
new file mode 100644
index 0000000..fd81101
--- /dev/null
+++ b/doc/doxygen/output/html/structip4__addr.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ip4_addr 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structip4__addr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">ip4_addr Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;ip4_addr.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This is the aligned version of ip4_addr_t, used as local variable, on the stack, etc. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="ip4__addr_8h.html">ip4_addr.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="structip4__addr.html">ip4_addr</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structip4__addr__packed.html b/doc/doxygen/output/html/structip4__addr__packed.html
new file mode 100644
index 0000000..a49720f
--- /dev/null
+++ b/doc/doxygen/output/html/structip4__addr__packed.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ip4_addr_packed 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structip4__addr__packed.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">ip4_addr_packed Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;ip4.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This is the packed version of ip4_addr_t, used in network headers that are itself packed </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_2ip4_8h.html">ip4.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="structip4__addr__packed.html">ip4_addr_packed</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structip4__addr__wordaligned.html b/doc/doxygen/output/html/structip4__addr__wordaligned.html
new file mode 100644
index 0000000..4e55310
--- /dev/null
+++ b/doc/doxygen/output/html/structip4__addr__wordaligned.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ip4_addr_wordaligned 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structip4__addr__wordaligned.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">ip4_addr_wordaligned Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;etharp.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct <a class="el" href="structip4__addr__wordaligned.html">ip4_addr_wordaligned</a> is used in the definition of the ARP packet format in order to support compilers that don't have structure packing. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/prot/<a class="el" href="lwip_2prot_2etharp_8h.html">etharp.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="structip4__addr__wordaligned.html">ip4_addr_wordaligned</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structip6__addr.html b/doc/doxygen/output/html/structip6__addr.html
new file mode 100644
index 0000000..a6ad876
--- /dev/null
+++ b/doc/doxygen/output/html/structip6__addr.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ip6_addr 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structip6__addr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">ip6_addr Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;ip6_addr.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This is the aligned version of ip6_addr_t, used as local variable, on the stack, etc. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="ip6__addr_8h.html">ip6_addr.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="structip6__addr.html">ip6_addr</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structip6__addr__packed.html b/doc/doxygen/output/html/structip6__addr__packed.html
new file mode 100644
index 0000000..203b6a4
--- /dev/null
+++ b/doc/doxygen/output/html/structip6__addr__packed.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ip6_addr_packed 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structip6__addr__packed.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">ip6_addr_packed Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;ip6.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This is the packed version of ip6_addr_t, used in network headers that are itself packed </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_2ip6_8h.html">ip6.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="structip6__addr__packed.html">ip6_addr_packed</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structip6__hdr.html b/doc/doxygen/output/html/structip6__hdr.html
new file mode 100644
index 0000000..2cc74d4
--- /dev/null
+++ b/doc/doxygen/output/html/structip6__hdr.html
@@ -0,0 +1,199 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ip6_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structip6__hdr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">ip6_hdr Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;ip6.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ad3b638f503a3f7e7724cf4c7b2c0a0b5"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structip6__hdr.html#ad3b638f503a3f7e7724cf4c7b2c0a0b5">_v_tc_fl</a></td></tr>
+<tr class="separator:ad3b638f503a3f7e7724cf4c7b2c0a0b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d225109d601ae8b34bab6ca3528fa94"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structip6__hdr.html#a9d225109d601ae8b34bab6ca3528fa94">_plen</a></td></tr>
+<tr class="separator:a9d225109d601ae8b34bab6ca3528fa94"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abe3d612d4570864c922e18ed838292f6"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structip6__hdr.html#abe3d612d4570864c922e18ed838292f6">_nexth</a></td></tr>
+<tr class="separator:abe3d612d4570864c922e18ed838292f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af9cbfa5fa280a7a982a1c6268fa13a5a"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structip6__hdr.html#af9cbfa5fa280a7a982a1c6268fa13a5a">_hoplim</a></td></tr>
+<tr class="separator:af9cbfa5fa280a7a982a1c6268fa13a5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0df3214134f29827c27e66b2970c6ef"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structip6__addr__packed.html">ip6_addr_p_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structip6__hdr.html#af0df3214134f29827c27e66b2970c6ef">src</a></td></tr>
+<tr class="separator:af0df3214134f29827c27e66b2970c6ef"><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>The IPv6 header. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="af9cbfa5fa280a7a982a1c6268fa13a5a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af9cbfa5fa280a7a982a1c6268fa13a5a">&#9670;&nbsp;</a></span>_hoplim</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t ip6_hdr::_hoplim</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>hop limit </p>
+
+</div>
+</div>
+<a id="abe3d612d4570864c922e18ed838292f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abe3d612d4570864c922e18ed838292f6">&#9670;&nbsp;</a></span>_nexth</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t ip6_hdr::_nexth</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>next header </p>
+
+</div>
+</div>
+<a id="a9d225109d601ae8b34bab6ca3528fa94"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9d225109d601ae8b34bab6ca3528fa94">&#9670;&nbsp;</a></span>_plen</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t ip6_hdr::_plen</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>payload length </p>
+
+</div>
+</div>
+<a id="ad3b638f503a3f7e7724cf4c7b2c0a0b5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad3b638f503a3f7e7724cf4c7b2c0a0b5">&#9670;&nbsp;</a></span>_v_tc_fl</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t ip6_hdr::_v_tc_fl</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>version / traffic class / flow label </p>
+
+</div>
+</div>
+<a id="af0df3214134f29827c27e66b2970c6ef"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af0df3214134f29827c27e66b2970c6ef">&#9670;&nbsp;</a></span>src</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structip6__addr__packed.html">ip6_addr_p_t</a> ip6_hdr::src</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>source and destination IP addresses </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/prot/<a class="el" href="prot_2ip6_8h.html">ip6.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="structip6__hdr.html">ip6_hdr</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structip6__hdr.js b/doc/doxygen/output/html/structip6__hdr.js
new file mode 100644
index 0000000..8bcd854
--- /dev/null
+++ b/doc/doxygen/output/html/structip6__hdr.js
@@ -0,0 +1,8 @@
+var structip6__hdr =
+[
+    [ "_hoplim", "structip6__hdr.html#af9cbfa5fa280a7a982a1c6268fa13a5a", null ],
+    [ "_nexth", "structip6__hdr.html#abe3d612d4570864c922e18ed838292f6", null ],
+    [ "_plen", "structip6__hdr.html#a9d225109d601ae8b34bab6ca3528fa94", null ],
+    [ "_v_tc_fl", "structip6__hdr.html#ad3b638f503a3f7e7724cf4c7b2c0a0b5", null ],
+    [ "src", "structip6__hdr.html#af0df3214134f29827c27e66b2970c6ef", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structip6__reass__helper.html b/doc/doxygen/output/html/structip6__reass__helper.html
new file mode 100644
index 0000000..348f650
--- /dev/null
+++ b/doc/doxygen/output/html/structip6__reass__helper.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ip6_reass_helper 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structip6__reass__helper.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">ip6_reass_helper Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This is a helper struct which holds the starting offset and the ending offset of this fragment to easily chain the fragments. It has the same packing requirements as the IPv6 header, since it replaces the Fragment Header in memory in incoming fragments to keep track of the various fragments. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/core/ipv6/<a class="el" href="ip6__frag_8c.html">ip6_frag.c</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="structip6__reass__helper.html">ip6_reass_helper</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structip6__reassdata.html b/doc/doxygen/output/html/structip6__reassdata.html
new file mode 100644
index 0000000..9d8d99b
--- /dev/null
+++ b/doc/doxygen/output/html/structip6__reassdata.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ip6_reassdata 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structip6__reassdata.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">ip6_reassdata Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;ip6_frag.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>IPv6 reassembly helper struct. This is exported because memp needs to know the size. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="ip6__frag_8h.html">ip6_frag.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="structip6__reassdata.html">ip6_reassdata</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structip__addr.html b/doc/doxygen/output/html/structip__addr.html
new file mode 100644
index 0000000..f055001
--- /dev/null
+++ b/doc/doxygen/output/html/structip__addr.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ip_addr 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structip__addr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">ip_addr Struct Reference<div class="ingroups"><a class="el" href="group__infrastructure.html">Infrastructure</a> &raquo; <a class="el" href="group__ipaddr.html">IP address handling</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;ip_addr.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a66eaa8e9051e7102bf9f0c195fbe555a"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structip__addr.html#a66eaa8e9051e7102bf9f0c195fbe555a">type</a></td></tr>
+<tr class="separator:a66eaa8e9051e7102bf9f0c195fbe555a"><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>A union struct for both IP version's addresses. ATTENTION: watch out for its size when adding IPv6 address scope! </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a66eaa8e9051e7102bf9f0c195fbe555a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a66eaa8e9051e7102bf9f0c195fbe555a">&#9670;&nbsp;</a></span>type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t ip_addr::type</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">lwip_ip_addr_type</a> </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="ip__addr_8h.html">ip_addr.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="structip__addr.html">ip_addr</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structip__addr.js b/doc/doxygen/output/html/structip__addr.js
new file mode 100644
index 0000000..f62a7ca
--- /dev/null
+++ b/doc/doxygen/output/html/structip__addr.js
@@ -0,0 +1,4 @@
+var structip__addr =
+[
+    [ "type", "structip__addr.html#a66eaa8e9051e7102bf9f0c195fbe555a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structip__globals.html b/doc/doxygen/output/html/structip__globals.html
new file mode 100644
index 0000000..443188e
--- /dev/null
+++ b/doc/doxygen/output/html/structip__globals.html
@@ -0,0 +1,233 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ip_globals 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structip__globals.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">ip_globals Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;ip.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a7803dc5950d143e4433a0df689989bab"><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="structip__globals.html#a7803dc5950d143e4433a0df689989bab">current_netif</a></td></tr>
+<tr class="separator:a7803dc5950d143e4433a0df689989bab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7da899c663b1d560b61d92ba6d544701"><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="structip__globals.html#a7da899c663b1d560b61d92ba6d544701">current_input_netif</a></td></tr>
+<tr class="separator:a7da899c663b1d560b61d92ba6d544701"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e810f97cf3e8e855e3baafc3be8c0d4"><td class="memItemLeft" align="right" valign="top">const struct ip_hdr *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structip__globals.html#a2e810f97cf3e8e855e3baafc3be8c0d4">current_ip4_header</a></td></tr>
+<tr class="separator:a2e810f97cf3e8e855e3baafc3be8c0d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa5cfc3ac29dc746a4cbe844206b0ed41"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structip6__hdr.html">ip6_hdr</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structip__globals.html#aa5cfc3ac29dc746a4cbe844206b0ed41">current_ip6_header</a></td></tr>
+<tr class="separator:aa5cfc3ac29dc746a4cbe844206b0ed41"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a17004526e6f1a164c0bab01aeac5e34a"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structip__globals.html#a17004526e6f1a164c0bab01aeac5e34a">current_ip_header_tot_len</a></td></tr>
+<tr class="separator:a17004526e6f1a164c0bab01aeac5e34a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a04d85a3dc2c417050b3e088fa58a74b0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structip__globals.html#a04d85a3dc2c417050b3e088fa58a74b0">current_iphdr_src</a></td></tr>
+<tr class="separator:a04d85a3dc2c417050b3e088fa58a74b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0b4e54250c692c638408de54593d2aa1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structip__globals.html#a0b4e54250c692c638408de54593d2aa1">current_iphdr_dest</a></td></tr>
+<tr class="separator:a0b4e54250c692c638408de54593d2aa1"><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>Global variables of this module, kept in a struct for efficient access using base+index. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a7da899c663b1d560b61d92ba6d544701"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7da899c663b1d560b61d92ba6d544701">&#9670;&nbsp;</a></span>current_input_netif</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* ip_globals::current_input_netif</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The interface that received the packet for the current callback invocation. </p>
+
+</div>
+</div>
+<a id="a2e810f97cf3e8e855e3baafc3be8c0d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2e810f97cf3e8e855e3baafc3be8c0d4">&#9670;&nbsp;</a></span>current_ip4_header</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const struct ip_hdr* ip_globals::current_ip4_header</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Header of the input packet currently being processed. </p>
+
+</div>
+</div>
+<a id="aa5cfc3ac29dc746a4cbe844206b0ed41"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa5cfc3ac29dc746a4cbe844206b0ed41">&#9670;&nbsp;</a></span>current_ip6_header</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structip6__hdr.html">ip6_hdr</a>* ip_globals::current_ip6_header</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Header of the input IPv6 packet currently being processed. </p>
+
+</div>
+</div>
+<a id="a17004526e6f1a164c0bab01aeac5e34a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a17004526e6f1a164c0bab01aeac5e34a">&#9670;&nbsp;</a></span>current_ip_header_tot_len</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t ip_globals::current_ip_header_tot_len</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Total header length of current_ip4/6_header (i.e. after this, the UDP/TCP header starts) </p>
+
+</div>
+</div>
+<a id="a0b4e54250c692c638408de54593d2aa1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0b4e54250c692c638408de54593d2aa1">&#9670;&nbsp;</a></span>current_iphdr_dest</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> ip_globals::current_iphdr_dest</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Destination IP address of current_header </p>
+
+</div>
+</div>
+<a id="a04d85a3dc2c417050b3e088fa58a74b0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a04d85a3dc2c417050b3e088fa58a74b0">&#9670;&nbsp;</a></span>current_iphdr_src</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> ip_globals::current_iphdr_src</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Source IP address of current_header </p>
+
+</div>
+</div>
+<a id="a7803dc5950d143e4433a0df689989bab"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7803dc5950d143e4433a0df689989bab">&#9670;&nbsp;</a></span>current_netif</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* ip_globals::current_netif</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The interface that accepted the packet for the current callback invocation. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="ip_8h.html">ip.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="structip__globals.html">ip_globals</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structip__globals.js b/doc/doxygen/output/html/structip__globals.js
new file mode 100644
index 0000000..170b958
--- /dev/null
+++ b/doc/doxygen/output/html/structip__globals.js
@@ -0,0 +1,10 @@
+var structip__globals =
+[
+    [ "current_input_netif", "structip__globals.html#a7da899c663b1d560b61d92ba6d544701", null ],
+    [ "current_ip4_header", "structip__globals.html#a2e810f97cf3e8e855e3baafc3be8c0d4", null ],
+    [ "current_ip6_header", "structip__globals.html#aa5cfc3ac29dc746a4cbe844206b0ed41", null ],
+    [ "current_ip_header_tot_len", "structip__globals.html#a17004526e6f1a164c0bab01aeac5e34a", null ],
+    [ "current_iphdr_dest", "structip__globals.html#a0b4e54250c692c638408de54593d2aa1", null ],
+    [ "current_iphdr_src", "structip__globals.html#a04d85a3dc2c417050b3e088fa58a74b0", null ],
+    [ "current_netif", "structip__globals.html#a7803dc5950d143e4433a0df689989bab", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structip__reass__helper.html b/doc/doxygen/output/html/structip__reass__helper.html
new file mode 100644
index 0000000..96f57b2
--- /dev/null
+++ b/doc/doxygen/output/html/structip__reass__helper.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ip_reass_helper 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structip__reass__helper.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">ip_reass_helper Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This is a helper struct which holds the starting offset and the ending offset of this fragment to easily chain the fragments. It has the same packing requirements as the IP header, since it replaces the IP header in memory in incoming fragments (after copying it) to keep track of the various fragments. (-&gt; If the IP header doesn't need packing, this struct doesn't need packing, too.) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/core/ipv4/<a class="el" href="ip4__frag_8c.html">ip4_frag.c</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="structip__reass__helper.html">ip_reass_helper</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structip__reassdata.html b/doc/doxygen/output/html/structip__reassdata.html
new file mode 100644
index 0000000..bf17565
--- /dev/null
+++ b/doc/doxygen/output/html/structip__reassdata.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ip_reassdata 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structip__reassdata.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">ip_reassdata Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;ip4_frag.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>IP reassembly helper struct. This is exported because memp needs to know the size. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="ip4__frag_8h.html">ip4_frag.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="structip__reassdata.html">ip_reassdata</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structlowpan6__ieee802154__data.html b/doc/doxygen/output/html/structlowpan6__ieee802154__data.html
new file mode 100644
index 0000000..fe84e17
--- /dev/null
+++ b/doc/doxygen/output/html/structlowpan6__ieee802154__data.html
@@ -0,0 +1,197 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: lowpan6_ieee802154_data 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structlowpan6__ieee802154__data.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">lowpan6_ieee802154_data Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a8c33e7a2026e6e93a2085f3d14378d35"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlowpan6__reass__helper.html">lowpan6_reass_helper</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlowpan6__ieee802154__data.html#a8c33e7a2026e6e93a2085f3d14378d35">reass_list</a></td></tr>
+<tr class="separator:a8c33e7a2026e6e93a2085f3d14378d35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a190c9c06dfe1075abb7399f99553b507"><td class="memItemLeft" align="right" valign="top"><a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlowpan6__ieee802154__data.html#a190c9c06dfe1075abb7399f99553b507">lowpan6_context</a> [10]</td></tr>
+<tr class="separator:a190c9c06dfe1075abb7399f99553b507"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a64560b289f86efe1d39ece603cd14b5c"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlowpan6__ieee802154__data.html#a64560b289f86efe1d39ece603cd14b5c">tx_datagram_tag</a></td></tr>
+<tr class="separator:a64560b289f86efe1d39ece603cd14b5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a017fc6f447215e4b65955ee7b1ed798f"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlowpan6__ieee802154__data.html#a017fc6f447215e4b65955ee7b1ed798f">ieee_802154_pan_id</a></td></tr>
+<tr class="separator:a017fc6f447215e4b65955ee7b1ed798f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad9cd994385c4d1d8ef0a22686c17720c"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlowpan6__ieee802154__data.html#ad9cd994385c4d1d8ef0a22686c17720c">tx_frame_seq_num</a></td></tr>
+<tr class="separator:ad9cd994385c4d1d8ef0a22686c17720c"><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 keeps track of per-netif state </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a017fc6f447215e4b65955ee7b1ed798f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a017fc6f447215e4b65955ee7b1ed798f">&#9670;&nbsp;</a></span>ieee_802154_pan_id</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t lowpan6_ieee802154_data::ieee_802154_pan_id</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>local PAN ID for IEEE 802.15.4 header </p>
+
+</div>
+</div>
+<a id="a190c9c06dfe1075abb7399f99553b507"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a190c9c06dfe1075abb7399f99553b507">&#9670;&nbsp;</a></span>lowpan6_context</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> lowpan6_ieee802154_data::lowpan6_context[10]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>address context for compression </p>
+
+</div>
+</div>
+<a id="a8c33e7a2026e6e93a2085f3d14378d35"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8c33e7a2026e6e93a2085f3d14378d35">&#9670;&nbsp;</a></span>reass_list</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structlowpan6__reass__helper.html">lowpan6_reass_helper</a>* lowpan6_ieee802154_data::reass_list</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>fragment reassembly list </p>
+
+</div>
+</div>
+<a id="a64560b289f86efe1d39ece603cd14b5c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a64560b289f86efe1d39ece603cd14b5c">&#9670;&nbsp;</a></span>tx_datagram_tag</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t lowpan6_ieee802154_data::tx_datagram_tag</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Datagram Tag for fragmentation </p>
+
+</div>
+</div>
+<a id="ad9cd994385c4d1d8ef0a22686c17720c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad9cd994385c4d1d8ef0a22686c17720c">&#9670;&nbsp;</a></span>tx_frame_seq_num</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t lowpan6_ieee802154_data::tx_frame_seq_num</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sequence Number for IEEE 802.15.4 transmission </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/netif/<a class="el" href="lowpan6_8c.html">lowpan6.c</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="structlowpan6__ieee802154__data.html">lowpan6_ieee802154_data</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structlowpan6__ieee802154__data.js b/doc/doxygen/output/html/structlowpan6__ieee802154__data.js
new file mode 100644
index 0000000..df767bd
--- /dev/null
+++ b/doc/doxygen/output/html/structlowpan6__ieee802154__data.js
@@ -0,0 +1,8 @@
+var structlowpan6__ieee802154__data =
+[
+    [ "ieee_802154_pan_id", "structlowpan6__ieee802154__data.html#a017fc6f447215e4b65955ee7b1ed798f", null ],
+    [ "lowpan6_context", "structlowpan6__ieee802154__data.html#a190c9c06dfe1075abb7399f99553b507", null ],
+    [ "reass_list", "structlowpan6__ieee802154__data.html#a8c33e7a2026e6e93a2085f3d14378d35", null ],
+    [ "tx_datagram_tag", "structlowpan6__ieee802154__data.html#a64560b289f86efe1d39ece603cd14b5c", null ],
+    [ "tx_frame_seq_num", "structlowpan6__ieee802154__data.html#ad9cd994385c4d1d8ef0a22686c17720c", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structlowpan6__link__addr.html b/doc/doxygen/output/html/structlowpan6__link__addr.html
new file mode 100644
index 0000000..8cbad04
--- /dev/null
+++ b/doc/doxygen/output/html/structlowpan6__link__addr.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: lowpan6_link_addr 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structlowpan6__link__addr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">lowpan6_link_addr Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;lowpan6_common.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Helper define for a link layer address, which can be encoded as 0, 2 or 8 bytes </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/netif/<a class="el" href="lowpan6__common_8h.html">lowpan6_common.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="structlowpan6__link__addr.html">lowpan6_link_addr</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structlowpan6__reass__helper.html b/doc/doxygen/output/html/structlowpan6__reass__helper.html
new file mode 100644
index 0000000..04d5f3e
--- /dev/null
+++ b/doc/doxygen/output/html/structlowpan6__reass__helper.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: lowpan6_reass_helper 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structlowpan6__reass__helper.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">lowpan6_reass_helper Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This is a helper struct for reassembly of fragments (IEEE 802.15.4 limits to 127 bytes) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/netif/<a class="el" href="lowpan6_8c.html">lowpan6.c</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="structlowpan6__reass__helper.html">lowpan6_reass_helper</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structlwip__cyclic__timer.html b/doc/doxygen/output/html/structlwip__cyclic__timer.html
new file mode 100644
index 0000000..c853d44
--- /dev/null
+++ b/doc/doxygen/output/html/structlwip__cyclic__timer.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: lwip_cyclic_timer 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structlwip__cyclic__timer.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">lwip_cyclic_timer Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;timeouts.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>This struct contains information about a stack-internal timer function that has to be called at a defined interval </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="timeouts_8h.html">timeouts.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="structlwip__cyclic__timer.html">lwip_cyclic_timer</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structlwip__select__cb.html b/doc/doxygen/output/html/structlwip__select__cb.html
new file mode 100644
index 0000000..5a01a9b
--- /dev/null
+++ b/doc/doxygen/output/html/structlwip__select__cb.html
@@ -0,0 +1,267 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: lwip_select_cb 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structlwip__select__cb.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">lwip_select_cb Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;sockets_priv.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a94128f0e164f895226f20fe75fddd35a"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlwip__select__cb.html">lwip_select_cb</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlwip__select__cb.html#a94128f0e164f895226f20fe75fddd35a">next</a></td></tr>
+<tr class="separator:a94128f0e164f895226f20fe75fddd35a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a21a98e316bb7001d8750b20f5a7d0aa7"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlwip__select__cb.html">lwip_select_cb</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlwip__select__cb.html#a21a98e316bb7001d8750b20f5a7d0aa7">prev</a></td></tr>
+<tr class="separator:a21a98e316bb7001d8750b20f5a7d0aa7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8694a2ce0dd5f91be84056982b96978e"><td class="memItemLeft" align="right" valign="top">fd_set *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlwip__select__cb.html#a8694a2ce0dd5f91be84056982b96978e">readset</a></td></tr>
+<tr class="separator:a8694a2ce0dd5f91be84056982b96978e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa89638b1c2c6b2c88030560861aba04c"><td class="memItemLeft" align="right" valign="top">fd_set *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlwip__select__cb.html#aa89638b1c2c6b2c88030560861aba04c">writeset</a></td></tr>
+<tr class="separator:aa89638b1c2c6b2c88030560861aba04c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2a1e68993ed887fca326d1373ea6caed"><td class="memItemLeft" align="right" valign="top">fd_set *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlwip__select__cb.html#a2a1e68993ed887fca326d1373ea6caed">exceptset</a></td></tr>
+<tr class="separator:a2a1e68993ed887fca326d1373ea6caed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae39fc1bef3938380d15085e0141639de"><td class="memItemLeft" align="right" valign="top">struct pollfd *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlwip__select__cb.html#ae39fc1bef3938380d15085e0141639de">poll_fds</a></td></tr>
+<tr class="separator:ae39fc1bef3938380d15085e0141639de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a39c4980c261380481f79af2b536ebfba"><td class="memItemLeft" align="right" valign="top">nfds_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlwip__select__cb.html#a39c4980c261380481f79af2b536ebfba">poll_nfds</a></td></tr>
+<tr class="separator:a39c4980c261380481f79af2b536ebfba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1c00f1159e9e8eb7cca02c497605cd99"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlwip__select__cb.html#a1c00f1159e9e8eb7cca02c497605cd99">sem_signalled</a></td></tr>
+<tr class="separator:a1c00f1159e9e8eb7cca02c497605cd99"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac9e790cac8b5eae607a8ef95dcc68482"><td class="memItemLeft" align="right" valign="top">sys_sem_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlwip__select__cb.html#ac9e790cac8b5eae607a8ef95dcc68482">sem</a></td></tr>
+<tr class="separator:ac9e790cac8b5eae607a8ef95dcc68482"><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 for a task waiting in select </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a2a1e68993ed887fca326d1373ea6caed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2a1e68993ed887fca326d1373ea6caed">&#9670;&nbsp;</a></span>exceptset</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">fd_set* lwip_select_cb::exceptset</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>unimplemented: exceptset passed to select </p>
+
+</div>
+</div>
+<a id="a94128f0e164f895226f20fe75fddd35a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a94128f0e164f895226f20fe75fddd35a">&#9670;&nbsp;</a></span>next</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structlwip__select__cb.html">lwip_select_cb</a>* lwip_select_cb::next</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Pointer to the next waiting task </p>
+
+</div>
+</div>
+<a id="ae39fc1bef3938380d15085e0141639de"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae39fc1bef3938380d15085e0141639de">&#9670;&nbsp;</a></span>poll_fds</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct pollfd* lwip_select_cb::poll_fds</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>fds passed to poll; NULL if select </p>
+
+</div>
+</div>
+<a id="a39c4980c261380481f79af2b536ebfba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a39c4980c261380481f79af2b536ebfba">&#9670;&nbsp;</a></span>poll_nfds</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">nfds_t lwip_select_cb::poll_nfds</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>nfds passed to poll; 0 if select </p>
+
+</div>
+</div>
+<a id="a21a98e316bb7001d8750b20f5a7d0aa7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a21a98e316bb7001d8750b20f5a7d0aa7">&#9670;&nbsp;</a></span>prev</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structlwip__select__cb.html">lwip_select_cb</a>* lwip_select_cb::prev</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Pointer to the previous waiting task </p>
+
+</div>
+</div>
+<a id="a8694a2ce0dd5f91be84056982b96978e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8694a2ce0dd5f91be84056982b96978e">&#9670;&nbsp;</a></span>readset</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">fd_set* lwip_select_cb::readset</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>readset passed to select </p>
+
+</div>
+</div>
+<a id="ac9e790cac8b5eae607a8ef95dcc68482"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac9e790cac8b5eae607a8ef95dcc68482">&#9670;&nbsp;</a></span>sem</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">sys_sem_t lwip_select_cb::sem</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>semaphore to wake up a task waiting for select </p>
+
+</div>
+</div>
+<a id="a1c00f1159e9e8eb7cca02c497605cd99"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1c00f1159e9e8eb7cca02c497605cd99">&#9670;&nbsp;</a></span>sem_signalled</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lwip_select_cb::sem_signalled</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>don't signal the same semaphore twice: set to 1 when signalled </p>
+
+</div>
+</div>
+<a id="aa89638b1c2c6b2c88030560861aba04c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa89638b1c2c6b2c88030560861aba04c">&#9670;&nbsp;</a></span>writeset</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">fd_set* lwip_select_cb::writeset</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>writeset passed to select </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/priv/<a class="el" href="sockets__priv_8h.html">sockets_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="structlwip__select__cb.html">lwip_select_cb</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structlwip__select__cb.js b/doc/doxygen/output/html/structlwip__select__cb.js
new file mode 100644
index 0000000..ddd4871
--- /dev/null
+++ b/doc/doxygen/output/html/structlwip__select__cb.js
@@ -0,0 +1,12 @@
+var structlwip__select__cb =
+[
+    [ "exceptset", "structlwip__select__cb.html#a2a1e68993ed887fca326d1373ea6caed", null ],
+    [ "next", "structlwip__select__cb.html#a94128f0e164f895226f20fe75fddd35a", null ],
+    [ "poll_fds", "structlwip__select__cb.html#ae39fc1bef3938380d15085e0141639de", null ],
+    [ "poll_nfds", "structlwip__select__cb.html#a39c4980c261380481f79af2b536ebfba", null ],
+    [ "prev", "structlwip__select__cb.html#a21a98e316bb7001d8750b20f5a7d0aa7", null ],
+    [ "readset", "structlwip__select__cb.html#a8694a2ce0dd5f91be84056982b96978e", null ],
+    [ "sem", "structlwip__select__cb.html#ac9e790cac8b5eae607a8ef95dcc68482", null ],
+    [ "sem_signalled", "structlwip__select__cb.html#a1c00f1159e9e8eb7cca02c497605cd99", null ],
+    [ "writeset", "structlwip__select__cb.html#aa89638b1c2c6b2c88030560861aba04c", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structlwip__sock.html b/doc/doxygen/output/html/structlwip__sock.html
new file mode 100644
index 0000000..545068d
--- /dev/null
+++ b/doc/doxygen/output/html/structlwip__sock.html
@@ -0,0 +1,216 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: lwip_sock 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structlwip__sock.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">lwip_sock Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;sockets_priv.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a3a3fee485b3361ed7054cde149355fb4"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structnetconn.html">netconn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlwip__sock.html#a3a3fee485b3361ed7054cde149355fb4">conn</a></td></tr>
+<tr class="separator:a3a3fee485b3361ed7054cde149355fb4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa487ac16b7e5b6a2a618b7b5060247e1"><td class="memItemLeft" align="right" valign="top">union lwip_sock_lastdata&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlwip__sock.html#aa487ac16b7e5b6a2a618b7b5060247e1">lastdata</a></td></tr>
+<tr class="separator:aa487ac16b7e5b6a2a618b7b5060247e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af40d67cbaef4318d26e560988b6e1b3a"><td class="memItemLeft" align="right" valign="top">s16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlwip__sock.html#af40d67cbaef4318d26e560988b6e1b3a">rcvevent</a></td></tr>
+<tr class="separator:af40d67cbaef4318d26e560988b6e1b3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e282776681ea4b7bd389950a8a64fa8"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlwip__sock.html#a7e282776681ea4b7bd389950a8a64fa8">sendevent</a></td></tr>
+<tr class="separator:a7e282776681ea4b7bd389950a8a64fa8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9245a7ab9471bfb6fac94c66d26fba5e"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlwip__sock.html#a9245a7ab9471bfb6fac94c66d26fba5e">errevent</a></td></tr>
+<tr class="separator:a9245a7ab9471bfb6fac94c66d26fba5e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aadbcf5ec3d50631d8821200163d88d38"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlwip__sock.html#aadbcf5ec3d50631d8821200163d88d38">select_waiting</a></td></tr>
+<tr class="separator:aadbcf5ec3d50631d8821200163d88d38"><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>Contains all internal pointers and states used for a socket </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a3a3fee485b3361ed7054cde149355fb4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3a3fee485b3361ed7054cde149355fb4">&#9670;&nbsp;</a></span>conn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetconn.html">netconn</a>* lwip_sock::conn</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>sockets currently are built on netconns, each socket has one netconn </p>
+
+</div>
+</div>
+<a id="a9245a7ab9471bfb6fac94c66d26fba5e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9245a7ab9471bfb6fac94c66d26fba5e">&#9670;&nbsp;</a></span>errevent</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t lwip_sock::errevent</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>error happened for this socket, set by event_callback(), tested by select </p>
+
+</div>
+</div>
+<a id="aa487ac16b7e5b6a2a618b7b5060247e1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa487ac16b7e5b6a2a618b7b5060247e1">&#9670;&nbsp;</a></span>lastdata</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">union lwip_sock_lastdata lwip_sock::lastdata</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>data that was left from the previous read </p>
+
+</div>
+</div>
+<a id="af40d67cbaef4318d26e560988b6e1b3a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af40d67cbaef4318d26e560988b6e1b3a">&#9670;&nbsp;</a></span>rcvevent</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">s16_t lwip_sock::rcvevent</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>number of times data was received, set by event_callback(), tested by the receive and select functions </p>
+
+</div>
+</div>
+<a id="aadbcf5ec3d50631d8821200163d88d38"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aadbcf5ec3d50631d8821200163d88d38">&#9670;&nbsp;</a></span>select_waiting</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t lwip_sock::select_waiting</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>counter of how many threads are waiting for this socket using select </p>
+
+</div>
+</div>
+<a id="a7e282776681ea4b7bd389950a8a64fa8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7e282776681ea4b7bd389950a8a64fa8">&#9670;&nbsp;</a></span>sendevent</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t lwip_sock::sendevent</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>number of times data was ACKed (free send buffer), set by event_callback(), tested by select </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/priv/<a class="el" href="sockets__priv_8h.html">sockets_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="structlwip__sock.html">lwip_sock</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structlwip__sock.js b/doc/doxygen/output/html/structlwip__sock.js
new file mode 100644
index 0000000..ce30dd6
--- /dev/null
+++ b/doc/doxygen/output/html/structlwip__sock.js
@@ -0,0 +1,9 @@
+var structlwip__sock =
+[
+    [ "conn", "structlwip__sock.html#a3a3fee485b3361ed7054cde149355fb4", null ],
+    [ "errevent", "structlwip__sock.html#a9245a7ab9471bfb6fac94c66d26fba5e", null ],
+    [ "lastdata", "structlwip__sock.html#aa487ac16b7e5b6a2a618b7b5060247e1", null ],
+    [ "rcvevent", "structlwip__sock.html#af40d67cbaef4318d26e560988b6e1b3a", null ],
+    [ "select_waiting", "structlwip__sock.html#aadbcf5ec3d50631d8821200163d88d38", null ],
+    [ "sendevent", "structlwip__sock.html#a7e282776681ea4b7bd389950a8a64fa8", 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
new file mode 100644
index 0000000..b842f4b
--- /dev/null
+++ b/doc/doxygen/output/html/structmdns__host.html
@@ -0,0 +1,197 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: mdns_host 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structmdns__host.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">mdns_host Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a560447b364854eb5480e137e09d3cd24"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__host.html#a560447b364854eb5480e137e09d3cd24">name</a> [63+1]</td></tr>
+<tr class="separator:a560447b364854eb5480e137e09d3cd24"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="structmdns__host.html#a750c31340c22e51375e4dc3e6e94f2ed">services</a> [1]</td></tr>
+<tr class="separator:a750c31340c22e51375e4dc3e6e94f2ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4547e5a8375fc1f1372546268a80d51b"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__host.html#a4547e5a8375fc1f1372546268a80d51b">dns_ttl</a></td></tr>
+<tr class="separator:a4547e5a8375fc1f1372546268a80d51b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac8f6e3c6e1251bf73f043e489c840922"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__host.html#ac8f6e3c6e1251bf73f043e489c840922">probes_sent</a></td></tr>
+<tr class="separator:ac8f6e3c6e1251bf73f043e489c840922"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af9ced31c35de6a281e5b13f01e5aae61"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__host.html#af9ced31c35de6a281e5b13f01e5aae61">probing_state</a></td></tr>
+<tr class="separator:af9ced31c35de6a281e5b13f01e5aae61"><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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4547e5a8375fc1f1372546268a80d51b">&#9670;&nbsp;</a></span>dns_ttl</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t mdns_host::dns_ttl</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TTL in seconds of A/AAAA/PTR replies </p>
+
+</div>
+</div>
+<a id="a560447b364854eb5480e137e09d3cd24"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a560447b364854eb5480e137e09d3cd24">&#9670;&nbsp;</a></span>name</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char mdns_host::name[63+1]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Hostname </p>
+
+</div>
+</div>
+<a id="ac8f6e3c6e1251bf73f043e489c840922"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac8f6e3c6e1251bf73f043e489c840922">&#9670;&nbsp;</a></span>probes_sent</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mdns_host::probes_sent</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of probes sent for the current name </p>
+
+</div>
+</div>
+<a id="af9ced31c35de6a281e5b13f01e5aae61"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af9ced31c35de6a281e5b13f01e5aae61">&#9670;&nbsp;</a></span>probing_state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mdns_host::probing_state</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>State in probing sequence </p>
+
+</div>
+</div>
+<a id="a750c31340c22e51375e4dc3e6e94f2ed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a750c31340c22e51375e4dc3e6e94f2ed">&#9670;&nbsp;</a></span>services</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structmdns__service.html">mdns_service</a>* mdns_host::services[1]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Pointer to services </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>
+</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__host.html">mdns_host</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structmdns__host.js b/doc/doxygen/output/html/structmdns__host.js
new file mode 100644
index 0000000..0099119
--- /dev/null
+++ b/doc/doxygen/output/html/structmdns__host.js
@@ -0,0 +1,8 @@
+var structmdns__host =
+[
+    [ "dns_ttl", "structmdns__host.html#a4547e5a8375fc1f1372546268a80d51b", 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 ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structmdns__outpacket.html b/doc/doxygen/output/html/structmdns__outpacket.html
new file mode 100644
index 0000000..398f6b1
--- /dev/null
+++ b/doc/doxygen/output/html/structmdns__outpacket.html
@@ -0,0 +1,333 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: mdns_outpacket 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structmdns__outpacket.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">mdns_outpacket Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem: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="structmdns__outpacket.html#ad0bd066f127d35a0ce67193e1cd07430">netif</a></td></tr>
+<tr class="separator:ad0bd066f127d35a0ce67193e1cd07430"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="structmdns__outpacket.html#a83d4504736f2bf315fc8b712c6a446e9">pbuf</a></td></tr>
+<tr class="separator:a83d4504736f2bf315fc8b712c6a446e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8ead21e392b21c3e872c0cab874cdcf5"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__outpacket.html#a8ead21e392b21c3e872c0cab874cdcf5">write_offset</a></td></tr>
+<tr class="separator:a8ead21e392b21c3e872c0cab874cdcf5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac470f02a9f332f18e027437dc293d348"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__outpacket.html#ac470f02a9f332f18e027437dc293d348">tx_id</a></td></tr>
+<tr class="separator:ac470f02a9f332f18e027437dc293d348"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1fdc90b48d8cf1fc24895f0c7a5798e4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__outpacket.html#a1fdc90b48d8cf1fc24895f0c7a5798e4">dest_addr</a></td></tr>
+<tr class="separator:a1fdc90b48d8cf1fc24895f0c7a5798e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0d402cde040728d361dec8f7d86f504c"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__outpacket.html#a0d402cde040728d361dec8f7d86f504c">questions</a></td></tr>
+<tr class="separator:a0d402cde040728d361dec8f7d86f504c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aad2c24d4d5a935a209966ceace82f9ad"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__outpacket.html#aad2c24d4d5a935a209966ceace82f9ad">answers</a></td></tr>
+<tr class="separator:aad2c24d4d5a935a209966ceace82f9ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a689ea7094a3569878f15477e725035"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035">authoritative</a></td></tr>
+<tr class="separator:a1a689ea7094a3569878f15477e725035"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acda83121a9bb785d20f979a0a3a312ce"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce">additional</a></td></tr>
+<tr class="separator:acda83121a9bb785d20f979a0a3a312ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aee97e98c4869aa63ffe348d38d87221f"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__outpacket.html#aee97e98c4869aa63ffe348d38d87221f">domain_offsets</a> [10]</td></tr>
+<tr class="separator:aee97e98c4869aa63ffe348d38d87221f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9bd0fd91dda48baa2938dddd747d3195"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__outpacket.html#a9bd0fd91dda48baa2938dddd747d3195">cache_flush</a></td></tr>
+<tr class="separator:a9bd0fd91dda48baa2938dddd747d3195"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a68255725575af086a3afa76bc5c8e64d"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__outpacket.html#a68255725575af086a3afa76bc5c8e64d">unicast_reply</a></td></tr>
+<tr class="separator:a68255725575af086a3afa76bc5c8e64d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff8c520bffa87c78e0ee2440571bbd65"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__outpacket.html#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><h2 class="groupheader">Field Documentation</h2>
+<a id="acda83121a9bb785d20f979a0a3a312ce"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acda83121a9bb785d20f979a0a3a312ce">&#9670;&nbsp;</a></span>additional</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_outpacket::additional</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of additional answers written </p>
+
+</div>
+</div>
+<a id="aad2c24d4d5a935a209966ceace82f9ad"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aad2c24d4d5a935a209966ceace82f9ad">&#9670;&nbsp;</a></span>answers</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_outpacket::answers</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of normal answers written </p>
+
+</div>
+</div>
+<a id="a1a689ea7094a3569878f15477e725035"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1a689ea7094a3569878f15477e725035">&#9670;&nbsp;</a></span>authoritative</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_outpacket::authoritative</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of authoritative answers written </p>
+
+</div>
+</div>
+<a id="a9bd0fd91dda48baa2938dddd747d3195"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9bd0fd91dda48baa2938dddd747d3195">&#9670;&nbsp;</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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1fdc90b48d8cf1fc24895f0c7a5798e4">&#9670;&nbsp;</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#ga16ef96d6cde029029bbf47fee35fd67a">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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aee97e98c4869aa63ffe348d38d87221f">&#9670;&nbsp;</a></span>domain_offsets</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_outpacket::domain_offsets[10]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Offsets for written domain names in packet. Used for compression </p>
+
+</div>
+</div>
+<a id="aff8c520bffa87c78e0ee2440571bbd65"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aff8c520bffa87c78e0ee2440571bbd65">&#9670;&nbsp;</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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad0bd066f127d35a0ce67193e1cd07430">&#9670;&nbsp;</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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a83d4504736f2bf315fc8b712c6a446e9">&#9670;&nbsp;</a></span>pbuf</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* mdns_outpacket::pbuf</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Packet data </p>
+
+</div>
+</div>
+<a id="a0d402cde040728d361dec8f7d86f504c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0d402cde040728d361dec8f7d86f504c">&#9670;&nbsp;</a></span>questions</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_outpacket::questions</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of questions written </p>
+
+</div>
+</div>
+<a id="ac470f02a9f332f18e027437dc293d348"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac470f02a9f332f18e027437dc293d348">&#9670;&nbsp;</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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a68255725575af086a3afa76bc5c8e64d">&#9670;&nbsp;</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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8ead21e392b21c3e872c0cab874cdcf5">&#9670;&nbsp;</a></span>write_offset</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_outpacket::write_offset</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Current write offset in packet </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>
+</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__outpacket.html">mdns_outpacket</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structmdns__outpacket.js b/doc/doxygen/output/html/structmdns__outpacket.js
new file mode 100644
index 0000000..f1a4c5c
--- /dev/null
+++ b/doc/doxygen/output/html/structmdns__outpacket.js
@@ -0,0 +1,16 @@
+var structmdns__outpacket =
+[
+    [ "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
new file mode 100644
index 0000000..bc0f2c0
--- /dev/null
+++ b/doc/doxygen/output/html/structmdns__packet.html
@@ -0,0 +1,282 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: mdns_packet 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structmdns__packet.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">mdns_packet Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:aaa64cc21495dc6bb76ed9125904dd07a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__packet.html#aaa64cc21495dc6bb76ed9125904dd07a">source_addr</a></td></tr>
+<tr class="separator:aaa64cc21495dc6bb76ed9125904dd07a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8659b4f582be0df84b6ae91308737377"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__packet.html#a8659b4f582be0df84b6ae91308737377">recv_unicast</a></td></tr>
+<tr class="separator:a8659b4f582be0df84b6ae91308737377"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="structmdns__packet.html#ac7307f344f654cb954f92d578dc7c989">netif</a></td></tr>
+<tr class="separator:ac7307f344f654cb954f92d578dc7c989"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="structmdns__packet.html#a2ec02a67fd82f0df695e94745eddaf45">pbuf</a></td></tr>
+<tr class="separator:a2ec02a67fd82f0df695e94745eddaf45"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4c3c3a28ac113b3ee40d5cf07d851f68"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__packet.html#a4c3c3a28ac113b3ee40d5cf07d851f68">parse_offset</a></td></tr>
+<tr class="separator:a4c3c3a28ac113b3ee40d5cf07d851f68"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0cd71fd9af6d2529e6a41c451c037e00"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00">tx_id</a></td></tr>
+<tr class="separator:a0cd71fd9af6d2529e6a41c451c037e00"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a09211e78f7f773c492b5856d31423699"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__packet.html#a09211e78f7f773c492b5856d31423699">questions</a></td></tr>
+<tr class="separator:a09211e78f7f773c492b5856d31423699"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afdb9c14dd0c915119b8adb584381a437"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__packet.html#afdb9c14dd0c915119b8adb584381a437">questions_left</a></td></tr>
+<tr class="separator:afdb9c14dd0c915119b8adb584381a437"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a918feee242cfb3934d9f5c3de1c298e7"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__packet.html#a918feee242cfb3934d9f5c3de1c298e7">answers</a></td></tr>
+<tr class="separator:a918feee242cfb3934d9f5c3de1c298e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56ba495a1458a21982e65d746468849d"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__packet.html#a56ba495a1458a21982e65d746468849d">answers_left</a></td></tr>
+<tr class="separator:a56ba495a1458a21982e65d746468849d"><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="a918feee242cfb3934d9f5c3de1c298e7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a918feee242cfb3934d9f5c3de1c298e7">&#9670;&nbsp;</a></span>answers</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_packet::answers</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of answers in packet, (sum of normal, authoritative and additional answers) read from packet header </p>
+
+</div>
+</div>
+<a id="a56ba495a1458a21982e65d746468849d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a56ba495a1458a21982e65d746468849d">&#9670;&nbsp;</a></span>answers_left</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_packet::answers_left</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of unparsed answers </p>
+
+</div>
+</div>
+<a id="ac7307f344f654cb954f92d578dc7c989"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac7307f344f654cb954f92d578dc7c989">&#9670;&nbsp;</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_packet::netif</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Netif that received the packet </p>
+
+</div>
+</div>
+<a id="a4c3c3a28ac113b3ee40d5cf07d851f68"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4c3c3a28ac113b3ee40d5cf07d851f68">&#9670;&nbsp;</a></span>parse_offset</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_packet::parse_offset</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Current parsing offset in packet </p>
+
+</div>
+</div>
+<a id="a2ec02a67fd82f0df695e94745eddaf45"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2ec02a67fd82f0df695e94745eddaf45">&#9670;&nbsp;</a></span>pbuf</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* mdns_packet::pbuf</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Packet data </p>
+
+</div>
+</div>
+<a id="a09211e78f7f773c492b5856d31423699"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a09211e78f7f773c492b5856d31423699">&#9670;&nbsp;</a></span>questions</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_packet::questions</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of questions in packet, read from packet header </p>
+
+</div>
+</div>
+<a id="afdb9c14dd0c915119b8adb584381a437"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afdb9c14dd0c915119b8adb584381a437">&#9670;&nbsp;</a></span>questions_left</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_packet::questions_left</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of unparsed questions </p>
+
+</div>
+</div>
+<a id="a8659b4f582be0df84b6ae91308737377"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8659b4f582be0df84b6ae91308737377">&#9670;&nbsp;</a></span>recv_unicast</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_packet::recv_unicast</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If packet was received unicast </p>
+
+</div>
+</div>
+<a id="aaa64cc21495dc6bb76ed9125904dd07a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaa64cc21495dc6bb76ed9125904dd07a">&#9670;&nbsp;</a></span>source_addr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> mdns_packet::source_addr</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sender IP/port </p>
+
+</div>
+</div>
+<a id="a0cd71fd9af6d2529e6a41c451c037e00"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0cd71fd9af6d2529e6a41c451c037e00">&#9670;&nbsp;</a></span>tx_id</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_packet::tx_id</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Identifier. Used in legacy queries </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>
+</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__packet.html">mdns_packet</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structmdns__packet.js b/doc/doxygen/output/html/structmdns__packet.js
new file mode 100644
index 0000000..cf5b334
--- /dev/null
+++ b/doc/doxygen/output/html/structmdns__packet.js
@@ -0,0 +1,13 @@
+var structmdns__packet =
+[
+    [ "answers", "structmdns__packet.html#a918feee242cfb3934d9f5c3de1c298e7", null ],
+    [ "answers_left", "structmdns__packet.html#a56ba495a1458a21982e65d746468849d", null ],
+    [ "netif", "structmdns__packet.html#ac7307f344f654cb954f92d578dc7c989", null ],
+    [ "parse_offset", "structmdns__packet.html#a4c3c3a28ac113b3ee40d5cf07d851f68", null ],
+    [ "pbuf", "structmdns__packet.html#a2ec02a67fd82f0df695e94745eddaf45", null ],
+    [ "questions", "structmdns__packet.html#a09211e78f7f773c492b5856d31423699", null ],
+    [ "questions_left", "structmdns__packet.html#afdb9c14dd0c915119b8adb584381a437", null ],
+    [ "recv_unicast", "structmdns__packet.html#a8659b4f582be0df84b6ae91308737377", null ],
+    [ "source_addr", "structmdns__packet.html#aaa64cc21495dc6bb76ed9125904dd07a", null ],
+    [ "tx_id", "structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00", 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
new file mode 100644
index 0000000..eddce4b
--- /dev/null
+++ b/doc/doxygen/output/html/structmdns__rr__info.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: mdns_rr_info 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structmdns__rr__info.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">mdns_rr_info Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<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>
+</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__rr__info.html">mdns_rr_info</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structmdns__service.html b/doc/doxygen/output/html/structmdns__service.html
new file mode 100644
index 0000000..3e0f58c
--- /dev/null
+++ b/doc/doxygen/output/html/structmdns__service.html
@@ -0,0 +1,231 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: mdns_service 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structmdns__service.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">mdns_service Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a35daff90a18d19b14f23fa02df424f94"><td class="memItemLeft" align="right" valign="top">struct mdns_domain&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__service.html#a35daff90a18d19b14f23fa02df424f94">txtdata</a></td></tr>
+<tr class="separator:a35daff90a18d19b14f23fa02df424f94"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6d92cf213e3647d3ca1520595c3b784"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__service.html#ac6d92cf213e3647d3ca1520595c3b784">name</a> [63+1]</td></tr>
+<tr class="separator:ac6d92cf213e3647d3ca1520595c3b784"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a42583986e24b5a4a13b6d647c1a281ad"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad">service</a> [63+1]</td></tr>
+<tr class="separator:a42583986e24b5a4a13b6d647c1a281ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="structmdns__service.html#a79bc4946c96a3b2d0713bc0897c4bd9c">txt_fn</a></td></tr>
+<tr class="separator:a79bc4946c96a3b2d0713bc0897c4bd9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5a939a4da01cb50c74cd53b352e4fa14"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__service.html#a5a939a4da01cb50c74cd53b352e4fa14">dns_ttl</a></td></tr>
+<tr class="separator:a5a939a4da01cb50c74cd53b352e4fa14"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa9f2e0bb67d3848152e6076e92e8018d"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d">proto</a></td></tr>
+<tr class="separator:aa9f2e0bb67d3848152e6076e92e8018d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abbf317cde8fb7ba8d834ad9746dd780c"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__service.html#abbf317cde8fb7ba8d834ad9746dd780c">port</a></td></tr>
+<tr class="separator:abbf317cde8fb7ba8d834ad9746dd780c"><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 service </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a5a939a4da01cb50c74cd53b352e4fa14"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5a939a4da01cb50c74cd53b352e4fa14">&#9670;&nbsp;</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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac6d92cf213e3647d3ca1520595c3b784">&#9670;&nbsp;</a></span>name</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char mdns_service::name[63+1]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Name of service, like 'myweb' </p>
+
+</div>
+</div>
+<a id="abbf317cde8fb7ba8d834ad9746dd780c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abbf317cde8fb7ba8d834ad9746dd780c">&#9670;&nbsp;</a></span>port</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_service::port</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Port of the service </p>
+
+</div>
+</div>
+<a id="aa9f2e0bb67d3848152e6076e92e8018d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa9f2e0bb67d3848152e6076e92e8018d">&#9670;&nbsp;</a></span>proto</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_service::proto</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Protocol, TCP or UDP </p>
+
+</div>
+</div>
+<a id="a42583986e24b5a4a13b6d647c1a281ad"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a42583986e24b5a4a13b6d647c1a281ad">&#9670;&nbsp;</a></span>service</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char mdns_service::service[63+1]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Type of service, like '_http' </p>
+
+</div>
+</div>
+<a id="a79bc4946c96a3b2d0713bc0897c4bd9c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a79bc4946c96a3b2d0713bc0897c4bd9c">&#9670;&nbsp;</a></span>txt_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83">service_get_txt_fn_t</a> mdns_service::txt_fn</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Callback function and userdata to update txtdata buffer </p>
+
+</div>
+</div>
+<a id="a35daff90a18d19b14f23fa02df424f94"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a35daff90a18d19b14f23fa02df424f94">&#9670;&nbsp;</a></span>txtdata</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct mdns_domain mdns_service::txtdata</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TXT record to answer with </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>
+</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__service.html">mdns_service</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structmdns__service.js b/doc/doxygen/output/html/structmdns__service.js
new file mode 100644
index 0000000..d905e66
--- /dev/null
+++ b/doc/doxygen/output/html/structmdns__service.js
@@ -0,0 +1,10 @@
+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 ],
+    [ "service", "structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad", null ],
+    [ "txt_fn", "structmdns__service.html#a79bc4946c96a3b2d0713bc0897c4bd9c", null ],
+    [ "txtdata", "structmdns__service.html#a35daff90a18d19b14f23fa02df424f94", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structmem.html b/doc/doxygen/output/html/structmem.html
new file mode 100644
index 0000000..d84709f
--- /dev/null
+++ b/doc/doxygen/output/html/structmem.html
@@ -0,0 +1,163 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: mem 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structmem.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">mem Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a5abf13a11156e92c417f7ff66ef0b5cf"><td class="memItemLeft" align="right" valign="top">mem_size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmem.html#a5abf13a11156e92c417f7ff66ef0b5cf">next</a></td></tr>
+<tr class="separator:a5abf13a11156e92c417f7ff66ef0b5cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d7722ed10adf965fa98563d502f98ac"><td class="memItemLeft" align="right" valign="top">mem_size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmem.html#a9d7722ed10adf965fa98563d502f98ac">prev</a></td></tr>
+<tr class="separator:a9d7722ed10adf965fa98563d502f98ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa76b6a39425617435978dce903f0d456"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmem.html#aa76b6a39425617435978dce903f0d456">used</a></td></tr>
+<tr class="separator:aa76b6a39425617435978dce903f0d456"><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>The heap is made up as a list of structs of this type. This does not have to be aligned since for getting its size, we only use the macro SIZEOF_STRUCT_MEM, which automatically aligns. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a5abf13a11156e92c417f7ff66ef0b5cf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5abf13a11156e92c417f7ff66ef0b5cf">&#9670;&nbsp;</a></span>next</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">mem_size_t mem::next</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>index (-&gt; ram[next]) of the next struct </p>
+
+</div>
+</div>
+<a id="a9d7722ed10adf965fa98563d502f98ac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9d7722ed10adf965fa98563d502f98ac">&#9670;&nbsp;</a></span>prev</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">mem_size_t mem::prev</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>index (-&gt; ram[prev]) of the previous struct </p>
+
+</div>
+</div>
+<a id="aa76b6a39425617435978dce903f0d456"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa76b6a39425617435978dce903f0d456">&#9670;&nbsp;</a></span>used</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mem::used</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>1: this area is used; 0: this area is unused </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/core/<a class="el" href="mem_8c.html">mem.c</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="structmem.html">mem</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structmem.js b/doc/doxygen/output/html/structmem.js
new file mode 100644
index 0000000..b2d06a2
--- /dev/null
+++ b/doc/doxygen/output/html/structmem.js
@@ -0,0 +1,6 @@
+var structmem =
+[
+    [ "next", "structmem.html#a5abf13a11156e92c417f7ff66ef0b5cf", null ],
+    [ "prev", "structmem.html#a9d7722ed10adf965fa98563d502f98ac", null ],
+    [ "used", "structmem.html#aa76b6a39425617435978dce903f0d456", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structmemp__desc.html b/doc/doxygen/output/html/structmemp__desc.html
new file mode 100644
index 0000000..b2c29f1
--- /dev/null
+++ b/doc/doxygen/output/html/structmemp__desc.html
@@ -0,0 +1,199 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: memp_desc 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structmemp__desc.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">memp_desc Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;memp_priv.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a05cb67eb408e4736cc0f5e32b5db7500"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__mem.html">stats_mem</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmemp__desc.html#a05cb67eb408e4736cc0f5e32b5db7500">stats</a></td></tr>
+<tr class="separator:a05cb67eb408e4736cc0f5e32b5db7500"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1688d2bdd5a7b77700e1fa627f025ba3"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmemp__desc.html#a1688d2bdd5a7b77700e1fa627f025ba3">size</a></td></tr>
+<tr class="separator:a1688d2bdd5a7b77700e1fa627f025ba3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c32db78e565b8812ca0e20fe929a8a7"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmemp__desc.html#a2c32db78e565b8812ca0e20fe929a8a7">num</a></td></tr>
+<tr class="separator:a2c32db78e565b8812ca0e20fe929a8a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9aec58adcbcd88167247296ca4346558"><td class="memItemLeft" align="right" valign="top">u8_t *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmemp__desc.html#a9aec58adcbcd88167247296ca4346558">base</a></td></tr>
+<tr class="separator:a9aec58adcbcd88167247296ca4346558"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d6b758ce5c3b47a67a7568d38fb3926"><td class="memItemLeft" align="right" valign="top">struct memp **&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmemp__desc.html#a9d6b758ce5c3b47a67a7568d38fb3926">tab</a></td></tr>
+<tr class="separator:a9d6b758ce5c3b47a67a7568d38fb3926"><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>Memory pool descriptor </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a9aec58adcbcd88167247296ca4346558"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9aec58adcbcd88167247296ca4346558">&#9670;&nbsp;</a></span>base</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t* memp_desc::base</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Base address </p>
+
+</div>
+</div>
+<a id="a2c32db78e565b8812ca0e20fe929a8a7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2c32db78e565b8812ca0e20fe929a8a7">&#9670;&nbsp;</a></span>num</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t memp_desc::num</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of elements </p>
+
+</div>
+</div>
+<a id="a1688d2bdd5a7b77700e1fa627f025ba3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1688d2bdd5a7b77700e1fa627f025ba3">&#9670;&nbsp;</a></span>size</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t memp_desc::size</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Element size </p>
+
+</div>
+</div>
+<a id="a05cb67eb408e4736cc0f5e32b5db7500"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a05cb67eb408e4736cc0f5e32b5db7500">&#9670;&nbsp;</a></span>stats</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__mem.html">stats_mem</a>* memp_desc::stats</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Statistics </p>
+
+</div>
+</div>
+<a id="a9d6b758ce5c3b47a67a7568d38fb3926"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9d6b758ce5c3b47a67a7568d38fb3926">&#9670;&nbsp;</a></span>tab</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct memp** memp_desc::tab</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>First free element of each pool. Elements form a linked list. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/priv/<a class="el" href="memp__priv_8h.html">memp_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="structmemp__desc.html">memp_desc</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structmemp__desc.js b/doc/doxygen/output/html/structmemp__desc.js
new file mode 100644
index 0000000..e47f06b
--- /dev/null
+++ b/doc/doxygen/output/html/structmemp__desc.js
@@ -0,0 +1,8 @@
+var structmemp__desc =
+[
+    [ "base", "structmemp__desc.html#a9aec58adcbcd88167247296ca4346558", null ],
+    [ "num", "structmemp__desc.html#a2c32db78e565b8812ca0e20fe929a8a7", null ],
+    [ "size", "structmemp__desc.html#a1688d2bdd5a7b77700e1fa627f025ba3", null ],
+    [ "stats", "structmemp__desc.html#a05cb67eb408e4736cc0f5e32b5db7500", null ],
+    [ "tab", "structmemp__desc.html#a9d6b758ce5c3b47a67a7568d38fb3926", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structmld__group.html b/doc/doxygen/output/html/structmld__group.html
new file mode 100644
index 0000000..716afb4
--- /dev/null
+++ b/doc/doxygen/output/html/structmld__group.html
@@ -0,0 +1,216 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: mld_group 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structmld__group.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">mld_group Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;mld6.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a9273a345a5754241bf26ddc835d27ddc"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structmld__group.html">mld_group</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmld__group.html#a9273a345a5754241bf26ddc835d27ddc">next</a></td></tr>
+<tr class="separator:a9273a345a5754241bf26ddc835d27ddc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a781abf78d835627ded1202166b44b88e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmld__group.html#a781abf78d835627ded1202166b44b88e">group_address</a></td></tr>
+<tr class="separator:a781abf78d835627ded1202166b44b88e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa8eb75f4dfaefbf0d2853b0e31ceb53b"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmld__group.html#aa8eb75f4dfaefbf0d2853b0e31ceb53b">last_reporter_flag</a></td></tr>
+<tr class="separator:aa8eb75f4dfaefbf0d2853b0e31ceb53b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae9cfd3f126257aa3aff4a24e05c04059"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmld__group.html#ae9cfd3f126257aa3aff4a24e05c04059">group_state</a></td></tr>
+<tr class="separator:ae9cfd3f126257aa3aff4a24e05c04059"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a21f31e845cb11d2aca4ae7120736f69a"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmld__group.html#a21f31e845cb11d2aca4ae7120736f69a">timer</a></td></tr>
+<tr class="separator:a21f31e845cb11d2aca4ae7120736f69a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:addc67094f83c9352fe039c392c480f9e"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmld__group.html#addc67094f83c9352fe039c392c480f9e">use</a></td></tr>
+<tr class="separator:addc67094f83c9352fe039c392c480f9e"><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>MLD group </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a781abf78d835627ded1202166b44b88e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a781abf78d835627ded1202166b44b88e">&#9670;&nbsp;</a></span>group_address</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> mld_group::group_address</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>multicast address </p>
+
+</div>
+</div>
+<a id="ae9cfd3f126257aa3aff4a24e05c04059"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae9cfd3f126257aa3aff4a24e05c04059">&#9670;&nbsp;</a></span>group_state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mld_group::group_state</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>current state of the group </p>
+
+</div>
+</div>
+<a id="aa8eb75f4dfaefbf0d2853b0e31ceb53b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa8eb75f4dfaefbf0d2853b0e31ceb53b">&#9670;&nbsp;</a></span>last_reporter_flag</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mld_group::last_reporter_flag</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>signifies we were the last person to report </p>
+
+</div>
+</div>
+<a id="a9273a345a5754241bf26ddc835d27ddc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9273a345a5754241bf26ddc835d27ddc">&#9670;&nbsp;</a></span>next</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structmld__group.html">mld_group</a>* mld_group::next</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>next link </p>
+
+</div>
+</div>
+<a id="a21f31e845cb11d2aca4ae7120736f69a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a21f31e845cb11d2aca4ae7120736f69a">&#9670;&nbsp;</a></span>timer</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mld_group::timer</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>timer for reporting </p>
+
+</div>
+</div>
+<a id="addc67094f83c9352fe039c392c480f9e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#addc67094f83c9352fe039c392c480f9e">&#9670;&nbsp;</a></span>use</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mld_group::use</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>counter of simultaneous uses </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="mld6_8h.html">mld6.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="structmld__group.html">mld_group</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structmld__group.js b/doc/doxygen/output/html/structmld__group.js
new file mode 100644
index 0000000..574e9ec
--- /dev/null
+++ b/doc/doxygen/output/html/structmld__group.js
@@ -0,0 +1,9 @@
+var structmld__group =
+[
+    [ "group_address", "structmld__group.html#a781abf78d835627ded1202166b44b88e", null ],
+    [ "group_state", "structmld__group.html#ae9cfd3f126257aa3aff4a24e05c04059", null ],
+    [ "last_reporter_flag", "structmld__group.html#aa8eb75f4dfaefbf0d2853b0e31ceb53b", null ],
+    [ "next", "structmld__group.html#a9273a345a5754241bf26ddc835d27ddc", null ],
+    [ "timer", "structmld__group.html#a21f31e845cb11d2aca4ae7120736f69a", null ],
+    [ "use", "structmld__group.html#addc67094f83c9352fe039c392c480f9e", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structmld__header.html b/doc/doxygen/output/html/structmld__header.html
new file mode 100644
index 0000000..c79df99
--- /dev/null
+++ b/doc/doxygen/output/html/structmld__header.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: mld_header 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structmld__header.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">mld_header Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;mld6.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Multicast listener report/query/done message header. </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_2mld6_8h.html">mld6.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="structmld__header.html">mld_header</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structmqtt__client__s.html b/doc/doxygen/output/html/structmqtt__client__s.html
new file mode 100644
index 0000000..f9cff0e
--- /dev/null
+++ b/doc/doxygen/output/html/structmqtt__client__s.html
@@ -0,0 +1,267 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: mqtt_client_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structmqtt__client__s.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">mqtt_client_s Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;mqtt_priv.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a6274ba2eb2fe6afa970b1c8a650d8cef"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__client__s.html#a6274ba2eb2fe6afa970b1c8a650d8cef">cyclic_tick</a></td></tr>
+<tr class="separator:a6274ba2eb2fe6afa970b1c8a650d8cef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4100f6e0867c212d5923f10024f2e32"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__client__s.html#ab4100f6e0867c212d5923f10024f2e32">pkt_id_seq</a></td></tr>
+<tr class="separator:ab4100f6e0867c212d5923f10024f2e32"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c81d0dd14e786222425ea04fd060824"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__client__s.html#a6c81d0dd14e786222425ea04fd060824">inpub_pkt_id</a></td></tr>
+<tr class="separator:a6c81d0dd14e786222425ea04fd060824"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af4a07c1079e2e2a336f1939d8b9677e6"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__client__s.html#af4a07c1079e2e2a336f1939d8b9677e6">conn_state</a></td></tr>
+<tr class="separator:af4a07c1079e2e2a336f1939d8b9677e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae6d53359ec6d70533dab7c0d2717ce1a"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__client__s.html#ae6d53359ec6d70533dab7c0d2717ce1a">connect_arg</a></td></tr>
+<tr class="separator:ae6d53359ec6d70533dab7c0d2717ce1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1897eeefe64f9e2d2d953adca858f439"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structmqtt__request__t.html">mqtt_request_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__client__s.html#a1897eeefe64f9e2d2d953adca858f439">pend_req_queue</a></td></tr>
+<tr class="separator:a1897eeefe64f9e2d2d953adca858f439"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a26dc9112351c042594a41703197925a7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81">mqtt_incoming_data_cb_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__client__s.html#a26dc9112351c042594a41703197925a7">data_cb</a></td></tr>
+<tr class="separator:a26dc9112351c042594a41703197925a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae7bd1da3461efef9616934feb166aa5"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__client__s.html#aae7bd1da3461efef9616934feb166aa5">msg_idx</a></td></tr>
+<tr class="separator:aae7bd1da3461efef9616934feb166aa5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a667c1dc7a6008055b63877acb06f333c"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structmqtt__ringbuf__t.html">mqtt_ringbuf_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__client__s.html#a667c1dc7a6008055b63877acb06f333c">output</a></td></tr>
+<tr class="separator:a667c1dc7a6008055b63877acb06f333c"><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>MQTT client </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="af4a07c1079e2e2a336f1939d8b9677e6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af4a07c1079e2e2a336f1939d8b9677e6">&#9670;&nbsp;</a></span>conn_state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mqtt_client_s::conn_state</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Connection state </p>
+
+</div>
+</div>
+<a id="ae6d53359ec6d70533dab7c0d2717ce1a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae6d53359ec6d70533dab7c0d2717ce1a">&#9670;&nbsp;</a></span>connect_arg</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* mqtt_client_s::connect_arg</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Connection callback </p>
+
+</div>
+</div>
+<a id="a6274ba2eb2fe6afa970b1c8a650d8cef"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6274ba2eb2fe6afa970b1c8a650d8cef">&#9670;&nbsp;</a></span>cyclic_tick</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mqtt_client_s::cyclic_tick</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Timers and timeouts </p>
+
+</div>
+</div>
+<a id="a26dc9112351c042594a41703197925a7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a26dc9112351c042594a41703197925a7">&#9670;&nbsp;</a></span>data_cb</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81">mqtt_incoming_data_cb_t</a> mqtt_client_s::data_cb</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Incoming data callback </p>
+
+</div>
+</div>
+<a id="a6c81d0dd14e786222425ea04fd060824"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6c81d0dd14e786222425ea04fd060824">&#9670;&nbsp;</a></span>inpub_pkt_id</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mqtt_client_s::inpub_pkt_id</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Packet identifier of pending incoming publish </p>
+
+</div>
+</div>
+<a id="aae7bd1da3461efef9616934feb166aa5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aae7bd1da3461efef9616934feb166aa5">&#9670;&nbsp;</a></span>msg_idx</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t mqtt_client_s::msg_idx</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Input </p>
+
+</div>
+</div>
+<a id="a667c1dc7a6008055b63877acb06f333c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a667c1dc7a6008055b63877acb06f333c">&#9670;&nbsp;</a></span>output</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structmqtt__ringbuf__t.html">mqtt_ringbuf_t</a> mqtt_client_s::output</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Output ring-buffer </p>
+
+</div>
+</div>
+<a id="a1897eeefe64f9e2d2d953adca858f439"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1897eeefe64f9e2d2d953adca858f439">&#9670;&nbsp;</a></span>pend_req_queue</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structmqtt__request__t.html">mqtt_request_t</a>* mqtt_client_s::pend_req_queue</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Pending requests to server </p>
+
+</div>
+</div>
+<a id="ab4100f6e0867c212d5923f10024f2e32"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab4100f6e0867c212d5923f10024f2e32">&#9670;&nbsp;</a></span>pkt_id_seq</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mqtt_client_s::pkt_id_seq</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Packet identifier generator </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="mqtt__priv_8h.html">mqtt_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="structmqtt__client__s.html">mqtt_client_s</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structmqtt__client__s.js b/doc/doxygen/output/html/structmqtt__client__s.js
new file mode 100644
index 0000000..78958c2
--- /dev/null
+++ b/doc/doxygen/output/html/structmqtt__client__s.js
@@ -0,0 +1,12 @@
+var structmqtt__client__s =
+[
+    [ "conn_state", "structmqtt__client__s.html#af4a07c1079e2e2a336f1939d8b9677e6", null ],
+    [ "connect_arg", "structmqtt__client__s.html#ae6d53359ec6d70533dab7c0d2717ce1a", null ],
+    [ "cyclic_tick", "structmqtt__client__s.html#a6274ba2eb2fe6afa970b1c8a650d8cef", null ],
+    [ "data_cb", "structmqtt__client__s.html#a26dc9112351c042594a41703197925a7", null ],
+    [ "inpub_pkt_id", "structmqtt__client__s.html#a6c81d0dd14e786222425ea04fd060824", null ],
+    [ "msg_idx", "structmqtt__client__s.html#aae7bd1da3461efef9616934feb166aa5", null ],
+    [ "output", "structmqtt__client__s.html#a667c1dc7a6008055b63877acb06f333c", null ],
+    [ "pend_req_queue", "structmqtt__client__s.html#a1897eeefe64f9e2d2d953adca858f439", null ],
+    [ "pkt_id_seq", "structmqtt__client__s.html#ab4100f6e0867c212d5923f10024f2e32", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structmqtt__connect__client__info__t.html b/doc/doxygen/output/html/structmqtt__connect__client__info__t.html
new file mode 100644
index 0000000..e460e29
--- /dev/null
+++ b/doc/doxygen/output/html/structmqtt__connect__client__info__t.html
@@ -0,0 +1,267 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: mqtt_connect_client_info_t 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structmqtt__connect__client__info__t.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">mqtt_connect_client_info_t Struct Reference<div class="ingroups"><a class="el" href="group__apps.html">Applications</a> &raquo; <a class="el" href="group__mqtt.html">MQTT client</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;mqtt.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ad35f7850df21f001d5c5ffaa1a18c05a"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__connect__client__info__t.html#ad35f7850df21f001d5c5ffaa1a18c05a">client_id</a></td></tr>
+<tr class="separator:ad35f7850df21f001d5c5ffaa1a18c05a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aec961673d5c3e8dc853c91f30d9333b5"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__connect__client__info__t.html#aec961673d5c3e8dc853c91f30d9333b5">client_user</a></td></tr>
+<tr class="separator:aec961673d5c3e8dc853c91f30d9333b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8f68efe91c5311418151256c96102d4b"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__connect__client__info__t.html#a8f68efe91c5311418151256c96102d4b">client_pass</a></td></tr>
+<tr class="separator:a8f68efe91c5311418151256c96102d4b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac80262a7456812e9eefffd8c3b9ac21a"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__connect__client__info__t.html#ac80262a7456812e9eefffd8c3b9ac21a">keep_alive</a></td></tr>
+<tr class="separator:ac80262a7456812e9eefffd8c3b9ac21a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32e77415460752ba0484eb3ba0faf0c8"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__connect__client__info__t.html#a32e77415460752ba0484eb3ba0faf0c8">will_topic</a></td></tr>
+<tr class="separator:a32e77415460752ba0484eb3ba0faf0c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a925fcebd15555afdc0820e196e2fd3a7"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__connect__client__info__t.html#a925fcebd15555afdc0820e196e2fd3a7">will_msg</a></td></tr>
+<tr class="separator:a925fcebd15555afdc0820e196e2fd3a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a07954934f4fecf54fa190997848229d9"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__connect__client__info__t.html#a07954934f4fecf54fa190997848229d9">will_qos</a></td></tr>
+<tr class="separator:a07954934f4fecf54fa190997848229d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49c10873f44d7534140a63eef2a6a4e3"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__connect__client__info__t.html#a49c10873f44d7534140a63eef2a6a4e3">will_retain</a></td></tr>
+<tr class="separator:a49c10873f44d7534140a63eef2a6a4e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a45987acc116de5d27fff6856778e55b4"><td class="memItemLeft" align="right" valign="top">struct altcp_tls_config *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__connect__client__info__t.html#a45987acc116de5d27fff6856778e55b4">tls_config</a></td></tr>
+<tr class="separator:a45987acc116de5d27fff6856778e55b4"><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>Client information and connection parameters </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="ad35f7850df21f001d5c5ffaa1a18c05a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad35f7850df21f001d5c5ffaa1a18c05a">&#9670;&nbsp;</a></span>client_id</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* mqtt_connect_client_info_t::client_id</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Client identifier, must be set by caller </p>
+
+</div>
+</div>
+<a id="a8f68efe91c5311418151256c96102d4b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8f68efe91c5311418151256c96102d4b">&#9670;&nbsp;</a></span>client_pass</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* mqtt_connect_client_info_t::client_pass</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Password, set to NULL if not used </p>
+
+</div>
+</div>
+<a id="aec961673d5c3e8dc853c91f30d9333b5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aec961673d5c3e8dc853c91f30d9333b5">&#9670;&nbsp;</a></span>client_user</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* mqtt_connect_client_info_t::client_user</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>User name, set to NULL if not used </p>
+
+</div>
+</div>
+<a id="ac80262a7456812e9eefffd8c3b9ac21a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac80262a7456812e9eefffd8c3b9ac21a">&#9670;&nbsp;</a></span>keep_alive</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mqtt_connect_client_info_t::keep_alive</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>keep alive time in seconds, 0 to disable keep alive functionality </p>
+
+</div>
+</div>
+<a id="a45987acc116de5d27fff6856778e55b4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a45987acc116de5d27fff6856778e55b4">&#9670;&nbsp;</a></span>tls_config</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct altcp_tls_config* mqtt_connect_client_info_t::tls_config</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TLS configuration for secure connections </p>
+
+</div>
+</div>
+<a id="a925fcebd15555afdc0820e196e2fd3a7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a925fcebd15555afdc0820e196e2fd3a7">&#9670;&nbsp;</a></span>will_msg</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* mqtt_connect_client_info_t::will_msg</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>will_msg, see will_topic </p>
+
+</div>
+</div>
+<a id="a07954934f4fecf54fa190997848229d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a07954934f4fecf54fa190997848229d9">&#9670;&nbsp;</a></span>will_qos</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mqtt_connect_client_info_t::will_qos</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>will_qos, see will_topic </p>
+
+</div>
+</div>
+<a id="a49c10873f44d7534140a63eef2a6a4e3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a49c10873f44d7534140a63eef2a6a4e3">&#9670;&nbsp;</a></span>will_retain</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mqtt_connect_client_info_t::will_retain</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>will_retain, see will_topic </p>
+
+</div>
+</div>
+<a id="a32e77415460752ba0484eb3ba0faf0c8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a32e77415460752ba0484eb3ba0faf0c8">&#9670;&nbsp;</a></span>will_topic</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* mqtt_connect_client_info_t::will_topic</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>will topic, set to NULL if will is not to be used, will_msg, will_qos and will retain are then ignored </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="mqtt_8h.html">mqtt.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="structmqtt__connect__client__info__t.html">mqtt_connect_client_info_t</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structmqtt__connect__client__info__t.js b/doc/doxygen/output/html/structmqtt__connect__client__info__t.js
new file mode 100644
index 0000000..8977c9b
--- /dev/null
+++ b/doc/doxygen/output/html/structmqtt__connect__client__info__t.js
@@ -0,0 +1,12 @@
+var structmqtt__connect__client__info__t =
+[
+    [ "client_id", "structmqtt__connect__client__info__t.html#ad35f7850df21f001d5c5ffaa1a18c05a", null ],
+    [ "client_pass", "structmqtt__connect__client__info__t.html#a8f68efe91c5311418151256c96102d4b", null ],
+    [ "client_user", "structmqtt__connect__client__info__t.html#aec961673d5c3e8dc853c91f30d9333b5", null ],
+    [ "keep_alive", "structmqtt__connect__client__info__t.html#ac80262a7456812e9eefffd8c3b9ac21a", null ],
+    [ "tls_config", "structmqtt__connect__client__info__t.html#a45987acc116de5d27fff6856778e55b4", null ],
+    [ "will_msg", "structmqtt__connect__client__info__t.html#a925fcebd15555afdc0820e196e2fd3a7", null ],
+    [ "will_qos", "structmqtt__connect__client__info__t.html#a07954934f4fecf54fa190997848229d9", null ],
+    [ "will_retain", "structmqtt__connect__client__info__t.html#a49c10873f44d7534140a63eef2a6a4e3", null ],
+    [ "will_topic", "structmqtt__connect__client__info__t.html#a32e77415460752ba0484eb3ba0faf0c8", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structmqtt__request__t.html b/doc/doxygen/output/html/structmqtt__request__t.html
new file mode 100644
index 0000000..36dd4d1
--- /dev/null
+++ b/doc/doxygen/output/html/structmqtt__request__t.html
@@ -0,0 +1,182 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: mqtt_request_t 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structmqtt__request__t.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">mqtt_request_t Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;mqtt_priv.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:aca8de21579f51e7742076a4975a4177b"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structmqtt__request__t.html">mqtt_request_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__request__t.html#aca8de21579f51e7742076a4975a4177b">next</a></td></tr>
+<tr class="separator:aca8de21579f51e7742076a4975a4177b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32a4b14b0b8b5b8ce8db1074e53f4a79"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd">mqtt_request_cb_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__request__t.html#a32a4b14b0b8b5b8ce8db1074e53f4a79">cb</a></td></tr>
+<tr class="separator:a32a4b14b0b8b5b8ce8db1074e53f4a79"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af2dc3cd85cdad25b9b3e1534ecc0cb58"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__request__t.html#af2dc3cd85cdad25b9b3e1534ecc0cb58">pkt_id</a></td></tr>
+<tr class="separator:af2dc3cd85cdad25b9b3e1534ecc0cb58"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a65a7292669bc1f2d9df8f30bbcd77073"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmqtt__request__t.html#a65a7292669bc1f2d9df8f30bbcd77073">timeout_diff</a></td></tr>
+<tr class="separator:a65a7292669bc1f2d9df8f30bbcd77073"><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>Pending request item, binds application callback to pending server requests </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a32a4b14b0b8b5b8ce8db1074e53f4a79"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a32a4b14b0b8b5b8ce8db1074e53f4a79">&#9670;&nbsp;</a></span>cb</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd">mqtt_request_cb_t</a> mqtt_request_t::cb</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Callback to upper layer </p>
+
+</div>
+</div>
+<a id="aca8de21579f51e7742076a4975a4177b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aca8de21579f51e7742076a4975a4177b">&#9670;&nbsp;</a></span>next</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structmqtt__request__t.html">mqtt_request_t</a>* mqtt_request_t::next</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Next item in list, NULL means this is the last in chain, next pointing at itself means request is unallocated </p>
+
+</div>
+</div>
+<a id="af2dc3cd85cdad25b9b3e1534ecc0cb58"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af2dc3cd85cdad25b9b3e1534ecc0cb58">&#9670;&nbsp;</a></span>pkt_id</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mqtt_request_t::pkt_id</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MQTT packet identifier </p>
+
+</div>
+</div>
+<a id="a65a7292669bc1f2d9df8f30bbcd77073"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a65a7292669bc1f2d9df8f30bbcd77073">&#9670;&nbsp;</a></span>timeout_diff</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mqtt_request_t::timeout_diff</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Expire time relative to element before this </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="mqtt__priv_8h.html">mqtt_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="structmqtt__request__t.html">mqtt_request_t</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structmqtt__request__t.js b/doc/doxygen/output/html/structmqtt__request__t.js
new file mode 100644
index 0000000..16897c1
--- /dev/null
+++ b/doc/doxygen/output/html/structmqtt__request__t.js
@@ -0,0 +1,7 @@
+var structmqtt__request__t =
+[
+    [ "cb", "structmqtt__request__t.html#a32a4b14b0b8b5b8ce8db1074e53f4a79", null ],
+    [ "next", "structmqtt__request__t.html#aca8de21579f51e7742076a4975a4177b", null ],
+    [ "pkt_id", "structmqtt__request__t.html#af2dc3cd85cdad25b9b3e1534ecc0cb58", null ],
+    [ "timeout_diff", "structmqtt__request__t.html#a65a7292669bc1f2d9df8f30bbcd77073", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structmqtt__ringbuf__t.html b/doc/doxygen/output/html/structmqtt__ringbuf__t.html
new file mode 100644
index 0000000..15dccfe
--- /dev/null
+++ b/doc/doxygen/output/html/structmqtt__ringbuf__t.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: mqtt_ringbuf_t 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structmqtt__ringbuf__t.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">mqtt_ringbuf_t Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;mqtt_priv.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Ring buffer </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/apps/<a class="el" href="mqtt__priv_8h.html">mqtt_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="structmqtt__ringbuf__t.html">mqtt_ringbuf_t</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structna__header.html b/doc/doxygen/output/html/structna__header.html
new file mode 100644
index 0000000..21b8471
--- /dev/null
+++ b/doc/doxygen/output/html/structna__header.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: na_header 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structna__header.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">na_header Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;nd6.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Neighbor advertisement message header. </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_2nd6_8h.html">nd6.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="structna__header.html">na_header</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structnd6__neighbor__cache__entry.html b/doc/doxygen/output/html/structnd6__neighbor__cache__entry.html
new file mode 100644
index 0000000..203d5a0
--- /dev/null
+++ b/doc/doxygen/output/html/structnd6__neighbor__cache__entry.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: nd6_neighbor_cache_entry 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structnd6__neighbor__cache__entry.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">nd6_neighbor_cache_entry Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;nd6_priv.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a830674446a45eb200d38a45fbdd5c5df"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structnd6__q__entry.html">nd6_q_entry</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnd6__neighbor__cache__entry.html#a830674446a45eb200d38a45fbdd5c5df">q</a></td></tr>
+<tr class="separator:a830674446a45eb200d38a45fbdd5c5df"><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 for tables. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a830674446a45eb200d38a45fbdd5c5df"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a830674446a45eb200d38a45fbdd5c5df">&#9670;&nbsp;</a></span>q</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnd6__q__entry.html">nd6_q_entry</a>* nd6_neighbor_cache_entry::q</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Pointer to queue of pending outgoing packets on this entry. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/priv/<a class="el" href="nd6__priv_8h.html">nd6_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="structnd6__neighbor__cache__entry.html">nd6_neighbor_cache_entry</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structnd6__neighbor__cache__entry.js b/doc/doxygen/output/html/structnd6__neighbor__cache__entry.js
new file mode 100644
index 0000000..f35bd41
--- /dev/null
+++ b/doc/doxygen/output/html/structnd6__neighbor__cache__entry.js
@@ -0,0 +1,4 @@
+var structnd6__neighbor__cache__entry =
+[
+    [ "q", "structnd6__neighbor__cache__entry.html#a830674446a45eb200d38a45fbdd5c5df", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structnd6__q__entry.html b/doc/doxygen/output/html/structnd6__q__entry.html
new file mode 100644
index 0000000..613b8cc
--- /dev/null
+++ b/doc/doxygen/output/html/structnd6__q__entry.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: nd6_q_entry 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structnd6__q__entry.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">nd6_q_entry Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;nd6_priv.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct for queueing outgoing packets for unknown address defined here to be accessed by <a class="el" href="memp_8h.html">memp.h</a> </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/priv/<a class="el" href="nd6__priv_8h.html">nd6_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="structnd6__q__entry.html">nd6_q_entry</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structnetbios__answer.html b/doc/doxygen/output/html/structnetbios__answer.html
new file mode 100644
index 0000000..bbfd13a
--- /dev/null
+++ b/doc/doxygen/output/html/structnetbios__answer.html
@@ -0,0 +1,537 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: netbios_answer 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structnetbios__answer.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">netbios_answer Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a5828dc04e01a1f7b734019db428fd46d"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#a5828dc04e01a1f7b734019db428fd46d">name_size</a></td></tr>
+<tr class="separator:a5828dc04e01a1f7b734019db428fd46d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa024ce7e0e233c42393f5c3c378d3f9b"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#aa024ce7e0e233c42393f5c3c378d3f9b">query_name</a> [(16 *2)+1]</td></tr>
+<tr class="separator:aa024ce7e0e233c42393f5c3c378d3f9b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac4a95ccabbb945c9470e0cfd470be491"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#ac4a95ccabbb945c9470e0cfd470be491">number_of_names</a></td></tr>
+<tr class="separator:ac4a95ccabbb945c9470e0cfd470be491"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf746cd54add594216ddc3683c741406"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#abf746cd54add594216ddc3683c741406">answer_name</a> [16]</td></tr>
+<tr class="separator:abf746cd54add594216ddc3683c741406"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2729b7249e3d23309624cb19fa0dbfc4"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#a2729b7249e3d23309624cb19fa0dbfc4">answer_name_flags</a></td></tr>
+<tr class="separator:a2729b7249e3d23309624cb19fa0dbfc4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeed6aa8ba4f8bb107d141b3b3d0a1787"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#aeed6aa8ba4f8bb107d141b3b3d0a1787">unit_id</a> [6]</td></tr>
+<tr class="separator:aeed6aa8ba4f8bb107d141b3b3d0a1787"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a69cd3e8b8265531a7ce3e5cbd4911683"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#a69cd3e8b8265531a7ce3e5cbd4911683">jumpers</a></td></tr>
+<tr class="separator:a69cd3e8b8265531a7ce3e5cbd4911683"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a91116fe26c8050ee166053f377b40c7f"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#a91116fe26c8050ee166053f377b40c7f">test_result</a></td></tr>
+<tr class="separator:a91116fe26c8050ee166053f377b40c7f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a151dce0f0bf626b2a54fbb75775237ba"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#a151dce0f0bf626b2a54fbb75775237ba">version_number</a></td></tr>
+<tr class="separator:a151dce0f0bf626b2a54fbb75775237ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a31ec9ea28b5801b9bb5f1b240d3412de"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#a31ec9ea28b5801b9bb5f1b240d3412de">period_of_statistics</a></td></tr>
+<tr class="separator:a31ec9ea28b5801b9bb5f1b240d3412de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab23a11db86a170b46aa8f8af434534d8"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#ab23a11db86a170b46aa8f8af434534d8">number_of_crcs</a></td></tr>
+<tr class="separator:ab23a11db86a170b46aa8f8af434534d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4f9ff63bd5529418c07762506189ad2"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#ab4f9ff63bd5529418c07762506189ad2">number_of_alignment_errors</a></td></tr>
+<tr class="separator:ab4f9ff63bd5529418c07762506189ad2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a45b7aec200434d3aaabc3ea6ebc46c1e"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#a45b7aec200434d3aaabc3ea6ebc46c1e">number_of_collisions</a></td></tr>
+<tr class="separator:a45b7aec200434d3aaabc3ea6ebc46c1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1560e3864a0821acea9410e8c1d21408"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#a1560e3864a0821acea9410e8c1d21408">number_of_send_aborts</a></td></tr>
+<tr class="separator:a1560e3864a0821acea9410e8c1d21408"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6088bca2a59ffcd077a474330511abd"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#aa6088bca2a59ffcd077a474330511abd">number_of_good_sends</a></td></tr>
+<tr class="separator:aa6088bca2a59ffcd077a474330511abd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0eab7dbe733cc50f515126649de596ea"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#a0eab7dbe733cc50f515126649de596ea">number_of_good_receives</a></td></tr>
+<tr class="separator:a0eab7dbe733cc50f515126649de596ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab175ad0f89102b3b3f81a41b5a72b321"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#ab175ad0f89102b3b3f81a41b5a72b321">number_of_retransmits</a></td></tr>
+<tr class="separator:ab175ad0f89102b3b3f81a41b5a72b321"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62946dd0f27e9f9b9f295dcde4d3ea42"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#a62946dd0f27e9f9b9f295dcde4d3ea42">number_of_no_resource_condition</a></td></tr>
+<tr class="separator:a62946dd0f27e9f9b9f295dcde4d3ea42"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af41cbffb0ac6a9db3305b3fc64646219"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#af41cbffb0ac6a9db3305b3fc64646219">number_of_free_command_blocks</a></td></tr>
+<tr class="separator:af41cbffb0ac6a9db3305b3fc64646219"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4c7ea5d1839fd27232877880e43485a2"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#a4c7ea5d1839fd27232877880e43485a2">total_number_of_command_blocks</a></td></tr>
+<tr class="separator:a4c7ea5d1839fd27232877880e43485a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9cf85c173fe0d99c1c4e7e09aaeed9b8"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#a9cf85c173fe0d99c1c4e7e09aaeed9b8">max_total_number_of_command_blocks</a></td></tr>
+<tr class="separator:a9cf85c173fe0d99c1c4e7e09aaeed9b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a66098747155d5bd56f1c92aa8da10c1d"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#a66098747155d5bd56f1c92aa8da10c1d">number_of_pending_sessions</a></td></tr>
+<tr class="separator:a66098747155d5bd56f1c92aa8da10c1d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a58aba600ed34b7c689606c296ef57c8c"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#a58aba600ed34b7c689606c296ef57c8c">max_number_of_pending_sessions</a></td></tr>
+<tr class="separator:a58aba600ed34b7c689606c296ef57c8c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0069c9ae014881298828660787fa945e"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#a0069c9ae014881298828660787fa945e">max_total_sessions_possible</a></td></tr>
+<tr class="separator:a0069c9ae014881298828660787fa945e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abec38f20bb460ddc2d6e8c9b9208608c"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetbios__answer.html#abec38f20bb460ddc2d6e8c9b9208608c">session_data_packet_size</a></td></tr>
+<tr class="separator:abec38f20bb460ddc2d6e8c9b9208608c"><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>The NBNS Structure Responds to a Name Query </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="abf746cd54add594216ddc3683c741406"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abf746cd54add594216ddc3683c741406">&#9670;&nbsp;</a></span>answer_name</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netbios_answer::answer_name[16]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>node name </p>
+
+</div>
+</div>
+<a id="a2729b7249e3d23309624cb19fa0dbfc4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2729b7249e3d23309624cb19fa0dbfc4">&#9670;&nbsp;</a></span>answer_name_flags</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netbios_answer::answer_name_flags</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>node flags </p>
+
+</div>
+</div>
+<a id="a69cd3e8b8265531a7ce3e5cbd4911683"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a69cd3e8b8265531a7ce3e5cbd4911683">&#9670;&nbsp;</a></span>jumpers</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netbios_answer::jumpers</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Jumpers </p>
+
+</div>
+</div>
+<a id="a58aba600ed34b7c689606c296ef57c8c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a58aba600ed34b7c689606c296ef57c8c">&#9670;&nbsp;</a></span>max_number_of_pending_sessions</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netbios_answer::max_number_of_pending_sessions</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Statistics </p>
+
+</div>
+</div>
+<a id="a9cf85c173fe0d99c1c4e7e09aaeed9b8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9cf85c173fe0d99c1c4e7e09aaeed9b8">&#9670;&nbsp;</a></span>max_total_number_of_command_blocks</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netbios_answer::max_total_number_of_command_blocks</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Statistics </p>
+
+</div>
+</div>
+<a id="a0069c9ae014881298828660787fa945e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0069c9ae014881298828660787fa945e">&#9670;&nbsp;</a></span>max_total_sessions_possible</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netbios_answer::max_total_sessions_possible</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Statistics </p>
+
+</div>
+</div>
+<a id="a5828dc04e01a1f7b734019db428fd46d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5828dc04e01a1f7b734019db428fd46d">&#9670;&nbsp;</a></span>name_size</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netbios_answer::name_size</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>the length of the next string </p>
+
+</div>
+</div>
+<a id="ab4f9ff63bd5529418c07762506189ad2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab4f9ff63bd5529418c07762506189ad2">&#9670;&nbsp;</a></span>number_of_alignment_errors</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netbios_answer::number_of_alignment_errors</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Statistics </p>
+
+</div>
+</div>
+<a id="a45b7aec200434d3aaabc3ea6ebc46c1e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a45b7aec200434d3aaabc3ea6ebc46c1e">&#9670;&nbsp;</a></span>number_of_collisions</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netbios_answer::number_of_collisions</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Statistics </p>
+
+</div>
+</div>
+<a id="ab23a11db86a170b46aa8f8af434534d8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab23a11db86a170b46aa8f8af434534d8">&#9670;&nbsp;</a></span>number_of_crcs</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netbios_answer::number_of_crcs</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Statistics </p>
+
+</div>
+</div>
+<a id="af41cbffb0ac6a9db3305b3fc64646219"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af41cbffb0ac6a9db3305b3fc64646219">&#9670;&nbsp;</a></span>number_of_free_command_blocks</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netbios_answer::number_of_free_command_blocks</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Statistics </p>
+
+</div>
+</div>
+<a id="a0eab7dbe733cc50f515126649de596ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0eab7dbe733cc50f515126649de596ea">&#9670;&nbsp;</a></span>number_of_good_receives</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t netbios_answer::number_of_good_receives</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Statistics </p>
+
+</div>
+</div>
+<a id="aa6088bca2a59ffcd077a474330511abd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa6088bca2a59ffcd077a474330511abd">&#9670;&nbsp;</a></span>number_of_good_sends</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t netbios_answer::number_of_good_sends</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Statistics </p>
+
+</div>
+</div>
+<a id="ac4a95ccabbb945c9470e0cfd470be491"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac4a95ccabbb945c9470e0cfd470be491">&#9670;&nbsp;</a></span>number_of_names</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netbios_answer::number_of_names</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>number of names </p>
+
+</div>
+</div>
+<a id="a62946dd0f27e9f9b9f295dcde4d3ea42"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62946dd0f27e9f9b9f295dcde4d3ea42">&#9670;&nbsp;</a></span>number_of_no_resource_condition</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netbios_answer::number_of_no_resource_condition</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Statistics </p>
+
+</div>
+</div>
+<a id="a66098747155d5bd56f1c92aa8da10c1d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a66098747155d5bd56f1c92aa8da10c1d">&#9670;&nbsp;</a></span>number_of_pending_sessions</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netbios_answer::number_of_pending_sessions</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Statistics </p>
+
+</div>
+</div>
+<a id="ab175ad0f89102b3b3f81a41b5a72b321"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab175ad0f89102b3b3f81a41b5a72b321">&#9670;&nbsp;</a></span>number_of_retransmits</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netbios_answer::number_of_retransmits</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Statistics </p>
+
+</div>
+</div>
+<a id="a1560e3864a0821acea9410e8c1d21408"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1560e3864a0821acea9410e8c1d21408">&#9670;&nbsp;</a></span>number_of_send_aborts</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netbios_answer::number_of_send_aborts</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Statistics </p>
+
+</div>
+</div>
+<a id="a31ec9ea28b5801b9bb5f1b240d3412de"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a31ec9ea28b5801b9bb5f1b240d3412de">&#9670;&nbsp;</a></span>period_of_statistics</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netbios_answer::period_of_statistics</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Period of statistics </p>
+
+</div>
+</div>
+<a id="aa024ce7e0e233c42393f5c3c378d3f9b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa024ce7e0e233c42393f5c3c378d3f9b">&#9670;&nbsp;</a></span>query_name</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netbios_answer::query_name[(16 *2)+1]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>WARNING!!! this item may be of a different length (we use this struct for transmission) </p>
+
+</div>
+</div>
+<a id="abec38f20bb460ddc2d6e8c9b9208608c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abec38f20bb460ddc2d6e8c9b9208608c">&#9670;&nbsp;</a></span>session_data_packet_size</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netbios_answer::session_data_packet_size</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Statistics </p>
+
+</div>
+</div>
+<a id="a91116fe26c8050ee166053f377b40c7f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a91116fe26c8050ee166053f377b40c7f">&#9670;&nbsp;</a></span>test_result</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netbios_answer::test_result</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Test result </p>
+
+</div>
+</div>
+<a id="a4c7ea5d1839fd27232877880e43485a2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4c7ea5d1839fd27232877880e43485a2">&#9670;&nbsp;</a></span>total_number_of_command_blocks</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netbios_answer::total_number_of_command_blocks</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Statistics </p>
+
+</div>
+</div>
+<a id="aeed6aa8ba4f8bb107d141b3b3d0a1787"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeed6aa8ba4f8bb107d141b3b3d0a1787">&#9670;&nbsp;</a></span>unit_id</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netbios_answer::unit_id[6]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Unit ID </p>
+
+</div>
+</div>
+<a id="a151dce0f0bf626b2a54fbb75775237ba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a151dce0f0bf626b2a54fbb75775237ba">&#9670;&nbsp;</a></span>version_number</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netbios_answer::version_number</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Version number </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/apps/netbiosns/<a class="el" href="netbiosns_8c.html">netbiosns.c</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="structnetbios__answer.html">netbios_answer</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structnetbios__answer.js b/doc/doxygen/output/html/structnetbios__answer.js
new file mode 100644
index 0000000..bfb0d2c
--- /dev/null
+++ b/doc/doxygen/output/html/structnetbios__answer.js
@@ -0,0 +1,28 @@
+var structnetbios__answer =
+[
+    [ "answer_name", "structnetbios__answer.html#abf746cd54add594216ddc3683c741406", null ],
+    [ "answer_name_flags", "structnetbios__answer.html#a2729b7249e3d23309624cb19fa0dbfc4", null ],
+    [ "jumpers", "structnetbios__answer.html#a69cd3e8b8265531a7ce3e5cbd4911683", null ],
+    [ "max_number_of_pending_sessions", "structnetbios__answer.html#a58aba600ed34b7c689606c296ef57c8c", null ],
+    [ "max_total_number_of_command_blocks", "structnetbios__answer.html#a9cf85c173fe0d99c1c4e7e09aaeed9b8", null ],
+    [ "max_total_sessions_possible", "structnetbios__answer.html#a0069c9ae014881298828660787fa945e", null ],
+    [ "name_size", "structnetbios__answer.html#a5828dc04e01a1f7b734019db428fd46d", null ],
+    [ "number_of_alignment_errors", "structnetbios__answer.html#ab4f9ff63bd5529418c07762506189ad2", null ],
+    [ "number_of_collisions", "structnetbios__answer.html#a45b7aec200434d3aaabc3ea6ebc46c1e", null ],
+    [ "number_of_crcs", "structnetbios__answer.html#ab23a11db86a170b46aa8f8af434534d8", null ],
+    [ "number_of_free_command_blocks", "structnetbios__answer.html#af41cbffb0ac6a9db3305b3fc64646219", null ],
+    [ "number_of_good_receives", "structnetbios__answer.html#a0eab7dbe733cc50f515126649de596ea", null ],
+    [ "number_of_good_sends", "structnetbios__answer.html#aa6088bca2a59ffcd077a474330511abd", null ],
+    [ "number_of_names", "structnetbios__answer.html#ac4a95ccabbb945c9470e0cfd470be491", null ],
+    [ "number_of_no_resource_condition", "structnetbios__answer.html#a62946dd0f27e9f9b9f295dcde4d3ea42", null ],
+    [ "number_of_pending_sessions", "structnetbios__answer.html#a66098747155d5bd56f1c92aa8da10c1d", null ],
+    [ "number_of_retransmits", "structnetbios__answer.html#ab175ad0f89102b3b3f81a41b5a72b321", null ],
+    [ "number_of_send_aborts", "structnetbios__answer.html#a1560e3864a0821acea9410e8c1d21408", null ],
+    [ "period_of_statistics", "structnetbios__answer.html#a31ec9ea28b5801b9bb5f1b240d3412de", null ],
+    [ "query_name", "structnetbios__answer.html#aa024ce7e0e233c42393f5c3c378d3f9b", null ],
+    [ "session_data_packet_size", "structnetbios__answer.html#abec38f20bb460ddc2d6e8c9b9208608c", null ],
+    [ "test_result", "structnetbios__answer.html#a91116fe26c8050ee166053f377b40c7f", null ],
+    [ "total_number_of_command_blocks", "structnetbios__answer.html#a4c7ea5d1839fd27232877880e43485a2", null ],
+    [ "unit_id", "structnetbios__answer.html#aeed6aa8ba4f8bb107d141b3b3d0a1787", null ],
+    [ "version_number", "structnetbios__answer.html#a151dce0f0bf626b2a54fbb75775237ba", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structnetbios__hdr.html b/doc/doxygen/output/html/structnetbios__hdr.html
new file mode 100644
index 0000000..af65104
--- /dev/null
+++ b/doc/doxygen/output/html/structnetbios__hdr.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: netbios_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structnetbios__hdr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">netbios_hdr Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>NetBIOS message header </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/apps/netbiosns/<a class="el" href="netbiosns_8c.html">netbiosns.c</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="structnetbios__hdr.html">netbios_hdr</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structnetbios__name__hdr.html b/doc/doxygen/output/html/structnetbios__name__hdr.html
new file mode 100644
index 0000000..35ab674
--- /dev/null
+++ b/doc/doxygen/output/html/structnetbios__name__hdr.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: netbios_name_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structnetbios__name__hdr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">netbios_name_hdr Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>NetBIOS message name part </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/apps/netbiosns/<a class="el" href="netbiosns_8c.html">netbiosns.c</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="structnetbios__name__hdr.html">netbios_name_hdr</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structnetbios__question__hdr.html b/doc/doxygen/output/html/structnetbios__question__hdr.html
new file mode 100644
index 0000000..7a7de39
--- /dev/null
+++ b/doc/doxygen/output/html/structnetbios__question__hdr.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: netbios_question_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structnetbios__question__hdr.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">netbios_question_hdr Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>NetBIOS message question part </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/apps/netbiosns/<a class="el" href="netbiosns_8c.html">netbiosns.c</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="structnetbios__question__hdr.html">netbios_question_hdr</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structnetbios__resp.html b/doc/doxygen/output/html/structnetbios__resp.html
new file mode 100644
index 0000000..2f64bde
--- /dev/null
+++ b/doc/doxygen/output/html/structnetbios__resp.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: netbios_resp 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structnetbios__resp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">netbios_resp Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>NetBIOS message </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/apps/netbiosns/<a class="el" href="netbiosns_8c.html">netbiosns.c</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="structnetbios__resp.html">netbios_resp</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structnetbuf.html b/doc/doxygen/output/html/structnetbuf.html
new file mode 100644
index 0000000..7918e7a
--- /dev/null
+++ b/doc/doxygen/output/html/structnetbuf.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: netbuf 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structnetbuf.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">netbuf Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;netbuf.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>"Network buffer" - contains data and addressing info </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="netbuf_8h.html">netbuf.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="structnetbuf.html">netbuf</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structnetconn.html b/doc/doxygen/output/html/structnetconn.html
new file mode 100644
index 0000000..e94caff
--- /dev/null
+++ b/doc/doxygen/output/html/structnetconn.html
@@ -0,0 +1,370 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: netconn 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structnetconn.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">netconn Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;api.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a61af908d1d2e4e7345ac65d3b390d7b6"><td class="memItemLeft" align="right" valign="top">enum <a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetconn.html#a61af908d1d2e4e7345ac65d3b390d7b6">type</a></td></tr>
+<tr class="separator:a61af908d1d2e4e7345ac65d3b390d7b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a936c33090ec35e5e8c0011be5515a589"><td class="memItemLeft" align="right" valign="top">enum <a class="el" href="api_8h.html#a2c6c9c1869f443c5ec7b31180a44fada">netconn_state</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetconn.html#a936c33090ec35e5e8c0011be5515a589">state</a></td></tr>
+<tr class="separator:a936c33090ec35e5e8c0011be5515a589"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2af6773c9f6ee91e7f462dd8acc07de6"><td class="memItemLeft" >union {</td></tr>
+<tr class="memitem:a2af6773c9f6ee91e7f462dd8acc07de6"><td class="memItemLeft" valign="top">}&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetconn.html#a2af6773c9f6ee91e7f462dd8acc07de6">pcb</a></td></tr>
+<tr class="separator:a2af6773c9f6ee91e7f462dd8acc07de6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2a54e90fa370cf0df46dfd0b97f1cce7"><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="structnetconn.html#a2a54e90fa370cf0df46dfd0b97f1cce7">pending_err</a></td></tr>
+<tr class="separator:a2a54e90fa370cf0df46dfd0b97f1cce7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a982506698a59f185ff3f16d1675ea4ae"><td class="memItemLeft" align="right" valign="top">sys_sem_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetconn.html#a982506698a59f185ff3f16d1675ea4ae">op_completed</a></td></tr>
+<tr class="separator:a982506698a59f185ff3f16d1675ea4ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9f2bf6a3865b6a22a8a71ec2f3e770da"><td class="memItemLeft" align="right" valign="top">sys_mbox_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetconn.html#a9f2bf6a3865b6a22a8a71ec2f3e770da">recvmbox</a></td></tr>
+<tr class="separator:a9f2bf6a3865b6a22a8a71ec2f3e770da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9b59188f300828d2b5814e27ab27cad0"><td class="memItemLeft" align="right" valign="top">sys_mbox_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetconn.html#a9b59188f300828d2b5814e27ab27cad0">acceptmbox</a></td></tr>
+<tr class="separator:a9b59188f300828d2b5814e27ab27cad0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac8e05eb65774665e364a3dcf0f139b36"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetconn.html#ac8e05eb65774665e364a3dcf0f139b36">socket</a></td></tr>
+<tr class="separator:ac8e05eb65774665e364a3dcf0f139b36"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a44e55724482b8e447134f5ba4f01551a"><td class="memItemLeft" align="right" valign="top">s32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetconn.html#a44e55724482b8e447134f5ba4f01551a">send_timeout</a></td></tr>
+<tr class="separator:a44e55724482b8e447134f5ba4f01551a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6febc9717418ddba16f16e988061cfac"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetconn.html#a6febc9717418ddba16f16e988061cfac">recv_bufsize</a></td></tr>
+<tr class="separator:a6febc9717418ddba16f16e988061cfac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a05b15a28b0803bea3729b1da2047541e"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetconn.html#a05b15a28b0803bea3729b1da2047541e">recv_avail</a></td></tr>
+<tr class="separator:a05b15a28b0803bea3729b1da2047541e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25ed06d944da0b0b9e7db5265be3fa3d"><td class="memItemLeft" align="right" valign="top">s16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetconn.html#a25ed06d944da0b0b9e7db5265be3fa3d">linger</a></td></tr>
+<tr class="separator:a25ed06d944da0b0b9e7db5265be3fa3d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96cb9a3830248699bd07a1a447e5630c"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetconn.html#a96cb9a3830248699bd07a1a447e5630c">flags</a></td></tr>
+<tr class="separator:a96cb9a3830248699bd07a1a447e5630c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49ba09038b2f2563fd3a38e38f8b8ab9"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structapi__msg.html">api_msg</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetconn.html#a49ba09038b2f2563fd3a38e38f8b8ab9">current_msg</a></td></tr>
+<tr class="separator:a49ba09038b2f2563fd3a38e38f8b8ab9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abe796060bb06e585333ca9a87862b624"><td class="memItemLeft" align="right" valign="top"><a class="el" href="api_8h.html#a3e130339f00202b3ab714af502163a2d">netconn_callback</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetconn.html#abe796060bb06e585333ca9a87862b624">callback</a></td></tr>
+<tr class="separator:abe796060bb06e585333ca9a87862b624"><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>A netconn descriptor </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a9b59188f300828d2b5814e27ab27cad0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9b59188f300828d2b5814e27ab27cad0">&#9670;&nbsp;</a></span>acceptmbox</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">sys_mbox_t netconn::acceptmbox</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>mbox where new connections are stored until processed by the application thread </p>
+
+</div>
+</div>
+<a id="abe796060bb06e585333ca9a87862b624"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abe796060bb06e585333ca9a87862b624">&#9670;&nbsp;</a></span>callback</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="api_8h.html#a3e130339f00202b3ab714af502163a2d">netconn_callback</a> netconn::callback</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A callback function that is informed about events for this netconn </p>
+
+</div>
+</div>
+<a id="a49ba09038b2f2563fd3a38e38f8b8ab9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a49ba09038b2f2563fd3a38e38f8b8ab9">&#9670;&nbsp;</a></span>current_msg</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structapi__msg.html">api_msg</a>* netconn::current_msg</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP: when data passed to netconn_write doesn't fit into the send buffer, this temporarily stores the message. Also used during connect and close. </p>
+
+</div>
+</div>
+<a id="a96cb9a3830248699bd07a1a447e5630c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a96cb9a3830248699bd07a1a447e5630c">&#9670;&nbsp;</a></span>flags</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netconn::flags</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>flags holding more netconn-internal state, see NETCONN_FLAG_* defines </p>
+
+</div>
+</div>
+<a id="a25ed06d944da0b0b9e7db5265be3fa3d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a25ed06d944da0b0b9e7db5265be3fa3d">&#9670;&nbsp;</a></span>linger</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">s16_t netconn::linger</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>values &lt;0 mean linger is disabled, values &gt; 0 are seconds to linger </p>
+
+</div>
+</div>
+<a id="a982506698a59f185ff3f16d1675ea4ae"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a982506698a59f185ff3f16d1675ea4ae">&#9670;&nbsp;</a></span>op_completed</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">sys_sem_t netconn::op_completed</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>sem that is used to synchronously execute functions in the core context </p>
+
+</div>
+</div>
+<a id="a2af6773c9f6ee91e7f462dd8acc07de6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2af6773c9f6ee91e7f462dd8acc07de6">&#9670;&nbsp;</a></span>pcb</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">union { ... }   netconn::pcb</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>the lwIP internal protocol control block </p>
+
+</div>
+</div>
+<a id="a2a54e90fa370cf0df46dfd0b97f1cce7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2a54e90fa370cf0df46dfd0b97f1cce7">&#9670;&nbsp;</a></span>pending_err</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> netconn::pending_err</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>the last asynchronous unreported error this netconn had </p>
+
+</div>
+</div>
+<a id="a05b15a28b0803bea3729b1da2047541e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a05b15a28b0803bea3729b1da2047541e">&#9670;&nbsp;</a></span>recv_avail</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int netconn::recv_avail</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>number of bytes currently in recvmbox to be received, tested against recv_bufsize to limit bytes on recvmbox for UDP and RAW, used for FIONREAD </p>
+
+</div>
+</div>
+<a id="a6febc9717418ddba16f16e988061cfac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6febc9717418ddba16f16e988061cfac">&#9670;&nbsp;</a></span>recv_bufsize</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int netconn::recv_bufsize</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>maximum amount of bytes queued in recvmbox not used for TCP: adjust TCP_WND instead! </p>
+
+</div>
+</div>
+<a id="a9f2bf6a3865b6a22a8a71ec2f3e770da"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9f2bf6a3865b6a22a8a71ec2f3e770da">&#9670;&nbsp;</a></span>recvmbox</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">sys_mbox_t netconn::recvmbox</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>mbox where received packets are stored until they are fetched by the netconn application thread (can grow quite big) </p>
+
+</div>
+</div>
+<a id="a44e55724482b8e447134f5ba4f01551a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a44e55724482b8e447134f5ba4f01551a">&#9670;&nbsp;</a></span>send_timeout</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">s32_t netconn::send_timeout</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>timeout to wait for sending data (which means enqueueing data for sending in internal buffers) in milliseconds </p>
+
+</div>
+</div>
+<a id="ac8e05eb65774665e364a3dcf0f139b36"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac8e05eb65774665e364a3dcf0f139b36">&#9670;&nbsp;</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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a936c33090ec35e5e8c0011be5515a589">&#9670;&nbsp;</a></span>state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="api_8h.html#a2c6c9c1869f443c5ec7b31180a44fada">netconn_state</a> netconn::state</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>current state of the netconn </p>
+
+</div>
+</div>
+<a id="a61af908d1d2e4e7345ac65d3b390d7b6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a61af908d1d2e4e7345ac65d3b390d7b6">&#9670;&nbsp;</a></span>type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91">netconn_type</a> netconn::type</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>type of the netconn (TCP, UDP or RAW) </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="api_8h.html">api.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="structnetconn.html">netconn</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structnetconn.js b/doc/doxygen/output/html/structnetconn.js
new file mode 100644
index 0000000..ff5ad3d
--- /dev/null
+++ b/doc/doxygen/output/html/structnetconn.js
@@ -0,0 +1,18 @@
+var structnetconn =
+[
+    [ "acceptmbox", "structnetconn.html#a9b59188f300828d2b5814e27ab27cad0", null ],
+    [ "callback", "structnetconn.html#abe796060bb06e585333ca9a87862b624", null ],
+    [ "current_msg", "structnetconn.html#a49ba09038b2f2563fd3a38e38f8b8ab9", null ],
+    [ "flags", "structnetconn.html#a96cb9a3830248699bd07a1a447e5630c", null ],
+    [ "linger", "structnetconn.html#a25ed06d944da0b0b9e7db5265be3fa3d", null ],
+    [ "op_completed", "structnetconn.html#a982506698a59f185ff3f16d1675ea4ae", null ],
+    [ "pcb", "structnetconn.html#a2af6773c9f6ee91e7f462dd8acc07de6", null ],
+    [ "pending_err", "structnetconn.html#a2a54e90fa370cf0df46dfd0b97f1cce7", null ],
+    [ "recv_avail", "structnetconn.html#a05b15a28b0803bea3729b1da2047541e", null ],
+    [ "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
new file mode 100644
index 0000000..e9a3b7e
--- /dev/null
+++ b/doc/doxygen/output/html/structnetif.html
@@ -0,0 +1,590 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: netif 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structnetif.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">netif Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;netif.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ae77736b64df442242795220d76be6b86"><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="structnetif.html#ae77736b64df442242795220d76be6b86">next</a></td></tr>
+<tr class="separator:ae77736b64df442242795220d76be6b86"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9776aaee37ea8f07b9ddc0f8b4e7e866"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#a9776aaee37ea8f07b9ddc0f8b4e7e866">ip_addr</a></td></tr>
+<tr class="separator:a9776aaee37ea8f07b9ddc0f8b4e7e866"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab7ef575d4ab398a182bc6e592f4d53a4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#ab7ef575d4ab398a182bc6e592f4d53a4">ip6_addr</a> [3]</td></tr>
+<tr class="separator:ab7ef575d4ab398a182bc6e592f4d53a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a54e81344084e9840a51cc4abab3b059b"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#a54e81344084e9840a51cc4abab3b059b">ip6_addr_state</a> [3]</td></tr>
+<tr class="separator:a54e81344084e9840a51cc4abab3b059b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a26f6e26d4a54c998716c10b7b85c8230"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#a26f6e26d4a54c998716c10b7b85c8230">ip6_addr_valid_life</a> [3]</td></tr>
+<tr class="separator:a26f6e26d4a54c998716c10b7b85c8230"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8fe4f1b7b0d710216287da9615164a5c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e">netif_input_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#a8fe4f1b7b0d710216287da9615164a5c">input</a></td></tr>
+<tr class="separator:a8fe4f1b7b0d710216287da9615164a5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8e1dcfe65db487feecd244355f39215e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="netif_8h.html#a7b4893aa2ed8c606a0cd7aa932fe5067">netif_output_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#a8e1dcfe65db487feecd244355f39215e">output</a></td></tr>
+<tr class="separator:a8e1dcfe65db487feecd244355f39215e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acaaac9b415a7be73eb8a287c8ed18a8d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="netif_8h.html#ab75e9d808bc1b788bea84213e6a111ed">netif_linkoutput_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#acaaac9b415a7be73eb8a287c8ed18a8d">linkoutput</a></td></tr>
+<tr class="separator:acaaac9b415a7be73eb8a287c8ed18a8d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac38383379cff22c402156fec71c19617"><td class="memItemLeft" align="right" valign="top"><a class="el" href="netif_8h.html#a343a5b14136a51957d552527384674b3">netif_output_ip6_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#ac38383379cff22c402156fec71c19617">output_ip6</a></td></tr>
+<tr class="separator:ac38383379cff22c402156fec71c19617"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1513e81d02557d2a950e965f18b53a45"><td class="memItemLeft" align="right" valign="top"><a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#a1513e81d02557d2a950e965f18b53a45">status_callback</a></td></tr>
+<tr class="separator:a1513e81d02557d2a950e965f18b53a45"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4388cfadc8b4e9a9c1c93ce777bc3673"><td class="memItemLeft" align="right" valign="top"><a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#a4388cfadc8b4e9a9c1c93ce777bc3673">link_callback</a></td></tr>
+<tr class="separator:a4388cfadc8b4e9a9c1c93ce777bc3673"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae06deb532ead2e3009ba4e58aae6ca07"><td class="memItemLeft" align="right" valign="top"><a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#ae06deb532ead2e3009ba4e58aae6ca07">remove_callback</a></td></tr>
+<tr class="separator:ae06deb532ead2e3009ba4e58aae6ca07"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a809cc57c0dff09c5c9ae45b02c2002f3"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#a809cc57c0dff09c5c9ae45b02c2002f3">state</a></td></tr>
+<tr class="separator:a809cc57c0dff09c5c9ae45b02c2002f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aca7d56b4e0f822b0ced2885f222b8d48"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48">mtu</a></td></tr>
+<tr class="separator:aca7d56b4e0f822b0ced2885f222b8d48"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acd78fca5dad6468605f38e327b3a5e72"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#acd78fca5dad6468605f38e327b3a5e72">mtu6</a></td></tr>
+<tr class="separator:acd78fca5dad6468605f38e327b3a5e72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aee967965d999fc1a4c40a66709304e69"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">hwaddr</a> [6U]</td></tr>
+<tr class="separator:aee967965d999fc1a4c40a66709304e69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe1181561cb16241f3cb5ed01e567d42"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#afe1181561cb16241f3cb5ed01e567d42">hwaddr_len</a></td></tr>
+<tr class="separator:afe1181561cb16241f3cb5ed01e567d42"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1c171db6097bbb6f09f63549a66e00ea"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#a1c171db6097bbb6f09f63549a66e00ea">flags</a></td></tr>
+<tr class="separator:a1c171db6097bbb6f09f63549a66e00ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32fca6ffd28bb9af3f891a378827a67e"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#a32fca6ffd28bb9af3f891a378827a67e">name</a> [2]</td></tr>
+<tr class="separator:a32fca6ffd28bb9af3f891a378827a67e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab7ef01e505dd2feb781fe86756b1c973"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#ab7ef01e505dd2feb781fe86756b1c973">num</a></td></tr>
+<tr class="separator:ab7ef01e505dd2feb781fe86756b1c973"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad98bafb7733b40ef898e53d91fbfa20f"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#ad98bafb7733b40ef898e53d91fbfa20f">ip6_autoconfig_enabled</a></td></tr>
+<tr class="separator:ad98bafb7733b40ef898e53d91fbfa20f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9c1f9f28bde60aa868bc3296bee7b1b6"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#a9c1f9f28bde60aa868bc3296bee7b1b6">rs_count</a></td></tr>
+<tr class="separator:a9c1f9f28bde60aa868bc3296bee7b1b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad0ee2a2169e384a2977ece2c471e0062"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#ad0ee2a2169e384a2977ece2c471e0062">link_type</a></td></tr>
+<tr class="separator:ad0ee2a2169e384a2977ece2c471e0062"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a908452e854180941054ed89f52bb8094"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#a908452e854180941054ed89f52bb8094">link_speed</a></td></tr>
+<tr class="separator:a908452e854180941054ed89f52bb8094"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1bb4e3aed6e0fd4b6b31ee82d806f971"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#a1bb4e3aed6e0fd4b6b31ee82d806f971">ts</a></td></tr>
+<tr class="separator:a1bb4e3aed6e0fd4b6b31ee82d806f971"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab32cbe1851154fd020bac4be558f5fd5"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__mib2__netif__ctrs.html">stats_mib2_netif_ctrs</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#ab32cbe1851154fd020bac4be558f5fd5">mib2_counters</a></td></tr>
+<tr class="separator:ab32cbe1851154fd020bac4be558f5fd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae64e56581bf0f136601f24c5395c19f0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="netif_8h.html#a71cad3277efe29191eef3348f4bf21f7">netif_igmp_mac_filter_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#ae64e56581bf0f136601f24c5395c19f0">igmp_mac_filter</a></td></tr>
+<tr class="separator:ae64e56581bf0f136601f24c5395c19f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abc67963ff9f574e98ef9c50138a3e470"><td class="memItemLeft" align="right" valign="top"><a class="el" href="netif_8h.html#af2ed0716122b65e7feb43e0dd99ae468">netif_mld_mac_filter_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif.html#abc67963ff9f574e98ef9c50138a3e470">mld_mac_filter</a></td></tr>
+<tr class="separator:abc67963ff9f574e98ef9c50138a3e470"><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>Generic data structure used for all lwIP network interfaces. The following fields should be filled in by the initialization function for the device driver: hwaddr_len, hwaddr[], mtu, flags </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a1c171db6097bbb6f09f63549a66e00ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1c171db6097bbb6f09f63549a66e00ea">&#9670;&nbsp;</a></span>flags</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netif::flags</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>flags (</p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__netif__flags.html">Flags</a>) </dd></dl>
+
+</div>
+</div>
+<a id="aee967965d999fc1a4c40a66709304e69"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aee967965d999fc1a4c40a66709304e69">&#9670;&nbsp;</a></span>hwaddr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netif::hwaddr[6U]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>link level hardware address of this interface </p>
+
+</div>
+</div>
+<a id="afe1181561cb16241f3cb5ed01e567d42"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afe1181561cb16241f3cb5ed01e567d42">&#9670;&nbsp;</a></span>hwaddr_len</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netif::hwaddr_len</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>number of bytes used in hwaddr </p>
+
+</div>
+</div>
+<a id="ae64e56581bf0f136601f24c5395c19f0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae64e56581bf0f136601f24c5395c19f0">&#9670;&nbsp;</a></span>igmp_mac_filter</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="netif_8h.html#a71cad3277efe29191eef3348f4bf21f7">netif_igmp_mac_filter_fn</a> netif::igmp_mac_filter</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function could be called to add or delete an entry in the multicast filter table of the ethernet MAC. </p>
+
+</div>
+</div>
+<a id="a8fe4f1b7b0d710216287da9615164a5c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8fe4f1b7b0d710216287da9615164a5c">&#9670;&nbsp;</a></span>input</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e">netif_input_fn</a> netif::input</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called by the network device driver to pass a packet up the TCP/IP stack. </p>
+
+</div>
+</div>
+<a id="ab7ef575d4ab398a182bc6e592f4d53a4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab7ef575d4ab398a182bc6e592f4d53a4">&#9670;&nbsp;</a></span>ip6_addr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> netif::ip6_addr[3]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Array of IPv6 addresses for this netif. </p>
+
+</div>
+</div>
+<a id="a54e81344084e9840a51cc4abab3b059b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a54e81344084e9840a51cc4abab3b059b">&#9670;&nbsp;</a></span>ip6_addr_state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netif::ip6_addr_state[3]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The state of each IPv6 address (Tentative, Preferred, etc). </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="ip6__addr_8h.html">ip6_addr.h</a> </dd></dl>
+
+</div>
+</div>
+<a id="a26f6e26d4a54c998716c10b7b85c8230"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a26f6e26d4a54c998716c10b7b85c8230">&#9670;&nbsp;</a></span>ip6_addr_valid_life</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t netif::ip6_addr_valid_life[3]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Remaining valid and preferred lifetime of each IPv6 address, in seconds. For valid lifetimes, the special value of IP6_ADDR_LIFE_STATIC (0) indicates the address is static and has no lifetimes. </p>
+
+</div>
+</div>
+<a id="ad98bafb7733b40ef898e53d91fbfa20f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad98bafb7733b40ef898e53d91fbfa20f">&#9670;&nbsp;</a></span>ip6_autoconfig_enabled</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netif::ip6_autoconfig_enabled</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>is this netif enabled for IPv6 autoconfiguration </p>
+
+</div>
+</div>
+<a id="a9776aaee37ea8f07b9ddc0f8b4e7e866"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9776aaee37ea8f07b9ddc0f8b4e7e866">&#9670;&nbsp;</a></span>ip_addr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> netif::ip_addr</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IP address configuration in network byte order </p>
+
+</div>
+</div>
+<a id="a4388cfadc8b4e9a9c1c93ce777bc3673"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4388cfadc8b4e9a9c1c93ce777bc3673">&#9670;&nbsp;</a></span>link_callback</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a> netif::link_callback</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called when the netif link is set to up or down </p>
+
+</div>
+</div>
+<a id="a908452e854180941054ed89f52bb8094"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a908452e854180941054ed89f52bb8094">&#9670;&nbsp;</a></span>link_speed</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t netif::link_speed</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>(estimate) link speed </p>
+
+</div>
+</div>
+<a id="ad0ee2a2169e384a2977ece2c471e0062"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad0ee2a2169e384a2977ece2c471e0062">&#9670;&nbsp;</a></span>link_type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netif::link_type</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>link type (from "snmp_ifType" enum from <a class="el" href="snmp__mib2_8h.html">snmp_mib2.h</a>) </p>
+
+</div>
+</div>
+<a id="acaaac9b415a7be73eb8a287c8ed18a8d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acaaac9b415a7be73eb8a287c8ed18a8d">&#9670;&nbsp;</a></span>linkoutput</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="netif_8h.html#ab75e9d808bc1b788bea84213e6a111ed">netif_linkoutput_fn</a> netif::linkoutput</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called by <a class="el" href="group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778">ethernet_output()</a> when it wants to send a packet on the interface. This function outputs the pbuf as-is on the link medium. </p>
+
+</div>
+</div>
+<a id="ab32cbe1851154fd020bac4be558f5fd5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab32cbe1851154fd020bac4be558f5fd5">&#9670;&nbsp;</a></span>mib2_counters</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__mib2__netif__ctrs.html">stats_mib2_netif_ctrs</a> netif::mib2_counters</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>counters </p>
+
+</div>
+</div>
+<a id="abc67963ff9f574e98ef9c50138a3e470"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abc67963ff9f574e98ef9c50138a3e470">&#9670;&nbsp;</a></span>mld_mac_filter</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="netif_8h.html#af2ed0716122b65e7feb43e0dd99ae468">netif_mld_mac_filter_fn</a> netif::mld_mac_filter</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function could be called to add or delete an entry in the IPv6 multicast filter table of the ethernet MAC. </p>
+
+</div>
+</div>
+<a id="aca7d56b4e0f822b0ced2885f222b8d48"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aca7d56b4e0f822b0ced2885f222b8d48">&#9670;&nbsp;</a></span>mtu</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netif::mtu</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>maximum transfer unit (in bytes) </p>
+
+</div>
+</div>
+<a id="acd78fca5dad6468605f38e327b3a5e72"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acd78fca5dad6468605f38e327b3a5e72">&#9670;&nbsp;</a></span>mtu6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t netif::mtu6</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>maximum transfer unit (in bytes), updated by RA </p>
+
+</div>
+</div>
+<a id="a32fca6ffd28bb9af3f891a378827a67e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a32fca6ffd28bb9af3f891a378827a67e">&#9670;&nbsp;</a></span>name</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char netif::name[2]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>descriptive abbreviation </p>
+
+</div>
+</div>
+<a id="ae77736b64df442242795220d76be6b86"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae77736b64df442242795220d76be6b86">&#9670;&nbsp;</a></span>next</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* netif::next</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>pointer to next in linked list </p>
+
+</div>
+</div>
+<a id="ab7ef01e505dd2feb781fe86756b1c973"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab7ef01e505dd2feb781fe86756b1c973">&#9670;&nbsp;</a></span>num</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netif::num</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>number of this interface. Used for <a class="el" href="group__if__api.html">Interface Identification API</a> and <a class="el" href="group__netifapi__netif.html">NETIF related</a>, as well as for IPv6 zones </p>
+
+</div>
+</div>
+<a id="a8e1dcfe65db487feecd244355f39215e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8e1dcfe65db487feecd244355f39215e">&#9670;&nbsp;</a></span>output</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="netif_8h.html#a7b4893aa2ed8c606a0cd7aa932fe5067">netif_output_fn</a> netif::output</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called by the IP module when it wants to send a packet on the interface. This function typically first resolves the hardware address, then sends the packet. For ethernet physical layer, this is usually <a class="el" href="etharp_8c.html#a19258c75a3778b6ed0c82f63a419502d">etharp_output()</a> </p>
+
+</div>
+</div>
+<a id="ac38383379cff22c402156fec71c19617"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac38383379cff22c402156fec71c19617">&#9670;&nbsp;</a></span>output_ip6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="netif_8h.html#a343a5b14136a51957d552527384674b3">netif_output_ip6_fn</a> netif::output_ip6</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called by the IPv6 module when it wants to send a packet on the interface. This function typically first resolves the hardware address, then sends the packet. For ethernet physical layer, this is usually <a class="el" href="ethip6_8c.html#ab5326546d33174f91f1fb0cc6d398bfd">ethip6_output()</a> </p>
+
+</div>
+</div>
+<a id="ae06deb532ead2e3009ba4e58aae6ca07"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae06deb532ead2e3009ba4e58aae6ca07">&#9670;&nbsp;</a></span>remove_callback</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a> netif::remove_callback</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called when the netif has been removed </p>
+
+</div>
+</div>
+<a id="a9c1f9f28bde60aa868bc3296bee7b1b6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9c1f9f28bde60aa868bc3296bee7b1b6">&#9670;&nbsp;</a></span>rs_count</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netif::rs_count</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of Router Solicitation messages that remain to be sent. </p>
+
+</div>
+</div>
+<a id="a809cc57c0dff09c5c9ae45b02c2002f3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a809cc57c0dff09c5c9ae45b02c2002f3">&#9670;&nbsp;</a></span>state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* netif::state</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This field can be set by the device driver and could point to state information for the device. </p>
+
+</div>
+</div>
+<a id="a1513e81d02557d2a950e965f18b53a45"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1513e81d02557d2a950e965f18b53a45">&#9670;&nbsp;</a></span>status_callback</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif_status_callback_fn</a> netif::status_callback</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called when the netif state is set to up or down </p>
+
+</div>
+</div>
+<a id="a1bb4e3aed6e0fd4b6b31ee82d806f971"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1bb4e3aed6e0fd4b6b31ee82d806f971">&#9670;&nbsp;</a></span>ts</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t netif::ts</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>timestamp at last change made (up/down) </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="netif_8h.html">netif.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="structnetif.html">netif</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structnetif.js b/doc/doxygen/output/html/structnetif.js
new file mode 100644
index 0000000..445654d
--- /dev/null
+++ b/doc/doxygen/output/html/structnetif.js
@@ -0,0 +1,31 @@
+var structnetif =
+[
+    [ "flags", "structnetif.html#a1c171db6097bbb6f09f63549a66e00ea", null ],
+    [ "hwaddr", "structnetif.html#aee967965d999fc1a4c40a66709304e69", null ],
+    [ "hwaddr_len", "structnetif.html#afe1181561cb16241f3cb5ed01e567d42", null ],
+    [ "igmp_mac_filter", "structnetif.html#ae64e56581bf0f136601f24c5395c19f0", null ],
+    [ "input", "structnetif.html#a8fe4f1b7b0d710216287da9615164a5c", null ],
+    [ "ip6_addr", "structnetif.html#ab7ef575d4ab398a182bc6e592f4d53a4", null ],
+    [ "ip6_addr_state", "structnetif.html#a54e81344084e9840a51cc4abab3b059b", null ],
+    [ "ip6_addr_valid_life", "structnetif.html#a26f6e26d4a54c998716c10b7b85c8230", null ],
+    [ "ip6_autoconfig_enabled", "structnetif.html#ad98bafb7733b40ef898e53d91fbfa20f", null ],
+    [ "ip_addr", "structnetif.html#a9776aaee37ea8f07b9ddc0f8b4e7e866", null ],
+    [ "link_callback", "structnetif.html#a4388cfadc8b4e9a9c1c93ce777bc3673", null ],
+    [ "link_speed", "structnetif.html#a908452e854180941054ed89f52bb8094", null ],
+    [ "link_type", "structnetif.html#ad0ee2a2169e384a2977ece2c471e0062", null ],
+    [ "linkoutput", "structnetif.html#acaaac9b415a7be73eb8a287c8ed18a8d", null ],
+    [ "mib2_counters", "structnetif.html#ab32cbe1851154fd020bac4be558f5fd5", null ],
+    [ "mld_mac_filter", "structnetif.html#abc67963ff9f574e98ef9c50138a3e470", null ],
+    [ "mtu", "structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48", null ],
+    [ "mtu6", "structnetif.html#acd78fca5dad6468605f38e327b3a5e72", null ],
+    [ "name", "structnetif.html#a32fca6ffd28bb9af3f891a378827a67e", null ],
+    [ "next", "structnetif.html#ae77736b64df442242795220d76be6b86", null ],
+    [ "num", "structnetif.html#ab7ef01e505dd2feb781fe86756b1c973", null ],
+    [ "output", "structnetif.html#a8e1dcfe65db487feecd244355f39215e", null ],
+    [ "output_ip6", "structnetif.html#ac38383379cff22c402156fec71c19617", null ],
+    [ "remove_callback", "structnetif.html#ae06deb532ead2e3009ba4e58aae6ca07", null ],
+    [ "rs_count", "structnetif.html#a9c1f9f28bde60aa868bc3296bee7b1b6", null ],
+    [ "state", "structnetif.html#a809cc57c0dff09c5c9ae45b02c2002f3", null ],
+    [ "status_callback", "structnetif.html#a1513e81d02557d2a950e965f18b53a45", null ],
+    [ "ts", "structnetif.html#a1bb4e3aed6e0fd4b6b31ee82d806f971", null ]
+];
\ No newline at end of file
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
new file mode 100644
index 0000000..3bf1ac8
--- /dev/null
+++ b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv4__changed__s.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: netif_ext_callback_args_t::ipv4_changed_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structnetif__ext__callback__args__t_1_1ipv4__changed__s.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">netif_ext_callback_args_t::ipv4_changed_s Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;netif.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a0f6e5c1318218d95f1d3dc8c29c30ade"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif__ext__callback__args__t_1_1ipv4__changed__s.html#a0f6e5c1318218d95f1d3dc8c29c30ade">old_address</a></td></tr>
+<tr class="separator:a0f6e5c1318218d95f1d3dc8c29c30ade"><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>Args to LWIP_NSC_IPV4_ADDRESS_CHANGED|LWIP_NSC_IPV4_GATEWAY_CHANGED|LWIP_NSC_IPV4_NETMASK_CHANGED|LWIP_NSC_IPV4_SETTINGS_CHANGED callback </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a0f6e5c1318218d95f1d3dc8c29c30ade"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0f6e5c1318218d95f1d3dc8c29c30ade">&#9670;&nbsp;</a></span>old_address</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>* netif_ext_callback_args_t::ipv4_changed_s::old_address</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Old IPv4 address </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="netif_8h.html">netif.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="unionnetif__ext__callback__args__t.html">netif_ext_callback_args_t</a></li><li class="navelem"><a class="el" href="structnetif__ext__callback__args__t_1_1ipv4__changed__s.html">ipv4_changed_s</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv4__changed__s.js b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv4__changed__s.js
new file mode 100644
index 0000000..691aad6
--- /dev/null
+++ b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv4__changed__s.js
@@ -0,0 +1,4 @@
+var structnetif__ext__callback__args__t_1_1ipv4__changed__s =
+[
+    [ "old_address", "structnetif__ext__callback__args__t_1_1ipv4__changed__s.html#a0f6e5c1318218d95f1d3dc8c29c30ade", null ]
+];
\ No newline at end of file
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
new file mode 100644
index 0000000..cbb6b52
--- /dev/null
+++ b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: netif_ext_callback_args_t::ipv6_addr_state_changed_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">netif_ext_callback_args_t::ipv6_addr_state_changed_s Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;netif.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:aebf2aa0b26b07ca1977c676a0404323f"><td class="memItemLeft" align="right" valign="top">s8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#aebf2aa0b26b07ca1977c676a0404323f">addr_index</a></td></tr>
+<tr class="separator:aebf2aa0b26b07ca1977c676a0404323f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9b58712e82a73803391523324e19a776"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#a9b58712e82a73803391523324e19a776">old_state</a></td></tr>
+<tr class="separator:a9b58712e82a73803391523324e19a776"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acd24c243c866f8f9169b89af11974f17"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#acd24c243c866f8f9169b89af11974f17">address</a></td></tr>
+<tr class="separator:acd24c243c866f8f9169b89af11974f17"><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>Args to LWIP_NSC_IPV6_ADDR_STATE_CHANGED callback </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="aebf2aa0b26b07ca1977c676a0404323f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aebf2aa0b26b07ca1977c676a0404323f">&#9670;&nbsp;</a></span>addr_index</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">s8_t netif_ext_callback_args_t::ipv6_addr_state_changed_s::addr_index</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Index of affected IPv6 address </p>
+
+</div>
+</div>
+<a id="acd24c243c866f8f9169b89af11974f17"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acd24c243c866f8f9169b89af11974f17">&#9670;&nbsp;</a></span>address</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>* netif_ext_callback_args_t::ipv6_addr_state_changed_s::address</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Affected IPv6 address </p>
+
+</div>
+</div>
+<a id="a9b58712e82a73803391523324e19a776"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9b58712e82a73803391523324e19a776">&#9670;&nbsp;</a></span>old_state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netif_ext_callback_args_t::ipv6_addr_state_changed_s::old_state</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Old IPv6 address state </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="netif_8h.html">netif.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="unionnetif__ext__callback__args__t.html">netif_ext_callback_args_t</a></li><li class="navelem"><a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html">ipv6_addr_state_changed_s</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.js b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.js
new file mode 100644
index 0000000..28ab5d6
--- /dev/null
+++ b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.js
@@ -0,0 +1,6 @@
+var structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s =
+[
+    [ "addr_index", "structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#aebf2aa0b26b07ca1977c676a0404323f", null ],
+    [ "address", "structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#acd24c243c866f8f9169b89af11974f17", null ],
+    [ "old_state", "structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#a9b58712e82a73803391523324e19a776", null ]
+];
\ No newline at end of file
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
new file mode 100644
index 0000000..1074a1f
--- /dev/null
+++ b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv6__set__s.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: netif_ext_callback_args_t::ipv6_set_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structnetif__ext__callback__args__t_1_1ipv6__set__s.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">netif_ext_callback_args_t::ipv6_set_s Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;netif.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ad44a5f52ad695ea90b15a1e29ff823dd"><td class="memItemLeft" align="right" valign="top">s8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__set__s.html#ad44a5f52ad695ea90b15a1e29ff823dd">addr_index</a></td></tr>
+<tr class="separator:ad44a5f52ad695ea90b15a1e29ff823dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aafda237ad0c20d25fa2ad83d63051226"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__set__s.html#aafda237ad0c20d25fa2ad83d63051226">old_address</a></td></tr>
+<tr class="separator:aafda237ad0c20d25fa2ad83d63051226"><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>Args to LWIP_NSC_IPV6_SET callback </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="ad44a5f52ad695ea90b15a1e29ff823dd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad44a5f52ad695ea90b15a1e29ff823dd">&#9670;&nbsp;</a></span>addr_index</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">s8_t netif_ext_callback_args_t::ipv6_set_s::addr_index</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Index of changed IPv6 address </p>
+
+</div>
+</div>
+<a id="aafda237ad0c20d25fa2ad83d63051226"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aafda237ad0c20d25fa2ad83d63051226">&#9670;&nbsp;</a></span>old_address</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>* netif_ext_callback_args_t::ipv6_set_s::old_address</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Old IPv6 address </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="netif_8h.html">netif.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="unionnetif__ext__callback__args__t.html">netif_ext_callback_args_t</a></li><li class="navelem"><a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__set__s.html">ipv6_set_s</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv6__set__s.js b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv6__set__s.js
new file mode 100644
index 0000000..1784a4a
--- /dev/null
+++ b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv6__set__s.js
@@ -0,0 +1,5 @@
+var structnetif__ext__callback__args__t_1_1ipv6__set__s =
+[
+    [ "addr_index", "structnetif__ext__callback__args__t_1_1ipv6__set__s.html#ad44a5f52ad695ea90b15a1e29ff823dd", null ],
+    [ "old_address", "structnetif__ext__callback__args__t_1_1ipv6__set__s.html#aafda237ad0c20d25fa2ad83d63051226", null ]
+];
\ No newline at end of file
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
new file mode 100644
index 0000000..e92dafd
--- /dev/null
+++ b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1link__changed__s.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: netif_ext_callback_args_t::link_changed_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structnetif__ext__callback__args__t_1_1link__changed__s.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">netif_ext_callback_args_t::link_changed_s Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;netif.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a39870f966a2a64a7f51747b45977296c"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif__ext__callback__args__t_1_1link__changed__s.html#a39870f966a2a64a7f51747b45977296c">state</a></td></tr>
+<tr class="separator:a39870f966a2a64a7f51747b45977296c"><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>Args to LWIP_NSC_LINK_CHANGED callback </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a39870f966a2a64a7f51747b45977296c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a39870f966a2a64a7f51747b45977296c">&#9670;&nbsp;</a></span>state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netif_ext_callback_args_t::link_changed_s::state</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>1: up; 0: down </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="netif_8h.html">netif.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="unionnetif__ext__callback__args__t.html">netif_ext_callback_args_t</a></li><li class="navelem"><a class="el" href="structnetif__ext__callback__args__t_1_1link__changed__s.html">link_changed_s</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1link__changed__s.js b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1link__changed__s.js
new file mode 100644
index 0000000..5861879
--- /dev/null
+++ b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1link__changed__s.js
@@ -0,0 +1,4 @@
+var structnetif__ext__callback__args__t_1_1link__changed__s =
+[
+    [ "state", "structnetif__ext__callback__args__t_1_1link__changed__s.html#a39870f966a2a64a7f51747b45977296c", null ]
+];
\ No newline at end of file
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
new file mode 100644
index 0000000..c2844b4
--- /dev/null
+++ b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1status__changed__s.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: netif_ext_callback_args_t::status_changed_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structnetif__ext__callback__args__t_1_1status__changed__s.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">netif_ext_callback_args_t::status_changed_s Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;netif.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a207d3afdf0a37d16a61d1253e264d7a7"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetif__ext__callback__args__t_1_1status__changed__s.html#a207d3afdf0a37d16a61d1253e264d7a7">state</a></td></tr>
+<tr class="separator:a207d3afdf0a37d16a61d1253e264d7a7"><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>Args to LWIP_NSC_STATUS_CHANGED callback </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a207d3afdf0a37d16a61d1253e264d7a7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a207d3afdf0a37d16a61d1253e264d7a7">&#9670;&nbsp;</a></span>state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t netif_ext_callback_args_t::status_changed_s::state</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>1: up; 0: down </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="netif_8h.html">netif.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="unionnetif__ext__callback__args__t.html">netif_ext_callback_args_t</a></li><li class="navelem"><a class="el" href="structnetif__ext__callback__args__t_1_1status__changed__s.html">status_changed_s</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1status__changed__s.js b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1status__changed__s.js
new file mode 100644
index 0000000..e504937
--- /dev/null
+++ b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1status__changed__s.js
@@ -0,0 +1,4 @@
+var structnetif__ext__callback__args__t_1_1status__changed__s =
+[
+    [ "state", "structnetif__ext__callback__args__t_1_1status__changed__s.html#a207d3afdf0a37d16a61d1253e264d7a7", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structnetvector.html b/doc/doxygen/output/html/structnetvector.html
new file mode 100644
index 0000000..d786d87
--- /dev/null
+++ b/doc/doxygen/output/html/structnetvector.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: netvector 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structnetvector.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">netvector Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;api.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a523362737ea7764f9aaa73a050a0b983"><td class="memItemLeft" align="right" valign="top">const void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetvector.html#a523362737ea7764f9aaa73a050a0b983">ptr</a></td></tr>
+<tr class="separator:a523362737ea7764f9aaa73a050a0b983"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8a95e6dcf57067e4354b9c2b6b391dbd"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnetvector.html#a8a95e6dcf57067e4354b9c2b6b391dbd">len</a></td></tr>
+<tr class="separator:a8a95e6dcf57067e4354b9c2b6b391dbd"><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 vector type is passed to <a class="el" href="api_8h.html#a992b4fe8a855fd94861738f7260d0a32">netconn_write_vectors_partly</a> to send multiple buffers at once. ATTENTION: This type has to directly map struct iovec since one is casted into the other! </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a8a95e6dcf57067e4354b9c2b6b391dbd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8a95e6dcf57067e4354b9c2b6b391dbd">&#9670;&nbsp;</a></span>len</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t netvector::len</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>size of the application data to send </p>
+
+</div>
+</div>
+<a id="a523362737ea7764f9aaa73a050a0b983"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a523362737ea7764f9aaa73a050a0b983">&#9670;&nbsp;</a></span>ptr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const void* netvector::ptr</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>pointer to the application buffer that contains the data to send </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="api_8h.html">api.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="structnetvector.html">netvector</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structnetvector.js b/doc/doxygen/output/html/structnetvector.js
new file mode 100644
index 0000000..cdf8d41
--- /dev/null
+++ b/doc/doxygen/output/html/structnetvector.js
@@ -0,0 +1,5 @@
+var structnetvector =
+[
+    [ "len", "structnetvector.html#a8a95e6dcf57067e4354b9c2b6b391dbd", null ],
+    [ "ptr", "structnetvector.html#a523362737ea7764f9aaa73a050a0b983", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structns__header.html b/doc/doxygen/output/html/structns__header.html
new file mode 100644
index 0000000..8c7d5fd
--- /dev/null
+++ b/doc/doxygen/output/html/structns__header.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ns_header 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structns__header.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">ns_header Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;nd6.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Neighbor solicitation message header. </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_2nd6_8h.html">nd6.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="structns__header.html">ns_header</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structpbuf.html b/doc/doxygen/output/html/structpbuf.html
new file mode 100644
index 0000000..fc9cae5
--- /dev/null
+++ b/doc/doxygen/output/html/structpbuf.html
@@ -0,0 +1,251 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: pbuf 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structpbuf.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">pbuf Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;pbuf.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a5e5763c94fd18d78937b0b58ce7df341"><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="structpbuf.html#a5e5763c94fd18d78937b0b58ce7df341">next</a></td></tr>
+<tr class="separator:a5e5763c94fd18d78937b0b58ce7df341"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d32dc3e964369d4eec638fc37fbc460"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpbuf.html#a8d32dc3e964369d4eec638fc37fbc460">payload</a></td></tr>
+<tr class="separator:a8d32dc3e964369d4eec638fc37fbc460"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5259e7ec29bab9c0999b64f2e86b411f"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpbuf.html#a5259e7ec29bab9c0999b64f2e86b411f">tot_len</a></td></tr>
+<tr class="separator:a5259e7ec29bab9c0999b64f2e86b411f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6f82449625e36e294f5d210268c0703f"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpbuf.html#a6f82449625e36e294f5d210268c0703f">len</a></td></tr>
+<tr class="separator:a6f82449625e36e294f5d210268c0703f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61a26ac8393dc9e549016b86c2cf5131"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpbuf.html#a61a26ac8393dc9e549016b86c2cf5131">type_internal</a></td></tr>
+<tr class="separator:a61a26ac8393dc9e549016b86c2cf5131"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa4d1af2cab3d9280d29212095b5b872a"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpbuf.html#aa4d1af2cab3d9280d29212095b5b872a">flags</a></td></tr>
+<tr class="separator:aa4d1af2cab3d9280d29212095b5b872a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62fe38eb0cf31027dc1fb9cbe7b55ba7"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpbuf.html#a62fe38eb0cf31027dc1fb9cbe7b55ba7">ref</a></td></tr>
+<tr class="separator:a62fe38eb0cf31027dc1fb9cbe7b55ba7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a58e90efbb4751608e9a1fdbd91e697"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpbuf.html#a6a58e90efbb4751608e9a1fdbd91e697">if_idx</a></td></tr>
+<tr class="separator:a6a58e90efbb4751608e9a1fdbd91e697"><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>Main packet buffer struct </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="aa4d1af2cab3d9280d29212095b5b872a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa4d1af2cab3d9280d29212095b5b872a">&#9670;&nbsp;</a></span>flags</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t pbuf::flags</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>misc flags </p>
+
+</div>
+</div>
+<a id="a6a58e90efbb4751608e9a1fdbd91e697"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6a58e90efbb4751608e9a1fdbd91e697">&#9670;&nbsp;</a></span>if_idx</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t pbuf::if_idx</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>For incoming packets, this contains the input netif's index </p>
+
+</div>
+</div>
+<a id="a6f82449625e36e294f5d210268c0703f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6f82449625e36e294f5d210268c0703f">&#9670;&nbsp;</a></span>len</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t pbuf::len</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>length of this buffer </p>
+
+</div>
+</div>
+<a id="a5e5763c94fd18d78937b0b58ce7df341"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5e5763c94fd18d78937b0b58ce7df341">&#9670;&nbsp;</a></span>next</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* pbuf::next</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>next pbuf in singly linked pbuf chain </p>
+
+</div>
+</div>
+<a id="a8d32dc3e964369d4eec638fc37fbc460"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8d32dc3e964369d4eec638fc37fbc460">&#9670;&nbsp;</a></span>payload</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* pbuf::payload</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>pointer to the actual data in the buffer </p>
+
+</div>
+</div>
+<a id="a62fe38eb0cf31027dc1fb9cbe7b55ba7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62fe38eb0cf31027dc1fb9cbe7b55ba7">&#9670;&nbsp;</a></span>ref</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t pbuf::ref</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>the reference count always equals the number of pointers that refer to this pbuf. This can be pointers from an application, the stack itself, or pbuf-&gt;next pointers from a chain. </p>
+
+</div>
+</div>
+<a id="a5259e7ec29bab9c0999b64f2e86b411f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5259e7ec29bab9c0999b64f2e86b411f">&#9670;&nbsp;</a></span>tot_len</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t pbuf::tot_len</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>total length of this buffer and all next buffers in chain belonging to the same packet.</p>
+<p>For non-queue packet chains this is the invariant: p-&gt;tot_len == p-&gt;len + (p-&gt;next? p-&gt;next-&gt;tot_len: 0) </p>
+
+</div>
+</div>
+<a id="a61a26ac8393dc9e549016b86c2cf5131"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a61a26ac8393dc9e549016b86c2cf5131">&#9670;&nbsp;</a></span>type_internal</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t pbuf::type_internal</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>a bit field indicating pbuf type and allocation sources (see PBUF_TYPE_FLAG_*, PBUF_ALLOC_FLAG_* and PBUF_TYPE_ALLOC_SRC_MASK) </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="pbuf_8h.html">pbuf.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="structpbuf.html">pbuf</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structpbuf.js b/doc/doxygen/output/html/structpbuf.js
new file mode 100644
index 0000000..17ab831
--- /dev/null
+++ b/doc/doxygen/output/html/structpbuf.js
@@ -0,0 +1,11 @@
+var structpbuf =
+[
+    [ "flags", "structpbuf.html#aa4d1af2cab3d9280d29212095b5b872a", null ],
+    [ "if_idx", "structpbuf.html#a6a58e90efbb4751608e9a1fdbd91e697", null ],
+    [ "len", "structpbuf.html#a6f82449625e36e294f5d210268c0703f", null ],
+    [ "next", "structpbuf.html#a5e5763c94fd18d78937b0b58ce7df341", null ],
+    [ "payload", "structpbuf.html#a8d32dc3e964369d4eec638fc37fbc460", null ],
+    [ "ref", "structpbuf.html#a62fe38eb0cf31027dc1fb9cbe7b55ba7", null ],
+    [ "tot_len", "structpbuf.html#a5259e7ec29bab9c0999b64f2e86b411f", null ],
+    [ "type_internal", "structpbuf.html#a61a26ac8393dc9e549016b86c2cf5131", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structpbuf__custom.html b/doc/doxygen/output/html/structpbuf__custom.html
new file mode 100644
index 0000000..7785397
--- /dev/null
+++ b/doc/doxygen/output/html/structpbuf__custom.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: pbuf_custom 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structpbuf__custom.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">pbuf_custom Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;pbuf.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a100e338f13464e76b46896647b962ed8"><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="structpbuf__custom.html#a100e338f13464e76b46896647b962ed8">pbuf</a></td></tr>
+<tr class="separator:a100e338f13464e76b46896647b962ed8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af614d17874746cbbf778dc4ca9eac2e9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="pbuf_8h.html#a6d285ce1d910f25e511c8c38532a1dce">pbuf_free_custom_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpbuf__custom.html#af614d17874746cbbf778dc4ca9eac2e9">custom_free_function</a></td></tr>
+<tr class="separator:af614d17874746cbbf778dc4ca9eac2e9"><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>A custom pbuf: like a pbuf, but following a function pointer to free it. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="af614d17874746cbbf778dc4ca9eac2e9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af614d17874746cbbf778dc4ca9eac2e9">&#9670;&nbsp;</a></span>custom_free_function</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="pbuf_8h.html#a6d285ce1d910f25e511c8c38532a1dce">pbuf_free_custom_fn</a> pbuf_custom::custom_free_function</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called when pbuf_free deallocates this <a class="el" href="structpbuf.html">pbuf(_custom)</a> </p>
+
+</div>
+</div>
+<a id="a100e338f13464e76b46896647b962ed8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a100e338f13464e76b46896647b962ed8">&#9670;&nbsp;</a></span>pbuf</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a> pbuf_custom::pbuf</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The actual pbuf </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="pbuf_8h.html">pbuf.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="structpbuf__custom.html">pbuf_custom</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structpbuf__custom.js b/doc/doxygen/output/html/structpbuf__custom.js
new file mode 100644
index 0000000..62d2829
--- /dev/null
+++ b/doc/doxygen/output/html/structpbuf__custom.js
@@ -0,0 +1,5 @@
+var structpbuf__custom =
+[
+    [ "custom_free_function", "structpbuf__custom.html#af614d17874746cbbf778dc4ca9eac2e9", null ],
+    [ "pbuf", "structpbuf__custom.html#a100e338f13464e76b46896647b962ed8", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structpbuf__custom__ref.html b/doc/doxygen/output/html/structpbuf__custom__ref.html
new file mode 100644
index 0000000..ebee988
--- /dev/null
+++ b/doc/doxygen/output/html/structpbuf__custom__ref.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: pbuf_custom_ref 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structpbuf__custom__ref.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">pbuf_custom_ref Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;ip6_frag.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:af5884b6a7031d73406cb9596a51382b7"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structpbuf__custom.html">pbuf_custom</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpbuf__custom__ref.html#af5884b6a7031d73406cb9596a51382b7">pc</a></td></tr>
+<tr class="separator:af5884b6a7031d73406cb9596a51382b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a135a1476908337d8073241fd7f68fa1d"><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="structpbuf__custom__ref.html#a135a1476908337d8073241fd7f68fa1d">original</a></td></tr>
+<tr class="separator:a135a1476908337d8073241fd7f68fa1d"><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>A custom pbuf that holds a reference to another pbuf, which is freed when this custom pbuf is freed. This is used to create a custom PBUF_REF that points into the original pbuf. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a135a1476908337d8073241fd7f68fa1d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a135a1476908337d8073241fd7f68fa1d">&#9670;&nbsp;</a></span>original</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a> * pbuf_custom_ref::original</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>pointer to the original pbuf that is referenced </p>
+
+</div>
+</div>
+<a id="af5884b6a7031d73406cb9596a51382b7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af5884b6a7031d73406cb9596a51382b7">&#9670;&nbsp;</a></span>pc</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf__custom.html">pbuf_custom</a> pbuf_custom_ref::pc</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>'base class' </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following files:<ul>
+<li>src/include/lwip/<a class="el" href="ip4__frag_8h.html">ip4_frag.h</a></li>
+<li>src/include/lwip/<a class="el" href="ip6__frag_8h.html">ip6_frag.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="structpbuf__custom__ref.html">pbuf_custom_ref</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structpbuf__custom__ref.js b/doc/doxygen/output/html/structpbuf__custom__ref.js
new file mode 100644
index 0000000..c94f6ab
--- /dev/null
+++ b/doc/doxygen/output/html/structpbuf__custom__ref.js
@@ -0,0 +1,5 @@
+var structpbuf__custom__ref =
+[
+    [ "original", "structpbuf__custom__ref.html#a135a1476908337d8073241fd7f68fa1d", null ],
+    [ "pc", "structpbuf__custom__ref.html#af5884b6a7031d73406cb9596a51382b7", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structpbuf__rom.html b/doc/doxygen/output/html/structpbuf__rom.html
new file mode 100644
index 0000000..ee0c9c9
--- /dev/null
+++ b/doc/doxygen/output/html/structpbuf__rom.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: pbuf_rom 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structpbuf__rom.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">pbuf_rom Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;pbuf.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a5ffdf590ed65b217e2d96f648e1bd3e7"><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="structpbuf__rom.html#a5ffdf590ed65b217e2d96f648e1bd3e7">next</a></td></tr>
+<tr class="separator:a5ffdf590ed65b217e2d96f648e1bd3e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5cd0dcc590038629644ad775d76230a1"><td class="memItemLeft" align="right" valign="top">const void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpbuf__rom.html#a5cd0dcc590038629644ad775d76230a1">payload</a></td></tr>
+<tr class="separator:a5cd0dcc590038629644ad775d76230a1"><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>Helper struct for const-correctness only. The only meaning of this one is to provide a const payload pointer for PBUF_ROM type. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a5ffdf590ed65b217e2d96f648e1bd3e7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5ffdf590ed65b217e2d96f648e1bd3e7">&#9670;&nbsp;</a></span>next</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structpbuf.html">pbuf</a>* pbuf_rom::next</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>next pbuf in singly linked pbuf chain </p>
+
+</div>
+</div>
+<a id="a5cd0dcc590038629644ad775d76230a1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5cd0dcc590038629644ad775d76230a1">&#9670;&nbsp;</a></span>payload</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const void* pbuf_rom::payload</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>pointer to the actual data in the buffer </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="pbuf_8h.html">pbuf.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="structpbuf__rom.html">pbuf_rom</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structpbuf__rom.js b/doc/doxygen/output/html/structpbuf__rom.js
new file mode 100644
index 0000000..727af4d
--- /dev/null
+++ b/doc/doxygen/output/html/structpbuf__rom.js
@@ -0,0 +1,5 @@
+var structpbuf__rom =
+[
+    [ "next", "structpbuf__rom.html#a5ffdf590ed65b217e2d96f648e1bd3e7", null ],
+    [ "payload", "structpbuf__rom.html#a5cd0dcc590038629644ad775d76230a1", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structraw__pcb.html b/doc/doxygen/output/html/structraw__pcb.html
new file mode 100644
index 0000000..7715aad
--- /dev/null
+++ b/doc/doxygen/output/html/structraw__pcb.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: raw_pcb 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structraw__pcb.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">raw_pcb Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;raw.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a5124a21e1523c774bd76c0eabc7c7ca8"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structraw__pcb.html#a5124a21e1523c774bd76c0eabc7c7ca8">mcast_ifindex</a></td></tr>
+<tr class="separator:a5124a21e1523c774bd76c0eabc7c7ca8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2ecc77e919de9bb552d1c70e771e2cad"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structraw__pcb.html#a2ecc77e919de9bb552d1c70e771e2cad">mcast_ttl</a></td></tr>
+<tr class="separator:a2ecc77e919de9bb552d1c70e771e2cad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a963b023239ad97c05536046ed7058a10"><td class="memItemLeft" align="right" valign="top"><a class="el" href="raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd">raw_recv_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structraw__pcb.html#a963b023239ad97c05536046ed7058a10">recv</a></td></tr>
+<tr class="separator:a963b023239ad97c05536046ed7058a10"><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>the RAW protocol control block </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a5124a21e1523c774bd76c0eabc7c7ca8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5124a21e1523c774bd76c0eabc7c7ca8">&#9670;&nbsp;</a></span>mcast_ifindex</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t raw_pcb::mcast_ifindex</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>outgoing network interface for multicast packets, by interface index (if nonzero) </p>
+
+</div>
+</div>
+<a id="a2ecc77e919de9bb552d1c70e771e2cad"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2ecc77e919de9bb552d1c70e771e2cad">&#9670;&nbsp;</a></span>mcast_ttl</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t raw_pcb::mcast_ttl</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TTL for outgoing multicast packets </p>
+
+</div>
+</div>
+<a id="a963b023239ad97c05536046ed7058a10"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a963b023239ad97c05536046ed7058a10">&#9670;&nbsp;</a></span>recv</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd">raw_recv_fn</a> raw_pcb::recv</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>receive callback 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="raw_8h.html">raw.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="structraw__pcb.html">raw_pcb</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structraw__pcb.js b/doc/doxygen/output/html/structraw__pcb.js
new file mode 100644
index 0000000..d489dea
--- /dev/null
+++ b/doc/doxygen/output/html/structraw__pcb.js
@@ -0,0 +1,6 @@
+var structraw__pcb =
+[
+    [ "mcast_ifindex", "structraw__pcb.html#a5124a21e1523c774bd76c0eabc7c7ca8", null ],
+    [ "mcast_ttl", "structraw__pcb.html#a2ecc77e919de9bb552d1c70e771e2cad", null ],
+    [ "recv", "structraw__pcb.html#a963b023239ad97c05536046ed7058a10", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structredirect__header.html b/doc/doxygen/output/html/structredirect__header.html
new file mode 100644
index 0000000..5d2bba3
--- /dev/null
+++ b/doc/doxygen/output/html/structredirect__header.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: redirect_header 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structredirect__header.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">redirect_header Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;nd6.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Redirect message header. </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_2nd6_8h.html">nd6.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="structredirect__header.html">redirect_header</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structrs__header.html b/doc/doxygen/output/html/structrs__header.html
new file mode 100644
index 0000000..02da703
--- /dev/null
+++ b/doc/doxygen/output/html/structrs__header.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: rs_header 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structrs__header.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">rs_header Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;nd6.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Router solicitation message header. </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_2nd6_8h.html">nd6.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="structrs__header.html">rs_header</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsmtp__send__request.html b/doc/doxygen/output/html/structsmtp__send__request.html
new file mode 100644
index 0000000..e125ecb
--- /dev/null
+++ b/doc/doxygen/output/html/structsmtp__send__request.html
@@ -0,0 +1,132 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: smtp_send_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsmtp__send__request.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">smtp_send_request Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;smtp.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a4d517ae8b29caa4f0b371923379d9ef4"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__send__request.html#a4d517ae8b29caa4f0b371923379d9ef4">static_data</a></td></tr>
+<tr class="separator:a4d517ae8b29caa4f0b371923379d9ef4"><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 structure is used as argument for <a class="el" href="group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243">smtp_send_mail_int()</a>, which in turn can be used with <a class="el" href="group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip_callback()</a> to send mail from interrupt context, e.g. like this: struct <a class="el" href="structsmtp__send__request.html">smtp_send_request</a> <em>req; (to be filled) tcpip_try_callback(smtp_send_mail_int, (void</em>)req);</p>
+<p>For member description, see parameter description of <a class="el" href="group__smtp.html#gae43119480c4146df9eeff7ae80c767f7">smtp_send_mail()</a>. When using with tcpip_callback, this structure has to stay allocated (e.g. using mem_malloc/mem_free) until its 'callback_fn' is called. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a4d517ae8b29caa4f0b371923379d9ef4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4d517ae8b29caa4f0b371923379d9ef4">&#9670;&nbsp;</a></span>static_data</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t smtp_send_request::static_data</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If this is != 0, data is <em>not</em> copied into an extra buffer but used from the pointers supplied in this struct. This means less memory usage, but data must stay untouched until the callback function is called. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/apps/smtp.h</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="structsmtp__send__request.html">smtp_send_request</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsmtp__send__request.js b/doc/doxygen/output/html/structsmtp__send__request.js
new file mode 100644
index 0000000..935d8dd
--- /dev/null
+++ b/doc/doxygen/output/html/structsmtp__send__request.js
@@ -0,0 +1,4 @@
+var structsmtp__send__request =
+[
+    [ "static_data", "structsmtp__send__request.html#a4d517ae8b29caa4f0b371923379d9ef4", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structsmtp__session.html b/doc/doxygen/output/html/structsmtp__session.html
new file mode 100644
index 0000000..d8d6f4b
--- /dev/null
+++ b/doc/doxygen/output/html/structsmtp__session.html
@@ -0,0 +1,418 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: smtp_session 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsmtp__session.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">smtp_session Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:aed9c182738767279c2b58b1e3322db09"><td class="memItemLeft" align="right" valign="top">enum <a class="el" href="smtp_8c.html#a04947fff2d3a3803e6c716aecc7f2bae">smtp_session_state</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#aed9c182738767279c2b58b1e3322db09">state</a></td></tr>
+<tr class="separator:aed9c182738767279c2b58b1e3322db09"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5884425cb5ce964d8383b29cc20208d7"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#a5884425cb5ce964d8383b29cc20208d7">timer</a></td></tr>
+<tr class="separator:a5884425cb5ce964d8383b29cc20208d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a42cedb495f7423b9e28979ce1e460c61"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#a42cedb495f7423b9e28979ce1e460c61">tx_buf</a> [255+1]</td></tr>
+<tr class="separator:a42cedb495f7423b9e28979ce1e460c61"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8dc4651c67618e33c56dc66790bc12ee"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#a8dc4651c67618e33c56dc66790bc12ee">from</a></td></tr>
+<tr class="separator:a8dc4651c67618e33c56dc66790bc12ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a191b09e7142414a671da82fece888e65"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#a191b09e7142414a671da82fece888e65">from_len</a></td></tr>
+<tr class="separator:a191b09e7142414a671da82fece888e65"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70b3753bc70e65f779279c246617faea"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#a70b3753bc70e65f779279c246617faea">to</a></td></tr>
+<tr class="separator:a70b3753bc70e65f779279c246617faea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a66b8e1dd314976788e9ac9a81f59a402"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#a66b8e1dd314976788e9ac9a81f59a402">to_len</a></td></tr>
+<tr class="separator:a66b8e1dd314976788e9ac9a81f59a402"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab8240801e229ee260f3feeaa270520c7"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#ab8240801e229ee260f3feeaa270520c7">subject</a></td></tr>
+<tr class="separator:ab8240801e229ee260f3feeaa270520c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea48a6edd3ede02b26882c7b8d72646c"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#aea48a6edd3ede02b26882c7b8d72646c">subject_len</a></td></tr>
+<tr class="separator:aea48a6edd3ede02b26882c7b8d72646c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7bb4bf5cc209e073341b56845e5cbd49"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#a7bb4bf5cc209e073341b56845e5cbd49">body</a></td></tr>
+<tr class="separator:a7bb4bf5cc209e073341b56845e5cbd49"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0da8b775ddfe5f8891464037a6b4bb4d"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#a0da8b775ddfe5f8891464037a6b4bb4d">body_len</a></td></tr>
+<tr class="separator:a0da8b775ddfe5f8891464037a6b4bb4d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5893c61d863b4846a81d8a4bbcaebb5b"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#a5893c61d863b4846a81d8a4bbcaebb5b">body_sent</a></td></tr>
+<tr class="separator:a5893c61d863b4846a81d8a4bbcaebb5b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a24c13d621e18311a613ab68b856a7f7b"><td class="memItemLeft" align="right" valign="top">smtp_result_fn&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#a24c13d621e18311a613ab68b856a7f7b">callback_fn</a></td></tr>
+<tr class="separator:a24c13d621e18311a613ab68b856a7f7b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0544df7a935a092d825d8f2380f970f"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#af0544df7a935a092d825d8f2380f970f">callback_arg</a></td></tr>
+<tr class="separator:af0544df7a935a092d825d8f2380f970f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a568e3def9d0ec54e3c079f577717a6bb"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#a568e3def9d0ec54e3c079f577717a6bb">username</a></td></tr>
+<tr class="separator:a568e3def9d0ec54e3c079f577717a6bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7a5a3c00378ce076ce70236525afd431"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#a7a5a3c00378ce076ce70236525afd431">pass</a></td></tr>
+<tr class="separator:a7a5a3c00378ce076ce70236525afd431"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9da4e424e22892fae51987665eca85a9"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#a9da4e424e22892fae51987665eca85a9">auth_plain</a> [32+32+3]</td></tr>
+<tr class="separator:a9da4e424e22892fae51987665eca85a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a003dfd03ac58252b575a7c965e532461"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsmtp__session.html#a003dfd03ac58252b575a7c965e532461">auth_plain_len</a></td></tr>
+<tr class="separator:a003dfd03ac58252b575a7c965e532461"><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 keeping the body and state of an smtp session </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a9da4e424e22892fae51987665eca85a9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9da4e424e22892fae51987665eca85a9">&#9670;&nbsp;</a></span>auth_plain</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char smtp_session::auth_plain[32+ 32+3]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Username and password combined as necessary for PLAIN authentication </p>
+
+</div>
+</div>
+<a id="a003dfd03ac58252b575a7c965e532461"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a003dfd03ac58252b575a7c965e532461">&#9670;&nbsp;</a></span>auth_plain_len</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t smtp_session::auth_plain_len</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Length of smtp_auth_plain string (cannot use strlen since it includes \0) </p>
+
+</div>
+</div>
+<a id="a7bb4bf5cc209e073341b56845e5cbd49"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7bb4bf5cc209e073341b56845e5cbd49">&#9670;&nbsp;</a></span>body</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* smtp_session::body</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>this is the body of the mail to be sent </p>
+
+</div>
+</div>
+<a id="a0da8b775ddfe5f8891464037a6b4bb4d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0da8b775ddfe5f8891464037a6b4bb4d">&#9670;&nbsp;</a></span>body_len</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t smtp_session::body_len</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>this is the length of the body to be sent </p>
+
+</div>
+</div>
+<a id="a5893c61d863b4846a81d8a4bbcaebb5b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5893c61d863b4846a81d8a4bbcaebb5b">&#9670;&nbsp;</a></span>body_sent</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t smtp_session::body_sent</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>amount of data from body already sent </p>
+
+</div>
+</div>
+<a id="af0544df7a935a092d825d8f2380f970f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af0544df7a935a092d825d8f2380f970f">&#9670;&nbsp;</a></span>callback_arg</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* smtp_session::callback_arg</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>argument for callback function </p>
+
+</div>
+</div>
+<a id="a24c13d621e18311a613ab68b856a7f7b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a24c13d621e18311a613ab68b856a7f7b">&#9670;&nbsp;</a></span>callback_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">smtp_result_fn smtp_session::callback_fn</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>callback function to call when closed </p>
+
+</div>
+</div>
+<a id="a8dc4651c67618e33c56dc66790bc12ee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8dc4651c67618e33c56dc66790bc12ee">&#9670;&nbsp;</a></span>from</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* smtp_session::from</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>source email address </p>
+
+</div>
+</div>
+<a id="a191b09e7142414a671da82fece888e65"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a191b09e7142414a671da82fece888e65">&#9670;&nbsp;</a></span>from_len</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t smtp_session::from_len</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>size of the sourceemail address </p>
+
+</div>
+</div>
+<a id="a7a5a3c00378ce076ce70236525afd431"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7a5a3c00378ce076ce70236525afd431">&#9670;&nbsp;</a></span>pass</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* smtp_session::pass</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Password to use for this request </p>
+
+</div>
+</div>
+<a id="aed9c182738767279c2b58b1e3322db09"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aed9c182738767279c2b58b1e3322db09">&#9670;&nbsp;</a></span>state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="smtp_8c.html#a04947fff2d3a3803e6c716aecc7f2bae">smtp_session_state</a> smtp_session::state</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>keeping the state of the smtp session </p>
+
+</div>
+</div>
+<a id="ab8240801e229ee260f3feeaa270520c7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab8240801e229ee260f3feeaa270520c7">&#9670;&nbsp;</a></span>subject</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* smtp_session::subject</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>subject of the email </p>
+
+</div>
+</div>
+<a id="aea48a6edd3ede02b26882c7b8d72646c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aea48a6edd3ede02b26882c7b8d72646c">&#9670;&nbsp;</a></span>subject_len</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t smtp_session::subject_len</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>length of the subject string </p>
+
+</div>
+</div>
+<a id="a5884425cb5ce964d8383b29cc20208d7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5884425cb5ce964d8383b29cc20208d7">&#9670;&nbsp;</a></span>timer</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t smtp_session::timer</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>timeout handling, if this reaches 0, the connection is closed </p>
+
+</div>
+</div>
+<a id="a70b3753bc70e65f779279c246617faea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a70b3753bc70e65f779279c246617faea">&#9670;&nbsp;</a></span>to</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* smtp_session::to</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>target email address </p>
+
+</div>
+</div>
+<a id="a66b8e1dd314976788e9ac9a81f59a402"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a66b8e1dd314976788e9ac9a81f59a402">&#9670;&nbsp;</a></span>to_len</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t smtp_session::to_len</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>size of the target email address </p>
+
+</div>
+</div>
+<a id="a42cedb495f7423b9e28979ce1e460c61"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a42cedb495f7423b9e28979ce1e460c61">&#9670;&nbsp;</a></span>tx_buf</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char smtp_session::tx_buf[255+1]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>helper buffer for transmit, not used for sending body </p>
+
+</div>
+</div>
+<a id="a568e3def9d0ec54e3c079f577717a6bb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a568e3def9d0ec54e3c079f577717a6bb">&#9670;&nbsp;</a></span>username</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* smtp_session::username</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Username to use for this request </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/apps/smtp/<a class="el" href="smtp_8c.html">smtp.c</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="structsmtp__session.html">smtp_session</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsmtp__session.js b/doc/doxygen/output/html/structsmtp__session.js
new file mode 100644
index 0000000..85a9855
--- /dev/null
+++ b/doc/doxygen/output/html/structsmtp__session.js
@@ -0,0 +1,21 @@
+var structsmtp__session =
+[
+    [ "auth_plain", "structsmtp__session.html#a9da4e424e22892fae51987665eca85a9", null ],
+    [ "auth_plain_len", "structsmtp__session.html#a003dfd03ac58252b575a7c965e532461", null ],
+    [ "body", "structsmtp__session.html#a7bb4bf5cc209e073341b56845e5cbd49", null ],
+    [ "body_len", "structsmtp__session.html#a0da8b775ddfe5f8891464037a6b4bb4d", null ],
+    [ "body_sent", "structsmtp__session.html#a5893c61d863b4846a81d8a4bbcaebb5b", null ],
+    [ "callback_arg", "structsmtp__session.html#af0544df7a935a092d825d8f2380f970f", null ],
+    [ "callback_fn", "structsmtp__session.html#a24c13d621e18311a613ab68b856a7f7b", null ],
+    [ "from", "structsmtp__session.html#a8dc4651c67618e33c56dc66790bc12ee", null ],
+    [ "from_len", "structsmtp__session.html#a191b09e7142414a671da82fece888e65", null ],
+    [ "pass", "structsmtp__session.html#a7a5a3c00378ce076ce70236525afd431", null ],
+    [ "state", "structsmtp__session.html#aed9c182738767279c2b58b1e3322db09", null ],
+    [ "subject", "structsmtp__session.html#ab8240801e229ee260f3feeaa270520c7", null ],
+    [ "subject_len", "structsmtp__session.html#aea48a6edd3ede02b26882c7b8d72646c", null ],
+    [ "timer", "structsmtp__session.html#a5884425cb5ce964d8383b29cc20208d7", null ],
+    [ "to", "structsmtp__session.html#a70b3753bc70e65f779279c246617faea", null ],
+    [ "to_len", "structsmtp__session.html#a66b8e1dd314976788e9ac9a81f59a402", null ],
+    [ "tx_buf", "structsmtp__session.html#a42cedb495f7423b9e28979ce1e460c61", null ],
+    [ "username", "structsmtp__session.html#a568e3def9d0ec54e3c079f577717a6bb", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structsnmp__leaf__node.html b/doc/doxygen/output/html/structsnmp__leaf__node.html
new file mode 100644
index 0000000..e106c33
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__leaf__node.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_leaf_node 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__leaf__node.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_leaf_node Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;snmp_core.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:aa9e43030b5229d8425082c595c576992"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structsnmp__node.html">snmp_node</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__leaf__node.html#aa9e43030b5229d8425082c595c576992">node</a></td></tr>
+<tr class="separator:aa9e43030b5229d8425082c595c576992"><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 leaf node </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="aa9e43030b5229d8425082c595c576992"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa9e43030b5229d8425082c595c576992">&#9670;&nbsp;</a></span>node</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structsnmp__node.html">snmp_node</a> snmp_leaf_node::node</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>inherited "base class" members </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="snmp__core_8h.html">snmp_core.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="structsnmp__leaf__node.html">snmp_leaf_node</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsnmp__leaf__node.js b/doc/doxygen/output/html/structsnmp__leaf__node.js
new file mode 100644
index 0000000..a99e947
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__leaf__node.js
@@ -0,0 +1,4 @@
+var structsnmp__leaf__node =
+[
+    [ "node", "structsnmp__leaf__node.html#aa9e43030b5229d8425082c595c576992", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structsnmp__mib.html b/doc/doxygen/output/html/structsnmp__mib.html
new file mode 100644
index 0000000..dab19b7
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__mib.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_mib 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__mib.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_mib Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;snmp_core.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>represents a single mib with its base oid and root node </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__core_8h.html">snmp_core.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="structsnmp__mib.html">snmp_mib</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsnmp__next__oid__state.html b/doc/doxygen/output/html/structsnmp__next__oid__state.html
new file mode 100644
index 0000000..7f02f40
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__next__oid__state.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_next_oid_state 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__next__oid__state.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_next_oid_state Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;snmp_core.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>state for next_oid_init / next_oid_check functions </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__core_8h.html">snmp_core.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="structsnmp__next__oid__state.html">snmp_next_oid_state</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsnmp__node.html b/doc/doxygen/output/html/structsnmp__node.html
new file mode 100644
index 0000000..cd62cf7
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__node.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_node 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__node.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_node Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;snmp_core.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a1af8e20a688943a419b307bf123b1851"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__node.html#a1af8e20a688943a419b307bf123b1851">node_type</a></td></tr>
+<tr class="separator:a1af8e20a688943a419b307bf123b1851"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae7a3bb0eb49ac527d461be414937f271"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__node.html#ae7a3bb0eb49ac527d461be414937f271">oid</a></td></tr>
+<tr class="separator:ae7a3bb0eb49ac527d461be414937f271"><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>node "base class" layout, the mandatory fields for a node </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a1af8e20a688943a419b307bf123b1851"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1af8e20a688943a419b307bf123b1851">&#9670;&nbsp;</a></span>node_type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_node::node_type</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>one out of SNMP_NODE_TREE or any leaf node type (like SNMP_NODE_SCALAR) </p>
+
+</div>
+</div>
+<a id="ae7a3bb0eb49ac527d461be414937f271"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae7a3bb0eb49ac527d461be414937f271">&#9670;&nbsp;</a></span>oid</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t snmp_node::oid</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>the number assigned to this node which used as part of the full OID </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="snmp__core_8h.html">snmp_core.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="structsnmp__node.html">snmp_node</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsnmp__node.js b/doc/doxygen/output/html/structsnmp__node.js
new file mode 100644
index 0000000..74e5577
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__node.js
@@ -0,0 +1,5 @@
+var structsnmp__node =
+[
+    [ "node_type", "structsnmp__node.html#a1af8e20a688943a419b307bf123b1851", null ],
+    [ "oid", "structsnmp__node.html#ae7a3bb0eb49ac527d461be414937f271", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structsnmp__node__instance.html b/doc/doxygen/output/html/structsnmp__node__instance.html
new file mode 100644
index 0000000..f864b23
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__node__instance.html
@@ -0,0 +1,284 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_node_instance 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__node__instance.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_node_instance Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;snmp_core.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a4136f44404b25f4d4dacc6b6b76e77ac"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structsnmp__node.html">snmp_node</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__node__instance.html#a4136f44404b25f4d4dacc6b6b76e77ac">node</a></td></tr>
+<tr class="separator:a4136f44404b25f4d4dacc6b6b76e77ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aedb358729c310c8e5b391dd256726a23"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__node__instance.html#aedb358729c310c8e5b391dd256726a23">instance_oid</a></td></tr>
+<tr class="separator:aedb358729c310c8e5b391dd256726a23"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af51206e0912a8402c395dcf3b623f8b9"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__node__instance.html#af51206e0912a8402c395dcf3b623f8b9">asn1_type</a></td></tr>
+<tr class="separator:af51206e0912a8402c395dcf3b623f8b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4af17d17a971f1d11a186e6e1fc4411c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="snmp__core_8h.html#ad5a33687d1a6fcf970266b41b0633760">snmp_access_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__node__instance.html#a4af17d17a971f1d11a186e6e1fc4411c">access</a></td></tr>
+<tr class="separator:a4af17d17a971f1d11a186e6e1fc4411c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a17aa954aa34672f4a399bf0d91c0a649"><td class="memItemLeft" align="right" valign="top">node_instance_get_value_method&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__node__instance.html#a17aa954aa34672f4a399bf0d91c0a649">get_value</a></td></tr>
+<tr class="separator:a17aa954aa34672f4a399bf0d91c0a649"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a03c1fec3764f6b48337238b3355ee5bd"><td class="memItemLeft" align="right" valign="top">node_instance_set_test_method&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__node__instance.html#a03c1fec3764f6b48337238b3355ee5bd">set_test</a></td></tr>
+<tr class="separator:a03c1fec3764f6b48337238b3355ee5bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55fb4cadefcab9c74c3fb529c2560834"><td class="memItemLeft" align="right" valign="top">node_instance_set_value_method&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__node__instance.html#a55fb4cadefcab9c74c3fb529c2560834">set_value</a></td></tr>
+<tr class="separator:a55fb4cadefcab9c74c3fb529c2560834"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a20a256c54fab19a455ecf6deff76c6de"><td class="memItemLeft" align="right" valign="top">node_instance_release_method&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__node__instance.html#a20a256c54fab19a455ecf6deff76c6de">release_instance</a></td></tr>
+<tr class="separator:a20a256c54fab19a455ecf6deff76c6de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55f53419cd5b369b771153ca2598ebc5"><td class="memItemLeft" align="right" valign="top">union <a class="el" href="unionsnmp__variant__value.html">snmp_variant_value</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__node__instance.html#a55f53419cd5b369b771153ca2598ebc5">reference</a></td></tr>
+<tr class="separator:a55f53419cd5b369b771153ca2598ebc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad289957b34b4e55915fa79f37c4d9d54"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__node__instance.html#ad289957b34b4e55915fa79f37c4d9d54">reference_len</a></td></tr>
+<tr class="separator:ad289957b34b4e55915fa79f37c4d9d54"><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 node instance </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a4af17d17a971f1d11a186e6e1fc4411c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4af17d17a971f1d11a186e6e1fc4411c">&#9670;&nbsp;</a></span>access</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="snmp__core_8h.html#ad5a33687d1a6fcf970266b41b0633760">snmp_access_t</a> snmp_node_instance::access</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>one out of instance access types defined above (SNMP_NODE_INSTANCE_READ_ONLY,...) </p>
+
+</div>
+</div>
+<a id="af51206e0912a8402c395dcf3b623f8b9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af51206e0912a8402c395dcf3b623f8b9">&#9670;&nbsp;</a></span>asn1_type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_node_instance::asn1_type</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ASN type for this object (see <a class="el" href="snmp__asn1_8h.html">snmp_asn1.h</a> for definitions) </p>
+
+</div>
+</div>
+<a id="a17aa954aa34672f4a399bf0d91c0a649"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a17aa954aa34672f4a399bf0d91c0a649">&#9670;&nbsp;</a></span>get_value</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">node_instance_get_value_method snmp_node_instance::get_value</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>returns object value for the given object identifier. Return values &lt;0 to indicate an error </p>
+
+</div>
+</div>
+<a id="aedb358729c310c8e5b391dd256726a23"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aedb358729c310c8e5b391dd256726a23">&#9670;&nbsp;</a></span>instance_oid</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> snmp_node_instance::instance_oid</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>prefilled with the instance id requested; for get_instance() this is the exact oid requested; for get_next_instance() this is the relative starting point, stack expects relative oid of next node here </p>
+
+</div>
+</div>
+<a id="a4136f44404b25f4d4dacc6b6b76e77ac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4136f44404b25f4d4dacc6b6b76e77ac">&#9670;&nbsp;</a></span>node</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const struct <a class="el" href="structsnmp__node.html">snmp_node</a>* snmp_node_instance::node</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>prefilled with the node, get_instance() is called on; may be changed by user to any value to pass an arbitrary node between calls to get_instance() and get_value/test_value/set_value </p>
+
+</div>
+</div>
+<a id="a55f53419cd5b369b771153ca2598ebc5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a55f53419cd5b369b771153ca2598ebc5">&#9670;&nbsp;</a></span>reference</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">union <a class="el" href="unionsnmp__variant__value.html">snmp_variant_value</a> snmp_node_instance::reference</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>reference to pass arbitrary value between calls to get_instance() and get_value/test_value/set_value </p>
+
+</div>
+</div>
+<a id="ad289957b34b4e55915fa79f37c4d9d54"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad289957b34b4e55915fa79f37c4d9d54">&#9670;&nbsp;</a></span>reference_len</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t snmp_node_instance::reference_len</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>see reference (if reference is a pointer, the length of underlying data may be stored here or anything else) </p>
+
+</div>
+</div>
+<a id="a20a256c54fab19a455ecf6deff76c6de"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a20a256c54fab19a455ecf6deff76c6de">&#9670;&nbsp;</a></span>release_instance</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">node_instance_release_method snmp_node_instance::release_instance</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>called in any case when the instance is not required anymore by stack (useful for freeing memory allocated in get_instance/get_next_instance methods) </p>
+
+</div>
+</div>
+<a id="a03c1fec3764f6b48337238b3355ee5bd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a03c1fec3764f6b48337238b3355ee5bd">&#9670;&nbsp;</a></span>set_test</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">node_instance_set_test_method snmp_node_instance::set_test</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>tests length and/or range BEFORE setting </p>
+
+</div>
+</div>
+<a id="a55fb4cadefcab9c74c3fb529c2560834"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a55fb4cadefcab9c74c3fb529c2560834">&#9670;&nbsp;</a></span>set_value</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">node_instance_set_value_method snmp_node_instance::set_value</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>sets object value, only called when <a class="el" href="structsnmp__node__instance.html#a03c1fec3764f6b48337238b3355ee5bd">set_test()</a> was successful </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="snmp__core_8h.html">snmp_core.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="structsnmp__node__instance.html">snmp_node_instance</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsnmp__node__instance.js b/doc/doxygen/output/html/structsnmp__node__instance.js
new file mode 100644
index 0000000..f90a663
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__node__instance.js
@@ -0,0 +1,13 @@
+var structsnmp__node__instance =
+[
+    [ "access", "structsnmp__node__instance.html#a4af17d17a971f1d11a186e6e1fc4411c", null ],
+    [ "asn1_type", "structsnmp__node__instance.html#af51206e0912a8402c395dcf3b623f8b9", null ],
+    [ "get_value", "structsnmp__node__instance.html#a17aa954aa34672f4a399bf0d91c0a649", null ],
+    [ "instance_oid", "structsnmp__node__instance.html#aedb358729c310c8e5b391dd256726a23", null ],
+    [ "node", "structsnmp__node__instance.html#a4136f44404b25f4d4dacc6b6b76e77ac", null ],
+    [ "reference", "structsnmp__node__instance.html#a55f53419cd5b369b771153ca2598ebc5", null ],
+    [ "reference_len", "structsnmp__node__instance.html#ad289957b34b4e55915fa79f37c4d9d54", null ],
+    [ "release_instance", "structsnmp__node__instance.html#a20a256c54fab19a455ecf6deff76c6de", null ],
+    [ "set_test", "structsnmp__node__instance.html#a03c1fec3764f6b48337238b3355ee5bd", null ],
+    [ "set_value", "structsnmp__node__instance.html#a55fb4cadefcab9c74c3fb529c2560834", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structsnmp__obj__id.html b/doc/doxygen/output/html/structsnmp__obj__id.html
new file mode 100644
index 0000000..ff735c7
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__obj__id.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_obj_id 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__obj__id.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_obj_id Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;snmp_core.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>internal object identifier representation </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__core_8h.html">snmp_core.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="structsnmp__obj__id.html">snmp_obj_id</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsnmp__oid__range.html b/doc/doxygen/output/html/structsnmp__oid__range.html
new file mode 100644
index 0000000..87e173f
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__oid__range.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_oid_range 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__oid__range.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_oid_range Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;snmp_core.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>OID range structure </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__core_8h.html">snmp_core.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="structsnmp__oid__range.html">snmp_oid_range</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsnmp__scalar__array__node.html b/doc/doxygen/output/html/structsnmp__scalar__array__node.html
new file mode 100644
index 0000000..26b9580
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__scalar__array__node.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_scalar_array_node 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__scalar__array__node.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_scalar_array_node Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;snmp_scalar.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a34753e75ec873c92381bf9b6d00d411b"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structsnmp__leaf__node.html">snmp_leaf_node</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__scalar__array__node.html#a34753e75ec873c92381bf9b6d00d411b">node</a></td></tr>
+<tr class="separator:a34753e75ec873c92381bf9b6d00d411b"><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>basic scalar array node </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a34753e75ec873c92381bf9b6d00d411b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a34753e75ec873c92381bf9b6d00d411b">&#9670;&nbsp;</a></span>node</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structsnmp__leaf__node.html">snmp_leaf_node</a> snmp_scalar_array_node::node</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>inherited "base class" members </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="snmp__scalar_8h.html">snmp_scalar.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="structsnmp__scalar__array__node.html">snmp_scalar_array_node</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsnmp__scalar__array__node.js b/doc/doxygen/output/html/structsnmp__scalar__array__node.js
new file mode 100644
index 0000000..a485aec
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__scalar__array__node.js
@@ -0,0 +1,4 @@
+var structsnmp__scalar__array__node =
+[
+    [ "node", "structsnmp__scalar__array__node.html#a34753e75ec873c92381bf9b6d00d411b", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structsnmp__scalar__array__node__def.html b/doc/doxygen/output/html/structsnmp__scalar__array__node__def.html
new file mode 100644
index 0000000..d180761
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__scalar__array__node__def.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_scalar_array_node_def 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__scalar__array__node__def.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_scalar_array_node_def Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;snmp_scalar.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>scalar array node - a tree node which contains scalars only as children </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__scalar_8h.html">snmp_scalar.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="structsnmp__scalar__array__node__def.html">snmp_scalar_array_node_def</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsnmp__scalar__node.html b/doc/doxygen/output/html/structsnmp__scalar__node.html
new file mode 100644
index 0000000..7d74ea9
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__scalar__node.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_scalar_node 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__scalar__node.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_scalar_node Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;snmp_scalar.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a3c9e5cc0a5e22ececeeb3c512d25e3a1"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structsnmp__leaf__node.html">snmp_leaf_node</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__scalar__node.html#a3c9e5cc0a5e22ececeeb3c512d25e3a1">node</a></td></tr>
+<tr class="separator:a3c9e5cc0a5e22ececeeb3c512d25e3a1"><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>basic scalar node </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a3c9e5cc0a5e22ececeeb3c512d25e3a1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3c9e5cc0a5e22ececeeb3c512d25e3a1">&#9670;&nbsp;</a></span>node</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structsnmp__leaf__node.html">snmp_leaf_node</a> snmp_scalar_node::node</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>inherited "base class" members </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="snmp__scalar_8h.html">snmp_scalar.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="structsnmp__scalar__node.html">snmp_scalar_node</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsnmp__scalar__node.js b/doc/doxygen/output/html/structsnmp__scalar__node.js
new file mode 100644
index 0000000..99caa25
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__scalar__node.js
@@ -0,0 +1,4 @@
+var structsnmp__scalar__node =
+[
+    [ "node", "structsnmp__scalar__node.html#a3c9e5cc0a5e22ececeeb3c512d25e3a1", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structsnmp__table__col__def.html b/doc/doxygen/output/html/structsnmp__table__col__def.html
new file mode 100644
index 0000000..6a412b4
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__table__col__def.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_table_col_def 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__table__col__def.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_table_col_def Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;snmp_table.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>default (customizable) read/write table </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__table_8h.html">snmp_table.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="structsnmp__table__col__def.html">snmp_table_col_def</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsnmp__table__node.html b/doc/doxygen/output/html/structsnmp__table__node.html
new file mode 100644
index 0000000..97cf153
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__table__node.html
@@ -0,0 +1,182 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_table_node 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__table__node.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_table_node Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;snmp_table.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a3f12334e8d1556c36ce3e2206001ab18"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structsnmp__leaf__node.html">snmp_leaf_node</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__table__node.html#a3f12334e8d1556c36ce3e2206001ab18">node</a></td></tr>
+<tr class="separator:a3f12334e8d1556c36ce3e2206001ab18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac65c57e29faa456a9a710185109fe272"><td class="memItemLeft" align="right" valign="top">node_instance_get_value_method&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__table__node.html#ac65c57e29faa456a9a710185109fe272">get_value</a></td></tr>
+<tr class="separator:ac65c57e29faa456a9a710185109fe272"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acfbc5fa3361117fc4fa83642dde8aef0"><td class="memItemLeft" align="right" valign="top">node_instance_set_test_method&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__table__node.html#acfbc5fa3361117fc4fa83642dde8aef0">set_test</a></td></tr>
+<tr class="separator:acfbc5fa3361117fc4fa83642dde8aef0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2a3e8ac0dcce64604fc17e1de3c5a804"><td class="memItemLeft" align="right" valign="top">node_instance_set_value_method&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__table__node.html#a2a3e8ac0dcce64604fc17e1de3c5a804">set_value</a></td></tr>
+<tr class="separator:a2a3e8ac0dcce64604fc17e1de3c5a804"><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>table node </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="ac65c57e29faa456a9a710185109fe272"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac65c57e29faa456a9a710185109fe272">&#9670;&nbsp;</a></span>get_value</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">node_instance_get_value_method snmp_table_node::get_value</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>returns object value for the given object identifier </p>
+
+</div>
+</div>
+<a id="a3f12334e8d1556c36ce3e2206001ab18"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3f12334e8d1556c36ce3e2206001ab18">&#9670;&nbsp;</a></span>node</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structsnmp__leaf__node.html">snmp_leaf_node</a> snmp_table_node::node</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>inherited "base class" members </p>
+
+</div>
+</div>
+<a id="acfbc5fa3361117fc4fa83642dde8aef0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acfbc5fa3361117fc4fa83642dde8aef0">&#9670;&nbsp;</a></span>set_test</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">node_instance_set_test_method snmp_table_node::set_test</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>tests length and/or range BEFORE setting </p>
+
+</div>
+</div>
+<a id="a2a3e8ac0dcce64604fc17e1de3c5a804"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2a3e8ac0dcce64604fc17e1de3c5a804">&#9670;&nbsp;</a></span>set_value</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">node_instance_set_value_method snmp_table_node::set_value</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>sets object value, only called when <a class="el" href="structsnmp__table__node.html#acfbc5fa3361117fc4fa83642dde8aef0">set_test()</a> was successful </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="snmp__table_8h.html">snmp_table.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="structsnmp__table__node.html">snmp_table_node</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsnmp__table__node.js b/doc/doxygen/output/html/structsnmp__table__node.js
new file mode 100644
index 0000000..2cfead6
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__table__node.js
@@ -0,0 +1,7 @@
+var structsnmp__table__node =
+[
+    [ "get_value", "structsnmp__table__node.html#ac65c57e29faa456a9a710185109fe272", null ],
+    [ "node", "structsnmp__table__node.html#a3f12334e8d1556c36ce3e2206001ab18", null ],
+    [ "set_test", "structsnmp__table__node.html#acfbc5fa3361117fc4fa83642dde8aef0", null ],
+    [ "set_value", "structsnmp__table__node.html#a2a3e8ac0dcce64604fc17e1de3c5a804", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structsnmp__table__simple__node.html b/doc/doxygen/output/html/structsnmp__table__simple__node.html
new file mode 100644
index 0000000..b22740d
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__table__simple__node.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_table_simple_node 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__table__simple__node.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_table_simple_node Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;snmp_table.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>simple read-only table node </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__table_8h.html">snmp_table.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="structsnmp__table__simple__node.html">snmp_table_simple_node</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsnmp__threadsync__instance.html b/doc/doxygen/output/html/structsnmp__threadsync__instance.html
new file mode 100644
index 0000000..1e94694
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__threadsync__instance.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_threadsync_instance 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__threadsync__instance.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_threadsync_instance Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<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><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>
+</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="structsnmp__threadsync__instance.html">snmp_threadsync_instance</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsnmp__threadsync__node.html b/doc/doxygen/output/html/structsnmp__threadsync__node.html
new file mode 100644
index 0000000..38f893f
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__threadsync__node.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_threadsync_node 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__threadsync__node.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_threadsync_node Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<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>SNMP thread sync proxy leaf node </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>
+</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="structsnmp__threadsync__node.html">snmp_threadsync_node</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsnmp__tree__node.html b/doc/doxygen/output/html/structsnmp__tree__node.html
new file mode 100644
index 0000000..f1c7e14
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__tree__node.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_tree_node 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__tree__node.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_tree_node Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;snmp_core.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ad851f80c809606947c99cb26a9163386"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structsnmp__node.html">snmp_node</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__tree__node.html#ad851f80c809606947c99cb26a9163386">node</a></td></tr>
+<tr class="separator:ad851f80c809606947c99cb26a9163386"><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 tree node </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="ad851f80c809606947c99cb26a9163386"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad851f80c809606947c99cb26a9163386">&#9670;&nbsp;</a></span>node</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structsnmp__node.html">snmp_node</a> snmp_tree_node::node</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>inherited "base class" members </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="snmp__core_8h.html">snmp_core.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="structsnmp__tree__node.html">snmp_tree_node</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsnmp__tree__node.js b/doc/doxygen/output/html/structsnmp__tree__node.js
new file mode 100644
index 0000000..e2730af
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__tree__node.js
@@ -0,0 +1,4 @@
+var structsnmp__tree__node =
+[
+    [ "node", "structsnmp__tree__node.html#ad851f80c809606947c99cb26a9163386", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structsnmp__varbind.html b/doc/doxygen/output/html/structsnmp__varbind.html
new file mode 100644
index 0000000..fd001fd
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__varbind.html
@@ -0,0 +1,216 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_varbind 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__varbind.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">snmp_varbind Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;snmp.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a7388422ffb0607b209a39d6d3fcad40e"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__varbind.html#a7388422ffb0607b209a39d6d3fcad40e">next</a></td></tr>
+<tr class="separator:a7388422ffb0607b209a39d6d3fcad40e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a365abcc1f80d28dc8ffd07193099c760"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__varbind.html#a365abcc1f80d28dc8ffd07193099c760">prev</a></td></tr>
+<tr class="separator:a365abcc1f80d28dc8ffd07193099c760"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ace3a9e4dcdc9a5ec79a20c84946418a4"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__varbind.html#ace3a9e4dcdc9a5ec79a20c84946418a4">oid</a></td></tr>
+<tr class="separator:ace3a9e4dcdc9a5ec79a20c84946418a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad63223e45e04c08ea97859b8ba767950"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__varbind.html#ad63223e45e04c08ea97859b8ba767950">type</a></td></tr>
+<tr class="separator:ad63223e45e04c08ea97859b8ba767950"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab094577fac6c7cc16ad666c9970cdb85"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__varbind.html#ab094577fac6c7cc16ad666c9970cdb85">value_len</a></td></tr>
+<tr class="separator:ab094577fac6c7cc16ad666c9970cdb85"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a328227d7ae188a0a2feb95f8000aac45"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsnmp__varbind.html#a328227d7ae188a0a2feb95f8000aac45">value</a></td></tr>
+<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><h2 class="groupheader">Field Documentation</h2>
+<a id="a7388422ffb0607b209a39d6d3fcad40e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7388422ffb0607b209a39d6d3fcad40e">&#9670;&nbsp;</a></span>next</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a>* snmp_varbind::next</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>pointer to next varbind, NULL for last in list </p>
+
+</div>
+</div>
+<a id="ace3a9e4dcdc9a5ec79a20c84946418a4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ace3a9e4dcdc9a5ec79a20c84946418a4">&#9670;&nbsp;</a></span>oid</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> snmp_varbind::oid</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>object identifier </p>
+
+</div>
+</div>
+<a id="a365abcc1f80d28dc8ffd07193099c760"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a365abcc1f80d28dc8ffd07193099c760">&#9670;&nbsp;</a></span>prev</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a>* snmp_varbind::prev</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>pointer to previous varbind, NULL for first in list </p>
+
+</div>
+</div>
+<a id="ad63223e45e04c08ea97859b8ba767950"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad63223e45e04c08ea97859b8ba767950">&#9670;&nbsp;</a></span>type</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_varbind::type</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>value ASN1 type </p>
+
+</div>
+</div>
+<a id="a328227d7ae188a0a2feb95f8000aac45"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a328227d7ae188a0a2feb95f8000aac45">&#9670;&nbsp;</a></span>value</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* snmp_varbind::value</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>object value </p>
+
+</div>
+</div>
+<a id="ab094577fac6c7cc16ad666c9970cdb85"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab094577fac6c7cc16ad666c9970cdb85">&#9670;&nbsp;</a></span>value_len</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t snmp_varbind::value_len</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>object value length </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="apps_2snmp_8h.html">snmp.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="structsnmp__varbind.html">snmp_varbind</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsnmp__varbind.js b/doc/doxygen/output/html/structsnmp__varbind.js
new file mode 100644
index 0000000..88579d2
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__varbind.js
@@ -0,0 +1,9 @@
+var structsnmp__varbind =
+[
+    [ "next", "structsnmp__varbind.html#a7388422ffb0607b209a39d6d3fcad40e", null ],
+    [ "oid", "structsnmp__varbind.html#ace3a9e4dcdc9a5ec79a20c84946418a4", null ],
+    [ "prev", "structsnmp__varbind.html#a365abcc1f80d28dc8ffd07193099c760", null ],
+    [ "type", "structsnmp__varbind.html#ad63223e45e04c08ea97859b8ba767950", null ],
+    [ "value", "structsnmp__varbind.html#a328227d7ae188a0a2feb95f8000aac45", null ],
+    [ "value_len", "structsnmp__varbind.html#ab094577fac6c7cc16ad666c9970cdb85", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structsnmp__varbind__len.html b/doc/doxygen/output/html/structsnmp__varbind__len.html
new file mode 100644
index 0000000..ec27dfd
--- /dev/null
+++ b/doc/doxygen/output/html/structsnmp__varbind__len.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_varbind_len 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsnmp__varbind__len.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_varbind_len Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;snmp_msg.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A helper struct keeping length information about varbinds </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/apps/snmp/<a class="el" href="snmp__msg_8h.html">snmp_msg.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="structsnmp__varbind__len.html">snmp_varbind_len</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsntp__msg.html b/doc/doxygen/output/html/structsntp__msg.html
new file mode 100644
index 0000000..8d0611a
--- /dev/null
+++ b/doc/doxygen/output/html/structsntp__msg.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: sntp_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsntp__msg.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">sntp_msg Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SNTP packet format (without optional fields) Timestamps are coded as 64 bits:</p><ul>
+<li>signed 32 bits seconds since Feb 07, 2036, 06:28:16 UTC (epoch 1)</li>
+<li>unsigned 32 bits seconds fraction (2^32 = 1 second) </li>
+</ul>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/apps/sntp/<a class="el" href="sntp_8c.html">sntp.c</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="structsntp__msg.html">sntp_msg</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsntp__server.html b/doc/doxygen/output/html/structsntp__server.html
new file mode 100644
index 0000000..a4e0c01
--- /dev/null
+++ b/doc/doxygen/output/html/structsntp__server.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: sntp_server 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsntp__server.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">sntp_server Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a2e9283bb8f94930fd2a2c3f24fc4b40d"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsntp__server.html#a2e9283bb8f94930fd2a2c3f24fc4b40d">reachability</a></td></tr>
+<tr class="separator:a2e9283bb8f94930fd2a2c3f24fc4b40d"><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>Names/Addresses of servers </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a2e9283bb8f94930fd2a2c3f24fc4b40d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2e9283bb8f94930fd2a2c3f24fc4b40d">&#9670;&nbsp;</a></span>reachability</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t sntp_server::reachability</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Reachability shift register as described in RFC 5905 </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/apps/sntp/<a class="el" href="sntp_8c.html">sntp.c</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="structsntp__server.html">sntp_server</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsntp__server.js b/doc/doxygen/output/html/structsntp__server.js
new file mode 100644
index 0000000..5d64202
--- /dev/null
+++ b/doc/doxygen/output/html/structsntp__server.js
@@ -0,0 +1,4 @@
+var structsntp__server =
+[
+    [ "reachability", "structsntp__server.html#a2e9283bb8f94930fd2a2c3f24fc4b40d", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structsntp__time.html b/doc/doxygen/output/html/structsntp__time.html
new file mode 100644
index 0000000..9522f00
--- /dev/null
+++ b/doc/doxygen/output/html/structsntp__time.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: sntp_time 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsntp__time.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">sntp_time Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>64-bit NTP timestamp, in network byte order. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/apps/sntp/<a class="el" href="sntp_8c.html">sntp.c</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="structsntp__time.html">sntp_time</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structsntp__timestamps.html b/doc/doxygen/output/html/structsntp__timestamps.html
new file mode 100644
index 0000000..b5add6d
--- /dev/null
+++ b/doc/doxygen/output/html/structsntp__timestamps.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: sntp_timestamps 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structsntp__timestamps.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">sntp_timestamps Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Timestamps to be extracted from the NTP header. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/apps/sntp/<a class="el" href="sntp_8c.html">sntp.c</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="structsntp__timestamps.html">sntp_timestamps</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structstats__.html b/doc/doxygen/output/html/structstats__.html
new file mode 100644
index 0000000..dfd3bc9
--- /dev/null
+++ b/doc/doxygen/output/html/structstats__.html
@@ -0,0 +1,403 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: stats_ 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structstats__.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">stats_ Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;stats.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a67759c9b0059bf569f9f771df23924eb"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__proto.html">stats_proto</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__.html#a67759c9b0059bf569f9f771df23924eb">link</a></td></tr>
+<tr class="separator:a67759c9b0059bf569f9f771df23924eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa52547cb08dc828927494dc485bb69f3"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__proto.html">stats_proto</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__.html#aa52547cb08dc828927494dc485bb69f3">etharp</a></td></tr>
+<tr class="separator:aa52547cb08dc828927494dc485bb69f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a81fcccf03ab0d4e31423f39d0c880302"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__proto.html">stats_proto</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__.html#a81fcccf03ab0d4e31423f39d0c880302">ip_frag</a></td></tr>
+<tr class="separator:a81fcccf03ab0d4e31423f39d0c880302"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a40f5b637d083896a07a3482ede23b7ed"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__proto.html">stats_proto</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__.html#a40f5b637d083896a07a3482ede23b7ed">ip</a></td></tr>
+<tr class="separator:a40f5b637d083896a07a3482ede23b7ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a10bc430163b0e6db91338aded5b7019a"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__proto.html">stats_proto</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__.html#a10bc430163b0e6db91338aded5b7019a">icmp</a></td></tr>
+<tr class="separator:a10bc430163b0e6db91338aded5b7019a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a877e369c2abef97f13492faa838e2271"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__igmp.html">stats_igmp</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__.html#a877e369c2abef97f13492faa838e2271">igmp</a></td></tr>
+<tr class="separator:a877e369c2abef97f13492faa838e2271"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a626e03d4bded6480582789cfd17d4063"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__proto.html">stats_proto</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__.html#a626e03d4bded6480582789cfd17d4063">udp</a></td></tr>
+<tr class="separator:a626e03d4bded6480582789cfd17d4063"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32ef1aaa427d62a5c7890de0ac23fe86"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__proto.html">stats_proto</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__.html#a32ef1aaa427d62a5c7890de0ac23fe86">tcp</a></td></tr>
+<tr class="separator:a32ef1aaa427d62a5c7890de0ac23fe86"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a656444f95080c6a3d474f73a6fcd9b1c"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__mem.html">stats_mem</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__.html#a656444f95080c6a3d474f73a6fcd9b1c">mem</a></td></tr>
+<tr class="separator:a656444f95080c6a3d474f73a6fcd9b1c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa75d6b389e94b0f619b5db0daaf569fc"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__mem.html">stats_mem</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__.html#aa75d6b389e94b0f619b5db0daaf569fc">memp</a> [MEMP_MAX]</td></tr>
+<tr class="separator:aa75d6b389e94b0f619b5db0daaf569fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a317123da6c92aa9d2fa40e8060357035"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__sys.html">stats_sys</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__.html#a317123da6c92aa9d2fa40e8060357035">sys</a></td></tr>
+<tr class="separator:a317123da6c92aa9d2fa40e8060357035"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc0942a5bc26735cf059099636b85336"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__proto.html">stats_proto</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__.html#afc0942a5bc26735cf059099636b85336">ip6</a></td></tr>
+<tr class="separator:afc0942a5bc26735cf059099636b85336"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25a6b5940e32d53a066aa1bbc2028c03"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__proto.html">stats_proto</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__.html#a25a6b5940e32d53a066aa1bbc2028c03">icmp6</a></td></tr>
+<tr class="separator:a25a6b5940e32d53a066aa1bbc2028c03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7373df7bc44bb9913a42c0bc7b3039cf"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__proto.html">stats_proto</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__.html#a7373df7bc44bb9913a42c0bc7b3039cf">ip6_frag</a></td></tr>
+<tr class="separator:a7373df7bc44bb9913a42c0bc7b3039cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab0ad1d07dff25cd3e4a8e5be607497f8"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__igmp.html">stats_igmp</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__.html#ab0ad1d07dff25cd3e4a8e5be607497f8">mld6</a></td></tr>
+<tr class="separator:ab0ad1d07dff25cd3e4a8e5be607497f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab348a3a4b593b05d7df1293a06af8adf"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__proto.html">stats_proto</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__.html#ab348a3a4b593b05d7df1293a06af8adf">nd6</a></td></tr>
+<tr class="separator:ab348a3a4b593b05d7df1293a06af8adf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac001c065c56c26c3952b19b9ce0d5832"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structstats__mib2.html">stats_mib2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__.html#ac001c065c56c26c3952b19b9ce0d5832">mib2</a></td></tr>
+<tr class="separator:ac001c065c56c26c3952b19b9ce0d5832"><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>lwIP stats container </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="aa52547cb08dc828927494dc485bb69f3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa52547cb08dc828927494dc485bb69f3">&#9670;&nbsp;</a></span>etharp</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__proto.html">stats_proto</a> stats_::etharp</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ARP </p>
+
+</div>
+</div>
+<a id="a10bc430163b0e6db91338aded5b7019a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a10bc430163b0e6db91338aded5b7019a">&#9670;&nbsp;</a></span>icmp</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__proto.html">stats_proto</a> stats_::icmp</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ICMP </p>
+
+</div>
+</div>
+<a id="a25a6b5940e32d53a066aa1bbc2028c03"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a25a6b5940e32d53a066aa1bbc2028c03">&#9670;&nbsp;</a></span>icmp6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__proto.html">stats_proto</a> stats_::icmp6</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ICMP6 </p>
+
+</div>
+</div>
+<a id="a877e369c2abef97f13492faa838e2271"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a877e369c2abef97f13492faa838e2271">&#9670;&nbsp;</a></span>igmp</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__igmp.html">stats_igmp</a> stats_::igmp</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IGMP </p>
+
+</div>
+</div>
+<a id="a40f5b637d083896a07a3482ede23b7ed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a40f5b637d083896a07a3482ede23b7ed">&#9670;&nbsp;</a></span>ip</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__proto.html">stats_proto</a> stats_::ip</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IP </p>
+
+</div>
+</div>
+<a id="afc0942a5bc26735cf059099636b85336"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afc0942a5bc26735cf059099636b85336">&#9670;&nbsp;</a></span>ip6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__proto.html">stats_proto</a> stats_::ip6</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IPv6 </p>
+
+</div>
+</div>
+<a id="a7373df7bc44bb9913a42c0bc7b3039cf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7373df7bc44bb9913a42c0bc7b3039cf">&#9670;&nbsp;</a></span>ip6_frag</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__proto.html">stats_proto</a> stats_::ip6_frag</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IPv6 fragmentation </p>
+
+</div>
+</div>
+<a id="a81fcccf03ab0d4e31423f39d0c880302"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a81fcccf03ab0d4e31423f39d0c880302">&#9670;&nbsp;</a></span>ip_frag</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__proto.html">stats_proto</a> stats_::ip_frag</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Fragmentation </p>
+
+</div>
+</div>
+<a id="a67759c9b0059bf569f9f771df23924eb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a67759c9b0059bf569f9f771df23924eb">&#9670;&nbsp;</a></span>link</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__proto.html">stats_proto</a> stats_::link</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Link level </p>
+
+</div>
+</div>
+<a id="a656444f95080c6a3d474f73a6fcd9b1c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a656444f95080c6a3d474f73a6fcd9b1c">&#9670;&nbsp;</a></span>mem</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__mem.html">stats_mem</a> stats_::mem</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Heap </p>
+
+</div>
+</div>
+<a id="aa75d6b389e94b0f619b5db0daaf569fc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa75d6b389e94b0f619b5db0daaf569fc">&#9670;&nbsp;</a></span>memp</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__mem.html">stats_mem</a>* stats_::memp[MEMP_MAX]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Internal memory pools </p>
+
+</div>
+</div>
+<a id="ac001c065c56c26c3952b19b9ce0d5832"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac001c065c56c26c3952b19b9ce0d5832">&#9670;&nbsp;</a></span>mib2</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__mib2.html">stats_mib2</a> stats_::mib2</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>SNMP MIB2 </p>
+
+</div>
+</div>
+<a id="ab0ad1d07dff25cd3e4a8e5be607497f8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab0ad1d07dff25cd3e4a8e5be607497f8">&#9670;&nbsp;</a></span>mld6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__igmp.html">stats_igmp</a> stats_::mld6</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Multicast listener discovery </p>
+
+</div>
+</div>
+<a id="ab348a3a4b593b05d7df1293a06af8adf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab348a3a4b593b05d7df1293a06af8adf">&#9670;&nbsp;</a></span>nd6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__proto.html">stats_proto</a> stats_::nd6</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Neighbor discovery </p>
+
+</div>
+</div>
+<a id="a317123da6c92aa9d2fa40e8060357035"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a317123da6c92aa9d2fa40e8060357035">&#9670;&nbsp;</a></span>sys</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__sys.html">stats_sys</a> stats_::sys</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>System </p>
+
+</div>
+</div>
+<a id="a32ef1aaa427d62a5c7890de0ac23fe86"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a32ef1aaa427d62a5c7890de0ac23fe86">&#9670;&nbsp;</a></span>tcp</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__proto.html">stats_proto</a> stats_::tcp</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TCP </p>
+
+</div>
+</div>
+<a id="a626e03d4bded6480582789cfd17d4063"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a626e03d4bded6480582789cfd17d4063">&#9670;&nbsp;</a></span>udp</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structstats__proto.html">stats_proto</a> stats_::udp</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>UDP </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="stats_8h.html">stats.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="structstats__.html">stats_</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structstats__.js b/doc/doxygen/output/html/structstats__.js
new file mode 100644
index 0000000..f82a7a4
--- /dev/null
+++ b/doc/doxygen/output/html/structstats__.js
@@ -0,0 +1,20 @@
+var structstats__ =
+[
+    [ "etharp", "structstats__.html#aa52547cb08dc828927494dc485bb69f3", null ],
+    [ "icmp", "structstats__.html#a10bc430163b0e6db91338aded5b7019a", null ],
+    [ "icmp6", "structstats__.html#a25a6b5940e32d53a066aa1bbc2028c03", null ],
+    [ "igmp", "structstats__.html#a877e369c2abef97f13492faa838e2271", null ],
+    [ "ip", "structstats__.html#a40f5b637d083896a07a3482ede23b7ed", null ],
+    [ "ip6", "structstats__.html#afc0942a5bc26735cf059099636b85336", null ],
+    [ "ip6_frag", "structstats__.html#a7373df7bc44bb9913a42c0bc7b3039cf", null ],
+    [ "ip_frag", "structstats__.html#a81fcccf03ab0d4e31423f39d0c880302", null ],
+    [ "link", "structstats__.html#a67759c9b0059bf569f9f771df23924eb", null ],
+    [ "mem", "structstats__.html#a656444f95080c6a3d474f73a6fcd9b1c", null ],
+    [ "memp", "structstats__.html#aa75d6b389e94b0f619b5db0daaf569fc", null ],
+    [ "mib2", "structstats__.html#ac001c065c56c26c3952b19b9ce0d5832", null ],
+    [ "mld6", "structstats__.html#ab0ad1d07dff25cd3e4a8e5be607497f8", null ],
+    [ "nd6", "structstats__.html#ab348a3a4b593b05d7df1293a06af8adf", null ],
+    [ "sys", "structstats__.html#a317123da6c92aa9d2fa40e8060357035", null ],
+    [ "tcp", "structstats__.html#a32ef1aaa427d62a5c7890de0ac23fe86", null ],
+    [ "udp", "structstats__.html#a626e03d4bded6480582789cfd17d4063", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structstats__igmp.html b/doc/doxygen/output/html/structstats__igmp.html
new file mode 100644
index 0000000..4bbc388
--- /dev/null
+++ b/doc/doxygen/output/html/structstats__igmp.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: stats_igmp 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structstats__igmp.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">stats_igmp Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;stats.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>IGMP stats </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="stats_8h.html">stats.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="structstats__igmp.html">stats_igmp</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structstats__mem.html b/doc/doxygen/output/html/structstats__mem.html
new file mode 100644
index 0000000..c1a57d0
--- /dev/null
+++ b/doc/doxygen/output/html/structstats__mem.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: stats_mem 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structstats__mem.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">stats_mem Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;stats.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Memory stats </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="stats_8h.html">stats.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="structstats__mem.html">stats_mem</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structstats__mib2.html b/doc/doxygen/output/html/structstats__mib2.html
new file mode 100644
index 0000000..c3a6aa1
--- /dev/null
+++ b/doc/doxygen/output/html/structstats__mib2.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: stats_mib2 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structstats__mib2.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">stats_mib2 Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;stats.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SNMP MIB2 stats </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="stats_8h.html">stats.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="structstats__mib2.html">stats_mib2</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structstats__mib2__netif__ctrs.html b/doc/doxygen/output/html/structstats__mib2__netif__ctrs.html
new file mode 100644
index 0000000..6c805fb
--- /dev/null
+++ b/doc/doxygen/output/html/structstats__mib2__netif__ctrs.html
@@ -0,0 +1,301 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: stats_mib2_netif_ctrs 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structstats__mib2__netif__ctrs.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">stats_mib2_netif_ctrs 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__netif.html">Network interface (NETIF)</a> &raquo; <a class="el" href="group__netif__mib2.html">MIB2 statistics</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;stats.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a7e9ddf9b4a17748a9d3f041c1d24ba8e"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__mib2__netif__ctrs.html#a7e9ddf9b4a17748a9d3f041c1d24ba8e">ifinoctets</a></td></tr>
+<tr class="separator:a7e9ddf9b4a17748a9d3f041c1d24ba8e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ed42d6329a9616669ba21789fa001d8"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__mib2__netif__ctrs.html#a9ed42d6329a9616669ba21789fa001d8">ifinucastpkts</a></td></tr>
+<tr class="separator:a9ed42d6329a9616669ba21789fa001d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a111f08290b3c6944108237cefba066dd"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__mib2__netif__ctrs.html#a111f08290b3c6944108237cefba066dd">ifinnucastpkts</a></td></tr>
+<tr class="separator:a111f08290b3c6944108237cefba066dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a767e6b835d5ad2f9b73751de2b0947"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__mib2__netif__ctrs.html#a4a767e6b835d5ad2f9b73751de2b0947">ifindiscards</a></td></tr>
+<tr class="separator:a4a767e6b835d5ad2f9b73751de2b0947"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afda1a14dc79bb65a33f97f9fb467ec1d"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__mib2__netif__ctrs.html#afda1a14dc79bb65a33f97f9fb467ec1d">ifinerrors</a></td></tr>
+<tr class="separator:afda1a14dc79bb65a33f97f9fb467ec1d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac34eb01b42f22b1e49ca7c9734e737aa"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__mib2__netif__ctrs.html#ac34eb01b42f22b1e49ca7c9734e737aa">ifinunknownprotos</a></td></tr>
+<tr class="separator:ac34eb01b42f22b1e49ca7c9734e737aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a24151d13a55452518e5f7832f48bd5a7"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__mib2__netif__ctrs.html#a24151d13a55452518e5f7832f48bd5a7">ifoutoctets</a></td></tr>
+<tr class="separator:a24151d13a55452518e5f7832f48bd5a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a24aba9660a2951027b23d4118b57c471"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__mib2__netif__ctrs.html#a24aba9660a2951027b23d4118b57c471">ifoutucastpkts</a></td></tr>
+<tr class="separator:a24aba9660a2951027b23d4118b57c471"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd3264670c39cc0d721a35cb6650f8d7"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__mib2__netif__ctrs.html#afd3264670c39cc0d721a35cb6650f8d7">ifoutnucastpkts</a></td></tr>
+<tr class="separator:afd3264670c39cc0d721a35cb6650f8d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a2aec508fd4466ca8bab10d8dc2c842"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__mib2__netif__ctrs.html#a3a2aec508fd4466ca8bab10d8dc2c842">ifoutdiscards</a></td></tr>
+<tr class="separator:a3a2aec508fd4466ca8bab10d8dc2c842"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a91b60bb78759c9b655a74bb4fae3346e"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstats__mib2__netif__ctrs.html#a91b60bb78759c9b655a74bb4fae3346e">ifouterrors</a></td></tr>
+<tr class="separator:a91b60bb78759c9b655a74bb4fae3346e"><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 MIB2 interface stats </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a4a767e6b835d5ad2f9b73751de2b0947"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4a767e6b835d5ad2f9b73751de2b0947">&#9670;&nbsp;</a></span>ifindiscards</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t stats_mib2_netif_ctrs::ifindiscards</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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 </p>
+
+</div>
+</div>
+<a id="afda1a14dc79bb65a33f97f9fb467ec1d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afda1a14dc79bb65a33f97f9fb467ec1d">&#9670;&nbsp;</a></span>ifinerrors</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t stats_mib2_netif_ctrs::ifinerrors</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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. </p>
+
+</div>
+</div>
+<a id="a111f08290b3c6944108237cefba066dd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a111f08290b3c6944108237cefba066dd">&#9670;&nbsp;</a></span>ifinnucastpkts</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t stats_mib2_netif_ctrs::ifinnucastpkts</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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 </p>
+
+</div>
+</div>
+<a id="a7e9ddf9b4a17748a9d3f041c1d24ba8e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7e9ddf9b4a17748a9d3f041c1d24ba8e">&#9670;&nbsp;</a></span>ifinoctets</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t stats_mib2_netif_ctrs::ifinoctets</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The total number of octets received on the interface, including framing characters </p>
+
+</div>
+</div>
+<a id="a9ed42d6329a9616669ba21789fa001d8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ed42d6329a9616669ba21789fa001d8">&#9670;&nbsp;</a></span>ifinucastpkts</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t stats_mib2_netif_ctrs::ifinucastpkts</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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 </p>
+
+</div>
+</div>
+<a id="ac34eb01b42f22b1e49ca7c9734e737aa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac34eb01b42f22b1e49ca7c9734e737aa">&#9670;&nbsp;</a></span>ifinunknownprotos</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t stats_mib2_netif_ctrs::ifinunknownprotos</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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 </p>
+
+</div>
+</div>
+<a id="a3a2aec508fd4466ca8bab10d8dc2c842"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3a2aec508fd4466ca8bab10d8dc2c842">&#9670;&nbsp;</a></span>ifoutdiscards</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t stats_mib2_netif_ctrs::ifoutdiscards</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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. </p>
+
+</div>
+</div>
+<a id="a91b60bb78759c9b655a74bb4fae3346e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a91b60bb78759c9b655a74bb4fae3346e">&#9670;&nbsp;</a></span>ifouterrors</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t stats_mib2_netif_ctrs::ifouterrors</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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. </p>
+
+</div>
+</div>
+<a id="afd3264670c39cc0d721a35cb6650f8d7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afd3264670c39cc0d721a35cb6650f8d7">&#9670;&nbsp;</a></span>ifoutnucastpkts</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t stats_mib2_netif_ctrs::ifoutnucastpkts</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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. </p>
+
+</div>
+</div>
+<a id="a24151d13a55452518e5f7832f48bd5a7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a24151d13a55452518e5f7832f48bd5a7">&#9670;&nbsp;</a></span>ifoutoctets</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t stats_mib2_netif_ctrs::ifoutoctets</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The total number of octets transmitted out of the interface, including framing characters. </p>
+
+</div>
+</div>
+<a id="a24aba9660a2951027b23d4118b57c471"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a24aba9660a2951027b23d4118b57c471">&#9670;&nbsp;</a></span>ifoutucastpkts</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t stats_mib2_netif_ctrs::ifoutucastpkts</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>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. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="stats_8h.html">stats.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="structstats__mib2__netif__ctrs.html">stats_mib2_netif_ctrs</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structstats__mib2__netif__ctrs.js b/doc/doxygen/output/html/structstats__mib2__netif__ctrs.js
new file mode 100644
index 0000000..ab2b5e9
--- /dev/null
+++ b/doc/doxygen/output/html/structstats__mib2__netif__ctrs.js
@@ -0,0 +1,14 @@
+var structstats__mib2__netif__ctrs =
+[
+    [ "ifindiscards", "structstats__mib2__netif__ctrs.html#a4a767e6b835d5ad2f9b73751de2b0947", null ],
+    [ "ifinerrors", "structstats__mib2__netif__ctrs.html#afda1a14dc79bb65a33f97f9fb467ec1d", null ],
+    [ "ifinnucastpkts", "structstats__mib2__netif__ctrs.html#a111f08290b3c6944108237cefba066dd", null ],
+    [ "ifinoctets", "structstats__mib2__netif__ctrs.html#a7e9ddf9b4a17748a9d3f041c1d24ba8e", null ],
+    [ "ifinucastpkts", "structstats__mib2__netif__ctrs.html#a9ed42d6329a9616669ba21789fa001d8", null ],
+    [ "ifinunknownprotos", "structstats__mib2__netif__ctrs.html#ac34eb01b42f22b1e49ca7c9734e737aa", null ],
+    [ "ifoutdiscards", "structstats__mib2__netif__ctrs.html#a3a2aec508fd4466ca8bab10d8dc2c842", null ],
+    [ "ifouterrors", "structstats__mib2__netif__ctrs.html#a91b60bb78759c9b655a74bb4fae3346e", null ],
+    [ "ifoutnucastpkts", "structstats__mib2__netif__ctrs.html#afd3264670c39cc0d721a35cb6650f8d7", null ],
+    [ "ifoutoctets", "structstats__mib2__netif__ctrs.html#a24151d13a55452518e5f7832f48bd5a7", null ],
+    [ "ifoutucastpkts", "structstats__mib2__netif__ctrs.html#a24aba9660a2951027b23d4118b57c471", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structstats__proto.html b/doc/doxygen/output/html/structstats__proto.html
new file mode 100644
index 0000000..6ff17cf
--- /dev/null
+++ b/doc/doxygen/output/html/structstats__proto.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: stats_proto 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structstats__proto.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">stats_proto Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;stats.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Protocol related stats </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="stats_8h.html">stats.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="structstats__proto.html">stats_proto</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structstats__sys.html b/doc/doxygen/output/html/structstats__sys.html
new file mode 100644
index 0000000..c47100d
--- /dev/null
+++ b/doc/doxygen/output/html/structstats__sys.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: stats_sys 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structstats__sys.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">stats_sys Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;stats.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>System stats </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="stats_8h.html">stats.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="structstats__sys.html">stats_sys</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structstats__syselem.html b/doc/doxygen/output/html/structstats__syselem.html
new file mode 100644
index 0000000..e8ebf5c
--- /dev/null
+++ b/doc/doxygen/output/html/structstats__syselem.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: stats_syselem 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structstats__syselem.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">stats_syselem Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;stats.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>System element stats </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="stats_8h.html">stats.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="structstats__syselem.html">stats_syselem</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structt_c_g_i.html b/doc/doxygen/output/html/structt_c_g_i.html
new file mode 100644
index 0000000..527a218
--- /dev/null
+++ b/doc/doxygen/output/html/structt_c_g_i.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: tCGI 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structt_c_g_i.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">tCGI Struct Reference<div class="ingroups"><a class="el" href="group__apps.html">Applications</a> &raquo; <a class="el" href="group__httpd.html">HTTP server</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;httpd.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Structure defining the base filename (URL) of a CGI and the associated function which is to be called when that URL is requested. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/apps/<a class="el" href="httpd_8h.html">httpd.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="structt_c_g_i.html">tCGI</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structtcp__ext__arg__callbacks.html b/doc/doxygen/output/html/structtcp__ext__arg__callbacks.html
new file mode 100644
index 0000000..c321c05
--- /dev/null
+++ b/doc/doxygen/output/html/structtcp__ext__arg__callbacks.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: tcp_ext_arg_callbacks 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structtcp__ext__arg__callbacks.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">tcp_ext_arg_callbacks Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;tcp.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ace586d5d376b42465927a4fd8688c24b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="tcp_8h.html#a20881e537f5be7847d88fe2a0c8fd2cd">tcp_extarg_callback_pcb_destroyed_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtcp__ext__arg__callbacks.html#ace586d5d376b42465927a4fd8688c24b">destroy</a></td></tr>
+<tr class="separator:ace586d5d376b42465927a4fd8688c24b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a86b5816e8285378813963d09272b050a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="tcp_8h.html#aba649c5bdf19d47e39643392b6d88588">tcp_extarg_callback_passive_open_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtcp__ext__arg__callbacks.html#a86b5816e8285378813963d09272b050a">passive_open</a></td></tr>
+<tr class="separator:a86b5816e8285378813963d09272b050a"><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>A table of callback functions that is invoked for ext arguments </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="ace586d5d376b42465927a4fd8688c24b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ace586d5d376b42465927a4fd8688c24b">&#9670;&nbsp;</a></span>destroy</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="tcp_8h.html#a20881e537f5be7847d88fe2a0c8fd2cd">tcp_extarg_callback_pcb_destroyed_fn</a> tcp_ext_arg_callbacks::destroy</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="tcp_8h.html#a20881e537f5be7847d88fe2a0c8fd2cd">tcp_extarg_callback_pcb_destroyed_fn</a> </p>
+
+</div>
+</div>
+<a id="a86b5816e8285378813963d09272b050a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a86b5816e8285378813963d09272b050a">&#9670;&nbsp;</a></span>passive_open</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="tcp_8h.html#aba649c5bdf19d47e39643392b6d88588">tcp_extarg_callback_passive_open_fn</a> tcp_ext_arg_callbacks::passive_open</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="tcp_8h.html#aba649c5bdf19d47e39643392b6d88588">tcp_extarg_callback_passive_open_fn</a> </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="tcp_8h.html">tcp.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="structtcp__ext__arg__callbacks.html">tcp_ext_arg_callbacks</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structtcp__ext__arg__callbacks.js b/doc/doxygen/output/html/structtcp__ext__arg__callbacks.js
new file mode 100644
index 0000000..a1e6524
--- /dev/null
+++ b/doc/doxygen/output/html/structtcp__ext__arg__callbacks.js
@@ -0,0 +1,5 @@
+var structtcp__ext__arg__callbacks =
+[
+    [ "destroy", "structtcp__ext__arg__callbacks.html#ace586d5d376b42465927a4fd8688c24b", null ],
+    [ "passive_open", "structtcp__ext__arg__callbacks.html#a86b5816e8285378813963d09272b050a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structtcp__pcb.html b/doc/doxygen/output/html/structtcp__pcb.html
new file mode 100644
index 0000000..69e19b0
--- /dev/null
+++ b/doc/doxygen/output/html/structtcp__pcb.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: tcp_pcb 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structtcp__pcb.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">tcp_pcb Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;tcp.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a0c4f101d55debee0d8fad86a7eb4f76f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtcp__pcb.html#a0c4f101d55debee0d8fad86a7eb4f76f">local_ip</a></td></tr>
+<tr class="separator:a0c4f101d55debee0d8fad86a7eb4f76f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2aed7ffb5fb83aabe68b36f097d99260"><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="structtcp__pcb.html#a2aed7ffb5fb83aabe68b36f097d99260">next</a></td></tr>
+<tr class="separator:a2aed7ffb5fb83aabe68b36f097d99260"><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>the TCP protocol control block </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a0c4f101d55debee0d8fad86a7eb4f76f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0c4f101d55debee0d8fad86a7eb4f76f">&#9670;&nbsp;</a></span>local_ip</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> tcp_pcb::local_ip</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>common PCB members </p>
+
+</div>
+</div>
+<a id="a2aed7ffb5fb83aabe68b36f097d99260"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2aed7ffb5fb83aabe68b36f097d99260">&#9670;&nbsp;</a></span>next</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a>* tcp_pcb::next</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>protocol specific PCB members </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="tcp_8h.html">tcp.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="structtcp__pcb.html">tcp_pcb</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structtcp__pcb.js b/doc/doxygen/output/html/structtcp__pcb.js
new file mode 100644
index 0000000..2e5675a
--- /dev/null
+++ b/doc/doxygen/output/html/structtcp__pcb.js
@@ -0,0 +1,5 @@
+var structtcp__pcb =
+[
+    [ "local_ip", "structtcp__pcb.html#a0c4f101d55debee0d8fad86a7eb4f76f", null ],
+    [ "next", "structtcp__pcb.html#a2aed7ffb5fb83aabe68b36f097d99260", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structtcp__pcb__listen.html b/doc/doxygen/output/html/structtcp__pcb__listen.html
new file mode 100644
index 0000000..26030f4
--- /dev/null
+++ b/doc/doxygen/output/html/structtcp__pcb__listen.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: tcp_pcb_listen 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structtcp__pcb__listen.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">tcp_pcb_listen Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;tcp.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a8a4f7b0551a0c6926a08ea5b6b3d5987"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtcp__pcb__listen.html#a8a4f7b0551a0c6926a08ea5b6b3d5987">local_ip</a></td></tr>
+<tr class="separator:a8a4f7b0551a0c6926a08ea5b6b3d5987"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0483d0c2a2758dcef18689be2efbdf34"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structtcp__pcb__listen.html">tcp_pcb_listen</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtcp__pcb__listen.html#a0483d0c2a2758dcef18689be2efbdf34">next</a></td></tr>
+<tr class="separator:a0483d0c2a2758dcef18689be2efbdf34"><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>the TCP protocol control block for listening pcbs </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a8a4f7b0551a0c6926a08ea5b6b3d5987"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8a4f7b0551a0c6926a08ea5b6b3d5987">&#9670;&nbsp;</a></span>local_ip</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> tcp_pcb_listen::local_ip</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Common members of all PCB types </p>
+
+</div>
+</div>
+<a id="a0483d0c2a2758dcef18689be2efbdf34"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0483d0c2a2758dcef18689be2efbdf34">&#9670;&nbsp;</a></span>next</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structtcp__pcb__listen.html">tcp_pcb_listen</a>* tcp_pcb_listen::next</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Protocol specific PCB members </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="tcp_8h.html">tcp.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="structtcp__pcb__listen.html">tcp_pcb_listen</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structtcp__pcb__listen.js b/doc/doxygen/output/html/structtcp__pcb__listen.js
new file mode 100644
index 0000000..7df06d3
--- /dev/null
+++ b/doc/doxygen/output/html/structtcp__pcb__listen.js
@@ -0,0 +1,5 @@
+var structtcp__pcb__listen =
+[
+    [ "local_ip", "structtcp__pcb__listen.html#a8a4f7b0551a0c6926a08ea5b6b3d5987", null ],
+    [ "next", "structtcp__pcb__listen.html#a0483d0c2a2758dcef18689be2efbdf34", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structtftp__context.html b/doc/doxygen/output/html/structtftp__context.html
new file mode 100644
index 0000000..1db6561
--- /dev/null
+++ b/doc/doxygen/output/html/structtftp__context.html
@@ -0,0 +1,210 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: tftp_context 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structtftp__context.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;tftp_server.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ae70d64e8e20328cc492d766506df4cba"><td class="memItemLeft" align="right" valign="top">void *(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtftp__context.html#ae70d64e8e20328cc492d766506df4cba">open</a> )(const char *fname, const char *mode, u8_t <a class="el" href="structtftp__context.html#a9e6e4ec803ec9597822923369701754d">write</a>)</td></tr>
+<tr class="separator:ae70d64e8e20328cc492d766506df4cba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae9181c57d1cf89bc263f7671e5630a65"><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtftp__context.html#ae9181c57d1cf89bc263f7671e5630a65">close</a> )(void *handle)</td></tr>
+<tr class="separator:ae9181c57d1cf89bc263f7671e5630a65"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a748e37df0c8b84b3adda78d603b9033c"><td class="memItemLeft" align="right" valign="top">int(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c">read</a> )(void *handle, void *buf, int bytes)</td></tr>
+<tr class="separator:a748e37df0c8b84b3adda78d603b9033c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9e6e4ec803ec9597822923369701754d"><td class="memItemLeft" align="right" valign="top">int(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtftp__context.html#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>
+</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>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="ae9181c57d1cf89bc263f7671e5630a65"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae9181c57d1cf89bc263f7671e5630a65">&#9670;&nbsp;</a></span>close</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void(* tftp_context::close) (void *handle)</td>
+        </tr>
+      </table>
+</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="structtftp__context.html#ae70d64e8e20328cc492d766506df4cba">open()</a> </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ae70d64e8e20328cc492d766506df4cba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae70d64e8e20328cc492d766506df4cba">&#9670;&nbsp;</a></span>open</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void*(* tftp_context::open) (const char *fname, const char *mode, u8_t <a class="el" href="structtftp__context.html#a9e6e4ec803ec9597822923369701754d">write</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Open file for read/write. </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>
+    <tr><td class="paramname">write</td><td>Flag indicating read (0) or write (!= 0) access </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>File handle supplied to other functions </dd></dl>
+
+</div>
+</div>
+<a id="a748e37df0c8b84b3adda78d603b9033c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a748e37df0c8b84b3adda78d603b9033c">&#9670;&nbsp;</a></span>read</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int(* tftp_context::read) (void *handle, void *buf, int bytes)</td>
+        </tr>
+      </table>
+</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="structtftp__context.html#ae70d64e8e20328cc492d766506df4cba">open()</a> </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>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>&gt;= 0: Success; &lt; 0: Error </dd></dl>
+
+</div>
+</div>
+<a id="a9e6e4ec803ec9597822923369701754d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9e6e4ec803ec9597822923369701754d">&#9670;&nbsp;</a></span>write</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int(* tftp_context::write) (void *handle, struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td>
+        </tr>
+      </table>
+</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="structtftp__context.html#ae70d64e8e20328cc492d766506df4cba">open()</a> </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>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>&gt;= 0: Success; &lt; 0: Error </dd></dl>
+
+</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>
+</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="structtftp__context.html">tftp_context</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structtftp__context.js b/doc/doxygen/output/html/structtftp__context.js
new file mode 100644
index 0000000..e42f4fd
--- /dev/null
+++ b/doc/doxygen/output/html/structtftp__context.js
@@ -0,0 +1,7 @@
+var structtftp__context =
+[
+    [ "close", "structtftp__context.html#ae9181c57d1cf89bc263f7671e5630a65", null ],
+    [ "open", "structtftp__context.html#ae70d64e8e20328cc492d766506df4cba", null ],
+    [ "read", "structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c", null ],
+    [ "write", "structtftp__context.html#a9e6e4ec803ec9597822923369701754d", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structthreadsync__data.html b/doc/doxygen/output/html/structthreadsync__data.html
new file mode 100644
index 0000000..b97ca44
--- /dev/null
+++ b/doc/doxygen/output/html/structthreadsync__data.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: threadsync_data 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structthreadsync__data.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">threadsync_data Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<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 runtime data. For internal usage only. </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>
+</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="structthreadsync__data.html">threadsync_data</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structudp__pcb.html b/doc/doxygen/output/html/structudp__pcb.html
new file mode 100644
index 0000000..01110d4
--- /dev/null
+++ b/doc/doxygen/output/html/structudp__pcb.html
@@ -0,0 +1,250 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: udp_pcb 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structudp__pcb.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">udp_pcb Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;udp.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a6160ea5e52f0d33e51b16b853ea1cd63"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structudp__pcb.html#a6160ea5e52f0d33e51b16b853ea1cd63">local_ip</a></td></tr>
+<tr class="separator:a6160ea5e52f0d33e51b16b853ea1cd63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8cc805631142eefc5593ae8ba3302d7c"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structudp__pcb.html#a8cc805631142eefc5593ae8ba3302d7c">local_port</a></td></tr>
+<tr class="separator:a8cc805631142eefc5593ae8ba3302d7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1c32c7ebd76898cf8f1227c10d34dbe0"><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="structudp__pcb.html#a1c32c7ebd76898cf8f1227c10d34dbe0">mcast_ip4</a></td></tr>
+<tr class="separator:a1c32c7ebd76898cf8f1227c10d34dbe0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac80ae56333b88cea08bfa3563b0dd3cd"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structudp__pcb.html#ac80ae56333b88cea08bfa3563b0dd3cd">mcast_ifindex</a></td></tr>
+<tr class="separator:ac80ae56333b88cea08bfa3563b0dd3cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaab9255f7f1186aef12d45c9bb90d3f4"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structudp__pcb.html#aaab9255f7f1186aef12d45c9bb90d3f4">mcast_ttl</a></td></tr>
+<tr class="separator:aaab9255f7f1186aef12d45c9bb90d3f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5e2833df51760c83c6032608eb5d0d4d"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structudp__pcb.html#a5e2833df51760c83c6032608eb5d0d4d">chksum_len_rx</a></td></tr>
+<tr class="separator:a5e2833df51760c83c6032608eb5d0d4d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac05dee75a3d6666267f7e626c2ec56a8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="udp_8h.html#af0ec7feb31acdb6e11b928f438c8a64b">udp_recv_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structudp__pcb.html#ac05dee75a3d6666267f7e626c2ec56a8">recv</a></td></tr>
+<tr class="separator:ac05dee75a3d6666267f7e626c2ec56a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a11e4c40b8868aa40d923756a60598cab"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structudp__pcb.html#a11e4c40b8868aa40d923756a60598cab">recv_arg</a></td></tr>
+<tr class="separator:a11e4c40b8868aa40d923756a60598cab"><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>the UDP protocol control block </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a5e2833df51760c83c6032608eb5d0d4d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5e2833df51760c83c6032608eb5d0d4d">&#9670;&nbsp;</a></span>chksum_len_rx</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t udp_pcb::chksum_len_rx</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>used for UDP_LITE only </p>
+
+</div>
+</div>
+<a id="a6160ea5e52f0d33e51b16b853ea1cd63"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6160ea5e52f0d33e51b16b853ea1cd63">&#9670;&nbsp;</a></span>local_ip</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> udp_pcb::local_ip</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Common members of all PCB types </p>
+
+</div>
+</div>
+<a id="a8cc805631142eefc5593ae8ba3302d7c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8cc805631142eefc5593ae8ba3302d7c">&#9670;&nbsp;</a></span>local_port</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t udp_pcb::local_port</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ports are in host byte order </p>
+
+</div>
+</div>
+<a id="ac80ae56333b88cea08bfa3563b0dd3cd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac80ae56333b88cea08bfa3563b0dd3cd">&#9670;&nbsp;</a></span>mcast_ifindex</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t udp_pcb::mcast_ifindex</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>outgoing network interface for multicast packets, by interface index (if nonzero) </p>
+
+</div>
+</div>
+<a id="a1c32c7ebd76898cf8f1227c10d34dbe0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1c32c7ebd76898cf8f1227c10d34dbe0">&#9670;&nbsp;</a></span>mcast_ip4</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> udp_pcb::mcast_ip4</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>outgoing network interface for multicast packets, by IPv4 address (if not 'any') </p>
+
+</div>
+</div>
+<a id="aaab9255f7f1186aef12d45c9bb90d3f4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaab9255f7f1186aef12d45c9bb90d3f4">&#9670;&nbsp;</a></span>mcast_ttl</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t udp_pcb::mcast_ttl</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>TTL for outgoing multicast packets </p>
+
+</div>
+</div>
+<a id="ac05dee75a3d6666267f7e626c2ec56a8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac05dee75a3d6666267f7e626c2ec56a8">&#9670;&nbsp;</a></span>recv</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="udp_8h.html#af0ec7feb31acdb6e11b928f438c8a64b">udp_recv_fn</a> udp_pcb::recv</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>receive callback function </p>
+
+</div>
+</div>
+<a id="a11e4c40b8868aa40d923756a60598cab"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a11e4c40b8868aa40d923756a60598cab">&#9670;&nbsp;</a></span>recv_arg</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* udp_pcb::recv_arg</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>user-supplied argument for the recv callback </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="udp_8h.html">udp.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="structudp__pcb.html">udp_pcb</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structudp__pcb.js b/doc/doxygen/output/html/structudp__pcb.js
new file mode 100644
index 0000000..6e9d47f
--- /dev/null
+++ b/doc/doxygen/output/html/structudp__pcb.js
@@ -0,0 +1,11 @@
+var structudp__pcb =
+[
+    [ "chksum_len_rx", "structudp__pcb.html#a5e2833df51760c83c6032608eb5d0d4d", null ],
+    [ "local_ip", "structudp__pcb.html#a6160ea5e52f0d33e51b16b853ea1cd63", null ],
+    [ "local_port", "structudp__pcb.html#a8cc805631142eefc5593ae8ba3302d7c", null ],
+    [ "mcast_ifindex", "structudp__pcb.html#ac80ae56333b88cea08bfa3563b0dd3cd", null ],
+    [ "mcast_ip4", "structudp__pcb.html#a1c32c7ebd76898cf8f1227c10d34dbe0", null ],
+    [ "mcast_ttl", "structudp__pcb.html#aaab9255f7f1186aef12d45c9bb90d3f4", null ],
+    [ "recv", "structudp__pcb.html#ac05dee75a3d6666267f7e626c2ec56a8", null ],
+    [ "recv_arg", "structudp__pcb.html#a11e4c40b8868aa40d923756a60598cab", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structzepif__init.html b/doc/doxygen/output/html/structzepif__init.html
new file mode 100644
index 0000000..4bc5d9c
--- /dev/null
+++ b/doc/doxygen/output/html/structzepif__init.html
@@ -0,0 +1,216 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: zepif_init 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('structzepif__init.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">zepif_init Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;zepif.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ad739032585841b126b4c0eab5899d40f"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structzepif__init.html#ad739032585841b126b4c0eab5899d40f">zep_src_udp_port</a></td></tr>
+<tr class="separator:ad739032585841b126b4c0eab5899d40f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a86c6229ed3010158e601666afe91a286"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structzepif__init.html#a86c6229ed3010158e601666afe91a286">zep_dst_udp_port</a></td></tr>
+<tr class="separator:a86c6229ed3010158e601666afe91a286"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adbe989f1f5cba623d742187def36f02c"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structzepif__init.html#adbe989f1f5cba623d742187def36f02c">zep_src_ip_addr</a></td></tr>
+<tr class="separator:adbe989f1f5cba623d742187def36f02c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a851efb99a973348f1064a31b97ce779d"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structzepif__init.html#a851efb99a973348f1064a31b97ce779d">zep_dst_ip_addr</a></td></tr>
+<tr class="separator:a851efb99a973348f1064a31b97ce779d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d97bf90b6bd4dd8258a3b1caf7890e3"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structnetif.html">netif</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structzepif__init.html#a3d97bf90b6bd4dd8258a3b1caf7890e3">zep_netif</a></td></tr>
+<tr class="separator:a3d97bf90b6bd4dd8258a3b1caf7890e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5a9a7ee6e687a7c1ae85b103d39de61d"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structzepif__init.html#a5a9a7ee6e687a7c1ae85b103d39de61d">addr</a> [6]</td></tr>
+<tr class="separator:a5a9a7ee6e687a7c1ae85b103d39de61d"><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>Pass this struct as 'state' to netif_add to control the behaviour of this netif. If NULL is passed, default behaviour is chosen </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a5a9a7ee6e687a7c1ae85b103d39de61d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5a9a7ee6e687a7c1ae85b103d39de61d">&#9670;&nbsp;</a></span>addr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t zepif_init::addr[6]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>MAC address of the 6LowPAN device </p>
+
+</div>
+</div>
+<a id="a851efb99a973348f1064a31b97ce779d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a851efb99a973348f1064a31b97ce779d">&#9670;&nbsp;</a></span>zep_dst_ip_addr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>* zepif_init::zep_dst_ip_addr</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The IP address to sed ZEP frames to (NULL = BROADCAST) </p>
+
+</div>
+</div>
+<a id="a86c6229ed3010158e601666afe91a286"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a86c6229ed3010158e601666afe91a286">&#9670;&nbsp;</a></span>zep_dst_udp_port</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t zepif_init::zep_dst_udp_port</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The UDP port used to ZEP frames to (0 = default) </p>
+
+</div>
+</div>
+<a id="a3d97bf90b6bd4dd8258a3b1caf7890e3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3d97bf90b6bd4dd8258a3b1caf7890e3">&#9670;&nbsp;</a></span>zep_netif</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const struct <a class="el" href="structnetif.html">netif</a>* zepif_init::zep_netif</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If != NULL, the udp pcb is bound to this netif </p>
+
+</div>
+</div>
+<a id="adbe989f1f5cba623d742187def36f02c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adbe989f1f5cba623d742187def36f02c">&#9670;&nbsp;</a></span>zep_src_ip_addr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a>* zepif_init::zep_src_ip_addr</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The IP address to sed ZEP frames from (NULL = ANY) </p>
+
+</div>
+</div>
+<a id="ad739032585841b126b4c0eab5899d40f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad739032585841b126b4c0eab5899d40f">&#9670;&nbsp;</a></span>zep_src_udp_port</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t zepif_init::zep_src_udp_port</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The UDP port used to ZEP frames from (0 = default) </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/netif/<a class="el" href="zepif_8h.html">zepif.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="structzepif__init.html">zepif_init</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structzepif__init.js b/doc/doxygen/output/html/structzepif__init.js
new file mode 100644
index 0000000..a79fe50
--- /dev/null
+++ b/doc/doxygen/output/html/structzepif__init.js
@@ -0,0 +1,9 @@
+var structzepif__init =
+[
+    [ "addr", "structzepif__init.html#a5a9a7ee6e687a7c1ae85b103d39de61d", null ],
+    [ "zep_dst_ip_addr", "structzepif__init.html#a851efb99a973348f1064a31b97ce779d", null ],
+    [ "zep_dst_udp_port", "structzepif__init.html#a86c6229ed3010158e601666afe91a286", null ],
+    [ "zep_netif", "structzepif__init.html#a3d97bf90b6bd4dd8258a3b1caf7890e3", null ],
+    [ "zep_src_ip_addr", "structzepif__init.html#adbe989f1f5cba623d742187def36f02c", null ],
+    [ "zep_src_udp_port", "structzepif__init.html#ad739032585841b126b4c0eab5899d40f", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/sys_8c.html b/doc/doxygen/output/html/sys_8c.html
new file mode 100644
index 0000000..8f1f43a
--- /dev/null
+++ b/doc/doxygen/output/html/sys_8c.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/sys.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('sys_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">sys.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 &quot;<a class="el" href="sys_8h.html">lwip/sys.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga6b8786f43e779953e8b74e983c88682e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e">sys_msleep</a> (u32_t ms)</td></tr>
+<tr class="separator:ga6b8786f43e779953e8b74e983c88682e"><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>lwIP Operating System abstraction </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_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li><li class="navelem"><a class="el" href="sys_8c.html">sys.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/sys_8c.js b/doc/doxygen/output/html/sys_8c.js
new file mode 100644
index 0000000..05b7660
--- /dev/null
+++ b/doc/doxygen/output/html/sys_8c.js
@@ -0,0 +1,4 @@
+var sys_8c =
+[
+    [ "sys_msleep", "group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/sys_8h.html b/doc/doxygen/output/html/sys_8h.html
new file mode 100644
index 0000000..7e45e18
--- /dev/null
+++ b/doc/doxygen/output/html/sys_8h.html
@@ -0,0 +1,403 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/sys.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('sys_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">sys.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="err_8h.html">lwip/err.h</a>&quot;</code><br />
+<code>#include &quot;arch/sys_arch.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ac1495030a8ab5e1f3c89e42ced527c5b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sys_8h.html#ac1495030a8ab5e1f3c89e42ced527c5b">SYS_ARCH_TIMEOUT</a>&#160;&#160;&#160;0xffffffffUL</td></tr>
+<tr class="separator:ac1495030a8ab5e1f3c89e42ced527c5b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab0571e67edca0132b144106e9b319ef9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sys_8h.html#ab0571e67edca0132b144106e9b319ef9">SYS_MBOX_EMPTY</a>&#160;&#160;&#160;<a class="el" href="sys_8h.html#ac1495030a8ab5e1f3c89e42ced527c5b">SYS_ARCH_TIMEOUT</a></td></tr>
+<tr class="separator:ab0571e67edca0132b144106e9b319ef9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7bada49634cd3b28b28bdcedd763a1e6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sys_8h.html#a7bada49634cd3b28b28bdcedd763a1e6">LWIP_COMPAT_MUTEX</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a7bada49634cd3b28b28bdcedd763a1e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84e7e4bc00255aee84e6e7289a985703"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sys_8h.html#a84e7e4bc00255aee84e6e7289a985703">sys_sem_wait</a>(sem)&#160;&#160;&#160;<a class="el" href="group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f">sys_arch_sem_wait</a>(sem, 0)</td></tr>
+<tr class="separator:a84e7e4bc00255aee84e6e7289a985703"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9e8ad541356786936f23ab83b8f550cc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sys_8h.html#a9e8ad541356786936f23ab83b8f550cc">sys_sem_valid_val</a>(sem)&#160;&#160;&#160;<a class="el" href="group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4">sys_sem_valid</a>(&amp;(sem))</td></tr>
+<tr class="separator:a9e8ad541356786936f23ab83b8f550cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2556e570f6973a6f4d57d0e76ef190d8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sys_8h.html#a2556e570f6973a6f4d57d0e76ef190d8">sys_sem_set_invalid_val</a>(sem)&#160;&#160;&#160;<a class="el" href="group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33">sys_sem_set_invalid</a>(&amp;(sem))</td></tr>
+<tr class="separator:a2556e570f6973a6f4d57d0e76ef190d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab7841780b31ba9c0a39a440aad1fca13"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sys_8h.html#ab7841780b31ba9c0a39a440aad1fca13">sys_mbox_tryfetch</a>(mbox,  msg)&#160;&#160;&#160;<a class="el" href="group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c">sys_arch_mbox_tryfetch</a>(mbox, msg)</td></tr>
+<tr class="separator:ab7841780b31ba9c0a39a440aad1fca13"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae82640d0bdbeec7b9b6511b3f8d99cb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sys_8h.html#aae82640d0bdbeec7b9b6511b3f8d99cb">sys_mbox_valid_val</a>(mbox)&#160;&#160;&#160;<a class="el" href="group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d">sys_mbox_valid</a>(&amp;(mbox))</td></tr>
+<tr class="separator:aae82640d0bdbeec7b9b6511b3f8d99cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae293feebb61d36f2db99be53702b8203"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sys_8h.html#ae293feebb61d36f2db99be53702b8203">sys_mbox_set_invalid_val</a>(mbox)&#160;&#160;&#160;<a class="el" href="group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172">sys_mbox_set_invalid</a>(&amp;(mbox))</td></tr>
+<tr class="separator:ae293feebb61d36f2db99be53702b8203"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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)&#160;&#160;&#160;sys_prot_t lev</td></tr>
+<tr class="separator:ga945395fa326214fc9736487242710a90"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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)&#160;&#160;&#160;lev = sys_arch_protect()</td></tr>
+<tr class="separator:ga3d0e48feafd378e9c26c64567ecd8bab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2f48e97047945642ddeb27e65bf4ffe2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__prot.html#ga2f48e97047945642ddeb27e65bf4ffe2">SYS_ARCH_UNPROTECT</a>(lev)&#160;&#160;&#160;sys_arch_unprotect(lev)</td></tr>
+<tr class="separator:ga2f48e97047945642ddeb27e65bf4ffe2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ae30a77bf6bd69bfcc5f235eaad54f2b9"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sys_8h.html#ae30a77bf6bd69bfcc5f235eaad54f2b9">lwip_thread_fn</a>) (void *arg)</td></tr>
+<tr class="separator:ae30a77bf6bd69bfcc5f235eaad54f2b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga38e7dae1fd88b338eb1cd97f110f3897"><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__sys__mutex.html#ga38e7dae1fd88b338eb1cd97f110f3897">sys_mutex_new</a> (sys_mutex_t *mutex)</td></tr>
+<tr class="separator:ga38e7dae1fd88b338eb1cd97f110f3897"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4d4eb9afe5965fa2661dd54ff55d616a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a">sys_mutex_lock</a> (sys_mutex_t *mutex)</td></tr>
+<tr class="separator:ga4d4eb9afe5965fa2661dd54ff55d616a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5568f68898fe9d5735f9ce2f665624fb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb">sys_mutex_unlock</a> (sys_mutex_t *mutex)</td></tr>
+<tr class="separator:ga5568f68898fe9d5735f9ce2f665624fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga16336ce68b741e98204102ca4bc84dd9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mutex.html#ga16336ce68b741e98204102ca4bc84dd9">sys_mutex_free</a> (sys_mutex_t *mutex)</td></tr>
+<tr class="separator:ga16336ce68b741e98204102ca4bc84dd9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaebe83ba90a6d9c23cdb3eb5d49562c4a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mutex.html#gaebe83ba90a6d9c23cdb3eb5d49562c4a">sys_mutex_valid</a> (sys_mutex_t *mutex)</td></tr>
+<tr class="separator:gaebe83ba90a6d9c23cdb3eb5d49562c4a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3f392725971dc837aa56dd7e45fa7ca8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mutex.html#ga3f392725971dc837aa56dd7e45fa7ca8">sys_mutex_set_invalid</a> (sys_mutex_t *mutex)</td></tr>
+<tr class="separator:ga3f392725971dc837aa56dd7e45fa7ca8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf99da9e34a71855285c535183133dfde"><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__sys__sem.html#gaf99da9e34a71855285c535183133dfde">sys_sem_new</a> (sys_sem_t *sem, u8_t count)</td></tr>
+<tr class="separator:gaf99da9e34a71855285c535183133dfde"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaf800273061fcc3f8200fd4e1b9ca875"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__sem.html#gaaf800273061fcc3f8200fd4e1b9ca875">sys_sem_signal</a> (sys_sem_t *sem)</td></tr>
+<tr class="separator:gaaf800273061fcc3f8200fd4e1b9ca875"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8d364c5037778acb21c3df675db81b4f"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f">sys_arch_sem_wait</a> (sys_sem_t *sem, u32_t timeout)</td></tr>
+<tr class="separator:ga8d364c5037778acb21c3df675db81b4f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83b781f96c30e915c752065a757da283"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__sem.html#ga83b781f96c30e915c752065a757da283">sys_sem_free</a> (sys_sem_t *sem)</td></tr>
+<tr class="separator:ga83b781f96c30e915c752065a757da283"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga09a6c052ddaf799139efc56adfa087e4"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4">sys_sem_valid</a> (sys_sem_t *sem)</td></tr>
+<tr class="separator:ga09a6c052ddaf799139efc56adfa087e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga42a2ab32afbf41a4146a9d135224ef33"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33">sys_sem_set_invalid</a> (sys_sem_t *sem)</td></tr>
+<tr class="separator:ga42a2ab32afbf41a4146a9d135224ef33"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6b8786f43e779953e8b74e983c88682e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e">sys_msleep</a> (u32_t ms)</td></tr>
+<tr class="separator:ga6b8786f43e779953e8b74e983c88682e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab9793f30642de06ce87827e9adbe30cc"><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__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc">sys_mbox_new</a> (sys_mbox_t *mbox, int size)</td></tr>
+<tr class="separator:gab9793f30642de06ce87827e9adbe30cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9d068386a3c53dd01b8af99c3ef77555"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mbox.html#ga9d068386a3c53dd01b8af99c3ef77555">sys_mbox_post</a> (sys_mbox_t *mbox, void *msg)</td></tr>
+<tr class="separator:ga9d068386a3c53dd01b8af99c3ef77555"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa36345e48a49d67cbb0878cd4cbd2195"><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__sys__mbox.html#gaa36345e48a49d67cbb0878cd4cbd2195">sys_mbox_trypost</a> (sys_mbox_t *mbox, void *msg)</td></tr>
+<tr class="separator:gaa36345e48a49d67cbb0878cd4cbd2195"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf677a6e76adb7650a3020fdb3cb8429a"><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__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a">sys_mbox_trypost_fromisr</a> (sys_mbox_t *mbox, void *msg)</td></tr>
+<tr class="separator:gaf677a6e76adb7650a3020fdb3cb8429a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6464cd77cf6799bd8b3d6c840166a2e8"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mbox.html#ga6464cd77cf6799bd8b3d6c840166a2e8">sys_arch_mbox_fetch</a> (sys_mbox_t *mbox, void **msg, u32_t timeout)</td></tr>
+<tr class="separator:ga6464cd77cf6799bd8b3d6c840166a2e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafab441b130b4ec417012835dbe1e497c"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c">sys_arch_mbox_tryfetch</a> (sys_mbox_t *mbox, void **msg)</td></tr>
+<tr class="separator:gafab441b130b4ec417012835dbe1e497c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac641a45812155d2234ef80dd6412882f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f">sys_mbox_free</a> (sys_mbox_t *mbox)</td></tr>
+<tr class="separator:gac641a45812155d2234ef80dd6412882f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8bcfab4bd791dd33f69a778e7585275d"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d">sys_mbox_valid</a> (sys_mbox_t *mbox)</td></tr>
+<tr class="separator:ga8bcfab4bd791dd33f69a778e7585275d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga53ddec9d7f5500c5b1d982cd17493172"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172">sys_mbox_set_invalid</a> (sys_mbox_t *mbox)</td></tr>
+<tr class="separator:ga53ddec9d7f5500c5b1d982cd17493172"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0d596afdd8dbcfad320172d39b0f607a"><td class="memItemLeft" align="right" valign="top">sys_thread_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a">sys_thread_new</a> (const char *name, <a class="el" href="sys_8h.html#ae30a77bf6bd69bfcc5f235eaad54f2b9">lwip_thread_fn</a> thread, void *arg, int stacksize, int prio)</td></tr>
+<tr class="separator:ga0d596afdd8dbcfad320172d39b0f607a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf411a8bc6b7ed4b0af9114e10c959448"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__misc.html#gaf411a8bc6b7ed4b0af9114e10c959448">sys_init</a> (void)</td></tr>
+<tr class="separator:gaf411a8bc6b7ed4b0af9114e10c959448"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac89f307e8b360eaf821b461a4f26753a"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sys_8h.html#ac89f307e8b360eaf821b461a4f26753a">sys_jiffies</a> (void)</td></tr>
+<tr class="separator:ac89f307e8b360eaf821b461a4f26753a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga11316ac1e77418c6fa4ab8869e3fa199"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199">sys_now</a> (void)</td></tr>
+<tr class="separator:ga11316ac1e77418c6fa4ab8869e3fa199"><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>OS abstraction layer </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a7bada49634cd3b28b28bdcedd763a1e6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7bada49634cd3b28b28bdcedd763a1e6">&#9670;&nbsp;</a></span>LWIP_COMPAT_MUTEX</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_COMPAT_MUTEX&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Define LWIP_COMPAT_MUTEX if the port has no mutexes and binary semaphores should be used instead </p>
+
+</div>
+</div>
+<a id="ac1495030a8ab5e1f3c89e42ced527c5b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac1495030a8ab5e1f3c89e42ced527c5b">&#9670;&nbsp;</a></span>SYS_ARCH_TIMEOUT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SYS_ARCH_TIMEOUT&#160;&#160;&#160;0xffffffffUL</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return code for timeouts from sys_arch_mbox_fetch and sys_arch_sem_wait </p>
+
+</div>
+</div>
+<a id="ab0571e67edca0132b144106e9b319ef9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab0571e67edca0132b144106e9b319ef9">&#9670;&nbsp;</a></span>SYS_MBOX_EMPTY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SYS_MBOX_EMPTY&#160;&#160;&#160;<a class="el" href="sys_8h.html#ac1495030a8ab5e1f3c89e42ced527c5b">SYS_ARCH_TIMEOUT</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p><a class="el" href="sys_8h.html#ab7841780b31ba9c0a39a440aad1fca13">sys_mbox_tryfetch()</a> returns SYS_MBOX_EMPTY if appropriate. For now we use the same magic value, but we allow this to change in future. </p>
+
+</div>
+</div>
+<a id="ae293feebb61d36f2db99be53702b8203"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae293feebb61d36f2db99be53702b8203">&#9670;&nbsp;</a></span>sys_mbox_set_invalid_val</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sys_mbox_set_invalid_val</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">mbox</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172">sys_mbox_set_invalid</a>(&amp;(mbox))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as <a class="el" href="group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172">sys_mbox_set_invalid()</a> but taking a value, not a pointer </p>
+
+</div>
+</div>
+<a id="ab7841780b31ba9c0a39a440aad1fca13"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab7841780b31ba9c0a39a440aad1fca13">&#9670;&nbsp;</a></span>sys_mbox_tryfetch</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sys_mbox_tryfetch</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">mbox, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">msg&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c">sys_arch_mbox_tryfetch</a>(mbox, msg)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>For now, we map straight to sys_arch implementation. </p>
+
+</div>
+</div>
+<a id="aae82640d0bdbeec7b9b6511b3f8d99cb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aae82640d0bdbeec7b9b6511b3f8d99cb">&#9670;&nbsp;</a></span>sys_mbox_valid_val</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sys_mbox_valid_val</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">mbox</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d">sys_mbox_valid</a>(&amp;(mbox))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as <a class="el" href="group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d">sys_mbox_valid()</a> but taking a value, not a pointer </p>
+
+</div>
+</div>
+<a id="a2556e570f6973a6f4d57d0e76ef190d8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2556e570f6973a6f4d57d0e76ef190d8">&#9670;&nbsp;</a></span>sys_sem_set_invalid_val</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sys_sem_set_invalid_val</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">sem</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33">sys_sem_set_invalid</a>(&amp;(sem))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as <a class="el" href="group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33">sys_sem_set_invalid()</a> but taking a value, not a pointer </p>
+
+</div>
+</div>
+<a id="a9e8ad541356786936f23ab83b8f550cc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9e8ad541356786936f23ab83b8f550cc">&#9670;&nbsp;</a></span>sys_sem_valid_val</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sys_sem_valid_val</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">sem</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4">sys_sem_valid</a>(&amp;(sem))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Same as <a class="el" href="group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4">sys_sem_valid()</a> but taking a value, not a pointer </p>
+
+</div>
+</div>
+<a id="a84e7e4bc00255aee84e6e7289a985703"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a84e7e4bc00255aee84e6e7289a985703">&#9670;&nbsp;</a></span>sys_sem_wait</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sys_sem_wait</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">sem</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f">sys_arch_sem_wait</a>(sem, 0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Wait for a semaphore - forever/no timeout </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="ae30a77bf6bd69bfcc5f235eaad54f2b9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae30a77bf6bd69bfcc5f235eaad54f2b9">&#9670;&nbsp;</a></span>lwip_thread_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* lwip_thread_fn) (void *arg)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for thread functions </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ac89f307e8b360eaf821b461a4f26753a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac89f307e8b360eaf821b461a4f26753a">&#9670;&nbsp;</a></span>sys_jiffies()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t sys_jiffies </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Ticks/jiffies since power up. </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="sys_8h.html">sys.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/sys_8h.js b/doc/doxygen/output/html/sys_8h.js
new file mode 100644
index 0000000..54279aa
--- /dev/null
+++ b/doc/doxygen/output/html/sys_8h.js
@@ -0,0 +1,42 @@
+var sys_8h =
+[
+    [ "LWIP_COMPAT_MUTEX", "sys_8h.html#a7bada49634cd3b28b28bdcedd763a1e6", 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 ],
+    [ "SYS_ARCH_UNPROTECT", "group__sys__prot.html#ga2f48e97047945642ddeb27e65bf4ffe2", null ],
+    [ "SYS_MBOX_EMPTY", "sys_8h.html#ab0571e67edca0132b144106e9b319ef9", null ],
+    [ "sys_mbox_set_invalid_val", "sys_8h.html#ae293feebb61d36f2db99be53702b8203", null ],
+    [ "sys_mbox_tryfetch", "sys_8h.html#ab7841780b31ba9c0a39a440aad1fca13", null ],
+    [ "sys_mbox_valid_val", "sys_8h.html#aae82640d0bdbeec7b9b6511b3f8d99cb", null ],
+    [ "sys_sem_set_invalid_val", "sys_8h.html#a2556e570f6973a6f4d57d0e76ef190d8", null ],
+    [ "sys_sem_valid_val", "sys_8h.html#a9e8ad541356786936f23ab83b8f550cc", null ],
+    [ "sys_sem_wait", "sys_8h.html#a84e7e4bc00255aee84e6e7289a985703", null ],
+    [ "lwip_thread_fn", "sys_8h.html#ae30a77bf6bd69bfcc5f235eaad54f2b9", null ],
+    [ "sys_arch_mbox_fetch", "group__sys__mbox.html#ga6464cd77cf6799bd8b3d6c840166a2e8", null ],
+    [ "sys_arch_mbox_tryfetch", "group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c", null ],
+    [ "sys_arch_sem_wait", "group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f", null ],
+    [ "sys_init", "group__sys__misc.html#gaf411a8bc6b7ed4b0af9114e10c959448", null ],
+    [ "sys_jiffies", "sys_8h.html#ac89f307e8b360eaf821b461a4f26753a", null ],
+    [ "sys_mbox_free", "group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f", null ],
+    [ "sys_mbox_new", "group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc", null ],
+    [ "sys_mbox_post", "group__sys__mbox.html#ga9d068386a3c53dd01b8af99c3ef77555", null ],
+    [ "sys_mbox_set_invalid", "group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172", null ],
+    [ "sys_mbox_trypost", "group__sys__mbox.html#gaa36345e48a49d67cbb0878cd4cbd2195", null ],
+    [ "sys_mbox_trypost_fromisr", "group__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a", null ],
+    [ "sys_mbox_valid", "group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d", null ],
+    [ "sys_msleep", "group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e", null ],
+    [ "sys_mutex_free", "group__sys__mutex.html#ga16336ce68b741e98204102ca4bc84dd9", null ],
+    [ "sys_mutex_lock", "group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a", null ],
+    [ "sys_mutex_new", "group__sys__mutex.html#ga38e7dae1fd88b338eb1cd97f110f3897", null ],
+    [ "sys_mutex_set_invalid", "group__sys__mutex.html#ga3f392725971dc837aa56dd7e45fa7ca8", null ],
+    [ "sys_mutex_unlock", "group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb", null ],
+    [ "sys_mutex_valid", "group__sys__mutex.html#gaebe83ba90a6d9c23cdb3eb5d49562c4a", null ],
+    [ "sys_now", "group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199", null ],
+    [ "sys_sem_free", "group__sys__sem.html#ga83b781f96c30e915c752065a757da283", null ],
+    [ "sys_sem_new", "group__sys__sem.html#gaf99da9e34a71855285c535183133dfde", null ],
+    [ "sys_sem_set_invalid", "group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33", null ],
+    [ "sys_sem_signal", "group__sys__sem.html#gaaf800273061fcc3f8200fd4e1b9ca875", null ],
+    [ "sys_sem_valid", "group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4", null ],
+    [ "sys_thread_new", "group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/sys_init.html b/doc/doxygen/output/html/sys_init.html
new file mode 100644
index 0000000..174b537
--- /dev/null
+++ b/doc/doxygen/output/html/sys_init.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: System initalization</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('sys_init.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">System initalization </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>
+<p>We can give you some idea on how to proceed when using the raw API. We assume a configuration using a single Ethernet netif and the UDP and TCP transport layers, IPv4 and the DHCP client.</p>
+<p>Call these functions in the order of appearance:</p>
+<ul>
+<li><a class="el" href="group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9">lwip_init()</a>: Initialize the lwIP stack and all of its subsystems.</li>
+<li><p class="startli">netif_add(struct netif *netif, ...): Adds your network interface to the netif_list. Allocate a struct netif and pass a pointer to this structure as the first argument. Give pointers to cleared <a class="el" href="structip__addr.html">ip_addr</a> structures when using DHCP, or fill them with sane numbers otherwise. The state pointer may be NULL.</p>
+<p class="startli">The init function pointer must point to a initialization function for your Ethernet netif interface. The following code illustrates its use.</p>
+</li>
+</ul>
+<div class="fragment"><div class="line"><a class="code" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> netif_if_init(<span class="keyword">struct</span> <a class="code" href="structnetif.html">netif</a> *<a class="code" href="structnetif.html">netif</a>)</div><div class="line">{</div><div class="line">  u8_t i;</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">    netif-&gt;<a class="code" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">hwaddr</a>[i] = some_eth_addr[i];</div><div class="line">  }</div><div class="line">  init_my_eth_device();</div><div class="line">  <span class="keywordflow">return</span> <a class="code" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb">ERR_OK</a>;</div><div class="line">}</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>
+<li><a class="el" href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_link_up(struct netif *netif)</a> This is the hardware link state; e.g. whether cable is plugged for wired Ethernet interface. This function must be called even if you don't know the current state. Having link up and link down events is optional but DHCP and IPv6 discover benefit well from those events.</li>
+<li><a class="el" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up(struct netif *netif)</a> This is the administrative (= software) state of the netif, when the netif is fully configured this function must be called.</li>
+<li><a class="el" href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp_start(struct netif *netif)</a> Creates a new DHCP client for this interface on the first call. You can peek in the netif-&gt;dhcp struct for the actual DHCP status.</li>
+<li><a class="el" href="group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883">sys_check_timeouts()</a> When the system is running, you have to periodically call <a class="el" href="group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883">sys_check_timeouts()</a> which will handle all timers for all protocols in the stack; add this to your main loop or equivalent. </li>
+</ul>
+</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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/tabs.css b/doc/doxygen/output/html/tabs.css
new file mode 100644
index 0000000..a28614b
--- /dev/null
+++ b/doc/doxygen/output/html/tabs.css
@@ -0,0 +1 @@
+.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#doc-content{overflow:auto;display:block;padding:0;margin:0;-webkit-overflow-scrolling:touch}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}}
\ No newline at end of file
diff --git a/doc/doxygen/output/html/tcp_8c.html b/doc/doxygen/output/html/tcp_8c.html
new file mode 100644
index 0000000..11bfe8d
--- /dev/null
+++ b/doc/doxygen/output/html/tcp_8c.html
@@ -0,0 +1,855 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/tcp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('tcp_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">tcp.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 &quot;<a class="el" href="def_8h.html">lwip/def.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="tcp_8h.html">lwip/tcp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tcp__priv_8h.html">lwip/priv/tcp_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="debug_8h.html">lwip/debug.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6_8h.html">lwip/ip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="nd6_8h.html">lwip/nd6.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;path/to/my/lwip_hooks.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a51de4ded7d342456d31722493c92c969"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#a51de4ded7d342456d31722493c92c969">tcp_init</a> (void)</td></tr>
+<tr class="separator:a51de4ded7d342456d31722493c92c969"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa2b6b075c27c64dfb8c402ac961fb910"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#aa2b6b075c27c64dfb8c402ac961fb910">tcp_free</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:aa2b6b075c27c64dfb8c402ac961fb910"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3846a756b13214ed88ea47d0ff8279eb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb">tcp_tmr</a> (void)</td></tr>
+<tr class="separator:a3846a756b13214ed88ea47d0ff8279eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga427b11c7b98c748ec487cd43093bd2f8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8">tcp_backlog_delayed</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga427b11c7b98c748ec487cd43093bd2f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga619154658137a23839ca3b94882131ca"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga619154658137a23839ca3b94882131ca">tcp_backlog_accepted</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga619154658137a23839ca3b94882131ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga87093e137fcc53ea82a134a3f5b33623"><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#ga87093e137fcc53ea82a134a3f5b33623">tcp_close</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga87093e137fcc53ea82a134a3f5b33623"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5b94d57f1891b9287f88525a2ac561dd"><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#ga5b94d57f1891b9287f88525a2ac561dd">tcp_shutdown</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, int shut_rx, int shut_tx)</td></tr>
+<tr class="separator:ga5b94d57f1891b9287f88525a2ac561dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4f0f1ca01dbccd680eaa2d8433cd7fe"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe">tcp_abandon</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, int reset)</td></tr>
+<tr class="separator:ae4f0f1ca01dbccd680eaa2d8433cd7fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga468c2260ddb01582e966ddcf3c25ce61"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61">tcp_abort</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga468c2260ddb01582e966ddcf3c25ce61"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacf5aa67bd7fc66fef43f77a55a1201ee"><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#gacf5aa67bd7fc66fef43f77a55a1201ee">tcp_bind</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, u16_t port)</td></tr>
+<tr class="separator:gacf5aa67bd7fc66fef43f77a55a1201ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6469a15709088e80024258dbe80fcd1f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f">tcp_bind_netif</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, const struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga6469a15709088e80024258dbe80fcd1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaeff14f321d1eecd0431611f382fcd338"><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="group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338">tcp_listen_with_backlog</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t backlog)</td></tr>
+<tr class="separator:gaeff14f321d1eecd0431611f382fcd338"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac86ad8ded4d1db15a5b5fb42eb7c1436"><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="group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436">tcp_listen_with_backlog_and_err</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t backlog, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> *err)</td></tr>
+<tr class="separator:gac86ad8ded4d1db15a5b5fb42eb7c1436"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6d2c254b779db4e517cb34e41301588d"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#a6d2c254b779db4e517cb34e41301588d">tcp_update_rcv_ann_wnd</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:a6d2c254b779db4e517cb34e41301588d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabdac0856a52b5789dc897d4c7137ec44"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44">tcp_recved</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u16_t len)</td></tr>
+<tr class="separator:gabdac0856a52b5789dc897d4c7137ec44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012">tcp_connect</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">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:a421fb42ef919018e14ae413adfee9905"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#a421fb42ef919018e14ae413adfee9905">tcp_slowtmr</a> (void)</td></tr>
+<tr class="separator:a421fb42ef919018e14ae413adfee9905"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf446b07e52161b8a53cea07bc6c366d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#abf446b07e52161b8a53cea07bc6c366d">tcp_fasttmr</a> (void)</td></tr>
+<tr class="separator:abf446b07e52161b8a53cea07bc6c366d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ae0268e59fda0665fdd08c6e77ec547"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#a5ae0268e59fda0665fdd08c6e77ec547">tcp_txnow</a> (void)</td></tr>
+<tr class="separator:a5ae0268e59fda0665fdd08c6e77ec547"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0075b56ad4b0eca7c9d439cf150e1973"><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="tcp_8c.html#a0075b56ad4b0eca7c9d439cf150e1973">tcp_process_refused_data</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:a0075b56ad4b0eca7c9d439cf150e1973"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d9bb9809769197bce9b2499d55cf28c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#a3d9bb9809769197bce9b2499d55cf28c">tcp_segs_free</a> (struct tcp_seg *seg)</td></tr>
+<tr class="separator:a3d9bb9809769197bce9b2499d55cf28c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6283651b26f74dba2444159aee88b20"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#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"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#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:a569d79451d2570e4ef406775725ef6ef"><td class="memItemLeft" align="right" valign="top">struct tcp_seg *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#a569d79451d2570e4ef406775725ef6ef">tcp_seg_copy</a> (struct tcp_seg *seg)</td></tr>
+<tr class="separator:a569d79451d2570e4ef406775725ef6ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="tcp_8c.html#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>
+<tr class="separator:a0cb3f604fc8d20870d8cab291da5701c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1dd6830a42b3c464b5a72f62ae312d0a"><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="tcp_8c.html#a1dd6830a42b3c464b5a72f62ae312d0a">tcp_alloc</a> (u8_t prio)</td></tr>
+<tr class="separator:a1dd6830a42b3c464b5a72f62ae312d0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7427c5d237fe66a8097bfa8d24ceb943"><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="group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943">tcp_new</a> (void)</td></tr>
+<tr class="separator:ga7427c5d237fe66a8097bfa8d24ceb943"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac14e757a21a4a87c6aa52372c210b937"><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="group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937">tcp_new_ip_type</a> (u8_t type)</td></tr>
+<tr class="separator:gac14e757a21a4a87c6aa52372c210b937"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac10926e6f76f73e17c0d37aaab3e56b6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6">tcp_arg</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, void *arg)</td></tr>
+<tr class="separator:gac10926e6f76f73e17c0d37aaab3e56b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8afd0b316a87a5eeff4726dc95006ed0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0">tcp_recv</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, <a class="el" href="tcp_8h.html#a780cfac08b02c66948ab94ea974202e8">tcp_recv_fn</a> <a class="el" href="group__socket.html#gadd7ae45df7c005619eb1126542231e9b">recv</a>)</td></tr>
+<tr class="separator:ga8afd0b316a87a5eeff4726dc95006ed0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1596332b93bb6249179f3b89f24bd808"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808">tcp_sent</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, <a class="el" href="tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18">tcp_sent_fn</a> sent)</td></tr>
+<tr class="separator:ga1596332b93bb6249179f3b89f24bd808"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae1346c4e34d3bc7c01e1b47142ab3121"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121">tcp_err</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, <a class="el" href="tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55">tcp_err_fn</a> err)</td></tr>
+<tr class="separator:gae1346c4e34d3bc7c01e1b47142ab3121"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaff4c3e380fc60c8fb9b3aa95eda94c62"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62">tcp_accept</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, <a class="el" href="tcp_8h.html#a00517abce6856d6c82f0efebdafb734d">tcp_accept_fn</a> <a class="el" href="group__socket.html#gade2b17671b5a4b18e941fbf7e1060310">accept</a>)</td></tr>
+<tr class="separator:gaff4c3e380fc60c8fb9b3aa95eda94c62"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafba47015098ed7ce523dcf7bdf70f7e5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5">tcp_poll</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, <a class="el" href="tcp_8h.html#a66deb97618a9cd9d57fca28c5245e073">tcp_poll_fn</a> <a class="el" href="group__socket.html#ga80ae38841b0e64e60618cd8bf857f617">poll</a>, u8_t interval)</td></tr>
+<tr class="separator:gafba47015098ed7ce523dcf7bdf70f7e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a44fc672b9d14a65e61040707c45302ba"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#a44fc672b9d14a65e61040707c45302ba">tcp_pcb_purge</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:a44fc672b9d14a65e61040707c45302ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaaef096f6a03bf5b778329bb66ee06f6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#aaaef096f6a03bf5b778329bb66ee06f6">tcp_pcb_remove</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> **pcblist, struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:aaaef096f6a03bf5b778329bb66ee06f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd5dc2fa74855a84b2da642ba31059ea"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#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:a08a3b5396c40f32dd8b21e7d63b3e1b3"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#a08a3b5396c40f32dd8b21e7d63b3e1b3">tcp_eff_send_mss_netif</a> (u16_t sendmss, struct <a class="el" href="structnetif.html">netif</a> *outif, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dest)</td></tr>
+<tr class="separator:a08a3b5396c40f32dd8b21e7d63b3e1b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4d0c2d1ad02134c79fc72fe95ee2a703"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#a4d0c2d1ad02134c79fc72fe95ee2a703">tcp_netif_ip_addr_changed</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *old_addr, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *new_addr)</td></tr>
+<tr class="separator:a4d0c2d1ad02134c79fc72fe95ee2a703"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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"><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:gaa8ac7a74407cb3e0e01a30314805f990"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html#gaa8ac7a74407cb3e0e01a30314805f990">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:gaa8ac7a74407cb3e0e01a30314805f990"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="tcp_8c.html#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">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a1b42a7ac0fc173a42d575f86853d32a8"><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="tcp_8c.html#a1b42a7ac0fc173a42d575f86853d32a8">tcp_bound_pcbs</a></td></tr>
+<tr class="separator:a1b42a7ac0fc173a42d575f86853d32a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96fe1350e510d4308ac9969ffb4c9c81"><td class="memItemLeft" align="right" valign="top">union tcp_listen_pcbs_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#a96fe1350e510d4308ac9969ffb4c9c81">tcp_listen_pcbs</a></td></tr>
+<tr class="separator:a96fe1350e510d4308ac9969ffb4c9c81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78c09dbae67ccc06b659d9f1a388f911"><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="tcp_8c.html#a78c09dbae67ccc06b659d9f1a388f911">tcp_active_pcbs</a></td></tr>
+<tr class="separator:a78c09dbae67ccc06b659d9f1a388f911"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9a522a66c5e1f1a4e28fe7a672cc64e3"><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="tcp_8c.html#a9a522a66c5e1f1a4e28fe7a672cc64e3">tcp_tw_pcbs</a></td></tr>
+<tr class="separator:a9a522a66c5e1f1a4e28fe7a672cc64e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a51515507dec664e9d69a870e6b627610"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> **const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8c.html#a51515507dec664e9d69a870e6b627610">tcp_pcb_lists</a> []</td></tr>
+<tr class="separator:a51515507dec664e9d69a870e6b627610"><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>Transmission Control Protocol for IP See also <a class="el" href="group__tcp__raw.html">TCP</a> </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ae4f0f1ca01dbccd680eaa2d8433cd7fe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae4f0f1ca01dbccd680eaa2d8433cd7fe">&#9670;&nbsp;</a></span>tcp_abandon()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_abandon </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>reset</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Abandons a connection and optionally sends a RST to the remote host. Deletes the local protocol control block. This is done when a connection is killed because of shortage of memory.</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 abort </td></tr>
+    <tr><td class="paramname">reset</td><td>boolean to indicate whether a reset should be sent </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a1dd6830a42b3c464b5a72f62ae312d0a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1dd6830a42b3c464b5a72f62ae312d0a">&#9670;&nbsp;</a></span>tcp_alloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a>* tcp_alloc </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>prio</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocate a new <a class="el" href="structtcp__pcb.html">tcp_pcb</a> structure.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">prio</td><td>priority for the new pcb </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new <a class="el" href="structtcp__pcb.html">tcp_pcb</a> that initially is in state CLOSED </dd></dl>
+
+</div>
+</div>
+<a id="a08a3b5396c40f32dd8b21e7d63b3e1b3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a08a3b5396c40f32dd8b21e7d63b3e1b3">&#9670;&nbsp;</a></span>tcp_eff_send_mss_netif()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t tcp_eff_send_mss_netif </td>
+          <td>(</td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>sendmss</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>outif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>dest</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Calculates the effective send mss that can be used for a specific IP address by calculating the minimum of TCP_MSS and the mtu (if set) of the target netif (if not NULL). </p>
+
+</div>
+</div>
+<a id="a5265b1df024d04287ed3edc02b1b9ccc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5265b1df024d04287ed3edc02b1b9ccc">&#9670;&nbsp;</a></span>tcp_ext_arg_invoke_callbacks_passive_open()</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> tcp_ext_arg_invoke_callbacks_passive_open </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb__listen.html">tcp_pcb_listen</a> *&#160;</td>
+          <td class="paramname"><em>lpcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>cpcb</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function calls the "passive_open" callback for all ext_args if a connection is in the process of being accepted. This is called just after the SYN is received and before a SYN/ACK is sent, to allow to modify the very first segment sent even on passive open. Naturally, the "accepted" callback of the pcb has not been called yet! </p>
+
+</div>
+</div>
+<a id="abf446b07e52161b8a53cea07bc6c366d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abf446b07e52161b8a53cea07bc6c366d">&#9670;&nbsp;</a></span>tcp_fasttmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_fasttmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Is called every TCP_FAST_INTERVAL (250 ms) and process data previously "refused" by upper layer (application) and sends delayed ACKs or pending FINs.</p>
+<p>Automatically called from <a class="el" href="tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb">tcp_tmr()</a>. </p>
+
+</div>
+</div>
+<a id="aa2b6b075c27c64dfb8c402ac961fb910"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa2b6b075c27c64dfb8c402ac961fb910">&#9670;&nbsp;</a></span>tcp_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_free </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Free a tcp pcb </p>
+
+</div>
+</div>
+<a id="a51de4ded7d342456d31722493c92c969"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a51de4ded7d342456d31722493c92c969">&#9670;&nbsp;</a></span>tcp_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize this module. </p>
+
+</div>
+</div>
+<a id="a4d0c2d1ad02134c79fc72fe95ee2a703"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4d0c2d1ad02134c79fc72fe95ee2a703">&#9670;&nbsp;</a></span>tcp_netif_ip_addr_changed()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_netif_ip_addr_changed </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>old_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>new_addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called from <a class="el" href="netif_8c.html">netif.c</a> when address is changed or netif is removed</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">old_addr</td><td>IP address of the netif before change </td></tr>
+    <tr><td class="paramname">new_addr</td><td>IP address of the netif after change or NULL if netif has been removed </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="afd5dc2fa74855a84b2da642ba31059ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afd5dc2fa74855a84b2da642ba31059ea">&#9670;&nbsp;</a></span>tcp_next_iss()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t tcp_next_iss </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Calculates a new initial sequence number for new connections.</p>
+<dl class="section return"><dt>Returns</dt><dd>u32_t pseudo random sequence number </dd></dl>
+
+</div>
+</div>
+<a id="a44fc672b9d14a65e61040707c45302ba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a44fc672b9d14a65e61040707c45302ba">&#9670;&nbsp;</a></span>tcp_pcb_purge()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_pcb_purge </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Purges a TCP PCB. Removes any buffered data and frees the buffer memory (pcb-&gt;ooseq, pcb-&gt;unsent and pcb-&gt;unacked are freed).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td><a class="el" href="structtcp__pcb.html">tcp_pcb</a> to purge. The pcb itself is not deallocated! </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aaaef096f6a03bf5b778329bb66ee06f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaaef096f6a03bf5b778329bb66ee06f6">&#9670;&nbsp;</a></span>tcp_pcb_remove()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_pcb_remove </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> **&#160;</td>
+          <td class="paramname"><em>pcblist</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Purges the PCB and removes it from a PCB list. Any delayed ACKs are sent first.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcblist</td><td>PCB list to purge. </td></tr>
+    <tr><td class="paramname">pcb</td><td><a class="el" href="structtcp__pcb.html">tcp_pcb</a> to purge. The pcb itself is NOT deallocated! </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a0075b56ad4b0eca7c9d439cf150e1973"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0075b56ad4b0eca7c9d439cf150e1973">&#9670;&nbsp;</a></span>tcp_process_refused_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> tcp_process_refused_data </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Pass pcb-&gt;refused_data to the recv callback </p>
+
+</div>
+</div>
+<a id="a0cb3f604fc8d20870d8cab291da5701c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0cb3f604fc8d20870d8cab291da5701c">&#9670;&nbsp;</a></span>tcp_recv_null()</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> tcp_recv_null </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td>
+          <td class="paramname"><em>err</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Default receive callback that is called if the user didn't register a recv callback for the pcb. </p>
+
+</div>
+</div>
+<a id="a569d79451d2570e4ef406775725ef6ef"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a569d79451d2570e4ef406775725ef6ef">&#9670;&nbsp;</a></span>tcp_seg_copy()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct tcp_seg* tcp_seg_copy </td>
+          <td>(</td>
+          <td class="paramtype">struct tcp_seg *&#160;</td>
+          <td class="paramname"><em>seg</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns a copy of the given TCP segment. The pbuf and data are not copied, only the pointers</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">seg</td><td>the old tcp_seg </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a copy of seg </dd></dl>
+
+</div>
+</div>
+<a id="ac6283651b26f74dba2444159aee88b20"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac6283651b26f74dba2444159aee88b20">&#9670;&nbsp;</a></span>tcp_seg_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_seg_free </td>
+          <td>(</td>
+          <td class="paramtype">struct tcp_seg *&#160;</td>
+          <td class="paramname"><em>seg</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Frees a TCP segment (tcp_seg structure).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">seg</td><td>single tcp_seg to free </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a3d9bb9809769197bce9b2499d55cf28c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3d9bb9809769197bce9b2499d55cf28c">&#9670;&nbsp;</a></span>tcp_segs_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_segs_free </td>
+          <td>(</td>
+          <td class="paramtype">struct tcp_seg *&#160;</td>
+          <td class="paramname"><em>seg</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Deallocates a list of TCP segments (tcp_seg structures).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">seg</td><td>tcp_seg list of TCP segments to free </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a2c4234f1e95b6bde0e84d4ea97ae95bc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2c4234f1e95b6bde0e84d4ea97ae95bc">&#9670;&nbsp;</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> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>prio</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a421fb42ef919018e14ae413adfee9905">&#9670;&nbsp;</a></span>tcp_slowtmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_slowtmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called every 500 ms and implements the retransmission timer and the timer that removes PCBs that have been in TIME-WAIT for enough time. It also increments various timers such as the inactivity timer in each PCB.</p>
+<p>Automatically called from <a class="el" href="tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb">tcp_tmr()</a>. </p>
+
+</div>
+</div>
+<a id="a3846a756b13214ed88ea47d0ff8279eb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3846a756b13214ed88ea47d0ff8279eb">&#9670;&nbsp;</a></span>tcp_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called periodically to dispatch TCP timers. </p>
+
+</div>
+</div>
+<a id="a5ae0268e59fda0665fdd08c6e77ec547"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5ae0268e59fda0665fdd08c6e77ec547">&#9670;&nbsp;</a></span>tcp_txnow()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_txnow </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Call tcp_output for all active pcbs that have TF_NAGLEMEMERR set </p>
+
+</div>
+</div>
+<a id="a6d2c254b779db4e517cb34e41301588d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6d2c254b779db4e517cb34e41301588d">&#9670;&nbsp;</a></span>tcp_update_rcv_ann_wnd()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t tcp_update_rcv_ann_wnd </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Update the state that tracks the available window space to advertise.</p>
+<p>Returns how much extra window would be advertised if we sent an update now. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="a78c09dbae67ccc06b659d9f1a388f911"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a78c09dbae67ccc06b659d9f1a388f911">&#9670;&nbsp;</a></span>tcp_active_pcbs</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a>* tcp_active_pcbs</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>List of all TCP PCBs that are in a state in which they accept or send data. </p>
+
+</div>
+</div>
+<a id="a1b42a7ac0fc173a42d575f86853d32a8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1b42a7ac0fc173a42d575f86853d32a8">&#9670;&nbsp;</a></span>tcp_bound_pcbs</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a>* tcp_bound_pcbs</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>List of all TCP PCBs bound but not yet (connected || listening) </p>
+
+</div>
+</div>
+<a id="a96fe1350e510d4308ac9969ffb4c9c81"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a96fe1350e510d4308ac9969ffb4c9c81">&#9670;&nbsp;</a></span>tcp_listen_pcbs</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">union tcp_listen_pcbs_t tcp_listen_pcbs</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>List of all TCP PCBs in LISTEN state </p>
+
+</div>
+</div>
+<a id="a51515507dec664e9d69a870e6b627610"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a51515507dec664e9d69a870e6b627610">&#9670;&nbsp;</a></span>tcp_pcb_lists</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a>** const tcp_pcb_lists[]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">= {&amp;<a class="code" href="tcp_8c.html#a96fe1350e510d4308ac9969ffb4c9c81">tcp_listen_pcbs</a>.pcbs, &amp;<a class="code" href="tcp_8c.html#a1b42a7ac0fc173a42d575f86853d32a8">tcp_bound_pcbs</a>,</div><div class="line">         &amp;<a class="code" href="tcp_8c.html#a78c09dbae67ccc06b659d9f1a388f911">tcp_active_pcbs</a>, &amp;<a class="code" href="tcp_8c.html#a9a522a66c5e1f1a4e28fe7a672cc64e3">tcp_tw_pcbs</a></div><div class="line">}</div><div class="ttc" id="tcp_8c_html_a1b42a7ac0fc173a42d575f86853d32a8"><div class="ttname"><a href="tcp_8c.html#a1b42a7ac0fc173a42d575f86853d32a8">tcp_bound_pcbs</a></div><div class="ttdeci">struct tcp_pcb * tcp_bound_pcbs</div><div class="ttdef"><b>Definition:</b> tcp.c:171</div></div>
+<div class="ttc" id="tcp_8c_html_a9a522a66c5e1f1a4e28fe7a672cc64e3"><div class="ttname"><a href="tcp_8c.html#a9a522a66c5e1f1a4e28fe7a672cc64e3">tcp_tw_pcbs</a></div><div class="ttdeci">struct tcp_pcb * tcp_tw_pcbs</div><div class="ttdef"><b>Definition:</b> tcp.c:178</div></div>
+<div class="ttc" id="tcp_8c_html_a78c09dbae67ccc06b659d9f1a388f911"><div class="ttname"><a href="tcp_8c.html#a78c09dbae67ccc06b659d9f1a388f911">tcp_active_pcbs</a></div><div class="ttdeci">struct tcp_pcb * tcp_active_pcbs</div><div class="ttdef"><b>Definition:</b> tcp.c:176</div></div>
+<div class="ttc" id="tcp_8c_html_a96fe1350e510d4308ac9969ffb4c9c81"><div class="ttname"><a href="tcp_8c.html#a96fe1350e510d4308ac9969ffb4c9c81">tcp_listen_pcbs</a></div><div class="ttdeci">union tcp_listen_pcbs_t tcp_listen_pcbs</div><div class="ttdef"><b>Definition:</b> tcp.c:173</div></div>
+</div><!-- fragment --><p>An array with all (non-temporary) PCB lists, mainly used for smaller code size </p>
+
+</div>
+</div>
+<a id="a9a522a66c5e1f1a4e28fe7a672cc64e3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9a522a66c5e1f1a4e28fe7a672cc64e3">&#9670;&nbsp;</a></span>tcp_tw_pcbs</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a>* tcp_tw_pcbs</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>List of all TCP PCBs in TIME-WAIT state </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="tcp_8c.html">tcp.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/tcp_8c.js b/doc/doxygen/output/html/tcp_8c.js
new file mode 100644
index 0000000..4923436
--- /dev/null
+++ b/doc/doxygen/output/html/tcp_8c.js
@@ -0,0 +1,52 @@
+var tcp_8c =
+[
+    [ "tcp_abandon", "tcp_8c.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe", null ],
+    [ "tcp_abort", "group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61", null ],
+    [ "tcp_accept", "group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62", null ],
+    [ "tcp_alloc", "tcp_8c.html#a1dd6830a42b3c464b5a72f62ae312d0a", null ],
+    [ "tcp_arg", "group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6", null ],
+    [ "tcp_backlog_accepted", "group__tcp__raw.html#ga619154658137a23839ca3b94882131ca", null ],
+    [ "tcp_backlog_delayed", "group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8", null ],
+    [ "tcp_bind", "group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee", null ],
+    [ "tcp_bind_netif", "group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f", null ],
+    [ "tcp_close", "group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623", null ],
+    [ "tcp_connect", "group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012", null ],
+    [ "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#gaa8ac7a74407cb3e0e01a30314805f990", 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_fasttmr", "tcp_8c.html#abf446b07e52161b8a53cea07bc6c366d", null ],
+    [ "tcp_free", "tcp_8c.html#aa2b6b075c27c64dfb8c402ac961fb910", null ],
+    [ "tcp_init", "tcp_8c.html#a51de4ded7d342456d31722493c92c969", null ],
+    [ "tcp_listen_with_backlog", "group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338", null ],
+    [ "tcp_listen_with_backlog_and_err", "group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436", null ],
+    [ "tcp_netif_ip_addr_changed", "tcp_8c.html#a4d0c2d1ad02134c79fc72fe95ee2a703", null ],
+    [ "tcp_new", "group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943", null ],
+    [ "tcp_new_ip_type", "group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937", null ],
+    [ "tcp_next_iss", "tcp_8c.html#afd5dc2fa74855a84b2da642ba31059ea", null ],
+    [ "tcp_pcb_purge", "tcp_8c.html#a44fc672b9d14a65e61040707c45302ba", null ],
+    [ "tcp_pcb_remove", "tcp_8c.html#aaaef096f6a03bf5b778329bb66ee06f6", null ],
+    [ "tcp_poll", "group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5", null ],
+    [ "tcp_process_refused_data", "tcp_8c.html#a0075b56ad4b0eca7c9d439cf150e1973", null ],
+    [ "tcp_recv", "group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0", null ],
+    [ "tcp_recv_null", "tcp_8c.html#a0cb3f604fc8d20870d8cab291da5701c", null ],
+    [ "tcp_recved", "group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44", null ],
+    [ "tcp_seg_copy", "tcp_8c.html#a569d79451d2570e4ef406775725ef6ef", null ],
+    [ "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_shutdown", "group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd", null ],
+    [ "tcp_slowtmr", "tcp_8c.html#a421fb42ef919018e14ae413adfee9905", null ],
+    [ "tcp_tmr", "tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb", null ],
+    [ "tcp_txnow", "tcp_8c.html#a5ae0268e59fda0665fdd08c6e77ec547", null ],
+    [ "tcp_update_rcv_ann_wnd", "tcp_8c.html#a6d2c254b779db4e517cb34e41301588d", null ],
+    [ "tcp_active_pcbs", "tcp_8c.html#a78c09dbae67ccc06b659d9f1a388f911", null ],
+    [ "tcp_bound_pcbs", "tcp_8c.html#a1b42a7ac0fc173a42d575f86853d32a8", null ],
+    [ "tcp_listen_pcbs", "tcp_8c.html#a96fe1350e510d4308ac9969ffb4c9c81", null ],
+    [ "tcp_pcb_lists", "tcp_8c.html#a51515507dec664e9d69a870e6b627610", null ],
+    [ "tcp_tw_pcbs", "tcp_8c.html#a9a522a66c5e1f1a4e28fe7a672cc64e3", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/tcp_8h.html b/doc/doxygen/output/html/tcp_8h.html
new file mode 100644
index 0000000..27872f1
--- /dev/null
+++ b/doc/doxygen/output/html/tcp_8h.html
@@ -0,0 +1,501 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/tcp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('tcp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">tcp.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="tcpbase_8h.html">lwip/tcpbase.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="pbuf_8h.html">lwip/pbuf.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="icmp_8h.html">lwip/icmp.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="ip6_8h.html">lwip/ip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structtcp__ext__arg__callbacks.html">tcp_ext_arg_callbacks</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="structtcp__pcb__listen.html">tcp_pcb_listen</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="structtcp__pcb.html">tcp_pcb</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a874630045102fc5f1442704a790c8bb8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8h.html#a874630045102fc5f1442704a790c8bb8">TCP_PCB_COMMON</a>(type)</td></tr>
+<tr class="separator:a874630045102fc5f1442704a790c8bb8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab0b45a01dcd461e5b8df2a1d9ddda134"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gab0b45a01dcd461e5b8df2a1d9ddda134">tcp_mss</a>(pcb)&#160;&#160;&#160;((pcb)-&gt;mss)</td></tr>
+<tr class="separator:gab0b45a01dcd461e5b8df2a1d9ddda134"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad1a95f09deb49cd7341d35527d6d3e2f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gad1a95f09deb49cd7341d35527d6d3e2f">tcp_sndbuf</a>(pcb)&#160;&#160;&#160;(TCPWND16((pcb)-&gt;snd_buf))</td></tr>
+<tr class="separator:gad1a95f09deb49cd7341d35527d6d3e2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga53ee4364718e84dc42cb1e0179deb1f4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga53ee4364718e84dc42cb1e0179deb1f4">tcp_sndqueuelen</a>(pcb)&#160;&#160;&#160;((pcb)-&gt;snd_queuelen)</td></tr>
+<tr class="separator:ga53ee4364718e84dc42cb1e0179deb1f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5b5c0093efff4466bda06d45f12a4633"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga5b5c0093efff4466bda06d45f12a4633">tcp_nagle_disable</a>(pcb)&#160;&#160;&#160;tcp_set_flags(pcb, TF_NODELAY)</td></tr>
+<tr class="separator:ga5b5c0093efff4466bda06d45f12a4633"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9dfcdb8a05533b07dca91cf7e784f88f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga9dfcdb8a05533b07dca91cf7e784f88f">tcp_nagle_enable</a>(pcb)&#160;&#160;&#160;tcp_clear_flags(pcb, TF_NODELAY)</td></tr>
+<tr class="separator:ga9dfcdb8a05533b07dca91cf7e784f88f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga9398061411b4af900160233aa3b1a286"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga9398061411b4af900160233aa3b1a286">tcp_nagle_disabled</a>(pcb)&#160;&#160;&#160;tcp_is_flag_set(pcb, TF_NODELAY)</td></tr>
+<tr class="separator:ga9398061411b4af900160233aa3b1a286"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6b2a4efb1fc15d7d85cb71cb2a1d1066"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga6b2a4efb1fc15d7d85cb71cb2a1d1066">tcp_listen</a>(pcb)&#160;&#160;&#160;<a class="el" href="group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338">tcp_listen_with_backlog</a>(pcb, <a class="el" href="group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf">TCP_DEFAULT_LISTEN_BACKLOG</a>)</td></tr>
+<tr class="separator:ga6b2a4efb1fc15d7d85cb71cb2a1d1066"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a00517abce6856d6c82f0efebdafb734d"><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8h.html#a00517abce6856d6c82f0efebdafb734d">tcp_accept_fn</a>) (void *arg, struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *newpcb, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> err)</td></tr>
+<tr class="separator:a00517abce6856d6c82f0efebdafb734d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a780cfac08b02c66948ab94ea974202e8"><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8h.html#a780cfac08b02c66948ab94ea974202e8">tcp_recv_fn</a>) (void *arg, struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *tpcb, 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>
+<tr class="separator:a780cfac08b02c66948ab94ea974202e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa60622ffaa099e97f66fb56e437fca18"><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18">tcp_sent_fn</a>) (void *arg, struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *tpcb, u16_t len)</td></tr>
+<tr class="separator:aa60622ffaa099e97f66fb56e437fca18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a66deb97618a9cd9d57fca28c5245e073"><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8h.html#a66deb97618a9cd9d57fca28c5245e073">tcp_poll_fn</a>) (void *arg, struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *tpcb)</td></tr>
+<tr class="separator:a66deb97618a9cd9d57fca28c5245e073"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1b4f9e3551e575c0ef06d6daa7f06e55"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55">tcp_err_fn</a>) (void *arg, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> err)</td></tr>
+<tr class="separator:a1b4f9e3551e575c0ef06d6daa7f06e55"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a939867106bd492caf2d85852fb7f6ae8"><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8h.html#a939867106bd492caf2d85852fb7f6ae8">tcp_connected_fn</a>) (void *arg, struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *tpcb, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> err)</td></tr>
+<tr class="separator:a939867106bd492caf2d85852fb7f6ae8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a20881e537f5be7847d88fe2a0c8fd2cd"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8h.html#a20881e537f5be7847d88fe2a0c8fd2cd">tcp_extarg_callback_pcb_destroyed_fn</a>) (u8_t id, void *data)</td></tr>
+<tr class="separator:a20881e537f5be7847d88fe2a0c8fd2cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba649c5bdf19d47e39643392b6d88588"><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8h.html#aba649c5bdf19d47e39643392b6d88588">tcp_extarg_callback_passive_open_fn</a>) (u8_t id, 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:aba649c5bdf19d47e39643392b6d88588"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga7427c5d237fe66a8097bfa8d24ceb943"><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="group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943">tcp_new</a> (void)</td></tr>
+<tr class="separator:ga7427c5d237fe66a8097bfa8d24ceb943"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac14e757a21a4a87c6aa52372c210b937"><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="group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937">tcp_new_ip_type</a> (u8_t type)</td></tr>
+<tr class="separator:gac14e757a21a4a87c6aa52372c210b937"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac10926e6f76f73e17c0d37aaab3e56b6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6">tcp_arg</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, void *arg)</td></tr>
+<tr class="separator:gac10926e6f76f73e17c0d37aaab3e56b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8afd0b316a87a5eeff4726dc95006ed0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0">tcp_recv</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, <a class="el" href="tcp_8h.html#a780cfac08b02c66948ab94ea974202e8">tcp_recv_fn</a> <a class="el" href="group__socket.html#gadd7ae45df7c005619eb1126542231e9b">recv</a>)</td></tr>
+<tr class="separator:ga8afd0b316a87a5eeff4726dc95006ed0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1596332b93bb6249179f3b89f24bd808"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808">tcp_sent</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, <a class="el" href="tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18">tcp_sent_fn</a> sent)</td></tr>
+<tr class="separator:ga1596332b93bb6249179f3b89f24bd808"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae1346c4e34d3bc7c01e1b47142ab3121"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121">tcp_err</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, <a class="el" href="tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55">tcp_err_fn</a> err)</td></tr>
+<tr class="separator:gae1346c4e34d3bc7c01e1b47142ab3121"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaff4c3e380fc60c8fb9b3aa95eda94c62"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62">tcp_accept</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, <a class="el" href="tcp_8h.html#a00517abce6856d6c82f0efebdafb734d">tcp_accept_fn</a> <a class="el" href="group__socket.html#gade2b17671b5a4b18e941fbf7e1060310">accept</a>)</td></tr>
+<tr class="separator:gaff4c3e380fc60c8fb9b3aa95eda94c62"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gafba47015098ed7ce523dcf7bdf70f7e5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5">tcp_poll</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, <a class="el" href="tcp_8h.html#a66deb97618a9cd9d57fca28c5245e073">tcp_poll_fn</a> <a class="el" href="group__socket.html#ga80ae38841b0e64e60618cd8bf857f617">poll</a>, u8_t interval)</td></tr>
+<tr class="separator:gafba47015098ed7ce523dcf7bdf70f7e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga427b11c7b98c748ec487cd43093bd2f8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8">tcp_backlog_delayed</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga427b11c7b98c748ec487cd43093bd2f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga619154658137a23839ca3b94882131ca"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga619154658137a23839ca3b94882131ca">tcp_backlog_accepted</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga619154658137a23839ca3b94882131ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabdac0856a52b5789dc897d4c7137ec44"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44">tcp_recved</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u16_t len)</td></tr>
+<tr class="separator:gabdac0856a52b5789dc897d4c7137ec44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacf5aa67bd7fc66fef43f77a55a1201ee"><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#gacf5aa67bd7fc66fef43f77a55a1201ee">tcp_bind</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, u16_t port)</td></tr>
+<tr class="separator:gacf5aa67bd7fc66fef43f77a55a1201ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6469a15709088e80024258dbe80fcd1f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f">tcp_bind_netif</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, const struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga6469a15709088e80024258dbe80fcd1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012">tcp_connect</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">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:gac86ad8ded4d1db15a5b5fb42eb7c1436"><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="group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436">tcp_listen_with_backlog_and_err</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t backlog, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> *err)</td></tr>
+<tr class="separator:gac86ad8ded4d1db15a5b5fb42eb7c1436"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaeff14f321d1eecd0431611f382fcd338"><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="group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338">tcp_listen_with_backlog</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t backlog)</td></tr>
+<tr class="separator:gaeff14f321d1eecd0431611f382fcd338"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga468c2260ddb01582e966ddcf3c25ce61"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61">tcp_abort</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga468c2260ddb01582e966ddcf3c25ce61"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga87093e137fcc53ea82a134a3f5b33623"><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#ga87093e137fcc53ea82a134a3f5b33623">tcp_close</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga87093e137fcc53ea82a134a3f5b33623"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5b94d57f1891b9287f88525a2ac561dd"><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#ga5b94d57f1891b9287f88525a2ac561dd">tcp_shutdown</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, int shut_rx, int shut_tx)</td></tr>
+<tr class="separator:ga5b94d57f1891b9287f88525a2ac561dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp_8h.html#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: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"><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"><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"><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:gaa8ac7a74407cb3e0e01a30314805f990"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html#gaa8ac7a74407cb3e0e01a30314805f990">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:gaa8ac7a74407cb3e0e01a30314805f990"><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>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a874630045102fc5f1442704a790c8bb8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a874630045102fc5f1442704a790c8bb8">&#9670;&nbsp;</a></span>TCP_PCB_COMMON</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_PCB_COMMON</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">type</td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">type *next; <span class="comment">/* for the linked list */</span> \</div><div class="line">  void *callback_arg; \</div><div class="line">  TCP_PCB_EXTARGS \</div><div class="line">  enum tcp_state state; <span class="comment">/* TCP state */</span> \</div><div class="line">  u8_t prio; \</div><div class="line">  <span class="comment">/* ports are in host byte order */</span> \</div><div class="line">  u16_t local_port</div></div><!-- fragment --><p>members common to struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> and struct tcp_listen_pcb </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="a00517abce6856d6c82f0efebdafb734d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a00517abce6856d6c82f0efebdafb734d">&#9670;&nbsp;</a></span>tcp_accept_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(* tcp_accept_fn) (void *arg, struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *newpcb, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> err)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for tcp accept callback functions. Called when a new connection can be accepted on a listening pcb.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>Additional argument to pass to the callback function (</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6">tcp_arg()</a>) </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">newpcb</td><td>The new connection pcb </td></tr>
+    <tr><td class="paramname">err</td><td>An error code if there has been an error accepting. Only return ERR_ABRT if you have called tcp_abort from within the callback function! </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a939867106bd492caf2d85852fb7f6ae8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a939867106bd492caf2d85852fb7f6ae8">&#9670;&nbsp;</a></span>tcp_connected_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(* tcp_connected_fn) (void *arg, struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *tpcb, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> err)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for tcp connected callback functions. Called when a pcb is connected to the remote side after initiating a connection attempt by calling <a class="el" href="group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012">tcp_connect()</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>Additional argument to pass to the callback function (</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6">tcp_arg()</a>) </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">tpcb</td><td>The connection pcb which is connected </td></tr>
+    <tr><td class="paramname">err</td><td>An unused error code, always ERR_OK currently ;-)</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section note"><dt>Note</dt><dd>When a connection attempt fails, the error callback is currently called! </dd></dl>
+
+</div>
+</div>
+<a id="a1b4f9e3551e575c0ef06d6daa7f06e55"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1b4f9e3551e575c0ef06d6daa7f06e55">&#9670;&nbsp;</a></span>tcp_err_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* tcp_err_fn) (void *arg, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> err)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for tcp error callback functions. Called when the pcb receives a RST or is unexpectedly closed for any other reason.</p>
+<dl class="section note"><dt>Note</dt><dd>The corresponding pcb is already freed when this callback is called!</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>Additional argument to pass to the callback function (</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6">tcp_arg()</a>) </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">err</td><td>Error code to indicate why the pcb has been closed ERR_ABRT: aborted through tcp_abort or by a TCP timer ERR_RST: the connection was reset by the remote host </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aba649c5bdf19d47e39643392b6d88588"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aba649c5bdf19d47e39643392b6d88588">&#9670;&nbsp;</a></span>tcp_extarg_callback_passive_open_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(* tcp_extarg_callback_passive_open_fn) (u8_t id, 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>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype to transition arguments from a listening pcb to an accepted pcb</p>
+<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">lpcb</td><td>the listening pcb accepting a connection </td></tr>
+    <tr><td class="paramname">cpcb</td><td>the newly allocated connection pcb </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if OK, any error if connection should be dropped </dd></dl>
+
+</div>
+</div>
+<a id="a20881e537f5be7847d88fe2a0c8fd2cd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a20881e537f5be7847d88fe2a0c8fd2cd">&#9670;&nbsp;</a></span>tcp_extarg_callback_pcb_destroyed_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* tcp_extarg_callback_pcb_destroyed_fn) (u8_t id, void *data)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for deallocation of arguments. Called <em>just before</em> the pcb is freed, so don't expect to be able to do anything with this pcb!</p>
+<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>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a66deb97618a9cd9d57fca28c5245e073"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a66deb97618a9cd9d57fca28c5245e073">&#9670;&nbsp;</a></span>tcp_poll_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(* tcp_poll_fn) (void *arg, struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *tpcb)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for tcp poll callback functions. Called periodically as specified by </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5">tcp_poll</a>.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>Additional argument to pass to the callback function (</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6">tcp_arg()</a>) </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">tpcb</td><td>tcp pcb </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK: try to send some data by calling tcp_output Only return ERR_ABRT if you have called tcp_abort from within the callback function! </dd></dl>
+
+</div>
+</div>
+<a id="a780cfac08b02c66948ab94ea974202e8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a780cfac08b02c66948ab94ea974202e8">&#9670;&nbsp;</a></span>tcp_recv_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(* tcp_recv_fn) (void *arg, struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *tpcb, 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>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for tcp receive callback functions. Called when data has been received.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>Additional argument to pass to the callback function (</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6">tcp_arg()</a>) </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">tpcb</td><td>The connection pcb which received data </td></tr>
+    <tr><td class="paramname">p</td><td>The received data (or NULL when the connection has been closed!) </td></tr>
+    <tr><td class="paramname">err</td><td>An error code if there has been an error receiving Only return ERR_ABRT if you have called tcp_abort from within the callback function! </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aa60622ffaa099e97f66fb56e437fca18"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa60622ffaa099e97f66fb56e437fca18">&#9670;&nbsp;</a></span>tcp_sent_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>(* tcp_sent_fn) (void *arg, struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *tpcb, u16_t len)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for tcp sent callback functions. Called when sent data has been acknowledged by the remote side. Use it to free corresponding resources. This also means that the pcb has now space available to send new data.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>Additional argument to pass to the callback function (</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6">tcp_arg()</a>) </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">tpcb</td><td>The connection pcb for which data has been acknowledged </td></tr>
+    <tr><td class="paramname">len</td><td>The amount of bytes acknowledged </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK: try to send some data by calling tcp_output Only return ERR_ABRT if you have called tcp_abort from within the callback function! </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a2c4234f1e95b6bde0e84d4ea97ae95bc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2c4234f1e95b6bde0e84d4ea97ae95bc">&#9670;&nbsp;</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> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>prio</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></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 -->
+<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="tcp_8h.html">tcp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/tcp_8h.js b/doc/doxygen/output/html/tcp_8h.js
new file mode 100644
index 0000000..03b754f
--- /dev/null
+++ b/doc/doxygen/output/html/tcp_8h.js
@@ -0,0 +1,48 @@
+var tcp_8h =
+[
+    [ "tcp_ext_arg_callbacks", "structtcp__ext__arg__callbacks.html", "structtcp__ext__arg__callbacks" ],
+    [ "tcp_pcb_listen", "structtcp__pcb__listen.html", "structtcp__pcb__listen" ],
+    [ "tcp_pcb", "structtcp__pcb.html", "structtcp__pcb" ],
+    [ "tcp_listen", "group__tcp__raw.html#ga6b2a4efb1fc15d7d85cb71cb2a1d1066", null ],
+    [ "tcp_mss", "group__tcp__raw.html#gab0b45a01dcd461e5b8df2a1d9ddda134", null ],
+    [ "tcp_nagle_disable", "group__tcp__raw.html#ga5b5c0093efff4466bda06d45f12a4633", null ],
+    [ "tcp_nagle_disabled", "group__tcp__raw.html#ga9398061411b4af900160233aa3b1a286", null ],
+    [ "tcp_nagle_enable", "group__tcp__raw.html#ga9dfcdb8a05533b07dca91cf7e784f88f", null ],
+    [ "TCP_PCB_COMMON", "tcp_8h.html#a874630045102fc5f1442704a790c8bb8", null ],
+    [ "tcp_sndbuf", "group__tcp__raw.html#gad1a95f09deb49cd7341d35527d6d3e2f", null ],
+    [ "tcp_sndqueuelen", "group__tcp__raw.html#ga53ee4364718e84dc42cb1e0179deb1f4", null ],
+    [ "tcp_accept_fn", "tcp_8h.html#a00517abce6856d6c82f0efebdafb734d", null ],
+    [ "tcp_connected_fn", "tcp_8h.html#a939867106bd492caf2d85852fb7f6ae8", null ],
+    [ "tcp_err_fn", "tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55", null ],
+    [ "tcp_extarg_callback_passive_open_fn", "tcp_8h.html#aba649c5bdf19d47e39643392b6d88588", null ],
+    [ "tcp_extarg_callback_pcb_destroyed_fn", "tcp_8h.html#a20881e537f5be7847d88fe2a0c8fd2cd", null ],
+    [ "tcp_poll_fn", "tcp_8h.html#a66deb97618a9cd9d57fca28c5245e073", null ],
+    [ "tcp_recv_fn", "tcp_8h.html#a780cfac08b02c66948ab94ea974202e8", null ],
+    [ "tcp_sent_fn", "tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18", null ],
+    [ "tcp_abort", "group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61", null ],
+    [ "tcp_accept", "group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62", null ],
+    [ "tcp_arg", "group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6", null ],
+    [ "tcp_backlog_accepted", "group__tcp__raw.html#ga619154658137a23839ca3b94882131ca", null ],
+    [ "tcp_backlog_delayed", "group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8", null ],
+    [ "tcp_bind", "group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee", null ],
+    [ "tcp_bind_netif", "group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f", null ],
+    [ "tcp_close", "group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623", null ],
+    [ "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#gaa8ac7a74407cb3e0e01a30314805f990", 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_listen_with_backlog", "group__tcp__raw.html#gaeff14f321d1eecd0431611f382fcd338", null ],
+    [ "tcp_listen_with_backlog_and_err", "group__tcp__raw.html#gac86ad8ded4d1db15a5b5fb42eb7c1436", null ],
+    [ "tcp_new", "group__tcp__raw.html#ga7427c5d237fe66a8097bfa8d24ceb943", null ],
+    [ "tcp_new_ip_type", "group__tcp__raw.html#gac14e757a21a4a87c6aa52372c210b937", null ],
+    [ "tcp_output", "group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f", null ],
+    [ "tcp_poll", "group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5", null ],
+    [ "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_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
new file mode 100644
index 0000000..64995ae
--- /dev/null
+++ b/doc/doxygen/output/html/tcp__in_8c.html
@@ -0,0 +1,189 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/tcp_in.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('tcp__in_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">tcp_in.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 &quot;<a class="el" href="tcp__priv_8h.html">lwip/priv/tcp_priv.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="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="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="inet__chksum_8h.html">lwip/inet_chksum.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6_8h.html">lwip/ip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="nd6_8h.html">lwip/nd6.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;path/to/my/lwip_hooks.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:aea174f2c6ca4cb0ad270dd8d0faf0c84"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__in_8c.html#aea174f2c6ca4cb0ad270dd8d0faf0c84">LWIP_TCP_CALC_INITIAL_CWND</a>(mss)&#160;&#160;&#160;((tcpwnd_size_t)LWIP_MIN((4U * (mss)), LWIP_MAX((2U * (mss)), 4380U)))</td></tr>
+<tr class="separator:aea174f2c6ca4cb0ad270dd8d0faf0c84"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae70c3c99d9dd6b07f7e11f7ba5eedcb5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__in_8c.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5">tcp_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:ae70c3c99d9dd6b07f7e11f7ba5eedcb5"><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>Transmission Control Protocol, incoming traffic</p>
+<p>The input processing functions of the TCP layer.</p>
+<p>These functions are generally called in the order (<a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip_input()</a> -&gt;) <a class="el" href="tcp__in_8c.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5">tcp_input()</a> -&gt; * tcp_process() -&gt; tcp_receive() (-&gt; application). </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="aea174f2c6ca4cb0ad270dd8d0faf0c84"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aea174f2c6ca4cb0ad270dd8d0faf0c84">&#9670;&nbsp;</a></span>LWIP_TCP_CALC_INITIAL_CWND</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_TCP_CALC_INITIAL_CWND</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">mss</td><td>)</td>
+          <td>&#160;&#160;&#160;((tcpwnd_size_t)LWIP_MIN((4U * (mss)), LWIP_MAX((2U * (mss)), 4380U)))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initial CWND calculation as defined RFC 2581 </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ae70c3c99d9dd6b07f7e11f7ba5eedcb5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae70c3c99d9dd6b07f7e11f7ba5eedcb5">&#9670;&nbsp;</a></span>tcp_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The initial input processing of TCP. It verifies the TCP header, demultiplexes the segment between the PCBs and passes it on to tcp_process(), which implements the TCP finite state machine. This function is called by the IP layer (in <a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip_input()</a>).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>received TCP segment to process (p-&gt;payload pointing to the TCP header) </td></tr>
+    <tr><td class="paramname">inp</td><td>network interface on which this segment was received </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_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li><li class="navelem"><a class="el" href="tcp__in_8c.html">tcp_in.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/tcp__in_8c.js b/doc/doxygen/output/html/tcp__in_8c.js
new file mode 100644
index 0000000..b0d0b6a
--- /dev/null
+++ b/doc/doxygen/output/html/tcp__in_8c.js
@@ -0,0 +1,5 @@
+var tcp__in_8c =
+[
+    [ "LWIP_TCP_CALC_INITIAL_CWND", "tcp__in_8c.html#aea174f2c6ca4cb0ad270dd8d0faf0c84", null ],
+    [ "tcp_input", "tcp__in_8c.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/tcp__out_8c.html b/doc/doxygen/output/html/tcp__out_8c.html
new file mode 100644
index 0000000..99b966b
--- /dev/null
+++ b/doc/doxygen/output/html/tcp__out_8c.html
@@ -0,0 +1,592 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/tcp_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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('tcp__out_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">tcp_out.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 &quot;<a class="el" href="tcp__priv_8h.html">lwip/priv/tcp_priv.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="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="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="inet__chksum_8h.html">lwip/inet_chksum.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6_8h.html">lwip/ip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;path/to/my/lwip_hooks.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a25d7e9081baa5c84f2ebd34b0eb4169b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__out_8c.html#a25d7e9081baa5c84f2ebd34b0eb4169b">TCP_CHECKSUM_ON_COPY_SANITY_CHECK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a25d7e9081baa5c84f2ebd34b0eb4169b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa2ef22d2384225a1b5fee187411cc129"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__out_8c.html#aa2ef22d2384225a1b5fee187411cc129">TCP_OVERSIZE_CALC_LENGTH</a>(length)&#160;&#160;&#160;((length) + <a class="el" href="group__lwip__opts__tcp.html#ga5648e2580bb55c0efdfbebcf3bad1eef">TCP_OVERSIZE</a>)</td></tr>
+<tr class="separator:aa2ef22d2384225a1b5fee187411cc129"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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 *arg, u16_t len, u8_t apiflags)</td></tr>
+<tr class="separator:ga6b2aa0efbf10e254930332b7c89cd8c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac930859c4e4ad9fcf6bb25ef5e91bcd5"><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="tcp__out_8c.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5">tcp_split_unsent_seg</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u16_t split)</td></tr>
+<tr class="separator:ac930859c4e4ad9fcf6bb25ef5e91bcd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af40ba9d645a8910436c3d7cf13dba342"><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="tcp__out_8c.html#af40ba9d645a8910436c3d7cf13dba342">tcp_send_fin</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:af40ba9d645a8910436c3d7cf13dba342"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa7d5d552647d567095876aab202bfd1a"><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="tcp__out_8c.html#aa7d5d552647d567095876aab202bfd1a">tcp_enqueue_flags</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t flags)</td></tr>
+<tr class="separator:aa7d5d552647d567095876aab202bfd1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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:a1f318930bd6d49074343cc79c5166f39"><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="tcp__out_8c.html#a1f318930bd6d49074343cc79c5166f39">tcp_rexmit_rto_prepare</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:a1f318930bd6d49074343cc79c5166f39"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ef9dc094e21bdf0779aed25ab0b08d4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__out_8c.html#a9ef9dc094e21bdf0779aed25ab0b08d4">tcp_rexmit_rto_commit</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:a9ef9dc094e21bdf0779aed25ab0b08d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab5ef9c8ab4629eb721987ae316b9f30f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__out_8c.html#ab5ef9c8ab4629eb721987ae316b9f30f">tcp_rexmit_rto</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ab5ef9c8ab4629eb721987ae316b9f30f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af75fefe4fe509845be156d6e424eb6f1"><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="tcp__out_8c.html#af75fefe4fe509845be156d6e424eb6f1">tcp_rexmit</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:af75fefe4fe509845be156d6e424eb6f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adb6ee7b4d59f125cc8bfac3bb5ca3937"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__out_8c.html#adb6ee7b4d59f125cc8bfac3bb5ca3937">tcp_rexmit_fast</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:adb6ee7b4d59f125cc8bfac3bb5ca3937"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa90f8051c9633d3017c588245cdc4014"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__out_8c.html#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#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *local_ip, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">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: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="tcp__out_8c.html#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"><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="tcp__out_8c.html#a0d8bb5fc8522515aa35d305774cc5332">tcp_keepalive</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:a0d8bb5fc8522515aa35d305774cc5332"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c20490aa45c771c38ce8ad3031cbdf6"><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="tcp__out_8c.html#a6c20490aa45c771c38ce8ad3031cbdf6">tcp_zero_window_probe</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:a6c20490aa45c771c38ce8ad3031cbdf6"><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>Transmission Control Protocol, outgoing traffic</p>
+<p>The output functions of TCP.</p>
+<p>There are two distinct ways for TCP segments to get sent:</p><ul>
+<li>queued data: these are segments transferring data or segments containing SYN or FIN (which both count as one sequence number). They are created as struct <a class="el" href="group__pbuf.html">Packet buffers (PBUF)</a> together with a struct tcp_seg and enqueue to the unsent list of the pcb. They are sent by tcp_output:<ul>
+<li><a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp_write</a> : creates data segments</li>
+<li><a class="el" href="tcp__priv_8h.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5">tcp_split_unsent_seg</a> : splits a data segment</li>
+<li><a class="el" href="tcp__priv_8h.html#aa7d5d552647d567095876aab202bfd1a">tcp_enqueue_flags</a> : creates SYN-only or FIN-only segments</li>
+<li><a class="el" href="group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f">tcp_output</a> / tcp_output_segment : finalize the tcp header (e.g. sequence numbers, options, checksum) and output to IP</li>
+<li>the various tcp_rexmit functions shuffle around segments between the unsent an unacked lists to retransmit them</li>
+<li>tcp_create_segment and tcp_pbuf_prealloc allocate pbuf and segment for these functions</li>
+</ul>
+</li>
+<li>direct send: these segments don't contain data but control the connection behaviour. They are created as pbuf only and sent directly without enqueueing them:<ul>
+<li><a class="el" href="tcp__priv_8h.html#aefde3e34b2cc8df9654986484c44a996">tcp_send_empty_ack</a> sends an ACK-only segment</li>
+<li><a class="el" href="tcp__priv_8h.html#aa90f8051c9633d3017c588245cdc4014">tcp_rst</a> sends a RST segment</li>
+<li><a class="el" href="tcp__priv_8h.html#a0d8bb5fc8522515aa35d305774cc5332">tcp_keepalive</a> sends a keepalive segment</li>
+<li><a class="el" href="tcp__priv_8h.html#a6c20490aa45c771c38ce8ad3031cbdf6">tcp_zero_window_probe</a> sends a window probe segment</li>
+<li>tcp_output_alloc_header allocates a header-only pbuf for these functions </li>
+</ul>
+</li>
+</ul>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a25d7e9081baa5c84f2ebd34b0eb4169b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a25d7e9081baa5c84f2ebd34b0eb4169b">&#9670;&nbsp;</a></span>TCP_CHECKSUM_ON_COPY_SANITY_CHECK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_CHECKSUM_ON_COPY_SANITY_CHECK&#160;&#160;&#160;0</td>
+        </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>
+
+</div>
+</div>
+<a id="aa2ef22d2384225a1b5fee187411cc129"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa2ef22d2384225a1b5fee187411cc129">&#9670;&nbsp;</a></span>TCP_OVERSIZE_CALC_LENGTH</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_OVERSIZE_CALC_LENGTH</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">length</td><td>)</td>
+          <td>&#160;&#160;&#160;((length) + <a class="el" href="group__lwip__opts__tcp.html#ga5648e2580bb55c0efdfbebcf3bad1eef">TCP_OVERSIZE</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The size of segment pbufs created when TCP_OVERSIZE is enabled </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="aa7d5d552647d567095876aab202bfd1a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa7d5d552647d567095876aab202bfd1a">&#9670;&nbsp;</a></span>tcp_enqueue_flags()</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> tcp_enqueue_flags </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>flags</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Enqueue SYN or FIN for transmission.</p>
+<p>Called by <a class="el" href="group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012">tcp_connect</a>, tcp_listen_input, and <a class="el" href="group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623">tcp_close</a> (via <a class="el" href="tcp__priv_8h.html#af40ba9d645a8910436c3d7cf13dba342">tcp_send_fin</a>)</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>Protocol control block for the TCP connection. </td></tr>
+    <tr><td class="paramname">flags</td><td>TCP header flags to set in the outgoing segment. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a0d8bb5fc8522515aa35d305774cc5332"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0d8bb5fc8522515aa35d305774cc5332">&#9670;&nbsp;</a></span>tcp_keepalive()</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> tcp_keepalive </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send keepalive packets to keep a connection active although no data is sent over it.</p>
+<p>Called by <a class="el" href="tcp_8c.html#a421fb42ef919018e14ae413adfee9905">tcp_slowtmr()</a></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> for which to send a keepalive packet </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="af75fefe4fe509845be156d6e424eb6f1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af75fefe4fe509845be156d6e424eb6f1">&#9670;&nbsp;</a></span>tcp_rexmit()</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> tcp_rexmit </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Requeue the first unacked segment for retransmission</p>
+<p>Called by tcp_receive() for fast retransmit.</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> for which to retransmit the first unacked segment </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="adb6ee7b4d59f125cc8bfac3bb5ca3937"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adb6ee7b4d59f125cc8bfac3bb5ca3937">&#9670;&nbsp;</a></span>tcp_rexmit_fast()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_rexmit_fast </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Handle retransmission after three dupacks received</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> for which to retransmit the first unacked segment </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab5ef9c8ab4629eb721987ae316b9f30f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab5ef9c8ab4629eb721987ae316b9f30f">&#9670;&nbsp;</a></span>tcp_rexmit_rto()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_rexmit_rto </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Requeue all unacked segments for retransmission</p>
+<p>Called by tcp_process() only, <a class="el" href="tcp_8c.html#a421fb42ef919018e14ae413adfee9905">tcp_slowtmr()</a> needs to do some things between "prepare" and "commit".</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> for which to re-enqueue all unacked segments </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a9ef9dc094e21bdf0779aed25ab0b08d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ef9dc094e21bdf0779aed25ab0b08d4">&#9670;&nbsp;</a></span>tcp_rexmit_rto_commit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_rexmit_rto_commit </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Requeue all unacked segments for retransmission</p>
+<p>Called by <a class="el" href="tcp_8c.html#a421fb42ef919018e14ae413adfee9905">tcp_slowtmr()</a> for slow retransmission.</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> for which to re-enqueue all unacked segments </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a1f318930bd6d49074343cc79c5166f39"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1f318930bd6d49074343cc79c5166f39">&#9670;&nbsp;</a></span>tcp_rexmit_rto_prepare()</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> tcp_rexmit_rto_prepare </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Requeue all unacked segments for retransmission</p>
+<p>Called by <a class="el" href="tcp_8c.html#a421fb42ef919018e14ae413adfee9905">tcp_slowtmr()</a> for slow retransmission.</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> for which to re-enqueue all unacked segments </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aa90f8051c9633d3017c588245cdc4014"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa90f8051c9633d3017c588245cdc4014">&#9670;&nbsp;</a></span>tcp_rst()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_rst </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>seqno</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>ackno</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>local_ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>remote_ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>local_port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>remote_port</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </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>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">pcb</td><td>TCP pcb (may be NULL if no pcb is available) </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"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aefde3e34b2cc8df9654986484c44a996">&#9670;&nbsp;</a></span>tcp_send_empty_ack()</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> tcp_send_empty_ack </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an ACK without data.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>Protocol control block for the TCP connection to send the ACK </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="af40ba9d645a8910436c3d7cf13dba342"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af40ba9d645a8910436c3d7cf13dba342">&#9670;&nbsp;</a></span>tcp_send_fin()</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> tcp_send_fin </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by <a class="el" href="group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623">tcp_close()</a> to send a segment including FIN flag but not data. This FIN may be added to an existing segment or a new, otherwise empty segment is enqueued.</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> over which to send a segment </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if sent, another err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ac930859c4e4ad9fcf6bb25ef5e91bcd5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac930859c4e4ad9fcf6bb25ef5e91bcd5">&#9670;&nbsp;</a></span>tcp_split_unsent_seg()</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> tcp_split_unsent_seg </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>split</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Split segment on the head of the unsent queue. If return is not ERR_OK, existing head remains intact</p>
+<p>The split is accomplished by creating a new TCP segment and pbuf which holds the remainder payload after the split. The original pbuf is trimmed to new length. This allows splitting of read-only pbufs</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> for which to split the unsent head </td></tr>
+    <tr><td class="paramname">split</td><td>the amount of payload to remain in the head </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a6c20490aa45c771c38ce8ad3031cbdf6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6c20490aa45c771c38ce8ad3031cbdf6">&#9670;&nbsp;</a></span>tcp_zero_window_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> tcp_zero_window_probe </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send persist timer zero-window probes to keep a connection active when a window update is lost.</p>
+<p>Called by <a class="el" href="tcp_8c.html#a421fb42ef919018e14ae413adfee9905">tcp_slowtmr()</a></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> for which to send a zero-window probe packet </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_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li><li class="navelem"><a class="el" href="tcp__out_8c.html">tcp_out.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/tcp__out_8c.js b/doc/doxygen/output/html/tcp__out_8c.js
new file mode 100644
index 0000000..39712b9
--- /dev/null
+++ b/doc/doxygen/output/html/tcp__out_8c.js
@@ -0,0 +1,19 @@
+var tcp__out_8c =
+[
+    [ "TCP_CHECKSUM_ON_COPY_SANITY_CHECK", "tcp__out_8c.html#a25d7e9081baa5c84f2ebd34b0eb4169b", null ],
+    [ "TCP_OVERSIZE_CALC_LENGTH", "tcp__out_8c.html#aa2ef22d2384225a1b5fee187411cc129", null ],
+    [ "tcp_enqueue_flags", "tcp__out_8c.html#aa7d5d552647d567095876aab202bfd1a", null ],
+    [ "tcp_keepalive", "tcp__out_8c.html#a0d8bb5fc8522515aa35d305774cc5332", null ],
+    [ "tcp_output", "group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f", null ],
+    [ "tcp_rexmit", "tcp__out_8c.html#af75fefe4fe509845be156d6e424eb6f1", null ],
+    [ "tcp_rexmit_fast", "tcp__out_8c.html#adb6ee7b4d59f125cc8bfac3bb5ca3937", null ],
+    [ "tcp_rexmit_rto", "tcp__out_8c.html#ab5ef9c8ab4629eb721987ae316b9f30f", null ],
+    [ "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_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 ],
+    [ "tcp_write", "group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5", null ],
+    [ "tcp_zero_window_probe", "tcp__out_8c.html#a6c20490aa45c771c38ce8ad3031cbdf6", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/tcp__priv_8h.html b/doc/doxygen/output/html/tcp__priv_8h.html
new file mode 100644
index 0000000..5d6feed
--- /dev/null
+++ b/doc/doxygen/output/html/tcp__priv_8h.html
@@ -0,0 +1,1333 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/priv/tcp_priv.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('tcp__priv_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">tcp_priv.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="tcp_8h.html">lwip/tcp.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="pbuf_8h.html">lwip/pbuf.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="icmp_8h.html">lwip/icmp.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="ip6_8h.html">lwip/ip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2tcp_8h.html">lwip/prot/tcp.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:afbd7a2997e3a3b7569efc3298e2e409f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#afbd7a2997e3a3b7569efc3298e2e409f">tcp_do_output_nagle</a>(tpcb)</td></tr>
+<tr class="separator:afbd7a2997e3a3b7569efc3298e2e409f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac9dbdaeac3e25f5badf3a763a1b0b990"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#ac9dbdaeac3e25f5badf3a763a1b0b990">TF_RESET</a>&#160;&#160;&#160;(u8_t)0x08U   /* Connection was reset. */</td></tr>
+<tr class="separator:ac9dbdaeac3e25f5badf3a763a1b0b990"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a178a6e9966d03c3326b9e0568666bb69"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#a178a6e9966d03c3326b9e0568666bb69">TCP_OVERSIZE_DBGCHECK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a178a6e9966d03c3326b9e0568666bb69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea0c47b916a8a25f82d2063335033aee"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#aea0c47b916a8a25f82d2063335033aee">TCP_CHECKSUM_ON_COPY</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__checksum.html#ga9f60183f0442bdbeefd6b395c6647613">LWIP_CHECKSUM_ON_COPY</a> &amp;&amp; <a class="el" href="group__lwip__opts__checksum.html#ga800069963cc4552b99235237c22f00bb">CHECKSUM_GEN_TCP</a>)</td></tr>
+<tr class="separator:aea0c47b916a8a25f82d2063335033aee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abdc99c343efc6c81abf60bb62b361dd8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#abdc99c343efc6c81abf60bb62b361dd8">TCP_BUILD_MSS_OPTION</a>(mss)&#160;&#160;&#160;<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>(0x02040000 | ((mss) &amp; 0xFFFF))</td></tr>
+<tr class="separator:abdc99c343efc6c81abf60bb62b361dd8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a51de4ded7d342456d31722493c92c969"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#a51de4ded7d342456d31722493c92c969">tcp_init</a> (void)</td></tr>
+<tr class="separator:a51de4ded7d342456d31722493c92c969"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3846a756b13214ed88ea47d0ff8279eb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#a3846a756b13214ed88ea47d0ff8279eb">tcp_tmr</a> (void)</td></tr>
+<tr class="separator:a3846a756b13214ed88ea47d0ff8279eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a421fb42ef919018e14ae413adfee9905"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#a421fb42ef919018e14ae413adfee9905">tcp_slowtmr</a> (void)</td></tr>
+<tr class="separator:a421fb42ef919018e14ae413adfee9905"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf446b07e52161b8a53cea07bc6c366d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#abf446b07e52161b8a53cea07bc6c366d">tcp_fasttmr</a> (void)</td></tr>
+<tr class="separator:abf446b07e52161b8a53cea07bc6c366d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ae0268e59fda0665fdd08c6e77ec547"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#a5ae0268e59fda0665fdd08c6e77ec547">tcp_txnow</a> (void)</td></tr>
+<tr class="separator:a5ae0268e59fda0665fdd08c6e77ec547"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae70c3c99d9dd6b07f7e11f7ba5eedcb5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5">tcp_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:ae70c3c99d9dd6b07f7e11f7ba5eedcb5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1dd6830a42b3c464b5a72f62ae312d0a"><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="tcp__priv_8h.html#a1dd6830a42b3c464b5a72f62ae312d0a">tcp_alloc</a> (u8_t prio)</td></tr>
+<tr class="separator:a1dd6830a42b3c464b5a72f62ae312d0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa2b6b075c27c64dfb8c402ac961fb910"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#aa2b6b075c27c64dfb8c402ac961fb910">tcp_free</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:aa2b6b075c27c64dfb8c402ac961fb910"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4f0f1ca01dbccd680eaa2d8433cd7fe"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe">tcp_abandon</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, int reset)</td></tr>
+<tr class="separator:ae4f0f1ca01dbccd680eaa2d8433cd7fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="tcp__priv_8h.html#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:af75fefe4fe509845be156d6e424eb6f1"><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="tcp__priv_8h.html#af75fefe4fe509845be156d6e424eb6f1">tcp_rexmit</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:af75fefe4fe509845be156d6e424eb6f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1f318930bd6d49074343cc79c5166f39"><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="tcp__priv_8h.html#a1f318930bd6d49074343cc79c5166f39">tcp_rexmit_rto_prepare</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:a1f318930bd6d49074343cc79c5166f39"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ef9dc094e21bdf0779aed25ab0b08d4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#a9ef9dc094e21bdf0779aed25ab0b08d4">tcp_rexmit_rto_commit</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:a9ef9dc094e21bdf0779aed25ab0b08d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab5ef9c8ab4629eb721987ae316b9f30f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#ab5ef9c8ab4629eb721987ae316b9f30f">tcp_rexmit_rto</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ab5ef9c8ab4629eb721987ae316b9f30f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adb6ee7b4d59f125cc8bfac3bb5ca3937"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#adb6ee7b4d59f125cc8bfac3bb5ca3937">tcp_rexmit_fast</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:adb6ee7b4d59f125cc8bfac3bb5ca3937"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6d2c254b779db4e517cb34e41301588d"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#a6d2c254b779db4e517cb34e41301588d">tcp_update_rcv_ann_wnd</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:a6d2c254b779db4e517cb34e41301588d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0075b56ad4b0eca7c9d439cf150e1973"><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="tcp__priv_8h.html#a0075b56ad4b0eca7c9d439cf150e1973">tcp_process_refused_data</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:a0075b56ad4b0eca7c9d439cf150e1973"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a44fc672b9d14a65e61040707c45302ba"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#a44fc672b9d14a65e61040707c45302ba">tcp_pcb_purge</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:a44fc672b9d14a65e61040707c45302ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaaef096f6a03bf5b778329bb66ee06f6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#aaaef096f6a03bf5b778329bb66ee06f6">tcp_pcb_remove</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> **pcblist, struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:aaaef096f6a03bf5b778329bb66ee06f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d9bb9809769197bce9b2499d55cf28c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#a3d9bb9809769197bce9b2499d55cf28c">tcp_segs_free</a> (struct tcp_seg *seg)</td></tr>
+<tr class="separator:a3d9bb9809769197bce9b2499d55cf28c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6283651b26f74dba2444159aee88b20"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#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:a569d79451d2570e4ef406775725ef6ef"><td class="memItemLeft" align="right" valign="top">struct tcp_seg *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#a569d79451d2570e4ef406775725ef6ef">tcp_seg_copy</a> (struct tcp_seg *seg)</td></tr>
+<tr class="separator:a569d79451d2570e4ef406775725ef6ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af40ba9d645a8910436c3d7cf13dba342"><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="tcp__priv_8h.html#af40ba9d645a8910436c3d7cf13dba342">tcp_send_fin</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:af40ba9d645a8910436c3d7cf13dba342"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa7d5d552647d567095876aab202bfd1a"><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="tcp__priv_8h.html#aa7d5d552647d567095876aab202bfd1a">tcp_enqueue_flags</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t flags)</td></tr>
+<tr class="separator:aa7d5d552647d567095876aab202bfd1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa90f8051c9633d3017c588245cdc4014"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#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#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *local_ip, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">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:afd5dc2fa74855a84b2da642ba31059ea"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#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"><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="tcp__priv_8h.html#a0d8bb5fc8522515aa35d305774cc5332">tcp_keepalive</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:a0d8bb5fc8522515aa35d305774cc5332"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac930859c4e4ad9fcf6bb25ef5e91bcd5"><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="tcp__priv_8h.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5">tcp_split_unsent_seg</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u16_t split)</td></tr>
+<tr class="separator:ac930859c4e4ad9fcf6bb25ef5e91bcd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c20490aa45c771c38ce8ad3031cbdf6"><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="tcp__priv_8h.html#a6c20490aa45c771c38ce8ad3031cbdf6">tcp_zero_window_probe</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
+<tr class="separator:a6c20490aa45c771c38ce8ad3031cbdf6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08a3b5396c40f32dd8b21e7d63b3e1b3"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#a08a3b5396c40f32dd8b21e7d63b3e1b3">tcp_eff_send_mss_netif</a> (u16_t sendmss, struct <a class="el" href="structnetif.html">netif</a> *outif, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dest)</td></tr>
+<tr class="separator:a08a3b5396c40f32dd8b21e7d63b3e1b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="tcp__priv_8h.html#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>
+<tr class="separator:a0cb3f604fc8d20870d8cab291da5701c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8181bc316fdf61b85f787c5cadfcd249"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#a8181bc316fdf61b85f787c5cadfcd249">tcp_timer_needed</a> (void)</td></tr>
+<tr class="separator:a8181bc316fdf61b85f787c5cadfcd249"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4d0c2d1ad02134c79fc72fe95ee2a703"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#a4d0c2d1ad02134c79fc72fe95ee2a703">tcp_netif_ip_addr_changed</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *old_addr, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *new_addr)</td></tr>
+<tr class="separator:a4d0c2d1ad02134c79fc72fe95ee2a703"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="tcp__priv_8h.html#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">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a1b42a7ac0fc173a42d575f86853d32a8"><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="tcp__priv_8h.html#a1b42a7ac0fc173a42d575f86853d32a8">tcp_bound_pcbs</a></td></tr>
+<tr class="separator:a1b42a7ac0fc173a42d575f86853d32a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96fe1350e510d4308ac9969ffb4c9c81"><td class="memItemLeft" align="right" valign="top">union tcp_listen_pcbs_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#a96fe1350e510d4308ac9969ffb4c9c81">tcp_listen_pcbs</a></td></tr>
+<tr class="separator:a96fe1350e510d4308ac9969ffb4c9c81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78c09dbae67ccc06b659d9f1a388f911"><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="tcp__priv_8h.html#a78c09dbae67ccc06b659d9f1a388f911">tcp_active_pcbs</a></td></tr>
+<tr class="separator:a78c09dbae67ccc06b659d9f1a388f911"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9a522a66c5e1f1a4e28fe7a672cc64e3"><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="tcp__priv_8h.html#a9a522a66c5e1f1a4e28fe7a672cc64e3">tcp_tw_pcbs</a></td></tr>
+<tr class="separator:a9a522a66c5e1f1a4e28fe7a672cc64e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af5e1079ab223e1cb27208c45e3c84df7"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> **const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcp__priv_8h.html#af5e1079ab223e1cb27208c45e3c84df7">tcp_pcb_lists</a> [4]</td></tr>
+<tr class="separator:af5e1079ab223e1cb27208c45e3c84df7"><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 internal implementations (do not use in application code) </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="abdc99c343efc6c81abf60bb62b361dd8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abdc99c343efc6c81abf60bb62b361dd8">&#9670;&nbsp;</a></span>TCP_BUILD_MSS_OPTION</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_BUILD_MSS_OPTION</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">mss</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37">lwip_htonl</a>(0x02040000 | ((mss) &amp; 0xFFFF))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This returns a TCP header option for MSS in an u32_t </p>
+
+</div>
+</div>
+<a id="aea0c47b916a8a25f82d2063335033aee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aea0c47b916a8a25f82d2063335033aee">&#9670;&nbsp;</a></span>TCP_CHECKSUM_ON_COPY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_CHECKSUM_ON_COPY&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__checksum.html#ga9f60183f0442bdbeefd6b395c6647613">LWIP_CHECKSUM_ON_COPY</a> &amp;&amp; <a class="el" href="group__lwip__opts__checksum.html#ga800069963cc4552b99235237c22f00bb">CHECKSUM_GEN_TCP</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Don't generate checksum on copy if CHECKSUM_GEN_TCP is disabled </p>
+
+</div>
+</div>
+<a id="afbd7a2997e3a3b7569efc3298e2e409f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afbd7a2997e3a3b7569efc3298e2e409f">&#9670;&nbsp;</a></span>tcp_do_output_nagle</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define tcp_do_output_nagle</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">tpcb</td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">((((tpcb)-&gt;unacked == NULL) || \</div><div class="line">                            ((tpcb)-&gt;flags &amp; (TF_NODELAY | TF_INFR)) || \</div><div class="line">                            (((tpcb)-&gt;unsent != NULL) &amp;&amp; (((tpcb)-&gt;unsent-&gt;next != NULL) || \</div><div class="line">                              ((tpcb)-&gt;unsent-&gt;len &gt;= (tpcb)-&gt;mss))) || \</div><div class="line">                            ((<a class="code" href="group__tcp__raw.html#gad1a95f09deb49cd7341d35527d6d3e2f">tcp_sndbuf</a>(tpcb) == 0) || (<a class="code" href="group__tcp__raw.html#ga53ee4364718e84dc42cb1e0179deb1f4">tcp_sndqueuelen</a>(tpcb) &gt;= <a class="code" href="group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904">TCP_SND_QUEUELEN</a>)) \</div><div class="line">                            ) ? 1 : 0)</div><div class="ttc" id="group__tcp__raw_html_gad1a95f09deb49cd7341d35527d6d3e2f"><div class="ttname"><a href="group__tcp__raw.html#gad1a95f09deb49cd7341d35527d6d3e2f">tcp_sndbuf</a></div><div class="ttdeci">#define tcp_sndbuf(pcb)</div><div class="ttdef"><b>Definition:</b> tcp.h:434</div></div>
+<div class="ttc" id="group__tcp__raw_html_ga53ee4364718e84dc42cb1e0179deb1f4"><div class="ttname"><a href="group__tcp__raw.html#ga53ee4364718e84dc42cb1e0179deb1f4">tcp_sndqueuelen</a></div><div class="ttdeci">#define tcp_sndqueuelen(pcb)</div><div class="ttdef"><b>Definition:</b> tcp.h:436</div></div>
+<div class="ttc" id="group__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><!-- 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>
+<li>the only unsent segment is at least pcb-&gt;mss bytes long (or there is more than one unsent segment - with lwIP, this can happen although unsent-&gt;len &lt; mss)</li>
+<li>or if we are in fast-retransmit (TF_INFR) </li>
+</ul>
+
+</div>
+</div>
+<a id="a178a6e9966d03c3326b9e0568666bb69"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a178a6e9966d03c3326b9e0568666bb69">&#9670;&nbsp;</a></span>TCP_OVERSIZE_DBGCHECK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TCP_OVERSIZE_DBGCHECK&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Enabled extra-check for TCP_OVERSIZE if LWIP_DEBUG is enabled </p>
+
+</div>
+</div>
+<a id="ac9dbdaeac3e25f5badf3a763a1b0b990"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac9dbdaeac3e25f5badf3a763a1b0b990">&#9670;&nbsp;</a></span>TF_RESET</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TF_RESET&#160;&#160;&#160;(u8_t)0x08U   /* Connection was reset. */</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Flags used on input processing, not on pcb-&gt;flags </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ae4f0f1ca01dbccd680eaa2d8433cd7fe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae4f0f1ca01dbccd680eaa2d8433cd7fe">&#9670;&nbsp;</a></span>tcp_abandon()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_abandon </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>reset</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Abandons a connection and optionally sends a RST to the remote host. Deletes the local protocol control block. This is done when a connection is killed because of shortage of memory.</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 abort </td></tr>
+    <tr><td class="paramname">reset</td><td>boolean to indicate whether a reset should be sent </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a1dd6830a42b3c464b5a72f62ae312d0a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1dd6830a42b3c464b5a72f62ae312d0a">&#9670;&nbsp;</a></span>tcp_alloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a>* tcp_alloc </td>
+          <td>(</td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>prio</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocate a new <a class="el" href="structtcp__pcb.html">tcp_pcb</a> structure.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">prio</td><td>priority for the new pcb </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new <a class="el" href="structtcp__pcb.html">tcp_pcb</a> that initially is in state CLOSED </dd></dl>
+
+</div>
+</div>
+<a id="a08a3b5396c40f32dd8b21e7d63b3e1b3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a08a3b5396c40f32dd8b21e7d63b3e1b3">&#9670;&nbsp;</a></span>tcp_eff_send_mss_netif()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t tcp_eff_send_mss_netif </td>
+          <td>(</td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>sendmss</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>outif</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>dest</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Calculates the effective send mss that can be used for a specific IP address by calculating the minimum of TCP_MSS and the mtu (if set) of the target netif (if not NULL). </p>
+
+</div>
+</div>
+<a id="aa7d5d552647d567095876aab202bfd1a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa7d5d552647d567095876aab202bfd1a">&#9670;&nbsp;</a></span>tcp_enqueue_flags()</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> tcp_enqueue_flags </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t&#160;</td>
+          <td class="paramname"><em>flags</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Enqueue SYN or FIN for transmission.</p>
+<p>Called by <a class="el" href="group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012">tcp_connect</a>, tcp_listen_input, and <a class="el" href="group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623">tcp_close</a> (via <a class="el" href="tcp__priv_8h.html#af40ba9d645a8910436c3d7cf13dba342">tcp_send_fin</a>)</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>Protocol control block for the TCP connection. </td></tr>
+    <tr><td class="paramname">flags</td><td>TCP header flags to set in the outgoing segment. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5265b1df024d04287ed3edc02b1b9ccc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5265b1df024d04287ed3edc02b1b9ccc">&#9670;&nbsp;</a></span>tcp_ext_arg_invoke_callbacks_passive_open()</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> tcp_ext_arg_invoke_callbacks_passive_open </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb__listen.html">tcp_pcb_listen</a> *&#160;</td>
+          <td class="paramname"><em>lpcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>cpcb</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function calls the "passive_open" callback for all ext_args if a connection is in the process of being accepted. This is called just after the SYN is received and before a SYN/ACK is sent, to allow to modify the very first segment sent even on passive open. Naturally, the "accepted" callback of the pcb has not been called yet! </p>
+
+</div>
+</div>
+<a id="abf446b07e52161b8a53cea07bc6c366d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abf446b07e52161b8a53cea07bc6c366d">&#9670;&nbsp;</a></span>tcp_fasttmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_fasttmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Is called every TCP_FAST_INTERVAL (250 ms) and process data previously "refused" by upper layer (application) and sends delayed ACKs or pending FINs.</p>
+<p>Automatically called from <a class="el" href="tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb">tcp_tmr()</a>. </p>
+
+</div>
+</div>
+<a id="aa2b6b075c27c64dfb8c402ac961fb910"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa2b6b075c27c64dfb8c402ac961fb910">&#9670;&nbsp;</a></span>tcp_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_free </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Free a tcp pcb </p>
+
+</div>
+</div>
+<a id="a51de4ded7d342456d31722493c92c969"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a51de4ded7d342456d31722493c92c969">&#9670;&nbsp;</a></span>tcp_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize this module. </p>
+
+</div>
+</div>
+<a id="ae70c3c99d9dd6b07f7e11f7ba5eedcb5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae70c3c99d9dd6b07f7e11f7ba5eedcb5">&#9670;&nbsp;</a></span>tcp_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The initial input processing of TCP. It verifies the TCP header, demultiplexes the segment between the PCBs and passes it on to tcp_process(), which implements the TCP finite state machine. This function is called by the IP layer (in <a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip_input()</a>).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>received TCP segment to process (p-&gt;payload pointing to the TCP header) </td></tr>
+    <tr><td class="paramname">inp</td><td>network interface on which this segment was received </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a0d8bb5fc8522515aa35d305774cc5332"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0d8bb5fc8522515aa35d305774cc5332">&#9670;&nbsp;</a></span>tcp_keepalive()</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> tcp_keepalive </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send keepalive packets to keep a connection active although no data is sent over it.</p>
+<p>Called by <a class="el" href="tcp_8c.html#a421fb42ef919018e14ae413adfee9905">tcp_slowtmr()</a></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> for which to send a keepalive packet </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a4d0c2d1ad02134c79fc72fe95ee2a703"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4d0c2d1ad02134c79fc72fe95ee2a703">&#9670;&nbsp;</a></span>tcp_netif_ip_addr_changed()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_netif_ip_addr_changed </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>old_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>new_addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called from <a class="el" href="netif_8c.html">netif.c</a> when address is changed or netif is removed</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">old_addr</td><td>IP address of the netif before change </td></tr>
+    <tr><td class="paramname">new_addr</td><td>IP address of the netif after change or NULL if netif has been removed </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="afd5dc2fa74855a84b2da642ba31059ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afd5dc2fa74855a84b2da642ba31059ea">&#9670;&nbsp;</a></span>tcp_next_iss()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t tcp_next_iss </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Calculates a new initial sequence number for new connections.</p>
+<dl class="section return"><dt>Returns</dt><dd>u32_t pseudo random sequence number </dd></dl>
+
+</div>
+</div>
+<a id="a44fc672b9d14a65e61040707c45302ba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a44fc672b9d14a65e61040707c45302ba">&#9670;&nbsp;</a></span>tcp_pcb_purge()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_pcb_purge </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Purges a TCP PCB. Removes any buffered data and frees the buffer memory (pcb-&gt;ooseq, pcb-&gt;unsent and pcb-&gt;unacked are freed).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td><a class="el" href="structtcp__pcb.html">tcp_pcb</a> to purge. The pcb itself is not deallocated! </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aaaef096f6a03bf5b778329bb66ee06f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaaef096f6a03bf5b778329bb66ee06f6">&#9670;&nbsp;</a></span>tcp_pcb_remove()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_pcb_remove </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> **&#160;</td>
+          <td class="paramname"><em>pcblist</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Purges the PCB and removes it from a PCB list. Any delayed ACKs are sent first.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcblist</td><td>PCB list to purge. </td></tr>
+    <tr><td class="paramname">pcb</td><td><a class="el" href="structtcp__pcb.html">tcp_pcb</a> to purge. The pcb itself is NOT deallocated! </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a0075b56ad4b0eca7c9d439cf150e1973"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0075b56ad4b0eca7c9d439cf150e1973">&#9670;&nbsp;</a></span>tcp_process_refused_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> tcp_process_refused_data </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Pass pcb-&gt;refused_data to the recv callback </p>
+
+</div>
+</div>
+<a id="a0cb3f604fc8d20870d8cab291da5701c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0cb3f604fc8d20870d8cab291da5701c">&#9670;&nbsp;</a></span>tcp_recv_null()</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> tcp_recv_null </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td>
+          <td class="paramname"><em>err</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Default receive callback that is called if the user didn't register a recv callback for the pcb. </p>
+
+</div>
+</div>
+<a id="af75fefe4fe509845be156d6e424eb6f1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af75fefe4fe509845be156d6e424eb6f1">&#9670;&nbsp;</a></span>tcp_rexmit()</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> tcp_rexmit </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Requeue the first unacked segment for retransmission</p>
+<p>Called by tcp_receive() for fast retransmit.</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> for which to retransmit the first unacked segment </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="adb6ee7b4d59f125cc8bfac3bb5ca3937"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adb6ee7b4d59f125cc8bfac3bb5ca3937">&#9670;&nbsp;</a></span>tcp_rexmit_fast()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_rexmit_fast </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Handle retransmission after three dupacks received</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> for which to retransmit the first unacked segment </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab5ef9c8ab4629eb721987ae316b9f30f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab5ef9c8ab4629eb721987ae316b9f30f">&#9670;&nbsp;</a></span>tcp_rexmit_rto()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_rexmit_rto </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Requeue all unacked segments for retransmission</p>
+<p>Called by tcp_process() only, <a class="el" href="tcp_8c.html#a421fb42ef919018e14ae413adfee9905">tcp_slowtmr()</a> needs to do some things between "prepare" and "commit".</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> for which to re-enqueue all unacked segments </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a9ef9dc094e21bdf0779aed25ab0b08d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ef9dc094e21bdf0779aed25ab0b08d4">&#9670;&nbsp;</a></span>tcp_rexmit_rto_commit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_rexmit_rto_commit </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Requeue all unacked segments for retransmission</p>
+<p>Called by <a class="el" href="tcp_8c.html#a421fb42ef919018e14ae413adfee9905">tcp_slowtmr()</a> for slow retransmission.</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> for which to re-enqueue all unacked segments </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a1f318930bd6d49074343cc79c5166f39"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1f318930bd6d49074343cc79c5166f39">&#9670;&nbsp;</a></span>tcp_rexmit_rto_prepare()</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> tcp_rexmit_rto_prepare </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Requeue all unacked segments for retransmission</p>
+<p>Called by <a class="el" href="tcp_8c.html#a421fb42ef919018e14ae413adfee9905">tcp_slowtmr()</a> for slow retransmission.</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> for which to re-enqueue all unacked segments </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aa90f8051c9633d3017c588245cdc4014"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa90f8051c9633d3017c588245cdc4014">&#9670;&nbsp;</a></span>tcp_rst()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_rst </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>seqno</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>ackno</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>local_ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>remote_ip</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>local_port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>remote_port</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </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>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">pcb</td><td>TCP pcb (may be NULL if no pcb is available) </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="a569d79451d2570e4ef406775725ef6ef"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a569d79451d2570e4ef406775725ef6ef">&#9670;&nbsp;</a></span>tcp_seg_copy()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct tcp_seg* tcp_seg_copy </td>
+          <td>(</td>
+          <td class="paramtype">struct tcp_seg *&#160;</td>
+          <td class="paramname"><em>seg</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns a copy of the given TCP segment. The pbuf and data are not copied, only the pointers</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">seg</td><td>the old tcp_seg </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a copy of seg </dd></dl>
+
+</div>
+</div>
+<a id="ac6283651b26f74dba2444159aee88b20"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac6283651b26f74dba2444159aee88b20">&#9670;&nbsp;</a></span>tcp_seg_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_seg_free </td>
+          <td>(</td>
+          <td class="paramtype">struct tcp_seg *&#160;</td>
+          <td class="paramname"><em>seg</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Frees a TCP segment (tcp_seg structure).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">seg</td><td>single tcp_seg to free </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a3d9bb9809769197bce9b2499d55cf28c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3d9bb9809769197bce9b2499d55cf28c">&#9670;&nbsp;</a></span>tcp_segs_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_segs_free </td>
+          <td>(</td>
+          <td class="paramtype">struct tcp_seg *&#160;</td>
+          <td class="paramname"><em>seg</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Deallocates a list of TCP segments (tcp_seg structures).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">seg</td><td>tcp_seg list of TCP segments to free </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aefde3e34b2cc8df9654986484c44a996"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aefde3e34b2cc8df9654986484c44a996">&#9670;&nbsp;</a></span>tcp_send_empty_ack()</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> tcp_send_empty_ack </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an ACK without data.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>Protocol control block for the TCP connection to send the ACK </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="af40ba9d645a8910436c3d7cf13dba342"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af40ba9d645a8910436c3d7cf13dba342">&#9670;&nbsp;</a></span>tcp_send_fin()</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> tcp_send_fin </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by <a class="el" href="group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623">tcp_close()</a> to send a segment including FIN flag but not data. This FIN may be added to an existing segment or a new, otherwise empty segment is enqueued.</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> over which to send a segment </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if sent, another err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a421fb42ef919018e14ae413adfee9905"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a421fb42ef919018e14ae413adfee9905">&#9670;&nbsp;</a></span>tcp_slowtmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_slowtmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called every 500 ms and implements the retransmission timer and the timer that removes PCBs that have been in TIME-WAIT for enough time. It also increments various timers such as the inactivity timer in each PCB.</p>
+<p>Automatically called from <a class="el" href="tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb">tcp_tmr()</a>. </p>
+
+</div>
+</div>
+<a id="ac930859c4e4ad9fcf6bb25ef5e91bcd5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac930859c4e4ad9fcf6bb25ef5e91bcd5">&#9670;&nbsp;</a></span>tcp_split_unsent_seg()</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> tcp_split_unsent_seg </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t&#160;</td>
+          <td class="paramname"><em>split</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Split segment on the head of the unsent queue. If return is not ERR_OK, existing head remains intact</p>
+<p>The split is accomplished by creating a new TCP segment and pbuf which holds the remainder payload after the split. The original pbuf is trimmed to new length. This allows splitting of read-only pbufs</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> for which to split the unsent head </td></tr>
+    <tr><td class="paramname">split</td><td>the amount of payload to remain in the head </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a8181bc316fdf61b85f787c5cadfcd249"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8181bc316fdf61b85f787c5cadfcd249">&#9670;&nbsp;</a></span>tcp_timer_needed()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_timer_needed </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>External function (implemented in timers.c), called when TCP detects that a timer is needed (i.e. active- or time-wait-pcb found).</p>
+<p>Called from TCP_REG when registering a new PCB: the reason is to have the TCP timer only running when there are active (or time-wait) PCBs. </p>
+
+</div>
+</div>
+<a id="a3846a756b13214ed88ea47d0ff8279eb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3846a756b13214ed88ea47d0ff8279eb">&#9670;&nbsp;</a></span>tcp_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called periodically to dispatch TCP timers. </p>
+
+</div>
+</div>
+<a id="a5ae0268e59fda0665fdd08c6e77ec547"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5ae0268e59fda0665fdd08c6e77ec547">&#9670;&nbsp;</a></span>tcp_txnow()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_txnow </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Call tcp_output for all active pcbs that have TF_NAGLEMEMERR set </p>
+
+</div>
+</div>
+<a id="a6d2c254b779db4e517cb34e41301588d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6d2c254b779db4e517cb34e41301588d">&#9670;&nbsp;</a></span>tcp_update_rcv_ann_wnd()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t tcp_update_rcv_ann_wnd </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Update the state that tracks the available window space to advertise.</p>
+<p>Returns how much extra window would be advertised if we sent an update now. </p>
+
+</div>
+</div>
+<a id="a6c20490aa45c771c38ce8ad3031cbdf6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6c20490aa45c771c38ce8ad3031cbdf6">&#9670;&nbsp;</a></span>tcp_zero_window_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> tcp_zero_window_probe </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td>
+          <td class="paramname"><em>pcb</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send persist timer zero-window probes to keep a connection active when a window update is lost.</p>
+<p>Called by <a class="el" href="tcp_8c.html#a421fb42ef919018e14ae413adfee9905">tcp_slowtmr()</a></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> for which to send a zero-window probe packet </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="a78c09dbae67ccc06b659d9f1a388f911"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a78c09dbae67ccc06b659d9f1a388f911">&#9670;&nbsp;</a></span>tcp_active_pcbs</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a>* tcp_active_pcbs</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>List of all TCP PCBs that are in a state in which they accept or send data. </p>
+
+</div>
+</div>
+<a id="a1b42a7ac0fc173a42d575f86853d32a8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1b42a7ac0fc173a42d575f86853d32a8">&#9670;&nbsp;</a></span>tcp_bound_pcbs</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a>* tcp_bound_pcbs</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>List of all TCP PCBs bound but not yet (connected || listening) </p>
+
+</div>
+</div>
+<a id="a96fe1350e510d4308ac9969ffb4c9c81"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a96fe1350e510d4308ac9969ffb4c9c81">&#9670;&nbsp;</a></span>tcp_listen_pcbs</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">union tcp_listen_pcbs_t tcp_listen_pcbs</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>List of all TCP PCBs in LISTEN state </p>
+
+</div>
+</div>
+<a id="af5e1079ab223e1cb27208c45e3c84df7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af5e1079ab223e1cb27208c45e3c84df7">&#9670;&nbsp;</a></span>tcp_pcb_lists</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a>** const tcp_pcb_lists[4]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>An array with all (non-temporary) PCB lists, mainly used for smaller code size </p>
+
+</div>
+</div>
+<a id="a9a522a66c5e1f1a4e28fe7a672cc64e3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9a522a66c5e1f1a4e28fe7a672cc64e3">&#9670;&nbsp;</a></span>tcp_tw_pcbs</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a>* tcp_tw_pcbs</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>List of all TCP PCBs in TIME-WAIT state </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="dir_460c501b2432fc107adcb38111835e48.html">priv</a></li><li class="navelem"><a class="el" href="tcp__priv_8h.html">tcp_priv.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/tcp__priv_8h.js b/doc/doxygen/output/html/tcp__priv_8h.js
new file mode 100644
index 0000000..00c0cb3
--- /dev/null
+++ b/doc/doxygen/output/html/tcp__priv_8h.js
@@ -0,0 +1,47 @@
+var tcp__priv_8h =
+[
+    [ "TCP_BUILD_MSS_OPTION", "tcp__priv_8h.html#abdc99c343efc6c81abf60bb62b361dd8", null ],
+    [ "TCP_CHECKSUM_ON_COPY", "tcp__priv_8h.html#aea0c47b916a8a25f82d2063335033aee", null ],
+    [ "tcp_do_output_nagle", "tcp__priv_8h.html#afbd7a2997e3a3b7569efc3298e2e409f", null ],
+    [ "TCP_OVERSIZE_DBGCHECK", "tcp__priv_8h.html#a178a6e9966d03c3326b9e0568666bb69", null ],
+    [ "TF_RESET", "tcp__priv_8h.html#ac9dbdaeac3e25f5badf3a763a1b0b990", null ],
+    [ "tcp_abandon", "tcp__priv_8h.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe", null ],
+    [ "tcp_alloc", "tcp__priv_8h.html#a1dd6830a42b3c464b5a72f62ae312d0a", null ],
+    [ "tcp_eff_send_mss_netif", "tcp__priv_8h.html#a08a3b5396c40f32dd8b21e7d63b3e1b3", null ],
+    [ "tcp_enqueue_flags", "tcp__priv_8h.html#aa7d5d552647d567095876aab202bfd1a", null ],
+    [ "tcp_ext_arg_invoke_callbacks_passive_open", "tcp__priv_8h.html#a5265b1df024d04287ed3edc02b1b9ccc", null ],
+    [ "tcp_fasttmr", "tcp__priv_8h.html#abf446b07e52161b8a53cea07bc6c366d", null ],
+    [ "tcp_free", "tcp__priv_8h.html#aa2b6b075c27c64dfb8c402ac961fb910", null ],
+    [ "tcp_init", "tcp__priv_8h.html#a51de4ded7d342456d31722493c92c969", null ],
+    [ "tcp_input", "tcp__priv_8h.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5", null ],
+    [ "tcp_keepalive", "tcp__priv_8h.html#a0d8bb5fc8522515aa35d305774cc5332", null ],
+    [ "tcp_netif_ip_addr_changed", "tcp__priv_8h.html#a4d0c2d1ad02134c79fc72fe95ee2a703", null ],
+    [ "tcp_next_iss", "tcp__priv_8h.html#afd5dc2fa74855a84b2da642ba31059ea", null ],
+    [ "tcp_pcb_purge", "tcp__priv_8h.html#a44fc672b9d14a65e61040707c45302ba", null ],
+    [ "tcp_pcb_remove", "tcp__priv_8h.html#aaaef096f6a03bf5b778329bb66ee06f6", null ],
+    [ "tcp_process_refused_data", "tcp__priv_8h.html#a0075b56ad4b0eca7c9d439cf150e1973", null ],
+    [ "tcp_recv_null", "tcp__priv_8h.html#a0cb3f604fc8d20870d8cab291da5701c", null ],
+    [ "tcp_rexmit", "tcp__priv_8h.html#af75fefe4fe509845be156d6e424eb6f1", null ],
+    [ "tcp_rexmit_fast", "tcp__priv_8h.html#adb6ee7b4d59f125cc8bfac3bb5ca3937", null ],
+    [ "tcp_rexmit_rto", "tcp__priv_8h.html#ab5ef9c8ab4629eb721987ae316b9f30f", null ],
+    [ "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_seg_copy", "tcp__priv_8h.html#a569d79451d2570e4ef406775725ef6ef", null ],
+    [ "tcp_seg_free", "tcp__priv_8h.html#ac6283651b26f74dba2444159aee88b20", null ],
+    [ "tcp_segs_free", "tcp__priv_8h.html#a3d9bb9809769197bce9b2499d55cf28c", null ],
+    [ "tcp_send_empty_ack", "tcp__priv_8h.html#aefde3e34b2cc8df9654986484c44a996", null ],
+    [ "tcp_send_fin", "tcp__priv_8h.html#af40ba9d645a8910436c3d7cf13dba342", null ],
+    [ "tcp_slowtmr", "tcp__priv_8h.html#a421fb42ef919018e14ae413adfee9905", null ],
+    [ "tcp_split_unsent_seg", "tcp__priv_8h.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5", null ],
+    [ "tcp_timer_needed", "tcp__priv_8h.html#a8181bc316fdf61b85f787c5cadfcd249", null ],
+    [ "tcp_tmr", "tcp__priv_8h.html#a3846a756b13214ed88ea47d0ff8279eb", null ],
+    [ "tcp_txnow", "tcp__priv_8h.html#a5ae0268e59fda0665fdd08c6e77ec547", null ],
+    [ "tcp_update_rcv_ann_wnd", "tcp__priv_8h.html#a6d2c254b779db4e517cb34e41301588d", null ],
+    [ "tcp_zero_window_probe", "tcp__priv_8h.html#a6c20490aa45c771c38ce8ad3031cbdf6", null ],
+    [ "tcp_active_pcbs", "tcp__priv_8h.html#a78c09dbae67ccc06b659d9f1a388f911", null ],
+    [ "tcp_bound_pcbs", "tcp__priv_8h.html#a1b42a7ac0fc173a42d575f86853d32a8", null ],
+    [ "tcp_listen_pcbs", "tcp__priv_8h.html#a96fe1350e510d4308ac9969ffb4c9c81", null ],
+    [ "tcp_pcb_lists", "tcp__priv_8h.html#af5e1079ab223e1cb27208c45e3c84df7", null ],
+    [ "tcp_tw_pcbs", "tcp__priv_8h.html#a9a522a66c5e1f1a4e28fe7a672cc64e3", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/tcpbase_8h.html b/doc/doxygen/output/html/tcpbase_8h.html
new file mode 100644
index 0000000..768730c
--- /dev/null
+++ b/doc/doxygen/output/html/tcpbase_8h.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/tcpbase.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('tcpbase_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">tcpbase.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 />
+</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>
+</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="tcpbase_8h.html">tcpbase.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/tcpip_8c.html b/doc/doxygen/output/html/tcpip_8c.html
new file mode 100644
index 0000000..284f2e1
--- /dev/null
+++ b/doc/doxygen/output/html/tcpip_8c.html
@@ -0,0 +1,342 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/api/tcpip.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('tcpip_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">tcpip.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 &quot;<a class="el" href="tcpip__priv_8h.html">lwip/priv/tcpip_priv.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="memp_8h.html">lwip/memp.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="init_8h.html">lwip/init.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.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="lwip_2etharp_8h.html">lwip/etharp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="netif_2ethernet_8h.html">netif/ethernet.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a93043b3c66dbe4a15a60299c6199d102"><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="tcpip_8c.html#a93043b3c66dbe4a15a60299c6199d102">tcpip_inpkt</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, struct <a class="el" href="structnetif.html">netif</a> *inp, <a class="el" href="netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e">netif_input_fn</a> input_fn)</td></tr>
+<tr class="separator:a93043b3c66dbe4a15a60299c6199d102"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae510f195171bed8499ae94e264a92717"><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#gae510f195171bed8499ae94e264a92717">tcpip_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:gae510f195171bed8499ae94e264a92717"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="tcpip_8h.html#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:gaeb7b3c7414c76ad8dde14d2fba6cb020"><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#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip_try_callback</a> (<a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a> function, void *ctx)</td></tr>
+<tr class="separator:gaeb7b3c7414c76ad8dde14d2fba6cb020"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a12bdf37eddcd72c4178e3ea7d370395d"><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="tcpip_8c.html#a12bdf37eddcd72c4178e3ea7d370395d">tcpip_send_msg_wait_sem</a> (<a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a> fn, void *apimsg, sys_sem_t *sem)</td></tr>
+<tr class="separator:a12bdf37eddcd72c4178e3ea7d370395d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d42b0c46607f91aedcc7745ed466b08"><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="tcpip_8c.html#a3d42b0c46607f91aedcc7745ed466b08">tcpip_api_call</a> (tcpip_api_call_fn fn, struct tcpip_api_call_data *call)</td></tr>
+<tr class="separator:a3d42b0c46607f91aedcc7745ed466b08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaee14fa2587a9ba9d23e4c7e16c4526ac"><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#gaee14fa2587a9ba9d23e4c7e16c4526ac">tcpip_callbackmsg_new</a> (<a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a> function, void *ctx)</td></tr>
+<tr class="separator:gaee14fa2587a9ba9d23e4c7e16c4526ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="separator:gac5b7a59f4c3f5f721ab9ee81f231c9fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83fe5fb2ea33e8c262567ac46f4db3f8"><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#ga83fe5fb2ea33e8c262567ac46f4db3f8">tcpip_callbackmsg_trycallback</a> (struct tcpip_callback_msg *msg)</td></tr>
+<tr class="separator:ga83fe5fb2ea33e8c262567ac46f4db3f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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"><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="tcpip_8c.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c">pbuf_free_callback</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:a5cdcb6b784fe0e8736a5b31a5cfbed6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55b4de3765c6a37b3f2b26a11603771c"><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="tcpip_8c.html#a55b4de3765c6a37b3f2b26a11603771c">mem_free_callback</a> (void *m)</td></tr>
+<tr class="separator:a55b4de3765c6a37b3f2b26a11603771c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:acd7be2108e9a47fd8f1ab0a49f76241d"><td class="memItemLeft" align="right" valign="top">sys_mutex_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcpip_8c.html#acd7be2108e9a47fd8f1ab0a49f76241d">lock_tcpip_core</a></td></tr>
+<tr class="separator:acd7be2108e9a47fd8f1ab0a49f76241d"><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>Sequential API Main thread module </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a55b4de3765c6a37b3f2b26a11603771c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a55b4de3765c6a37b3f2b26a11603771c">&#9670;&nbsp;</a></span>mem_free_callback()</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> mem_free_callback </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A simple wrapper function that allows you to free heap memory from interrupt context.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the heap memory to free </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if callback could be enqueued, an err_t if not </dd></dl>
+
+</div>
+</div>
+<a id="a5cdcb6b784fe0e8736a5b31a5cfbed6c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5cdcb6b784fe0e8736a5b31a5cfbed6c">&#9670;&nbsp;</a></span>pbuf_free_callback()</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> pbuf_free_callback </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A simple wrapper function that allows you to free a pbuf from interrupt context.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>The pbuf (chain) to be dereferenced. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if callback could be enqueued, an err_t if not </dd></dl>
+
+</div>
+</div>
+<a id="a3d42b0c46607f91aedcc7745ed466b08"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3d42b0c46607f91aedcc7745ed466b08">&#9670;&nbsp;</a></span>tcpip_api_call()</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_api_call </td>
+          <td>(</td>
+          <td class="paramtype">tcpip_api_call_fn&#160;</td>
+          <td class="paramname"><em>fn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct tcpip_api_call_data *&#160;</td>
+          <td class="paramname"><em>call</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Synchronously calls function in TCPIP thread and waits for its completion. 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">fn</td><td>Function to call </td></tr>
+    <tr><td class="paramname">call</td><td>Call parameters </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Return value from tcpip_api_call_fn </dd></dl>
+
+</div>
+</div>
+<a id="a93043b3c66dbe4a15a60299c6199d102"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a93043b3c66dbe4a15a60299c6199d102">&#9670;&nbsp;</a></span>tcpip_inpkt()</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_inpkt </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e">netif_input_fn</a>&#160;</td>
+          <td class="paramname"><em>input_fn</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Pass a received packet to tcpip_thread for input processing</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the received packet </td></tr>
+    <tr><td class="paramname">inp</td><td>the network interface on which the packet was received </td></tr>
+    <tr><td class="paramname">input_fn</td><td>input function to call </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a12bdf37eddcd72c4178e3ea7d370395d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a12bdf37eddcd72c4178e3ea7d370395d">&#9670;&nbsp;</a></span>tcpip_send_msg_wait_sem()</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_send_msg_wait_sem </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a>&#160;</td>
+          <td class="paramname"><em>fn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>apimsg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">sys_sem_t *&#160;</td>
+          <td class="paramname"><em>sem</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sends a message to TCPIP thread to call a function. Caller thread blocks on on a provided semaphore, which ist NOT automatically signalled by TCPIP thread, this has to be done by the user. It is recommended to use LWIP_TCPIP_CORE_LOCKING since this is the way with least runtime overhead.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">fn</td><td>function to be called from TCPIP thread </td></tr>
+    <tr><td class="paramname">apimsg</td><td>argument to API function </td></tr>
+    <tr><td class="paramname">sem</td><td>semaphore to wait on </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>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="acd7be2108e9a47fd8f1ab0a49f76241d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acd7be2108e9a47fd8f1ab0a49f76241d">&#9670;&nbsp;</a></span>lock_tcpip_core</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">sys_mutex_t lock_tcpip_core</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The global semaphore to lock the stack. </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_da61e3e9a357748887e3ca8d7c5a0c16.html">api</a></li><li class="navelem"><a class="el" href="tcpip_8c.html">tcpip.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/tcpip_8c.js b/doc/doxygen/output/html/tcpip_8c.js
new file mode 100644
index 0000000..28dfc89
--- /dev/null
+++ b/doc/doxygen/output/html/tcpip_8c.js
@@ -0,0 +1,17 @@
+var tcpip_8c =
+[
+    [ "mem_free_callback", "tcpip_8c.html#a55b4de3765c6a37b3f2b26a11603771c", null ],
+    [ "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_callbackmsg_delete", "group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd", null ],
+    [ "tcpip_callbackmsg_new", "group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac", null ],
+    [ "tcpip_callbackmsg_trycallback", "group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8", null ],
+    [ "tcpip_callbackmsg_trycallback_fromisr", "group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666", null ],
+    [ "tcpip_init", "group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db", null ],
+    [ "tcpip_inpkt", "tcpip_8c.html#a93043b3c66dbe4a15a60299c6199d102", null ],
+    [ "tcpip_input", "group__lwip__os.html#gae510f195171bed8499ae94e264a92717", null ],
+    [ "tcpip_send_msg_wait_sem", "tcpip_8c.html#a12bdf37eddcd72c4178e3ea7d370395d", null ],
+    [ "tcpip_try_callback", "group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020", null ],
+    [ "lock_tcpip_core", "tcpip_8c.html#acd7be2108e9a47fd8f1ab0a49f76241d", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/tcpip_8h.html b/doc/doxygen/output/html/tcpip_8h.html
new file mode 100644
index 0000000..d1d1edf
--- /dev/null
+++ b/doc/doxygen/output/html/tcpip_8h.html
@@ -0,0 +1,338 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/tcpip.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('tcpip_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">tcpip.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="err_8h.html">lwip/err.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="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a4700525e737fc025fea4887b172e0c95"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcpip_8h.html#a4700525e737fc025fea4887b172e0c95">LOCK_TCPIP_CORE</a>()&#160;&#160;&#160;<a class="el" href="group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a">sys_mutex_lock</a>(&amp;<a class="el" href="tcpip_8h.html#acd7be2108e9a47fd8f1ab0a49f76241d">lock_tcpip_core</a>)</td></tr>
+<tr class="separator:a4700525e737fc025fea4887b172e0c95"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a915effea029b9c4891e1ec635eb1826d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcpip_8h.html#a915effea029b9c4891e1ec635eb1826d">UNLOCK_TCPIP_CORE</a>()&#160;&#160;&#160;<a class="el" href="group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb">sys_mutex_unlock</a>(&amp;<a class="el" href="tcpip_8h.html#acd7be2108e9a47fd8f1ab0a49f76241d">lock_tcpip_core</a>)</td></tr>
+<tr class="separator:a915effea029b9c4891e1ec635eb1826d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacd0a865623921ada2dd08962eb82c9df"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__os.html#gacd0a865623921ada2dd08962eb82c9df">tcpip_callback_with_block</a>(function,  ctx,  block)&#160;&#160;&#160;((block != 0)? <a class="el" href="group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip_callback</a>(function, ctx) : <a class="el" href="group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip_try_callback</a>(function, ctx))</td></tr>
+<tr class="separator:gacd0a865623921ada2dd08962eb82c9df"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a5fe07216c441e27c3028bcac60fa0992"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcpip_8h.html#a5fe07216c441e27c3028bcac60fa0992">tcpip_init_done_fn</a>) (void *arg)</td></tr>
+<tr class="separator:a5fe07216c441e27c3028bcac60fa0992"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a35203296bb838f3b493839ffc6e7285d"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a>) (void *ctx)</td></tr>
+<tr class="separator:a35203296bb838f3b493839ffc6e7285d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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> tcpip_init_done, void *arg)</td></tr>
+<tr class="separator:ga1f3a88b8df6ba3b9ed1c00e0a305e3db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a93043b3c66dbe4a15a60299c6199d102"><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="tcpip_8h.html#a93043b3c66dbe4a15a60299c6199d102">tcpip_inpkt</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, struct <a class="el" href="structnetif.html">netif</a> *inp, <a class="el" href="netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e">netif_input_fn</a> input_fn)</td></tr>
+<tr class="separator:a93043b3c66dbe4a15a60299c6199d102"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae510f195171bed8499ae94e264a92717"><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#gae510f195171bed8499ae94e264a92717">tcpip_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:gae510f195171bed8499ae94e264a92717"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaeb7b3c7414c76ad8dde14d2fba6cb020"><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#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip_try_callback</a> (<a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a> function, void *ctx)</td></tr>
+<tr class="separator:gaeb7b3c7414c76ad8dde14d2fba6cb020"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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="tcpip_8h.html#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:gaee14fa2587a9ba9d23e4c7e16c4526ac"><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#gaee14fa2587a9ba9d23e4c7e16c4526ac">tcpip_callbackmsg_new</a> (<a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a> function, void *ctx)</td></tr>
+<tr class="separator:gaee14fa2587a9ba9d23e4c7e16c4526ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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>
+<tr class="separator:gac5b7a59f4c3f5f721ab9ee81f231c9fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83fe5fb2ea33e8c262567ac46f4db3f8"><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#ga83fe5fb2ea33e8c262567ac46f4db3f8">tcpip_callbackmsg_trycallback</a> (struct tcpip_callback_msg *msg)</td></tr>
+<tr class="separator:ga83fe5fb2ea33e8c262567ac46f4db3f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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: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="tcpip_8h.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c">pbuf_free_callback</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:a5cdcb6b784fe0e8736a5b31a5cfbed6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55b4de3765c6a37b3f2b26a11603771c"><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="tcpip_8h.html#a55b4de3765c6a37b3f2b26a11603771c">mem_free_callback</a> (void *m)</td></tr>
+<tr class="separator:a55b4de3765c6a37b3f2b26a11603771c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:acd7be2108e9a47fd8f1ab0a49f76241d"><td class="memItemLeft" align="right" valign="top">sys_mutex_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tcpip_8h.html#acd7be2108e9a47fd8f1ab0a49f76241d">lock_tcpip_core</a></td></tr>
+<tr class="separator:acd7be2108e9a47fd8f1ab0a49f76241d"><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>Functions to sync with TCPIP thread </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a4700525e737fc025fea4887b172e0c95"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4700525e737fc025fea4887b172e0c95">&#9670;&nbsp;</a></span>LOCK_TCPIP_CORE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LOCK_TCPIP_CORE</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a">sys_mutex_lock</a>(&amp;<a class="el" href="tcpip_8h.html#acd7be2108e9a47fd8f1ab0a49f76241d">lock_tcpip_core</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Lock lwIP core mutex (needs <a class="el" href="group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011">LWIP_TCPIP_CORE_LOCKING</a> 1) </p>
+
+</div>
+</div>
+<a id="a915effea029b9c4891e1ec635eb1826d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a915effea029b9c4891e1ec635eb1826d">&#9670;&nbsp;</a></span>UNLOCK_TCPIP_CORE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UNLOCK_TCPIP_CORE</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb">sys_mutex_unlock</a>(&amp;<a class="el" href="tcpip_8h.html#acd7be2108e9a47fd8f1ab0a49f76241d">lock_tcpip_core</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Unlock lwIP core mutex (needs <a class="el" href="group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011">LWIP_TCPIP_CORE_LOCKING</a> 1) </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="a35203296bb838f3b493839ffc6e7285d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a35203296bb838f3b493839ffc6e7285d">&#9670;&nbsp;</a></span>tcpip_callback_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* tcpip_callback_fn) (void *ctx)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for functions passed to <a class="el" href="group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip_callback()</a> </p>
+
+</div>
+</div>
+<a id="a5fe07216c441e27c3028bcac60fa0992"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5fe07216c441e27c3028bcac60fa0992">&#9670;&nbsp;</a></span>tcpip_init_done_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* tcpip_init_done_fn) (void *arg)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for the init_done function passed to tcpip_init </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a55b4de3765c6a37b3f2b26a11603771c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a55b4de3765c6a37b3f2b26a11603771c">&#9670;&nbsp;</a></span>mem_free_callback()</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> mem_free_callback </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>m</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A simple wrapper function that allows you to free heap memory from interrupt context.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>the heap memory to free </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if callback could be enqueued, an err_t if not </dd></dl>
+
+</div>
+</div>
+<a id="a5cdcb6b784fe0e8736a5b31a5cfbed6c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5cdcb6b784fe0e8736a5b31a5cfbed6c">&#9670;&nbsp;</a></span>pbuf_free_callback()</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> pbuf_free_callback </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A simple wrapper function that allows you to free a pbuf from interrupt context.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>The pbuf (chain) to be dereferenced. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if callback could be enqueued, an err_t if not </dd></dl>
+
+</div>
+</div>
+<a id="a93043b3c66dbe4a15a60299c6199d102"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a93043b3c66dbe4a15a60299c6199d102">&#9670;&nbsp;</a></span>tcpip_inpkt()</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_inpkt </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e">netif_input_fn</a>&#160;</td>
+          <td class="paramname"><em>input_fn</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Pass a received packet to tcpip_thread for input processing</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>the received packet </td></tr>
+    <tr><td class="paramname">inp</td><td>the network interface on which the packet was received </td></tr>
+    <tr><td class="paramname">input_fn</td><td>input function to call </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="acd7be2108e9a47fd8f1ab0a49f76241d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acd7be2108e9a47fd8f1ab0a49f76241d">&#9670;&nbsp;</a></span>lock_tcpip_core</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">sys_mutex_t lock_tcpip_core</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The global semaphore to lock the stack. </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="tcpip_8h.html">tcpip.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/tcpip_8h.js b/doc/doxygen/output/html/tcpip_8h.js
new file mode 100644
index 0000000..bb12665
--- /dev/null
+++ b/doc/doxygen/output/html/tcpip_8h.js
@@ -0,0 +1,20 @@
+var tcpip_8h =
+[
+    [ "LOCK_TCPIP_CORE", "tcpip_8h.html#a4700525e737fc025fea4887b172e0c95", null ],
+    [ "tcpip_callback_with_block", "group__lwip__os.html#gacd0a865623921ada2dd08962eb82c9df", null ],
+    [ "UNLOCK_TCPIP_CORE", "tcpip_8h.html#a915effea029b9c4891e1ec635eb1826d", null ],
+    [ "tcpip_callback_fn", "tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d", null ],
+    [ "tcpip_init_done_fn", "tcpip_8h.html#a5fe07216c441e27c3028bcac60fa0992", null ],
+    [ "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_callbackmsg_delete", "group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd", null ],
+    [ "tcpip_callbackmsg_new", "group__lwip__os.html#gaee14fa2587a9ba9d23e4c7e16c4526ac", null ],
+    [ "tcpip_callbackmsg_trycallback", "group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8", null ],
+    [ "tcpip_callbackmsg_trycallback_fromisr", "group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666", null ],
+    [ "tcpip_init", "group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db", null ],
+    [ "tcpip_inpkt", "tcpip_8h.html#a93043b3c66dbe4a15a60299c6199d102", null ],
+    [ "tcpip_input", "group__lwip__os.html#gae510f195171bed8499ae94e264a92717", null ],
+    [ "tcpip_try_callback", "group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020", null ],
+    [ "lock_tcpip_core", "tcpip_8h.html#acd7be2108e9a47fd8f1ab0a49f76241d", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/tcpip__priv_8h.html b/doc/doxygen/output/html/tcpip__priv_8h.html
new file mode 100644
index 0000000..29733ee
--- /dev/null
+++ b/doc/doxygen/output/html/tcpip__priv_8h.html
@@ -0,0 +1,197 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/priv/tcpip_priv.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('tcpip__priv_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">tcpip_priv.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="tcpip_8h.html">lwip/tcpip.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="timeouts_8h.html">lwip/timeouts.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a12bdf37eddcd72c4178e3ea7d370395d"><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="tcpip__priv_8h.html#a12bdf37eddcd72c4178e3ea7d370395d">tcpip_send_msg_wait_sem</a> (<a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a> fn, void *apimsg, sys_sem_t *sem)</td></tr>
+<tr class="separator:a12bdf37eddcd72c4178e3ea7d370395d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d42b0c46607f91aedcc7745ed466b08"><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="tcpip__priv_8h.html#a3d42b0c46607f91aedcc7745ed466b08">tcpip_api_call</a> (tcpip_api_call_fn fn, struct tcpip_api_call_data *call)</td></tr>
+<tr class="separator:a3d42b0c46607f91aedcc7745ed466b08"><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>TCPIP API internal implementations (do not use in application code) </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a3d42b0c46607f91aedcc7745ed466b08"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3d42b0c46607f91aedcc7745ed466b08">&#9670;&nbsp;</a></span>tcpip_api_call()</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_api_call </td>
+          <td>(</td>
+          <td class="paramtype">tcpip_api_call_fn&#160;</td>
+          <td class="paramname"><em>fn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct tcpip_api_call_data *&#160;</td>
+          <td class="paramname"><em>call</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Synchronously calls function in TCPIP thread and waits for its completion. 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">fn</td><td>Function to call </td></tr>
+    <tr><td class="paramname">call</td><td>Call parameters </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Return value from tcpip_api_call_fn </dd></dl>
+
+</div>
+</div>
+<a id="a12bdf37eddcd72c4178e3ea7d370395d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a12bdf37eddcd72c4178e3ea7d370395d">&#9670;&nbsp;</a></span>tcpip_send_msg_wait_sem()</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_send_msg_wait_sem </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a>&#160;</td>
+          <td class="paramname"><em>fn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>apimsg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">sys_sem_t *&#160;</td>
+          <td class="paramname"><em>sem</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sends a message to TCPIP thread to call a function. Caller thread blocks on on a provided semaphore, which ist NOT automatically signalled by TCPIP thread, this has to be done by the user. It is recommended to use LWIP_TCPIP_CORE_LOCKING since this is the way with least runtime overhead.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">fn</td><td>function to be called from TCPIP thread </td></tr>
+    <tr><td class="paramname">apimsg</td><td>argument to API function </td></tr>
+    <tr><td class="paramname">sem</td><td>semaphore to wait on </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>
+</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_460c501b2432fc107adcb38111835e48.html">priv</a></li><li class="navelem"><a class="el" href="tcpip__priv_8h.html">tcpip_priv.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/tcpip__priv_8h.js b/doc/doxygen/output/html/tcpip__priv_8h.js
new file mode 100644
index 0000000..7cf5cad
--- /dev/null
+++ b/doc/doxygen/output/html/tcpip__priv_8h.js
@@ -0,0 +1,5 @@
+var tcpip__priv_8h =
+[
+    [ "tcpip_api_call", "tcpip__priv_8h.html#a3d42b0c46607f91aedcc7745ed466b08", null ],
+    [ "tcpip_send_msg_wait_sem", "tcpip__priv_8h.html#a12bdf37eddcd72c4178e3ea7d370395d", 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
new file mode 100644
index 0000000..c78fa38
--- /dev/null
+++ b/doc/doxygen/output/html/tftp__opts_8h.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/tftp_opts.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('tftp__opts_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle">
+<div class="title">tftp_opts.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Trivial File Transfer Protocol (RFC 1350) implementation options.  
+<a href="#details">More...</a></p>
+<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="iana_8h.html">lwip/prot/iana.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga2dd54a1d0c3006527b8a7a8604b81981"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp__opts.html#ga2dd54a1d0c3006527b8a7a8604b81981">TFTP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga2dd54a1d0c3006527b8a7a8604b81981"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad9230620a5d3bb87a7ac280ff99875d1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp__opts.html#gad9230620a5d3bb87a7ac280ff99875d1">TFTP_PORT</a>&#160;&#160;&#160;<a class="el" href="group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050">LWIP_IANA_PORT_TFTP</a></td></tr>
+<tr class="separator:gad9230620a5d3bb87a7ac280ff99875d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga36986e5465dc2ccb6184fc57f9a37d63"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp__opts.html#ga36986e5465dc2ccb6184fc57f9a37d63">TFTP_TIMEOUT_MSECS</a>&#160;&#160;&#160;10000</td></tr>
+<tr class="separator:ga36986e5465dc2ccb6184fc57f9a37d63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6a01757ad942eb602e8a87e2be42d313"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp__opts.html#ga6a01757ad942eb602e8a87e2be42d313">TFTP_MAX_RETRIES</a>&#160;&#160;&#160;5</td></tr>
+<tr class="separator:ga6a01757ad942eb602e8a87e2be42d313"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3e6caacb3f4d43f780b2d68ffe4258ea"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp__opts.html#ga3e6caacb3f4d43f780b2d68ffe4258ea">TFTP_TIMER_MSECS</a>&#160;&#160;&#160;(<a class="el" href="group__tftp__opts.html#ga36986e5465dc2ccb6184fc57f9a37d63">TFTP_TIMEOUT_MSECS</a> / 10)</td></tr>
+<tr class="separator:ga3e6caacb3f4d43f780b2d68ffe4258ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem: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"><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="separator:gaa8a449c25e37be757f5efccd422c9055"><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) implementation options. </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 style="display: none;">.nosp@m.</span>g@de<span style="display: none;">.nosp@m.</span>ltate<span style="display: none;">.nosp@m.</span>e.co<span style="display: none;">.nosp@m.</span>m</a></dd></dl>
+<p>Copyright (c) Deltatee Enterprises Ltd. 2013 All rights reserved. </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_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="tftp__opts_8h.html">tftp_opts.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/tftp__opts_8h.js b/doc/doxygen/output/html/tftp__opts_8h.js
new file mode 100644
index 0000000..a7819da
--- /dev/null
+++ b/doc/doxygen/output/html/tftp__opts_8h.js
@@ -0,0 +1,10 @@
+var tftp__opts_8h =
+[
+    [ "TFTP_DEBUG", "group__tftp__opts.html#ga2dd54a1d0c3006527b8a7a8604b81981", null ],
+    [ "TFTP_MAX_FILENAME_LEN", "group__tftp__opts.html#ga8e975900b4397313f1a649ff76a3063b", null ],
+    [ "TFTP_MAX_MODE_LEN", "group__tftp__opts.html#gaa8a449c25e37be757f5efccd422c9055", null ],
+    [ "TFTP_MAX_RETRIES", "group__tftp__opts.html#ga6a01757ad942eb602e8a87e2be42d313", null ],
+    [ "TFTP_PORT", "group__tftp__opts.html#gad9230620a5d3bb87a7ac280ff99875d1", null ],
+    [ "TFTP_TIMEOUT_MSECS", "group__tftp__opts.html#ga36986e5465dc2ccb6184fc57f9a37d63", null ],
+    [ "TFTP_TIMER_MSECS", "group__tftp__opts.html#ga3e6caacb3f4d43f780b2d68ffe4258ea", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/tftp__server_8c.html b/doc/doxygen/output/html/tftp__server_8c.html
new file mode 100644
index 0000000..3d8aa56
--- /dev/null
+++ b/doc/doxygen/output/html/tftp__server_8c.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/tftp/tftp_server.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('tftp__server_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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><!--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><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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"><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 style="display: none;">.nosp@m.</span>g@de<span style="display: none;">.nosp@m.</span>ltate<span style="display: none;">.nosp@m.</span>e.co<span style="display: none;">.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 style="display: none;">.nosp@m.</span>el@g<span style="display: none;">.nosp@m.</span>mx.de</a></dd></dl>
+<p>Copyright (c) Deltatee Enterprises Ltd. 2013 All rights reserved. </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="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/tftp__server_8c.js b/doc/doxygen/output/html/tftp__server_8c.js
new file mode 100644
index 0000000..868e743
--- /dev/null
+++ b/doc/doxygen/output/html/tftp__server_8c.js
@@ -0,0 +1,5 @@
+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
new file mode 100644
index 0000000..792e01d
--- /dev/null
+++ b/doc/doxygen/output/html/tftp__server_8h.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/tftp_server.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('tftp__server_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem: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"><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 style="display: none;">.nosp@m.</span>g@de<span style="display: none;">.nosp@m.</span>ltate<span style="display: none;">.nosp@m.</span>e.co<span style="display: none;">.nosp@m.</span>m</a></dd></dl>
+<p>Copyright (c) Deltatee Enterprises Ltd. 2013 All rights reserved. </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_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="tftp__server_8h.html">tftp_server.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/tftp__server_8h.js b/doc/doxygen/output/html/tftp__server_8h.js
new file mode 100644
index 0000000..3fc62f9
--- /dev/null
+++ b/doc/doxygen/output/html/tftp__server_8h.js
@@ -0,0 +1,5 @@
+var tftp__server_8h =
+[
+    [ "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/timeouts_8c.html b/doc/doxygen/output/html/timeouts_8c.html
new file mode 100644
index 0000000..958565d
--- /dev/null
+++ b/doc/doxygen/output/html/timeouts_8c.html
@@ -0,0 +1,338 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/timeouts.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('timeouts_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">timeouts.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 &quot;<a class="el" href="timeouts_8h.html">lwip/timeouts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tcp__priv_8h.html">lwip/priv/tcp_priv.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="memp_8h.html">lwip/memp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tcpip__priv_8h.html">lwip/priv/tcpip_priv.h</a>&quot;</code><br />
+<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="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 />
+<code>#include &quot;<a class="el" href="ip6__frag_8h.html">lwip/ip6_frag.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="dhcp6_8h.html">lwip/dhcp6.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="pbuf_8h.html">lwip/pbuf.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a8181bc316fdf61b85f787c5cadfcd249"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8c.html#a8181bc316fdf61b85f787c5cadfcd249">tcp_timer_needed</a> (void)</td></tr>
+<tr class="separator:a8181bc316fdf61b85f787c5cadfcd249"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a60f42f167f496f6f740c8df48f4dd26c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8c.html#a60f42f167f496f6f740c8df48f4dd26c">sys_timeouts_init</a> (void)</td></tr>
+<tr class="separator:a60f42f167f496f6f740c8df48f4dd26c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8deed391626ec8b5423998e33782d7a8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8c.html#a8deed391626ec8b5423998e33782d7a8">sys_timeout</a> (u32_t msecs, <a class="el" href="timeouts_8h.html#a2ab5bb8173f492563f70a519011b0ac1">sys_timeout_handler</a> handler, void *arg)</td></tr>
+<tr class="separator:a8deed391626ec8b5423998e33782d7a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adbfcaa78f4b8d71ae0d7f0bcab6f8fb6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8c.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6">sys_untimeout</a> (<a class="el" href="timeouts_8h.html#a2ab5bb8173f492563f70a519011b0ac1">sys_timeout_handler</a> handler, void *arg)</td></tr>
+<tr class="separator:adbfcaa78f4b8d71ae0d7f0bcab6f8fb6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83cffdf69ab60fd0eba9d17d363f9883"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883">sys_check_timeouts</a> (void)</td></tr>
+<tr class="separator:ga83cffdf69ab60fd0eba9d17d363f9883"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6913959cf264dbe876b7e7c4db1cc13e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8c.html#a6913959cf264dbe876b7e7c4db1cc13e">sys_restart_timeouts</a> (void)</td></tr>
+<tr class="separator:a6913959cf264dbe876b7e7c4db1cc13e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa9971a14a5810cfeb1efd7104cde6664"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8c.html#aa9971a14a5810cfeb1efd7104cde6664">sys_timeouts_sleeptime</a> (void)</td></tr>
+<tr class="separator:aa9971a14a5810cfeb1efd7104cde6664"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:addc06ab816f051a0fe6f280972eed142"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structlwip__cyclic__timer.html">lwip_cyclic_timer</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8c.html#addc06ab816f051a0fe6f280972eed142">lwip_cyclic_timers</a> []</td></tr>
+<tr class="separator:addc06ab816f051a0fe6f280972eed142"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d01f287a19f20b073d3a1c306ecbfcd"><td class="memItemLeft" align="right" valign="top">const int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8c.html#a9d01f287a19f20b073d3a1c306ecbfcd">lwip_num_cyclic_timers</a> = (sizeof( <a class="el" href="timeouts_8h.html#addc06ab816f051a0fe6f280972eed142">lwip_cyclic_timers</a> )/sizeof(( <a class="el" href="timeouts_8h.html#addc06ab816f051a0fe6f280972eed142">lwip_cyclic_timers</a> )[0]))</td></tr>
+<tr class="separator:a9d01f287a19f20b073d3a1c306ecbfcd"><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>Stack-internal timers implementation. This file includes timer callbacks for stack-internal timers as well as functions to set up or stop timers and check for expired timers. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a6913959cf264dbe876b7e7c4db1cc13e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6913959cf264dbe876b7e7c4db1cc13e">&#9670;&nbsp;</a></span>sys_restart_timeouts()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_restart_timeouts </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Rebase the timeout times to the current time. This is necessary if <a class="el" href="group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883">sys_check_timeouts()</a> hasn't been called for a long time (e.g. while saving energy) to prevent all timer functions of that period being called. </p>
+
+</div>
+</div>
+<a id="a8deed391626ec8b5423998e33782d7a8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8deed391626ec8b5423998e33782d7a8">&#9670;&nbsp;</a></span>sys_timeout()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_timeout </td>
+          <td>(</td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>msecs</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="timeouts_8h.html#a2ab5bb8173f492563f70a519011b0ac1">sys_timeout_handler</a>&#160;</td>
+          <td class="paramname"><em>handler</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create a one-shot timer (aka timeout). Timeouts are processed in the following cases:</p><ul>
+<li>while waiting for a message using sys_timeouts_mbox_fetch()</li>
+<li>by calling <a class="el" href="group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883">sys_check_timeouts()</a> (NO_SYS==1 only)</li>
+</ul>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">msecs</td><td>time in milliseconds after that the timer should expire </td></tr>
+    <tr><td class="paramname">handler</td><td>callback function to call when msecs have elapsed </td></tr>
+    <tr><td class="paramname">arg</td><td>argument to pass to the callback function </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a60f42f167f496f6f740c8df48f4dd26c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a60f42f167f496f6f740c8df48f4dd26c">&#9670;&nbsp;</a></span>sys_timeouts_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_timeouts_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize this module </p>
+
+</div>
+</div>
+<a id="aa9971a14a5810cfeb1efd7104cde6664"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa9971a14a5810cfeb1efd7104cde6664">&#9670;&nbsp;</a></span>sys_timeouts_sleeptime()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t sys_timeouts_sleeptime </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return the time left before the next timeout is due. If no timeouts are enqueued, returns 0xffffffff </p>
+
+</div>
+</div>
+<a id="adbfcaa78f4b8d71ae0d7f0bcab6f8fb6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6">&#9670;&nbsp;</a></span>sys_untimeout()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_untimeout </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="timeouts_8h.html#a2ab5bb8173f492563f70a519011b0ac1">sys_timeout_handler</a>&#160;</td>
+          <td class="paramname"><em>handler</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Go through timeout list (for this task only) and remove the first matching entry (subsequent entries remain untouched), even though the timeout has not triggered yet.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">handler</td><td>callback function that would be called by the timeout </td></tr>
+    <tr><td class="paramname">arg</td><td>callback argument that would be passed to handler </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a8181bc316fdf61b85f787c5cadfcd249"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8181bc316fdf61b85f787c5cadfcd249">&#9670;&nbsp;</a></span>tcp_timer_needed()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_timer_needed </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called from TCP_REG when registering a new PCB: the reason is to have the TCP timer only running when there are active (or time-wait) PCBs. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="addc06ab816f051a0fe6f280972eed142"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#addc06ab816f051a0fe6f280972eed142">&#9670;&nbsp;</a></span>lwip_cyclic_timers</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const struct <a class="el" href="structlwip__cyclic__timer.html">lwip_cyclic_timer</a> lwip_cyclic_timers[]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This array contains all stack-internal cyclic timers. To get the number of timers, use LWIP_ARRAYSIZE() </p>
+
+</div>
+</div>
+<a id="a9d01f287a19f20b073d3a1c306ecbfcd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9d01f287a19f20b073d3a1c306ecbfcd">&#9670;&nbsp;</a></span>lwip_num_cyclic_timers</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const int lwip_num_cyclic_timers = (sizeof( <a class="el" href="timeouts_8h.html#addc06ab816f051a0fe6f280972eed142">lwip_cyclic_timers</a> )/sizeof(( <a class="el" href="timeouts_8h.html#addc06ab816f051a0fe6f280972eed142">lwip_cyclic_timers</a> )[0]))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Array size of lwip_cyclic_timers[] </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="timeouts_8c.html">timeouts.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/timeouts_8c.js b/doc/doxygen/output/html/timeouts_8c.js
new file mode 100644
index 0000000..f903345
--- /dev/null
+++ b/doc/doxygen/output/html/timeouts_8c.js
@@ -0,0 +1,12 @@
+var timeouts_8c =
+[
+    [ "sys_check_timeouts", "group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883", null ],
+    [ "sys_restart_timeouts", "timeouts_8c.html#a6913959cf264dbe876b7e7c4db1cc13e", null ],
+    [ "sys_timeout", "timeouts_8c.html#a8deed391626ec8b5423998e33782d7a8", null ],
+    [ "sys_timeouts_init", "timeouts_8c.html#a60f42f167f496f6f740c8df48f4dd26c", null ],
+    [ "sys_timeouts_sleeptime", "timeouts_8c.html#aa9971a14a5810cfeb1efd7104cde6664", null ],
+    [ "sys_untimeout", "timeouts_8c.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6", null ],
+    [ "tcp_timer_needed", "timeouts_8c.html#a8181bc316fdf61b85f787c5cadfcd249", null ],
+    [ "lwip_cyclic_timers", "timeouts_8c.html#addc06ab816f051a0fe6f280972eed142", null ],
+    [ "lwip_num_cyclic_timers", "timeouts_8c.html#a9d01f287a19f20b073d3a1c306ecbfcd", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/timeouts_8h.html b/doc/doxygen/output/html/timeouts_8h.html
new file mode 100644
index 0000000..9ff7abe
--- /dev/null
+++ b/doc/doxygen/output/html/timeouts_8h.html
@@ -0,0 +1,376 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/timeouts.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('timeouts_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">timeouts.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="err_8h.html">lwip/err.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="sys_8h.html">lwip/sys.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structlwip__cyclic__timer.html">lwip_cyclic_timer</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 name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a9e2b2593e709ff54c7e3c0b003f6f1b0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8h.html#a9e2b2593e709ff54c7e3c0b003f6f1b0">SYS_TIMEOUTS_SLEEPTIME_INFINITE</a>&#160;&#160;&#160;0xFFFFFFFF</td></tr>
+<tr class="separator:a9e2b2593e709ff54c7e3c0b003f6f1b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a985c5d366b62bd179195e093ffcb7ecd"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8h.html#a985c5d366b62bd179195e093ffcb7ecd">lwip_cyclic_timer_handler</a>) (void)</td></tr>
+<tr class="separator:a985c5d366b62bd179195e093ffcb7ecd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2ab5bb8173f492563f70a519011b0ac1"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8h.html#a2ab5bb8173f492563f70a519011b0ac1">sys_timeout_handler</a>) (void *arg)</td></tr>
+<tr class="separator:a2ab5bb8173f492563f70a519011b0ac1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a60f42f167f496f6f740c8df48f4dd26c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8h.html#a60f42f167f496f6f740c8df48f4dd26c">sys_timeouts_init</a> (void)</td></tr>
+<tr class="separator:a60f42f167f496f6f740c8df48f4dd26c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8deed391626ec8b5423998e33782d7a8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8h.html#a8deed391626ec8b5423998e33782d7a8">sys_timeout</a> (u32_t msecs, <a class="el" href="timeouts_8h.html#a2ab5bb8173f492563f70a519011b0ac1">sys_timeout_handler</a> handler, void *arg)</td></tr>
+<tr class="separator:a8deed391626ec8b5423998e33782d7a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adbfcaa78f4b8d71ae0d7f0bcab6f8fb6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8h.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6">sys_untimeout</a> (<a class="el" href="timeouts_8h.html#a2ab5bb8173f492563f70a519011b0ac1">sys_timeout_handler</a> handler, void *arg)</td></tr>
+<tr class="separator:adbfcaa78f4b8d71ae0d7f0bcab6f8fb6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6913959cf264dbe876b7e7c4db1cc13e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8h.html#a6913959cf264dbe876b7e7c4db1cc13e">sys_restart_timeouts</a> (void)</td></tr>
+<tr class="separator:a6913959cf264dbe876b7e7c4db1cc13e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83cffdf69ab60fd0eba9d17d363f9883"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883">sys_check_timeouts</a> (void)</td></tr>
+<tr class="separator:ga83cffdf69ab60fd0eba9d17d363f9883"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa9971a14a5810cfeb1efd7104cde6664"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8h.html#aa9971a14a5810cfeb1efd7104cde6664">sys_timeouts_sleeptime</a> (void)</td></tr>
+<tr class="separator:aa9971a14a5810cfeb1efd7104cde6664"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:addc06ab816f051a0fe6f280972eed142"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structlwip__cyclic__timer.html">lwip_cyclic_timer</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8h.html#addc06ab816f051a0fe6f280972eed142">lwip_cyclic_timers</a> []</td></tr>
+<tr class="separator:addc06ab816f051a0fe6f280972eed142"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d01f287a19f20b073d3a1c306ecbfcd"><td class="memItemLeft" align="right" valign="top">const int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="timeouts_8h.html#a9d01f287a19f20b073d3a1c306ecbfcd">lwip_num_cyclic_timers</a></td></tr>
+<tr class="separator:a9d01f287a19f20b073d3a1c306ecbfcd"><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>Timer implementations </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a9e2b2593e709ff54c7e3c0b003f6f1b0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9e2b2593e709ff54c7e3c0b003f6f1b0">&#9670;&nbsp;</a></span>SYS_TIMEOUTS_SLEEPTIME_INFINITE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SYS_TIMEOUTS_SLEEPTIME_INFINITE&#160;&#160;&#160;0xFFFFFFFF</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returned by <a class="el" href="timeouts_8h.html#aa9971a14a5810cfeb1efd7104cde6664">sys_timeouts_sleeptime()</a> to indicate there is no timer, so we can sleep forever. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="a985c5d366b62bd179195e093ffcb7ecd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a985c5d366b62bd179195e093ffcb7ecd">&#9670;&nbsp;</a></span>lwip_cyclic_timer_handler</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(*  lwip_cyclic_timer_handler) (void)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for a stack-internal timer function that has to be called at a defined interval </p>
+
+</div>
+</div>
+<a id="a2ab5bb8173f492563f70a519011b0ac1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2ab5bb8173f492563f70a519011b0ac1">&#9670;&nbsp;</a></span>sys_timeout_handler</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(*  sys_timeout_handler) (void *arg)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for a timeout callback function. Register such a function using <a class="el" href="timeouts_8h.html#a8deed391626ec8b5423998e33782d7a8">sys_timeout()</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>Additional argument to pass to the function - set up by <a class="el" href="timeouts_8h.html#a8deed391626ec8b5423998e33782d7a8">sys_timeout()</a> </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a6913959cf264dbe876b7e7c4db1cc13e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6913959cf264dbe876b7e7c4db1cc13e">&#9670;&nbsp;</a></span>sys_restart_timeouts()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_restart_timeouts </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Rebase the timeout times to the current time. This is necessary if <a class="el" href="group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883">sys_check_timeouts()</a> hasn't been called for a long time (e.g. while saving energy) to prevent all timer functions of that period being called. </p>
+
+</div>
+</div>
+<a id="a8deed391626ec8b5423998e33782d7a8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8deed391626ec8b5423998e33782d7a8">&#9670;&nbsp;</a></span>sys_timeout()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_timeout </td>
+          <td>(</td>
+          <td class="paramtype">u32_t&#160;</td>
+          <td class="paramname"><em>msecs</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="timeouts_8h.html#a2ab5bb8173f492563f70a519011b0ac1">sys_timeout_handler</a>&#160;</td>
+          <td class="paramname"><em>handler</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create a one-shot timer (aka timeout). Timeouts are processed in the following cases:</p><ul>
+<li>while waiting for a message using sys_timeouts_mbox_fetch()</li>
+<li>by calling <a class="el" href="group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883">sys_check_timeouts()</a> (NO_SYS==1 only)</li>
+</ul>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">msecs</td><td>time in milliseconds after that the timer should expire </td></tr>
+    <tr><td class="paramname">handler</td><td>callback function to call when msecs have elapsed </td></tr>
+    <tr><td class="paramname">arg</td><td>argument to pass to the callback function </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a60f42f167f496f6f740c8df48f4dd26c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a60f42f167f496f6f740c8df48f4dd26c">&#9670;&nbsp;</a></span>sys_timeouts_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_timeouts_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize this module </p>
+
+</div>
+</div>
+<a id="aa9971a14a5810cfeb1efd7104cde6664"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa9971a14a5810cfeb1efd7104cde6664">&#9670;&nbsp;</a></span>sys_timeouts_sleeptime()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u32_t sys_timeouts_sleeptime </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return the time left before the next timeout is due. If no timeouts are enqueued, returns 0xffffffff </p>
+
+</div>
+</div>
+<a id="adbfcaa78f4b8d71ae0d7f0bcab6f8fb6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6">&#9670;&nbsp;</a></span>sys_untimeout()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void sys_untimeout </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="timeouts_8h.html#a2ab5bb8173f492563f70a519011b0ac1">sys_timeout_handler</a>&#160;</td>
+          <td class="paramname"><em>handler</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>arg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Go through timeout list (for this task only) and remove the first matching entry (subsequent entries remain untouched), even though the timeout has not triggered yet.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">handler</td><td>callback function that would be called by the timeout </td></tr>
+    <tr><td class="paramname">arg</td><td>callback argument that would be passed to handler </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="addc06ab816f051a0fe6f280972eed142"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#addc06ab816f051a0fe6f280972eed142">&#9670;&nbsp;</a></span>lwip_cyclic_timers</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const struct <a class="el" href="structlwip__cyclic__timer.html">lwip_cyclic_timer</a> lwip_cyclic_timers[]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This array contains all stack-internal cyclic timers. To get the number of timers, use lwip_num_cyclic_timers</p>
+<p>This array contains all stack-internal cyclic timers. To get the number of timers, use LWIP_ARRAYSIZE() </p>
+
+</div>
+</div>
+<a id="a9d01f287a19f20b073d3a1c306ecbfcd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9d01f287a19f20b073d3a1c306ecbfcd">&#9670;&nbsp;</a></span>lwip_num_cyclic_timers</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const int lwip_num_cyclic_timers</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Array size of lwip_cyclic_timers[] </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="timeouts_8h.html">timeouts.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/timeouts_8h.js b/doc/doxygen/output/html/timeouts_8h.js
new file mode 100644
index 0000000..341de0a
--- /dev/null
+++ b/doc/doxygen/output/html/timeouts_8h.js
@@ -0,0 +1,15 @@
+var timeouts_8h =
+[
+    [ "lwip_cyclic_timer", "structlwip__cyclic__timer.html", null ],
+    [ "SYS_TIMEOUTS_SLEEPTIME_INFINITE", "timeouts_8h.html#a9e2b2593e709ff54c7e3c0b003f6f1b0", null ],
+    [ "lwip_cyclic_timer_handler", "timeouts_8h.html#a985c5d366b62bd179195e093ffcb7ecd", null ],
+    [ "sys_timeout_handler", "timeouts_8h.html#a2ab5bb8173f492563f70a519011b0ac1", null ],
+    [ "sys_check_timeouts", "group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883", null ],
+    [ "sys_restart_timeouts", "timeouts_8h.html#a6913959cf264dbe876b7e7c4db1cc13e", null ],
+    [ "sys_timeout", "timeouts_8h.html#a8deed391626ec8b5423998e33782d7a8", null ],
+    [ "sys_timeouts_init", "timeouts_8h.html#a60f42f167f496f6f740c8df48f4dd26c", null ],
+    [ "sys_timeouts_sleeptime", "timeouts_8h.html#aa9971a14a5810cfeb1efd7104cde6664", null ],
+    [ "sys_untimeout", "timeouts_8h.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6", null ],
+    [ "lwip_cyclic_timers", "timeouts_8h.html#addc06ab816f051a0fe6f280972eed142", null ],
+    [ "lwip_num_cyclic_timers", "timeouts_8h.html#a9d01f287a19f20b073d3a1c306ecbfcd", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/udp_8c.html b/doc/doxygen/output/html/udp_8c.html
new file mode 100644
index 0000000..b5f3b7c
--- /dev/null
+++ b/doc/doxygen/output/html/udp_8c.html
@@ -0,0 +1,248 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/udp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('udp_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">udp.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 &quot;<a class="el" href="udp_8h.html">lwip/udp.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="memp_8h.html">lwip/memp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="inet__chksum_8h.html">lwip/inet_chksum.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="ip6_8h.html">lwip/ip6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_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="icmp_8h.html">lwip/icmp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="icmp6_8h.html">lwip/icmp6.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="stats_8h.html">lwip/stats.h</a>&quot;</code><br />
+<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 &lt;string.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae7f7431ce99333577d7b82b26619309e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="udp_8c.html#ae7f7431ce99333577d7b82b26619309e">udp_init</a> (void)</td></tr>
+<tr class="separator:ae7f7431ce99333577d7b82b26619309e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b338a5515606bd51976fbc5bcec9611"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="udp_8c.html#a7b338a5515606bd51976fbc5bcec9611">udp_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:a7b338a5515606bd51976fbc5bcec9611"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa4546c43981f043c0ae4514d625cc3fc"><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__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc">udp_send</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:gaa4546c43981f043c0ae4514d625cc3fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa0e135a5958f1f0cc83cbeb609e18743"><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__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743">udp_sendto</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dst_ip, u16_t dst_port)</td></tr>
+<tr class="separator:gaa0e135a5958f1f0cc83cbeb609e18743"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83f8c873671ca7f307d14b29a0a7a142"><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__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142">udp_sendto_if</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dst_ip, u16_t dst_port, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga83f8c873671ca7f307d14b29a0a7a142"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa389827c979c766c1dae301239f7bbb7"><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__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7">udp_sendto_if_src</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dst_ip, u16_t dst_port, 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#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *src_ip)</td></tr>
+<tr class="separator:gaa389827c979c766c1dae301239f7bbb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac7fbda8b12b9b9360e92b51e805e799e"><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__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e">udp_bind</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, u16_t port)</td></tr>
+<tr class="separator:gac7fbda8b12b9b9360e92b51e805e799e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4360535ae72e77019721c9637a1051a8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8">udp_bind_netif</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, const struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga4360535ae72e77019721c9637a1051a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83625967670477aa254643129a53971b"><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__udp__raw.html#ga83625967670477aa254643129a53971b">udp_connect</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, u16_t port)</td></tr>
+<tr class="separator:ga83625967670477aa254643129a53971b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8d26559743e59e4b409c92a268ee67fc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc">udp_disconnect</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga8d26559743e59e4b409c92a268ee67fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gada6d02b9a5f35e1fb2e1bc71b11e6027"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027">udp_recv</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, <a class="el" href="udp_8h.html#af0ec7feb31acdb6e11b928f438c8a64b">udp_recv_fn</a> <a class="el" href="group__socket.html#gadd7ae45df7c005619eb1126542231e9b">recv</a>, void *recv_arg)</td></tr>
+<tr class="separator:gada6d02b9a5f35e1fb2e1bc71b11e6027"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3aed8e469f74f960837ebf9f34acf646"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646">udp_remove</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga3aed8e469f74f960837ebf9f34acf646"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa6d6430499acae43d342f0e68ddbb209"><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="group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209">udp_new</a> (void)</td></tr>
+<tr class="separator:gaa6d6430499acae43d342f0e68ddbb209"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf1ab236050dd351e93f112cfbc1ada88"><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="group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88">udp_new_ip_type</a> (u8_t type)</td></tr>
+<tr class="separator:gaf1ab236050dd351e93f112cfbc1ada88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab857f86a0b15d02b864292b161b2c3fc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="udp_8c.html#ab857f86a0b15d02b864292b161b2c3fc">udp_netif_ip_addr_changed</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *old_addr, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *new_addr)</td></tr>
+<tr class="separator:ab857f86a0b15d02b864292b161b2c3fc"><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>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>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ae7f7431ce99333577d7b82b26619309e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae7f7431ce99333577d7b82b26619309e">&#9670;&nbsp;</a></span>udp_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void udp_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize this module. </p>
+
+</div>
+</div>
+<a id="a7b338a5515606bd51976fbc5bcec9611"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7b338a5515606bd51976fbc5bcec9611">&#9670;&nbsp;</a></span>udp_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void udp_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Process an incoming UDP datagram.</p>
+<p>Given an incoming UDP datagram (as a chain of pbufs) this function finds a corresponding UDP PCB and hands over the pbuf to the pcbs recv function. If no pcb is found or the datagram is incorrect, the pbuf is freed.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to be demultiplexed to a UDP PCB (p-&gt;payload pointing to the UDP header) </td></tr>
+    <tr><td class="paramname">inp</td><td>network interface on which the datagram was received. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab857f86a0b15d02b864292b161b2c3fc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab857f86a0b15d02b864292b161b2c3fc">&#9670;&nbsp;</a></span>udp_netif_ip_addr_changed()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void udp_netif_ip_addr_changed </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>old_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>new_addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called from <a class="el" href="netif_8c.html">netif.c</a> when address is changed</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">old_addr</td><td>IP address of the netif before change </td></tr>
+    <tr><td class="paramname">new_addr</td><td>IP address of the netif after change </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_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li><li class="navelem"><a class="el" href="udp_8c.html">udp.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/udp_8c.js b/doc/doxygen/output/html/udp_8c.js
new file mode 100644
index 0000000..6ca7a00
--- /dev/null
+++ b/doc/doxygen/output/html/udp_8c.js
@@ -0,0 +1,18 @@
+var udp_8c =
+[
+    [ "udp_bind", "group__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e", null ],
+    [ "udp_bind_netif", "group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8", null ],
+    [ "udp_connect", "group__udp__raw.html#ga83625967670477aa254643129a53971b", null ],
+    [ "udp_disconnect", "group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc", null ],
+    [ "udp_init", "udp_8c.html#ae7f7431ce99333577d7b82b26619309e", null ],
+    [ "udp_input", "udp_8c.html#a7b338a5515606bd51976fbc5bcec9611", null ],
+    [ "udp_netif_ip_addr_changed", "udp_8c.html#ab857f86a0b15d02b864292b161b2c3fc", null ],
+    [ "udp_new", "group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209", null ],
+    [ "udp_new_ip_type", "group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88", null ],
+    [ "udp_recv", "group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027", null ],
+    [ "udp_remove", "group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646", null ],
+    [ "udp_send", "group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc", null ],
+    [ "udp_sendto", "group__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743", null ],
+    [ "udp_sendto_if", "group__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142", null ],
+    [ "udp_sendto_if_src", "group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/udp_8h.html b/doc/doxygen/output/html/udp_8h.html
new file mode 100644
index 0000000..155f04a
--- /dev/null
+++ b/doc/doxygen/output/html/udp_8h.html
@@ -0,0 +1,278 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/udp.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('udp_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">udp.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="pbuf_8h.html">lwip/pbuf.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="ip__addr_8h.html">lwip/ip_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip_8h.html">lwip/ip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip6__addr_8h.html">lwip/ip6_addr.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2udp_8h.html">lwip/prot/udp.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structudp__pcb.html">udp_pcb</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 name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:af0ec7feb31acdb6e11b928f438c8a64b"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="udp_8h.html#af0ec7feb31acdb6e11b928f438c8a64b">udp_recv_fn</a>) (void *arg, struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, u16_t port)</td></tr>
+<tr class="separator:af0ec7feb31acdb6e11b928f438c8a64b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaa6d6430499acae43d342f0e68ddbb209"><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="group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209">udp_new</a> (void)</td></tr>
+<tr class="separator:gaa6d6430499acae43d342f0e68ddbb209"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf1ab236050dd351e93f112cfbc1ada88"><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="group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88">udp_new_ip_type</a> (u8_t type)</td></tr>
+<tr class="separator:gaf1ab236050dd351e93f112cfbc1ada88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3aed8e469f74f960837ebf9f34acf646"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646">udp_remove</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga3aed8e469f74f960837ebf9f34acf646"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac7fbda8b12b9b9360e92b51e805e799e"><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__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e">udp_bind</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, u16_t port)</td></tr>
+<tr class="separator:gac7fbda8b12b9b9360e92b51e805e799e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4360535ae72e77019721c9637a1051a8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8">udp_bind_netif</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, const struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga4360535ae72e77019721c9637a1051a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83625967670477aa254643129a53971b"><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__udp__raw.html#ga83625967670477aa254643129a53971b">udp_connect</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *ipaddr, u16_t port)</td></tr>
+<tr class="separator:ga83625967670477aa254643129a53971b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8d26559743e59e4b409c92a268ee67fc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc">udp_disconnect</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb)</td></tr>
+<tr class="separator:ga8d26559743e59e4b409c92a268ee67fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gada6d02b9a5f35e1fb2e1bc71b11e6027"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027">udp_recv</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, <a class="el" href="udp_8h.html#af0ec7feb31acdb6e11b928f438c8a64b">udp_recv_fn</a> <a class="el" href="group__socket.html#gadd7ae45df7c005619eb1126542231e9b">recv</a>, void *recv_arg)</td></tr>
+<tr class="separator:gada6d02b9a5f35e1fb2e1bc71b11e6027"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga83f8c873671ca7f307d14b29a0a7a142"><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__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142">udp_sendto_if</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dst_ip, u16_t dst_port, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga83f8c873671ca7f307d14b29a0a7a142"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa389827c979c766c1dae301239f7bbb7"><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__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7">udp_sendto_if_src</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dst_ip, u16_t dst_port, 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#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *src_ip)</td></tr>
+<tr class="separator:gaa389827c979c766c1dae301239f7bbb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa0e135a5958f1f0cc83cbeb609e18743"><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__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743">udp_sendto</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *dst_ip, u16_t dst_port)</td></tr>
+<tr class="separator:gaa0e135a5958f1f0cc83cbeb609e18743"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa4546c43981f043c0ae4514d625cc3fc"><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__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc">udp_send</a> (struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
+<tr class="separator:gaa4546c43981f043c0ae4514d625cc3fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b338a5515606bd51976fbc5bcec9611"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="udp_8h.html#a7b338a5515606bd51976fbc5bcec9611">udp_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:a7b338a5515606bd51976fbc5bcec9611"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae7f7431ce99333577d7b82b26619309e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="udp_8h.html#ae7f7431ce99333577d7b82b26619309e">udp_init</a> (void)</td></tr>
+<tr class="separator:ae7f7431ce99333577d7b82b26619309e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab857f86a0b15d02b864292b161b2c3fc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="udp_8h.html#ab857f86a0b15d02b864292b161b2c3fc">udp_netif_ip_addr_changed</a> (const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *old_addr, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *new_addr)</td></tr>
+<tr class="separator:ab857f86a0b15d02b864292b161b2c3fc"><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>UDP API (to be used from TCPIP thread)<br />
+See also <a class="el" href="group__udp__raw.html">UDP</a> </p>
+</div><h2 class="groupheader">Typedef Documentation</h2>
+<a id="af0ec7feb31acdb6e11b928f438c8a64b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af0ec7feb31acdb6e11b928f438c8a64b">&#9670;&nbsp;</a></span>udp_recv_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* udp_recv_fn) (void *arg, struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *addr, u16_t port)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Function prototype for udp pcb receive callback functions addr and port are in same byte order as in the pcb The callback is responsible for freeing the pbuf if it's not used any more.</p>
+<p>ATTENTION: Be aware that 'addr' might point into the pbuf 'p' so freeing this pbuf can make 'addr' invalid, too.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>user supplied argument (<a class="el" href="structudp__pcb.html#a11e4c40b8868aa40d923756a60598cab">udp_pcb.recv_arg</a>) </td></tr>
+    <tr><td class="paramname">pcb</td><td>the <a class="el" href="structudp__pcb.html">udp_pcb</a> which received data </td></tr>
+    <tr><td class="paramname">p</td><td>the packet buffer that was received </td></tr>
+    <tr><td class="paramname">addr</td><td>the remote IP address from which the packet was received </td></tr>
+    <tr><td class="paramname">port</td><td>the remote port from which the packet was received </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ae7f7431ce99333577d7b82b26619309e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae7f7431ce99333577d7b82b26619309e">&#9670;&nbsp;</a></span>udp_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void udp_init </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize this module. </p>
+
+</div>
+</div>
+<a id="a7b338a5515606bd51976fbc5bcec9611"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7b338a5515606bd51976fbc5bcec9611">&#9670;&nbsp;</a></span>udp_input()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void udp_input </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td>
+          <td class="paramname"><em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td>
+          <td class="paramname"><em>inp</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Process an incoming UDP datagram.</p>
+<p>Given an incoming UDP datagram (as a chain of pbufs) this function finds a corresponding UDP PCB and hands over the pbuf to the pcbs recv function. If no pcb is found or the datagram is incorrect, the pbuf is freed.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>pbuf to be demultiplexed to a UDP PCB (p-&gt;payload pointing to the UDP header) </td></tr>
+    <tr><td class="paramname">inp</td><td>network interface on which the datagram was received. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab857f86a0b15d02b864292b161b2c3fc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab857f86a0b15d02b864292b161b2c3fc">&#9670;&nbsp;</a></span>udp_netif_ip_addr_changed()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void udp_netif_ip_addr_changed </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>old_addr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga16ef96d6cde029029bbf47fee35fd67a">ip_addr_t</a> *&#160;</td>
+          <td class="paramname"><em>new_addr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This function is called from <a class="el" href="netif_8c.html">netif.c</a> when address is changed</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">old_addr</td><td>IP address of the netif before change </td></tr>
+    <tr><td class="paramname">new_addr</td><td>IP address of the netif after change </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="udp_8h.html">udp.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/udp_8h.js b/doc/doxygen/output/html/udp_8h.js
new file mode 100644
index 0000000..ce86569
--- /dev/null
+++ b/doc/doxygen/output/html/udp_8h.js
@@ -0,0 +1,20 @@
+var udp_8h =
+[
+    [ "udp_pcb", "structudp__pcb.html", "structudp__pcb" ],
+    [ "udp_recv_fn", "udp_8h.html#af0ec7feb31acdb6e11b928f438c8a64b", null ],
+    [ "udp_bind", "group__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e", null ],
+    [ "udp_bind_netif", "group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8", null ],
+    [ "udp_connect", "group__udp__raw.html#ga83625967670477aa254643129a53971b", null ],
+    [ "udp_disconnect", "group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc", null ],
+    [ "udp_init", "udp_8h.html#ae7f7431ce99333577d7b82b26619309e", null ],
+    [ "udp_input", "udp_8h.html#a7b338a5515606bd51976fbc5bcec9611", null ],
+    [ "udp_netif_ip_addr_changed", "udp_8h.html#ab857f86a0b15d02b864292b161b2c3fc", null ],
+    [ "udp_new", "group__udp__raw.html#gaa6d6430499acae43d342f0e68ddbb209", null ],
+    [ "udp_new_ip_type", "group__udp__raw.html#gaf1ab236050dd351e93f112cfbc1ada88", null ],
+    [ "udp_recv", "group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027", null ],
+    [ "udp_remove", "group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646", null ],
+    [ "udp_send", "group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc", null ],
+    [ "udp_sendto", "group__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743", null ],
+    [ "udp_sendto_if", "group__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142", null ],
+    [ "udp_sendto_if_src", "group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/unionnetif__ext__callback__args__t.html b/doc/doxygen/output/html/unionnetif__ext__callback__args__t.html
new file mode 100644
index 0000000..e8a72b3
--- /dev/null
+++ b/doc/doxygen/output/html/unionnetif__ext__callback__args__t.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: netif_ext_callback_args_t Union 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('unionnetif__ext__callback__args__t.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a>  </div>
+  <div class="headertitle">
+<div class="title">netif_ext_callback_args_t Union 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__netif.html">Network interface (NETIF)</a></div></div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;netif.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a 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="structnetif__ext__callback__args__t_1_1ipv4__changed__s.html">ipv4_changed_s</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="structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html">ipv6_addr_state_changed_s</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="structnetif__ext__callback__args__t_1_1ipv6__set__s.html">ipv6_set_s</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="structnetif__ext__callback__args__t_1_1link__changed__s.html">link_changed_s</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="structnetif__ext__callback__args__t_1_1status__changed__s.html">status_changed_s</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>
+<div class="textblock"><p>Argument supplied to netif_ext_callback_fn. </p>
+</div><hr/>The documentation for this union was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="netif_8h.html">netif.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="unionnetif__ext__callback__args__t.html">netif_ext_callback_args_t</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/unionnetif__ext__callback__args__t.js b/doc/doxygen/output/html/unionnetif__ext__callback__args__t.js
new file mode 100644
index 0000000..22b73ea
--- /dev/null
+++ b/doc/doxygen/output/html/unionnetif__ext__callback__args__t.js
@@ -0,0 +1,8 @@
+var unionnetif__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" ],
+    [ "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" ],
+    [ "ipv6_set_s", "structnetif__ext__callback__args__t_1_1ipv6__set__s.html", "structnetif__ext__callback__args__t_1_1ipv6__set__s" ],
+    [ "link_changed_s", "structnetif__ext__callback__args__t_1_1link__changed__s.html", "structnetif__ext__callback__args__t_1_1link__changed__s" ],
+    [ "status_changed_s", "structnetif__ext__callback__args__t_1_1status__changed__s.html", "structnetif__ext__callback__args__t_1_1status__changed__s" ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/unionsnmp__variant__value.html b/doc/doxygen/output/html/unionsnmp__variant__value.html
new file mode 100644
index 0000000..f7136c8
--- /dev/null
+++ b/doc/doxygen/output/html/unionsnmp__variant__value.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: snmp_variant_value Union 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('unionsnmp__variant__value.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">snmp_variant_value Union Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;snmp_core.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>SNMP variant value, used as reference in struct <a class="el" href="structsnmp__node__instance.html">snmp_node_instance</a> and table implementation </p>
+</div><hr/>The documentation for this union was generated from the following file:<ul>
+<li>src/include/lwip/apps/<a class="el" href="snmp__core_8h.html">snmp_core.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="unionsnmp__variant__value.html">snmp_variant_value</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/unionsockaddr__aligned.html b/doc/doxygen/output/html/unionsockaddr__aligned.html
new file mode 100644
index 0000000..d947a42
--- /dev/null
+++ b/doc/doxygen/output/html/unionsockaddr__aligned.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: sockaddr_aligned Union 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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('unionsockaddr__aligned.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">sockaddr_aligned Union Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A struct sockaddr replacement that has the same alignment as sockaddr_in/ sockaddr_in6 if instantiated. </p>
+</div><hr/>The documentation for this union was generated from the following file:<ul>
+<li>src/api/<a class="el" href="sockets_8c.html">sockets.c</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="unionsockaddr__aligned.html">sockaddr_aligned</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/upgrading.html b/doc/doxygen/output/html/upgrading.html
new file mode 100644
index 0000000..2f248e1
--- /dev/null
+++ b/doc/doxygen/output/html/upgrading.html
@@ -0,0 +1,377 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Upgrading</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('upgrading.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">Upgrading </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><pre class="fragment">This file lists major changes between release versions that require
+ports or applications to be changed. Use it to update a port or an
+application written for an older version of lwIP to correctly work
+with newer versions.
+
+
+(git master)
+
+  * [Enter new changes just after this line - do not remove this line]
+
+(2.1.0)
+
+  ++ Application changes:
+
+  * Use the new altcp API for seamless TLS integration into existing TCP applications (see changelog)
+  * TCP only kills existing connections with a LOWER priority than the one currently being opened.
+    Previous implementations also kill existing connections of the SAME priority.
+  * ip4_route_src: parameter order is reversed: ip4_route_src(dest, src) -&gt; ip4_route_src(src, dest)
+    to make parameter order consistent with other ip*_route*() functions.
+    Same also applies to LWIP_HOOK_IP4_ROUTE_SRC() parameter order.
+  * pbuf API: pbuf-&gt;type (an u8_t holding the enum 'pbuf_type') has changed to only hold a
+    description of the pbuf (e.g. data following pbuf struct, data volatile, allocation
+    source heap/pool/etc.). As a consequence, applications can't test pbuf-&gt;type any more.
+    Use pbuf_match_type(pbuf, type) instead.
+  * socket API: according to the standard, SO_ERROR now only returns asynchronous errors.
+    All other/normal/synchronous errors are (and always were) available via 'errno'.
+    LWIP_SOCKET_SET_ERRNO has been removed - 'errno' is always set - and required!
+  * httpd LWIP_HTTPD_CGI_SSI: httpd_cgi_handler() has an additional parameter "struct fs_file *"
+
+  ++ Port changes:
+
+  * tcpip_trycallback() was renamed to tcpip_callbackmsg_trycallback() to avoid confusion
+    with tcpip_try_callback()
+  * compatibility headers: moved from 'src/include/posix' to 'src/include/compat/posix',
+    'src/include/compat/stdc' etc.
+  * The IPv6 implementation now supports address scopes. (See LWIP_IPV6_SCOPES documentation
+    and ip6_zone.h for more documentation)
+  * LWIP_HOOK_DHCP_APPEND_OPTIONS() has changed, see description in opt.h (options_out_len is not
+    available in struct dhcp any more)
+  * Added debug helper asserts to ensure threading/locking requirements are met (define
+    LWIP_MARK_TCPIP_THREAD() and LWIP_ASSERT_CORE_LOCKED()).
+  * Added sys_mbox_trypost_fromisr() and tcpip_callbackmsg_trycallback_fromisr()
+    These can be used to post preallocated messages from an ISR to the tcpip thread
+    (e.g. when using FreeRTOS)
+
+(2.0.2)
+
+  ++ Application changes:
+
+  * slipif: The way to pass serial port number has changed. netif-&gt;num is not
+    supported any more, netif-&gt;state is interpreted as an u8_t port number now
+    (it's not a POINTER to an u8_t any more!)
+
+(2.0.1)
+
+  ++ Application changes:
+
+  * UDP does NOT receive multicast traffic from ALL netifs on an UDP PCB bound to a specific
+    netif any more. Users need to bind to IP_ADDR_ANY to receive multicast traffic and compare 
+    ip_current_netif() to the desired netif for every packet.
+    See bug #49662 for an explanation.
+
+(2.0.0)
+
+  ++ Application changes:
+
+  * Changed netif "up" flag handling to be an administrative flag (as opposed to the previous meaning of
+    "ip4-address-valid", a netif will now not be used for transmission if not up) -&gt; even a DHCP netif
+    has to be set "up" before starting the DHCP client
+  * Added IPv6 support (dual-stack or IPv4/IPv6 only)
+  * Changed ip_addr_t to be a union in dual-stack mode (use ip4_addr_t where referring to IPv4 only).
+  * Major rewrite of SNMP (added MIB parser that creates code stubs for custom MIBs);
+    supports SNMPv2c (experimental v3 support)
+  * Moved some core applications from contrib repository to src/apps (and include/lwip/apps)
+
+  +++ Raw API:
+    * Changed TCP listen backlog: removed tcp_accepted(), added the function pair tcp_backlog_delayed()/
+      tcp_backlog_accepted() to explicitly delay backlog handling on a connection pcb
+
+  +++ Socket API:
+    * Added an implementation for posix sendmsg()
+    * Added LWIP_FIONREAD_LINUXMODE that makes ioctl/FIONREAD return the size of the next pending datagram
+
+  ++ Port changes
+
+  +++ new files:
+    * MANY new and moved files! 
+    * Added src/Filelists.mk for use in Makefile projects
+    * Continued moving stack-internal parts from abc.h to abc_priv.h in sub-folder "priv"
+      to let abc.h only contain the actual application programmer's API
+
+  +++ sys layer:
+    * Made LWIP_TCPIP_CORE_LOCKING==1 the default as it usually performs better than
+      the traditional message passing (although with LWIP_COMPAT_MUTEX you are still
+      open to priority inversion, so this is not recommended any more)
+    * Added LWIP_NETCONN_SEM_PER_THREAD to use one "op_completed" semaphore per thread
+      instead of using one per netconn (these semaphores are used even with core locking
+      enabled as some longer lasting functions like big writes still need to delay)
+    * Added generalized abstraction for itoa(), strnicmp(), stricmp() and strnstr()
+      in def.h (to be overridden in cc.h) instead of config 
+      options for netbiosns, httpd, dns, etc. ...
+    * New abstraction for hton* and ntoh* functions in def.h.
+      To override them, use the following in cc.h: 
+      #define lwip_htons(x) &lt;your_htons&gt;
+      #define lwip_htonl(x) &lt;your_htonl&gt;
+
+  +++ new options:
+     * TODO
+
+  +++ new pools:
+     * Added LWIP_MEMPOOL_* (declare/init/alloc/free) to declare private memp pools
+       that share memp.c code but do not have to be made global via lwippools.h
+     * Added pools for IPv6, MPU_COMPATIBLE, dns-api, netif-api, etc.
+     * added hook LWIP_HOOK_MEMP_AVAILABLE() to get informed when a memp pool was empty and an item
+       is now available
+
+  * Signature of LWIP_HOOK_VLAN_SET macro was changed
+
+  * LWIP_DECLARE_MEMORY_ALIGNED() may be used to declare aligned memory buffers (mem/memp)
+    or to move buffers to dedicated memory using compiler attributes
+
+  * Standard C headers are used to define sized types and printf formatters
+    (disable by setting LWIP_NO_STDINT_H=1 or LWIP_NO_INTTYPES_H=1 if your compiler
+    does not support these)
+
+
+  ++ Major bugfixes/improvements
+
+  * Added IPv6 support (dual-stack or IPv4/IPv6 only)
+  * Major rewrite of PPP (incl. keep-up with apache pppd)
+    see doc/ppp.txt for an upgrading how-to
+  * Major rewrite of SNMP (incl. MIB parser)
+  * Fixed timing issues that might have lead to losing a DHCP lease
+  * Made rx processing path more robust against crafted errors
+  * TCP window scaling support
+  * modification of api modules to support FreeRTOS-MPU (don't pass stack-pointers to other threads)
+  * made DNS client more robust
+  * support PBUF_REF for RX packets
+  * LWIP_NETCONN_FULLDUPLEX allows netconn/sockets to be used for reading/writing from separate
+    threads each (needs LWIP_NETCONN_SEM_PER_THREAD)
+  * Moved and reordered stats (mainly memp/mib2)
+
+(1.4.0)
+
+  ++ Application changes:
+
+  * Replaced struct ip_addr by typedef ip_addr_t (struct ip_addr is kept for
+    compatibility to old applications, but will be removed in the future).
+
+  * Renamed mem_realloc() to mem_trim() to prevent confusion with realloc()
+
+  +++ Raw API:
+    * Changed the semantics of tcp_close() (since it was rather a
+      shutdown before): Now the application does *NOT* get any calls to the recv
+      callback (aside from NULL/closed) after calling tcp_close()
+
+    * When calling tcp_abort() from a raw API TCP callback function,
+      make sure you return ERR_ABRT to prevent accessing unallocated memory.
+      (ERR_ABRT now means the applicaiton has called tcp_abort!)
+
+  +++ Netconn API:
+    * Changed netconn_receive() and netconn_accept() to return
+      err_t, not a pointer to new data/netconn.
+
+  +++ Socket API:
+    * LWIP_SO_RCVTIMEO: when accept() or recv() time out, they
+      now set errno to EWOULDBLOCK/EAGAIN, not ETIMEDOUT.
+
+    * Added a minimal version of posix fctl() to have a
+      standardised way to set O_NONBLOCK for nonblocking sockets.
+
+  +++ all APIs:
+    * correctly implemented SO(F)_REUSEADDR
+
+  ++ Port changes
+
+  +++ new files:
+
+    * Added 4 new files: def.c, timers.c, timers.h, tcp_impl.h:
+
+    * Moved stack-internal parts of tcp.h to tcp_impl.h, tcp.h now only contains
+      the actual application programmer's API
+  
+    * Separated timer implementation from sys.h/.c, moved to timers.h/.c;
+      Added timer implementation for NO_SYS==1, set NO_SYS_NO_TIMERS==1 if you
+      still want to use your own timer implementation for NO_SYS==0 (as before).
+
+  +++ sys layer:
+
+    * Converted mbox- and semaphore-functions to take pointers to sys_mbox_t/
+      sys_sem_t;
+
+    * Converted sys_mbox_new/sys_sem_new to take pointers and return err_t;
+
+    * Added Mutex concept in sys_arch (define LWIP_COMPAT_MUTEX to let sys.h use
+      binary semaphores instead of mutexes - as before)
+
+  +++ new options:
+
+     * Don't waste memory when chaining segments, added option TCP_OVERSIZE to
+       prevent creating many small pbufs when calling tcp_write with many small
+       blocks of data. Instead, pbufs are allocated larger than needed and the
+       space is used for later calls to tcp_write.
+
+     * Added LWIP_NETIF_TX_SINGLE_PBUF to always copy to try to create single pbufs
+       in tcp_write/udp_send.
+
+    * Added an additional option LWIP_ETHERNET to support ethernet without ARP
+      (necessary for pure PPPoE)
+
+    * Add MEMP_SEPARATE_POOLS to place memory pools in separate arrays. This may
+      be used to place these pools into user-defined memory by using external
+      declaration.
+
+    * Added TCP_SNDQUEUELOWAT corresponding to TCP_SNDLOWAT
+
+  +++ new pools:
+
+     * Netdb uses a memp pool for allocating memory when getaddrinfo() is called,
+       so MEMP_NUM_NETDB has to be set accordingly.
+
+     * DNS_LOCAL_HOSTLIST_IS_DYNAMIC uses a memp pool instead of the heap, so
+       MEMP_NUM_LOCALHOSTLIST has to be set accordingly.
+
+     * Snmp-agent uses a memp pools instead of the heap, so MEMP_NUM_SNMP_* have
+       to be set accordingly.
+
+     * PPPoE uses a MEMP pool instead of the heap, so MEMP_NUM_PPPOE_INTERFACES
+       has to be set accordingly
+
+  * Integrated loopif into netif.c - loopif does not have to be created by the
+    port any more, just define LWIP_HAVE_LOOPIF to 1.
+
+  * Added define LWIP_RAND() for lwip-wide randomization (needs to be defined
+    in cc.h, e.g. used by igmp)
+
+  * Added printf-formatter X8_F to printf u8_t as hex
+
+  * The heap now may be moved to user-defined memory by defining
+    LWIP_RAM_HEAP_POINTER as a void pointer to that memory's address
+
+  * added autoip_set_struct() and dhcp_set_struct() to let autoip and dhcp work
+    with user-allocated structs instead of calling mem_malloc
+
+  * Added const char* name to mem- and memp-stats for easier debugging.
+
+  * Calculate the TCP/UDP checksum while copying to only fetch data once:
+    Define LWIP_CHKSUM_COPY to a memcpy-like function that returns the checksum
+
+  * Added SO_REUSE_RXTOALL to pass received UDP broadcast/multicast packets to
+    more than one pcb.
+
+  * Changed the semantics of ARP_QUEUEING==0: ARP_QUEUEING now cannot be turned
+    off any more, if this is set to 0, only one packet (the most recent one) is
+    queued (like demanded by RFC 1122).
+
+  
+  ++ Major bugfixes/improvements
+
+  * Implemented tcp_shutdown() to only shut down one end of a connection
+  * Implemented shutdown() at socket- and netconn-level
+  * Added errorset support to select() + improved select speed overhead
+  * Merged pppd to v2.3.11 (including some backported bugfixes from 2.4.x)
+  * Added timer implementation for NO_SYS==1 (may be disabled with NO_SYS_NO_TIMERS==1
+  * Use macros defined in ip_addr.h to work with IP addresses
+  * Implemented many nonblocking socket/netconn functions
+  * Fixed ARP input processing: only add a new entry if a request was directed as us
+  * mem_realloc() to mem_trim() to prevent confusion with realloc()
+  * Some improvements for AutoIP (don't route/forward link-local addresses, don't break
+    existing connections when assigning a routable address)
+  * Correctly handle remote side overrunning our rcv_wnd in ooseq case
+  * Removed packing from ip_addr_t, the packed version is now only used in protocol headers
+  * Corrected PBUF_POOL_BUFSIZE for ports where ETH_PAD_SIZE &gt; 0
+  * Added support for static ARP table entries
+
+(STABLE-1.3.2)
+
+  * initial version of this file
+</pre> </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/zepif_8c.html b/doc/doxygen/output/html/zepif_8c.html
new file mode 100644
index 0000000..9a5a591
--- /dev/null
+++ b/doc/doxygen/output/html/zepif_8c.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/netif/zepif.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('zepif_8c.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</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">zepif.c File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="zepif_8h.html">netif/zepif.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="lowpan6_8h.html">netif/lowpan6.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 &lt;string.h&gt;</code><br />
+<code>#include &quot;arch/bpstruct.h&quot;</code><br />
+<code>#include &quot;arch/epstruct.h&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a8cae594e71cf385076f7bda166729dcd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zepif_8c.html#a8cae594e71cf385076f7bda166729dcd">ZEPIF_LOOPBACK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a8cae594e71cf385076f7bda166729dcd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gad61a6d9c1ab17e5b2c2c3eb9b42cc004"><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__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004">zepif_init</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gad61a6d9c1ab17e5b2c2c3eb9b42cc004"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a8cae594e71cf385076f7bda166729dcd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8cae594e71cf385076f7bda166729dcd">&#9670;&nbsp;</a></span>ZEPIF_LOOPBACK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ZEPIF_LOOPBACK&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Define this to 1 to loop back TX packets for testing </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_900e6f7ff90690cb8edb53323dd38d80.html">netif</a></li><li class="navelem"><a class="el" href="zepif_8c.html">zepif.c</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/zepif_8c.js b/doc/doxygen/output/html/zepif_8c.js
new file mode 100644
index 0000000..2d08c21
--- /dev/null
+++ b/doc/doxygen/output/html/zepif_8c.js
@@ -0,0 +1,5 @@
+var zepif_8c =
+[
+    [ "ZEPIF_LOOPBACK", "zepif_8c.html#a8cae594e71cf385076f7bda166729dcd", null ],
+    [ "zepif_init", "group__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/zepif_8h.html b/doc/doxygen/output/html/zepif_8h.html
new file mode 100644
index 0000000..d3ae9a6
--- /dev/null
+++ b/doc/doxygen/output/html/zepif_8h.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/netif/zepif.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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('zepif_8h.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<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">zepif.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="lowpan6_8h.html">netif/lowpan6.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 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="structzepif__init.html">zepif_init</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 name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gad61a6d9c1ab17e5b2c2c3eb9b42cc004"><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__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004">zepif_init</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gad61a6d9c1ab17e5b2c2c3eb9b42cc004"><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>A netif implementing the ZigBee Eencapsulation Protocol (ZEP). This is used to tunnel 6LowPAN over UDP. </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_c9a67764bf8a12cf6b427bb859cbcd0b.html">netif</a></li><li class="navelem"><a class="el" href="zepif_8h.html">zepif.h</a></li>
+    <li class="footer">Generated by
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/zepif_8h.js b/doc/doxygen/output/html/zepif_8h.js
new file mode 100644
index 0000000..420ffab
--- /dev/null
+++ b/doc/doxygen/output/html/zepif_8h.js
@@ -0,0 +1,5 @@
+var zepif_8h =
+[
+    [ "zepif_init", "structzepif__init.html", "structzepif__init" ],
+    [ "zepif_init", "group__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/zerocopyrx.html b/doc/doxygen/output/html/zerocopyrx.html
new file mode 100644
index 0000000..0060401
--- /dev/null
+++ b/doc/doxygen/output/html/zerocopyrx.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Zero-copy RX</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>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</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 style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">lwIP
+   &#160;<span id="projectnumber">2.1.2</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</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">
+$(document).ready(function(){initNavTree('zerocopyrx.html','');});
+</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">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">Zero-copy RX </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>The following code is an example for zero-copy RX ethernet driver: </p><div class="fragment"><div class="line"><span class="keyword">typedef</span> <span class="keyword">struct </span>my_custom_pbuf</div><div class="line">{</div><div class="line">   <span class="keyword">struct </span><a class="code" href="structpbuf__custom.html">pbuf_custom</a> p;</div><div class="line">   <span class="keywordtype">void</span>* dma_descriptor;</div><div class="line">} my_custom_pbuf_t;</div><div class="line"></div><div class="line"><a class="code" href="group__mempool.html#ga5b1fb3ce7942432d87cc948b1c5ed6cb">LWIP_MEMPOOL_DECLARE</a>(RX_POOL, 10, <span class="keyword">sizeof</span>(my_custom_pbuf_t), <span class="stringliteral">&quot;Zero-copy RX PBUF pool&quot;</span>);</div><div class="line"></div><div class="line"><span class="keywordtype">void</span> my_pbuf_free_custom(<span class="keywordtype">void</span>* p)</div><div class="line">{</div><div class="line">  <a class="code" href="group__sys__prot.html#ga945395fa326214fc9736487242710a90">SYS_ARCH_DECL_PROTECT</a>(old_level);</div><div class="line"></div><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">  invalidate_cpu_cache(p-&gt;payload, p-&gt;tot_len);</div><div class="line"></div><div class="line">  <a class="code" href="group__sys__prot.html#ga3d0e48feafd378e9c26c64567ecd8bab">SYS_ARCH_PROTECT</a>(old_level);</div><div class="line">  free_rx_dma_descriptor(my_pbuf-&gt;dma_descriptor);</div><div class="line">  <a class="code" href="group__mempool.html#gaa43d114dd702fbd8f1db18474ea93a04">LWIP_MEMPOOL_FREE</a>(RX_POOL, my_pbuf);</div><div class="line">  <a class="code" href="group__sys__prot.html#ga2f48e97047945642ddeb27e65bf4ffe2">SYS_ARCH_UNPROTECT</a>(old_level);</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keywordtype">void</span> eth_rx_irq()</div><div class="line">{</div><div class="line">  dma_descriptor*   dma_desc = get_RX_DMA_descriptor_from_ethernet();</div><div class="line">  my_custom_pbuf_t* my_pbuf  = (my_custom_pbuf_t*)<a class="code" href="group__mempool.html#ga5e2498f6c17746c1fe7153de5f7f275a">LWIP_MEMPOOL_ALLOC</a>(RX_POOL);</div><div class="line"></div><div class="line">  my_pbuf-&gt;p.custom_free_function = my_pbuf_free_custom;</div><div class="line">  my_pbuf-&gt;dma_descriptor         = dma_desc;</div><div class="line"></div><div class="line">  invalidate_cpu_cache(dma_desc-&gt;rx_data, dma_desc-&gt;rx_length);</div><div class="line">  </div><div class="line">  <span class="keyword">struct </span><a class="code" href="structpbuf.html">pbuf</a>* p = <a class="code" href="group__pbuf.html#ga90fa2bbf6ea4a263ee8f7b77c75683c2">pbuf_alloced_custom</a>(<a class="code" href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba">PBUF_RAW</a>,</div><div class="line">     dma_desc-&gt;rx_length,</div><div class="line">     <a class="code" href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac9b6ba960fdea6f2e8f35c8313b77e4e">PBUF_REF</a>,</div><div class="line">     &amp;my_pbuf-&gt;p,</div><div class="line">     dma_desc-&gt;rx_data,</div><div class="line">     dma_desc-&gt;max_buffer_size);</div><div class="line"></div><div class="line">  <span class="keywordflow">if</span>(<a class="code" href="structnetif.html">netif</a>-&gt;<a class="code" href="structnetif.html#a8fe4f1b7b0d710216287da9615164a5c">input</a>(p, <a class="code" href="structnetif.html">netif</a>) != <a class="code" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb">ERR_OK</a>) {</div><div class="line">    <a class="code" href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf_free</a>(p);</div><div class="line">  }</div><div class="line">}</div></div><!-- fragment --> </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="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/mdns.txt b/doc/mdns.txt
index c322843..0c28970 100644
--- a/doc/mdns.txt
+++ b/doc/mdns.txt
@@ -32,8 +32,8 @@
 The MDNS code puts its structs on the stack where suitable to reduce dynamic
 memory allocation. It may use up to 1kB of stack.
 
-MDNS needs a strncasecmp() implementation. If you have one, define
-LWIP_MDNS_STRNCASECMP to it. Otherwise the code will provide an implementation
+MDNS (like other apps) needs a strncasecmp() implementation. If you have one, define
+'lwip_strnicmp' to it. Otherwise the code will provide an implementation
 for you.
 
 
@@ -57,11 +57,11 @@
 MDNS allows UTF-8 names, but it is recommended to stay within ASCII,
 since the default case-insensitive comparison assumes this.
 
-It is recommended to call this function after an IPv4 address has been set,
-since there is currently no check if the v4 address is valid.
+Call mdns_resp_announce() every time the IP address on the netif has changed.
 
-Call mdns_resp_netif_settings_changed() every time the IP address
-on the netif has changed.
+Call mdns_resp_restart() every time the network interface comes up after being
+down, for example cable connected after being disconnected, administrative 
+interface comes up after being down, or the device wakes up from sleep.
 
 To stop responding on a netif, run
   mdns_resp_remove_netif(struct netif *netif)
@@ -108,6 +108,5 @@
 Relevant information will be sent as additional records to reduce number of
 requests required from a client.
 
-Removing services is currently not supported. Services are removed when the
-netif is removed.
-
+To remove a service from a netif, run
+  mdns_resp_del_service(struct netif *netif, s8_t slot)
\ No newline at end of file
diff --git a/doc/mqtt_client.txt b/doc/mqtt_client.txt
index 3e67def..7fd93a8 100644
--- a/doc/mqtt_client.txt
+++ b/doc/mqtt_client.txt
@@ -40,7 +40,7 @@
   
   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
+  /* For now just print the result code if something goes wrong */
   if(err != ERR_OK) {
     printf("mqtt_connect return %d\n", err);
   }
diff --git a/doc/rawapi.txt b/doc/rawapi.txt
deleted file mode 100644
index 0cdfdce..0000000
--- a/doc/rawapi.txt
+++ /dev/null
@@ -1,499 +0,0 @@
-Raw TCP/IP interface for lwIP
-
-Authors: Adam Dunkels, Leon Woestenberg, Christiaan Simons
-
-lwIP provides three Application Program's Interfaces (APIs) for programs
-to use for communication with the TCP/IP code:
-* low-level "core" / "callback" or "raw" API.
-* higher-level "sequential" API.
-* BSD-style socket API.
-
-The raw API (sometimes called native API) is an event-driven API designed
-to be used without an operating system that implements zero-copy send and
-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.
-
-The sequential API provides a way for ordinary, sequential, programs
-to use the lwIP stack. It is quite similar to the BSD socket API. The
-model of execution is based on the blocking open-read-write-close
-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).
-
-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.
-
-** Multithreading
-
-lwIP started targeting single-threaded environments. When adding multi-
-threading support, instead of making the core thread-safe, another
-approach was chosen: there is one main thread running the lwIP core
-(also known as the "tcpip_thread"). When running in a multithreaded
-environment, raw API functions MUST only be called from the core thread
-since raw API functions are not protected from concurrent access (aside
-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:
-      - api.h
-      - netbuf.h
-      - netdb.h
-      - netifapi.h
-      - pppapi.h
-      - sockets.h
-      - sys.h
-
-      Additionaly, memory (de-)allocation functions may be
-      called from multiple threads (not ISR!) with NO_SYS=0
-      since they are protected by 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 SYS_LIGHTWEIGHT_PROT is set to 1 and
-      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).
-
-
-** The remainder of this document discusses the "raw" API. **
-
-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
-code. The TCP/IP code and the application program both run in the same
-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 later 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.
-
---- Callbacks
-
-Program execution is driven by callbacks functions, which are then
-invoked by the lwIP core when activity related to that application
-occurs. A particular application may register to be notified via a
-callback function for events such as incoming data available, outgoing
-data sent, error notifications, poll timer expiration, connection
-closed, etc. An application can provide a callback function to perform
-processing for any or all of these events. Each callback is an ordinary
-C function that is called from within the TCP/IP code. Every callback
-function is passed the current TCP or UDP connection state as an
-argument. Also, in order to be able to keep program specific state,
-the callback functions are called with a program specified argument
-that is independent of the TCP/IP state.
-
-The function for setting the application connection state is:
-
-- void tcp_arg(struct tcp_pcb *pcb, void *arg)
-
-  Specifies the program specific state that should be passed to all
-  other callback functions. The "pcb" argument is the current TCP
-  connection control block, and the "arg" argument is the argument
-  that will be passed to the callbacks.
-
-  
---- TCP connection setup
-
-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
-tcp_new() function. This PCB can then be either set to listen for new
-incoming connections or be explicitly connected to another host.
-
-- struct tcp_pcb *tcp_new(void)
-
-  Creates a new connection identifier (PCB). If memory is not
-  available for creating the new pcb, NULL is returned.
-
-- err_t tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr,
-                 u16_t port)
-
-  Binds the pcb to a local IP address and port number. The IP address
-  can be specified as IP_ADDR_ANY in order to bind the connection to
-  all local IP addresses.
-
-  If another connection is bound to the same port, the function will
-  return ERR_USE, otherwise ERR_OK is returned.
-
-- struct tcp_pcb *tcp_listen(struct tcp_pcb *pcb)
-
-  Commands a pcb to start listening for incoming connections. When an
-  incoming connection is accepted, the function specified with the
-  tcp_accept() function will be called. The pcb will have 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
-  needed for a connection that is listening, so tcp_listen() will
-  reclaim the memory needed for the original connection and allocate a
-  new smaller memory block for the listening connection.
-
-  tcp_listen() may return NULL if no memory was available for the
-  listening connection. If so, the memory associated with the pcb
-  passed as an argument to tcp_listen() will not be deallocated.
-
-- struct tcp_pcb *tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)
-
-  Same as tcp_listen, but 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.
-
-- void tcp_accept(struct tcp_pcb *pcb,
-                  err_t (* accept)(void *arg, struct tcp_pcb *newpcb,
-                                   err_t err))
-
-  Specified the callback function that should be called when a new
-  connection arrives on a listening connection.
-
-- err_t tcp_connect(struct tcp_pcb *pcb, ip_addr_t *ipaddr,
-                    u16_t port, err_t (* connected)(void *arg,
-                                                    struct tcp_pcb *tpcb,
-                                                    err_t err));
-
-  Sets up the pcb to connect to the remote host and sends the
-  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
-  function specified as the fourth argument (the "connected" argument)
-  when the connection is established. If the connection could not be
-  properly established, either because the other host refused the
-  connection or because the other host didn't answer, the "err"
-  callback function of this pcb (registered with tcp_err, see below)
-  will be called.
-
-  The tcp_connect() function can return ERR_MEM if no memory is
-  available for enqueueing the SYN segment. If the SYN indeed was
-  enqueued successfully, the tcp_connect() function returns ERR_OK.
-
-
---- Sending TCP data
-
-TCP data is sent by enqueueing the data with a call to
-tcp_write(). When the data is successfully transmitted to the remote
-host, the application will be notified with a call to a specified
-callback function.
-
-- err_t tcp_write(struct tcp_pcb *pcb, const void *dataptr, u16_t len,
-                  u8_t apiflags)
-
-  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
-    for the data to be copied into. If this flag is not given, no new memory
-    should be allocated and the data should only be referenced by pointer. This
-    also means that the memory behind dataptr must not change until the data is
-    ACKed by the remote host
-  - TCP_WRITE_FLAG_MORE: indicates that more data follows. If this is omitted,
-    the PSH flag is set in the last segment created by this call to tcp_write.
-    If this flag is given, the PSH flag is not set.
-
-  The tcp_write() function will fail and return ERR_MEM if the length
-  of the data exceeds the current send buffer size or if the length of
-  the queue of outgoing segment is larger than the upper limit defined
-  in lwipopts.h. The number of bytes available in the output queue can
-  be retrieved with the tcp_sndbuf() function.
-
-  The proper way to use this function is to call the function with at
-  most tcp_sndbuf() bytes of data. If the function returns ERR_MEM,
-  the application should wait until some of the currently enqueued
-  data has been successfully received by the other host and try again.
-
-- void tcp_sent(struct tcp_pcb *pcb,
-                err_t (* sent)(void *arg, struct tcp_pcb *tpcb,
-                u16_t len))
-
-  Specifies the callback function that should be called when data has
-  successfully been received (i.e., acknowledged) by the remote
-  host. The len argument passed to the callback function gives the
-  amount bytes that was acknowledged by the last acknowledgment.
-
-  
---- Receiving TCP data
-
-TCP data reception is callback based - an application specified
-callback function is called when new data arrives. When the
-application has taken the data, it has to call the tcp_recved()
-function to indicate that TCP can advertise increase the receive
-window.
-
-- void tcp_recv(struct tcp_pcb *pcb,
-                err_t (* recv)(void *arg, struct tcp_pcb *tpcb,
-                               struct pbuf *p, err_t err))
-
-  Sets the callback function that will be called when new data
-  arrives. The callback function will be passed a NULL pbuf to
-  indicate that the remote host has closed the connection. If
-  there are no errors and the callback function is to return
-  ERR_OK, then it must free the pbuf. Otherwise, it must not
-  free the pbuf so that lwIP core code can store it.
-
-- void tcp_recved(struct tcp_pcb *pcb, u16_t len)
-
-  Must be called when the application has received the data. The len
-  argument indicates the length of the received data.
-
-
---- Application polling
-
-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
-timer for killing connections that have stayed idle for too long, or
-as a method of waiting for memory to become available. For instance,
-if a call to tcp_write() has failed because memory wasn't available,
-the application may use the polling functionality to call tcp_write()
-again when the connection has been idle for a while.
-
-- void tcp_poll(struct tcp_pcb *pcb, 
-                err_t (* poll)(void *arg, struct tcp_pcb *tpcb),
-                u8_t interval)
-
-  Specifies the polling interval and the callback function that should
-  be called to poll the application. The interval is specified in
-  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.
-
-
---- Closing and aborting connections
-
-- err_t tcp_close(struct tcp_pcb *pcb)
-
-  Closes the connection. 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
-  callback or the polling functionality. If the close succeeds, the
-  function returns ERR_OK.
-
-  The pcb is deallocated by the TCP code after a call to tcp_close(). 
-
-- void tcp_abort(struct tcp_pcb *pcb)
-
-  Aborts the connection by sending a RST (reset) segment to the remote
-  host. The pcb is deallocated. This function never fails.
-
-  ATTENTION: When calling this from one of the TCP callbacks, make
-  sure you always return ERR_ABRT (and never return ERR_ABRT otherwise
-  or you will risk accessing deallocated memory or memory leaks!
-
-
-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
-function to be called is set using the tcp_err() function.
-
-- void tcp_err(struct tcp_pcb *pcb, void (* err)(void *arg,
-       err_t err))
-
-  The error callback function does not get the pcb passed to it as a
-  parameter since the pcb may already have been deallocated.
-
-
---- UDP interface
-
-The UDP interface is similar to that of TCP, but due to the lower
-level of complexity of UDP, the interface is significantly simpler.
-
-- struct udp_pcb *udp_new(void)
-
-  Creates a new UDP pcb which can be used for UDP communication. The
-  pcb is not active until it has either been bound to a local address
-  or connected to a remote address.
-
-- void udp_remove(struct udp_pcb *pcb)
-
-  Removes and deallocates the pcb.  
-  
-- err_t udp_bind(struct udp_pcb *pcb, ip_addr_t *ipaddr,
-                 u16_t port)
-
-  Binds the pcb to a local address. The IP-address argument "ipaddr"
-  can be IP_ADDR_ANY to indicate that it should listen to any local IP
-  address. The function currently always return ERR_OK.
-
-- err_t udp_connect(struct udp_pcb *pcb, ip_addr_t *ipaddr,
-                    u16_t port)
-
-  Sets the remote end of the pcb. This function does not generate any
-  network traffic, but only set the remote address of the pcb.
-
-- err_t udp_disconnect(struct udp_pcb *pcb)
-
-  Remove the remote end of the pcb. This function does not generate
-  any network traffic, but only removes the remote address of the pcb.
-
-- err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)
-
-  Sends the pbuf p. The pbuf is not deallocated.
-
-- void udp_recv(struct udp_pcb *pcb,
-                void (* recv)(void *arg, struct udp_pcb *upcb,
-                                         struct pbuf *p,
-                                         ip_addr_t *addr,
-                                         u16_t port),
-                              void *recv_arg)
-
-  Specifies a callback function that should be called when a UDP
-  datagram is received.
-  
-
---- System initalization
-
-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).
-
-We can give you some idea on how to proceed when using the raw API.
-We assume a configuration using a single Ethernet netif and the
-UDP and TCP transport layers, IPv4 and the DHCP client.
-
-Call these functions in the order of appearance:
-
-- lwip_init()
-
-  Initialize the lwIP stack and all of its subsystems.
-
-- 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)
-
-  Adds your network interface to the netif_list. Allocate a struct
-  netif and pass a pointer to this structure as the first argument.
-  Give pointers to cleared ip_addr structures when using DHCP,
-  or fill them with sane numbers otherwise. The state pointer may be NULL.
-
-  The init function pointer must point to a initialization function for
-  your Ethernet netif interface. The following code illustrates its use.
-  
-  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];
-    }
-    init_my_eth_device();
-    return ERR_OK;
-  }
-  
-  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.
-
-- netif_set_link_up(struct netif *netif)
-
-  This is the hardware link state; e.g. whether cable is plugged for wired
-  Ethernet interface. This function must be called even if you don't know
-  the current state. Having link up and link down events is optional but
-  DHCP and IPv6 discover benefit well from those events.
-
-- netif_set_up(struct netif *netif)
-
-  This is the administrative (= software) state of the netif, when the
-  netif is fully configured this function must be called.
-
-- dhcp_start(struct netif *netif)
-
-  Creates a new DHCP client for this interface on the first call.
-  
-  You can peek in the netif->dhcp struct for the actual DHCP status.
-
-- sys_check_timeouts()
-
-  When the system is running, you have to periodically call
-  sys_check_timeouts() which will handle all timers for all protocols in
-  the stack; add this to your main loop or equivalent.
-
-
---- Optimalization hints
-
-The first thing you want to optimize is the lwip_standard_checksum()
-routine from src/core/inet.c. You can override this standard
-function with the #define LWIP_CHKSUM <your_checksum_routine>.
-
-There are C examples given in inet.c or you might want to
-craft an assembly function for this. RFC1071 is a good
-introduction to this subject.
-
-Other significant improvements can be made by supplying
-assembly or inline replacements for htons() and htonl()
-if you're using a little-endian architecture.
-#define lwip_htons(x) <your_htons>
-#define lwip_htonl(x) <your_htonl>
-If you #define them to htons() and htonl(), you should
-#define LWIP_DONT_PROVIDE_BYTEORDER_FUNCTIONS to prevent lwIP from
-defining hton*/ntoh* compatibility macros.
-
-Check your network interface driver if it reads at
-a higher speed than the maximum wire-speed. If the
-hardware isn't serviced frequently and fast enough
-buffer overflows are likely to occur.
-
-E.g. when using the cs8900 driver, call cs8900if_service(ethif)
-as frequently as possible. When using an RTOS let the cs8900 interrupt
-wake a high priority task that services your driver using a binary
-semaphore or event flag. Some drivers might allow additional tuning
-to match your application and network.
-
-For a production release it is recommended to set LWIP_STATS to 0.
-Note that speed performance isn't influenced much by simply setting
-high values to the memory options.
-
-For more optimization hints take a look at the lwIP wiki.
-
---- Zero-copy MACs
-
-To achieve zero-copy on transmit, the data passed to the raw API must
-remain unchanged until sent. Because the send- (or write-)functions return
-when the packets have been enqueued for sending, data must be kept stable
-after that, too.
-
-This implies that PBUF_RAM/PBUF_POOL pbufs passed to raw-API send functions
-must *not* be reused by the application unless their ref-count is 1.
-
-For no-copy pbufs (PBUF_ROM/PBUF_REF), data must be kept unchanged, too,
-but the stack/driver will/must copy PBUF_REF'ed data when enqueueing, while
-PBUF_ROM-pbufs are just enqueued (as ROM-data is expected to never change).
-
-Also, data passed to tcp_write without the copy-flag must not be changed!
-
-Therefore, be careful which type of PBUF you use and if you copy TCP data
-or not!
diff --git a/doc/savannah.txt b/doc/savannah.txt
index d7d19eb..a98418d 100644
--- a/doc/savannah.txt
+++ b/doc/savannah.txt
@@ -29,12 +29,12 @@
 The Savannah server uses SSH (Secure Shell) protocol 2 authentication and encryption.
 As such, Git commits to the server occur through a SSH tunnel for project members.
 To create a SSH2 key pair in UNIX-like environments, do this:
- ssh-keygen -t dsa
+ ssh-keygen
 
 Under Windows, a recommended SSH client is "PuTTY", freely available with good
 documentation and a graphic user interface. Use its key generator.
 
-Now paste the id_dsa.pub contents into your Savannah account public key list. Wait
+Now paste the id_rsa.pub contents into your Savannah account public key list. Wait
 a while so that Savannah can update its configuration (This can take minutes).
 
 Try to login using SSH:
diff --git a/doc/sys_arch.txt b/doc/sys_arch.txt
deleted file mode 100644
index 4dc727b..0000000
--- a/doc/sys_arch.txt
+++ /dev/null
@@ -1,303 +0,0 @@
-sys_arch interface for lwIP
-
-Author: Adam Dunkels
-        Simon Goldschmidt
-
-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.
-
-Semaphores can be either counting or binary - lwIP works with both
-kinds. 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. 
-
-Semaphores are represented by the type "sys_sem_t" which is typedef'd
-in the sys_arch.h file. Mailboxes are equivalently represented by the
-type "sys_mbox_t". Mutexes are represented by the type "sys_mutex_t".
-lwIP does not place any restrictions on how these types are represented
-internally.
-
-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).
-
-The following functions must be implemented by the sys_arch:
-
-- void sys_init(void)
-
-  Is called to initialize the sys_arch layer.
-
-- err_t sys_sem_new(sys_sem_t *sem, u8_t count)
-
-  Creates a new semaphore. The semaphore is allocated to the memory that 'sem'
-  points to (which can be both a pointer or the actual OS structure).
-  The "count" argument specifies the initial state of the semaphore (which is
-  either 0 or 1).
-  If the semaphore 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.
-
-- void sys_sem_free(sys_sem_t *sem)
-
-  Deallocates a semaphore.
-
-- void sys_sem_signal(sys_sem_t *sem)
-
-  Signals a semaphore.
-
-- u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
-
-  Blocks the thread while waiting for the semaphore to be
-  signaled. If the "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.
-
-  If the timeout argument is non-zero, the return value is the number of
-  milliseconds spent waiting for the semaphore to be signaled. If the
-  semaphore wasn't signaled within the specified time, the return value is
-  SYS_ARCH_TIMEOUT. If the thread didn't have to wait for the semaphore
-  (i.e., it was already signaled), the function may return zero.
-
-  Notice that lwIP implements a function with a similar name,
-  sys_sem_wait(), that uses the sys_arch_sem_wait() function.
-
-- int sys_sem_valid(sys_sem_t *sem)
-
-  Returns 1 if the semaphore is valid, 0 if it is not valid.
-  When using pointers, a simple way is to check the pointer for != NULL.
-  When directly using OS structures, implementing this may be more complex.
-  This may also be a define, in which case the function is not prototyped.
-
-- void sys_sem_set_invalid(sys_sem_t *sem)
-
-  Invalidate a semaphore so that sys_sem_valid() returns 0.
-  ATTENTION: This does NOT mean that the semaphore shall be deallocated:
-  sys_sem_free() is always called before calling this function!
-  This may also be a define, in which case the function is not prototyped.
-
-- void sys_mutex_new(sys_mutex_t *mutex)
-
-  Creates a new mutex. The mutex is allocated to the memory that 'mutex'
-  points to (which can be both a pointer or the actual OS structure).
-  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.
-
-- void sys_mutex_free(sys_mutex_t *mutex)
-
-  Deallocates a mutex.
-
-- void sys_mutex_lock(sys_mutex_t *mutex)
-  
-  Blocks the thread until the mutex can be grabbed.
-
-- void sys_mutex_unlock(sys_mutex_t *mutex)
-
-  Releases the mutex previously locked through 'sys_mutex_lock()'.
-
-- void sys_mutex_valid(sys_mutex_t *mutex)
-
-  Returns 1 if the mutes is valid, 0 if it is not valid.
-  When using pointers, a simple way is to check the pointer for != NULL.
-  When directly using OS structures, implementing this may be more complex.
-  This may also be a define, in which case the function is not prototyped.
-
-- void sys_mutex_set_invalid(sys_mutex_t *mutex)
-
-  Invalidate a mutex so that sys_mutex_valid() returns 0.
-  ATTENTION: This does NOT mean that the mutex shall be deallocated:
-  sys_mutex_free() is always called before calling this function!
-  This may also be a define, in which case the function is not prototyped.
-
-- err_t sys_mbox_new(sys_mbox_t *mbox, int size)
-
-  Creates an empty mailbox for maximum "size" elements. Elements stored
-  in mailboxes are pointers. You have to define macros "_MBOX_SIZE"
-  in your lwipopts.h, or ignore this parameter in your implementation
-  and use a default size.
-  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.
-
-- void sys_mbox_free(sys_mbox_t *mbox)
-
-  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.
-
-- void sys_mbox_post(sys_mbox_t *mbox, void *msg)
-
-  Posts the "msg" to the mailbox. This function have to block until
-  the "msg" is really posted.
-
-- err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
-
-  Try to post the "msg" to the mailbox. Returns ERR_MEM if this one
-  is full, else, ERR_OK if the "msg" is posted.
-
-- u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
-
-  Blocks the thread until a message arrives in the mailbox, but does
-  not block the thread longer than "timeout" milliseconds (similar to
-  the sys_arch_sem_wait() function). If "timeout" is 0, the thread should
-  be blocked until a message arrives. The "msg" argument is a result
-  parameter that is set by the function (i.e., by doing "*msg =
-  ptr"). The "msg" parameter maybe NULL to indicate that the message
-  should be dropped.
-
-  The return values are the same as for the sys_arch_sem_wait() function:
-  Number of milliseconds spent waiting or SYS_ARCH_TIMEOUT if there was a
-  timeout.
-
-  Note that a function with a similar name, sys_mbox_fetch(), is
-  implemented by lwIP. 
-
-- u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
-
-  This is similar to sys_arch_mbox_fetch, however if a message is not
-  present in the mailbox, it immediately returns with the code
-  SYS_MBOX_EMPTY. On success 0 is returned.
-
-  To allow for efficient implementations, this can be defined as a
-  function-like macro in sys_arch.h instead of a normal function. For
-  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.
-
-- int sys_mbox_valid(sys_mbox_t *mbox)
-
-  Returns 1 if the mailbox is valid, 0 if it is not valid.
-  When using pointers, a simple way is to check the pointer for != NULL.
-  When directly using OS structures, implementing this may be more complex.
-  This may also be a define, in which case the function is not prototyped.
-
-- void sys_mbox_set_invalid(sys_mbox_t *mbox)
-
-  Invalidate a mailbox so that sys_mbox_valid() returns 0.
-  ATTENTION: This does NOT mean that the mailbox shall be deallocated:
-  sys_mbox_free() is always called before calling this function!
-  This may also be a define, in which case the function is not prototyped.
-
-If threads are supported by the underlying operating system and if
-such functionality is needed in lwIP, the following function will have
-to be implemented as well:
-
-- sys_thread_t sys_thread_new(char *name, void (* thread)(void *arg), void *arg, int stacksize, int prio)
-
-  Starts a new thread named "name" with priority "prio" that will begin its
-  execution in the function "thread()". The "arg" argument will be passed as an
-  argument to the thread() function. The stack size to used for this thread is
-  the "stacksize" parameter. The id of the new thread is returned. Both the id
-  and the priority are system dependent.
-
-When lwIP is used from more than one context (e.g. from multiple threads OR from
-main-loop and from interrupts), the SYS_LIGHTWEIGHT_PROT protection SHOULD be enabled!
-
-- 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.
-
-- 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.
-
-For some configurations, you also need:
-
-- u32_t sys_now(void)
-
-  This optional function returns the current time in milliseconds (don't care
-  for wraparound, this is only used for time diffs).
-  Not implementing this function means you cannot use some modules (e.g. TCP
-  timestamps, internal timeouts for NO_SYS==1).
-
-
-Note:
-
-Be careful with using mem_malloc() in sys_arch. When malloc() refers to
-mem_malloc() you can run into a circular function call problem. In mem.c
-mem_init() tries to allcate a semaphore using mem_malloc, which of course
-can't be performed when sys_arch uses mem_malloc.
-
--------------------------------------------------------------------------------
-Additional files required for the "OS support" emulation layer:
--------------------------------------------------------------------------------
-
-cc.h       - Architecture environment, some compiler specific, some
-             environment specific (probably should move env stuff 
-             to sys_arch.h.)
-
-  Typedefs for the types used by lwip -
-    u8_t, s8_t, u16_t, s16_t, u32_t, s32_t, mem_ptr_t
-
-  Compiler hints for packing lwip's structures -
-    PACK_STRUCT_FIELD(x)
-    PACK_STRUCT_STRUCT
-    PACK_STRUCT_BEGIN
-    PACK_STRUCT_END
-
-  Platform specific diagnostic output -
-    LWIP_PLATFORM_DIAG(x)    - non-fatal, print a message.
-    LWIP_PLATFORM_ASSERT(x)  - fatal, print message and abandon execution.
-    Portability defines for printf formatters:
-    U16_F, S16_F, X16_F, U32_F, S32_F, X32_F, SZT_F
-
-  "lightweight" synchronization mechanisms -
-    SYS_ARCH_DECL_PROTECT(x) - declare a protection state variable.
-    SYS_ARCH_PROTECT(x)      - enter protection mode.
-    SYS_ARCH_UNPROTECT(x)    - leave protection mode.
-
-  If the compiler does not provide memset() this file must include a
-  definition of it, or include a file which defines it.
-
-  This file must either include a system-local <errno.h> which defines
-  the standard *nix error codes, or it should #define LWIP_PROVIDE_ERRNO
-  to make lwip/arch.h define the codes which are used throughout.
-
-
-perf.h     - Architecture specific performance measurement.
-  Measurement calls made throughout lwip, these can be defined to nothing.
-    PERF_START               - start measuring something.
-    PERF_STOP(x)             - stop measuring something, and record the result.
-
-sys_arch.h - Tied to sys_arch.c
-
-  Arch dependent types for the following objects:
-    sys_sem_t, sys_mbox_t, sys_thread_t,
-  And, optionally:
-    sys_prot_t
-
-  Defines to set vars of sys_mbox_t and sys_sem_t to NULL.
-    SYS_MBOX_NULL NULL
-    SYS_SEM_NULL NULL
diff --git a/src/Filelists.cmake b/src/Filelists.cmake
new file mode 100644
index 0000000..c765628
--- /dev/null
+++ b/src/Filelists.cmake
@@ -0,0 +1,279 @@
+# This file is indended to be included in end-user CMakeLists.txt
+# include(/path/to/Filelists.cmake)
+# It assumes the variable LWIP_DIR is defined pointing to the
+# root path of lwIP 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.
+
+set(LWIP_VERSION_MAJOR    "2")
+set(LWIP_VERSION_MINOR    "1")
+set(LWIP_VERSION_REVISION "2")
+# 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
+set(LWIP_VERSION_RC       "LWIP_RC_RELEASE")
+
+if ("${LWIP_VERSION_RC}" STREQUAL "LWIP_RC_RELEASE")
+    set(LWIP_VERSION_STRING
+        "${LWIP_VERSION_MAJOR}.${LWIP_VERSION_MINOR}.${LWIP_VERSION_REVISION}"
+    )
+elseif ("${LWIP_VERSION_RC}" STREQUAL "LWIP_RC_DEVELOPMENT")
+    set(LWIP_VERSION_STRING
+        "${LWIP_VERSION_MAJOR}.${LWIP_VERSION_MINOR}.${LWIP_VERSION_REVISION}.dev"
+    )
+else ("${LWIP_VERSION_RC}" STREQUAL "LWIP_RC_RELEASE")
+    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")
+
+# The minimum set of files needed for lwIP.
+set(lwipcore_SRCS
+    ${LWIP_DIR}/src/core/init.c
+    ${LWIP_DIR}/src/core/def.c
+    ${LWIP_DIR}/src/core/dns.c
+    ${LWIP_DIR}/src/core/inet_chksum.c
+    ${LWIP_DIR}/src/core/ip.c
+    ${LWIP_DIR}/src/core/mem.c
+    ${LWIP_DIR}/src/core/memp.c
+    ${LWIP_DIR}/src/core/netif.c
+    ${LWIP_DIR}/src/core/pbuf.c
+    ${LWIP_DIR}/src/core/raw.c
+    ${LWIP_DIR}/src/core/stats.c
+    ${LWIP_DIR}/src/core/sys.c
+    ${LWIP_DIR}/src/core/altcp.c
+    ${LWIP_DIR}/src/core/altcp_alloc.c
+    ${LWIP_DIR}/src/core/altcp_tcp.c
+    ${LWIP_DIR}/src/core/tcp.c
+    ${LWIP_DIR}/src/core/tcp_in.c
+    ${LWIP_DIR}/src/core/tcp_out.c
+    ${LWIP_DIR}/src/core/timeouts.c
+    ${LWIP_DIR}/src/core/udp.c
+)
+set(lwipcore4_SRCS
+    ${LWIP_DIR}/src/core/ipv4/autoip.c
+    ${LWIP_DIR}/src/core/ipv4/dhcp.c
+    ${LWIP_DIR}/src/core/ipv4/etharp.c
+    ${LWIP_DIR}/src/core/ipv4/icmp.c
+    ${LWIP_DIR}/src/core/ipv4/igmp.c
+    ${LWIP_DIR}/src/core/ipv4/ip4_frag.c
+    ${LWIP_DIR}/src/core/ipv4/ip4.c
+    ${LWIP_DIR}/src/core/ipv4/ip4_addr.c
+)
+set(lwipcore6_SRCS
+    ${LWIP_DIR}/src/core/ipv6/dhcp6.c
+    ${LWIP_DIR}/src/core/ipv6/ethip6.c
+    ${LWIP_DIR}/src/core/ipv6/icmp6.c
+    ${LWIP_DIR}/src/core/ipv6/inet6.c
+    ${LWIP_DIR}/src/core/ipv6/ip6.c
+    ${LWIP_DIR}/src/core/ipv6/ip6_addr.c
+    ${LWIP_DIR}/src/core/ipv6/ip6_frag.c
+    ${LWIP_DIR}/src/core/ipv6/mld6.c
+    ${LWIP_DIR}/src/core/ipv6/nd6.c
+)
+
+# APIFILES: The files which implement the sequential and socket APIs.
+set(lwipapi_SRCS
+    ${LWIP_DIR}/src/api/api_lib.c
+    ${LWIP_DIR}/src/api/api_msg.c
+    ${LWIP_DIR}/src/api/err.c
+    ${LWIP_DIR}/src/api/if_api.c
+    ${LWIP_DIR}/src/api/netbuf.c
+    ${LWIP_DIR}/src/api/netdb.c
+    ${LWIP_DIR}/src/api/netifapi.c
+    ${LWIP_DIR}/src/api/sockets.c
+    ${LWIP_DIR}/src/api/tcpip.c
+)
+
+# Files implementing various generic network interface functions
+set(lwipnetif_SRCS
+    ${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
+)
+
+# 6LoWPAN
+set(lwipsixlowpan_SRCS
+    ${LWIP_DIR}/src/netif/lowpan6_common.c
+    ${LWIP_DIR}/src/netif/lowpan6.c
+    ${LWIP_DIR}/src/netif/lowpan6_ble.c
+    ${LWIP_DIR}/src/netif/zepif.c
+)
+
+# PPP
+set(lwipppp_SRCS
+    ${LWIP_DIR}/src/netif/ppp/auth.c
+    ${LWIP_DIR}/src/netif/ppp/ccp.c
+    ${LWIP_DIR}/src/netif/ppp/chap-md5.c
+    ${LWIP_DIR}/src/netif/ppp/chap_ms.c
+    ${LWIP_DIR}/src/netif/ppp/chap-new.c
+    ${LWIP_DIR}/src/netif/ppp/demand.c
+    ${LWIP_DIR}/src/netif/ppp/eap.c
+    ${LWIP_DIR}/src/netif/ppp/ecp.c
+    ${LWIP_DIR}/src/netif/ppp/eui64.c
+    ${LWIP_DIR}/src/netif/ppp/fsm.c
+    ${LWIP_DIR}/src/netif/ppp/ipcp.c
+    ${LWIP_DIR}/src/netif/ppp/ipv6cp.c
+    ${LWIP_DIR}/src/netif/ppp/lcp.c
+    ${LWIP_DIR}/src/netif/ppp/magic.c
+    ${LWIP_DIR}/src/netif/ppp/mppe.c
+    ${LWIP_DIR}/src/netif/ppp/multilink.c
+    ${LWIP_DIR}/src/netif/ppp/ppp.c
+    ${LWIP_DIR}/src/netif/ppp/pppapi.c
+    ${LWIP_DIR}/src/netif/ppp/pppcrypt.c
+    ${LWIP_DIR}/src/netif/ppp/pppoe.c
+    ${LWIP_DIR}/src/netif/ppp/pppol2tp.c
+    ${LWIP_DIR}/src/netif/ppp/pppos.c
+    ${LWIP_DIR}/src/netif/ppp/upap.c
+    ${LWIP_DIR}/src/netif/ppp/utils.c
+    ${LWIP_DIR}/src/netif/ppp/vj.c
+    ${LWIP_DIR}/src/netif/ppp/polarssl/arc4.c
+    ${LWIP_DIR}/src/netif/ppp/polarssl/des.c
+    ${LWIP_DIR}/src/netif/ppp/polarssl/md4.c
+    ${LWIP_DIR}/src/netif/ppp/polarssl/md5.c
+    ${LWIP_DIR}/src/netif/ppp/polarssl/sha1.c
+)
+
+# SNMPv3 agent
+set(lwipsnmp_SRCS
+    ${LWIP_DIR}/src/apps/snmp/snmp_asn1.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_core.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_mib2.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_mib2_icmp.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_mib2_interfaces.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_mib2_ip.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_mib2_snmp.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_mib2_system.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_mib2_tcp.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_mib2_udp.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_snmpv2_framework.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_snmpv2_usm.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_msg.c
+    ${LWIP_DIR}/src/apps/snmp/snmpv3.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_netconn.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_pbuf_stream.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_raw.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_scalar.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_table.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_threadsync.c
+    ${LWIP_DIR}/src/apps/snmp/snmp_traps.c
+)
+
+# HTTP server + client
+set(lwiphttp_SRCS
+    ${LWIP_DIR}/src/apps/http/altcp_proxyconnect.c
+    ${LWIP_DIR}/src/apps/http/fs.c
+    ${LWIP_DIR}/src/apps/http/http_client.c
+    ${LWIP_DIR}/src/apps/http/httpd.c
+)
+
+# MAKEFSDATA HTTP server host utility
+set(lwipmakefsdata_SRCS
+    ${LWIP_DIR}/src/apps/http/makefsdata/makefsdata.c
+)
+
+# IPERF server
+set(lwipiperf_SRCS
+    ${LWIP_DIR}/src/apps/lwiperf/lwiperf.c
+)
+
+# SMTP client
+set(lwipsmtp_SRCS
+    ${LWIP_DIR}/src/apps/smtp/smtp.c
+)
+
+# SNTP client
+set(lwipsntp_SRCS
+    ${LWIP_DIR}/src/apps/sntp/sntp.c
+)
+
+# MDNS responder
+set(lwipmdns_SRCS
+    ${LWIP_DIR}/src/apps/mdns/mdns.c
+)
+
+# NetBIOS name server
+set(lwipnetbios_SRCS
+    ${LWIP_DIR}/src/apps/netbiosns/netbiosns.c
+)
+
+# TFTP server files
+set(lwiptftp_SRCS
+    ${LWIP_DIR}/src/apps/tftp/tftp_server.c
+)
+
+# MQTT client files
+set(lwipmqtt_SRCS
+    ${LWIP_DIR}/src/apps/mqtt/mqtt.c
+)
+
+# ARM MBEDTLS related files of lwIP rep
+set(lwipmbedtls_SRCS
+    ${LWIP_DIR}/src/apps/altcp_tls/altcp_tls_mbedtls.c
+    ${LWIP_DIR}/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c
+    ${LWIP_DIR}/src/apps/snmp/snmpv3_mbedtls.c
+)
+
+# All LWIP files without apps
+set(lwipnoapps_SRCS
+    ${lwipcore_SRCS}
+    ${lwipcore4_SRCS}
+    ${lwipcore6_SRCS}
+    ${lwipapi_SRCS}
+    ${lwipnetif_SRCS}
+    ${lwipsixlowpan_SRCS}
+    ${lwipppp_SRCS}
+)
+
+# LWIPAPPFILES: All LWIP APPs
+set(lwipallapps_SRCS
+    ${lwipsnmp_SRCS}
+    ${lwiphttp_SRCS}
+    ${lwipiperf_SRCS}
+    ${lwipsmtp_SRCS}
+    ${lwipsntp_SRCS}
+    ${lwipmdns_SRCS}
+    ${lwipnetbios_SRCS}
+    ${lwiptftp_SRCS}
+    ${lwipmqtt_SRCS}
+    ${lwipmbedtls_SRCS}
+)
+
+# Generate lwip/init.h (version info)
+configure_file(${LWIP_DIR}/src/include/lwip/init.h.cmake.in ${LWIP_DIR}/src/include/lwip/init.h)
+
+# Documentation
+set(DOXYGEN_DIR ${LWIP_DIR}/doc/doxygen)
+set(DOXYGEN_OUTPUT_DIR output)
+set(DOXYGEN_IN  ${LWIP_DIR}/doc/doxygen/lwip.Doxyfile.cmake.in)
+set(DOXYGEN_OUT ${LWIP_DIR}/doc/doxygen/lwip.Doxyfile)
+configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT})
+
+find_package(Doxygen)
+if (DOXYGEN_FOUND)
+    message("Doxygen build started")
+
+    add_custom_target(lwipdocs
+        COMMAND ${CMAKE_COMMAND} -E remove_directory ${DOXYGEN_DIR}/${DOXYGEN_OUTPUT_DIR}/html
+        COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
+        WORKING_DIRECTORY ${DOXYGEN_DIR}
+        COMMENT "Generating API documentation with Doxygen"
+        VERBATIM)
+else (DOXYGEN_FOUND)
+    message("Doxygen needs to be installed to generate the doxygen documentation")
+endif (DOXYGEN_FOUND)
+
+# lwIP libraries
+add_library(lwipcore EXCLUDE_FROM_ALL ${lwipnoapps_SRCS})
+target_compile_options(lwipcore PRIVATE ${LWIP_COMPILER_FLAGS})
+target_compile_definitions(lwipcore PRIVATE ${LWIP_DEFINITIONS}  ${LWIP_MBEDTLS_DEFINITIONS})
+target_include_directories(lwipcore PRIVATE ${LWIP_INCLUDE_DIRS} ${LWIP_MBEDTLS_INCLUDE_DIRS})
+
+add_library(lwipallapps EXCLUDE_FROM_ALL ${lwipallapps_SRCS})
+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})
diff --git a/src/Filelists.mk b/src/Filelists.mk
index 7d30bb8..828b9f2 100644
--- a/src/Filelists.mk
+++ b/src/Filelists.mk
@@ -42,6 +42,9 @@
 	$(LWIPDIR)/core/raw.c \
 	$(LWIPDIR)/core/stats.c \
 	$(LWIPDIR)/core/sys.c \
+	$(LWIPDIR)/core/altcp.c \
+	$(LWIPDIR)/core/altcp_alloc.c \
+	$(LWIPDIR)/core/altcp_tcp.c \
 	$(LWIPDIR)/core/tcp.c \
 	$(LWIPDIR)/core/tcp_in.c \
 	$(LWIPDIR)/core/tcp_out.c \
@@ -71,6 +74,7 @@
 APIFILES=$(LWIPDIR)/api/api_lib.c \
 	$(LWIPDIR)/api/api_msg.c \
 	$(LWIPDIR)/api/err.c \
+	$(LWIPDIR)/api/if_api.c \
 	$(LWIPDIR)/api/netbuf.c \
 	$(LWIPDIR)/api/netdb.c \
 	$(LWIPDIR)/api/netifapi.c \
@@ -79,10 +83,15 @@
 
 # NETIFFILES: Files implementing various generic network interface functions
 NETIFFILES=$(LWIPDIR)/netif/ethernet.c \
+	$(LWIPDIR)/netif/bridgeif.c \
+	$(LWIPDIR)/netif/bridgeif_fdb.c \
 	$(LWIPDIR)/netif/slipif.c
 
 # SIXLOWPAN: 6LoWPAN
-SIXLOWPAN=$(LWIPDIR)/netif/lowpan6.c \
+SIXLOWPAN=$(LWIPDIR)/netif/lowpan6_common.c \
+        $(LWIPDIR)/netif/lowpan6.c \
+	$(LWIPDIR)/netif/lowpan6_ble.c \
+	$(LWIPDIR)/netif/zepif.c
 
 # PPPFILES: PPP
 PPPFILES=$(LWIPDIR)/netif/ppp/auth.c \
@@ -136,6 +145,8 @@
 	$(LWIPDIR)/apps/snmp/snmp_mib2_system.c \
 	$(LWIPDIR)/apps/snmp/snmp_mib2_tcp.c \
 	$(LWIPDIR)/apps/snmp/snmp_mib2_udp.c \
+	$(LWIPDIR)/apps/snmp/snmp_snmpv2_framework.c \
+	$(LWIPDIR)/apps/snmp/snmp_snmpv2_usm.c \
 	$(LWIPDIR)/apps/snmp/snmp_msg.c \
 	$(LWIPDIR)/apps/snmp/snmpv3.c \
 	$(LWIPDIR)/apps/snmp/snmp_netconn.c \
@@ -144,17 +155,23 @@
 	$(LWIPDIR)/apps/snmp/snmp_scalar.c \
 	$(LWIPDIR)/apps/snmp/snmp_table.c \
 	$(LWIPDIR)/apps/snmp/snmp_threadsync.c \
-	$(LWIPDIR)/apps/snmp/snmp_traps.c \
-	$(LWIPDIR)/apps/snmp/snmpv3_mbedtls.c \
-	$(LWIPDIR)/apps/snmp/snmpv3_dummy.c
+	$(LWIPDIR)/apps/snmp/snmp_traps.c
 
-# HTTPDFILES: HTTP server
-HTTPDFILES=$(LWIPDIR)/apps/httpd/fs.c \
-	$(LWIPDIR)/apps/httpd/httpd.c
+# HTTPFILES: HTTP server + client
+HTTPFILES=$(LWIPDIR)/apps/http/altcp_proxyconnect.c \
+	$(LWIPDIR)/apps/http/fs.c \
+	$(LWIPDIR)/apps/http/http_client.c \
+	$(LWIPDIR)/apps/http/httpd.c
+
+# MAKEFSDATA: MAKEFSDATA HTTP server host utility
+MAKEFSDATAFILES=$(LWIPDIR)/apps/http/makefsdata/makefsdata.c
 
 # LWIPERFFILES: IPERF server
 LWIPERFFILES=$(LWIPDIR)/apps/lwiperf/lwiperf.c
 
+# SMTPFILES: SMTP client
+SMTPFILES=$(LWIPDIR)/apps/smtp/smtp.c
+
 # SNTPFILES: SNTP client
 SNTPFILES=$(LWIPDIR)/apps/sntp/sntp.c
 
@@ -170,12 +187,19 @@
 # MQTTFILES: MQTT client files
 MQTTFILES=$(LWIPDIR)/apps/mqtt/mqtt.c
 
+# MBEDTLS_FILES: MBEDTLS related files of lwIP rep
+MBEDTLS_FILES=$(LWIPDIR)/apps/altcp_tls/altcp_tls_mbedtls.c \
+	$(LWIPDIR)/apps/altcp_tls/altcp_tls_mbedtls_mem.c \
+	$(LWIPDIR)/apps/snmp/snmpv3_mbedtls.c
+
 # LWIPAPPFILES: All LWIP APPs
 LWIPAPPFILES=$(SNMPFILES) \
-	$(HTTPDFILES) \
+	$(HTTPFILES) \
 	$(LWIPERFFILES) \
+	$(SMTPFILES) \
 	$(SNTPFILES) \
 	$(MDNSFILES) \
 	$(NETBIOSNSFILES) \
 	$(TFTPFILES) \
-	$(MQTTFILES)
+	$(MQTTFILES) \
+	$(MBEDTLS_FILES)
diff --git a/src/api/api_lib.c b/src/api/api_lib.c
index 3c1d6a6..e03b8b7 100644
--- a/src/api/api_lib.c
+++ b/src/api/api_lib.c
@@ -1,21 +1,21 @@
 /**
  * @file
  * Sequential API External module
- * 
+ *
  * @defgroup netconn Netconn API
  * @ingroup sequential_api
  * Thread-safe, to be called from non-TCPIP threads only.
  * TX/RX handling based on @ref netbuf (containing @ref pbuf)
  * to avoid copying data around.
- * 
+ *
  * @defgroup netconn_common Common functions
  * @ingroup netconn
  * For use with TCP and UDP
- * 
+ *
  * @defgroup netconn_tcp TCP only
  * @ingroup netconn
  * TCP only functions
- * 
+ *
  * @defgroup netconn_udp UDP only
  * @ingroup netconn
  * UDP only functions
@@ -69,6 +69,10 @@
 #include "lwip/priv/tcp_priv.h"
 #include "lwip/priv/tcpip_priv.h"
 
+#ifdef LWIP_HOOK_FILENAME
+#include LWIP_HOOK_FILENAME
+#endif
+
 #include <string.h>
 
 #define API_MSG_VAR_REF(name)               API_VAR_REF(name)
@@ -77,6 +81,28 @@
 #define API_MSG_VAR_ALLOC_RETURN_NULL(name) API_VAR_ALLOC(struct api_msg, MEMP_API_MSG, name, NULL)
 #define API_MSG_VAR_FREE(name)              API_VAR_FREE(MEMP_API_MSG, name)
 
+#if TCP_LISTEN_BACKLOG
+/* need to allocate API message for accept so empty message pool does not result in event loss
+ * see bug #47512: MPU_COMPATIBLE may fail on empty pool */
+#define API_MSG_VAR_ALLOC_ACCEPT(msg) API_MSG_VAR_ALLOC(msg)
+#define API_MSG_VAR_FREE_ACCEPT(msg) API_MSG_VAR_FREE(msg)
+#else /* TCP_LISTEN_BACKLOG */
+#define API_MSG_VAR_ALLOC_ACCEPT(msg)
+#define API_MSG_VAR_FREE_ACCEPT(msg)
+#endif /* TCP_LISTEN_BACKLOG */
+
+#if LWIP_NETCONN_FULLDUPLEX
+#define NETCONN_RECVMBOX_WAITABLE(conn) (sys_mbox_valid(&(conn)->recvmbox) && (((conn)->flags & NETCONN_FLAG_MBOXINVALID) == 0))
+#define NETCONN_ACCEPTMBOX_WAITABLE(conn) (sys_mbox_valid(&(conn)->acceptmbox) && (((conn)->flags & (NETCONN_FLAG_MBOXCLOSED|NETCONN_FLAG_MBOXINVALID)) == 0))
+#define NETCONN_MBOX_WAITING_INC(conn) SYS_ARCH_INC(conn->mbox_threads_waiting, 1)
+#define NETCONN_MBOX_WAITING_DEC(conn) SYS_ARCH_DEC(conn->mbox_threads_waiting, 1)
+#else /* LWIP_NETCONN_FULLDUPLEX */
+#define NETCONN_RECVMBOX_WAITABLE(conn)   sys_mbox_valid(&(conn)->recvmbox)
+#define NETCONN_ACCEPTMBOX_WAITABLE(conn) (sys_mbox_valid(&(conn)->acceptmbox) && (((conn)->flags & NETCONN_FLAG_MBOXCLOSED) == 0))
+#define NETCONN_MBOX_WAITING_INC(conn)
+#define NETCONN_MBOX_WAITING_DEC(conn)
+#endif /* LWIP_NETCONN_FULLDUPLEX */
+
 static err_t netconn_close_shutdown(struct netconn *conn, u8_t how);
 
 /**
@@ -119,7 +145,7 @@
  * @return a newly allocated struct netconn or
  *         NULL on memory error
  */
-struct netconn*
+struct netconn *
 netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback)
 {
   struct netconn *conn;
@@ -155,7 +181,7 @@
 
 /**
  * @ingroup netconn_common
- * Close a netconn 'connection' and free its resources.
+ * Close a netconn 'connection' and free all its resources but not the netconn itself.
  * UDP and RAW connection are completely closed, TCP pcbs might still be in a waitstate
  * after this returns.
  *
@@ -163,7 +189,7 @@
  * @return ERR_OK if the connection was deleted
  */
 err_t
-netconn_delete(struct netconn *conn)
+netconn_prepare_delete(struct netconn *conn)
 {
   err_t err;
   API_MSG_VAR_DECLARE(msg);
@@ -191,13 +217,44 @@
   if (err != ERR_OK) {
     return err;
   }
-
-  netconn_free(conn);
-
   return ERR_OK;
 }
 
 /**
+ * @ingroup netconn_common
+ * Close a netconn 'connection' and free its resources.
+ * UDP and RAW connection are completely closed, TCP pcbs might still be in a waitstate
+ * after this returns.
+ *
+ * @param conn the netconn to delete
+ * @return ERR_OK if the connection was deleted
+ */
+err_t
+netconn_delete(struct netconn *conn)
+{
+  err_t err;
+
+  /* No ASSERT here because possible to get a (conn == NULL) if we got an accept error */
+  if (conn == NULL) {
+    return ERR_OK;
+  }
+
+#if LWIP_NETCONN_FULLDUPLEX
+  if (conn->flags & NETCONN_FLAG_MBOXINVALID) {
+    /* Already called netconn_prepare_delete() before */
+    err = ERR_OK;
+  } else
+#endif /* LWIP_NETCONN_FULLDUPLEX */
+  {
+    err = netconn_prepare_delete(conn);
+  }
+  if (err == ERR_OK) {
+    netconn_free(conn);
+  }
+  return err;
+}
+
+/**
  * Get the local or remote IP address and port of a netconn.
  * For RAW netconns, this returns the protocol instead of a port!
  *
@@ -241,7 +298,7 @@
  * Binding one netconn twice might not always be checked correctly!
  *
  * @param conn the netconn to bind
- * @param addr the local IP address to bind the netconn to 
+ * @param addr the local IP address to bind the netconn to
  *             (use IP4_ADDR_ANY/IP6_ADDR_ANY to bind to all addresses)
  * @param port the local port to bind the netconn to (not used for RAW)
  * @return ERR_OK if bound, any other err_t on failure
@@ -251,7 +308,7 @@
 {
   API_MSG_VAR_DECLARE(msg);
   err_t err;
-  
+
   LWIP_ERROR("netconn_bind: invalid conn", (conn != NULL), return ERR_ARG;);
 
 #if LWIP_IPV4
@@ -260,13 +317,13 @@
     addr = IP4_ADDR_ANY;
   }
 #endif /* LWIP_IPV4 */
-  
+
 #if LWIP_IPV4 && LWIP_IPV6
   /* "Socket API like" dual-stack support: If IP to bind to is IP6_ADDR_ANY,
    * 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_cmp(addr, IP6_ADDR_ANY)) {
     addr = IP_ANY_TYPE;
   }
 #endif /* LWIP_IPV4 && LWIP_IPV6 */
@@ -283,6 +340,32 @@
 
 /**
  * @ingroup netconn_common
+ * Bind a netconn to a specific interface and port.
+ * Binding one netconn twice might not always be checked correctly!
+ *
+ * @param conn the netconn to bind
+ * @param if_idx the local interface index to bind the netconn to
+ * @return ERR_OK if bound, any other err_t on failure
+ */
+err_t
+netconn_bind_if(struct netconn *conn, u8_t if_idx)
+{
+  API_MSG_VAR_DECLARE(msg);
+  err_t err;
+
+  LWIP_ERROR("netconn_bind_if: invalid conn", (conn != NULL), return ERR_ARG;);
+
+  API_MSG_VAR_ALLOC(msg);
+  API_MSG_VAR_REF(msg).conn = conn;
+  API_MSG_VAR_REF(msg).msg.bc.if_idx = if_idx;
+  err = netconn_apimsg(lwip_netconn_do_bind_if, &API_MSG_VAR_REF(msg));
+  API_MSG_VAR_FREE(msg);
+
+  return err;
+}
+
+/**
+ * @ingroup netconn_common
  * Connect a netconn to a specific remote IP address and port.
  *
  * @param conn the netconn to connect
@@ -388,6 +471,7 @@
 netconn_accept(struct netconn *conn, struct netconn **new_conn)
 {
 #if LWIP_TCP
+  err_t err;
   void *accept_ptr;
   struct netconn *newconn;
 #if TCP_LISTEN_BACKLOG
@@ -398,52 +482,65 @@
   *new_conn = NULL;
   LWIP_ERROR("netconn_accept: invalid conn",       (conn != NULL),                      return ERR_ARG;);
 
-  if (ERR_IS_FATAL(conn->last_err)) {
-    /* don't recv on fatal errors: this might block the application task
-       waiting on acceptmbox forever! */
-    return conn->last_err;
+  /* NOTE: Although the opengroup spec says a pending error shall be returned to
+           send/recv/getsockopt(SO_ERROR) only, we return it for listening
+           connections also, to handle embedded-system errors */
+  err = netconn_err(conn);
+  if (err != ERR_OK) {
+    /* return pending error */
+    return err;
   }
-  if (!sys_mbox_valid(&conn->acceptmbox)) {
+  if (!NETCONN_ACCEPTMBOX_WAITABLE(conn)) {
+    /* don't accept if closed: this might block the application task
+       waiting on acceptmbox forever! */
     return ERR_CLSD;
   }
 
-#if TCP_LISTEN_BACKLOG
-  API_MSG_VAR_ALLOC(msg);
-#endif /* TCP_LISTEN_BACKLOG */
+  API_MSG_VAR_ALLOC_ACCEPT(msg);
 
+  NETCONN_MBOX_WAITING_INC(conn);
+  if (netconn_is_nonblocking(conn)) {
+    if (sys_arch_mbox_tryfetch(&conn->acceptmbox, &accept_ptr) == SYS_ARCH_TIMEOUT) {
+      API_MSG_VAR_FREE_ACCEPT(msg);
+      NETCONN_MBOX_WAITING_DEC(conn);
+      return ERR_WOULDBLOCK;
+    }
+  } else {
 #if LWIP_SO_RCVTIMEO
-  if (sys_arch_mbox_fetch(&conn->acceptmbox, &accept_ptr, conn->recv_timeout) == SYS_ARCH_TIMEOUT) {
-#if TCP_LISTEN_BACKLOG
-    API_MSG_VAR_FREE(msg);
-#endif /* TCP_LISTEN_BACKLOG */
-    return ERR_TIMEOUT;
-  }
+    if (sys_arch_mbox_fetch(&conn->acceptmbox, &accept_ptr, conn->recv_timeout) == SYS_ARCH_TIMEOUT) {
+      API_MSG_VAR_FREE_ACCEPT(msg);
+      NETCONN_MBOX_WAITING_DEC(conn);
+      return ERR_TIMEOUT;
+    }
 #else
-  sys_arch_mbox_fetch(&conn->acceptmbox, &accept_ptr, 0);
+    sys_arch_mbox_fetch(&conn->acceptmbox, &accept_ptr, 0);
 #endif /* LWIP_SO_RCVTIMEO*/
-  newconn = (struct netconn *)accept_ptr;
+  }
+  NETCONN_MBOX_WAITING_DEC(conn);
+#if LWIP_NETCONN_FULLDUPLEX
+  if (conn->flags & NETCONN_FLAG_MBOXINVALID) {
+    if (lwip_netconn_is_deallocated_msg(accept_ptr)) {
+      /* the netconn has been closed from another thread */
+      API_MSG_VAR_FREE_ACCEPT(msg);
+      return ERR_CONN;
+    }
+  }
+#endif
+
   /* Register event with callback */
   API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);
 
-  if (accept_ptr == &netconn_aborted) {
-    /* a connection has been aborted: out of pcbs or out of netconns during accept */
-    /* @todo: set netconn error, but this would be fatal and thus block further accepts */
-#if TCP_LISTEN_BACKLOG
-    API_MSG_VAR_FREE(msg);
-#endif /* TCP_LISTEN_BACKLOG */
-    return ERR_ABRT;
+  if (lwip_netconn_is_err_msg(accept_ptr, &err)) {
+    /* a connection has been aborted: e.g. out of pcbs or out of netconns during accept */
+    API_MSG_VAR_FREE_ACCEPT(msg);
+    return err;
   }
-  if (newconn == NULL) {
+  if (accept_ptr == NULL) {
     /* connection has been aborted */
-    /* in this special case, we set the netconn error from application thread, as
-       on a ready-to-accept listening netconn, there should not be anything running
-       in tcpip_thread */
-    NETCONN_SET_SAFE_ERR(conn, ERR_CLSD);
-#if TCP_LISTEN_BACKLOG
-    API_MSG_VAR_FREE(msg);
-#endif /* TCP_LISTEN_BACKLOG */
+    API_MSG_VAR_FREE_ACCEPT(msg);
     return ERR_CLSD;
   }
+  newconn = (struct netconn *)accept_ptr;
 #if TCP_LISTEN_BACKLOG
   /* Let the stack know that we have accepted the connection. */
   API_MSG_VAR_REF(msg).conn = newconn;
@@ -465,103 +562,89 @@
 /**
  * @ingroup netconn_common
  * Receive data: actual implementation that doesn't care whether pbuf or netbuf
- * is received
+ * is received (this is internal, it's just here for describing common errors)
  *
  * @param conn the netconn from which to receive data
  * @param new_buf pointer where a new pbuf/netbuf is stored when received data
+ * @param apiflags flags that control function behaviour. For now only:
+ * - NETCONN_DONTBLOCK: only read data that is available now, don't wait for more data
  * @return ERR_OK if data has been received, an error code otherwise (timeout,
  *                memory error or another error)
+ *         ERR_CONN if not connected
+ *         ERR_CLSD if TCP connection has been closed
+ *         ERR_WOULDBLOCK if the netconn is nonblocking but would block to wait for data
+ *         ERR_TIMEOUT if the netconn has a receive timeout and no data was received
  */
 static err_t
-netconn_recv_data(struct netconn *conn, void **new_buf)
+netconn_recv_data(struct netconn *conn, void **new_buf, u8_t apiflags)
 {
   void *buf = NULL;
   u16_t len;
-#if LWIP_TCP
-  API_MSG_VAR_DECLARE(msg);
-#if LWIP_MPU_COMPATIBLE
-  msg = NULL;
-#endif
-#endif /* LWIP_TCP */
 
   LWIP_ERROR("netconn_recv: invalid pointer", (new_buf != NULL), return ERR_ARG;);
   *new_buf = NULL;
   LWIP_ERROR("netconn_recv: invalid conn",    (conn != NULL),    return ERR_ARG;);
-#if LWIP_TCP
-#if (LWIP_UDP || LWIP_RAW)
-  if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)
-#endif /* (LWIP_UDP || LWIP_RAW) */
-  {
-    if (!sys_mbox_valid(&conn->recvmbox)) {
-      /* This happens when calling this function after receiving FIN */
-      return sys_mbox_valid(&conn->acceptmbox) ? ERR_CONN : ERR_CLSD;
+
+  if (!NETCONN_RECVMBOX_WAITABLE(conn)) {
+    err_t err = netconn_err(conn);
+    if (err != ERR_OK) {
+      /* return pending error */
+      return err;
     }
+    return ERR_CONN;
   }
-#endif /* LWIP_TCP */
-  LWIP_ERROR("netconn_recv: invalid recvmbox", sys_mbox_valid(&conn->recvmbox), return ERR_CONN;);
 
-  if (ERR_IS_FATAL(conn->last_err)) {
-    /* don't recv on fatal errors: this might block the application task
-       waiting on recvmbox forever! */
-    /* @todo: this does not allow us to fetch data that has been put into recvmbox
-       before the fatal error occurred - is that a problem? */
-    return conn->last_err;
-  }
-#if LWIP_TCP
-#if (LWIP_UDP || LWIP_RAW)
-  if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)
-#endif /* (LWIP_UDP || LWIP_RAW) */
-  {
-    API_MSG_VAR_ALLOC(msg);
-  }
-#endif /* LWIP_TCP */
-
-#if LWIP_SO_RCVTIMEO
-  if (sys_arch_mbox_fetch(&conn->recvmbox, &buf, conn->recv_timeout) == SYS_ARCH_TIMEOUT) {
-#if LWIP_TCP
-#if (LWIP_UDP || LWIP_RAW)
-    if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)
-#endif /* (LWIP_UDP || LWIP_RAW) */
-    {
-      API_MSG_VAR_FREE(msg);
-    }
-#endif /* LWIP_TCP */
-    return ERR_TIMEOUT;
-  }
-#else
-  sys_arch_mbox_fetch(&conn->recvmbox, &buf, 0);
-#endif /* LWIP_SO_RCVTIMEO*/
-
-#if LWIP_TCP
-#if (LWIP_UDP || LWIP_RAW)
-  if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)
-#endif /* (LWIP_UDP || LWIP_RAW) */
-  {
-    /* Let the stack know that we have taken the data. */
-    /* @todo: Speedup: Don't block and wait for the answer here
-       (to prevent multiple thread-switches). */
-    API_MSG_VAR_REF(msg).conn = conn;
-    if (buf != NULL) {
-      API_MSG_VAR_REF(msg).msg.r.len = ((struct pbuf *)buf)->tot_len;
-    } else {
-      API_MSG_VAR_REF(msg).msg.r.len = 1;
-    }
-
-    /* don't care for the return value of lwip_netconn_do_recv */
-    netconn_apimsg(lwip_netconn_do_recv, &API_MSG_VAR_REF(msg));
-    API_MSG_VAR_FREE(msg);
-
-    /* If we are closed, we indicate that we no longer wish to use the socket */
-    if (buf == NULL) {
-      API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);
-      if (conn->pcb.ip == NULL) {
-        /* race condition: RST during recv */
-        return conn->last_err == ERR_OK ? ERR_RST : conn->last_err;
+  NETCONN_MBOX_WAITING_INC(conn);
+  if (netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK) ||
+      (conn->flags & NETCONN_FLAG_MBOXCLOSED) || (conn->pending_err != ERR_OK)) {
+    if (sys_arch_mbox_tryfetch(&conn->recvmbox, &buf) == SYS_ARCH_TIMEOUT) {
+      err_t err;
+      NETCONN_MBOX_WAITING_DEC(conn);
+      err = netconn_err(conn);
+      if (err != ERR_OK) {
+        /* return pending error */
+        return err;
       }
-      /* RX side is closed, so deallocate the recvmbox */
-      netconn_close_shutdown(conn, NETCONN_SHUT_RD);
-      /* Don' store ERR_CLSD as conn->err since we are only half-closed */
-      return ERR_CLSD;
+      if (conn->flags & NETCONN_FLAG_MBOXCLOSED) {
+        return ERR_CONN;
+      }
+      return ERR_WOULDBLOCK;
+    }
+  } else {
+#if LWIP_SO_RCVTIMEO
+    if (sys_arch_mbox_fetch(&conn->recvmbox, &buf, conn->recv_timeout) == SYS_ARCH_TIMEOUT) {
+      NETCONN_MBOX_WAITING_DEC(conn);
+      return ERR_TIMEOUT;
+    }
+#else
+    sys_arch_mbox_fetch(&conn->recvmbox, &buf, 0);
+#endif /* LWIP_SO_RCVTIMEO*/
+  }
+  NETCONN_MBOX_WAITING_DEC(conn);
+#if LWIP_NETCONN_FULLDUPLEX
+  if (conn->flags & NETCONN_FLAG_MBOXINVALID) {
+    if (lwip_netconn_is_deallocated_msg(buf)) {
+      /* the netconn has been closed from another thread */
+      API_MSG_VAR_FREE_ACCEPT(msg);
+      return ERR_CONN;
+    }
+  }
+#endif
+
+#if LWIP_TCP
+#if (LWIP_UDP || LWIP_RAW)
+  if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)
+#endif /* (LWIP_UDP || LWIP_RAW) */
+  {
+    err_t err;
+    /* Check if this is an error message or a pbuf */
+    if (lwip_netconn_is_err_msg(buf, &err)) {
+      /* new_buf has been zeroed above already */
+      if (err == ERR_CLSD) {
+        /* connection closed translates to ERR_OK with *new_buf == NULL */
+        return ERR_OK;
+      }
+      return err;
     }
     len = ((struct pbuf *)buf)->tot_len;
   }
@@ -572,7 +655,7 @@
 #if (LWIP_UDP || LWIP_RAW)
   {
     LWIP_ASSERT("buf != NULL", buf != NULL);
-    len = netbuf_len((struct netbuf*)buf);
+    len = netbuf_len((struct netbuf *)buf);
   }
 #endif /* (LWIP_UDP || LWIP_RAW) */
 
@@ -589,6 +672,102 @@
   return ERR_OK;
 }
 
+#if LWIP_TCP
+static err_t
+netconn_tcp_recvd_msg(struct netconn *conn, size_t len, struct api_msg *msg)
+{
+  LWIP_ERROR("netconn_recv_tcp_pbuf: invalid conn", (conn != NULL) &&
+             NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP, return ERR_ARG;);
+
+  msg->conn = conn;
+  msg->msg.r.len = len;
+
+  return netconn_apimsg(lwip_netconn_do_recv, msg);
+}
+
+err_t
+netconn_tcp_recvd(struct netconn *conn, size_t len)
+{
+  err_t err;
+  API_MSG_VAR_DECLARE(msg);
+  LWIP_ERROR("netconn_recv_tcp_pbuf: invalid conn", (conn != NULL) &&
+             NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP, return ERR_ARG;);
+
+  API_MSG_VAR_ALLOC(msg);
+  err = netconn_tcp_recvd_msg(conn, len, &API_VAR_REF(msg));
+  API_MSG_VAR_FREE(msg);
+  return err;
+}
+
+static err_t
+netconn_recv_data_tcp(struct netconn *conn, struct pbuf **new_buf, u8_t apiflags)
+{
+  err_t err;
+  struct pbuf *buf;
+  API_MSG_VAR_DECLARE(msg);
+#if LWIP_MPU_COMPATIBLE
+  msg = NULL;
+#endif
+
+  if (!NETCONN_RECVMBOX_WAITABLE(conn)) {
+    /* This only happens when calling this function more than once *after* receiving FIN */
+    return ERR_CONN;
+  }
+  if (netconn_is_flag_set(conn, NETCONN_FIN_RX_PENDING)) {
+    netconn_clear_flags(conn, NETCONN_FIN_RX_PENDING);
+    goto handle_fin;
+  }
+
+  if (!(apiflags & NETCONN_NOAUTORCVD)) {
+    /* need to allocate API message here so empty message pool does not result in event loss
+      * see bug #47512: MPU_COMPATIBLE may fail on empty pool */
+    API_MSG_VAR_ALLOC(msg);
+  }
+
+  err = netconn_recv_data(conn, (void **)new_buf, apiflags);
+  if (err != ERR_OK) {
+    if (!(apiflags & NETCONN_NOAUTORCVD)) {
+      API_MSG_VAR_FREE(msg);
+    }
+    return err;
+  }
+  buf = *new_buf;
+  if (!(apiflags & NETCONN_NOAUTORCVD)) {
+    /* Let the stack know that we have taken the data. */
+    u16_t len = buf ? buf->tot_len : 1;
+    /* don't care for the return value of lwip_netconn_do_recv */
+    /* @todo: this should really be fixed, e.g. by retrying in poll on error */
+    netconn_tcp_recvd_msg(conn, len,  &API_VAR_REF(msg));
+    API_MSG_VAR_FREE(msg);
+  }
+
+  /* If we are closed, we indicate that we no longer wish to use the socket */
+  if (buf == NULL) {
+    if (apiflags & NETCONN_NOFIN) {
+      /* received a FIN but the caller cannot handle it right now:
+         re-enqueue it and return "no data" */
+      netconn_set_flags(conn, NETCONN_FIN_RX_PENDING);
+      return ERR_WOULDBLOCK;
+    } else {
+handle_fin:
+      API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);
+      if (conn->pcb.ip == NULL) {
+        /* race condition: RST during recv */
+        err = netconn_err(conn);
+        if (err != ERR_OK) {
+          return err;
+        }
+        return ERR_RST;
+      }
+      /* RX side is closed, so deallocate the recvmbox */
+      netconn_close_shutdown(conn, NETCONN_SHUT_RD);
+      /* Don' store ERR_CLSD as conn->err since we are only half-closed */
+      return ERR_CLSD;
+    }
+  }
+  return err;
+}
+
 /**
  * @ingroup netconn_tcp
  * Receive data (in form of a pbuf) from a TCP netconn
@@ -596,16 +775,76 @@
  * @param conn the netconn from which to receive data
  * @param new_buf pointer where a new pbuf is stored when received data
  * @return ERR_OK if data has been received, an error code otherwise (timeout,
- *                memory error or another error)
+ *                memory error or another error, @see netconn_recv_data)
  *         ERR_ARG if conn is not a TCP netconn
  */
 err_t
 netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf)
 {
-  LWIP_ERROR("netconn_recv: invalid conn", (conn != NULL) &&
+  LWIP_ERROR("netconn_recv_tcp_pbuf: invalid conn", (conn != NULL) &&
              NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP, return ERR_ARG;);
 
-  return netconn_recv_data(conn, (void **)new_buf);
+  return netconn_recv_data_tcp(conn, new_buf, 0);
+}
+
+/**
+ * @ingroup netconn_tcp
+ * Receive data (in form of a pbuf) from a TCP netconn
+ *
+ * @param conn the netconn from which to receive data
+ * @param new_buf pointer where a new pbuf is stored when received data
+ * @param apiflags flags that control function behaviour. For now only:
+ * - NETCONN_DONTBLOCK: only read data that is available now, don't wait for more data
+ * @return ERR_OK if data has been received, an error code otherwise (timeout,
+ *                memory error or another error, @see netconn_recv_data)
+ *         ERR_ARG if conn is not a TCP netconn
+ */
+err_t
+netconn_recv_tcp_pbuf_flags(struct netconn *conn, struct pbuf **new_buf, u8_t apiflags)
+{
+  LWIP_ERROR("netconn_recv_tcp_pbuf: invalid conn", (conn != NULL) &&
+             NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP, return ERR_ARG;);
+
+  return netconn_recv_data_tcp(conn, new_buf, apiflags);
+}
+#endif /* LWIP_TCP */
+
+/**
+ * Receive data (in form of a netbuf) from a UDP or RAW netconn
+ *
+ * @param conn the netconn from which to receive data
+ * @param new_buf pointer where a new netbuf is stored when received data
+ * @return ERR_OK if data has been received, an error code otherwise (timeout,
+ *                memory error or another error)
+ *         ERR_ARG if conn is not a UDP/RAW netconn
+ */
+err_t
+netconn_recv_udp_raw_netbuf(struct netconn *conn, struct netbuf **new_buf)
+{
+  LWIP_ERROR("netconn_recv_udp_raw_netbuf: invalid conn", (conn != NULL) &&
+             NETCONNTYPE_GROUP(netconn_type(conn)) != NETCONN_TCP, return ERR_ARG;);
+
+  return netconn_recv_data(conn, (void **)new_buf, 0);
+}
+
+/**
+ * Receive data (in form of a netbuf) from a UDP or RAW netconn
+ *
+ * @param conn the netconn from which to receive data
+ * @param new_buf pointer where a new netbuf is stored when received data
+ * @param apiflags flags that control function behaviour. For now only:
+ * - NETCONN_DONTBLOCK: only read data that is available now, don't wait for more data
+ * @return ERR_OK if data has been received, an error code otherwise (timeout,
+ *                memory error or another error)
+ *         ERR_ARG if conn is not a UDP/RAW netconn
+ */
+err_t
+netconn_recv_udp_raw_netbuf_flags(struct netconn *conn, struct netbuf **new_buf, u8_t apiflags)
+{
+  LWIP_ERROR("netconn_recv_udp_raw_netbuf: invalid conn", (conn != NULL) &&
+             NETCONNTYPE_GROUP(netconn_type(conn)) != NETCONN_TCP, return ERR_ARG;);
+
+  return netconn_recv_data(conn, (void **)new_buf, apiflags);
 }
 
 /**
@@ -642,7 +881,7 @@
       return ERR_MEM;
     }
 
-    err = netconn_recv_data(conn, (void **)&p);
+    err = netconn_recv_data_tcp(conn, &p, 0);
     if (err != ERR_OK) {
       memp_free(MEMP_NETBUF, buf);
       return err;
@@ -663,7 +902,7 @@
 #endif /* LWIP_TCP && (LWIP_UDP || LWIP_RAW) */
   {
 #if (LWIP_UDP || LWIP_RAW)
-    return netconn_recv_data(conn, (void **)new_buf);
+    return netconn_recv_data(conn, (void **)new_buf, 0);
 #endif /* (LWIP_UDP || LWIP_RAW) */
   }
 }
@@ -735,15 +974,37 @@
 netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size,
                      u8_t apiflags, size_t *bytes_written)
 {
+  struct netvector vector;
+  vector.ptr = dataptr;
+  vector.len = size;
+  return netconn_write_vectors_partly(conn, &vector, 1, apiflags, bytes_written);
+}
+
+/**
+ * Send vectorized data atomically over a TCP netconn.
+ *
+ * @param conn the TCP netconn over which to send data
+ * @param vectors array of vectors containing data to send
+ * @param vectorcnt number of vectors in the array
+ * @param apiflags combination of following flags :
+ * - NETCONN_COPY: data will be copied into memory belonging to the stack
+ * - NETCONN_MORE: for TCP connection, PSH flag will be set on last segment sent
+ * - NETCONN_DONTBLOCK: only write the data if all data can be written at once
+ * @param bytes_written pointer to a location that receives the number of written bytes
+ * @return ERR_OK if data was sent, any other err_t on error
+ */
+err_t
+netconn_write_vectors_partly(struct netconn *conn, struct netvector *vectors, u16_t vectorcnt,
+                             u8_t apiflags, size_t *bytes_written)
+{
   API_MSG_VAR_DECLARE(msg);
   err_t err;
   u8_t dontblock;
+  size_t size;
+  int i;
 
   LWIP_ERROR("netconn_write: invalid conn",  (conn != NULL), return ERR_ARG;);
-  LWIP_ERROR("netconn_write: invalid conn->type",  (NETCONNTYPE_GROUP(conn->type)== NETCONN_TCP), return ERR_VAL;);
-  if (size == 0) {
-    return ERR_OK;
-  }
+  LWIP_ERROR("netconn_write: invalid conn->type",  (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP), return ERR_VAL;);
   dontblock = netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK);
 #if LWIP_SO_SNDTIMEO
   if (conn->send_timeout != 0) {
@@ -756,12 +1017,37 @@
     return ERR_VAL;
   }
 
+  /* sum up the total size */
+  size = 0;
+  for (i = 0; i < vectorcnt; i++) {
+    size += vectors[i].len;
+    if (size < vectors[i].len) {
+      /* overflow */
+      return ERR_VAL;
+    }
+  }
+  if (size == 0) {
+    return ERR_OK;
+  } else if (size > SSIZE_MAX) {
+    ssize_t limited;
+    /* this is required by the socket layer (cannot send full size_t range) */
+    if (!bytes_written) {
+      return ERR_VAL;
+    }
+    /* limit the amount of data to send */
+    limited = SSIZE_MAX;
+    size = (size_t)limited;
+  }
+
   API_MSG_VAR_ALLOC(msg);
   /* non-blocking write sends as much  */
   API_MSG_VAR_REF(msg).conn = conn;
-  API_MSG_VAR_REF(msg).msg.w.dataptr = dataptr;
+  API_MSG_VAR_REF(msg).msg.w.vector = vectors;
+  API_MSG_VAR_REF(msg).msg.w.vector_cnt = vectorcnt;
+  API_MSG_VAR_REF(msg).msg.w.vector_off = 0;
   API_MSG_VAR_REF(msg).msg.w.apiflags = apiflags;
   API_MSG_VAR_REF(msg).msg.w.len = size;
+  API_MSG_VAR_REF(msg).msg.w.offset = 0;
 #if LWIP_SO_SNDTIMEO
   if (conn->send_timeout != 0) {
     /* get the time we started, which is later compared to
@@ -776,13 +1062,14 @@
      but if it is, this is done inside api_msg.c:do_write(), so we can use the
      non-blocking version here. */
   err = netconn_apimsg(lwip_netconn_do_write, &API_MSG_VAR_REF(msg));
-  if ((err == ERR_OK) && (bytes_written != NULL)) {
-    if (dontblock) {
-      /* nonblocking write: maybe the data has been sent partly */
-      *bytes_written = API_MSG_VAR_REF(msg).msg.w.len;
-    } else {
-      /* blocking call succeeded: all data has been sent if it */
-      *bytes_written = size;
+  if (err == ERR_OK) {
+    if (bytes_written != NULL) {
+      *bytes_written = API_MSG_VAR_REF(msg).msg.w.offset;
+    }
+    /* for blocking, check all requested bytes were written, NOTE: send_timeout is
+       treated as dontblock (see dontblock assignment above) */
+    if (!dontblock) {
+      LWIP_ASSERT("do_write failed to write all bytes", API_MSG_VAR_REF(msg).msg.w.offset == size);
     }
   }
   API_MSG_VAR_FREE(msg);
@@ -842,6 +1129,28 @@
 }
 
 /**
+ * @ingroup netconn_common
+ * Get and reset pending error on a netconn
+ *
+ * @param conn the netconn to get the error from
+ * @return and pending error or ERR_OK if no error was pending
+ */
+err_t
+netconn_err(struct netconn *conn)
+{
+  err_t err;
+  SYS_ARCH_DECL_PROTECT(lev);
+  if (conn == NULL) {
+    return ERR_OK;
+  }
+  SYS_ARCH_PROTECT(lev);
+  err = conn->pending_err;
+  conn->pending_err = ERR_OK;
+  SYS_ARCH_UNPROTECT(lev);
+  return err;
+}
+
+/**
  * @ingroup netconn_tcp
  * Shut down one or both sides of a TCP netconn (doesn't delete it).
  *
@@ -853,7 +1162,7 @@
 err_t
 netconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx)
 {
-  return netconn_close_shutdown(conn, (shut_rx ? NETCONN_SHUT_RD : 0) | (shut_tx ? NETCONN_SHUT_WR : 0));
+  return netconn_close_shutdown(conn, (u8_t)((shut_rx ? NETCONN_SHUT_RD : 0) | (shut_tx ? NETCONN_SHUT_WR : 0)));
 }
 
 #if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)
@@ -900,6 +1209,48 @@
 
   return err;
 }
+/**
+ * @ingroup netconn_udp
+ * Join multicast groups for UDP netconns.
+ *
+ * @param conn the UDP netconn for which to change multicast addresses
+ * @param multiaddr IP address of the multicast group to join or leave
+ * @param if_idx the index of the netif
+ * @param join_or_leave flag whether to send a join- or leave-message
+ * @return ERR_OK if the action was taken, any err_t on error
+ */
+err_t
+netconn_join_leave_group_netif(struct netconn *conn,
+                               const ip_addr_t *multiaddr,
+                               u8_t if_idx,
+                               enum netconn_igmp join_or_leave)
+{
+  API_MSG_VAR_DECLARE(msg);
+  err_t err;
+
+  LWIP_ERROR("netconn_join_leave_group: invalid conn",  (conn != NULL), return ERR_ARG;);
+
+  API_MSG_VAR_ALLOC(msg);
+
+#if LWIP_IPV4
+  /* Don't propagate NULL pointer (IP_ADDR_ANY alias) to subsequent functions */
+  if (multiaddr == NULL) {
+    multiaddr = IP4_ADDR_ANY;
+  }
+  if (if_idx == NETIF_NO_INDEX) {
+    return ERR_IF;
+  }
+#endif /* LWIP_IPV4 */
+
+  API_MSG_VAR_REF(msg).conn = conn;
+  API_MSG_VAR_REF(msg).msg.jl.multiaddr = API_MSG_VAR_REF(multiaddr);
+  API_MSG_VAR_REF(msg).msg.jl.if_idx = if_idx;
+  API_MSG_VAR_REF(msg).msg.jl.join_or_leave = join_or_leave;
+  err = netconn_apimsg(lwip_netconn_do_join_leave_group_netif, &API_MSG_VAR_REF(msg));
+  API_MSG_VAR_FREE(msg);
+
+  return err;
+}
 #endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */
 
 #if LWIP_DNS
@@ -938,10 +1289,20 @@
   }
 #endif
 
+#ifdef LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE
+#if LWIP_IPV4 && LWIP_IPV6
+  if (LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE(name, addr, dns_addrtype, &err)) {
+#else
+  if (LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE(name, addr, NETCONN_DNS_DEFAULT, &err)) {
+#endif /* LWIP_IPV4 && LWIP_IPV6 */
+    return err;
+  }
+#endif /* LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE */
+
   API_VAR_ALLOC(struct dns_api_msg, MEMP_DNS_API_MSG, msg, ERR_MEM);
 #if LWIP_MPU_COMPATIBLE
-  strncpy(API_VAR_REF(msg).name, name, DNS_MAX_NAME_LENGTH-1);
-  API_VAR_REF(msg).name[DNS_MAX_NAME_LENGTH-1] = 0;
+  strncpy(API_VAR_REF(msg).name, name, DNS_MAX_NAME_LENGTH - 1);
+  API_VAR_REF(msg).name[DNS_MAX_NAME_LENGTH - 1] = 0;
 #else /* LWIP_MPU_COMPATIBLE */
   msg.err = &err;
   msg.sem = &sem;
@@ -961,18 +1322,14 @@
   }
 #endif /* LWIP_NETCONN_SEM_PER_THREAD */
 
-  cberr = tcpip_callback(lwip_netconn_do_gethostbyname, &API_VAR_REF(msg));
-  if (cberr != ERR_OK) {
-#if !LWIP_NETCONN_SEM_PER_THREAD
-    sys_sem_free(API_EXPR_REF(API_VAR_REF(msg).sem));
-#endif /* !LWIP_NETCONN_SEM_PER_THREAD */
-    API_VAR_FREE(MEMP_DNS_API_MSG, msg);
-    return cberr;
-  }
-  sys_sem_wait(API_EXPR_REF_SEM(API_VAR_REF(msg).sem));
+  cberr = tcpip_send_msg_wait_sem(lwip_netconn_do_gethostbyname, &API_VAR_REF(msg), API_EXPR_REF(API_VAR_REF(msg).sem));
 #if !LWIP_NETCONN_SEM_PER_THREAD
   sys_sem_free(API_EXPR_REF(API_VAR_REF(msg).sem));
 #endif /* !LWIP_NETCONN_SEM_PER_THREAD */
+  if (cberr != ERR_OK) {
+    API_VAR_FREE(MEMP_DNS_API_MSG, msg);
+    return cberr;
+  }
 
 #if LWIP_MPU_COMPATIBLE
   *addr = msg->addr;
diff --git a/src/api/api_msg.c b/src/api/api_msg.c
index 5a8dad9..3953102 100644
--- a/src/api/api_msg.c
+++ b/src/api/api_msg.c
@@ -60,10 +60,16 @@
 #define NETCONN_TCP_POLL_INTERVAL 2
 
 #define SET_NONBLOCKING_CONNECT(conn, val)  do { if (val) { \
-  (conn)->flags |= NETCONN_FLAG_IN_NONBLOCKING_CONNECT; \
+  netconn_set_flags(conn, NETCONN_FLAG_IN_NONBLOCKING_CONNECT); \
 } else { \
-  (conn)->flags &= ~ NETCONN_FLAG_IN_NONBLOCKING_CONNECT; }} while(0)
-#define IN_NONBLOCKING_CONNECT(conn) (((conn)->flags & NETCONN_FLAG_IN_NONBLOCKING_CONNECT) != 0)
+  netconn_clear_flags(conn, NETCONN_FLAG_IN_NONBLOCKING_CONNECT); }} while(0)
+#define IN_NONBLOCKING_CONNECT(conn) netconn_is_flag_set(conn, NETCONN_FLAG_IN_NONBLOCKING_CONNECT)
+
+#if LWIP_NETCONN_FULLDUPLEX
+#define NETCONN_MBOX_VALID(conn, mbox) (sys_mbox_valid(mbox) && ((conn->flags & NETCONN_FLAG_MBOXINVALID) == 0))
+#else
+#define NETCONN_MBOX_VALID(conn, mbox) sys_mbox_valid(mbox)
+#endif
 
 /* forward declarations */
 #if LWIP_TCP
@@ -78,16 +84,69 @@
 static err_t lwip_netconn_do_close_internal(struct netconn *conn  WRITE_DELAYED_PARAM);
 #endif
 
+static void netconn_drain(struct netconn *conn);
+
 #if LWIP_TCPIP_CORE_LOCKING
-#define TCPIP_APIMSG_ACK(m)   NETCONN_SET_SAFE_ERR((m)->conn, (m)->err)
+#define TCPIP_APIMSG_ACK(m)
 #else /* LWIP_TCPIP_CORE_LOCKING */
-#define TCPIP_APIMSG_ACK(m)   do { NETCONN_SET_SAFE_ERR((m)->conn, (m)->err); sys_sem_signal(LWIP_API_MSG_SEM(m)); } while(0)
+#define TCPIP_APIMSG_ACK(m)   do { sys_sem_signal(LWIP_API_MSG_SEM(m)); } while(0)
 #endif /* LWIP_TCPIP_CORE_LOCKING */
 
+#if LWIP_NETCONN_FULLDUPLEX
+const u8_t netconn_deleted = 0;
+
+int
+lwip_netconn_is_deallocated_msg(void *msg)
+{
+  if (msg == &netconn_deleted) {
+    return 1;
+  }
+  return 0;
+}
+#endif /* LWIP_NETCONN_FULLDUPLEX */
+
 #if LWIP_TCP
-u8_t netconn_aborted;
+const u8_t netconn_aborted = 0;
+const u8_t netconn_reset = 0;
+const u8_t netconn_closed = 0;
+
+/** Translate an error to a unique void* passed via an mbox */
+static void *
+lwip_netconn_err_to_msg(err_t err)
+{
+  switch (err) {
+    case ERR_ABRT:
+      return LWIP_CONST_CAST(void *, &netconn_aborted);
+    case ERR_RST:
+      return LWIP_CONST_CAST(void *, &netconn_reset);
+    case ERR_CLSD:
+      return LWIP_CONST_CAST(void *, &netconn_closed);
+    default:
+      LWIP_ASSERT("unhandled error", err == ERR_OK);
+      return NULL;
+  }
+}
+
+int
+lwip_netconn_is_err_msg(void *msg, err_t *err)
+{
+  LWIP_ASSERT("err != NULL", err != NULL);
+
+  if (msg == &netconn_aborted) {
+    *err = ERR_ABRT;
+    return 1;
+  } else if (msg == &netconn_reset) {
+    *err = ERR_RST;
+    return 1;
+  } else if (msg == &netconn_closed) {
+    *err = ERR_CLSD;
+    return 1;
+  }
+  return 0;
+}
 #endif /* LWIP_TCP */
 
+
 #if LWIP_RAW
 /**
  * Receive callback function for RAW netconns.
@@ -98,7 +157,7 @@
  */
 static u8_t
 recv_raw(void *arg, struct raw_pcb *pcb, struct pbuf *p,
-    const ip_addr_t *addr)
+         const ip_addr_t *addr)
 {
   struct pbuf *q;
   struct netbuf *buf;
@@ -107,7 +166,7 @@
   LWIP_UNUSED_ARG(addr);
   conn = (struct netconn *)arg;
 
-  if ((conn != NULL) && sys_mbox_valid(&conn->recvmbox)) {
+  if ((conn != NULL) && NETCONN_MBOX_VALID(conn, &conn->recvmbox)) {
 #if LWIP_SO_RCVBUF
     int recv_avail;
     SYS_ARCH_GET(conn->recv_avail, recv_avail);
@@ -116,14 +175,7 @@
     }
 #endif /* LWIP_SO_RCVBUF */
     /* copy the whole packet into new pbufs */
-    q = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM);
-    if (q != NULL) {
-      if (pbuf_copy(q, p) != ERR_OK) {
-        pbuf_free(q);
-        q = NULL;
-      }
-    }
-
+    q = pbuf_clone(PBUF_RAW, PBUF_RAM, p);
     if (q != NULL) {
       u16_t len;
       buf = (struct netbuf *)memp_malloc(MEMP_NETBUF);
@@ -164,7 +216,7 @@
  */
 static void
 recv_udp(void *arg, struct udp_pcb *pcb, struct pbuf *p,
-   const ip_addr_t *addr, u16_t port)
+         const ip_addr_t *addr, u16_t port)
 {
   struct netbuf *buf;
   struct netconn *conn;
@@ -187,10 +239,10 @@
 
 #if LWIP_SO_RCVBUF
   SYS_ARCH_GET(conn->recv_avail, recv_avail);
-  if (!sys_mbox_valid(&conn->recvmbox) ||
+  if (!NETCONN_MBOX_VALID(conn, &conn->recvmbox) ||
       ((recv_avail + (int)(p->tot_len)) > conn->recv_bufsize)) {
 #else  /* LWIP_SO_RCVBUF */
-  if (!sys_mbox_valid(&conn->recvmbox)) {
+  if (!NETCONN_MBOX_VALID(conn, &conn->recvmbox)) {
 #endif /* LWIP_SO_RCVBUF */
     pbuf_free(p);
     return;
@@ -206,12 +258,10 @@
     ip_addr_set(&buf->addr, addr);
     buf->port = port;
 #if LWIP_NETBUF_RECVINFO
-    {
+    if (conn->flags & NETCONN_FLAG_PKTINFO) {
       /* get the UDP header - always in the first pbuf, ensured by udp_input */
-      const struct udp_hdr* udphdr = (const struct udp_hdr*)ip_next_header_ptr();
-#if LWIP_CHECKSUM_ON_COPY
+      const struct udp_hdr *udphdr = (const struct udp_hdr *)ip_next_header_ptr();
       buf->flags = NETBUF_FLAG_DESTADDR;
-#endif /* LWIP_CHECKSUM_ON_COPY */
       ip_addr_set(&buf->toaddr, ip_current_dest_addr());
       buf->toport_chksum = udphdr->dest;
     }
@@ -244,10 +294,13 @@
 {
   struct netconn *conn;
   u16_t len;
+  void *msg;
 
   LWIP_UNUSED_ARG(pcb);
   LWIP_ASSERT("recv_tcp must have a pcb argument", pcb != NULL);
   LWIP_ASSERT("recv_tcp must have an argument", arg != NULL);
+  LWIP_ASSERT("err != ERR_OK unhandled", err == ERR_OK);
+  LWIP_UNUSED_ARG(err); /* for LWIP_NOASSERT */
   conn = (struct netconn *)arg;
 
   if (conn == NULL) {
@@ -255,7 +308,7 @@
   }
   LWIP_ASSERT("recv_tcp: recv for wrong pcb!", conn->pcb.tcp == pcb);
 
-  if (!sys_mbox_valid(&conn->recvmbox)) {
+  if (!NETCONN_MBOX_VALID(conn, &conn->recvmbox)) {
     /* recvmbox already deleted */
     if (p != NULL) {
       tcp_recved(pcb, p->tot_len);
@@ -267,18 +320,15 @@
      using recv_avail since that could break the connection
      (data is already ACKed) */
 
-  /* don't overwrite fatal errors! */
-  if (err != ERR_OK) {
-    NETCONN_SET_SAFE_ERR(conn, err);
-  }
-
   if (p != NULL) {
+    msg = p;
     len = p->tot_len;
   } else {
+    msg = LWIP_CONST_CAST(void *, &netconn_closed);
     len = 0;
   }
 
-  if (sys_mbox_trypost(&conn->recvmbox, p) != ERR_OK) {
+  if (sys_mbox_trypost(&conn->recvmbox, msg) != ERR_OK) {
     /* don't deallocate p: it is presented to us later again from tcp_fasttmr! */
     return ERR_MEM;
   } else {
@@ -328,8 +378,8 @@
     /* If the queued byte- or pbuf-count drops below the configured low-water limit,
        let select mark this pcb as writable again. */
     if ((conn->pcb.tcp != NULL) && (tcp_sndbuf(conn->pcb.tcp) > TCP_SNDLOWAT) &&
-      (tcp_sndqueuelen(conn->pcb.tcp) < TCP_SNDQUEUELOWAT)) {
-      conn->flags &= ~NETCONN_FLAG_CHECK_WRITESPACE;
+        (tcp_sndqueuelen(conn->pcb.tcp) < TCP_SNDQUEUELOWAT)) {
+      netconn_clear_flags(conn, NETCONN_FLAG_CHECK_WRITESPACE);
       API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0);
     }
   }
@@ -362,8 +412,8 @@
     /* If the queued byte- or pbuf-count drops below the configured low-water limit,
        let select mark this pcb as writable again. */
     if ((conn->pcb.tcp != NULL) && (tcp_sndbuf(conn->pcb.tcp) > TCP_SNDLOWAT) &&
-      (tcp_sndqueuelen(conn->pcb.tcp) < TCP_SNDQUEUELOWAT)) {
-      conn->flags &= ~NETCONN_FLAG_CHECK_WRITESPACE;
+        (tcp_sndqueuelen(conn->pcb.tcp) < TCP_SNDQUEUELOWAT)) {
+      netconn_clear_flags(conn, NETCONN_FLAG_CHECK_WRITESPACE);
       API_EVENT(conn, NETCONN_EVT_SENDPLUS, len);
     }
   }
@@ -383,26 +433,26 @@
 {
   struct netconn *conn;
   enum netconn_state old_state;
+  void *mbox_msg;
+  SYS_ARCH_DECL_PROTECT(lev);
 
   conn = (struct netconn *)arg;
   LWIP_ASSERT("conn != NULL", (conn != NULL));
 
+  SYS_ARCH_PROTECT(lev);
+
+  /* when err is called, the pcb is deallocated, so delete the reference */
   conn->pcb.tcp = NULL;
+  /* store pending error */
+  conn->pending_err = err;
+  /* prevent application threads from blocking on 'recvmbox'/'acceptmbox' */
+  conn->flags |= NETCONN_FLAG_MBOXCLOSED;
 
   /* reset conn->state now before waking up other threads */
   old_state = conn->state;
   conn->state = NETCONN_NONE;
 
-  if (old_state == NETCONN_CLOSE) {
-    /* RST during close: let close return success & dealloc the netconn */
-    err = ERR_OK;
-    NETCONN_SET_SAFE_ERR(conn, ERR_OK);
-  } else {
-    /* no check since this is always fatal! */
-    SYS_ARCH_SET(conn->last_err, err);
-  }
-
-  /* @todo: the type of NETCONN_EVT created should depend on 'old_state' */
+  SYS_ARCH_UNPROTECT(lev);
 
   /* Notify the user layer about a connection error. Used to signal select. */
   API_EVENT(conn, NETCONN_EVT_ERROR, 0);
@@ -411,15 +461,16 @@
   API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0);
   API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0);
 
-  /* pass NULL-message to recvmbox to wake up pending recv */
-  if (sys_mbox_valid(&conn->recvmbox)) {
+  mbox_msg = lwip_netconn_err_to_msg(err);
+  /* pass error message to recvmbox to wake up pending recv */
+  if (NETCONN_MBOX_VALID(conn, &conn->recvmbox)) {
     /* use trypost to prevent deadlock */
-    sys_mbox_trypost(&conn->recvmbox, NULL);
+    sys_mbox_trypost(&conn->recvmbox, mbox_msg);
   }
-  /* pass NULL-message to acceptmbox to wake up pending accept */
-  if (sys_mbox_valid(&conn->acceptmbox)) {
+  /* pass error message to acceptmbox to wake up pending accept */
+  if (NETCONN_MBOX_VALID(conn, &conn->acceptmbox)) {
     /* use trypost to preven deadlock */
-    sys_mbox_trypost(&conn->acceptmbox, NULL);
+    sys_mbox_trypost(&conn->acceptmbox, mbox_msg);
   }
 
   if ((old_state == NETCONN_WRITE) || (old_state == NETCONN_CLOSE) ||
@@ -430,16 +481,23 @@
     SET_NONBLOCKING_CONNECT(conn, 0);
 
     if (!was_nonblocking_connect) {
-      sys_sem_t* op_completed_sem;
+      sys_sem_t *op_completed_sem;
       /* set error return code */
       LWIP_ASSERT("conn->current_msg != NULL", conn->current_msg != NULL);
-      conn->current_msg->err = err;
+      if (old_state == NETCONN_CLOSE) {
+        /* let close succeed: the connection is closed after all... */
+        conn->current_msg->err = ERR_OK;
+      } else {
+        /* Write and connect fail */
+        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));
       conn->current_msg = NULL;
       /* wake up the waiting task */
-      NETCONN_SET_SAFE_ERR(conn, err);
       sys_sem_signal(op_completed_sem);
+    } else {
+      /* @todo: test what happens for error on nonblocking connect */
     }
   } else {
     LWIP_ASSERT("conn->current_msg == NULL", conn->current_msg == NULL);
@@ -480,28 +538,30 @@
   if (conn == NULL) {
     return ERR_VAL;
   }
-  if (!sys_mbox_valid(&conn->acceptmbox)) {
+  if (!NETCONN_MBOX_VALID(conn, &conn->acceptmbox)) {
     LWIP_DEBUGF(API_MSG_DEBUG, ("accept_function: acceptmbox already deleted\n"));
     return ERR_VAL;
   }
 
   if (newpcb == NULL) {
     /* out-of-pcbs during connect: pass on this error to the application */
-    if (sys_mbox_trypost(&conn->acceptmbox, &netconn_aborted) == ERR_OK) {
+    if (sys_mbox_trypost(&conn->acceptmbox, lwip_netconn_err_to_msg(ERR_ABRT)) == ERR_OK) {
       /* Register event with callback */
       API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0);
     }
     return ERR_VAL;
   }
+  LWIP_ASSERT("expect newpcb == NULL or err == ERR_OK", err == ERR_OK);
+  LWIP_UNUSED_ARG(err); /* for LWIP_NOASSERT */
 
-  LWIP_DEBUGF(API_MSG_DEBUG, ("accept_function: newpcb->tate: %s\n", tcp_debug_state_str(newpcb->state)));
+  LWIP_DEBUGF(API_MSG_DEBUG, ("accept_function: newpcb->state: %s\n", tcp_debug_state_str(newpcb->state)));
 
   /* We have to set the callback here even though
    * the new socket is unknown. newconn->socket is marked as -1. */
   newconn = netconn_alloc(conn->type, conn->callback);
   if (newconn == NULL) {
     /* outof netconns: pass on this error to the application */
-    if (sys_mbox_trypost(&conn->acceptmbox, &netconn_aborted) == ERR_OK) {
+    if (sys_mbox_trypost(&conn->acceptmbox, lwip_netconn_err_to_msg(ERR_ABRT)) == ERR_OK) {
       /* Register event with callback */
       API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0);
     }
@@ -509,9 +569,6 @@
   }
   newconn->pcb.tcp = newpcb;
   setup_tcp(newconn);
-  /* no protection: when creating the pcb, the netconn is not yet known
-     to the application thread */
-  newconn->last_err = err;
 
   /* handle backlog counter */
   tcp_backlog_delayed(newpcb);
@@ -520,7 +577,7 @@
     /* When returning != ERR_OK, the pcb is aborted in tcp_process(),
        so do nothing here! */
     /* remove all references to this netconn from the pcb */
-    struct tcp_pcb* pcb = newconn->pcb.tcp;
+    struct tcp_pcb *pcb = newconn->pcb.tcp;
     tcp_arg(pcb, NULL);
     tcp_recv(pcb, NULL);
     tcp_sent(pcb, NULL);
@@ -546,7 +603,7 @@
  * Create a new pcb of a specific type.
  * Called from lwip_netconn_do_newconn().
  *
- * @param msg the api_msg_msg describing the connection type
+ * @param msg the api_msg describing the connection type
  */
 static void
 pcb_new(struct api_msg *msg)
@@ -554,59 +611,59 @@
   enum lwip_ip_addr_type iptype = IPADDR_TYPE_V4;
 
   LWIP_ASSERT("pcb_new: pcb already allocated", msg->conn->pcb.tcp == NULL);
- 
+
 #if LWIP_IPV6 && LWIP_IPV4
   /* IPv6: Dual-stack by default, unless netconn_set_ipv6only() is called */
-  if(NETCONNTYPE_ISIPV6(netconn_type(msg->conn))) {
+  if (NETCONNTYPE_ISIPV6(netconn_type(msg->conn))) {
     iptype = IPADDR_TYPE_ANY;
   }
 #endif
-  
+
   /* Allocate a PCB for this connection */
-  switch(NETCONNTYPE_GROUP(msg->conn->type)) {
+  switch (NETCONNTYPE_GROUP(msg->conn->type)) {
 #if LWIP_RAW
-  case NETCONN_RAW:
-    msg->conn->pcb.raw = raw_new_ip_type(iptype, msg->msg.n.proto);
-    if (msg->conn->pcb.raw != NULL) {
+    case NETCONN_RAW:
+      msg->conn->pcb.raw = raw_new_ip_type(iptype, msg->msg.n.proto);
+      if (msg->conn->pcb.raw != NULL) {
 #if LWIP_IPV6
-      /* ICMPv6 packets should always have checksum calculated by the stack as per RFC 3542 chapter 3.1 */
-      if (NETCONNTYPE_ISIPV6(msg->conn->type) && msg->conn->pcb.raw->protocol == IP6_NEXTH_ICMP6) {
-        msg->conn->pcb.raw->chksum_reqd = 1;
-        msg->conn->pcb.raw->chksum_offset = 2;
-      }
+        /* ICMPv6 packets should always have checksum calculated by the stack as per RFC 3542 chapter 3.1 */
+        if (NETCONNTYPE_ISIPV6(msg->conn->type) && msg->conn->pcb.raw->protocol == IP6_NEXTH_ICMP6) {
+          msg->conn->pcb.raw->chksum_reqd = 1;
+          msg->conn->pcb.raw->chksum_offset = 2;
+        }
 #endif /* LWIP_IPV6 */
-      raw_recv(msg->conn->pcb.raw, recv_raw, msg->conn);
-    }
-    break;
+        raw_recv(msg->conn->pcb.raw, recv_raw, msg->conn);
+      }
+      break;
 #endif /* LWIP_RAW */
 #if LWIP_UDP
-  case NETCONN_UDP:
-    msg->conn->pcb.udp = udp_new_ip_type(iptype);
-    if (msg->conn->pcb.udp != NULL) {
+    case NETCONN_UDP:
+      msg->conn->pcb.udp = udp_new_ip_type(iptype);
+      if (msg->conn->pcb.udp != NULL) {
 #if LWIP_UDPLITE
-      if (NETCONNTYPE_ISUDPLITE(msg->conn->type)) {
-        udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_UDPLITE);
-      }
+        if (NETCONNTYPE_ISUDPLITE(msg->conn->type)) {
+          udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_UDPLITE);
+        }
 #endif /* LWIP_UDPLITE */
-      if (NETCONNTYPE_ISUDPNOCHKSUM(msg->conn->type)) {
-        udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_NOCHKSUM);
+        if (NETCONNTYPE_ISUDPNOCHKSUM(msg->conn->type)) {
+          udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_NOCHKSUM);
+        }
+        udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);
       }
-      udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);
-    }
-    break;
+      break;
 #endif /* LWIP_UDP */
 #if LWIP_TCP
-  case NETCONN_TCP:
-    msg->conn->pcb.tcp = tcp_new_ip_type(iptype);
-    if (msg->conn->pcb.tcp != NULL) {
-      setup_tcp(msg->conn);
-    }
-    break;
+    case NETCONN_TCP:
+      msg->conn->pcb.tcp = tcp_new_ip_type(iptype);
+      if (msg->conn->pcb.tcp != NULL) {
+        setup_tcp(msg->conn);
+      }
+      break;
 #endif /* LWIP_TCP */
-  default:
-    /* Unsupported netconn type, e.g. protocol disabled */
-    msg->err = ERR_VAL;
-    return;
+    default:
+      /* Unsupported netconn type, e.g. protocol disabled */
+      msg->err = ERR_VAL;
+      return;
   }
   if (msg->conn->pcb.ip == NULL) {
     msg->err = ERR_MEM;
@@ -617,12 +674,12 @@
  * Create a new pcb of a specific type inside a netconn.
  * Called from netconn_new_with_proto_and_callback.
  *
- * @param m the api_msg_msg describing the connection type
+ * @param m the api_msg describing the connection type
  */
 void
 lwip_netconn_do_newconn(void *m)
 {
-  struct api_msg *msg = (struct api_msg*)m;
+  struct api_msg *msg = (struct api_msg *)m;
 
   msg->err = ERR_OK;
   if (msg->conn->pcb.tcp == NULL) {
@@ -644,41 +701,45 @@
  * @return a newly allocated struct netconn or
  *         NULL on memory error
  */
-struct netconn*
+struct netconn *
 netconn_alloc(enum netconn_type t, netconn_callback callback)
 {
   struct netconn *conn;
   int size;
+  u8_t init_flags = 0;
 
   conn = (struct netconn *)memp_malloc(MEMP_NETCONN);
   if (conn == NULL) {
     return NULL;
   }
 
-  conn->last_err = ERR_OK;
+  conn->pending_err = ERR_OK;
   conn->type = t;
   conn->pcb.tcp = NULL;
 
   /* If all sizes are the same, every compiler should optimize this switch to nothing */
-  switch(NETCONNTYPE_GROUP(t)) {
+  switch (NETCONNTYPE_GROUP(t)) {
 #if LWIP_RAW
-  case NETCONN_RAW:
-    size = DEFAULT_RAW_RECVMBOX_SIZE;
-    break;
+    case NETCONN_RAW:
+      size = DEFAULT_RAW_RECVMBOX_SIZE;
+      break;
 #endif /* LWIP_RAW */
 #if LWIP_UDP
-  case NETCONN_UDP:
-    size = DEFAULT_UDP_RECVMBOX_SIZE;
-    break;
+    case NETCONN_UDP:
+      size = DEFAULT_UDP_RECVMBOX_SIZE;
+#if LWIP_NETBUF_RECVINFO
+      init_flags |= NETCONN_FLAG_PKTINFO;
+#endif /* LWIP_NETBUF_RECVINFO */
+      break;
 #endif /* LWIP_UDP */
 #if LWIP_TCP
-  case NETCONN_TCP:
-    size = DEFAULT_TCP_RECVMBOX_SIZE;
-    break;
+    case NETCONN_TCP:
+      size = DEFAULT_TCP_RECVMBOX_SIZE;
+      break;
 #endif /* LWIP_TCP */
-  default:
-    LWIP_ASSERT("netconn_alloc: undefined netconn_type", 0);
-    goto free_and_return;
+    default:
+      LWIP_ASSERT("netconn_alloc: undefined netconn_type", 0);
+      goto free_and_return;
   }
 
   if (sys_mbox_new(&conn->recvmbox, size) != ERR_OK) {
@@ -702,7 +763,6 @@
   conn->callback     = callback;
 #if LWIP_TCP
   conn->current_msg  = NULL;
-  conn->write_offset = 0;
 #endif /* LWIP_TCP */
 #if LWIP_SO_SNDTIMEO
   conn->send_timeout = 0;
@@ -717,7 +777,7 @@
 #if LWIP_SO_LINGER
   conn->linger = -1;
 #endif /* LWIP_SO_LINGER */
-  conn->flags = 0;
+  conn->flags = init_flags;
   return conn;
 free_and_return:
   memp_free(MEMP_NETCONN, conn);
@@ -734,11 +794,17 @@
 netconn_free(struct netconn *conn)
 {
   LWIP_ASSERT("PCB must be deallocated outside this function", conn->pcb.tcp == NULL);
+
+#if LWIP_NETCONN_FULLDUPLEX
+  /* in fullduplex, netconn is drained here */
+  netconn_drain(conn);
+#endif /* LWIP_NETCONN_FULLDUPLEX */
+
   LWIP_ASSERT("recvmbox must be deallocated before calling this function",
-    !sys_mbox_valid(&conn->recvmbox));
+              !sys_mbox_valid(&conn->recvmbox));
 #if LWIP_TCP
   LWIP_ASSERT("acceptmbox must be deallocated before calling this function",
-    !sys_mbox_valid(&conn->acceptmbox));
+              !sys_mbox_valid(&conn->acceptmbox));
 #endif /* LWIP_TCP */
 
 #if !LWIP_NETCONN_SEM_PER_THREAD
@@ -761,29 +827,31 @@
 netconn_drain(struct netconn *conn)
 {
   void *mem;
-#if LWIP_TCP
-  struct pbuf *p;
-#endif /* LWIP_TCP */
 
-  /* This runs in tcpip_thread, so we don't need to lock against rx packets */
+  /* This runs when mbox and netconn are marked as closed,
+     so we don't need to lock against rx packets */
+#if LWIP_NETCONN_FULLDUPLEX
+  LWIP_ASSERT("netconn marked closed", conn->flags & NETCONN_FLAG_MBOXINVALID);
+#endif /* LWIP_NETCONN_FULLDUPLEX */
 
   /* Delete and drain the recvmbox. */
   if (sys_mbox_valid(&conn->recvmbox)) {
     while (sys_mbox_tryfetch(&conn->recvmbox, &mem) != SYS_MBOX_EMPTY) {
-#if LWIP_TCP
-      if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP) {
-        if (mem != NULL) {
-          p = (struct pbuf*)mem;
-          /* pcb might be set to NULL already by err_tcp() */
-          if (conn->pcb.tcp != NULL) {
-            tcp_recved(conn->pcb.tcp, p->tot_len);
-          }
-          pbuf_free(p);
-        }
-      } else
-#endif /* LWIP_TCP */
+#if LWIP_NETCONN_FULLDUPLEX
+      if (!lwip_netconn_is_deallocated_msg(mem))
+#endif /* LWIP_NETCONN_FULLDUPLEX */
       {
-        netbuf_delete((struct netbuf *)mem);
+#if LWIP_TCP
+        if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP) {
+          err_t err;
+          if (!lwip_netconn_is_err_msg(mem, &err)) {
+            pbuf_free((struct pbuf *)mem);
+          }
+        } else
+#endif /* LWIP_TCP */
+        {
+          netbuf_delete((struct netbuf *)mem);
+        }
       }
     }
     sys_mbox_free(&conn->recvmbox);
@@ -794,17 +862,23 @@
 #if LWIP_TCP
   if (sys_mbox_valid(&conn->acceptmbox)) {
     while (sys_mbox_tryfetch(&conn->acceptmbox, &mem) != SYS_MBOX_EMPTY) {
-      if (mem != &netconn_aborted) {
-        struct netconn *newconn = (struct netconn *)mem;
-        /* Only tcp pcbs have an acceptmbox, so no need to check conn->type */
-        /* pcb might be set to NULL already by err_tcp() */
-        /* drain recvmbox */
-        netconn_drain(newconn);
-        if (newconn->pcb.tcp != NULL) {
-          tcp_abort(newconn->pcb.tcp);
-          newconn->pcb.tcp = NULL;
+#if LWIP_NETCONN_FULLDUPLEX
+      if (!lwip_netconn_is_deallocated_msg(mem))
+#endif /* LWIP_NETCONN_FULLDUPLEX */
+      {
+        err_t err;
+        if (!lwip_netconn_is_err_msg(mem, &err)) {
+          struct netconn *newconn = (struct netconn *)mem;
+          /* Only tcp pcbs have an acceptmbox, so no need to check conn->type */
+          /* pcb might be set to NULL already by err_tcp() */
+          /* drain recvmbox */
+          netconn_drain(newconn);
+          if (newconn->pcb.tcp != NULL) {
+            tcp_abort(newconn->pcb.tcp);
+            newconn->pcb.tcp = NULL;
+          }
+          netconn_free(newconn);
         }
-        netconn_free(newconn);
       }
     }
     sys_mbox_free(&conn->acceptmbox);
@@ -813,6 +887,27 @@
 #endif /* LWIP_TCP */
 }
 
+#if LWIP_NETCONN_FULLDUPLEX
+static void
+netconn_mark_mbox_invalid(struct netconn *conn)
+{
+  int i, num_waiting;
+  void *msg = LWIP_CONST_CAST(void *, &netconn_deleted);
+
+  /* Prevent new calls/threads from reading from the mbox */
+  conn->flags |= NETCONN_FLAG_MBOXINVALID;
+
+  SYS_ARCH_LOCKED(num_waiting = conn->mbox_threads_waiting);
+  for (i = 0; i < num_waiting; i++) {
+    if (sys_mbox_valid_val(conn->recvmbox)) {
+      sys_mbox_trypost(&conn->recvmbox, msg);
+    } else {
+      sys_mbox_trypost(&conn->acceptmbox, msg);
+    }
+  }
+}
+#endif /* LWIP_NETCONN_FULLDUPLEX */
+
 #if LWIP_TCP
 /**
  * Internal helper function to close a TCP netconn: since this sometimes
@@ -825,9 +920,9 @@
 lwip_netconn_do_close_internal(struct netconn *conn  WRITE_DELAYED_PARAM)
 {
   err_t err;
-  u8_t shut, shut_rx, shut_tx, close;
+  u8_t shut, shut_rx, shut_tx, shut_close;
   u8_t close_finished = 0;
-  struct tcp_pcb* tpcb;
+  struct tcp_pcb *tpcb;
 #if LWIP_SO_LINGER
   u8_t linger_wait_required = 0;
 #endif /* LWIP_SO_LINGER */
@@ -845,20 +940,20 @@
   /* shutting down both ends is the same as closing
      (also if RD or WR side was shut down before already) */
   if (shut == NETCONN_SHUT_RDWR) {
-    close = 1;
+    shut_close = 1;
   } else if (shut_rx &&
              ((tpcb->state == FIN_WAIT_1) ||
               (tpcb->state == FIN_WAIT_2) ||
               (tpcb->state == CLOSING))) {
-    close = 1;
+    shut_close = 1;
   } else if (shut_tx && ((tpcb->flags & TF_RXCLOSED) != 0)) {
-    close = 1;
+    shut_close = 1;
   } else {
-    close = 0;
+    shut_close = 0;
   }
 
   /* Set back some callback pointers */
-  if (close) {
+  if (shut_close) {
     tcp_arg(tpcb, NULL);
   }
   if (tpcb->state == LISTEN) {
@@ -872,13 +967,13 @@
     if (shut_tx) {
       tcp_sent(tpcb, NULL);
     }
-    if (close) {
+    if (shut_close) {
       tcp_poll(tpcb, NULL, 0);
       tcp_err(tpcb, NULL);
     }
   }
   /* Try to close the connection */
-  if (close) {
+  if (shut_close) {
 #if LWIP_SO_LINGER
     /* check linger possibilites before calling tcp_close */
     err = ERR_OK;
@@ -894,7 +989,7 @@
           /* data left on a nonblocking netconn -> cannot linger */
           err = ERR_WOULDBLOCK;
         } else if ((s32_t)(sys_now() - conn->current_msg->msg.sd.time_started) >=
-          (conn->linger * 1000)) {
+                   (conn->linger * 1000)) {
           /* data left but linger timeout has expired (this happens on further
              calls to this function through poll_tcp */
           tcp_abort(tpcb);
@@ -947,7 +1042,7 @@
       if (conn->current_msg->msg.sd.polls_left == 0) {
 #endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
         close_finished = 1;
-        if (close) {
+        if (shut_close) {
           /* in this case, we want to RST the connection */
           tcp_abort(tpcb);
           err = ERR_OK;
@@ -960,12 +1055,12 @@
   }
   if (close_finished) {
     /* Closing done (succeeded, non-memory error, nonblocking error or timeout) */
-    sys_sem_t* op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg);
+    sys_sem_t *op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg);
     conn->current_msg->err = err;
     conn->current_msg = NULL;
     conn->state = NETCONN_NONE;
     if (err == ERR_OK) {
-      if (close) {
+      if (shut_close) {
         /* Set back some callback pointers as conn is going away */
         conn->pcb.tcp = NULL;
         /* Trigger select() in socket layer. Make sure everybody notices activity
@@ -979,7 +1074,6 @@
         API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0);
       }
     }
-    NETCONN_SET_SAFE_ERR(conn, err);
 #if LWIP_TCPIP_CORE_LOCKING
     if (delayed)
 #endif
@@ -1013,30 +1107,28 @@
  * Delete the pcb inside a netconn.
  * Called from netconn_delete.
  *
- * @param m the api_msg_msg pointing to the connection
+ * @param m the api_msg pointing to the connection
  */
 void
 lwip_netconn_do_delconn(void *m)
 {
-  struct api_msg *msg = (struct api_msg*)m;
+  struct api_msg *msg = (struct api_msg *)m;
 
   enum netconn_state state = msg->conn->state;
   LWIP_ASSERT("netconn state error", /* this only happens for TCP netconns */
-    (state == NETCONN_NONE) || (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP));
+              (state == NETCONN_NONE) || (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP));
 #if LWIP_NETCONN_FULLDUPLEX
   /* In full duplex mode, blocking write/connect is aborted with ERR_CLSD */
   if (state != NETCONN_NONE) {
     if ((state == NETCONN_WRITE) ||
         ((state == NETCONN_CONNECT) && !IN_NONBLOCKING_CONNECT(msg->conn))) {
       /* close requested, abort running write/connect */
-      sys_sem_t* op_completed_sem;
+      sys_sem_t *op_completed_sem;
       LWIP_ASSERT("msg->conn->current_msg != NULL", msg->conn->current_msg != NULL);
       op_completed_sem = LWIP_API_MSG_SEM(msg->conn->current_msg);
       msg->conn->current_msg->err = ERR_CLSD;
       msg->conn->current_msg = NULL;
-      msg->conn->write_offset = 0;
       msg->conn->state = NETCONN_NONE;
-      NETCONN_SET_SAFE_ERR(msg->conn, ERR_CLSD);
       sys_sem_signal(op_completed_sem);
     }
   }
@@ -1052,49 +1144,52 @@
 #endif /* LWIP_NETCONN_FULLDUPLEX */
   {
     LWIP_ASSERT("blocking connect in progress",
-      (state != NETCONN_CONNECT) || IN_NONBLOCKING_CONNECT(msg->conn));
+                (state != NETCONN_CONNECT) || IN_NONBLOCKING_CONNECT(msg->conn));
     msg->err = ERR_OK;
-    /* Drain and delete mboxes */
+#if LWIP_NETCONN_FULLDUPLEX
+    /* Mark mboxes invalid */
+    netconn_mark_mbox_invalid(msg->conn);
+#else /* LWIP_NETCONN_FULLDUPLEX */
     netconn_drain(msg->conn);
+#endif /* LWIP_NETCONN_FULLDUPLEX */
 
     if (msg->conn->pcb.tcp != NULL) {
 
       switch (NETCONNTYPE_GROUP(msg->conn->type)) {
 #if LWIP_RAW
-      case NETCONN_RAW:
-        raw_remove(msg->conn->pcb.raw);
-        break;
+        case NETCONN_RAW:
+          raw_remove(msg->conn->pcb.raw);
+          break;
 #endif /* LWIP_RAW */
 #if LWIP_UDP
-      case NETCONN_UDP:
-        msg->conn->pcb.udp->recv_arg = NULL;
-        udp_remove(msg->conn->pcb.udp);
-        break;
+        case NETCONN_UDP:
+          msg->conn->pcb.udp->recv_arg = NULL;
+          udp_remove(msg->conn->pcb.udp);
+          break;
 #endif /* LWIP_UDP */
 #if LWIP_TCP
-      case NETCONN_TCP:
-        LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL &&
-          msg->conn->write_offset == 0);
-        msg->conn->state = NETCONN_CLOSE;
-        msg->msg.sd.shut = NETCONN_SHUT_RDWR;
-        msg->conn->current_msg = msg;
+        case NETCONN_TCP:
+          LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL);
+          msg->conn->state = NETCONN_CLOSE;
+          msg->msg.sd.shut = NETCONN_SHUT_RDWR;
+          msg->conn->current_msg = msg;
 #if LWIP_TCPIP_CORE_LOCKING
-        if (lwip_netconn_do_close_internal(msg->conn, 0) != ERR_OK) {
-          LWIP_ASSERT("state!", msg->conn->state == NETCONN_CLOSE);
-          UNLOCK_TCPIP_CORE();
-          sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0);
-          LOCK_TCPIP_CORE();
-          LWIP_ASSERT("state!", msg->conn->state == NETCONN_NONE);
-        }
+          if (lwip_netconn_do_close_internal(msg->conn, 0) != ERR_OK) {
+            LWIP_ASSERT("state!", msg->conn->state == NETCONN_CLOSE);
+            UNLOCK_TCPIP_CORE();
+            sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0);
+            LOCK_TCPIP_CORE();
+            LWIP_ASSERT("state!", msg->conn->state == NETCONN_NONE);
+          }
 #else /* LWIP_TCPIP_CORE_LOCKING */
-        lwip_netconn_do_close_internal(msg->conn);
+          lwip_netconn_do_close_internal(msg->conn);
 #endif /* LWIP_TCPIP_CORE_LOCKING */
-        /* API_EVENT is called inside lwip_netconn_do_close_internal, before releasing
-           the application thread, so we can return at this point! */
-        return;
+          /* API_EVENT is called inside lwip_netconn_do_close_internal, before releasing
+             the application thread, so we can return at this point! */
+          return;
 #endif /* LWIP_TCP */
-      default:
-        break;
+        default:
+          break;
       }
       msg->conn->pcb.tcp = NULL;
     }
@@ -1114,40 +1209,84 @@
  * Bind a pcb contained in a netconn
  * Called from netconn_bind.
  *
- * @param m the api_msg_msg pointing to the connection and containing
+ * @param m the api_msg pointing to the connection and containing
  *          the IP address and port to bind to
  */
 void
 lwip_netconn_do_bind(void *m)
 {
-  struct api_msg *msg = (struct api_msg*)m;
+  struct api_msg *msg = (struct api_msg *)m;
+  err_t err;
 
-  if (ERR_IS_FATAL(msg->conn->last_err)) {
-    msg->err = msg->conn->last_err;
-  } else {
-    msg->err = ERR_VAL;
-    if (msg->conn->pcb.tcp != NULL) {
-      switch (NETCONNTYPE_GROUP(msg->conn->type)) {
+  if (msg->conn->pcb.tcp != NULL) {
+    switch (NETCONNTYPE_GROUP(msg->conn->type)) {
 #if LWIP_RAW
       case NETCONN_RAW:
-        msg->err = raw_bind(msg->conn->pcb.raw, API_EXPR_REF(msg->msg.bc.ipaddr));
+        err = raw_bind(msg->conn->pcb.raw, API_EXPR_REF(msg->msg.bc.ipaddr));
         break;
 #endif /* LWIP_RAW */
 #if LWIP_UDP
       case NETCONN_UDP:
-        msg->err = udp_bind(msg->conn->pcb.udp, API_EXPR_REF(msg->msg.bc.ipaddr), msg->msg.bc.port);
+        err = udp_bind(msg->conn->pcb.udp, API_EXPR_REF(msg->msg.bc.ipaddr), msg->msg.bc.port);
         break;
 #endif /* LWIP_UDP */
 #if LWIP_TCP
       case NETCONN_TCP:
-        msg->err = tcp_bind(msg->conn->pcb.tcp, API_EXPR_REF(msg->msg.bc.ipaddr), msg->msg.bc.port);
+        err = tcp_bind(msg->conn->pcb.tcp, API_EXPR_REF(msg->msg.bc.ipaddr), msg->msg.bc.port);
         break;
 #endif /* LWIP_TCP */
       default:
+        err = ERR_VAL;
         break;
-      }
     }
+  } else {
+    err = ERR_VAL;
   }
+  msg->err = err;
+  TCPIP_APIMSG_ACK(msg);
+}
+/**
+ * Bind a pcb contained in a netconn to an interface
+ * Called from netconn_bind_if.
+ *
+ * @param m the api_msg pointing to the connection and containing
+ *          the IP address and port to bind to
+ */
+void
+lwip_netconn_do_bind_if(void *m)
+{
+  struct netif *netif;
+  struct api_msg *msg = (struct api_msg *)m;
+  err_t err;
+
+  netif = netif_get_by_index(msg->msg.bc.if_idx);
+
+  if ((netif != NULL) && (msg->conn->pcb.tcp != NULL)) {
+    err = ERR_OK;
+    switch (NETCONNTYPE_GROUP(msg->conn->type)) {
+#if LWIP_RAW
+      case NETCONN_RAW:
+        raw_bind_netif(msg->conn->pcb.raw, netif);
+        break;
+#endif /* LWIP_RAW */
+#if LWIP_UDP
+      case NETCONN_UDP:
+        udp_bind_netif(msg->conn->pcb.udp, netif);
+        break;
+#endif /* LWIP_UDP */
+#if LWIP_TCP
+      case NETCONN_TCP:
+        tcp_bind_netif(msg->conn->pcb.tcp, netif);
+        break;
+#endif /* LWIP_TCP */
+      default:
+        err = ERR_VAL;
+        break;
+    }
+  } else {
+    err = ERR_VAL;
+  }
+  msg->err = err;
   TCPIP_APIMSG_ACK(msg);
 }
 
@@ -1163,7 +1302,7 @@
 {
   struct netconn *conn;
   int was_blocking;
-  sys_sem_t* op_completed_sem = NULL;
+  sys_sem_t *op_completed_sem = NULL;
 
   LWIP_UNUSED_ARG(pcb);
 
@@ -1175,7 +1314,7 @@
 
   LWIP_ASSERT("conn->state == NETCONN_CONNECT", conn->state == NETCONN_CONNECT);
   LWIP_ASSERT("(conn->current_msg != NULL) || conn->in_non_blocking_connect",
-    (conn->current_msg != NULL) || IN_NONBLOCKING_CONNECT(conn));
+              (conn->current_msg != NULL) || IN_NONBLOCKING_CONNECT(conn));
 
   if (conn->current_msg != NULL) {
     conn->current_msg->err = err;
@@ -1187,11 +1326,10 @@
   was_blocking = !IN_NONBLOCKING_CONNECT(conn);
   SET_NONBLOCKING_CONNECT(conn, 0);
   LWIP_ASSERT("blocking connect state error",
-    (was_blocking && op_completed_sem != NULL) ||
-    (!was_blocking && op_completed_sem == NULL));
+              (was_blocking && op_completed_sem != NULL) ||
+              (!was_blocking && op_completed_sem == NULL));
   conn->current_msg = NULL;
   conn->state = NETCONN_NONE;
-  NETCONN_SET_SAFE_ERR(conn, ERR_OK);
   API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0);
 
   if (was_blocking) {
@@ -1205,69 +1343,73 @@
  * Connect a pcb contained inside a netconn
  * Called from netconn_connect.
  *
- * @param m the api_msg_msg pointing to the connection and containing
+ * @param m the api_msg pointing to the connection and containing
  *          the IP address and port to connect to
  */
 void
 lwip_netconn_do_connect(void *m)
 {
-  struct api_msg *msg = (struct api_msg*)m;
+  struct api_msg *msg = (struct api_msg *)m;
+  err_t err;
 
   if (msg->conn->pcb.tcp == NULL) {
     /* This may happen when calling netconn_connect() a second time */
-    msg->err = ERR_CLSD;
+    err = ERR_CLSD;
   } else {
     switch (NETCONNTYPE_GROUP(msg->conn->type)) {
 #if LWIP_RAW
-    case NETCONN_RAW:
-      msg->err = raw_connect(msg->conn->pcb.raw, API_EXPR_REF(msg->msg.bc.ipaddr));
-      break;
+      case NETCONN_RAW:
+        err = raw_connect(msg->conn->pcb.raw, API_EXPR_REF(msg->msg.bc.ipaddr));
+        break;
 #endif /* LWIP_RAW */
 #if LWIP_UDP
-    case NETCONN_UDP:
-      msg->err = udp_connect(msg->conn->pcb.udp, API_EXPR_REF(msg->msg.bc.ipaddr), msg->msg.bc.port);
-      break;
+      case NETCONN_UDP:
+        err = udp_connect(msg->conn->pcb.udp, API_EXPR_REF(msg->msg.bc.ipaddr), msg->msg.bc.port);
+        break;
 #endif /* LWIP_UDP */
 #if LWIP_TCP
-    case NETCONN_TCP:
-      /* Prevent connect while doing any other action. */
-      if (msg->conn->state == NETCONN_CONNECT) {
-        msg->err = ERR_ALREADY;
-      } else if (msg->conn->state != NETCONN_NONE) {
-        msg->err = ERR_ISCONN;
-      } else {
-        setup_tcp(msg->conn);
-        msg->err = tcp_connect(msg->conn->pcb.tcp, API_EXPR_REF(msg->msg.bc.ipaddr),
-          msg->msg.bc.port, lwip_netconn_do_connected);
-        if (msg->err == ERR_OK) {
-          u8_t non_blocking = netconn_is_nonblocking(msg->conn);
-          msg->conn->state = NETCONN_CONNECT;
-          SET_NONBLOCKING_CONNECT(msg->conn, non_blocking);
-          if (non_blocking) {
-            msg->err = ERR_INPROGRESS;
-          } else {
-            msg->conn->current_msg = msg;
-            /* sys_sem_signal() is called from lwip_netconn_do_connected (or err_tcp()),
-               when the connection is established! */
+      case NETCONN_TCP:
+        /* Prevent connect while doing any other action. */
+        if (msg->conn->state == NETCONN_CONNECT) {
+          err = ERR_ALREADY;
+        } else if (msg->conn->state != NETCONN_NONE) {
+          err = ERR_ISCONN;
+        } else {
+          setup_tcp(msg->conn);
+          err = tcp_connect(msg->conn->pcb.tcp, API_EXPR_REF(msg->msg.bc.ipaddr),
+                            msg->msg.bc.port, lwip_netconn_do_connected);
+          if (err == ERR_OK) {
+            u8_t non_blocking = netconn_is_nonblocking(msg->conn);
+            msg->conn->state = NETCONN_CONNECT;
+            SET_NONBLOCKING_CONNECT(msg->conn, non_blocking);
+            if (non_blocking) {
+              err = ERR_INPROGRESS;
+            } else {
+              msg->conn->current_msg = msg;
+              /* sys_sem_signal() is called from lwip_netconn_do_connected (or err_tcp()),
+                 when the connection is established! */
 #if LWIP_TCPIP_CORE_LOCKING
-            LWIP_ASSERT("state!", msg->conn->state == NETCONN_CONNECT);
-            UNLOCK_TCPIP_CORE();
-            sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0);
-            LOCK_TCPIP_CORE();
-            LWIP_ASSERT("state!", msg->conn->state != NETCONN_CONNECT);
+              LWIP_ASSERT("state!", msg->conn->state == NETCONN_CONNECT);
+              UNLOCK_TCPIP_CORE();
+              sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0);
+              LOCK_TCPIP_CORE();
+              LWIP_ASSERT("state!", msg->conn->state != NETCONN_CONNECT);
 #endif /* LWIP_TCPIP_CORE_LOCKING */
-            return;
+              return;
+            }
           }
         }
-      }
-      break;
+        break;
 #endif /* LWIP_TCP */
-    default:
-      LWIP_ERROR("Invalid netconn type", 0, do{ msg->err = ERR_VAL; }while(0));
-      break;
+      default:
+        LWIP_ERROR("Invalid netconn type", 0, do {
+          err = ERR_VAL;
+        } while (0));
+        break;
     }
   }
-  /* For all other protocols, netconn_connect() calls TCPIP_APIMSG(),
+  msg->err = err;
+  /* For all other protocols, netconn_connect() calls netconn_apimsg(),
      so use TCPIP_APIMSG_ACK() here. */
   TCPIP_APIMSG_ACK(msg);
 }
@@ -1277,12 +1419,12 @@
  * Only used for UDP netconns.
  * Called from netconn_disconnect.
  *
- * @param m the api_msg_msg pointing to the connection to disconnect
+ * @param m the api_msg pointing to the connection to disconnect
  */
 void
 lwip_netconn_do_disconnect(void *m)
 {
-  struct api_msg *msg = (struct api_msg*)m;
+  struct api_msg *msg = (struct api_msg *)m;
 
 #if LWIP_UDP
   if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_UDP) {
@@ -1301,82 +1443,81 @@
  * Set a TCP pcb contained in a netconn into listen mode
  * Called from netconn_listen.
  *
- * @param m the api_msg_msg pointing to the connection
+ * @param m the api_msg pointing to the connection
  */
 void
 lwip_netconn_do_listen(void *m)
 {
-  struct api_msg *msg = (struct api_msg*)m;
+  struct api_msg *msg = (struct api_msg *)m;
+  err_t err;
 
-  if (ERR_IS_FATAL(msg->conn->last_err)) {
-    msg->err = msg->conn->last_err;
-  } else {
-    msg->err = ERR_CONN;
-    if (msg->conn->pcb.tcp != NULL) {
-      if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) {
-        if (msg->conn->state == NETCONN_NONE) {
-          struct tcp_pcb* lpcb;
-          if (msg->conn->pcb.tcp->state != CLOSED) {
-            /* connection is not closed, cannot listen */
-            msg->err = ERR_VAL;
-          } else {
-            err_t err;
-            u8_t backlog;
+  if (msg->conn->pcb.tcp != NULL) {
+    if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) {
+      if (msg->conn->state == NETCONN_NONE) {
+        struct tcp_pcb *lpcb;
+        if (msg->conn->pcb.tcp->state != CLOSED) {
+          /* connection is not closed, cannot listen */
+          err = ERR_VAL;
+        } else {
+          u8_t backlog;
 #if TCP_LISTEN_BACKLOG
-            backlog = msg->msg.lb.backlog;
+          backlog = msg->msg.lb.backlog;
 #else  /* TCP_LISTEN_BACKLOG */
-            backlog = TCP_DEFAULT_LISTEN_BACKLOG;
+          backlog = TCP_DEFAULT_LISTEN_BACKLOG;
 #endif /* TCP_LISTEN_BACKLOG */
 #if LWIP_IPV4 && LWIP_IPV6
-            /* "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) &&
-                (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);
-              IP_SET_TYPE_VAL(msg->conn->pcb.tcp->remote_ip, IPADDR_TYPE_ANY);
-            }
+          /* "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) &&
+              (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);
+            IP_SET_TYPE_VAL(msg->conn->pcb.tcp->remote_ip, IPADDR_TYPE_ANY);
+          }
 #endif /* LWIP_IPV4 && LWIP_IPV6 */
 
-            lpcb = tcp_listen_with_backlog_and_err(msg->conn->pcb.tcp, backlog, &err);
+          lpcb = tcp_listen_with_backlog_and_err(msg->conn->pcb.tcp, backlog, &err);
 
-            if (lpcb == NULL) {
-              /* in this case, the old pcb is still allocated */
-              msg->err = err;
+          if (lpcb == NULL) {
+            /* in this case, the old pcb is still allocated */
+          } else {
+            /* delete the recvmbox and allocate the acceptmbox */
+            if (sys_mbox_valid(&msg->conn->recvmbox)) {
+              /** @todo: should we drain the recvmbox here? */
+              sys_mbox_free(&msg->conn->recvmbox);
+              sys_mbox_set_invalid(&msg->conn->recvmbox);
+            }
+            err = ERR_OK;
+            if (!sys_mbox_valid(&msg->conn->acceptmbox)) {
+              err = sys_mbox_new(&msg->conn->acceptmbox, DEFAULT_ACCEPTMBOX_SIZE);
+            }
+            if (err == ERR_OK) {
+              msg->conn->state = NETCONN_LISTEN;
+              msg->conn->pcb.tcp = lpcb;
+              tcp_arg(msg->conn->pcb.tcp, msg->conn);
+              tcp_accept(msg->conn->pcb.tcp, accept_function);
             } else {
-              /* delete the recvmbox and allocate the acceptmbox */
-              if (sys_mbox_valid(&msg->conn->recvmbox)) {
-                /** @todo: should we drain the recvmbox here? */
-                sys_mbox_free(&msg->conn->recvmbox);
-                sys_mbox_set_invalid(&msg->conn->recvmbox);
-              }
-              msg->err = ERR_OK;
-              if (!sys_mbox_valid(&msg->conn->acceptmbox)) {
-                msg->err = sys_mbox_new(&msg->conn->acceptmbox, DEFAULT_ACCEPTMBOX_SIZE);
-              }
-              if (msg->err == ERR_OK) {
-                msg->conn->state = NETCONN_LISTEN;
-                msg->conn->pcb.tcp = lpcb;
-                tcp_arg(msg->conn->pcb.tcp, msg->conn);
-                tcp_accept(msg->conn->pcb.tcp, accept_function);
-              } else {
-                /* since the old pcb is already deallocated, free lpcb now */
-                tcp_close(lpcb);
-                msg->conn->pcb.tcp = NULL;
-              }
+              /* since the old pcb is already deallocated, free lpcb now */
+              tcp_close(lpcb);
+              msg->conn->pcb.tcp = NULL;
             }
           }
-        } else if (msg->conn->state == NETCONN_LISTEN) {
-          /* already listening, allow updating of the backlog */
-          msg->err = ERR_OK;
-          tcp_backlog_set(msg->conn->pcb.tcp, msg->msg.lb.backlog);
         }
+      } else if (msg->conn->state == NETCONN_LISTEN) {
+        /* already listening, allow updating of the backlog */
+        err = ERR_OK;
+        tcp_backlog_set(msg->conn->pcb.tcp, msg->msg.lb.backlog);
       } else {
-        msg->err = ERR_ARG;
+        err = ERR_CONN;
       }
+    } else {
+      err = ERR_ARG;
     }
+  } else {
+    err = ERR_CONN;
   }
+  msg->err = err;
   TCPIP_APIMSG_ACK(msg);
 }
 #endif /* LWIP_TCP */
@@ -1385,53 +1526,55 @@
  * Send some data on a RAW or UDP pcb contained in a netconn
  * Called from netconn_send
  *
- * @param m the api_msg_msg pointing to the connection
+ * @param m the api_msg pointing to the connection
  */
 void
 lwip_netconn_do_send(void *m)
 {
-  struct api_msg *msg = (struct api_msg*)m;
+  struct api_msg *msg = (struct api_msg *)m;
 
-  if (ERR_IS_FATAL(msg->conn->last_err)) {
-    msg->err = msg->conn->last_err;
-  } else {
-    msg->err = ERR_CONN;
+  err_t err = netconn_err(msg->conn);
+  if (err == ERR_OK) {
     if (msg->conn->pcb.tcp != NULL) {
       switch (NETCONNTYPE_GROUP(msg->conn->type)) {
 #if LWIP_RAW
-      case NETCONN_RAW:
-        if (ip_addr_isany(&msg->msg.b->addr) || IP_IS_ANY_TYPE_VAL(msg->msg.b->addr)) {
-          msg->err = raw_send(msg->conn->pcb.raw, msg->msg.b->p);
-        } else {
-          msg->err = raw_sendto(msg->conn->pcb.raw, msg->msg.b->p, &msg->msg.b->addr);
-        }
-        break;
+        case NETCONN_RAW:
+          if (ip_addr_isany(&msg->msg.b->addr) || IP_IS_ANY_TYPE_VAL(msg->msg.b->addr)) {
+            err = raw_send(msg->conn->pcb.raw, msg->msg.b->p);
+          } else {
+            err = raw_sendto(msg->conn->pcb.raw, msg->msg.b->p, &msg->msg.b->addr);
+          }
+          break;
 #endif
 #if LWIP_UDP
-      case NETCONN_UDP:
+        case NETCONN_UDP:
 #if LWIP_CHECKSUM_ON_COPY
-        if (ip_addr_isany(&msg->msg.b->addr) || IP_IS_ANY_TYPE_VAL(msg->msg.b->addr)) {
-          msg->err = udp_send_chksum(msg->conn->pcb.udp, msg->msg.b->p,
-            msg->msg.b->flags & NETBUF_FLAG_CHKSUM, msg->msg.b->toport_chksum);
-        } else {
-          msg->err = udp_sendto_chksum(msg->conn->pcb.udp, msg->msg.b->p,
-            &msg->msg.b->addr, msg->msg.b->port,
-            msg->msg.b->flags & NETBUF_FLAG_CHKSUM, msg->msg.b->toport_chksum);
-        }
+          if (ip_addr_isany(&msg->msg.b->addr) || IP_IS_ANY_TYPE_VAL(msg->msg.b->addr)) {
+            err = udp_send_chksum(msg->conn->pcb.udp, msg->msg.b->p,
+                                  msg->msg.b->flags & NETBUF_FLAG_CHKSUM, msg->msg.b->toport_chksum);
+          } else {
+            err = udp_sendto_chksum(msg->conn->pcb.udp, msg->msg.b->p,
+                                    &msg->msg.b->addr, msg->msg.b->port,
+                                    msg->msg.b->flags & NETBUF_FLAG_CHKSUM, msg->msg.b->toport_chksum);
+          }
 #else /* LWIP_CHECKSUM_ON_COPY */
-        if (ip_addr_isany_val(msg->msg.b->addr) || IP_IS_ANY_TYPE_VAL(msg->msg.b->addr)) {
-          msg->err = udp_send(msg->conn->pcb.udp, msg->msg.b->p);
-        } else {
-          msg->err = udp_sendto(msg->conn->pcb.udp, msg->msg.b->p, &msg->msg.b->addr, msg->msg.b->port);
-        }
+          if (ip_addr_isany_val(msg->msg.b->addr) || IP_IS_ANY_TYPE_VAL(msg->msg.b->addr)) {
+            err = udp_send(msg->conn->pcb.udp, msg->msg.b->p);
+          } else {
+            err = udp_sendto(msg->conn->pcb.udp, msg->msg.b->p, &msg->msg.b->addr, msg->msg.b->port);
+          }
 #endif /* LWIP_CHECKSUM_ON_COPY */
-        break;
+          break;
 #endif /* LWIP_UDP */
-      default:
-        break;
+        default:
+          err = ERR_CONN;
+          break;
       }
+    } else {
+      err = ERR_CONN;
     }
   }
+  msg->err = err;
   TCPIP_APIMSG_ACK(msg);
 }
 
@@ -1440,19 +1583,19 @@
  * Indicate data has been received from a TCP pcb contained in a netconn
  * Called from netconn_recv
  *
- * @param m the api_msg_msg pointing to the connection
+ * @param m the api_msg pointing to the connection
  */
 void
 lwip_netconn_do_recv(void *m)
 {
-  struct api_msg *msg = (struct api_msg*)m;
+  struct api_msg *msg = (struct api_msg *)m;
 
   msg->err = ERR_OK;
   if (msg->conn->pcb.tcp != NULL) {
     if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) {
-      u32_t remaining = msg->msg.r.len;
+      size_t remaining = msg->msg.r.len;
       do {
-        u16_t recved = (remaining > 0xffff) ? 0xffff : (u16_t)remaining;
+        u16_t recved = (u16_t)((remaining > 0xffff) ? 0xffff : remaining);
         tcp_recved(msg->conn->pcb.tcp, recved);
         remaining -= recved;
       } while (remaining != 0);
@@ -1465,12 +1608,12 @@
 /** Indicate that a TCP pcb has been accepted
  * Called from netconn_accept
  *
- * @param m the api_msg_msg pointing to the connection
+ * @param m the api_msg pointing to the connection
  */
 void
 lwip_netconn_do_accepted(void *m)
 {
-  struct api_msg *msg = (struct api_msg*)m;
+  struct api_msg *msg = (struct api_msg *)m;
 
   msg->err = ERR_OK;
   if (msg->conn->pcb.tcp != NULL) {
@@ -1503,13 +1646,15 @@
   size_t diff;
   u8_t dontblock;
   u8_t apiflags;
+  u8_t write_more;
 
   LWIP_ASSERT("conn != NULL", conn != NULL);
   LWIP_ASSERT("conn->state == NETCONN_WRITE", (conn->state == NETCONN_WRITE));
   LWIP_ASSERT("conn->current_msg != NULL", conn->current_msg != NULL);
   LWIP_ASSERT("conn->pcb.tcp != NULL", conn->pcb.tcp != NULL);
-  LWIP_ASSERT("conn->write_offset < conn->current_msg->msg.w.len",
-    conn->write_offset < conn->current_msg->msg.w.len);
+  LWIP_ASSERT("conn->current_msg->msg.w.offset < conn->current_msg->msg.w.len",
+              conn->current_msg->msg.w.offset < conn->current_msg->msg.w.len);
+  LWIP_ASSERT("conn->current_msg->msg.w.vector_cnt > 0", conn->current_msg->msg.w.vector_cnt > 0);
 
   apiflags = conn->current_msg->msg.w.apiflags;
   dontblock = netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK);
@@ -1518,75 +1663,96 @@
   if ((conn->send_timeout != 0) &&
       ((s32_t)(sys_now() - conn->current_msg->msg.w.time_started) >= conn->send_timeout)) {
     write_finished = 1;
-    if (conn->write_offset == 0) {
+    if (conn->current_msg->msg.w.offset == 0) {
       /* nothing has been written */
       err = ERR_WOULDBLOCK;
-      conn->current_msg->msg.w.len = 0;
     } else {
       /* partial write */
       err = ERR_OK;
-      conn->current_msg->msg.w.len = conn->write_offset;
-      conn->write_offset = 0;
     }
   } else
 #endif /* LWIP_SO_SNDTIMEO */
   {
-    dataptr = (const u8_t*)conn->current_msg->msg.w.dataptr + conn->write_offset;
-    diff = conn->current_msg->msg.w.len - conn->write_offset;
-    if (diff > 0xffffUL) { /* max_u16_t */
-      len = 0xffff;
-      apiflags |= TCP_WRITE_FLAG_MORE;
-    } else {
-      len = (u16_t)diff;
-    }
-    available = tcp_sndbuf(conn->pcb.tcp);
-    if (available < len) {
-      /* don't try to write more than sendbuf */
-      len = available;
-      if (dontblock) {
-        if (!len) {
-          err = ERR_WOULDBLOCK;
-          goto err_mem;
-        }
-      } else {
+    do {
+      dataptr = (const u8_t *)conn->current_msg->msg.w.vector->ptr + conn->current_msg->msg.w.vector_off;
+      diff = conn->current_msg->msg.w.vector->len - conn->current_msg->msg.w.vector_off;
+      if (diff > 0xffffUL) { /* max_u16_t */
+        len = 0xffff;
         apiflags |= TCP_WRITE_FLAG_MORE;
+      } else {
+        len = (u16_t)diff;
       }
-    }
-    LWIP_ASSERT("lwip_netconn_do_writemore: invalid length!", ((conn->write_offset + len) <= conn->current_msg->msg.w.len));
-    err = tcp_write(conn->pcb.tcp, dataptr, len, apiflags);
+      available = tcp_sndbuf(conn->pcb.tcp);
+      if (available < len) {
+        /* don't try to write more than sendbuf */
+        len = available;
+        if (dontblock) {
+          if (!len) {
+            /* set error according to partial write or not */
+            err = (conn->current_msg->msg.w.offset == 0) ? ERR_WOULDBLOCK : ERR_OK;
+            goto err_mem;
+          }
+        } else {
+          apiflags |= TCP_WRITE_FLAG_MORE;
+        }
+      }
+      LWIP_ASSERT("lwip_netconn_do_writemore: invalid length!",
+                  ((conn->current_msg->msg.w.vector_off + len) <= conn->current_msg->msg.w.vector->len));
+      /* we should loop around for more sending in the following cases:
+           1) We couldn't finish the current vector because of 16-bit size limitations.
+              tcp_write() and tcp_sndbuf() both are limited to 16-bit sizes
+           2) We are sending the remainder of the current vector and have more */
+      if ((len == 0xffff && diff > 0xffffUL) ||
+          (len == (u16_t)diff && conn->current_msg->msg.w.vector_cnt > 1)) {
+        write_more = 1;
+        apiflags |= TCP_WRITE_FLAG_MORE;
+      } else {
+        write_more = 0;
+      }
+      err = tcp_write(conn->pcb.tcp, dataptr, len, apiflags);
+      if (err == ERR_OK) {
+        conn->current_msg->msg.w.offset += len;
+        conn->current_msg->msg.w.vector_off += len;
+        /* check if current vector is finished */
+        if (conn->current_msg->msg.w.vector_off == conn->current_msg->msg.w.vector->len) {
+          conn->current_msg->msg.w.vector_cnt--;
+          /* if we have additional vectors, move on to them */
+          if (conn->current_msg->msg.w.vector_cnt > 0) {
+            conn->current_msg->msg.w.vector++;
+            conn->current_msg->msg.w.vector_off = 0;
+          }
+        }
+      }
+    } while (write_more && err == ERR_OK);
     /* if OK or memory error, check available space */
     if ((err == ERR_OK) || (err == ERR_MEM)) {
 err_mem:
-      if (dontblock && (len < conn->current_msg->msg.w.len)) {
+      if (dontblock && (conn->current_msg->msg.w.offset < conn->current_msg->msg.w.len)) {
         /* non-blocking write did not write everything: mark the pcb non-writable
            and let poll_tcp check writable space to mark the pcb writable again */
-        API_EVENT(conn, NETCONN_EVT_SENDMINUS, len);
+        API_EVENT(conn, NETCONN_EVT_SENDMINUS, 0);
         conn->flags |= NETCONN_FLAG_CHECK_WRITESPACE;
       } else if ((tcp_sndbuf(conn->pcb.tcp) <= TCP_SNDLOWAT) ||
                  (tcp_sndqueuelen(conn->pcb.tcp) >= TCP_SNDQUEUELOWAT)) {
         /* The queued byte- or pbuf-count exceeds the configured low-water limit,
            let select mark this pcb as non-writable. */
-        API_EVENT(conn, NETCONN_EVT_SENDMINUS, len);
+        API_EVENT(conn, NETCONN_EVT_SENDMINUS, 0);
       }
     }
 
     if (err == ERR_OK) {
       err_t out_err;
-      conn->write_offset += len;
-      if ((conn->write_offset == conn->current_msg->msg.w.len) || dontblock) {
-        /* return sent length */
-        conn->current_msg->msg.w.len = conn->write_offset;
-        /* everything was written */
+      if ((conn->current_msg->msg.w.offset == conn->current_msg->msg.w.len) || dontblock) {
+        /* return sent length (caller reads length from msg.w.offset) */
         write_finished = 1;
       }
       out_err = tcp_output(conn->pcb.tcp);
-      if (ERR_IS_FATAL(out_err) || (out_err == ERR_RTE)) {
-        /* If tcp_output fails with fatal error or no route is found,
+      if (out_err == ERR_RTE) {
+        /* If tcp_output fails because no route is found,
            don't try writing any more but return the error
            to the application thread. */
         err = out_err;
         write_finished = 1;
-        conn->current_msg->msg.w.len = 0;
       }
     } else if (err == ERR_MEM) {
       /* If ERR_MEM, we wait for sent_tcp or poll_tcp to be called.
@@ -1596,35 +1762,31 @@
 
       /* tcp_write returned ERR_MEM, try tcp_output anyway */
       err_t out_err = tcp_output(conn->pcb.tcp);
-      if (ERR_IS_FATAL(out_err) || (out_err == ERR_RTE)) {
-        /* If tcp_output fails with fatal error or no route is found,
+      if (out_err == ERR_RTE) {
+        /* If tcp_output fails because no route is found,
            don't try writing any more but return the error
            to the application thread. */
         err = out_err;
         write_finished = 1;
-        conn->current_msg->msg.w.len = 0;
       } else if (dontblock) {
-        /* non-blocking write is done on ERR_MEM */
-        err = ERR_WOULDBLOCK;
+        /* non-blocking write is done on ERR_MEM, set error according
+           to partial write or not */
+        err = (conn->current_msg->msg.w.offset == 0) ? ERR_WOULDBLOCK : ERR_OK;
         write_finished = 1;
-        conn->current_msg->msg.w.len = 0;
       }
     } else {
       /* On errors != ERR_MEM, we don't try writing any more but return
          the error to the application thread. */
       write_finished = 1;
-      conn->current_msg->msg.w.len = 0;
     }
   }
   if (write_finished) {
     /* everything was written: set back connection state
        and back to application task */
-    sys_sem_t* op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg);
+    sys_sem_t *op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg);
     conn->current_msg->err = err;
     conn->current_msg = NULL;
-    conn->write_offset = 0;
     conn->state = NETCONN_NONE;
-    NETCONN_SET_SAFE_ERR(conn, err);
 #if LWIP_TCPIP_CORE_LOCKING
     if (delayed)
 #endif
@@ -1645,29 +1807,26 @@
  * Send some data on a TCP pcb contained in a netconn
  * Called from netconn_write
  *
- * @param m the api_msg_msg pointing to the connection
+ * @param m the api_msg pointing to the connection
  */
 void
 lwip_netconn_do_write(void *m)
 {
-  struct api_msg *msg = (struct api_msg*)m;
+  struct api_msg *msg = (struct api_msg *)m;
 
-  if (ERR_IS_FATAL(msg->conn->last_err)) {
-    msg->err = msg->conn->last_err;
-  } else {
+  err_t err = netconn_err(msg->conn);
+  if (err == ERR_OK) {
     if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) {
 #if LWIP_TCP
       if (msg->conn->state != NETCONN_NONE) {
         /* netconn is connecting, closing or in blocking write */
-        msg->err = ERR_INPROGRESS;
+        err = ERR_INPROGRESS;
       } else if (msg->conn->pcb.tcp != NULL) {
         msg->conn->state = NETCONN_WRITE;
         /* set all the variables used by lwip_netconn_do_writemore */
-        LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL &&
-          msg->conn->write_offset == 0);
+        LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL);
         LWIP_ASSERT("msg->msg.w.len != 0", msg->msg.w.len != 0);
         msg->conn->current_msg = msg;
-        msg->conn->write_offset = 0;
 #if LWIP_TCPIP_CORE_LOCKING
         if (lwip_netconn_do_writemore(msg->conn, 0) != ERR_OK) {
           LWIP_ASSERT("state!", msg->conn->state == NETCONN_WRITE);
@@ -1683,17 +1842,18 @@
            since lwip_netconn_do_writemore ACKs it! */
         return;
       } else {
-        msg->err = ERR_CONN;
+        err = ERR_CONN;
       }
 #else /* LWIP_TCP */
-      msg->err = ERR_VAL;
+      err = ERR_VAL;
 #endif /* LWIP_TCP */
 #if (LWIP_UDP || LWIP_RAW)
     } else {
-      msg->err = ERR_VAL;
+      err = ERR_VAL;
 #endif /* (LWIP_UDP || LWIP_RAW) */
     }
   }
+  msg->err = err;
   TCPIP_APIMSG_ACK(msg);
 }
 
@@ -1701,61 +1861,61 @@
  * Return a connection's local or remote address
  * Called from netconn_getaddr
  *
- * @param m the api_msg_msg pointing to the connection
+ * @param m the api_msg pointing to the connection
  */
 void
 lwip_netconn_do_getaddr(void *m)
 {
-  struct api_msg *msg = (struct api_msg*)m;
+  struct api_msg *msg = (struct api_msg *)m;
 
   if (msg->conn->pcb.ip != NULL) {
     if (msg->msg.ad.local) {
       ip_addr_copy(API_EXPR_DEREF(msg->msg.ad.ipaddr),
-        msg->conn->pcb.ip->local_ip);
+                   msg->conn->pcb.ip->local_ip);
     } else {
       ip_addr_copy(API_EXPR_DEREF(msg->msg.ad.ipaddr),
-        msg->conn->pcb.ip->remote_ip);
+                   msg->conn->pcb.ip->remote_ip);
     }
 
     msg->err = ERR_OK;
     switch (NETCONNTYPE_GROUP(msg->conn->type)) {
 #if LWIP_RAW
-    case NETCONN_RAW:
-      if (msg->msg.ad.local) {
-        API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.raw->protocol;
-      } else {
-        /* return an error as connecting is only a helper for upper layers */
-        msg->err = ERR_CONN;
-      }
-      break;
+      case NETCONN_RAW:
+        if (msg->msg.ad.local) {
+          API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.raw->protocol;
+        } else {
+          /* return an error as connecting is only a helper for upper layers */
+          msg->err = ERR_CONN;
+        }
+        break;
 #endif /* LWIP_RAW */
 #if LWIP_UDP
-    case NETCONN_UDP:
-      if (msg->msg.ad.local) {
-        API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.udp->local_port;
-      } else {
-        if ((msg->conn->pcb.udp->flags & UDP_FLAGS_CONNECTED) == 0) {
-          msg->err = ERR_CONN;
+      case NETCONN_UDP:
+        if (msg->msg.ad.local) {
+          API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.udp->local_port;
         } else {
-          API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.udp->remote_port;
+          if ((msg->conn->pcb.udp->flags & UDP_FLAGS_CONNECTED) == 0) {
+            msg->err = ERR_CONN;
+          } else {
+            API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.udp->remote_port;
+          }
         }
-      }
-      break;
+        break;
 #endif /* LWIP_UDP */
 #if LWIP_TCP
-    case NETCONN_TCP:
-      if ((msg->msg.ad.local == 0) &&
-          ((msg->conn->pcb.tcp->state == CLOSED) || (msg->conn->pcb.tcp->state == LISTEN))) {
-        /* pcb is not connected and remote name is requested */
-        msg->err = ERR_CONN;
-      } else {
-        API_EXPR_DEREF(msg->msg.ad.port) = (msg->msg.ad.local ? msg->conn->pcb.tcp->local_port : msg->conn->pcb.tcp->remote_port);
-      }
-      break;
+      case NETCONN_TCP:
+        if ((msg->msg.ad.local == 0) &&
+            ((msg->conn->pcb.tcp->state == CLOSED) || (msg->conn->pcb.tcp->state == LISTEN))) {
+          /* pcb is not connected and remote name is requested */
+          msg->err = ERR_CONN;
+        } else {
+          API_EXPR_DEREF(msg->msg.ad.port) = (msg->msg.ad.local ? msg->conn->pcb.tcp->local_port : msg->conn->pcb.tcp->remote_port);
+        }
+        break;
 #endif /* LWIP_TCP */
-    default:
-      LWIP_ASSERT("invalid netconn_type", 0);
-      break;
+      default:
+        LWIP_ASSERT("invalid netconn_type", 0);
+        break;
     }
   } else {
     msg->err = ERR_CONN;
@@ -1768,12 +1928,12 @@
  * Called from netconn_close
  * In contrast to closing sockets, the netconn is not deallocated.
  *
- * @param m the api_msg_msg pointing to the connection
+ * @param m the api_msg pointing to the connection
  */
 void
 lwip_netconn_do_close(void *m)
 {
-  struct api_msg *msg = (struct api_msg*)m;
+  struct api_msg *msg = (struct api_msg *)m;
 
 #if LWIP_TCP
   enum netconn_state state = msg->conn->state;
@@ -1790,15 +1950,13 @@
 #if LWIP_NETCONN_FULLDUPLEX
       if (msg->msg.sd.shut & NETCONN_SHUT_WR) {
         /* close requested, abort running write */
-        sys_sem_t* write_completed_sem;
+        sys_sem_t *write_completed_sem;
         LWIP_ASSERT("msg->conn->current_msg != NULL", msg->conn->current_msg != NULL);
         write_completed_sem = LWIP_API_MSG_SEM(msg->conn->current_msg);
         msg->conn->current_msg->err = ERR_CLSD;
         msg->conn->current_msg = NULL;
-        msg->conn->write_offset = 0;
         msg->conn->state = NETCONN_NONE;
         state = NETCONN_NONE;
-        NETCONN_SET_SAFE_ERR(msg->conn, ERR_CLSD);
         sys_sem_signal(write_completed_sem);
       } else {
         LWIP_ASSERT("msg->msg.sd.shut == NETCONN_SHUT_RD", msg->msg.sd.shut == NETCONN_SHUT_RD);
@@ -1813,11 +1971,14 @@
     } else {
 #endif /* LWIP_NETCONN_FULLDUPLEX */
       if (msg->msg.sd.shut & NETCONN_SHUT_RD) {
-        /* Drain and delete mboxes */
+#if LWIP_NETCONN_FULLDUPLEX
+        /* Mark mboxes invalid */
+        netconn_mark_mbox_invalid(msg->conn);
+#else /* LWIP_NETCONN_FULLDUPLEX */
         netconn_drain(msg->conn);
+#endif /* LWIP_NETCONN_FULLDUPLEX */
       }
-      LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL &&
-        msg->conn->write_offset == 0);
+      LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL);
       msg->conn->state = NETCONN_CLOSE;
       msg->conn->current_msg = msg;
 #if LWIP_TCPIP_CORE_LOCKING
@@ -1847,54 +2008,103 @@
  * Join multicast groups for UDP netconns.
  * Called from netconn_join_leave_group
  *
- * @param m the api_msg_msg pointing to the connection
+ * @param m the api_msg pointing to the connection
  */
 void
 lwip_netconn_do_join_leave_group(void *m)
 {
-  struct api_msg *msg = (struct api_msg*)m;
+  struct api_msg *msg = (struct api_msg *)m;
 
-  if (ERR_IS_FATAL(msg->conn->last_err)) {
-    msg->err = msg->conn->last_err;
-  } else {
-    if (msg->conn->pcb.tcp != NULL) {
-      if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_UDP) {
+  msg->err = ERR_CONN;
+  if (msg->conn->pcb.tcp != NULL) {
+    if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_UDP) {
 #if LWIP_UDP
 #if LWIP_IPV6 && LWIP_IPV6_MLD
-        if (NETCONNTYPE_ISIPV6(msg->conn->type)) {
-          if (msg->msg.jl.join_or_leave == NETCONN_JOIN) {
-            msg->err = mld6_joingroup(ip_2_ip6(API_EXPR_REF(msg->msg.jl.netif_addr)),
-              ip_2_ip6(API_EXPR_REF(msg->msg.jl.multiaddr)));
-          } else {
-            msg->err = mld6_leavegroup(ip_2_ip6(API_EXPR_REF(msg->msg.jl.netif_addr)),
-              ip_2_ip6(API_EXPR_REF(msg->msg.jl.multiaddr)));
-          }
+      if (NETCONNTYPE_ISIPV6(msg->conn->type)) {
+        if (msg->msg.jl.join_or_leave == NETCONN_JOIN) {
+          msg->err = mld6_joingroup(ip_2_ip6(API_EXPR_REF(msg->msg.jl.netif_addr)),
+                                    ip_2_ip6(API_EXPR_REF(msg->msg.jl.multiaddr)));
+        } else {
+          msg->err = mld6_leavegroup(ip_2_ip6(API_EXPR_REF(msg->msg.jl.netif_addr)),
+                                     ip_2_ip6(API_EXPR_REF(msg->msg.jl.multiaddr)));
         }
-        else
+      } else
 #endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
-        {
+      {
 #if LWIP_IGMP
-          if (msg->msg.jl.join_or_leave == NETCONN_JOIN) {
-            msg->err = igmp_joingroup(ip_2_ip4(API_EXPR_REF(msg->msg.jl.netif_addr)),
-              ip_2_ip4(API_EXPR_REF(msg->msg.jl.multiaddr)));
-          } else {
-            msg->err = igmp_leavegroup(ip_2_ip4(API_EXPR_REF(msg->msg.jl.netif_addr)),
-              ip_2_ip4(API_EXPR_REF(msg->msg.jl.multiaddr)));
-          }
-#endif /* LWIP_IGMP */
+        if (msg->msg.jl.join_or_leave == NETCONN_JOIN) {
+          msg->err = igmp_joingroup(ip_2_ip4(API_EXPR_REF(msg->msg.jl.netif_addr)),
+                                    ip_2_ip4(API_EXPR_REF(msg->msg.jl.multiaddr)));
+        } else {
+          msg->err = igmp_leavegroup(ip_2_ip4(API_EXPR_REF(msg->msg.jl.netif_addr)),
+                                     ip_2_ip4(API_EXPR_REF(msg->msg.jl.multiaddr)));
         }
+#endif /* LWIP_IGMP */
+      }
 #endif /* LWIP_UDP */
 #if (LWIP_TCP || LWIP_RAW)
-      } else {
-        msg->err = ERR_VAL;
-#endif /* (LWIP_TCP || LWIP_RAW) */
-      }
     } else {
-      msg->err = ERR_CONN;
+      msg->err = ERR_VAL;
+#endif /* (LWIP_TCP || LWIP_RAW) */
     }
   }
   TCPIP_APIMSG_ACK(msg);
 }
+/**
+ * Join multicast groups for UDP netconns.
+ * Called from netconn_join_leave_group_netif
+ *
+ * @param m the api_msg pointing to the connection
+ */
+void
+lwip_netconn_do_join_leave_group_netif(void *m)
+{
+  struct api_msg *msg = (struct api_msg *)m;
+  struct netif *netif;
+
+  netif = netif_get_by_index(msg->msg.jl.if_idx);
+  if (netif == NULL) {
+    msg->err = ERR_IF;
+    goto done;
+  }
+
+  msg->err = ERR_CONN;
+  if (msg->conn->pcb.tcp != NULL) {
+    if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_UDP) {
+#if LWIP_UDP
+#if LWIP_IPV6 && LWIP_IPV6_MLD
+      if (NETCONNTYPE_ISIPV6(msg->conn->type)) {
+        if (msg->msg.jl.join_or_leave == NETCONN_JOIN) {
+          msg->err = mld6_joingroup_netif(netif,
+                                          ip_2_ip6(API_EXPR_REF(msg->msg.jl.multiaddr)));
+        } else {
+          msg->err = mld6_leavegroup_netif(netif,
+                                           ip_2_ip6(API_EXPR_REF(msg->msg.jl.multiaddr)));
+        }
+      } else
+#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
+      {
+#if LWIP_IGMP
+        if (msg->msg.jl.join_or_leave == NETCONN_JOIN) {
+          msg->err = igmp_joingroup_netif(netif,
+                                          ip_2_ip4(API_EXPR_REF(msg->msg.jl.multiaddr)));
+        } else {
+          msg->err = igmp_leavegroup_netif(netif,
+                                           ip_2_ip4(API_EXPR_REF(msg->msg.jl.multiaddr)));
+        }
+#endif /* LWIP_IGMP */
+      }
+#endif /* LWIP_UDP */
+#if (LWIP_TCP || LWIP_RAW)
+    } else {
+      msg->err = ERR_VAL;
+#endif /* (LWIP_TCP || LWIP_RAW) */
+    }
+  }
+
+done:
+  TCPIP_APIMSG_ACK(msg);
+}
 #endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */
 
 #if LWIP_DNS
@@ -1906,7 +2116,7 @@
 static void
 lwip_netconn_do_dns_found(const char *name, const ip_addr_t *ipaddr, void *arg)
 {
-  struct dns_api_msg *msg = (struct dns_api_msg*)arg;
+  struct dns_api_msg *msg = (struct dns_api_msg *)arg;
 
   /* we trust the internal implementation to be correct :-) */
   LWIP_UNUSED_ARG(name);
@@ -1932,7 +2142,7 @@
 void
 lwip_netconn_do_gethostbyname(void *arg)
 {
-  struct dns_api_msg *msg = (struct dns_api_msg*)arg;
+  struct dns_api_msg *msg = (struct dns_api_msg *)arg;
   u8_t addrtype =
 #if LWIP_IPV4 && LWIP_IPV6
     msg->dns_addrtype;
@@ -1941,12 +2151,22 @@
 #endif
 
   API_EXPR_DEREF(msg->err) = dns_gethostbyname_addrtype(msg->name,
-    API_EXPR_REF(msg->addr), lwip_netconn_do_dns_found, msg, addrtype);
+                             API_EXPR_REF(msg->addr), lwip_netconn_do_dns_found, msg, addrtype);
+#if LWIP_TCPIP_CORE_LOCKING
+  /* For core locking, only block if we need to wait for answer/timeout */
+  if (API_EXPR_DEREF(msg->err) == ERR_INPROGRESS) {
+    UNLOCK_TCPIP_CORE();
+    sys_sem_wait(API_EXPR_REF_SEM(msg->sem));
+    LOCK_TCPIP_CORE();
+    LWIP_ASSERT("do_gethostbyname still in progress!!", API_EXPR_DEREF(msg->err) != ERR_INPROGRESS);
+  }
+#else /* LWIP_TCPIP_CORE_LOCKING */
   if (API_EXPR_DEREF(msg->err) != ERR_INPROGRESS) {
     /* on error or immediate success, wake up the application
      * task waiting in netconn_gethostbyname */
     sys_sem_signal(API_EXPR_REF_SEM(msg->sem));
   }
+#endif /* LWIP_TCPIP_CORE_LOCKING */
 }
 #endif /* LWIP_DNS */
 
diff --git a/src/api/err.c b/src/api/err.c
index 35e9c02..dd2b62d 100644
--- a/src/api/err.c
+++ b/src/api/err.c
@@ -78,23 +78,23 @@
 #ifdef LWIP_DEBUG
 
 static const char *err_strerr[] = {
-           "Ok.",                    /* ERR_OK          0  */
-           "Out of memory error.",   /* ERR_MEM        -1  */
-           "Buffer error.",          /* ERR_BUF        -2  */
-           "Timeout.",               /* ERR_TIMEOUT    -3  */
-           "Routing problem.",       /* ERR_RTE        -4  */
-           "Operation in progress.", /* ERR_INPROGRESS -5  */
-           "Illegal value.",         /* ERR_VAL        -6  */
-           "Operation would block.", /* ERR_WOULDBLOCK -7  */
-           "Address in use.",        /* ERR_USE        -8  */
-           "Already connecting.",    /* ERR_ALREADY    -9  */
-           "Already connected.",     /* ERR_ISCONN     -10 */
-           "Not connected.",         /* ERR_CONN       -11 */
-           "Low-level netif error.", /* ERR_IF         -12 */
-           "Connection aborted.",    /* ERR_ABRT       -13 */
-           "Connection reset.",      /* ERR_RST        -14 */
-           "Connection closed.",     /* ERR_CLSD       -15 */
-           "Illegal argument."       /* ERR_ARG        -16 */
+  "Ok.",                    /* ERR_OK          0  */
+  "Out of memory error.",   /* ERR_MEM        -1  */
+  "Buffer error.",          /* ERR_BUF        -2  */
+  "Timeout.",               /* ERR_TIMEOUT    -3  */
+  "Routing problem.",       /* ERR_RTE        -4  */
+  "Operation in progress.", /* ERR_INPROGRESS -5  */
+  "Illegal value.",         /* ERR_VAL        -6  */
+  "Operation would block.", /* ERR_WOULDBLOCK -7  */
+  "Address in use.",        /* ERR_USE        -8  */
+  "Already connecting.",    /* ERR_ALREADY    -9  */
+  "Already connected.",     /* ERR_ISCONN     -10 */
+  "Not connected.",         /* ERR_CONN       -11 */
+  "Low-level netif error.", /* ERR_IF         -12 */
+  "Connection aborted.",    /* ERR_ABRT       -13 */
+  "Connection reset.",      /* ERR_RST        -14 */
+  "Connection closed.",     /* ERR_CLSD       -15 */
+  "Illegal argument."       /* ERR_ARG        -16 */
 };
 
 /**
diff --git a/src/api/if_api.c b/src/api/if_api.c
new file mode 100644
index 0000000..8e094d0
--- /dev/null
+++ b/src/api/if_api.c
@@ -0,0 +1,102 @@
+/**
+ * @file
+ * Interface Identification APIs from:
+ *              RFC 3493: Basic Socket Interface Extensions for IPv6
+ *                  Section 4: Interface Identification
+ *
+ * @defgroup if_api Interface Identification API
+ * @ingroup socket
+ */
+
+/*
+ * 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"
+
+#if LWIP_SOCKET
+
+#include "lwip/errno.h"
+#include "lwip/if_api.h"
+#include "lwip/netifapi.h"
+#include "lwip/priv/sockets_priv.h"
+
+/**
+ * @ingroup if_api
+ * Maps an interface index to its corresponding name.
+ * @param ifindex interface index
+ * @param ifname shall point to a buffer of at least {IF_NAMESIZE} bytes
+ * @return If ifindex is an interface index, then the function shall return the
+ * value supplied in ifname, which points to a buffer now containing the interface name.
+ * Otherwise, the function shall return a NULL pointer.
+ */
+char *
+lwip_if_indextoname(unsigned int ifindex, char *ifname)
+{
+#if LWIP_NETIF_API
+  if (ifindex <= 0xff) {
+    err_t err = netifapi_netif_index_to_name((u8_t)ifindex, ifname);
+    if (!err && ifname[0] != '\0') {
+      return ifname;
+    }
+  }
+#else /* LWIP_NETIF_API */
+  LWIP_UNUSED_ARG(ifindex);
+  LWIP_UNUSED_ARG(ifname);
+#endif /* LWIP_NETIF_API */
+  set_errno(ENXIO);
+  return NULL;
+}
+
+/**
+ * @ingroup if_api
+ * Returs 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.
+ */
+unsigned int
+lwip_if_nametoindex(const char *ifname)
+{
+#if LWIP_NETIF_API
+  err_t err;
+  u8_t idx;
+
+  err = netifapi_netif_name_to_index(ifname, &idx);
+  if (!err) {
+    return idx;
+  }
+#else /* LWIP_NETIF_API */
+  LWIP_UNUSED_ARG(ifname);
+#endif /* LWIP_NETIF_API */
+  return 0; /* invalid index */
+}
+
+#endif /* LWIP_SOCKET */
diff --git a/src/api/netbuf.c b/src/api/netbuf.c
index eb25011..3b910de 100644
--- a/src/api/netbuf.c
+++ b/src/api/netbuf.c
@@ -109,10 +109,10 @@
   }
   buf->p = pbuf_alloc(PBUF_TRANSPORT, size, PBUF_RAM);
   if (buf->p == NULL) {
-     return NULL;
+    return NULL;
   }
   LWIP_ASSERT("check that first pbuf can hold size",
-             (buf->p->len >= size));
+              (buf->p->len >= size));
   buf->ptr = buf->p;
   return buf->p->payload;
 }
@@ -131,6 +131,10 @@
     pbuf_free(buf->p);
   }
   buf->p = buf->ptr = NULL;
+#if LWIP_CHECKSUM_ON_COPY
+  buf->flags = 0;
+  buf->toport_chksum = 0;
+#endif /* LWIP_CHECKSUM_ON_COPY */
 }
 
 /**
@@ -155,7 +159,7 @@
     buf->ptr = NULL;
     return ERR_MEM;
   }
-  ((struct pbuf_rom*)buf->p)->payload = dataptr;
+  ((struct pbuf_rom *)buf->p)->payload = dataptr;
   buf->p->len = buf->p->tot_len = size;
   buf->ptr = buf->p;
   return ERR_OK;
diff --git a/src/api/netdb.c b/src/api/netdb.c
index ccd9586..8771425 100644
--- a/src/api/netdb.c
+++ b/src/api/netdb.c
@@ -83,7 +83,7 @@
  * @return an entry containing addresses of address family AF_INET
  *         for the host with name name
  */
-struct hostent*
+struct hostent *
 lwip_gethostbyname(const char *name)
 {
   err_t err;
@@ -115,21 +115,21 @@
   s_hostent.h_aliases = &s_aliases;
   s_hostent.h_addrtype = AF_INET;
   s_hostent.h_length = sizeof(ip_addr_t);
-  s_hostent.h_addr_list = (char**)&s_phostent_addr;
+  s_hostent.h_addr_list = (char **)&s_phostent_addr;
 
 #if DNS_DEBUG
   /* dump hostent */
   LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_name           == %s\n", s_hostent.h_name));
-  LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_aliases        == %p\n", (void*)s_hostent.h_aliases));
+  LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_aliases        == %p\n", (void *)s_hostent.h_aliases));
   /* h_aliases are always empty */
   LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addrtype       == %d\n", s_hostent.h_addrtype));
   LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_length         == %d\n", s_hostent.h_length));
-  LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list      == %p\n", (void*)s_hostent.h_addr_list));
+  LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list      == %p\n", (void *)s_hostent.h_addr_list));
   if (s_hostent.h_addr_list != NULL) {
     u8_t idx;
-    for (idx=0; s_hostent.h_addr_list[idx]; idx++) {
+    for (idx = 0; s_hostent.h_addr_list[idx]; idx++) {
       LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list[%i]   == %p\n", idx, s_hostent.h_addr_list[idx]));
-      LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list[%i]-> == %s\n", idx, ipaddr_ntoa((ip_addr_t*)s_hostent.h_addr_list[idx])));
+      LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list[%i]-> == %s\n", idx, ipaddr_ntoa((ip_addr_t *)s_hostent.h_addr_list[idx])));
     }
   }
 #endif /* DNS_DEBUG */
@@ -160,7 +160,7 @@
  */
 int
 lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf,
-                size_t buflen, struct hostent **result, int *h_errnop)
+                     size_t buflen, struct hostent **result, int *h_errnop)
 {
   err_t err;
   struct gethostbyname_r_helper *h;
@@ -187,14 +187,14 @@
   }
 
   namelen = strlen(name);
-  if (buflen < (sizeof(struct gethostbyname_r_helper) + namelen + 1 + (MEM_ALIGNMENT - 1))) {
+  if (buflen < (sizeof(struct gethostbyname_r_helper) + LWIP_MEM_ALIGN_BUFFER(namelen + 1))) {
     /* buf can't hold the data needed + a copy of name */
     *h_errnop = ERANGE;
     return -1;
   }
 
-  h = (struct gethostbyname_r_helper*)LWIP_MEM_ALIGN(buf);
-  hostname = ((char*)h) + sizeof(struct gethostbyname_r_helper);
+  h = (struct gethostbyname_r_helper *)LWIP_MEM_ALIGN(buf);
+  hostname = ((char *)h) + sizeof(struct gethostbyname_r_helper);
 
   /* query host IP address */
   err = netconn_gethostbyname(name, &h->addr);
@@ -216,7 +216,7 @@
   ret->h_aliases = &h->aliases;
   ret->h_addrtype = AF_INET;
   ret->h_length = sizeof(ip_addr_t);
-  ret->h_addr_list = (char**)&h->addr_list;
+  ret->h_addr_list = (char **)&h->addr_list;
 
   /* set result != NULL */
   *result = ret;
@@ -267,7 +267,7 @@
  */
 int
 lwip_getaddrinfo(const char *nodename, const char *servname,
-       const struct addrinfo *hints, struct addrinfo **res)
+                 const struct addrinfo *hints, struct addrinfo **res)
 {
   err_t err;
   ip_addr_t addr;
@@ -290,12 +290,12 @@
     ai_family = hints->ai_family;
     if ((ai_family != AF_UNSPEC)
 #if LWIP_IPV4
-      && (ai_family != AF_INET)
+        && (ai_family != AF_INET)
 #endif /* LWIP_IPV4 */
 #if LWIP_IPV6
-      && (ai_family != AF_INET6)
+        && (ai_family != AF_INET6)
 #endif /* LWIP_IPV6 */
-      ) {
+       ) {
       return EAI_FAMILY;
     }
   } else {
@@ -342,9 +342,9 @@
   } else {
     /* service location specified, use loopback address */
     if ((hints != NULL) && (hints->ai_flags & AI_PASSIVE)) {
-      ip_addr_set_any(ai_family == AF_INET6, &addr);
+      ip_addr_set_any_val(ai_family == AF_INET6, addr);
     } else {
-      ip_addr_set_loopback(ai_family == AF_INET6, &addr);
+      ip_addr_set_loopback_val(ai_family == AF_INET6, addr);
     }
   }
 
@@ -360,27 +360,28 @@
   }
   /* If this fails, please report to lwip-devel! :-) */
   LWIP_ASSERT("total_size <= NETDB_ELEM_SIZE: please report this!",
-    total_size <= NETDB_ELEM_SIZE);
+              total_size <= NETDB_ELEM_SIZE);
   ai = (struct addrinfo *)memp_malloc(MEMP_NETDB);
   if (ai == NULL) {
     return EAI_MEMORY;
   }
   memset(ai, 0, total_size);
   /* cast through void* to get rid of alignment warnings */
-  sa = (struct sockaddr_storage *)(void*)((u8_t*)ai + sizeof(struct addrinfo));
+  sa = (struct sockaddr_storage *)(void *)((u8_t *)ai + sizeof(struct addrinfo));
   if (IP_IS_V6_VAL(addr)) {
 #if LWIP_IPV6
-    struct sockaddr_in6 *sa6 = (struct sockaddr_in6*)sa;
+    struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)sa;
     /* set up sockaddr */
     inet6_addr_from_ip6addr(&sa6->sin6_addr, ip_2_ip6(&addr));
     sa6->sin6_family = AF_INET6;
     sa6->sin6_len = sizeof(struct sockaddr_in6);
     sa6->sin6_port = lwip_htons((u16_t)port_nr);
+    sa6->sin6_scope_id = ip6_addr_zone(ip_2_ip6(&addr));
     ai->ai_family = AF_INET6;
 #endif /* LWIP_IPV6 */
   } else {
 #if LWIP_IPV4
-    struct sockaddr_in *sa4 = (struct sockaddr_in*)sa;
+    struct sockaddr_in *sa4 = (struct sockaddr_in *)sa;
     /* set up sockaddr */
     inet_addr_from_ip4addr(&sa4->sin_addr, ip_2_ip4(&addr));
     sa4->sin_family = AF_INET;
@@ -398,12 +399,12 @@
   }
   if (nodename != NULL) {
     /* copy nodename to canonname if specified */
-    ai->ai_canonname = ((char*)ai + sizeof(struct addrinfo) + sizeof(struct sockaddr_storage));
+    ai->ai_canonname = ((char *)ai + sizeof(struct addrinfo) + sizeof(struct sockaddr_storage));
     MEMCPY(ai->ai_canonname, nodename, namelen);
     ai->ai_canonname[namelen] = 0;
   }
   ai->ai_addrlen = sizeof(struct sockaddr_storage);
-  ai->ai_addr = (struct sockaddr*)sa;
+  ai->ai_addr = (struct sockaddr *)sa;
 
   *res = ai;
 
diff --git a/src/api/netifapi.c b/src/api/netifapi.c
index fef05a3..25957cd 100644
--- a/src/api/netifapi.c
+++ b/src/api/netifapi.c
@@ -5,10 +5,10 @@
  * @defgroup netifapi NETIF API
  * @ingroup sequential_api
  * Thread-safe functions to be called from non-TCPIP threads
- * 
+ *
  * @defgroup netifapi_netif NETIF related
  * @ingroup netifapi
- * To be called from non-TCPIP threads 
+ * To be called from non-TCPIP threads
  */
 
 /*
@@ -42,10 +42,13 @@
 
 #if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */
 
+#include "lwip/etharp.h"
 #include "lwip/netifapi.h"
 #include "lwip/memp.h"
 #include "lwip/priv/tcpip_priv.h"
 
+#include <string.h> /* strncpy */
+
 #define NETIFAPI_VAR_REF(name)      API_VAR_REF(name)
 #define NETIFAPI_VAR_DECLARE(name)  API_VAR_DECLARE(struct netifapi_msg, name)
 #define NETIFAPI_VAR_ALLOC(name)    API_VAR_ALLOC(struct netifapi_msg, MEMP_NETIFAPI_MSG, name, ERR_MEM)
@@ -57,10 +60,10 @@
 static err_t
 netifapi_do_netif_add(struct tcpip_api_call_data *m)
 {
-  /* cast through void* to silence alignment warnings. 
+  /* cast through void* to silence alignment warnings.
    * We know it works because the structs have been instantiated as struct netifapi_msg */
-  struct netifapi_msg *msg = (struct netifapi_msg*)(void*)m;
-  
+  struct netifapi_msg *msg = (struct netifapi_msg *)(void *)m;
+
   if (!netif_add( msg->netif,
 #if LWIP_IPV4
                   API_EXPR_REF(msg->msg.add.ipaddr),
@@ -83,9 +86,9 @@
 static err_t
 netifapi_do_netif_set_addr(struct tcpip_api_call_data *m)
 {
-  /* cast through void* to silence alignment warnings. 
+  /* cast through void* to silence alignment warnings.
    * We know it works because the structs have been instantiated as struct netifapi_msg */
-  struct netifapi_msg *msg = (struct netifapi_msg*)(void*)m;
+  struct netifapi_msg *msg = (struct netifapi_msg *)(void *)m;
 
   netif_set_addr( msg->netif,
                   API_EXPR_REF(msg->msg.add.ipaddr),
@@ -96,15 +99,46 @@
 #endif /* LWIP_IPV4 */
 
 /**
+* Call netif_name_to_index() inside the tcpip_thread context.
+*/
+static err_t
+netifapi_do_name_to_index(struct tcpip_api_call_data *m)
+{
+  /* cast through void* to silence alignment warnings.
+   * We know it works because the structs have been instantiated as struct netifapi_msg */
+  struct netifapi_msg *msg = (struct netifapi_msg *)(void *)m;
+
+  msg->msg.ifs.index = netif_name_to_index(msg->msg.ifs.name);
+  return ERR_OK;
+}
+
+/**
+* Call netif_index_to_name() inside the tcpip_thread context.
+*/
+static err_t
+netifapi_do_index_to_name(struct tcpip_api_call_data *m)
+{
+  /* cast through void* to silence alignment warnings.
+   * We know it works because the structs have been instantiated as struct netifapi_msg */
+  struct netifapi_msg *msg = (struct netifapi_msg *)(void *)m;
+
+  if (!netif_index_to_name(msg->msg.ifs.index, msg->msg.ifs.name)) {
+    /* return failure via empty name */
+    msg->msg.ifs.name[0] = '\0';
+  }
+  return ERR_OK;
+}
+
+/**
  * Call the "errtfunc" (or the "voidfunc" if "errtfunc" is NULL) inside the
  * tcpip_thread context.
  */
 static err_t
 netifapi_do_netif_common(struct tcpip_api_call_data *m)
 {
-  /* cast through void* to silence alignment warnings. 
+  /* cast through void* to silence alignment warnings.
    * We know it works because the structs have been instantiated as struct netifapi_msg */
-  struct netifapi_msg *msg = (struct netifapi_msg*)(void*)m;
+  struct netifapi_msg *msg = (struct netifapi_msg *)(void *)m;
 
   if (msg->msg.common.errtfunc != NULL) {
     return msg->msg.common.errtfunc(msg->netif);
@@ -114,6 +148,69 @@
   }
 }
 
+#if LWIP_ARP && LWIP_IPV4
+/**
+ * @ingroup netifapi_arp
+ * Add or update an entry in the ARP cache.
+ * For an update, ipaddr is used to find the cache entry.
+ *
+ * @param ipaddr IPv4 address of cache entry
+ * @param ethaddr hardware address mapped to ipaddr
+ * @param type type of ARP cache entry
+ * @return ERR_OK: entry added/updated, else error from err_t
+ */
+err_t
+netifapi_arp_add(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, enum netifapi_arp_entry type)
+{
+  err_t err;
+
+  /* We only support permanent entries currently */
+  LWIP_UNUSED_ARG(type);
+
+#if ETHARP_SUPPORT_STATIC_ENTRIES && LWIP_TCPIP_CORE_LOCKING
+  LOCK_TCPIP_CORE();
+  err = etharp_add_static_entry(ipaddr, ethaddr);
+  UNLOCK_TCPIP_CORE();
+#else
+  /* @todo add new vars to struct netifapi_msg and create a 'do' func */
+  LWIP_UNUSED_ARG(ipaddr);
+  LWIP_UNUSED_ARG(ethaddr);
+  err = ERR_VAL;
+#endif /* ETHARP_SUPPORT_STATIC_ENTRIES && LWIP_TCPIP_CORE_LOCKING */
+
+  return err;
+}
+
+/**
+ * @ingroup netifapi_arp
+ * Remove an entry in the ARP cache identified by ipaddr
+ *
+ * @param ipaddr IPv4 address of cache entry
+ * @param type type of ARP cache entry
+ * @return ERR_OK: entry removed, else error from err_t
+ */
+err_t
+netifapi_arp_remove(const ip4_addr_t *ipaddr, enum netifapi_arp_entry type)
+{
+  err_t err;
+
+  /* We only support permanent entries currently */
+  LWIP_UNUSED_ARG(type);
+
+#if ETHARP_SUPPORT_STATIC_ENTRIES && LWIP_TCPIP_CORE_LOCKING
+  LOCK_TCPIP_CORE();
+  err = etharp_remove_static_entry(ipaddr);
+  UNLOCK_TCPIP_CORE();
+#else
+  /* @todo add new vars to struct netifapi_msg and create a 'do' func */
+  LWIP_UNUSED_ARG(ipaddr);
+  err = ERR_VAL;
+#endif /* ETHARP_SUPPORT_STATIC_ENTRIES && LWIP_TCPIP_CORE_LOCKING */
+
+  return err;
+}
+#endif /* LWIP_ARP && LWIP_IPV4 */
+
 /**
  * @ingroup netifapi_netif
  * Call netif_add() in a thread-safe way by running that function inside the
@@ -204,7 +301,7 @@
  */
 err_t
 netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc,
-                       netifapi_errt_fn errtfunc)
+                      netifapi_errt_fn errtfunc)
 {
   err_t err;
   NETIFAPI_VAR_DECLARE(msg);
@@ -218,4 +315,66 @@
   return err;
 }
 
+/**
+* @ingroup netifapi_netif
+* Call netif_name_to_index() in a thread-safe way by running that function inside the
+* tcpip_thread context.
+*
+* @param name the interface name of the netif
+* @param idx output index of the found netif
+*/
+err_t
+netifapi_netif_name_to_index(const char *name, u8_t *idx)
+{
+  err_t err;
+  NETIFAPI_VAR_DECLARE(msg);
+  NETIFAPI_VAR_ALLOC(msg);
+
+  *idx = 0;
+
+#if LWIP_MPU_COMPATIBLE
+  strncpy(NETIFAPI_VAR_REF(msg).msg.ifs.name, name, NETIF_NAMESIZE - 1);
+  NETIFAPI_VAR_REF(msg).msg.ifs.name[NETIF_NAMESIZE - 1] = '\0';
+#else
+  NETIFAPI_VAR_REF(msg).msg.ifs.name = LWIP_CONST_CAST(char *, name);
+#endif /* LWIP_MPU_COMPATIBLE */
+  err = tcpip_api_call(netifapi_do_name_to_index, &API_VAR_REF(msg).call);
+  if (!err) {
+    *idx = NETIFAPI_VAR_REF(msg).msg.ifs.index;
+  }
+  NETIFAPI_VAR_FREE(msg);
+  return err;
+}
+
+/**
+* @ingroup netifapi_netif
+* Call netif_index_to_name() in a thread-safe way by running that function inside the
+* tcpip_thread context.
+*
+* @param idx the interface index of the netif
+* @param name output name of the found netif, empty '\0' string if netif not found.
+*             name should be of at least NETIF_NAMESIZE bytes
+*/
+err_t
+netifapi_netif_index_to_name(u8_t idx, char *name)
+{
+  err_t err;
+  NETIFAPI_VAR_DECLARE(msg);
+  NETIFAPI_VAR_ALLOC(msg);
+
+  NETIFAPI_VAR_REF(msg).msg.ifs.index = idx;
+#if !LWIP_MPU_COMPATIBLE
+  NETIFAPI_VAR_REF(msg).msg.ifs.name = name;
+#endif /* LWIP_MPU_COMPATIBLE */
+  err = tcpip_api_call(netifapi_do_index_to_name, &API_VAR_REF(msg).call);
+#if LWIP_MPU_COMPATIBLE
+  if (!err) {
+    strncpy(name, NETIFAPI_VAR_REF(msg).msg.ifs.name, NETIF_NAMESIZE - 1);
+    name[NETIF_NAMESIZE - 1] = '\0';
+  }
+#endif /* LWIP_MPU_COMPATIBLE */
+  NETIFAPI_VAR_FREE(msg);
+  return err;
+}
+
 #endif /* LWIP_NETIF_API */
diff --git a/src/api/sockets.c b/src/api/sockets.c
index b763248..cb7df91 100644
--- a/src/api/sockets.c
+++ b/src/api/sockets.c
@@ -1,13 +1,6 @@
 /**
  * @file
  * Sockets BSD-Like API module
- *
- * @defgroup socket Socket API
- * @ingroup sequential_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\b
  */
 
 /*
@@ -49,8 +42,8 @@
 #if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */
 
 #include "lwip/sockets.h"
+#include "lwip/priv/sockets_priv.h"
 #include "lwip/api.h"
-#include "lwip/sys.h"
 #include "lwip/igmp.h"
 #include "lwip/inet.h"
 #include "lwip/tcp.h"
@@ -58,13 +51,23 @@
 #include "lwip/udp.h"
 #include "lwip/memp.h"
 #include "lwip/pbuf.h"
+#include "lwip/netif.h"
 #include "lwip/priv/tcpip_priv.h"
+#include "lwip/mld6.h"
 #if LWIP_CHECKSUM_ON_COPY
 #include "lwip/inet_chksum.h"
 #endif
 
+#if LWIP_COMPAT_SOCKETS == 2 && LWIP_POSIX_SOCKETS_IO_NAMES
+#include <stdarg.h>
+#endif
+
 #include <string.h>
 
+#ifdef LWIP_HOOK_FILENAME
+#include LWIP_HOOK_FILENAME
+#endif
+
 /* If the netconn API is not required publicly, then we include the necessary
    files here to get the implementation */
 #if !LWIP_NETCONN
@@ -77,6 +80,11 @@
 #define LWIP_NETCONN 0
 #endif
 
+#define API_SELECT_CB_VAR_REF(name)               API_VAR_REF(name)
+#define API_SELECT_CB_VAR_DECLARE(name)           API_VAR_DECLARE(struct lwip_select_cb, name)
+#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)
+
 #if LWIP_IPV4
 #define IP4ADDR_PORT_TO_SOCKADDR(sin, ipaddr, port) do { \
       (sin)->sin_len = sizeof(struct sockaddr_in); \
@@ -96,14 +104,17 @@
       (sin6)->sin6_port = lwip_htons((port)); \
       (sin6)->sin6_flowinfo = 0; \
       inet6_addr_from_ip6addr(&(sin6)->sin6_addr, ipaddr); \
-      (sin6)->sin6_scope_id = 0; }while(0)
+      (sin6)->sin6_scope_id = ip6_addr_zone(ipaddr); }while(0)
 #define SOCKADDR6_TO_IP6ADDR_PORT(sin6, ipaddr, port) do { \
     inet6_addr_to_ip6addr(ip_2_ip6(ipaddr), &((sin6)->sin6_addr)); \
+    if (ip6_addr_has_scope(ip_2_ip6(ipaddr), IP6_UNKNOWN)) { \
+      ip6_addr_set_zone(ip_2_ip6(ipaddr), (u8_t)((sin6)->sin6_scope_id)); \
+    } \
     (port) = lwip_ntohs((sin6)->sin6_port); }while(0)
 #endif /* LWIP_IPV6 */
 
 #if LWIP_IPV4 && LWIP_IPV6
-static void sockaddr_to_ipaddr_port(const struct sockaddr* sockaddr, ip_addr_t* ipaddr, u16_t* port);
+static void sockaddr_to_ipaddr_port(const struct sockaddr *sockaddr, ip_addr_t *ipaddr, u16_t *port);
 
 #define IS_SOCK_ADDR_LEN_VALID(namelen)  (((namelen) == sizeof(struct sockaddr_in)) || \
                                          ((namelen) == sizeof(struct sockaddr_in6)))
@@ -113,7 +124,7 @@
        ((((name)->sa_family == AF_INET) && !(NETCONNTYPE_ISIPV6((sock)->conn->type))) || \
        (((name)->sa_family == AF_INET6) && (NETCONNTYPE_ISIPV6((sock)->conn->type))))
 #define IPADDR_PORT_TO_SOCKADDR(sockaddr, ipaddr, port) do { \
-    if (IP_IS_V6(ipaddr)) { \
+    if (IP_IS_ANY_TYPE_VAL(*ipaddr) || IP_IS_V6_VAL(*ipaddr)) { \
       IP6ADDR_PORT_TO_SOCKADDR((struct sockaddr_in6*)(void*)(sockaddr), ip_2_ip6(ipaddr), port); \
     } else { \
       IP4ADDR_PORT_TO_SOCKADDR((struct sockaddr_in*)(void*)(sockaddr), ip_2_ip4(ipaddr), port); \
@@ -148,16 +159,16 @@
 #define IS_SOCK_ADDR_ALIGNED(name)      ((((mem_ptr_t)(name)) % 4) == 0)
 
 
-#define LWIP_SOCKOPT_CHECK_OPTLEN(optlen, opttype) do { if ((optlen) < sizeof(opttype)) { return EINVAL; }}while(0)
+#define LWIP_SOCKOPT_CHECK_OPTLEN(sock, optlen, opttype) do { if ((optlen) < sizeof(opttype)) { done_socket(sock); return EINVAL; }}while(0)
 #define LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, opttype) do { \
-  LWIP_SOCKOPT_CHECK_OPTLEN(optlen, opttype); \
-  if ((sock)->conn == NULL) { return EINVAL; } }while(0)
+  LWIP_SOCKOPT_CHECK_OPTLEN(sock, optlen, opttype); \
+  if ((sock)->conn == NULL) { done_socket(sock); return EINVAL; } }while(0)
 #define LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, opttype) do { \
-  LWIP_SOCKOPT_CHECK_OPTLEN(optlen, opttype); \
-  if (((sock)->conn == NULL) || ((sock)->conn->pcb.tcp == NULL)) { return EINVAL; } }while(0)
+  LWIP_SOCKOPT_CHECK_OPTLEN(sock, optlen, opttype); \
+  if (((sock)->conn == NULL) || ((sock)->conn->pcb.tcp == NULL)) { done_socket(sock); return EINVAL; } }while(0)
 #define LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, opttype, netconntype) do { \
   LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, opttype); \
-  if (NETCONNTYPE_GROUP(netconn_type((sock)->conn)) != netconntype) { return ENOPROTOOPT; } }while(0)
+  if (NETCONNTYPE_GROUP(netconn_type((sock)->conn)) != netconntype) { done_socket(sock); return ENOPROTOOPT; } }while(0)
 
 
 #define LWIP_SETGETSOCKOPT_DATA_VAR_REF(name)     API_VAR_REF(name)
@@ -168,6 +179,7 @@
   name = (struct lwip_setgetsockopt_data *)memp_malloc(MEMP_SOCKET_SETGETSOCKOPT_DATA); \
   if (name == NULL) { \
     sock_set_errno(sock, ENOMEM); \
+    done_socket(sock); \
     return -1; \
   } }while(0)
 #else /* LWIP_MPU_COMPATIBLE */
@@ -177,150 +189,127 @@
 #if LWIP_SO_SNDRCVTIMEO_NONSTANDARD
 #define LWIP_SO_SNDRCVTIMEO_OPTTYPE int
 #define LWIP_SO_SNDRCVTIMEO_SET(optval, val) (*(int *)(optval) = (val))
-#define LWIP_SO_SNDRCVTIMEO_GET_MS(optval)   ((s32_t)*(const int*)(optval))
+#define LWIP_SO_SNDRCVTIMEO_GET_MS(optval)   ((long)*(const int*)(optval))
 #else
 #define LWIP_SO_SNDRCVTIMEO_OPTTYPE struct timeval
 #define LWIP_SO_SNDRCVTIMEO_SET(optval, val)  do { \
-  s32_t loc = (val); \
-  ((struct timeval *)(optval))->tv_sec = (loc) / 1000U; \
-  ((struct timeval *)(optval))->tv_usec = ((loc) % 1000U) * 1000U; }while(0)
-#define LWIP_SO_SNDRCVTIMEO_GET_MS(optval) ((((const struct timeval *)(optval))->tv_sec * 1000U) + (((const struct timeval *)(optval))->tv_usec / 1000U))
+  u32_t loc = (val); \
+  ((struct timeval *)(optval))->tv_sec = (long)((loc) / 1000U); \
+  ((struct timeval *)(optval))->tv_usec = (long)(((loc) % 1000U) * 1000U); }while(0)
+#define LWIP_SO_SNDRCVTIMEO_GET_MS(optval) ((((const struct timeval *)(optval))->tv_sec * 1000) + (((const struct timeval *)(optval))->tv_usec / 1000))
 #endif
 
-#define NUM_SOCKETS MEMP_NUM_NETCONN
-
-/** This is overridable for the rare case where more than 255 threads
- * select on the same socket...
- */
-#ifndef SELWAIT_T
-#define SELWAIT_T u8_t
-#endif
-
-/** Contains all internal pointers and states used for a socket */
-struct lwip_sock {
-  /** sockets currently are built on netconns, each socket has one netconn */
-  struct netconn *conn;
-  /** data that was left from the previous read */
-  void *lastdata;
-  /** offset in the data that was left from the previous read */
-  u16_t lastoffset;
-  /** number of times data was received, set by event_callback(),
-      tested by the receive and select functions */
-  s16_t rcvevent;
-  /** number of times data was ACKed (free send buffer), set by event_callback(),
-      tested by select */
-  u16_t sendevent;
-  /** error happened for this socket, set by event_callback(), tested by select */
-  u16_t errevent;
-  /** last error that occurred on this socket (in fact, all our errnos fit into an u8_t) */
-  u8_t err;
-  /** counter of how many threads are waiting for this socket using select */
-  SELWAIT_T select_waiting;
-};
-
-#if LWIP_NETCONN_SEM_PER_THREAD
-#define SELECT_SEM_T        sys_sem_t*
-#define SELECT_SEM_PTR(sem) (sem)
-#else /* LWIP_NETCONN_SEM_PER_THREAD */
-#define SELECT_SEM_T        sys_sem_t
-#define SELECT_SEM_PTR(sem) (&(sem))
-#endif /* LWIP_NETCONN_SEM_PER_THREAD */
-
-/** Description for a task waiting in select */
-struct lwip_select_cb {
-  /** Pointer to the next waiting task */
-  struct lwip_select_cb *next;
-  /** Pointer to the previous waiting task */
-  struct lwip_select_cb *prev;
-  /** readset passed to select */
-  fd_set *readset;
-  /** writeset passed to select */
-  fd_set *writeset;
-  /** unimplemented: exceptset passed to select */
-  fd_set *exceptset;
-  /** don't signal the same semaphore twice: set to 1 when signalled */
-  int sem_signalled;
-  /** semaphore to wake up a task waiting for select */
-  SELECT_SEM_T sem;
-};
 
 /** A struct sockaddr replacement that has the same alignment as sockaddr_in/
  *  sockaddr_in6 if instantiated.
  */
 union sockaddr_aligned {
-   struct sockaddr sa;
+  struct sockaddr sa;
 #if LWIP_IPV6
-   struct sockaddr_in6 sin6;
+  struct sockaddr_in6 sin6;
 #endif /* LWIP_IPV6 */
 #if LWIP_IPV4
-   struct sockaddr_in sin;
+  struct sockaddr_in sin;
 #endif /* LWIP_IPV4 */
 };
 
-#if LWIP_IGMP
 /* Define the number of IPv4 multicast memberships, default is one per socket */
 #ifndef LWIP_SOCKET_MAX_MEMBERSHIPS
 #define LWIP_SOCKET_MAX_MEMBERSHIPS NUM_SOCKETS
 #endif
 
+#if LWIP_IGMP
 /* This is to keep track of IP_ADD_MEMBERSHIP calls to drop the membership when
    a socket is closed */
 struct lwip_socket_multicast_pair {
   /** the socket */
-  struct lwip_sock* sock;
+  struct lwip_sock *sock;
   /** the interface address */
   ip4_addr_t if_addr;
   /** the group address */
   ip4_addr_t multi_addr;
 };
 
-struct lwip_socket_multicast_pair socket_ipv4_multicast_memberships[LWIP_SOCKET_MAX_MEMBERSHIPS];
+static struct lwip_socket_multicast_pair socket_ipv4_multicast_memberships[LWIP_SOCKET_MAX_MEMBERSHIPS];
 
 static int  lwip_socket_register_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr);
 static void lwip_socket_unregister_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr);
 static void lwip_socket_drop_registered_memberships(int s);
 #endif /* LWIP_IGMP */
 
+#if LWIP_IPV6_MLD
+/* This is to keep track of IP_JOIN_GROUP calls to drop the membership when
+   a socket is closed */
+struct lwip_socket_multicast_mld6_pair {
+  /** the socket */
+  struct lwip_sock *sock;
+  /** the interface index */
+  u8_t if_idx;
+  /** the group address */
+  ip6_addr_t multi_addr;
+};
+
+static struct lwip_socket_multicast_mld6_pair socket_ipv6_multicast_memberships[LWIP_SOCKET_MAX_MEMBERSHIPS];
+
+static int  lwip_socket_register_mld6_membership(int s, unsigned int if_idx, const ip6_addr_t *multi_addr);
+static void lwip_socket_unregister_mld6_membership(int s, unsigned int if_idx, const ip6_addr_t *multi_addr);
+static void lwip_socket_drop_registered_mld6_memberships(int s);
+#endif /* LWIP_IPV6_MLD */
+
 /** The global array of available sockets */
 static struct lwip_sock sockets[NUM_SOCKETS];
+
+#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL
+#if LWIP_TCPIP_CORE_LOCKING
+/* protect the select_cb_list using core lock */
+#define LWIP_SOCKET_SELECT_DECL_PROTECT(lev)
+#define LWIP_SOCKET_SELECT_PROTECT(lev)   LOCK_TCPIP_CORE()
+#define LWIP_SOCKET_SELECT_UNPROTECT(lev) UNLOCK_TCPIP_CORE()
+#else /* LWIP_TCPIP_CORE_LOCKING */
+/* protect the select_cb_list using SYS_LIGHTWEIGHT_PROT */
+#define LWIP_SOCKET_SELECT_DECL_PROTECT(lev)  SYS_ARCH_DECL_PROTECT(lev)
+#define LWIP_SOCKET_SELECT_PROTECT(lev)       SYS_ARCH_PROTECT(lev)
+#define LWIP_SOCKET_SELECT_UNPROTECT(lev)     SYS_ARCH_UNPROTECT(lev)
+/** This counter is increased from lwip_select when the list is changed
+    and checked in select_check_waiters to see if it has changed. */
+static volatile int select_cb_ctr;
+#endif /* LWIP_TCPIP_CORE_LOCKING */
 /** The global list of tasks waiting for select */
 static struct lwip_select_cb *select_cb_list;
-/** This counter is increased from lwip_select when the list is changed
-    and checked in event_callback to see if it has changed. */
-static volatile int select_cb_ctr;
-
-#if LWIP_SOCKET_SET_ERRNO
-#ifndef set_errno
-#define set_errno(err) do { if (err) { errno = (err); } } while(0)
-#endif
-#else /* LWIP_SOCKET_SET_ERRNO */
-#define set_errno(err)
-#endif /* LWIP_SOCKET_SET_ERRNO */
+#endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */
 
 #define sock_set_errno(sk, e) do { \
   const int sockerr = (e); \
-  sk->err = (u8_t)sockerr; \
   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);
+#define DEFAULT_SOCKET_EVENTCB event_callback
+static void select_check_waiters(int s, int has_recvevent, int has_sendevent, int has_errevent);
+#else
+#define DEFAULT_SOCKET_EVENTCB NULL
+#endif
 #if !LWIP_TCPIP_CORE_LOCKING
 static void lwip_getsockopt_callback(void *arg);
 static void lwip_setsockopt_callback(void *arg);
 #endif
-static u8_t lwip_getsockopt_impl(int s, int level, int optname, void *optval, socklen_t *optlen);
-static u8_t lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_t optlen);
+static int lwip_getsockopt_impl(int s, int level, int optname, void *optval, socklen_t *optlen);
+static int lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_t optlen);
+static int free_socket_locked(struct lwip_sock *sock, int is_tcp, struct netconn **conn,
+                              union lwip_sock_lastdata *lastdata);
+static void free_socket_free_elements(int is_tcp, struct netconn *conn, union lwip_sock_lastdata *lastdata);
 
 #if LWIP_IPV4 && LWIP_IPV6
 static void
-sockaddr_to_ipaddr_port(const struct sockaddr* sockaddr, ip_addr_t* ipaddr, u16_t* port)
+sockaddr_to_ipaddr_port(const struct sockaddr *sockaddr, ip_addr_t *ipaddr, u16_t *port)
 {
   if ((sockaddr->sa_family) == AF_INET6) {
-    SOCKADDR6_TO_IP6ADDR_PORT((const struct sockaddr_in6*)(const void*)(sockaddr), ipaddr, *port);
+    SOCKADDR6_TO_IP6ADDR_PORT((const struct sockaddr_in6 *)(const void *)(sockaddr), ipaddr, *port);
     ipaddr->type = IPADDR_TYPE_V6;
   } else {
-    SOCKADDR4_TO_IP4ADDR_PORT((const struct sockaddr_in*)(const void*)(sockaddr), ipaddr, *port);
+    SOCKADDR4_TO_IP4ADDR_PORT((const struct sockaddr_in *)(const void *)(sockaddr), ipaddr, *port);
     ipaddr->type = IPADDR_TYPE_V4;
   }
 }
@@ -330,63 +319,174 @@
 void
 lwip_socket_thread_init(void)
 {
-   netconn_thread_init();
+  netconn_thread_init();
 }
 
 /** LWIP_NETCONN_SEM_PER_THREAD==1: destroy thread-local semaphore */
 void
 lwip_socket_thread_cleanup(void)
 {
-   netconn_thread_cleanup();
+  netconn_thread_cleanup();
 }
 
-/**
- * Map a externally used socket index to the internal socket representation.
- *
- * @param s externally used socket index
- * @return struct lwip_sock for the socket or NULL if not found
- */
-static struct lwip_sock *
-get_socket(int s)
+#if LWIP_NETCONN_FULLDUPLEX
+/* Thread-safe increment of sock->fd_used, with overflow check */
+static int
+sock_inc_used(struct lwip_sock *sock)
 {
-  struct lwip_sock *sock;
+  int ret;
+  SYS_ARCH_DECL_PROTECT(lev);
 
-  s -= LWIP_SOCKET_OFFSET;
+  LWIP_ASSERT("sock != NULL", sock != NULL);
 
+  SYS_ARCH_PROTECT(lev);
+  if (sock->fd_free_pending) {
+    /* prevent new usage of this socket if free is pending */
+    ret = 0;
+  } else {
+    ++sock->fd_used;
+    ret = 1;
+    LWIP_ASSERT("sock->fd_used != 0", sock->fd_used != 0);
+  }
+  SYS_ARCH_UNPROTECT(lev);
+  return ret;
+}
+
+/* Like sock_inc_used(), but called under SYS_ARCH_PROTECT lock. */
+static int
+sock_inc_used_locked(struct lwip_sock *sock)
+{
+  LWIP_ASSERT("sock != NULL", sock != NULL);
+
+  if (sock->fd_free_pending) {
+    LWIP_ASSERT("sock->fd_used != 0", sock->fd_used != 0);
+    return 0;
+  }
+
+  ++sock->fd_used;
+  LWIP_ASSERT("sock->fd_used != 0", sock->fd_used != 0);
+  return 1;
+}
+
+/* In full-duplex mode,sock->fd_used != 0 prevents a socket descriptor from being
+ * released (and possibly reused) when used from more than one thread
+ * (e.g. read-while-write or close-while-write, etc)
+ * This function is called at the end of functions using (try)get_socket*().
+ */
+static void
+done_socket(struct lwip_sock *sock)
+{
+  int freed = 0;
+  int is_tcp = 0;
+  struct netconn *conn = NULL;
+  union lwip_sock_lastdata lastdata;
+  SYS_ARCH_DECL_PROTECT(lev);
+  LWIP_ASSERT("sock != NULL", sock != NULL);
+
+  SYS_ARCH_PROTECT(lev);
+  LWIP_ASSERT("sock->fd_used > 0", sock->fd_used > 0);
+  if (--sock->fd_used == 0) {
+    if (sock->fd_free_pending) {
+      /* free the socket */
+      sock->fd_used = 1;
+      is_tcp = sock->fd_free_pending & LWIP_SOCK_FD_FREE_TCP;
+      freed = free_socket_locked(sock, is_tcp, &conn, &lastdata);
+    }
+  }
+  SYS_ARCH_UNPROTECT(lev);
+
+  if (freed) {
+    free_socket_free_elements(is_tcp, conn, &lastdata);
+  }
+}
+
+#else /* LWIP_NETCONN_FULLDUPLEX */
+#define sock_inc_used(sock)         1
+#define sock_inc_used_locked(sock)  1
+#define done_socket(sock)
+#endif /* LWIP_NETCONN_FULLDUPLEX */
+
+/* Translate a socket 'int' into a pointer (only fails if the index is invalid) */
+static struct lwip_sock *
+tryget_socket_unconn_nouse(int fd)
+{
+  int s = fd - LWIP_SOCKET_OFFSET;
   if ((s < 0) || (s >= NUM_SOCKETS)) {
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("get_socket(%d): invalid\n", s + LWIP_SOCKET_OFFSET));
-    set_errno(EBADF);
+    LWIP_DEBUGF(SOCKETS_DEBUG, ("tryget_socket_unconn(%d): invalid\n", fd));
     return NULL;
   }
+  return &sockets[s];
+}
 
-  sock = &sockets[s];
+struct lwip_sock *
+lwip_socket_dbg_get_socket(int fd)
+{
+  return tryget_socket_unconn_nouse(fd);
+}
 
-  if (!sock->conn) {
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("get_socket(%d): not active\n", s + LWIP_SOCKET_OFFSET));
-    set_errno(EBADF);
-    return NULL;
+/* Translate a socket 'int' into a pointer (only fails if the index is invalid) */
+static struct lwip_sock *
+tryget_socket_unconn(int fd)
+{
+  struct lwip_sock *ret = tryget_socket_unconn_nouse(fd);
+  if (ret != NULL) {
+    if (!sock_inc_used(ret)) {
+      return NULL;
+    }
   }
+  return ret;
+}
 
-  return sock;
+/* Like tryget_socket_unconn(), but called under SYS_ARCH_PROTECT lock. */
+static struct lwip_sock *
+tryget_socket_unconn_locked(int fd)
+{
+  struct lwip_sock *ret = tryget_socket_unconn_nouse(fd);
+  if (ret != NULL) {
+    if (!sock_inc_used_locked(ret)) {
+      return NULL;
+    }
+  }
+  return ret;
 }
 
 /**
  * Same as get_socket but doesn't set errno
  *
- * @param s externally used socket index
+ * @param fd externally used socket index
  * @return struct lwip_sock for the socket or NULL if not found
  */
 static struct lwip_sock *
-tryget_socket(int s)
+tryget_socket(int fd)
 {
-  s -= LWIP_SOCKET_OFFSET;
-  if ((s < 0) || (s >= NUM_SOCKETS)) {
+  struct lwip_sock *sock = tryget_socket_unconn(fd);
+  if (sock != NULL) {
+    if (sock->conn) {
+      return sock;
+    }
+    done_socket(sock);
+  }
+  return NULL;
+}
+
+/**
+ * Map a externally used socket index to the internal socket representation.
+ *
+ * @param fd externally used socket index
+ * @return struct lwip_sock for the socket or NULL if not found
+ */
+static struct lwip_sock *
+get_socket(int fd)
+{
+  struct lwip_sock *sock = tryget_socket(fd);
+  if (!sock) {
+    if ((fd < LWIP_SOCKET_OFFSET) || (fd >= (LWIP_SOCKET_OFFSET + NUM_SOCKETS))) {
+      LWIP_DEBUGF(SOCKETS_DEBUG, ("get_socket(%d): invalid\n", fd));
+    }
+    set_errno(EBADF);
     return NULL;
   }
-  if (!sockets[s].conn) {
-    return NULL;
-  }
-  return &sockets[s];
+  return sock;
 }
 
 /**
@@ -402,24 +502,34 @@
 {
   int i;
   SYS_ARCH_DECL_PROTECT(lev);
+  LWIP_UNUSED_ARG(accepted);
 
   /* allocate a new socket identifier */
   for (i = 0; i < NUM_SOCKETS; ++i) {
     /* Protect socket array */
     SYS_ARCH_PROTECT(lev);
-    if (!sockets[i].conn && (sockets[i].select_waiting == 0)) {
+    if (!sockets[i].conn) {
+#if LWIP_NETCONN_FULLDUPLEX
+      if (sockets[i].fd_used) {
+        SYS_ARCH_UNPROTECT(lev);
+        continue;
+      }
+      sockets[i].fd_used    = 1;
+      sockets[i].fd_free_pending = 0;
+#endif
       sockets[i].conn       = newconn;
       /* The socket is not yet known to anyone, so no need to protect
          after having marked it as used. */
       SYS_ARCH_UNPROTECT(lev);
-      sockets[i].lastdata   = NULL;
-      sockets[i].lastoffset = 0;
+      sockets[i].lastdata.pbuf = NULL;
+#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL
+      LWIP_ASSERT("sockets[i].select_waiting == 0", sockets[i].select_waiting == 0);
       sockets[i].rcvevent   = 0;
       /* TCP sendbuf is empty, but the socket is not yet writable until connected
        * (unless it has been created by accept()). */
       sockets[i].sendevent  = (NETCONNTYPE_GROUP(newconn->type) == NETCONN_TCP ? (accepted != 0) : 1);
       sockets[i].errevent   = 0;
-      sockets[i].err        = 0;
+#endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */
       return i + LWIP_SOCKET_OFFSET;
     }
     SYS_ARCH_UNPROTECT(lev);
@@ -427,6 +537,53 @@
   return -1;
 }
 
+/** Free a socket (under lock)
+ *
+ * @param sock the socket to free
+ * @param is_tcp != 0 for TCP sockets, used to free lastdata
+ * @param conn the socekt's netconn is stored here, must be freed externally
+ * @param lastdata lastdata is stored here, must be freed externally
+ */
+static int
+free_socket_locked(struct lwip_sock *sock, int is_tcp, struct netconn **conn,
+                   union lwip_sock_lastdata *lastdata)
+{
+#if LWIP_NETCONN_FULLDUPLEX
+  LWIP_ASSERT("sock->fd_used > 0", sock->fd_used > 0);
+  sock->fd_used--;
+  if (sock->fd_used > 0) {
+    sock->fd_free_pending = LWIP_SOCK_FD_FREE_FREE | (is_tcp ? LWIP_SOCK_FD_FREE_TCP : 0);
+    return 0;
+  }
+#else /* LWIP_NETCONN_FULLDUPLEX */
+  LWIP_UNUSED_ARG(is_tcp);
+#endif /* LWIP_NETCONN_FULLDUPLEX */
+
+  *lastdata = sock->lastdata;
+  sock->lastdata.pbuf = NULL;
+  *conn = sock->conn;
+  sock->conn = NULL;
+  return 1;
+}
+
+/** Free a socket's leftover members.
+ */
+static void
+free_socket_free_elements(int is_tcp, struct netconn *conn, union lwip_sock_lastdata *lastdata)
+{
+  if (lastdata->pbuf != NULL) {
+    if (is_tcp) {
+      pbuf_free(lastdata->pbuf);
+    } else {
+      netbuf_delete(lastdata->netbuf);
+    }
+  }
+  if (conn != NULL) {
+    /* netconn_prepare_delete() has already been called, here we only free the conn */
+    netconn_delete(conn);
+  }
+}
+
 /** Free a socket. The socket's netconn must have been
  * delete before!
  *
@@ -436,23 +593,20 @@
 static void
 free_socket(struct lwip_sock *sock, int is_tcp)
 {
-  void *lastdata;
-
-  lastdata         = sock->lastdata;
-  sock->lastdata   = NULL;
-  sock->lastoffset = 0;
-  sock->err        = 0;
+  int freed;
+  struct netconn *conn;
+  union lwip_sock_lastdata lastdata;
+  SYS_ARCH_DECL_PROTECT(lev);
 
   /* Protect socket array */
-  SYS_ARCH_SET(sock->conn, NULL);
+  SYS_ARCH_PROTECT(lev);
+
+  freed = free_socket_locked(sock, is_tcp, &conn, &lastdata);
+  SYS_ARCH_UNPROTECT(lev);
   /* don't use 'sock' after this line, as another task might have allocated it */
 
-  if (lastdata != NULL) {
-    if (is_tcp) {
-      pbuf_free((struct pbuf *)lastdata);
-    } else {
-      netbuf_delete((struct netbuf *)lastdata);
-    }
+  if (freed) {
+    free_socket_free_elements(is_tcp, conn, &lastdata);
   }
 }
 
@@ -471,6 +625,7 @@
   u16_t port = 0;
   int newsock;
   err_t err;
+  int recvevent;
   SYS_ARCH_DECL_PROTECT(lev);
 
   LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d)...\n", s));
@@ -479,12 +634,6 @@
     return -1;
   }
 
-  if (netconn_is_nonblocking(sock->conn) && (sock->rcvevent <= 0)) {
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): returning EWOULDBLOCK\n", s));
-    set_errno(EWOULDBLOCK);
-    return -1;
-  }
-
   /* wait for a new connection */
   err = netconn_accept(sock->conn, &newconn);
   if (err != ERR_OK) {
@@ -496,6 +645,7 @@
     } else {
       sock_set_errno(sock, err_to_errno(err));
     }
+    done_socket(sock);
     return -1;
   }
   LWIP_ASSERT("newconn != NULL", newconn != NULL);
@@ -504,10 +654,10 @@
   if (newsock == -1) {
     netconn_delete(newconn);
     sock_set_errno(sock, ENFILE);
+    done_socket(sock);
     return -1;
   }
   LWIP_ASSERT("invalid socket index", (newsock >= LWIP_SOCKET_OFFSET) && (newsock < NUM_SOCKETS + LWIP_SOCKET_OFFSET));
-  LWIP_ASSERT("newconn->callback == event_callback", newconn->callback == event_callback);
   nsock = &sockets[newsock - LWIP_SOCKET_OFFSET];
 
   /* See event_callback: If data comes in right away after an accept, even
@@ -516,14 +666,23 @@
    * so nsock->rcvevent is >= 1 here!
    */
   SYS_ARCH_PROTECT(lev);
-  nsock->rcvevent += (s16_t)(-1 - newconn->socket);
+  recvevent = (s16_t)(-1 - newconn->socket);
   newconn->socket = newsock;
   SYS_ARCH_UNPROTECT(lev);
 
+  if (newconn->callback) {
+    LOCK_TCPIP_CORE();
+    while (recvevent > 0) {
+      recvevent--;
+      newconn->callback(newconn, NETCONN_EVT_RCVPLUS, 0);
+    }
+    UNLOCK_TCPIP_CORE();
+  }
+
   /* Note that POSIX only requires us to check addr is non-NULL. addrlen must
    * not be NULL if addr is valid.
    */
-  if (addr != NULL) {
+  if ((addr != NULL) && (addrlen != NULL)) {
     union sockaddr_aligned tempaddr;
     /* get the IP address and port of the remote host */
     err = netconn_peer(newconn, &naddr, &port);
@@ -532,9 +691,9 @@
       netconn_delete(newconn);
       free_socket(nsock, 1);
       sock_set_errno(sock, err_to_errno(err));
+      done_socket(sock);
       return -1;
     }
-    LWIP_ASSERT("addr valid but addrlen NULL", addrlen != NULL);
 
     IPADDR_PORT_TO_SOCKADDR(&tempaddr, &naddr, port);
     if (*addrlen > tempaddr.sa.sa_len) {
@@ -550,6 +709,8 @@
   }
 
   sock_set_errno(sock, 0);
+  done_socket(sock);
+  done_socket(nsock);
   return newsock;
 }
 
@@ -569,13 +730,14 @@
   if (!SOCK_ADDR_TYPE_MATCH(name, sock)) {
     /* sockaddr does not match socket type (IPv4/IPv6) */
     sock_set_errno(sock, err_to_errno(ERR_VAL));
+    done_socket(sock);
     return -1;
   }
 
   /* 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)); return -1;);
+             sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
   LWIP_UNUSED_ARG(namelen);
 
   SOCKADDR_TO_IPADDR_PORT(name, &local_addr, local_port);
@@ -596,11 +758,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));
+    done_socket(sock);
     return -1;
   }
 
   LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d) succeeded\n", s));
   sock_set_errno(sock, 0);
+  done_socket(sock);
   return 0;
 }
 
@@ -621,17 +785,22 @@
   if (sock->conn != NULL) {
     is_tcp = NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP;
   } else {
-    LWIP_ASSERT("sock->lastdata == NULL", sock->lastdata == NULL);
+    LWIP_ASSERT("sock->lastdata == NULL", sock->lastdata.pbuf == NULL);
   }
 
 #if LWIP_IGMP
   /* drop all possibly joined IGMP memberships */
   lwip_socket_drop_registered_memberships(s);
 #endif /* LWIP_IGMP */
+#if LWIP_IPV6_MLD
+  /* drop all possibly joined MLD6 memberships */
+  lwip_socket_drop_registered_mld6_memberships(s);
+#endif /* LWIP_IPV6_MLD */
 
-  err = netconn_delete(sock->conn);
+  err = netconn_prepare_delete(sock->conn);
   if (err != ERR_OK) {
     sock_set_errno(sock, err_to_errno(err));
+    done_socket(sock);
     return -1;
   }
 
@@ -654,6 +823,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));
+    done_socket(sock);
     return -1;
   }
 
@@ -668,7 +838,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)); return -1;);
+               sock_set_errno(sock, 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));
@@ -689,11 +859,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));
+    done_socket(sock);
     return -1;
   }
 
   LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d) succeeded\n", s));
   sock_set_errno(sock, 0);
+  done_socket(sock);
   return 0;
 }
 
@@ -727,76 +899,62 @@
     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);
-      return -1;
+    } else {
+      sock_set_errno(sock, err_to_errno(err));
     }
-    sock_set_errno(sock, err_to_errno(err));
+    done_socket(sock);
     return -1;
   }
 
   sock_set_errno(sock, 0);
+  done_socket(sock);
   return 0;
 }
 
-int
-lwip_recvfrom(int s, void *mem, size_t len, int flags,
-              struct sockaddr *from, socklen_t *fromlen)
+#if LWIP_TCP
+/* Helper function to loop over receiving pbufs from netconn
+ * until "len" bytes are received or we're otherwise done.
+ * Keeps sock->lastdata for peeking or partly copying.
+ */
+static ssize_t
+lwip_recv_tcp(struct lwip_sock *sock, void *mem, size_t len, int flags)
 {
-  struct lwip_sock *sock;
-  void             *buf = NULL;
-  struct pbuf      *p;
-  u16_t            buflen, copylen;
-  int              off = 0;
-  u8_t             done = 0;
-  err_t            err;
+  u8_t apiflags = NETCONN_NOAUTORCVD;
+  ssize_t recvd = 0;
+  ssize_t recv_left = (len <= SSIZE_MAX) ? (ssize_t)len : SSIZE_MAX;
 
-  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d, %p, %"SZT_F", 0x%x, ..)\n", s, mem, len, flags));
-  sock = get_socket(s);
-  if (!sock) {
-    return -1;
+  LWIP_ASSERT("no socket given", sock != NULL);
+  LWIP_ASSERT("this should be checked internally", NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP);
+
+  if (flags & MSG_DONTWAIT) {
+    apiflags |= NETCONN_DONTBLOCK;
   }
 
   do {
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom: top while sock->lastdata=%p\n", sock->lastdata));
-    /* Check if there is data left from the last recv operation. */
-    if (sock->lastdata) {
-      buf = sock->lastdata;
-    } else {
-      /* If this is non-blocking call, then check first */
-      if (((flags & MSG_DONTWAIT) || netconn_is_nonblocking(sock->conn)) &&
-          (sock->rcvevent <= 0)) {
-        if (off > 0) {
-          /* already received data, return that */
-          sock_set_errno(sock, 0);
-          return off;
-        }
-        LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): returning EWOULDBLOCK\n", s));
-        set_errno(EWOULDBLOCK);
-        return -1;
-      }
+    struct pbuf *p;
+    err_t err;
+    u16_t copylen;
 
+    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: top while sock->lastdata=%p\n", (void *)sock->lastdata.pbuf));
+    /* Check if there is data left from the last recv operation. */
+    if (sock->lastdata.pbuf) {
+      p = sock->lastdata.pbuf;
+    } else {
       /* No data was left from the previous operation, so we try to get
          some from the network. */
-      if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
-        err = netconn_recv_tcp_pbuf(sock->conn, (struct pbuf **)&buf);
-      } else {
-        err = netconn_recv(sock->conn, (struct netbuf **)&buf);
-      }
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom: netconn_recv err=%d, netbuf=%p\n",
-        err, buf));
+      err = netconn_recv_tcp_pbuf_flags(sock->conn, &p, apiflags);
+      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: netconn_recv err=%d, pbuf=%p\n",
+                                  err, (void *)p));
 
       if (err != ERR_OK) {
-        if (off > 0) {
-          if (err == ERR_CLSD) {
-            /* closed but already received data, ensure select gets the FIN, too */
-            event_callback(sock->conn, NETCONN_EVT_RCVPLUS, 0);
-          }
-          /* already received data, return that */
-          sock_set_errno(sock, 0);
-          return off;
+        if (recvd > 0) {
+          /* already received data, return that (this trusts in getting the same error from
+             netconn layer again next time netconn_recv is called) */
+          goto lwip_recv_tcp_done;
         }
         /* We should really do some error checking here. */
-        LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): buf == NULL, error is \"%s\"!\n",
-          s, lwip_strerr(err)));
+        LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: p == NULL, error is \"%s\"!\n",
+                                    lwip_strerr(err)));
         sock_set_errno(sock, err_to_errno(err));
         if (err == ERR_CLSD) {
           return 0;
@@ -804,128 +962,423 @@
           return -1;
         }
       }
-      LWIP_ASSERT("buf != NULL", buf != NULL);
-      sock->lastdata = buf;
+      LWIP_ASSERT("p != NULL", p != NULL);
+      sock->lastdata.pbuf = p;
     }
 
-    if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
-      p = (struct pbuf *)buf;
+    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: buflen=%"U16_F" recv_left=%d off=%d\n",
+                                p->tot_len, (int)recv_left, (int)recvd));
+
+    if (recv_left > p->tot_len) {
+      copylen = p->tot_len;
     } else {
-      p = ((struct netbuf *)buf)->p;
+      copylen = (u16_t)recv_left;
     }
-    buflen = p->tot_len;
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom: buflen=%"U16_F" len=%"SZT_F" off=%d sock->lastoffset=%"U16_F"\n",
-      buflen, len, off, sock->lastoffset));
-
-    buflen -= sock->lastoffset;
-
-    if (len > buflen) {
-      copylen = buflen;
-    } else {
-      copylen = (u16_t)len;
+    if (recvd + copylen < recvd) {
+      /* overflow */
+      copylen = (u16_t)(SSIZE_MAX - recvd);
     }
 
     /* copy the contents of the received buffer into
     the supplied memory pointer mem */
-    pbuf_copy_partial(p, (u8_t*)mem + off, copylen, sock->lastoffset);
+    pbuf_copy_partial(p, (u8_t *)mem + recvd, copylen, 0);
 
-    off += copylen;
+    recvd += copylen;
 
-    if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
-      LWIP_ASSERT("invalid copylen, len would underflow", len >= copylen);
-      len -= copylen;
-      if ((len <= 0) ||
-          (p->flags & PBUF_FLAG_PUSH) ||
-          (sock->rcvevent <= 0) ||
-          ((flags & MSG_PEEK) != 0)) {
-        done = 1;
+    /* TCP combines multiple pbufs for one recv */
+    LWIP_ASSERT("invalid copylen, len would underflow", recv_left >= copylen);
+    recv_left -= copylen;
+
+    /* Unless we peek the incoming message... */
+    if ((flags & MSG_PEEK) == 0) {
+      /* ... check if there is data left in the pbuf */
+      LWIP_ASSERT("invalid copylen", p->tot_len >= copylen);
+      if (p->tot_len - copylen > 0) {
+        /* If so, it should be saved in the sock structure for the next recv call.
+           We store the pbuf but hide/free the consumed data: */
+        sock->lastdata.pbuf = pbuf_free_header(p, copylen);
+        LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: lastdata now pbuf=%p\n", (void *)sock->lastdata.pbuf));
+      } else {
+        sock->lastdata.pbuf = NULL;
+        LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: deleting pbuf=%p\n", (void *)p));
+        pbuf_free(p);
       }
-    } else {
-      done = 1;
     }
+    /* once we have some data to return, only add more if we don't need to wait */
+    apiflags |= NETCONN_DONTBLOCK | NETCONN_NOFIN;
+    /* @todo: do we need to support peeking more than one pbuf? */
+  } while ((recv_left > 0) && !(flags & MSG_PEEK));
+lwip_recv_tcp_done:
+  if ((recvd > 0) && !(flags & MSG_PEEK)) {
+    /* ensure window update after copying all data */
+    netconn_tcp_recvd(sock->conn, (size_t)recvd);
+  }
+  sock_set_errno(sock, 0);
+  return recvd;
+}
+#endif
 
-    /* Check to see from where the data was.*/
-    if (done) {
-#if !SOCKETS_DEBUG
-      if (from && fromlen)
-#endif /* !SOCKETS_DEBUG */
-      {
-        u16_t port;
-        ip_addr_t tmpaddr;
-        ip_addr_t *fromaddr;
-        union sockaddr_aligned saddr;
-        LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): addr=", s));
-        if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
-          fromaddr = &tmpaddr;
-          netconn_getaddr(sock->conn, fromaddr, &port, 0);
-        } else {
-          port = netbuf_fromport((struct netbuf *)buf);
-          fromaddr = netbuf_fromaddr((struct netbuf *)buf);
-        }
+/* Convert a netbuf's address data to struct sockaddr */
+static int
+lwip_sock_make_addr(struct netconn *conn, ip_addr_t *fromaddr, u16_t port,
+                    struct sockaddr *from, socklen_t *fromlen)
+{
+  int truncated = 0;
+  union sockaddr_aligned saddr;
+
+  LWIP_UNUSED_ARG(conn);
+
+  LWIP_ASSERT("fromaddr != NULL", fromaddr != NULL);
+  LWIP_ASSERT("from != NULL", from != NULL);
+  LWIP_ASSERT("fromlen != NULL", fromlen != NULL);
 
 #if LWIP_IPV4 && LWIP_IPV6
-        /* Dual-stack: Map IPv4 addresses to IPv4 mapped IPv6 */
-        if (NETCONNTYPE_ISIPV6(netconn_type(sock->conn)) && IP_IS_V4(fromaddr)) {
-          ip4_2_ipv4_mapped_ipv6(ip_2_ip6(fromaddr), ip_2_ip4(fromaddr));
-          IP_SET_TYPE(fromaddr, IPADDR_TYPE_V6);
-        }
+  /* Dual-stack: Map IPv4 addresses to IPv4 mapped IPv6 */
+  if (NETCONNTYPE_ISIPV6(netconn_type(conn)) && IP_IS_V4(fromaddr)) {
+    ip4_2_ipv4_mapped_ipv6(ip_2_ip6(fromaddr), ip_2_ip4(fromaddr));
+    IP_SET_TYPE(fromaddr, IPADDR_TYPE_V6);
+  }
 #endif /* LWIP_IPV4 && LWIP_IPV6 */
 
-        IPADDR_PORT_TO_SOCKADDR(&saddr, fromaddr, port);
-        ip_addr_debug_print(SOCKETS_DEBUG, fromaddr);
-        LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F" len=%d\n", port, off));
-#if SOCKETS_DEBUG
-        if (from && fromlen)
-#endif /* SOCKETS_DEBUG */
-        {
-          if (*fromlen > saddr.sa.sa_len) {
-            *fromlen = saddr.sa.sa_len;
-          }
-          MEMCPY(from, &saddr, *fromlen);
-        }
-      }
-    }
-
-    /* If we don't peek the incoming message... */
-    if ((flags & MSG_PEEK) == 0) {
-      /* If this is a TCP socket, check if there is data left in the
-         buffer. If so, it should be saved in the sock structure for next
-         time around. */
-      if ((NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) && (buflen - copylen > 0)) {
-        sock->lastdata = buf;
-        sock->lastoffset += copylen;
-        LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom: lastdata now netbuf=%p\n", buf));
-      } else {
-        sock->lastdata = NULL;
-        sock->lastoffset = 0;
-        LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom: deleting netbuf=%p\n", buf));
-        if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
-          pbuf_free((struct pbuf *)buf);
-        } else {
-          netbuf_delete((struct netbuf *)buf);
-        }
-        buf = NULL;
-      }
-    }
-  } while (!done);
-
-  sock_set_errno(sock, 0);
-  return off;
+  IPADDR_PORT_TO_SOCKADDR(&saddr, fromaddr, port);
+  if (*fromlen < saddr.sa.sa_len) {
+    truncated = 1;
+  } else if (*fromlen > saddr.sa.sa_len) {
+    *fromlen = saddr.sa.sa_len;
+  }
+  MEMCPY(from, &saddr, *fromlen);
+  return truncated;
 }
 
-int
+#if LWIP_TCP
+/* Helper function to get a tcp socket's remote address info */
+static int
+lwip_recv_tcp_from(struct lwip_sock *sock, struct sockaddr *from, socklen_t *fromlen, const char *dbg_fn, int dbg_s, ssize_t dbg_ret)
+{
+  if (sock == NULL) {
+    return 0;
+  }
+  LWIP_UNUSED_ARG(dbg_fn);
+  LWIP_UNUSED_ARG(dbg_s);
+  LWIP_UNUSED_ARG(dbg_ret);
+
+#if !SOCKETS_DEBUG
+  if (from && fromlen)
+#endif /* !SOCKETS_DEBUG */
+  {
+    /* get remote addr/port from tcp_pcb */
+    u16_t port;
+    ip_addr_t tmpaddr;
+    netconn_getaddr(sock->conn, &tmpaddr, &port, 0);
+    LWIP_DEBUGF(SOCKETS_DEBUG, ("%s(%d):  addr=", dbg_fn, dbg_s));
+    ip_addr_debug_print_val(SOCKETS_DEBUG, tmpaddr);
+    LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F" len=%d\n", port, (int)dbg_ret));
+    if (from && fromlen) {
+      return lwip_sock_make_addr(sock->conn, &tmpaddr, port, from, fromlen);
+    }
+  }
+  return 0;
+}
+#endif
+
+/* Helper function to receive a netbuf from a udp or raw netconn.
+ * Keeps sock->lastdata for peeking.
+ */
+static err_t
+lwip_recvfrom_udp_raw(struct lwip_sock *sock, int flags, struct msghdr *msg, u16_t *datagram_len, int dbg_s)
+{
+  struct netbuf *buf;
+  u8_t apiflags;
+  err_t err;
+  u16_t buflen, copylen, copied;
+  int 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;);
+
+  if (flags & MSG_DONTWAIT) {
+    apiflags = NETCONN_DONTBLOCK;
+  } else {
+    apiflags = 0;
+  }
+
+  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom_udp_raw[UDP/RAW]: top sock->lastdata=%p\n", (void *)sock->lastdata.netbuf));
+  /* Check if there is data left from the last recv operation. */
+  buf = sock->lastdata.netbuf;
+  if (buf == NULL) {
+    /* No data was left from the previous operation, so we try to get
+        some from the network. */
+    err = netconn_recv_udp_raw_netbuf_flags(sock->conn, &buf, apiflags);
+    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom_udp_raw[UDP/RAW]: netconn_recv err=%d, netbuf=%p\n",
+                                err, (void *)buf));
+
+    if (err != ERR_OK) {
+      return err;
+    }
+    LWIP_ASSERT("buf != NULL", buf != NULL);
+    sock->lastdata.netbuf = buf;
+  }
+  buflen = buf->p->tot_len;
+  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom_udp_raw: buflen=%"U16_F"\n", buflen));
+
+  copied = 0;
+  /* copy the pbuf payload into the iovs */
+  for (i = 0; (i < msg->msg_iovlen) && (copied < buflen); i++) {
+    u16_t len_left = (u16_t)(buflen - copied);
+    if (msg->msg_iov[i].iov_len > len_left) {
+      copylen = len_left;
+    } else {
+      copylen = (u16_t)msg->msg_iov[i].iov_len;
+    }
+
+    /* copy the contents of the received buffer into
+        the supplied memory buffer */
+    pbuf_copy_partial(buf->p, (u8_t *)msg->msg_iov[i].iov_base, copylen, copied);
+    copied = (u16_t)(copied + copylen);
+  }
+
+  /* Check to see from where the data was.*/
+#if !SOCKETS_DEBUG
+  if (msg->msg_name && msg->msg_namelen)
+#endif /* !SOCKETS_DEBUG */
+  {
+    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom_udp_raw(%d):  addr=", dbg_s));
+    ip_addr_debug_print_val(SOCKETS_DEBUG, *netbuf_fromaddr(buf));
+    LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F" len=%d\n", netbuf_fromport(buf), copied));
+    if (msg->msg_name && msg->msg_namelen) {
+      lwip_sock_make_addr(sock->conn, netbuf_fromaddr(buf), netbuf_fromport(buf),
+                          (struct sockaddr *)msg->msg_name, &msg->msg_namelen);
+    }
+  }
+
+  /* Initialize flag output */
+  msg->msg_flags = 0;
+
+  if (msg->msg_control) {
+    u8_t wrote_msg = 0;
+#if LWIP_NETBUF_RECVINFO
+    /* Check if packet info was recorded */
+    if (buf->flags & NETBUF_FLAG_DESTADDR) {
+      if (IP_IS_V4(&buf->toaddr)) {
+#if LWIP_IPV4
+        if (msg->msg_controllen >= CMSG_SPACE(sizeof(struct in_pktinfo))) {
+          struct cmsghdr *chdr = CMSG_FIRSTHDR(msg); /* This will always return a header!! */
+          struct in_pktinfo *pkti = (struct in_pktinfo *)CMSG_DATA(chdr);
+          chdr->cmsg_level = IPPROTO_IP;
+          chdr->cmsg_type = IP_PKTINFO;
+          chdr->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
+          pkti->ipi_ifindex = buf->p->if_idx;
+          inet_addr_from_ip4addr(&pkti->ipi_addr, ip_2_ip4(netbuf_destaddr(buf)));
+          msg->msg_controllen = CMSG_SPACE(sizeof(struct in_pktinfo));
+          wrote_msg = 1;
+        } else {
+          msg->msg_flags |= MSG_CTRUNC;
+        }
+#endif /* LWIP_IPV4 */
+      }
+    }
+#endif /* LWIP_NETBUF_RECVINFO */
+
+    if (!wrote_msg) {
+      msg->msg_controllen = 0;
+    }
+  }
+
+  /* If we don't peek the incoming message: zero lastdata pointer and free the netbuf */
+  if ((flags & MSG_PEEK) == 0) {
+    sock->lastdata.netbuf = NULL;
+    netbuf_delete(buf);
+  }
+  if (datagram_len) {
+    *datagram_len = buflen;
+  }
+  return ERR_OK;
+}
+
+ssize_t
+lwip_recvfrom(int s, void *mem, size_t len, int flags,
+              struct sockaddr *from, socklen_t *fromlen)
+{
+  struct lwip_sock *sock;
+  ssize_t ret;
+
+  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d, %p, %"SZT_F", 0x%x, ..)\n", s, mem, len, flags));
+  sock = get_socket(s);
+  if (!sock) {
+    return -1;
+  }
+#if LWIP_TCP
+  if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
+    ret = lwip_recv_tcp(sock, mem, len, flags);
+    lwip_recv_tcp_from(sock, from, fromlen, "lwip_recvfrom", s, ret);
+    done_socket(sock);
+    return ret;
+  } else
+#endif
+  {
+    u16_t datagram_len = 0;
+    struct iovec vec;
+    struct msghdr msg;
+    err_t err;
+    vec.iov_base = mem;
+    vec.iov_len = len;
+    msg.msg_control = NULL;
+    msg.msg_controllen = 0;
+    msg.msg_flags = 0;
+    msg.msg_iov = &vec;
+    msg.msg_iovlen = 1;
+    msg.msg_name = from;
+    msg.msg_namelen = (fromlen ? *fromlen : 0);
+    err = lwip_recvfrom_udp_raw(sock, flags, &msg, &datagram_len, s);
+    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));
+      done_socket(sock);
+      return -1;
+    }
+    ret = (ssize_t)LWIP_MIN(LWIP_MIN(len, datagram_len), SSIZE_MAX);
+    if (fromlen) {
+      *fromlen = msg.msg_namelen;
+    }
+  }
+
+  sock_set_errno(sock, 0);
+  done_socket(sock);
+  return ret;
+}
+
+ssize_t
 lwip_read(int s, void *mem, size_t len)
 {
   return lwip_recvfrom(s, mem, len, 0, NULL, NULL);
 }
 
-int
+ssize_t
+lwip_readv(int s, const struct iovec *iov, int iovcnt)
+{
+  struct msghdr msg;
+
+  msg.msg_name = NULL;
+  msg.msg_namelen = 0;
+  /* Hack: we have to cast via number to cast from 'const' pointer to non-const.
+     Blame the opengroup standard for this inconsistency. */
+  msg.msg_iov = LWIP_CONST_CAST(struct iovec *, iov);
+  msg.msg_iovlen = iovcnt;
+  msg.msg_control = NULL;
+  msg.msg_controllen = 0;
+  msg.msg_flags = 0;
+  return lwip_recvmsg(s, &msg, 0);
+}
+
+ssize_t
 lwip_recv(int s, void *mem, size_t len, int flags)
 {
   return lwip_recvfrom(s, mem, len, flags, NULL, NULL);
 }
 
-int
+ssize_t
+lwip_recvmsg(int s, struct msghdr *message, int flags)
+{
+  struct lwip_sock *sock;
+  int i;
+  ssize_t buflen;
+
+  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvmsg(%d, message=%p, flags=0x%x)\n", s, (void *)message, flags));
+  LWIP_ERROR("lwip_recvmsg: invalid message pointer", message != NULL, return ERR_ARG;);
+  LWIP_ERROR("lwip_recvmsg: unsupported flags", (flags & ~(MSG_PEEK|MSG_DONTWAIT)) == 0,
+             set_errno(EOPNOTSUPP); return -1;);
+
+  if ((message->msg_iovlen <= 0) || (message->msg_iovlen > IOV_MAX)) {
+    set_errno(EMSGSIZE);
+    return -1;
+  }
+
+  sock = get_socket(s);
+  if (!sock) {
+    return -1;
+  }
+
+  /* check for valid vectors */
+  buflen = 0;
+  for (i = 0; i < message->msg_iovlen; i++) {
+    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));
+      done_socket(sock);
+      return -1;
+    }
+    buflen = (ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len);
+  }
+
+  if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
+#if LWIP_TCP
+    int recv_flags = flags;
+    message->msg_flags = 0;
+    /* recv the data */
+    buflen = 0;
+    for (i = 0; i < message->msg_iovlen; i++) {
+      /* try to receive into this vector's buffer */
+      ssize_t recvd_local = lwip_recv_tcp(sock, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len, recv_flags);
+      if (recvd_local > 0) {
+        /* sum up received bytes */
+        buflen += recvd_local;
+      }
+      if ((recvd_local < 0) || (recvd_local < (int)message->msg_iov[i].iov_len) ||
+          (flags & MSG_PEEK)) {
+        /* returned prematurely (or peeking, which might actually be limitated to the first iov) */
+        if (buflen <= 0) {
+          /* nothing received at all, propagate the error */
+          buflen = recvd_local;
+        }
+        break;
+      }
+      /* pass MSG_DONTWAIT to lwip_recv_tcp() to prevent waiting for more data */
+      recv_flags |= MSG_DONTWAIT;
+    }
+    if (buflen > 0) {
+      /* reset socket error since we have received something */
+      sock_set_errno(sock, 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));
+    done_socket(sock);
+    return -1;
+#endif /* LWIP_TCP */
+  }
+  /* else, UDP and RAW NETCONNs */
+#if LWIP_UDP || LWIP_RAW
+  {
+    u16_t datagram_len = 0;
+    err_t err;
+    err = lwip_recvfrom_udp_raw(sock, flags, message, &datagram_len, s);
+    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));
+      done_socket(sock);
+      return -1;
+    }
+    if (datagram_len > buflen) {
+      message->msg_flags |= MSG_TRUNC;
+    }
+
+    sock_set_errno(sock, 0);
+    done_socket(sock);
+    return (int)datagram_len;
+  }
+#else /* LWIP_UDP || LWIP_RAW */
+  sock_set_errno(sock, err_to_errno(ERR_ARG));
+  done_socket(sock);
+  return -1;
+#endif /* LWIP_UDP || LWIP_RAW */
+}
+
+ssize_t
 lwip_send(int s, const void *data, size_t size, int flags)
 {
   struct lwip_sock *sock;
@@ -943,34 +1396,36 @@
 
   if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
 #if (LWIP_UDP || LWIP_RAW)
+    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));
+    done_socket(sock);
     return -1;
 #endif /* (LWIP_UDP || LWIP_RAW) */
   }
 
-  write_flags = NETCONN_COPY |
-    ((flags & MSG_MORE)     ? NETCONN_MORE      : 0) |
-    ((flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0);
+  write_flags = (u8_t)(NETCONN_COPY |
+                       ((flags & MSG_MORE)     ? NETCONN_MORE      : 0) |
+                       ((flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0));
   written = 0;
   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));
-  return (err == ERR_OK ? (int)written : -1);
+  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);
 }
 
-int
+ssize_t
 lwip_sendmsg(int s, const struct msghdr *msg, int flags)
 {
   struct lwip_sock *sock;
-  int i;
 #if LWIP_TCP
   u8_t write_flags;
   size_t written;
 #endif
-  int size = 0;
   err_t err = ERR_OK;
 
   sock = get_socket(s);
@@ -979,90 +1434,82 @@
   }
 
   LWIP_ERROR("lwip_sendmsg: invalid msghdr", msg != NULL,
-             sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;);
+             sock_set_errno(sock, 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;);
+  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;);
+  LWIP_ERROR("lwip_sendmsg: unsupported flags", (flags & ~(MSG_DONTWAIT | MSG_MORE)) == 0,
+             sock_set_errno(sock, EOPNOTSUPP); done_socket(sock); return -1;);
 
   LWIP_UNUSED_ARG(msg->msg_control);
   LWIP_UNUSED_ARG(msg->msg_controllen);
   LWIP_UNUSED_ARG(msg->msg_flags);
-  LWIP_ERROR("lwip_sendmsg: invalid msghdr iov", (msg->msg_iov != NULL && msg->msg_iovlen != 0),
-             sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;);
 
   if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
 #if LWIP_TCP
-    write_flags = NETCONN_COPY |
-    ((flags & MSG_MORE)     ? NETCONN_MORE      : 0) |
-    ((flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0);
+    write_flags = (u8_t)(NETCONN_COPY |
+                         ((flags & MSG_MORE)     ? NETCONN_MORE      : 0) |
+                         ((flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0));
 
-    for (i = 0; i < msg->msg_iovlen; i++) {
-      u8_t apiflags = write_flags;
-      if (i + 1 < msg->msg_iovlen) {
-        apiflags |= NETCONN_MORE;
-      }
-      written = 0;
-      err = netconn_write_partly(sock->conn, msg->msg_iov[i].iov_base, msg->msg_iov[i].iov_len, write_flags, &written);
-      if (err == ERR_OK) {
-        size += written;
-        /* check that the entire IO vector was accepected, if not return a partial write */
-        if (written != msg->msg_iov[i].iov_len)
-          break;
-      }
-      /* none of this IO vector was accepted, but previous was, return partial write and conceal ERR_WOULDBLOCK */
-      else if (err == ERR_WOULDBLOCK && size > 0) {
-        err = ERR_OK;
-        /* let ERR_WOULDBLOCK persist on the netconn since we are returning ERR_OK */
-        break;
-      } else {
-        size = -1;
-        break;
-      }
-    }
+    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));
-    return size;
+    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));
+    done_socket(sock);
     return -1;
 #endif /* LWIP_TCP */
   }
   /* else, UDP and RAW NETCONNs */
 #if LWIP_UDP || LWIP_RAW
   {
-    struct netbuf *chain_buf;
+    struct netbuf chain_buf;
+    int 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)); return -1;);
+               IS_SOCK_ADDR_LEN_VALID(msg->msg_namelen)),
+               sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
 
     /* initialize chain buffer with destination */
-    chain_buf = netbuf_new();
-    if (!chain_buf) {
-      sock_set_errno(sock, err_to_errno(ERR_MEM));
-      return -1;
-    }
+    memset(&chain_buf, 0, sizeof(struct netbuf));
     if (msg->msg_name) {
       u16_t remote_port;
-      SOCKADDR_TO_IPADDR_PORT((const struct sockaddr *)msg->msg_name, &chain_buf->addr, remote_port);
-      netbuf_fromport(chain_buf) = remote_port;
+      SOCKADDR_TO_IPADDR_PORT((const struct sockaddr *)msg->msg_name, &chain_buf.addr, remote_port);
+      netbuf_fromport(&chain_buf) = remote_port;
     }
 #if LWIP_NETIF_TX_SINGLE_PBUF
     for (i = 0; i < msg->msg_iovlen; i++) {
       size += msg->msg_iov[i].iov_len;
+      if ((msg->msg_iov[i].iov_len > INT_MAX) || (size < (int)msg->msg_iov[i].iov_len)) {
+        /* overflow */
+        goto sendmsg_emsgsize;
+      }
+    }
+    if (size > 0xFFFF) {
+      /* overflow */
+      goto sendmsg_emsgsize;
     }
     /* Allocate a new netbuf and copy the data into it. */
-    if (netbuf_alloc(chain_buf, (u16_t)size) == NULL) {
-       err = ERR_MEM;
+    if (netbuf_alloc(&chain_buf, (u16_t)size) == NULL) {
+      err = ERR_MEM;
     } else {
       /* flatten the IO vectors */
       size_t offset = 0;
       for (i = 0; i < msg->msg_iovlen; i++) {
-        MEMCPY(&((u8_t*)chain_buf->p->payload)[offset], msg->msg_iov[i].iov_base, msg->msg_iov[i].iov_len);
+        MEMCPY(&((u8_t *)chain_buf.p->payload)[offset], msg->msg_iov[i].iov_base, msg->msg_iov[i].iov_len);
         offset += msg->msg_iov[i].iov_len;
       }
 #if LWIP_CHECKSUM_ON_COPY
       {
         /* This can be improved by using LWIP_CHKSUM_COPY() and aggregating the checksum for each IO vector */
-        u16_t chksum = ~inet_chksum_pbuf(chain_buf->p);
-        netbuf_set_chksum(chain_buf, chksum);
+        u16_t chksum = ~inet_chksum_pbuf(chain_buf.p);
+        netbuf_set_chksum(&chain_buf, chksum);
       }
 #endif /* LWIP_CHECKSUM_ON_COPY */
       err = ERR_OK;
@@ -1071,56 +1518,72 @@
     /* create a chained netbuf from the IO vectors. NOTE: we assemble a pbuf chain
        manually to avoid having to allocate, chain, and delete a netbuf for each iov */
     for (i = 0; i < msg->msg_iovlen; i++) {
-      struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_REF);
+      struct pbuf *p;
+      if (msg->msg_iov[i].iov_len > 0xFFFF) {
+        /* overflow */
+        goto sendmsg_emsgsize;
+      }
+      p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_REF);
       if (p == NULL) {
         err = ERR_MEM; /* let netbuf_delete() cleanup chain_buf */
         break;
       }
       p->payload = msg->msg_iov[i].iov_base;
-      LWIP_ASSERT("iov_len < u16_t", msg->msg_iov[i].iov_len <= 0xFFFF);
       p->len = p->tot_len = (u16_t)msg->msg_iov[i].iov_len;
       /* netbuf empty, add new pbuf */
-      if (chain_buf->p == NULL) {
-        chain_buf->p = chain_buf->ptr = p;
+      if (chain_buf.p == NULL) {
+        chain_buf.p = chain_buf.ptr = p;
         /* add pbuf to existing pbuf chain */
       } else {
-        pbuf_cat(chain_buf->p, p);
+        if (chain_buf.p->tot_len + p->len > 0xffff) {
+          /* overflow */
+          pbuf_free(p);
+          goto sendmsg_emsgsize;
+        }
+        pbuf_cat(chain_buf.p, p);
       }
     }
     /* save size of total chain */
     if (err == ERR_OK) {
-      size = netbuf_len(chain_buf);
+      size = netbuf_len(&chain_buf);
     }
 #endif /* LWIP_NETIF_TX_SINGLE_PBUF */
 
     if (err == ERR_OK) {
 #if LWIP_IPV4 && LWIP_IPV6
       /* Dual-stack: Unmap IPv4 mapped IPv6 addresses */
-      if (IP_IS_V6_VAL(chain_buf->addr) && ip6_addr_isipv4mappedipv6(ip_2_ip6(&chain_buf->addr))) {
-        unmap_ipv4_mapped_ipv6(ip_2_ip4(&chain_buf->addr), ip_2_ip6(&chain_buf->addr));
-        IP_SET_TYPE_VAL(chain_buf->addr, IPADDR_TYPE_V4);
+      if (IP_IS_V6_VAL(chain_buf.addr) && ip6_addr_isipv4mappedipv6(ip_2_ip6(&chain_buf.addr))) {
+        unmap_ipv4_mapped_ipv6(ip_2_ip4(&chain_buf.addr), ip_2_ip6(&chain_buf.addr));
+        IP_SET_TYPE_VAL(chain_buf.addr, IPADDR_TYPE_V4);
       }
 #endif /* LWIP_IPV4 && LWIP_IPV6 */
 
       /* send the data */
-      err = netconn_send(sock->conn, chain_buf);
+      err = netconn_send(sock->conn, &chain_buf);
     }
 
     /* deallocated the buffer */
-    netbuf_delete(chain_buf);
+    netbuf_free(&chain_buf);
 
     sock_set_errno(sock, err_to_errno(err));
+    done_socket(sock);
     return (err == ERR_OK ? size : -1);
+sendmsg_emsgsize:
+    sock_set_errno(sock, EMSGSIZE);
+    netbuf_free(&chain_buf);
+    done_socket(sock);
+    return -1;
   }
 #else /* LWIP_UDP || LWIP_RAW */
   sock_set_errno(sock, err_to_errno(ERR_ARG));
+  done_socket(sock);
   return -1;
 #endif /* LWIP_UDP || LWIP_RAW */
 }
 
-int
+ssize_t
 lwip_sendto(int s, const void *data, size_t size, int flags,
-       const struct sockaddr *to, socklen_t tolen)
+            const struct sockaddr *to, socklen_t tolen)
 {
   struct lwip_sock *sock;
   err_t err;
@@ -1135,21 +1598,27 @@
 
   if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
 #if LWIP_TCP
+    done_socket(sock);
     return lwip_send(s, data, size, flags);
 #else /* LWIP_TCP */
     LWIP_UNUSED_ARG(flags);
     sock_set_errno(sock, err_to_errno(ERR_ARG));
+    done_socket(sock);
     return -1;
 #endif /* LWIP_TCP */
   }
 
-  /* @todo: split into multiple sendto's? */
-  LWIP_ASSERT("lwip_sendto: size must fit in u16_t", size <= 0xffff);
+  if (size > LWIP_MIN(0xFFFF, SSIZE_MAX)) {
+    /* cannot fit into one datagram (at least for us) */
+    sock_set_errno(sock, EMSGSIZE);
+    done_socket(sock);
+    return -1;
+  }
   short_size = (u16_t)size;
   LWIP_ERROR("lwip_sendto: invalid address", (((to == NULL) && (tolen == 0)) ||
              (IS_SOCK_ADDR_LEN_VALID(tolen) &&
-             IS_SOCK_ADDR_TYPE_VALID(to) && IS_SOCK_ADDR_ALIGNED(to))),
-             sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;);
+              ((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;);
   LWIP_UNUSED_ARG(tolen);
 
   /* initialize a buffer */
@@ -1167,8 +1636,8 @@
 
 
   LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_sendto(%d, data=%p, short_size=%"U16_F", flags=0x%x to=",
-              s, data, short_size, flags));
-  ip_addr_debug_print(SOCKETS_DEBUG, &buf.addr);
+                              s, data, short_size, flags));
+  ip_addr_debug_print_val(SOCKETS_DEBUG, buf.addr);
   LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F"\n", remote_port));
 
   /* make the buffer point to the data that should be sent */
@@ -1208,6 +1677,7 @@
   netbuf_free(&buf);
 
   sock_set_errno(sock, err_to_errno(err));
+  done_socket(sock);
   return (err == ERR_OK ? short_size : -1);
 }
 
@@ -1221,29 +1691,35 @@
 
   /* create a netconn */
   switch (type) {
-  case SOCK_RAW:
-    conn = netconn_new_with_proto_and_callback(DOMAIN_TO_NETCONN_TYPE(domain, NETCONN_RAW),
-                                               (u8_t)protocol, event_callback);
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_RAW, %d) = ",
-                                 domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol));
-    break;
-  case SOCK_DGRAM:
-    conn = netconn_new_with_callback(DOMAIN_TO_NETCONN_TYPE(domain,
-                 ((protocol == IPPROTO_UDPLITE) ? NETCONN_UDPLITE : NETCONN_UDP)) ,
-                 event_callback);
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_DGRAM, %d) = ",
-                                 domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol));
-    break;
-  case SOCK_STREAM:
-    conn = netconn_new_with_callback(DOMAIN_TO_NETCONN_TYPE(domain, NETCONN_TCP), event_callback);
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_STREAM, %d) = ",
-                                 domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol));
-    break;
-  default:
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%d, %d/UNKNOWN, %d) = -1\n",
-                                 domain, type, protocol));
-    set_errno(EINVAL);
-    return -1;
+    case SOCK_RAW:
+      conn = netconn_new_with_proto_and_callback(DOMAIN_TO_NETCONN_TYPE(domain, NETCONN_RAW),
+             (u8_t)protocol, DEFAULT_SOCKET_EVENTCB);
+      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_RAW, %d) = ",
+                                  domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol));
+      break;
+    case SOCK_DGRAM:
+      conn = netconn_new_with_callback(DOMAIN_TO_NETCONN_TYPE(domain,
+                                       ((protocol == IPPROTO_UDPLITE) ? NETCONN_UDPLITE : NETCONN_UDP)),
+                                       DEFAULT_SOCKET_EVENTCB);
+      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_DGRAM, %d) = ",
+                                  domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol));
+#if LWIP_NETBUF_RECVINFO
+      if (conn) {
+        /* netconn layer enables pktinfo by default, sockets default to off */
+        conn->flags &= ~NETCONN_FLAG_PKTINFO;
+      }
+#endif /* LWIP_NETBUF_RECVINFO */
+      break;
+    case SOCK_STREAM:
+      conn = netconn_new_with_callback(DOMAIN_TO_NETCONN_TYPE(domain, NETCONN_TCP), DEFAULT_SOCKET_EVENTCB);
+      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_STREAM, %d) = ",
+                                  domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol));
+      break;
+    default:
+      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%d, %d/UNKNOWN, %d) = -1\n",
+                                  domain, type, protocol));
+      set_errno(EINVAL);
+      return -1;
   }
 
   if (!conn) {
@@ -1260,18 +1736,19 @@
     return -1;
   }
   conn->socket = i;
+  done_socket(&sockets[i - LWIP_SOCKET_OFFSET]);
   LWIP_DEBUGF(SOCKETS_DEBUG, ("%d\n", i));
   set_errno(0);
   return i;
 }
 
-int
+ssize_t
 lwip_write(int s, const void *data, size_t size)
 {
   return lwip_send(s, data, size, 0);
 }
 
-int
+ssize_t
 lwip_writev(int s, const struct iovec *iov, int iovcnt)
 {
   struct msghdr msg;
@@ -1288,6 +1765,58 @@
   return lwip_sendmsg(s, &msg, 0);
 }
 
+#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL
+/* Add select_cb to select_cb_list. */
+static void
+lwip_link_select_cb(struct lwip_select_cb *select_cb)
+{
+  LWIP_SOCKET_SELECT_DECL_PROTECT(lev);
+
+  /* Protect the select_cb_list */
+  LWIP_SOCKET_SELECT_PROTECT(lev);
+
+  /* Put this select_cb on top of list */
+  select_cb->next = select_cb_list;
+  if (select_cb_list != NULL) {
+    select_cb_list->prev = select_cb;
+  }
+  select_cb_list = select_cb;
+#if !LWIP_TCPIP_CORE_LOCKING
+  /* Increasing this counter tells select_check_waiters that the list has changed. */
+  select_cb_ctr++;
+#endif
+
+  /* Now we can safely unprotect */
+  LWIP_SOCKET_SELECT_UNPROTECT(lev);
+}
+
+/* Remove select_cb from select_cb_list. */
+static void
+lwip_unlink_select_cb(struct lwip_select_cb *select_cb)
+{
+  LWIP_SOCKET_SELECT_DECL_PROTECT(lev);
+
+  /* Take us off the list */
+  LWIP_SOCKET_SELECT_PROTECT(lev);
+  if (select_cb->next != NULL) {
+    select_cb->next->prev = select_cb->prev;
+  }
+  if (select_cb_list == select_cb) {
+    LWIP_ASSERT("select_cb->prev == NULL", select_cb->prev == NULL);
+    select_cb_list = select_cb->next;
+  } else {
+    LWIP_ASSERT("select_cb->prev != NULL", select_cb->prev != NULL);
+    select_cb->prev->next = select_cb->next;
+  }
+#if !LWIP_TCPIP_CORE_LOCKING
+  /* Increasing this counter tells select_check_waiters that the list has changed. */
+  select_cb_ctr++;
+#endif
+  LWIP_SOCKET_SELECT_UNPROTECT(lev);
+}
+#endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */
+
+#if LWIP_SOCKET_SELECT
 /**
  * Go through the readset and writeset lists and see which socket of the sockets
  * set in the sets has events. On return, readset, writeset and exceptset have
@@ -1326,9 +1855,9 @@
     }
     /* First get the socket's status (protected)... */
     SYS_ARCH_PROTECT(lev);
-    sock = tryget_socket(i);
+    sock = tryget_socket_unconn_locked(i);
     if (sock != NULL) {
-      void* lastdata = sock->lastdata;
+      void *lastdata = sock->lastdata.pbuf;
       s16_t rcvevent = sock->rcvevent;
       u16_t sendevent = sock->sendevent;
       u16_t errevent = sock->errevent;
@@ -1353,9 +1882,11 @@
         LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for exception\n", i));
         nready++;
       }
+      done_socket(sock);
     } else {
       SYS_ARCH_UNPROTECT(lev);
-      /* continue on to next FD in list */
+      /* no a valid open socket */
+      return -1;
     }
   }
   /* copy local sets to the ones provided as arguments */
@@ -1367,6 +1898,68 @@
   return nready;
 }
 
+#if LWIP_NETCONN_FULLDUPLEX
+/* Mark all of the set sockets in one of the three fdsets passed to select as used.
+ * All sockets are marked (and later unmarked), whether they are open or not.
+ * This is OK as lwip_selscan aborts select when non-open sockets are found.
+ */
+static void
+lwip_select_inc_sockets_used_set(int maxfdp, fd_set *fdset, fd_set *used_sockets)
+{
+  SYS_ARCH_DECL_PROTECT(lev);
+  if (fdset) {
+    int i;
+    for (i = LWIP_SOCKET_OFFSET; i < maxfdp; i++) {
+      /* if this FD is in the set, lock it (unless already done) */
+      if (FD_ISSET(i, fdset) && !FD_ISSET(i, used_sockets)) {
+        struct lwip_sock *sock;
+        SYS_ARCH_PROTECT(lev);
+        sock = tryget_socket_unconn_locked(i);
+        if (sock != NULL) {
+          /* leave the socket used until released by lwip_select_dec_sockets_used */
+          FD_SET(i, used_sockets);
+        }
+        SYS_ARCH_UNPROTECT(lev);
+      }
+    }
+  }
+}
+
+/* Mark all sockets passed to select as used to prevent them from being freed
+ * from other threads while select is running.
+ * Marked sockets are added to 'used_sockets' to mark them only once an be able
+ * to unmark them correctly.
+ */
+static void
+lwip_select_inc_sockets_used(int maxfdp, fd_set *fdset1, fd_set *fdset2, fd_set *fdset3, fd_set *used_sockets)
+{
+  FD_ZERO(used_sockets);
+  lwip_select_inc_sockets_used_set(maxfdp, fdset1, used_sockets);
+  lwip_select_inc_sockets_used_set(maxfdp, fdset2, used_sockets);
+  lwip_select_inc_sockets_used_set(maxfdp, fdset3, used_sockets);
+}
+
+/* Let go all sockets that were marked as used when starting select */
+static void
+lwip_select_dec_sockets_used(int maxfdp, fd_set *used_sockets)
+{
+  int i;
+  for (i = LWIP_SOCKET_OFFSET; i < maxfdp; i++) {
+    /* if this FD is not in the set, continue */
+    if (FD_ISSET(i, used_sockets)) {
+      struct lwip_sock *sock = tryget_socket_unconn_nouse(i);
+      LWIP_ASSERT("socket gone at the end of select", sock != NULL);
+      if (sock != NULL) {
+        done_socket(sock);
+      }
+    }
+  }
+}
+#else /* LWIP_NETCONN_FULLDUPLEX */
+#define lwip_select_inc_sockets_used(maxfdp1, readset, writeset, exceptset, used_sockets)
+#define lwip_select_dec_sockets_used(maxfdp1, used_sockets)
+#endif /* LWIP_NETCONN_FULLDUPLEX */
+
 int
 lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,
             struct timeval *timeout)
@@ -1375,181 +1968,190 @@
   int nready;
   fd_set lreadset, lwriteset, lexceptset;
   u32_t msectimeout;
-  struct lwip_select_cb select_cb;
   int i;
   int maxfdp2;
 #if LWIP_NETCONN_SEM_PER_THREAD
   int waited = 0;
 #endif
+#if LWIP_NETCONN_FULLDUPLEX
+  fd_set used_sockets;
+#endif
   SYS_ARCH_DECL_PROTECT(lev);
 
   LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select(%d, %p, %p, %p, tvsec=%"S32_F" tvusec=%"S32_F")\n",
-                  maxfdp1, (void *)readset, (void *) writeset, (void *) exceptset,
-                  timeout ? (s32_t)timeout->tv_sec : (s32_t)-1,
-                  timeout ? (s32_t)timeout->tv_usec : (s32_t)-1));
+                              maxfdp1, (void *)readset, (void *) writeset, (void *) exceptset,
+                              timeout ? (s32_t)timeout->tv_sec : (s32_t) - 1,
+                              timeout ? (s32_t)timeout->tv_usec : (s32_t) - 1));
+
+  if ((maxfdp1 < 0) || (maxfdp1 > LWIP_SELECT_MAXNFDS)) {
+    set_errno(EINVAL);
+    return -1;
+  }
+
+  lwip_select_inc_sockets_used(maxfdp1, readset, writeset, exceptset, &used_sockets);
 
   /* Go through each socket in each list to count number of sockets which
      currently match */
   nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset);
 
-  /* If we don't have any current events, then suspend if we are supposed to */
-  if (!nready) {
+  if (nready < 0) {
+    /* one of the sockets in one of the fd_sets was invalid */
+    set_errno(EBADF);
+    lwip_select_dec_sockets_used(maxfdp1, &used_sockets);
+    return -1;
+  } else if (nready > 0) {
+    /* one or more sockets are set, no need to wait */
+    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: nready=%d\n", nready));
+  } else {
+    /* If we don't have any current events, then suspend if we are supposed to */
     if (timeout && timeout->tv_sec == 0 && timeout->tv_usec == 0) {
       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: no timeout, returning 0\n"));
       /* This is OK as the local fdsets are empty and nready is zero,
          or we would have returned earlier. */
-      goto return_copy_fdsets;
-    }
-
-    /* None ready: add our semaphore to list:
-       We don't actually need any dynamic memory. Our entry on the
-       list is only valid while we are in this function, so it's ok
-       to use local variables. */
-
-    select_cb.next = NULL;
-    select_cb.prev = NULL;
-    select_cb.readset = readset;
-    select_cb.writeset = writeset;
-    select_cb.exceptset = exceptset;
-    select_cb.sem_signalled = 0;
-#if LWIP_NETCONN_SEM_PER_THREAD
-    select_cb.sem = LWIP_NETCONN_THREAD_SEM_GET();
-#else /* LWIP_NETCONN_SEM_PER_THREAD */
-    if (sys_sem_new(&select_cb.sem, 0) != ERR_OK) {
-      /* failed to create semaphore */
-      set_errno(ENOMEM);
-      return -1;
-    }
-#endif /* LWIP_NETCONN_SEM_PER_THREAD */
-
-    /* Protect the select_cb_list */
-    SYS_ARCH_PROTECT(lev);
-
-    /* Put this select_cb on top of list */
-    select_cb.next = select_cb_list;
-    if (select_cb_list != NULL) {
-      select_cb_list->prev = &select_cb;
-    }
-    select_cb_list = &select_cb;
-    /* Increasing this counter tells event_callback that the list has changed. */
-    select_cb_ctr++;
-
-    /* Now we can safely unprotect */
-    SYS_ARCH_UNPROTECT(lev);
-
-    /* Increase select_waiting for each socket we are interested in */
-    maxfdp2 = maxfdp1;
-    for (i = LWIP_SOCKET_OFFSET; i < maxfdp1; i++) {
-      if ((readset && FD_ISSET(i, readset)) ||
-          (writeset && FD_ISSET(i, writeset)) ||
-          (exceptset && FD_ISSET(i, exceptset))) {
-        struct lwip_sock *sock;
-        SYS_ARCH_PROTECT(lev);
-        sock = tryget_socket(i);
-        if (sock != NULL) {
-          sock->select_waiting++;
-          LWIP_ASSERT("sock->select_waiting > 0", sock->select_waiting > 0);
-        } else {
-          /* Not a valid socket */
-          nready = -1;
-          maxfdp2 = i;
-          SYS_ARCH_UNPROTECT(lev);
-          break;
-        }
-        SYS_ARCH_UNPROTECT(lev);
-      }
-    }
-
-    if (nready >= 0) {
-      /* Call lwip_selscan again: there could have been events between
-         the last scan (without us on the list) and putting us on the list! */
-      nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset);
-      if (!nready) {
-        /* Still none ready, just wait to be woken */
-        if (timeout == 0) {
-          /* Wait forever */
-          msectimeout = 0;
-        } else {
-          msectimeout =  ((timeout->tv_sec * 1000) + ((timeout->tv_usec + 500)/1000));
-          if (msectimeout == 0) {
-            /* Wait 1ms at least (0 means wait forever) */
-            msectimeout = 1;
-          }
-        }
-
-        waitres = sys_arch_sem_wait(SELECT_SEM_PTR(select_cb.sem), msectimeout);
-#if LWIP_NETCONN_SEM_PER_THREAD
-        waited = 1;
-#endif
-      }
-    }
-
-    /* Decrease select_waiting for each socket we are interested in */
-    for (i = LWIP_SOCKET_OFFSET; i < maxfdp2; i++) {
-      if ((readset && FD_ISSET(i, readset)) ||
-          (writeset && FD_ISSET(i, writeset)) ||
-          (exceptset && FD_ISSET(i, exceptset))) {
-        struct lwip_sock *sock;
-        SYS_ARCH_PROTECT(lev);
-        sock = tryget_socket(i);
-        if (sock != NULL) {
-          /* for now, handle select_waiting==0... */
-          LWIP_ASSERT("sock->select_waiting > 0", sock->select_waiting > 0);
-          if (sock->select_waiting > 0) {
-            sock->select_waiting--;
-          }
-        } else {
-          /* Not a valid socket */
-          nready = -1;
-        }
-        SYS_ARCH_UNPROTECT(lev);
-      }
-    }
-    /* Take us off the list */
-    SYS_ARCH_PROTECT(lev);
-    if (select_cb.next != NULL) {
-      select_cb.next->prev = select_cb.prev;
-    }
-    if (select_cb_list == &select_cb) {
-      LWIP_ASSERT("select_cb.prev == NULL", select_cb.prev == NULL);
-      select_cb_list = select_cb.next;
     } else {
-      LWIP_ASSERT("select_cb.prev != NULL", select_cb.prev != NULL);
-      select_cb.prev->next = select_cb.next;
-    }
-    /* Increasing this counter tells event_callback that the list has changed. */
-    select_cb_ctr++;
-    SYS_ARCH_UNPROTECT(lev);
+      /* None ready: add our semaphore to list:
+         We don't actually need any dynamic memory. Our entry on the
+         list is only valid while we are in this function, so it's ok
+         to use local variables (unless we're running in MPU compatible
+         mode). */
+      API_SELECT_CB_VAR_DECLARE(select_cb);
+      API_SELECT_CB_VAR_ALLOC(select_cb, set_errno(ENOMEM); lwip_select_dec_sockets_used(maxfdp1, &used_sockets); return -1);
+      memset(&API_SELECT_CB_VAR_REF(select_cb), 0, sizeof(struct lwip_select_cb));
 
+      API_SELECT_CB_VAR_REF(select_cb).readset = readset;
+      API_SELECT_CB_VAR_REF(select_cb).writeset = writeset;
+      API_SELECT_CB_VAR_REF(select_cb).exceptset = exceptset;
 #if LWIP_NETCONN_SEM_PER_THREAD
-    if (select_cb.sem_signalled && (!waited || (waitres == SYS_ARCH_TIMEOUT))) {
-      /* don't leave the thread-local semaphore signalled */
-      sys_arch_sem_wait(select_cb.sem, 1);
-    }
+      API_SELECT_CB_VAR_REF(select_cb).sem = LWIP_NETCONN_THREAD_SEM_GET();
 #else /* LWIP_NETCONN_SEM_PER_THREAD */
-    sys_sem_free(&select_cb.sem);
+      if (sys_sem_new(&API_SELECT_CB_VAR_REF(select_cb).sem, 0) != ERR_OK) {
+        /* failed to create semaphore */
+        set_errno(ENOMEM);
+        lwip_select_dec_sockets_used(maxfdp1, &used_sockets);
+        API_SELECT_CB_VAR_FREE(select_cb);
+        return -1;
+      }
 #endif /* LWIP_NETCONN_SEM_PER_THREAD */
 
-    if (nready < 0) {
-      /* This happens when a socket got closed while waiting */
-      set_errno(EBADF);
-      return -1;
-    }
+      lwip_link_select_cb(&API_SELECT_CB_VAR_REF(select_cb));
 
-    if (waitres == SYS_ARCH_TIMEOUT) {
-      /* Timeout */
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: timeout expired\n"));
-      /* This is OK as the local fdsets are empty and nready is zero,
-         or we would have returned earlier. */
-      goto return_copy_fdsets;
-    }
+      /* Increase select_waiting for each socket we are interested in */
+      maxfdp2 = maxfdp1;
+      for (i = LWIP_SOCKET_OFFSET; i < maxfdp1; i++) {
+        if ((readset && FD_ISSET(i, readset)) ||
+            (writeset && FD_ISSET(i, writeset)) ||
+            (exceptset && FD_ISSET(i, exceptset))) {
+          struct lwip_sock *sock;
+          SYS_ARCH_PROTECT(lev);
+          sock = tryget_socket_unconn_locked(i);
+          if (sock != NULL) {
+            sock->select_waiting++;
+            if (sock->select_waiting == 0) {
+              /* overflow - too many threads waiting */
+              sock->select_waiting--;
+              nready = -1;
+              maxfdp2 = i;
+              SYS_ARCH_UNPROTECT(lev);
+              done_socket(sock);
+              set_errno(EBUSY);
+              break;
+            }
+            SYS_ARCH_UNPROTECT(lev);
+            done_socket(sock);
+          } else {
+            /* Not a valid socket */
+            nready = -1;
+            maxfdp2 = i;
+            SYS_ARCH_UNPROTECT(lev);
+            set_errno(EBADF);
+            break;
+          }
+        }
+      }
 
-    /* See what's set */
-    nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset);
+      if (nready >= 0) {
+        /* Call lwip_selscan again: there could have been events between
+           the last scan (without us on the list) and putting us on the list! */
+        nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset);
+        if (!nready) {
+          /* Still none ready, just wait to be woken */
+          if (timeout == 0) {
+            /* Wait forever */
+            msectimeout = 0;
+          } else {
+            long msecs_long = ((timeout->tv_sec * 1000) + ((timeout->tv_usec + 500) / 1000));
+            if (msecs_long <= 0) {
+              /* Wait 1ms at least (0 means wait forever) */
+              msectimeout = 1;
+            } else {
+              msectimeout = (u32_t)msecs_long;
+            }
+          }
+
+          waitres = sys_arch_sem_wait(SELECT_SEM_PTR(API_SELECT_CB_VAR_REF(select_cb).sem), msectimeout);
+#if LWIP_NETCONN_SEM_PER_THREAD
+          waited = 1;
+#endif
+        }
+      }
+
+      /* Decrease select_waiting for each socket we are interested in */
+      for (i = LWIP_SOCKET_OFFSET; i < maxfdp2; i++) {
+        if ((readset && FD_ISSET(i, readset)) ||
+            (writeset && FD_ISSET(i, writeset)) ||
+            (exceptset && FD_ISSET(i, exceptset))) {
+          struct lwip_sock *sock;
+          SYS_ARCH_PROTECT(lev);
+          sock = tryget_socket_unconn_locked(i);
+          if (sock != NULL) {
+            /* for now, handle select_waiting==0... */
+            LWIP_ASSERT("sock->select_waiting > 0", sock->select_waiting > 0);
+            if (sock->select_waiting > 0) {
+              sock->select_waiting--;
+            }
+            SYS_ARCH_UNPROTECT(lev);
+            done_socket(sock);
+          } else {
+            SYS_ARCH_UNPROTECT(lev);
+            /* Not a valid socket */
+            nready = -1;
+            set_errno(EBADF);
+          }
+        }
+      }
+
+      lwip_unlink_select_cb(&API_SELECT_CB_VAR_REF(select_cb));
+
+#if LWIP_NETCONN_SEM_PER_THREAD
+      if (API_SELECT_CB_VAR_REF(select_cb).sem_signalled && (!waited || (waitres == SYS_ARCH_TIMEOUT))) {
+        /* don't leave the thread-local semaphore signalled */
+        sys_arch_sem_wait(API_SELECT_CB_VAR_REF(select_cb).sem, 1);
+      }
+#else /* LWIP_NETCONN_SEM_PER_THREAD */
+      sys_sem_free(&API_SELECT_CB_VAR_REF(select_cb).sem);
+#endif /* LWIP_NETCONN_SEM_PER_THREAD */
+      API_SELECT_CB_VAR_FREE(select_cb);
+
+      if (nready < 0) {
+        /* This happens when a socket got closed while waiting */
+        lwip_select_dec_sockets_used(maxfdp1, &used_sockets);
+        return -1;
+      }
+
+      if (waitres == SYS_ARCH_TIMEOUT) {
+        /* Timeout */
+        LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: timeout expired\n"));
+        /* This is OK as the local fdsets are empty and nready is zero,
+           or we would have returned earlier. */
+      } else {
+        /* See what's set now after waiting */
+        nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset);
+        LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: nready=%d\n", nready));
+      }
+    }
   }
 
-  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: nready=%d\n", nready));
-return_copy_fdsets:
+  lwip_select_dec_sockets_used(maxfdp1, &used_sockets);
   set_errno(0);
   if (readset) {
     *readset = lreadset;
@@ -1562,18 +2164,320 @@
   }
   return nready;
 }
+#endif /* LWIP_SOCKET_SELECT */
 
+#if LWIP_SOCKET_POLL
+/** Options for the lwip_pollscan function. */
+enum lwip_pollscan_opts
+{
+  /** Clear revents in each struct pollfd. */
+  LWIP_POLLSCAN_CLEAR = 1,
+
+  /** Increment select_waiting in each struct lwip_sock. */
+  LWIP_POLLSCAN_INC_WAIT = 2,
+
+  /** Decrement select_waiting in each struct lwip_sock. */
+  LWIP_POLLSCAN_DEC_WAIT = 4
+};
+
+/**
+ * Update revents in each struct pollfd.
+ * Optionally update select_waiting in struct lwip_sock.
+ *
+ * @param fds          array of structures to update
+ * @param nfds         number of structures in fds
+ * @param opts         what to update and how
+ * @return number of structures that have revents != 0
+ */
+static int
+lwip_pollscan(struct pollfd *fds, nfds_t nfds, enum lwip_pollscan_opts opts)
+{
+  int nready = 0;
+  nfds_t fdi;
+  struct lwip_sock *sock;
+  SYS_ARCH_DECL_PROTECT(lev);
+
+  /* Go through each struct pollfd in the array. */
+  for (fdi = 0; fdi < nfds; fdi++) {
+    if ((opts & LWIP_POLLSCAN_CLEAR) != 0) {
+      fds[fdi].revents = 0;
+    }
+
+    /* Negative fd means the caller wants us to ignore this struct.
+       POLLNVAL means we already detected that the fd is invalid;
+       if another thread has since opened a new socket with that fd,
+       we must not use that socket. */
+    if (fds[fdi].fd >= 0 && (fds[fdi].revents & POLLNVAL) == 0) {
+      /* First get the socket's status (protected)... */
+      SYS_ARCH_PROTECT(lev);
+      sock = tryget_socket_unconn_locked(fds[fdi].fd);
+      if (sock != NULL) {
+        void* lastdata = sock->lastdata.pbuf;
+        s16_t rcvevent = sock->rcvevent;
+        u16_t sendevent = sock->sendevent;
+        u16_t errevent = sock->errevent;
+
+        if ((opts & LWIP_POLLSCAN_INC_WAIT) != 0) {
+          sock->select_waiting++;
+          if (sock->select_waiting == 0) {
+            /* overflow - too many threads waiting */
+            sock->select_waiting--;
+            nready = -1;
+            SYS_ARCH_UNPROTECT(lev);
+            done_socket(sock);
+            break;
+          }
+        } else if ((opts & LWIP_POLLSCAN_DEC_WAIT) != 0) {
+          /* for now, handle select_waiting==0... */
+          LWIP_ASSERT("sock->select_waiting > 0", sock->select_waiting > 0);
+          if (sock->select_waiting > 0) {
+            sock->select_waiting--;
+          }
+        }
+        SYS_ARCH_UNPROTECT(lev);
+        done_socket(sock);
+
+        /* ... then examine it: */
+        /* See if netconn of this socket is ready for read */
+        if ((fds[fdi].events & POLLIN) != 0 && ((lastdata != NULL) || (rcvevent > 0))) {
+          fds[fdi].revents |= POLLIN;
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_pollscan: fd=%d ready for reading\n", fds[fdi].fd));
+        }
+        /* See if netconn of this socket is ready for write */
+        if ((fds[fdi].events & POLLOUT) != 0 && (sendevent != 0)) {
+          fds[fdi].revents |= POLLOUT;
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_pollscan: fd=%d ready for writing\n", fds[fdi].fd));
+        }
+        /* See if netconn of this socket had an error */
+        if (errevent != 0) {
+          /* POLLERR is output only. */
+          fds[fdi].revents |= POLLERR;
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_pollscan: fd=%d ready for exception\n", fds[fdi].fd));
+        }
+      } else {
+        /* Not a valid socket */
+        SYS_ARCH_UNPROTECT(lev);
+        /* POLLNVAL is output only. */
+        fds[fdi].revents |= POLLNVAL;
+        return -1;
+      }
+    }
+
+    /* Will return the number of structures that have events,
+       not the number of events. */
+    if (fds[fdi].revents != 0) {
+      nready++;
+    }
+  }
+
+  LWIP_ASSERT("nready >= 0", nready >= 0);
+  return nready;
+}
+
+#if LWIP_NETCONN_FULLDUPLEX
+/* Mark all sockets as used.
+ *
+ * All sockets are marked (and later unmarked), whether they are open or not.
+ * This is OK as lwip_pollscan aborts select when non-open sockets are found.
+ */
+static void
+lwip_poll_inc_sockets_used(struct pollfd *fds, nfds_t nfds)
+{
+  nfds_t fdi;
+
+  if(fds) {
+    /* Go through each struct pollfd in the array. */
+    for (fdi = 0; fdi < nfds; fdi++) {
+      /* Increase the reference counter */
+      tryget_socket_unconn(fds[fdi].fd);
+    }
+  }
+}
+
+/* Let go all sockets that were marked as used when starting poll */
+static void
+lwip_poll_dec_sockets_used(struct pollfd *fds, nfds_t nfds)
+{
+  nfds_t fdi;
+
+  if(fds) {
+    /* Go through each struct pollfd in the array. */
+    for (fdi = 0; fdi < nfds; fdi++) {
+      struct lwip_sock *sock = tryget_socket_unconn_nouse(fds[fdi].fd);
+      if (sock != NULL) {
+        done_socket(sock);
+      }
+    }
+  }
+}
+#else /* LWIP_NETCONN_FULLDUPLEX */
+#define lwip_poll_inc_sockets_used(fds, nfds)
+#define lwip_poll_dec_sockets_used(fds, nfds)
+#endif /* LWIP_NETCONN_FULLDUPLEX */
+
+int
+lwip_poll(struct pollfd *fds, nfds_t nfds, int timeout)
+{
+  u32_t waitres = 0;
+  int nready;
+  u32_t msectimeout;
+#if LWIP_NETCONN_SEM_PER_THREAD
+  int waited = 0;
+#endif
+
+  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_poll(%p, %d, %d)\n",
+                  (void*)fds, (int)nfds, timeout));
+  LWIP_ERROR("lwip_poll: invalid fds", ((fds != NULL && nfds > 0) || (fds == NULL && nfds == 0)),
+             set_errno(EINVAL); return -1;);
+
+  lwip_poll_inc_sockets_used(fds, nfds);
+
+  /* Go through each struct pollfd to count number of structures
+     which currently match */
+  nready = lwip_pollscan(fds, nfds, LWIP_POLLSCAN_CLEAR);
+
+  if (nready < 0) {
+    lwip_poll_dec_sockets_used(fds, nfds);
+    return -1;
+  }
+
+  /* If we don't have any current events, then suspend if we are supposed to */
+  if (!nready) {
+    API_SELECT_CB_VAR_DECLARE(select_cb);
+
+    if (timeout == 0) {
+      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_poll: no timeout, returning 0\n"));
+      goto return_success;
+    }
+    API_SELECT_CB_VAR_ALLOC(select_cb, set_errno(EAGAIN); lwip_poll_dec_sockets_used(fds, nfds); return -1);
+    memset(&API_SELECT_CB_VAR_REF(select_cb), 0, sizeof(struct lwip_select_cb));
+
+    /* None ready: add our semaphore to list:
+       We don't actually need any dynamic memory. Our entry on the
+       list is only valid while we are in this function, so it's ok
+       to use local variables. */
+
+    API_SELECT_CB_VAR_REF(select_cb).poll_fds = fds;
+    API_SELECT_CB_VAR_REF(select_cb).poll_nfds = nfds;
+#if LWIP_NETCONN_SEM_PER_THREAD
+    API_SELECT_CB_VAR_REF(select_cb).sem = LWIP_NETCONN_THREAD_SEM_GET();
+#else /* LWIP_NETCONN_SEM_PER_THREAD */
+    if (sys_sem_new(&API_SELECT_CB_VAR_REF(select_cb).sem, 0) != ERR_OK) {
+      /* failed to create semaphore */
+      set_errno(EAGAIN);
+      lwip_poll_dec_sockets_used(fds, nfds);
+      API_SELECT_CB_VAR_FREE(select_cb);
+      return -1;
+    }
+#endif /* LWIP_NETCONN_SEM_PER_THREAD */
+
+    lwip_link_select_cb(&API_SELECT_CB_VAR_REF(select_cb));
+
+    /* Increase select_waiting for each socket we are interested in.
+       Also, check for events again: there could have been events between
+       the last scan (without us on the list) and putting us on the list! */
+    nready = lwip_pollscan(fds, nfds, LWIP_POLLSCAN_INC_WAIT);
+
+    if (!nready) {
+      /* Still none ready, just wait to be woken */
+      if (timeout < 0) {
+        /* Wait forever */
+        msectimeout = 0;
+      } else {
+        /* timeout == 0 would have been handled earlier. */
+        LWIP_ASSERT("timeout > 0", timeout > 0);
+        msectimeout = timeout;
+      }
+      waitres = sys_arch_sem_wait(SELECT_SEM_PTR(API_SELECT_CB_VAR_REF(select_cb).sem), msectimeout);
+#if LWIP_NETCONN_SEM_PER_THREAD
+      waited = 1;
+#endif
+    }
+
+    /* Decrease select_waiting for each socket we are interested in,
+       and check which events occurred while we waited. */
+    nready = lwip_pollscan(fds, nfds, LWIP_POLLSCAN_DEC_WAIT);
+
+    lwip_unlink_select_cb(&API_SELECT_CB_VAR_REF(select_cb));
+
+#if LWIP_NETCONN_SEM_PER_THREAD
+    if (select_cb.sem_signalled && (!waited || (waitres == SYS_ARCH_TIMEOUT))) {
+      /* don't leave the thread-local semaphore signalled */
+      sys_arch_sem_wait(API_SELECT_CB_VAR_REF(select_cb).sem, 1);
+    }
+#else /* LWIP_NETCONN_SEM_PER_THREAD */
+    sys_sem_free(&API_SELECT_CB_VAR_REF(select_cb).sem);
+#endif /* LWIP_NETCONN_SEM_PER_THREAD */
+    API_SELECT_CB_VAR_FREE(select_cb);
+
+    if (nready < 0) {
+      /* This happens when a socket got closed while waiting */
+      lwip_poll_dec_sockets_used(fds, nfds);
+      return -1;
+    }
+
+    if (waitres == SYS_ARCH_TIMEOUT) {
+      /* Timeout */
+      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_poll: timeout expired\n"));
+      goto return_success;
+    }
+  }
+
+  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_poll: nready=%d\n", nready));
+return_success:
+  lwip_poll_dec_sockets_used(fds, nfds);
+  set_errno(0);
+  return nready;
+}
+
+/**
+ * Check whether event_callback should wake up a thread waiting in
+ * lwip_poll.
+ */
+static int
+lwip_poll_should_wake(const struct lwip_select_cb *scb, int fd, int has_recvevent, int has_sendevent, int has_errevent)
+{
+  nfds_t fdi;
+  for (fdi = 0; fdi < scb->poll_nfds; fdi++) {
+    const struct pollfd *pollfd = &scb->poll_fds[fdi];
+    if (pollfd->fd == fd) {
+      /* Do not update pollfd->revents right here;
+         that would be a data race because lwip_pollscan
+         accesses revents without protecting. */
+      if (has_recvevent && (pollfd->events & POLLIN) != 0) {
+        return 1;
+      }
+      if (has_sendevent && (pollfd->events & POLLOUT) != 0) {
+        return 1;
+      }
+      if (has_errevent) {
+        /* POLLERR is output only. */
+        return 1;
+      }
+    }
+  }
+  return 0;
+}
+#endif /* LWIP_SOCKET_POLL */
+
+#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL
 /**
  * Callback registered in the netconn layer for each socket-netconn.
  * Processes recvevent (data available) and wakes up tasks waiting for select.
+ *
+ * @note for LWIP_TCPIP_CORE_LOCKING any caller of this function
+ * must have the core lock held when signaling the following events
+ * as they might cause select_list_cb to be checked:
+ *   NETCONN_EVT_RCVPLUS
+ *   NETCONN_EVT_SENDPLUS
+ *   NETCONN_EVT_ERROR
+ * This requirement will be asserted in select_check_waiters()
  */
 static void
 event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len)
 {
-  int s;
+  int s, check_waiters;
   struct lwip_sock *sock;
-  struct lwip_select_cb *scb;
-  int last_select_cb_ctr;
   SYS_ARCH_DECL_PROTECT(lev);
 
   LWIP_UNUSED_ARG(len);
@@ -1590,6 +2494,8 @@
       SYS_ARCH_PROTECT(lev);
       if (conn->socket < 0) {
         if (evt == NETCONN_EVT_RCVPLUS) {
+          /* conn->socket is -1 on initialization
+             lwip_accept adjusts sock->recvevent if conn->socket < -1 */
           conn->socket--;
         }
         SYS_ARCH_UNPROTECT(lev);
@@ -1607,20 +2513,29 @@
     return;
   }
 
+  check_waiters = 1;
   SYS_ARCH_PROTECT(lev);
   /* Set event as required */
   switch (evt) {
     case NETCONN_EVT_RCVPLUS:
       sock->rcvevent++;
+      if (sock->rcvevent > 1) {
+        check_waiters = 0;
+      }
       break;
     case NETCONN_EVT_RCVMINUS:
       sock->rcvevent--;
+      check_waiters = 0;
       break;
     case NETCONN_EVT_SENDPLUS:
+      if (sock->sendevent) {
+        check_waiters = 0;
+      }
       sock->sendevent = 1;
       break;
     case NETCONN_EVT_SENDMINUS:
       sock->sendevent = 0;
+      check_waiters = 0;
       break;
     case NETCONN_EVT_ERROR:
       sock->errevent = 1;
@@ -1630,48 +2545,93 @@
       break;
   }
 
-  if (sock->select_waiting == 0) {
-    /* noone is waiting for this socket, no need to check select_cb_list */
+  if (sock->select_waiting && check_waiters) {
+    /* Save which events are active */
+    int has_recvevent, has_sendevent, has_errevent;
+    has_recvevent = sock->rcvevent > 0;
+    has_sendevent = sock->sendevent != 0;
+    has_errevent = sock->errevent != 0;
     SYS_ARCH_UNPROTECT(lev);
-    return;
+    /* Check any select calls waiting on this socket */
+    select_check_waiters(s, has_recvevent, has_sendevent, has_errevent);
+  } else {
+    SYS_ARCH_UNPROTECT(lev);
   }
+  done_socket(sock);
+}
 
-  /* Now decide if anyone is waiting for this socket */
-  /* NOTE: This code goes through the select_cb_list list multiple times
-     ONLY IF a select was actually waiting. We go through the list the number
-     of waiting select calls + 1. This list is expected to be small. */
+/**
+ * Check if any select waiters are waiting on this socket and its events
+ *
+ * @note on synchronization of select_cb_list:
+ * LWIP_TCPIP_CORE_LOCKING: the select_cb_list must only be accessed while holding
+ * the core lock. We do a single pass through the list and signal any waiters.
+ * Core lock should already be held when calling here!!!!
 
-  /* At this point, SYS_ARCH is still protected! */
+ * !LWIP_TCPIP_CORE_LOCKING: we use SYS_ARCH_PROTECT but unlock on each iteration
+ * of the loop, thus creating a possibility where a thread could modify the
+ * select_cb_list during our UNPROTECT/PROTECT. We use a generational counter to
+ * detect this change and restart the list walk. The list is expected to be small
+ */
+static void select_check_waiters(int s, int has_recvevent, int has_sendevent, int has_errevent)
+{
+  struct lwip_select_cb *scb;
+#if !LWIP_TCPIP_CORE_LOCKING
+  int last_select_cb_ctr;
+  SYS_ARCH_DECL_PROTECT(lev);
+#endif /* !LWIP_TCPIP_CORE_LOCKING */
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+#if !LWIP_TCPIP_CORE_LOCKING
+  SYS_ARCH_PROTECT(lev);
 again:
+  /* remember the state of select_cb_list to detect changes */
+  last_select_cb_ctr = select_cb_ctr;
+#endif /* !LWIP_TCPIP_CORE_LOCKING */
   for (scb = select_cb_list; scb != NULL; scb = scb->next) {
-    /* remember the state of select_cb_list to detect changes */
-    last_select_cb_ctr = select_cb_ctr;
     if (scb->sem_signalled == 0) {
       /* semaphore not signalled yet */
       int do_signal = 0;
-      /* Test this select call for our socket */
-      if (sock->rcvevent > 0) {
-        if (scb->readset && FD_ISSET(s, scb->readset)) {
-          do_signal = 1;
+#if LWIP_SOCKET_POLL
+      if (scb->poll_fds != NULL) {
+        do_signal = lwip_poll_should_wake(scb, s, has_recvevent, has_sendevent, has_errevent);
+      }
+#endif /* LWIP_SOCKET_POLL */
+#if LWIP_SOCKET_SELECT && LWIP_SOCKET_POLL
+      else
+#endif /* LWIP_SOCKET_SELECT && LWIP_SOCKET_POLL */
+#if LWIP_SOCKET_SELECT
+      {
+        /* Test this select call for our socket */
+        if (has_recvevent) {
+          if (scb->readset && FD_ISSET(s, scb->readset)) {
+            do_signal = 1;
+          }
+        }
+        if (has_sendevent) {
+          if (!do_signal && scb->writeset && FD_ISSET(s, scb->writeset)) {
+            do_signal = 1;
+          }
+        }
+        if (has_errevent) {
+          if (!do_signal && scb->exceptset && FD_ISSET(s, scb->exceptset)) {
+            do_signal = 1;
+          }
         }
       }
-      if (sock->sendevent != 0) {
-        if (!do_signal && scb->writeset && FD_ISSET(s, scb->writeset)) {
-          do_signal = 1;
-        }
-      }
-      if (sock->errevent != 0) {
-        if (!do_signal && scb->exceptset && FD_ISSET(s, scb->exceptset)) {
-          do_signal = 1;
-        }
-      }
+#endif /* LWIP_SOCKET_SELECT */
       if (do_signal) {
         scb->sem_signalled = 1;
-        /* Don't call SYS_ARCH_UNPROTECT() before signaling the semaphore, as this might
-           lead to the select thread taking itself off the list, invalidating the semaphore. */
+        /* For !LWIP_TCPIP_CORE_LOCKING, we don't call SYS_ARCH_UNPROTECT() before signaling
+           the semaphore, as this might lead to the select thread taking itself off the list,
+           invalidating the semaphore. */
         sys_sem_signal(SELECT_SEM_PTR(scb->sem));
       }
     }
+#if LWIP_TCPIP_CORE_LOCKING
+  }
+#else
     /* unlock interrupts with each step */
     SYS_ARCH_UNPROTECT(lev);
     /* this makes sure interrupt protection time is short */
@@ -1680,9 +2640,13 @@
       /* someone has changed select_cb_list, restart at the beginning */
       goto again;
     }
+    /* remember the state of select_cb_list to detect changes */
+    last_select_cb_ctr = select_cb_ctr;
   }
   SYS_ARCH_UNPROTECT(lev);
+#endif
 }
+#endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */
 
 /**
  * Close one end of a full-duplex connection.
@@ -1704,10 +2668,12 @@
   if (sock->conn != NULL) {
     if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
       sock_set_errno(sock, EOPNOTSUPP);
+      done_socket(sock);
       return -1;
     }
   } else {
     sock_set_errno(sock, ENOTCONN);
+    done_socket(sock);
     return -1;
   }
 
@@ -1720,11 +2686,13 @@
     shut_tx = 1;
   } else {
     sock_set_errno(sock, EINVAL);
+    done_socket(sock);
     return -1;
   }
   err = netconn_shutdown(sock->conn, shut_rx, shut_tx);
 
   sock_set_errno(sock, err_to_errno(err));
+  done_socket(sock);
   return (err == ERR_OK ? 0 : -1);
 }
 
@@ -1746,6 +2714,7 @@
   err = netconn_getaddr(sock->conn, &naddr, &port, local);
   if (err != ERR_OK) {
     sock_set_errno(sock, err_to_errno(err));
+    done_socket(sock);
     return -1;
   }
 
@@ -1770,6 +2739,7 @@
   MEMCPY(name, &saddr, *namelen);
 
   sock_set_errno(sock, 0);
+  done_socket(sock);
   return 0;
 }
 
@@ -1788,9 +2758,10 @@
 int
 lwip_getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen)
 {
-  u8_t err;
+  int err;
   struct lwip_sock *sock = get_socket(s);
 #if !LWIP_TCPIP_CORE_LOCKING
+  err_t cberr;
   LWIP_SETGETSOCKOPT_DATA_VAR_DECLARE(data);
 #endif /* !LWIP_TCPIP_CORE_LOCKING */
 
@@ -1800,6 +2771,7 @@
 
   if ((NULL == optval) || (NULL == optlen)) {
     sock_set_errno(sock, EFAULT);
+    done_socket(sock);
     return -1;
   }
 
@@ -1815,6 +2787,7 @@
   /* MPU_COMPATIBLE copies the optval data, so check for max size here */
   if (*optlen > LWIP_SETGETSOCKOPT_MAXOPTLEN) {
     sock_set_errno(sock, ENOBUFS);
+    done_socket(sock);
     return -1;
   }
 #endif /* LWIP_MPU_COMPATIBLE */
@@ -1833,19 +2806,20 @@
 #else
   LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = &sock->conn->op_completed;
 #endif
-  err = tcpip_callback(lwip_getsockopt_callback, &LWIP_SETGETSOCKOPT_DATA_VAR_REF(data));
-  if (err != ERR_OK) {
+  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(err));
+    sock_set_errno(sock, 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);
+  sys_arch_sem_wait((sys_sem_t *)(LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem), 0);
 
   /* write back optlen and optval */
   *optlen = LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen;
 #if LWIP_MPU_COMPATIBLE
   MEMCPY(optval, LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optval,
-    LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen);
+         LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen);
 #endif /* LWIP_MPU_COMPATIBLE */
 
   /* maybe lwip_getsockopt_internal has changed err */
@@ -1854,6 +2828,7 @@
 #endif /* LWIP_TCPIP_CORE_LOCKING */
 
   sock_set_errno(sock, err);
+  done_socket(sock);
   return err ? -1 : 0;
 }
 
@@ -1866,337 +2841,373 @@
 {
   struct lwip_setgetsockopt_data *data;
   LWIP_ASSERT("arg != NULL", arg != NULL);
-  data = (struct lwip_setgetsockopt_data*)arg;
+  data = (struct lwip_setgetsockopt_data *)arg;
 
   data->err = lwip_getsockopt_impl(data->s, data->level, data->optname,
 #if LWIP_MPU_COMPATIBLE
-    data->optval,
+                                   data->optval,
 #else /* LWIP_MPU_COMPATIBLE */
-    data->optval.p,
+                                   data->optval.p,
 #endif /* LWIP_MPU_COMPATIBLE */
-    &data->optlen);
+                                   &data->optlen);
 
-  sys_sem_signal((sys_sem_t*)(data->completed_sem));
+  sys_sem_signal((sys_sem_t *)(data->completed_sem));
 }
 #endif  /* LWIP_TCPIP_CORE_LOCKING */
 
+static int
+lwip_sockopt_to_ipopt(int optname)
+{
+  /* Map SO_* values to our internal SOF_* values
+   * We should not rely on #defines in socket.h
+   * being in sync with ip.h.
+   */
+  switch (optname) {
+  case SO_BROADCAST:
+    return SOF_BROADCAST;
+  case SO_KEEPALIVE:
+    return SOF_KEEPALIVE;
+  case SO_REUSEADDR:
+    return SOF_REUSEADDR;
+  default:
+    LWIP_ASSERT("Unknown socket option", 0);
+    return 0;
+  }
+}
+
 /** lwip_getsockopt_impl: the actual implementation of getsockopt:
  * same argument as lwip_getsockopt, either called directly or through callback
  */
-static u8_t
+static int
 lwip_getsockopt_impl(int s, int level, int optname, void *optval, socklen_t *optlen)
 {
-  u8_t err = 0;
+  int err = 0;
   struct lwip_sock *sock = tryget_socket(s);
   if (!sock) {
     return EBADF;
   }
 
+#ifdef LWIP_HOOK_SOCKETS_GETSOCKOPT
+  if (LWIP_HOOK_SOCKETS_GETSOCKOPT(s, sock, level, optname, optval, optlen, &err)) {
+    return err;
+  }
+#endif
+
   switch (level) {
 
-/* Level: SOL_SOCKET */
-  case SOL_SOCKET:
-    switch (optname) {
+    /* Level: SOL_SOCKET */
+    case SOL_SOCKET:
+      switch (optname) {
 
 #if LWIP_TCP
-    case SO_ACCEPTCONN:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);
-      if (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_TCP) {
-        return ENOPROTOOPT;
-      }
-      if ((sock->conn->pcb.tcp != NULL) && (sock->conn->pcb.tcp->state == LISTEN)) {
-        *(int*)optval = 1;
-      } else {
-        *(int*)optval = 0;
-      }
-      break;
+        case SO_ACCEPTCONN:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);
+          if (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_TCP) {
+            done_socket(sock);
+            return ENOPROTOOPT;
+          }
+          if ((sock->conn->pcb.tcp != NULL) && (sock->conn->pcb.tcp->state == LISTEN)) {
+            *(int *)optval = 1;
+          } else {
+            *(int *)optval = 0;
+          }
+          break;
 #endif /* LWIP_TCP */
 
-    /* The option flags */
-    case SO_BROADCAST:
-    case SO_KEEPALIVE:
+        /* The option flags */
+        case SO_BROADCAST:
+        case SO_KEEPALIVE:
 #if SO_REUSE
-    case SO_REUSEADDR:
+        case SO_REUSEADDR:
 #endif /* SO_REUSE */
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);
-      *(int*)optval = ip_get_option(sock->conn->pcb.ip, optname);
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, optname=0x%x, ..) = %s\n",
-                                  s, optname, (*(int*)optval?"on":"off")));
-      break;
+          if ((optname == SO_BROADCAST) &&
+              (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_UDP)) {
+            done_socket(sock);
+            return ENOPROTOOPT;
+          }
 
-    case SO_TYPE:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int);
-      switch (NETCONNTYPE_GROUP(netconn_type(sock->conn))) {
-      case NETCONN_RAW:
-        *(int*)optval = SOCK_RAW;
-        break;
-      case NETCONN_TCP:
-        *(int*)optval = SOCK_STREAM;
-        break;
-      case NETCONN_UDP:
-        *(int*)optval = SOCK_DGRAM;
-        break;
-      default: /* unrecognized socket type */
-        *(int*)optval = netconn_type(sock->conn);
-        LWIP_DEBUGF(SOCKETS_DEBUG,
-                    ("lwip_getsockopt(%d, SOL_SOCKET, SO_TYPE): unrecognized socket type %d\n",
-                    s, *(int *)optval));
-      }  /* switch (netconn_type(sock->conn)) */
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_TYPE) = %d\n",
-                  s, *(int *)optval));
-      break;
+          optname = lwip_sockopt_to_ipopt(optname);
 
-    case SO_ERROR:
-      LWIP_SOCKOPT_CHECK_OPTLEN(*optlen, int);
-      /* only overwrite ERR_OK or temporary errors */
-      if (((sock->err == 0) || (sock->err == EINPROGRESS)) && (sock->conn != NULL)) {
-        sock_set_errno(sock, err_to_errno(sock->conn->last_err));
-      }
-      *(int *)optval = (sock->err == 0xFF ? (int)-1 : (int)sock->err);
-      sock->err = 0;
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_ERROR) = %d\n",
-                  s, *(int *)optval));
-      break;
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);
+          *(int *)optval = ip_get_option(sock->conn->pcb.ip, optname);
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, optname=0x%x, ..) = %s\n",
+                                      s, optname, (*(int *)optval ? "on" : "off")));
+          break;
+
+        case SO_TYPE:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int);
+          switch (NETCONNTYPE_GROUP(netconn_type(sock->conn))) {
+            case NETCONN_RAW:
+              *(int *)optval = SOCK_RAW;
+              break;
+            case NETCONN_TCP:
+              *(int *)optval = SOCK_STREAM;
+              break;
+            case NETCONN_UDP:
+              *(int *)optval = SOCK_DGRAM;
+              break;
+            default: /* unrecognized socket type */
+              *(int *)optval = netconn_type(sock->conn);
+              LWIP_DEBUGF(SOCKETS_DEBUG,
+                          ("lwip_getsockopt(%d, SOL_SOCKET, SO_TYPE): unrecognized socket type %d\n",
+                           s, *(int *)optval));
+          }  /* switch (netconn_type(sock->conn)) */
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_TYPE) = %d\n",
+                                      s, *(int *)optval));
+          break;
+
+        case SO_ERROR:
+          LWIP_SOCKOPT_CHECK_OPTLEN(sock, *optlen, int);
+          *(int *)optval = err_to_errno(netconn_err(sock->conn));
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_ERROR) = %d\n",
+                                      s, *(int *)optval));
+          break;
 
 #if LWIP_SO_SNDTIMEO
-    case SO_SNDTIMEO:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);
-      LWIP_SO_SNDRCVTIMEO_SET(optval, netconn_get_sendtimeout(sock->conn));
-      break;
+        case SO_SNDTIMEO:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);
+          LWIP_SO_SNDRCVTIMEO_SET(optval, netconn_get_sendtimeout(sock->conn));
+          break;
 #endif /* LWIP_SO_SNDTIMEO */
 #if LWIP_SO_RCVTIMEO
-    case SO_RCVTIMEO:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);
-      LWIP_SO_SNDRCVTIMEO_SET(optval, netconn_get_recvtimeout(sock->conn));
-      break;
+        case SO_RCVTIMEO:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);
+          LWIP_SO_SNDRCVTIMEO_SET(optval, netconn_get_recvtimeout(sock->conn));
+          break;
 #endif /* LWIP_SO_RCVTIMEO */
 #if LWIP_SO_RCVBUF
-    case SO_RCVBUF:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int);
-      *(int *)optval = netconn_get_recvbufsize(sock->conn);
-      break;
+        case SO_RCVBUF:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int);
+          *(int *)optval = netconn_get_recvbufsize(sock->conn);
+          break;
 #endif /* LWIP_SO_RCVBUF */
 #if LWIP_SO_LINGER
-    case SO_LINGER:
-      {
-        s16_t conn_linger;
-        struct linger* linger = (struct linger*)optval;
-        LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, struct linger);
-        conn_linger = sock->conn->linger;
-        if (conn_linger >= 0) {
-          linger->l_onoff = 1;
-          linger->l_linger = (int)conn_linger;
-        } else {
-          linger->l_onoff = 0;
-          linger->l_linger = 0;
+        case SO_LINGER: {
+          s16_t conn_linger;
+          struct linger *linger = (struct linger *)optval;
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, struct linger);
+          conn_linger = sock->conn->linger;
+          if (conn_linger >= 0) {
+            linger->l_onoff = 1;
+            linger->l_linger = (int)conn_linger;
+          } else {
+            linger->l_onoff = 0;
+            linger->l_linger = 0;
+          }
         }
-      }
-      break;
+        break;
 #endif /* LWIP_SO_LINGER */
 #if LWIP_UDP
-    case SO_NO_CHECK:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_UDP);
+        case SO_NO_CHECK:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_UDP);
 #if LWIP_UDPLITE
-      if ((udp_flags(sock->conn->pcb.udp) & UDP_FLAGS_UDPLITE) != 0) {
-        /* this flag is only available for UDP, not for UDP lite */
-        return EAFNOSUPPORT;
-      }
+          if (udp_is_flag_set(sock->conn->pcb.udp, UDP_FLAGS_UDPLITE)) {
+            /* this flag is only available for UDP, not for UDP lite */
+            done_socket(sock);
+            return EAFNOSUPPORT;
+          }
 #endif /* LWIP_UDPLITE */
-      *(int*)optval = (udp_flags(sock->conn->pcb.udp) & UDP_FLAGS_NOCHKSUM) ? 1 : 0;
-      break;
+          *(int *)optval = udp_is_flag_set(sock->conn->pcb.udp, UDP_FLAGS_NOCHKSUM) ? 1 : 0;
+          break;
 #endif /* LWIP_UDP*/
-    default:
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n",
-                  s, optname));
-      err = ENOPROTOOPT;
+        default:
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n",
+                                      s, optname));
+          err = ENOPROTOOPT;
+          break;
+      }  /* switch (optname) */
       break;
-    }  /* switch (optname) */
-    break;
 
-/* Level: IPPROTO_IP */
-  case IPPROTO_IP:
-    switch (optname) {
-    case IP_TTL:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);
-      *(int*)optval = sock->conn->pcb.ip->ttl;
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_TTL) = %d\n",
-                  s, *(int *)optval));
+    /* Level: IPPROTO_IP */
+    case IPPROTO_IP:
+      switch (optname) {
+        case IP_TTL:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);
+          *(int *)optval = sock->conn->pcb.ip->ttl;
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_TTL) = %d\n",
+                                      s, *(int *)optval));
+          break;
+        case IP_TOS:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);
+          *(int *)optval = sock->conn->pcb.ip->tos;
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_TOS) = %d\n",
+                                      s, *(int *)optval));
+          break;
+#if LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS && LWIP_UDP
+        case IP_MULTICAST_TTL:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, u8_t);
+          if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_UDP) {
+            done_socket(sock);
+            return ENOPROTOOPT;
+          }
+          *(u8_t *)optval = udp_get_multicast_ttl(sock->conn->pcb.udp);
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_TTL) = %d\n",
+                                      s, *(int *)optval));
+          break;
+        case IP_MULTICAST_IF:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, struct in_addr);
+          if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_UDP) {
+            done_socket(sock);
+            return ENOPROTOOPT;
+          }
+          inet_addr_from_ip4addr((struct in_addr *)optval, udp_get_multicast_netif_addr(sock->conn->pcb.udp));
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_IF) = 0x%"X32_F"\n",
+                                      s, *(u32_t *)optval));
+          break;
+        case IP_MULTICAST_LOOP:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, u8_t);
+          if ((sock->conn->pcb.udp->flags & UDP_FLAGS_MULTICAST_LOOP) != 0) {
+            *(u8_t *)optval = 1;
+          } else {
+            *(u8_t *)optval = 0;
+          }
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_LOOP) = %d\n",
+                                      s, *(int *)optval));
+          break;
+#endif /* LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS && LWIP_UDP */
+        default:
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\n",
+                                      s, optname));
+          err = ENOPROTOOPT;
+          break;
+      }  /* switch (optname) */
       break;
-    case IP_TOS:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);
-      *(int*)optval = sock->conn->pcb.ip->tos;
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_TOS) = %d\n",
-                  s, *(int *)optval));
-      break;
-#if LWIP_MULTICAST_TX_OPTIONS
-    case IP_MULTICAST_TTL:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, u8_t);
-      if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_UDP) {
-        return ENOPROTOOPT;
-      }
-      *(u8_t*)optval = udp_get_multicast_ttl(sock->conn->pcb.udp);
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_TTL) = %d\n",
-                  s, *(int *)optval));
-      break;
-    case IP_MULTICAST_IF:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, struct in_addr);
-      if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_UDP) {
-        return ENOPROTOOPT;
-      }
-      inet_addr_from_ip4addr((struct in_addr*)optval, udp_get_multicast_netif_addr(sock->conn->pcb.udp));
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_IF) = 0x%"X32_F"\n",
-                  s, *(u32_t *)optval));
-      break;
-    case IP_MULTICAST_LOOP:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, u8_t);
-      if ((sock->conn->pcb.udp->flags & UDP_FLAGS_MULTICAST_LOOP) != 0) {
-        *(u8_t*)optval = 1;
-      } else {
-        *(u8_t*)optval = 0;
-      }
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_LOOP) = %d\n",
-                  s, *(int *)optval));
-      break;
-#endif /* LWIP_MULTICAST_TX_OPTIONS */
-    default:
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\n",
-                  s, optname));
-      err = ENOPROTOOPT;
-      break;
-    }  /* switch (optname) */
-    break;
 
 #if LWIP_TCP
-/* Level: IPPROTO_TCP */
-  case IPPROTO_TCP:
-    /* Special case: all IPPROTO_TCP option take an int */
-    LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_TCP);
-    if (sock->conn->pcb.tcp->state == LISTEN) {
-      return EINVAL;
-    }
-    switch (optname) {
-    case TCP_NODELAY:
-      *(int*)optval = tcp_nagle_disabled(sock->conn->pcb.tcp);
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_NODELAY) = %s\n",
-                  s, (*(int*)optval)?"on":"off") );
-      break;
-    case TCP_KEEPALIVE:
-      *(int*)optval = (int)sock->conn->pcb.tcp->keep_idle;
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPALIVE) = %d\n",
-                  s, *(int *)optval));
-      break;
+    /* Level: IPPROTO_TCP */
+    case IPPROTO_TCP:
+      /* Special case: all IPPROTO_TCP option take an int */
+      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_TCP);
+      if (sock->conn->pcb.tcp->state == LISTEN) {
+        done_socket(sock);
+        return EINVAL;
+      }
+      switch (optname) {
+        case TCP_NODELAY:
+          *(int *)optval = tcp_nagle_disabled(sock->conn->pcb.tcp);
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_NODELAY) = %s\n",
+                                      s, (*(int *)optval) ? "on" : "off") );
+          break;
+        case TCP_KEEPALIVE:
+          *(int *)optval = (int)sock->conn->pcb.tcp->keep_idle;
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPALIVE) = %d\n",
+                                      s, *(int *)optval));
+          break;
 
 #if LWIP_TCP_KEEPALIVE
-    case TCP_KEEPIDLE:
-      *(int*)optval = (int)(sock->conn->pcb.tcp->keep_idle/1000);
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPIDLE) = %d\n",
-                  s, *(int *)optval));
-      break;
-    case TCP_KEEPINTVL:
-      *(int*)optval = (int)(sock->conn->pcb.tcp->keep_intvl/1000);
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPINTVL) = %d\n",
-                  s, *(int *)optval));
-      break;
-    case TCP_KEEPCNT:
-      *(int*)optval = (int)sock->conn->pcb.tcp->keep_cnt;
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPCNT) = %d\n",
-                  s, *(int *)optval));
-      break;
+        case TCP_KEEPIDLE:
+          *(int *)optval = (int)(sock->conn->pcb.tcp->keep_idle / 1000);
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPIDLE) = %d\n",
+                                      s, *(int *)optval));
+          break;
+        case TCP_KEEPINTVL:
+          *(int *)optval = (int)(sock->conn->pcb.tcp->keep_intvl / 1000);
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPINTVL) = %d\n",
+                                      s, *(int *)optval));
+          break;
+        case TCP_KEEPCNT:
+          *(int *)optval = (int)sock->conn->pcb.tcp->keep_cnt;
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPCNT) = %d\n",
+                                      s, *(int *)optval));
+          break;
 #endif /* LWIP_TCP_KEEPALIVE */
-    default:
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n",
-                  s, optname));
-      err = ENOPROTOOPT;
+        default:
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n",
+                                      s, optname));
+          err = ENOPROTOOPT;
+          break;
+      }  /* switch (optname) */
       break;
-    }  /* switch (optname) */
-    break;
 #endif /* LWIP_TCP */
 
 #if LWIP_IPV6
-/* Level: IPPROTO_IPV6 */
-  case IPPROTO_IPV6:
-    switch (optname) {
-    case IPV6_V6ONLY:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int);
-      *(int*)optval = (netconn_get_ipv6only(sock->conn) ? 1 : 0);
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IPV6, IPV6_V6ONLY) = %d\n",
-                  s, *(int *)optval));
+    /* Level: IPPROTO_IPV6 */
+    case IPPROTO_IPV6:
+      switch (optname) {
+        case IPV6_V6ONLY:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int);
+          *(int *)optval = (netconn_get_ipv6only(sock->conn) ? 1 : 0);
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IPV6, IPV6_V6ONLY) = %d\n",
+                                      s, *(int *)optval));
+          break;
+        default:
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IPV6, UNIMPL: optname=0x%x, ..)\n",
+                                      s, optname));
+          err = ENOPROTOOPT;
+          break;
+      }  /* switch (optname) */
       break;
-    default:
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IPV6, UNIMPL: optname=0x%x, ..)\n",
-                  s, optname));
-      err = ENOPROTOOPT;
-      break;
-    }  /* switch (optname) */
-    break;
 #endif /* LWIP_IPV6 */
 
 #if LWIP_UDP && LWIP_UDPLITE
-  /* Level: IPPROTO_UDPLITE */
-  case IPPROTO_UDPLITE:
-    /* Special case: all IPPROTO_UDPLITE option take an int */
-    LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);
-    /* If this is no UDP lite socket, ignore any options. */
-    if (!NETCONNTYPE_ISUDPLITE(netconn_type(sock->conn))) {
-      return ENOPROTOOPT;
-    }
-    switch (optname) {
-    case UDPLITE_SEND_CSCOV:
-      *(int*)optval = sock->conn->pcb.udp->chksum_len_tx;
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV) = %d\n",
-                  s, (*(int*)optval)) );
-      break;
-    case UDPLITE_RECV_CSCOV:
-      *(int*)optval = sock->conn->pcb.udp->chksum_len_rx;
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV) = %d\n",
-                  s, (*(int*)optval)) );
-      break;
-    default:
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UNIMPL: optname=0x%x, ..)\n",
-                  s, optname));
-      err = ENOPROTOOPT;
-      break;
-    }  /* switch (optname) */
-    break;
-#endif /* LWIP_UDP */
-  /* Level: IPPROTO_RAW */
-  case IPPROTO_RAW:
-    switch (optname) {
-#if LWIP_IPV6 && LWIP_RAW
-    case IPV6_CHECKSUM:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_RAW);
-      if (sock->conn->pcb.raw->chksum_reqd == 0) {
-        *(int *)optval = -1;
-      } else {
-        *(int *)optval = sock->conn->pcb.raw->chksum_offset;
+    /* Level: IPPROTO_UDPLITE */
+    case IPPROTO_UDPLITE:
+      /* Special case: all IPPROTO_UDPLITE option take an int */
+      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);
+      /* If this is no UDP lite socket, ignore any options. */
+      if (!NETCONNTYPE_ISUDPLITE(netconn_type(sock->conn))) {
+        done_socket(sock);
+        return ENOPROTOOPT;
       }
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_RAW, IPV6_CHECKSUM) = %d\n",
-                  s, (*(int*)optval)) );
+      switch (optname) {
+        case UDPLITE_SEND_CSCOV:
+          *(int *)optval = sock->conn->pcb.udp->chksum_len_tx;
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV) = %d\n",
+                                      s, (*(int *)optval)) );
+          break;
+        case UDPLITE_RECV_CSCOV:
+          *(int *)optval = sock->conn->pcb.udp->chksum_len_rx;
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV) = %d\n",
+                                      s, (*(int *)optval)) );
+          break;
+        default:
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UNIMPL: optname=0x%x, ..)\n",
+                                      s, optname));
+          err = ENOPROTOOPT;
+          break;
+      }  /* switch (optname) */
       break;
+#endif /* LWIP_UDP */
+    /* Level: IPPROTO_RAW */
+    case IPPROTO_RAW:
+      switch (optname) {
+#if LWIP_IPV6 && LWIP_RAW
+        case IPV6_CHECKSUM:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_RAW);
+          if (sock->conn->pcb.raw->chksum_reqd == 0) {
+            *(int *)optval = -1;
+          } else {
+            *(int *)optval = sock->conn->pcb.raw->chksum_offset;
+          }
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_RAW, IPV6_CHECKSUM) = %d\n",
+                                      s, (*(int *)optval)) );
+          break;
 #endif /* LWIP_IPV6 && LWIP_RAW */
+        default:
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_RAW, UNIMPL: optname=0x%x, ..)\n",
+                                      s, optname));
+          err = ENOPROTOOPT;
+          break;
+      }  /* switch (optname) */
+      break;
     default:
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_RAW, UNIMPL: optname=0x%x, ..)\n",
-                  s, optname));
+      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n",
+                                  s, level, optname));
       err = ENOPROTOOPT;
       break;
-    }  /* switch (optname) */
-    break;
-  default:
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n",
-                                s, level, optname));
-    err = ENOPROTOOPT;
-    break;
   } /* switch (level) */
 
+  done_socket(sock);
   return err;
 }
 
 int
 lwip_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen)
 {
-  u8_t err = 0;
+  int err = 0;
   struct lwip_sock *sock = get_socket(s);
 #if !LWIP_TCPIP_CORE_LOCKING
+  err_t cberr;
   LWIP_SETGETSOCKOPT_DATA_VAR_DECLARE(data);
 #endif /* !LWIP_TCPIP_CORE_LOCKING */
 
@@ -2206,6 +3217,7 @@
 
   if (NULL == optval) {
     sock_set_errno(sock, EFAULT);
+    done_socket(sock);
     return -1;
   }
 
@@ -2221,6 +3233,7 @@
   /* MPU_COMPATIBLE copies the optval data, so check for max size here */
   if (optlen > LWIP_SETGETSOCKOPT_MAXOPTLEN) {
     sock_set_errno(sock, ENOBUFS);
+    done_socket(sock);
     return -1;
   }
 #endif /* LWIP_MPU_COMPATIBLE */
@@ -2233,7 +3246,7 @@
 #if LWIP_MPU_COMPATIBLE
   MEMCPY(LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optval, optval, optlen);
 #else /* LWIP_MPU_COMPATIBLE */
-  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optval.pc = (const void*)optval;
+  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optval.pc = (const void *)optval;
 #endif /* LWIP_MPU_COMPATIBLE */
   LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err = 0;
 #if LWIP_NETCONN_SEM_PER_THREAD
@@ -2241,13 +3254,14 @@
 #else
   LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = &sock->conn->op_completed;
 #endif
-  err = tcpip_callback(lwip_setsockopt_callback, &LWIP_SETGETSOCKOPT_DATA_VAR_REF(data));
-  if (err != ERR_OK) {
+  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(err));
+    sock_set_errno(sock, 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);
+  sys_arch_sem_wait((sys_sem_t *)(LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem), 0);
 
   /* maybe lwip_getsockopt_internal has changed err */
   err = LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err;
@@ -2255,6 +3269,7 @@
 #endif  /* LWIP_TCPIP_CORE_LOCKING */
 
   sock_set_errno(sock, err);
+  done_socket(sock);
   return err ? -1 : 0;
 }
 
@@ -2267,347 +3282,460 @@
 {
   struct lwip_setgetsockopt_data *data;
   LWIP_ASSERT("arg != NULL", arg != NULL);
-  data = (struct lwip_setgetsockopt_data*)arg;
+  data = (struct lwip_setgetsockopt_data *)arg;
 
   data->err = lwip_setsockopt_impl(data->s, data->level, data->optname,
 #if LWIP_MPU_COMPATIBLE
-    data->optval,
+                                   data->optval,
 #else /* LWIP_MPU_COMPATIBLE */
-    data->optval.pc,
+                                   data->optval.pc,
 #endif /* LWIP_MPU_COMPATIBLE */
-    data->optlen);
+                                   data->optlen);
 
-  sys_sem_signal((sys_sem_t*)(data->completed_sem));
+  sys_sem_signal((sys_sem_t *)(data->completed_sem));
 }
 #endif  /* LWIP_TCPIP_CORE_LOCKING */
 
 /** lwip_setsockopt_impl: the actual implementation of setsockopt:
  * same argument as lwip_setsockopt, either called directly or through callback
  */
-static u8_t
+static int
 lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_t optlen)
 {
-  u8_t err = 0;
+  int err = 0;
   struct lwip_sock *sock = tryget_socket(s);
   if (!sock) {
     return EBADF;
   }
 
+#ifdef LWIP_HOOK_SOCKETS_SETSOCKOPT
+  if (LWIP_HOOK_SOCKETS_SETSOCKOPT(s, sock, level, optname, optval, optlen, &err)) {
+    return err;
+  }
+#endif
+
   switch (level) {
 
-/* Level: SOL_SOCKET */
-  case SOL_SOCKET:
-    switch (optname) {
+    /* Level: SOL_SOCKET */
+    case SOL_SOCKET:
+      switch (optname) {
 
-    /* SO_ACCEPTCONN is get-only */
+        /* SO_ACCEPTCONN is get-only */
 
-    /* The option flags */
-    case SO_BROADCAST:
-    case SO_KEEPALIVE:
+        /* The option flags */
+        case SO_BROADCAST:
+        case SO_KEEPALIVE:
 #if SO_REUSE
-    case SO_REUSEADDR:
+        case SO_REUSEADDR:
 #endif /* SO_REUSE */
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);
-      if (*(const int*)optval) {
-        ip_set_option(sock->conn->pcb.ip, optname);
-      } else {
-        ip_reset_option(sock->conn->pcb.ip, optname);
-      }
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, optname=0x%x, ..) -> %s\n",
-                  s, optname, (*(const int*)optval?"on":"off")));
-      break;
+          if ((optname == SO_BROADCAST) &&
+              (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_UDP)) {
+            done_socket(sock);
+            return ENOPROTOOPT;
+          }
 
-    /* SO_TYPE is get-only */
-    /* SO_ERROR is get-only */
+          optname = lwip_sockopt_to_ipopt(optname);
+
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);
+          if (*(const int *)optval) {
+            ip_set_option(sock->conn->pcb.ip, optname);
+          } else {
+            ip_reset_option(sock->conn->pcb.ip, optname);
+          }
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, optname=0x%x, ..) -> %s\n",
+                                      s, optname, (*(const int *)optval ? "on" : "off")));
+          break;
+
+          /* SO_TYPE is get-only */
+          /* SO_ERROR is get-only */
 
 #if LWIP_SO_SNDTIMEO
-    case SO_SNDTIMEO:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);
-      netconn_set_sendtimeout(sock->conn, LWIP_SO_SNDRCVTIMEO_GET_MS(optval));
-      break;
-#endif /* LWIP_SO_SNDTIMEO */
-#if LWIP_SO_RCVTIMEO
-    case SO_RCVTIMEO:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);
-      netconn_set_recvtimeout(sock->conn, (int)LWIP_SO_SNDRCVTIMEO_GET_MS(optval));
-      break;
-#endif /* LWIP_SO_RCVTIMEO */
-#if LWIP_SO_RCVBUF
-    case SO_RCVBUF:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, int);
-      netconn_set_recvbufsize(sock->conn, *(const int*)optval);
-      break;
-#endif /* LWIP_SO_RCVBUF */
-#if LWIP_SO_LINGER
-    case SO_LINGER:
-      {
-        const struct linger* linger = (const struct linger*)optval;
-        LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, struct linger);
-        if (linger->l_onoff) {
-          int lingersec = linger->l_linger;
-          if (lingersec < 0) {
+        case SO_SNDTIMEO: {
+          long ms_long;
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);
+          ms_long = LWIP_SO_SNDRCVTIMEO_GET_MS(optval);
+          if (ms_long < 0) {
+            done_socket(sock);
             return EINVAL;
           }
-          if (lingersec > 0xFFFF) {
-            lingersec = 0xFFFF;
-          }
-          sock->conn->linger = (s16_t)lingersec;
-        } else {
-          sock->conn->linger = -1;
+          netconn_set_sendtimeout(sock->conn, ms_long);
+          break;
         }
-      }
-      break;
+#endif /* LWIP_SO_SNDTIMEO */
+#if LWIP_SO_RCVTIMEO
+        case SO_RCVTIMEO: {
+          long ms_long;
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);
+          ms_long = LWIP_SO_SNDRCVTIMEO_GET_MS(optval);
+          if (ms_long < 0) {
+            done_socket(sock);
+            return EINVAL;
+          }
+          netconn_set_recvtimeout(sock->conn, (u32_t)ms_long);
+          break;
+        }
+#endif /* LWIP_SO_RCVTIMEO */
+#if LWIP_SO_RCVBUF
+        case SO_RCVBUF:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, int);
+          netconn_set_recvbufsize(sock->conn, *(const int *)optval);
+          break;
+#endif /* LWIP_SO_RCVBUF */
+#if LWIP_SO_LINGER
+        case SO_LINGER: {
+          const struct linger *linger = (const struct linger *)optval;
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, struct linger);
+          if (linger->l_onoff) {
+            int lingersec = linger->l_linger;
+            if (lingersec < 0) {
+              done_socket(sock);
+              return EINVAL;
+            }
+            if (lingersec > 0xFFFF) {
+              lingersec = 0xFFFF;
+            }
+            sock->conn->linger = (s16_t)lingersec;
+          } else {
+            sock->conn->linger = -1;
+          }
+        }
+        break;
 #endif /* LWIP_SO_LINGER */
 #if LWIP_UDP
-    case SO_NO_CHECK:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_UDP);
+        case SO_NO_CHECK:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_UDP);
 #if LWIP_UDPLITE
-      if ((udp_flags(sock->conn->pcb.udp) & UDP_FLAGS_UDPLITE) != 0) {
-        /* this flag is only available for UDP, not for UDP lite */
-        return EAFNOSUPPORT;
-      }
-#endif /* LWIP_UDPLITE */
-      if (*(const int*)optval) {
-        udp_setflags(sock->conn->pcb.udp, udp_flags(sock->conn->pcb.udp) | UDP_FLAGS_NOCHKSUM);
-      } else {
-        udp_setflags(sock->conn->pcb.udp, udp_flags(sock->conn->pcb.udp) & ~UDP_FLAGS_NOCHKSUM);
-      }
-      break;
-#endif /* LWIP_UDP */
-    default:
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n",
-                  s, optname));
-      err = ENOPROTOOPT;
-      break;
-    }  /* switch (optname) */
-    break;
-
-/* Level: IPPROTO_IP */
-  case IPPROTO_IP:
-    switch (optname) {
-    case IP_TTL:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);
-      sock->conn->pcb.ip->ttl = (u8_t)(*(const int*)optval);
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, IP_TTL, ..) -> %d\n",
-                  s, sock->conn->pcb.ip->ttl));
-      break;
-    case IP_TOS:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);
-      sock->conn->pcb.ip->tos = (u8_t)(*(const int*)optval);
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, IP_TOS, ..)-> %d\n",
-                  s, sock->conn->pcb.ip->tos));
-      break;
-#if LWIP_MULTICAST_TX_OPTIONS
-    case IP_MULTICAST_TTL:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, u8_t, NETCONN_UDP);
-      udp_set_multicast_ttl(sock->conn->pcb.udp, (u8_t)(*(const u8_t*)optval));
-      break;
-    case IP_MULTICAST_IF:
-      {
-        ip4_addr_t if_addr;
-        LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct in_addr, NETCONN_UDP);
-        inet_addr_to_ip4addr(&if_addr, (const struct in_addr*)optval);
-        udp_set_multicast_netif_addr(sock->conn->pcb.udp, &if_addr);
-      }
-      break;
-    case IP_MULTICAST_LOOP:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, u8_t, NETCONN_UDP);
-      if (*(const u8_t*)optval) {
-        udp_setflags(sock->conn->pcb.udp, udp_flags(sock->conn->pcb.udp) | UDP_FLAGS_MULTICAST_LOOP);
-      } else {
-        udp_setflags(sock->conn->pcb.udp, udp_flags(sock->conn->pcb.udp) & ~UDP_FLAGS_MULTICAST_LOOP);
-      }
-      break;
-#endif /* LWIP_MULTICAST_TX_OPTIONS */
-#if LWIP_IGMP
-    case IP_ADD_MEMBERSHIP:
-    case IP_DROP_MEMBERSHIP:
-      {
-        /* If this is a TCP or a RAW socket, ignore these options. */
-        /* @todo: assign membership to this socket so that it is dropped when closing the socket */
-        err_t igmp_err;
-        const struct ip_mreq *imr = (const struct ip_mreq *)optval;
-        ip4_addr_t if_addr;
-        ip4_addr_t multi_addr;
-        LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct ip_mreq, NETCONN_UDP);
-        inet_addr_to_ip4addr(&if_addr, &imr->imr_interface);
-        inet_addr_to_ip4addr(&multi_addr, &imr->imr_multiaddr);
-        if (optname == IP_ADD_MEMBERSHIP) {
-          if (!lwip_socket_register_membership(s, &if_addr, &multi_addr)) {
-            /* cannot track membership (out of memory) */
-            err = ENOMEM;
-            igmp_err = ERR_OK;
-          } else {
-            igmp_err = igmp_joingroup(&if_addr, &multi_addr);
+          if (udp_is_flag_set(sock->conn->pcb.udp, UDP_FLAGS_UDPLITE)) {
+            /* this flag is only available for UDP, not for UDP lite */
+            done_socket(sock);
+            return EAFNOSUPPORT;
           }
-        } else {
-          igmp_err = igmp_leavegroup(&if_addr, &multi_addr);
-          lwip_socket_unregister_membership(s, &if_addr, &multi_addr);
+#endif /* LWIP_UDPLITE */
+          if (*(const int *)optval) {
+            udp_set_flags(sock->conn->pcb.udp, UDP_FLAGS_NOCHKSUM);
+          } else {
+            udp_clear_flags(sock->conn->pcb.udp, UDP_FLAGS_NOCHKSUM);
+          }
+          break;
+#endif /* LWIP_UDP */
+        case SO_BINDTODEVICE: {
+          const struct ifreq *iface;
+          struct netif *n = NULL;
+
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, struct ifreq);
+
+          iface = (const struct ifreq *)optval;
+          if (iface->ifr_name[0] != 0) {
+            n = netif_find(iface->ifr_name);
+            if (n == NULL) {
+              done_socket(sock);
+              return ENODEV;
+            }
+          }
+
+          switch (NETCONNTYPE_GROUP(netconn_type(sock->conn))) {
+#if LWIP_TCP
+            case NETCONN_TCP:
+              tcp_bind_netif(sock->conn->pcb.tcp, n);
+              break;
+#endif
+#if LWIP_UDP
+            case NETCONN_UDP:
+              udp_bind_netif(sock->conn->pcb.udp, n);
+              break;
+#endif
+#if LWIP_RAW
+            case NETCONN_RAW:
+              raw_bind_netif(sock->conn->pcb.raw, n);
+              break;
+#endif
+            default:
+              LWIP_ASSERT("Unhandled netconn type in SO_BINDTODEVICE", 0);
+              break;
+          }
         }
-        if (igmp_err != ERR_OK) {
-          err = EADDRNOTAVAIL;
-        }
-      }
+        break;
+        default:
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n",
+                                      s, optname));
+          err = ENOPROTOOPT;
+          break;
+      }  /* switch (optname) */
       break;
+
+    /* Level: IPPROTO_IP */
+    case IPPROTO_IP:
+      switch (optname) {
+        case IP_TTL:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);
+          sock->conn->pcb.ip->ttl = (u8_t)(*(const int *)optval);
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, IP_TTL, ..) -> %d\n",
+                                      s, sock->conn->pcb.ip->ttl));
+          break;
+        case IP_TOS:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);
+          sock->conn->pcb.ip->tos = (u8_t)(*(const int *)optval);
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, IP_TOS, ..)-> %d\n",
+                                      s, sock->conn->pcb.ip->tos));
+          break;
+#if LWIP_NETBUF_RECVINFO
+        case IP_PKTINFO:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_UDP);
+          if (*(const int *)optval) {
+            sock->conn->flags |= NETCONN_FLAG_PKTINFO;
+          } else {
+            sock->conn->flags &= ~NETCONN_FLAG_PKTINFO;
+          }
+          break;
+#endif /* LWIP_NETBUF_RECVINFO */
+#if LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS && LWIP_UDP
+        case IP_MULTICAST_TTL:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, u8_t, NETCONN_UDP);
+          udp_set_multicast_ttl(sock->conn->pcb.udp, (u8_t)(*(const u8_t *)optval));
+          break;
+        case IP_MULTICAST_IF: {
+          ip4_addr_t if_addr;
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct in_addr, NETCONN_UDP);
+          inet_addr_to_ip4addr(&if_addr, (const struct in_addr *)optval);
+          udp_set_multicast_netif_addr(sock->conn->pcb.udp, &if_addr);
+        }
+        break;
+        case IP_MULTICAST_LOOP:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, u8_t, NETCONN_UDP);
+          if (*(const u8_t *)optval) {
+            udp_set_flags(sock->conn->pcb.udp, UDP_FLAGS_MULTICAST_LOOP);
+          } else {
+            udp_clear_flags(sock->conn->pcb.udp, UDP_FLAGS_MULTICAST_LOOP);
+          }
+          break;
+#endif /* LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS && LWIP_UDP */
+#if LWIP_IGMP
+        case IP_ADD_MEMBERSHIP:
+        case IP_DROP_MEMBERSHIP: {
+          /* If this is a TCP or a RAW socket, ignore these options. */
+          err_t igmp_err;
+          const struct ip_mreq *imr = (const struct ip_mreq *)optval;
+          ip4_addr_t if_addr;
+          ip4_addr_t multi_addr;
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct ip_mreq, NETCONN_UDP);
+          inet_addr_to_ip4addr(&if_addr, &imr->imr_interface);
+          inet_addr_to_ip4addr(&multi_addr, &imr->imr_multiaddr);
+          if (optname == IP_ADD_MEMBERSHIP) {
+            if (!lwip_socket_register_membership(s, &if_addr, &multi_addr)) {
+              /* cannot track membership (out of memory) */
+              err = ENOMEM;
+              igmp_err = ERR_OK;
+            } else {
+              igmp_err = igmp_joingroup(&if_addr, &multi_addr);
+            }
+          } else {
+            igmp_err = igmp_leavegroup(&if_addr, &multi_addr);
+            lwip_socket_unregister_membership(s, &if_addr, &multi_addr);
+          }
+          if (igmp_err != ERR_OK) {
+            err = EADDRNOTAVAIL;
+          }
+        }
+        break;
 #endif /* LWIP_IGMP */
-    default:
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\n",
-                  s, optname));
-      err = ENOPROTOOPT;
+        default:
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\n",
+                                      s, optname));
+          err = ENOPROTOOPT;
+          break;
+      }  /* switch (optname) */
       break;
-    }  /* switch (optname) */
-    break;
 
 #if LWIP_TCP
-/* Level: IPPROTO_TCP */
-  case IPPROTO_TCP:
-    /* Special case: all IPPROTO_TCP option take an int */
-    LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_TCP);
-    if (sock->conn->pcb.tcp->state == LISTEN) {
-      return EINVAL;
-    }
-    switch (optname) {
-    case TCP_NODELAY:
-      if (*(const int*)optval) {
-        tcp_nagle_disable(sock->conn->pcb.tcp);
-      } else {
-        tcp_nagle_enable(sock->conn->pcb.tcp);
+    /* Level: IPPROTO_TCP */
+    case IPPROTO_TCP:
+      /* Special case: all IPPROTO_TCP option take an int */
+      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_TCP);
+      if (sock->conn->pcb.tcp->state == LISTEN) {
+        done_socket(sock);
+        return EINVAL;
       }
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_NODELAY) -> %s\n",
-                  s, (*(const int *)optval)?"on":"off") );
-      break;
-    case TCP_KEEPALIVE:
-      sock->conn->pcb.tcp->keep_idle = (u32_t)(*(const int*)optval);
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPALIVE) -> %"U32_F"\n",
-                  s, sock->conn->pcb.tcp->keep_idle));
-      break;
+      switch (optname) {
+        case TCP_NODELAY:
+          if (*(const int *)optval) {
+            tcp_nagle_disable(sock->conn->pcb.tcp);
+          } else {
+            tcp_nagle_enable(sock->conn->pcb.tcp);
+          }
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_NODELAY) -> %s\n",
+                                      s, (*(const int *)optval) ? "on" : "off") );
+          break;
+        case TCP_KEEPALIVE:
+          sock->conn->pcb.tcp->keep_idle = (u32_t)(*(const int *)optval);
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPALIVE) -> %"U32_F"\n",
+                                      s, sock->conn->pcb.tcp->keep_idle));
+          break;
 
 #if LWIP_TCP_KEEPALIVE
-    case TCP_KEEPIDLE:
-      sock->conn->pcb.tcp->keep_idle = 1000*(u32_t)(*(const int*)optval);
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPIDLE) -> %"U32_F"\n",
-                  s, sock->conn->pcb.tcp->keep_idle));
-      break;
-    case TCP_KEEPINTVL:
-      sock->conn->pcb.tcp->keep_intvl = 1000*(u32_t)(*(const int*)optval);
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPINTVL) -> %"U32_F"\n",
-                  s, sock->conn->pcb.tcp->keep_intvl));
-      break;
-    case TCP_KEEPCNT:
-      sock->conn->pcb.tcp->keep_cnt = (u32_t)(*(const int*)optval);
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPCNT) -> %"U32_F"\n",
-                  s, sock->conn->pcb.tcp->keep_cnt));
-      break;
+        case TCP_KEEPIDLE:
+          sock->conn->pcb.tcp->keep_idle = 1000 * (u32_t)(*(const int *)optval);
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPIDLE) -> %"U32_F"\n",
+                                      s, sock->conn->pcb.tcp->keep_idle));
+          break;
+        case TCP_KEEPINTVL:
+          sock->conn->pcb.tcp->keep_intvl = 1000 * (u32_t)(*(const int *)optval);
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPINTVL) -> %"U32_F"\n",
+                                      s, sock->conn->pcb.tcp->keep_intvl));
+          break;
+        case TCP_KEEPCNT:
+          sock->conn->pcb.tcp->keep_cnt = (u32_t)(*(const int *)optval);
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPCNT) -> %"U32_F"\n",
+                                      s, sock->conn->pcb.tcp->keep_cnt));
+          break;
 #endif /* LWIP_TCP_KEEPALIVE */
-    default:
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n",
-                  s, optname));
-      err = ENOPROTOOPT;
+        default:
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n",
+                                      s, optname));
+          err = ENOPROTOOPT;
+          break;
+      }  /* switch (optname) */
       break;
-    }  /* switch (optname) */
-    break;
 #endif /* LWIP_TCP*/
 
 #if LWIP_IPV6
-/* Level: IPPROTO_IPV6 */
-  case IPPROTO_IPV6:
-    switch (optname) {
-    case IPV6_V6ONLY:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_TCP);
-      if (*(const int*)optval) {
-        netconn_set_ipv6only(sock->conn, 1);
-      } else {
-        netconn_set_ipv6only(sock->conn, 0);
-      }
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IPV6, IPV6_V6ONLY, ..) -> %d\n",
-                  s, (netconn_get_ipv6only(sock->conn) ? 1 : 0)));
+    /* Level: IPPROTO_IPV6 */
+    case IPPROTO_IPV6:
+      switch (optname) {
+        case IPV6_V6ONLY:
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);
+          if (*(const int *)optval) {
+            netconn_set_ipv6only(sock->conn, 1);
+          } else {
+            netconn_set_ipv6only(sock->conn, 0);
+          }
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IPV6, IPV6_V6ONLY, ..) -> %d\n",
+                                      s, (netconn_get_ipv6only(sock->conn) ? 1 : 0)));
+          break;
+#if LWIP_IPV6_MLD
+        case IPV6_JOIN_GROUP:
+        case IPV6_LEAVE_GROUP: {
+          /* If this is a TCP or a RAW socket, ignore these options. */
+          err_t mld6_err;
+          struct netif *netif;
+          ip6_addr_t multi_addr;
+          const struct ipv6_mreq *imr = (const struct ipv6_mreq *)optval;
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct ipv6_mreq, NETCONN_UDP);
+          inet6_addr_to_ip6addr(&multi_addr, &imr->ipv6mr_multiaddr);
+          LWIP_ASSERT("Invalid netif index", imr->ipv6mr_interface <= 0xFFu);
+          netif = netif_get_by_index((u8_t)imr->ipv6mr_interface);
+          if (netif == NULL) {
+            err = EADDRNOTAVAIL;
+            break;
+          }
+
+          if (optname == IPV6_JOIN_GROUP) {
+            if (!lwip_socket_register_mld6_membership(s, imr->ipv6mr_interface, &multi_addr)) {
+              /* cannot track membership (out of memory) */
+              err = ENOMEM;
+              mld6_err = ERR_OK;
+            } else {
+              mld6_err = mld6_joingroup_netif(netif, &multi_addr);
+            }
+          } else {
+            mld6_err = mld6_leavegroup_netif(netif, &multi_addr);
+            lwip_socket_unregister_mld6_membership(s, imr->ipv6mr_interface, &multi_addr);
+          }
+          if (mld6_err != ERR_OK) {
+            err = EADDRNOTAVAIL;
+          }
+        }
+        break;
+#endif /* LWIP_IPV6_MLD */
+        default:
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IPV6, UNIMPL: optname=0x%x, ..)\n",
+                                      s, optname));
+          err = ENOPROTOOPT;
+          break;
+      }  /* switch (optname) */
       break;
-    default:
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IPV6, UNIMPL: optname=0x%x, ..)\n",
-                  s, optname));
-      err = ENOPROTOOPT;
-      break;
-    }  /* switch (optname) */
-    break;
 #endif /* LWIP_IPV6 */
 
 #if LWIP_UDP && LWIP_UDPLITE
-  /* Level: IPPROTO_UDPLITE */
-  case IPPROTO_UDPLITE:
-    /* Special case: all IPPROTO_UDPLITE option take an int */
-    LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);
-    /* If this is no UDP lite socket, ignore any options. */
-    if (!NETCONNTYPE_ISUDPLITE(netconn_type(sock->conn))) {
-      return ENOPROTOOPT;
-    }
-    switch (optname) {
-    case UDPLITE_SEND_CSCOV:
-      if ((*(const int*)optval != 0) && ((*(const int*)optval < 8) || (*(const int*)optval > 0xffff))) {
-        /* don't allow illegal values! */
-        sock->conn->pcb.udp->chksum_len_tx = 8;
-      } else {
-        sock->conn->pcb.udp->chksum_len_tx = (u16_t)*(const int*)optval;
+    /* Level: IPPROTO_UDPLITE */
+    case IPPROTO_UDPLITE:
+      /* Special case: all IPPROTO_UDPLITE option take an int */
+      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);
+      /* If this is no UDP lite socket, ignore any options. */
+      if (!NETCONNTYPE_ISUDPLITE(netconn_type(sock->conn))) {
+        done_socket(sock);
+        return ENOPROTOOPT;
       }
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV) -> %d\n",
-                  s, (*(const int*)optval)) );
+      switch (optname) {
+        case UDPLITE_SEND_CSCOV:
+          if ((*(const int *)optval != 0) && ((*(const int *)optval < 8) || (*(const int *)optval > 0xffff))) {
+            /* don't allow illegal values! */
+            sock->conn->pcb.udp->chksum_len_tx = 8;
+          } else {
+            sock->conn->pcb.udp->chksum_len_tx = (u16_t) * (const int *)optval;
+          }
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV) -> %d\n",
+                                      s, (*(const int *)optval)) );
+          break;
+        case UDPLITE_RECV_CSCOV:
+          if ((*(const int *)optval != 0) && ((*(const int *)optval < 8) || (*(const int *)optval > 0xffff))) {
+            /* don't allow illegal values! */
+            sock->conn->pcb.udp->chksum_len_rx = 8;
+          } else {
+            sock->conn->pcb.udp->chksum_len_rx = (u16_t) * (const int *)optval;
+          }
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV) -> %d\n",
+                                      s, (*(const int *)optval)) );
+          break;
+        default:
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UNIMPL: optname=0x%x, ..)\n",
+                                      s, optname));
+          err = ENOPROTOOPT;
+          break;
+      }  /* switch (optname) */
       break;
-    case UDPLITE_RECV_CSCOV:
-      if ((*(const int*)optval != 0) && ((*(const int*)optval < 8) || (*(const int*)optval > 0xffff))) {
-        /* don't allow illegal values! */
-        sock->conn->pcb.udp->chksum_len_rx = 8;
-      } else {
-        sock->conn->pcb.udp->chksum_len_rx = (u16_t)*(const int*)optval;
-      }
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV) -> %d\n",
-                  s, (*(const int*)optval)) );
-      break;
-    default:
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UNIMPL: optname=0x%x, ..)\n",
-                  s, optname));
-      err = ENOPROTOOPT;
-      break;
-    }  /* switch (optname) */
-    break;
 #endif /* LWIP_UDP */
-  /* Level: IPPROTO_RAW */
-  case IPPROTO_RAW:
-    switch (optname) {
+    /* Level: IPPROTO_RAW */
+    case IPPROTO_RAW:
+      switch (optname) {
 #if LWIP_IPV6 && LWIP_RAW
-    case IPV6_CHECKSUM:
-      /* It should not be possible to disable the checksum generation with ICMPv6
-       * as per RFC 3542 chapter 3.1 */
-      if(sock->conn->pcb.raw->protocol == IPPROTO_ICMPV6) {
-        return EINVAL;
-      }
+        case IPV6_CHECKSUM:
+          /* It should not be possible to disable the checksum generation with ICMPv6
+           * as per RFC 3542 chapter 3.1 */
+          if (sock->conn->pcb.raw->protocol == IPPROTO_ICMPV6) {
+            done_socket(sock);
+            return EINVAL;
+          }
 
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_RAW);
-      if (*(const int *)optval < 0) {
-        sock->conn->pcb.raw->chksum_reqd = 0;
-      } else if (*(const int *)optval & 1) {
-        /* Per RFC3542, odd offsets are not allowed */
-        return EINVAL;
-      } else {
-        sock->conn->pcb.raw->chksum_reqd = 1;
-        sock->conn->pcb.raw->chksum_offset = (u16_t)*(const int *)optval;
-      }
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_RAW, IPV6_CHECKSUM, ..) -> %d\n",
-                  s, sock->conn->pcb.raw->chksum_reqd));
-      break;
+          LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_RAW);
+          if (*(const int *)optval < 0) {
+            sock->conn->pcb.raw->chksum_reqd = 0;
+          } else if (*(const int *)optval & 1) {
+            /* Per RFC3542, odd offsets are not allowed */
+            done_socket(sock);
+            return EINVAL;
+          } else {
+            sock->conn->pcb.raw->chksum_reqd = 1;
+            sock->conn->pcb.raw->chksum_offset = (u16_t) * (const int *)optval;
+          }
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_RAW, IPV6_CHECKSUM, ..) -> %d\n",
+                                      s, sock->conn->pcb.raw->chksum_reqd));
+          break;
 #endif /* LWIP_IPV6 && LWIP_RAW */
+        default:
+          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_RAW, UNIMPL: optname=0x%x, ..)\n",
+                                      s, optname));
+          err = ENOPROTOOPT;
+          break;
+      }  /* switch (optname) */
+      break;
     default:
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_RAW, UNIMPL: optname=0x%x, ..)\n",
-                                  s, optname));
+      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n",
+                                  s, level, optname));
       err = ENOPROTOOPT;
       break;
-    }  /* switch (optname) */
-    break;
-  default:
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n",
-                s, level, optname));
-    err = ENOPROTOOPT;
-    break;
   }  /* switch (level) */
 
+  done_socket(sock);
   return err;
 }
 
@@ -2617,7 +3745,6 @@
   struct lwip_sock *sock = get_socket(s);
   u8_t val;
 #if LWIP_SO_RCVBUF
-  u16_t buflen = 0;
   int recv_avail;
 #endif /* LWIP_SO_RCVBUF */
 
@@ -2627,120 +3754,230 @@
 
   switch (cmd) {
 #if LWIP_SO_RCVBUF || LWIP_FIONREAD_LINUXMODE
-  case FIONREAD:
-    if (!argp) {
-      sock_set_errno(sock, EINVAL);
-      return -1;
-    }
+    case FIONREAD:
+      if (!argp) {
+        sock_set_errno(sock, EINVAL);
+        done_socket(sock);
+        return -1;
+      }
 #if LWIP_FIONREAD_LINUXMODE
-    if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
-      struct pbuf *p;
-      if (sock->lastdata) {
-        p = ((struct netbuf *)sock->lastdata)->p;
-        *((int*)argp) = p->tot_len - sock->lastoffset;
-      } else {
-        struct netbuf *rxbuf;
-        err_t err;
-        if (sock->rcvevent <= 0) {
-          *((int*)argp) = 0;
+      if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
+        struct netbuf *nb;
+        if (sock->lastdata.netbuf) {
+          nb = sock->lastdata.netbuf;
+          *((int *)argp) = nb->p->tot_len;
         } else {
-          err = netconn_recv(sock->conn, &rxbuf);
+          struct netbuf *rxbuf;
+          err_t err = netconn_recv_udp_raw_netbuf_flags(sock->conn, &rxbuf, NETCONN_DONTBLOCK);
           if (err != ERR_OK) {
-            *((int*)argp) = 0;
+            *((int *)argp) = 0;
           } else {
-            sock->lastdata = rxbuf;
-            sock->lastoffset = 0;
-            *((int*)argp) = rxbuf->p->tot_len;
+            sock->lastdata.netbuf = rxbuf;
+            *((int *)argp) = rxbuf->p->tot_len;
           }
         }
+        done_socket(sock);
+        return 0;
       }
-      return 0;
-    }
 #endif /* LWIP_FIONREAD_LINUXMODE */
 
 #if LWIP_SO_RCVBUF
-    /* we come here if either LWIP_FIONREAD_LINUXMODE==0 or this is a TCP socket */
-    SYS_ARCH_GET(sock->conn->recv_avail, recv_avail);
-    if (recv_avail < 0) {
-      recv_avail = 0;
-    }
-    *((int*)argp) = recv_avail;
-
-    /* Check if there is data left from the last recv operation. /maq 041215 */
-    if (sock->lastdata) {
-      struct pbuf *p = (struct pbuf *)sock->lastdata;
-      if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
-        p = ((struct netbuf *)p)->p;
+      /* we come here if either LWIP_FIONREAD_LINUXMODE==0 or this is a TCP socket */
+      SYS_ARCH_GET(sock->conn->recv_avail, recv_avail);
+      if (recv_avail < 0) {
+        recv_avail = 0;
       }
-      buflen = p->tot_len;
-      buflen -= sock->lastoffset;
 
-      *((int*)argp) += buflen;
-    }
+      /* Check if there is data left from the last recv operation. /maq 041215 */
+      if (sock->lastdata.netbuf) {
+        if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
+          recv_avail += sock->lastdata.pbuf->tot_len;
+        } else {
+          recv_avail += sock->lastdata.netbuf->p->tot_len;
+        }
+      }
+      *((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);
-    return 0;
+      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONREAD, %p) = %"U16_F"\n", s, argp, *((u16_t *)argp)));
+      sock_set_errno(sock, 0);
+      done_socket(sock);
+      return 0;
 #else /* LWIP_SO_RCVBUF */
-    break;
+      break;
 #endif /* LWIP_SO_RCVBUF */
 #endif /* LWIP_SO_RCVBUF || LWIP_FIONREAD_LINUXMODE */
 
-  case (long)FIONBIO:
-    val = 0;
-    if (argp && *(u32_t*)argp) {
-      val = 1;
-    }
-    netconn_set_nonblocking(sock->conn, val);
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONBIO, %d)\n", s, val));
-    sock_set_errno(sock, 0);
-    return 0;
+    case (long)FIONBIO:
+      val = 0;
+      if (argp && *(int *)argp) {
+        val = 1;
+      }
+      netconn_set_nonblocking(sock->conn, val);
+      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONBIO, %d)\n", s, val));
+      sock_set_errno(sock, 0);
+      done_socket(sock);
+      return 0;
 
-  default:
-    break;
+    default:
+      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 */
+  done_socket(sock);
   return -1;
 }
 
 /** A minimal implementation of fcntl.
  * Currently only the commands F_GETFL and F_SETFL are implemented.
- * Only the flag O_NONBLOCK is implemented.
+ * The flag O_NONBLOCK and access modes are supported for F_GETFL, only
+ * the flag O_NONBLOCK is implemented for F_SETFL.
  */
 int
 lwip_fcntl(int s, int cmd, int val)
 {
   struct lwip_sock *sock = get_socket(s);
   int ret = -1;
+  int op_mode = 0;
 
   if (!sock) {
     return -1;
   }
 
   switch (cmd) {
-  case F_GETFL:
-    ret = netconn_is_nonblocking(sock->conn) ? O_NONBLOCK : 0;
-    sock_set_errno(sock, 0);
-    break;
-  case F_SETFL:
-    if ((val & ~O_NONBLOCK) == 0) {
-      /* only O_NONBLOCK, all other bits are zero */
-      netconn_set_nonblocking(sock->conn, val & O_NONBLOCK);
-      ret = 0;
+    case F_GETFL:
+      ret = netconn_is_nonblocking(sock->conn) ? O_NONBLOCK : 0;
       sock_set_errno(sock, 0);
-    } else {
+
+      if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
+#if LWIP_TCPIP_CORE_LOCKING
+        LOCK_TCPIP_CORE();
+#else
+        SYS_ARCH_DECL_PROTECT(lev);
+        /* the proper thing to do here would be to get into the tcpip_thread,
+           but locking should be OK as well since we only *read* some flags */
+        SYS_ARCH_PROTECT(lev);
+#endif
+#if LWIP_TCP
+        if (sock->conn->pcb.tcp) {
+          if (!(sock->conn->pcb.tcp->flags & TF_RXCLOSED)) {
+            op_mode |= O_RDONLY;
+          }
+          if (!(sock->conn->pcb.tcp->flags & TF_FIN)) {
+            op_mode |= O_WRONLY;
+          }
+        }
+#endif
+#if LWIP_TCPIP_CORE_LOCKING
+        UNLOCK_TCPIP_CORE();
+#else
+        SYS_ARCH_UNPROTECT(lev);
+#endif
+      } else {
+        op_mode |= O_RDWR;
+      }
+
+      /* ensure O_RDWR for (O_RDONLY|O_WRONLY) != O_RDWR cases */
+      ret |= (op_mode == (O_RDONLY | O_WRONLY)) ? O_RDWR : op_mode;
+
+      break;
+    case F_SETFL:
+      /* Bits corresponding to the file access mode and the file creation flags [..] that are set in arg shall be ignored */
+      val &= ~(O_RDONLY | O_WRONLY | O_RDWR);
+      if ((val & ~O_NONBLOCK) == 0) {
+        /* only O_NONBLOCK, all other bits are zero */
+        netconn_set_nonblocking(sock->conn, val & O_NONBLOCK);
+        ret = 0;
+        sock_set_errno(sock, 0);
+      } else {
+        sock_set_errno(sock, 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 */
-    }
-    break;
-  default:
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_fcntl(%d, UNIMPL: %d, %d)\n", s, cmd, val));
-    sock_set_errno(sock, ENOSYS); /* not yet implemented */
-    break;
+      break;
+  }
+  done_socket(sock);
+  return ret;
+}
+
+#if LWIP_COMPAT_SOCKETS == 2 && LWIP_POSIX_SOCKETS_IO_NAMES
+int
+fcntl(int s, int cmd, ...)
+{
+  va_list ap;
+  int val;
+
+  va_start(ap, cmd);
+  val = va_arg(ap, int);
+  va_end(ap);
+  return lwip_fcntl(s, cmd, val);
+}
+#endif
+
+const char *
+lwip_inet_ntop(int af, const void *src, char *dst, socklen_t size)
+{
+  const char *ret = NULL;
+  int size_int = (int)size;
+  if (size_int < 0) {
+    set_errno(ENOSPC);
+    return NULL;
+  }
+  switch (af) {
+#if LWIP_IPV4
+    case AF_INET:
+      ret = ip4addr_ntoa_r((const ip4_addr_t *)src, dst, size_int);
+      if (ret == NULL) {
+        set_errno(ENOSPC);
+      }
+      break;
+#endif
+#if LWIP_IPV6
+    case AF_INET6:
+      ret = ip6addr_ntoa_r((const ip6_addr_t *)src, dst, size_int);
+      if (ret == NULL) {
+        set_errno(ENOSPC);
+      }
+      break;
+#endif
+    default:
+      set_errno(EAFNOSUPPORT);
+      break;
   }
   return ret;
 }
 
+int
+lwip_inet_pton(int af, const char *src, void *dst)
+{
+  int err;
+  switch (af) {
+#if LWIP_IPV4
+    case AF_INET:
+      err = ip4addr_aton(src, (ip4_addr_t *)dst);
+      break;
+#endif
+#if LWIP_IPV6
+    case AF_INET6: {
+      /* convert into temporary variable since ip6_addr_t might be larger
+         than in6_addr when scopes are enabled */
+      ip6_addr_t addr;
+      err = ip6addr_aton(src, &addr);
+      if (err) {
+        memcpy(dst, &addr.addr, sizeof(addr.addr));
+      }
+      break;
+    }
+#endif
+    default:
+      err = -1;
+      set_errno(EAFNOSUPPORT);
+      break;
+  }
+  return err;
+}
+
 #if LWIP_IGMP
 /** Register a new IGMP membership. On socket close, the membership is dropped automatically.
  *
@@ -2763,9 +4000,11 @@
       socket_ipv4_multicast_memberships[i].sock = sock;
       ip4_addr_copy(socket_ipv4_multicast_memberships[i].if_addr, *if_addr);
       ip4_addr_copy(socket_ipv4_multicast_memberships[i].multi_addr, *multi_addr);
+      done_socket(sock);
       return 1;
     }
   }
+  done_socket(sock);
   return 0;
 }
 
@@ -2791,9 +4030,10 @@
       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);
-      return;
+      break;
     }
   }
+  done_socket(sock);
 }
 
 /** Drop all memberships of a socket that were not dropped explicitly via setsockopt.
@@ -2822,6 +4062,99 @@
       netconn_join_leave_group(sock->conn, &multi_addr, &if_addr, NETCONN_LEAVE);
     }
   }
+  done_socket(sock);
 }
 #endif /* LWIP_IGMP */
+
+#if LWIP_IPV6_MLD
+/** Register a new MLD6 membership. On socket close, the membership is dropped automatically.
+ *
+ * ATTENTION: this function is called from tcpip_thread (or under CORE_LOCK).
+ *
+ * @return 1 on success, 0 on failure
+ */
+static int
+lwip_socket_register_mld6_membership(int s, unsigned int if_idx, const ip6_addr_t *multi_addr)
+{
+  struct lwip_sock *sock = get_socket(s);
+  int i;
+
+  if (!sock) {
+    return 0;
+  }
+
+  for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) {
+    if (socket_ipv6_multicast_memberships[i].sock == NULL) {
+      socket_ipv6_multicast_memberships[i].sock   = sock;
+      socket_ipv6_multicast_memberships[i].if_idx = (u8_t)if_idx;
+      ip6_addr_copy(socket_ipv6_multicast_memberships[i].multi_addr, *multi_addr);
+      done_socket(sock);
+      return 1;
+    }
+  }
+  done_socket(sock);
+  return 0;
+}
+
+/** Unregister a previously registered MLD6 membership. This prevents dropping the membership
+ * on socket close.
+ *
+ * ATTENTION: this function is called from tcpip_thread (or under CORE_LOCK).
+ */
+static void
+lwip_socket_unregister_mld6_membership(int s, unsigned int if_idx, const ip6_addr_t *multi_addr)
+{
+  struct lwip_sock *sock = get_socket(s);
+  int i;
+
+  if (!sock) {
+    return;
+  }
+
+  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)) {
+      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);
+      break;
+    }
+  }
+  done_socket(sock);
+}
+
+/** Drop all MLD6 memberships of a socket that were not dropped explicitly via setsockopt.
+ *
+ * ATTENTION: this function is NOT called from tcpip_thread (or under CORE_LOCK).
+ */
+static void
+lwip_socket_drop_registered_mld6_memberships(int s)
+{
+  struct lwip_sock *sock = get_socket(s);
+  int i;
+
+  if (!sock) {
+    return;
+  }
+
+  for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) {
+    if (socket_ipv6_multicast_memberships[i].sock == sock) {
+      ip_addr_t multi_addr;
+      u8_t if_idx;
+
+      ip_addr_copy_from_ip6(multi_addr, socket_ipv6_multicast_memberships[i].multi_addr);
+      if_idx = socket_ipv6_multicast_memberships[i].if_idx;
+
+      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);
+
+      netconn_join_leave_group_netif(sock->conn, &multi_addr, if_idx, NETCONN_LEAVE);
+    }
+  }
+  done_socket(sock);
+}
+#endif /* LWIP_IPV6_MLD */
+
 #endif /* LWIP_SOCKET */
diff --git a/src/api/tcpip.c b/src/api/tcpip.c
index 07b2f98..743553a 100644
--- a/src/api/tcpip.c
+++ b/src/api/tcpip.c
@@ -58,20 +58,60 @@
 /* global variables */
 static tcpip_init_done_fn tcpip_init_done;
 static void *tcpip_init_done_arg;
-static sys_mbox_t mbox;
+static sys_mbox_t tcpip_mbox;
 
 #if LWIP_TCPIP_CORE_LOCKING
 /** The global semaphore to lock the stack. */
 sys_mutex_t lock_tcpip_core;
 #endif /* LWIP_TCPIP_CORE_LOCKING */
 
-#if LWIP_TIMERS
-/* wait for a message, timeouts are processed while waiting */
-#define TCPIP_MBOX_FETCH(mbox, msg) sys_timeouts_mbox_fetch(mbox, msg)
-#else /* LWIP_TIMERS */
+static void tcpip_thread_handle_msg(struct tcpip_msg *msg);
+
+#if !LWIP_TIMERS
 /* wait for a message with timers disabled (e.g. pass a timer-check trigger into tcpip_thread) */
 #define TCPIP_MBOX_FETCH(mbox, msg) sys_mbox_fetch(mbox, msg)
-#endif /* LWIP_TIMERS */
+#else /* !LWIP_TIMERS */
+/* wait for a message, timeouts are processed while waiting */
+#define TCPIP_MBOX_FETCH(mbox, msg) tcpip_timeouts_mbox_fetch(mbox, msg)
+/**
+ * Wait (forever) for a message to arrive in an mbox.
+ * While waiting, timeouts are processed.
+ *
+ * @param mbox the mbox to fetch the message from
+ * @param msg the place to store the message
+ */
+static void
+tcpip_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg)
+{
+  u32_t sleeptime, res;
+
+again:
+  LWIP_ASSERT_CORE_LOCKED();
+
+  sleeptime = sys_timeouts_sleeptime();
+  if (sleeptime == SYS_TIMEOUTS_SLEEPTIME_INFINITE) {
+    UNLOCK_TCPIP_CORE();
+    sys_arch_mbox_fetch(mbox, msg, 0);
+    LOCK_TCPIP_CORE();
+    return;
+  } else if (sleeptime == 0) {
+    sys_check_timeouts();
+    /* We try again to fetch a message from the mbox. */
+    goto again;
+  }
+
+  UNLOCK_TCPIP_CORE();
+  res = sys_arch_mbox_fetch(mbox, msg, sleeptime);
+  LOCK_TCPIP_CORE();
+  if (res == SYS_ARCH_TIMEOUT) {
+    /* If a SYS_ARCH_TIMEOUT value is returned, a timeout occurred
+       before a message could be fetched. */
+    sys_check_timeouts();
+    /* We try again to fetch a message from the mbox. */
+    goto again;
+  }
+}
+#endif /* !LWIP_TIMERS */
 
 /**
  * The main lwIP thread. This thread has exclusive access to lwIP core functions
@@ -89,23 +129,33 @@
   struct tcpip_msg *msg;
   LWIP_UNUSED_ARG(arg);
 
+  LWIP_MARK_TCPIP_THREAD();
+
+  LOCK_TCPIP_CORE();
   if (tcpip_init_done != NULL) {
     tcpip_init_done(tcpip_init_done_arg);
   }
 
-  LOCK_TCPIP_CORE();
   while (1) {                          /* MAIN Loop */
-    UNLOCK_TCPIP_CORE();
     LWIP_TCPIP_THREAD_ALIVE();
     /* wait for a message, timeouts are processed while waiting */
-    TCPIP_MBOX_FETCH(&mbox, (void **)&msg);
-    LOCK_TCPIP_CORE();
+    TCPIP_MBOX_FETCH(&tcpip_mbox, (void **)&msg);
     if (msg == NULL) {
       LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: NULL\n"));
       LWIP_ASSERT("tcpip_thread: invalid message", 0);
       continue;
     }
-    switch (msg->type) {
+    tcpip_thread_handle_msg(msg);
+  }
+}
+
+/* Handle a single tcpip_msg
+ * This is in its own function for access by tests only.
+ */
+static void
+tcpip_thread_handle_msg(struct tcpip_msg *msg)
+{
+  switch (msg->type) {
 #if !LWIP_TCPIP_CORE_LOCKING
     case TCPIP_MSG_API:
       LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API message %p\n", (void *)msg));
@@ -121,7 +171,9 @@
 #if !LWIP_TCPIP_CORE_LOCKING_INPUT
     case TCPIP_MSG_INPKT:
       LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: PACKET %p\n", (void *)msg));
-      msg->msg.inp.input_fn(msg->msg.inp.p, msg->msg.inp.netif);
+      if (msg->msg.inp.input_fn(msg->msg.inp.p, msg->msg.inp.netif) != ERR_OK) {
+        pbuf_free(msg->msg.inp.p);
+      }
       memp_free(MEMP_TCPIP_MSG_INPKT, msg);
       break;
 #endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */
@@ -154,10 +206,29 @@
       LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: %d\n", msg->type));
       LWIP_ASSERT("tcpip_thread: invalid message", 0);
       break;
-    }
   }
 }
 
+#ifdef TCPIP_THREAD_TEST
+/** Work on queued items in single-threaded test mode */
+int
+tcpip_thread_poll_one(void)
+{
+  int ret = 0;
+  struct tcpip_msg *msg;
+
+  if (sys_arch_mbox_tryfetch(&tcpip_mbox, (void **)&msg) != SYS_ARCH_TIMEOUT) {
+    LOCK_TCPIP_CORE();
+    if (msg != NULL) {
+      tcpip_thread_handle_msg(msg);
+      ret = 1;
+    }
+    UNLOCK_TCPIP_CORE();
+  }
+  return ret;
+}
+#endif
+
 /**
  * Pass a received packet to tcpip_thread for input processing
  *
@@ -178,7 +249,7 @@
 #else /* LWIP_TCPIP_CORE_LOCKING_INPUT */
   struct tcpip_msg *msg;
 
-  LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(mbox));
+  LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
 
   msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT);
   if (msg == NULL) {
@@ -189,7 +260,7 @@
   msg->msg.inp.p = p;
   msg->msg.inp.netif = inp;
   msg->msg.inp.input_fn = input_fn;
-  if (sys_mbox_trypost(&mbox, msg) != ERR_OK) {
+  if (sys_mbox_trypost(&tcpip_mbox, msg) != ERR_OK) {
     memp_free(MEMP_TCPIP_MSG_INPKT, msg);
     return ERR_MEM;
   }
@@ -216,26 +287,30 @@
     return tcpip_inpkt(p, inp, ethernet_input);
   } else
 #endif /* LWIP_ETHERNET */
-  return tcpip_inpkt(p, inp, ip_input);
+    return tcpip_inpkt(p, inp, ip_input);
 }
 
 /**
+ * @ingroup lwip_os
  * Call a specific function in the thread context of
  * tcpip_thread for easy access synchronization.
  * A function called in that way may access lwIP core code
  * without fearing concurrent access.
+ * Blocks until the request is posted.
+ * Must not be called from interrupt context!
  *
  * @param function the function to call
  * @param ctx parameter passed to f
- * @param block 1 to block until the request is posted, 0 to non-blocking mode
  * @return ERR_OK if the function was called, another err_t if not
+ *
+ * @see tcpip_try_callback
  */
 err_t
-tcpip_callback_with_block(tcpip_callback_fn function, void *ctx, u8_t block)
+tcpip_callback(tcpip_callback_fn function, void *ctx)
 {
   struct tcpip_msg *msg;
 
-  LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(mbox));
+  LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
 
   msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
   if (msg == NULL) {
@@ -245,13 +320,46 @@
   msg->type = TCPIP_MSG_CALLBACK;
   msg->msg.cb.function = function;
   msg->msg.cb.ctx = ctx;
-  if (block) {
-    sys_mbox_post(&mbox, msg);
-  } else {
-    if (sys_mbox_trypost(&mbox, msg) != ERR_OK) {
-      memp_free(MEMP_TCPIP_MSG_API, msg);
-      return ERR_MEM;
-    }
+
+  sys_mbox_post(&tcpip_mbox, msg);
+  return ERR_OK;
+}
+
+/**
+ * @ingroup lwip_os
+ * Call a specific function in the thread context of
+ * tcpip_thread for easy access synchronization.
+ * A function called in that way may access lwIP core code
+ * without fearing concurrent access.
+ * Does NOT block when the request cannot be posted because the
+ * tcpip_mbox is full, but returns ERR_MEM instead.
+ * Can be called from interrupt context.
+ *
+ * @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
+ *
+ * @see tcpip_callback
+ */
+err_t
+tcpip_try_callback(tcpip_callback_fn function, void *ctx)
+{
+  struct tcpip_msg *msg;
+
+  LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
+
+  msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
+  if (msg == NULL) {
+    return ERR_MEM;
+  }
+
+  msg->type = TCPIP_MSG_CALLBACK;
+  msg->msg.cb.function = function;
+  msg->msg.cb.ctx = ctx;
+
+  if (sys_mbox_trypost(&tcpip_mbox, msg) != ERR_OK) {
+    memp_free(MEMP_TCPIP_MSG_API, msg);
+    return ERR_MEM;
   }
   return ERR_OK;
 }
@@ -270,7 +378,7 @@
 {
   struct tcpip_msg *msg;
 
-  LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(mbox));
+  LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
 
   msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
   if (msg == NULL) {
@@ -281,7 +389,7 @@
   msg->msg.tmo.msecs = msecs;
   msg->msg.tmo.h = h;
   msg->msg.tmo.arg = arg;
-  sys_mbox_post(&mbox, msg);
+  sys_mbox_post(&tcpip_mbox, msg);
   return ERR_OK;
 }
 
@@ -297,7 +405,7 @@
 {
   struct tcpip_msg *msg;
 
-  LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(mbox));
+  LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
 
   msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
   if (msg == NULL) {
@@ -307,7 +415,7 @@
   msg->type = TCPIP_MSG_UNTIMEOUT;
   msg->msg.tmo.h = h;
   msg->msg.tmo.arg = arg;
-  sys_mbox_post(&mbox, msg);
+  sys_mbox_post(&tcpip_mbox, msg);
   return ERR_OK;
 }
 #endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */
@@ -326,7 +434,7 @@
  * @return ERR_OK if the function was called, another err_t if not
  */
 err_t
-tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t* sem)
+tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t *sem)
 {
 #if LWIP_TCPIP_CORE_LOCKING
   LWIP_UNUSED_ARG(sem);
@@ -338,13 +446,13 @@
   TCPIP_MSG_VAR_DECLARE(msg);
 
   LWIP_ASSERT("semaphore not initialized", sys_sem_valid(sem));
-  LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(mbox));
+  LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
 
   TCPIP_MSG_VAR_ALLOC(msg);
   TCPIP_MSG_VAR_REF(msg).type = TCPIP_MSG_API;
   TCPIP_MSG_VAR_REF(msg).msg.api_msg.function = fn;
   TCPIP_MSG_VAR_REF(msg).msg.api_msg.msg = apimsg;
-  sys_mbox_post(&mbox, &TCPIP_MSG_VAR_REF(msg));
+  sys_mbox_post(&tcpip_mbox, &TCPIP_MSG_VAR_REF(msg));
   sys_arch_sem_wait(sem, 0);
   TCPIP_MSG_VAR_FREE(msg);
   return ERR_OK;
@@ -354,7 +462,7 @@
 /**
  * Synchronously calls function in TCPIP thread and waits for its completion.
  * It is recommended to use LWIP_TCPIP_CORE_LOCKING (preferred) or
- * LWIP_NETCONN_SEM_PER_THREAD. 
+ * LWIP_NETCONN_SEM_PER_THREAD.
  * If not, a semaphore is created and destroyed on every call which is usually
  * an expensive/slow operation.
  * @param fn Function to call
@@ -380,7 +488,7 @@
   }
 #endif /* LWIP_NETCONN_SEM_PER_THREAD */
 
-  LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(mbox));
+  LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
 
   TCPIP_MSG_VAR_ALLOC(msg);
   TCPIP_MSG_VAR_REF(msg).type = TCPIP_MSG_API_CALL;
@@ -391,7 +499,7 @@
 #else /* LWIP_NETCONN_SEM_PER_THREAD */
   TCPIP_MSG_VAR_REF(msg).msg.api_call.sem = &call->sem;
 #endif /* LWIP_NETCONN_SEM_PER_THREAD */
-  sys_mbox_post(&mbox, &TCPIP_MSG_VAR_REF(msg));
+  sys_mbox_post(&tcpip_mbox, &TCPIP_MSG_VAR_REF(msg));
   sys_arch_sem_wait(TCPIP_MSG_VAR_REF(msg).msg.api_call.sem, 0);
   TCPIP_MSG_VAR_FREE(msg);
 
@@ -404,14 +512,22 @@
 }
 
 /**
+ * @ingroup lwip_os
  * Allocate a structure for a static callback message and initialize it.
- * This is intended to be used to send "static" messages from interrupt context.
- *
+ * The message has a special type such that lwIP never frees it.
+ * This is intended to be used to send "static" messages from interrupt context,
+ * 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_trycallback().
+ * @return a struct pointer to pass to tcpip_callbackmsg_trycallback().
+ *
+ * @see tcpip_callbackmsg_trycallback()
+ * @see tcpip_callbackmsg_delete()
  */
-struct tcpip_callback_msg*
+struct tcpip_callback_msg *
 tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx)
 {
   struct tcpip_msg *msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
@@ -421,32 +537,56 @@
   msg->type = TCPIP_MSG_CALLBACK_STATIC;
   msg->msg.cb.function = function;
   msg->msg.cb.ctx = ctx;
-  return (struct tcpip_callback_msg*)msg;
+  return (struct tcpip_callback_msg *)msg;
 }
 
 /**
+ * @ingroup lwip_os
  * Free a callback message allocated by tcpip_callbackmsg_new().
  *
  * @param msg the message to free
+ *
+ * @see tcpip_callbackmsg_new()
  */
 void
-tcpip_callbackmsg_delete(struct tcpip_callback_msg* msg)
+tcpip_callbackmsg_delete(struct tcpip_callback_msg *msg)
 {
   memp_free(MEMP_TCPIP_MSG_API, msg);
 }
 
 /**
- * Try to post a callback-message to the tcpip_thread mbox
- * This is intended to be used to send "static" messages from interrupt context.
+ * @ingroup lwip_os
+ * Try to post a callback-message to the tcpip_thread tcpip_mbox.
  *
  * @param msg pointer to the message to post
  * @return sys_mbox_trypost() return code
+ *
+ * @see tcpip_callbackmsg_new()
  */
 err_t
-tcpip_trycallback(struct tcpip_callback_msg* msg)
+tcpip_callbackmsg_trycallback(struct tcpip_callback_msg *msg)
 {
-  LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(mbox));
-  return sys_mbox_trypost(&mbox, msg);
+  LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
+  return sys_mbox_trypost(&tcpip_mbox, msg);
+}
+
+/**
+ * @ingroup lwip_os
+ * Try to post a callback-message to the tcpip_thread mbox.
+ * Same as @ref tcpip_callbackmsg_trycallback but calls sys_mbox_trypost_fromisr(),
+ * mainly to help FreeRTOS, where calls differ between task level and ISR level.
+ *
+ * @param msg pointer to the message to post
+ * @return sys_mbox_trypost_fromisr() return code (without change, so this
+ *         knowledge can be used to e.g. propagate "bool needs_scheduling")
+ *
+ * @see tcpip_callbackmsg_new()
+ */
+err_t
+tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg *msg)
+{
+  LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
+  return sys_mbox_trypost_fromisr(&tcpip_mbox, msg);
 }
 
 /**
@@ -465,7 +605,7 @@
 
   tcpip_init_done = initfunc;
   tcpip_init_done_arg = arg;
-  if (sys_mbox_new(&mbox, TCPIP_MBOX_SIZE) != ERR_OK) {
+  if (sys_mbox_new(&tcpip_mbox, TCPIP_MBOX_SIZE) != ERR_OK) {
     LWIP_ASSERT("failed to create tcpip_thread mbox", 0);
   }
 #if LWIP_TCPIP_CORE_LOCKING
@@ -499,7 +639,7 @@
 err_t
 pbuf_free_callback(struct pbuf *p)
 {
-  return tcpip_callback_with_block(pbuf_free_int, p, 0);
+  return tcpip_try_callback(pbuf_free_int, p);
 }
 
 /**
@@ -512,7 +652,7 @@
 err_t
 mem_free_callback(void *m)
 {
-  return tcpip_callback_with_block(mem_free, m, 0);
+  return tcpip_try_callback(mem_free, m);
 }
 
 #endif /* !NO_SYS */
diff --git a/src/apps/altcp_tls/altcp_tls_mbedtls.c b/src/apps/altcp_tls/altcp_tls_mbedtls.c
new file mode 100644
index 0000000..d642dec
--- /dev/null
+++ b/src/apps/altcp_tls/altcp_tls_mbedtls.c
@@ -0,0 +1,1178 @@
+/**
+ * @file
+ * Application layered TCP/TLS connection API (to be used from TCPIP thread)
+ *
+ * This file provides a TLS layer using mbedTLS
+ */
+
+/*
+ * 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>
+ *
+ * Watch out:
+ * - 'sent' is always called with len==0 to the upper layer. This is because keeping
+ *   track of the ratio of application data and TLS overhead would be too much.
+ *
+ * Mandatory security-related configuration:
+ * - define ALTCP_MBEDTLS_RNG_FN to mbedtls_entropy_func to use the standard mbedTLS
+ *   entropy and ensure to add at least one strong entropy source to your mbedtls port
+ *   (implement mbedtls_platform_entropy_poll or mbedtls_hardware_poll providing strong
+ *   entropy)
+ * - define ALTCP_MBEDTLS_ENTROPY_PTR and ALTCP_MBEDTLS_ENTROPY_LEN to something providing
+ *   GOOD custom entropy
+ *
+ * Missing things / @todo:
+ * - some unhandled/untested things migh be caught by LWIP_ASSERTs...
+ */
+
+#include "lwip/opt.h"
+
+#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/apps/altcp_tls_mbedtls_opts.h"
+
+#if LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS
+
+#include "lwip/altcp.h"
+#include "lwip/altcp_tls.h"
+#include "lwip/priv/altcp_priv.h"
+
+#include "altcp_tls_mbedtls_structs.h"
+#include "altcp_tls_mbedtls_mem.h"
+
+/* @todo: which includes are really needed? */
+#include "mbedtls/entropy.h"
+#include "mbedtls/ctr_drbg.h"
+#include "mbedtls/certs.h"
+#include "mbedtls/x509.h"
+#include "mbedtls/ssl.h"
+#include "mbedtls/net.h"
+#include "mbedtls/error.h"
+#include "mbedtls/debug.h"
+#include "mbedtls/platform.h"
+#include "mbedtls/memory_buffer_alloc.h"
+#include "mbedtls/ssl_cache.h"
+
+#include "mbedtls/ssl_internal.h" /* to call mbedtls_flush_output after ERR_MEM */
+
+#include <string.h>
+
+#ifndef ALTCP_MBEDTLS_ENTROPY_PTR
+#define ALTCP_MBEDTLS_ENTROPY_PTR   NULL
+#endif
+#ifndef ALTCP_MBEDTLS_ENTROPY_LEN
+#define ALTCP_MBEDTLS_ENTROPY_LEN   0
+#endif
+
+/* Variable prototype, the actual declaration is at the end of this file
+   since it contains pointers to static functions declared here */
+extern const struct altcp_functions altcp_mbedtls_functions;
+
+/** Our global mbedTLS configuration (server-specific, not connection-specific) */
+struct altcp_tls_config {
+  mbedtls_ssl_config conf;
+  mbedtls_entropy_context entropy;
+  mbedtls_ctr_drbg_context ctr_drbg;
+  mbedtls_x509_crt *cert;
+  mbedtls_pk_context *pkey;
+  mbedtls_x509_crt *ca;
+#if defined(MBEDTLS_SSL_CACHE_C) && ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS
+  /** Inter-connection cache for fast connection startup */
+  struct mbedtls_ssl_cache_context cache;
+#endif
+};
+
+static err_t altcp_mbedtls_lower_recv(void *arg, struct altcp_pcb *inner_conn, struct pbuf *p, err_t err);
+static err_t altcp_mbedtls_setup(void *conf, struct altcp_pcb *conn, struct altcp_pcb *inner_conn);
+static err_t altcp_mbedtls_lower_recv_process(struct altcp_pcb *conn, altcp_mbedtls_state_t *state);
+static err_t altcp_mbedtls_handle_rx_appldata(struct altcp_pcb *conn, altcp_mbedtls_state_t *state);
+static int altcp_mbedtls_bio_send(void *ctx, const unsigned char *dataptr, size_t size);
+
+
+/* callback functions from inner/lower connection: */
+
+/** Accept callback from lower connection (i.e. TCP)
+ * Allocate one of our structures, assign it to the new connection's 'state' and
+ * call the new connection's 'accepted' callback. If that succeeds, we wait
+ * to receive connection setup handshake bytes from the client.
+ */
+static err_t
+altcp_mbedtls_lower_accept(void *arg, struct altcp_pcb *accepted_conn, err_t err)
+{
+  struct altcp_pcb *listen_conn = (struct altcp_pcb *)arg;
+  if (listen_conn && listen_conn->state && listen_conn->accept) {
+    err_t setup_err;
+    altcp_mbedtls_state_t *listen_state = (altcp_mbedtls_state_t *)listen_conn->state;
+    /* create a new altcp_conn to pass to the next 'accept' callback */
+    struct altcp_pcb *new_conn = altcp_alloc();
+    if (new_conn == NULL) {
+      return ERR_MEM;
+    }
+    setup_err = altcp_mbedtls_setup(listen_state->conf, new_conn, accepted_conn);
+    if (setup_err != ERR_OK) {
+      altcp_free(new_conn);
+      return setup_err;
+    }
+    return listen_conn->accept(listen_conn->arg, new_conn, err);
+  }
+  return ERR_ARG;
+}
+
+/** Connected callback from lower connection (i.e. TCP).
+ * Not really implemented/tested yet...
+ */
+static err_t
+altcp_mbedtls_lower_connected(void *arg, struct altcp_pcb *inner_conn, err_t err)
+{
+  struct altcp_pcb *conn = (struct altcp_pcb *)arg;
+  LWIP_UNUSED_ARG(inner_conn); /* for LWIP_NOASSERT */
+  if (conn && conn->state) {
+    LWIP_ASSERT("pcb mismatch", conn->inner_conn == inner_conn);
+    /* upper connected is called when handshake is done */
+    if (err != ERR_OK) {
+      if (conn->connected) {
+        return conn->connected(conn->arg, conn, err);
+      }
+    }
+    return altcp_mbedtls_lower_recv_process(conn, (altcp_mbedtls_state_t *)conn->state);
+  }
+  return ERR_VAL;
+}
+
+/* Call recved for possibly more than an u16_t */
+static void
+altcp_mbedtls_lower_recved(struct altcp_pcb *inner_conn, int recvd_cnt)
+{
+  while (recvd_cnt > 0) {
+    u16_t recvd_part = (u16_t)LWIP_MIN(recvd_cnt, 0xFFFF);
+    altcp_recved(inner_conn, recvd_part);
+    recvd_cnt -= recvd_part;
+  }
+}
+
+/** Recv callback from lower connection (i.e. TCP)
+ * This one mainly differs between connection setup/handshake (data is fed into mbedTLS only)
+ * and application phase (data is decoded by mbedTLS and passed on to the application).
+ */
+static err_t
+altcp_mbedtls_lower_recv(void *arg, struct altcp_pcb *inner_conn, struct pbuf *p, err_t err)
+{
+  altcp_mbedtls_state_t *state;
+  struct altcp_pcb *conn = (struct altcp_pcb *)arg;
+
+  LWIP_ASSERT("no err expected", err == ERR_OK);
+  LWIP_UNUSED_ARG(err);
+
+  if (!conn) {
+    /* no connection given as arg? should not happen, but prevent pbuf/conn leaks */
+    if (p != NULL) {
+      pbuf_free(p);
+    }
+    altcp_close(inner_conn);
+    return ERR_CLSD;
+  }
+  state = (altcp_mbedtls_state_t *)conn->state;
+  LWIP_ASSERT("pcb mismatch", conn->inner_conn == inner_conn);
+  if (!state) {
+    /* already closed */
+    if (p != NULL) {
+      pbuf_free(p);
+    }
+    altcp_close(inner_conn);
+    return ERR_CLSD;
+  }
+
+  /* handle NULL pbuf (inner connection closed) */
+  if (p == NULL) {
+    /* remote host sent FIN, remember this (SSL state is destroyed
+        when both sides are closed only!) */
+    if ((state->flags & (ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE | ALTCP_MBEDTLS_FLAGS_UPPER_CALLED)) ==
+        (ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE | ALTCP_MBEDTLS_FLAGS_UPPER_CALLED)) {
+      /* need to notify upper layer (e.g. 'accept' called or 'connect' succeeded) */
+      if ((state->rx != NULL) || (state->rx_app != NULL)) {
+        state->flags |= ALTCP_MBEDTLS_FLAGS_RX_CLOSE_QUEUED;
+        /* this is a normal close (FIN) but we have unprocessed data, so delay the FIN */
+        altcp_mbedtls_handle_rx_appldata(conn, state);
+        return ERR_OK;
+      }
+      state->flags |= ALTCP_MBEDTLS_FLAGS_RX_CLOSED;
+      if (conn->recv) {
+        return conn->recv(conn->arg, conn, NULL, ERR_OK);
+      }
+    } else {
+      /* before connection setup is done: call 'err' */
+      if (conn->err) {
+        conn->err(conn->arg, ERR_CLSD);
+      }
+      altcp_close(conn);
+    }
+    return ERR_OK;
+  }
+
+  /* If we come here, the connection is in good state (handshake phase or application data phase).
+     Queue up the pbuf for processing as handshake data or application data. */
+  if (state->rx == NULL) {
+    state->rx = p;
+  } else {
+    LWIP_ASSERT("rx pbuf overflow", (int)p->tot_len + (int)p->len <= 0xFFFF);
+    pbuf_cat(state->rx, p);
+  }
+  return altcp_mbedtls_lower_recv_process(conn, state);
+}
+
+static err_t
+altcp_mbedtls_lower_recv_process(struct altcp_pcb *conn, altcp_mbedtls_state_t *state)
+{
+  if (!(state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) {
+    /* handle connection setup (handshake not done) */
+    int ret = mbedtls_ssl_handshake(&state->ssl_context);
+    /* try to send data... */
+    altcp_output(conn->inner_conn);
+    if (state->bio_bytes_read) {
+      /* acknowledge all bytes read */
+      altcp_mbedtls_lower_recved(conn->inner_conn, state->bio_bytes_read);
+      state->bio_bytes_read = 0;
+    }
+
+    if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE) {
+      /* handshake not done, wait for more recv calls */
+      LWIP_ASSERT("in this state, the rx chain should be empty", state->rx == NULL);
+      return ERR_OK;
+    }
+    if (ret != 0) {
+      LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_handshake failed: %d\n", ret));
+      /* handshake failed, connection has to be closed */
+      if (conn->err) {
+        conn->err(conn->arg, ERR_CLSD);
+      }
+
+      if (altcp_close(conn) != ERR_OK) {
+        altcp_abort(conn);
+      }
+      return ERR_OK;
+    }
+    /* If we come here, handshake succeeded. */
+    LWIP_ASSERT("state", state->bio_bytes_read == 0);
+    LWIP_ASSERT("state", state->bio_bytes_appl == 0);
+    state->flags |= ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE;
+    /* issue "connect" callback" to upper connection (this can only happen for active open) */
+    if (conn->connected) {
+      err_t err;
+      err = conn->connected(conn->arg, conn, ERR_OK);
+      if (err != ERR_OK) {
+        return err;
+      }
+    }
+    if (state->rx == NULL) {
+      return ERR_OK;
+    }
+  }
+  /* handle application data */
+  return altcp_mbedtls_handle_rx_appldata(conn, state);
+}
+
+/* Pass queued decoded rx data to application */
+static err_t
+altcp_mbedtls_pass_rx_data(struct altcp_pcb *conn, altcp_mbedtls_state_t *state)
+{
+  err_t err;
+  struct pbuf *buf;
+  LWIP_ASSERT("conn != NULL", conn != NULL);
+  LWIP_ASSERT("state != NULL", state != NULL);
+  buf = state->rx_app;
+  if (buf) {
+    state->rx_app = NULL;
+    if (conn->recv) {
+      u16_t tot_len = buf->tot_len;
+      /* this needs to be increased first because the 'recved' call may come nested */
+      state->rx_passed_unrecved += tot_len;
+      state->flags |= ALTCP_MBEDTLS_FLAGS_UPPER_CALLED;
+      err = conn->recv(conn->arg, conn, buf, ERR_OK);
+      if (err != ERR_OK) {
+        if (err == ERR_ABRT) {
+          return ERR_ABRT;
+        }
+        /* not received, leave the pbuf(s) queued (and decrease 'unrecved' again) */
+        LWIP_ASSERT("state == conn->state", state == conn->state);
+        state->rx_app = buf;
+        state->rx_passed_unrecved -= tot_len;
+        LWIP_ASSERT("state->rx_passed_unrecved >= 0", state->rx_passed_unrecved >= 0);
+        if (state->rx_passed_unrecved < 0) {
+          state->rx_passed_unrecved = 0;
+        }
+        return err;
+      }
+    } else {
+      pbuf_free(buf);
+    }
+  } else if ((state->flags & (ALTCP_MBEDTLS_FLAGS_RX_CLOSE_QUEUED | ALTCP_MBEDTLS_FLAGS_RX_CLOSED)) ==
+             ALTCP_MBEDTLS_FLAGS_RX_CLOSE_QUEUED) {
+    state->flags |= ALTCP_MBEDTLS_FLAGS_RX_CLOSED;
+    if (conn->recv) {
+      return conn->recv(conn->arg, conn, NULL, ERR_OK);
+    }
+  }
+
+  /* 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_OK;
+}
+
+/* Helper function that processes rx application data stored in rx pbuf chain */
+static err_t
+altcp_mbedtls_handle_rx_appldata(struct altcp_pcb *conn, altcp_mbedtls_state_t *state)
+{
+  int ret;
+  LWIP_ASSERT("state != NULL", state != NULL);
+  if (!(state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) {
+    /* handshake not done yet */
+    return ERR_VAL;
+  }
+  do {
+    /* allocate a full-sized unchained PBUF_POOL: this is for RX! */
+    struct pbuf *buf = pbuf_alloc(PBUF_RAW, PBUF_POOL_BUFSIZE, PBUF_POOL);
+    if (buf == NULL) {
+      /* We're short on pbufs, try again later from 'poll' or 'recv' callbacks.
+         @todo: close on excessive allocation failures or leave this up to upper conn? */
+      return ERR_OK;
+    }
+
+    /* decrypt application data, this pulls encrypted RX data off state->rx pbuf chain */
+    ret = mbedtls_ssl_read(&state->ssl_context, (unsigned char *)buf->payload, PBUF_POOL_BUFSIZE);
+    if (ret < 0) {
+      if (ret == MBEDTLS_ERR_SSL_CLIENT_RECONNECT) {
+        /* client is initiating a new connection using the same source port -> close connection or make handshake */
+        LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("new connection on same source port\n"));
+        LWIP_ASSERT("TODO: new connection on same source port, close this connection", 0);
+      } else if ((ret != MBEDTLS_ERR_SSL_WANT_READ) && (ret != MBEDTLS_ERR_SSL_WANT_WRITE)) {
+        if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) {
+          LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("connection was closed gracefully\n"));
+        } else if (ret == MBEDTLS_ERR_NET_CONN_RESET) {
+          LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("connection was reset by peer\n"));
+        }
+        pbuf_free(buf);
+        return ERR_OK;
+      } else {
+        pbuf_free(buf);
+        return ERR_OK;
+      }
+      pbuf_free(buf);
+      altcp_abort(conn);
+      return ERR_ABRT;
+    } else {
+      err_t err;
+      if (ret) {
+        LWIP_ASSERT("bogus receive length", ret <= PBUF_POOL_BUFSIZE);
+        /* trim pool pbuf to actually decoded length */
+        pbuf_realloc(buf, (u16_t)ret);
+
+        state->bio_bytes_appl += ret;
+        if (mbedtls_ssl_get_bytes_avail(&state->ssl_context) == 0) {
+          /* Record is done, now we know the share between application and protocol bytes
+             and can adjust the RX window by the protocol bytes.
+             The rest is 'recved' by the application calling our 'recved' fn. */
+          int overhead_bytes;
+          LWIP_ASSERT("bogus byte counts", state->bio_bytes_read > state->bio_bytes_appl);
+          overhead_bytes = state->bio_bytes_read - state->bio_bytes_appl;
+          altcp_mbedtls_lower_recved(conn->inner_conn, overhead_bytes);
+          state->bio_bytes_read = 0;
+          state->bio_bytes_appl = 0;
+        }
+
+        if (state->rx_app == NULL) {
+          state->rx_app = buf;
+        } else {
+          pbuf_cat(state->rx_app, buf);
+        }
+      } else {
+        pbuf_free(buf);
+        buf = NULL;
+      }
+      err = altcp_mbedtls_pass_rx_data(conn, state);
+      if (err != ERR_OK) {
+        if (err == ERR_ABRT) {
+          /* recv callback needs to return this as the pcb is deallocated */
+          return ERR_ABRT;
+        }
+        /* we hide all other errors as we retry feeding the pbuf to the app later */
+        return ERR_OK;
+      }
+    }
+  } while (ret > 0);
+  return ERR_OK;
+}
+
+/** Receive callback function called from mbedtls (set via mbedtls_ssl_set_bio)
+ * This function mainly copies data from pbufs and frees the pbufs after copying.
+ */
+static int
+altcp_mbedtls_bio_recv(void *ctx, unsigned char *buf, size_t len)
+{
+  struct altcp_pcb *conn = (struct altcp_pcb *)ctx;
+  altcp_mbedtls_state_t *state;
+  struct pbuf *p;
+  u16_t ret;
+  u16_t copy_len;
+  err_t err;
+
+  LWIP_UNUSED_ARG(err); /* for LWIP_NOASSERT */
+  if ((conn == NULL) || (conn->state == NULL)) {
+    return MBEDTLS_ERR_NET_INVALID_CONTEXT;
+  }
+  state = (altcp_mbedtls_state_t *)conn->state;
+  p = state->rx;
+
+  /* @todo: return MBEDTLS_ERR_NET_CONN_RESET/MBEDTLS_ERR_NET_RECV_FAILED? */
+
+  if ((p == NULL) || ((p->len == 0) && (p->next == NULL))) {
+    if (p) {
+      pbuf_free(p);
+    }
+    state->rx = NULL;
+    if ((state->flags & (ALTCP_MBEDTLS_FLAGS_RX_CLOSE_QUEUED | ALTCP_MBEDTLS_FLAGS_RX_CLOSED)) ==
+        ALTCP_MBEDTLS_FLAGS_RX_CLOSE_QUEUED) {
+      /* close queued but not passed up yet */
+      return 0;
+    }
+    return MBEDTLS_ERR_SSL_WANT_READ;
+  }
+  /* limit number of bytes again to copy from first pbuf in a chain only */
+  copy_len = (u16_t)LWIP_MIN(len, p->len);
+  /* copy the data */
+  ret = pbuf_copy_partial(p, buf, copy_len, 0);
+  LWIP_ASSERT("ret == copy_len", ret == copy_len);
+  /* hide the copied bytes from the pbuf */
+  err = pbuf_remove_header(p, ret);
+  LWIP_ASSERT("error", err == ERR_OK);
+  if (p->len == 0) {
+    /* the first pbuf has been fully read, free it */
+    state->rx = p->next;
+    p->next = NULL;
+    pbuf_free(p);
+  }
+
+  state->bio_bytes_read += (int)ret;
+  return ret;
+}
+
+/** 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.
+ */
+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) {
+    altcp_mbedtls_state_t *state = (altcp_mbedtls_state_t *)conn->state;
+    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;
+    }
+    /* try to send more if we failed before */
+    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);
+    }
+  }
+  return ERR_OK;
+}
+
+/** Poll callback from lower connection (i.e. TCP)
+ * Just pass this on to the application.
+ * @todo: retry sending?
+ */
+static err_t
+altcp_mbedtls_lower_poll(void *arg, struct altcp_pcb *inner_conn)
+{
+  struct altcp_pcb *conn = (struct altcp_pcb *)arg;
+  LWIP_UNUSED_ARG(inner_conn); /* for LWIP_NOASSERT */
+  if (conn) {
+    LWIP_ASSERT("pcb mismatch", conn->inner_conn == inner_conn);
+    /* check if there's unreceived rx data */
+    if (conn->state) {
+      altcp_mbedtls_state_t *state = (altcp_mbedtls_state_t *)conn->state;
+      /* try to send more if we failed before */
+      mbedtls_ssl_flush_output(&state->ssl_context);
+      if (altcp_mbedtls_handle_rx_appldata(conn, state) == ERR_ABRT) {
+        return ERR_ABRT;
+      }
+    }
+    if (conn->poll) {
+      return conn->poll(conn->arg, conn);
+    }
+  }
+  return ERR_OK;
+}
+
+static void
+altcp_mbedtls_lower_err(void *arg, err_t err)
+{
+  struct altcp_pcb *conn = (struct altcp_pcb *)arg;
+  if (conn) {
+    conn->inner_conn = NULL; /* already freed */
+    if (conn->err) {
+      conn->err(conn->arg, err);
+    }
+    altcp_free(conn);
+  }
+}
+
+/* setup functions */
+
+static void
+altcp_mbedtls_remove_callbacks(struct altcp_pcb *inner_conn)
+{
+  altcp_arg(inner_conn, NULL);
+  altcp_recv(inner_conn, NULL);
+  altcp_sent(inner_conn, NULL);
+  altcp_err(inner_conn, NULL);
+  altcp_poll(inner_conn, NULL, inner_conn->pollinterval);
+}
+
+static void
+altcp_mbedtls_setup_callbacks(struct altcp_pcb *conn, struct altcp_pcb *inner_conn)
+{
+  altcp_arg(inner_conn, conn);
+  altcp_recv(inner_conn, altcp_mbedtls_lower_recv);
+  altcp_sent(inner_conn, altcp_mbedtls_lower_sent);
+  altcp_err(inner_conn, altcp_mbedtls_lower_err);
+  /* tcp_poll is set when interval is set by application */
+  /* listen is set totally different :-) */
+}
+
+static err_t
+altcp_mbedtls_setup(void *conf, struct altcp_pcb *conn, struct altcp_pcb *inner_conn)
+{
+  int ret;
+  struct altcp_tls_config *config = (struct altcp_tls_config *)conf;
+  altcp_mbedtls_state_t *state;
+  if (!conf) {
+    return ERR_ARG;
+  }
+  LWIP_ASSERT("invalid inner_conn", conn != inner_conn);
+
+  /* allocate mbedtls context */
+  state = altcp_mbedtls_alloc(conf);
+  if (state == NULL) {
+    return ERR_MEM;
+  }
+  /* initialize mbedtls context: */
+  mbedtls_ssl_init(&state->ssl_context);
+  ret = mbedtls_ssl_setup(&state->ssl_context, &config->conf);
+  if (ret != 0) {
+    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_setup failed\n"));
+    /* @todo: convert 'ret' to err_t */
+    altcp_mbedtls_free(conf, state);
+    return ERR_MEM;
+  }
+  /* tell mbedtls about our I/O functions */
+  mbedtls_ssl_set_bio(&state->ssl_context, conn, altcp_mbedtls_bio_send, altcp_mbedtls_bio_recv, NULL);
+
+  altcp_mbedtls_setup_callbacks(conn, inner_conn);
+  conn->inner_conn = inner_conn;
+  conn->fns = &altcp_mbedtls_functions;
+  conn->state = state;
+  return ERR_OK;
+}
+
+struct altcp_pcb *
+altcp_tls_wrap(struct altcp_tls_config *config, struct altcp_pcb *inner_pcb)
+{
+  struct altcp_pcb *ret;
+  if (inner_pcb == NULL) {
+    return NULL;
+  }
+  ret = altcp_alloc();
+  if (ret != NULL) {
+    if (altcp_mbedtls_setup(config, ret, inner_pcb) != ERR_OK) {
+      altcp_free(ret);
+      return NULL;
+    }
+  }
+  return ret;
+}
+
+void *
+altcp_tls_context(struct altcp_pcb *conn)
+{
+  if (conn && conn->state) {
+    altcp_mbedtls_state_t *state = (altcp_mbedtls_state_t *)conn->state;
+    return &state->ssl_context;
+  }
+  return NULL;
+}
+
+#if ALTCP_MBEDTLS_DEBUG != LWIP_DBG_OFF
+static void
+altcp_mbedtls_debug(void *ctx, int level, const char *file, int line, const char *str)
+{
+  LWIP_UNUSED_ARG(ctx);
+  LWIP_UNUSED_ARG(level);
+  LWIP_UNUSED_ARG(file);
+  LWIP_UNUSED_ARG(line);
+  LWIP_UNUSED_ARG(str);
+
+  LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("%s:%04d: %s", file, line, str));
+}
+#endif
+
+#ifndef ALTCP_MBEDTLS_RNG_FN
+/** ATTENTION: It is *really* important to *NOT* use this dummy RNG in production code!!!! */
+static int
+dummy_rng(void *ctx, unsigned char *buffer, size_t len)
+{
+  static size_t ctr;
+  size_t i;
+  LWIP_UNUSED_ARG(ctx);
+  for (i = 0; i < len; i++) {
+    buffer[i] = (unsigned char)++ctr;
+  }
+  return 0;
+}
+#define ALTCP_MBEDTLS_RNG_FN dummy_rng
+#endif /* ALTCP_MBEDTLS_RNG_FN */
+
+/** 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, int have_cert, int have_pkey, int have_ca)
+{
+  size_t sz;
+  int ret;
+  struct altcp_tls_config *conf;
+  mbedtls_x509_crt *mem;
+
+  if (TCP_WND < MBEDTLS_SSL_MAX_CONTENT_LEN) {
+    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG|LWIP_DBG_LEVEL_SERIOUS,
+      ("altcp_tls: TCP_WND is smaller than the RX decryption buffer, connection RX might stall!\n"));
+  }
+
+  altcp_mbedtls_mem_init();
+
+  sz = sizeof(struct altcp_tls_config);
+  if (have_cert) {
+    sz += sizeof(mbedtls_x509_crt);
+  }
+  if (have_ca) {
+    sz += sizeof(mbedtls_x509_crt);
+  }
+  if (have_pkey) {
+    sz += sizeof(mbedtls_pk_context);
+  }
+
+  conf = (struct altcp_tls_config *)altcp_mbedtls_alloc_config(sz);
+  if (conf == NULL) {
+    return NULL;
+  }
+  mem = (mbedtls_x509_crt *)(conf + 1);
+  if (have_cert) {
+    conf->cert = mem;
+    mem++;
+  }
+  if (have_ca) {
+    conf->ca = mem;
+    mem++;
+  }
+  if (have_pkey) {
+    conf->pkey = (mbedtls_pk_context *)mem;
+  }
+
+  mbedtls_ssl_config_init(&conf->conf);
+  mbedtls_entropy_init(&conf->entropy);
+  mbedtls_ctr_drbg_init(&conf->ctr_drbg);
+
+  /* Seed the RNG */
+  ret = mbedtls_ctr_drbg_seed(&conf->ctr_drbg, ALTCP_MBEDTLS_RNG_FN, &conf->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));
+    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) */
+  ret = mbedtls_ssl_config_defaults(&conf->conf, is_server ? MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT,
+                                    MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT);
+  if (ret != 0) {
+    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_config_defaults failed: %d\n", ret));
+    altcp_mbedtls_free_config(conf);
+    return NULL;
+  }
+  mbedtls_ssl_conf_authmode(&conf->conf, MBEDTLS_SSL_VERIFY_OPTIONAL);
+
+  mbedtls_ssl_conf_rng(&conf->conf, mbedtls_ctr_drbg_random, &conf->ctr_drbg);
+#if ALTCP_MBEDTLS_DEBUG != LWIP_DBG_OFF
+  mbedtls_ssl_conf_dbg(&conf->conf, altcp_mbedtls_debug, stdout);
+#endif
+#if defined(MBEDTLS_SSL_CACHE_C) && ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS
+  mbedtls_ssl_conf_session_cache(&conf->conf, &conf->cache, mbedtls_ssl_cache_get, mbedtls_ssl_cache_set);
+  mbedtls_ssl_cache_set_timeout(&conf->cache, 30);
+  mbedtls_ssl_cache_set_max_entries(&conf->cache, 30);
+#endif
+
+  return conf;
+}
+
+/** Create new TLS configuration
+ * This is a suboptimal version that gets the encrypted private key and its password,
+ * as well as the server certificate.
+ */
+struct altcp_tls_config *
+altcp_tls_create_config_server_privkey_cert(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)
+{
+  int ret;
+  mbedtls_x509_crt *srvcert;
+  mbedtls_pk_context *pkey;
+  struct altcp_tls_config *conf = altcp_tls_create_config(1, 1, 1, 0);
+  if (conf == NULL) {
+    return NULL;
+  }
+
+  srvcert = conf->cert;
+  mbedtls_x509_crt_init(srvcert);
+
+  pkey = conf->pkey;
+  mbedtls_pk_init(pkey);
+
+  /* Load the certificates and private key */
+  ret = mbedtls_x509_crt_parse(srvcert, cert, cert_len);
+  if (ret != 0) {
+    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_x509_crt_parse failed: %d\n", ret));
+    altcp_mbedtls_free_config(conf);
+    return NULL;
+  }
+
+  ret = mbedtls_pk_parse_key(pkey, (const unsigned char *) privkey, privkey_len, privkey_pass, privkey_pass_len);
+  if (ret != 0) {
+    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_pk_parse_public_key failed: %d\n", ret));
+    mbedtls_x509_crt_free(srvcert);
+    altcp_mbedtls_free_config(conf);
+    return NULL;
+  }
+
+  mbedtls_ssl_conf_ca_chain(&conf->conf, srvcert->next, NULL);
+  ret = mbedtls_ssl_conf_own_cert(&conf->conf, srvcert, pkey);
+  if (ret != 0) {
+    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_conf_own_cert failed: %d\n", ret));
+    mbedtls_x509_crt_free(srvcert);
+    mbedtls_pk_free(pkey);
+    altcp_mbedtls_free_config(conf);
+    return NULL;
+  }
+  return conf;
+}
+
+static struct altcp_tls_config *
+altcp_tls_create_config_client_common(const u8_t *ca, size_t ca_len, int is_2wayauth)
+{
+  int ret;
+  struct altcp_tls_config *conf = altcp_tls_create_config(0, is_2wayauth, is_2wayauth, ca != NULL);
+  if (conf == NULL) {
+    return NULL;
+  }
+
+  /* Initialize the CA certificate if provided
+   * CA certificate is optional (to save memory) but recommended for production environment
+   * Without CA certificate, connection will be prone to man-in-the-middle attacks */
+  if (ca) {
+    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);
+      return NULL;
+    }
+
+    mbedtls_ssl_conf_ca_chain(&conf->conf, conf->ca, NULL);
+  }
+  return conf;
+}
+
+struct altcp_tls_config *
+altcp_tls_create_config_client(const u8_t *ca, size_t ca_len)
+{
+  return altcp_tls_create_config_client_common(ca, ca_len, 0);
+}
+
+struct altcp_tls_config *
+altcp_tls_create_config_client_2wayauth(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)
+{
+  int ret;
+  struct altcp_tls_config *conf;
+
+  if (!cert || !privkey) {
+    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("altcp_tls_create_config_client_2wayauth: certificate and priv key required"));
+    return NULL;
+  }
+
+  conf = altcp_tls_create_config_client_common(ca, ca_len, 1);
+  if (conf == NULL) {
+    return NULL;
+  }
+
+  /* Initialize the client certificate and corresponding private key */
+  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);
+    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);
+    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);
+    return NULL;
+  }
+
+  return conf;
+}
+
+void
+altcp_tls_free_config(struct altcp_tls_config *conf)
+{
+  if (conf->pkey) {
+    mbedtls_pk_free(conf->pkey);
+  }
+  if (conf->cert) {
+    mbedtls_x509_crt_free(conf->cert);
+  }
+  if (conf->ca) {
+    mbedtls_x509_crt_free(conf->ca);
+  }  
+  altcp_mbedtls_free_config(conf);
+}
+
+/* "virtual" functions */
+static void
+altcp_mbedtls_set_poll(struct altcp_pcb *conn, u8_t interval)
+{
+  if (conn != NULL) {
+    altcp_poll(conn->inner_conn, altcp_mbedtls_lower_poll, interval);
+  }
+}
+
+static void
+altcp_mbedtls_recved(struct altcp_pcb *conn, u16_t len)
+{
+  u16_t lower_recved;
+  altcp_mbedtls_state_t *state;
+  if (conn == NULL) {
+    return;
+  }
+  state = (altcp_mbedtls_state_t *)conn->state;
+  if (state == NULL) {
+    return;
+  }
+  if (!(state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) {
+    return;
+  }
+  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)",
+                                      len, state->rx_passed_unrecved));
+    lower_recved = (u16_t)state->rx_passed_unrecved;
+  }
+  state->rx_passed_unrecved -= lower_recved;
+
+  altcp_recved(conn->inner_conn, lower_recved);
+}
+
+static err_t
+altcp_mbedtls_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected)
+{
+  if (conn == NULL) {
+    return ERR_VAL;
+  }
+  conn->connected = connected;
+  return altcp_connect(conn->inner_conn, ipaddr, port, altcp_mbedtls_lower_connected);
+}
+
+static struct altcp_pcb *
+altcp_mbedtls_listen(struct altcp_pcb *conn, u8_t backlog, err_t *err)
+{
+  struct altcp_pcb *lpcb;
+  if (conn == NULL) {
+    return NULL;
+  }
+  lpcb = altcp_listen_with_backlog_and_err(conn->inner_conn, backlog, err);
+  if (lpcb != NULL) {
+    conn->inner_conn = lpcb;
+    altcp_accept(lpcb, altcp_mbedtls_lower_accept);
+    return conn;
+  }
+  return NULL;
+}
+
+static void
+altcp_mbedtls_abort(struct altcp_pcb *conn)
+{
+  if (conn != NULL) {
+    altcp_abort(conn->inner_conn);
+  }
+}
+
+static err_t
+altcp_mbedtls_close(struct altcp_pcb *conn)
+{
+  struct altcp_pcb *inner_conn;
+  if (conn == NULL) {
+    return ERR_VAL;
+  }
+  inner_conn = conn->inner_conn;
+  if (inner_conn) {
+    err_t err;
+    altcp_poll_fn oldpoll = inner_conn->poll;
+    altcp_mbedtls_remove_callbacks(conn->inner_conn);
+    err = altcp_close(conn->inner_conn);
+    if (err != ERR_OK) {
+      /* not closed, set up all callbacks again */
+      altcp_mbedtls_setup_callbacks(conn, inner_conn);
+      /* poll callback is not included in the above */
+      altcp_poll(inner_conn, oldpoll, inner_conn->pollinterval);
+      return err;
+    }
+    conn->inner_conn = NULL;
+  }
+  altcp_free(conn);
+  return ERR_OK;
+}
+
+/** Allow caller of altcp_write() to limit to negotiated chunk size
+ *  or remaining sndbuf space of inner_conn.
+ */
+static u16_t
+altcp_mbedtls_sndbuf(struct altcp_pcb *conn)
+{
+  if (conn) {
+    altcp_mbedtls_state_t *state;
+    state = (altcp_mbedtls_state_t*)conn->state;
+    if (!state || !(state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) {
+      return 0;
+    }
+    if (conn->inner_conn) {
+      u16_t sndbuf = altcp_sndbuf(conn->inner_conn);
+      /* Take care of record header, IV, AuthTag */
+      int ssl_expan = mbedtls_ssl_get_record_expansion(&state->ssl_context);
+      if (ssl_expan > 0) {
+        size_t ssl_added = (u16_t)LWIP_MIN(ssl_expan, 0xFFFF);
+        /* internal sndbuf smaller than our offset */
+        if (ssl_added < sndbuf) {
+          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 */
+          size_t max_frag_len = mbedtls_ssl_get_max_frag_len(&state->ssl_context);
+          max_len = LWIP_MIN(max_frag_len, max_len);
+#endif
+          /* Adjust sndbuf of inner_conn with what added by SSL */
+          ret = LWIP_MIN(sndbuf - ssl_added, max_len);
+          LWIP_ASSERT("sndbuf overflow", ret <= 0xFFFF);
+          return (u16_t)ret;
+        }
+      }
+    }
+  }
+  /* fallback: use sendbuf of the inner connection */
+  return altcp_default_sndbuf(conn);
+}
+
+/** Write data to a TLS connection. Calls into mbedTLS, which in turn calls into
+ * @ref altcp_mbedtls_bio_send() to send the encrypted data
+ */
+static err_t
+altcp_mbedtls_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags)
+{
+  int ret;
+  altcp_mbedtls_state_t *state;
+
+  LWIP_UNUSED_ARG(apiflags);
+
+  if (conn == NULL) {
+    return ERR_VAL;
+  }
+
+  state = (altcp_mbedtls_state_t *)conn->state;
+  if (state == NULL) {
+    /* @todo: which error? */
+    return ERR_CLSD;
+  }
+  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
+     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) {
+    mbedtls_ssl_flush_output(&state->ssl_context);
+    if (state->ssl_context.out_left) {
+      return ERR_MEM;
+    }
+  }
+  ret = mbedtls_ssl_write(&state->ssl_context, (const unsigned char *)dataptr, len);
+  /* try to send data... */
+  altcp_output(conn->inner_conn);
+  if (ret >= 0) {
+    if (ret == len) {
+      state->flags |= ALTCP_MBEDTLS_FLAGS_APPLDATA_SENT;
+      return ERR_OK;
+    } else {
+      /* @todo/@fixme: assumption: either everything sent or error */
+      LWIP_ASSERT("ret <= 0", 0);
+      return ERR_MEM;
+    }
+  } else {
+    if (ret == MBEDTLS_ERR_SSL_WANT_WRITE) {
+      /* @todo: convert error to err_t */
+      return ERR_MEM;
+    }
+    LWIP_ASSERT("unhandled error", 0);
+    return ERR_VAL;
+  }
+}
+
+/** Send callback function called from mbedtls (set via mbedtls_ssl_set_bio)
+ * This function is either called during handshake or when sending application
+ * data via @ref altcp_mbedtls_write (or altcp_write)
+ */
+static int
+altcp_mbedtls_bio_send(void *ctx, const unsigned char *dataptr, size_t size)
+{
+  struct altcp_pcb *conn = (struct altcp_pcb *) ctx;
+  int written = 0;
+  size_t size_left = size;
+  u8_t apiflags = TCP_WRITE_FLAG_COPY;
+
+  LWIP_ASSERT("conn != NULL", conn != NULL);
+  if ((conn == NULL) || (conn->inner_conn == NULL)) {
+    return MBEDTLS_ERR_NET_INVALID_CONTEXT;
+  }
+
+  while (size_left) {
+    u16_t write_len = (u16_t)LWIP_MIN(size_left, 0xFFFF);
+    err_t err = altcp_write(conn->inner_conn, (const void *)dataptr, write_len, apiflags);
+    if (err == ERR_OK) {
+      written += write_len;
+      size_left -= write_len;
+    } else if (err == ERR_MEM) {
+      if (written) {
+        return written;
+      }
+      return 0; /* MBEDTLS_ERR_SSL_WANT_WRITE; */
+    } else {
+      LWIP_ASSERT("tls_write, tcp_write: err != ERR MEM", 0);
+      /* @todo: return MBEDTLS_ERR_NET_CONN_RESET or MBEDTLS_ERR_NET_SEND_FAILED */
+      return MBEDTLS_ERR_NET_SEND_FAILED;
+    }
+  }
+  return written;
+}
+
+static u16_t
+altcp_mbedtls_mss(struct altcp_pcb *conn)
+{
+  if (conn == NULL) {
+    return 0;
+  }
+  /* @todo: LWIP_MIN(mss, mbedtls_ssl_get_max_frag_len()) ? */
+  return altcp_mss(conn->inner_conn);
+}
+
+static void
+altcp_mbedtls_dealloc(struct altcp_pcb *conn)
+{
+  /* clean up and free tls state */
+  if (conn) {
+    altcp_mbedtls_state_t *state = (altcp_mbedtls_state_t *)conn->state;
+    if (state) {
+      mbedtls_ssl_free(&state->ssl_context);
+      state->flags = 0;
+      if (state->rx) {
+        /* free leftover (unhandled) rx pbufs */
+        pbuf_free(state->rx);
+        state->rx = NULL;
+      }
+      altcp_mbedtls_free(state->conf, state);
+      conn->state = NULL;
+    }
+  }
+}
+
+const struct altcp_functions altcp_mbedtls_functions = {
+  altcp_mbedtls_set_poll,
+  altcp_mbedtls_recved,
+  altcp_default_bind,
+  altcp_mbedtls_connect,
+  altcp_mbedtls_listen,
+  altcp_mbedtls_abort,
+  altcp_mbedtls_close,
+  altcp_default_shutdown,
+  altcp_mbedtls_write,
+  altcp_default_output,
+  altcp_mbedtls_mss,
+  altcp_mbedtls_sndbuf,
+  altcp_default_sndqueuelen,
+  altcp_default_nagle_disable,
+  altcp_default_nagle_enable,
+  altcp_default_nagle_disabled,
+  altcp_default_setprio,
+  altcp_mbedtls_dealloc,
+  altcp_default_get_tcp_addrinfo,
+  altcp_default_get_ip,
+  altcp_default_get_port
+#ifdef LWIP_DEBUG
+  , altcp_default_dbg_get_tcp_state
+#endif
+};
+
+#endif /* LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS */
+#endif /* LWIP_ALTCP */
diff --git a/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c b/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c
new file mode 100644
index 0000000..04d47ae
--- /dev/null
+++ b/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c
@@ -0,0 +1,210 @@
+/**
+ * @file
+ * Application layered TCP connection API (to be used from TCPIP thread)
+ *
+ * This file contains memory management functions for a TLS layer using mbedTLS.
+ *
+ * ATTENTION: For production usage, you might want to override this file with
+ *            your own implementation since this implementation simply uses the
+ *            lwIP heap without caring for fragmentation or leaving heap for
+ *            other parts of lwIP!
+ */
+
+/*
+ * 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>
+ *
+ * Missing things / @todo:
+ * - RX data is acknowledged after receiving (tcp_recved is called when enqueueing
+ *   the pbuf for mbedTLS receive, not when processed by mbedTLS or the inner
+ *   connection; altcp_recved() from inner connection does nothing)
+ * - TX data is marked as 'sent' (i.e. acknowledged; sent callback is called) right
+ *   after enqueueing for transmission, not when actually ACKed be the remote host.
+ */
+
+#include "lwip/opt.h"
+
+#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/apps/altcp_tls_mbedtls_opts.h"
+
+#if LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS
+
+#include "altcp_tls_mbedtls_mem.h"
+#include "altcp_tls_mbedtls_structs.h"
+#include "lwip/mem.h"
+
+#include "mbedtls/platform.h"
+
+#include <string.h>
+
+#ifndef ALTCP_MBEDTLS_MEM_DEBUG
+#define ALTCP_MBEDTLS_MEM_DEBUG   LWIP_DBG_OFF
+#endif
+
+#if defined(MBEDTLS_PLATFORM_MEMORY) && \
+   (!defined(MBEDTLS_PLATFORM_FREE_MACRO) || \
+    defined(MBEDTLS_PLATFORM_CALLOC_MACRO))
+#define ALTCP_MBEDTLS_PLATFORM_ALLOC 1
+#else
+#define ALTCP_MBEDTLS_PLATFORM_ALLOC 0
+#endif
+
+#if ALTCP_MBEDTLS_PLATFORM_ALLOC
+
+#ifndef ALTCP_MBEDTLS_PLATFORM_ALLOC_STATS
+#define ALTCP_MBEDTLS_PLATFORM_ALLOC_STATS 0
+#endif
+
+/* This is an example/debug implementation of alloc/free functions only */
+typedef struct altcp_mbedtls_malloc_helper_s {
+  size_t c;
+  size_t len;
+} altcp_mbedtls_malloc_helper_t;
+
+#if ALTCP_MBEDTLS_PLATFORM_ALLOC_STATS
+typedef struct altcp_mbedtls_malloc_stats_s {
+  size_t allocedBytes;
+  size_t allocCnt;
+  size_t maxBytes;
+  size_t totalBytes;
+} altcp_mbedtls_malloc_stats_t;
+altcp_mbedtls_malloc_stats_t altcp_mbedtls_malloc_stats;
+volatile int altcp_mbedtls_malloc_clear_stats;
+#endif
+
+static void *
+tls_malloc(size_t c, size_t len)
+{
+  altcp_mbedtls_malloc_helper_t *hlpr;
+  void *ret;
+  size_t alloc_size;
+#if ALTCP_MBEDTLS_PLATFORM_ALLOC_STATS
+  if (altcp_mbedtls_malloc_clear_stats) {
+    altcp_mbedtls_malloc_clear_stats = 0;
+    memset(&altcp_mbedtls_malloc_stats, 0, sizeof(altcp_mbedtls_malloc_stats));
+  }
+#endif
+  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",
+                                          (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));
+    return NULL;
+  }
+#if ALTCP_MBEDTLS_PLATFORM_ALLOC_STATS
+  altcp_mbedtls_malloc_stats.allocCnt++;
+  altcp_mbedtls_malloc_stats.allocedBytes += c * len;
+  if (altcp_mbedtls_malloc_stats.allocedBytes > altcp_mbedtls_malloc_stats.maxBytes) {
+    altcp_mbedtls_malloc_stats.maxBytes = altcp_mbedtls_malloc_stats.allocedBytes;
+  }
+  altcp_mbedtls_malloc_stats.totalBytes += c * len;
+#endif
+  hlpr->c = c;
+  hlpr->len = len;
+  ret = hlpr + 1;
+  /* zeroing the allocated chunk is required by mbedTLS! */
+  memset(ret, 0, c * len);
+  return ret;
+}
+
+static void
+tls_free(void *ptr)
+{
+  altcp_mbedtls_malloc_helper_t *hlpr;
+  if (ptr == NULL) {
+    /* this obviously happened in mbedtls... */
+    return;
+  }
+  hlpr = ((altcp_mbedtls_malloc_helper_t *)ptr) - 1;
+#if ALTCP_MBEDTLS_PLATFORM_ALLOC_STATS
+  if (!altcp_mbedtls_malloc_clear_stats) {
+    altcp_mbedtls_malloc_stats.allocedBytes -= hlpr->c * hlpr->len;
+  }
+#endif
+  mem_free(hlpr);
+}
+#endif /* ALTCP_MBEDTLS_PLATFORM_ALLOC*/
+
+void
+altcp_mbedtls_mem_init(void)
+{
+  /* not much to do here when using the heap */
+
+#if ALTCP_MBEDTLS_PLATFORM_ALLOC
+  /* set mbedtls allocation methods */
+  mbedtls_platform_set_calloc_free(&tls_malloc, &tls_free);
+#endif
+}
+
+altcp_mbedtls_state_t *
+altcp_mbedtls_alloc(void *conf)
+{
+  altcp_mbedtls_state_t *ret = (altcp_mbedtls_state_t *)mem_calloc(1, sizeof(altcp_mbedtls_state_t));
+  if (ret != NULL) {
+    ret->conf = conf;
+  }
+  return ret;
+}
+
+void
+altcp_mbedtls_free(void *conf, altcp_mbedtls_state_t *state)
+{
+  LWIP_UNUSED_ARG(conf);
+  LWIP_ASSERT("state != NULL", state != NULL);
+  mem_free(state);
+}
+
+void *
+altcp_mbedtls_alloc_config(size_t size)
+{
+  void *ret;
+  size_t checked_size = (mem_size_t)size;
+  if (size != checked_size) {
+    /* allocation too big (mem_size_t overflow) */
+    return NULL;
+  }
+  ret = (altcp_mbedtls_state_t *)mem_calloc(1, (mem_size_t)size);
+  return ret;
+}
+
+void
+altcp_mbedtls_free_config(void *item)
+{
+  LWIP_ASSERT("item != NULL", item != NULL);
+  mem_free(item);
+}
+
+#endif /* LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS */
+#endif /* LWIP_ALTCP */
diff --git a/src/apps/altcp_tls/altcp_tls_mbedtls_mem.h b/src/apps/altcp_tls/altcp_tls_mbedtls_mem.h
new file mode 100644
index 0000000..b391bf8
--- /dev/null
+++ b/src/apps/altcp_tls/altcp_tls_mbedtls_mem.h
@@ -0,0 +1,72 @@
+/**
+ * @file
+ * Application layered TCP/TLS connection API (to be used from TCPIP thread)
+ *
+ * This file contains memory management function prototypes for a TLS layer using mbedTLS.
+ *
+ * Memory management contains:
+ * - allocating/freeing altcp_mbedtls_state_t
+ * - allocating/freeing memory used in the mbedTLS library
+ */
+
+/*
+ * 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_ALTCP_MBEDTLS_MEM_H
+#define LWIP_HDR_ALTCP_MBEDTLS_MEM_H
+
+#include "lwip/opt.h"
+
+#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/apps/altcp_tls_mbedtls_opts.h"
+
+#if LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS
+
+#include "altcp_tls_mbedtls_structs.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void altcp_mbedtls_mem_init(void);
+altcp_mbedtls_state_t *altcp_mbedtls_alloc(void *conf);
+void altcp_mbedtls_free(void *conf, altcp_mbedtls_state_t *state);
+void *altcp_mbedtls_alloc_config(size_t size);
+void altcp_mbedtls_free_config(void *item);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS */
+#endif /* LWIP_ALTCP */
+#endif /* LWIP_HDR_ALTCP_MBEDTLS_MEM_H */
diff --git a/src/apps/altcp_tls/altcp_tls_mbedtls_structs.h b/src/apps/altcp_tls/altcp_tls_mbedtls_structs.h
new file mode 100644
index 0000000..17efaaf
--- /dev/null
+++ b/src/apps/altcp_tls/altcp_tls_mbedtls_structs.h
@@ -0,0 +1,83 @@
+/**
+ * @file
+ * Application layered TCP/TLS connection API (to be used from TCPIP thread)
+ *
+ * This file contains structure definitions for a TLS layer using mbedTLS.
+ */
+
+/*
+ * 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_ALTCP_MBEDTLS_STRUCTS_H
+#define LWIP_HDR_ALTCP_MBEDTLS_STRUCTS_H
+
+#include "lwip/opt.h"
+
+#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/apps/altcp_tls_mbedtls_opts.h"
+
+#if LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS
+
+#include "lwip/altcp.h"
+#include "lwip/pbuf.h"
+
+#include "mbedtls/ssl.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE    0x01
+#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;
+  mbedtls_ssl_context ssl_context;
+  /* chain of rx pbufs (before decryption) */
+  struct pbuf *rx;
+  struct pbuf *rx_app;
+  u8_t flags;
+  int rx_passed_unrecved;
+  int bio_bytes_read;
+  int bio_bytes_appl;
+} altcp_mbedtls_state_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS */
+#endif /* LWIP_ALTCP */
+#endif /* LWIP_HDR_ALTCP_MBEDTLS_STRUCTS_H */
diff --git a/src/apps/http/altcp_proxyconnect.c b/src/apps/http/altcp_proxyconnect.c
new file mode 100644
index 0000000..9a0b2ba
--- /dev/null
+++ b/src/apps/http/altcp_proxyconnect.c
@@ -0,0 +1,584 @@
+/**
+ * @file
+ * Application layered TCP connection API that executes a proxy-connect.
+ *
+ * This file provides a starting layer that executes a proxy-connect e.g. to
+ * set up TLS connections through a http proxy.
+ */
+
+/*
+ * 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.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#include "lwip/apps/altcp_proxyconnect.h"
+
+#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/altcp.h"
+#include "lwip/priv/altcp_priv.h"
+
+#include "lwip/altcp_tcp.h"
+#include "lwip/altcp_tls.h"
+
+#include "lwip/mem.h"
+#include "lwip/init.h"
+
+#include <stdio.h>
+
+/** This string is passed in the HTTP header as "User-Agent: " */
+#ifndef ALTCP_PROXYCONNECT_CLIENT_AGENT
+#define ALTCP_PROXYCONNECT_CLIENT_AGENT "lwIP/" LWIP_VERSION_STRING " (http://savannah.nongnu.org/projects/lwip)"
+#endif
+
+#define ALTCP_PROXYCONNECT_FLAGS_CONNECT_STARTED  0x01
+#define ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE   0x02
+
+typedef struct altcp_proxyconnect_state_s
+{
+  ip_addr_t outer_addr;
+  u16_t outer_port;
+  struct altcp_proxyconnect_config *conf;
+  u8_t flags;
+} altcp_proxyconnect_state_t;
+
+/* Variable prototype, the actual declaration is at the end of this file
+   since it contains pointers to static functions declared here */
+extern const struct altcp_functions altcp_proxyconnect_functions;
+
+/* memory management functions: */
+
+static altcp_proxyconnect_state_t *
+altcp_proxyconnect_state_alloc(void)
+{
+  altcp_proxyconnect_state_t *ret = (altcp_proxyconnect_state_t *)mem_calloc(1, sizeof(altcp_proxyconnect_state_t));
+  return ret;
+}
+
+static void
+altcp_proxyconnect_state_free(altcp_proxyconnect_state_t *state)
+{
+  LWIP_ASSERT("state != NULL", state != NULL);
+  mem_free(state);
+}
+
+/* helper functions */
+
+#define PROXY_CONNECT "CONNECT %s:%d HTTP/1.1\r\n" /* HOST, PORT */ \
+  "User-Agent: %s\r\n" /* User-Agent */\
+  "Proxy-Connection: keep-alive\r\n" \
+  "Connection: keep-alive\r\n" \
+  "\r\n"
+#define PROXY_CONNECT_FORMAT(host, port) PROXY_CONNECT, host, port, ALTCP_PROXYCONNECT_CLIENT_AGENT
+
+/* Format the http proxy connect request via snprintf */
+static int
+altcp_proxyconnect_format_request(char *buffer, size_t bufsize, const char *host, int port)
+{
+  return snprintf(buffer, bufsize, PROXY_CONNECT_FORMAT(host, port));
+}
+
+/* Create and send the http proxy connect request */
+static err_t
+altcp_proxyconnect_send_request(struct altcp_pcb *conn)
+{
+  int len, len2;
+  mem_size_t alloc_len;
+  char *buffer, *host;
+  altcp_proxyconnect_state_t *state = (altcp_proxyconnect_state_t *)conn->state;
+
+  if (!state) {
+    return ERR_VAL;
+  }
+  /* Use printf with zero length to get the required allocation size */
+  len = altcp_proxyconnect_format_request(NULL, 0, "", state->outer_port);
+  if (len < 0) {
+    return ERR_VAL;
+  }
+  /* add allocation size for IP address strings */
+#if LWIP_IPV6
+  len += 40; /* worst-case IPv6 address length */
+#else
+  len += 16; /* worst-case IPv4 address length */
+#endif
+  alloc_len = (mem_size_t)len;
+  if ((len < 0) || (int)alloc_len != len) {
+    /* overflow */
+    return ERR_MEM;
+  }
+  /* Allocate a bufer for the request string */
+  buffer = (char *)mem_malloc(alloc_len);
+  if (buffer == NULL) {
+    return ERR_MEM;
+  }
+  host = ipaddr_ntoa(&state->outer_addr);
+  len2 = altcp_proxyconnect_format_request(buffer, alloc_len, host, state->outer_port);
+  if ((len2 > 0) && (len2 <= len) && (len2 <= 0xFFFF)) {
+    err_t err = altcp_write(conn->inner_conn, buffer, (u16_t)len2, TCP_WRITE_FLAG_COPY);
+    if (err != ERR_OK) {
+      /* @todo: abort? */
+      mem_free(buffer);
+      return err;
+    }
+  }
+  mem_free(buffer);
+  return ERR_OK;
+}
+
+/* callback functions from inner/lower connection: */
+
+/** Connected callback from lower connection (i.e. TCP).
+ * Not really implemented/tested yet...
+ */
+static err_t
+altcp_proxyconnect_lower_connected(void *arg, struct altcp_pcb *inner_conn, err_t err)
+{
+  struct altcp_pcb *conn = (struct altcp_pcb *)arg;
+  if (conn && conn->state) {
+    LWIP_ASSERT("pcb mismatch", conn->inner_conn == inner_conn);
+    LWIP_UNUSED_ARG(inner_conn); /* for LWIP_NOASSERT */
+    /* upper connected is called when handshake is done */
+    if (err != ERR_OK) {
+      if (conn->connected) {
+        if (conn->connected(conn->arg, conn, err) == ERR_ABRT) {
+          return ERR_ABRT;
+        }
+        return ERR_OK;
+      }
+    }
+    /* send proxy connect request here */
+    return altcp_proxyconnect_send_request(conn);
+  }
+  return ERR_VAL;
+}
+
+/** Recv callback from lower connection (i.e. TCP)
+ * This one mainly differs between connection setup (wait for proxy OK string)
+ * and application phase (data is passed on to the application).
+ */
+static err_t
+altcp_proxyconnect_lower_recv(void *arg, struct altcp_pcb *inner_conn, struct pbuf *p, err_t err)
+{
+  altcp_proxyconnect_state_t *state;
+  struct altcp_pcb *conn = (struct altcp_pcb *)arg;
+
+  LWIP_ASSERT("no err expected", err == ERR_OK);
+  LWIP_UNUSED_ARG(err);
+
+  if (!conn) {
+    /* no connection given as arg? should not happen, but prevent pbuf/conn leaks */
+    if (p != NULL) {
+      pbuf_free(p);
+    }
+    altcp_close(inner_conn);
+    return ERR_CLSD;
+  }
+  state = (altcp_proxyconnect_state_t *)conn->state;
+  LWIP_ASSERT("pcb mismatch", conn->inner_conn == inner_conn);
+  if (!state) {
+    /* already closed */
+    if (p != NULL) {
+      pbuf_free(p);
+    }
+    altcp_close(inner_conn);
+    return ERR_CLSD;
+  }
+  if (state->flags & ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE) {
+    /* application phase, just pass this through */
+    if (conn->recv) {
+      return conn->recv(conn->arg, conn, p, err);
+    }
+    pbuf_free(p);
+    return ERR_OK;
+  } else {
+    /* setup phase */
+    /* handle NULL pbuf (inner connection closed) */
+    if (p == NULL) {
+      if (altcp_close(conn) != ERR_OK) {
+        altcp_abort(conn);
+        return ERR_ABRT;
+      }
+      return ERR_OK;
+    } else {
+      /* @todo: parse setup phase rx data
+         for now, we just wait for the end of the header... */
+      u16_t idx = pbuf_memfind(p, "\r\n\r\n", 4, 0);
+      altcp_recved(inner_conn, p->tot_len);
+      pbuf_free(p);
+      if (idx != 0xFFFF) {
+        state->flags |= ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE;
+        if (conn->connected) {
+          return conn->connected(conn->arg, conn, ERR_OK);
+        }
+      }
+      return ERR_OK;
+    }
+  }
+}
+
+/** 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.
+ */
+static err_t
+altcp_proxyconnect_lower_sent(void *arg, struct altcp_pcb *inner_conn, u16_t len)
+{
+  struct altcp_pcb *conn = (struct altcp_pcb *)arg;
+  LWIP_UNUSED_ARG(len);
+  if (conn) {
+    altcp_proxyconnect_state_t *state = (altcp_proxyconnect_state_t *)conn->state;
+    LWIP_ASSERT("pcb mismatch", conn->inner_conn == inner_conn);
+    LWIP_UNUSED_ARG(inner_conn); /* for LWIP_NOASSERT */
+    if (!state || !(state->flags & ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE)) {
+      /* @todo: do something here? */
+      return ERR_OK;
+    }
+    /* pass this on to upper sent */
+    if (conn->sent) {
+      return conn->sent(conn->arg, conn, len);
+    }
+  }
+  return ERR_OK;
+}
+
+/** Poll callback from lower connection (i.e. TCP)
+ * Just pass this on to the application.
+ * @todo: retry sending?
+ */
+static err_t
+altcp_proxyconnect_lower_poll(void *arg, struct altcp_pcb *inner_conn)
+{
+  struct altcp_pcb *conn = (struct altcp_pcb *)arg;
+  if (conn) {
+    LWIP_ASSERT("pcb mismatch", conn->inner_conn == inner_conn);
+    LWIP_UNUSED_ARG(inner_conn); /* for LWIP_NOASSERT */
+    if (conn->poll) {
+      return conn->poll(conn->arg, conn);
+    }
+  }
+  return ERR_OK;
+}
+
+static void
+altcp_proxyconnect_lower_err(void *arg, err_t err)
+{
+  struct altcp_pcb *conn = (struct altcp_pcb *)arg;
+  if (conn) {
+    conn->inner_conn = NULL; /* already freed */
+    if (conn->err) {
+      conn->err(conn->arg, err);
+    }
+    altcp_free(conn);
+  }
+}
+
+
+/* setup functions */
+
+static void
+altcp_proxyconnect_setup_callbacks(struct altcp_pcb *conn, struct altcp_pcb *inner_conn)
+{
+  altcp_arg(inner_conn, conn);
+  altcp_recv(inner_conn, altcp_proxyconnect_lower_recv);
+  altcp_sent(inner_conn, altcp_proxyconnect_lower_sent);
+  altcp_err(inner_conn, altcp_proxyconnect_lower_err);
+  /* tcp_poll is set when interval is set by application */
+  /* listen is set totally different :-) */
+}
+
+static err_t
+altcp_proxyconnect_setup(struct altcp_proxyconnect_config *config, struct altcp_pcb *conn, struct altcp_pcb *inner_conn)
+{
+  altcp_proxyconnect_state_t *state;
+  if (!config) {
+    return ERR_ARG;
+  }
+  LWIP_ASSERT("invalid inner_conn", conn != inner_conn);
+
+  /* allocate proxyconnect context */
+  state = altcp_proxyconnect_state_alloc();
+  if (state == NULL) {
+    return ERR_MEM;
+  }
+  state->flags = 0;
+  state->conf = config;
+  altcp_proxyconnect_setup_callbacks(conn, inner_conn);
+  conn->inner_conn = inner_conn;
+  conn->fns = &altcp_proxyconnect_functions;
+  conn->state = state;
+  return ERR_OK;
+}
+
+/** Allocate a new altcp layer connecting through a proxy.
+ * This function gets the inner pcb passed.
+ *
+ * @param config struct altcp_proxyconnect_config that contains the proxy settings
+ * @param inner_pcb pcb that makes the connection to the proxy (i.e. tcp pcb)
+ */
+struct altcp_pcb *
+altcp_proxyconnect_new(struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb)
+{
+  struct altcp_pcb *ret;
+  if (inner_pcb == NULL) {
+    return NULL;
+  }
+  ret = altcp_alloc();
+  if (ret != NULL) {
+    if (altcp_proxyconnect_setup(config, ret, inner_pcb) != ERR_OK) {
+      altcp_free(ret);
+      return NULL;
+    }
+  }
+  return ret;
+}
+
+/** Allocate a new altcp layer connecting through a proxy.
+ * This function allocates the inner pcb as tcp pcb, resulting in a direct tcp
+ * connection to the proxy.
+ *
+ * @param config struct altcp_proxyconnect_config that contains the proxy settings
+ * @param ip_type IP type of the connection (@ref lwip_ip_addr_type)
+ */
+struct altcp_pcb *
+altcp_proxyconnect_new_tcp(struct altcp_proxyconnect_config *config, u8_t ip_type)
+{
+  struct altcp_pcb *inner_pcb, *ret;
+
+  /* inner pcb is tcp */
+  inner_pcb = altcp_tcp_new_ip_type(ip_type);
+  if (inner_pcb == NULL) {
+    return NULL;
+  }
+  ret = altcp_proxyconnect_new(config, inner_pcb);
+  if (ret == NULL) {
+    altcp_close(inner_pcb);
+  }
+  return ret;
+}
+
+/** Allocator function to allocate a proxy connect altcp pcb connecting directly
+ * via tcp to the proxy.
+ *
+ * The returned pcb is a chain: altcp_proxyconnect - altcp_tcp - tcp pcb
+ *
+ * This function is meant for use with @ref altcp_new.
+ *
+ * @param arg struct altcp_proxyconnect_config that contains the proxy settings
+ * @param ip_type IP type of the connection (@ref lwip_ip_addr_type)
+ */
+struct altcp_pcb *
+altcp_proxyconnect_alloc(void *arg, u8_t ip_type)
+{
+  return altcp_proxyconnect_new_tcp((struct altcp_proxyconnect_config *)arg, ip_type);
+}
+
+
+#if LWIP_ALTCP_TLS
+
+/** Allocator function to allocate a TLS connection through a proxy.
+ *
+ * The returned pcb is a chain: altcp_tls - altcp_proxyconnect - altcp_tcp - tcp pcb
+ *
+ * This function is meant for use with @ref altcp_new.
+ *
+ * @param arg struct altcp_proxyconnect_tls_config that contains the proxy settings
+ *        and tls settings
+ * @param ip_type IP type of the connection (@ref lwip_ip_addr_type)
+ */
+struct altcp_pcb *
+altcp_proxyconnect_tls_alloc(void *arg, u8_t ip_type)
+{
+  struct altcp_proxyconnect_tls_config *cfg = (struct altcp_proxyconnect_tls_config *)arg;
+  struct altcp_pcb *proxy_pcb;
+  struct altcp_pcb *tls_pcb;
+
+  proxy_pcb = altcp_proxyconnect_new_tcp(&cfg->proxy, ip_type);
+  tls_pcb = altcp_tls_wrap(cfg->tls_config, proxy_pcb);
+
+  if (tls_pcb == NULL) {
+    altcp_close(proxy_pcb);
+  }
+  return tls_pcb;
+}
+#endif /* LWIP_ALTCP_TLS */
+
+/* "virtual" functions */
+static void
+altcp_proxyconnect_set_poll(struct altcp_pcb *conn, u8_t interval)
+{
+  if (conn != NULL) {
+    altcp_poll(conn->inner_conn, altcp_proxyconnect_lower_poll, interval);
+  }
+}
+
+static void
+altcp_proxyconnect_recved(struct altcp_pcb *conn, u16_t len)
+{
+  altcp_proxyconnect_state_t *state;
+  if (conn == NULL) {
+    return;
+  }
+  state = (altcp_proxyconnect_state_t *)conn->state;
+  if (state == NULL) {
+    return;
+  }
+  if (!(state->flags & ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE)) {
+    return;
+  }
+  altcp_recved(conn->inner_conn, len);
+}
+
+static err_t
+altcp_proxyconnect_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected)
+{
+  altcp_proxyconnect_state_t *state;
+
+  if ((conn == NULL) || (ipaddr == NULL)) {
+    return ERR_VAL;
+  }
+  state = (altcp_proxyconnect_state_t *)conn->state;
+  if (state == NULL) {
+    return ERR_VAL;
+  }
+  if (state->flags & ALTCP_PROXYCONNECT_FLAGS_CONNECT_STARTED) {
+    return ERR_VAL;
+  }
+  state->flags |= ALTCP_PROXYCONNECT_FLAGS_CONNECT_STARTED;
+
+  conn->connected = connected;
+  /* connect to our proxy instead, but store the requested address and port */
+  ip_addr_copy(state->outer_addr, *ipaddr);
+  state->outer_port = port;
+
+  return altcp_connect(conn->inner_conn, &state->conf->proxy_addr, state->conf->proxy_port, altcp_proxyconnect_lower_connected);
+}
+
+static struct altcp_pcb *
+altcp_proxyconnect_listen(struct altcp_pcb *conn, u8_t backlog, err_t *err)
+{
+  LWIP_UNUSED_ARG(conn);
+  LWIP_UNUSED_ARG(backlog);
+  LWIP_UNUSED_ARG(err);
+  /* listen not supported! */
+  return NULL;
+}
+
+static void
+altcp_proxyconnect_abort(struct altcp_pcb *conn)
+{
+  if (conn != NULL) {
+    if (conn->inner_conn != NULL) {
+      altcp_abort(conn->inner_conn);
+    }
+    altcp_free(conn);
+  }
+}
+
+static err_t
+altcp_proxyconnect_close(struct altcp_pcb *conn)
+{
+  if (conn == NULL) {
+    return ERR_VAL;
+  }
+  if (conn->inner_conn != NULL) {
+    err_t err = altcp_close(conn->inner_conn);
+    if (err != ERR_OK) {
+      /* closing inner conn failed, return the error */
+      return err;
+    }
+  }
+  /* no inner conn or closing it succeeded, deallocate myself */
+  altcp_free(conn);
+  return ERR_OK;
+}
+
+static err_t
+altcp_proxyconnect_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags)
+{
+  altcp_proxyconnect_state_t *state;
+
+  LWIP_UNUSED_ARG(apiflags);
+
+  if (conn == NULL) {
+    return ERR_VAL;
+  }
+
+  state = (altcp_proxyconnect_state_t *)conn->state;
+  if (state == NULL) {
+    /* @todo: which error? */
+    return ERR_CLSD;
+  }
+  if (!(state->flags & ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE)) {
+    /* @todo: which error? */
+    return ERR_VAL;
+  }
+  return altcp_write(conn->inner_conn, dataptr, len, apiflags);
+}
+
+static void
+altcp_proxyconnect_dealloc(struct altcp_pcb *conn)
+{
+  /* clean up and free tls state */
+  if (conn) {
+    altcp_proxyconnect_state_t *state = (altcp_proxyconnect_state_t *)conn->state;
+    if (state) {
+      altcp_proxyconnect_state_free(state);
+      conn->state = NULL;
+    }
+  }
+}
+const struct altcp_functions altcp_proxyconnect_functions = {
+  altcp_proxyconnect_set_poll,
+  altcp_proxyconnect_recved,
+  altcp_default_bind,
+  altcp_proxyconnect_connect,
+  altcp_proxyconnect_listen,
+  altcp_proxyconnect_abort,
+  altcp_proxyconnect_close,
+  altcp_default_shutdown,
+  altcp_proxyconnect_write,
+  altcp_default_output,
+  altcp_default_mss,
+  altcp_default_sndbuf,
+  altcp_default_sndqueuelen,
+  altcp_default_nagle_disable,
+  altcp_default_nagle_enable,
+  altcp_default_nagle_disabled,
+  altcp_default_setprio,
+  altcp_proxyconnect_dealloc,
+  altcp_default_get_tcp_addrinfo,
+  altcp_default_get_ip,
+  altcp_default_get_port
+#ifdef LWIP_DEBUG
+  , altcp_default_dbg_get_tcp_state
+#endif
+};
+
+#endif /* LWIP_ALTCP */
diff --git a/src/apps/http/fs.c b/src/apps/http/fs.c
new file mode 100644
index 0000000..f15a480
--- /dev/null
+++ b/src/apps/http/fs.c
@@ -0,0 +1,174 @@
+/*
+ * 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/apps/httpd_opts.h"
+#include "lwip/def.h"
+#include "lwip/apps/fs.h"
+#include <string.h>
+
+
+#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)
+{
+  const struct fsdata_file *f;
+
+  if ((file == NULL) || (name == NULL)) {
+    return ERR_ARG;
+  }
+
+#if LWIP_HTTPD_CUSTOM_FILES
+  if (fs_open_custom(file, name)) {
+    file->is_custom_file = 1;
+    return ERR_OK;
+  }
+  file->is_custom_file = 0;
+#endif /* LWIP_HTTPD_CUSTOM_FILES */
+
+  for (f = FS_ROOT; f != NULL; f = f->next) {
+    if (!strcmp(name, (const char *)f->name)) {
+      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_STATE
+      file->state = fs_state_init(file, name);
+#endif /* #if LWIP_HTTPD_FILE_STATE */
+      return ERR_OK;
+    }
+  }
+  /* file not found */
+  return ERR_VAL;
+}
+
+/*-----------------------------------------------------------------------------------*/
+void
+fs_close(struct fs_file *file)
+{
+#if LWIP_HTTPD_CUSTOM_FILES
+  if (file->is_custom_file) {
+    fs_close_custom(file);
+  }
+#endif /* LWIP_HTTPD_CUSTOM_FILES */
+#if LWIP_HTTPD_FILE_STATE
+  fs_state_free(file, file->state);
+#endif /* #if LWIP_HTTPD_FILE_STATE */
+  LWIP_UNUSED_ARG(file);
+}
+/*-----------------------------------------------------------------------------------*/
+#if LWIP_HTTPD_DYNAMIC_FILE_READ
+#if LWIP_HTTPD_FS_ASYNC_READ
+int
+fs_read_async(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(struct fs_file *file, char *buffer, int count)
+#endif /* LWIP_HTTPD_FS_ASYNC_READ */
+{
+  int read;
+  if (file->index == file->len) {
+    return FS_READ_EOF;
+  }
+#if LWIP_HTTPD_FS_ASYNC_READ
+  LWIP_UNUSED_ARG(callback_fn);
+  LWIP_UNUSED_ARG(callback_arg);
+#endif /* LWIP_HTTPD_FS_ASYNC_READ */
+#if LWIP_HTTPD_CUSTOM_FILES
+  if (file->is_custom_file) {
+#if LWIP_HTTPD_FS_ASYNC_READ
+    return fs_read_async_custom(file, buffer, count, callback_fn, callback_arg);
+#else /* LWIP_HTTPD_FS_ASYNC_READ */
+    return fs_read_custom(file, buffer, count);
+#endif /* LWIP_HTTPD_FS_ASYNC_READ */
+  }
+#endif /* LWIP_HTTPD_CUSTOM_FILES */
+
+  read = file->len - file->index;
+  if (read > count) {
+    read = count;
+  }
+
+  MEMCPY(buffer, (file->data + file->index), read);
+  file->index += read;
+
+  return (read);
+}
+#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */
+/*-----------------------------------------------------------------------------------*/
+#if LWIP_HTTPD_FS_ASYNC_READ
+int
+fs_is_file_ready(struct fs_file *file, fs_wait_cb callback_fn, void *callback_arg)
+{
+  if (file != NULL) {
+#if LWIP_HTTPD_FS_ASYNC_READ
+#if LWIP_HTTPD_CUSTOM_FILES
+    if (!fs_canread_custom(file)) {
+      if (fs_wait_read_custom(file, callback_fn, callback_arg)) {
+        return 0;
+      }
+    }
+#else /* LWIP_HTTPD_CUSTOM_FILES */
+    LWIP_UNUSED_ARG(callback_fn);
+    LWIP_UNUSED_ARG(callback_arg);
+#endif /* LWIP_HTTPD_CUSTOM_FILES */
+#endif /* LWIP_HTTPD_FS_ASYNC_READ */
+  }
+  return 1;
+}
+#endif /* LWIP_HTTPD_FS_ASYNC_READ */
+/*-----------------------------------------------------------------------------------*/
+int
+fs_bytes_left(struct fs_file *file)
+{
+  return file->len - file->index;
+}
diff --git a/src/apps/httpd/fs/404.html b/src/apps/http/fs/404.html
similarity index 100%
rename from src/apps/httpd/fs/404.html
rename to src/apps/http/fs/404.html
diff --git a/src/apps/httpd/fs/img/sics.gif b/src/apps/http/fs/img/sics.gif
similarity index 100%
rename from src/apps/httpd/fs/img/sics.gif
rename to src/apps/http/fs/img/sics.gif
Binary files differ
diff --git a/src/apps/httpd/fs/index.html b/src/apps/http/fs/index.html
similarity index 100%
rename from src/apps/httpd/fs/index.html
rename to src/apps/http/fs/index.html
diff --git a/src/apps/http/fsdata.c b/src/apps/http/fsdata.c
new file mode 100644
index 0000000..ab9da7e
--- /dev/null
+++ b/src/apps/http/fsdata.c
@@ -0,0 +1,337 @@
+#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.0 200 OK
+" (17 bytes) */
+0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,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,
+/* "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.0 404 File not found
+" (29 bytes) */
+0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,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,
+/* "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.0 200 OK
+" (17 bytes) */
+0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,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,
+/* "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,};
+
+
+
+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,
+}};
+
+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,
+}};
+
+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,
+}};
+
+#define FS_ROOT file__index_html
+#define FS_NUMFILES 3
+
diff --git a/src/apps/http/fsdata.h b/src/apps/http/fsdata.h
new file mode 100644
index 0000000..d31550d
--- /dev/null
+++ b/src/apps/http/fsdata.h
@@ -0,0 +1,41 @@
+/*
+ * 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_FSDATA_H
+#define LWIP_FSDATA_H
+
+#include "lwip/apps/httpd_opts.h"
+#include "lwip/apps/fs.h"
+
+/* THIS FILE IS DEPRECATED AND WILL BE REMOVED IN THE FUTURE */
+/* content was moved to fs.h to simplify #include structure */
+
+#endif /* LWIP_FSDATA_H */
diff --git a/src/apps/http/http_client.c b/src/apps/http/http_client.c
new file mode 100644
index 0000000..82da60d
--- /dev/null
+++ b/src/apps/http/http_client.c
@@ -0,0 +1,909 @@
+/**
+ * @file
+ * HTTP client
+ */
+
+/*
+ * Copyright (c) 2018 Simon Goldschmidt <goldsimon@gmx.de>
+ * 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>
+ */
+
+/**
+ * @defgroup httpc HTTP client
+ * @ingroup apps
+ * @todo:
+ * - persistent connections
+ * - select outgoing http version
+ * - optionally follow redirect
+ * - check request uri for invalid characters? (e.g. encode spaces)
+ * - IPv6 support
+ */
+
+#include "lwip/apps/http_client.h"
+
+#include "lwip/altcp_tcp.h"
+#include "lwip/dns.h"
+#include "lwip/debug.h"
+#include "lwip/mem.h"
+#include "lwip/altcp_tls.h"
+#include "lwip/init.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if LWIP_TCP && LWIP_CALLBACK_API
+
+/**
+ * HTTPC_DEBUG: Enable debugging for HTTP client.
+ */
+#ifndef HTTPC_DEBUG
+#define HTTPC_DEBUG                 LWIP_DBG_OFF
+#endif
+
+/** Set this to 1 to keep server name and uri in request state */
+#ifndef HTTPC_DEBUG_REQUEST
+#define HTTPC_DEBUG_REQUEST         0
+#endif
+
+/** This string is passed in the HTTP header as "User-Agent: " */
+#ifndef HTTPC_CLIENT_AGENT
+#define HTTPC_CLIENT_AGENT "lwIP/" LWIP_VERSION_STRING " (http://savannah.nongnu.org/projects/lwip)"
+#endif
+
+/* the various debug levels for this file */
+#define HTTPC_DEBUG_TRACE        (HTTPC_DEBUG | LWIP_DBG_TRACE)
+#define HTTPC_DEBUG_STATE        (HTTPC_DEBUG | LWIP_DBG_STATE)
+#define HTTPC_DEBUG_WARN         (HTTPC_DEBUG | LWIP_DBG_LEVEL_WARNING)
+#define HTTPC_DEBUG_WARN_STATE   (HTTPC_DEBUG | LWIP_DBG_LEVEL_WARNING | LWIP_DBG_STATE)
+#define HTTPC_DEBUG_SERIOUS      (HTTPC_DEBUG | LWIP_DBG_LEVEL_SERIOUS)
+
+#define HTTPC_POLL_INTERVAL     1
+#define HTTPC_POLL_TIMEOUT      30 /* 15 seconds */
+
+#define HTTPC_CONTENT_LEN_INVALID 0xFFFFFFFF
+
+/* GET request basic */
+#define HTTPC_REQ_11 "GET %s HTTP/1.1\r\n" /* URI */\
+    "User-Agent: %s\r\n" /* User-Agent */ \
+    "Accept: */*\r\n" \
+    "Connection: Close\r\n" /* we don't support persistent connections, yet */ \
+    "\r\n"
+#define HTTPC_REQ_11_FORMAT(uri) HTTPC_REQ_11, uri, HTTPC_CLIENT_AGENT
+
+/* GET request with host */
+#define HTTPC_REQ_11_HOST "GET %s HTTP/1.1\r\n" /* URI */\
+    "User-Agent: %s\r\n" /* User-Agent */ \
+    "Accept: */*\r\n" \
+    "Host: %s\r\n" /* server name */ \
+    "Connection: Close\r\n" /* we don't support persistent connections, yet */ \
+    "\r\n"
+#define HTTPC_REQ_11_HOST_FORMAT(uri, srv_name) HTTPC_REQ_11_HOST, uri, HTTPC_CLIENT_AGENT, srv_name
+
+/* GET request with proxy */
+#define HTTPC_REQ_11_PROXY "GET http://%s%s HTTP/1.1\r\n" /* HOST, URI */\
+    "User-Agent: %s\r\n" /* User-Agent */ \
+    "Accept: */*\r\n" \
+    "Host: %s\r\n" /* server name */ \
+    "Connection: Close\r\n" /* we don't support persistent connections, yet */ \
+    "\r\n"
+#define HTTPC_REQ_11_PROXY_FORMAT(host, uri, srv_name) HTTPC_REQ_11_PROXY, host, uri, HTTPC_CLIENT_AGENT, srv_name
+
+/* GET request with proxy (non-default server port) */
+#define HTTPC_REQ_11_PROXY_PORT "GET http://%s:%d%s HTTP/1.1\r\n" /* HOST, host-port, URI */\
+    "User-Agent: %s\r\n" /* User-Agent */ \
+    "Accept: */*\r\n" \
+    "Host: %s\r\n" /* server name */ \
+    "Connection: Close\r\n" /* we don't support persistent connections, yet */ \
+    "\r\n"
+#define HTTPC_REQ_11_PROXY_PORT_FORMAT(host, host_port, uri, srv_name) HTTPC_REQ_11_PROXY_PORT, host, host_port, uri, HTTPC_CLIENT_AGENT, srv_name
+
+typedef enum ehttpc_parse_state {
+  HTTPC_PARSE_WAIT_FIRST_LINE = 0,
+  HTTPC_PARSE_WAIT_HEADERS,
+  HTTPC_PARSE_RX_DATA
+} httpc_parse_state_t;
+
+typedef struct _httpc_state
+{
+  struct altcp_pcb* pcb;
+  ip_addr_t remote_addr;
+  u16_t remote_port;
+  int timeout_ticks;
+  struct pbuf *request;
+  struct pbuf *rx_hdrs;
+  u16_t rx_http_version;
+  u16_t rx_status;
+  altcp_recv_fn recv_fn;
+  const httpc_connection_t *conn_settings;
+  void* callback_arg;
+  u32_t rx_content_len;
+  u32_t hdr_content_len;
+  httpc_parse_state_t parse_state;
+#if HTTPC_DEBUG_REQUEST
+  char* server_name;
+  char* uri;
+#endif
+} httpc_state_t;
+
+/** Free http client state and deallocate all resources within */
+static err_t
+httpc_free_state(httpc_state_t* req)
+{
+  struct altcp_pcb* tpcb;
+
+  if (req->request != NULL) {
+    pbuf_free(req->request);
+    req->request = NULL;
+  }
+  if (req->rx_hdrs != NULL) {
+    pbuf_free(req->rx_hdrs);
+    req->rx_hdrs = NULL;
+  }
+
+  tpcb = req->pcb;
+  mem_free(req);
+  req = NULL;
+
+  if (tpcb != NULL) {
+    err_t r;
+    altcp_arg(tpcb, NULL);
+    altcp_recv(tpcb, NULL);
+    altcp_err(tpcb, NULL);
+    altcp_poll(tpcb, NULL, 0);
+    altcp_sent(tpcb, NULL);
+    r = altcp_close(tpcb);
+    if (r != ERR_OK) {
+      altcp_abort(tpcb);
+      return ERR_ABRT;
+    }
+  }
+  return ERR_OK;
+}
+
+/** Close the connection: call finished callback and free the state */
+static err_t
+httpc_close(httpc_state_t* req, httpc_result_t result, u32_t server_response, err_t err)
+{
+  if (req != NULL) {
+    if (req->conn_settings != NULL) {
+      if (req->conn_settings->result_fn != NULL) {
+        req->conn_settings->result_fn(req->callback_arg, result, req->rx_content_len, server_response, err);
+      }
+    }
+    return httpc_free_state(req);
+  }
+  return ERR_OK;
+}
+
+/** Parse http header response line 1 */
+static err_t
+http_parse_response_status(struct pbuf *p, u16_t *http_version, u16_t *http_status, u16_t *http_status_str_offset)
+{
+  u16_t end1 = pbuf_memfind(p, "\r\n", 2, 0);
+  if (end1 != 0xFFFF) {
+    /* get parts of first line */
+    u16_t space1, space2;
+    space1 = pbuf_memfind(p, " ", 1, 0);
+    if (space1 != 0xFFFF) {
+      if ((pbuf_memcmp(p, 0, "HTTP/", 5) == 0)  && (pbuf_get_at(p, 6) == '.')) {
+        char status_num[10];
+        size_t status_num_len;
+        /* parse http version */
+        u16_t version = pbuf_get_at(p, 5) - '0';
+        version <<= 8;
+        version |= pbuf_get_at(p, 7) - '0';
+        *http_version = version;
+
+        /* parse http status number */
+        space2 = pbuf_memfind(p, " ", 1, space1 + 1);
+        if (space2 != 0xFFFF) {
+          *http_status_str_offset = space2 + 1;
+          status_num_len = space2 - space1 - 1;
+        } else {
+          status_num_len = end1 - space1 - 1;
+        }
+        memset(status_num, 0, sizeof(status_num));
+        if (pbuf_copy_partial(p, status_num, (u16_t)status_num_len, space1 + 1) == status_num_len) {
+          int status = atoi(status_num);
+          if ((status > 0) && (status <= 0xFFFF)) {
+            *http_status = (u16_t)status;
+            return ERR_OK;
+          }
+        }
+      }
+    }
+  }
+  return ERR_VAL;
+}
+
+/** Wait for all headers to be received, return its length and content-length (if available) */
+static err_t
+http_wait_headers(struct pbuf *p, u32_t *content_length, u16_t *total_header_len)
+{
+  u16_t end1 = pbuf_memfind(p, "\r\n\r\n", 4, 0);
+  if (end1 < (0xFFFF - 2)) {
+    /* all headers received */
+    /* check if we have a content length (@todo: case insensitive?) */
+    u16_t content_len_hdr;
+    *content_length = HTTPC_CONTENT_LEN_INVALID;
+    *total_header_len = end1 + 4;
+
+    content_len_hdr = pbuf_memfind(p, "Content-Length: ", 16, 0);
+    if (content_len_hdr != 0xFFFF) {
+      u16_t content_len_line_end = pbuf_memfind(p, "\r\n", 2, content_len_hdr);
+      if (content_len_line_end != 0xFFFF) {
+        char content_len_num[16];
+        u16_t content_len_num_len = (u16_t)(content_len_line_end - content_len_hdr - 16);
+        memset(content_len_num, 0, sizeof(content_len_num));
+        if (pbuf_copy_partial(p, content_len_num, content_len_num_len, content_len_hdr + 16) == content_len_num_len) {
+          int len = atoi(content_len_num);
+          if ((len >= 0) && ((u32_t)len < HTTPC_CONTENT_LEN_INVALID)) {
+            *content_length = (u32_t)len;
+          }
+        }
+      }
+    }
+    return ERR_OK;
+  }
+  return ERR_VAL;
+}
+
+/** http client tcp recv callback */
+static err_t
+httpc_tcp_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t r)
+{
+  httpc_state_t* req = (httpc_state_t*)arg;
+  LWIP_UNUSED_ARG(r);
+
+  if (p == NULL) {
+    httpc_result_t result;
+    if (req->parse_state != HTTPC_PARSE_RX_DATA) {
+      /* did not get RX data yet */
+      result = HTTPC_RESULT_ERR_CLOSED;
+    } else if ((req->hdr_content_len != HTTPC_CONTENT_LEN_INVALID) &&
+      (req->hdr_content_len != req->rx_content_len)) {
+      /* header has been received with content length but not all data received */
+      result = HTTPC_RESULT_ERR_CONTENT_LEN;
+    } else {
+      /* receiving data and either all data received or no content length header */
+      result = HTTPC_RESULT_OK;
+    }
+    return httpc_close(req, result, req->rx_status, ERR_OK);
+  }
+  if (req->parse_state != HTTPC_PARSE_RX_DATA) {
+    if (req->rx_hdrs == NULL) {
+      req->rx_hdrs = p;
+    } else {
+      pbuf_cat(req->rx_hdrs, p);
+    }
+    if (req->parse_state == HTTPC_PARSE_WAIT_FIRST_LINE) {
+      u16_t status_str_off;
+      err_t err = http_parse_response_status(req->rx_hdrs, &req->rx_http_version, &req->rx_status, &status_str_off);
+      if (err == ERR_OK) {
+        /* don't care status string */
+        req->parse_state = HTTPC_PARSE_WAIT_HEADERS;
+      }
+    }
+    if (req->parse_state == HTTPC_PARSE_WAIT_HEADERS) {
+      u16_t total_header_len;
+      err_t err = http_wait_headers(req->rx_hdrs, &req->hdr_content_len, &total_header_len);
+      if (err == ERR_OK) {
+        struct pbuf *q;
+        /* full header received, send window update for header bytes and call into client callback */
+        altcp_recved(pcb, total_header_len);
+        if (req->conn_settings) {
+          if (req->conn_settings->headers_done_fn) {
+            err = req->conn_settings->headers_done_fn(req, req->callback_arg, req->rx_hdrs, total_header_len, req->hdr_content_len);
+            if (err != ERR_OK) {
+              return httpc_close(req, HTTPC_RESULT_LOCAL_ABORT, req->rx_status, err);
+            }
+          }
+        }
+        /* hide header bytes in pbuf */
+        q = pbuf_free_header(req->rx_hdrs, total_header_len);
+        p = q;
+        req->rx_hdrs = NULL;
+        /* go on with data */
+        req->parse_state = HTTPC_PARSE_RX_DATA;
+      }
+    }
+  }
+  if ((p != NULL) && (req->parse_state == HTTPC_PARSE_RX_DATA)) {
+    req->rx_content_len += p->tot_len;
+    if (req->recv_fn != NULL) {
+      /* directly return here: the connection migth already be aborted from the callback! */
+      return req->recv_fn(req->callback_arg, pcb, p, r);
+    } else {
+      altcp_recved(pcb, p->tot_len);
+      pbuf_free(p);
+    }
+  }
+  return ERR_OK;
+}
+
+/** http client tcp err callback */
+static void
+httpc_tcp_err(void *arg, err_t err)
+{
+  httpc_state_t* req = (httpc_state_t*)arg;
+  if (req != NULL) {
+    /* pcb has already been deallocated */
+    req->pcb = NULL;
+    httpc_close(req, HTTPC_RESULT_ERR_CLOSED, 0, err);
+  }
+}
+
+/** http client tcp poll callback */
+static err_t
+httpc_tcp_poll(void *arg, struct altcp_pcb *pcb)
+{
+  /* implement timeout */
+  httpc_state_t* req = (httpc_state_t*)arg;
+  LWIP_UNUSED_ARG(pcb);
+  if (req != NULL) {
+    if (req->timeout_ticks) {
+      req->timeout_ticks--;
+    }
+    if (!req->timeout_ticks) {
+      return httpc_close(req, HTTPC_RESULT_ERR_TIMEOUT, 0, ERR_OK);
+    }
+  }
+  return ERR_OK;
+}
+
+/** http client tcp sent callback */
+static err_t
+httpc_tcp_sent(void *arg, struct altcp_pcb *pcb, u16_t len)
+{
+  /* nothing to do here for now */
+  LWIP_UNUSED_ARG(arg);
+  LWIP_UNUSED_ARG(pcb);
+  LWIP_UNUSED_ARG(len);
+  return ERR_OK;
+}
+
+/** http client tcp connected callback */
+static err_t
+httpc_tcp_connected(void *arg, struct altcp_pcb *pcb, err_t err)
+{
+  err_t r;
+  httpc_state_t* req = (httpc_state_t*)arg;
+  LWIP_UNUSED_ARG(pcb);
+  LWIP_UNUSED_ARG(err);
+
+  /* send request; last char is zero termination */
+  r = altcp_write(req->pcb, req->request->payload, req->request->len - 1, TCP_WRITE_FLAG_COPY);
+  if (r != ERR_OK) {
+     /* could not write the single small request -> fail, don't retry */
+     return httpc_close(req, HTTPC_RESULT_ERR_MEM, 0, r);
+  }
+  /* everything written, we can free the request */
+  pbuf_free(req->request);
+  req->request = NULL;
+
+  altcp_output(req->pcb);
+  return ERR_OK;
+}
+
+/** Start the http request when the server IP addr is known */
+static err_t
+httpc_get_internal_addr(httpc_state_t* req, const ip_addr_t *ipaddr)
+{
+  err_t err;
+  LWIP_ASSERT("req != NULL", req != NULL);
+
+  if (&req->remote_addr != ipaddr) {
+    /* fill in remote addr if called externally */
+    req->remote_addr = *ipaddr;
+  }
+
+  err = altcp_connect(req->pcb, &req->remote_addr, req->remote_port, httpc_tcp_connected);
+  if (err == ERR_OK) {
+    return ERR_OK;
+  }
+  LWIP_DEBUGF(HTTPC_DEBUG_WARN_STATE, ("tcp_connect failed: %d\n", (int)err));
+  return err;
+}
+
+#if LWIP_DNS
+/** DNS callback
+ * If ipaddr is non-NULL, resolving succeeded and the request can be sent, otherwise it failed.
+ */
+static void
+httpc_dns_found(const char* hostname, const ip_addr_t *ipaddr, void *arg)
+{
+  httpc_state_t* req = (httpc_state_t*)arg;
+  err_t err;
+  httpc_result_t result;
+
+  LWIP_UNUSED_ARG(hostname);
+
+  if (ipaddr != NULL) {
+    err = httpc_get_internal_addr(req, ipaddr);
+    if (err == ERR_OK) {
+      return;
+    }
+    result = HTTPC_RESULT_ERR_CONNECT;
+  } else {
+    LWIP_DEBUGF(HTTPC_DEBUG_WARN_STATE, ("httpc_dns_found: failed to resolve hostname: %s\n",
+      hostname));
+    result = HTTPC_RESULT_ERR_HOSTNAME;
+    err = ERR_ARG;
+  }
+  httpc_close(req, result, 0, err);
+}
+#endif /* LWIP_DNS */
+
+/** Start the http request after converting 'server_name' to ip address (DNS or address string) */
+static err_t
+httpc_get_internal_dns(httpc_state_t* req, const char* server_name)
+{
+  err_t err;
+  LWIP_ASSERT("req != NULL", req != NULL);
+
+#if LWIP_DNS
+  err = dns_gethostbyname(server_name, &req->remote_addr, httpc_dns_found, req);
+#else
+  err = ipaddr_aton(server_name, &req->remote_addr) ? ERR_OK : ERR_ARG;
+#endif
+
+  if (err == ERR_OK) {
+    /* cached or IP-string */
+    err = httpc_get_internal_addr(req, &req->remote_addr);
+  } else if (err == ERR_INPROGRESS) {
+    return ERR_OK;
+  }
+  return err;
+}
+
+static int
+httpc_create_request_string(const httpc_connection_t *settings, const char* server_name, int server_port, const char* uri,
+                            int use_host, char *buffer, size_t buffer_size)
+{
+  if (settings->use_proxy) {
+    LWIP_ASSERT("server_name != NULL", server_name != NULL);
+    if (server_port != HTTP_DEFAULT_PORT) {
+      return snprintf(buffer, buffer_size, HTTPC_REQ_11_PROXY_PORT_FORMAT(server_name, server_port, uri, server_name));
+    } else {
+      return snprintf(buffer, buffer_size, HTTPC_REQ_11_PROXY_FORMAT(server_name, uri, server_name));
+    }
+  } else if (use_host) {
+    LWIP_ASSERT("server_name != NULL", server_name != NULL);
+    return snprintf(buffer, buffer_size, HTTPC_REQ_11_HOST_FORMAT(uri, server_name));
+  } else {
+    return snprintf(buffer, buffer_size, HTTPC_REQ_11_FORMAT(uri));
+  }
+}
+
+/** Initialize the connection struct */
+static err_t
+httpc_init_connection_common(httpc_state_t **connection, const httpc_connection_t *settings, const char* server_name,
+                      u16_t server_port, const char* uri, altcp_recv_fn recv_fn, void* callback_arg, int use_host)
+{
+  size_t alloc_len;
+  mem_size_t mem_alloc_len;
+  int req_len, req_len2;
+  httpc_state_t *req;
+#if HTTPC_DEBUG_REQUEST
+  size_t server_name_len, uri_len;
+#endif
+
+  LWIP_ASSERT("uri != NULL", uri != NULL);
+
+  /* get request len */
+  req_len = httpc_create_request_string(settings, server_name, server_port, uri, use_host, NULL, 0);
+  if ((req_len < 0) || (req_len > 0xFFFF)) {
+    return ERR_VAL;
+  }
+  /* alloc state and request in one block */
+  alloc_len = sizeof(httpc_state_t);
+#if HTTPC_DEBUG_REQUEST
+  server_name_len = server_name ? strlen(server_name) : 0;
+  uri_len = strlen(uri);
+  alloc_len += server_name_len + 1 + uri_len + 1;
+#endif
+  mem_alloc_len = (mem_size_t)alloc_len;
+  if ((mem_alloc_len < alloc_len) || (req_len + 1 > 0xFFFF)) {
+    return ERR_VAL;
+  }
+
+  req = (httpc_state_t*)mem_malloc((mem_size_t)alloc_len);
+  if(req == NULL) {
+    return ERR_MEM;
+  }
+  memset(req, 0, sizeof(httpc_state_t));
+  req->timeout_ticks = HTTPC_POLL_TIMEOUT;
+  req->request = pbuf_alloc(PBUF_RAW, (u16_t)(req_len + 1), PBUF_RAM);
+  if (req->request == NULL) {
+    httpc_free_state(req);
+    return ERR_MEM;
+  }
+  if (req->request->next != NULL) {
+    /* need a pbuf in one piece */
+    httpc_free_state(req);
+    return ERR_MEM;
+  }
+  req->hdr_content_len = HTTPC_CONTENT_LEN_INVALID;
+#if HTTPC_DEBUG_REQUEST
+  req->server_name = (char*)(req + 1);
+  if (server_name) {
+    memcpy(req->server_name, server_name, server_name_len + 1);
+  }
+  req->uri = req->server_name + server_name_len + 1;
+  memcpy(req->uri, uri, uri_len + 1);
+#endif
+  req->pcb = altcp_new(settings->altcp_allocator);
+  if(req->pcb == NULL) {
+    httpc_free_state(req);
+    return ERR_MEM;
+  }
+  req->remote_port = settings->use_proxy ? settings->proxy_port : server_port;
+  altcp_arg(req->pcb, req);
+  altcp_recv(req->pcb, httpc_tcp_recv);
+  altcp_err(req->pcb, httpc_tcp_err);
+  altcp_poll(req->pcb, httpc_tcp_poll, HTTPC_POLL_INTERVAL);
+  altcp_sent(req->pcb, httpc_tcp_sent);
+
+  /* set up request buffer */
+  req_len2 = httpc_create_request_string(settings, server_name, server_port, uri, use_host,
+    (char *)req->request->payload, req_len + 1);
+  if (req_len2 != req_len) {
+    httpc_free_state(req);
+    return ERR_VAL;
+  }
+
+  req->recv_fn = recv_fn;
+  req->conn_settings = settings;
+  req->callback_arg = callback_arg;
+
+  *connection = req;
+  return ERR_OK;
+}
+
+/**
+ * Initialize the connection struct
+ */
+static err_t
+httpc_init_connection(httpc_state_t **connection, const httpc_connection_t *settings, const char* server_name,
+                      u16_t server_port, const char* uri, altcp_recv_fn recv_fn, void* callback_arg)
+{
+  return httpc_init_connection_common(connection, settings, server_name, server_port, uri, recv_fn, callback_arg, 1);
+}
+
+
+/**
+ * Initialize the connection struct (from IP address)
+ */
+static err_t
+httpc_init_connection_addr(httpc_state_t **connection, const httpc_connection_t *settings,
+                           const ip_addr_t* server_addr, u16_t server_port, const char* uri,
+                           altcp_recv_fn recv_fn, void* callback_arg)
+{
+  char *server_addr_str = ipaddr_ntoa(server_addr);
+  if (server_addr_str == NULL) {
+    return ERR_VAL;
+  }
+  return httpc_init_connection_common(connection, settings, server_addr_str, server_port, uri,
+    recv_fn, callback_arg, 1);
+}
+
+/**
+ * @ingroup httpc 
+ * HTTP client API: get a file by passing server IP address
+ *
+ * @param server_addr IP address of the server to connect
+ * @param port tcp port of the server
+ * @param uri uri to get from the server, remember leading "/"!
+ * @param settings connection settings (callbacks, proxy, etc.)
+ * @param recv_fn the http body (not the headers) are passed to this callback
+ * @param callback_arg argument passed to all the callbacks
+ * @param connection retreives the connection handle (to match in callbacks)
+ * @return ERR_OK if starting the request succeeds (callback_fn will be called later)
+ *         or an error code
+ */
+err_t
+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)
+{
+  err_t err;
+  httpc_state_t* req;
+
+  LWIP_ERROR("invalid parameters", (server_addr != NULL) && (uri != NULL) && (recv_fn != NULL), return ERR_ARG;);
+
+  err = httpc_init_connection_addr(&req, settings, server_addr, port,
+    uri, recv_fn, callback_arg);
+  if (err != ERR_OK) {
+    return err;
+  }
+
+  if (settings->use_proxy) {
+    err = httpc_get_internal_addr(req, &settings->proxy_addr);
+  } else {
+    err = httpc_get_internal_addr(req, server_addr);
+  }
+  if(err != ERR_OK) {
+    httpc_free_state(req);
+    return err;
+  }
+
+  if (connection != NULL) {
+    *connection = req;
+  }
+  return ERR_OK;
+}
+
+/**
+ * @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)
+ * @param port tcp port of the server
+ * @param uri uri to get from the server, remember leading "/"!
+ * @param settings connection settings (callbacks, proxy, etc.)
+ * @param recv_fn the http body (not the headers) are passed to this callback
+ * @param callback_arg argument passed to all the callbacks
+ * @param connection retreives the connection handle (to match in callbacks)
+ * @return ERR_OK if starting the request succeeds (callback_fn will be called later)
+ *         or an error code
+ */
+err_t
+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)
+{
+  err_t err;
+  httpc_state_t* req;
+
+  LWIP_ERROR("invalid parameters", (server_name != NULL) && (uri != NULL) && (recv_fn != NULL), return ERR_ARG;);
+
+  err = httpc_init_connection(&req, settings, server_name, port, uri, recv_fn, callback_arg);
+  if (err != ERR_OK) {
+    return err;
+  }
+
+  if (settings->use_proxy) {
+    err = httpc_get_internal_addr(req, &settings->proxy_addr);
+  } else {
+    err = httpc_get_internal_dns(req, server_name);
+  }
+  if(err != ERR_OK) {
+    httpc_free_state(req);
+    return err;
+  }
+
+  if (connection != NULL) {
+    *connection = req;
+  }
+  return ERR_OK;
+}
+
+#if LWIP_HTTPC_HAVE_FILE_IO
+/* Implementation to disk via fopen/fwrite/fclose follows */
+
+typedef struct _httpc_filestate
+{
+  const char* local_file_name;
+  FILE *file;
+  httpc_connection_t settings;
+  const httpc_connection_t *client_settings;
+  void *callback_arg;
+} httpc_filestate_t;
+
+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 */
+static err_t
+httpc_fs_init(httpc_filestate_t **filestate_out, const char* local_file_name,
+              const httpc_connection_t *settings, void* callback_arg)
+{
+  httpc_filestate_t *filestate;
+  size_t file_len, alloc_len;
+  FILE *f;
+
+  file_len = strlen(local_file_name);
+  alloc_len = sizeof(httpc_filestate_t) + file_len + 1;
+
+  filestate = (httpc_filestate_t *)mem_malloc((mem_size_t)alloc_len);
+  if (filestate == NULL) {
+    return ERR_MEM;
+  }
+  memset(filestate, 0, sizeof(httpc_filestate_t));
+  filestate->local_file_name = (const char *)(filestate + 1);
+  memcpy((char *)(filestate + 1), local_file_name, file_len + 1);
+  filestate->file = NULL;
+  filestate->client_settings = settings;
+  filestate->callback_arg = callback_arg;
+  /* copy client settings but override result callback */
+  memcpy(&filestate->settings, settings, sizeof(httpc_connection_t));
+  filestate->settings.result_fn = httpc_fs_result;
+
+  f = fopen(local_file_name, "wb");
+  if(f == NULL) {
+    /* could not open file */
+    mem_free(filestate);
+    return ERR_VAL;
+  }
+  filestate->file = f;
+  *filestate_out = filestate;
+  return ERR_OK;
+}
+
+/** Free http client state for download to file system */
+static void
+httpc_fs_free(httpc_filestate_t *filestate)
+{
+  if (filestate != NULL) {
+    if (filestate->file != NULL) {
+      fclose(filestate->file);
+      filestate->file = NULL;
+    }
+    mem_free(filestate);
+  }
+}
+
+/** Connection closed (success or error) */
+static void
+httpc_fs_result(void *arg, httpc_result_t httpc_result, u32_t rx_content_len,
+                u32_t srv_res, err_t err)
+{
+  httpc_filestate_t *filestate = (httpc_filestate_t *)arg;
+  if (filestate != NULL) {
+    if (filestate->client_settings->result_fn != NULL) {
+      filestate->client_settings->result_fn(filestate->callback_arg, httpc_result, rx_content_len,
+        srv_res, err);
+    }
+    httpc_fs_free(filestate);
+  }
+}
+
+/** tcp recv callback */
+static err_t
+httpc_fs_tcp_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err)
+{
+  httpc_filestate_t *filestate = (httpc_filestate_t*)arg;
+  struct pbuf* q;
+  LWIP_UNUSED_ARG(err);
+
+  LWIP_ASSERT("p != NULL", p != NULL);
+
+  for (q = p; q != NULL; q = q->next) {
+    fwrite(q->payload, 1, q->len, filestate->file);
+  }
+  altcp_recved(pcb, p->tot_len);
+  pbuf_free(p);
+  return ERR_OK;
+}
+
+/**
+ * @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
+ * @param port tcp port of the server
+ * @param uri uri to get from the server, remember leading "/"!
+ * @param settings connection settings (callbacks, proxy, etc.)
+ * @param callback_arg argument passed to all the callbacks
+ * @param connection retreives the connection handle (to match in callbacks)
+ * @return ERR_OK if starting the request succeeds (callback_fn will be called later)
+ *         or an error code
+ */
+err_t
+httpc_get_file_to_disk(const ip_addr_t* server_addr, u16_t port, const char* uri, const httpc_connection_t *settings,
+                       void* callback_arg, const char* local_file_name, httpc_state_t **connection)
+{
+  err_t err;
+  httpc_state_t* req;
+  httpc_filestate_t *filestate;
+
+  LWIP_ERROR("invalid parameters", (server_addr != NULL) && (uri != NULL) && (local_file_name != NULL), return ERR_ARG;);
+
+  err = httpc_fs_init(&filestate, local_file_name, settings, callback_arg);
+  if (err != ERR_OK) {
+    return err;
+  }
+
+  err = httpc_init_connection_addr(&req, &filestate->settings, server_addr, port,
+    uri, httpc_fs_tcp_recv, filestate);
+  if (err != ERR_OK) {
+    httpc_fs_free(filestate);
+    return err;
+  }
+
+  if (settings->use_proxy) {
+    err = httpc_get_internal_addr(req, &settings->proxy_addr);
+  } else {
+    err = httpc_get_internal_addr(req, server_addr);
+  }
+  if(err != ERR_OK) {
+    httpc_fs_free(filestate);
+    httpc_free_state(req);
+    return err;
+  }
+
+  if (connection != NULL) {
+    *connection = req;
+  }
+  return ERR_OK;
+}
+
+/**
+ * @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)
+ * @param port tcp port of the server
+ * @param uri uri to get from the server, remember leading "/"!
+ * @param settings connection settings (callbacks, proxy, etc.)
+ * @param callback_arg argument passed to all the callbacks
+ * @param connection retreives the connection handle (to match in callbacks)
+ * @return ERR_OK if starting the request succeeds (callback_fn will be called later)
+ *         or an error code
+ */
+err_t
+httpc_get_file_dns_to_disk(const char* server_name, u16_t port, const char* uri, const httpc_connection_t *settings,
+                           void* callback_arg, const char* local_file_name, httpc_state_t **connection)
+{
+  err_t err;
+  httpc_state_t* req;
+  httpc_filestate_t *filestate;
+
+  LWIP_ERROR("invalid parameters", (server_name != NULL) && (uri != NULL) && (local_file_name != NULL), return ERR_ARG;);
+
+  err = httpc_fs_init(&filestate, local_file_name, settings, callback_arg);
+  if (err != ERR_OK) {
+    return err;
+  }
+
+  err = httpc_init_connection(&req, &filestate->settings, server_name, port,
+    uri, httpc_fs_tcp_recv, filestate);
+  if (err != ERR_OK) {
+    httpc_fs_free(filestate);
+    return err;
+  }
+
+  if (settings->use_proxy) {
+    err = httpc_get_internal_addr(req, &settings->proxy_addr);
+  } else {
+    err = httpc_get_internal_dns(req, server_name);
+  }
+  if(err != ERR_OK) {
+    httpc_fs_free(filestate);
+    httpc_free_state(req);
+    return err;
+  }
+
+  if (connection != NULL) {
+    *connection = req;
+  }
+  return ERR_OK;
+}
+#endif /* LWIP_HTTPC_HAVE_FILE_IO */
+
+#endif /* LWIP_TCP && LWIP_CALLBACK_API */
diff --git a/src/apps/http/httpd.c b/src/apps/http/httpd.c
new file mode 100644
index 0000000..ccc9ba7
--- /dev/null
+++ b/src/apps/http/httpd.c
@@ -0,0 +1,2746 @@
+/**
+ * @file
+ * LWIP HTTP server implementation
+ */
+
+/*
+ * 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
+ *
+ */
+
+/**
+ * @defgroup httpd HTTP server
+ * @ingroup apps
+ *
+ * This httpd supports for a
+ * rudimentary server-side-include facility which will replace tags of the form
+ * <!--#tag--> in any file whose extension is .shtml, .shtm or .ssi with
+ * strings provided by an include handler whose pointer is provided to the
+ * module via function http_set_ssi_handler().
+ * Additionally, a simple common
+ * gateway interface (CGI) handling mechanism has been added to allow clients
+ * to hook functions to particular request URIs.
+ *
+ * To enable SSI support, define label LWIP_HTTPD_SSI in lwipopts.h.
+ * To enable CGI support, define label LWIP_HTTPD_CGI in lwipopts.h.
+ *
+ * By default, the server assumes that HTTP headers are already present in
+ * each file stored in the file system.  By defining LWIP_HTTPD_DYNAMIC_HEADERS in
+ * lwipopts.h, this behavior can be changed such that the server inserts the
+ * headers automatically based on the extension of the file being served.  If
+ * this mode is used, be careful to ensure that the file system image used
+ * does not already contain the header information.
+ *
+ * File system images without headers can be created using the makefsfile
+ * tool with the -h command line option.
+ *
+ *
+ * Notes about valid SSI tags
+ * --------------------------
+ *
+ * The following assumptions are made about tags used in SSI markers:
+ *
+ * 1. No tag may contain '-' or whitespace characters within the tag name.
+ * 2. Whitespace is allowed between the tag leadin "<!--#" and the start of
+ *    the tag name and between the tag name and the leadout string "-->".
+ * 3. The maximum tag name length is LWIP_HTTPD_MAX_TAG_NAME_LEN, currently 8 characters.
+ *
+ * Notes on CGI usage
+ * ------------------
+ *
+ * The simple CGI support offered here works with GET method requests only
+ * and can handle up to 16 parameters encoded into the URI. The handler
+ * function may not write directly to the HTTP output but must return a
+ * filename that the HTTP server will send to the browser as a response to
+ * the incoming CGI request.
+ *
+ *
+ *
+ * The list of supported file types is quite short, so if makefsdata complains
+ * about an unknown extension, make sure to add it (and its doctype) to
+ * the 'g_psHTTPHeaders' list.
+ */
+#include "lwip/init.h"
+#include "lwip/apps/httpd.h"
+#include "lwip/debug.h"
+#include "lwip/stats.h"
+#include "lwip/apps/fs.h"
+#include "httpd_structs.h"
+#include "lwip/def.h"
+
+#include "lwip/altcp.h"
+#include "lwip/altcp_tcp.h"
+#if HTTPD_ENABLE_HTTPS
+#include "lwip/altcp_tls.h"
+#endif
+#ifdef LWIP_HOOK_FILENAME
+#include LWIP_HOOK_FILENAME
+#endif
+#if LWIP_HTTPD_TIMING
+#include "lwip/sys.h"
+#endif /* LWIP_HTTPD_TIMING */
+
+#include <string.h> /* memset */
+#include <stdlib.h> /* atoi */
+#include <stdio.h>
+
+#if LWIP_TCP && LWIP_CALLBACK_API
+
+/** Minimum length for a valid HTTP/0.9 request: "GET /\r\n" -> 7 bytes */
+#define MIN_REQ_LEN   7
+
+#define CRLF "\r\n"
+#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
+#define HTTP11_CONNECTIONKEEPALIVE  "Connection: keep-alive"
+#define HTTP11_CONNECTIONKEEPALIVE2 "Connection: Keep-Alive"
+#endif
+
+#if LWIP_HTTPD_DYNAMIC_FILE_READ
+#define HTTP_IS_DYNAMIC_FILE(hs) ((hs)->buf != NULL)
+#else
+#define HTTP_IS_DYNAMIC_FILE(hs) 0
+#endif
+
+/* This defines checks whether tcp_write has to copy data or not */
+
+#ifndef HTTP_IS_DATA_VOLATILE
+/** tcp_write does not have to copy data when sent from rom-file-system directly */
+#define HTTP_IS_DATA_VOLATILE(hs)       (HTTP_IS_DYNAMIC_FILE(hs) ? TCP_WRITE_FLAG_COPY : 0)
+#endif
+/** Default: dynamic headers are sent from ROM (non-dynamic headers are handled like file data) */
+#ifndef HTTP_IS_HDR_VOLATILE
+#define HTTP_IS_HDR_VOLATILE(hs, ptr)   0
+#endif
+
+/* Return values for http_send_*() */
+#define HTTP_DATA_TO_SEND_FREED    3
+#define HTTP_DATA_TO_SEND_BREAK    2
+#define HTTP_DATA_TO_SEND_CONTINUE 1
+#define HTTP_NO_DATA_TO_SEND       0
+
+typedef struct {
+  const char *name;
+  u8_t shtml;
+} default_filename;
+
+static const default_filename httpd_default_filenames[] = {
+  {"/index.shtml", 1 },
+  {"/index.ssi",   1 },
+  {"/index.shtm",  1 },
+  {"/index.html",  0 },
+  {"/index.htm",   0 }
+};
+
+#define NUM_DEFAULT_FILENAMES LWIP_ARRAYSIZE(httpd_default_filenames)
+
+#if LWIP_HTTPD_SUPPORT_REQUESTLIST
+/** HTTP request is copied here from pbufs for simple parsing */
+static char httpd_req_buf[LWIP_HTTPD_MAX_REQ_LENGTH + 1];
+#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
+
+#if LWIP_HTTPD_SUPPORT_POST
+#if LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN > LWIP_HTTPD_MAX_REQUEST_URI_LEN
+#define LWIP_HTTPD_URI_BUF_LEN LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN
+#endif
+#endif
+#ifndef LWIP_HTTPD_URI_BUF_LEN
+#define LWIP_HTTPD_URI_BUF_LEN LWIP_HTTPD_MAX_REQUEST_URI_LEN
+#endif
+#if LWIP_HTTPD_URI_BUF_LEN
+/* Filename for response file to send when POST is finished or
+ * search for default files when a directory is requested. */
+static char http_uri_buf[LWIP_HTTPD_URI_BUF_LEN + 1];
+#endif
+
+#if LWIP_HTTPD_DYNAMIC_HEADERS
+/* The number of individual strings that comprise the headers sent before each
+ * requested file.
+ */
+#define NUM_FILE_HDR_STRINGS 5
+#define HDR_STRINGS_IDX_HTTP_STATUS           0 /* e.g. "HTTP/1.0 200 OK\r\n" */
+#define HDR_STRINGS_IDX_SERVER_NAME           1 /* e.g. "Server: "HTTPD_SERVER_AGENT"\r\n" */
+#define HDR_STRINGS_IDX_CONTENT_LEN_KEEPALIVE 2 /* e.g. "Content-Length: xy\r\n" and/or "Connection: keep-alive\r\n" */
+#define HDR_STRINGS_IDX_CONTENT_LEN_NR        3 /* the byte count, when content-length is used */
+#define HDR_STRINGS_IDX_CONTENT_TYPE          4 /* the content type (or default answer content type including default document) */
+
+/* The dynamically generated Content-Length buffer needs space for CRLF + NULL */
+#define LWIP_HTTPD_MAX_CONTENT_LEN_OFFSET 3
+#ifndef LWIP_HTTPD_MAX_CONTENT_LEN_SIZE
+/* The dynamically generated Content-Length buffer shall be able to work with
+   ~953 MB (9 digits) */
+#define LWIP_HTTPD_MAX_CONTENT_LEN_SIZE   (9 + LWIP_HTTPD_MAX_CONTENT_LEN_OFFSET)
+#endif
+#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
+
+#if LWIP_HTTPD_SSI
+
+#define HTTPD_LAST_TAG_PART 0xFFFF
+
+enum tag_check_state {
+  TAG_NONE,       /* Not processing an SSI tag */
+  TAG_LEADIN,     /* Tag lead in "<!--#" being processed */
+  TAG_FOUND,      /* Tag name being read, looking for lead-out start */
+  TAG_LEADOUT,    /* Tag lead out "-->" being processed */
+  TAG_SENDING     /* Sending tag replacement string */
+};
+
+struct http_ssi_state {
+  const char *parsed;     /* Pointer to the first unparsed byte in buf. */
+#if !LWIP_HTTPD_SSI_INCLUDE_TAG
+  const char *tag_started;/* Pointer to the first opening '<' of the tag. */
+#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG */
+  const char *tag_end;    /* Pointer to char after the closing '>' of the tag. */
+  u32_t parse_left; /* Number of unparsed bytes in buf. */
+  u16_t tag_index;   /* Counter used by tag parsing state machine */
+  u16_t tag_insert_len; /* Length of insert in string tag_insert */
+#if LWIP_HTTPD_SSI_MULTIPART
+  u16_t tag_part; /* Counter passed to and changed by tag insertion function to insert multiple times */
+#endif /* LWIP_HTTPD_SSI_MULTIPART */
+  u8_t tag_type; /* index into http_ssi_tag_desc array */
+  u8_t tag_name_len; /* Length of the tag name in string tag_name */
+  char tag_name[LWIP_HTTPD_MAX_TAG_NAME_LEN + 1]; /* Last tag name extracted */
+  char tag_insert[LWIP_HTTPD_MAX_TAG_INSERT_LEN + 1]; /* Insert string for tag_name */
+  enum tag_check_state tag_state; /* State of the tag processor */
+};
+
+struct http_ssi_tag_description {
+  const char *lead_in;
+  const char *lead_out; 
+};
+
+#endif /* LWIP_HTTPD_SSI */
+
+struct http_state {
+#if LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED
+  struct http_state *next;
+#endif /* LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED */
+  struct fs_file file_handle;
+  struct fs_file *handle;
+  const char *file;       /* Pointer to first unsent byte in buf. */
+
+  struct altcp_pcb *pcb;
+#if LWIP_HTTPD_SUPPORT_REQUESTLIST
+  struct pbuf *req;
+#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
+
+#if LWIP_HTTPD_DYNAMIC_FILE_READ
+  char *buf;        /* File read buffer. */
+  int buf_len;      /* Size of file read buffer, buf. */
+#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */
+  u32_t left;       /* Number of unsent bytes in buf. */
+  u8_t retries;
+#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
+  u8_t keepalive;
+#endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */
+#if LWIP_HTTPD_SSI
+  struct http_ssi_state *ssi;
+#endif /* LWIP_HTTPD_SSI */
+#if LWIP_HTTPD_CGI
+  char *params[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Params extracted from the request URI */
+  char *param_vals[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Values for each extracted param */
+#endif /* LWIP_HTTPD_CGI */
+#if LWIP_HTTPD_DYNAMIC_HEADERS
+  const char *hdrs[NUM_FILE_HDR_STRINGS]; /* HTTP headers to be sent. */
+  char hdr_content_len[LWIP_HTTPD_MAX_CONTENT_LEN_SIZE];
+  u16_t hdr_pos;     /* The position of the first unsent header byte in the
+                        current string */
+  u16_t hdr_index;   /* The index of the hdr string currently being sent. */
+#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
+#if LWIP_HTTPD_TIMING
+  u32_t time_started;
+#endif /* LWIP_HTTPD_TIMING */
+#if LWIP_HTTPD_SUPPORT_POST
+  u32_t post_content_len_left;
+#if LWIP_HTTPD_POST_MANUAL_WND
+  u32_t unrecved_bytes;
+  u8_t no_auto_wnd;
+  u8_t post_finished;
+#endif /* LWIP_HTTPD_POST_MANUAL_WND */
+#endif /* LWIP_HTTPD_SUPPORT_POST*/
+};
+
+#if HTTPD_USE_MEM_POOL
+LWIP_MEMPOOL_DECLARE(HTTPD_STATE,     MEMP_NUM_PARALLEL_HTTPD_CONNS,     sizeof(struct http_state),     "HTTPD_STATE")
+#if LWIP_HTTPD_SSI
+LWIP_MEMPOOL_DECLARE(HTTPD_SSI_STATE, MEMP_NUM_PARALLEL_HTTPD_SSI_CONNS, sizeof(struct http_ssi_state), "HTTPD_SSI_STATE")
+#define HTTP_FREE_SSI_STATE(x)  LWIP_MEMPOOL_FREE(HTTPD_SSI_STATE, (x))
+#define HTTP_ALLOC_SSI_STATE()  (struct http_ssi_state *)LWIP_MEMPOOL_ALLOC(HTTPD_SSI_STATE)
+#endif /* LWIP_HTTPD_SSI */
+#define HTTP_ALLOC_HTTP_STATE() (struct http_state *)LWIP_MEMPOOL_ALLOC(HTTPD_STATE)
+#define HTTP_FREE_HTTP_STATE(x) LWIP_MEMPOOL_FREE(HTTPD_STATE, (x))
+#else /* HTTPD_USE_MEM_POOL */
+#define HTTP_ALLOC_HTTP_STATE() (struct http_state *)mem_malloc(sizeof(struct http_state))
+#define HTTP_FREE_HTTP_STATE(x) mem_free(x)
+#if LWIP_HTTPD_SSI
+#define HTTP_ALLOC_SSI_STATE()  (struct http_ssi_state *)mem_malloc(sizeof(struct http_ssi_state))
+#define HTTP_FREE_SSI_STATE(x)  mem_free(x)
+#endif /* LWIP_HTTPD_SSI */
+#endif /* HTTPD_USE_MEM_POOL */
+
+static err_t http_close_conn(struct altcp_pcb *pcb, struct http_state *hs);
+static err_t http_close_or_abort_conn(struct altcp_pcb *pcb, struct http_state *hs, u8_t abort_conn);
+static err_t http_find_file(struct http_state *hs, const char *uri, int is_09);
+static err_t http_init_file(struct http_state *hs, struct fs_file *file, int is_09, const char *uri, u8_t tag_check, char *params);
+static err_t http_poll(void *arg, struct altcp_pcb *pcb);
+static u8_t http_check_eof(struct altcp_pcb *pcb, struct http_state *hs);
+#if LWIP_HTTPD_FS_ASYNC_READ
+static void http_continue(void *connection);
+#endif /* LWIP_HTTPD_FS_ASYNC_READ */
+
+#if LWIP_HTTPD_SSI
+/* SSI insert handler function pointer. */
+static tSSIHandler httpd_ssi_handler;
+#if !LWIP_HTTPD_SSI_RAW
+static int httpd_num_tags;
+static const char **httpd_tags;
+#endif /* !LWIP_HTTPD_SSI_RAW */
+
+/* Define the available tag lead-ins and corresponding lead-outs.
+ * ATTENTION: for the algorithm below using this array, it is essential
+ * that the lead in differs in the first character! */
+const struct http_ssi_tag_description http_ssi_tag_desc[] = {
+  {"<!--#", "-->"},
+  {"/*#", "*/"}
+};
+
+#endif /* LWIP_HTTPD_SSI */
+
+#if LWIP_HTTPD_CGI
+/* CGI handler information */
+static const tCGI *httpd_cgis;
+static int httpd_num_cgis;
+static int http_cgi_paramcount;
+#define http_cgi_params     hs->params
+#define http_cgi_param_vals hs->param_vals
+#elif LWIP_HTTPD_CGI_SSI
+static char *http_cgi_params[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Params extracted from the request URI */
+static char *http_cgi_param_vals[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Values for each extracted param */
+#endif /* LWIP_HTTPD_CGI */
+
+#if LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED
+/** global list of active HTTP connections, use to kill the oldest when
+    running out of memory */
+static struct http_state *http_connections;
+
+static void
+http_add_connection(struct http_state *hs)
+{
+  /* add the connection to the list */
+  hs->next = http_connections;
+  http_connections = hs;
+}
+
+static void
+http_remove_connection(struct http_state *hs)
+{
+  /* take the connection off the list */
+  if (http_connections) {
+    if (http_connections == hs) {
+      http_connections = hs->next;
+    } else {
+      struct http_state *last;
+      for (last = http_connections; last->next != NULL; last = last->next) {
+        if (last->next == hs) {
+          last->next = hs->next;
+          break;
+        }
+      }
+    }
+  }
+}
+
+static void
+http_kill_oldest_connection(u8_t ssi_required)
+{
+  struct http_state *hs = http_connections;
+  struct http_state *hs_free_next = NULL;
+  while (hs && hs->next) {
+#if LWIP_HTTPD_SSI
+    if (ssi_required) {
+      if (hs->next->ssi != NULL) {
+        hs_free_next = hs;
+      }
+    } else
+#else /* LWIP_HTTPD_SSI */
+    LWIP_UNUSED_ARG(ssi_required);
+#endif /* LWIP_HTTPD_SSI */
+    {
+      hs_free_next = hs;
+    }
+    LWIP_ASSERT("broken list", hs != hs->next);
+    hs = hs->next;
+  }
+  if (hs_free_next != NULL) {
+    LWIP_ASSERT("hs_free_next->next != NULL", hs_free_next->next != NULL);
+    LWIP_ASSERT("hs_free_next->next->pcb != NULL", hs_free_next->next->pcb != NULL);
+    /* send RST when killing a connection because of memory shortage */
+    http_close_or_abort_conn(hs_free_next->next->pcb, hs_free_next->next, 1); /* this also unlinks the http_state from the list */
+  }
+}
+#else /* LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED */
+
+#define http_add_connection(hs)
+#define http_remove_connection(hs)
+
+#endif /* LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED */
+
+#if LWIP_HTTPD_SSI
+/** Allocate as struct http_ssi_state. */
+static struct http_ssi_state *
+http_ssi_state_alloc(void)
+{
+  struct http_ssi_state *ret = HTTP_ALLOC_SSI_STATE();
+#if LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED
+  if (ret == NULL) {
+    http_kill_oldest_connection(1);
+    ret = HTTP_ALLOC_SSI_STATE();
+  }
+#endif /* LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED */
+  if (ret != NULL) {
+    memset(ret, 0, sizeof(struct http_ssi_state));
+  }
+  return ret;
+}
+
+/** Free a struct http_ssi_state. */
+static void
+http_ssi_state_free(struct http_ssi_state *ssi)
+{
+  if (ssi != NULL) {
+    HTTP_FREE_SSI_STATE(ssi);
+  }
+}
+#endif /* LWIP_HTTPD_SSI */
+
+/** Initialize a struct http_state.
+ */
+static void
+http_state_init(struct http_state *hs)
+{
+  /* Initialize the structure. */
+  memset(hs, 0, sizeof(struct http_state));
+#if LWIP_HTTPD_DYNAMIC_HEADERS
+  /* Indicate that the headers are not yet valid */
+  hs->hdr_index = NUM_FILE_HDR_STRINGS;
+#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
+}
+
+/** Allocate a struct http_state. */
+static struct http_state *
+http_state_alloc(void)
+{
+  struct http_state *ret = HTTP_ALLOC_HTTP_STATE();
+#if LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED
+  if (ret == NULL) {
+    http_kill_oldest_connection(0);
+    ret = HTTP_ALLOC_HTTP_STATE();
+  }
+#endif /* LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED */
+  if (ret != NULL) {
+    http_state_init(ret);
+    http_add_connection(ret);
+  }
+  return ret;
+}
+
+/** Free a struct http_state.
+ * Also frees the file data if dynamic.
+ */
+static void
+http_state_eof(struct http_state *hs)
+{
+  if (hs->handle) {
+#if LWIP_HTTPD_TIMING
+    u32_t ms_needed = sys_now() - hs->time_started;
+    u32_t needed = LWIP_MAX(1, (ms_needed / 100));
+    LWIP_DEBUGF(HTTPD_DEBUG_TIMING, ("httpd: needed %"U32_F" ms to send file of %d bytes -> %"U32_F" bytes/sec\n",
+                                     ms_needed, hs->handle->len, ((((u32_t)hs->handle->len) * 10) / needed)));
+#endif /* LWIP_HTTPD_TIMING */
+    fs_close(hs->handle);
+    hs->handle = NULL;
+  }
+#if LWIP_HTTPD_DYNAMIC_FILE_READ
+  if (hs->buf != NULL) {
+    mem_free(hs->buf);
+    hs->buf = NULL;
+  }
+#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */
+#if LWIP_HTTPD_SSI
+  if (hs->ssi) {
+    http_ssi_state_free(hs->ssi);
+    hs->ssi = NULL;
+  }
+#endif /* LWIP_HTTPD_SSI */
+#if LWIP_HTTPD_SUPPORT_REQUESTLIST
+  if (hs->req) {
+    pbuf_free(hs->req);
+    hs->req = NULL;
+  }
+#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
+}
+
+/** Free a struct http_state.
+ * Also frees the file data if dynamic.
+ */
+static void
+http_state_free(struct http_state *hs)
+{
+  if (hs != NULL) {
+    http_state_eof(hs);
+    http_remove_connection(hs);
+    HTTP_FREE_HTTP_STATE(hs);
+  }
+}
+
+/** Call tcp_write() in a loop trying smaller and smaller length
+ *
+ * @param pcb altcp_pcb to send
+ * @param ptr Data to send
+ * @param length Length of data to send (in/out: on return, contains the
+ *        amount of data sent)
+ * @param apiflags directly passed to tcp_write
+ * @return the return value of tcp_write
+ */
+static err_t
+http_write(struct altcp_pcb *pcb, const void *ptr, u16_t *length, u8_t apiflags)
+{
+  u16_t len, max_len;
+  err_t err;
+  LWIP_ASSERT("length != NULL", length != NULL);
+  len = *length;
+  if (len == 0) {
+    return ERR_OK;
+  }
+  /* We cannot send more data than space available in the send buffer. */
+  max_len = altcp_sndbuf(pcb);
+  if (max_len < len) {
+    len = max_len;
+  }
+#ifdef HTTPD_MAX_WRITE_LEN
+  /* Additional limitation: e.g. don't enqueue more than 2*mss at once */
+  max_len = HTTPD_MAX_WRITE_LEN(pcb);
+  if (len > max_len) {
+    len = max_len;
+  }
+#endif /* HTTPD_MAX_WRITE_LEN */
+  do {
+    LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Trying to send %d bytes\n", len));
+    err = altcp_write(pcb, ptr, len, apiflags);
+    if (err == ERR_MEM) {
+      if ((altcp_sndbuf(pcb) == 0) ||
+          (altcp_sndqueuelen(pcb) >= TCP_SND_QUEUELEN)) {
+        /* no need to try smaller sizes */
+        len = 1;
+      } else {
+        len /= 2;
+      }
+      LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE,
+                  ("Send failed, trying less (%d bytes)\n", len));
+    }
+  } while ((err == ERR_MEM) && (len > 1));
+
+  if (err == ERR_OK) {
+    LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Sent %d bytes\n", len));
+    *length = len;
+  } else {
+    LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Send failed with err %d (\"%s\")\n", err, lwip_strerr(err)));
+    *length = 0;
+  }
+
+#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
+  /* ensure nagle is normally enabled (only disabled for persistent connections
+     when all data has been enqueued but the connection stays open for the next
+     request */
+  altcp_nagle_enable(pcb);
+#endif
+
+  return err;
+}
+
+/**
+ * The connection shall be actively closed (using RST to close from fault states).
+ * Reset the sent- and recv-callbacks.
+ *
+ * @param pcb the tcp pcb to reset callbacks
+ * @param hs connection state to free
+ */
+static err_t
+http_close_or_abort_conn(struct altcp_pcb *pcb, struct http_state *hs, u8_t abort_conn)
+{
+  err_t err;
+  LWIP_DEBUGF(HTTPD_DEBUG, ("Closing connection %p\n", (void *)pcb));
+
+#if LWIP_HTTPD_SUPPORT_POST
+  if (hs != NULL) {
+    if ((hs->post_content_len_left != 0)
+#if LWIP_HTTPD_POST_MANUAL_WND
+        || ((hs->no_auto_wnd != 0) && (hs->unrecved_bytes != 0))
+#endif /* LWIP_HTTPD_POST_MANUAL_WND */
+       ) {
+      /* make sure the post code knows that the connection is closed */
+      http_uri_buf[0] = 0;
+      httpd_post_finished(hs, http_uri_buf, LWIP_HTTPD_URI_BUF_LEN);
+    }
+  }
+#endif /* LWIP_HTTPD_SUPPORT_POST*/
+
+
+  altcp_arg(pcb, NULL);
+  altcp_recv(pcb, NULL);
+  altcp_err(pcb, NULL);
+  altcp_poll(pcb, NULL, 0);
+  altcp_sent(pcb, NULL);
+  if (hs != NULL) {
+    http_state_free(hs);
+  }
+
+  if (abort_conn) {
+    altcp_abort(pcb);
+    return ERR_OK;
+  }
+  err = altcp_close(pcb);
+  if (err != ERR_OK) {
+    LWIP_DEBUGF(HTTPD_DEBUG, ("Error %d closing %p\n", err, (void *)pcb));
+    /* error closing, try again later in poll */
+    altcp_poll(pcb, http_poll, HTTPD_POLL_INTERVAL);
+  }
+  return err;
+}
+
+/**
+ * The connection shall be actively closed.
+ * Reset the sent- and recv-callbacks.
+ *
+ * @param pcb the tcp pcb to reset callbacks
+ * @param hs connection state to free
+ */
+static err_t
+http_close_conn(struct altcp_pcb *pcb, struct http_state *hs)
+{
+  return http_close_or_abort_conn(pcb, hs, 0);
+}
+
+/** End of file: either close the connection (Connection: close) or
+ * close the file (Connection: keep-alive)
+ */
+static void
+http_eof(struct altcp_pcb *pcb, struct http_state *hs)
+{
+  /* HTTP/1.1 persistent connection? (Not supported for SSI) */
+#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
+  if (hs->keepalive) {
+    http_remove_connection(hs);
+
+    http_state_eof(hs);
+    http_state_init(hs);
+    /* restore state: */
+    hs->pcb = pcb;
+    hs->keepalive = 1;
+    http_add_connection(hs);
+    /* ensure nagle doesn't interfere with sending all data as fast as possible: */
+    altcp_nagle_disable(pcb);
+  } else
+#endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */
+  {
+    http_close_conn(pcb, hs);
+  }
+}
+
+#if LWIP_HTTPD_CGI || LWIP_HTTPD_CGI_SSI
+/**
+ * Extract URI parameters from the parameter-part of an URI in the form
+ * "test.cgi?x=y" @todo: better explanation!
+ * Pointers to the parameters are stored in hs->param_vals.
+ *
+ * @param hs http connection state
+ * @param params pointer to the NULL-terminated parameter string from the URI
+ * @return number of parameters extracted
+ */
+static int
+extract_uri_parameters(struct http_state *hs, char *params)
+{
+  char *pair;
+  char *equals;
+  int loop;
+
+  LWIP_UNUSED_ARG(hs);
+
+  /* If we have no parameters at all, return immediately. */
+  if (!params || (params[0] == '\0')) {
+    return (0);
+  }
+
+  /* Get a pointer to our first parameter */
+  pair = params;
+
+  /* Parse up to LWIP_HTTPD_MAX_CGI_PARAMETERS from the passed string and ignore the
+   * remainder (if any) */
+  for (loop = 0; (loop < LWIP_HTTPD_MAX_CGI_PARAMETERS) && pair; loop++) {
+
+    /* Save the name of the parameter */
+    http_cgi_params[loop] = pair;
+
+    /* Remember the start of this name=value pair */
+    equals = pair;
+
+    /* Find the start of the next name=value pair and replace the delimiter
+     * with a 0 to terminate the previous pair string. */
+    pair = strchr(pair, '&');
+    if (pair) {
+      *pair = '\0';
+      pair++;
+    } else {
+      /* We didn't find a new parameter so find the end of the URI and
+       * replace the space with a '\0' */
+      pair = strchr(equals, ' ');
+      if (pair) {
+        *pair = '\0';
+      }
+
+      /* Revert to NULL so that we exit the loop as expected. */
+      pair = NULL;
+    }
+
+    /* Now find the '=' in the previous pair, replace it with '\0' and save
+     * the parameter value string. */
+    equals = strchr(equals, '=');
+    if (equals) {
+      *equals = '\0';
+      http_cgi_param_vals[loop] = equals + 1;
+    } else {
+      http_cgi_param_vals[loop] = NULL;
+    }
+  }
+
+  return loop;
+}
+#endif /* LWIP_HTTPD_CGI || LWIP_HTTPD_CGI_SSI */
+
+#if LWIP_HTTPD_SSI
+/**
+ * Insert a tag (found in an shtml in the form of "<!--#tagname-->" into the file.
+ * The tag's name is stored in ssi->tag_name (NULL-terminated), the replacement
+ * should be written to hs->tag_insert (up to a length of LWIP_HTTPD_MAX_TAG_INSERT_LEN).
+ * The amount of data written is stored to ssi->tag_insert_len.
+ *
+ * @todo: return tag_insert_len - maybe it can be removed from struct http_state?
+ *
+ * @param hs http connection state
+ */
+static void
+get_tag_insert(struct http_state *hs)
+{
+#if LWIP_HTTPD_SSI_RAW
+  const char *tag;
+#else /* LWIP_HTTPD_SSI_RAW */
+  int tag;
+#endif /* LWIP_HTTPD_SSI_RAW */
+  size_t len;
+  struct http_ssi_state *ssi;
+#if LWIP_HTTPD_SSI_MULTIPART
+  u16_t current_tag_part;
+#endif /* LWIP_HTTPD_SSI_MULTIPART */
+
+  LWIP_ASSERT("hs != NULL", hs != NULL);
+  ssi = hs->ssi;
+  LWIP_ASSERT("ssi != NULL", ssi != NULL);
+#if LWIP_HTTPD_SSI_MULTIPART
+  current_tag_part = ssi->tag_part;
+  ssi->tag_part = HTTPD_LAST_TAG_PART;
+#endif /* LWIP_HTTPD_SSI_MULTIPART */
+#if LWIP_HTTPD_SSI_RAW
+  tag = ssi->tag_name;
+#endif
+
+  if (httpd_ssi_handler
+#if !LWIP_HTTPD_SSI_RAW
+      && httpd_tags && httpd_num_tags
+#endif /* !LWIP_HTTPD_SSI_RAW */
+     ) {
+
+    /* Find this tag in the list we have been provided. */
+#if LWIP_HTTPD_SSI_RAW
+    {
+#else /* LWIP_HTTPD_SSI_RAW */
+    for (tag = 0; tag < httpd_num_tags; tag++) {
+      if (strcmp(ssi->tag_name, httpd_tags[tag]) == 0)
+#endif /* LWIP_HTTPD_SSI_RAW */
+      {
+        ssi->tag_insert_len = httpd_ssi_handler(tag, ssi->tag_insert,
+                                              LWIP_HTTPD_MAX_TAG_INSERT_LEN
+#if LWIP_HTTPD_SSI_MULTIPART
+                                              , current_tag_part, &ssi->tag_part
+#endif /* LWIP_HTTPD_SSI_MULTIPART */
+#if LWIP_HTTPD_FILE_STATE
+                                              , (hs->handle ? hs->handle->state : NULL)
+#endif /* LWIP_HTTPD_FILE_STATE */
+                                             );
+#if LWIP_HTTPD_SSI_RAW
+        if (ssi->tag_insert_len != HTTPD_SSI_TAG_UNKNOWN)
+#endif /* LWIP_HTTPD_SSI_RAW */
+        {
+          return;
+        }
+      }
+    }
+  }
+
+  /* If we drop out, we were asked to serve a page which contains tags that
+   * we don't have a handler for. Merely echo back the tags with an error
+   * marker. */
+#define UNKNOWN_TAG1_TEXT "<b>***UNKNOWN TAG "
+#define UNKNOWN_TAG1_LEN  18
+#define UNKNOWN_TAG2_TEXT "***</b>"
+#define UNKNOWN_TAG2_LEN  7
+  len = LWIP_MIN(sizeof(ssi->tag_name), LWIP_MIN(strlen(ssi->tag_name),
+                 LWIP_HTTPD_MAX_TAG_INSERT_LEN - (UNKNOWN_TAG1_LEN + UNKNOWN_TAG2_LEN)));
+  MEMCPY(ssi->tag_insert, UNKNOWN_TAG1_TEXT, UNKNOWN_TAG1_LEN);
+  MEMCPY(&ssi->tag_insert[UNKNOWN_TAG1_LEN], ssi->tag_name, len);
+  MEMCPY(&ssi->tag_insert[UNKNOWN_TAG1_LEN + len], UNKNOWN_TAG2_TEXT, UNKNOWN_TAG2_LEN);
+  ssi->tag_insert[UNKNOWN_TAG1_LEN + len + UNKNOWN_TAG2_LEN] = 0;
+
+  len = strlen(ssi->tag_insert);
+  LWIP_ASSERT("len <= 0xffff", len <= 0xffff);
+  ssi->tag_insert_len = (u16_t)len;
+}
+#endif /* LWIP_HTTPD_SSI */
+
+#if LWIP_HTTPD_DYNAMIC_HEADERS
+/**
+ * Generate the relevant HTTP headers for the given filename and write
+ * them into the supplied buffer.
+ */
+static void
+get_http_headers(struct http_state *hs, const char *uri)
+{
+  size_t content_type;
+  char *tmp;
+  char *ext;
+  char *vars;
+
+  /* In all cases, the second header we send is the server identification
+     so set it here. */
+  hs->hdrs[HDR_STRINGS_IDX_SERVER_NAME] = g_psHTTPHeaderStrings[HTTP_HDR_SERVER];
+  hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEEPALIVE] = NULL;
+  hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_NR] = NULL;
+
+  /* Is this a normal file or the special case we use to send back the
+     default "404: Page not found" response? */
+  if (uri == NULL) {
+    hs->hdrs[HDR_STRINGS_IDX_HTTP_STATUS] = g_psHTTPHeaderStrings[HTTP_HDR_NOT_FOUND];
+#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
+    if (hs->keepalive) {
+      hs->hdrs[HDR_STRINGS_IDX_CONTENT_TYPE] = g_psHTTPHeaderStrings[DEFAULT_404_HTML_PERSISTENT];
+    } else
+#endif
+    {
+      hs->hdrs[HDR_STRINGS_IDX_CONTENT_TYPE] = g_psHTTPHeaderStrings[DEFAULT_404_HTML];
+    }
+
+    /* Set up to send the first header string. */
+    hs->hdr_index = 0;
+    hs->hdr_pos = 0;
+    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")) {
+    hs->hdrs[HDR_STRINGS_IDX_HTTP_STATUS] = g_psHTTPHeaderStrings[HTTP_HDR_NOT_FOUND];
+  } else if (strstr(uri, "400")) {
+    hs->hdrs[HDR_STRINGS_IDX_HTTP_STATUS] = g_psHTTPHeaderStrings[HTTP_HDR_BAD_REQUEST];
+  } else if (strstr(uri, "501")) {
+    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];
+  }
+
+  /* Determine if the URI has any variables and, if so, temporarily remove
+      them. */
+  vars = strchr(uri, '?');
+  if (vars) {
+    *vars = '\0';
+  }
+
+  /* Get a pointer to the file extension.  We find this by looking for the
+      last occurrence of "." in the filename passed. */
+  ext = NULL;
+  tmp = strchr(uri, '.');
+  while (tmp) {
+    ext = tmp + 1;
+    tmp = strchr(ext, '.');
+  }
+  if (ext != NULL) {
+    /* Now determine the content type and add the relevant header for that. */
+    for (content_type = 0; content_type < NUM_HTTP_HEADERS; content_type++) {
+      /* Have we found a matching extension? */
+      if (!lwip_stricmp(g_psHTTPHeaders[content_type].extension, ext)) {
+        break;
+      }
+    }
+  } else {
+    content_type = NUM_HTTP_HEADERS;
+  }
+
+  /* Reinstate the parameter marker if there was one in the original URI. */
+  if (vars) {
+    *vars = '?';
+  }
+
+#if LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI
+  /* Does the URL passed have any file extension?  If not, we assume it
+     is a special-case URL used for control state notification and we do
+     not send any HTTP headers with the response. */
+  if (!ext) {
+    /* Force the header index to a value indicating that all headers
+       have already been sent. */
+    hs->hdr_index = NUM_FILE_HDR_STRINGS;
+    return;
+  }
+#endif /* LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI */
+  /* Did we find a matching extension? */
+  if (content_type < NUM_HTTP_HEADERS) {
+    /* yes, store it */
+    hs->hdrs[HDR_STRINGS_IDX_CONTENT_TYPE] = g_psHTTPHeaders[content_type].content_type;
+  } else if (!ext) {
+    /* no, no extension found -> use binary transfer to prevent the browser adding '.txt' on save */
+    hs->hdrs[HDR_STRINGS_IDX_CONTENT_TYPE] = HTTP_HDR_APP;
+  } else {
+    /* No - use the default, plain text file type. */
+    hs->hdrs[HDR_STRINGS_IDX_CONTENT_TYPE] = HTTP_HDR_DEFAULT_TYPE;
+  }
+  /* Set up to send the first header string. */
+  hs->hdr_index = 0;
+  hs->hdr_pos = 0;
+}
+
+/* Add content-length header? */
+static void
+get_http_content_length(struct http_state *hs)
+{
+  u8_t add_content_len = 0;
+
+  LWIP_ASSERT("already been here?", hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEEPALIVE] == NULL);
+
+  add_content_len = 0;
+#if LWIP_HTTPD_SSI
+  if (hs->ssi == NULL) /* @todo: get maximum file length from SSI */
+#endif /* LWIP_HTTPD_SSI */
+  {
+    if ((hs->handle != NULL) && (hs->handle->flags & FS_FILE_FLAGS_HEADER_PERSISTENT)) {
+      add_content_len = 1;
+    }
+  }
+  if (add_content_len) {
+    size_t len;
+    lwip_itoa(hs->hdr_content_len, (size_t)LWIP_HTTPD_MAX_CONTENT_LEN_SIZE,
+              hs->handle->len);
+    len = strlen(hs->hdr_content_len);
+    if (len <= LWIP_HTTPD_MAX_CONTENT_LEN_SIZE - LWIP_HTTPD_MAX_CONTENT_LEN_OFFSET) {
+      SMEMCPY(&hs->hdr_content_len[len], CRLF, 3);
+      hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_NR] = hs->hdr_content_len;
+    } else {
+      add_content_len = 0;
+    }
+  }
+#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
+  if (add_content_len) {
+    hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEEPALIVE] = g_psHTTPHeaderStrings[HTTP_HDR_KEEPALIVE_LEN];
+  } else {
+    hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEEPALIVE] = g_psHTTPHeaderStrings[HTTP_HDR_CONN_CLOSE];
+    hs->keepalive = 0;
+  }
+#else /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */
+  if (add_content_len) {
+    hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEEPALIVE] = g_psHTTPHeaderStrings[HTTP_HDR_CONTENT_LENGTH];
+  }
+#endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */
+}
+
+/** Sub-function of http_send(): send dynamic headers
+ *
+ * @returns: - HTTP_NO_DATA_TO_SEND: no new data has been enqueued
+ *           - HTTP_DATA_TO_SEND_CONTINUE: continue with sending HTTP body
+ *           - HTTP_DATA_TO_SEND_BREAK: data has been enqueued, headers pending,
+ *                                      so don't send HTTP body yet
+ *           - HTTP_DATA_TO_SEND_FREED: http_state and pcb are already freed
+ */
+static u8_t
+http_send_headers(struct altcp_pcb *pcb, struct http_state *hs)
+{
+  err_t err;
+  u16_t len;
+  u8_t data_to_send = HTTP_NO_DATA_TO_SEND;
+  u16_t hdrlen, sendlen;
+
+  if (hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEEPALIVE] == NULL) {
+    /* set up "content-length" and "connection:" headers */
+    get_http_content_length(hs);
+  }
+
+  /* How much data can we send? */
+  len = altcp_sndbuf(pcb);
+  sendlen = len;
+
+  while (len && (hs->hdr_index < NUM_FILE_HDR_STRINGS) && sendlen) {
+    const void *ptr;
+    u16_t old_sendlen;
+    u8_t apiflags;
+    /* How much do we have to send from the current header? */
+    hdrlen = (u16_t)strlen(hs->hdrs[hs->hdr_index]);
+
+    /* How much of this can we send? */
+    sendlen = (len < (hdrlen - hs->hdr_pos)) ? len : (hdrlen - hs->hdr_pos);
+
+    /* Send this amount of data or as much as we can given memory
+     * constraints. */
+    ptr = (const void *)(hs->hdrs[hs->hdr_index] + hs->hdr_pos);
+    old_sendlen = sendlen;
+    apiflags = HTTP_IS_HDR_VOLATILE(hs, ptr);
+    if (hs->hdr_index == HDR_STRINGS_IDX_CONTENT_LEN_NR) {
+      /* content-length is always volatile */
+      apiflags |= TCP_WRITE_FLAG_COPY;
+    }
+    if (hs->hdr_index < NUM_FILE_HDR_STRINGS - 1) {
+      apiflags |= TCP_WRITE_FLAG_MORE;
+    }
+    err = http_write(pcb, ptr, &sendlen, apiflags);
+    if ((err == ERR_OK) && (old_sendlen != sendlen)) {
+      /* Remember that we added some more data to be transmitted. */
+      data_to_send = HTTP_DATA_TO_SEND_CONTINUE;
+    } else if (err != ERR_OK) {
+      /* special case: http_write does not try to send 1 byte */
+      sendlen = 0;
+    }
+
+    /* Fix up the header position for the next time round. */
+    hs->hdr_pos += sendlen;
+    len -= sendlen;
+
+    /* Have we finished sending this string? */
+    if (hs->hdr_pos == hdrlen) {
+      /* Yes - move on to the next one */
+      hs->hdr_index++;
+      /* skip headers that are NULL (not all headers are required) */
+      while ((hs->hdr_index < NUM_FILE_HDR_STRINGS) &&
+             (hs->hdrs[hs->hdr_index] == NULL)) {
+        hs->hdr_index++;
+      }
+      hs->hdr_pos = 0;
+    }
+  }
+
+  if ((hs->hdr_index >= NUM_FILE_HDR_STRINGS) && (hs->file == NULL)) {
+    /* When we are at the end of the headers, check for data to send
+     * instead of waiting for ACK from remote side to continue
+     * (which would happen when sending files from async read). */
+    if (http_check_eof(pcb, hs)) {
+      data_to_send = HTTP_DATA_TO_SEND_BREAK;
+    } else {
+      /* At this point, for non-keepalive connections, hs is deallocated an
+         pcb is closed. */
+      return HTTP_DATA_TO_SEND_FREED;
+    }
+  }
+  /* If we get here and there are still header bytes to send, we send
+   * the header information we just wrote immediately. If there are no
+   * more headers to send, but we do have file data to send, drop through
+   * to try to send some file data too. */
+  if ((hs->hdr_index < NUM_FILE_HDR_STRINGS) || !hs->file) {
+    LWIP_DEBUGF(HTTPD_DEBUG, ("tcp_output\n"));
+    return HTTP_DATA_TO_SEND_BREAK;
+  }
+  return data_to_send;
+}
+#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
+
+/** Sub-function of http_send(): end-of-file (or block) is reached,
+ * either close the file or read the next block (if supported).
+ *
+ * @returns: 0 if the file is finished or no data has been read
+ *           1 if the file is not finished and data has been read
+ */
+static u8_t
+http_check_eof(struct altcp_pcb *pcb, struct http_state *hs)
+{
+  int bytes_left;
+#if LWIP_HTTPD_DYNAMIC_FILE_READ
+  int count;
+#ifdef HTTPD_MAX_WRITE_LEN
+  int max_write_len;
+#endif /* HTTPD_MAX_WRITE_LEN */
+#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */
+
+  /* Do we have a valid file handle? */
+  if (hs->handle == NULL) {
+    /* No - close the connection. */
+    http_eof(pcb, hs);
+    return 0;
+  }
+  bytes_left = fs_bytes_left(hs->handle);
+  if (bytes_left <= 0) {
+    /* We reached the end of the file so this request is done. */
+    LWIP_DEBUGF(HTTPD_DEBUG, ("End of file.\n"));
+    http_eof(pcb, hs);
+    return 0;
+  }
+#if LWIP_HTTPD_DYNAMIC_FILE_READ
+  /* Do we already have a send buffer allocated? */
+  if (hs->buf) {
+    /* Yes - get the length of the buffer */
+    count = LWIP_MIN(hs->buf_len, bytes_left);
+  } else {
+    /* We don't have a send buffer so allocate one now */
+    count = altcp_sndbuf(pcb);
+    if (bytes_left < count) {
+      count = bytes_left;
+    }
+#ifdef HTTPD_MAX_WRITE_LEN
+    /* Additional limitation: e.g. don't enqueue more than 2*mss at once */
+    max_write_len = HTTPD_MAX_WRITE_LEN(pcb);
+    if (count > max_write_len) {
+      count = max_write_len;
+    }
+#endif /* HTTPD_MAX_WRITE_LEN */
+    do {
+      hs->buf = (char *)mem_malloc((mem_size_t)count);
+      if (hs->buf != NULL) {
+        hs->buf_len = count;
+        break;
+      }
+      count = count / 2;
+    } while (count > 100);
+
+    /* Did we get a send buffer? If not, return immediately. */
+    if (hs->buf == NULL) {
+      LWIP_DEBUGF(HTTPD_DEBUG, ("No buff\n"));
+      return 0;
+    }
+  }
+
+  /* Read a block of data from the file. */
+  LWIP_DEBUGF(HTTPD_DEBUG, ("Trying to read %d bytes.\n", count));
+
+#if LWIP_HTTPD_FS_ASYNC_READ
+  count = fs_read_async(hs->handle, hs->buf, count, http_continue, hs);
+#else /* LWIP_HTTPD_FS_ASYNC_READ */
+  count = fs_read(hs->handle, hs->buf, count);
+#endif /* LWIP_HTTPD_FS_ASYNC_READ */
+  if (count < 0) {
+    if (count == FS_READ_DELAYED) {
+      /* Delayed read, wait for FS to unblock us */
+      return 0;
+    }
+    /* We reached the end of the file so this request is done.
+     * @todo: close here for HTTP/1.1 when reading file fails */
+    LWIP_DEBUGF(HTTPD_DEBUG, ("End of file.\n"));
+    http_eof(pcb, hs);
+    return 0;
+  }
+
+  /* Set up to send the block of data we just read */
+  LWIP_DEBUGF(HTTPD_DEBUG, ("Read %d bytes.\n", count));
+  hs->left = count;
+  hs->file = hs->buf;
+#if LWIP_HTTPD_SSI
+  if (hs->ssi) {
+    hs->ssi->parse_left = count;
+    hs->ssi->parsed = hs->buf;
+  }
+#endif /* LWIP_HTTPD_SSI */
+#else /* LWIP_HTTPD_DYNAMIC_FILE_READ */
+  LWIP_ASSERT("SSI and DYNAMIC_HEADERS turned off but eof not reached", 0);
+#endif /* LWIP_HTTPD_SSI || LWIP_HTTPD_DYNAMIC_HEADERS */
+  return 1;
+}
+
+/** Sub-function of http_send(): This is the normal send-routine for non-ssi files
+ *
+ * @returns: - 1: data has been written (so call tcp_ouput)
+ *           - 0: no data has been written (no need to call tcp_output)
+ */
+static u8_t
+http_send_data_nonssi(struct altcp_pcb *pcb, struct http_state *hs)
+{
+  err_t err;
+  u16_t len;
+  u8_t data_to_send = 0;
+
+  /* We are not processing an SHTML file so no tag checking is necessary.
+   * Just send the data as we received it from the file. */
+  len = (u16_t)LWIP_MIN(hs->left, 0xffff);
+
+  err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs));
+  if (err == ERR_OK) {
+    data_to_send = 1;
+    hs->file += len;
+    hs->left -= len;
+  }
+
+  return data_to_send;
+}
+
+#if LWIP_HTTPD_SSI
+/** Sub-function of http_send(): This is the send-routine for ssi files
+ *
+ * @returns: - 1: data has been written (so call tcp_ouput)
+ *           - 0: no data has been written (no need to call tcp_output)
+ */
+static u8_t
+http_send_data_ssi(struct altcp_pcb *pcb, struct http_state *hs)
+{
+  err_t err = ERR_OK;
+  u16_t len;
+  u8_t data_to_send = 0;
+  u8_t tag_type;
+
+  struct http_ssi_state *ssi = hs->ssi;
+  LWIP_ASSERT("ssi != NULL", ssi != NULL);
+  /* We are processing an SHTML file so need to scan for tags and replace
+   * them with insert strings. We need to be careful here since a tag may
+   * straddle the boundary of two blocks read from the file and we may also
+   * have to split the insert string between two tcp_write operations. */
+
+  /* How much data could we send? */
+  len = altcp_sndbuf(pcb);
+
+  /* Do we have remaining data to send before parsing more? */
+  if (ssi->parsed > hs->file) {
+    len = (u16_t)LWIP_MIN(ssi->parsed - hs->file, 0xffff);
+
+    err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs));
+    if (err == ERR_OK) {
+      data_to_send = 1;
+      hs->file += len;
+      hs->left -= len;
+    }
+
+    /* If the send buffer is full, return now. */
+    if (altcp_sndbuf(pcb) == 0) {
+      return data_to_send;
+    }
+  }
+
+  LWIP_DEBUGF(HTTPD_DEBUG, ("State %d, %d left\n", ssi->tag_state, (int)ssi->parse_left));
+
+  /* We have sent all the data that was already parsed so continue parsing
+   * the buffer contents looking for SSI tags. */
+  while (((ssi->tag_state == TAG_SENDING) || ssi->parse_left) && (err == ERR_OK)) {
+    if (len == 0) {
+      return data_to_send;
+    }
+    switch (ssi->tag_state) {
+      case TAG_NONE:
+        /* We are not currently processing an SSI tag so scan for the
+         * start of the lead-in marker. */
+        for (tag_type = 0; tag_type < LWIP_ARRAYSIZE(http_ssi_tag_desc); tag_type++) {
+          if (*ssi->parsed == http_ssi_tag_desc[tag_type].lead_in[0]) {
+            /* We found what could be the lead-in for a new tag so change
+             * state appropriately. */
+            ssi->tag_type = tag_type;
+            ssi->tag_state = TAG_LEADIN;
+            ssi->tag_index = 1;
+  #if !LWIP_HTTPD_SSI_INCLUDE_TAG
+            ssi->tag_started = ssi->parsed;
+  #endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG */
+            break;
+          }
+        }
+
+        /* Move on to the next character in the buffer */
+        ssi->parse_left--;
+        ssi->parsed++;
+        break;
+
+      case TAG_LEADIN:
+        /* We are processing the lead-in marker, looking for the start of
+         * the tag name. */
+
+        /* Have we reached the end of the leadin? */
+        if (http_ssi_tag_desc[ssi->tag_type].lead_in[ssi->tag_index] == 0) {
+          ssi->tag_index = 0;
+          ssi->tag_state = TAG_FOUND;
+        } else {
+          /* Have we found the next character we expect for the tag leadin? */
+          if (*ssi->parsed == http_ssi_tag_desc[ssi->tag_type].lead_in[ssi->tag_index]) {
+            /* Yes - move to the next one unless we have found the complete
+             * leadin, in which case we start looking for the tag itself */
+            ssi->tag_index++;
+          } else {
+            /* We found an unexpected character so this is not a tag. Move
+             * back to idle state. */
+            ssi->tag_state = TAG_NONE;
+          }
+
+          /* Move on to the next character in the buffer */
+          ssi->parse_left--;
+          ssi->parsed++;
+        }
+        break;
+
+      case TAG_FOUND:
+        /* We are reading the tag name, looking for the start of the
+         * lead-out marker and removing any whitespace found. */
+
+        /* Remove leading whitespace between the tag leading and the first
+         * tag name character. */
+        if ((ssi->tag_index == 0) && ((*ssi->parsed == ' ') ||
+                                      (*ssi->parsed == '\t') || (*ssi->parsed == '\n') ||
+                                      (*ssi->parsed == '\r'))) {
+          /* Move on to the next character in the buffer */
+          ssi->parse_left--;
+          ssi->parsed++;
+          break;
+        }
+
+        /* Have we found the end of the tag name? This is signalled by
+         * us finding the first leadout character or whitespace */
+        if ((*ssi->parsed == http_ssi_tag_desc[ssi->tag_type].lead_out[0]) ||
+            (*ssi->parsed == ' ')  || (*ssi->parsed == '\t') ||
+            (*ssi->parsed == '\n') || (*ssi->parsed == '\r')) {
+
+          if (ssi->tag_index == 0) {
+            /* We read a zero length tag so ignore it. */
+            ssi->tag_state = TAG_NONE;
+          } else {
+            /* We read a non-empty tag so go ahead and look for the
+             * leadout string. */
+            ssi->tag_state = TAG_LEADOUT;
+            LWIP_ASSERT("ssi->tag_index <= 0xff", ssi->tag_index <= 0xff);
+            ssi->tag_name_len = (u8_t)ssi->tag_index;
+            ssi->tag_name[ssi->tag_index] = '\0';
+            if (*ssi->parsed == http_ssi_tag_desc[ssi->tag_type].lead_out[0]) {
+              ssi->tag_index = 1;
+            } else {
+              ssi->tag_index = 0;
+            }
+          }
+        } else {
+          /* This character is part of the tag name so save it */
+          if (ssi->tag_index < LWIP_HTTPD_MAX_TAG_NAME_LEN) {
+            ssi->tag_name[ssi->tag_index++] = *ssi->parsed;
+          } else {
+            /* The tag was too long so ignore it. */
+            ssi->tag_state = TAG_NONE;
+          }
+        }
+
+        /* Move on to the next character in the buffer */
+        ssi->parse_left--;
+        ssi->parsed++;
+
+        break;
+
+      /* We are looking for the end of the lead-out marker. */
+      case TAG_LEADOUT:
+        /* Remove leading whitespace between the tag leading and the first
+         * tag leadout character. */
+        if ((ssi->tag_index == 0) && ((*ssi->parsed == ' ') ||
+                                      (*ssi->parsed == '\t') || (*ssi->parsed == '\n') ||
+                                      (*ssi->parsed == '\r'))) {
+          /* Move on to the next character in the buffer */
+          ssi->parse_left--;
+          ssi->parsed++;
+          break;
+        }
+
+        /* Have we found the next character we expect for the tag leadout? */
+        if (*ssi->parsed == http_ssi_tag_desc[ssi->tag_type].lead_out[ssi->tag_index]) {
+          /* Yes - move to the next one unless we have found the complete
+           * leadout, in which case we need to call the client to process
+           * the tag. */
+
+          /* Move on to the next character in the buffer */
+          ssi->parse_left--;
+          ssi->parsed++;
+          ssi->tag_index++;
+
+          if (http_ssi_tag_desc[ssi->tag_type].lead_out[ssi->tag_index] == 0) {
+            /* Call the client to ask for the insert string for the
+             * tag we just found. */
+#if LWIP_HTTPD_SSI_MULTIPART
+            ssi->tag_part = 0; /* start with tag part 0 */
+#endif /* LWIP_HTTPD_SSI_MULTIPART */
+            get_tag_insert(hs);
+
+            /* Next time through, we are going to be sending data
+             * immediately, either the end of the block we start
+             * sending here or the insert string. */
+            ssi->tag_index = 0;
+            ssi->tag_state = TAG_SENDING;
+            ssi->tag_end = ssi->parsed;
+#if !LWIP_HTTPD_SSI_INCLUDE_TAG
+            ssi->parsed = ssi->tag_started;
+#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/
+
+            /* If there is any unsent data in the buffer prior to the
+             * tag, we need to send it now. */
+            if (ssi->tag_end > hs->file) {
+              /* How much of the data can we send? */
+#if LWIP_HTTPD_SSI_INCLUDE_TAG
+              len = (u16_t)LWIP_MIN(ssi->tag_end - hs->file, 0xffff);
+#else /* LWIP_HTTPD_SSI_INCLUDE_TAG*/
+              /* we would include the tag in sending */
+              len = (u16_t)LWIP_MIN(ssi->tag_started - hs->file, 0xffff);
+#endif /* LWIP_HTTPD_SSI_INCLUDE_TAG*/
+
+              err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs));
+              if (err == ERR_OK) {
+                data_to_send = 1;
+#if !LWIP_HTTPD_SSI_INCLUDE_TAG
+                if (ssi->tag_started <= hs->file) {
+                  /* pretend to have sent the tag, too */
+                  len += (u16_t)(ssi->tag_end - ssi->tag_started);
+                }
+#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/
+                hs->file += len;
+                hs->left -= len;
+              }
+            }
+          }
+        } else {
+          /* We found an unexpected character so this is not a tag. Move
+           * back to idle state. */
+          ssi->parse_left--;
+          ssi->parsed++;
+          ssi->tag_state = TAG_NONE;
+        }
+        break;
+
+      /*
+       * We have found a valid tag and are in the process of sending
+       * data as a result of that discovery. We send either remaining data
+       * from the file prior to the insert point or the insert string itself.
+       */
+      case TAG_SENDING:
+        /* Do we have any remaining file data to send from the buffer prior
+         * to the tag? */
+        if (ssi->tag_end > hs->file) {
+          /* How much of the data can we send? */
+#if LWIP_HTTPD_SSI_INCLUDE_TAG
+          len = (u16_t)LWIP_MIN(ssi->tag_end - hs->file, 0xffff);
+#else /* LWIP_HTTPD_SSI_INCLUDE_TAG*/
+          LWIP_ASSERT("hs->started >= hs->file", ssi->tag_started >= hs->file);
+          /* we would include the tag in sending */
+          len = (u16_t)LWIP_MIN(ssi->tag_started - hs->file, 0xffff);
+#endif /* LWIP_HTTPD_SSI_INCLUDE_TAG*/
+          if (len != 0) {
+            err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs));
+          } else {
+            err = ERR_OK;
+          }
+          if (err == ERR_OK) {
+            data_to_send = 1;
+#if !LWIP_HTTPD_SSI_INCLUDE_TAG
+            if (ssi->tag_started <= hs->file) {
+              /* pretend to have sent the tag, too */
+              len += (u16_t)(ssi->tag_end - ssi->tag_started);
+            }
+#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/
+            hs->file += len;
+            hs->left -= len;
+          }
+        } else {
+#if LWIP_HTTPD_SSI_MULTIPART
+          if (ssi->tag_index >= ssi->tag_insert_len) {
+            /* Did the last SSIHandler have more to send? */
+            if (ssi->tag_part != HTTPD_LAST_TAG_PART) {
+              /* If so, call it again */
+              ssi->tag_index = 0;
+              get_tag_insert(hs);
+            }
+          }
+#endif /* LWIP_HTTPD_SSI_MULTIPART */
+
+          /* Do we still have insert data left to send? */
+          if (ssi->tag_index < ssi->tag_insert_len) {
+            /* We are sending the insert string itself. How much of the
+             * insert can we send? */
+            len = (ssi->tag_insert_len - ssi->tag_index);
+
+            /* Note that we set the copy flag here since we only have a
+             * single tag insert buffer per connection. If we don't do
+             * this, insert corruption can occur if more than one insert
+             * is processed before we call tcp_output. */
+            err = http_write(pcb, &(ssi->tag_insert[ssi->tag_index]), &len,
+                             HTTP_IS_TAG_VOLATILE(hs));
+            if (err == ERR_OK) {
+              data_to_send = 1;
+              ssi->tag_index += len;
+              /* Don't return here: keep on sending data */
+            }
+          } else {
+#if LWIP_HTTPD_SSI_MULTIPART
+            if (ssi->tag_part == HTTPD_LAST_TAG_PART)
+#endif /* LWIP_HTTPD_SSI_MULTIPART */
+            {
+              /* We have sent all the insert data so go back to looking for
+               * a new tag. */
+              LWIP_DEBUGF(HTTPD_DEBUG, ("Everything sent.\n"));
+              ssi->tag_index = 0;
+              ssi->tag_state = TAG_NONE;
+#if !LWIP_HTTPD_SSI_INCLUDE_TAG
+              ssi->parsed = ssi->tag_end;
+#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/
+            }
+          }
+          break;
+        default:
+          break;
+        }
+    }
+  }
+
+  /* If we drop out of the end of the for loop, this implies we must have
+   * file data to send so send it now. In TAG_SENDING state, we've already
+   * handled this so skip the send if that's the case. */
+  if ((ssi->tag_state != TAG_SENDING) && (ssi->parsed > hs->file)) {
+#if LWIP_HTTPD_DYNAMIC_FILE_READ && !LWIP_HTTPD_SSI_INCLUDE_TAG
+    if ((ssi->tag_state != TAG_NONE) && (ssi->tag_started > ssi->tag_end)) {
+      /* If we found tag on the edge of the read buffer: just throw away the first part
+         (we have copied/saved everything required for parsing on later). */
+      len = (u16_t)(ssi->tag_started - hs->file);
+      hs->left -= (ssi->parsed - ssi->tag_started);
+      ssi->parsed = ssi->tag_started;
+      ssi->tag_started = hs->buf;
+    } else
+#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ && !LWIP_HTTPD_SSI_INCLUDE_TAG */
+    {
+      len = (u16_t)LWIP_MIN(ssi->parsed - hs->file, 0xffff);
+    }
+
+    err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs));
+    if (err == ERR_OK) {
+      data_to_send = 1;
+      hs->file += len;
+      hs->left -= len;
+    }
+  }
+  return data_to_send;
+}
+#endif /* LWIP_HTTPD_SSI */
+
+/**
+ * Try to send more data on this pcb.
+ *
+ * @param pcb the pcb to send data
+ * @param hs connection state
+ */
+static u8_t
+http_send(struct altcp_pcb *pcb, struct http_state *hs)
+{
+  u8_t data_to_send = HTTP_NO_DATA_TO_SEND;
+
+  LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_send: pcb=%p hs=%p left=%d\n", (void *)pcb,
+              (void *)hs, hs != NULL ? (int)hs->left : 0));
+
+#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND
+  if (hs->unrecved_bytes != 0) {
+    return 0;
+  }
+#endif /* LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND */
+
+  /* If we were passed a NULL state structure pointer, ignore the call. */
+  if (hs == NULL) {
+    return 0;
+  }
+
+#if LWIP_HTTPD_FS_ASYNC_READ
+  /* Check if we are allowed to read from this file.
+     (e.g. SSI might want to delay sending until data is available) */
+  if (!fs_is_file_ready(hs->handle, http_continue, hs)) {
+    return 0;
+  }
+#endif /* LWIP_HTTPD_FS_ASYNC_READ */
+
+#if LWIP_HTTPD_DYNAMIC_HEADERS
+  /* Do we have any more header data to send for this file? */
+  if (hs->hdr_index < NUM_FILE_HDR_STRINGS) {
+    data_to_send = http_send_headers(pcb, hs);
+    if ((data_to_send == HTTP_DATA_TO_SEND_FREED) ||
+        ((data_to_send != HTTP_DATA_TO_SEND_CONTINUE) &&
+         (hs->hdr_index < NUM_FILE_HDR_STRINGS))) {
+      return data_to_send;
+    }
+  }
+#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
+
+  /* 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) {
+    if (!http_check_eof(pcb, hs)) {
+      return 0;
+    }
+  }
+
+#if LWIP_HTTPD_SSI
+  if (hs->ssi) {
+    data_to_send = http_send_data_ssi(pcb, hs);
+  } else
+#endif /* LWIP_HTTPD_SSI */
+  {
+    data_to_send = http_send_data_nonssi(pcb, hs);
+  }
+
+  if ((hs->left == 0) && (fs_bytes_left(hs->handle) <= 0)) {
+    /* We reached the end of the file so this request is done.
+     * This adds the FIN flag right into the last data segment. */
+    LWIP_DEBUGF(HTTPD_DEBUG, ("End of file.\n"));
+    http_eof(pcb, hs);
+    return 0;
+  }
+  LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("send_data end.\n"));
+  return data_to_send;
+}
+
+#if LWIP_HTTPD_SUPPORT_EXTSTATUS
+/** Initialize a http connection with a file to send for an error message
+ *
+ * @param hs http connection state
+ * @param error_nr HTTP error number
+ * @return ERR_OK if file was found and hs has been initialized correctly
+ *         another err_t otherwise
+ */
+static err_t
+http_find_error_file(struct http_state *hs, u16_t error_nr)
+{
+  const char *uri, *uri1, *uri2, *uri3;
+
+  if (error_nr == 501) {
+    uri1 = "/501.html";
+    uri2 = "/501.htm";
+    uri3 = "/501.shtml";
+  } else {
+    /* 400 (bad request is the default) */
+    uri1 = "/400.html";
+    uri2 = "/400.htm";
+    uri3 = "/400.shtml";
+  }
+  if (fs_open(&hs->file_handle, uri1) == ERR_OK) {
+    uri = uri1;
+  } else if (fs_open(&hs->file_handle, uri2) == ERR_OK) {
+    uri = uri2;
+  } else if (fs_open(&hs->file_handle, uri3) == ERR_OK) {
+    uri = uri3;
+  } else {
+    LWIP_DEBUGF(HTTPD_DEBUG, ("Error page for error %"U16_F" not found\n",
+                              error_nr));
+    return ERR_ARG;
+  }
+  return http_init_file(hs, &hs->file_handle, 0, uri, 0, NULL);
+}
+#else /* LWIP_HTTPD_SUPPORT_EXTSTATUS */
+#define http_find_error_file(hs, error_nr) ERR_ARG
+#endif /* LWIP_HTTPD_SUPPORT_EXTSTATUS */
+
+/**
+ * Get the file struct for a 404 error page.
+ * Tries some file names and returns NULL if none found.
+ *
+ * @param uri pointer that receives the actual file name URI
+ * @return file struct for the error page or NULL no matching file was found
+ */
+static struct fs_file *
+http_get_404_file(struct http_state *hs, const char **uri)
+{
+  err_t err;
+
+  *uri = "/404.html";
+  err = fs_open(&hs->file_handle, *uri);
+  if (err != ERR_OK) {
+    /* 404.html doesn't exist. Try 404.htm instead. */
+    *uri = "/404.htm";
+    err = fs_open(&hs->file_handle, *uri);
+    if (err != ERR_OK) {
+      /* 404.htm doesn't exist either. Try 404.shtml instead. */
+      *uri = "/404.shtml";
+      err = fs_open(&hs->file_handle, *uri);
+      if (err != ERR_OK) {
+        /* 404.htm doesn't exist either. Indicate to the caller that it should
+         * send back a default 404 page.
+         */
+        *uri = NULL;
+        return NULL;
+      }
+    }
+  }
+
+  return &hs->file_handle;
+}
+
+#if LWIP_HTTPD_SUPPORT_POST
+static err_t
+http_handle_post_finished(struct http_state *hs)
+{
+#if LWIP_HTTPD_POST_MANUAL_WND
+  /* Prevent multiple calls to httpd_post_finished, since it might have already
+     been called before from httpd_post_data_recved(). */
+  if (hs->post_finished) {
+    return ERR_OK;
+  }
+  hs->post_finished = 1;
+#endif /* LWIP_HTTPD_POST_MANUAL_WND */
+  /* application error or POST finished */
+  /* NULL-terminate the buffer */
+  http_uri_buf[0] = 0;
+  httpd_post_finished(hs, http_uri_buf, LWIP_HTTPD_URI_BUF_LEN);
+  return http_find_file(hs, http_uri_buf, 0);
+}
+
+/** Pass received POST body data to the application and correctly handle
+ * returning a response document or closing the connection.
+ * ATTENTION: The application is responsible for the pbuf now, so don't free it!
+ *
+ * @param hs http connection state
+ * @param p pbuf to pass to the application
+ * @return ERR_OK if passed successfully, another err_t if the response file
+ *         hasn't been found (after POST finished)
+ */
+static err_t
+http_post_rxpbuf(struct http_state *hs, struct pbuf *p)
+{
+  err_t err;
+
+  if (p != NULL) {
+    /* adjust remaining Content-Length */
+    if (hs->post_content_len_left < p->tot_len) {
+      hs->post_content_len_left = 0;
+    } else {
+      hs->post_content_len_left -= p->tot_len;
+    }
+  }
+#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND
+  /* prevent connection being closed if httpd_post_data_recved() is called nested */
+  hs->unrecved_bytes++;
+#endif
+  if (p != NULL) {
+    err = httpd_post_receive_data(hs, p);
+  } else {
+    err = ERR_OK;
+  }
+#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND
+  hs->unrecved_bytes--;
+#endif
+  if (err != ERR_OK) {
+    /* Ignore remaining content in case of application error */
+    hs->post_content_len_left = 0;
+  }
+  if (hs->post_content_len_left == 0) {
+#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND
+    if (hs->unrecved_bytes != 0) {
+      return ERR_OK;
+    }
+#endif /* LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND */
+    /* application error or POST finished */
+    return http_handle_post_finished(hs);
+  }
+
+  return ERR_OK;
+}
+
+/** Handle a post request. Called from http_parse_request when method 'POST'
+ * is found.
+ *
+ * @param p The input pbuf (containing the POST header and body).
+ * @param hs The http connection state.
+ * @param data HTTP request (header and part of body) from input pbuf(s).
+ * @param data_len Size of 'data'.
+ * @param uri The HTTP URI parsed from input pbuf(s).
+ * @param uri_end Pointer to the end of 'uri' (here, the rest of the HTTP
+ *                header starts).
+ * @return ERR_OK: POST correctly parsed and accepted by the application.
+ *         ERR_INPROGRESS: POST not completely parsed (no error yet)
+ *         another err_t: Error parsing POST or denied by the application
+ */
+static err_t
+http_post_request(struct pbuf *inp, struct http_state *hs,
+                  char *data, u16_t data_len, char *uri, char *uri_end)
+{
+  err_t err;
+  /* search for end-of-header (first double-CRLF) */
+  char *crlfcrlf = lwip_strnstr(uri_end + 1, CRLF CRLF, data_len - (uri_end + 1 - data));
+
+  if (crlfcrlf != NULL) {
+    /* search for "Content-Length: " */
+#define HTTP_HDR_CONTENT_LEN                "Content-Length: "
+#define HTTP_HDR_CONTENT_LEN_LEN            16
+#define HTTP_HDR_CONTENT_LEN_DIGIT_MAX_LEN  10
+    char *scontent_len = lwip_strnstr(uri_end + 1, HTTP_HDR_CONTENT_LEN, crlfcrlf - (uri_end + 1));
+    if (scontent_len != NULL) {
+      char *scontent_len_end = lwip_strnstr(scontent_len + HTTP_HDR_CONTENT_LEN_LEN, CRLF, HTTP_HDR_CONTENT_LEN_DIGIT_MAX_LEN);
+      if (scontent_len_end != NULL) {
+        int content_len;
+        char *content_len_num = scontent_len + HTTP_HDR_CONTENT_LEN_LEN;
+        content_len = atoi(content_len_num);
+        if (content_len == 0) {
+          /* if atoi returns 0 on error, fix this */
+          if ((content_len_num[0] != '0') || (content_len_num[1] != '\r')) {
+            content_len = -1;
+          }
+        }
+        if (content_len >= 0) {
+          /* adjust length of HTTP header passed to application */
+          const char *hdr_start_after_uri = uri_end + 1;
+          u16_t hdr_len = (u16_t)LWIP_MIN(data_len, crlfcrlf + 4 - data);
+          u16_t hdr_data_len = (u16_t)LWIP_MIN(data_len, crlfcrlf + 4 - hdr_start_after_uri);
+          u8_t post_auto_wnd = 1;
+          http_uri_buf[0] = 0;
+          /* trim http header */
+          *crlfcrlf = 0;
+          err = httpd_post_begin(hs, uri, hdr_start_after_uri, hdr_data_len, content_len,
+                                 http_uri_buf, LWIP_HTTPD_URI_BUF_LEN, &post_auto_wnd);
+          if (err == ERR_OK) {
+            /* try to pass in data of the first pbuf(s) */
+            struct pbuf *q = inp;
+            u16_t start_offset = hdr_len;
+#if LWIP_HTTPD_POST_MANUAL_WND
+            hs->no_auto_wnd = !post_auto_wnd;
+#endif /* LWIP_HTTPD_POST_MANUAL_WND */
+            /* set the Content-Length to be received for this POST */
+            hs->post_content_len_left = (u32_t)content_len;
+
+            /* get to the pbuf where the body starts */
+            while ((q != NULL) && (q->len <= start_offset)) {
+              start_offset -= q->len;
+              q = q->next;
+            }
+            if (q != NULL) {
+              /* hide the remaining HTTP header */
+              pbuf_remove_header(q, start_offset);
+#if LWIP_HTTPD_POST_MANUAL_WND
+              if (!post_auto_wnd) {
+                /* already tcp_recved() this data... */
+                hs->unrecved_bytes = q->tot_len;
+              }
+#endif /* LWIP_HTTPD_POST_MANUAL_WND */
+              pbuf_ref(q);
+              return http_post_rxpbuf(hs, q);
+            } else if (hs->post_content_len_left == 0) {
+              q = pbuf_alloc(PBUF_RAW, 0, PBUF_REF);
+              return http_post_rxpbuf(hs, q);
+            } else {
+              return ERR_OK;
+            }
+          } else {
+            /* return file passed from application */
+            return http_find_file(hs, http_uri_buf, 0);
+          }
+        } else {
+          LWIP_DEBUGF(HTTPD_DEBUG, ("POST received invalid Content-Length: %s\n",
+                                    content_len_num));
+          return ERR_ARG;
+        }
+      }
+    }
+    /* If we come here, headers are fully received (double-crlf), but Content-Length
+       was not included. Since this is currently the only supported method, we have
+       to fail in this case! */
+    LWIP_DEBUGF(HTTPD_DEBUG, ("Error when parsing Content-Length\n"));
+    return ERR_ARG;
+  }
+  /* if we come here, the POST is incomplete */
+#if LWIP_HTTPD_SUPPORT_REQUESTLIST
+  return ERR_INPROGRESS;
+#else /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
+  return ERR_ARG;
+#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
+}
+
+#if LWIP_HTTPD_POST_MANUAL_WND
+/**
+ * @ingroup httpd
+ * A POST implementation can call this function to update the TCP window.
+ * This can be used to throttle data reception (e.g. when received data is
+ * programmed to flash and data is received faster than programmed).
+ *
+ * @param connection A connection handle passed to httpd_post_begin for which
+ *        httpd_post_finished has *NOT* been called yet!
+ * @param recved_len Length of data received (for window update)
+ */
+void httpd_post_data_recved(void *connection, u16_t recved_len)
+{
+  struct http_state *hs = (struct http_state *)connection;
+  if (hs != NULL) {
+    if (hs->no_auto_wnd) {
+      u16_t len = recved_len;
+      if (hs->unrecved_bytes >= recved_len) {
+        hs->unrecved_bytes -= recved_len;
+      } else {
+        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_LEVEL_WARNING, ("httpd_post_data_recved: recved_len too big\n"));
+        len = (u16_t)hs->unrecved_bytes;
+        hs->unrecved_bytes = 0;
+      }
+      if (hs->pcb != NULL) {
+        if (len != 0) {
+          altcp_recved(hs->pcb, len);
+        }
+        if ((hs->post_content_len_left == 0) && (hs->unrecved_bytes == 0)) {
+          /* finished handling POST */
+          http_handle_post_finished(hs);
+          http_send(hs->pcb, hs);
+        }
+      }
+    }
+  }
+}
+#endif /* LWIP_HTTPD_POST_MANUAL_WND */
+
+#endif /* LWIP_HTTPD_SUPPORT_POST */
+
+#if LWIP_HTTPD_FS_ASYNC_READ
+/** Try to send more data if file has been blocked before
+ * This is a callback function passed to fs_read_async().
+ */
+static void
+http_continue(void *connection)
+{
+  struct http_state *hs = (struct http_state *)connection;
+  LWIP_ASSERT_CORE_LOCKED();
+  if (hs && (hs->pcb) && (hs->handle)) {
+    LWIP_ASSERT("hs->pcb != NULL", hs->pcb != NULL);
+    LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("httpd_continue: try to send more data\n"));
+    if (http_send(hs->pcb, hs)) {
+      /* If we wrote anything to be sent, go ahead and send it now. */
+      LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("tcp_output\n"));
+      altcp_output(hs->pcb);
+    }
+  }
+}
+#endif /* LWIP_HTTPD_FS_ASYNC_READ */
+
+/**
+ * When data has been received in the correct state, try to parse it
+ * as a HTTP request.
+ *
+ * @param inp the received pbuf
+ * @param hs the connection state
+ * @param pcb the altcp_pcb which received this packet
+ * @return ERR_OK if request was OK and hs has been initialized correctly
+ *         ERR_INPROGRESS if request was OK so far but not fully received
+ *         another err_t otherwise
+ */
+static err_t
+http_parse_request(struct pbuf *inp, struct http_state *hs, struct altcp_pcb *pcb)
+{
+  char *data;
+  char *crlf;
+  u16_t data_len;
+  struct pbuf *p = inp;
+#if LWIP_HTTPD_SUPPORT_REQUESTLIST
+  u16_t clen;
+#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
+#if LWIP_HTTPD_SUPPORT_POST
+  err_t err;
+#endif /* LWIP_HTTPD_SUPPORT_POST */
+
+  LWIP_UNUSED_ARG(pcb); /* only used for post */
+  LWIP_ASSERT("p != NULL", p != NULL);
+  LWIP_ASSERT("hs != NULL", hs != NULL);
+
+  if ((hs->handle != NULL) || (hs->file != NULL)) {
+    LWIP_DEBUGF(HTTPD_DEBUG, ("Received data while sending a file\n"));
+    /* already sending a file */
+    /* @todo: abort? */
+    return ERR_USE;
+  }
+
+#if LWIP_HTTPD_SUPPORT_REQUESTLIST
+
+  LWIP_DEBUGF(HTTPD_DEBUG, ("Received %"U16_F" bytes\n", p->tot_len));
+
+  /* first check allowed characters in this pbuf? */
+
+  /* enqueue the pbuf */
+  if (hs->req == NULL) {
+    LWIP_DEBUGF(HTTPD_DEBUG, ("First pbuf\n"));
+    hs->req = p;
+  } else {
+    LWIP_DEBUGF(HTTPD_DEBUG, ("pbuf enqueued\n"));
+    pbuf_cat(hs->req, p);
+  }
+  /* increase pbuf ref counter as it is freed when we return but we want to
+     keep it on the req list */
+  pbuf_ref(p);
+
+  if (hs->req->next != NULL) {
+    data_len = LWIP_MIN(hs->req->tot_len, LWIP_HTTPD_MAX_REQ_LENGTH);
+    pbuf_copy_partial(hs->req, httpd_req_buf, data_len, 0);
+    data = httpd_req_buf;
+  } else
+#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
+  {
+    data = (char *)p->payload;
+    data_len = p->len;
+    if (p->len != p->tot_len) {
+      LWIP_DEBUGF(HTTPD_DEBUG, ("Warning: incomplete header due to chained pbufs\n"));
+    }
+  }
+
+  /* received enough data for minimal request? */
+  if (data_len >= MIN_REQ_LEN) {
+    /* wait for CRLF before parsing anything */
+    crlf = lwip_strnstr(data, CRLF, data_len);
+    if (crlf != NULL) {
+#if LWIP_HTTPD_SUPPORT_POST
+      int is_post = 0;
+#endif /* LWIP_HTTPD_SUPPORT_POST */
+      int is_09 = 0;
+      char *sp1, *sp2;
+      u16_t left_len, uri_len;
+      LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("CRLF received, parsing request\n"));
+      /* parse method */
+      if (!strncmp(data, "GET ", 4)) {
+        sp1 = data + 3;
+        /* received GET request */
+        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Received GET request\"\n"));
+#if LWIP_HTTPD_SUPPORT_POST
+      } else if (!strncmp(data, "POST ", 5)) {
+        /* store request type */
+        is_post = 1;
+        sp1 = data + 4;
+        /* received GET request */
+        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Received POST request\n"));
+#endif /* LWIP_HTTPD_SUPPORT_POST */
+      } else {
+        /* null-terminate the METHOD (pbuf is freed anyway wen returning) */
+        data[4] = 0;
+        /* unsupported method! */
+        LWIP_DEBUGF(HTTPD_DEBUG, ("Unsupported request method (not implemented): \"%s\"\n",
+                                  data));
+        return http_find_error_file(hs, 501);
+      }
+      /* if we come here, method is OK, parse URI */
+      left_len = (u16_t)(data_len - ((sp1 + 1) - data));
+      sp2 = lwip_strnstr(sp1 + 1, " ", left_len);
+#if LWIP_HTTPD_SUPPORT_V09
+      if (sp2 == NULL) {
+        /* HTTP 0.9: respond with correct protocol version */
+        sp2 = lwip_strnstr(sp1 + 1, CRLF, left_len);
+        is_09 = 1;
+#if LWIP_HTTPD_SUPPORT_POST
+        if (is_post) {
+          /* HTTP/0.9 does not support POST */
+          goto badrequest;
+        }
+#endif /* LWIP_HTTPD_SUPPORT_POST */
+      }
+#endif /* LWIP_HTTPD_SUPPORT_V09 */
+      uri_len = (u16_t)(sp2 - (sp1 + 1));
+      if ((sp2 != 0) && (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;
+#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
+          /* This is HTTP/1.0 compatible: for strict 1.1, a connection
+             would always be persistent unless "close" was specified. */
+          if (!is_09 && (lwip_strnstr(data, HTTP11_CONNECTIONKEEPALIVE, data_len) ||
+                         lwip_strnstr(data, HTTP11_CONNECTIONKEEPALIVE2, data_len))) {
+            hs->keepalive = 1;
+          } else {
+            hs->keepalive = 0;
+          }
+#endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */
+          /* null-terminate the METHOD (pbuf is freed anyway wen returning) */
+          *sp1 = 0;
+          uri[uri_len] = 0;
+          LWIP_DEBUGF(HTTPD_DEBUG, ("Received \"%s\" request for URI: \"%s\"\n",
+                                    data, uri));
+#if LWIP_HTTPD_SUPPORT_POST
+          if (is_post) {
+#if LWIP_HTTPD_SUPPORT_REQUESTLIST
+            struct pbuf *q = hs->req;
+#else /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
+            struct pbuf *q = inp;
+#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
+            err = http_post_request(q, hs, data, data_len, uri, sp2);
+            if (err != ERR_OK) {
+              /* restore header for next try */
+              *sp1 = ' ';
+              *sp2 = ' ';
+              uri[uri_len] = ' ';
+            }
+            if (err == ERR_ARG) {
+              goto badrequest;
+            }
+            return err;
+          } else
+#endif /* LWIP_HTTPD_SUPPORT_POST */
+          {
+            return http_find_file(hs, uri, is_09);
+          }
+        }
+      } else {
+        LWIP_DEBUGF(HTTPD_DEBUG, ("invalid URI\n"));
+      }
+    }
+  }
+
+#if LWIP_HTTPD_SUPPORT_REQUESTLIST
+  clen = pbuf_clen(hs->req);
+  if ((hs->req->tot_len <= LWIP_HTTPD_REQ_BUFSIZE) &&
+      (clen <= LWIP_HTTPD_REQ_QUEUELEN)) {
+    /* request not fully received (too short or CRLF is missing) */
+    return ERR_INPROGRESS;
+  } else
+#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
+  {
+#if LWIP_HTTPD_SUPPORT_POST
+badrequest:
+#endif /* LWIP_HTTPD_SUPPORT_POST */
+    LWIP_DEBUGF(HTTPD_DEBUG, ("bad request\n"));
+    /* could not parse request */
+    return http_find_error_file(hs, 400);
+  }
+}
+
+#if LWIP_HTTPD_SSI && (LWIP_HTTPD_SSI_BY_FILE_EXTENSION == 1)
+/* Check if SSI should be parsed for this file/URL
+ * (With LWIP_HTTPD_SSI_BY_FILE_EXTENSION == 2, this function can be
+ * overridden by an external implementation.)
+ *
+ * @return 1 for SSI, 0 for standard files
+ */
+static u8_t
+http_uri_is_ssi(struct fs_file *file, const char *uri)
+{
+  size_t loop;
+  u8_t tag_check = 0;
+  if (file != NULL) {
+    /* See if we have been asked for an shtml file and, if so,
+        enable tag checking. */
+    const char *ext = NULL, *sub;
+    char *param = (char *)strstr(uri, "?");
+    if (param != NULL) {
+      /* separate uri from parameters for now, set back later */
+      *param = 0;
+    }
+    sub = uri;
+    ext = uri;
+    for (sub = strstr(sub, "."); sub != NULL; sub = strstr(sub, ".")) {
+      ext = sub;
+      sub++;
+    }
+    for (loop = 0; loop < NUM_SHTML_EXTENSIONS; loop++) {
+      if (!lwip_stricmp(ext, g_pcSSIExtensions[loop])) {
+        tag_check = 1;
+        break;
+      }
+    }
+    if (param != NULL) {
+      *param = '?';
+    }
+  }
+  return tag_check;
+}
+#endif /* LWIP_HTTPD_SSI */
+
+/** Try to find the file specified by uri and, if found, initialize hs
+ * accordingly.
+ *
+ * @param hs the connection state
+ * @param uri the HTTP header URI
+ * @param is_09 1 if the request is HTTP/0.9 (no HTTP headers in response)
+ * @return ERR_OK if file was found and hs has been initialized correctly
+ *         another err_t otherwise
+ */
+static err_t
+http_find_file(struct http_state *hs, const char *uri, int is_09)
+{
+  size_t loop;
+  struct fs_file *file = NULL;
+  char *params = NULL;
+  err_t err;
+#if LWIP_HTTPD_CGI
+  int i;
+#endif /* LWIP_HTTPD_CGI */
+#if !LWIP_HTTPD_SSI
+  const
+#endif /* !LWIP_HTTPD_SSI */
+  /* By default, assume we will not be processing server-side-includes tags */
+  u8_t tag_check = 0;
+
+  /* Have we been asked for the default file (in root or a directory) ? */
+#if LWIP_HTTPD_MAX_REQUEST_URI_LEN
+  size_t uri_len = strlen(uri);
+  if ((uri_len > 0) && (uri[uri_len - 1] == '/') &&
+      ((uri != http_uri_buf) || (uri_len == 1))) {
+    size_t copy_len = LWIP_MIN(sizeof(http_uri_buf) - 1, uri_len - 1);
+    if (copy_len > 0) {
+      MEMCPY(http_uri_buf, uri, copy_len);
+      http_uri_buf[copy_len] = 0;
+    }
+#else /* LWIP_HTTPD_MAX_REQUEST_URI_LEN */
+  if ((uri[0] == '/') &&  (uri[1] == 0)) {
+#endif /* LWIP_HTTPD_MAX_REQUEST_URI_LEN */
+    /* Try each of the configured default filenames until we find one
+       that exists. */
+    for (loop = 0; loop < NUM_DEFAULT_FILENAMES; loop++) {
+      const char *file_name;
+#if LWIP_HTTPD_MAX_REQUEST_URI_LEN
+      if (copy_len > 0) {
+        size_t len_left = sizeof(http_uri_buf) - copy_len - 1;
+        if (len_left > 0) {
+          size_t name_len = strlen(httpd_default_filenames[loop].name);
+          size_t name_copy_len = LWIP_MIN(len_left, name_len);
+          MEMCPY(&http_uri_buf[copy_len], httpd_default_filenames[loop].name, name_copy_len);
+          http_uri_buf[copy_len + name_copy_len] = 0;
+        }
+        file_name = http_uri_buf;
+      } else
+#endif /* LWIP_HTTPD_MAX_REQUEST_URI_LEN */
+      {
+        file_name = httpd_default_filenames[loop].name;
+      }
+      LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Looking for %s...\n", file_name));
+      err = fs_open(&hs->file_handle, file_name);
+      if (err == ERR_OK) {
+        uri = file_name;
+        file = &hs->file_handle;
+        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Opened.\n"));
+#if LWIP_HTTPD_SSI
+        tag_check = httpd_default_filenames[loop].shtml;
+#endif /* LWIP_HTTPD_SSI */
+        break;
+      }
+    }
+  }
+  if (file == NULL) {
+    /* No - we've been asked for a specific file. */
+    /* First, isolate the base URI (without any parameters) */
+    params = (char *)strchr(uri, '?');
+    if (params != NULL) {
+      /* URI contains parameters. NULL-terminate the base URI */
+      *params = '\0';
+      params++;
+    }
+
+#if LWIP_HTTPD_CGI
+    http_cgi_paramcount = -1;
+    /* Does the base URI we have isolated correspond to a CGI handler? */
+    if (httpd_num_cgis && httpd_cgis) {
+      for (i = 0; i < httpd_num_cgis; i++) {
+        if (strcmp(uri, httpd_cgis[i].pcCGIName) == 0) {
+          /*
+           * We found a CGI that handles this URI so extract the
+           * parameters and call the handler.
+           */
+          http_cgi_paramcount = extract_uri_parameters(hs, params);
+          uri = httpd_cgis[i].pfnCGIHandler(i, http_cgi_paramcount, hs->params,
+                                         hs->param_vals);
+          break;
+        }
+      }
+    }
+#endif /* LWIP_HTTPD_CGI */
+
+    LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Opening %s\n", uri));
+
+    err = fs_open(&hs->file_handle, uri);
+    if (err == ERR_OK) {
+      file = &hs->file_handle;
+    } else {
+      file = http_get_404_file(hs, &uri);
+    }
+#if LWIP_HTTPD_SSI
+    if (file != NULL) {
+      if (file->flags & FS_FILE_FLAGS_SSI) {
+        tag_check = 1;
+      } else {
+#if LWIP_HTTPD_SSI_BY_FILE_EXTENSION
+        tag_check = http_uri_is_ssi(file, uri);
+#endif /* LWIP_HTTPD_SSI_BY_FILE_EXTENSION */
+      }
+    }
+#endif /* LWIP_HTTPD_SSI */
+  }
+  if (file == NULL) {
+    /* None of the default filenames exist so send back a 404 page */
+    file = http_get_404_file(hs, &uri);
+  }
+  return http_init_file(hs, file, is_09, uri, tag_check, params);
+}
+
+/** Initialize a http connection with a file to send (if found).
+ * Called by http_find_file and http_find_error_file.
+ *
+ * @param hs http connection state
+ * @param file file structure to send (or NULL if not found)
+ * @param is_09 1 if the request is HTTP/0.9 (no HTTP headers in response)
+ * @param uri the HTTP header URI
+ * @param tag_check enable SSI tag checking
+ * @param params != NULL if URI has parameters (separated by '?')
+ * @return ERR_OK if file was found and hs has been initialized correctly
+ *         another err_t otherwise
+ */
+static err_t
+http_init_file(struct http_state *hs, struct fs_file *file, int is_09, const char *uri,
+               u8_t tag_check, char *params)
+{
+#if !LWIP_HTTPD_SUPPORT_V09
+  LWIP_UNUSED_ARG(is_09);
+#endif
+  if (file != NULL) {
+    /* file opened, initialise struct http_state */
+#if !LWIP_HTTPD_DYNAMIC_FILE_READ
+    /* If dynamic read is disabled, file data must be in one piece and available now */
+    LWIP_ASSERT("file->data != NULL", file->data != NULL);
+#endif
+
+#if LWIP_HTTPD_SSI
+    if (tag_check) {
+      struct http_ssi_state *ssi = http_ssi_state_alloc();
+      if (ssi != NULL) {
+        ssi->tag_index = 0;
+        ssi->tag_state = TAG_NONE;
+        ssi->parsed = file->data;
+        ssi->parse_left = file->len;
+        ssi->tag_end = file->data;
+        hs->ssi = ssi;
+      }
+    }
+#else /* LWIP_HTTPD_SSI */
+    LWIP_UNUSED_ARG(tag_check);
+#endif /* LWIP_HTTPD_SSI */
+    hs->handle = file;
+#if LWIP_HTTPD_CGI_SSI
+    if (params != NULL) {
+      /* URI contains parameters, call generic CGI handler */
+      int count;
+#if LWIP_HTTPD_CGI
+      if (http_cgi_paramcount >= 0) {
+        count = http_cgi_paramcount;
+      } else
+#endif
+      {
+        count = extract_uri_parameters(hs, params);
+      }
+      httpd_cgi_handler(file, uri, count, http_cgi_params, http_cgi_param_vals
+#if defined(LWIP_HTTPD_FILE_STATE) && LWIP_HTTPD_FILE_STATE
+                        , file->state
+#endif /* LWIP_HTTPD_FILE_STATE */
+                       );
+    }
+#else /* LWIP_HTTPD_CGI_SSI */
+    LWIP_UNUSED_ARG(params);
+#endif /* LWIP_HTTPD_CGI_SSI */
+    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)) {
+      /* custom file, need to read data first (via fs_read_custom) */
+      hs->left = 0;
+    } else
+#endif /* LWIP_HTTPD_CUSTOM_FILES */
+    {
+      hs->left = (u32_t)file->len;
+    }
+    hs->retries = 0;
+#if LWIP_HTTPD_TIMING
+    hs->time_started = sys_now();
+#endif /* LWIP_HTTPD_TIMING */
+#if !LWIP_HTTPD_DYNAMIC_HEADERS
+    LWIP_ASSERT("HTTP headers not included in file system",
+                (hs->handle->flags & FS_FILE_FLAGS_HEADER_INCLUDED) != 0);
+#endif /* !LWIP_HTTPD_DYNAMIC_HEADERS */
+#if LWIP_HTTPD_SUPPORT_V09
+    if (is_09 && ((hs->handle->flags & FS_FILE_FLAGS_HEADER_INCLUDED) != 0)) {
+      /* HTTP/0.9 responses are sent without HTTP header,
+         search for the end of the header. */
+      char *file_start = lwip_strnstr(hs->file, CRLF CRLF, hs->left);
+      if (file_start != NULL) {
+        int diff = file_start + 4 - hs->file;
+        hs->file += diff;
+        hs->left -= (u32_t)diff;
+      }
+    }
+#endif /* LWIP_HTTPD_SUPPORT_V09*/
+  } else {
+    hs->handle = NULL;
+    hs->file = NULL;
+    hs->left = 0;
+    hs->retries = 0;
+  }
+#if LWIP_HTTPD_DYNAMIC_HEADERS
+  /* Determine the HTTP headers to send based on the file extension of
+   * the requested URI. */
+  if ((hs->handle == NULL) || ((hs->handle->flags & FS_FILE_FLAGS_HEADER_INCLUDED) == 0)) {
+    get_http_headers(hs, uri);
+  }
+#else /* LWIP_HTTPD_DYNAMIC_HEADERS */
+  LWIP_UNUSED_ARG(uri);
+#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
+#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
+  if (hs->keepalive) {
+#if LWIP_HTTPD_SSI
+    if (hs->ssi != NULL) {
+      hs->keepalive = 0;
+    } else
+#endif /* LWIP_HTTPD_SSI */
+    {
+      if ((hs->handle != NULL) &&
+          ((hs->handle->flags & (FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT)) == FS_FILE_FLAGS_HEADER_INCLUDED)) {
+        hs->keepalive = 0;
+      }
+    }
+  }
+#endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */
+  return ERR_OK;
+}
+
+/**
+ * The pcb had an error and is already deallocated.
+ * The argument might still be valid (if != NULL).
+ */
+static void
+http_err(void *arg, err_t err)
+{
+  struct http_state *hs = (struct http_state *)arg;
+  LWIP_UNUSED_ARG(err);
+
+  LWIP_DEBUGF(HTTPD_DEBUG, ("http_err: %s", lwip_strerr(err)));
+
+  if (hs != NULL) {
+    http_state_free(hs);
+  }
+}
+
+/**
+ * Data has been sent and acknowledged by the remote host.
+ * This means that more data can be sent.
+ */
+static err_t
+http_sent(void *arg, struct altcp_pcb *pcb, u16_t len)
+{
+  struct http_state *hs = (struct http_state *)arg;
+
+  LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_sent %p\n", (void *)pcb));
+
+  LWIP_UNUSED_ARG(len);
+
+  if (hs == NULL) {
+    return ERR_OK;
+  }
+
+  hs->retries = 0;
+
+  http_send(pcb, hs);
+
+  return ERR_OK;
+}
+
+/**
+ * The poll function is called every 2nd second.
+ * If there has been no data sent (which resets the retries) in 8 seconds, close.
+ * If the last portion of a file has not been sent in 2 seconds, close.
+ *
+ * This could be increased, but we don't want to waste resources for bad connections.
+ */
+static err_t
+http_poll(void *arg, struct altcp_pcb *pcb)
+{
+  struct http_state *hs = (struct http_state *)arg;
+  LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_poll: pcb=%p hs=%p pcb_state=%s\n",
+              (void *)pcb, (void *)hs, tcp_debug_state_str(altcp_dbg_get_tcp_state(pcb))));
+
+  if (hs == NULL) {
+    err_t closed;
+    /* arg is null, close. */
+    LWIP_DEBUGF(HTTPD_DEBUG, ("http_poll: arg is NULL, close\n"));
+    closed = http_close_conn(pcb, NULL);
+    LWIP_UNUSED_ARG(closed);
+#if LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR
+    if (closed == ERR_MEM) {
+      altcp_abort(pcb);
+      return ERR_ABRT;
+    }
+#endif /* LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR */
+    return ERR_OK;
+  } else {
+    hs->retries++;
+    if (hs->retries == HTTPD_MAX_RETRIES) {
+      LWIP_DEBUGF(HTTPD_DEBUG, ("http_poll: too many retries, close\n"));
+      http_close_conn(pcb, hs);
+      return ERR_OK;
+    }
+
+    /* If this connection has a file open, try to send some more data. If
+     * it has not yet received a GET request, don't do this since it will
+     * cause the connection to close immediately. */
+    if (hs->handle) {
+      LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_poll: try to send more data\n"));
+      if (http_send(pcb, hs)) {
+        /* If we wrote anything to be sent, go ahead and send it now. */
+        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("tcp_output\n"));
+        altcp_output(pcb);
+      }
+    }
+  }
+
+  return ERR_OK;
+}
+
+/**
+ * Data has been received on this pcb.
+ * For HTTP 1.0, this should normally only happen once (if the request fits in one packet).
+ */
+static err_t
+http_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err)
+{
+  struct http_state *hs = (struct http_state *)arg;
+  LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_recv: pcb=%p pbuf=%p err=%s\n", (void *)pcb,
+              (void *)p, lwip_strerr(err)));
+
+  if ((err != ERR_OK) || (p == NULL) || (hs == NULL)) {
+    /* error or closed by other side? */
+    if (p != NULL) {
+      /* Inform TCP that we have taken the data. */
+      altcp_recved(pcb, p->tot_len);
+      pbuf_free(p);
+    }
+    if (hs == NULL) {
+      /* this should not happen, only to be robust */
+      LWIP_DEBUGF(HTTPD_DEBUG, ("Error, http_recv: hs is NULL, close\n"));
+    }
+    http_close_conn(pcb, hs);
+    return ERR_OK;
+  }
+
+#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND
+  if (hs->no_auto_wnd) {
+    hs->unrecved_bytes += p->tot_len;
+  } else
+#endif /* LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND */
+  {
+    /* Inform TCP that we have taken the data. */
+    altcp_recved(pcb, p->tot_len);
+  }
+
+#if LWIP_HTTPD_SUPPORT_POST
+  if (hs->post_content_len_left > 0) {
+    /* reset idle counter when POST data is received */
+    hs->retries = 0;
+    /* this is data for a POST, pass the complete pbuf to the application */
+    http_post_rxpbuf(hs, p);
+    /* pbuf is passed to the application, don't free it! */
+    if (hs->post_content_len_left == 0) {
+      /* all data received, send response or close connection */
+      http_send(pcb, hs);
+    }
+    return ERR_OK;
+  } else
+#endif /* LWIP_HTTPD_SUPPORT_POST */
+  {
+    if (hs->handle == NULL) {
+      err_t parsed = http_parse_request(p, hs, pcb);
+      LWIP_ASSERT("http_parse_request: unexpected return value", parsed == ERR_OK
+                  || parsed == ERR_INPROGRESS || parsed == ERR_ARG || parsed == ERR_USE);
+#if LWIP_HTTPD_SUPPORT_REQUESTLIST
+      if (parsed != ERR_INPROGRESS) {
+        /* request fully parsed or error */
+        if (hs->req != NULL) {
+          pbuf_free(hs->req);
+          hs->req = NULL;
+        }
+      }
+#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
+      pbuf_free(p);
+      if (parsed == ERR_OK) {
+#if LWIP_HTTPD_SUPPORT_POST
+        if (hs->post_content_len_left == 0)
+#endif /* LWIP_HTTPD_SUPPORT_POST */
+        {
+          LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_recv: data %p len %"S32_F"\n", (const void *)hs->file, hs->left));
+          http_send(pcb, hs);
+        }
+      } else if (parsed == ERR_ARG) {
+        /* @todo: close on ERR_USE? */
+        http_close_conn(pcb, hs);
+      }
+    } else {
+      LWIP_DEBUGF(HTTPD_DEBUG, ("http_recv: already sending data\n"));
+      /* already sending but still receiving data, we might want to RST here? */
+      pbuf_free(p);
+    }
+  }
+  return ERR_OK;
+}
+
+/**
+ * A new incoming connection has been accepted.
+ */
+static err_t
+http_accept(void *arg, struct altcp_pcb *pcb, err_t err)
+{
+  struct http_state *hs;
+  LWIP_UNUSED_ARG(err);
+  LWIP_UNUSED_ARG(arg);
+  LWIP_DEBUGF(HTTPD_DEBUG, ("http_accept %p / %p\n", (void *)pcb, arg));
+
+  if ((err != ERR_OK) || (pcb == NULL)) {
+    return ERR_VAL;
+  }
+
+  /* Set priority */
+  altcp_setprio(pcb, HTTPD_TCP_PRIO);
+
+  /* Allocate memory for the structure that holds the state of the
+     connection - initialized by that function. */
+  hs = http_state_alloc();
+  if (hs == NULL) {
+    LWIP_DEBUGF(HTTPD_DEBUG, ("http_accept: Out of memory, RST\n"));
+    return ERR_MEM;
+  }
+  hs->pcb = pcb;
+
+  /* Tell TCP that this is the structure we wish to be passed for our
+     callbacks. */
+  altcp_arg(pcb, hs);
+
+  /* Set up the various callback functions */
+  altcp_recv(pcb, http_recv);
+  altcp_err(pcb, http_err);
+  altcp_poll(pcb, http_poll, HTTPD_POLL_INTERVAL);
+  altcp_sent(pcb, http_sent);
+
+  return ERR_OK;
+}
+
+static void
+httpd_init_pcb(struct altcp_pcb *pcb, u16_t port)
+{
+  err_t err;
+
+  if (pcb) {
+    altcp_setprio(pcb, HTTPD_TCP_PRIO);
+    /* set SOF_REUSEADDR here to explicitly bind httpd to multiple interfaces */
+    err = altcp_bind(pcb, IP_ANY_TYPE, port);
+    LWIP_UNUSED_ARG(err); /* in case of LWIP_NOASSERT */
+    LWIP_ASSERT("httpd_init: tcp_bind failed", err == ERR_OK);
+    pcb = altcp_listen(pcb);
+    LWIP_ASSERT("httpd_init: tcp_listen failed", pcb != NULL);
+    altcp_accept(pcb, http_accept);
+  }
+}
+
+/**
+ * @ingroup httpd
+ * Initialize the httpd: set up a listening PCB and bind it to the defined port
+ */
+void
+httpd_init(void)
+{
+  struct altcp_pcb *pcb;
+
+#if HTTPD_USE_MEM_POOL
+  LWIP_MEMPOOL_INIT(HTTPD_STATE);
+#if LWIP_HTTPD_SSI
+  LWIP_MEMPOOL_INIT(HTTPD_SSI_STATE);
+#endif
+#endif
+  LWIP_DEBUGF(HTTPD_DEBUG, ("httpd_init\n"));
+
+  /* LWIP_ASSERT_CORE_LOCKED(); is checked by tcp_new() */
+
+  pcb = altcp_tcp_new_ip_type(IPADDR_TYPE_ANY);
+  LWIP_ASSERT("httpd_init: tcp_new failed", pcb != NULL);
+  httpd_init_pcb(pcb, HTTPD_SERVER_PORT);
+}
+
+#if HTTPD_ENABLE_HTTPS
+/**
+ * @ingroup httpd
+ * Initialize the httpd: set up a listening PCB and bind it to the defined port.
+ * Also set up TLS connection handling (HTTPS).
+ */
+void
+httpd_inits(struct altcp_tls_config *conf)
+{
+#if LWIP_ALTCP_TLS
+  struct altcp_pcb *pcb_tls = altcp_tls_new(conf, IPADDR_TYPE_ANY);
+  LWIP_ASSERT("httpd_init: altcp_tls_new failed", pcb_tls != NULL);
+  httpd_init_pcb(pcb_tls, HTTPD_SERVER_PORT_HTTPS);
+#else /* LWIP_ALTCP_TLS */
+  LWIP_UNUSED_ARG(conf);
+#endif /* LWIP_ALTCP_TLS */
+}
+#endif /* HTTPD_ENABLE_HTTPS */
+
+#if LWIP_HTTPD_SSI
+/**
+ * @ingroup httpd
+ * Set the SSI handler function.
+ *
+ * @param ssi_handler the SSI handler function
+ * @param tags an array of SSI tag strings to search for in SSI-enabled files
+ * @param num_tags number of tags in the 'tags' array
+ */
+void
+http_set_ssi_handler(tSSIHandler ssi_handler, const char **tags, int num_tags)
+{
+  LWIP_DEBUGF(HTTPD_DEBUG, ("http_set_ssi_handler\n"));
+
+  LWIP_ASSERT("no ssi_handler given", ssi_handler != NULL);
+  httpd_ssi_handler = ssi_handler;
+
+#if LWIP_HTTPD_SSI_RAW
+  LWIP_UNUSED_ARG(tags);
+  LWIP_UNUSED_ARG(num_tags);
+#else /* LWIP_HTTPD_SSI_RAW */
+  LWIP_ASSERT("no tags given", tags != NULL);
+  LWIP_ASSERT("invalid number of tags", num_tags > 0);
+
+  httpd_tags = tags;
+  httpd_num_tags = num_tags;
+#endif /* !LWIP_HTTPD_SSI_RAW */
+}
+#endif /* LWIP_HTTPD_SSI */
+
+#if LWIP_HTTPD_CGI
+/**
+ * @ingroup httpd
+ * Set an array of CGI filenames/handler functions
+ *
+ * @param cgis an array of CGI filenames/handler functions
+ * @param num_handlers number of elements in the 'cgis' array
+ */
+void
+http_set_cgi_handlers(const tCGI *cgis, int num_handlers)
+{
+  LWIP_ASSERT("no cgis given", cgis != NULL);
+  LWIP_ASSERT("invalid number of handlers", num_handlers > 0);
+
+  httpd_cgis = cgis;
+  httpd_num_cgis = num_handlers;
+}
+#endif /* LWIP_HTTPD_CGI */
+
+#endif /* LWIP_TCP && LWIP_CALLBACK_API */
diff --git a/src/apps/http/httpd_structs.h b/src/apps/http/httpd_structs.h
new file mode 100644
index 0000000..56b97a3
--- /dev/null
+++ b/src/apps/http/httpd_structs.h
@@ -0,0 +1,123 @@
+#ifndef LWIP_HTTPD_STRUCTS_H
+#define LWIP_HTTPD_STRUCTS_H
+
+#include "lwip/apps/httpd.h"
+
+#if LWIP_HTTPD_DYNAMIC_HEADERS
+/** This struct is used for a list of HTTP header strings for various
+ * filename extensions. */
+typedef struct {
+  const char *extension;
+  const char *content_type;
+} tHTTPHeader;
+
+/** A list of strings used in HTTP headers (see RFC 1945 HTTP/1.0 and
+ * RFC 2616 HTTP/1.1 for header field definitions) */
+static const char *const g_psHTTPHeaderStrings[] = {
+  "HTTP/1.0 200 OK\r\n",
+  "HTTP/1.0 404 File not found\r\n",
+  "HTTP/1.0 400 Bad Request\r\n",
+  "HTTP/1.0 501 Not Implemented\r\n",
+  "HTTP/1.1 200 OK\r\n",
+  "HTTP/1.1 404 File not found\r\n",
+  "HTTP/1.1 400 Bad Request\r\n",
+  "HTTP/1.1 501 Not Implemented\r\n",
+  "Content-Length: ",
+  "Connection: Close\r\n",
+  "Connection: keep-alive\r\n",
+  "Connection: keep-alive\r\nContent-Length: ",
+  "Server: "HTTPD_SERVER_AGENT"\r\n",
+  "\r\n<html><body><h2>404: The requested file cannot be found.</h2></body></html>\r\n"
+#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
+  , "Connection: keep-alive\r\nContent-Length: 77\r\n\r\n<html><body><h2>404: The requested file cannot be found.</h2></body></html>\r\n"
+#endif
+};
+
+/* Indexes into the g_psHTTPHeaderStrings array */
+#define HTTP_HDR_OK             0 /* 200 OK */
+#define HTTP_HDR_NOT_FOUND      1 /* 404 File not found */
+#define HTTP_HDR_BAD_REQUEST    2 /* 400 Bad request */
+#define HTTP_HDR_NOT_IMPL       3 /* 501 Not Implemented */
+#define HTTP_HDR_OK_11          4 /* 200 OK */
+#define HTTP_HDR_NOT_FOUND_11   5 /* 404 File not found */
+#define HTTP_HDR_BAD_REQUEST_11 6 /* 400 Bad request */
+#define HTTP_HDR_NOT_IMPL_11    7 /* 501 Not Implemented */
+#define HTTP_HDR_CONTENT_LENGTH 8 /* Content-Length: (HTTP 1.0)*/
+#define HTTP_HDR_CONN_CLOSE     9 /* Connection: Close (HTTP 1.1) */
+#define HTTP_HDR_CONN_KEEPALIVE 10 /* Connection: keep-alive (HTTP 1.1) */
+#define HTTP_HDR_KEEPALIVE_LEN  11 /* Connection: keep-alive + Content-Length: (HTTP 1.1)*/
+#define HTTP_HDR_SERVER         12 /* Server: HTTPD_SERVER_AGENT */
+#define DEFAULT_404_HTML        13 /* default 404 body */
+#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
+#define DEFAULT_404_HTML_PERSISTENT 14 /* default 404 body, but including Connection: keep-alive */
+#endif
+
+#define HTTP_CONTENT_TYPE(contenttype) "Content-Type: "contenttype"\r\n\r\n"
+#define HTTP_CONTENT_TYPE_ENCODING(contenttype, encoding) "Content-Type: "contenttype"\r\nContent-Encoding: "encoding"\r\n\r\n"
+
+#define HTTP_HDR_HTML           HTTP_CONTENT_TYPE("text/html")
+#define HTTP_HDR_SSI            HTTP_CONTENT_TYPE("text/html\r\nExpires: Fri, 10 Apr 2008 14:00:00 GMT\r\nPragma: no-cache")
+#define HTTP_HDR_GIF            HTTP_CONTENT_TYPE("image/gif")
+#define HTTP_HDR_PNG            HTTP_CONTENT_TYPE("image/png")
+#define HTTP_HDR_JPG            HTTP_CONTENT_TYPE("image/jpeg")
+#define HTTP_HDR_BMP            HTTP_CONTENT_TYPE("image/bmp")
+#define HTTP_HDR_ICO            HTTP_CONTENT_TYPE("image/x-icon")
+#define HTTP_HDR_APP            HTTP_CONTENT_TYPE("application/octet-stream")
+#define HTTP_HDR_JS             HTTP_CONTENT_TYPE("application/javascript")
+#define HTTP_HDR_RA             HTTP_CONTENT_TYPE("application/javascript")
+#define HTTP_HDR_CSS            HTTP_CONTENT_TYPE("text/css")
+#define HTTP_HDR_SWF            HTTP_CONTENT_TYPE("application/x-shockwave-flash")
+#define HTTP_HDR_XML            HTTP_CONTENT_TYPE("text/xml")
+#define HTTP_HDR_PDF            HTTP_CONTENT_TYPE("application/pdf")
+#define HTTP_HDR_JSON           HTTP_CONTENT_TYPE("application/json")
+#define HTTP_HDR_CSV            HTTP_CONTENT_TYPE("text/csv")
+#define HTTP_HDR_TSV            HTTP_CONTENT_TYPE("text/tsv")
+#define HTTP_HDR_SVG            HTTP_CONTENT_TYPE("image/svg+xml")
+#define HTTP_HDR_SVGZ           HTTP_CONTENT_TYPE_ENCODING("image/svg+xml", "gzip")
+
+#define HTTP_HDR_DEFAULT_TYPE   HTTP_CONTENT_TYPE("text/plain")
+
+/** A list of extension-to-HTTP header strings (see outdated RFC 1700 MEDIA TYPES
+ * and http://www.iana.org/assignments/media-types for registered content types
+ * and subtypes) */
+static const tHTTPHeader g_psHTTPHeaders[] = {
+  { "html", HTTP_HDR_HTML},
+  { "htm",  HTTP_HDR_HTML},
+  { "shtml", HTTP_HDR_SSI},
+  { "shtm", HTTP_HDR_SSI},
+  { "ssi",  HTTP_HDR_SSI},
+  { "gif",  HTTP_HDR_GIF},
+  { "png",  HTTP_HDR_PNG},
+  { "jpg",  HTTP_HDR_JPG},
+  { "bmp",  HTTP_HDR_BMP},
+  { "ico",  HTTP_HDR_ICO},
+  { "class", HTTP_HDR_APP},
+  { "cls",  HTTP_HDR_APP},
+  { "js",   HTTP_HDR_JS},
+  { "ram",  HTTP_HDR_RA},
+  { "css",  HTTP_HDR_CSS},
+  { "swf",  HTTP_HDR_SWF},
+  { "xml",  HTTP_HDR_XML},
+  { "xsl",  HTTP_HDR_XML},
+  { "pdf",  HTTP_HDR_PDF},
+  { "json", HTTP_HDR_JSON}
+#ifdef HTTPD_ADDITIONAL_CONTENT_TYPES
+  /* If you need to add content types not listed here:
+   * #define HTTPD_ADDITIONAL_CONTENT_TYPES {"ct1", HTTP_CONTENT_TYPE("text/ct1")}, {"exe", HTTP_CONTENT_TYPE("application/exe")}
+   */
+  , HTTPD_ADDITIONAL_CONTENT_TYPES
+#endif
+};
+
+#define NUM_HTTP_HEADERS LWIP_ARRAYSIZE(g_psHTTPHeaders)
+
+#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
+
+#if LWIP_HTTPD_SSI
+static const char *const g_pcSSIExtensions[] = {
+  ".shtml", ".shtm", ".ssi", ".xml", ".json"
+};
+#define NUM_SHTML_EXTENSIONS LWIP_ARRAYSIZE(g_pcSSIExtensions)
+#endif /* LWIP_HTTPD_SSI */
+
+#endif /* LWIP_HTTPD_STRUCTS_H */
diff --git a/src/apps/httpd/makefsdata/makefsdata b/src/apps/http/makefsdata/makefsdata
similarity index 100%
rename from src/apps/httpd/makefsdata/makefsdata
rename to src/apps/http/makefsdata/makefsdata
diff --git a/src/apps/http/makefsdata/makefsdata.c b/src/apps/http/makefsdata/makefsdata.c
new file mode 100644
index 0000000..695e94f
--- /dev/null
+++ b/src/apps/http/makefsdata/makefsdata.c
@@ -0,0 +1,1251 @@
+/**
+ * makefsdata: Converts a directory structure for use with the lwIP httpd.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Jim Pettinato
+ *         Simon Goldschmidt
+ *
+ * @todo:
+ * - take TCP_MSS, LWIP_TCP_TIMESTAMPS and
+ *   PAYLOAD_ALIGN_TYPE/PAYLOAD_ALIGNMENT as arguments
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <sys/stat.h>
+
+#include "tinydir.h"
+
+/** 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.
+ */
+#ifndef MAKEFS_SUPPORT_DEFLATE
+#define MAKEFS_SUPPORT_DEFLATE 0
+#endif
+
+#define COPY_BUFSIZE (1024*1024) /* 1 MByte */
+
+#if MAKEFS_SUPPORT_DEFLATE
+#include "../miniz.c"
+
+typedef unsigned char uint8;
+typedef unsigned short uint16;
+typedef unsigned int uint;
+
+#define my_max(a,b) (((a) > (b)) ? (a) : (b))
+#define my_min(a,b) (((a) < (b)) ? (a) : (b))
+
+/* COMP_OUT_BUF_SIZE is the size of the output buffer used during compression.
+   COMP_OUT_BUF_SIZE must be >= 1 and <= OUT_BUF_SIZE */
+#define COMP_OUT_BUF_SIZE COPY_BUFSIZE
+
+/* OUT_BUF_SIZE is the size of the output buffer used during decompression.
+   OUT_BUF_SIZE must be a power of 2 >= TINFL_LZ_DICT_SIZE (because the low-level decompressor not only writes, but reads from the output buffer as it decompresses) */
+#define OUT_BUF_SIZE COPY_BUFSIZE
+static uint8 s_outbuf[OUT_BUF_SIZE];
+static uint8 s_checkbuf[OUT_BUF_SIZE];
+
+/* 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;
+
+int deflate_level = 10; /* default compression level, can be changed via command line */
+#define USAGE_ARG_DEFLATE " [-defl<:compr_level>]"
+#else /* MAKEFS_SUPPORT_DEFLATE */
+#define USAGE_ARG_DEFLATE ""
+#endif /* MAKEFS_SUPPORT_DEFLATE */
+
+#ifdef WIN32
+
+#define GETCWD(path, len)             GetCurrentDirectoryA(len, path)
+#define CHDIR(path)                   SetCurrentDirectoryA(path)
+#define CHDIR_SUCCEEDED(ret)          (ret == TRUE)
+
+#elif __linux__
+
+#define GETCWD(path, len)             getcwd(path, len)
+#define CHDIR(path)                   chdir(path)
+#define CHDIR_SUCCEEDED(ret)          (ret == 0)
+
+#else
+
+#error makefsdata not supported on this platform
+
+#endif
+
+#define NEWLINE     "\r\n"
+#define NEWLINE_LEN 2
+
+/* define this to get the header variables we use to build HTTP headers */
+#define LWIP_HTTPD_DYNAMIC_HEADERS 1
+#define LWIP_HTTPD_SSI             1
+#include "lwip/init.h"
+#include "../httpd_structs.h"
+#include "lwip/apps/fs.h"
+
+#include "../core/inet_chksum.c"
+#include "../core/def.c"
+
+/** (Your server name here) */
+const char *serverID = "Server: "HTTPD_SERVER_AGENT"\r\n";
+char serverIDBuffer[1024];
+
+/* change this to suit your MEM_ALIGNMENT */
+#define PAYLOAD_ALIGNMENT 4
+/* set this to 0 to prevent aligning payload */
+#define ALIGN_PAYLOAD 1
+/* define this to a type that has the required alignment */
+#define PAYLOAD_ALIGN_TYPE "unsigned int"
+static int payload_alingment_dummy_counter = 0;
+
+#define HEX_BYTES_PER_LINE 16
+
+#define MAX_PATH_LEN 256
+
+struct file_entry {
+  struct file_entry *next;
+  const char *filename_c;
+};
+
+int process_sub(FILE *data_file, FILE *struct_file);
+int process_file(FILE *data_file, FILE *struct_file, const char *filename);
+int file_write_http_header(FILE *data_file, const char *filename, int file_size, u16_t *http_hdr_len,
+                           u16_t *http_hdr_chksum, u8_t provide_content_len, int is_compressed);
+int file_put_ascii(FILE *file, const char *ascii_string, int len, int *i);
+int s_put_ascii(char *buf, const char *ascii_string, int len, int *i);
+void concat_files(const char *file1, const char *file2, const char *targetfile);
+int check_path(char *path, size_t size);
+static int checkSsiByFilelist(const char* filename_listfile);
+static int ext_in_list(const char* filename, const char *ext_list);
+static int file_to_exclude(const char* filename);
+static int file_can_be_compressed(const char* filename);
+
+/* 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];
+
+unsigned char processSubs = 1;
+unsigned char includeHttpHeader = 1;
+unsigned char useHttp11 = 0;
+unsigned char supportSsi = 1;
+unsigned char precalcChksum = 0;
+unsigned char includeLastModified = 0;
+#if MAKEFS_SUPPORT_DEFLATE
+unsigned char deflateNonSsiFiles = 0;
+size_t deflatedBytesReduced = 0;
+size_t overallDataBytes = 0;
+#endif
+const char *exclude_list = NULL;
+const char *ncompress_list = NULL;
+
+struct file_entry *first_file = NULL;
+struct file_entry *last_file = NULL;
+
+static char *ssi_file_buffer;
+static char **ssi_file_lines;
+static size_t ssi_file_num_lines;
+
+static void print_usage(void)
+{
+  printf(" Usage: htmlgen [targetdir] [-s] [-e] [-11] [-nossi] [-ssi:<filename>] [-c] [-f:<filename>] [-m] [-svr:<name>] [-x:<ext_list>] [-xc:<ext_list>" USAGE_ARG_DEFLATE NEWLINE NEWLINE);
+  printf("   targetdir: relative or absolute path to files to convert" NEWLINE);
+  printf("   switch -s: toggle processing of subdirectories (default is on)" NEWLINE);
+  printf("   switch -e: exclude HTTP header from file (header is created at runtime, default is off)" NEWLINE);
+  printf("   switch -11: include HTTP 1.1 header (1.0 is default)" NEWLINE);
+  printf("   switch -nossi: no support for SSI (cannot calculate Content-Length for SSI)" NEWLINE);
+  printf("   switch -ssi: ssi filename (ssi support controlled by file list, not by extension)" NEWLINE);
+  printf("   switch -c: precalculate checksums for all pages (default is off)" NEWLINE);
+  printf("   switch -f: target filename (default is \"fsdata.c\")" NEWLINE);
+  printf("   switch -m: include \"Last-Modified\" header based on file time" NEWLINE);
+  printf("   switch -svr: server identifier sent in HTTP response header ('Server' field)" NEWLINE);
+  printf("   switch -x: comma separated list of extensions of files to exclude (e.g., -x:json,txt)" NEWLINE);
+  printf("   switch -xc: comma separated list of extensions of files to not compress (e.g., -xc:mp3,jpg)" NEWLINE);
+#if MAKEFS_SUPPORT_DEFLATE
+  printf("   switch -defl: deflate-compress all non-SSI files (with opt. compr.-level, default=10)" NEWLINE);
+  printf("                 ATTENTION: browser has to support \"Content-Encoding: deflate\"!" NEWLINE);
+#endif
+  printf("   if targetdir not specified, htmlgen will attempt to" NEWLINE);
+  printf("   process files in subdirectory 'fs'" NEWLINE);
+}
+
+int main(int argc, char *argv[])
+{
+  char path[MAX_PATH_LEN];
+  char appPath[MAX_PATH_LEN];
+  FILE *data_file;
+  FILE *struct_file;
+  int filesProcessed;
+  int i;
+  char targetfile[MAX_PATH_LEN];
+  strcpy(targetfile, "fsdata.c");
+
+  memset(path, 0, sizeof(path));
+  memset(appPath, 0, sizeof(appPath));
+
+  printf(NEWLINE " makefsdata - HTML to C source converter" NEWLINE);
+  printf("     by Jim Pettinato               - circa 2003 " NEWLINE);
+  printf("     extended by Simon Goldschmidt  - 2009 " NEWLINE NEWLINE);
+
+  LWIP_ASSERT("sizeof(hdr_buf) must fit into an u16_t", sizeof(hdr_buf) <= 0xffff);
+
+  strcpy(path, "fs");
+  for (i = 1; i < argc; i++) {
+    if (argv[i] == NULL) {
+      continue;
+    }
+    if (argv[i][0] == '-') {
+      if (strstr(argv[i], "-svr:") == argv[i]) {
+        snprintf(serverIDBuffer, sizeof(serverIDBuffer), "Server: %s\r\n", &argv[i][5]);
+        serverID = serverIDBuffer;
+        printf("Using Server-ID: \"%s\"\n", serverID);
+      } else if (!strcmp(argv[i], "-s")) {
+        processSubs = 0;
+      } else if (!strcmp(argv[i], "-e")) {
+        includeHttpHeader = 0;
+      } else if (!strcmp(argv[i], "-11")) {
+        useHttp11 = 1;
+      } else if (!strcmp(argv[i], "-nossi")) {
+        supportSsi = 0;
+      } else if (strstr(argv[i], "-ssi:") == argv[i]) {
+        const char* ssi_list_filename = &argv[i][5];
+        if (checkSsiByFilelist(ssi_list_filename)) {
+          printf("Reading list of SSI files from \"%s\"\n", ssi_list_filename);
+        } else {
+          printf("Failed to load list of SSI files from \"%s\"\n", ssi_list_filename);
+        }
+      } else if (!strcmp(argv[i], "-c")) {
+        precalcChksum = 1;
+      } else if (strstr(argv[i], "-f:") == argv[i]) {
+        strncpy(targetfile, &argv[i][3], sizeof(targetfile) - 1);
+        targetfile[sizeof(targetfile) - 1] = 0;
+        printf("Writing to file \"%s\"\n", targetfile);
+      } else if (!strcmp(argv[i], "-m")) {
+        includeLastModified = 1;
+      } else if (!strcmp(argv[i], "-defl")) {
+#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);
+            }
+          }
+        }
+        deflateNonSsiFiles = 1;
+        printf("Deflating all non-SSI files with level %d (but only if size is reduced)" NEWLINE, deflate_level);
+#else
+        printf("WARNING: Deflate support is disabled\n");
+#endif
+      } else if (strstr(argv[i], "-x:") == argv[i]) {
+        exclude_list = &argv[i][3];
+        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);
+      } else if ((strstr(argv[i], "-?")) || (strstr(argv[i], "-h"))) {
+        print_usage();
+        exit(0);
+      }
+    } else if ((argv[i][0] == '/') && (argv[i][1] == '?') && (argv[i][2] == 0)) {
+      print_usage();
+      exit(0);
+    } else {
+      strncpy(path, argv[i], sizeof(path) - 1);
+      path[sizeof(path) - 1] = 0;
+    }
+  }
+
+  if (!check_path(path, sizeof(path))) {
+    printf("Invalid path: \"%s\"." NEWLINE, path);
+    exit(-1);
+  }
+
+  GETCWD(appPath, MAX_PATH_LEN);
+  /* 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 */
+    printf(" Failed to open directory \"%s\"." NEWLINE NEWLINE, path);
+    print_usage();
+    exit(-1);
+  }
+  CHDIR(appPath);
+
+  printf("HTTP %sheader will %s statically included." NEWLINE,
+         (includeHttpHeader ? (useHttp11 ? "1.1 " : "1.0 ") : ""),
+         (includeHttpHeader ? "be" : "not be"));
+
+  curSubdir[0] = '\0'; /* start off in web page's root directory - relative paths */
+  printf("  Processing all files in directory %s", path);
+  if (processSubs) {
+    printf(" and subdirectories..." NEWLINE NEWLINE);
+  } else {
+    printf("..." NEWLINE NEWLINE);
+  }
+
+  data_file = fopen("fsdata.tmp", "wb");
+  if (data_file == NULL) {
+    printf("Failed to create file \"fsdata.tmp\"\n");
+    exit(-1);
+  }
+  struct_file = fopen("fshdr.tmp", "wb");
+  if (struct_file == NULL) {
+    printf("Failed to create file \"fshdr.tmp\"\n");
+    fclose(data_file);
+    exit(-1);
+  }
+
+  CHDIR(path);
+
+  fprintf(data_file, "#include \"lwip/apps/fs.h\"" NEWLINE);
+  fprintf(data_file, "#include \"lwip/def.h\"" NEWLINE NEWLINE NEWLINE);
+
+  fprintf(data_file, "#define file_NULL (struct fsdata_file *) NULL" NEWLINE NEWLINE NEWLINE);
+  /* define FS_FILE_FLAGS_HEADER_INCLUDED to 1 if not defined (compatibility with older httpd/fs) */
+  fprintf(data_file, "#ifndef FS_FILE_FLAGS_HEADER_INCLUDED" NEWLINE "#define FS_FILE_FLAGS_HEADER_INCLUDED 1" NEWLINE "#endif" NEWLINE);
+  /* define FS_FILE_FLAGS_HEADER_PERSISTENT to 0 if not defined (compatibility with older httpd/fs: wasn't supported back then) */
+  fprintf(data_file, "#ifndef FS_FILE_FLAGS_HEADER_PERSISTENT" NEWLINE "#define FS_FILE_FLAGS_HEADER_PERSISTENT 0" NEWLINE "#endif" NEWLINE);
+
+  /* define alignment defines */
+#if ALIGN_PAYLOAD
+  fprintf(data_file, "/* FSDATA_FILE_ALIGNMENT: 0=off, 1=by variable, 2=by include */" NEWLINE "#ifndef FSDATA_FILE_ALIGNMENT" NEWLINE "#define FSDATA_FILE_ALIGNMENT 0" NEWLINE "#endif" NEWLINE);
+#endif
+  fprintf(data_file, "#ifndef FSDATA_ALIGN_PRE"  NEWLINE "#define FSDATA_ALIGN_PRE"  NEWLINE "#endif" NEWLINE);
+  fprintf(data_file, "#ifndef FSDATA_ALIGN_POST" NEWLINE "#define FSDATA_ALIGN_POST" NEWLINE "#endif" NEWLINE);
+#if ALIGN_PAYLOAD
+  fprintf(data_file, "#if FSDATA_FILE_ALIGNMENT==2" NEWLINE "#include \"fsdata_alignment.h\"" NEWLINE "#endif" NEWLINE);
+#endif
+
+  sprintf(lastFileVar, "NULL");
+
+  filesProcessed = process_sub(data_file, struct_file);
+
+  /* data_file now contains all of the raw data.. now append linked list of
+   * file header structs to allow embedded app to search for a file name */
+  fprintf(data_file, NEWLINE NEWLINE);
+  fprintf(struct_file, "#define FS_ROOT file_%s" NEWLINE, lastFileVar);
+  fprintf(struct_file, "#define FS_NUMFILES %d" NEWLINE NEWLINE, filesProcessed);
+
+  fclose(data_file);
+  fclose(struct_file);
+
+  CHDIR(appPath);
+  /* append struct_file to data_file */
+  printf(NEWLINE "Creating target file..." NEWLINE NEWLINE);
+  concat_files("fsdata.tmp", "fshdr.tmp", targetfile);
+
+  /* if succeeded, delete the temporary files */
+  if (remove("fsdata.tmp") != 0) {
+    printf("Warning: failed to delete fsdata.tmp\n");
+  }
+  if (remove("fshdr.tmp") != 0) {
+    printf("Warning: failed to delete fshdr.tmp\n");
+  }
+
+  printf(NEWLINE "Processed %d files - done." NEWLINE, filesProcessed);
+#if MAKEFS_SUPPORT_DEFLATE
+  if (deflateNonSsiFiles) {
+    printf("(Deflated total byte reduction: %d bytes -> %d bytes (%.02f%%)" NEWLINE,
+           (int)overallDataBytes, (int)deflatedBytesReduced, (float)((deflatedBytesReduced * 100.0) / overallDataBytes));
+  }
+#endif
+  printf(NEWLINE);
+
+  while (first_file != NULL) {
+    struct file_entry *fe = first_file;
+    first_file = fe->next;
+    free(fe);
+  }
+
+  if (ssi_file_buffer) {
+    free(ssi_file_buffer);
+  }
+  if (ssi_file_lines) {
+    free(ssi_file_lines);
+  }
+
+  return 0;
+}
+
+int check_path(char *path, size_t size)
+{
+  size_t slen;
+  if (path[0] == 0) {
+    /* empty */
+    return 0;
+  }
+  slen = strlen(path);
+  if (slen >= size) {
+    /* not NULL-terminated */
+    return 0;
+  }
+  while ((slen > 0) && ((path[slen] == '\\') || (path[slen] == '/'))) {
+    /* path should not end with trailing backslash */
+    path[slen] = 0;
+    slen--;
+  }
+  if (slen == 0) {
+    return 0;
+  }
+  return 1;
+}
+
+static void copy_file(const char *filename_in, FILE *fout)
+{
+  FILE *fin;
+  size_t len;
+  void *buf;
+  fin = fopen(filename_in, "rb");
+  if (fin == NULL) {
+    printf("Failed to open file \"%s\"\n", filename_in);
+    exit(-1);
+  }
+  buf = malloc(COPY_BUFSIZE);
+  while ((len = fread(buf, 1, COPY_BUFSIZE, fin)) > 0) {
+    fwrite(buf, 1, len, fout);
+  }
+  free(buf);
+  fclose(fin);
+}
+
+void concat_files(const char *file1, const char *file2, const char *targetfile)
+{
+  FILE *fout;
+  fout = fopen(targetfile, "wb");
+  if (fout == NULL) {
+    printf("Failed to open file \"%s\"\n", targetfile);
+    exit(-1);
+  }
+  copy_file(file1, fout);
+  copy_file(file2, fout);
+  fclose(fout);
+}
+
+int process_sub(FILE *data_file, FILE *struct_file)
+{
+  tinydir_dir dir;
+  int filesProcessed = 0;
+
+  if (processSubs) {
+    /* process subs recursively */
+    size_t sublen = strlen(curSubdir);
+    size_t freelen = sizeof(curSubdir) - sublen - 1;
+    int ret;
+    LWIP_ASSERT("sublen < sizeof(curSubdir)", sublen < sizeof(curSubdir));
+
+    ret = tinydir_open_sorted(&dir, TINYDIR_STRING("."));
+
+    if (ret == 0) {
+      unsigned int i;
+      for (i = 0; i < dir.n_files; i++) {
+        tinydir_file file;
+
+        ret = tinydir_readfile_n(&dir, &file, i);
+
+        if (ret == 0) {
+#if (defined _MSC_VER || defined __MINGW32__) && (defined _UNICODE)
+          size_t num_char_converted;
+          char currName[256];
+          wcstombs_s(&num_char_converted, currName, sizeof(currName), file.name, sizeof(currName));
+#else
+          const char *currName = file.name;
+#endif
+
+          if (currName[0] == '.') {
+            continue;
+          }
+          if (!file.is_dir) {
+            continue;
+          }
+          if (freelen > 0) {
+            CHDIR(currName);
+            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("..");
+            curSubdir[sublen] = 0;
+          } else {
+            printf("WARNING: cannot process sub due to path length restrictions: \"%s/%s\"\n", curSubdir, currName);
+          }
+        }
+      }
+    }
+
+    ret = tinydir_open_sorted(&dir, TINYDIR_STRING("."));
+    if (ret == 0) {
+      unsigned int i;
+      for (i = 0; i < dir.n_files; i++) {
+        tinydir_file file;
+
+        ret = tinydir_readfile_n(&dir, &file, i);
+
+        if (ret == 0) {
+          if (!file.is_dir) {
+#if (defined _MSC_VER || defined __MINGW32__) && (defined _UNICODE)
+            size_t num_char_converted;
+            char curName[256];
+            wcstombs_s(&num_char_converted, curName, sizeof(curName), file.name, sizeof(curName));
+#else
+            const char *curName = file.name;
+#endif
+
+            if (strcmp(curName, "fsdata.tmp") == 0) {
+              continue;
+            }
+            if (strcmp(curName, "fshdr.tmp") == 0) {
+              continue;
+            }
+            if (file_to_exclude(curName)) {
+              printf("skipping %s/%s by exclude list (-x option)..." NEWLINE, curSubdir, curName);
+              continue;
+            }
+
+            printf("processing %s/%s..." NEWLINE, curSubdir, curName);
+
+            if (process_file(data_file, struct_file, curName) < 0) {
+              printf(NEWLINE "Error... aborting" NEWLINE);
+              return -1;
+            }
+            filesProcessed++;
+          }
+        }
+      }
+    }
+  }
+
+  return filesProcessed;
+}
+
+static u8_t *get_file_data(const char *filename, int *file_size, int can_be_compressed, int *is_compressed)
+{
+  FILE *inFile;
+  size_t fsize = 0;
+  u8_t *buf;
+  size_t r;
+  int rs;
+  LWIP_UNUSED_ARG(r); /* for LWIP_NOASSERT */
+  inFile = fopen(filename, "rb");
+  if (inFile == NULL) {
+    printf("Failed to open file \"%s\"\n", filename);
+    exit(-1);
+  }
+  fseek(inFile, 0, SEEK_END);
+  rs = ftell(inFile);
+  if (rs < 0) {
+    printf("ftell failed with %d\n", errno);
+    exit(-1);
+  }
+  fsize = (size_t)rs;
+  fseek(inFile, 0, SEEK_SET);
+  buf = (u8_t *)malloc(fsize);
+  LWIP_ASSERT("buf != NULL", buf != NULL);
+  r = fread(buf, 1, fsize, inFile);
+  LWIP_ASSERT("r == fsize", r == fsize);
+  *file_size = fsize;
+  *is_compressed = 0;
+#if MAKEFS_SUPPORT_DEFLATE
+  overallDataBytes += fsize;
+  if (deflateNonSsiFiles) {
+    if (can_be_compressed) {
+      if (fsize < OUT_BUF_SIZE) {
+        u8_t *ret_buf;
+        tdefl_status status;
+        size_t in_bytes = fsize;
+        size_t out_bytes = OUT_BUF_SIZE;
+        const void *next_in = buf;
+        void *next_out = s_outbuf;
+        /* 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) {
+          comp_flags |= TDEFL_FORCE_ALL_RAW_BLOCKS;
+        }
+        status = tdefl_init(&g_deflator, NULL, NULL, comp_flags);
+        if (status != TDEFL_STATUS_OKAY) {
+          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);
+        }
+        LWIP_ASSERT("out_bytes <= COPY_BUFSIZE", out_bytes <= OUT_BUF_SIZE);
+        if (out_bytes < fsize) {
+          ret_buf = (u8_t *)malloc(out_bytes);
+          LWIP_ASSERT("ret_buf != NULL", ret_buf != NULL);
+          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;
+
+            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);
+            LWIP_ASSERT("tinfl_decompress size mismatch", fsize == dec_out_bytes);
+            LWIP_ASSERT("decompressed memcmp failed", !memcmp(s_checkbuf, buf, fsize));
+          }
+          /* free original buffer, use compressed data + size */
+          free(buf);
+          buf = ret_buf;
+          *file_size = out_bytes;
+          printf(" - deflate: %d bytes -> %d bytes (%.02f%%)" NEWLINE, (int)fsize, (int)out_bytes, (float)((out_bytes * 100.0) / fsize));
+          deflatedBytesReduced += (size_t)(fsize - out_bytes);
+          *is_compressed = 1;
+        } else {
+          printf(" - uncompressed: (would be %d bytes larger using deflate)" NEWLINE, (int)(out_bytes - fsize));
+        }
+      } else {
+        printf(" - uncompressed: (file is larger than deflate bufer)" NEWLINE);
+      }
+    } else {
+      printf(" - cannot be compressed" NEWLINE);
+    }
+  }
+#else
+  LWIP_UNUSED_ARG(can_be_compressed);
+#endif
+  fclose(inFile);
+  return buf;
+}
+
+static void process_file_data(FILE *data_file, u8_t *file_data, size_t file_size)
+{
+  size_t written, i, src_off = 0;
+  size_t off = 0;
+  LWIP_UNUSED_ARG(written); /* for LWIP_NOASSERT */
+  for (i = 0; i < file_size; i++) {
+    LWIP_ASSERT("file_buffer_c overflow", off < sizeof(file_buffer_c) - 5);
+    sprintf(&file_buffer_c[off], "0x%02x,", file_data[i]);
+    off += 5;
+    if ((++src_off % HEX_BYTES_PER_LINE) == 0) {
+      LWIP_ASSERT("file_buffer_c overflow", off < sizeof(file_buffer_c) - NEWLINE_LEN);
+      memcpy(&file_buffer_c[off], NEWLINE, NEWLINE_LEN);
+      off += NEWLINE_LEN;
+    }
+    if (off + 20 >= sizeof(file_buffer_c)) {
+      written = fwrite(file_buffer_c, 1, off, data_file);
+      LWIP_ASSERT("written == off", written == off);
+      off = 0;
+    }
+  }
+  written = fwrite(file_buffer_c, 1, off, data_file);
+  LWIP_ASSERT("written == off", written == off);
+}
+
+static int write_checksums(FILE *struct_file, const char *varname,
+                           u16_t hdr_len, u16_t hdr_chksum, const u8_t *file_data, size_t file_size)
+{
+  int chunk_size = TCP_MSS;
+  int offset, src_offset;
+  size_t len;
+  int i = 0;
+#if LWIP_TCP_TIMESTAMPS
+  /* when timestamps are used, usable space is 12 bytes less per segment */
+  chunk_size -= 12;
+#endif
+
+  fprintf(struct_file, "#if HTTPD_PRECALCULATED_CHECKSUM" NEWLINE);
+  fprintf(struct_file, "const struct fsdata_chksum chksums_%s[] = {" NEWLINE, varname);
+
+  if (hdr_len > 0) {
+    /* add checksum for HTTP header */
+    fprintf(struct_file, "{%d, 0x%04x, %d}," NEWLINE, 0, hdr_chksum, hdr_len);
+    i++;
+  }
+  src_offset = 0;
+  for (offset = hdr_len; ; offset += len) {
+    unsigned short chksum;
+    const void *data = (const void *)&file_data[src_offset];
+    len = LWIP_MIN(chunk_size, (int)file_size - src_offset);
+    if (len == 0) {
+      break;
+    }
+    chksum = ~inet_chksum(data, (u16_t)len);
+    /* add checksum for data */
+    fprintf(struct_file, "{%d, 0x%04x, %"SZT_F"}," NEWLINE, offset, chksum, len);
+    i++;
+  }
+  fprintf(struct_file, "};" NEWLINE);
+  fprintf(struct_file, "#endif /* HTTPD_PRECALCULATED_CHECKSUM */" NEWLINE);
+  return i;
+}
+
+static int is_valid_char_for_c_var(char x)
+{
+  if (((x >= 'A') && (x <= 'Z')) ||
+      ((x >= 'a') && (x <= 'z')) ||
+      ((x >= '0') && (x <= '9')) ||
+      (x == '_')) {
+    return 1;
+  }
+  return 0;
+}
+
+static void fix_filename_for_c(char *qualifiedName, size_t max_len)
+{
+  struct file_entry *f;
+  size_t len = strlen(qualifiedName);
+  char *new_name = (char *)malloc(len + 2);
+  int filename_ok;
+  int cnt = 0;
+  size_t i;
+  if (len + 3 == max_len) {
+    printf("File name too long: \"%s\"\n", qualifiedName);
+    exit(-1);
+  }
+  strcpy(new_name, qualifiedName);
+  for (i = 0; i < len; i++) {
+    if (!is_valid_char_for_c_var(new_name[i])) {
+      new_name[i] = '_';
+    }
+  }
+  do {
+    filename_ok = 1;
+    for (f = first_file; f != NULL; f = f->next) {
+      if (!strcmp(f->filename_c, new_name)) {
+        filename_ok = 0;
+        cnt++;
+        /* try next unique file name */
+        sprintf(&new_name[len], "%d", cnt);
+        break;
+      }
+    }
+  } while (!filename_ok && (cnt < 999));
+  if (!filename_ok) {
+    printf("Failed to get unique file name: \"%s\"\n", qualifiedName);
+    exit(-1);
+  }
+  strcpy(qualifiedName, new_name);
+  free(new_name);
+}
+
+static void register_filename(const char *qualifiedName)
+{
+  struct file_entry *fe = (struct file_entry *)malloc(sizeof(struct file_entry));
+  fe->filename_c = strdup(qualifiedName);
+  fe->next = NULL;
+  if (first_file == NULL) {
+    first_file = last_file = fe;
+  } else {
+    last_file->next = fe;
+    last_file = fe;
+  }
+}
+
+static int checkSsiByFilelist(const char* filename_listfile)
+{
+  FILE *f = fopen(filename_listfile, "r");
+  if (f != NULL) {
+    char *buf;
+    long rs;
+    size_t fsize, readcount;
+    size_t i, l, num_lines;
+    char **lines;
+    int state;
+
+    fseek(f, 0, SEEK_END);
+    rs = ftell(f);
+    if (rs < 0) {
+      printf("ftell failed with %d\n", errno);
+      fclose(f);
+      return 0;
+    }
+    fsize = (size_t)rs;
+    fseek(f, 0, SEEK_SET);
+    buf = (char*)malloc(fsize);
+    if (!buf) {
+      printf("failed to allocate ssi file buffer\n");
+      fclose(f);
+      return 0;
+    }
+    memset(buf, 0, fsize);
+    readcount = fread(buf, 1, fsize, f);
+    fclose(f);
+    if ((readcount > fsize) || !readcount) {
+      printf("failed to read data from ssi file\n");
+      free(buf);
+      return 0;
+    }
+
+    /* first pass: get the number of lines (and convert newlines to '0') */
+    num_lines = 1;
+    for (i = 0; i < readcount; i++) {
+      if (buf[i] == '\n') {
+        num_lines++;
+        buf[i] = 0;
+      } else if (buf[i] == '\r') {
+        buf[i] = 0;
+      }
+    }
+    /* allocate the line pointer array */
+    lines = (char**)malloc(sizeof(char*) * num_lines);
+    if (!lines) {
+      printf("failed to allocate ssi line buffer\n");
+      free(buf);
+      return 0;
+    }
+    memset(lines, 0, sizeof(char*) * num_lines);
+    l = 0;
+    state = 0;
+    for (i = 0; i < readcount; i++) {
+      if (state) {
+        /* waiting for null */
+        if (buf[i] == 0) {
+          state = 0;
+        }
+      } else {
+        /* waiting for beginning of new string */
+        if (buf[i] != 0) {
+          LWIP_ASSERT("lines array overflow", l < num_lines);
+          lines[l] = &buf[i];
+          state = 1;
+          l++;
+        }
+      }
+    }
+    LWIP_ASSERT("lines array overflow", l < num_lines);
+
+    ssi_file_buffer = buf;
+    ssi_file_lines = lines;
+    ssi_file_num_lines = l;
+  }
+  return 0;
+}
+
+static int is_ssi_file(const char *filename)
+{
+  if (supportSsi) {
+    if (ssi_file_buffer) {
+      /* compare by list */
+      size_t i;
+      int ret = 0;
+      /* build up the relative path to this file */
+      size_t sublen = strlen(curSubdir);
+      size_t freelen = sizeof(curSubdir) - sublen - 1;
+      strncat(curSubdir, "/", freelen);
+      strncat(curSubdir, filename, freelen - 1);
+      curSubdir[sizeof(curSubdir) - 1] = 0;
+      for (i = 0; i < ssi_file_num_lines; i++) {
+        const char *listed_file = ssi_file_lines[i];
+        /* compare without the leading '/' */
+        if (!strcmp(&curSubdir[1], listed_file)) {
+          ret = 1;
+        }
+      }
+      curSubdir[sublen] = 0;
+      return ret;
+    } else {
+      /* check file extension */
+      size_t loop;
+      for (loop = 0; loop < NUM_SHTML_EXTENSIONS; loop++) {
+        if (strstr(filename, g_pcSSIExtensions[loop])) {
+          return 1;
+        }
+      }
+    }
+  }
+  return 0;
+}
+
+static int ext_in_list(const char* filename, const char *ext_list)
+{
+  int found = 0;
+  const char *ext = ext_list;
+  if (ext_list == NULL) {
+    return 0;
+  }
+  while(*ext != '\0') {
+    const char *comma = strchr(ext, ',');
+    size_t ext_size;
+    size_t filename_size = strlen(filename);
+    if (comma == NULL) {
+      comma = strchr(ext, '\0');
+    }
+    ext_size = comma - ext;
+    if ((filename[filename_size - ext_size - 1] == '.') &&
+      !strncmp(&filename[filename_size - ext_size], ext, ext_size)) {
+        found = 1;
+        break;
+    }
+    ext = comma + 1;
+  }
+
+  return found;
+}
+
+static int file_to_exclude(const char *filename)
+{
+    return (exclude_list != NULL) && ext_in_list(filename, exclude_list);
+}
+
+static int file_can_be_compressed(const char *filename)
+{
+    return (ncompress_list == NULL) || !ext_in_list(filename, ncompress_list);
+}
+
+int process_file(FILE *data_file, FILE *struct_file, const char *filename)
+{
+  char varname[MAX_PATH_LEN];
+  int i = 0;
+  char qualifiedName[MAX_PATH_LEN];
+  int file_size;
+  u16_t http_hdr_chksum = 0;
+  u16_t http_hdr_len = 0;
+  int chksum_count = 0;
+  u8_t flags = 0;
+  u8_t has_content_len;
+  u8_t *file_data;
+  int is_ssi;
+  int can_be_compressed;
+  int is_compressed = 0;
+  int flags_printed;
+
+  /* create qualified name (@todo: prepend slash or not?) */
+  sprintf(qualifiedName, "%s/%s", curSubdir, filename);
+  /* create C variable name */
+  strcpy(varname, qualifiedName);
+  /* convert slashes & dots to underscores */
+  fix_filename_for_c(varname, MAX_PATH_LEN);
+  register_filename(varname);
+#if ALIGN_PAYLOAD
+  /* to force even alignment of array, type 1 */
+  fprintf(data_file, "#if FSDATA_FILE_ALIGNMENT==1" NEWLINE);
+  fprintf(data_file, "static const " PAYLOAD_ALIGN_TYPE " dummy_align_%s = %d;" NEWLINE, varname, payload_alingment_dummy_counter++);
+  fprintf(data_file, "#endif" NEWLINE);
+#endif /* ALIGN_PAYLOAD */
+  fprintf(data_file, "static const unsigned char FSDATA_ALIGN_PRE data_%s[] FSDATA_ALIGN_POST = {" NEWLINE, varname);
+  /* encode source file name (used by file system, not returned to browser) */
+  fprintf(data_file, "/* %s (%"SZT_F" chars) */" NEWLINE, qualifiedName, strlen(qualifiedName) + 1);
+  file_put_ascii(data_file, qualifiedName, strlen(qualifiedName) + 1, &i);
+#if ALIGN_PAYLOAD
+  /* pad to even number of bytes to assure payload is on aligned boundary */
+  while (i % PAYLOAD_ALIGNMENT != 0) {
+    fprintf(data_file, "0x%02x,", 0);
+    i++;
+  }
+#endif /* ALIGN_PAYLOAD */
+  fprintf(data_file, NEWLINE);
+
+  is_ssi = is_ssi_file(filename);
+  if (is_ssi) {
+    flags |= FS_FILE_FLAGS_SSI;
+  }
+  has_content_len = !is_ssi;
+  can_be_compressed = includeHttpHeader && !is_ssi && file_can_be_compressed(filename);
+  file_data = get_file_data(filename, &file_size, can_be_compressed, &is_compressed);
+  if (includeHttpHeader) {
+    file_write_http_header(data_file, filename, file_size, &http_hdr_len, &http_hdr_chksum, has_content_len, is_compressed);
+    flags |= FS_FILE_FLAGS_HEADER_INCLUDED;
+    if (has_content_len) {
+      flags |= FS_FILE_FLAGS_HEADER_PERSISTENT;
+      if (useHttp11) {
+        flags |= FS_FILE_FLAGS_HEADER_HTTPVER_1_1;
+      }
+    }
+  }
+  if (precalcChksum) {
+    chksum_count = write_checksums(struct_file, varname, http_hdr_len, http_hdr_chksum, file_data, file_size);
+  }
+
+  /* build declaration of struct fsdata_file in temp file */
+  fprintf(struct_file, "const struct fsdata_file file_%s[] = { {" NEWLINE, varname);
+  fprintf(struct_file, "file_%s," NEWLINE, lastFileVar);
+  fprintf(struct_file, "data_%s," NEWLINE, varname);
+  fprintf(struct_file, "data_%s + %d," NEWLINE, varname, i);
+  fprintf(struct_file, "sizeof(data_%s) - %d," NEWLINE, varname, i);
+
+  flags_printed = 0;
+  if (flags & FS_FILE_FLAGS_HEADER_INCLUDED) {
+    fputs("FS_FILE_FLAGS_HEADER_INCLUDED", struct_file);
+    flags_printed = 1;
+  }
+  if (flags & FS_FILE_FLAGS_HEADER_PERSISTENT) {
+    if (flags_printed) {
+      fputs(" | ", struct_file);
+    }
+    fputs("FS_FILE_FLAGS_HEADER_PERSISTENT", struct_file);
+    flags_printed = 1;
+  }
+  if (flags & FS_FILE_FLAGS_HEADER_HTTPVER_1_1) {
+    if (flags_printed) {
+      fputs(" | ", struct_file);
+    }
+    fputs("FS_FILE_FLAGS_HEADER_HTTPVER_1_1", struct_file);
+    flags_printed = 1;
+  }
+  if (flags & FS_FILE_FLAGS_SSI) {
+    if (flags_printed) {
+      fputs(" | ", struct_file);
+    }
+    fputs("FS_FILE_FLAGS_SSI", struct_file);
+    flags_printed = 1;
+  }
+  if (!flags_printed) {
+    fputs("0", struct_file);
+  }
+  fputs("," NEWLINE, struct_file);
+  if (precalcChksum) {
+    fprintf(struct_file, "#if HTTPD_PRECALCULATED_CHECKSUM" NEWLINE);
+    fprintf(struct_file, "%d, chksums_%s," NEWLINE, chksum_count, varname);
+    fprintf(struct_file, "#endif /* HTTPD_PRECALCULATED_CHECKSUM */" NEWLINE);
+  }
+  fprintf(struct_file, "}};" NEWLINE NEWLINE);
+  strcpy(lastFileVar, varname);
+
+  /* write actual file contents */
+  i = 0;
+  fprintf(data_file, NEWLINE "/* raw file data (%d bytes) */" NEWLINE, file_size);
+  process_file_data(data_file, file_data, file_size);
+  fprintf(data_file, "};" NEWLINE NEWLINE);
+  free(file_data);
+  return 0;
+}
+
+int file_write_http_header(FILE *data_file, const char *filename, int file_size, u16_t *http_hdr_len,
+                           u16_t *http_hdr_chksum, u8_t provide_content_len, int is_compressed)
+{
+  int i = 0;
+  int response_type = HTTP_HDR_OK;
+  const char *file_type;
+  const char *cur_string;
+  size_t cur_len;
+  int written = 0;
+  size_t hdr_len = 0;
+  u16_t acc;
+  const char *file_ext;
+  size_t j;
+  u8_t provide_last_modified = includeLastModified;
+
+  memset(hdr_buf, 0, sizeof(hdr_buf));
+
+  if (useHttp11) {
+    response_type = HTTP_HDR_OK_11;
+  }
+
+  fprintf(data_file, NEWLINE "/* HTTP header */");
+  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) {
+    response_type = HTTP_HDR_BAD_REQUEST;
+    if (useHttp11) {
+      response_type = HTTP_HDR_BAD_REQUEST_11;
+    }
+  } else if (strstr(filename, "501") == filename) {
+    response_type = HTTP_HDR_NOT_IMPL;
+    if (useHttp11) {
+      response_type = HTTP_HDR_NOT_IMPL_11;
+    }
+  }
+  cur_string = g_psHTTPHeaderStrings[response_type];
+  cur_len = strlen(cur_string);
+  fprintf(data_file, NEWLINE "/* \"%s\" (%"SZT_F" bytes) */" NEWLINE, cur_string, cur_len);
+  written += file_put_ascii(data_file, cur_string, cur_len, &i);
+  i = 0;
+  if (precalcChksum) {
+    memcpy(&hdr_buf[hdr_len], cur_string, cur_len);
+    hdr_len += cur_len;
+  }
+
+  cur_string = serverID;
+  cur_len = strlen(cur_string);
+  fprintf(data_file, NEWLINE "/* \"%s\" (%"SZT_F" bytes) */" NEWLINE, cur_string, cur_len);
+  written += file_put_ascii(data_file, cur_string, cur_len, &i);
+  i = 0;
+  if (precalcChksum) {
+    memcpy(&hdr_buf[hdr_len], cur_string, cur_len);
+    hdr_len += cur_len;
+  }
+
+  file_ext = filename;
+  if (file_ext != NULL) {
+    while (strstr(file_ext, ".") != NULL) {
+      file_ext = strstr(file_ext, ".");
+      file_ext++;
+    }
+  }
+  if ((file_ext == NULL) || (*file_ext == 0)) {
+    printf("failed to get extension for file \"%s\", using default.\n", filename);
+    file_type = HTTP_HDR_DEFAULT_TYPE;
+  } else {
+    file_type = NULL;
+    for (j = 0; j < NUM_HTTP_HEADERS; j++) {
+      if (!strcmp(file_ext, g_psHTTPHeaders[j].extension)) {
+        file_type = g_psHTTPHeaders[j].content_type;
+        break;
+      }
+    }
+    if (file_type == NULL) {
+      printf("failed to get file type for extension \"%s\", using default.\n", file_ext);
+      file_type = HTTP_HDR_DEFAULT_TYPE;
+    }
+  }
+
+  /* Content-Length is used for persistent connections in HTTP/1.1 but also for
+     download progress in older versions
+     @todo: just use a big-enough buffer and let the HTTPD send spaces? */
+  if (provide_content_len) {
+    char intbuf[MAX_PATH_LEN];
+    int content_len = file_size;
+    memset(intbuf, 0, sizeof(intbuf));
+    cur_string = g_psHTTPHeaderStrings[HTTP_HDR_CONTENT_LENGTH];
+    cur_len = strlen(cur_string);
+    fprintf(data_file, NEWLINE "/* \"%s%d\r\n\" (%"SZT_F"+ bytes) */" NEWLINE, cur_string, content_len, cur_len + 2);
+    written += file_put_ascii(data_file, cur_string, cur_len, &i);
+    if (precalcChksum) {
+      memcpy(&hdr_buf[hdr_len], cur_string, cur_len);
+      hdr_len += cur_len;
+    }
+
+    lwip_itoa(intbuf, sizeof(intbuf), content_len);
+    strcat(intbuf, "\r\n");
+    cur_len = strlen(intbuf);
+    written += file_put_ascii(data_file, intbuf, cur_len, &i);
+    i = 0;
+    if (precalcChksum) {
+      memcpy(&hdr_buf[hdr_len], intbuf, cur_len);
+      hdr_len += cur_len;
+    }
+  }
+  if (provide_last_modified) {
+    char modbuf[256];
+    struct stat stat_data;
+    struct tm *t;
+    memset(modbuf, 0, sizeof(modbuf));
+    memset(&stat_data, 0, sizeof(stat_data));
+    cur_string = modbuf;
+    strcpy(modbuf, "Last-Modified: ");
+    if (stat(filename, &stat_data) != 0) {
+      printf("stat(%s) failed with error %d\n", filename, errno);
+      exit(-1);
+    }
+    t = gmtime(&stat_data.st_mtime);
+    if (t == NULL) {
+      printf("gmtime() failed with error %d\n", errno);
+      exit(-1);
+    }
+    strftime(&modbuf[15], sizeof(modbuf) - 15, "%a, %d %b %Y %H:%M:%S GMT", t);
+    cur_len = strlen(cur_string);
+    fprintf(data_file, NEWLINE "/* \"%s\"\r\n\" (%"SZT_F"+ bytes) */" NEWLINE, cur_string, cur_len + 2);
+    written += file_put_ascii(data_file, cur_string, cur_len, &i);
+    if (precalcChksum) {
+      memcpy(&hdr_buf[hdr_len], cur_string, cur_len);
+      hdr_len += cur_len;
+    }
+
+    modbuf[0] = 0;
+    strcat(modbuf, "\r\n");
+    cur_len = strlen(modbuf);
+    written += file_put_ascii(data_file, modbuf, cur_len, &i);
+    i = 0;
+    if (precalcChksum) {
+      memcpy(&hdr_buf[hdr_len], modbuf, cur_len);
+      hdr_len += cur_len;
+    }
+  }
+
+  /* HTTP/1.1 implements persistent connections */
+  if (useHttp11) {
+    if (provide_content_len) {
+      cur_string = g_psHTTPHeaderStrings[HTTP_HDR_CONN_KEEPALIVE];
+    } else {
+      /* no Content-Length available, so a persistent connection is no possible
+         because the client does not know the data length */
+      cur_string = g_psHTTPHeaderStrings[HTTP_HDR_CONN_CLOSE];
+    }
+    cur_len = strlen(cur_string);
+    fprintf(data_file, NEWLINE "/* \"%s\" (%"SZT_F" bytes) */" NEWLINE, cur_string, cur_len);
+    written += file_put_ascii(data_file, cur_string, cur_len, &i);
+    i = 0;
+    if (precalcChksum) {
+      memcpy(&hdr_buf[hdr_len], cur_string, cur_len);
+      hdr_len += cur_len;
+    }
+  }
+
+#if MAKEFS_SUPPORT_DEFLATE
+  if (is_compressed) {
+    /* tell the client about the deflate encoding */
+    LWIP_ASSERT("error", deflateNonSsiFiles);
+    cur_string = "Content-Encoding: deflate\r\n";
+    cur_len = strlen(cur_string);
+    fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len);
+    written += file_put_ascii(data_file, cur_string, cur_len, &i);
+    i = 0;
+  }
+#else
+  LWIP_UNUSED_ARG(is_compressed);
+#endif
+
+  /* write content-type, ATTENTION: this includes the double-CRLF! */
+  cur_string = file_type;
+  cur_len = strlen(cur_string);
+  fprintf(data_file, NEWLINE "/* \"%s\" (%"SZT_F" bytes) */" NEWLINE, cur_string, cur_len);
+  written += file_put_ascii(data_file, cur_string, cur_len, &i);
+  i = 0;
+
+  /* ATTENTION: headers are done now (double-CRLF has been written!) */
+
+  if (precalcChksum) {
+    LWIP_ASSERT("hdr_len + cur_len <= sizeof(hdr_buf)", hdr_len + cur_len <= sizeof(hdr_buf));
+    memcpy(&hdr_buf[hdr_len], cur_string, cur_len);
+    hdr_len += cur_len;
+
+    LWIP_ASSERT("strlen(hdr_buf) == hdr_len", strlen(hdr_buf) == hdr_len);
+    acc = ~inet_chksum(hdr_buf, (u16_t)hdr_len);
+    *http_hdr_len = (u16_t)hdr_len;
+    *http_hdr_chksum = acc;
+  }
+
+  return written;
+}
+
+int file_put_ascii(FILE *file, const char *ascii_string, int len, int *i)
+{
+  int x;
+  for (x = 0; x < len; x++) {
+    unsigned char cur = ascii_string[x];
+    fprintf(file, "0x%02x,", cur);
+    if ((++(*i) % HEX_BYTES_PER_LINE) == 0) {
+      fprintf(file, NEWLINE);
+    }
+  }
+  return len;
+}
+
+int s_put_ascii(char *buf, const char *ascii_string, int len, int *i)
+{
+  int x;
+  int idx = 0;
+  for (x = 0; x < len; x++) {
+    unsigned char cur = ascii_string[x];
+    sprintf(&buf[idx], "0x%02x,", cur);
+    idx += 5;
+    if ((++(*i) % HEX_BYTES_PER_LINE) == 0) {
+      sprintf(&buf[idx], NEWLINE);
+      idx += NEWLINE_LEN;
+    }
+  }
+  return len;
+}
diff --git a/src/apps/httpd/makefsdata/readme.txt b/src/apps/http/makefsdata/readme.txt
similarity index 100%
rename from src/apps/httpd/makefsdata/readme.txt
rename to src/apps/http/makefsdata/readme.txt
diff --git a/src/apps/http/makefsdata/tinydir.h b/src/apps/http/makefsdata/tinydir.h
new file mode 100644
index 0000000..32ae5e8
--- /dev/null
+++ b/src/apps/http/makefsdata/tinydir.h
@@ -0,0 +1,808 @@
+/*
+Copyright (c) 2013-2017, tinydir authors:
+- Cong Xu
+- Lautis Sun
+- Baudouin Feildel
+- Andargor <andargor@yahoo.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.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef TINYDIR_H
+#define TINYDIR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if ((defined _UNICODE) && !(defined UNICODE))
+#define UNICODE
+#endif
+
+#if ((defined UNICODE) && !(defined _UNICODE))
+#define _UNICODE
+#endif
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef _MSC_VER
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# include <tchar.h>
+# pragma warning(push)
+# pragma warning (disable : 4996)
+#else
+# include <dirent.h>
+# include <libgen.h>
+# include <sys/stat.h>
+# include <stddef.h>
+#endif
+#ifdef __MINGW32__
+# include <tchar.h>
+#endif
+
+
+/* types */
+
+/* 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
+#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
+#endif
+
+#if (defined _MSC_VER || defined __MINGW32__)
+#include <windows.h>
+#define _TINYDIR_PATH_MAX MAX_PATH
+#elif defined  __linux__
+#include <linux/limits.h>
+#define _TINYDIR_PATH_MAX PATH_MAX
+#else
+#define _TINYDIR_PATH_MAX 4096
+#endif
+
+#ifdef _MSC_VER
+/* extra chars for the "\\*" mask */
+# define _TINYDIR_PATH_EXTRA 2
+#else
+# define _TINYDIR_PATH_EXTRA 0
+#endif
+
+#define _TINYDIR_FILENAME_MAX 256
+
+#if (defined _MSC_VER || defined __MINGW32__)
+#define _TINYDIR_DRIVE_MAX 3
+#endif
+
+#ifdef _MSC_VER
+# define _TINYDIR_FUNC static __inline
+#elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# define _TINYDIR_FUNC static __inline__
+#else
+# define _TINYDIR_FUNC static inline
+#endif
+
+/* readdir_r usage; define TINYDIR_USE_READDIR_R to use it (if supported) */
+#ifdef TINYDIR_USE_READDIR_R
+
+/* readdir_r is a POSIX-only function, and may not be available under various
+ * environments/settings, e.g. MinGW. Use readdir fallback */
+#if _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE ||\
+	_POSIX_SOURCE
+# define _TINYDIR_HAS_READDIR_R
+#endif
+#if _POSIX_C_SOURCE >= 200112L
+# define _TINYDIR_HAS_FPATHCONF
+# include <unistd.h>
+#endif
+#if _BSD_SOURCE || _SVID_SOURCE || \
+	(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700)
+# define _TINYDIR_HAS_DIRFD
+# include <sys/types.h>
+#endif
+#if defined _TINYDIR_HAS_FPATHCONF && defined _TINYDIR_HAS_DIRFD &&\
+	defined _PC_NAME_MAX
+# define _TINYDIR_USE_FPATHCONF
+#endif
+#if defined __MINGW32__ || !defined _TINYDIR_HAS_READDIR_R ||\
+	!(defined _TINYDIR_USE_FPATHCONF || defined NAME_MAX)
+# define _TINYDIR_USE_READDIR
+#endif
+
+/* Use readdir by default */
+#else
+# define _TINYDIR_USE_READDIR
+#endif
+
+/* MINGW32 has two versions of dirent, ASCII and UNICODE*/
+#ifndef _MSC_VER
+#if (defined __MINGW32__) && (defined _UNICODE)
+#define _TINYDIR_DIR _WDIR
+#define _tinydir_dirent _wdirent
+#define _tinydir_opendir _wopendir
+#define _tinydir_readdir _wreaddir
+#define _tinydir_closedir _wclosedir
+#else
+#define _TINYDIR_DIR DIR
+#define _tinydir_dirent dirent
+#define _tinydir_opendir opendir
+#define _tinydir_readdir readdir
+#define _tinydir_closedir closedir
+#endif
+#endif
+
+/* Allow user to use a custom allocator by defining _TINYDIR_MALLOC and _TINYDIR_FREE. */
+#if    defined(_TINYDIR_MALLOC) &&  defined(_TINYDIR_FREE)
+#elif !defined(_TINYDIR_MALLOC) && !defined(_TINYDIR_FREE)
+#else
+#error "Either define both alloc and free or none of them!"
+#endif
+
+#if !defined(_TINYDIR_MALLOC)
+	#define _TINYDIR_MALLOC(_size) malloc(_size)
+	#define _TINYDIR_FREE(_ptr)    free(_ptr)
+#endif /* !defined(_TINYDIR_MALLOC) */
+
+typedef struct tinydir_file
+{
+	_tinydir_char_t path[_TINYDIR_PATH_MAX];
+	_tinydir_char_t name[_TINYDIR_FILENAME_MAX];
+	_tinydir_char_t *extension;
+	int is_dir;
+	int is_reg;
+
+#ifndef _MSC_VER
+#ifdef __MINGW32__
+	struct _stat _s;
+#else
+	struct stat _s;
+#endif
+#endif
+} tinydir_file;
+
+typedef struct tinydir_dir
+{
+	_tinydir_char_t path[_TINYDIR_PATH_MAX];
+	int has_next;
+	size_t n_files;
+
+	tinydir_file *_files;
+#ifdef _MSC_VER
+	HANDLE _h;
+	WIN32_FIND_DATA _f;
+#else
+	_TINYDIR_DIR *_d;
+	struct _tinydir_dirent *_e;
+#ifndef _TINYDIR_USE_READDIR
+	struct _tinydir_dirent *_ep;
+#endif
+#endif
+} tinydir_dir;
+
+
+/* declarations */
+
+_TINYDIR_FUNC
+int tinydir_open(tinydir_dir *dir, const _tinydir_char_t *path);
+_TINYDIR_FUNC
+int tinydir_open_sorted(tinydir_dir *dir, const _tinydir_char_t *path);
+_TINYDIR_FUNC
+void tinydir_close(tinydir_dir *dir);
+
+_TINYDIR_FUNC
+int tinydir_next(tinydir_dir *dir);
+_TINYDIR_FUNC
+int tinydir_readfile(const tinydir_dir *dir, tinydir_file *file);
+_TINYDIR_FUNC
+int tinydir_readfile_n(const tinydir_dir *dir, tinydir_file *file, size_t i);
+_TINYDIR_FUNC
+int tinydir_open_subdir_n(tinydir_dir *dir, size_t i);
+
+_TINYDIR_FUNC
+int tinydir_file_open(tinydir_file *file, const _tinydir_char_t *path);
+_TINYDIR_FUNC
+void _tinydir_get_ext(tinydir_file *file);
+_TINYDIR_FUNC
+int _tinydir_file_cmp(const void *a, const void *b);
+#ifndef _MSC_VER
+#ifndef _TINYDIR_USE_READDIR
+_TINYDIR_FUNC
+size_t _tinydir_dirent_buf_size(_TINYDIR_DIR *dirp);
+#endif
+#endif
+
+
+/* definitions*/
+
+_TINYDIR_FUNC
+int tinydir_open(tinydir_dir *dir, const _tinydir_char_t *path)
+{
+#ifndef _MSC_VER
+#ifndef _TINYDIR_USE_READDIR
+	int error;
+	int size;	/* using int size */
+#endif
+#else
+	_tinydir_char_t path_buf[_TINYDIR_PATH_MAX];
+#endif
+	_tinydir_char_t *pathp;
+
+	if (dir == NULL || path == NULL || _tinydir_strlen(path) == 0)
+	{
+		errno = EINVAL;
+		return -1;
+	}
+	if (_tinydir_strlen(path) + _TINYDIR_PATH_EXTRA >= _TINYDIR_PATH_MAX)
+	{
+		errno = ENAMETOOLONG;
+		return -1;
+	}
+
+	/* initialise dir */
+	dir->_files = NULL;
+#ifdef _MSC_VER
+	dir->_h = INVALID_HANDLE_VALUE;
+#else
+	dir->_d = NULL;
+#ifndef _TINYDIR_USE_READDIR
+	dir->_ep = NULL;
+#endif
+#endif
+	tinydir_close(dir);
+
+	_tinydir_strcpy(dir->path, path);
+	/* Remove trailing slashes */
+	pathp = &dir->path[_tinydir_strlen(dir->path) - 1];
+	while (pathp != dir->path && (*pathp == TINYDIR_STRING('\\') || *pathp == TINYDIR_STRING('/')))
+	{
+		*pathp = TINYDIR_STRING('\0');
+		pathp++;
+	}
+#ifdef _MSC_VER
+	_tinydir_strcpy(path_buf, dir->path);
+	_tinydir_strcat(path_buf, TINYDIR_STRING("\\*"));
+#if (defined WINAPI_FAMILY) && (WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP)
+	dir->_h = FindFirstFileEx(path_buf, FindExInfoStandard, &dir->_f, FindExSearchNameMatch, NULL, 0);
+#else
+	dir->_h = FindFirstFile(path_buf, &dir->_f);
+#endif
+	if (dir->_h == INVALID_HANDLE_VALUE)
+	{
+		errno = ENOENT;
+#else
+	dir->_d = _tinydir_opendir(path);
+	if (dir->_d == NULL)
+	{
+#endif
+		goto bail;
+	}
+
+	/* read first file */
+	dir->has_next = 1;
+#ifndef _MSC_VER
+#ifdef _TINYDIR_USE_READDIR
+	dir->_e = _tinydir_readdir(dir->_d);
+#else
+	/* allocate dirent buffer for readdir_r */
+	size = _tinydir_dirent_buf_size(dir->_d); /* conversion to int */
+	if (size == -1) return -1;
+	dir->_ep = (struct _tinydir_dirent*)_TINYDIR_MALLOC(size);
+	if (dir->_ep == NULL) return -1;
+
+	error = readdir_r(dir->_d, dir->_ep, &dir->_e);
+	if (error != 0) return -1;
+#endif
+	if (dir->_e == NULL)
+	{
+		dir->has_next = 0;
+	}
+#endif
+
+	return 0;
+
+bail:
+	tinydir_close(dir);
+	return -1;
+}
+
+_TINYDIR_FUNC
+int tinydir_open_sorted(tinydir_dir *dir, const _tinydir_char_t *path)
+{
+	/* Count the number of files first, to pre-allocate the files array */
+	size_t n_files = 0;
+	if (tinydir_open(dir, path) == -1)
+	{
+		return -1;
+	}
+	while (dir->has_next)
+	{
+		n_files++;
+		if (tinydir_next(dir) == -1)
+		{
+			goto bail;
+		}
+	}
+	tinydir_close(dir);
+
+	if (tinydir_open(dir, path) == -1)
+	{
+		return -1;
+	}
+
+	dir->n_files = 0;
+	dir->_files = (tinydir_file *)_TINYDIR_MALLOC(sizeof *dir->_files * n_files);
+	if (dir->_files == NULL)
+	{
+		goto bail;
+	}
+	while (dir->has_next)
+	{
+		tinydir_file *p_file;
+		dir->n_files++;
+
+		p_file = &dir->_files[dir->n_files - 1];
+		if (tinydir_readfile(dir, p_file) == -1)
+		{
+			goto bail;
+		}
+
+		if (tinydir_next(dir) == -1)
+		{
+			goto bail;
+		}
+
+		/* Just in case the number of files has changed between the first and
+		second reads, terminate without writing into unallocated memory */
+		if (dir->n_files == n_files)
+		{
+			break;
+		}
+	}
+
+	qsort(dir->_files, dir->n_files, sizeof(tinydir_file), _tinydir_file_cmp);
+
+	return 0;
+
+bail:
+	tinydir_close(dir);
+	return -1;
+}
+
+_TINYDIR_FUNC
+void tinydir_close(tinydir_dir *dir)
+{
+	if (dir == NULL)
+	{
+		return;
+	}
+
+	memset(dir->path, 0, sizeof(dir->path));
+	dir->has_next = 0;
+	dir->n_files = 0;
+	_TINYDIR_FREE(dir->_files);
+	dir->_files = NULL;
+#ifdef _MSC_VER
+	if (dir->_h != INVALID_HANDLE_VALUE)
+	{
+		FindClose(dir->_h);
+	}
+	dir->_h = INVALID_HANDLE_VALUE;
+#else
+	if (dir->_d)
+	{
+		_tinydir_closedir(dir->_d);
+	}
+	dir->_d = NULL;
+	dir->_e = NULL;
+#ifndef _TINYDIR_USE_READDIR
+	_TINYDIR_FREE(dir->_ep);
+	dir->_ep = NULL;
+#endif
+#endif
+}
+
+_TINYDIR_FUNC
+int tinydir_next(tinydir_dir *dir)
+{
+	if (dir == NULL)
+	{
+		errno = EINVAL;
+		return -1;
+	}
+	if (!dir->has_next)
+	{
+		errno = ENOENT;
+		return -1;
+	}
+
+#ifdef _MSC_VER
+	if (FindNextFile(dir->_h, &dir->_f) == 0)
+#else
+#ifdef _TINYDIR_USE_READDIR
+	dir->_e = _tinydir_readdir(dir->_d);
+#else
+	if (dir->_ep == NULL)
+	{
+		return -1;
+	}
+	if (readdir_r(dir->_d, dir->_ep, &dir->_e) != 0)
+	{
+		return -1;
+	}
+#endif
+	if (dir->_e == NULL)
+#endif
+	{
+		dir->has_next = 0;
+#ifdef _MSC_VER
+		if (GetLastError() != ERROR_SUCCESS &&
+			GetLastError() != ERROR_NO_MORE_FILES)
+		{
+			tinydir_close(dir);
+			errno = EIO;
+			return -1;
+		}
+#endif
+	}
+
+	return 0;
+}
+
+_TINYDIR_FUNC
+int tinydir_readfile(const tinydir_dir *dir, tinydir_file *file)
+{
+	if (dir == NULL || file == NULL)
+	{
+		errno = EINVAL;
+		return -1;
+	}
+#ifdef _MSC_VER
+	if (dir->_h == INVALID_HANDLE_VALUE)
+#else
+	if (dir->_e == NULL)
+#endif
+	{
+		errno = ENOENT;
+		return -1;
+	}
+	if (_tinydir_strlen(dir->path) +
+		_tinydir_strlen(
+#ifdef _MSC_VER
+			dir->_f.cFileName
+#else
+			dir->_e->d_name
+#endif
+		) + 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)
+	{
+		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);
+#ifndef _MSC_VER
+#ifdef __MINGW32__
+	if (_tstat(
+#else
+	if (stat(
+#endif
+		file->path, &file->_s) == -1)
+	{
+		return -1;
+	}
+#endif
+	_tinydir_get_ext(file);
+
+	file->is_dir =
+#ifdef _MSC_VER
+		!!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
+#else
+		S_ISDIR(file->_s.st_mode);
+#endif
+	file->is_reg =
+#ifdef _MSC_VER
+		!!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_NORMAL) ||
+		(
+			!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DEVICE) &&
+			!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
+			!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED) &&
+#ifdef FILE_ATTRIBUTE_INTEGRITY_STREAM
+			!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_INTEGRITY_STREAM) &&
+#endif
+#ifdef FILE_ATTRIBUTE_NO_SCRUB_DATA
+			!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_NO_SCRUB_DATA) &&
+#endif
+			!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE) &&
+			!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY));
+#else
+		S_ISREG(file->_s.st_mode);
+#endif
+
+	return 0;
+}
+
+_TINYDIR_FUNC
+int tinydir_readfile_n(const tinydir_dir *dir, tinydir_file *file, size_t i)
+{
+	if (dir == NULL || file == NULL)
+	{
+		errno = EINVAL;
+		return -1;
+	}
+	if (i >= dir->n_files)
+	{
+		errno = ENOENT;
+		return -1;
+	}
+
+	memcpy(file, &dir->_files[i], sizeof(tinydir_file));
+	_tinydir_get_ext(file);
+
+	return 0;
+}
+
+_TINYDIR_FUNC
+int tinydir_open_subdir_n(tinydir_dir *dir, size_t i)
+{
+	_tinydir_char_t path[_TINYDIR_PATH_MAX];
+	if (dir == NULL)
+	{
+		errno = EINVAL;
+		return -1;
+	}
+	if (i >= dir->n_files || !dir->_files[i].is_dir)
+	{
+		errno = ENOENT;
+		return -1;
+	}
+
+	_tinydir_strcpy(path, dir->_files[i].path);
+	tinydir_close(dir);
+	if (tinydir_open_sorted(dir, path) == -1)
+	{
+		return -1;
+	}
+
+	return 0;
+}
+
+/* Open a single file given its path */
+_TINYDIR_FUNC
+int tinydir_file_open(tinydir_file *file, const _tinydir_char_t *path)
+{
+	tinydir_dir dir;
+	int result = 0;
+	int found = 0;
+	_tinydir_char_t dir_name_buf[_TINYDIR_PATH_MAX];
+	_tinydir_char_t file_name_buf[_TINYDIR_FILENAME_MAX];
+	_tinydir_char_t *dir_name;
+	_tinydir_char_t *base_name;
+#if (defined _MSC_VER || defined __MINGW32__)
+	_tinydir_char_t drive_buf[_TINYDIR_PATH_MAX];
+	_tinydir_char_t ext_buf[_TINYDIR_FILENAME_MAX];
+#endif
+
+	if (file == NULL || path == NULL || _tinydir_strlen(path) == 0)
+	{
+		errno = EINVAL;
+		return -1;
+	}
+	if (_tinydir_strlen(path) + _TINYDIR_PATH_EXTRA >= _TINYDIR_PATH_MAX)
+	{
+		errno = ENAMETOOLONG;
+		return -1;
+	}
+
+	/* 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);
+#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';
+#endif
+
+	if (errno)
+	{
+		errno = EINVAL;
+		return -1;
+	}
+	/* Emulate the behavior of dirname by returning "." for dir name if it's
+	empty */
+	if (drive_buf[0] == '\0' && dir_name_buf[0] == '\0')
+	{
+		_tinydir_strcpy(dir_name_buf, TINYDIR_STRING("."));
+	}
+	/* Concatenate the drive letter and dir name to form full dir name */
+	_tinydir_strcat(drive_buf, dir_name_buf);
+	dir_name = drive_buf;
+	/* Concatenate the file name and extension to form base name */
+	_tinydir_strcat(file_name_buf, ext_buf);
+	base_name = file_name_buf;
+#else
+	_tinydir_strcpy(dir_name_buf, path);
+	dir_name = dirname(dir_name_buf);
+	_tinydir_strcpy(file_name_buf, path);
+	base_name =basename(file_name_buf);
+#endif
+
+	/* Open the parent directory */
+	if (tinydir_open(&dir, dir_name) == -1)
+	{
+		return -1;
+	}
+
+	/* Read through the parent directory and look for the file */
+	while (dir.has_next)
+	{
+		if (tinydir_readfile(&dir, file) == -1)
+		{
+			result = -1;
+			goto bail;
+		}
+		if (_tinydir_strcmp(file->name, base_name) == 0)
+		{
+			/* File found */
+			found = 1;
+			break;
+		}
+		tinydir_next(&dir);
+	}
+	if (!found)
+	{
+		result = -1;
+		errno = ENOENT;
+	}
+
+bail:
+	tinydir_close(&dir);
+	return result;
+}
+
+_TINYDIR_FUNC
+void _tinydir_get_ext(tinydir_file *file)
+{
+	_tinydir_char_t *period = _tinydir_strrchr(file->name, TINYDIR_STRING('.'));
+	if (period == NULL)
+	{
+		file->extension = &(file->name[_tinydir_strlen(file->name)]);
+	}
+	else
+	{
+		file->extension = period + 1;
+	}
+}
+
+_TINYDIR_FUNC
+int _tinydir_file_cmp(const void *a, const void *b)
+{
+	const tinydir_file *fa = (const tinydir_file *)a;
+	const tinydir_file *fb = (const tinydir_file *)b;
+	if (fa->is_dir != fb->is_dir)
+	{
+		return -(fa->is_dir - fb->is_dir);
+	}
+	return _tinydir_strncmp(fa->name, fb->name, _TINYDIR_FILENAME_MAX);
+}
+
+#ifndef _MSC_VER
+#ifndef _TINYDIR_USE_READDIR
+/*
+The following authored by Ben Hutchings <ben@decadent.org.uk>
+from https://womble.decadent.org.uk/readdir_r-advisory.html
+*/
+/* Calculate the required buffer size (in bytes) for directory      *
+* entries read from the given directory handle.  Return -1 if this  *
+* this cannot be done.                                              *
+*                                                                   *
+* This code does not trust values of NAME_MAX that are less than    *
+* 255, since some systems (including at least HP-UX) incorrectly    *
+* define it to be a smaller value.                                  */
+_TINYDIR_FUNC
+size_t _tinydir_dirent_buf_size(_TINYDIR_DIR *dirp)
+{
+	long name_max;
+	size_t name_end;
+	/* parameter may be unused */
+	(void)dirp;
+
+#if defined _TINYDIR_USE_FPATHCONF
+	name_max = fpathconf(dirfd(dirp), _PC_NAME_MAX);
+	if (name_max == -1)
+#if defined(NAME_MAX)
+		name_max = (NAME_MAX > 255) ? NAME_MAX : 255;
+#else
+		return (size_t)(-1);
+#endif
+#elif defined(NAME_MAX)
+ 	name_max = (NAME_MAX > 255) ? NAME_MAX : 255;
+#else
+#error "buffer size for readdir_r cannot be determined"
+#endif
+	name_end = (size_t)offsetof(struct _tinydir_dirent, d_name) + name_max + 1;
+	return (name_end > sizeof(struct _tinydir_dirent) ?
+		name_end : sizeof(struct _tinydir_dirent));
+}
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+# if defined (_MSC_VER)
+# pragma warning(pop)
+# endif
+
+#endif
diff --git a/src/apps/httpd/fs.c b/src/apps/httpd/fs.c
deleted file mode 100644
index 35b5e31..0000000
--- a/src/apps/httpd/fs.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * 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/apps/httpd_opts.h"
-#include "lwip/def.h"
-#include "lwip/apps/fs.h"
-#include "fsdata.h"
-#include <string.h>
-
-
-#if HTTPD_USE_CUSTOM_FSDATA
-#include "fsdata_custom.c"
-#else /* HTTPD_USE_CUSTOM_FSDATA */
-#include "fsdata.c"
-#endif /* HTTPD_USE_CUSTOM_FSDATA */
-
-/*-----------------------------------------------------------------------------------*/
-
-#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)
-{
-  const struct fsdata_file *f;
-
-  if ((file == NULL) || (name == NULL)) {
-     return ERR_ARG;
-  }
-
-#if LWIP_HTTPD_CUSTOM_FILES
-  if (fs_open_custom(file, name)) {
-    file->is_custom_file = 1;
-    return ERR_OK;
-  }
-  file->is_custom_file = 0;
-#endif /* LWIP_HTTPD_CUSTOM_FILES */
-
-  for (f = FS_ROOT; f != NULL; f = f->next) {
-    if (!strcmp(name, (const char *)f->name)) {
-      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_STATE
-      file->state = fs_state_init(file, name);
-#endif /* #if LWIP_HTTPD_FILE_STATE */
-      return ERR_OK;
-    }
-  }
-  /* file not found */
-  return ERR_VAL;
-}
-
-/*-----------------------------------------------------------------------------------*/
-void
-fs_close(struct fs_file *file)
-{
-#if LWIP_HTTPD_CUSTOM_FILES
-  if (file->is_custom_file) {
-    fs_close_custom(file);
-  }
-#endif /* LWIP_HTTPD_CUSTOM_FILES */
-#if LWIP_HTTPD_FILE_STATE
-  fs_state_free(file, file->state);
-#endif /* #if LWIP_HTTPD_FILE_STATE */
-  LWIP_UNUSED_ARG(file);
-}
-/*-----------------------------------------------------------------------------------*/
-#if LWIP_HTTPD_DYNAMIC_FILE_READ
-#if LWIP_HTTPD_FS_ASYNC_READ
-int
-fs_read_async(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(struct fs_file *file, char *buffer, int count)
-#endif /* LWIP_HTTPD_FS_ASYNC_READ */
-{
-  int read;
-  if(file->index == file->len) {
-    return FS_READ_EOF;
-  }
-#if LWIP_HTTPD_FS_ASYNC_READ
-  LWIP_UNUSED_ARG(callback_fn);
-  LWIP_UNUSED_ARG(callback_arg);
-#endif /* LWIP_HTTPD_FS_ASYNC_READ */
-#if LWIP_HTTPD_CUSTOM_FILES
-  if (file->is_custom_file) {
-#if LWIP_HTTPD_FS_ASYNC_READ
-    return fs_read_async_custom(file, buffer, count, callback_fn, callback_arg);
-#else /* LWIP_HTTPD_FS_ASYNC_READ */
-    return fs_read_custom(file, buffer, count);
-#endif /* LWIP_HTTPD_FS_ASYNC_READ */
-  }
-#endif /* LWIP_HTTPD_CUSTOM_FILES */
-
-  read = file->len - file->index;
-  if(read > count) {
-    read = count;
-  }
-
-  MEMCPY(buffer, (file->data + file->index), read);
-  file->index += read;
-
-  return(read);
-}
-#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */
-/*-----------------------------------------------------------------------------------*/
-#if LWIP_HTTPD_FS_ASYNC_READ
-int
-fs_is_file_ready(struct fs_file *file, fs_wait_cb callback_fn, void *callback_arg)
-{
-  if (file != NULL) {
-#if LWIP_HTTPD_FS_ASYNC_READ
-#if LWIP_HTTPD_CUSTOM_FILES
-    if (!fs_canread_custom(file)) {
-      if (fs_wait_read_custom(file, callback_fn, callback_arg)) {
-        return 0;
-      }
-    }
-#else /* LWIP_HTTPD_CUSTOM_FILES */
-    LWIP_UNUSED_ARG(callback_fn);
-    LWIP_UNUSED_ARG(callback_arg);
-#endif /* LWIP_HTTPD_CUSTOM_FILES */
-#endif /* LWIP_HTTPD_FS_ASYNC_READ */
-  }
-  return 1;
-}
-#endif /* LWIP_HTTPD_FS_ASYNC_READ */
-/*-----------------------------------------------------------------------------------*/
-int
-fs_bytes_left(struct fs_file *file)
-{
-  return file->len - file->index;
-}
diff --git a/src/apps/httpd/fsdata.c b/src/apps/httpd/fsdata.c
deleted file mode 100644
index 6170ce6..0000000
--- a/src/apps/httpd/fsdata.c
+++ /dev/null
@@ -1,298 +0,0 @@
-#include "lwip/apps/fs.h"
-#include "lwip/def.h"
-#include "fsdata.h"
-
-
-#define file_NULL (struct fsdata_file *) NULL
-
-
-static const unsigned int dummy_align__img_sics_gif = 0;
-static const unsigned char data__img_sics_gif[] = {
-/* /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.0 200 OK
-" (17 bytes) */
-0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d,
-0x0a,
-/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip)
-" (63 bytes) */
-0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33,
-0x2e,0x31,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-type: image/gif
-
-" (27 bytes) */
-0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,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,};
-
-static const unsigned int dummy_align__404_html = 1;
-static const unsigned char data__404_html[] = {
-/* /404.html (10 chars) */
-0x2f,0x34,0x30,0x34,0x2e,0x68,0x74,0x6d,0x6c,0x00,0x00,0x00,
-
-/* HTTP header */
-/* "HTTP/1.0 404 File not found
-" (29 bytes) */
-0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x34,0x30,0x34,0x20,0x46,0x69,0x6c,
-0x65,0x20,0x6e,0x6f,0x74,0x20,0x66,0x6f,0x75,0x6e,0x64,0x0d,0x0a,
-/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip)
-" (63 bytes) */
-0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33,
-0x2e,0x31,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-type: text/html
-
-" (27 bytes) */
-0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,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,};
-
-static const unsigned int dummy_align__index_html = 2;
-static const unsigned char data__index_html[] = {
-/* /index.html (12 chars) */
-0x2f,0x69,0x6e,0x64,0x65,0x78,0x2e,0x68,0x74,0x6d,0x6c,0x00,
-
-/* HTTP header */
-/* "HTTP/1.0 200 OK
-" (17 bytes) */
-0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d,
-0x0a,
-/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip)
-" (63 bytes) */
-0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33,
-0x2e,0x31,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-type: text/html
-
-" (27 bytes) */
-0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,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,};
-
-
-
-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,
-1,
-}};
-
-const struct fsdata_file file__404_html[] = { {
-file__img_sics_gif,
-data__404_html,
-data__404_html + 12,
-sizeof(data__404_html) - 12,
-1,
-}};
-
-const struct fsdata_file file__index_html[] = { {
-file__404_html,
-data__index_html,
-data__index_html + 12,
-sizeof(data__index_html) - 12,
-1,
-}};
-
-#define FS_ROOT file__index_html
-#define FS_NUMFILES 3
-
diff --git a/src/apps/httpd/fsdata.h b/src/apps/httpd/fsdata.h
deleted file mode 100644
index ac4548c..0000000
--- a/src/apps/httpd/fsdata.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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_FSDATA_H
-#define LWIP_FSDATA_H
-
-#include "lwip/apps/httpd_opts.h"
-#include "lwip/apps/fs.h"
-
-struct fsdata_file {
-  const struct fsdata_file *next;
-  const unsigned char *name;
-  const unsigned char *data;
-  int len;
-  u8_t flags;
-#if HTTPD_PRECALCULATED_CHECKSUM
-  u16_t chksum_count;
-  const struct fsdata_chksum *chksum;
-#endif /* HTTPD_PRECALCULATED_CHECKSUM */
-};
-
-#endif /* LWIP_FSDATA_H */
diff --git a/src/apps/httpd/httpd.c b/src/apps/httpd/httpd.c
deleted file mode 100644
index ffae27d..0000000
--- a/src/apps/httpd/httpd.c
+++ /dev/null
@@ -1,2634 +0,0 @@
-/**
- * @file
- * LWIP HTTP server implementation
- */
-
-/*
- * 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
- *
- */
-
-/**
- * @defgroup httpd HTTP server
- * @ingroup apps
- *
- * This httpd supports for a
- * rudimentary server-side-include facility which will replace tags of the form
- * <!--#tag--> in any file whose extension is .shtml, .shtm or .ssi with
- * strings provided by an include handler whose pointer is provided to the
- * module via function http_set_ssi_handler().
- * Additionally, a simple common
- * gateway interface (CGI) handling mechanism has been added to allow clients
- * to hook functions to particular request URIs.
- *
- * To enable SSI support, define label LWIP_HTTPD_SSI in lwipopts.h.
- * To enable CGI support, define label LWIP_HTTPD_CGI in lwipopts.h.
- *
- * By default, the server assumes that HTTP headers are already present in
- * each file stored in the file system.  By defining LWIP_HTTPD_DYNAMIC_HEADERS in
- * lwipopts.h, this behavior can be changed such that the server inserts the
- * headers automatically based on the extension of the file being served.  If
- * this mode is used, be careful to ensure that the file system image used
- * does not already contain the header information.
- *
- * File system images without headers can be created using the makefsfile
- * tool with the -h command line option.
- *
- *
- * Notes about valid SSI tags
- * --------------------------
- *
- * The following assumptions are made about tags used in SSI markers:
- *
- * 1. No tag may contain '-' or whitespace characters within the tag name.
- * 2. Whitespace is allowed between the tag leadin "<!--#" and the start of
- *    the tag name and between the tag name and the leadout string "-->".
- * 3. The maximum tag name length is LWIP_HTTPD_MAX_TAG_NAME_LEN, currently 8 characters.
- *
- * Notes on CGI usage
- * ------------------
- *
- * The simple CGI support offered here works with GET method requests only
- * and can handle up to 16 parameters encoded into the URI. The handler
- * function may not write directly to the HTTP output but must return a
- * filename that the HTTP server will send to the browser as a response to
- * the incoming CGI request.
- *
- *
- *
- * The list of supported file types is quite short, so if makefsdata complains
- * about an unknown extension, make sure to add it (and its doctype) to
- * the 'g_psHTTPHeaders' list.
- */
-#include "lwip/init.h"
-#include "lwip/apps/httpd.h"
-#include "lwip/debug.h"
-#include "lwip/stats.h"
-#include "lwip/apps/fs.h"
-#include "httpd_structs.h"
-#include "lwip/def.h"
-#include "lwip/ip.h"
-#include "lwip/tcp.h"
-#if LWIP_HTTPD_TIMING
-#include "lwip/sys.h"
-#endif
-
-#include <string.h> /* memset */
-#include <stdlib.h> /* atoi */
-#include <stdio.h>
-
-#if LWIP_TCP && LWIP_CALLBACK_API
-
-/** Minimum length for a valid HTTP/0.9 request: "GET /\r\n" -> 7 bytes */
-#define MIN_REQ_LEN   7
-
-#define CRLF "\r\n"
-#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
-#define HTTP11_CONNECTIONKEEPALIVE  "Connection: keep-alive"
-#define HTTP11_CONNECTIONKEEPALIVE2 "Connection: Keep-Alive"
-#endif
-
-/** These defines check whether tcp_write has to copy data or not */
-
-/** This was TI's check whether to let TCP copy data or not
- * \#define HTTP_IS_DATA_VOLATILE(hs) ((hs->file < (char *)0x20000000) ? 0 : TCP_WRITE_FLAG_COPY)
- */
-#ifndef HTTP_IS_DATA_VOLATILE
-#if LWIP_HTTPD_SSI
-/* Copy for SSI files, no copy for non-SSI files */
-#define HTTP_IS_DATA_VOLATILE(hs)   ((hs)->ssi ? TCP_WRITE_FLAG_COPY : 0)
-#else /* LWIP_HTTPD_SSI */
-/** Default: don't copy if the data is sent from file-system directly */
-#define HTTP_IS_DATA_VOLATILE(hs) (((hs->file != NULL) && (hs->handle != NULL) && (hs->file == \
-                                   (const char*)hs->handle->data + hs->handle->len - hs->left)) \
-                                   ? 0 : TCP_WRITE_FLAG_COPY)
-#endif /* LWIP_HTTPD_SSI */
-#endif
-
-/** Default: headers are sent from ROM */
-#ifndef HTTP_IS_HDR_VOLATILE
-#define HTTP_IS_HDR_VOLATILE(hs, ptr) 0
-#endif
-
-/* Return values for http_send_*() */
-#define HTTP_DATA_TO_SEND_BREAK    2
-#define HTTP_DATA_TO_SEND_CONTINUE 1
-#define HTTP_NO_DATA_TO_SEND       0
-
-typedef struct
-{
-  const char *name;
-  u8_t shtml;
-} default_filename;
-
-const default_filename g_psDefaultFilenames[] = {
-  {"/index.shtml", 1 },
-  {"/index.ssi",   1 },
-  {"/index.shtm",  1 },
-  {"/index.html",  0 },
-  {"/index.htm",   0 }
-};
-
-#define NUM_DEFAULT_FILENAMES (sizeof(g_psDefaultFilenames) /   \
-                               sizeof(default_filename))
-
-#if LWIP_HTTPD_SUPPORT_REQUESTLIST
-/** HTTP request is copied here from pbufs for simple parsing */
-static char httpd_req_buf[LWIP_HTTPD_MAX_REQ_LENGTH+1];
-#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
-
-#if LWIP_HTTPD_SUPPORT_POST
-#if LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN > LWIP_HTTPD_MAX_REQUEST_URI_LEN
-#define LWIP_HTTPD_URI_BUF_LEN LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN
-#endif
-#endif
-#ifndef LWIP_HTTPD_URI_BUF_LEN
-#define LWIP_HTTPD_URI_BUF_LEN LWIP_HTTPD_MAX_REQUEST_URI_LEN
-#endif
-#if LWIP_HTTPD_URI_BUF_LEN
-/* Filename for response file to send when POST is finished or
- * search for default files when a directory is requested. */
-static char http_uri_buf[LWIP_HTTPD_URI_BUF_LEN+1];
-#endif
-
-#if LWIP_HTTPD_DYNAMIC_HEADERS
-/* The number of individual strings that comprise the headers sent before each
- * requested file.
- */
-#define NUM_FILE_HDR_STRINGS 5
-#define HDR_STRINGS_IDX_HTTP_STATUS          0 /* e.g. "HTTP/1.0 200 OK\r\n" */
-#define HDR_STRINGS_IDX_SERVER_NAME          1 /* e.g. "Server: "HTTPD_SERVER_AGENT"\r\n" */
-#define HDR_STRINGS_IDX_CONTENT_LEN_KEPALIVE 2 /* e.g. "Content-Length: xy\r\n" and/or "Connection: keep-alive\r\n" */
-#define HDR_STRINGS_IDX_CONTENT_LEN_NR       3 /* the byte count, when content-length is used */
-#define HDR_STRINGS_IDX_CONTENT_TYPE         4 /* the content type (or default answer content type including default document) */
-
-/* The dynamically generated Content-Length buffer needs space for CRLF + NULL */
-#define LWIP_HTTPD_MAX_CONTENT_LEN_OFFSET 3
-#ifndef LWIP_HTTPD_MAX_CONTENT_LEN_SIZE
-/* The dynamically generated Content-Length buffer shall be able to work with
-   ~953 MB (9 digits) */
-#define LWIP_HTTPD_MAX_CONTENT_LEN_SIZE   (9 + LWIP_HTTPD_MAX_CONTENT_LEN_OFFSET)
-#endif
-#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
-
-#if LWIP_HTTPD_SSI
-
-#define HTTPD_LAST_TAG_PART 0xFFFF
-
-enum tag_check_state {
-  TAG_NONE,       /* Not processing an SSI tag */
-  TAG_LEADIN,     /* Tag lead in "<!--#" being processed */
-  TAG_FOUND,      /* Tag name being read, looking for lead-out start */
-  TAG_LEADOUT,    /* Tag lead out "-->" being processed */
-  TAG_SENDING     /* Sending tag replacement string */
-};
-
-struct http_ssi_state {
-  const char *parsed;     /* Pointer to the first unparsed byte in buf. */
-#if !LWIP_HTTPD_SSI_INCLUDE_TAG
-  const char *tag_started;/* Pointer to the first opening '<' of the tag. */
-#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG */
-  const char *tag_end;    /* Pointer to char after the closing '>' of the tag. */
-  u32_t parse_left; /* Number of unparsed bytes in buf. */
-  u16_t tag_index;   /* Counter used by tag parsing state machine */
-  u16_t tag_insert_len; /* Length of insert in string tag_insert */
-#if LWIP_HTTPD_SSI_MULTIPART
-  u16_t tag_part; /* Counter passed to and changed by tag insertion function to insert multiple times */
-#endif /* LWIP_HTTPD_SSI_MULTIPART */
-  u8_t tag_name_len; /* Length of the tag name in string tag_name */
-  char tag_name[LWIP_HTTPD_MAX_TAG_NAME_LEN + 1]; /* Last tag name extracted */
-  char tag_insert[LWIP_HTTPD_MAX_TAG_INSERT_LEN + 1]; /* Insert string for tag_name */
-  enum tag_check_state tag_state; /* State of the tag processor */
-};
-#endif /* LWIP_HTTPD_SSI */
-
-struct http_state {
-#if LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED
-  struct http_state *next;
-#endif /* LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED */
-  struct fs_file file_handle;
-  struct fs_file *handle;
-  const char *file;       /* Pointer to first unsent byte in buf. */
-
-  struct tcp_pcb *pcb;
-#if LWIP_HTTPD_SUPPORT_REQUESTLIST
-  struct pbuf *req;
-#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
-
-#if LWIP_HTTPD_DYNAMIC_FILE_READ
-  char *buf;        /* File read buffer. */
-  int buf_len;      /* Size of file read buffer, buf. */
-#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */
-  u32_t left;       /* Number of unsent bytes in buf. */
-  u8_t retries;
-#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
-  u8_t keepalive;
-#endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */
-#if LWIP_HTTPD_SSI
-  struct http_ssi_state *ssi;
-#endif /* LWIP_HTTPD_SSI */
-#if LWIP_HTTPD_CGI
-  char *params[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Params extracted from the request URI */
-  char *param_vals[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Values for each extracted param */
-#endif /* LWIP_HTTPD_CGI */
-#if LWIP_HTTPD_DYNAMIC_HEADERS
-  const char *hdrs[NUM_FILE_HDR_STRINGS]; /* HTTP headers to be sent. */
-  char hdr_content_len[LWIP_HTTPD_MAX_CONTENT_LEN_SIZE];
-  u16_t hdr_pos;     /* The position of the first unsent header byte in the
-                        current string */
-  u16_t hdr_index;   /* The index of the hdr string currently being sent. */
-#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
-#if LWIP_HTTPD_TIMING
-  u32_t time_started;
-#endif /* LWIP_HTTPD_TIMING */
-#if LWIP_HTTPD_SUPPORT_POST
-  u32_t post_content_len_left;
-#if LWIP_HTTPD_POST_MANUAL_WND
-  u32_t unrecved_bytes;
-  u8_t no_auto_wnd;
-  u8_t post_finished;
-#endif /* LWIP_HTTPD_POST_MANUAL_WND */
-#endif /* LWIP_HTTPD_SUPPORT_POST*/
-};
-
-#if HTTPD_USE_MEM_POOL
-LWIP_MEMPOOL_DECLARE(HTTPD_STATE,     MEMP_NUM_PARALLEL_HTTPD_CONNS,     sizeof(struct http_state),     "HTTPD_STATE")
-#if LWIP_HTTPD_SSI
-LWIP_MEMPOOL_DECLARE(HTTPD_SSI_STATE, MEMP_NUM_PARALLEL_HTTPD_SSI_CONNS, sizeof(struct http_ssi_state), "HTTPD_SSI_STATE")
-#define HTTP_FREE_SSI_STATE(x)  LWIP_MEMPOOL_FREE(HTTPD_SSI_STATE, (x))
-#define HTTP_ALLOC_SSI_STATE()  (struct http_ssi_state *)LWIP_MEMPOOL_ALLOC(HTTPD_SSI_STATE)
-#endif /* LWIP_HTTPD_SSI */
-#define HTTP_ALLOC_HTTP_STATE() (struct http_state *)LWIP_MEMPOOL_ALLOC(HTTPD_STATE)
-#define HTTP_FREE_HTTP_STATE(x) LWIP_MEMPOOL_FREE(HTTPD_STATE, (x))
-#else /* HTTPD_USE_MEM_POOL */
-#define HTTP_ALLOC_HTTP_STATE() (struct http_state *)mem_malloc(sizeof(struct http_state))
-#define HTTP_FREE_HTTP_STATE(x) mem_free(x)
-#if LWIP_HTTPD_SSI
-#define HTTP_ALLOC_SSI_STATE()  (struct http_ssi_state *)mem_malloc(sizeof(struct http_ssi_state))
-#define HTTP_FREE_SSI_STATE(x)  mem_free(x)
-#endif /* LWIP_HTTPD_SSI */
-#endif /* HTTPD_USE_MEM_POOL */
-
-static err_t http_close_conn(struct tcp_pcb *pcb, struct http_state *hs);
-static err_t http_close_or_abort_conn(struct tcp_pcb *pcb, struct http_state *hs, u8_t abort_conn);
-static err_t http_find_file(struct http_state *hs, const char *uri, int is_09);
-static err_t http_init_file(struct http_state *hs, struct fs_file *file, int is_09, const char *uri, u8_t tag_check, char* params);
-static err_t http_poll(void *arg, struct tcp_pcb *pcb);
-static u8_t http_check_eof(struct tcp_pcb *pcb, struct http_state *hs);
-#if LWIP_HTTPD_FS_ASYNC_READ
-static void http_continue(void *connection);
-#endif /* LWIP_HTTPD_FS_ASYNC_READ */
-
-#if LWIP_HTTPD_SSI
-/* SSI insert handler function pointer. */
-tSSIHandler g_pfnSSIHandler;
-#if !LWIP_HTTPD_SSI_RAW
-int g_iNumTags;
-const char **g_ppcTags;
-#endif /* !LWIP_HTTPD_SSI_RAW */
-
-#define LEN_TAG_LEAD_IN 5
-const char * const g_pcTagLeadIn = "<!--#";
-
-#define LEN_TAG_LEAD_OUT 3
-const char * const g_pcTagLeadOut = "-->";
-#endif /* LWIP_HTTPD_SSI */
-
-#if LWIP_HTTPD_CGI
-/* CGI handler information */
-const tCGI *g_pCGIs;
-int g_iNumCGIs;
-int http_cgi_paramcount;
-#define http_cgi_params     hs->params
-#define http_cgi_param_vals hs->param_vals
-#elif LWIP_HTTPD_CGI_SSI
-char *http_cgi_params[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Params extracted from the request URI */
-char *http_cgi_param_vals[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Values for each extracted param */
-#endif /* LWIP_HTTPD_CGI */
-
-#if LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED
-/** global list of active HTTP connections, use to kill the oldest when
-    running out of memory */
-static struct http_state *http_connections;
-
-static void
-http_add_connection(struct http_state *hs)
-{
-  /* add the connection to the list */
-  hs->next = http_connections;
-  http_connections = hs;
-}
-
-static void
-http_remove_connection(struct http_state *hs)
-{
-  /* take the connection off the list */
-  if (http_connections) {
-    if (http_connections == hs) {
-      http_connections = hs->next;
-    } else {
-      struct http_state *last;
-      for(last = http_connections; last->next != NULL; last = last->next) {
-        if (last->next == hs) {
-          last->next = hs->next;
-          break;
-        }
-      }
-    }
-  }
-}
-
-static void
-http_kill_oldest_connection(u8_t ssi_required)
-{
-  struct http_state *hs = http_connections;
-  struct http_state *hs_free_next = NULL;
-  while(hs && hs->next) {
-#if LWIP_HTTPD_SSI
-    if (ssi_required) {
-      if (hs->next->ssi != NULL) {
-        hs_free_next = hs;
-      }
-    } else
-#else /* LWIP_HTTPD_SSI */
-    LWIP_UNUSED_ARG(ssi_required);
-#endif /* LWIP_HTTPD_SSI */
-    {
-      hs_free_next = hs;
-    }
-    LWIP_ASSERT("broken list", hs != hs->next);
-    hs = hs->next;
-  }
-  if (hs_free_next != NULL) {
-    LWIP_ASSERT("hs_free_next->next != NULL", hs_free_next->next != NULL);
-    LWIP_ASSERT("hs_free_next->next->pcb != NULL", hs_free_next->next->pcb != NULL);
-    /* send RST when killing a connection because of memory shortage */
-    http_close_or_abort_conn(hs_free_next->next->pcb, hs_free_next->next, 1); /* this also unlinks the http_state from the list */
-  }
-}
-#else /* LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED */
-
-#define http_add_connection(hs)
-#define http_remove_connection(hs)
-
-#endif /* LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED */
-
-#if LWIP_HTTPD_SSI
-/** Allocate as struct http_ssi_state. */
-static struct http_ssi_state*
-http_ssi_state_alloc(void)
-{
-  struct http_ssi_state *ret = HTTP_ALLOC_SSI_STATE();
-#if LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED
-  if (ret == NULL) {
-    http_kill_oldest_connection(1);
-    ret = HTTP_ALLOC_SSI_STATE();
-  }
-#endif /* LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED */
-  if (ret != NULL) {
-    memset(ret, 0, sizeof(struct http_ssi_state));
-  }
-  return ret;
-}
-
-/** Free a struct http_ssi_state. */
-static void
-http_ssi_state_free(struct http_ssi_state *ssi)
-{
-  if (ssi != NULL) {
-    HTTP_FREE_SSI_STATE(ssi);
-  }
-}
-#endif /* LWIP_HTTPD_SSI */
-
-/** Initialize a struct http_state.
- */
-static void
-http_state_init(struct http_state* hs)
-{
-  /* Initialize the structure. */
-  memset(hs, 0, sizeof(struct http_state));
-#if LWIP_HTTPD_DYNAMIC_HEADERS
-  /* Indicate that the headers are not yet valid */
-  hs->hdr_index = NUM_FILE_HDR_STRINGS;
-#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
-}
-
-/** Allocate a struct http_state. */
-static struct http_state*
-http_state_alloc(void)
-{
-  struct http_state *ret = HTTP_ALLOC_HTTP_STATE();
-#if LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED
-  if (ret == NULL) {
-    http_kill_oldest_connection(0);
-    ret = HTTP_ALLOC_HTTP_STATE();
-  }
-#endif /* LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED */
-  if (ret != NULL) {
-    http_state_init(ret);
-    http_add_connection(ret);
-  }
-  return ret;
-}
-
-/** Free a struct http_state.
- * Also frees the file data if dynamic.
- */
-static void
-http_state_eof(struct http_state *hs)
-{
-  if(hs->handle) {
-#if LWIP_HTTPD_TIMING
-    u32_t ms_needed = sys_now() - hs->time_started;
-#if defined(LWIP_DEBUG) && (HTTPD_DEBUG_TIMING == LWIP_DBG_ON)
-    u32_t needed = LWIP_MAX(1, (ms_needed/100));
-    LWIP_DEBUGF(HTTPD_DEBUG_TIMING, ("httpd: needed %"U32_F" ms to send file of %d bytes -> %"U32_F" bytes/sec\n",
-      ms_needed, hs->handle->len, ((((u32_t)hs->handle->len) * 10) / needed)));
-#endif
-#endif /* LWIP_HTTPD_TIMING */
-    fs_close(hs->handle);
-    hs->handle = NULL;
-  }
-#if LWIP_HTTPD_DYNAMIC_FILE_READ
-  if (hs->buf != NULL) {
-    mem_free(hs->buf);
-    hs->buf = NULL;
-  }
-#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */
-#if LWIP_HTTPD_SSI
-  if (hs->ssi) {
-    http_ssi_state_free(hs->ssi);
-    hs->ssi = NULL;
-  }
-#endif /* LWIP_HTTPD_SSI */
-#if LWIP_HTTPD_SUPPORT_REQUESTLIST
-  if (hs->req) {
-    pbuf_free(hs->req);
-    hs->req = NULL;
-  }
-#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
-}
-
-/** Free a struct http_state.
- * Also frees the file data if dynamic.
- */
-static void
-http_state_free(struct http_state *hs)
-{
-  if (hs != NULL) {
-    http_state_eof(hs);
-    http_remove_connection(hs);
-    HTTP_FREE_HTTP_STATE(hs);
-  }
-}
-
-/** Call tcp_write() in a loop trying smaller and smaller length
- *
- * @param pcb tcp_pcb to send
- * @param ptr Data to send
- * @param length Length of data to send (in/out: on return, contains the
- *        amount of data sent)
- * @param apiflags directly passed to tcp_write
- * @return the return value of tcp_write
- */
-static err_t
-http_write(struct tcp_pcb *pcb, const void* ptr, u16_t *length, u8_t apiflags)
-{
-  u16_t len, max_len;
-  err_t err;
-  LWIP_ASSERT("length != NULL", length != NULL);
-  len = *length;
-  if (len == 0) {
-    return ERR_OK;
-  }
-  /* We cannot send more data than space available in the send buffer. */
-  max_len = tcp_sndbuf(pcb);
-  if (max_len < len) {
-    len = max_len;
-  }
-#ifdef HTTPD_MAX_WRITE_LEN
-  /* Additional limitation: e.g. don't enqueue more than 2*mss at once */
-  max_len = HTTPD_MAX_WRITE_LEN(pcb);
-  if(len > max_len) {
-    len = max_len;
-  }
-#endif /* HTTPD_MAX_WRITE_LEN */
-  do {
-    LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Trying go send %d bytes\n", len));
-    err = tcp_write(pcb, ptr, len, apiflags);
-    if (err == ERR_MEM) {
-      if ((tcp_sndbuf(pcb) == 0) ||
-        (tcp_sndqueuelen(pcb) >= TCP_SND_QUEUELEN)) {
-          /* no need to try smaller sizes */
-          len = 1;
-      } else {
-        len /= 2;
-      }
-      LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, 
-        ("Send failed, trying less (%d bytes)\n", len));
-    }
-  } while ((err == ERR_MEM) && (len > 1));
-
-  if (err == ERR_OK) {
-    LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Sent %d bytes\n", len));
-    *length = len;
-  } else {
-    LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Send failed with err %d (\"%s\")\n", err, lwip_strerr(err)));
-    *length = 0;
-  }
-
-#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
-   /* ensure nagle is normally enabled (only disabled for persistent connections
-      when all data has been enqueued but the connection stays open for the next
-      request */
-   tcp_nagle_enable(pcb);
-#endif
-
-  return err;
-}
-
-/**
- * The connection shall be actively closed (using RST to close from fault states).
- * Reset the sent- and recv-callbacks.
- *
- * @param pcb the tcp pcb to reset callbacks
- * @param hs connection state to free
- */
-static err_t
-http_close_or_abort_conn(struct tcp_pcb *pcb, struct http_state *hs, u8_t abort_conn)
-{
-  err_t err;
-  LWIP_DEBUGF(HTTPD_DEBUG, ("Closing connection %p\n", (void*)pcb));
-
-#if LWIP_HTTPD_SUPPORT_POST
-  if (hs != NULL) {
-    if ((hs->post_content_len_left != 0)
-#if LWIP_HTTPD_POST_MANUAL_WND
-       || ((hs->no_auto_wnd != 0) && (hs->unrecved_bytes != 0))
-#endif /* LWIP_HTTPD_POST_MANUAL_WND */
-       ) {
-      /* make sure the post code knows that the connection is closed */
-      http_uri_buf[0] = 0;
-      httpd_post_finished(hs, http_uri_buf, LWIP_HTTPD_URI_BUF_LEN);
-    }
-  }
-#endif /* LWIP_HTTPD_SUPPORT_POST*/
-
-
-  tcp_arg(pcb, NULL);
-  tcp_recv(pcb, NULL);
-  tcp_err(pcb, NULL);
-  tcp_poll(pcb, NULL, 0);
-  tcp_sent(pcb, NULL);
-  if (hs != NULL) {
-    http_state_free(hs);
-  }
-
-  if (abort_conn) {
-    tcp_abort(pcb);
-    return ERR_OK;
-  }
-  err = tcp_close(pcb);
-  if (err != ERR_OK) {
-    LWIP_DEBUGF(HTTPD_DEBUG, ("Error %d closing %p\n", err, (void*)pcb));
-    /* error closing, try again later in poll */
-    tcp_poll(pcb, http_poll, HTTPD_POLL_INTERVAL);
-  }
-  return err;
-}
-
-/**
- * The connection shall be actively closed.
- * Reset the sent- and recv-callbacks.
- *
- * @param pcb the tcp pcb to reset callbacks
- * @param hs connection state to free
- */
-static err_t
-http_close_conn(struct tcp_pcb *pcb, struct http_state *hs)
-{
-   return http_close_or_abort_conn(pcb, hs, 0);
-}
-
-/** End of file: either close the connection (Connection: close) or
- * close the file (Connection: keep-alive)
- */
-static void
-http_eof(struct tcp_pcb *pcb, struct http_state *hs)
-{
-  /* HTTP/1.1 persistent connection? (Not supported for SSI) */
-#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
-  if (hs->keepalive) {
-    http_remove_connection(hs);
-
-    http_state_eof(hs);
-    http_state_init(hs);
-    /* restore state: */
-    hs->pcb = pcb;
-    hs->keepalive = 1;
-    http_add_connection(hs);
-    /* ensure nagle doesn't interfere with sending all data as fast as possible: */
-    tcp_nagle_disable(pcb);
-  } else
-#endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */
-  {
-    http_close_conn(pcb, hs);
-  }
-}
-
-#if LWIP_HTTPD_CGI || LWIP_HTTPD_CGI_SSI
-/**
- * Extract URI parameters from the parameter-part of an URI in the form
- * "test.cgi?x=y" @todo: better explanation!
- * Pointers to the parameters are stored in hs->param_vals.
- *
- * @param hs http connection state
- * @param params pointer to the NULL-terminated parameter string from the URI
- * @return number of parameters extracted
- */
-static int
-extract_uri_parameters(struct http_state *hs, char *params)
-{
-  char *pair;
-  char *equals;
-  int loop;
-
-  LWIP_UNUSED_ARG(hs);
-
-  /* If we have no parameters at all, return immediately. */
-  if(!params || (params[0] == '\0')) {
-      return(0);
-  }
-
-  /* Get a pointer to our first parameter */
-  pair = params;
-
-  /* Parse up to LWIP_HTTPD_MAX_CGI_PARAMETERS from the passed string and ignore the
-   * remainder (if any) */
-  for(loop = 0; (loop < LWIP_HTTPD_MAX_CGI_PARAMETERS) && pair; loop++) {
-
-    /* Save the name of the parameter */
-    http_cgi_params[loop] = pair;
-
-    /* Remember the start of this name=value pair */
-    equals = pair;
-
-    /* Find the start of the next name=value pair and replace the delimiter
-     * with a 0 to terminate the previous pair string. */
-    pair = strchr(pair, '&');
-    if(pair) {
-      *pair = '\0';
-      pair++;
-    } else {
-       /* We didn't find a new parameter so find the end of the URI and
-        * replace the space with a '\0' */
-        pair = strchr(equals, ' ');
-        if(pair) {
-            *pair = '\0';
-        }
-
-        /* Revert to NULL so that we exit the loop as expected. */
-        pair = NULL;
-    }
-
-    /* Now find the '=' in the previous pair, replace it with '\0' and save
-     * the parameter value string. */
-    equals = strchr(equals, '=');
-    if(equals) {
-      *equals = '\0';
-      http_cgi_param_vals[loop] = equals + 1;
-    } else {
-      http_cgi_param_vals[loop] = NULL;
-    }
-  }
-
-  return loop;
-}
-#endif /* LWIP_HTTPD_CGI || LWIP_HTTPD_CGI_SSI */
-
-#if LWIP_HTTPD_SSI
-/**
- * Insert a tag (found in an shtml in the form of "<!--#tagname-->" into the file.
- * The tag's name is stored in ssi->tag_name (NULL-terminated), the replacement
- * should be written to hs->tag_insert (up to a length of LWIP_HTTPD_MAX_TAG_INSERT_LEN).
- * The amount of data written is stored to ssi->tag_insert_len.
- *
- * @todo: return tag_insert_len - maybe it can be removed from struct http_state?
- *
- * @param hs http connection state
- */
-static void
-get_tag_insert(struct http_state *hs)
-{
-#if LWIP_HTTPD_SSI_RAW
-  const char* tag;
-#else /* LWIP_HTTPD_SSI_RAW */
-  int tag;
-#endif /* LWIP_HTTPD_SSI_RAW */
-  size_t len;
-  struct http_ssi_state *ssi;
-#if LWIP_HTTPD_SSI_MULTIPART
-  u16_t current_tag_part;
-#endif /* LWIP_HTTPD_SSI_MULTIPART */
-
-  LWIP_ASSERT("hs != NULL", hs != NULL);
-  ssi = hs->ssi;
-  LWIP_ASSERT("ssi != NULL", ssi != NULL);
-#if LWIP_HTTPD_SSI_MULTIPART
-  current_tag_part = ssi->tag_part;
-  ssi->tag_part = HTTPD_LAST_TAG_PART;
-#endif /* LWIP_HTTPD_SSI_MULTIPART */
-#if LWIP_HTTPD_SSI_RAW
-  tag = ssi->tag_name;
-#endif
-
-  if(g_pfnSSIHandler
-#if !LWIP_HTTPD_SSI_RAW
-     && g_ppcTags && g_iNumTags
-#endif /* !LWIP_HTTPD_SSI_RAW */
-     ) {
-
-    /* Find this tag in the list we have been provided. */
-#if LWIP_HTTPD_SSI_RAW
-    {
-#else /* LWIP_HTTPD_SSI_RAW */
-    for(tag = 0; tag < g_iNumTags; tag++) {
-      if(strcmp(ssi->tag_name, g_ppcTags[tag]) == 0)
-#endif /* LWIP_HTTPD_SSI_RAW */
-      {
-        ssi->tag_insert_len = g_pfnSSIHandler(tag, ssi->tag_insert,
-           LWIP_HTTPD_MAX_TAG_INSERT_LEN
-#if LWIP_HTTPD_SSI_MULTIPART
-           , current_tag_part, &ssi->tag_part
-#endif /* LWIP_HTTPD_SSI_MULTIPART */
-#if LWIP_HTTPD_FILE_STATE
-           , (hs->handle ? hs->handle->state : NULL)
-#endif /* LWIP_HTTPD_FILE_STATE */
-           );
-#if LWIP_HTTPD_SSI_RAW
-        if (ssi->tag_insert_len != HTTPD_SSI_TAG_UNKNOWN)
-#endif /* LWIP_HTTPD_SSI_RAW */
-        {
-          return;
-        }
-      }
-    }
-  }
-
-  /* If we drop out, we were asked to serve a page which contains tags that
-   * we don't have a handler for. Merely echo back the tags with an error
-   * marker. */
-#define UNKNOWN_TAG1_TEXT "<b>***UNKNOWN TAG "
-#define UNKNOWN_TAG1_LEN  18
-#define UNKNOWN_TAG2_TEXT "***</b>"
-#define UNKNOWN_TAG2_LEN  7
-  len = LWIP_MIN(sizeof(ssi->tag_name), LWIP_MIN(strlen(ssi->tag_name),
-    LWIP_HTTPD_MAX_TAG_INSERT_LEN - (UNKNOWN_TAG1_LEN + UNKNOWN_TAG2_LEN)));
-  MEMCPY(ssi->tag_insert, UNKNOWN_TAG1_TEXT, UNKNOWN_TAG1_LEN);
-  MEMCPY(&ssi->tag_insert[UNKNOWN_TAG1_LEN], ssi->tag_name, len);
-  MEMCPY(&ssi->tag_insert[UNKNOWN_TAG1_LEN + len], UNKNOWN_TAG2_TEXT, UNKNOWN_TAG2_LEN);
-  ssi->tag_insert[UNKNOWN_TAG1_LEN + len + UNKNOWN_TAG2_LEN] = 0;
-
-  len = strlen(ssi->tag_insert);
-  LWIP_ASSERT("len <= 0xffff", len <= 0xffff);
-  ssi->tag_insert_len = (u16_t)len;
-}
-#endif /* LWIP_HTTPD_SSI */
-
-#if LWIP_HTTPD_DYNAMIC_HEADERS
-/**
- * Generate the relevant HTTP headers for the given filename and write
- * them into the supplied buffer.
- */
-static void
-get_http_headers(struct http_state *hs, const char *uri)
-{
-  size_t content_type;
-  char *tmp;
-  char *ext;
-  char *vars;
-  u8_t add_content_len;
-
-  /* In all cases, the second header we send is the server identification
-     so set it here. */
-  hs->hdrs[HDR_STRINGS_IDX_SERVER_NAME] = g_psHTTPHeaderStrings[HTTP_HDR_SERVER];
-  hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEPALIVE] = NULL;
-  hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_NR] = NULL;
-
-  /* Is this a normal file or the special case we use to send back the
-     default "404: Page not found" response? */
-  if (uri == NULL) {
-    hs->hdrs[HDR_STRINGS_IDX_HTTP_STATUS] = g_psHTTPHeaderStrings[HTTP_HDR_NOT_FOUND];
-#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
-    if (hs->keepalive) {
-      hs->hdrs[HDR_STRINGS_IDX_CONTENT_TYPE] = g_psHTTPHeaderStrings[DEFAULT_404_HTML_PERSISTENT];
-    } else
-#endif
-    {
-      hs->hdrs[HDR_STRINGS_IDX_CONTENT_TYPE] = g_psHTTPHeaderStrings[DEFAULT_404_HTML];
-    }
-
-    /* Set up to send the first header string. */
-    hs->hdr_index = 0;
-    hs->hdr_pos = 0;
-    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")) {
-    hs->hdrs[HDR_STRINGS_IDX_HTTP_STATUS] = g_psHTTPHeaderStrings[HTTP_HDR_NOT_FOUND];
-  } else if (strstr(uri, "400")) {
-    hs->hdrs[HDR_STRINGS_IDX_HTTP_STATUS] = g_psHTTPHeaderStrings[HTTP_HDR_BAD_REQUEST];
-  } else if (strstr(uri, "501")) {
-    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];
-  }
-
-  /* Determine if the URI has any variables and, if so, temporarily remove 
-      them. */
-  vars = strchr(uri, '?');
-  if(vars) {
-    *vars = '\0';
-  }
-
-  /* Get a pointer to the file extension.  We find this by looking for the
-      last occurrence of "." in the filename passed. */
-  ext = NULL;
-  tmp = strchr(uri, '.');
-  while (tmp) {
-    ext = tmp + 1;
-    tmp = strchr(ext, '.');
-  }
-  if (ext != NULL) {
-    /* Now determine the content type and add the relevant header for that. */
-    for (content_type = 0; content_type < NUM_HTTP_HEADERS; content_type++) {
-      /* Have we found a matching extension? */
-      if(!lwip_stricmp(g_psHTTPHeaders[content_type].extension, ext)) {
-        break;
-      }
-    }
-  } else {
-    content_type = NUM_HTTP_HEADERS;
-  }
-
-  /* Reinstate the parameter marker if there was one in the original URI. */
-  if (vars) {
-    *vars = '?';
-  }
-
-#if LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI
-  /* Does the URL passed have any file extension?  If not, we assume it
-     is a special-case URL used for control state notification and we do
-     not send any HTTP headers with the response. */
-  if (!ext) {
-    /* Force the header index to a value indicating that all headers
-       have already been sent. */
-    hs->hdr_index = NUM_FILE_HDR_STRINGS;
-    return;
-  }
-#endif /* LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI */
-  add_content_len = 1;
-  /* Did we find a matching extension? */
-  if(content_type < NUM_HTTP_HEADERS) {
-    /* yes, store it */
-    hs->hdrs[HDR_STRINGS_IDX_CONTENT_TYPE] = g_psHTTPHeaders[content_type].content_type;
-  } else if (!ext) {
-    /* no, no extension found -> use binary transfer to prevent the browser adding '.txt' on save */
-    hs->hdrs[HDR_STRINGS_IDX_CONTENT_TYPE] = HTTP_HDR_APP;
-  } else {
-    /* No - use the default, plain text file type. */
-    hs->hdrs[HDR_STRINGS_IDX_CONTENT_TYPE] = HTTP_HDR_DEFAULT_TYPE;
-  }
-  /* Add content-length header? */
-#if LWIP_HTTPD_SSI
-  if (hs->ssi != NULL) {
-    add_content_len = 0; /* @todo: get maximum file length from SSI */
-  } else
-#endif /* LWIP_HTTPD_SSI */
-  if ((hs->handle == NULL) ||
-      ((hs->handle->flags & (FS_FILE_FLAGS_HEADER_INCLUDED|FS_FILE_FLAGS_HEADER_PERSISTENT)) == FS_FILE_FLAGS_HEADER_INCLUDED)) {
-    add_content_len = 0;
-  }
-  if (add_content_len) {
-    size_t len;
-    lwip_itoa(hs->hdr_content_len, (size_t)LWIP_HTTPD_MAX_CONTENT_LEN_SIZE,
-      hs->handle->len);
-    len = strlen(hs->hdr_content_len);
-    if (len <= LWIP_HTTPD_MAX_CONTENT_LEN_SIZE - LWIP_HTTPD_MAX_CONTENT_LEN_OFFSET) {
-      SMEMCPY(&hs->hdr_content_len[len], CRLF "\0", 3);
-      hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_NR] = hs->hdr_content_len;
-    } else {
-      add_content_len = 0;
-    }
-  }
-#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
-  if (add_content_len) {
-    hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEPALIVE] = g_psHTTPHeaderStrings[HTTP_HDR_KEEPALIVE_LEN];
-  } else {
-    hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEPALIVE] = g_psHTTPHeaderStrings[HTTP_HDR_CONN_CLOSE];
-  }
-#else /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */
-  if (add_content_len) {
-    hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEPALIVE] = g_psHTTPHeaderStrings[HTTP_HDR_CONTENT_LENGTH];
-  }
-#endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */
-
-  /* Set up to send the first header string. */
-  hs->hdr_index = 0;
-  hs->hdr_pos = 0;
-}
-
-/** Sub-function of http_send(): send dynamic headers
- *
- * @returns: - HTTP_NO_DATA_TO_SEND: no new data has been enqueued
- *           - HTTP_DATA_TO_SEND_CONTINUE: continue with sending HTTP body
- *           - HTTP_DATA_TO_SEND_BREAK: data has been enqueued, headers pending,
- *                                      so don't send HTTP body yet
- */
-static u8_t
-http_send_headers(struct tcp_pcb *pcb, struct http_state *hs)
-{
-  err_t err;
-  u16_t len;
-  u8_t data_to_send = HTTP_NO_DATA_TO_SEND;
-  u16_t hdrlen, sendlen;
-
-  /* How much data can we send? */
-  len = tcp_sndbuf(pcb);
-  sendlen = len;
-
-  while(len && (hs->hdr_index < NUM_FILE_HDR_STRINGS) && sendlen) {
-    const void *ptr;
-    u16_t old_sendlen;
-    u8_t apiflags;
-    /* How much do we have to send from the current header? */
-    hdrlen = (u16_t)strlen(hs->hdrs[hs->hdr_index]);
-
-    /* How much of this can we send? */
-    sendlen = (len < (hdrlen - hs->hdr_pos)) ? len : (hdrlen - hs->hdr_pos);
-
-    /* Send this amount of data or as much as we can given memory
-     * constraints. */
-    ptr = (const void *)(hs->hdrs[hs->hdr_index] + hs->hdr_pos);
-    old_sendlen = sendlen;
-    apiflags = HTTP_IS_HDR_VOLATILE(hs, ptr);
-    if (hs->hdr_index == HDR_STRINGS_IDX_CONTENT_LEN_NR) {
-      /* content-length is always volatile */
-      apiflags |= TCP_WRITE_FLAG_COPY;
-    }
-    if (hs->hdr_index < NUM_FILE_HDR_STRINGS - 1) {
-      apiflags |= TCP_WRITE_FLAG_MORE;
-    }
-    err = http_write(pcb, ptr, &sendlen, apiflags);
-    if ((err == ERR_OK) && (old_sendlen != sendlen)) {
-      /* Remember that we added some more data to be transmitted. */
-      data_to_send = HTTP_DATA_TO_SEND_CONTINUE;
-    } else if (err != ERR_OK) {
-       /* special case: http_write does not try to send 1 byte */
-      sendlen = 0;
-    }
-
-    /* Fix up the header position for the next time round. */
-    hs->hdr_pos += sendlen;
-    len -= sendlen;
-
-    /* Have we finished sending this string? */
-    if(hs->hdr_pos == hdrlen) {
-      /* Yes - move on to the next one */
-      hs->hdr_index++;
-      /* skip headers that are NULL (not all headers are required) */
-      while ((hs->hdr_index < NUM_FILE_HDR_STRINGS) &&
-         (hs->hdrs[hs->hdr_index] == NULL)) {
-        hs->hdr_index++;
-      }
-      hs->hdr_pos = 0;
-    }
-  }
-
-  if ((hs->hdr_index >= NUM_FILE_HDR_STRINGS) && (hs->file == NULL)) {
-    /* When we are at the end of the headers, check for data to send
-     * instead of waiting for ACK from remote side to continue
-     * (which would happen when sending files from async read). */
-    if(http_check_eof(pcb, hs)) {
-      data_to_send = HTTP_DATA_TO_SEND_CONTINUE;
-    }
-  }
-  /* If we get here and there are still header bytes to send, we send
-   * the header information we just wrote immediately. If there are no
-   * more headers to send, but we do have file data to send, drop through
-   * to try to send some file data too. */
-  if((hs->hdr_index < NUM_FILE_HDR_STRINGS) || !hs->file) {
-    LWIP_DEBUGF(HTTPD_DEBUG, ("tcp_output\n"));
-    return HTTP_DATA_TO_SEND_BREAK;
-  }
-  return data_to_send;
-}
-#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
-
-/** Sub-function of http_send(): end-of-file (or block) is reached,
- * either close the file or read the next block (if supported).
- *
- * @returns: 0 if the file is finished or no data has been read
- *           1 if the file is not finished and data has been read
- */
-static u8_t
-http_check_eof(struct tcp_pcb *pcb, struct http_state *hs)
-{
-  int bytes_left;
-#if LWIP_HTTPD_DYNAMIC_FILE_READ
-  int count;
-#ifdef HTTPD_MAX_WRITE_LEN
-  int max_write_len;
-#endif /* HTTPD_MAX_WRITE_LEN */
-#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */
-
-  /* Do we have a valid file handle? */
-  if (hs->handle == NULL) {
-    /* No - close the connection. */
-    http_eof(pcb, hs);
-    return 0;
-  }
-  bytes_left = fs_bytes_left(hs->handle);
-  if (bytes_left <= 0) {
-    /* We reached the end of the file so this request is done. */
-    LWIP_DEBUGF(HTTPD_DEBUG, ("End of file.\n"));
-    http_eof(pcb, hs);
-    return 0;
-  }
-#if LWIP_HTTPD_DYNAMIC_FILE_READ
-  /* Do we already have a send buffer allocated? */
-  if(hs->buf) {
-    /* Yes - get the length of the buffer */
-    count = LWIP_MIN(hs->buf_len, bytes_left);
-  } else {
-    /* We don't have a send buffer so allocate one now */
-    count = tcp_sndbuf(pcb);
-    if(bytes_left < count) {
-      count = bytes_left;
-    }
-#ifdef HTTPD_MAX_WRITE_LEN
-    /* Additional limitation: e.g. don't enqueue more than 2*mss at once */
-    max_write_len = HTTPD_MAX_WRITE_LEN(pcb);
-    if (count > max_write_len) {
-      count = max_write_len;
-    }
-#endif /* HTTPD_MAX_WRITE_LEN */
-    do {
-      hs->buf = (char*)mem_malloc((mem_size_t)count);
-      if (hs->buf != NULL) {
-        hs->buf_len = count;
-        break;
-      }
-      count = count / 2;
-    } while (count > 100);
-
-    /* Did we get a send buffer? If not, return immediately. */
-    if (hs->buf == NULL) {
-      LWIP_DEBUGF(HTTPD_DEBUG, ("No buff\n"));
-      return 0;
-    }
-  }
-
-  /* Read a block of data from the file. */
-  LWIP_DEBUGF(HTTPD_DEBUG, ("Trying to read %d bytes.\n", count));
-
-#if LWIP_HTTPD_FS_ASYNC_READ
-  count = fs_read_async(hs->handle, hs->buf, count, http_continue, hs);
-#else /* LWIP_HTTPD_FS_ASYNC_READ */
-  count = fs_read(hs->handle, hs->buf, count);
-#endif /* LWIP_HTTPD_FS_ASYNC_READ */
-  if (count < 0) {
-    if (count == FS_READ_DELAYED) {
-      /* Delayed read, wait for FS to unblock us */
-      return 0;
-    }
-    /* We reached the end of the file so this request is done.
-     * @todo: close here for HTTP/1.1 when reading file fails */
-    LWIP_DEBUGF(HTTPD_DEBUG, ("End of file.\n"));
-    http_eof(pcb, hs);
-    return 0;
-  }
-
-  /* Set up to send the block of data we just read */
-  LWIP_DEBUGF(HTTPD_DEBUG, ("Read %d bytes.\n", count));
-  hs->left = count;
-  hs->file = hs->buf;
-#if LWIP_HTTPD_SSI
-  if (hs->ssi) {
-    hs->ssi->parse_left = count;
-    hs->ssi->parsed = hs->buf;
-  }
-#endif /* LWIP_HTTPD_SSI */
-#else /* LWIP_HTTPD_DYNAMIC_FILE_READ */
-  LWIP_ASSERT("SSI and DYNAMIC_HEADERS turned off but eof not reached", 0);
-#endif /* LWIP_HTTPD_SSI || LWIP_HTTPD_DYNAMIC_HEADERS */
-  return 1;
-}
-
-/** Sub-function of http_send(): This is the normal send-routine for non-ssi files
- *
- * @returns: - 1: data has been written (so call tcp_ouput)
- *           - 0: no data has been written (no need to call tcp_output)
- */
-static u8_t
-http_send_data_nonssi(struct tcp_pcb *pcb, struct http_state *hs)
-{
-  err_t err;
-  u16_t len;
-  u8_t data_to_send = 0;
-
-  /* We are not processing an SHTML file so no tag checking is necessary.
-   * Just send the data as we received it from the file. */
-  len = (u16_t)LWIP_MIN(hs->left, 0xffff);
-
-  err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs));
-  if (err == ERR_OK) {
-    data_to_send = 1;
-    hs->file += len;
-    hs->left -= len;
-  }
-
-  return data_to_send;
-}
-
-#if LWIP_HTTPD_SSI
-/** Sub-function of http_send(): This is the send-routine for ssi files
- *
- * @returns: - 1: data has been written (so call tcp_ouput)
- *           - 0: no data has been written (no need to call tcp_output)
- */
-static u8_t
-http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs)
-{
-  err_t err = ERR_OK;
-  u16_t len;
-  u8_t data_to_send = 0;
-
-  struct http_ssi_state *ssi = hs->ssi;
-  LWIP_ASSERT("ssi != NULL", ssi != NULL);
-  /* We are processing an SHTML file so need to scan for tags and replace
-   * them with insert strings. We need to be careful here since a tag may
-   * straddle the boundary of two blocks read from the file and we may also
-   * have to split the insert string between two tcp_write operations. */
-
-  /* How much data could we send? */
-  len = tcp_sndbuf(pcb);
-
-  /* Do we have remaining data to send before parsing more? */
-  if(ssi->parsed > hs->file) {
-    len = (u16_t)LWIP_MIN(ssi->parsed - hs->file, 0xffff);
-
-    err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs));
-    if (err == ERR_OK) {
-      data_to_send = 1;
-      hs->file += len;
-      hs->left -= len;
-    }
-
-    /* If the send buffer is full, return now. */
-    if(tcp_sndbuf(pcb) == 0) {
-      return data_to_send;
-    }
-  }
-
-  LWIP_DEBUGF(HTTPD_DEBUG, ("State %d, %d left\n", ssi->tag_state, (int)ssi->parse_left));
-
-  /* We have sent all the data that was already parsed so continue parsing
-   * the buffer contents looking for SSI tags. */
-  while((ssi->parse_left) && (err == ERR_OK)) {
-    if (len == 0) {
-      return data_to_send;
-    }
-    switch(ssi->tag_state) {
-      case TAG_NONE:
-        /* We are not currently processing an SSI tag so scan for the
-         * start of the lead-in marker. */
-        if(*ssi->parsed == g_pcTagLeadIn[0]) {
-          /* We found what could be the lead-in for a new tag so change
-           * state appropriately. */
-          ssi->tag_state = TAG_LEADIN;
-          ssi->tag_index = 1;
-#if !LWIP_HTTPD_SSI_INCLUDE_TAG
-          ssi->tag_started = ssi->parsed;
-#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG */
-        }
-
-        /* Move on to the next character in the buffer */
-        ssi->parse_left--;
-        ssi->parsed++;
-        break;
-
-      case TAG_LEADIN:
-        /* We are processing the lead-in marker, looking for the start of
-         * the tag name. */
-
-        /* Have we reached the end of the leadin? */
-        if(ssi->tag_index == LEN_TAG_LEAD_IN) {
-          ssi->tag_index = 0;
-          ssi->tag_state = TAG_FOUND;
-        } else {
-          /* Have we found the next character we expect for the tag leadin? */
-          if(*ssi->parsed == g_pcTagLeadIn[ssi->tag_index]) {
-            /* Yes - move to the next one unless we have found the complete
-             * leadin, in which case we start looking for the tag itself */
-            ssi->tag_index++;
-          } else {
-            /* We found an unexpected character so this is not a tag. Move
-             * back to idle state. */
-            ssi->tag_state = TAG_NONE;
-          }
-
-          /* Move on to the next character in the buffer */
-          ssi->parse_left--;
-          ssi->parsed++;
-        }
-        break;
-
-      case TAG_FOUND:
-        /* We are reading the tag name, looking for the start of the
-         * lead-out marker and removing any whitespace found. */
-
-        /* Remove leading whitespace between the tag leading and the first
-         * tag name character. */
-        if((ssi->tag_index == 0) && ((*ssi->parsed == ' ') ||
-           (*ssi->parsed == '\t') || (*ssi->parsed == '\n') ||
-           (*ssi->parsed == '\r'))) {
-          /* Move on to the next character in the buffer */
-          ssi->parse_left--;
-          ssi->parsed++;
-          break;
-        }
-
-        /* Have we found the end of the tag name? This is signalled by
-         * us finding the first leadout character or whitespace */
-        if((*ssi->parsed == g_pcTagLeadOut[0]) ||
-           (*ssi->parsed == ' ')  || (*ssi->parsed == '\t') ||
-           (*ssi->parsed == '\n') || (*ssi->parsed == '\r')) {
-
-          if(ssi->tag_index == 0) {
-            /* We read a zero length tag so ignore it. */
-            ssi->tag_state = TAG_NONE;
-          } else {
-            /* We read a non-empty tag so go ahead and look for the
-             * leadout string. */
-            ssi->tag_state = TAG_LEADOUT;
-            LWIP_ASSERT("ssi->tag_index <= 0xff", ssi->tag_index <= 0xff);
-            ssi->tag_name_len = (u8_t)ssi->tag_index;
-            ssi->tag_name[ssi->tag_index] = '\0';
-            if(*ssi->parsed == g_pcTagLeadOut[0]) {
-              ssi->tag_index = 1;
-            } else {
-              ssi->tag_index = 0;
-            }
-          }
-        } else {
-          /* This character is part of the tag name so save it */
-          if(ssi->tag_index < LWIP_HTTPD_MAX_TAG_NAME_LEN) {
-            ssi->tag_name[ssi->tag_index++] = *ssi->parsed;
-          } else {
-            /* The tag was too long so ignore it. */
-            ssi->tag_state = TAG_NONE;
-          }
-        }
-
-        /* Move on to the next character in the buffer */
-        ssi->parse_left--;
-        ssi->parsed++;
-
-        break;
-
-      /* We are looking for the end of the lead-out marker. */
-      case TAG_LEADOUT:
-        /* Remove leading whitespace between the tag leading and the first
-         * tag leadout character. */
-        if((ssi->tag_index == 0) && ((*ssi->parsed == ' ') ||
-           (*ssi->parsed == '\t') || (*ssi->parsed == '\n') ||
-           (*ssi->parsed == '\r'))) {
-          /* Move on to the next character in the buffer */
-          ssi->parse_left--;
-          ssi->parsed++;
-          break;
-        }
-
-        /* Have we found the next character we expect for the tag leadout? */
-        if(*ssi->parsed == g_pcTagLeadOut[ssi->tag_index]) {
-          /* Yes - move to the next one unless we have found the complete
-           * leadout, in which case we need to call the client to process
-           * the tag. */
-
-          /* Move on to the next character in the buffer */
-          ssi->parse_left--;
-          ssi->parsed++;
-
-          if(ssi->tag_index == (LEN_TAG_LEAD_OUT - 1)) {
-            /* Call the client to ask for the insert string for the
-             * tag we just found. */
-#if LWIP_HTTPD_SSI_MULTIPART
-            ssi->tag_part = 0; /* start with tag part 0 */
-#endif /* LWIP_HTTPD_SSI_MULTIPART */
-            get_tag_insert(hs);
-
-            /* Next time through, we are going to be sending data
-             * immediately, either the end of the block we start
-             * sending here or the insert string. */
-            ssi->tag_index = 0;
-            ssi->tag_state = TAG_SENDING;
-            ssi->tag_end = ssi->parsed;
-#if !LWIP_HTTPD_SSI_INCLUDE_TAG
-            ssi->parsed = ssi->tag_started;
-#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/
-
-            /* If there is any unsent data in the buffer prior to the
-             * tag, we need to send it now. */
-            if (ssi->tag_end > hs->file) {
-              /* How much of the data can we send? */
-#if LWIP_HTTPD_SSI_INCLUDE_TAG
-              len = (u16_t)LWIP_MIN(ssi->tag_end - hs->file, 0xffff);
-#else /* LWIP_HTTPD_SSI_INCLUDE_TAG*/
-              /* we would include the tag in sending */
-              len = (u16_t)LWIP_MIN(ssi->tag_started - hs->file, 0xffff);
-#endif /* LWIP_HTTPD_SSI_INCLUDE_TAG*/
-
-              err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs));
-              if (err == ERR_OK) {
-                data_to_send = 1;
-#if !LWIP_HTTPD_SSI_INCLUDE_TAG
-                if(ssi->tag_started <= hs->file) {
-                  /* pretend to have sent the tag, too */
-                  len += ssi->tag_end - ssi->tag_started;
-                }
-#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/
-                hs->file += len;
-                hs->left -= len;
-              }
-            }
-          } else {
-            ssi->tag_index++;
-          }
-        } else {
-          /* We found an unexpected character so this is not a tag. Move
-           * back to idle state. */
-          ssi->parse_left--;
-          ssi->parsed++;
-          ssi->tag_state = TAG_NONE;
-        }
-        break;
-
-      /*
-       * We have found a valid tag and are in the process of sending
-       * data as a result of that discovery. We send either remaining data
-       * from the file prior to the insert point or the insert string itself.
-       */
-      case TAG_SENDING:
-        /* Do we have any remaining file data to send from the buffer prior
-         * to the tag? */
-        if(ssi->tag_end > hs->file) {
-          /* How much of the data can we send? */
-#if LWIP_HTTPD_SSI_INCLUDE_TAG
-          len = (u16_t)LWIP_MIN(ssi->tag_end - hs->file, 0xffff);
-#else /* LWIP_HTTPD_SSI_INCLUDE_TAG*/
-          LWIP_ASSERT("hs->started >= hs->file", ssi->tag_started >= hs->file);
-          /* we would include the tag in sending */
-          len = (u16_t)LWIP_MIN(ssi->tag_started - hs->file, 0xffff);
-#endif /* LWIP_HTTPD_SSI_INCLUDE_TAG*/
-          if (len != 0) {
-            err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs));
-          } else {
-            err = ERR_OK;
-          }
-          if (err == ERR_OK) {
-            data_to_send = 1;
-#if !LWIP_HTTPD_SSI_INCLUDE_TAG
-            if(ssi->tag_started <= hs->file) {
-              /* pretend to have sent the tag, too */
-              len += ssi->tag_end - ssi->tag_started;
-            }
-#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/
-            hs->file += len;
-            hs->left -= len;
-          }
-        } else {
-#if LWIP_HTTPD_SSI_MULTIPART
-          if(ssi->tag_index >= ssi->tag_insert_len) {
-            /* Did the last SSIHandler have more to send? */
-            if (ssi->tag_part != HTTPD_LAST_TAG_PART) {
-              /* If so, call it again */
-              ssi->tag_index = 0;
-              get_tag_insert(hs);
-            }
-          }
-#endif /* LWIP_HTTPD_SSI_MULTIPART */
-
-          /* Do we still have insert data left to send? */
-          if(ssi->tag_index < ssi->tag_insert_len) {
-            /* We are sending the insert string itself. How much of the
-             * insert can we send? */
-            len = (ssi->tag_insert_len - ssi->tag_index);
-
-            /* Note that we set the copy flag here since we only have a
-             * single tag insert buffer per connection. If we don't do
-             * this, insert corruption can occur if more than one insert
-             * is processed before we call tcp_output. */
-            err = http_write(pcb, &(ssi->tag_insert[ssi->tag_index]), &len,
-                             HTTP_IS_TAG_VOLATILE(hs));
-            if (err == ERR_OK) {
-              data_to_send = 1;
-              ssi->tag_index += len;
-              /* Don't return here: keep on sending data */
-            }
-          } else {
-#if LWIP_HTTPD_SSI_MULTIPART
-            if (ssi->tag_part == HTTPD_LAST_TAG_PART)
-#endif /* LWIP_HTTPD_SSI_MULTIPART */
-            {
-              /* We have sent all the insert data so go back to looking for
-               * a new tag. */
-              LWIP_DEBUGF(HTTPD_DEBUG, ("Everything sent.\n"));
-              ssi->tag_index = 0;
-              ssi->tag_state = TAG_NONE;
-#if !LWIP_HTTPD_SSI_INCLUDE_TAG
-              ssi->parsed = ssi->tag_end;
-#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/
-            }
-          }
-          break;
-        default:
-          break;
-      }
-    }
-  }
-
-  /* If we drop out of the end of the for loop, this implies we must have
-   * file data to send so send it now. In TAG_SENDING state, we've already
-   * handled this so skip the send if that's the case. */
-  if((ssi->tag_state != TAG_SENDING) && (ssi->parsed > hs->file)) {
-    len = (u16_t)LWIP_MIN(ssi->parsed - hs->file, 0xffff);
-
-    err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs));
-    if (err == ERR_OK) {
-      data_to_send = 1;
-      hs->file += len;
-      hs->left -= len;
-    }
-  }
-  return data_to_send;
-}
-#endif /* LWIP_HTTPD_SSI */
-
-/**
- * Try to send more data on this pcb.
- *
- * @param pcb the pcb to send data
- * @param hs connection state
- */
-static u8_t
-http_send(struct tcp_pcb *pcb, struct http_state *hs)
-{
-  u8_t data_to_send = HTTP_NO_DATA_TO_SEND;
-
-  LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_send: pcb=%p hs=%p left=%d\n", (void*)pcb,
-    (void*)hs, hs != NULL ? (int)hs->left : 0));
-
-#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND
-  if (hs->unrecved_bytes != 0) {
-    return 0;
-  }
-#endif /* LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND */
-
-  /* If we were passed a NULL state structure pointer, ignore the call. */
-  if (hs == NULL) {
-    return 0;
-  }
-
-#if LWIP_HTTPD_FS_ASYNC_READ
-  /* Check if we are allowed to read from this file.
-     (e.g. SSI might want to delay sending until data is available) */
-  if (!fs_is_file_ready(hs->handle, http_continue, hs)) {
-    return 0;
-  }
-#endif /* LWIP_HTTPD_FS_ASYNC_READ */
-
-#if LWIP_HTTPD_DYNAMIC_HEADERS
-  /* Do we have any more header data to send for this file? */
-  if (hs->hdr_index < NUM_FILE_HDR_STRINGS) {
-    data_to_send = http_send_headers(pcb, hs);
-    if ((data_to_send != HTTP_DATA_TO_SEND_CONTINUE) &&
-        (hs->hdr_index < NUM_FILE_HDR_STRINGS)) {
-      return data_to_send;
-    }
-  }
-#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
-
-  /* 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) {
-    if (!http_check_eof(pcb, hs)) {
-      return 0;
-    }
-  }
-
-#if LWIP_HTTPD_SSI
-  if(hs->ssi) {
-    data_to_send = http_send_data_ssi(pcb, hs);
-  } else
-#endif /* LWIP_HTTPD_SSI */
-  {
-    data_to_send = http_send_data_nonssi(pcb, hs);
-  }
-
-  if((hs->left == 0) && (fs_bytes_left(hs->handle) <= 0)) {
-    /* We reached the end of the file so this request is done.
-     * This adds the FIN flag right into the last data segment. */
-    LWIP_DEBUGF(HTTPD_DEBUG, ("End of file.\n"));
-    http_eof(pcb, hs);
-    return 0;
-  }
-  LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("send_data end.\n"));
-  return data_to_send;
-}
-
-#if LWIP_HTTPD_SUPPORT_EXTSTATUS
-/** Initialize a http connection with a file to send for an error message
- *
- * @param hs http connection state
- * @param error_nr HTTP error number
- * @return ERR_OK if file was found and hs has been initialized correctly
- *         another err_t otherwise
- */
-static err_t
-http_find_error_file(struct http_state *hs, u16_t error_nr)
-{
-  const char *uri1, *uri2, *uri3;
-  err_t err;
-
-  if (error_nr == 501) {
-    uri1 = "/501.html";
-    uri2 = "/501.htm";
-    uri3 = "/501.shtml";
-  } else {
-    /* 400 (bad request is the default) */
-    uri1 = "/400.html";
-    uri2 = "/400.htm";
-    uri3 = "/400.shtml";
-  }
-  err = fs_open(&hs->file_handle, uri1);
-  if (err != ERR_OK) {
-    err = fs_open(&hs->file_handle, uri2);
-    if (err != ERR_OK) {
-      err = fs_open(&hs->file_handle, uri3);
-      if (err != ERR_OK) {
-        LWIP_DEBUGF(HTTPD_DEBUG, ("Error page for error %"U16_F" not found\n",
-          error_nr));
-        return ERR_ARG;
-      }
-    }
-  }
-  return http_init_file(hs, &hs->file_handle, 0, NULL, 0, NULL);
-}
-#else /* LWIP_HTTPD_SUPPORT_EXTSTATUS */
-#define http_find_error_file(hs, error_nr) ERR_ARG
-#endif /* LWIP_HTTPD_SUPPORT_EXTSTATUS */
-
-/**
- * Get the file struct for a 404 error page.
- * Tries some file names and returns NULL if none found.
- *
- * @param uri pointer that receives the actual file name URI
- * @return file struct for the error page or NULL no matching file was found
- */
-static struct fs_file *
-http_get_404_file(struct http_state *hs, const char **uri)
-{
-  err_t err;
-
-  *uri = "/404.html";
-  err = fs_open(&hs->file_handle, *uri);
-  if (err != ERR_OK) {
-    /* 404.html doesn't exist. Try 404.htm instead. */
-    *uri = "/404.htm";
-    err = fs_open(&hs->file_handle, *uri);
-    if (err != ERR_OK) {
-      /* 404.htm doesn't exist either. Try 404.shtml instead. */
-      *uri = "/404.shtml";
-      err = fs_open(&hs->file_handle, *uri);
-      if (err != ERR_OK) {
-        /* 404.htm doesn't exist either. Indicate to the caller that it should
-         * send back a default 404 page.
-         */
-        *uri = NULL;
-        return NULL;
-      }
-    }
-  }
-
-  return &hs->file_handle;
-}
-
-#if LWIP_HTTPD_SUPPORT_POST
-static err_t
-http_handle_post_finished(struct http_state *hs)
-{
-#if LWIP_HTTPD_POST_MANUAL_WND
-  /* Prevent multiple calls to httpd_post_finished, since it might have already
-     been called before from httpd_post_data_recved(). */
-  if (hs->post_finished) {
-    return ERR_OK;
-  }
-  hs->post_finished = 1;
-#endif /* LWIP_HTTPD_POST_MANUAL_WND */
-  /* application error or POST finished */
-  /* NULL-terminate the buffer */
-  http_uri_buf[0] = 0;
-  httpd_post_finished(hs, http_uri_buf, LWIP_HTTPD_URI_BUF_LEN);
-  return http_find_file(hs, http_uri_buf, 0);
-}
-
-/** Pass received POST body data to the application and correctly handle
- * returning a response document or closing the connection.
- * ATTENTION: The application is responsible for the pbuf now, so don't free it!
- *
- * @param hs http connection state
- * @param p pbuf to pass to the application
- * @return ERR_OK if passed successfully, another err_t if the response file
- *         hasn't been found (after POST finished)
- */
-static err_t
-http_post_rxpbuf(struct http_state *hs, struct pbuf *p)
-{
-  err_t err;
-
-  if (p != NULL) {
-    /* adjust remaining Content-Length */
-    if (hs->post_content_len_left < p->tot_len) {
-      hs->post_content_len_left = 0;
-    } else {
-      hs->post_content_len_left -= p->tot_len;
-    }
-  }
-#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND
-  /* prevent connection being closed if httpd_post_data_recved() is called nested */
-  hs->unrecved_bytes++;
-#endif
-  err = httpd_post_receive_data(hs, p);
-#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND
-  hs->unrecved_bytes--;
-#endif
-  if (err != ERR_OK) {
-    /* Ignore remaining content in case of application error */
-    hs->post_content_len_left = 0;
-  }
-  if (hs->post_content_len_left == 0) {
-#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND
-    if (hs->unrecved_bytes != 0) {
-       return ERR_OK;
-    }
-#endif /* LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND */
-    /* application error or POST finished */
-    return http_handle_post_finished(hs);
-  }
-
-  return ERR_OK;
-}
-
-/** Handle a post request. Called from http_parse_request when method 'POST'
- * is found.
- *
- * @param p The input pbuf (containing the POST header and body).
- * @param hs The http connection state.
- * @param data HTTP request (header and part of body) from input pbuf(s).
- * @param data_len Size of 'data'.
- * @param uri The HTTP URI parsed from input pbuf(s).
- * @param uri_end Pointer to the end of 'uri' (here, the rest of the HTTP
- *                header starts).
- * @return ERR_OK: POST correctly parsed and accepted by the application.
- *         ERR_INPROGRESS: POST not completely parsed (no error yet)
- *         another err_t: Error parsing POST or denied by the application
- */
-static err_t
-http_post_request(struct pbuf *inp, struct http_state *hs,
-                  char *data, u16_t data_len, char *uri, char *uri_end)
-{
-  err_t err;
-  /* search for end-of-header (first double-CRLF) */
-  char* crlfcrlf = lwip_strnstr(uri_end + 1, CRLF CRLF, data_len - (uri_end + 1 - data));
-
-  if (crlfcrlf != NULL) {
-    /* search for "Content-Length: " */
-#define HTTP_HDR_CONTENT_LEN                "Content-Length: "
-#define HTTP_HDR_CONTENT_LEN_LEN            16
-#define HTTP_HDR_CONTENT_LEN_DIGIT_MAX_LEN  10
-    char *scontent_len = lwip_strnstr(uri_end + 1, HTTP_HDR_CONTENT_LEN, crlfcrlf - (uri_end + 1));
-    if (scontent_len != NULL) {
-      char *scontent_len_end = lwip_strnstr(scontent_len + HTTP_HDR_CONTENT_LEN_LEN, CRLF, HTTP_HDR_CONTENT_LEN_DIGIT_MAX_LEN);
-      if (scontent_len_end != NULL) {
-        int content_len;
-        char *content_len_num = scontent_len + HTTP_HDR_CONTENT_LEN_LEN;
-        content_len = atoi(content_len_num);
-        if (content_len == 0) {
-          /* if atoi returns 0 on error, fix this */
-          if ((content_len_num[0] != '0') || (content_len_num[1] != '\r')) {
-            content_len = -1;
-          }
-        }
-        if (content_len >= 0) {
-          /* adjust length of HTTP header passed to application */
-          const char *hdr_start_after_uri = uri_end + 1;
-          u16_t hdr_len = (u16_t)LWIP_MIN(data_len, crlfcrlf + 4 - data);
-          u16_t hdr_data_len = (u16_t)LWIP_MIN(data_len, crlfcrlf + 4 - hdr_start_after_uri);
-          u8_t post_auto_wnd = 1;
-          http_uri_buf[0] = 0;
-          /* trim http header */
-          *crlfcrlf = 0;
-          err = httpd_post_begin(hs, uri, hdr_start_after_uri, hdr_data_len, content_len,
-            http_uri_buf, LWIP_HTTPD_URI_BUF_LEN, &post_auto_wnd);
-          if (err == ERR_OK) {
-            /* try to pass in data of the first pbuf(s) */
-            struct pbuf *q = inp;
-            u16_t start_offset = hdr_len;
-#if LWIP_HTTPD_POST_MANUAL_WND
-            hs->no_auto_wnd = !post_auto_wnd;
-#endif /* LWIP_HTTPD_POST_MANUAL_WND */
-            /* set the Content-Length to be received for this POST */
-            hs->post_content_len_left = (u32_t)content_len;
-
-            /* get to the pbuf where the body starts */
-            while((q != NULL) && (q->len <= start_offset)) {
-              start_offset -= q->len;
-              q = q->next;
-            }
-            if (q != NULL) {
-              /* hide the remaining HTTP header */
-              pbuf_header(q, -(s16_t)start_offset);
-#if LWIP_HTTPD_POST_MANUAL_WND
-              if (!post_auto_wnd) {
-                /* already tcp_recved() this data... */
-                hs->unrecved_bytes = q->tot_len;
-              }
-#endif /* LWIP_HTTPD_POST_MANUAL_WND */
-              pbuf_ref(q);
-              return http_post_rxpbuf(hs, q);
-            } else if (hs->post_content_len_left == 0) {
-              q = pbuf_alloc(PBUF_RAW, 0, PBUF_REF);
-              return http_post_rxpbuf(hs, q);
-            } else {
-              return ERR_OK;
-            }
-          } else {
-            /* return file passed from application */
-            return http_find_file(hs, http_uri_buf, 0);
-          }
-        } else {
-          LWIP_DEBUGF(HTTPD_DEBUG, ("POST received invalid Content-Length: %s\n",
-            content_len_num));
-          return ERR_ARG;
-        }
-      }
-    }
-    /* If we come here, headers are fully received (double-crlf), but Content-Length
-       was not included. Since this is currently the only supported method, we have
-       to fail in this case! */
-    LWIP_DEBUGF(HTTPD_DEBUG, ("Error when parsing Content-Length\n"));
-    return ERR_ARG;
-  }
-  /* if we come here, the POST is incomplete */
-#if LWIP_HTTPD_SUPPORT_REQUESTLIST
-  return ERR_INPROGRESS;
-#else /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
-  return ERR_ARG;
-#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
-}
-
-#if LWIP_HTTPD_POST_MANUAL_WND
-/** A POST implementation can call this function to update the TCP window.
- * This can be used to throttle data reception (e.g. when received data is
- * programmed to flash and data is received faster than programmed).
- *
- * @param connection A connection handle passed to httpd_post_begin for which
- *        httpd_post_finished has *NOT* been called yet!
- * @param recved_len Length of data received (for window update)
- */
-void httpd_post_data_recved(void *connection, u16_t recved_len)
-{
-  struct http_state *hs = (struct http_state*)connection;
-  if (hs != NULL) {
-    if (hs->no_auto_wnd) {
-      u16_t len = recved_len;
-      if (hs->unrecved_bytes >= recved_len) {
-        hs->unrecved_bytes -= recved_len;
-      } else {
-        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_LEVEL_WARNING, ("httpd_post_data_recved: recved_len too big\n"));
-        len = (u16_t)hs->unrecved_bytes;
-        hs->unrecved_bytes = 0;
-      }
-      if (hs->pcb != NULL) {
-        if (len != 0) {
-          tcp_recved(hs->pcb, len);
-        }
-        if ((hs->post_content_len_left == 0) && (hs->unrecved_bytes == 0)) {
-          /* finished handling POST */
-          http_handle_post_finished(hs);
-          http_send(hs->pcb, hs);
-        }
-      }
-    }
-  }
-}
-#endif /* LWIP_HTTPD_POST_MANUAL_WND */
-
-#endif /* LWIP_HTTPD_SUPPORT_POST */
-
-#if LWIP_HTTPD_FS_ASYNC_READ
-/** Try to send more data if file has been blocked before
- * This is a callback function passed to fs_read_async().
- */
-static void
-http_continue(void *connection)
-{
-  struct http_state *hs = (struct http_state*)connection;
-  if (hs && (hs->pcb) && (hs->handle)) {
-    LWIP_ASSERT("hs->pcb != NULL", hs->pcb != NULL);
-    LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("httpd_continue: try to send more data\n"));
-    if (http_send(hs->pcb, hs)) {
-      /* If we wrote anything to be sent, go ahead and send it now. */
-      LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("tcp_output\n"));
-      tcp_output(hs->pcb);
-    }
-  }
-}
-#endif /* LWIP_HTTPD_FS_ASYNC_READ */
-
-/**
- * When data has been received in the correct state, try to parse it
- * as a HTTP request.
- *
- * @param inp the received pbuf
- * @param hs the connection state
- * @param pcb the tcp_pcb which received this packet
- * @return ERR_OK if request was OK and hs has been initialized correctly
- *         ERR_INPROGRESS if request was OK so far but not fully received
- *         another err_t otherwise
- */
-static err_t
-http_parse_request(struct pbuf *inp, struct http_state *hs, struct tcp_pcb *pcb)
-{
-  char *data;
-  char *crlf;
-  u16_t data_len;
-  struct pbuf *p = inp;
-#if LWIP_HTTPD_SUPPORT_REQUESTLIST
-  u16_t clen;
-#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
-#if LWIP_HTTPD_SUPPORT_POST
-  err_t err;
-#endif /* LWIP_HTTPD_SUPPORT_POST */
-
-  LWIP_UNUSED_ARG(pcb); /* only used for post */
-  LWIP_ASSERT("p != NULL", p != NULL);
-  LWIP_ASSERT("hs != NULL", hs != NULL);
-
-  if ((hs->handle != NULL) || (hs->file != NULL)) {
-    LWIP_DEBUGF(HTTPD_DEBUG, ("Received data while sending a file\n"));
-    /* already sending a file */
-    /* @todo: abort? */
-    return ERR_USE;
-  }
-
-#if LWIP_HTTPD_SUPPORT_REQUESTLIST
-
-  LWIP_DEBUGF(HTTPD_DEBUG, ("Received %"U16_F" bytes\n", p->tot_len));
-
-  /* first check allowed characters in this pbuf? */
-
-  /* enqueue the pbuf */
-  if (hs->req == NULL) {
-    LWIP_DEBUGF(HTTPD_DEBUG, ("First pbuf\n"));
-    hs->req = p;
-  } else {
-    LWIP_DEBUGF(HTTPD_DEBUG, ("pbuf enqueued\n"));
-    pbuf_cat(hs->req, p);
-  }
-  /* increase pbuf ref counter as it is freed when we return but we want to
-     keep it on the req list */
-  pbuf_ref(p);
-
-  if (hs->req->next != NULL) {
-    data_len = LWIP_MIN(hs->req->tot_len, LWIP_HTTPD_MAX_REQ_LENGTH);
-    pbuf_copy_partial(hs->req, httpd_req_buf, data_len, 0);
-    data = httpd_req_buf;
-  } else
-#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
-  {
-    data = (char *)p->payload;
-    data_len = p->len;
-    if (p->len != p->tot_len) {
-      LWIP_DEBUGF(HTTPD_DEBUG, ("Warning: incomplete header due to chained pbufs\n"));
-    }
-  }
-
-  /* received enough data for minimal request? */
-  if (data_len >= MIN_REQ_LEN) {
-    /* wait for CRLF before parsing anything */
-    crlf = lwip_strnstr(data, CRLF, data_len);
-    if (crlf != NULL) {
-#if LWIP_HTTPD_SUPPORT_POST
-      int is_post = 0;
-#endif /* LWIP_HTTPD_SUPPORT_POST */
-      int is_09 = 0;
-      char *sp1, *sp2;
-      u16_t left_len, uri_len;
-      LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("CRLF received, parsing request\n"));
-      /* parse method */
-      if (!strncmp(data, "GET ", 4)) {
-        sp1 = data + 3;
-        /* received GET request */
-        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Received GET request\"\n"));
-#if LWIP_HTTPD_SUPPORT_POST
-      } else if (!strncmp(data, "POST ", 5)) {
-        /* store request type */
-        is_post = 1;
-        sp1 = data + 4;
-        /* received GET request */
-        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Received POST request\n"));
-#endif /* LWIP_HTTPD_SUPPORT_POST */
-      } else {
-        /* null-terminate the METHOD (pbuf is freed anyway wen returning) */
-        data[4] = 0;
-        /* unsupported method! */
-        LWIP_DEBUGF(HTTPD_DEBUG, ("Unsupported request method (not implemented): \"%s\"\n",
-          data));
-        return http_find_error_file(hs, 501);
-      }
-      /* if we come here, method is OK, parse URI */
-      left_len = (u16_t)(data_len - ((sp1 +1) - data));
-      sp2 = lwip_strnstr(sp1 + 1, " ", left_len);
-#if LWIP_HTTPD_SUPPORT_V09
-      if (sp2 == NULL) {
-        /* HTTP 0.9: respond with correct protocol version */
-        sp2 = lwip_strnstr(sp1 + 1, CRLF, left_len);
-        is_09 = 1;
-#if LWIP_HTTPD_SUPPORT_POST
-        if (is_post) {
-          /* HTTP/0.9 does not support POST */
-          goto badrequest;
-        }
-#endif /* LWIP_HTTPD_SUPPORT_POST */
-      }
-#endif /* LWIP_HTTPD_SUPPORT_V09 */
-      uri_len = (u16_t)(sp2 - (sp1 + 1));
-      if ((sp2 != 0) && (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;
-#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
-          /* This is HTTP/1.0 compatible: for strict 1.1, a connection
-             would always be persistent unless "close" was specified. */
-          if (!is_09 && (lwip_strnstr(data, HTTP11_CONNECTIONKEEPALIVE, data_len) ||
-              lwip_strnstr(data, HTTP11_CONNECTIONKEEPALIVE2, data_len))) {
-            hs->keepalive = 1;
-          } else {
-            hs->keepalive = 0;
-          }
-#endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */
-          /* null-terminate the METHOD (pbuf is freed anyway wen returning) */
-          *sp1 = 0;
-          uri[uri_len] = 0;
-          LWIP_DEBUGF(HTTPD_DEBUG, ("Received \"%s\" request for URI: \"%s\"\n",
-                      data, uri));
-#if LWIP_HTTPD_SUPPORT_POST
-          if (is_post) {
-#if LWIP_HTTPD_SUPPORT_REQUESTLIST
-            struct pbuf *q = hs->req;
-#else /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
-            struct pbuf *q = inp;
-#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
-            err = http_post_request(q, hs, data, data_len, uri, sp2);
-            if (err != ERR_OK) {
-              /* restore header for next try */
-              *sp1 = ' ';
-              *sp2 = ' ';
-              uri[uri_len] = ' ';
-            }
-            if (err == ERR_ARG) {
-              goto badrequest;
-            }
-            return err;
-          } else
-#endif /* LWIP_HTTPD_SUPPORT_POST */
-          {
-            return http_find_file(hs, uri, is_09);
-          }
-        }
-      } else {
-        LWIP_DEBUGF(HTTPD_DEBUG, ("invalid URI\n"));
-      }
-    }
-  }
-
-#if LWIP_HTTPD_SUPPORT_REQUESTLIST
-  clen = pbuf_clen(hs->req);
-  if ((hs->req->tot_len <= LWIP_HTTPD_REQ_BUFSIZE) &&
-    (clen <= LWIP_HTTPD_REQ_QUEUELEN)) {
-    /* request not fully received (too short or CRLF is missing) */
-    return ERR_INPROGRESS;
-  } else
-#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
-  {
-#if LWIP_HTTPD_SUPPORT_POST
-badrequest:
-#endif /* LWIP_HTTPD_SUPPORT_POST */
-    LWIP_DEBUGF(HTTPD_DEBUG, ("bad request\n"));
-    /* could not parse request */
-    return http_find_error_file(hs, 400);
-  }
-}
-
-/** Try to find the file specified by uri and, if found, initialize hs
- * accordingly.
- *
- * @param hs the connection state
- * @param uri the HTTP header URI
- * @param is_09 1 if the request is HTTP/0.9 (no HTTP headers in response)
- * @return ERR_OK if file was found and hs has been initialized correctly
- *         another err_t otherwise
- */
-static err_t
-http_find_file(struct http_state *hs, const char *uri, int is_09)
-{
-  size_t loop;
-  struct fs_file *file = NULL;
-  char *params = NULL;
-  err_t err;
-#if LWIP_HTTPD_CGI
-  int i;
-#endif /* LWIP_HTTPD_CGI */
-#if !LWIP_HTTPD_SSI
-  const
-#endif /* !LWIP_HTTPD_SSI */
-  /* By default, assume we will not be processing server-side-includes tags */
-  u8_t tag_check = 0;
-
-  /* Have we been asked for the default file (in root or a directory) ? */
-#if LWIP_HTTPD_MAX_REQUEST_URI_LEN
-  size_t uri_len = strlen(uri);
-  if ((uri_len > 0) && (uri[uri_len-1] == '/') &&
-      ((uri != http_uri_buf) || (uri_len == 1))) {
-    size_t copy_len = LWIP_MIN(sizeof(http_uri_buf) - 1, uri_len - 1);
-    if (copy_len > 0) {
-      MEMCPY(http_uri_buf, uri, copy_len);
-      http_uri_buf[copy_len] = 0;
-    }
-#else /* LWIP_HTTPD_MAX_REQUEST_URI_LEN */
-  if ((uri[0] == '/') &&  (uri[1] == 0)) {
-#endif /* LWIP_HTTPD_MAX_REQUEST_URI_LEN */
-    /* Try each of the configured default filenames until we find one
-       that exists. */
-    for (loop = 0; loop < NUM_DEFAULT_FILENAMES; loop++) {
-      const char* file_name;
-#if LWIP_HTTPD_MAX_REQUEST_URI_LEN
-      if (copy_len > 0) {
-        size_t len_left = sizeof(http_uri_buf) - copy_len - 1;
-        if (len_left > 0) {
-          size_t name_len = strlen(g_psDefaultFilenames[loop].name);
-          size_t name_copy_len = LWIP_MIN(len_left, name_len);
-          MEMCPY(&http_uri_buf[copy_len], g_psDefaultFilenames[loop].name, name_copy_len);
-        }
-        file_name = http_uri_buf;
-      } else
-#endif /* LWIP_HTTPD_MAX_REQUEST_URI_LEN */
-      {
-        file_name = g_psDefaultFilenames[loop].name;
-      }
-      LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Looking for %s...\n", file_name));
-      err = fs_open(&hs->file_handle, file_name);
-      if(err == ERR_OK) {
-        uri = file_name;
-        file = &hs->file_handle;
-        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Opened.\n"));
-#if LWIP_HTTPD_SSI
-        tag_check = g_psDefaultFilenames[loop].shtml;
-#endif /* LWIP_HTTPD_SSI */
-        break;
-      }
-    }
-  }
-  if (file == NULL) {
-    /* No - we've been asked for a specific file. */
-    /* First, isolate the base URI (without any parameters) */
-    params = (char *)strchr(uri, '?');
-    if (params != NULL) {
-      /* URI contains parameters. NULL-terminate the base URI */
-      *params = '\0';
-      params++;
-    }
-
-#if LWIP_HTTPD_CGI
-    http_cgi_paramcount = -1;
-    /* Does the base URI we have isolated correspond to a CGI handler? */
-    if (g_iNumCGIs && g_pCGIs) {
-      for (i = 0; i < g_iNumCGIs; i++) {
-        if (strcmp(uri, g_pCGIs[i].pcCGIName) == 0) {
-          /*
-           * We found a CGI that handles this URI so extract the
-           * parameters and call the handler.
-           */
-           http_cgi_paramcount = extract_uri_parameters(hs, params);
-           uri = g_pCGIs[i].pfnCGIHandler(i, http_cgi_paramcount, hs->params,
-                                          hs->param_vals);
-           break;
-        }
-      }
-    }
-#endif /* LWIP_HTTPD_CGI */
-
-    LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Opening %s\n", uri));
-
-    err = fs_open(&hs->file_handle, uri);
-    if (err == ERR_OK) {
-       file = &hs->file_handle;
-    } else {
-      file = http_get_404_file(hs, &uri);
-    }
-#if LWIP_HTTPD_SSI
-    if (file != NULL) {
-      /* See if we have been asked for an shtml file and, if so,
-         enable tag checking. */
-      const char* ext = NULL, *sub;
-      char* param = (char*)strstr(uri, "?");
-      if (param != NULL) {
-         /* separate uri from parameters for now, set back later */
-         *param = 0;
-      }
-      sub = uri;
-      ext = uri;
-      for (sub = strstr(sub, "."); sub != NULL; sub = strstr(sub, "."))
-      {
-         ext = sub;
-         sub++;
-      }
-      tag_check = 0;
-      for (loop = 0; loop < NUM_SHTML_EXTENSIONS; loop++) {
-        if (!lwip_stricmp(ext, g_pcSSIExtensions[loop])) {
-          tag_check = 1;
-          break;
-        }
-      }
-      if (param != NULL) {
-         *param = '?';
-      }
-    }
-#endif /* LWIP_HTTPD_SSI */
-  }
-  if (file == NULL) {
-    /* None of the default filenames exist so send back a 404 page */
-    file = http_get_404_file(hs, &uri);
-  }
-  return http_init_file(hs, file, is_09, uri, tag_check, params);
-}
-
-/** Initialize a http connection with a file to send (if found).
- * Called by http_find_file and http_find_error_file.
- *
- * @param hs http connection state
- * @param file file structure to send (or NULL if not found)
- * @param is_09 1 if the request is HTTP/0.9 (no HTTP headers in response)
- * @param uri the HTTP header URI
- * @param tag_check enable SSI tag checking
- * @param params != NULL if URI has parameters (separated by '?')
- * @return ERR_OK if file was found and hs has been initialized correctly
- *         another err_t otherwise
- */
-static err_t
-http_init_file(struct http_state *hs, struct fs_file *file, int is_09, const char *uri,
-               u8_t tag_check, char* params)
-{
-  if (file != NULL) {
-    /* file opened, initialise struct http_state */
-#if LWIP_HTTPD_SSI
-    if (tag_check) {
-      struct http_ssi_state *ssi = http_ssi_state_alloc();
-      if (ssi != NULL) {
-        ssi->tag_index = 0;
-        ssi->tag_state = TAG_NONE;
-        ssi->parsed = file->data;
-        ssi->parse_left = file->len;
-        ssi->tag_end = file->data;
-        hs->ssi = ssi;
-      }
-    }
-#else /* LWIP_HTTPD_SSI */
-    LWIP_UNUSED_ARG(tag_check);
-#endif /* LWIP_HTTPD_SSI */
-    hs->handle = file;
-    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)) {
-      /* custom file, need to read data first (via fs_read_custom) */
-      hs->left = 0;
-    } else
-#endif /* LWIP_HTTPD_CUSTOM_FILES */
-    {
-      hs->left = file->len;
-    }
-    hs->retries = 0;
-#if LWIP_HTTPD_TIMING
-    hs->time_started = sys_now();
-#endif /* LWIP_HTTPD_TIMING */
-#if !LWIP_HTTPD_DYNAMIC_HEADERS
-    LWIP_ASSERT("HTTP headers not included in file system",
-       (hs->handle->flags & FS_FILE_FLAGS_HEADER_INCLUDED) != 0);
-#endif /* !LWIP_HTTPD_DYNAMIC_HEADERS */
-#if LWIP_HTTPD_SUPPORT_V09
-    if (is_09 && ((hs->handle->flags & FS_FILE_FLAGS_HEADER_INCLUDED) != 0)) {
-      /* HTTP/0.9 responses are sent without HTTP header,
-         search for the end of the header. */
-      char *file_start = lwip_strnstr(hs->file, CRLF CRLF, hs->left);
-      if (file_start != NULL) {
-        size_t diff = file_start + 4 - hs->file;
-        hs->file += diff;
-        hs->left -= (u32_t)diff;
-      }
-    }
-#endif /* LWIP_HTTPD_SUPPORT_V09*/
-#if LWIP_HTTPD_CGI_SSI
-    if (params != NULL) {
-      /* URI contains parameters, call generic CGI handler */
-      int count;
-#if LWIP_HTTPD_CGI
-      if (http_cgi_paramcount >= 0) {
-        count = http_cgi_paramcount;
-      } else
-#endif
-      {
-        count = extract_uri_parameters(hs, params);
-      }
-      httpd_cgi_handler(uri, count, http_cgi_params, http_cgi_param_vals
-#if defined(LWIP_HTTPD_FILE_STATE) && LWIP_HTTPD_FILE_STATE
-         , hs->handle->state
-#endif /* LWIP_HTTPD_FILE_STATE */
-                        );
-    }
-#else /* LWIP_HTTPD_CGI_SSI */
-    LWIP_UNUSED_ARG(params);
-#endif /* LWIP_HTTPD_CGI_SSI */
-  } else {
-    hs->handle = NULL;
-    hs->file = NULL;
-    hs->left = 0;
-    hs->retries = 0;
-  }
-#if LWIP_HTTPD_DYNAMIC_HEADERS
-  /* Determine the HTTP headers to send based on the file extension of
-   * the requested URI. */
-  if ((hs->handle == NULL) || ((hs->handle->flags & FS_FILE_FLAGS_HEADER_INCLUDED) == 0)) {
-    get_http_headers(hs, uri);
-  }
-#else /* LWIP_HTTPD_DYNAMIC_HEADERS */
-  LWIP_UNUSED_ARG(uri);
-#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
-#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
-  if (hs->keepalive) {
-#if LWIP_HTTPD_SSI
-     if (hs->ssi != NULL) {
-       hs->keepalive = 0;
-     } else
-#endif /* LWIP_HTTPD_SSI */
-     {
-       if ((hs->handle != NULL) &&
-           ((hs->handle->flags & (FS_FILE_FLAGS_HEADER_INCLUDED|FS_FILE_FLAGS_HEADER_PERSISTENT)) == FS_FILE_FLAGS_HEADER_INCLUDED)) {
-         hs->keepalive = 0;
-       }
-     }
-  }
-#endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */
-  return ERR_OK;
-}
-
-/**
- * The pcb had an error and is already deallocated.
- * The argument might still be valid (if != NULL).
- */
-static void
-http_err(void *arg, err_t err)
-{
-  struct http_state *hs = (struct http_state *)arg;
-  LWIP_UNUSED_ARG(err);
-
-  LWIP_DEBUGF(HTTPD_DEBUG, ("http_err: %s", lwip_strerr(err)));
-
-  if (hs != NULL) {
-    http_state_free(hs);
-  }
-}
-
-/**
- * Data has been sent and acknowledged by the remote host.
- * This means that more data can be sent.
- */
-static err_t
-http_sent(void *arg, struct tcp_pcb *pcb, u16_t len)
-{
-  struct http_state *hs = (struct http_state *)arg;
-
-  LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_sent %p\n", (void*)pcb));
-
-  LWIP_UNUSED_ARG(len);
-
-  if (hs == NULL) {
-    return ERR_OK;
-  }
-
-  hs->retries = 0;
-
-  http_send(pcb, hs);
-
-  return ERR_OK;
-}
-
-/**
- * The poll function is called every 2nd second.
- * If there has been no data sent (which resets the retries) in 8 seconds, close.
- * If the last portion of a file has not been sent in 2 seconds, close.
- *
- * This could be increased, but we don't want to waste resources for bad connections.
- */
-static err_t
-http_poll(void *arg, struct tcp_pcb *pcb)
-{
-  struct http_state *hs = (struct http_state *)arg;
-  LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_poll: pcb=%p hs=%p pcb_state=%s\n",
-    (void*)pcb, (void*)hs, tcp_debug_state_str(pcb->state)));
-
-  if (hs == NULL) {
-    err_t closed;
-    /* arg is null, close. */
-    LWIP_DEBUGF(HTTPD_DEBUG, ("http_poll: arg is NULL, close\n"));
-    closed = http_close_conn(pcb, NULL);
-    LWIP_UNUSED_ARG(closed);
-#if LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR
-    if (closed == ERR_MEM) {
-       tcp_abort(pcb);
-       return ERR_ABRT;
-    }
-#endif /* LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR */
-    return ERR_OK;
-  } else {
-    hs->retries++;
-    if (hs->retries == HTTPD_MAX_RETRIES) {
-      LWIP_DEBUGF(HTTPD_DEBUG, ("http_poll: too many retries, close\n"));
-      http_close_conn(pcb, hs);
-      return ERR_OK;
-    }
-
-    /* If this connection has a file open, try to send some more data. If
-     * it has not yet received a GET request, don't do this since it will
-     * cause the connection to close immediately. */
-    if(hs && (hs->handle)) {
-      LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_poll: try to send more data\n"));
-      if(http_send(pcb, hs)) {
-        /* If we wrote anything to be sent, go ahead and send it now. */
-        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("tcp_output\n"));
-        tcp_output(pcb);
-      }
-    }
-  }
-
-  return ERR_OK;
-}
-
-/**
- * Data has been received on this pcb.
- * For HTTP 1.0, this should normally only happen once (if the request fits in one packet).
- */
-static err_t
-http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
-{
-  struct http_state *hs = (struct http_state *)arg;
-  LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_recv: pcb=%p pbuf=%p err=%s\n", (void*)pcb,
-    (void*)p, lwip_strerr(err)));
-
-  if ((err != ERR_OK) || (p == NULL) || (hs == NULL)) {
-    /* error or closed by other side? */
-    if (p != NULL) {
-      /* Inform TCP that we have taken the data. */
-      tcp_recved(pcb, p->tot_len);
-      pbuf_free(p);
-    }
-    if (hs == NULL) {
-      /* this should not happen, only to be robust */
-      LWIP_DEBUGF(HTTPD_DEBUG, ("Error, http_recv: hs is NULL, close\n"));
-    }
-    http_close_conn(pcb, hs);
-    return ERR_OK;
-  }
-
-#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND
-  if (hs->no_auto_wnd) {
-     hs->unrecved_bytes += p->tot_len;
-  } else
-#endif /* LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND */
-  {
-    /* Inform TCP that we have taken the data. */
-    tcp_recved(pcb, p->tot_len);
-  }
-
-#if LWIP_HTTPD_SUPPORT_POST
-  if (hs->post_content_len_left > 0) {
-    /* reset idle counter when POST data is received */
-    hs->retries = 0;
-    /* this is data for a POST, pass the complete pbuf to the application */
-    http_post_rxpbuf(hs, p);
-    /* pbuf is passed to the application, don't free it! */
-    if (hs->post_content_len_left == 0) {
-      /* all data received, send response or close connection */
-      http_send(pcb, hs);
-    }
-    return ERR_OK;
-  } else
-#endif /* LWIP_HTTPD_SUPPORT_POST */
-  {
-    if (hs->handle == NULL) {
-      err_t parsed = http_parse_request(p, hs, pcb);
-      LWIP_ASSERT("http_parse_request: unexpected return value", parsed == ERR_OK
-        || parsed == ERR_INPROGRESS ||parsed == ERR_ARG || parsed == ERR_USE);
-#if LWIP_HTTPD_SUPPORT_REQUESTLIST
-      if (parsed != ERR_INPROGRESS) {
-        /* request fully parsed or error */
-        if (hs->req != NULL) {
-          pbuf_free(hs->req);
-          hs->req = NULL;
-        }
-      }
-#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */
-      pbuf_free(p);
-      if (parsed == ERR_OK) {
-#if LWIP_HTTPD_SUPPORT_POST
-       if (hs->post_content_len_left == 0)
-#endif /* LWIP_HTTPD_SUPPORT_POST */
-        {
-          LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_recv: data %p len %"S32_F"\n", (const void*)hs->file, hs->left));
-          http_send(pcb, hs);
-        }
-      } else if (parsed == ERR_ARG) {
-        /* @todo: close on ERR_USE? */
-        http_close_conn(pcb, hs);
-      }
-    } else {
-      LWIP_DEBUGF(HTTPD_DEBUG, ("http_recv: already sending data\n"));
-      /* already sending but still receiving data, we might want to RST here? */
-      pbuf_free(p);
-    }
-  }
-  return ERR_OK;
-}
-
-/**
- * A new incoming connection has been accepted.
- */
-static err_t
-http_accept(void *arg, struct tcp_pcb *pcb, err_t err)
-{
-  struct http_state *hs;
-  LWIP_UNUSED_ARG(err);
-  LWIP_UNUSED_ARG(arg);
-  LWIP_DEBUGF(HTTPD_DEBUG, ("http_accept %p / %p\n", (void*)pcb, arg));
-
-  if ((err != ERR_OK) || (pcb == NULL)) {
-    return ERR_VAL;
-  }
-
-  /* Set priority */
-  tcp_setprio(pcb, HTTPD_TCP_PRIO);
-
-  /* Allocate memory for the structure that holds the state of the
-     connection - initialized by that function. */
-  hs = http_state_alloc();
-  if (hs == NULL) {
-    LWIP_DEBUGF(HTTPD_DEBUG, ("http_accept: Out of memory, RST\n"));
-    return ERR_MEM;
-  }
-  hs->pcb = pcb;
-
-  /* Tell TCP that this is the structure we wish to be passed for our
-     callbacks. */
-  tcp_arg(pcb, hs);
-
-  /* Set up the various callback functions */
-  tcp_recv(pcb, http_recv);
-  tcp_err(pcb, http_err);
-  tcp_poll(pcb, http_poll, HTTPD_POLL_INTERVAL);
-  tcp_sent(pcb, http_sent);
-
-  return ERR_OK;
-}
-
-/**
- * @ingroup httpd
- * Initialize the httpd: set up a listening PCB and bind it to the defined port
- */
-void
-httpd_init(void)
-{
-  struct tcp_pcb *pcb;
-  err_t err;
-
-#if HTTPD_USE_MEM_POOL
-  LWIP_MEMPOOL_INIT(HTTPD_STATE);
-#if LWIP_HTTPD_SSI
-  LWIP_MEMPOOL_INIT(HTTPD_SSI_STATE);
-#endif
-#endif
-  LWIP_DEBUGF(HTTPD_DEBUG, ("httpd_init\n"));
-
-  pcb = tcp_new_ip_type(IPADDR_TYPE_ANY);
-  LWIP_ASSERT("httpd_init: tcp_new failed", pcb != NULL);
-  tcp_setprio(pcb, HTTPD_TCP_PRIO);
-  /* set SOF_REUSEADDR here to explicitly bind httpd to multiple interfaces */
-  err = tcp_bind(pcb, IP_ANY_TYPE, HTTPD_SERVER_PORT);
-  LWIP_UNUSED_ARG(err); /* in case of LWIP_NOASSERT */
-  LWIP_ASSERT("httpd_init: tcp_bind failed", err == ERR_OK);
-  pcb = tcp_listen(pcb);
-  LWIP_ASSERT("httpd_init: tcp_listen failed", pcb != NULL);
-  tcp_accept(pcb, http_accept);
-}
-
-#if LWIP_HTTPD_SSI
-/**
- * Set the SSI handler function.
- *
- * @param ssi_handler the SSI handler function
- * @param tags an array of SSI tag strings to search for in SSI-enabled files
- * @param num_tags number of tags in the 'tags' array
- */
-void
-http_set_ssi_handler(tSSIHandler ssi_handler, const char **tags, int num_tags)
-{
-  LWIP_DEBUGF(HTTPD_DEBUG, ("http_set_ssi_handler\n"));
-
-  LWIP_ASSERT("no ssi_handler given", ssi_handler != NULL);
-  g_pfnSSIHandler = ssi_handler;
-
-#if LWIP_HTTPD_SSI_RAW
-  LWIP_UNUSED_ARG(tags);
-  LWIP_UNUSED_ARG(num_tags);
-#else /* LWIP_HTTPD_SSI_RAW */
-  LWIP_ASSERT("no tags given", tags != NULL);
-  LWIP_ASSERT("invalid number of tags", num_tags > 0);
-
-  g_ppcTags = tags;
-  g_iNumTags = num_tags;
-#endif /* !LWIP_HTTPD_SSI_RAW */
-}
-#endif /* LWIP_HTTPD_SSI */
-
-#if LWIP_HTTPD_CGI
-/**
- * Set an array of CGI filenames/handler functions
- *
- * @param cgis an array of CGI filenames/handler functions
- * @param num_handlers number of elements in the 'cgis' array
- */
-void
-http_set_cgi_handlers(const tCGI *cgis, int num_handlers)
-{
-  LWIP_ASSERT("no cgis given", cgis != NULL);
-  LWIP_ASSERT("invalid number of handlers", num_handlers > 0);
-
-  g_pCGIs = cgis;
-  g_iNumCGIs = num_handlers;
-}
-#endif /* LWIP_HTTPD_CGI */
-
-#endif /* LWIP_TCP && LWIP_CALLBACK_API */
diff --git a/src/apps/httpd/httpd_structs.h b/src/apps/httpd/httpd_structs.h
deleted file mode 100644
index fbd135a..0000000
--- a/src/apps/httpd/httpd_structs.h
+++ /dev/null
@@ -1,114 +0,0 @@
-#ifndef LWIP_HTTPD_STRUCTS_H
-#define LWIP_HTTPD_STRUCTS_H
-
-#include "lwip/apps/httpd.h"
-
-#if LWIP_HTTPD_DYNAMIC_HEADERS
-/** This struct is used for a list of HTTP header strings for various
- * filename extensions. */
-typedef struct
-{
-  const char *extension;
-  const char *content_type;
-} tHTTPHeader;
-
-/** A list of strings used in HTTP headers (see RFC 1945 HTTP/1.0 and
- * RFC 2616 HTTP/1.1 for header field definitions) */
-static const char * const g_psHTTPHeaderStrings[] =
-{
- "HTTP/1.0 200 OK\r\n",
- "HTTP/1.0 404 File not found\r\n",
- "HTTP/1.0 400 Bad Request\r\n",
- "HTTP/1.0 501 Not Implemented\r\n",
- "HTTP/1.1 200 OK\r\n",
- "HTTP/1.1 404 File not found\r\n",
- "HTTP/1.1 400 Bad Request\r\n",
- "HTTP/1.1 501 Not Implemented\r\n",
- "Content-Length: ",
- "Connection: Close\r\n",
- "Connection: keep-alive\r\n",
- "Connection: keep-alive\r\nContent-Length: ",
- "Server: "HTTPD_SERVER_AGENT"\r\n",
- "\r\n<html><body><h2>404: The requested file cannot be found.</h2></body></html>\r\n"
-#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
- ,"Connection: keep-alive\r\nContent-Length: 77\r\n\r\n<html><body><h2>404: The requested file cannot be found.</h2></body></html>\r\n"
-#endif
-};
-
-/* Indexes into the g_psHTTPHeaderStrings array */
-#define HTTP_HDR_OK             0 /* 200 OK */
-#define HTTP_HDR_NOT_FOUND      1 /* 404 File not found */
-#define HTTP_HDR_BAD_REQUEST    2 /* 400 Bad request */
-#define HTTP_HDR_NOT_IMPL       3 /* 501 Not Implemented */
-#define HTTP_HDR_OK_11          4 /* 200 OK */
-#define HTTP_HDR_NOT_FOUND_11   5 /* 404 File not found */
-#define HTTP_HDR_BAD_REQUEST_11 6 /* 400 Bad request */
-#define HTTP_HDR_NOT_IMPL_11    7 /* 501 Not Implemented */
-#define HTTP_HDR_CONTENT_LENGTH 8 /* Content-Length: (HTTP 1.0)*/
-#define HTTP_HDR_CONN_CLOSE     9 /* Connection: Close (HTTP 1.1) */
-#define HTTP_HDR_CONN_KEEPALIVE 10 /* Connection: keep-alive (HTTP 1.1) */
-#define HTTP_HDR_KEEPALIVE_LEN  11 /* Connection: keep-alive + Content-Length: (HTTP 1.1)*/
-#define HTTP_HDR_SERVER         12 /* Server: HTTPD_SERVER_AGENT */
-#define DEFAULT_404_HTML        13 /* default 404 body */
-#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
-#define DEFAULT_404_HTML_PERSISTENT 14 /* default 404 body, but including Connection: keep-alive */
-#endif
-
-
-#define HTTP_HDR_HTML           "Content-type: text/html\r\n\r\n"
-#define HTTP_HDR_SSI            "Content-type: text/html\r\nExpires: Fri, 10 Apr 2008 14:00:00 GMT\r\nPragma: no-cache\r\n\r\n"
-#define HTTP_HDR_GIF            "Content-type: image/gif\r\n\r\n"
-#define HTTP_HDR_PNG            "Content-type: image/png\r\n\r\n"
-#define HTTP_HDR_JPG            "Content-type: image/jpeg\r\n\r\n"
-#define HTTP_HDR_BMP            "Content-type: image/bmp\r\n\r\n"
-#define HTTP_HDR_ICO            "Content-type: image/x-icon\r\n\r\n"
-#define HTTP_HDR_APP            "Content-type: application/octet-stream\r\n\r\n"
-#define HTTP_HDR_JS             "Content-type: application/javascript\r\n\r\n"
-#define HTTP_HDR_RA             "Content-type: application/javascript\r\n\r\n"
-#define HTTP_HDR_CSS            "Content-type: text/css\r\n\r\n"
-#define HTTP_HDR_SWF            "Content-type: application/x-shockwave-flash\r\n\r\n"
-#define HTTP_HDR_XML            "Content-type: text/xml\r\n\r\n"
-#define HTTP_HDR_PDF            "Content-type: application/pdf\r\n\r\n"
-#define HTTP_HDR_JSON           "Content-type: application/json\r\n\r\n"
-
-#define HTTP_HDR_DEFAULT_TYPE   "Content-type: text/plain\r\n\r\n"
-
-/** A list of extension-to-HTTP header strings (see outdated RFC 1700 MEDIA TYPES
- * and http://www.iana.org/assignments/media-types for registered content types
- * and subtypes) */
-static const tHTTPHeader g_psHTTPHeaders[] =
-{
- { "html", HTTP_HDR_HTML},
- { "htm",  HTTP_HDR_HTML},
- { "shtml",HTTP_HDR_SSI},
- { "shtm", HTTP_HDR_SSI},
- { "ssi",  HTTP_HDR_SSI},
- { "gif",  HTTP_HDR_GIF},
- { "png",  HTTP_HDR_PNG},
- { "jpg",  HTTP_HDR_JPG},
- { "bmp",  HTTP_HDR_BMP},
- { "ico",  HTTP_HDR_ICO},
- { "class",HTTP_HDR_APP},
- { "cls",  HTTP_HDR_APP},
- { "js",   HTTP_HDR_JS},
- { "ram",  HTTP_HDR_RA},
- { "css",  HTTP_HDR_CSS},
- { "swf",  HTTP_HDR_SWF},
- { "xml",  HTTP_HDR_XML},
- { "xsl",  HTTP_HDR_XML},
- { "pdf",  HTTP_HDR_PDF},
- { "json", HTTP_HDR_JSON}
-};
-
-#define NUM_HTTP_HEADERS (sizeof(g_psHTTPHeaders) / sizeof(tHTTPHeader))
-
-#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
-
-#if LWIP_HTTPD_SSI
-static const char * const g_pcSSIExtensions[] = {
-  ".shtml", ".shtm", ".ssi", ".xml"
-};
-#define NUM_SHTML_EXTENSIONS (sizeof(g_pcSSIExtensions) / sizeof(const char *))
-#endif /* LWIP_HTTPD_SSI */
-
-#endif /* LWIP_HTTPD_STRUCTS_H */
diff --git a/src/apps/httpd/makefsdata/makefsdata.c b/src/apps/httpd/makefsdata/makefsdata.c
deleted file mode 100644
index 934e721..0000000
--- a/src/apps/httpd/makefsdata/makefsdata.c
+++ /dev/null
@@ -1,1033 +0,0 @@
-/**
- * makefsdata: Converts a directory structure for use with the lwIP httpd.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Jim Pettinato
- *         Simon Goldschmidt
- *
- * @todo:
- * - take TCP_MSS, LWIP_TCP_TIMESTAMPS and
- *   PAYLOAD_ALIGN_TYPE/PAYLOAD_ALIGNMENT as arguments
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#ifdef WIN32
-#define WIN32_LEAN_AND_MEAN
-#include "windows.h"
-#else
-#include <dir.h>
-#endif
-#include <dos.h>
-#include <string.h>
-#include <time.h>
-#include <sys/stat.h>
-
-/** 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.
- */
-#ifndef MAKEFS_SUPPORT_DEFLATE
-#define MAKEFS_SUPPORT_DEFLATE 0
-#endif
-
-#define COPY_BUFSIZE (1024*1024) /* 1 MByte */
-
-#if MAKEFS_SUPPORT_DEFLATE
-#include "../miniz.c"
-
-typedef unsigned char uint8;
-typedef unsigned short uint16;
-typedef unsigned int uint;
-
-#define my_max(a,b) (((a) > (b)) ? (a) : (b))
-#define my_min(a,b) (((a) < (b)) ? (a) : (b))
-
-/* COMP_OUT_BUF_SIZE is the size of the output buffer used during compression.
-   COMP_OUT_BUF_SIZE must be >= 1 and <= OUT_BUF_SIZE */
-#define COMP_OUT_BUF_SIZE COPY_BUFSIZE
-
-/* OUT_BUF_SIZE is the size of the output buffer used during decompression.
-   OUT_BUF_SIZE must be a power of 2 >= TINFL_LZ_DICT_SIZE (because the low-level decompressor not only writes, but reads from the output buffer as it decompresses) */
-#define OUT_BUF_SIZE COPY_BUFSIZE
-static uint8 s_outbuf[OUT_BUF_SIZE];
-static uint8 s_checkbuf[OUT_BUF_SIZE];
-
-/* 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;
-
-int deflate_level = 10; /* default compression level, can be changed via command line */
-#define USAGE_ARG_DEFLATE " [-defl<:compr_level>]"
-#else /* MAKEFS_SUPPORT_DEFLATE */
-#define USAGE_ARG_DEFLATE ""
-#endif /* MAKEFS_SUPPORT_DEFLATE */
-
-/* Compatibility defines Win32 vs. DOS */
-#ifdef WIN32
-
-#define FIND_T                        WIN32_FIND_DATAA
-#define FIND_T_FILENAME(fInfo)        (fInfo.cFileName)
-#define FIND_T_IS_DIR(fInfo)          ((fInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
-#define FIND_T_IS_FILE(fInfo)         ((fInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
-#define FIND_RET_T                    HANDLE
-#define FINDFIRST_FILE(path, result)  FindFirstFileA(path, result)
-#define FINDFIRST_DIR(path, result)   FindFirstFileA(path, result)
-#define FINDNEXT(ff_res, result)      FindNextFileA(ff_res, result)
-#define FINDFIRST_SUCCEEDED(ret)      (ret != INVALID_HANDLE_VALUE)
-#define FINDNEXT_SUCCEEDED(ret)       (ret == TRUE)
-
-#define GETCWD(path, len)             GetCurrentDirectoryA(len, path)
-#define CHDIR(path)                   SetCurrentDirectoryA(path)
-#define CHDIR_SUCCEEDED(ret)          (ret == TRUE)
-
-#else
-
-#define FIND_T                        struct ffblk
-#define FIND_T_FILENAME(fInfo)        (fInfo.ff_name)
-#define FIND_T_IS_DIR(fInfo)          ((fInfo.ff_attrib & FA_DIREC) == FA_DIREC)
-#define FIND_T_IS_FILE(fInfo)         (1)
-#define FIND_RET_T                    int
-#define FINDFIRST_FILE(path, result)  findfirst(path, result, FA_ARCH)
-#define FINDFIRST_DIR(path, result)   findfirst(path, result, FA_DIREC)
-#define FINDNEXT(ff_res, result)      FindNextFileA(ff_res, result)
-#define FINDFIRST_SUCCEEDED(ret)      (ret == 0)
-#define FINDNEXT_SUCCEEDED(ret)       (ret == 0)
-
-#define GETCWD(path, len)             getcwd(path, len)
-#define CHDIR(path)                   chdir(path)
-#define CHDIR_SUCCEEDED(ret)          (ret == 0)
-
-#endif
-
-#define NEWLINE     "\r\n"
-#define NEWLINE_LEN 2
-
-/* define this to get the header variables we use to build HTTP headers */
-#define LWIP_HTTPD_DYNAMIC_HEADERS 1
-#define LWIP_HTTPD_SSI             1
-#include "lwip/init.h"
-#include "../httpd_structs.h"
-#include "lwip/apps/fs.h"
-
-#include "../core/inet_chksum.c"
-#include "../core/def.c"
-
-/** (Your server name here) */
-const char *serverID = "Server: "HTTPD_SERVER_AGENT"\r\n";
-char serverIDBuffer[1024];
-
-/* change this to suit your MEM_ALIGNMENT */
-#define PAYLOAD_ALIGNMENT 4
-/* set this to 0 to prevent aligning payload */
-#define ALIGN_PAYLOAD 1
-/* define this to a type that has the required alignment */
-#define PAYLOAD_ALIGN_TYPE "unsigned int"
-static int payload_alingment_dummy_counter = 0;
-
-#define HEX_BYTES_PER_LINE 16
-
-#define MAX_PATH_LEN 256
-
-struct file_entry
-{
-   struct file_entry* next;
-   const char* filename_c;
-};
-
-int process_sub(FILE *data_file, FILE *struct_file);
-int process_file(FILE *data_file, FILE *struct_file, const char *filename);
-int file_write_http_header(FILE *data_file, const char *filename, int file_size, u16_t *http_hdr_len,
-                           u16_t *http_hdr_chksum, u8_t provide_content_len, int is_compressed);
-int file_put_ascii(FILE *file, const char *ascii_string, int len, int *i);
-int s_put_ascii(char *buf, const char *ascii_string, int len, int *i);
-void concat_files(const char *file1, const char *file2, const char *targetfile);
-int check_path(char* path, size_t size);
-
-/* 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];
-
-unsigned char processSubs = 1;
-unsigned char includeHttpHeader = 1;
-unsigned char useHttp11 = 0;
-unsigned char supportSsi = 1;
-unsigned char precalcChksum = 0;
-unsigned char includeLastModified = 0;
-#if MAKEFS_SUPPORT_DEFLATE
-unsigned char deflateNonSsiFiles = 0;
-size_t deflatedBytesReduced = 0;
-size_t overallDataBytes = 0;
-#endif
-
-struct file_entry* first_file = NULL;
-struct file_entry* last_file = NULL;
-
-static void print_usage(void)
-{
-  printf(" Usage: htmlgen [targetdir] [-s] [-e] [-i] [-11] [-nossi] [-c] [-f:<filename>] [-m] [-svr:<name>]" USAGE_ARG_DEFLATE NEWLINE NEWLINE);
-  printf("   targetdir: relative or absolute path to files to convert" NEWLINE);
-  printf("   switch -s: toggle processing of subdirectories (default is on)" NEWLINE);
-  printf("   switch -e: exclude HTTP header from file (header is created at runtime, default is off)" NEWLINE);
-  printf("   switch -11: include HTTP 1.1 header (1.0 is default)" NEWLINE);
-  printf("   switch -nossi: no support for SSI (cannot calculate Content-Length for SSI)" NEWLINE);
-  printf("   switch -c: precalculate checksums for all pages (default is off)" NEWLINE);
-  printf("   switch -f: target filename (default is \"fsdata.c\")" NEWLINE);
-  printf("   switch -m: include \"Last-Modified\" header based on file time" NEWLINE);
-  printf("   switch -svr: server identifier sent in HTTP response header ('Server' field)" NEWLINE);
-#if MAKEFS_SUPPORT_DEFLATE
-  printf("   switch -defl: deflate-compress all non-SSI files (with opt. compr.-level, default=10)" NEWLINE);
-  printf("                 ATTENTION: browser has to support \"Content-Encoding: deflate\"!" NEWLINE);
-#endif
-  printf("   if targetdir not specified, htmlgen will attempt to" NEWLINE);
-  printf("   process files in subdirectory 'fs'" NEWLINE);
-}
-
-int main(int argc, char *argv[])
-{
-  char path[MAX_PATH_LEN];
-  char appPath[MAX_PATH_LEN];
-  FILE *data_file;
-  FILE *struct_file;
-  int filesProcessed;
-  int i;
-  char targetfile[MAX_PATH_LEN];
-  strcpy(targetfile, "fsdata.c");
-
-  memset(path, 0, sizeof(path));
-  memset(appPath, 0, sizeof(appPath));
-
-  printf(NEWLINE " makefsdata - HTML to C source converter" NEWLINE);
-  printf("     by Jim Pettinato               - circa 2003 " NEWLINE);
-  printf("     extended by Simon Goldschmidt  - 2009 " NEWLINE NEWLINE);
-
-  strcpy(path, "fs");
-  for (i = 1; i < argc; i++) {
-    if (argv[i] == NULL) {
-      continue;
-    }
-    if (argv[i][0] == '-') {
-      if (strstr(argv[i], "-svr:") == argv[i]) {
-        snprintf(serverIDBuffer, sizeof(serverIDBuffer), "Server: %s\r\n", &argv[i][5]);
-        serverID = serverIDBuffer;
-        printf("Using Server-ID: \"%s\"\n", serverID);
-      } else if (strstr(argv[i], "-s") == argv[i]) {
-        processSubs = 0;
-      } else if (strstr(argv[i], "-e") == argv[i]) {
-        includeHttpHeader = 0;
-      } else if (strstr(argv[i], "-11") == argv[i]) {
-        useHttp11 = 1;
-      } else if (strstr(argv[i], "-nossi") == argv[i]) {
-        supportSsi = 0;
-      } else if (strstr(argv[i], "-c") == argv[i]) {
-        precalcChksum = 1;
-      } else if (strstr(argv[i], "-f:") == argv[i]) {
-        strncpy(targetfile, &argv[i][3], sizeof(targetfile) - 1);
-        targetfile[sizeof(targetfile) - 1] = 0;
-        printf("Writing to file \"%s\"\n", targetfile);
-      } else if (strstr(argv[i], "-m") == argv[i]) {
-        includeLastModified = 1;
-      } 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);
-            }
-          }
-        }
-        deflateNonSsiFiles = 1;
-        printf("Deflating all non-SSI files with level %d (but only if size is reduced)" NEWLINE, deflate_level);
-#else
-        printf("WARNING: Deflate support is disabled\n");
-#endif
-      } else if ((strstr(argv[i], "-?")) || (strstr(argv[i], "-h"))) {
-        print_usage();
-        exit(0);
-      }
-    } else if ((argv[i][0] == '/') && (argv[i][1] == '?') && (argv[i][2] == 0)) {
-      print_usage();
-      exit(0);
-    } else {
-      strncpy(path, argv[i], sizeof(path)-1);
-      path[sizeof(path)-1] = 0;
-    }
-  }
-
-  if (!check_path(path, sizeof(path))) {
-    printf("Invalid path: \"%s\"." NEWLINE, path);
-    exit(-1);
-  }
-
-  GETCWD(appPath, MAX_PATH_LEN);
-  /* 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 */
-    printf(" Failed to open directory \"%s\"." NEWLINE NEWLINE, path);
-    print_usage();
-    exit(-1);
-  }
-  CHDIR(appPath);
-
-  printf("HTTP %sheader will %s statically included." NEWLINE,
-    (includeHttpHeader ? (useHttp11 ? "1.1 " : "1.0 ") : ""),
-    (includeHttpHeader ? "be" : "not be"));
-
-  sprintf(curSubdir, "");  /* start off in web page's root directory - relative paths */
-  printf("  Processing all files in directory %s", path);
-  if (processSubs) {
-    printf(" and subdirectories..." NEWLINE NEWLINE);
-  } else {
-    printf("..." NEWLINE NEWLINE);
-  }
-
-  data_file = fopen("fsdata.tmp", "wb");
-  if (data_file == NULL) {
-    printf("Failed to create file \"fsdata.tmp\"\n");
-    exit(-1);
-  }
-  struct_file = fopen("fshdr.tmp", "wb");
-  if (struct_file == NULL) {
-    printf("Failed to create file \"fshdr.tmp\"\n");
-    fclose(data_file);
-    exit(-1);
-  }
-
-  CHDIR(path);
-
-  fprintf(data_file, "#include \"lwip/apps/fs.h\"" NEWLINE);
-  fprintf(data_file, "#include \"lwip/def.h\"" NEWLINE);
-  fprintf(data_file, "#include \"fsdata.h\"" NEWLINE NEWLINE NEWLINE);
-
-  fprintf(data_file, "#define file_NULL (struct fsdata_file *) NULL" NEWLINE NEWLINE NEWLINE);
-  /* define FS_FILE_FLAGS_HEADER_INCLUDED to 1 if not defined (compatibility with older httpd/fs) */
-  fprintf(data_file, "#ifndef FS_FILE_FLAGS_HEADER_INCLUDED" NEWLINE "#define FS_FILE_FLAGS_HEADER_INCLUDED 1" NEWLINE "#endif" NEWLINE);
-  /* define FS_FILE_FLAGS_HEADER_PERSISTENT to 0 if not defined (compatibility with older httpd/fs: wasn't supported back then) */
-  fprintf(data_file, "#ifndef FS_FILE_FLAGS_HEADER_PERSISTENT" NEWLINE "#define FS_FILE_FLAGS_HEADER_PERSISTENT 0" NEWLINE "#endif" NEWLINE);
-
-  /* define alignment defines */
-#if ALIGN_PAYLOAD
-  fprintf(data_file, "/* FSDATA_FILE_ALIGNMENT: 0=off, 1=by variable, 2=by include */" NEWLINE "#ifndef FSDATA_FILE_ALIGNMENT" NEWLINE "#define FSDATA_FILE_ALIGNMENT 0" NEWLINE "#endif" NEWLINE);
-#endif
-  fprintf(data_file, "#ifndef FSDATA_ALIGN_PRE"  NEWLINE "#define FSDATA_ALIGN_PRE"  NEWLINE "#endif" NEWLINE);
-  fprintf(data_file, "#ifndef FSDATA_ALIGN_POST" NEWLINE "#define FSDATA_ALIGN_POST" NEWLINE "#endif" NEWLINE);
-#if ALIGN_PAYLOAD
-  fprintf(data_file, "#if FSDATA_FILE_ALIGNMENT==2" NEWLINE "#include \"fsdata_alignment.h\"" NEWLINE "#endif" NEWLINE);
-#endif
-
-  sprintf(lastFileVar, "NULL");
-
-  filesProcessed = process_sub(data_file, struct_file);
-
-  /* data_file now contains all of the raw data.. now append linked list of
-   * file header structs to allow embedded app to search for a file name */
-  fprintf(data_file, NEWLINE NEWLINE);
-  fprintf(struct_file, "#define FS_ROOT file_%s" NEWLINE, lastFileVar);
-  fprintf(struct_file, "#define FS_NUMFILES %d" NEWLINE NEWLINE, filesProcessed);
-
-  fclose(data_file);
-  fclose(struct_file);
-
-  CHDIR(appPath);
-  /* append struct_file to data_file */
-  printf(NEWLINE "Creating target file..." NEWLINE NEWLINE);
-  concat_files("fsdata.tmp", "fshdr.tmp", targetfile);
-
-  /* if succeeded, delete the temporary files */
-  if (remove("fsdata.tmp") != 0) {
-    printf("Warning: failed to delete fsdata.tmp\n");
-  }
-  if (remove("fshdr.tmp") != 0) {
-    printf("Warning: failed to delete fshdr.tmp\n");
-  }
-
-  printf(NEWLINE "Processed %d files - done." NEWLINE, filesProcessed);
-#if MAKEFS_SUPPORT_DEFLATE
-  if (deflateNonSsiFiles) {
-    printf("(Deflated total byte reduction: %d bytes -> %d bytes (%.02f%%)" NEWLINE,
-      (int)overallDataBytes, (int)deflatedBytesReduced, (float)((deflatedBytesReduced*100.0)/overallDataBytes));
-  }
-#endif
-  printf(NEWLINE);
-
-  while (first_file != NULL) {
-     struct file_entry* fe = first_file;
-     first_file = fe->next;
-     free(fe);
-  }
-
-  return 0;
-}
-
-int check_path(char* path, size_t size)
-{
-  size_t slen;
-  if (path[0] == 0) {
-    /* empty */
-    return 0;
-  }
-  slen = strlen(path);
-  if (slen >= size) {
-    /* not NULL-terminated */
-    return 0;
-  }
-  while ((slen > 0) && ((path[slen] == '\\') || (path[slen] == '/'))) {
-    /* path should not end with trailing backslash */
-    path[slen] = 0;
-    slen--;
-  }
-  if (slen == 0) {
-    return 0;
-  }
-  return 1;
-}
-
-static void copy_file(const char *filename_in, FILE *fout)
-{
-  FILE *fin;
-  size_t len;
-  void* buf;
-  fin = fopen(filename_in, "rb");
-  if (fin == NULL) {
-    printf("Failed to open file \"%s\"\n", filename_in);
-    exit(-1);
-  }
-  buf = malloc(COPY_BUFSIZE);
-  while ((len = fread(buf, 1, COPY_BUFSIZE, fin)) > 0) {
-    fwrite(buf, 1, len, fout);
-  }
-  free(buf);
-  fclose(fin);
-}
-
-void concat_files(const char *file1, const char *file2, const char *targetfile)
-{
-  FILE *fout;
-  fout = fopen(targetfile, "wb");
-  if (fout == NULL) {
-    printf("Failed to open file \"%s\"\n", targetfile);
-    exit(-1);
-  }
-  copy_file(file1, fout);
-  copy_file(file2, fout);
-  fclose(fout);
-}
-
-int process_sub(FILE *data_file, FILE *struct_file)
-{
-  FIND_T fInfo;
-  FIND_RET_T fret;
-  int filesProcessed = 0;
-
-  if (processSubs) {
-    /* process subs recursively */
-    size_t sublen = strlen(curSubdir);
-    size_t freelen = sizeof(curSubdir) - sublen - 1;
-    LWIP_ASSERT("sublen < sizeof(curSubdir)", sublen < sizeof(curSubdir));
-    fret = FINDFIRST_DIR("*", &fInfo);
-    if (FINDFIRST_SUCCEEDED(fret)) {
-      do {
-        const char *curName = FIND_T_FILENAME(fInfo);
-        if ((curName[0] == '.') || (strcmp(curName, "CVS") == 0)) {
-          continue;
-        }
-        if (!FIND_T_IS_DIR(fInfo)) {
-          continue;
-        }
-        if (freelen > 0) {
-           CHDIR(curName);
-           strncat(curSubdir, "/", freelen);
-           strncat(curSubdir, curName, freelen - 1);
-           curSubdir[sizeof(curSubdir) - 1] = 0;
-           printf("processing subdirectory %s/..." NEWLINE, curSubdir);
-           filesProcessed += process_sub(data_file, struct_file);
-           CHDIR("..");
-           curSubdir[sublen] = 0;
-        } else {
-           printf("WARNING: cannot process sub due to path length restrictions: \"%s/%s\"\n", curSubdir, curName);
-        }
-      } while (FINDNEXT_SUCCEEDED(FINDNEXT(fret, &fInfo)));
-    }
-  }
-
-  fret = FINDFIRST_FILE("*.*", &fInfo);
-  if (FINDFIRST_SUCCEEDED(fret)) {
-    /* at least one file in directory */
-    do {
-      if (FIND_T_IS_FILE(fInfo)) {
-        const char *curName = FIND_T_FILENAME(fInfo);
-        printf("processing %s/%s..." NEWLINE, curSubdir, curName);
-        if (process_file(data_file, struct_file, curName) < 0) {
-          printf(NEWLINE "Error... aborting" NEWLINE);
-          return -1;
-        }
-        filesProcessed++;
-      }
-    } while (FINDNEXT_SUCCEEDED(FINDNEXT(fret, &fInfo)));
-  }
-  return filesProcessed;
-}
-
-u8_t* get_file_data(const char* filename, int* file_size, int can_be_compressed, int* is_compressed)
-{
-  FILE *inFile;
-  size_t fsize = 0;
-  u8_t* buf;
-  size_t r;
-  int rs;
-  inFile = fopen(filename, "rb");
-  if (inFile == NULL) {
-    printf("Failed to open file \"%s\"\n", filename);
-    exit(-1);
-  }
-  fseek(inFile, 0, SEEK_END);
-  rs = ftell(inFile);
-  if (rs < 0) {
-     printf("ftell failed with %d\n", errno);
-     exit(-1);
-  }
-  fsize = (size_t)rs;
-  fseek(inFile, 0, SEEK_SET);
-  buf = (u8_t*)malloc(fsize);
-  LWIP_ASSERT("buf != NULL", buf != NULL);
-  r = fread(buf, 1, fsize, inFile);
-  *file_size = fsize;
-  *is_compressed = 0;
-#if MAKEFS_SUPPORT_DEFLATE
-  overallDataBytes += fsize;
-  if (deflateNonSsiFiles) {
-    if (can_be_compressed) {
-      if (fsize < OUT_BUF_SIZE) {
-        u8_t* ret_buf;
-        tdefl_status status;
-        size_t in_bytes = fsize;
-        size_t out_bytes = OUT_BUF_SIZE;
-        const void *next_in = buf;
-        void *next_out = s_outbuf;
-        /* 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) {
-          comp_flags |= TDEFL_FORCE_ALL_RAW_BLOCKS;
-        }
-        status = tdefl_init(&g_deflator, NULL, NULL, comp_flags);
-        if (status != TDEFL_STATUS_OKAY) {
-          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);
-        }
-        LWIP_ASSERT("out_bytes <= COPY_BUFSIZE", out_bytes <= OUT_BUF_SIZE);
-        if (out_bytes < fsize) {
-          ret_buf = (u8_t*)malloc(out_bytes);
-          LWIP_ASSERT("ret_buf != NULL", ret_buf != NULL);
-          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;
-
-            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);
-            LWIP_ASSERT("tinfl_decompress size mismatch", fsize == dec_out_bytes);
-            LWIP_ASSERT("decompressed memcmp failed", !memcmp(s_checkbuf, buf, fsize));
-          }
-          /* free original buffer, use compressed data + size */
-          free(buf);
-          buf = ret_buf;
-          *file_size = out_bytes;
-          printf(" - deflate: %d bytes -> %d bytes (%.02f%%)" NEWLINE, (int)fsize, (int)out_bytes, (float)((out_bytes*100.0)/fsize));
-          deflatedBytesReduced += (size_t)(fsize - out_bytes);
-          *is_compressed = 1;
-        } else {
-          printf(" - uncompressed: (would be %d bytes larger using deflate)" NEWLINE, (int)(out_bytes - fsize));
-        }
-      } else {
-        printf(" - uncompressed: (file is larger than deflate bufer)" NEWLINE);
-      }
-    } else {
-      printf(" - SSI file, cannot be compressed" NEWLINE);
-    }
-  }
-#else
-  LWIP_UNUSED_ARG(can_be_compressed);
-#endif
-  fclose(inFile);
-  return buf;
-}
-
-void process_file_data(FILE* data_file, u8_t* file_data, size_t file_size)
-{
-  size_t written, i, src_off=0;
-
-  size_t off = 0;
-  for (i = 0; i < file_size; i++) {
-    LWIP_ASSERT("file_buffer_c overflow", off < sizeof(file_buffer_c) - 5);
-    sprintf(&file_buffer_c[off], "0x%02.2x,", file_data[i]);
-    off += 5;
-    if ((++src_off % HEX_BYTES_PER_LINE) == 0) {
-      LWIP_ASSERT("file_buffer_c overflow", off < sizeof(file_buffer_c) - NEWLINE_LEN);
-      memcpy(&file_buffer_c[off], NEWLINE, NEWLINE_LEN);
-      off += NEWLINE_LEN;
-    }
-    if (off + 20 >= sizeof(file_buffer_c)) {
-      written = fwrite(file_buffer_c, 1, off, data_file);
-      LWIP_ASSERT("written == off", written == off);
-      off = 0;
-    }
-  }
-  written = fwrite(file_buffer_c, 1, off, data_file);
-  LWIP_ASSERT("written == off", written == off);
-}
-
-int write_checksums(FILE *struct_file, const char *varname,
-                    u16_t hdr_len, u16_t hdr_chksum, const u8_t* file_data, size_t file_size)
-{
-  int chunk_size = TCP_MSS;
-  int offset, src_offset;
-  size_t len;
-  int i = 0;
-#if LWIP_TCP_TIMESTAMPS
-  /* when timestamps are used, usable space is 12 bytes less per segment */
-  chunk_size -= 12;
-#endif
-
-  fprintf(struct_file, "#if HTTPD_PRECALCULATED_CHECKSUM" NEWLINE);
-  fprintf(struct_file, "const struct fsdata_chksum chksums_%s[] = {" NEWLINE, varname);
-
-  if (hdr_len > 0) {
-    /* add checksum for HTTP header */
-    fprintf(struct_file, "{%d, 0x%04x, %d}," NEWLINE, 0, hdr_chksum, hdr_len);
-    i++;
-  }
-  src_offset = 0;
-  for (offset = hdr_len; ; offset += len) {
-    unsigned short chksum;
-    void* data = (void*)&file_data[src_offset];
-    len = LWIP_MIN(chunk_size, (int)file_size - src_offset);
-    if (len == 0) {
-      break;
-    }
-    chksum = ~inet_chksum(data, (u16_t)len);
-    /* add checksum for data */
-    fprintf(struct_file, "{%d, 0x%04x, %d}," NEWLINE, offset, chksum, len);
-    i++;
-  }
-  fprintf(struct_file, "};" NEWLINE);
-  fprintf(struct_file, "#endif /* HTTPD_PRECALCULATED_CHECKSUM */" NEWLINE);
-  return i;
-}
-
-static int is_valid_char_for_c_var(char x)
-{
-   if (((x >= 'A') && (x <= 'Z')) ||
-       ((x >= 'a') && (x <= 'z')) ||
-       ((x >= '0') && (x <= '9')) ||
-        (x == '_')) {
-      return 1;
-   }
-   return 0;
-}
-
-static void fix_filename_for_c(char* qualifiedName, size_t max_len)
-{
-   struct file_entry* f;
-   size_t len = strlen(qualifiedName);
-   char *new_name = (char*)malloc(len + 2);
-   int filename_ok;
-   int cnt = 0;
-   size_t i;
-   if (len + 3 == max_len) {
-      printf("File name too long: \"%s\"\n", qualifiedName);
-      exit(-1);
-   }
-   strcpy(new_name, qualifiedName);
-   for (i = 0; i < len; i++) {
-      if (!is_valid_char_for_c_var(new_name[i])) {
-         new_name[i] = '_';
-      }
-   }
-   do {
-      filename_ok = 1;
-      for (f = first_file; f != NULL; f = f->next) {
-         if (!strcmp(f->filename_c, new_name)) {
-            filename_ok = 0;
-            cnt++;
-            /* try next unique file name */
-            sprintf(&new_name[len], "%d", cnt);
-            break;
-         }
-      }
-   } while (!filename_ok && (cnt < 999));
-   if (!filename_ok) {
-      printf("Failed to get unique file name: \"%s\"\n", qualifiedName);
-      exit(-1);
-   }
-   strcpy(qualifiedName, new_name);
-   free(new_name);
-}
-
-static void register_filename(const char* qualifiedName)
-{
-   struct file_entry* fe = (struct file_entry*)malloc(sizeof(struct file_entry));
-   fe->filename_c = strdup(qualifiedName);
-   fe->next = NULL;
-   if (first_file == NULL) {
-      first_file = last_file = fe;
-   } else {
-      last_file->next = fe;
-      last_file = fe;
-   }
-}
-
-int is_ssi_file(const char* filename)
-{
-  size_t loop;
-  for (loop = 0; loop < NUM_SHTML_EXTENSIONS; loop++) {
-    if (strstr(filename, g_pcSSIExtensions[loop])) {
-      return 1;
-    }
-  }
-  return 0;
-}
-
-int process_file(FILE *data_file, FILE *struct_file, const char *filename)
-{
-  char varname[MAX_PATH_LEN];
-  int i = 0;
-  char qualifiedName[MAX_PATH_LEN];
-  int file_size;
-  u16_t http_hdr_chksum = 0;
-  u16_t http_hdr_len = 0;
-  int chksum_count = 0;
-  u8_t flags = 0;
-  const char* flags_str;
-  u8_t has_content_len;
-  u8_t* file_data;
-  int is_compressed = 0;
-
-  /* create qualified name (@todo: prepend slash or not?) */
-  sprintf(qualifiedName,"%s/%s", curSubdir, filename);
-  /* create C variable name */
-  strcpy(varname, qualifiedName);
-  /* convert slashes & dots to underscores */
-  fix_filename_for_c(varname, MAX_PATH_LEN);
-  register_filename(varname);
-#if ALIGN_PAYLOAD
-  /* to force even alignment of array, type 1 */
-  fprintf(data_file, "#if FSDATA_FILE_ALIGNMENT==1" NEWLINE);
-  fprintf(data_file, "static const " PAYLOAD_ALIGN_TYPE " dummy_align_%s = %d;" NEWLINE, varname, payload_alingment_dummy_counter++);
-  fprintf(data_file, "#endif" NEWLINE);
-#endif /* ALIGN_PAYLOAD */
-  fprintf(data_file, "static const unsigned char FSDATA_ALIGN_PRE data_%s[] FSDATA_ALIGN_POST = {" NEWLINE, varname);
-  /* encode source file name (used by file system, not returned to browser) */
-  fprintf(data_file, "/* %s (%d chars) */" NEWLINE, qualifiedName, strlen(qualifiedName)+1);
-  file_put_ascii(data_file, qualifiedName, strlen(qualifiedName)+1, &i);
-#if ALIGN_PAYLOAD
-  /* pad to even number of bytes to assure payload is on aligned boundary */
-  while(i % PAYLOAD_ALIGNMENT != 0) {
-    fprintf(data_file, "0x%02.2x,", 0);
-    i++;
-  }
-#endif /* ALIGN_PAYLOAD */
-  fprintf(data_file, NEWLINE);
-
-  has_content_len = !is_ssi_file(filename);
-  file_data = get_file_data(filename, &file_size, includeHttpHeader && has_content_len, &is_compressed);
-  if (includeHttpHeader) {
-    file_write_http_header(data_file, filename, file_size, &http_hdr_len, &http_hdr_chksum, has_content_len, is_compressed);
-    flags = FS_FILE_FLAGS_HEADER_INCLUDED;
-    if (has_content_len) {
-      flags |= FS_FILE_FLAGS_HEADER_PERSISTENT;
-    }
-  }
-  if (precalcChksum) {
-    chksum_count = write_checksums(struct_file, varname, http_hdr_len, http_hdr_chksum, file_data, file_size);
-  }
-
-  /* build declaration of struct fsdata_file in temp file */
-  fprintf(struct_file, "const struct fsdata_file file_%s[] = { {" NEWLINE, varname);
-  fprintf(struct_file, "file_%s," NEWLINE, lastFileVar);
-  fprintf(struct_file, "data_%s," NEWLINE, varname);
-  fprintf(struct_file, "data_%s + %d," NEWLINE, varname, i);
-  fprintf(struct_file, "sizeof(data_%s) - %d," NEWLINE, varname, i);
-  switch(flags)
-  {
-  case(FS_FILE_FLAGS_HEADER_INCLUDED):
-     flags_str = "FS_FILE_FLAGS_HEADER_INCLUDED";
-     break;
-  case(FS_FILE_FLAGS_HEADER_PERSISTENT):
-     flags_str = "FS_FILE_FLAGS_HEADER_PERSISTENT";
-     break;
-  case(FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT):
-     flags_str = "FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT";
-     break;
-  default:
-     flags_str = "0";
-     break;
-  }
-  fprintf(struct_file, "%s," NEWLINE, flags_str);
-  if (precalcChksum) {
-    fprintf(struct_file, "#if HTTPD_PRECALCULATED_CHECKSUM" NEWLINE);
-    fprintf(struct_file, "%d, chksums_%s," NEWLINE, chksum_count, varname);
-    fprintf(struct_file, "#endif /* HTTPD_PRECALCULATED_CHECKSUM */" NEWLINE);
-  }
-  fprintf(struct_file, "}};" NEWLINE NEWLINE);
-  strcpy(lastFileVar, varname);
-
-  /* write actual file contents */
-  i = 0;
-  fprintf(data_file, NEWLINE "/* raw file data (%d bytes) */" NEWLINE, file_size);
-  process_file_data(data_file, file_data, file_size);
-  fprintf(data_file, "};" NEWLINE NEWLINE);
-  free(file_data);
-  return 0;
-}
-
-int file_write_http_header(FILE *data_file, const char *filename, int file_size, u16_t *http_hdr_len,
-                           u16_t *http_hdr_chksum, u8_t provide_content_len, int is_compressed)
-{
-  int i = 0;
-  int response_type = HTTP_HDR_OK;
-  const char* file_type;
-  const char *cur_string;
-  size_t cur_len;
-  int written = 0;
-  size_t hdr_len = 0;
-  u16_t acc;
-  const char *file_ext;
-  int j;
-  u8_t provide_last_modified = includeLastModified;
-
-  memset(hdr_buf, 0, sizeof(hdr_buf));
-
-  if (useHttp11) {
-    response_type = HTTP_HDR_OK_11;
-  }
-
-  fprintf(data_file, NEWLINE "/* HTTP header */");
-  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) {
-    response_type = HTTP_HDR_BAD_REQUEST;
-    if (useHttp11) {
-      response_type = HTTP_HDR_BAD_REQUEST_11;
-    }
-  } else if (strstr(filename, "501") == filename) {
-    response_type = HTTP_HDR_NOT_IMPL;
-    if (useHttp11) {
-      response_type = HTTP_HDR_NOT_IMPL_11;
-    }
-  }
-  cur_string = g_psHTTPHeaderStrings[response_type];
-  cur_len = strlen(cur_string);
-  fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len);
-  written += file_put_ascii(data_file, cur_string, cur_len, &i);
-  i = 0;
-  if (precalcChksum) {
-    memcpy(&hdr_buf[hdr_len], cur_string, cur_len);
-    hdr_len += cur_len;
-  }
-
-  cur_string = serverID;
-  cur_len = strlen(cur_string);
-  fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len);
-  written += file_put_ascii(data_file, cur_string, cur_len, &i);
-  i = 0;
-  if (precalcChksum) {
-    memcpy(&hdr_buf[hdr_len], cur_string, cur_len);
-    hdr_len += cur_len;
-  }
-
-  file_ext = filename;
-  if (file_ext != NULL) {
-    while(strstr(file_ext, ".") != NULL) {
-      file_ext = strstr(file_ext, ".");
-      file_ext++;
-    }
-  }
-  if ((file_ext == NULL) || (*file_ext == 0)) {
-    printf("failed to get extension for file \"%s\", using default.\n", filename);
-    file_type = HTTP_HDR_DEFAULT_TYPE;
-  } else {
-    file_type = NULL;
-    for (j = 0; j < NUM_HTTP_HEADERS; j++) {
-      if (!strcmp(file_ext, g_psHTTPHeaders[j].extension)) {
-        file_type = g_psHTTPHeaders[j].content_type;
-        break;
-      }
-    }
-    if (file_type == NULL) {
-      printf("failed to get file type for extension \"%s\", using default.\n", file_ext);
-      file_type = HTTP_HDR_DEFAULT_TYPE;
-    }
-  }
-
-  /* Content-Length is used for persistent connections in HTTP/1.1 but also for
-     download progress in older versions
-     @todo: just use a big-enough buffer and let the HTTPD send spaces? */
-  if (provide_content_len) {
-    char intbuf[MAX_PATH_LEN];
-    int content_len = file_size;
-    memset(intbuf, 0, sizeof(intbuf));
-    cur_string = g_psHTTPHeaderStrings[HTTP_HDR_CONTENT_LENGTH];
-    cur_len = strlen(cur_string);
-    fprintf(data_file, NEWLINE "/* \"%s%d\r\n\" (%d+ bytes) */" NEWLINE, cur_string, content_len, cur_len+2);
-    written += file_put_ascii(data_file, cur_string, cur_len, &i);
-    if (precalcChksum) {
-      memcpy(&hdr_buf[hdr_len], cur_string, cur_len);
-      hdr_len += cur_len;
-    }
-
-    _itoa(content_len, intbuf, 10);
-    strcat(intbuf, "\r\n");
-    cur_len = strlen(intbuf);
-    written += file_put_ascii(data_file, intbuf, cur_len, &i);
-    i = 0;
-    if (precalcChksum) {
-      memcpy(&hdr_buf[hdr_len], intbuf, cur_len);
-      hdr_len += cur_len;
-    }
-  }
-  if (provide_last_modified) {
-    char modbuf[256];
-    struct stat stat_data;
-    struct tm* t;
-    memset(modbuf, 0, sizeof(modbuf));
-    memset(&stat_data, 0, sizeof(stat_data));
-    cur_string = modbuf;
-    strcpy(modbuf, "Last-Modified: ");
-    if (stat(filename, &stat_data) != 0) {
-       printf("stat(%s) failed with error %d\n", filename, errno);
-       exit(-1);
-    }
-    t = gmtime(&stat_data.st_mtime);
-    if (t == NULL) {
-       printf("gmtime() failed with error %d\n", errno);
-       exit(-1);
-    }
-    strftime(&modbuf[15], sizeof(modbuf)-15, "%a, %d %b %Y %H:%M:%S GMT", t);
-    cur_len = strlen(cur_string);
-    fprintf(data_file, NEWLINE "/* \"%s\"\r\n\" (%d+ bytes) */" NEWLINE, cur_string, cur_len+2);
-    written += file_put_ascii(data_file, cur_string, cur_len, &i);
-    if (precalcChksum) {
-      memcpy(&hdr_buf[hdr_len], cur_string, cur_len);
-      hdr_len += cur_len;
-    }
-
-    modbuf[0] = 0;
-    strcat(modbuf, "\r\n");
-    cur_len = strlen(modbuf);
-    written += file_put_ascii(data_file, modbuf, cur_len, &i);
-    i = 0;
-    if (precalcChksum) {
-      memcpy(&hdr_buf[hdr_len], modbuf, cur_len);
-      hdr_len += cur_len;
-    }
-  }
-
-  /* HTTP/1.1 implements persistent connections */
-  if (useHttp11) {
-    if (provide_content_len) {
-      cur_string = g_psHTTPHeaderStrings[HTTP_HDR_CONN_KEEPALIVE];
-    } else {
-      /* no Content-Length available, so a persistent connection is no possible
-         because the client does not know the data length */
-      cur_string = g_psHTTPHeaderStrings[HTTP_HDR_CONN_CLOSE];
-    }
-    cur_len = strlen(cur_string);
-    fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len);
-    written += file_put_ascii(data_file, cur_string, cur_len, &i);
-    i = 0;
-    if (precalcChksum) {
-      memcpy(&hdr_buf[hdr_len], cur_string, cur_len);
-      hdr_len += cur_len;
-    }
-  }
-
-#if MAKEFS_SUPPORT_DEFLATE
-  if (is_compressed) {
-    /* tell the client about the deflate encoding */
-    LWIP_ASSERT("error", deflateNonSsiFiles);
-    cur_string = "Content-Encoding: deflate\r\n";
-    cur_len = strlen(cur_string);
-    fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len);
-    written += file_put_ascii(data_file, cur_string, cur_len, &i);
-    i = 0;
-  }
-#else
-  LWIP_UNUSED_ARG(is_compressed);
-#endif
-
-  /* write content-type, ATTENTION: this includes the double-CRLF! */
-  cur_string = file_type;
-  cur_len = strlen(cur_string);
-  fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len);
-  written += file_put_ascii(data_file, cur_string, cur_len, &i);
-  i = 0;
-
-  /* ATTENTION: headers are done now (double-CRLF has been written!) */
-
-  if (precalcChksum) {
-    memcpy(&hdr_buf[hdr_len], cur_string, cur_len);
-    hdr_len += cur_len;
-
-    LWIP_ASSERT("hdr_len <= 0xffff", hdr_len <= 0xffff);
-    LWIP_ASSERT("strlen(hdr_buf) == hdr_len", strlen(hdr_buf) == hdr_len);
-    acc = ~inet_chksum(hdr_buf, (u16_t)hdr_len);
-    *http_hdr_len = (u16_t)hdr_len;
-    *http_hdr_chksum = acc;
-  }
-
-  return written;
-}
-
-int file_put_ascii(FILE *file, const char* ascii_string, int len, int *i)
-{
-  int x;
-  for (x = 0; x < len; x++) {
-    unsigned char cur = ascii_string[x];
-    fprintf(file, "0x%02.2x,", cur);
-    if ((++(*i) % HEX_BYTES_PER_LINE) == 0) {
-      fprintf(file, NEWLINE);
-    }
-  }
-  return len;
-}
-
-int s_put_ascii(char *buf, const char *ascii_string, int len, int *i)
-{
-  int x;
-  int idx = 0;
-  for (x = 0; x < len; x++) {
-    unsigned char cur = ascii_string[x];
-    sprintf(&buf[idx], "0x%02.2x,", cur);
-    idx += 5;
-    if ((++(*i) % HEX_BYTES_PER_LINE) == 0) {
-      sprintf(&buf[idx], NEWLINE);
-      idx += NEWLINE_LEN;
-    }
-  }
-  return len;
-}
diff --git a/src/apps/lwiperf/lwiperf.c b/src/apps/lwiperf/lwiperf.c
index efabe47..dbec4da 100644
--- a/src/apps/lwiperf/lwiperf.c
+++ b/src/apps/lwiperf/lwiperf.c
@@ -7,11 +7,15 @@
  * @defgroup iperf Iperf server
  * @ingroup apps
  *
- * This is a simple performance measuring server to check your bandwith using
- * iPerf2 on a PC as client.
- * It is currently a minimal implementation providing an IPv4 TCP server only.
+ * 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.
  *
- * @todo: implement UDP mode and IPv6
+ * @todo:
+ * - implement UDP mode
+ * - protect combined sessions handling (via 'related_master_state') against reallocation
+ *   (this is a pointer address, currently, so if the same memory is allocated again,
+ *    session pairs (tx/rx) can be confused on reallocation)
  */
 
 /*
@@ -52,8 +56,8 @@
 
 #include <string.h>
 
-/* Currently, only TCP-over-IPv4 is implemented (does iperf support IPv6 anyway?) */
-#if LWIP_IPV4 && LWIP_TCP && LWIP_CALLBACK_API
+/* Currently, only TCP is implemented */
+#if LWIP_TCP && LWIP_CALLBACK_API
 
 /** Specify the idle timeout (in seconds) after that the test fails */
 #ifndef LWIPERF_TCP_MAX_IDLE_SEC
@@ -63,6 +67,11 @@
 #error LWIPERF_TCP_MAX_IDLE_SEC must fit into an u8_t
 #endif
 
+/** Change this if you don't want to lwiperf to listen to any IP version */
+#ifndef LWIPERF_SERVER_IP_TYPE
+#define LWIPERF_SERVER_IP_TYPE      IPADDR_TYPE_ANY
+#endif
+
 /* File internal memory allocation (struct lwiperf_*): this defaults to
    the heap */
 #ifndef LWIPERF_ALLOC
@@ -91,101 +100,108 @@
 struct _lwiperf_state_base;
 typedef struct _lwiperf_state_base lwiperf_state_base_t;
 struct _lwiperf_state_base {
+  /* linked list */
+  lwiperf_state_base_t *next;
   /* 1=tcp, 0=udp */
   u8_t tcp;
   /* 1=server, 0=client */
   u8_t server;
-  lwiperf_state_base_t* next;
-  lwiperf_state_base_t* related_server_state;
+  /* master state used to abort sessions (e.g. listener, main client) */
+  lwiperf_state_base_t *related_master_state;
 };
 
 /** Connection handle for a TCP iperf session */
 typedef struct _lwiperf_state_tcp {
   lwiperf_state_base_t base;
-  struct tcp_pcb* server_pcb;
-  struct tcp_pcb* conn_pcb;
+  struct tcp_pcb *server_pcb;
+  struct tcp_pcb *conn_pcb;
   u32_t time_started;
   lwiperf_report_fn report_fn;
-  void* report_arg;
+  void *report_arg;
   u8_t poll_count;
   u8_t next_num;
+  /* 1=start server when client is closed */
+  u8_t client_tradeoff_mode;
   u32_t bytes_transferred;
   lwiperf_settings_t settings;
   u8_t have_settings_buf;
+  u8_t specific_remote;
+  ip_addr_t remote_addr;
 } lwiperf_state_tcp_t;
 
 /** List of active iperf sessions */
-static lwiperf_state_base_t* lwiperf_all_connections;
+static lwiperf_state_base_t *lwiperf_all_connections;
 /** A const buffer to send from: we want to measure sending, not copying! */
 static const u8_t lwiperf_txbuf_const[1600] = {
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
-  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
 };
 
 static err_t lwiperf_tcp_poll(void *arg, struct tcp_pcb *tpcb);
 static void lwiperf_tcp_err(void *arg, err_t err);
+static err_t lwiperf_start_tcp_server_impl(const ip_addr_t *local_addr, u16_t local_port,
+                                           lwiperf_report_fn report_fn, void *report_arg,
+                                           lwiperf_state_base_t *related_master_state, lwiperf_state_tcp_t **state);
+
 
 /** Add an iperf session to the 'active' list */
 static void
-lwiperf_list_add(lwiperf_state_base_t* item)
+lwiperf_list_add(lwiperf_state_base_t *item)
 {
-  if (lwiperf_all_connections == NULL) {
-    lwiperf_all_connections = item;
-  } else {
-    item = lwiperf_all_connections;
-  }
+  item->next = lwiperf_all_connections;
+  lwiperf_all_connections = item;
 }
 
 /** Remove an iperf session from the 'active' list */
 static void
-lwiperf_list_remove(lwiperf_state_base_t* item)
+lwiperf_list_remove(lwiperf_state_base_t *item)
 {
-  lwiperf_state_base_t* prev = NULL;
-  lwiperf_state_base_t* iter;
+  lwiperf_state_base_t *prev = NULL;
+  lwiperf_state_base_t *iter;
   for (iter = lwiperf_all_connections; iter != NULL; prev = iter, iter = iter->next) {
     if (iter == item) {
       if (prev == NULL) {
         lwiperf_all_connections = iter->next;
       } else {
-        prev->next = item;
+        prev->next = iter->next;
       }
       /* @debug: ensure this item is listed only once */
       for (iter = iter->next; iter != NULL; iter = iter->next) {
@@ -196,9 +212,21 @@
   }
 }
 
+static lwiperf_state_base_t *
+lwiperf_list_find(lwiperf_state_base_t *item)
+{
+  lwiperf_state_base_t *iter;
+  for (iter = lwiperf_all_connections; iter != NULL; iter = iter->next) {
+    if (iter == item) {
+      return item;
+    }
+  }
+  return NULL;
+}
+
 /** Call the report function of an iperf tcp session */
 static void
-lwip_tcp_conn_report(lwiperf_state_tcp_t* conn, enum lwiperf_report_type report_type)
+lwip_tcp_conn_report(lwiperf_state_tcp_t *conn, enum lwiperf_report_type report_type)
 {
   if ((conn != NULL) && (conn->report_fn != NULL)) {
     u32_t now, duration_ms, bandwidth_kbitpsec;
@@ -210,20 +238,20 @@
       bandwidth_kbitpsec = (conn->bytes_transferred / duration_ms) * 8U;
     }
     conn->report_fn(conn->report_arg, report_type,
-      &conn->conn_pcb->local_ip, conn->conn_pcb->local_port,
-      &conn->conn_pcb->remote_ip, conn->conn_pcb->remote_port,
-      conn->bytes_transferred, duration_ms, bandwidth_kbitpsec);
+                    &conn->conn_pcb->local_ip, conn->conn_pcb->local_port,
+                    &conn->conn_pcb->remote_ip, conn->conn_pcb->remote_port,
+                    conn->bytes_transferred, duration_ms, bandwidth_kbitpsec);
   }
 }
 
 /** Close an iperf tcp session */
 static void
-lwiperf_tcp_close(lwiperf_state_tcp_t* conn, enum lwiperf_report_type report_type)
+lwiperf_tcp_close(lwiperf_state_tcp_t *conn, enum lwiperf_report_type report_type)
 {
   err_t err;
 
-  lwip_tcp_conn_report(conn, report_type);
   lwiperf_list_remove(&conn->base);
+  lwip_tcp_conn_report(conn, report_type);
   if (conn->conn_pcb != NULL) {
     tcp_arg(conn->conn_pcb, NULL);
     tcp_poll(conn->conn_pcb, NULL, 0);
@@ -236,22 +264,22 @@
       tcp_abort(conn->conn_pcb);
     }
   } else {
-    /* no conn pcb, this is the server pcb */
+    /* no conn pcb, this is the listener pcb */
     err = tcp_close(conn->server_pcb);
-    LWIP_ASSERT("error", err != ERR_OK);
+    LWIP_ASSERT("error", err == ERR_OK);
   }
   LWIPERF_FREE(lwiperf_state_tcp_t, conn);
 }
 
 /** Try to send more data on an iperf tcp session */
 static err_t
-lwiperf_tcp_client_send_more(lwiperf_state_tcp_t* conn)
+lwiperf_tcp_client_send_more(lwiperf_state_tcp_t *conn)
 {
   int send_more;
   err_t err;
   u16_t txlen;
   u16_t txlen_max;
-  void* txptr;
+  void *txptr;
   u8_t apiflags;
 
   LWIP_ASSERT("conn invalid", (conn != NULL) && conn->base.tcp && (conn->base.server == 0));
@@ -262,7 +290,7 @@
       /* this session is time-limited */
       u32_t now = sys_now();
       u32_t diff_ms = now - conn->time_started;
-      u32_t time = (u32_t)-(s32_t)lwip_htonl(conn->settings.amount);
+      u32_t time = (u32_t) - (s32_t)lwip_htonl(conn->settings.amount);
       u32_t time_ms = time * 10;
       if (diff_ms >= time_ms) {
         /* time specified by the client is over -> close the connection */
@@ -282,19 +310,19 @@
 
     if (conn->bytes_transferred < 24) {
       /* transmit the settings a first time */
-      txptr = &((u8_t*)&conn->settings)[conn->bytes_transferred];
+      txptr = &((u8_t *)&conn->settings)[conn->bytes_transferred];
       txlen_max = (u16_t)(24 - conn->bytes_transferred);
       apiflags = TCP_WRITE_FLAG_COPY;
     } else if (conn->bytes_transferred < 48) {
       /* transmit the settings a second time */
-      txptr = &((u8_t*)&conn->settings)[conn->bytes_transferred - 24];
+      txptr = &((u8_t *)&conn->settings)[conn->bytes_transferred - 24];
       txlen_max = (u16_t)(48 - conn->bytes_transferred);
       apiflags = TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE;
       send_more = 1;
     } else {
       /* transmit data */
       /* @todo: every x bytes, transmit the settings again */
-      txptr = LWIP_CONST_CAST(void*, &lwiperf_txbuf_const[conn->bytes_transferred % 10]);
+      txptr = LWIP_CONST_CAST(void *, &lwiperf_txbuf_const[conn->bytes_transferred % 10]);
       txlen_max = TCP_MSS;
       if (conn->bytes_transferred == 48) { /* @todo: fix this for intermediate settings, too */
         txlen_max = TCP_MSS - 24;
@@ -308,14 +336,14 @@
       if (err ==  ERR_MEM) {
         txlen /= 2;
       }
-    } while ((err == ERR_MEM) && (txlen >= (TCP_MSS/2)));
+    } while ((err == ERR_MEM) && (txlen >= (TCP_MSS / 2)));
 
     if (err == ERR_OK) {
       conn->bytes_transferred += txlen;
     } else {
       send_more = 0;
     }
-  } while(send_more);
+  } while (send_more);
 
   tcp_output(conn->conn_pcb);
   return ERR_OK;
@@ -325,7 +353,7 @@
 static err_t
 lwiperf_tcp_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len)
 {
-  lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg;
+  lwiperf_state_tcp_t *conn = (lwiperf_state_tcp_t *)arg;
   /* @todo: check 'len' (e.g. to time ACK of all data)? for now, we just send more... */
   LWIP_ASSERT("invalid conn", conn->conn_pcb == tpcb);
   LWIP_UNUSED_ARG(tpcb);
@@ -340,7 +368,7 @@
 static err_t
 lwiperf_tcp_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err)
 {
-  lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg;
+  lwiperf_state_tcp_t *conn = (lwiperf_state_tcp_t *)arg;
   LWIP_ASSERT("invalid conn", conn->conn_pcb == tpcb);
   LWIP_UNUSED_ARG(tpcb);
   if (err != ERR_OK) {
@@ -356,41 +384,46 @@
  * receive test has finished.
  */
 static err_t
-lwiperf_tx_start(lwiperf_state_tcp_t* conn)
+lwiperf_tx_start_impl(const ip_addr_t *remote_ip, u16_t remote_port, lwiperf_settings_t *settings, lwiperf_report_fn report_fn,
+                      void *report_arg, lwiperf_state_base_t *related_master_state, lwiperf_state_tcp_t **new_conn)
 {
   err_t err;
-  lwiperf_state_tcp_t* client_conn;
-  struct tcp_pcb* newpcb;
+  lwiperf_state_tcp_t *client_conn;
+  struct tcp_pcb *newpcb;
   ip_addr_t remote_addr;
-  u16_t remote_port;
 
-  client_conn = (lwiperf_state_tcp_t*)LWIPERF_ALLOC(lwiperf_state_tcp_t);
+  LWIP_ASSERT("remote_ip != NULL", remote_ip != NULL);
+  LWIP_ASSERT("remote_ip != NULL", settings != NULL);
+  LWIP_ASSERT("new_conn != NULL", new_conn != NULL);
+  *new_conn = NULL;
+
+  client_conn = (lwiperf_state_tcp_t *)LWIPERF_ALLOC(lwiperf_state_tcp_t);
   if (client_conn == NULL) {
     return ERR_MEM;
   }
-  newpcb = tcp_new();
+  newpcb = tcp_new_ip_type(IP_GET_TYPE(remote_ip));
   if (newpcb == NULL) {
     LWIPERF_FREE(lwiperf_state_tcp_t, client_conn);
     return ERR_MEM;
   }
-
-  MEMCPY(client_conn, conn, sizeof(lwiperf_state_tcp_t));
-  client_conn->base.server = 0;
-  client_conn->server_pcb = NULL;
+  memset(client_conn, 0, sizeof(lwiperf_state_tcp_t));
+  client_conn->base.tcp = 1;
+  client_conn->base.related_master_state = related_master_state;
   client_conn->conn_pcb = newpcb;
   client_conn->time_started = sys_now(); /* @todo: set this again on 'connected' */
-  client_conn->poll_count = 0;
+  client_conn->report_fn = report_fn;
+  client_conn->report_arg = report_arg;
   client_conn->next_num = 4; /* initial nr is '4' since the header has 24 byte */
   client_conn->bytes_transferred = 0;
-  client_conn->settings.flags = 0; /* prevent the remote side starting back as client again */
+  memcpy(&client_conn->settings, settings, sizeof(*settings));
+  client_conn->have_settings_buf = 1;
 
   tcp_arg(newpcb, client_conn);
   tcp_sent(newpcb, lwiperf_tcp_client_sent);
   tcp_poll(newpcb, lwiperf_tcp_poll, 2U);
   tcp_err(newpcb, lwiperf_tcp_err);
 
-  ip_addr_copy(remote_addr, conn->conn_pcb->remote_ip);
-  remote_port = (u16_t)lwip_htonl(client_conn->settings.remote_port);
+  ip_addr_copy(remote_addr, *remote_ip);
 
   err = tcp_connect(newpcb, &remote_addr, remote_port, lwiperf_tcp_client_connected);
   if (err != ERR_OK) {
@@ -398,9 +431,26 @@
     return err;
   }
   lwiperf_list_add(&client_conn->base);
+  *new_conn = client_conn;
   return ERR_OK;
 }
 
+static err_t
+lwiperf_tx_start_passive(lwiperf_state_tcp_t *conn)
+{
+  err_t ret;
+  lwiperf_state_tcp_t *new_conn = NULL;
+  u16_t remote_port = (u16_t)lwip_htonl(conn->settings.remote_port);
+
+  ret = lwiperf_tx_start_impl(&conn->conn_pcb->remote_ip, remote_port, &conn->settings, conn->report_fn, conn->report_arg,
+    conn->base.related_master_state, &new_conn);
+  if (ret == ERR_OK) {
+    LWIP_ASSERT("new_conn != NULL", new_conn != NULL);
+    new_conn->settings.flags = 0; /* prevent the remote side starting back as client again */
+  }
+  return ret;
+}
+
 /** Receive data on an iperf tcp session */
 static err_t
 lwiperf_tcp_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
@@ -408,8 +458,8 @@
   u8_t tmp;
   u16_t tot_len;
   u32_t packet_idx;
-  struct pbuf* q;
-  lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg;
+  struct pbuf *q;
+  lwiperf_state_tcp_t *conn = (lwiperf_state_tcp_t *)arg;
 
   LWIP_ASSERT("pcb mismatch", conn->conn_pcb == tpcb);
   LWIP_UNUSED_ARG(tpcb);
@@ -420,10 +470,11 @@
   }
   if (p == NULL) {
     /* connection closed -> test done */
-    if ((conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST|LWIPERF_FLAGS_ANSWER_NOW)) ==
-        PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST)) {
-      /* client requested transmission after end of test */
-      lwiperf_tx_start(conn);
+    if (conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST)) {
+      if ((conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_NOW)) == 0) {
+        /* client requested transmission after end of test */
+        lwiperf_tx_start_passive(conn);
+      }
     }
     lwiperf_tcp_close(conn, LWIPERF_TCP_DONE_SERVER);
     return ERR_OK;
@@ -432,35 +483,38 @@
 
   conn->poll_count = 0;
 
-  if ((!conn->have_settings_buf) || ((conn->bytes_transferred -24) % (1024*128) == 0)) {
+  if ((!conn->have_settings_buf) || ((conn->bytes_transferred - 24) % (1024 * 128) == 0)) {
     /* wait for 24-byte header */
     if (p->tot_len < sizeof(lwiperf_settings_t)) {
       lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR);
       pbuf_free(p);
-      return ERR_VAL;
+      return ERR_OK;
     }
     if (!conn->have_settings_buf) {
       if (pbuf_copy_partial(p, &conn->settings, sizeof(lwiperf_settings_t), 0) != sizeof(lwiperf_settings_t)) {
         lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL);
         pbuf_free(p);
-        return ERR_VAL;
+        return ERR_OK;
       }
       conn->have_settings_buf = 1;
-      if ((conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST|LWIPERF_FLAGS_ANSWER_NOW)) ==
-        PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST|LWIPERF_FLAGS_ANSWER_NOW)) {
+      if (conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST)) {
+        if (conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_NOW)) {
           /* client requested parallel transmission test */
-          err_t err2 = lwiperf_tx_start(conn);
+          err_t err2 = lwiperf_tx_start_passive(conn);
           if (err2 != ERR_OK) {
             lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_TXERROR);
             pbuf_free(p);
-            return err2;
+            return ERR_OK;
           }
+        }
       }
     } else {
-      if (pbuf_memcmp(p, 0, &conn->settings, sizeof(lwiperf_settings_t)) != 0) {
-        lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR);
-        pbuf_free(p);
-        return ERR_VAL;
+      if (conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST)) {
+        if (pbuf_memcmp(p, 0, &conn->settings, sizeof(lwiperf_settings_t)) != 0) {
+          lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR);
+          pbuf_free(p);
+          return ERR_OK;
+        }
       }
     }
     conn->bytes_transferred += sizeof(lwiperf_settings_t);
@@ -471,14 +525,15 @@
       return ERR_OK;
     }
     conn->next_num = 4; /* 24 bytes received... */
-    tmp = pbuf_header(p, -24);
-    LWIP_ASSERT("pbuf_header failed", tmp == 0);
+    tmp = pbuf_remove_header(p, 24);
+    LWIP_ASSERT("pbuf_remove_header failed", tmp == 0);
+    LWIP_UNUSED_ARG(tmp); /* for LWIP_NOASSERT */
   }
 
   packet_idx = 0;
   for (q = p; q != NULL; q = q->next) {
 #if LWIPERF_CHECK_RX_DATA
-    const u8_t* payload = (const u8_t*)q->payload;
+    const u8_t *payload = (const u8_t *)q->payload;
     u16_t i;
     for (i = 0; i < q->len; i++) {
       u8_t val = payload[i];
@@ -491,7 +546,7 @@
       } else {
         lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR);
         pbuf_free(p);
-        return ERR_VAL;
+        return ERR_OK;
       }
     }
 #endif
@@ -508,7 +563,7 @@
 static void
 lwiperf_tcp_err(void *arg, err_t err)
 {
-  lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg;
+  lwiperf_state_tcp_t *conn = (lwiperf_state_tcp_t *)arg;
   LWIP_UNUSED_ARG(err);
   lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_REMOTE);
 }
@@ -517,7 +572,7 @@
 static err_t
 lwiperf_tcp_poll(void *arg, struct tcp_pcb *tpcb)
 {
-  lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg;
+  lwiperf_state_tcp_t *conn = (lwiperf_state_tcp_t *)arg;
   LWIP_ASSERT("pcb mismatch", conn->conn_pcb == tpcb);
   LWIP_UNUSED_ARG(tpcb);
   if (++conn->poll_count >= LWIPERF_TCP_MAX_IDLE_SEC) {
@@ -541,16 +596,28 @@
     return ERR_VAL;
   }
 
-  s = (lwiperf_state_tcp_t*)arg;
-  conn = (lwiperf_state_tcp_t*)LWIPERF_ALLOC(lwiperf_state_tcp_t);
+  s = (lwiperf_state_tcp_t *)arg;
+  LWIP_ASSERT("invalid session", s->base.server);
+  LWIP_ASSERT("invalid listen pcb", s->server_pcb != NULL);
+  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)) {
+      /* this listener belongs to a client session, and this is not the correct remote */
+      return ERR_VAL;
+    }
+  } else {
+    LWIP_ASSERT("s->base.related_master_state == NULL", s->base.related_master_state == NULL);
+  }
+
+  conn = (lwiperf_state_tcp_t *)LWIPERF_ALLOC(lwiperf_state_tcp_t);
   if (conn == NULL) {
     return ERR_MEM;
   }
   memset(conn, 0, sizeof(lwiperf_state_tcp_t));
   conn->base.tcp = 1;
   conn->base.server = 1;
-  conn->base.related_server_state = &s->base;
-  conn->server_pcb = s->server_pcb;
+  conn->base.related_master_state = &s->base;
   conn->conn_pcb = newpcb;
   conn->time_started = sys_now();
   conn->report_fn = s->report_fn;
@@ -562,11 +629,21 @@
   tcp_poll(newpcb, lwiperf_tcp_poll, 2U);
   tcp_err(conn->conn_pcb, lwiperf_tcp_err);
 
+  if (s->specific_remote) {
+    /* this listener belongs to a client, so make the client the master of the newly created connection */
+    conn->base.related_master_state = s->base.related_master_state;
+    /* if dual mode or (tradeoff mode AND client is done): close the listener */
+    if (!s->client_tradeoff_mode || !lwiperf_list_find(s->base.related_master_state)) {
+      /* prevent report when closing: this is expected */
+      s->report_fn = NULL;
+      lwiperf_tcp_close(s, LWIPERF_TCP_ABORTED_LOCAL);
+    }
+  }
   lwiperf_list_add(&conn->base);
   return ERR_OK;
 }
 
-/** 
+/**
  * @ingroup iperf
  * Start a TCP iperf server on the default TCP port (5001) and listen for
  * incoming connections from iperf clients.
@@ -574,11 +651,11 @@
  * @returns a connection handle that can be used to abort the server
  *          by calling @ref lwiperf_abort()
  */
-void*
-lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void* report_arg)
+void *
+lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void *report_arg)
 {
   return lwiperf_start_tcp_server(IP_ADDR_ANY, LWIPERF_TCP_PORT_DEFAULT,
-    report_fn, report_arg);
+                                  report_fn, report_arg);
 }
 
 /**
@@ -589,41 +666,63 @@
  * @returns a connection handle that can be used to abort the server
  *          by calling @ref lwiperf_abort()
  */
-void*
-lwiperf_start_tcp_server(const ip_addr_t* local_addr, u16_t local_port,
-  lwiperf_report_fn report_fn, void* report_arg)
+void *
+lwiperf_start_tcp_server(const ip_addr_t *local_addr, u16_t local_port,
+                         lwiperf_report_fn report_fn, void *report_arg)
 {
   err_t err;
-  struct tcp_pcb* pcb;
-  lwiperf_state_tcp_t* s;
+  lwiperf_state_tcp_t *state = NULL;
+
+  err = lwiperf_start_tcp_server_impl(local_addr, local_port, report_fn, report_arg,
+    NULL, &state);
+  if (err == ERR_OK) {
+    return state;
+  }
+  return NULL;
+}
+
+static err_t lwiperf_start_tcp_server_impl(const ip_addr_t *local_addr, u16_t local_port,
+                                           lwiperf_report_fn report_fn, void *report_arg,
+                                           lwiperf_state_base_t *related_master_state, lwiperf_state_tcp_t **state)
+{
+  err_t err;
+  struct tcp_pcb *pcb;
+  lwiperf_state_tcp_t *s;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ASSERT("state != NULL", state != NULL);
 
   if (local_addr == NULL) {
-    return NULL;
+    return ERR_ARG;
   }
 
-  s = (lwiperf_state_tcp_t*)LWIPERF_ALLOC(lwiperf_state_tcp_t);
+  s = (lwiperf_state_tcp_t *)LWIPERF_ALLOC(lwiperf_state_tcp_t);
   if (s == NULL) {
-    return NULL;
+    return ERR_MEM;
   }
   memset(s, 0, sizeof(lwiperf_state_tcp_t));
   s->base.tcp = 1;
   s->base.server = 1;
+  s->base.related_master_state = related_master_state;
   s->report_fn = report_fn;
   s->report_arg = report_arg;
 
-  pcb = tcp_new();
-  if (pcb != NULL) {
-    err = tcp_bind(pcb, local_addr, local_port);
-    if (err == ERR_OK) {
-      s->server_pcb = tcp_listen_with_backlog(pcb, 1);
-    }
+  pcb = tcp_new_ip_type(LWIPERF_SERVER_IP_TYPE);
+  if (pcb == NULL) {
+    return ERR_MEM;
   }
+  err = tcp_bind(pcb, local_addr, local_port);
+  if (err != ERR_OK) {
+    return err;
+  }
+  s->server_pcb = tcp_listen_with_backlog(pcb, 1);
   if (s->server_pcb == NULL) {
     if (pcb != NULL) {
       tcp_close(pcb);
     }
     LWIPERF_FREE(lwiperf_state_tcp_t, s);
-    return NULL;
+    return ERR_MEM;
   }
   pcb = NULL;
 
@@ -631,7 +730,86 @@
   tcp_accept(s->server_pcb, lwiperf_tcp_accept);
 
   lwiperf_list_add(&s->base);
-  return s;
+  *state = s;
+  return ERR_OK;
+}
+
+/**
+ * @ingroup iperf
+ * Start a TCP iperf client to the default TCP port (5001).
+ *
+ * @returns a connection handle that can be used to abort the client
+ *          by calling @ref lwiperf_abort()
+ */
+void* lwiperf_start_tcp_client_default(const ip_addr_t* remote_addr,
+                               lwiperf_report_fn report_fn, void* report_arg)
+{
+  return lwiperf_start_tcp_client(remote_addr, LWIPERF_TCP_PORT_DEFAULT, LWIPERF_CLIENT,
+                                  report_fn, report_arg);
+}
+
+/**
+ * @ingroup iperf
+ * Start a TCP iperf client to a specific IP address and port.
+ *
+ * @returns a connection handle that can be used to abort the client
+ *          by calling @ref lwiperf_abort()
+ */
+void* 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)
+{
+  err_t ret;
+  lwiperf_settings_t settings;
+  lwiperf_state_tcp_t *state = NULL;
+
+  memset(&settings, 0, sizeof(settings));
+  switch (type) {
+  case LWIPERF_CLIENT:
+    /* Unidirectional tx only test */
+    settings.flags = 0;
+    break;
+  case LWIPERF_DUAL:
+    /* Do a bidirectional test simultaneously */
+    settings.flags = htonl(LWIPERF_FLAGS_ANSWER_TEST | LWIPERF_FLAGS_ANSWER_NOW);
+    break;
+  case LWIPERF_TRADEOFF:
+    /* Do a bidirectional test individually */
+    settings.flags = htonl(LWIPERF_FLAGS_ANSWER_TEST);
+    break;
+  default:
+    /* invalid argument */
+    return NULL;
+  }
+  settings.num_threads = htonl(1);
+  settings.remote_port = htonl(LWIPERF_TCP_PORT_DEFAULT);
+  /* TODO: implement passing duration/amount of bytes to transfer */
+  settings.amount = htonl((u32_t)-1000);
+
+  ret = lwiperf_tx_start_impl(remote_addr, remote_port, &settings, report_fn, report_arg, NULL, &state);
+  if (ret == ERR_OK) {
+    LWIP_ASSERT("state != NULL", state != NULL);
+    if (type != LWIPERF_CLIENT) {
+      /* start corresponding server now */
+      lwiperf_state_tcp_t *server = NULL;
+      ret = lwiperf_start_tcp_server_impl(&state->conn_pcb->local_ip, LWIPERF_TCP_PORT_DEFAULT,
+        report_fn, report_arg, (lwiperf_state_base_t *)state, &server);
+      if (ret != ERR_OK) {
+        /* starting server failed, abort client */
+        lwiperf_abort(state);
+        return NULL;
+      }
+      /* make this server accept one connection only */
+      server->specific_remote = 1;
+      server->remote_addr = state->conn_pcb->remote_ip;
+      if (type == LWIPERF_TRADEOFF) {
+        /* tradeoff means that the remote host connects only after the client is done,
+           so keep the listen pcb open until the client is done */
+        server->client_tradeoff_mode = 1;
+      }
+    }
+    return state;
+  }
+  return NULL;
 }
 
 /**
@@ -639,12 +817,14 @@
  * Abort an iperf session (handle returned by lwiperf_start_tcp_server*())
  */
 void
-lwiperf_abort(void* lwiperf_session)
+lwiperf_abort(void *lwiperf_session)
 {
-  lwiperf_state_base_t* i, *dealloc, *last = NULL;
+  lwiperf_state_base_t *i, *dealloc, *last = NULL;
+
+  LWIP_ASSERT_CORE_LOCKED();
 
   for (i = lwiperf_all_connections; i != NULL; ) {
-    if ((i == lwiperf_session) || (i->related_server_state == lwiperf_session)) {
+    if ((i == lwiperf_session) || (i->related_master_state == lwiperf_session)) {
       dealloc = i;
       i = i->next;
       if (last != NULL) {
@@ -658,4 +838,4 @@
   }
 }
 
-#endif /* LWIP_IPV4 && LWIP_TCP && LWIP_CALLBACK_API */
+#endif /* LWIP_TCP && LWIP_CALLBACK_API */
diff --git a/src/apps/mdns/mdns.c b/src/apps/mdns/mdns.c
index 14334fc..aad2728 100644
--- a/src/apps/mdns/mdns.c
+++ b/src/apps/mdns/mdns.c
@@ -7,18 +7,17 @@
  *
  * RFC 6762 - Multicast DNS\n
  * RFC 6763 - DNS-Based Service Discovery\n
- * 
+ *
  * @verbinclude mdns.txt
- * 
+ *
  * Things left to implement:
  * -------------------------
  *
- * - Probing/conflict resolution
+ * - 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
  * - Fragmenting replies if required
- * - Subscribe to netif address/link change events and act on them (currently needs to be done manually)
  * - Handling multi-packet known answers
  * - Individual known answer detection for all local IPv6 addresses
  * - Dynamic size of outgoing packet
@@ -63,19 +62,21 @@
 #include "lwip/ip_addr.h"
 #include "lwip/mem.h"
 #include "lwip/prot/dns.h"
+#include "lwip/prot/iana.h"
+#include "lwip/timeouts.h"
 
 #include <string.h>
 
 #if LWIP_MDNS_RESPONDER
 
 #if (LWIP_IPV4 && !LWIP_IGMP)
-  #error "If you want to use MDNS with IPv4, you have to define LWIP_IGMP=1 in your lwipopts.h"
+#error "If you want to use MDNS with IPv4, you have to define LWIP_IGMP=1 in your lwipopts.h"
 #endif
 #if (LWIP_IPV6 && !LWIP_IPV6_MLD)
 #error "If you want to use MDNS with IPv6, you have to define LWIP_IPV6_MLD=1 in your lwipopts.h"
 #endif
 #if (!LWIP_UDP)
-  #error "If you want to use MDNS, you have to define LWIP_UDP=1 in your lwipopts.h"
+#error "If you want to use MDNS, you have to define LWIP_UDP=1 in your lwipopts.h"
 #endif
 
 #if LWIP_IPV4
@@ -90,7 +91,6 @@
 static const ip_addr_t v6group = DNS_MQUERY_IPV6_GROUP_INIT;
 #endif
 
-#define MDNS_PORT 5353
 #define MDNS_TTL  255
 
 /* Stored offsets to beginning of domain names
@@ -102,6 +102,10 @@
 
 static u8_t mdns_netif_client_id;
 static struct udp_pcb *mdns_pcb;
+#if MDNS_RESP_USENETIF_EXTCALLBACK
+NETIF_DECLARE_EXT_CALLBACK(netif_callback)
+#endif
+static mdns_name_result_cb_t mdns_name_result_cb;
 
 #define NETIF_TO_HOST(netif) (struct mdns_host*)(netif_get_client_data(netif, mdns_netif_client_id))
 
@@ -135,9 +139,22 @@
 /* Lookup for text info on service instance */
 #define REPLY_SERVICE_TXT       0x80
 
+#define MDNS_PROBE_DELAY_MS       250
+#define MDNS_PROBE_COUNT          3
+#ifdef LWIP_RAND
+/* first probe timeout SHOULD be random 0-250 ms*/
+#define MDNS_INITIAL_PROBE_DELAY_MS (LWIP_RAND() % MDNS_PROBE_DELAY_MS)
+#else
+#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
+
 static const char *dnssd_protos[] = {
-    "_udp", /* DNSSD_PROTO_UDP */
-    "_tcp", /* DNSSD_PROTO_TCP */
+  "_udp", /* DNSSD_PROTO_UDP */
+  "_tcp", /* DNSSD_PROTO_TCP */
 };
 
 /** Description of a service */
@@ -168,6 +185,10 @@
   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;
 };
 
 /** Information about received packet */
@@ -191,7 +212,7 @@
   /** Number of unparsed questions */
   u16_t questions_left;
   /** Number of answers in packet,
-   *  (sum of normal, authorative and additional answers)
+   *  (sum of normal, authoritative and additional answers)
    *  read from packet header */
   u16_t answers;
   /** Number of unparsed answers */
@@ -215,6 +236,8 @@
   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.
@@ -261,15 +284,11 @@
   u16_t rd_offset;
 };
 
-/**
- * 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)
+static err_t mdns_send_outpacket(struct mdns_outpacket *outpkt, u8_t flags);
+static void mdns_probe(void* arg);
+
+static err_t
+mdns_domain_add_label_base(struct mdns_domain *domain, u8_t len)
 {
   if (len > MDNS_LABEL_MAXLEN) {
     return ERR_VAL;
@@ -283,6 +302,23 @@
   }
   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;
@@ -291,6 +327,27 @@
 }
 
 /**
+ * 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
  */
@@ -309,7 +366,7 @@
     offset++;
 
     /* is this a compressed label? */
-    if((c & 0xc0) == 0xc0) {
+    if ((c & 0xc0) == 0xc0) {
       u16_t jumpaddr;
       if (offset >= p->tot_len) {
         /* Make sure both jump bytes fit in the packet */
@@ -319,7 +376,7 @@
       offset++;
       if (jumpaddr >= SIZEOF_DNS_HDR && jumpaddr < p->tot_len) {
         u16_t res;
-      /* Recursive call, maximum depth will be checked */
+        /* 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) {
@@ -333,22 +390,16 @@
 
     /* normal label */
     if (c <= MDNS_LABEL_MAXLEN) {
-      u8_t label[MDNS_LABEL_MAXLEN];
       err_t res;
 
       if (c + domain->length >= MDNS_DOMAIN_MAXLEN) {
         return MDNS_READNAME_ERROR;
       }
-      if (c != 0) {
-        if (pbuf_copy_partial(p, label, c, offset) != c) {
-          return MDNS_READNAME_ERROR;
-        }
-        offset += c;
-      }
-      res = mdns_domain_add_label(domain, (char *) label, c);
+      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;
@@ -460,6 +511,8 @@
   int i;
   err_t res;
   const u8_t *ptr;
+
+  LWIP_UNUSED_ARG(res);
   if (!domain || !addr) {
     return ERR_ARG;
   }
@@ -473,9 +526,9 @@
     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));
+  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));
+  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);
@@ -498,12 +551,13 @@
   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_t) - 1; i >= 0; i--) {
+  for (i = sizeof(ip6_addr_p_t) - 1; i >= 0; i--) {
     char buf;
     u8_t byte = ptr[i];
     int j;
@@ -518,9 +572,9 @@
       byte >>= 4;
     }
   }
-  res = mdns_domain_add_label(domain, REVERSE_PTR_V6_DOMAIN, (u8_t)(sizeof(REVERSE_PTR_V6_DOMAIN)-1));
+  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));
+  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);
@@ -533,7 +587,8 @@
 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));
+  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);
 }
@@ -548,6 +603,7 @@
 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));
@@ -564,10 +620,11 @@
 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));
+  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));
+  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);
@@ -587,6 +644,7 @@
 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));
@@ -785,7 +843,7 @@
   u16_t jump;
 
   if (!domain->skip_compression) {
-    for (i = 0; i < NUM_DOMAIN_OFFSETS; ++i) {
+    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);
@@ -805,7 +863,7 @@
     }
 
     /* Store offset of this new domain */
-    for (i = 0; i < NUM_DOMAIN_OFFSETS; ++i) {
+    for (i = 0; i < NUM_DOMAIN_OFFSETS; i++) {
       if (outpkt->domain_offsets[i] == 0) {
         outpkt->domain_offsets[i] = outpkt->write_offset;
         break;
@@ -1138,7 +1196,7 @@
   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_t), NULL);
+  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 */
@@ -1226,7 +1284,7 @@
   SMEMCPY(&out->dest_addr, &in->source_addr, sizeof(ip_addr_t));
   out->dest_port = in->source_port;
 
-  if (in->source_port != MDNS_PORT) {
+  if (in->source_port != LWIP_IANA_PORT_MDNS) {
     out->unicast_reply = 1;
     out->cache_flush = 0;
     if (in->questions == 1) {
@@ -1247,13 +1305,14 @@
  * Add additional answers based on the selected answers
  * Send the packet
  */
-static void
-mdns_send_outpacket(struct mdns_outpacket *outpkt)
+static err_t
+mdns_send_outpacket(struct mdns_outpacket *outpkt, u8_t flags)
 {
   struct mdns_service *service;
-  err_t res;
+  err_t res = ERR_ARG;
   int i;
-  struct mdns_host* mdns = NETIF_TO_HOST(outpkt->netif);
+  struct mdns_host *mdns = NETIF_TO_HOST(outpkt->netif);
+  u16_t answers = 0;
 
   /* Write answers to host questions */
 #if LWIP_IPV4
@@ -1262,26 +1321,26 @@
     if (res != ERR_OK) {
       goto cleanup;
     }
-    outpkt->answers++;
+    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;
     }
-    outpkt->answers++;
+    answers++;
   }
 #endif
 #if LWIP_IPV6
   if (outpkt->host_replies & REPLY_HOST_AAAA) {
     int addrindex;
-    for (addrindex = 0; addrindex < LWIP_IPV6_NUM_ADDRESSES; ++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->answers++;
+        answers++;
       }
     }
   }
@@ -1294,7 +1353,7 @@
         if (res != ERR_OK) {
           goto cleanup;
         }
-        outpkt->answers++;
+        answers++;
       }
       addrindex++;
       rev_addrs >>= 1;
@@ -1303,7 +1362,7 @@
 #endif
 
   /* Write answers to service questions */
-  for (i = 0; i < MDNS_MAX_SERVICES; ++i) {
+  for (i = 0; i < MDNS_MAX_SERVICES; i++) {
     service = mdns->services[i];
     if (!service) {
       continue;
@@ -1314,7 +1373,7 @@
       if (res != ERR_OK) {
         goto cleanup;
       }
-      outpkt->answers++;
+      answers++;
     }
 
     if (outpkt->serv_replies[i] & REPLY_SERVICE_NAME_PTR) {
@@ -1322,7 +1381,7 @@
       if (res != ERR_OK) {
         goto cleanup;
       }
-      outpkt->answers++;
+      answers++;
     }
 
     if (outpkt->serv_replies[i] & REPLY_SERVICE_SRV) {
@@ -1330,7 +1389,7 @@
       if (res != ERR_OK) {
         goto cleanup;
       }
-      outpkt->answers++;
+      answers++;
     }
 
     if (outpkt->serv_replies[i] & REPLY_SERVICE_TXT) {
@@ -1338,12 +1397,19 @@
       if (res != ERR_OK) {
         goto cleanup;
       }
-      outpkt->answers++;
+      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) {
+  for (i = 0; i < MDNS_MAX_SERVICES; i++) {
     service = mdns->services[i];
     if (!service) {
       continue;
@@ -1377,7 +1443,7 @@
 #if LWIP_IPV6
       if (!(outpkt->host_replies & REPLY_HOST_AAAA)) {
         int addrindex;
-        for (addrindex = 0; addrindex < LWIP_IPV6_NUM_ADDRESSES; ++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) {
@@ -1389,7 +1455,8 @@
       }
 #endif
 #if LWIP_IPV4
-      if (!(outpkt->host_replies & REPLY_HOST_A)) {
+      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;
@@ -1406,13 +1473,12 @@
 
     /* Write header */
     memset(&hdr, 0, sizeof(hdr));
-    hdr.flags1 = DNS_FLAG1_RESPONSE | DNS_FLAG1_AUTHORATIVE;
+    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);
-    if (outpkt->legacy_query) {
-      hdr.numquestions = lwip_htons(1);
-      hdr.id = lwip_htons(outpkt->tx_id);
-    }
+    hdr.id = lwip_htons(outpkt->tx_id);
     pbuf_take(outpkt->pbuf, &hdr, sizeof(hdr));
 
     /* Shrink packet */
@@ -1430,9 +1496,9 @@
     /* 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) {
-      udp_sendto_if(mdns_pcb, outpkt->pbuf, &outpkt->dest_addr, outpkt->dest_port, outpkt->netif);
+      res = udp_sendto_if(mdns_pcb, outpkt->pbuf, &outpkt->dest_addr, outpkt->dest_port, outpkt->netif);
     } else {
-      udp_sendto_if(mdns_pcb, outpkt->pbuf, mcast_destaddr, MDNS_PORT, outpkt->netif);
+      res = udp_sendto_if(mdns_pcb, outpkt->pbuf, mcast_destaddr, LWIP_IANA_PORT_MDNS, outpkt->netif);
     }
   }
 
@@ -1441,6 +1507,7 @@
     pbuf_free(outpkt->pbuf);
     outpkt->pbuf = NULL;
   }
+  return res;
 }
 
 /**
@@ -1453,17 +1520,18 @@
 {
   struct mdns_outpacket announce;
   int i;
-  struct mdns_host* mdns = NETIF_TO_HOST(netif);
+  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)))
+  if (!ip4_addr_isany_val(*netif_ip4_addr(netif))) {
     announce.host_replies = REPLY_HOST_A | REPLY_HOST_PTR_V4;
+  }
 #endif
 #if LWIP_IPV6
-  for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) {
+  for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
     if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i))) {
       announce.host_replies |= REPLY_HOST_AAAA | REPLY_HOST_PTR_V6;
       announce.host_reverse_v6_replies |= (1 << i);
@@ -1475,13 +1543,13 @@
     struct mdns_service *serv = mdns->services[i];
     if (serv) {
       announce.serv_replies[i] = REPLY_SERVICE_TYPE_PTR | REPLY_SERVICE_NAME_PTR |
-          REPLY_SERVICE_SRV | REPLY_SERVICE_TXT;
+                                 REPLY_SERVICE_SRV | REPLY_SERVICE_TXT;
     }
   }
 
-  announce.dest_port = MDNS_PORT;
+  announce.dest_port = LWIP_IANA_PORT_MDNS;
   SMEMCPY(&announce.dest_addr, destination, sizeof(announce.dest_addr));
-  mdns_send_outpacket(&announce);
+  mdns_send_outpacket(&announce, DNS_FLAG1_RESPONSE | DNS_FLAG1_AUTHORATIVE);
 }
 
 /**
@@ -1498,7 +1566,13 @@
   int replies = 0;
   int i;
   err_t res;
-  struct mdns_host* mdns = NETIF_TO_HOST(pkt->netif);
+  struct mdns_host *mdns = NETIF_TO_HOST(pkt->netif);
+
+  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;
+  }
 
   mdns_init_outpacket(&reply, pkt);
 
@@ -1523,7 +1597,7 @@
     reply.host_replies |= check_host(pkt->netif, &q.info, &reply.host_reverse_v6_replies);
     replies |= reply.host_replies;
 
-    for (i = 0; i < MDNS_MAX_SERVICES; ++i) {
+    for (i = 0; i < MDNS_MAX_SERVICES; i++) {
       service = mdns->services[i];
       if (!service) {
         continue;
@@ -1535,6 +1609,7 @@
     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;
       }
@@ -1579,17 +1654,17 @@
         if (len != MDNS_READNAME_ERROR && res == ERR_OK && mdns_domain_eq(&known_ans, &my_ans)) {
 #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;
+            LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Skipping known answer: v4 PTR\n"));
+            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;
-              }
+            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;
+            }
           }
 #endif
         }
@@ -1603,7 +1678,7 @@
 #endif
       } else if (match & REPLY_HOST_AAAA) {
 #if LWIP_IPV6
-        if (ans.rd_length == sizeof(ip6_addr_t) &&
+        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) {
           LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Skipping known answer: AAAA\n"));
@@ -1613,7 +1688,7 @@
       }
     }
 
-    for (i = 0; i < MDNS_MAX_SERVICES; ++i) {
+    for (i = 0; i < MDNS_MAX_SERVICES; i++) {
       service = mdns->services[i];
       if (!service) {
         continue;
@@ -1690,7 +1765,7 @@
     }
   }
 
-  mdns_send_outpacket(&reply);
+  mdns_send_outpacket(&reply, DNS_FLAG1_RESPONSE | DNS_FLAG1_AUTHORATIVE);
 
 cleanup:
   if (reply.pbuf) {
@@ -1707,6 +1782,8 @@
 static void
 mdns_handle_response(struct mdns_packet *pkt)
 {
+  struct mdns_host* mdns = NETIF_TO_HOST(pkt->netif);
+
   /* Ignore all questions */
   while (pkt->questions_left) {
     struct mdns_question q;
@@ -1732,6 +1809,39 @@
     LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: 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));
+
+    /*"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)) {
+      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;
+      }
+
+      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: Probe response matches service domain!"));
+          conflict = 1;
+        }
+      }
+
+      if (conflict != 0) {
+        sys_untimeout(mdns_probe, pkt->netif);
+        if (mdns_name_result_cb != NULL) {
+          mdns_name_result_cb(pkt->netif, MDNS_PROBING_CONFLICT);
+        }
+      }
+    }
   }
 }
 
@@ -1750,7 +1860,7 @@
   LWIP_UNUSED_ARG(arg);
   LWIP_UNUSED_ARG(pcb);
 
-  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Received IPv%d MDNS packet, len %d\n", IP_IS_V6(addr)? 6 : 4, p->tot_len));
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Received IPv%d MDNS packet, len %d\n", IP_IS_V6(addr) ? 6 : 4, p->tot_len));
 
   if (NETIF_TO_HOST(recv_netif) == NULL) {
     /* From netif not configured for MDNS */
@@ -1780,7 +1890,8 @@
 
 #if LWIP_IPV6
   if (IP_IS_V6(ip_current_dest_addr())) {
-    if (!ip_addr_cmp(ip_current_dest_addr(), &v6group)) {
+    /* instead of having one 'v6group' per netif, just compare zoneless here */
+    if (!ip_addr_cmp_zoneless(ip_current_dest_addr(), &v6group)) {
       packet.recv_unicast = 1;
     }
   }
@@ -1803,59 +1914,141 @@
   pbuf_free(p);
 }
 
-/**
- * @ingroup mdns
- * Initiate MDNS responder. Will open UDP sockets on port 5353
- */
-void
-mdns_resp_init(void)
+#if LWIP_NETIF_EXT_STATUS_CALLBACK && MDNS_RESP_USENETIF_EXTCALLBACK
+static void
+mdns_netif_ext_status_callback(struct netif *netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t *args)
 {
-  err_t res;
+  LWIP_UNUSED_ARG(args);
 
-  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);
-#else
-  mdns_pcb->ttl = MDNS_TTL;
-#endif
-  res = udp_bind(mdns_pcb, IP_ANY_TYPE, MDNS_PORT);
-  LWIP_UNUSED_ARG(res); /* in case of LWIP_NOASSERT */
-  LWIP_ASSERT("Failed to bind pcb", res == ERR_OK);
-  udp_recv(mdns_pcb, mdns_recv, NULL);
-
-  mdns_netif_client_id = netif_alloc_client_data_id();
-}
-
-/**
- * @ingroup mdns
- * Announce IP settings have changed on netif.
- * Call this in your callback registered by netif_set_status_callback().
- * This function may go away in the future when netif supports registering
- * multiple callback functions.
- * @param netif The network interface where settings have changed.
- */
-void
-mdns_resp_netif_settings_changed(struct netif *netif)
-{
-  LWIP_ERROR("mdns_resp_netif_ip_changed: netif != NULL", (netif != NULL), return);
-
+  /* MDNS enabled on netif? */
   if (NETIF_TO_HOST(netif) == NULL) {
     return;
   }
 
-  /* Announce on IPv6 and IPv4 */
-#if LWIP_IPV6
-   mdns_announce(netif, IP6_ADDR_ANY);
-#endif
+  if (reason & LWIP_NSC_STATUS_CHANGED) {
+    if (args->status_changed.state != 0) {
+      mdns_resp_restart(netif);
+    }
+    /* TODO: send goodbye message */
+  }
+  if (reason & LWIP_NSC_LINK_CHANGED) {
+    if (args->link_changed.state != 0) {
+      mdns_resp_restart(netif);
+    }
+  }
+  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);
+  }
+}
+#endif /* LWIP_NETIF_EXT_STATUS_CALLBACK && MDNS_RESP_USENETIF_EXTCALLBACK */
+
+static err_t
+mdns_send_probe(struct netif* netif, const ip_addr_t *destination)
+{
+  struct mdns_host* mdns;
+  struct mdns_outpacket pkt;
+  struct mdns_domain domain;
+  u8_t i;
+  err_t res;
+
+  mdns = NETIF_TO_HOST(netif);
+
+  memset(&pkt, 0, sizeof(pkt));
+  pkt.netif = netif;
+
+  /* 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++;
+  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++;
+  }
+
+  /* Add answers to the questions above into the authority section for tiebreaking */
 #if LWIP_IPV4
-   mdns_announce(netif, IP4_ADDR_ANY);
+  if (!ip4_addr_isany_val(*netif_ip4_addr(netif))) {
+    pkt.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;
+    }
+  }
+#endif
+
+  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;
+    }
+  }
+
+  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);
+
+cleanup:
+  if (pkt.pbuf) {
+    pbuf_free(pkt.pbuf);
+    pkt.pbuf = NULL;
+  }
+  return res;
+}
+
+/**
+ * Timer callback for probing network.
+ */
+static void
+mdns_probe(void* arg)
+{
+  struct netif *netif = (struct netif *)arg;
+  struct mdns_host* mdns = NETIF_TO_HOST(netif);
+
+  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 {
+#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)
+#endif
+      {
+        mdns->probes_sent++;
+      }
+    }
+    sys_timeout(MDNS_PROBE_DELAY_MS, mdns_probe, netif);
+  }
 }
 
 /**
  * @ingroup mdns
- * Activate MDNS responder for a network interface and send announce packets.
+ * Activate MDNS responder for a network interface.
  * @param netif The network interface to activate.
  * @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
@@ -1867,20 +2060,22 @@
 mdns_resp_add_netif(struct netif *netif, const char *hostname, u32_t dns_ttl)
 {
   err_t res;
-  struct mdns_host* mdns;
+  struct mdns_host *mdns;
 
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ERROR("mdns_resp_add_netif: netif != NULL", (netif != NULL), return ERR_VAL);
   LWIP_ERROR("mdns_resp_add_netif: Hostname too long", (strlen(hostname) <= MDNS_LABEL_MAXLEN), return ERR_VAL);
 
   LWIP_ASSERT("mdns_resp_add_netif: Double add", NETIF_TO_HOST(netif) == NULL);
-  mdns = (struct mdns_host *) mem_malloc(sizeof(struct mdns_host));
+  mdns = (struct mdns_host *) mem_calloc(1, sizeof(struct mdns_host));
   LWIP_ERROR("mdns_resp_add_netif: Alloc failed", (mdns != NULL), return ERR_MEM);
 
   netif_set_client_data(netif, mdns_netif_client_id, mdns);
 
-  memset(mdns, 0, sizeof(struct mdns_host));
   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;
 
   /* Join multicast groups */
 #if LWIP_IPV4
@@ -1896,7 +2091,8 @@
   }
 #endif
 
-  mdns_resp_netif_settings_changed(netif);
+  mdns_resp_restart(netif);
+
   return ERR_OK;
 
 cleanup:
@@ -1916,12 +2112,17 @@
 mdns_resp_remove_netif(struct netif *netif)
 {
   int i;
-  struct mdns_host* mdns;
+  struct mdns_host *mdns;
 
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("mdns_resp_remove_netif: Null pointer", netif);
   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);
+  }
+
   for (i = 0; i < MDNS_MAX_SERVICES; i++) {
     struct mdns_service *service = mdns->services[i];
     if (service) {
@@ -1944,6 +2145,36 @@
 
 /**
  * @ingroup mdns
+ * Update MDNS hostname for a network interface.
+ * @param netif The network interface to activate.
+ * @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.
+ * @return ERR_OK if name could be set on netif, an err_t otherwise
+ */
+err_t
+mdns_resp_rename_netif(struct netif *netif, const char *hostname)
+{
+  struct mdns_host *mdns;
+  size_t len;
+
+  LWIP_ASSERT_CORE_LOCKED();
+  len = strlen(hostname);
+  LWIP_ERROR("mdns_resp_rename_netif: netif != NULL", (netif != NULL), return ERR_VAL);
+  LWIP_ERROR("mdns_resp_rename_netif: Hostname too long", (len <= MDNS_LABEL_MAXLEN), return ERR_VAL);
+  mdns = NETIF_TO_HOST(netif);
+  LWIP_ERROR("mdns_resp_rename_netif: Not an mdns netif", (mdns != NULL), return ERR_VAL);
+
+  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);
+
+  return ERR_OK;
+}
+
+/**
+ * @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
@@ -1955,16 +2186,17 @@
  * @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 ERR_OK if the service was added to the netif, an err_t otherwise
+ * @return service_id if the service was added to the netif, an err_t otherwise
  */
-err_t
+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)
 {
-  int i;
-  int slot = -1;
+  s8_t i;
+  s8_t slot = -1;
   struct mdns_service *srv;
-  struct mdns_host* mdns;
+  struct mdns_host *mdns;
 
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("mdns_resp_add_service: netif != NULL", netif);
   mdns = NETIF_TO_HOST(netif);
   LWIP_ERROR("mdns_resp_add_service: Not an mdns netif", (mdns != NULL), return ERR_VAL);
@@ -1981,11 +2213,9 @@
   }
   LWIP_ERROR("mdns_resp_add_service: Service list full (increase MDNS_MAX_SERVICES)", (slot >= 0), return ERR_MEM);
 
-  srv = (struct mdns_service*)mem_malloc(sizeof(struct mdns_service));
+  srv = (struct mdns_service *)mem_calloc(1, sizeof(struct mdns_service));
   LWIP_ERROR("mdns_resp_add_service: Alloc failed", (srv != NULL), return ERR_MEM);
 
-  memset(srv, 0, sizeof(struct mdns_service));
-
   MEMCPY(&srv->name, name, LWIP_MIN(MDNS_LABEL_MAXLEN, strlen(name)));
   MEMCPY(&srv->service, service, LWIP_MIN(MDNS_LABEL_MAXLEN, strlen(service)));
   srv->txt_fn = txt_fn;
@@ -1996,13 +2226,65 @@
 
   mdns->services[slot] = srv;
 
-  /* Announce on IPv6 and IPv4 */
-#if LWIP_IPV6
-  mdns_announce(netif, IP6_ADDR_ANY);
-#endif
-#if LWIP_IPV4
-  mdns_announce(netif, IP4_ADDR_ANY);
-#endif
+  mdns_resp_restart(netif);
+
+  return slot;
+}
+
+/**
+ * @ingroup mdns
+ * Delete a service on the selected network interface.
+ * @param netif The network interface on which service should be removed
+ * @param slot The service slot number returned by mdns_resp_add_service
+ * @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)
+{
+  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", (mdns->services[slot] != NULL), return ERR_VAL);
+
+  srv = mdns->services[slot];
+  mdns->services[slot] = NULL;
+  mem_free(srv);
+  return ERR_OK;
+}
+
+/**
+ * @ingroup mdns
+ * Update name for an MDNS service.
+ * @param netif The network interface to activate.
+ * @param slot The service slot number returned by mdns_resp_add_service
+ * @param name The new name for the service
+ * @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)
+{
+  struct mdns_service *srv;
+  struct mdns_host *mdns;
+  size_t len;
+
+  LWIP_ASSERT_CORE_LOCKED();
+  len = strlen(name);
+  LWIP_ASSERT("mdns_resp_rename_service: netif != NULL", netif);
+  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", (mdns->services[slot] != NULL), return ERR_VAL);
+
+  srv = mdns->services[slot];
+
+  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);
 
   return ERR_OK;
 }
@@ -2019,10 +2301,107 @@
 err_t
 mdns_resp_add_service_txtitem(struct mdns_service *service, const char *txt, u8_t txt_len)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("mdns_resp_add_service_txtitem: service != NULL", service);
 
   /* Use a mdns_domain struct to store txt chunks since it is the same encoding */
   return mdns_domain_add_label(&service->txtdata, txt, txt_len);
 }
 
+/**
+ * @ingroup mdns
+ * Send unsolicited answer containing all our known data
+ * @param netif The network interface to send on
+ */
+void
+mdns_resp_announce(struct netif *netif)
+{
+  struct mdns_host* mdns;
+  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ERROR("mdns_resp_announce: netif != NULL", (netif != NULL), return);
+
+  mdns = NETIF_TO_HOST(netif);
+  if (mdns == NULL) {
+    return;
+  }
+
+  if (mdns->probing_state == MDNS_PROBING_COMPLETE) {
+    /* Announce on IPv6 and IPv4 */
+#if LWIP_IPV6
+    mdns_announce(netif, IP6_ADDR_ANY);
+#endif
+#if LWIP_IPV4
+    if (!ip4_addr_isany_val(*netif_ip4_addr(netif))) {
+      mdns_announce(netif, IP4_ADDR_ANY);
+    }
+#endif
+  } /* else: ip address changed while probing was ongoing? @todo reset counter to restart? */
+}
+
+/** Register a callback function that is called if probing is completed successfully
+ * or with a conflict. */
+void
+mdns_resp_register_name_result_cb(mdns_name_result_cb_t cb)
+{
+  mdns_name_result_cb = cb;
+}
+
+/**
+ * @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)
+{
+  struct mdns_host* mdns;
+  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ERROR("mdns_resp_restart: netif != NULL", (netif != NULL), return);
+
+  mdns = NETIF_TO_HOST(netif);
+  if (mdns == NULL) {
+    return;
+  }
+
+  if (mdns->probing_state == MDNS_PROBING_ONGOING) {
+    sys_untimeout(mdns_probe, 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);
+}
+
+/**
+ * @ingroup mdns
+ * Initiate MDNS responder. Will open UDP sockets on port 5353
+ */
+void
+mdns_resp_init(void)
+{
+  err_t res;
+
+  /* LWIP_ASSERT_CORE_LOCKED(); is checked by udp_new() */
+
+  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);
+#else
+  mdns_pcb->ttl = MDNS_TTL;
+#endif
+  res = udp_bind(mdns_pcb, IP_ANY_TYPE, LWIP_IANA_PORT_MDNS);
+  LWIP_UNUSED_ARG(res); /* in case of LWIP_NOASSERT */
+  LWIP_ASSERT("Failed to bind pcb", res == ERR_OK);
+  udp_recv(mdns_pcb, mdns_recv, NULL);
+
+  mdns_netif_client_id = netif_alloc_client_data_id();
+
+#if MDNS_RESP_USENETIF_EXTCALLBACK
+  /* register for netif events when started on first netif */
+  netif_add_ext_callback(&netif_callback, mdns_netif_ext_status_callback);
+#endif
+}
+
 #endif /* LWIP_MDNS_RESPONDER */
diff --git a/src/apps/mqtt/mqtt.c b/src/apps/mqtt/mqtt.c
index 899e2cb..269f4a4 100644
--- a/src/apps/mqtt/mqtt.c
+++ b/src/apps/mqtt/mqtt.c
@@ -48,12 +48,15 @@
  *
  */
 #include "lwip/apps/mqtt.h"
+#include "lwip/apps/mqtt_priv.h"
 #include "lwip/timeouts.h"
 #include "lwip/ip_addr.h"
 #include "lwip/mem.h"
 #include "lwip/err.h"
 #include "lwip/pbuf.h"
-#include "lwip/tcp.h"
+#include "lwip/altcp.h"
+#include "lwip/altcp_tcp.h"
+#include "lwip/altcp_tls.h"
 #include <string.h>
 
 #if LWIP_TCP && LWIP_CALLBACK_API
@@ -71,7 +74,7 @@
 #define MQTT_DEBUG_WARN_STATE   (MQTT_DEBUG | LWIP_DBG_LEVEL_WARNING | LWIP_DBG_STATE)
 #define MQTT_DEBUG_SERIOUS      (MQTT_DEBUG | LWIP_DBG_LEVEL_SERIOUS)
 
-static void mqtt_cyclic_timer(void *arg);
+
 
 /**
  * MQTT client connection states
@@ -119,9 +122,10 @@
 };
 
 
+static void mqtt_cyclic_timer(void *arg);
+
 #if defined(LWIP_DEBUG)
-static const char * const mqtt_message_type_str[15] =
-{
+static const char *const mqtt_message_type_str[15] = {
   "UNDEFINED",
   "CONNECT",
   "CONNACK",
@@ -142,7 +146,7 @@
 /**
  * Message type value to string
  * @param msg_type see enum mqtt_message_type
- * 
+ *
  * @return Control message type text string
  */
 static const char *
@@ -175,26 +179,51 @@
 /*--------------------------------------------------------------------------------------------------------------------- */
 /* Output ring buffer */
 
-
-#define MQTT_RINGBUF_IDX_MASK ((MQTT_OUTPUT_RINGBUF_SIZE) - 1)
-
 /** Add single item to ring buffer */
-#define mqtt_ringbuf_put(rb, item) ((rb)->buf)[(rb)->put++ & MQTT_RINGBUF_IDX_MASK] = (item)
+static void
+mqtt_ringbuf_put(struct mqtt_ringbuf_t *rb, u8_t item)
+{
+  rb->buf[rb->put] = item;
+  rb->put++;
+  if (rb->put >= MQTT_OUTPUT_RINGBUF_SIZE) {
+    rb->put = 0;
+  }
+}
+
+/** Return pointer to ring buffer get position */
+static u8_t *
+mqtt_ringbuf_get_ptr(struct mqtt_ringbuf_t *rb)
+{
+  return &rb->buf[rb->get];
+}
+
+static void
+mqtt_ringbuf_advance_get_idx(struct mqtt_ringbuf_t *rb, u16_t len)
+{
+  LWIP_ASSERT("mqtt_ringbuf_advance_get_idx: len < MQTT_OUTPUT_RINGBUF_SIZE", len < MQTT_OUTPUT_RINGBUF_SIZE);
+
+  rb->get += len;
+  if (rb->get >= MQTT_OUTPUT_RINGBUF_SIZE) {
+    rb->get = rb->get - MQTT_OUTPUT_RINGBUF_SIZE;
+  }
+}
 
 /** Return number of bytes in ring buffer */
-#define mqtt_ringbuf_len(rb) ((u16_t)((rb)->put - (rb)->get))
+static u16_t
+mqtt_ringbuf_len(struct mqtt_ringbuf_t *rb)
+{
+  u32_t len = rb->put - rb->get;
+  if (len > 0xFFFF) {
+    len += MQTT_OUTPUT_RINGBUF_SIZE;
+  }
+  return (u16_t)len;
+}
 
 /** Return number of bytes free in ring buffer */
 #define mqtt_ringbuf_free(rb) (MQTT_OUTPUT_RINGBUF_SIZE - mqtt_ringbuf_len(rb))
 
 /** Return number of bytes possible to read without wrapping around */
-#define mqtt_ringbuf_linear_read_length(rb) LWIP_MIN(mqtt_ringbuf_len(rb), (MQTT_OUTPUT_RINGBUF_SIZE - ((rb)->get & MQTT_RINGBUF_IDX_MASK)))
-
-/** Return pointer to ring buffer get position */
-#define mqtt_ringbuf_get_ptr(rb) (&(rb)->buf[(rb)->get & MQTT_RINGBUF_IDX_MASK])
-
-#define mqtt_ringbuf_advance_get_idx(rb, len) ((rb)->get += (len))
-
+#define mqtt_ringbuf_linear_read_length(rb) LWIP_MIN(mqtt_ringbuf_len(rb), (MQTT_OUTPUT_RINGBUF_SIZE - (rb)->get))
 
 /**
  * Try send as many bytes as possible from output ring buffer
@@ -202,20 +231,20 @@
  * @param tpcb TCP connection handle
  */
 static void
-mqtt_output_send(struct mqtt_ringbuf_t *rb, struct tcp_pcb *tpcb)
+mqtt_output_send(struct mqtt_ringbuf_t *rb, struct altcp_pcb *tpcb)
 {
   err_t err;
   u8_t wrap = 0;
   u16_t ringbuf_lin_len = mqtt_ringbuf_linear_read_length(rb);
-  u16_t send_len = tcp_sndbuf(tpcb);
+  u16_t send_len = altcp_sndbuf(tpcb);
   LWIP_ASSERT("mqtt_output_send: tpcb != NULL", tpcb != NULL);
 
   if (send_len == 0 || ringbuf_lin_len == 0) {
     return;
   }
 
-  LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_output_send: tcp_sndbuf: %d bytes, ringbuf_linear_available: %d, get %d, put %d\n",
-                                send_len, ringbuf_lin_len, ((rb)->get & MQTT_RINGBUF_IDX_MASK), ((rb)->put & MQTT_RINGBUF_IDX_MASK)));
+  LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_output_send: tcp_sndbuf: %d bytes, ringbuf_linear_available: %d, get %d, put %d\n",
+                                 send_len, ringbuf_lin_len, rb->get, rb->put));
 
   if (send_len > ringbuf_lin_len) {
     /* Space in TCP output buffer is larger than available in ring buffer linear portion */
@@ -223,18 +252,18 @@
     /* Wrap around if more data in ring buffer after linear portion */
     wrap = (mqtt_ringbuf_len(rb) > ringbuf_lin_len);
   }
-  err = tcp_write(tpcb, mqtt_ringbuf_get_ptr(rb), send_len, TCP_WRITE_FLAG_COPY | (wrap ? TCP_WRITE_FLAG_MORE : 0));
+  err = altcp_write(tpcb, mqtt_ringbuf_get_ptr(rb), send_len, TCP_WRITE_FLAG_COPY | (wrap ? TCP_WRITE_FLAG_MORE : 0));
   if ((err == ERR_OK) && wrap) {
     mqtt_ringbuf_advance_get_idx(rb, send_len);
     /* Use the lesser one of ring buffer linear length and TCP send buffer size */
-    send_len = LWIP_MIN(tcp_sndbuf(tpcb), mqtt_ringbuf_linear_read_length(rb));
-    err = tcp_write(tpcb, mqtt_ringbuf_get_ptr(rb), send_len, TCP_WRITE_FLAG_COPY);
+    send_len = LWIP_MIN(altcp_sndbuf(tpcb), mqtt_ringbuf_linear_read_length(rb));
+    err = altcp_write(tpcb, mqtt_ringbuf_get_ptr(rb), send_len, TCP_WRITE_FLAG_COPY);
   }
 
   if (err == ERR_OK) {
     mqtt_ringbuf_advance_get_idx(rb, send_len);
     /* Flush */
-    tcp_output(tpcb);
+    altcp_output(tpcb);
   } else {
     LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_output_send: Send failed with err %d (\"%s\")\n", err, lwip_strerr(err)));
   }
@@ -248,18 +277,19 @@
 /**
  * Create request item
  * @param r_objs Pointer to request objects
+ * @param r_objs_len Number of array entries
  * @param pkt_id Packet identifier of request
  * @param cb Packet callback to call when requests lifetime ends
  * @param arg Parameter following callback
  * @return Request or NULL if failed to create
  */
 static struct mqtt_request_t *
-mqtt_create_request(struct mqtt_request_t *r_objs, u16_t pkt_id, mqtt_request_cb_t cb, void *arg)
+mqtt_create_request(struct mqtt_request_t *r_objs, size_t r_objs_len, u16_t pkt_id, mqtt_request_cb_t cb, void *arg)
 {
   struct mqtt_request_t *r = NULL;
   u8_t n;
   LWIP_ASSERT("mqtt_create_request: r_objs != NULL", r_objs != NULL);
-  for (n = 0; n < MQTT_REQ_MAX_IN_FLIGHT; n++) {
+  for (n = 0; n < r_objs_len; n++) {
     /* Item point to itself if not in use */
     if (r_objs[n].next == &r_objs[n]) {
       r = &r_objs[n];
@@ -339,7 +369,7 @@
   if (iter != NULL) {
     /* unchain */
     if (prev == NULL) {
-      *tail= iter->next;
+      *tail = iter->next;
     } else {
       prev->next = iter->next;
     }
@@ -374,7 +404,7 @@
       }
       mqtt_delete_request(r);
       /* Tail might be be modified in callback, so re-read it in every iteration */
-      r = *(struct mqtt_request_t * const volatile *)tail;
+      r = *(struct mqtt_request_t *const volatile *)tail;
     } else {
       r->timeout_diff -= t;
       t = 0;
@@ -400,13 +430,14 @@
 /**
  * Initialize all request items
  * @param r_objs Pointer to request objects
+ * @param r_objs_len Number of array entries
  */
 static void
-mqtt_init_requests(struct mqtt_request_t *r_objs)
+mqtt_init_requests(struct mqtt_request_t *r_objs, size_t r_objs_len)
 {
   u8_t n;
   LWIP_ASSERT("mqtt_init_requests: r_objs != NULL", r_objs != NULL);
-  for (n = 0; n < MQTT_REQ_MAX_IN_FLIGHT; n++) {
+  for (n = 0; n < r_objs_len; n++) {
     /* Item pointing to itself indicates unused */
     r_objs[n].next = &r_objs[n];
   }
@@ -453,18 +484,18 @@
  * Append fixed header
  * @param rb Output ring buffer
  * @param msg_type see enum mqtt_message_type
- * @param dup MQTT DUP flag
- * @param qos MQTT QoS field
- * @param retain MQTT retain flag
+ * @param fdup MQTT DUP flag
+ * @param fqos MQTT QoS field
+ * @param fretain MQTT retain flag
  * @param r_length Remaining length after fixed header
  */
 
 static void
-mqtt_output_append_fixed_header(struct mqtt_ringbuf_t *rb, u8_t msg_type, u8_t dup,
-                 u8_t qos, u8_t retain, u16_t r_length)
+mqtt_output_append_fixed_header(struct mqtt_ringbuf_t *rb, u8_t msg_type, u8_t fdup,
+                                u8_t fqos, u8_t fretain, u16_t r_length)
 {
   /* Start with control byte */
-  mqtt_output_append_u8(rb, (((msg_type & 0x0f) << 4) | ((dup & 1) << 3) | ((qos & 3) << 1) | (retain & 1)));
+  mqtt_output_append_u8(rb, (((msg_type & 0x0f) << 4) | ((fdup & 1) << 3) | ((fqos & 3) << 1) | (fretain & 1)));
   /* Encode remaining length field */
   do {
     mqtt_output_append_u8(rb, (r_length & 0x7f) | (r_length >= 128 ? 0x80 : 0));
@@ -487,7 +518,7 @@
 
   LWIP_ASSERT("mqtt_output_check_space: rb != NULL", rb != NULL);
 
- /* Calculate number of required bytes to contain the remaining bytes field and add to total*/
+  /* Calculate number of required bytes to contain the remaining bytes field and add to total*/
   do {
     total_len++;
     r_length >>= 7;
@@ -510,13 +541,13 @@
   /* Bring down TCP connection if not already done */
   if (client->conn != NULL) {
     err_t res;
-    tcp_recv(client->conn, NULL);
-    tcp_err(client->conn,  NULL);
-    tcp_sent(client->conn, NULL);
-    res = tcp_close(client->conn);
+    altcp_recv(client->conn, NULL);
+    altcp_err(client->conn,  NULL);
+    altcp_sent(client->conn, NULL);
+    res = altcp_close(client->conn);
     if (res != ERR_OK) {
-      tcp_abort(client->conn);
-      LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_close: Close err=%s\n", lwip_strerr(res)));
+      altcp_abort(client->conn);
+      LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_close: Close err=%s\n", lwip_strerr(res)));
     }
     client->conn = NULL;
   }
@@ -551,7 +582,7 @@
   if (client->conn_state == MQTT_CONNECTING) {
     client->cyclic_tick++;
     if ((client->cyclic_tick * MQTT_CYCLIC_TIMER_INTERVAL) >= MQTT_CONNECT_TIMOUT) {
-      LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_cyclic_timer: CONNECT attempt to server timed out\n"));
+      LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_cyclic_timer: CONNECT attempt to server timed out\n"));
       /* Disconnect TCP */
       mqtt_close(client, MQTT_CONNECT_TIMEOUT);
       restart_timer = 0;
@@ -565,15 +596,15 @@
 
       client->server_watchdog++;
       /* If reception from server has been idle for 1.5*keep_alive time, server is considered unresponsive */
-      if ((client->server_watchdog * MQTT_CYCLIC_TIMER_INTERVAL) > (client->keep_alive + client->keep_alive/2)) {
-        LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_cyclic_timer: Server incoming keep-alive timeout\n"));
+      if ((client->server_watchdog * MQTT_CYCLIC_TIMER_INTERVAL) > (client->keep_alive + client->keep_alive / 2)) {
+        LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_cyclic_timer: Server incoming keep-alive timeout\n"));
         mqtt_close(client, MQTT_CONNECT_TIMEOUT);
         restart_timer = 0;
       }
 
       /* If time for a keep alive message to be sent, transmission has been idle for keep_alive time */
       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"));
+        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;
@@ -583,11 +614,11 @@
       }
     }
   } else {
-    LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_cyclic_timer: Timer should not be running in state %d\n", client->conn_state));
+    LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_cyclic_timer: Timer should not be running in state %d\n", client->conn_state));
     restart_timer = 0;
   }
   if (restart_timer) {
-    sys_timeout(MQTT_CYCLIC_TIMER_INTERVAL*1000, mqtt_cyclic_timer, arg);
+    sys_timeout(MQTT_CYCLIC_TIMER_INTERVAL * 1000, mqtt_cyclic_timer, arg);
   }
 }
 
@@ -609,8 +640,8 @@
     mqtt_output_append_u16(&client->output, pkt_id);
     mqtt_output_send(&client->output, client->conn);
   } else {
-    LWIP_DEBUGF(MQTT_DEBUG_TRACE,("pub_ack_rec_rel_response: OOM creating response: %s with pkt_id: %d\n",
-                                  mqtt_msg_type_to_str(msg), pkt_id));
+    LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("pub_ack_rec_rel_response: OOM creating response: %s with pkt_id: %d\n",
+                                   mqtt_msg_type_to_str(msg), pkt_id));
     err = ERR_MEM;
   }
   return err;
@@ -638,21 +669,31 @@
  * @param remaining_length Remaining length of complete message
  */
 static mqtt_connection_status_t
-  mqtt_message_received(mqtt_client_t *client, u8_t fixed_hdr_idx, u16_t length, u32_t remaining_length)
+mqtt_message_received(mqtt_client_t *client, u8_t fixed_hdr_idx, u16_t length, u32_t remaining_length)
 {
   mqtt_connection_status_t res = MQTT_CONNECT_ACCEPTED;
 
   u8_t *var_hdr_payload = client->rx_buffer + fixed_hdr_idx;
+  size_t var_hdr_payload_bufsize = sizeof(client->rx_buffer) - fixed_hdr_idx;
 
   /* Control packet type */
   u8_t pkt_type = MQTT_CTL_PACKET_TYPE(client->rx_buffer[0]);
   u16_t pkt_id = 0;
 
+  LWIP_ASSERT("client->msg_idx < MQTT_VAR_HEADER_BUFFER_LEN", client->msg_idx < MQTT_VAR_HEADER_BUFFER_LEN);
+  LWIP_ASSERT("fixed_hdr_idx <= client->msg_idx", fixed_hdr_idx <= client->msg_idx);
+  LWIP_ERROR("buffer length mismatch", fixed_hdr_idx + length <= MQTT_VAR_HEADER_BUFFER_LEN,
+             return MQTT_CONNECT_DISCONNECTED);
+
   if (pkt_type == MQTT_MSG_TYPE_CONNACK) {
     if (client->conn_state == MQTT_CONNECTING) {
+      if (length < 2) {
+        LWIP_DEBUGF(MQTT_DEBUG_WARN,( "mqtt_message_received: Received short CONNACK message\n"));
+        goto out_disconnect;
+      }
       /* Get result code from CONNACK */
       res = (mqtt_connection_status_t)var_hdr_payload[1];
-      LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_message_received: Connect response code %d\n", res));
+      LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_message_received: Connect response code %d\n", res));
       if (res == MQTT_CONNECT_ACCEPTED) {
         /* Reset cyclic_tick when changing to connected state */
         client->cyclic_tick = 0;
@@ -663,10 +704,10 @@
         }
       }
     } else {
-      LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_message_received: Received CONNACK in connected state\n"));
+      LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_message_received: Received CONNACK in connected state\n"));
     }
   } else if (pkt_type == MQTT_MSG_TYPE_PINGRESP) {
-    LWIP_DEBUGF(MQTT_DEBUG_TRACE,( "mqtt_message_received: Received PINGRESP from server\n"));
+    LWIP_DEBUGF(MQTT_DEBUG_TRACE, ( "mqtt_message_received: Received PINGRESP from server\n"));
 
   } else if (pkt_type == MQTT_MSG_TYPE_PUBLISH) {
     u16_t payload_offset = 0;
@@ -675,22 +716,37 @@
 
     if (client->msg_idx <= MQTT_VAR_HEADER_BUFFER_LEN) {
       /* Should have topic and pkt id*/
-      uint8_t *topic;
-      uint16_t after_topic;
+      u8_t *topic;
+      u16_t after_topic;
       u8_t bkp;
-      u16_t topic_len = var_hdr_payload[0];
+      u16_t topic_len;
+      u16_t qos_len = (qos ? 2U : 0U);
+      if (length < 2 + qos_len) {
+        LWIP_DEBUGF(MQTT_DEBUG_WARN,( "mqtt_message_received: Received short PUBLISH packet\n"));
+        goto out_disconnect;
+      }
+      topic_len = var_hdr_payload[0];
       topic_len = (topic_len << 8) + (u16_t)(var_hdr_payload[1]);
+      if ((topic_len > length - (2 + qos_len)) ||
+          (topic_len > var_hdr_payload_bufsize - (2 + qos_len))) {
+        LWIP_DEBUGF(MQTT_DEBUG_WARN,( "mqtt_message_received: Received short PUBLISH packet (topic)\n"));
+        goto out_disconnect;
+      }
 
       topic = var_hdr_payload + 2;
       after_topic = 2 + topic_len;
-      /* Check length, add one byte even for QoS 0 so that zero termination will fit */
-      if ((after_topic + (qos? 2 : 1)) > length) {
-        LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_message_received: Receive buffer can not fit topic + pkt_id\n"));
+      /* Check buffer length, add one byte even for QoS 0 so that zero termination will fit */
+      if ((after_topic + (qos ? 2U : 1U)) > var_hdr_payload_bufsize) {
+        LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_message_received: Receive buffer can not fit topic + pkt_id\n"));
         goto out_disconnect;
       }
 
       /* id for QoS 1 and 2 */
       if (qos > 0) {
+        if (length < after_topic + 2U) {
+          LWIP_DEBUGF(MQTT_DEBUG_WARN,( "mqtt_message_received: Received short PUBLISH packet (after_topic)\n"));
+          goto out_disconnect;
+        }
         client->inpub_pkt_id = ((u16_t)var_hdr_payload[after_topic] << 8) + (u16_t)var_hdr_payload[after_topic + 1];
         after_topic += 2;
       } else {
@@ -704,8 +760,8 @@
       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 %d\n",
-                                    qos, topic, remaining_length + payload_length));
+      LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_incomming_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);
       }
@@ -713,13 +769,17 @@
       topic[topic_len] = bkp;
     }
     if (payload_length > 0 || remaining_length == 0) {
+      if (length < (size_t)(payload_offset + payload_length)) {
+        LWIP_DEBUGF(MQTT_DEBUG_WARN,( "mqtt_message_received: Received short packet (payload)\n"));
+        goto out_disconnect;
+      }
       client->data_cb(client->inpub_arg, var_hdr_payload + payload_offset, payload_length, remaining_length == 0 ? MQTT_DATA_FLAG_LAST : 0);
       /* Reply if QoS > 0 */
       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",
-                                      mqtt_msg_type_to_str(resp_msg), client->inpub_pkt_id));
+        LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_incomming_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);
       }
     }
@@ -728,25 +788,25 @@
     pkt_id = (u16_t)var_hdr_payload[0] << 8;
     pkt_id |= (u16_t)var_hdr_payload[1];
     if (pkt_id == 0) {
-      LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_message_received: Got message with illegal packet identifier: 0\n"));
+      LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_message_received: Got message with illegal packet identifier: 0\n"));
       goto out_disconnect;
     }
     if (pkt_type == MQTT_MSG_TYPE_PUBREC) {
-      LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_message_received: PUBREC, sending PUBREL with pkt_id: %d\n",pkt_id));
+      LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_message_received: PUBREC, sending PUBREL with pkt_id: %d\n", pkt_id));
       pub_ack_rec_rel_response(client, MQTT_MSG_TYPE_PUBREL, pkt_id, 1);
 
     } else if (pkt_type == MQTT_MSG_TYPE_PUBREL) {
-      LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_message_received: PUBREL, sending PUBCOMP response with pkt_id: %d\n",pkt_id));
+      LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_message_received: PUBREL, sending PUBCOMP response with pkt_id: %d\n", pkt_id));
       pub_ack_rec_rel_response(client, MQTT_MSG_TYPE_PUBCOMP, pkt_id, 0);
 
     } else if (pkt_type == MQTT_MSG_TYPE_SUBACK || pkt_type == MQTT_MSG_TYPE_UNSUBACK ||
-              pkt_type == MQTT_MSG_TYPE_PUBCOMP || pkt_type == MQTT_MSG_TYPE_PUBACK) {
+               pkt_type == MQTT_MSG_TYPE_PUBCOMP || pkt_type == MQTT_MSG_TYPE_PUBACK) {
       struct mqtt_request_t *r = mqtt_take_request(&client->pend_req_queue, pkt_id);
       if (r != NULL) {
-        LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_message_received: %s response with id %d\n", mqtt_msg_type_to_str(pkt_type), pkt_id));
+        LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_message_received: %s response with id %d\n", mqtt_msg_type_to_str(pkt_type), pkt_id));
         if (pkt_type == MQTT_MSG_TYPE_SUBACK) {
           if (length < 3) {
-            LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_message_received: To small SUBACK packet\n"));
+            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]);
@@ -756,10 +816,10 @@
         }
         mqtt_delete_request(r);
       } else {
-        LWIP_DEBUGF(MQTT_DEBUG_WARN,( "mqtt_message_received: Received %s reply, with wrong pkt_id: %d\n", mqtt_msg_type_to_str(pkt_type), pkt_id));
+        LWIP_DEBUGF(MQTT_DEBUG_WARN, ( "mqtt_message_received: Received %s reply, with wrong pkt_id: %d\n", mqtt_msg_type_to_str(pkt_type), pkt_id));
       }
     } else {
-      LWIP_DEBUGF(MQTT_DEBUG_WARN,( "mqtt_message_received: Received unknown message type: %d\n", pkt_type));
+      LWIP_DEBUGF(MQTT_DEBUG_WARN, ( "mqtt_message_received: Received unknown message type: %d\n", pkt_type));
       goto out_disconnect;
     }
   }
@@ -784,32 +844,44 @@
   u8_t b = 0;
 
   while (p->tot_len > in_offset) {
+    /* We ALWAYS parse the header here first. Even if the header was not
+       included in this segment, we re-parse it here by buffering it in
+       client->rx_buffer. client->msg_idx keeps track of this. */
     if ((fixed_hdr_idx < 2) || ((b & 0x80) != 0)) {
 
       if (fixed_hdr_idx < client->msg_idx) {
+        /* parse header from old pbuf (buffered in client->rx_buffer) */
         b = client->rx_buffer[fixed_hdr_idx];
       } else {
+        /* parse header from this pbuf and save it in client->rx_buffer in case
+           it comes in segmented */
         b = pbuf_get_at(p, in_offset++);
         client->rx_buffer[client->msg_idx++] = b;
       }
       fixed_hdr_idx++;
 
       if (fixed_hdr_idx >= 2) {
+        /* fixed header contains at least 2 bytes but can contain more, depending on
+           'remaining length'. All bytes but the last of this have 0x80 set to
+           indicate more bytes are coming. */
         msg_rem_len |= (u32_t)(b & 0x7f) << ((fixed_hdr_idx - 2) * 7);
         if ((b & 0x80) == 0) {
-          LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_parse_incoming: Remaining length after fixed header: %d\n", msg_rem_len));
+          /* fixed header is done */
+          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_idx, 0, 0);
             client->msg_idx = 0;
             fixed_hdr_idx = 0;
           } else {
-            /* Bytes remaining in message */
+            /* Bytes remaining in message (changes remaining length if this is
+               not the first segment of this message) */
             msg_rem_len = (msg_rem_len + fixed_hdr_idx) - client->msg_idx;
           }
         }
       }
     } else {
+      /* Fixed header has been parsed, parse variable header */
       u16_t cpy_len, cpy_start, buffer_space;
 
       cpy_start = (client->msg_idx - fixed_hdr_idx) % (MQTT_VAR_HEADER_BUFFER_LEN - fixed_hdr_idx) + fixed_hdr_idx;
@@ -822,15 +894,15 @@
       if (cpy_len > buffer_space) {
         cpy_len = buffer_space;
       }
-      pbuf_copy_partial(p, client->rx_buffer+cpy_start, cpy_len, in_offset);
+      pbuf_copy_partial(p, client->rx_buffer + cpy_start, cpy_len, in_offset);
 
       /* Advance get and put indexes  */
       client->msg_idx += cpy_len;
       in_offset += cpy_len;
       msg_rem_len -= cpy_len;
 
-      LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_parse_incoming: msg_idx: %d, cpy_len: %d, remaining %d\n", client->msg_idx, cpy_len, msg_rem_len));
-      if (msg_rem_len == 0 || cpy_len == buffer_space) {
+      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_idx, (cpy_start + cpy_len) - fixed_hdr_idx, msg_rem_len);
         if (res != MQTT_CONNECT_ACCEPTED) {
@@ -857,25 +929,25 @@
  * @return ERR_OK or err passed into callback
  */
 static err_t
-mqtt_tcp_recv_cb(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
+mqtt_tcp_recv_cb(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err)
 {
   mqtt_client_t *client = (mqtt_client_t *)arg;
   LWIP_ASSERT("mqtt_tcp_recv_cb: client != NULL", client != NULL);
   LWIP_ASSERT("mqtt_tcp_recv_cb: client->conn == pcb", client->conn == pcb);
 
   if (p == NULL) {
-    LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_tcp_recv_cb: Recv pbuf=NULL, remote has closed connection\n"));
+    LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_tcp_recv_cb: Recv pbuf=NULL, remote has closed connection\n"));
     mqtt_close(client, MQTT_CONNECT_DISCONNECTED);
   } else {
     mqtt_connection_status_t res;
     if (err != ERR_OK) {
-      LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_tcp_recv_cb: Recv err=%d\n", err));
+      LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_tcp_recv_cb: Recv err=%d\n", err));
       pbuf_free(p);
       return err;
     }
 
     /* Tell remote that data has been received */
-    tcp_recved(pcb, p->tot_len);
+    altcp_recved(pcb, p->tot_len);
     res = mqtt_parse_incoming(client, p);
     pbuf_free(p);
 
@@ -901,7 +973,7 @@
  * @return ERR_OK
  */
 static err_t
-mqtt_tcp_sent_cb(void *arg, struct tcp_pcb *tpcb, u16_t len)
+mqtt_tcp_sent_cb(void *arg, struct altcp_pcb *tpcb, u16_t len)
 {
   mqtt_client_t *client = (mqtt_client_t *)arg;
 
@@ -916,7 +988,7 @@
     client->server_watchdog = 0;
     /* QoS 0 publish has no response from server, so call its callbacks here */
     while ((r = mqtt_take_request(&client->pend_req_queue, 0)) != NULL) {
-      LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_tcp_sent_cb: Calling QoS 0 publish complete callback\n"));
+      LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_tcp_sent_cb: Calling QoS 0 publish complete callback\n"));
       if (r->cb != NULL) {
         r->cb(r->arg, ERR_OK);
       }
@@ -938,7 +1010,7 @@
 {
   mqtt_client_t *client = (mqtt_client_t *)arg;
   LWIP_UNUSED_ARG(err); /* only used for debug output */
-  LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_tcp_err_cb: TCP error callback: error %d, arg: %p\n", err, arg));
+  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;
@@ -952,7 +1024,7 @@
  * @return err ERR_OK
  */
 static err_t
-mqtt_tcp_poll_cb(void *arg, struct tcp_pcb *tpcb)
+mqtt_tcp_poll_cb(void *arg, struct altcp_pcb *tpcb)
 {
   mqtt_client_t *client = (mqtt_client_t *)arg;
   if (client->conn_state == MQTT_CONNECTED) {
@@ -969,12 +1041,12 @@
  * @return ERR_OK
  */
 static err_t
-mqtt_tcp_connect_cb(void *arg, struct tcp_pcb *tpcb, err_t err)
+mqtt_tcp_connect_cb(void *arg, struct altcp_pcb *tpcb, err_t err)
 {
-  mqtt_client_t* client = (mqtt_client_t *)arg;
+  mqtt_client_t *client = (mqtt_client_t *)arg;
 
   if (err != ERR_OK) {
-    LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_tcp_connect_cb: TCP connect error %d\n", err));
+    LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_tcp_connect_cb: TCP connect error %d\n", err));
     return err;
   }
 
@@ -982,16 +1054,16 @@
   client->msg_idx = 0;
 
   /* Setup TCP callbacks */
-  tcp_recv(tpcb, mqtt_tcp_recv_cb);
-  tcp_sent(tpcb, mqtt_tcp_sent_cb);
-  tcp_poll(tpcb, mqtt_tcp_poll_cb, 2);
+  altcp_recv(tpcb, mqtt_tcp_recv_cb);
+  altcp_sent(tpcb, mqtt_tcp_sent_cb);
+  altcp_poll(tpcb, mqtt_tcp_poll_cb, 2);
 
-  LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_tcp_connect_cb: TCP connection established to server\n"));
+  LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_tcp_connect_cb: TCP connection established to server\n"));
   /* Enter MQTT connect state */
   client->conn_state = MQTT_CONNECTING;
 
   /* Start cyclic timer */
-  sys_timeout(MQTT_CYCLIC_TIMER_INTERVAL*1000, mqtt_cyclic_timer, client);
+  sys_timeout(MQTT_CYCLIC_TIMER_INTERVAL * 1000, mqtt_cyclic_timer, client);
   client->cyclic_tick = 0;
 
   /* Start transmission from output queue, connect message is the first one out*/
@@ -1012,7 +1084,7 @@
  * @param client MQTT client
  * @param topic Publish topic string
  * @param payload Data to publish (NULL is allowed)
- * @param payload_length: Length of payload (0 is allowed)
+ * @param payload_length Length of payload (0 is allowed)
  * @param qos Quality of service, 0 1 or 2
  * @param retain MQTT retain flag
  * @param cb Callback to call when publish is complete or has timed out
@@ -1032,6 +1104,7 @@
   u16_t topic_len;
   u16_t remaining_length;
 
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("mqtt_publish: client != NULL", client);
   LWIP_ASSERT("mqtt_publish: topic != NULL", topic);
   LWIP_ERROR("mqtt_publish: TCP disconnected", (client->conn_state != TCP_DISCONNECTED), return ERR_CONN);
@@ -1040,21 +1113,21 @@
   LWIP_ERROR("mqtt_publish: topic length overflow", (topic_strlen <= (0xFFFF - 2)), return ERR_ARG);
   topic_len = (u16_t)topic_strlen;
   total_len = 2 + topic_len + payload_length;
-  LWIP_ERROR("mqtt_publish: total length overflow", (total_len <= 0xFFFF), return ERR_ARG);
-  remaining_length = (u16_t)total_len;
-
-  LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_publish: Publish with payload length %d to topic \"%s\"\n", payload_length, topic));
 
   if (qos > 0) {
-    remaining_length += 2;
+    total_len += 2;
     /* Generate pkt_id id for QoS1 and 2 */
     pkt_id = msg_generate_packet_id(client);
   } else {
     /* Use reserved value pkt_id 0 for QoS 0 in request handle */
     pkt_id = 0;
   }
+  LWIP_ERROR("mqtt_publish: total length overflow", (total_len <= 0xFFFF), return ERR_ARG);
+  remaining_length = (u16_t)total_len;
 
-  r = mqtt_create_request(client->req_list, pkt_id, cb, arg);
+  LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_publish: Publish with payload length %d to topic \"%s\"\n", payload_length, topic));
+
+  r = mqtt_create_request(client->req_list, LWIP_ARRAYSIZE(client->req_list), pkt_id, cb, arg);
   if (r == NULL) {
     return ERR_MEM;
   }
@@ -1106,6 +1179,7 @@
   u16_t pkt_id;
   struct mqtt_request_t *r;
 
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("mqtt_sub_unsub: client != NULL", client);
   LWIP_ASSERT("mqtt_sub_unsub: topic != NULL", topic);
 
@@ -1119,12 +1193,12 @@
 
   LWIP_ASSERT("mqtt_sub_unsub: qos < 3", qos < 3);
   if (client->conn_state == TCP_DISCONNECTED) {
-    LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_sub_unsub: Can not (un)subscribe in disconnected state\n"));
+    LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_sub_unsub: Can not (un)subscribe in disconnected state\n"));
     return ERR_CONN;
   }
 
   pkt_id = msg_generate_packet_id(client);
-  r = mqtt_create_request(client->req_list, pkt_id, cb, arg);
+  r = mqtt_create_request(client->req_list, LWIP_ARRAYSIZE(client->req_list), pkt_id, cb, arg);
   if (r == NULL) {
     return ERR_MEM;
   }
@@ -1134,7 +1208,7 @@
     return ERR_MEM;
   }
 
-  LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_sub_unsub: Client (un)subscribe to topic \"%s\", id: %d\n", topic, pkt_id));
+  LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_sub_unsub: Client (un)subscribe to topic \"%s\", id: %d\n", topic, pkt_id));
 
   mqtt_output_append_fixed_header(&client->output, sub ? MQTT_MSG_TYPE_SUBSCRIBE : MQTT_MSG_TYPE_UNSUBSCRIBE, 0, 1, 0, remaining_length);
   /* Packet id */
@@ -1162,8 +1236,9 @@
  */
 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)
+                        mqtt_incoming_data_cb_t data_cb, void *arg)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("mqtt_set_inpub_callback: client != NULL", client != NULL);
   client->data_cb = data_cb;
   client->pub_cb = pub_cb;
@@ -1178,13 +1253,20 @@
 mqtt_client_t *
 mqtt_client_new(void)
 {
-  mqtt_client_t *client = (mqtt_client_t *)mem_malloc(sizeof(mqtt_client_t));
-  if (client != NULL) {
-    memset(client, 0, sizeof(mqtt_client_t));
-  }
-  return client;
+  LWIP_ASSERT_CORE_LOCKED();
+  return (mqtt_client_t *)mem_calloc(1, sizeof(mqtt_client_t));
 }
 
+/**
+ * @ingroup mqtt
+ * Free MQTT client instance
+ * @param client Pointer to instance to be freed
+ */
+void
+mqtt_client_free(mqtt_client_t *client)
+{
+  mem_free(client);
+}
 
 /**
  * @ingroup mqtt
@@ -1207,14 +1289,16 @@
   /* Length is the sum of 2+"MQTT", protocol level, flags and keep alive */
   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;
 
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("mqtt_client_connect: client != NULL", client != NULL);
   LWIP_ASSERT("mqtt_client_connect: ip_addr != NULL", ip_addr != NULL);
   LWIP_ASSERT("mqtt_client_connect: client_info != NULL", client_info != NULL);
   LWIP_ASSERT("mqtt_client_connect: client_info->client_id != NULL", client_info->client_id != NULL);
 
   if (client->conn_state != TCP_DISCONNECTED) {
-    LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_client_connect: Already connected\n"));
+    LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_client_connect: Already connected\n"));
     return ERR_ISCONN;
   }
 
@@ -1223,7 +1307,7 @@
   client->connect_arg = arg;
   client->connect_cb = cb;
   client->keep_alive = client_info->keep_alive;
-  mqtt_init_requests(client->req_list);
+  mqtt_init_requests(client->req_list, LWIP_ARRAYSIZE(client->req_list));
 
   /* Build connect message */
   if (client_info->will_topic != NULL && client_info->will_msg != NULL) {
@@ -1243,6 +1327,26 @@
     LWIP_ERROR("mqtt_client_connect: remaining_length overflow", len <= 0xFFFF, return ERR_VAL);
     remaining_length = (u16_t)len;
   }
+  if (client_info->client_user != NULL) {
+    flags |= MQTT_CONNECT_FLAG_USERNAME;
+    len = strlen(client_info->client_user);
+    LWIP_ERROR("mqtt_client_connect: client_info->client_user length overflow", len <= 0xFFFF, return ERR_VAL);
+    LWIP_ERROR("mqtt_client_connect: client_info->client_user length must be > 0", len > 0, return ERR_VAL);
+    client_user_len = (u16_t)len;
+    len = remaining_length + 2 + client_user_len;
+    LWIP_ERROR("mqtt_client_connect: remaining_length overflow", len <= 0xFFFF, return ERR_VAL);
+    remaining_length = (u16_t)len;
+  }
+  if (client_info->client_pass != NULL) {
+    flags |= MQTT_CONNECT_FLAG_PASSWORD;
+    len = strlen(client_info->client_pass);
+    LWIP_ERROR("mqtt_client_connect: client_info->client_pass length overflow", len <= 0xFFFF, return ERR_VAL);
+    LWIP_ERROR("mqtt_client_connect: client_info->client_pass length must be > 0", len > 0, return ERR_VAL);
+    client_pass_len = (u16_t)len;
+    len = remaining_length + 2 + client_pass_len;
+    LWIP_ERROR("mqtt_client_connect: remaining_length overflow", len <= 0xFFFF, return ERR_VAL);
+    remaining_length = (u16_t)len;
+  }
 
   /* Don't complicate things, always connect using clean session */
   flags |= MQTT_CONNECT_FLAG_CLEAN_SESSION;
@@ -1258,29 +1362,36 @@
     return ERR_MEM;
   }
 
-  client->conn = tcp_new();
+#if LWIP_ALTCP && LWIP_ALTCP_TLS
+  if (client_info->tls_config) {
+    client->conn = altcp_tls_new(client_info->tls_config, IP_GET_TYPE(ip_addr));
+  } else
+#endif
+  {
+    client->conn = altcp_tcp_new_ip_type(IP_GET_TYPE(ip_addr));
+  }
   if (client->conn == NULL) {
     return ERR_MEM;
   }
 
   /* Set arg pointer for callbacks */
-  tcp_arg(client->conn, client);
+  altcp_arg(client->conn, client);
   /* Any local address, pick random local port number */
-  err = tcp_bind(client->conn, IP_ADDR_ANY, 0);
+  err = altcp_bind(client->conn, IP_ADDR_ANY, 0);
   if (err != ERR_OK) {
-    LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_client_connect: Error binding to local ip/port, %d\n", err));
+    LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_client_connect: Error binding to local ip/port, %d\n", err));
     goto tcp_fail;
   }
-  LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_client_connect: Connecting to host: %s at port:%"U16_F"\n", ipaddr_ntoa(ip_addr), port));
+  LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_client_connect: Connecting to host: %s at port:%"U16_F"\n", ipaddr_ntoa(ip_addr), port));
 
   /* Connect to server */
-  err = tcp_connect(client->conn, ip_addr, port, mqtt_tcp_connect_cb);
+  err = altcp_connect(client->conn, ip_addr, port, mqtt_tcp_connect_cb);
   if (err != ERR_OK) {
-    LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_client_connect: Error connecting to remote ip/port, %d\n", err));
+    LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_client_connect: Error connecting to remote ip/port, %d\n", err));
     goto tcp_fail;
   }
   /* Set error callback */
-  tcp_err(client->conn, mqtt_tcp_err_cb);
+  altcp_err(client->conn, mqtt_tcp_err_cb);
   client->conn_state = TCP_CONNECTING;
 
   /* Append fixed header */
@@ -1300,10 +1411,18 @@
     mqtt_output_append_string(&client->output, client_info->will_topic, will_topic_len);
     mqtt_output_append_string(&client->output, client_info->will_msg, will_msg_len);
   }
+  /* Append user name if given */
+  if ((flags & MQTT_CONNECT_FLAG_USERNAME) != 0) {
+    mqtt_output_append_string(&client->output, client_info->client_user, client_user_len);
+  }
+  /* Append password if given */
+  if ((flags & MQTT_CONNECT_FLAG_PASSWORD) != 0) {
+    mqtt_output_append_string(&client->output, client_info->client_pass, client_pass_len);
+  }
   return ERR_OK;
 
 tcp_fail:
-  tcp_abort(client->conn);
+  altcp_abort(client->conn);
   client->conn = NULL;
   return err;
 }
@@ -1317,6 +1436,7 @@
 void
 mqtt_disconnect(mqtt_client_t *client)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("mqtt_disconnect: client != NULL", client);
   /* If connection in not already closed */
   if (client->conn_state != TCP_DISCONNECTED) {
@@ -1335,6 +1455,7 @@
 u8_t
 mqtt_client_is_connected(mqtt_client_t *client)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("mqtt_client_is_connected: client != NULL", client);
   return client->conn_state == MQTT_CONNECTED;
 }
diff --git a/src/apps/netbiosns/netbiosns.c b/src/apps/netbiosns/netbiosns.c
index 2dfbe65..c94a779 100644
--- a/src/apps/netbiosns/netbiosns.c
+++ b/src/apps/netbiosns/netbiosns.c
@@ -1,4 +1,4 @@
-/**
+  /**
  * @file
  * NetBIOS name service responder
  */
@@ -40,6 +40,10 @@
  *
  * This file is part of the lwIP TCP/IP stack.
  *
+ * Modifications by Ray Abram to respond to NetBIOS name requests when Incoming name = *
+ * - based on code from "https://github.com/esp8266/Arduino/commit/1f7989b31d26d7df9776a08f36d685eae7ac8f99"
+ * - with permission to relicense to BSD from original author:
+ *   http://www.xpablo.cz/?p=751#more-751
  */
 
 #include "lwip/apps/netbiosns.h"
@@ -48,13 +52,12 @@
 
 #include "lwip/def.h"
 #include "lwip/udp.h"
+#include "lwip/ip.h"
 #include "lwip/netif.h"
+#include "lwip/prot/iana.h"
 
 #include <string.h>
 
-/** default port number for "NetBIOS Name service */
-#define NETBIOS_PORT     137
-
 /** size of a NetBIOS name */
 #define NETBIOS_NAME_LEN 16
 
@@ -74,6 +77,10 @@
 #define NETB_HFLAG_REPLYCODE          0x0008U
 #define NETB_HFLAG_REPLYCODE_NOERROR  0x0000U
 
+/* NetBIOS question types */
+#define NETB_QTYPE_NB                 0x0020U
+#define NETB_QTYPE_NBSTAT             0x0021U
+
 /** NetBIOS name flags */
 #define NETB_NFLAG_UNIQUE             0x8000U
 #define NETB_NFLAG_NODETYPE           0x6000U
@@ -82,6 +89,10 @@
 #define NETB_NFLAG_NODETYPE_PNODE     0x2000U
 #define NETB_NFLAG_NODETYPE_BNODE     0x0000U
 
+#define NETB_NFLAG_NAME_IN_CONFLICT   0x0800U /* 1=Yes, 0=No */
+#define NETB_NFLAG_NAME_IS_ACTIVE     0x0400U /* 1=Yes, 0=No */
+#define NETB_NFLAG_NAME_IS_PERMANENT  0x0200U /* 1=Yes (Name is Permanent Node Name), 0=No */
+
 /** NetBIOS message header */
 #ifdef PACK_STRUCT_USE_INCLUDES
 #  include "arch/bpstruct.h"
@@ -100,6 +111,22 @@
 #  include "arch/epstruct.h"
 #endif
 
+/** NetBIOS message question part */
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/bpstruct.h"
+#endif
+PACK_STRUCT_BEGIN
+struct netbios_question_hdr {
+  PACK_STRUCT_FLD_8(u8_t  nametype);
+  PACK_STRUCT_FLD_8(u8_t  encname[(NETBIOS_NAME_LEN * 2) + 1]);
+  PACK_STRUCT_FIELD(u16_t type);
+  PACK_STRUCT_FIELD(u16_t cls);
+} PACK_STRUCT_STRUCT;
+PACK_STRUCT_END
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/epstruct.h"
+#endif
+
 /** NetBIOS message name part */
 #ifdef PACK_STRUCT_USE_INCLUDES
 #  include "arch/bpstruct.h"
@@ -107,7 +134,7 @@
 PACK_STRUCT_BEGIN
 struct netbios_name_hdr {
   PACK_STRUCT_FLD_8(u8_t  nametype);
-  PACK_STRUCT_FLD_8(u8_t  encname[(NETBIOS_NAME_LEN*2)+1]);
+  PACK_STRUCT_FLD_8(u8_t  encname[(NETBIOS_NAME_LEN * 2) + 1]);
   PACK_STRUCT_FIELD(u16_t type);
   PACK_STRUCT_FIELD(u16_t cls);
   PACK_STRUCT_FIELD(u32_t ttl);
@@ -125,8 +152,7 @@
 #  include "arch/bpstruct.h"
 #endif
 PACK_STRUCT_BEGIN
-struct netbios_resp
-{
+struct netbios_resp {
   struct netbios_hdr      resp_hdr;
   struct netbios_name_hdr resp_name;
 } PACK_STRUCT_STRUCT;
@@ -135,6 +161,74 @@
 #  include "arch/epstruct.h"
 #endif
 
+/** The NBNS Structure Responds to a Name Query */
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/bpstruct.h"
+#endif
+PACK_STRUCT_BEGIN
+struct netbios_answer {
+  struct netbios_hdr      answer_hdr;
+  /** the length of the next string */
+  PACK_STRUCT_FIELD(u8_t  name_size);
+  /** WARNING!!! this item may be of a different length (we use this struct for transmission) */
+  PACK_STRUCT_FLD_8(u8_t  query_name[(NETBIOS_NAME_LEN * 2) + 1]);
+  PACK_STRUCT_FIELD(u16_t packet_type);
+  PACK_STRUCT_FIELD(u16_t cls);
+  PACK_STRUCT_FIELD(u32_t ttl);
+  PACK_STRUCT_FIELD(u16_t data_length);
+#define OFFSETOF_STRUCT_NETBIOS_ANSWER_NUMBER_OF_NAMES 56
+  /** number of names */
+  PACK_STRUCT_FLD_8(u8_t  number_of_names);
+  /** node name */
+  PACK_STRUCT_FLD_8(u8_t  answer_name[NETBIOS_NAME_LEN]);
+  /** node flags */
+  PACK_STRUCT_FIELD(u16_t answer_name_flags);
+  /** Unit ID */
+  PACK_STRUCT_FLD_8(u8_t  unit_id[6]);
+  /** Jumpers */
+  PACK_STRUCT_FLD_8(u8_t  jumpers);
+  /** Test result */
+  PACK_STRUCT_FLD_8(u8_t  test_result);
+  /** Version number */
+  PACK_STRUCT_FIELD(u16_t version_number);
+  /** Period of statistics */
+  PACK_STRUCT_FIELD(u16_t period_of_statistics);
+  /** Statistics */
+  PACK_STRUCT_FIELD(u16_t number_of_crcs);
+  /** Statistics */
+  PACK_STRUCT_FIELD(u16_t number_of_alignment_errors);
+  /** Statistics */
+  PACK_STRUCT_FIELD(u16_t number_of_collisions);
+  /** Statistics */
+  PACK_STRUCT_FIELD(u16_t number_of_send_aborts);
+  /** Statistics */
+  PACK_STRUCT_FIELD(u32_t number_of_good_sends);
+  /** Statistics */
+  PACK_STRUCT_FIELD(u32_t number_of_good_receives);
+  /** Statistics */
+  PACK_STRUCT_FIELD(u16_t number_of_retransmits);
+  /** Statistics */
+  PACK_STRUCT_FIELD(u16_t number_of_no_resource_condition);
+  /** Statistics */
+  PACK_STRUCT_FIELD(u16_t number_of_free_command_blocks);
+  /** Statistics */
+  PACK_STRUCT_FIELD(u16_t total_number_of_command_blocks);
+  /** Statistics */
+  PACK_STRUCT_FIELD(u16_t max_total_number_of_command_blocks);
+  /** Statistics */
+  PACK_STRUCT_FIELD(u16_t number_of_pending_sessions);
+  /** Statistics */
+  PACK_STRUCT_FIELD(u16_t max_number_of_pending_sessions);
+  /** Statistics */
+  PACK_STRUCT_FIELD(u16_t max_total_sessions_possible);
+  /** Statistics */
+  PACK_STRUCT_FIELD(u16_t session_data_packet_size);
+} PACK_STRUCT_STRUCT;
+PACK_STRUCT_END
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/epstruct.h"
+#endif
+
 #ifdef NETBIOS_LWIP_NAME
 #define NETBIOS_LOCAL_NAME NETBIOS_LWIP_NAME
 #else
@@ -142,7 +236,7 @@
 #define NETBIOS_LOCAL_NAME netbiosns_local_name
 #endif
 
-struct udp_pcb *netbiosns_pcb;
+static struct udp_pcb *netbiosns_pcb;
 
 /** Decode a NetBIOS name (from packet to string) */
 static int
@@ -161,11 +255,13 @@
     /* Every two characters of the first level-encoded name
      * turn into one character in the decoded name. */
     cname = *pname;
-    if (cname == '\0')
-      break;    /* no more characters */
-    if (cname == '.')
-      break;    /* scope ID follows */
-    if (cname < 'A' || cname > 'Z') {
+    if (cname == '\0') {
+      break;  /* no more characters */
+    }
+    if (cname == '.') {
+      break;  /* scope ID follows */
+    }
+    if (!lwip_isupper(cname)) {
       /* Not legal. */
       return -1;
     }
@@ -174,12 +270,7 @@
     pname++;
 
     cname = *pname;
-    if (cname == '\0' || cname == '.') {
-      /* No more characters in the name - but we're in
-       * the middle of a pair.  Not legal. */
-      return -1;
-    }
-    if (cname < 'A' || cname > 'Z') {
+    if (!lwip_isupper(cname)) {
       /* Not legal. */
       return -1;
     }
@@ -190,7 +281,7 @@
     /* Do we have room to store the character? */
     if (idx < NETBIOS_NAME_LEN) {
       /* Yes - store the character. */
-      name_dec[idx++] = (cnbname!=' '?cnbname:'\0');
+      name_dec[idx++] = (cnbname != ' ' ? cnbname : '\0');
     }
   }
 
@@ -215,10 +306,12 @@
     /* Every two characters of the first level-encoded name
      * turn into one character in the decoded name. */
     cname = *pname;
-    if (cname == '\0')
-      break;    /* no more characters */
-    if (cname == '.')
-      break;    /* scope ID follows */
+    if (cname == '\0') {
+      break;  /* no more characters */
+    }
+    if (cname == '.') {
+      break;  /* scope ID follows */
+    }
     if ((cname < 'A' || cname > 'Z') && (cname < '0' || cname > '9')) {
       /* Not legal. */
       return -1;
@@ -231,13 +324,13 @@
 
     /* Yes - store the character. */
     ucname = cname;
-    name_dec[idx++] = ('A'+((ucname>>4) & 0x0F));
-    name_dec[idx++] = ('A'+( ucname     & 0x0F));
+    name_dec[idx++] = ('A' + ((ucname >> 4) & 0x0F));
+    name_dec[idx++] = ('A' + ( ucname     & 0x0F));
     pname++;
   }
 
   /* Fill with "space" coding */
-  for (;idx < name_dec_len - 1;) {
+  for (; idx < name_dec_len - 1;) {
     name_dec[idx++] = 'C';
     name_dec[idx++] = 'A';
   }
@@ -257,55 +350,118 @@
 
   /* if packet is valid */
   if (p != NULL) {
-    char   netbios_name[NETBIOS_NAME_LEN+1];
-    struct netbios_hdr*      netbios_hdr      = (struct netbios_hdr*)p->payload;
-    struct netbios_name_hdr* netbios_name_hdr = (struct netbios_name_hdr*)(netbios_hdr+1);
+    char   netbios_name[NETBIOS_NAME_LEN + 1];
+    struct netbios_hdr          *netbios_hdr          = (struct netbios_hdr *)p->payload;
+    struct netbios_question_hdr *netbios_question_hdr = (struct netbios_question_hdr *)(netbios_hdr + 1);
 
+    /* is the packet long enough (we need the header in one piece) */
+    if (p->len < (sizeof(struct netbios_hdr) + sizeof(struct netbios_question_hdr))) {
+      /* packet too short */
+      pbuf_free(p);
+      return;
+    }
     /* we only answer if we got a default interface */
     if (netif_default != NULL) {
       /* @todo: do we need to check answerRRs/authorityRRs/additionalRRs? */
       /* if the packet is a NetBIOS name query question */
       if (((netbios_hdr->flags & PP_NTOHS(NETB_HFLAG_OPCODE)) == PP_NTOHS(NETB_HFLAG_OPCODE_NAME_QUERY)) &&
           ((netbios_hdr->flags & PP_NTOHS(NETB_HFLAG_RESPONSE)) == 0) &&
-           (netbios_hdr->questions == PP_NTOHS(1))) {
+          (netbios_hdr->questions == PP_NTOHS(1))) {
         /* decode the NetBIOS name */
-        netbiosns_name_decode((char*)(netbios_name_hdr->encname), netbios_name, sizeof(netbios_name));
-        /* if the packet is for us */
-        if (lwip_strnicmp(netbios_name, NETBIOS_LOCAL_NAME, sizeof(NETBIOS_LOCAL_NAME)) == 0) {
-          struct pbuf *q;
-          struct netbios_resp *resp;
+        netbiosns_name_decode((char *)(netbios_question_hdr->encname), netbios_name, sizeof(netbios_name));
+        /* check the request type */
+        if (netbios_question_hdr->type == PP_HTONS(NETB_QTYPE_NB)) {
+          /* if the packet is for us */
+          if (lwip_strnicmp(netbios_name, NETBIOS_LOCAL_NAME, sizeof(NETBIOS_LOCAL_NAME)) == 0) {
+            struct pbuf *q;
+            struct netbios_resp *resp;
 
-          q = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct netbios_resp), PBUF_RAM);
-          if (q != NULL) {
-            resp = (struct netbios_resp*)q->payload;
+            q = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct netbios_resp), PBUF_RAM);
+            if (q != NULL) {
+              resp = (struct netbios_resp *)q->payload;
 
-            /* prepare NetBIOS header response */
-            resp->resp_hdr.trans_id      = netbios_hdr->trans_id;
-            resp->resp_hdr.flags         = PP_HTONS(NETB_HFLAG_RESPONSE |
-                                                 NETB_HFLAG_OPCODE_NAME_QUERY |
-                                                 NETB_HFLAG_AUTHORATIVE |
-                                                 NETB_HFLAG_RECURS_DESIRED);
-            resp->resp_hdr.questions     = 0;
-            resp->resp_hdr.answerRRs     = PP_HTONS(1);
-            resp->resp_hdr.authorityRRs  = 0;
-            resp->resp_hdr.additionalRRs = 0;
+              /* prepare NetBIOS header response */
+              resp->resp_hdr.trans_id      = netbios_hdr->trans_id;
+              resp->resp_hdr.flags         = PP_HTONS(NETB_HFLAG_RESPONSE |
+                                                      NETB_HFLAG_OPCODE_NAME_QUERY |
+                                                      NETB_HFLAG_AUTHORATIVE |
+                                                      NETB_HFLAG_RECURS_DESIRED);
+              resp->resp_hdr.questions     = 0;
+              resp->resp_hdr.answerRRs     = PP_HTONS(1);
+              resp->resp_hdr.authorityRRs  = 0;
+              resp->resp_hdr.additionalRRs = 0;
 
-            /* prepare NetBIOS header datas */
-            MEMCPY( resp->resp_name.encname, netbios_name_hdr->encname, sizeof(netbios_name_hdr->encname));
-            resp->resp_name.nametype     = netbios_name_hdr->nametype;
-            resp->resp_name.type         = netbios_name_hdr->type;
-            resp->resp_name.cls          = netbios_name_hdr->cls;
-            resp->resp_name.ttl          = PP_HTONL(NETBIOS_NAME_TTL);
-            resp->resp_name.datalen      = PP_HTONS(sizeof(resp->resp_name.flags)+sizeof(resp->resp_name.addr));
-            resp->resp_name.flags        = PP_HTONS(NETB_NFLAG_NODETYPE_BNODE);
-            ip4_addr_copy(resp->resp_name.addr, *netif_ip4_addr(netif_default));
+              /* prepare NetBIOS header datas */
+              MEMCPY( resp->resp_name.encname, netbios_question_hdr->encname, sizeof(netbios_question_hdr->encname));
+              resp->resp_name.nametype     = netbios_question_hdr->nametype;
+              resp->resp_name.type         = netbios_question_hdr->type;
+              resp->resp_name.cls          = netbios_question_hdr->cls;
+              resp->resp_name.ttl          = PP_HTONL(NETBIOS_NAME_TTL);
+              resp->resp_name.datalen      = PP_HTONS(sizeof(resp->resp_name.flags) + sizeof(resp->resp_name.addr));
+              resp->resp_name.flags        = PP_HTONS(NETB_NFLAG_NODETYPE_BNODE);
+              ip4_addr_copy(resp->resp_name.addr, *netif_ip4_addr(netif_default));
 
-            /* send the NetBIOS response */
-            udp_sendto(upcb, q, addr, port);
+              /* send the NetBIOS response */
+              udp_sendto(upcb, q, addr, port);
 
-            /* free the "reference" pbuf */
-            pbuf_free(q);
+              /* free the "reference" pbuf */
+              pbuf_free(q);
+            }
           }
+#if LWIP_NETBIOS_RESPOND_NAME_QUERY
+        } else if (netbios_question_hdr->type == PP_HTONS(NETB_QTYPE_NBSTAT)) {
+          /* if the packet is for us or general query */
+          if (!lwip_strnicmp(netbios_name, NETBIOS_LOCAL_NAME, sizeof(NETBIOS_LOCAL_NAME)) ||
+              !lwip_strnicmp(netbios_name, "*", sizeof(NETBIOS_LOCAL_NAME))) {
+            /* general query - ask for our IP address */
+            struct pbuf *q;
+            struct netbios_answer *resp;
+
+            q = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct netbios_answer), PBUF_RAM);
+            if (q != NULL) {
+              /* buffer to which a response is compiled */
+              resp = (struct netbios_answer *) q->payload;
+
+              /* Init response to zero, especially the statistics fields */
+              memset(resp, 0, sizeof(*resp));
+
+              /* copy the query to the response ID */
+              resp->answer_hdr.trans_id        = netbios_hdr->trans_id;
+              /* acknowledgment of termination */
+              resp->answer_hdr.flags           = PP_HTONS(NETB_HFLAG_RESPONSE | NETB_HFLAG_OPCODE_NAME_QUERY | NETB_HFLAG_AUTHORATIVE);
+              /* resp->answer_hdr.questions       = PP_HTONS(0); done by memset() */
+              /* serial number of the answer */
+              resp->answer_hdr.answerRRs       = PP_HTONS(1);
+              /* resp->answer_hdr.authorityRRs    = PP_HTONS(0); done by memset() */
+              /* resp->answer_hdr.additionalRRs   = PP_HTONS(0); done by memset() */
+              /* we will copy the length of the station name */
+              resp->name_size                  = netbios_question_hdr->nametype;
+              /* we will copy the queried name */
+              MEMCPY(resp->query_name, netbios_question_hdr->encname, (NETBIOS_NAME_LEN * 2) + 1);
+              /* NBSTAT */
+              resp->packet_type                = PP_HTONS(0x21);
+              /* Internet name */
+              resp->cls                        = PP_HTONS(1);
+              /* resp->ttl                        = PP_HTONL(0); done by memset() */
+              resp->data_length                = PP_HTONS(sizeof(struct netbios_answer) - offsetof(struct netbios_answer, number_of_names));
+              resp->number_of_names            = 1;
+
+              /* make windows see us as workstation, not as a server */
+              memset(resp->answer_name, 0x20, NETBIOS_NAME_LEN - 1);
+              /* strlen is checked to be < NETBIOS_NAME_LEN during initialization */
+              MEMCPY(resp->answer_name, NETBIOS_LOCAL_NAME, strlen(NETBIOS_LOCAL_NAME));
+
+              /* b-node, unique, active */
+              resp->answer_name_flags          = PP_HTONS(NETB_NFLAG_NAME_IS_ACTIVE);
+
+              /* Set responder netif MAC address */
+              SMEMCPY(resp->unit_id, ip_current_input_netif()->hwaddr, sizeof(resp->unit_id));
+
+              udp_sendto(upcb, q, addr, port);
+              pbuf_free(q);
+            }
+          }
+#endif /* LWIP_NETBIOS_RESPOND_NAME_QUERY */
         }
       }
     }
@@ -315,12 +471,13 @@
 }
 
 /**
- * @ingroup netbiosns 
+ * @ingroup netbiosns
  * Init netbios responder
  */
 void
 netbiosns_init(void)
 {
+  /* LWIP_ASSERT_CORE_LOCKED(); is checked by udp_new() */
 #ifdef NETBIOS_LWIP_NAME
   LWIP_ASSERT("NetBIOS name is too long!", strlen(NETBIOS_LWIP_NAME) < NETBIOS_NAME_LEN);
 #endif
@@ -329,35 +486,44 @@
   if (netbiosns_pcb != NULL) {
     /* we have to be allowed to send broadcast packets! */
     ip_set_option(netbiosns_pcb, SOF_BROADCAST);
-    udp_bind(netbiosns_pcb, IP_ANY_TYPE, NETBIOS_PORT);
+    udp_bind(netbiosns_pcb, IP_ANY_TYPE, LWIP_IANA_PORT_NETBIOS);
     udp_recv(netbiosns_pcb, netbiosns_recv, netbiosns_pcb);
   }
 }
 
 #ifndef NETBIOS_LWIP_NAME
 /**
- * @ingroup netbiosns 
+ * @ingroup netbiosns
  * Set netbios name. ATTENTION: the hostname must be less than 15 characters!
+ *                              the NetBIOS name spec says the name MUST be upper case, so incoming name is forced into uppercase :-)
  */
 void
-netbiosns_set_name(const char* hostname)
+netbiosns_set_name(const char *hostname)
 {
+  size_t i;
   size_t copy_len = strlen(hostname);
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("NetBIOS name is too long!", copy_len < NETBIOS_NAME_LEN);
   if (copy_len >= NETBIOS_NAME_LEN) {
     copy_len = NETBIOS_NAME_LEN - 1;
   }
-  MEMCPY(netbiosns_local_name, hostname, copy_len + 1);
+
+  /* make name into upper case */
+  for (i = 0; i < copy_len; i++ ) {
+    netbiosns_local_name[i] = (char)lwip_toupper(hostname[i]);
+  }
+  netbiosns_local_name[copy_len] = '\0';
 }
-#endif
+#endif /* NETBIOS_LWIP_NAME */
 
 /**
- * @ingroup netbiosns 
+ * @ingroup netbiosns
  * Stop netbios responder
  */
 void
 netbiosns_stop(void)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   if (netbiosns_pcb != NULL) {
     udp_remove(netbiosns_pcb);
     netbiosns_pcb = NULL;
diff --git a/src/apps/smtp/smtp.c b/src/apps/smtp/smtp.c
new file mode 100644
index 0000000..55303c3
--- /dev/null
+++ b/src/apps/smtp/smtp.c
@@ -0,0 +1,1555 @@
+/**
+ * @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.
+ *
+ * Example usage:
+@code{.c}
+ void my_smtp_result_fn(void *arg, u8_t smtp_result, u16_t srv_err, err_t err)
+ {
+   printf("mail (%p) sent with results: 0x%02x, 0x%04x, 0x%08x\n", arg,
+          smtp_result, srv_err, err);
+ }
+ static void my_smtp_test(void)
+ {
+   smtp_set_server_addr("mymailserver.org");
+   -> set both username and password as NULL if no auth needed
+   smtp_set_auth("username", "password");
+   smtp_send_mail("sender", "recipient", "subject", "body", my_smtp_result_fn,
+                  some_argument);
+ }
+@endcode
+
+ * 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)
+ {
+    if(bdh->state >= 10) {
+       return BDH_DONE;
+    }
+    sprintf(bdh->buffer,"Line #%2d\r\n",bdh->state);
+    bdh->length = strlen(bdh->buffer);
+    ++bdh->state;
+    return BDH_WORKING;
+ }
+ 
+ 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)
+ * - test with more mail servers...
+ *
+ */
+
+#include "lwip/apps/smtp.h"
+
+#if LWIP_TCP && LWIP_CALLBACK_API
+#include "lwip/sys.h"
+#include "lwip/sockets.h"
+#include "lwip/altcp.h"
+#include "lwip/dns.h"
+#include "lwip/mem.h"
+#include "lwip/altcp_tcp.h"
+#include "lwip/altcp_tls.h"
+
+#include <string.h> /* strlen, memcpy */
+#include <stdlib.h>
+
+/** TCP poll interval. Unit is 0.5 sec. */
+#define SMTP_POLL_INTERVAL      4
+/** TCP poll timeout while sending message body, reset after every
+ * successful write. 3 minutes */
+#define SMTP_TIMEOUT_DATABLOCK  ( 3 * 60 * SMTP_POLL_INTERVAL / 2)
+/** TCP poll timeout while waiting for confirmation after sending the body.
+ * 10 minutes */
+#define SMTP_TIMEOUT_DATATERM   (10 * 60 * SMTP_POLL_INTERVAL / 2)
+/** TCP poll timeout while not sending the body.
+ * This is somewhat lower than the RFC states (5 minutes for initial, MAIL
+ * and RCPT) but still OK for us here.
+ * 2 minutes */
+#define SMTP_TIMEOUT            ( 2 * 60 * SMTP_POLL_INTERVAL / 2)
+
+/* the various debug levels for this file */
+#define SMTP_DEBUG_TRACE        (SMTP_DEBUG | LWIP_DBG_TRACE)
+#define SMTP_DEBUG_STATE        (SMTP_DEBUG | LWIP_DBG_STATE)
+#define SMTP_DEBUG_WARN         (SMTP_DEBUG | LWIP_DBG_LEVEL_WARNING)
+#define SMTP_DEBUG_WARN_STATE   (SMTP_DEBUG | LWIP_DBG_LEVEL_WARNING | LWIP_DBG_STATE)
+#define SMTP_DEBUG_SERIOUS      (SMTP_DEBUG | LWIP_DBG_LEVEL_SERIOUS)
+
+
+#define SMTP_RX_BUF_LEN         255
+#define SMTP_TX_BUF_LEN         255
+#define SMTP_CRLF               "\r\n"
+#define SMTP_CRLF_LEN           2
+
+#define SMTP_RESP_220           "220"
+#define SMTP_RESP_235           "235"
+#define SMTP_RESP_250           "250"
+#define SMTP_RESP_334           "334"
+#define SMTP_RESP_354           "354"
+#define SMTP_RESP_LOGIN_UNAME   "VXNlcm5hbWU6"
+#define SMTP_RESP_LOGIN_PASS    "UGFzc3dvcmQ6"
+
+#define SMTP_KEYWORD_AUTH_SP    "AUTH "
+#define SMTP_KEYWORD_AUTH_EQ    "AUTH="
+#define SMTP_KEYWORD_AUTH_LEN   5
+#define SMTP_AUTH_PARAM_PLAIN   "PLAIN"
+#define SMTP_AUTH_PARAM_LOGIN   "LOGIN"
+
+#define SMTP_CMD_EHLO_1           "EHLO ["
+#define SMTP_CMD_EHLO_1_LEN       6
+#define SMTP_CMD_EHLO_2           "]\r\n"
+#define SMTP_CMD_EHLO_2_LEN       3
+#define SMTP_CMD_AUTHPLAIN_1      "AUTH PLAIN "
+#define SMTP_CMD_AUTHPLAIN_1_LEN  11
+#define SMTP_CMD_AUTHPLAIN_2      "\r\n"
+#define SMTP_CMD_AUTHPLAIN_2_LEN  2
+#define SMTP_CMD_AUTHLOGIN        "AUTH LOGIN\r\n"
+#define SMTP_CMD_AUTHLOGIN_LEN    12
+#define SMTP_CMD_MAIL_1           "MAIL FROM: <"
+#define SMTP_CMD_MAIL_1_LEN       12
+#define SMTP_CMD_MAIL_2           ">\r\n"
+#define SMTP_CMD_MAIL_2_LEN       3
+#define SMTP_CMD_RCPT_1           "RCPT TO: <"
+#define SMTP_CMD_RCPT_1_LEN       10
+#define SMTP_CMD_RCPT_2           ">\r\n"
+#define SMTP_CMD_RCPT_2_LEN       3
+#define SMTP_CMD_DATA             "DATA\r\n"
+#define SMTP_CMD_DATA_LEN         6
+#define SMTP_CMD_HEADER_1         "From: <"
+#define SMTP_CMD_HEADER_1_LEN     7
+#define SMTP_CMD_HEADER_2         ">\r\nTo: <"
+#define SMTP_CMD_HEADER_2_LEN     8
+#define SMTP_CMD_HEADER_3         ">\r\nSubject: "
+#define SMTP_CMD_HEADER_3_LEN     12
+#define SMTP_CMD_HEADER_4         "\r\n\r\n"
+#define SMTP_CMD_HEADER_4_LEN     4
+#define SMTP_CMD_BODY_FINISHED    "\r\n.\r\n"
+#define SMTP_CMD_BODY_FINISHED_LEN 5
+#define SMTP_CMD_QUIT             "QUIT\r\n"
+#define SMTP_CMD_QUIT_LEN         6
+
+#if defined(SMTP_STAT_TX_BUF_MAX) && SMTP_STAT_TX_BUF_MAX
+#define SMTP_TX_BUF_MAX(len) LWIP_MACRO(if((len) > smtp_tx_buf_len_max) smtp_tx_buf_len_max = (len);)
+#else /* SMTP_STAT_TX_BUF_MAX */
+#define SMTP_TX_BUF_MAX(len)
+#endif /* SMTP_STAT_TX_BUF_MAX */
+
+#if SMTP_COPY_AUTHDATA
+#define SMTP_USERNAME(session)        (session)->username
+#define SMTP_PASS(session)            (session)->pass
+#define SMTP_AUTH_PLAIN_DATA(session) (session)->auth_plain
+#define SMTP_AUTH_PLAIN_LEN(session)  (session)->auth_plain_len
+#else /* SMTP_COPY_AUTHDATA */
+#define SMTP_USERNAME(session)        smtp_username
+#define SMTP_PASS(session)            smtp_pass
+#define SMTP_AUTH_PLAIN_DATA(session) smtp_auth_plain
+#define SMTP_AUTH_PLAIN_LEN(session)  smtp_auth_plain_len
+#endif /* SMTP_COPY_AUTHDATA */
+
+#if SMTP_BODYDH
+#ifndef SMTP_BODYDH_MALLOC
+#define SMTP_BODYDH_MALLOC(size)      mem_malloc(size)
+#define SMTP_BODYDH_FREE(ptr)         mem_free(ptr)
+#endif
+
+/* Some internal state return values */
+#define BDHALLDATASENT                2
+#define BDHSOMEDATASENT               1
+
+enum bdh_handler_state {
+  BDH_SENDING,         /* Serving the user function generating body content */
+  BDH_STOP             /* User function stopped, closing */
+};
+#endif
+
+/** State for SMTP client state machine */
+enum smtp_session_state {
+  SMTP_NULL,
+  SMTP_HELO,
+  SMTP_AUTH_PLAIN,
+  SMTP_AUTH_LOGIN_UNAME,
+  SMTP_AUTH_LOGIN_PASS,
+  SMTP_AUTH_LOGIN,
+  SMTP_MAIL,
+  SMTP_RCPT,
+  SMTP_DATA,
+  SMTP_BODY,
+  SMTP_QUIT,
+  SMTP_CLOSED
+};
+
+#ifdef LWIP_DEBUG
+/** State-to-string table for debugging */
+static const char *smtp_state_str[] = {
+  "SMTP_NULL",
+  "SMTP_HELO",
+  "SMTP_AUTH_PLAIN",
+  "SMTP_AUTH_LOGIN_UNAME",
+  "SMTP_AUTH_LOGIN_PASS",
+  "SMTP_AUTH_LOGIN",
+  "SMTP_MAIL",
+  "SMTP_RCPT",
+  "SMTP_DATA",
+  "SMTP_BODY",
+  "SMTP_QUIT",
+  "SMTP_CLOSED",
+};
+
+static const char *smtp_result_strs[] = {
+  "SMTP_RESULT_OK",
+  "SMTP_RESULT_ERR_UNKNOWN",
+  "SMTP_RESULT_ERR_CONNECT",
+  "SMTP_RESULT_ERR_HOSTNAME",
+  "SMTP_RESULT_ERR_CLOSED",
+  "SMTP_RESULT_ERR_TIMEOUT",
+  "SMTP_RESULT_ERR_SVR_RESP",
+  "SMTP_RESULT_ERR_MEM"
+};
+#endif /* LWIP_DEBUG */
+
+#if SMTP_BODYDH
+struct smtp_bodydh_state {
+  smtp_bodycback_fn callback_fn;  /* The function to call (again) */
+  u16_t state;
+  struct smtp_bodydh exposed;     /* the user function structure */
+};
+#endif /* SMTP_BODYDH */
+
+/** struct keeping the body and state of an smtp session */
+struct smtp_session {
+  /** keeping the state of the smtp session */
+  enum smtp_session_state state;
+  /** timeout handling, if this reaches 0, the connection is closed */
+  u16_t timer;
+  /** helper buffer for transmit, not used for sending body */
+  char tx_buf[SMTP_TX_BUF_LEN + 1];
+  struct pbuf* p;
+  /** source email address */
+  const char* from;
+  /** size of the sourceemail address */
+  u16_t from_len;
+  /** target email address */
+  const char* to;
+  /** size of the target email address */
+  u16_t to_len;
+  /** subject of the email */
+  const char *subject;
+  /** length of the subject string */
+  u16_t subject_len;
+  /** this is the body of the mail to be sent */
+  const char* body;
+  /** this is the length of the body to be sent */
+  u16_t body_len;
+  /** amount of data from body already sent */
+  u16_t body_sent;
+  /** callback function to call when closed */
+  smtp_result_fn callback_fn;
+  /** argument for callback function */
+  void *callback_arg;
+#if SMTP_COPY_AUTHDATA
+  /** Username to use for this request */
+  char *username;
+  /** Password to use for this request */
+  char *pass;
+  /** Username and password combined as necessary for PLAIN authentication */
+  char auth_plain[SMTP_MAX_USERNAME_LEN + SMTP_MAX_PASS_LEN + 3];
+  /** Length of smtp_auth_plain string (cannot use strlen since it includes \0) */
+  size_t auth_plain_len;
+#endif /* SMTP_COPY_AUTHDATA */
+#if SMTP_BODYDH
+  struct smtp_bodydh_state *bodydh;
+#endif /* SMTP_BODYDH */
+};
+
+/** IP address or DNS name of the server to use for next SMTP request */
+static char smtp_server[SMTP_MAX_SERVERNAME_LEN + 1];
+/** TCP port of the server to use for next SMTP request */
+static u16_t smtp_server_port = SMTP_DEFAULT_PORT;
+#if LWIP_ALTCP && LWIP_ALTCP_TLS
+/** If this is set, mail is sent using SMTPS */
+static struct altcp_tls_config *smtp_server_tls_config;
+#endif
+/** Username to use for the next SMTP request */
+static char *smtp_username;
+/** Password to use for the next SMTP request */
+static char *smtp_pass;
+/** Username and password combined as necessary for PLAIN authentication */
+static char smtp_auth_plain[SMTP_MAX_USERNAME_LEN + SMTP_MAX_PASS_LEN + 3];
+/** Length of smtp_auth_plain string (cannot use strlen since it includes \0) */
+static size_t smtp_auth_plain_len;
+
+#if SMTP_CHECK_DATA
+static err_t  smtp_verify(const char *data, size_t data_len, u8_t linebreaks_allowed);
+#endif /* SMTP_CHECK_DATA */
+static err_t  smtp_tcp_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err);
+static void   smtp_tcp_err(void *arg, err_t err);
+static err_t  smtp_tcp_poll(void *arg, struct altcp_pcb *pcb);
+static err_t  smtp_tcp_sent(void *arg, struct altcp_pcb *pcb, u16_t len);
+static err_t  smtp_tcp_connected(void *arg, struct altcp_pcb *pcb, err_t err);
+#if LWIP_DNS
+static void   smtp_dns_found(const char* hostname, const ip_addr_t *ipaddr, void *arg);
+#endif /* LWIP_DNS */
+#if SMTP_SUPPORT_AUTH_PLAIN || SMTP_SUPPORT_AUTH_LOGIN
+static size_t smtp_base64_encode(char* target, size_t target_len, const char* source, size_t source_len);
+#endif /* SMTP_SUPPORT_AUTH_PLAIN || SMTP_SUPPORT_AUTH_LOGIN */
+static enum   smtp_session_state smtp_prepare_mail(struct smtp_session *s, u16_t *tx_buf_len);
+static void   smtp_send_body(struct smtp_session *s, struct altcp_pcb *pcb);
+static void   smtp_process(void *arg, struct altcp_pcb *pcb, struct pbuf *p);
+#if SMTP_BODYDH
+static void   smtp_send_body_data_handler(struct smtp_session *s, struct altcp_pcb *pcb);
+#endif /* SMTP_BODYDH */
+
+
+#ifdef LWIP_DEBUG
+/** Convert an smtp result to a string */
+const char*
+smtp_result_str(u8_t smtp_result)
+{
+  if (smtp_result >= LWIP_ARRAYSIZE(smtp_result_strs)) {
+    return "UNKNOWN";
+  }
+  return smtp_result_strs[smtp_result];
+}
+
+/** Null-terminates the payload of p for printing out messages.
+ * WARNING: use this only if p is not needed any more as the last byte of
+ *          payload is deleted!
+ */
+static const char*
+smtp_pbuf_str(struct pbuf* p)
+{
+  if ((p == NULL) || (p->len == 0)) {
+    return "";
+  }
+  ((char*)p->payload)[p->len] = 0;
+  return (const char*)p->payload;
+}
+#endif /* LWIP_DEBUG */
+
+/** @ingroup smtp
+ * Set IP address or DNS name for next SMTP connection
+ *
+ * @param server IP address (in ASCII representation) or DNS name of the server
+ */
+err_t
+smtp_set_server_addr(const char* server)
+{
+  size_t len = 0;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  if (server != NULL) {
+    /* strlen: returns length WITHOUT terminating 0 byte */
+    len = strlen(server);
+  }
+  if (len > SMTP_MAX_SERVERNAME_LEN) {
+    return ERR_MEM;
+  }
+  if (len != 0) {
+    MEMCPY(smtp_server, server, len);
+  }
+  smtp_server[len] = 0; /* always OK because of smtp_server[SMTP_MAX_SERVERNAME_LEN + 1] */
+  return ERR_OK;
+}
+
+/** @ingroup smtp
+ * Set TCP port for next SMTP connection
+ *
+ * @param port TCP port
+ */
+void
+smtp_set_server_port(u16_t port)
+{
+  LWIP_ASSERT_CORE_LOCKED();
+  smtp_server_port = port;
+}
+
+#if LWIP_ALTCP && LWIP_ALTCP_TLS
+/** @ingroup smtp
+ * Set TLS configuration for next SMTP connection
+ *
+ * @param tls_config TLS configuration
+ */
+void
+smtp_set_tls_config(struct altcp_tls_config *tls_config)
+{
+  LWIP_ASSERT_CORE_LOCKED();
+  smtp_server_tls_config = tls_config;
+}
+#endif
+
+/** @ingroup smtp
+ * Set authentication parameters for next SMTP connection
+ *
+ * @param username login name as passed to the server
+ * @param pass password passed to the server together with username
+ */
+err_t
+smtp_set_auth(const char* username, const char* pass)
+{
+  size_t uname_len = 0;
+  size_t pass_len = 0;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  memset(smtp_auth_plain, 0xfa, 64);
+  if (username != NULL) {
+    uname_len = strlen(username);
+    if (uname_len > SMTP_MAX_USERNAME_LEN) {
+      LWIP_DEBUGF(SMTP_DEBUG_SERIOUS, ("Username is too long, %d instead of %d\n",
+        (int)uname_len, SMTP_MAX_USERNAME_LEN));
+      return ERR_ARG;
+    }
+  }
+  if (pass != NULL) {
+#if SMTP_SUPPORT_AUTH_LOGIN || SMTP_SUPPORT_AUTH_PLAIN
+    pass_len = strlen(pass);
+    if (pass_len > SMTP_MAX_PASS_LEN) {
+      LWIP_DEBUGF(SMTP_DEBUG_SERIOUS, ("Password is too long, %d instead of %d\n",
+        (int)uname_len, SMTP_MAX_USERNAME_LEN));
+      return ERR_ARG;
+    }
+#else /* SMTP_SUPPORT_AUTH_LOGIN || SMTP_SUPPORT_AUTH_PLAIN */
+    LWIP_DEBUGF(SMTP_DEBUG_WARN, ("Password not supported as no authentication methods are activated\n"));
+#endif /* SMTP_SUPPORT_AUTH_LOGIN || SMTP_SUPPORT_AUTH_PLAIN */
+  }
+  *smtp_auth_plain = 0;
+  if (username != NULL) {
+    smtp_username = smtp_auth_plain + 1;
+    strcpy(smtp_username, username);
+  }
+  if (pass != NULL) {
+    smtp_pass = smtp_auth_plain + uname_len + 2;
+    strcpy(smtp_pass, pass);
+  }
+  smtp_auth_plain_len = uname_len + pass_len + 2;
+
+  return ERR_OK;
+}
+
+#if SMTP_BODYDH
+static void smtp_free_struct(struct smtp_session *s)
+{
+  if (s->bodydh != NULL) {
+    SMTP_BODYDH_FREE(s->bodydh);
+  }
+  SMTP_STATE_FREE(s);
+}
+#else /* SMTP_BODYDH */
+#define smtp_free_struct(x) SMTP_STATE_FREE(x)
+#endif /* SMTP_BODYDH */
+
+static struct altcp_pcb*
+smtp_setup_pcb(struct smtp_session *s, const ip_addr_t* remote_ip)
+{
+  struct altcp_pcb* pcb;
+  LWIP_UNUSED_ARG(remote_ip);
+
+#if LWIP_ALTCP && LWIP_ALTCP_TLS
+  if (smtp_server_tls_config) {
+    pcb = altcp_tls_new(smtp_server_tls_config, IP_GET_TYPE(remote_ip));
+  } else
+#endif
+  {
+    pcb = altcp_tcp_new_ip_type(IP_GET_TYPE(remote_ip));
+  }
+  if (pcb != NULL) {
+    altcp_arg(pcb, s);
+    altcp_recv(pcb, smtp_tcp_recv);
+    altcp_err(pcb, smtp_tcp_err);
+    altcp_poll(pcb, smtp_tcp_poll, SMTP_POLL_INTERVAL);
+    altcp_sent(pcb, smtp_tcp_sent);
+  }
+  return pcb;
+}
+
+/** The actual mail-sending function, called by smtp_send_mail and
+ * smtp_send_mail_static after setting up the struct smtp_session.
+ */
+static err_t
+smtp_send_mail_alloced(struct smtp_session *s)
+{
+  err_t err;
+  struct altcp_pcb* pcb = NULL;
+  ip_addr_t addr;
+
+  LWIP_ASSERT("no smtp_session supplied", s != NULL);
+
+#if SMTP_CHECK_DATA
+  /* check that body conforms to RFC:
+   * - convert all single-CR or -LF in body to CRLF
+   * - only 7-bit ASCII is allowed
+   */
+  if (smtp_verify(s->to, s->to_len, 0) != ERR_OK) {
+    err = ERR_ARG;
+    goto leave;
+  }
+  if (smtp_verify(s->from, s->from_len, 0) != ERR_OK) {
+    err = ERR_ARG;
+    goto leave;
+  }
+  if (smtp_verify(s->subject, s->subject_len, 0) != ERR_OK) {
+    err = ERR_ARG;
+    goto leave;
+  }
+#if SMTP_BODYDH
+  if (s->bodydh == NULL)
+#endif /* SMTP_BODYDH */
+  {
+    if (smtp_verify(s->body, s->body_len, 0) != ERR_OK) {
+      err = ERR_ARG;
+      goto leave;
+    }
+  }
+#endif /* SMTP_CHECK_DATA */
+
+#if SMTP_COPY_AUTHDATA
+  /* copy auth data, ensuring the first byte is always zero */
+  MEMCPY(s->auth_plain + 1, smtp_auth_plain + 1, smtp_auth_plain_len - 1);
+  s->auth_plain_len = smtp_auth_plain_len;
+  /* default username and pass is empty string */
+  s->username = s->auth_plain;
+  s->pass = s->auth_plain;
+  if (smtp_username != NULL) {
+    s->username += smtp_username - smtp_auth_plain;
+  }
+  if (smtp_pass != NULL) {
+    s->pass += smtp_pass - smtp_auth_plain;
+  }
+#endif /* SMTP_COPY_AUTHDATA */
+
+  s->state = SMTP_NULL;
+  s->timer = SMTP_TIMEOUT;
+
+#if LWIP_DNS
+  err = dns_gethostbyname(smtp_server, &addr, smtp_dns_found, s);
+#else /* LWIP_DNS */
+  err = ipaddr_aton(smtp_server, &addr) ? ERR_OK : ERR_ARG;
+#endif /* LWIP_DNS */
+  if (err == ERR_OK) {
+    pcb = smtp_setup_pcb(s, &addr);
+    if (pcb == NULL) {
+      err = ERR_MEM;
+      goto leave;
+    }
+    err = altcp_connect(pcb, &addr, smtp_server_port, smtp_tcp_connected);
+    if (err != ERR_OK) {
+      LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("tcp_connect failed: %d\n", (int)err));
+      goto deallocate_and_leave;
+    }
+  } else if (err != ERR_INPROGRESS) {
+    LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("dns_gethostbyname failed: %d\n", (int)err));
+    goto deallocate_and_leave;
+  }
+  return ERR_OK;
+
+deallocate_and_leave:
+  if (pcb != NULL) {
+    altcp_arg(pcb, NULL);
+    altcp_close(pcb);
+  }
+leave:
+  smtp_free_struct(s);
+  /* no need to call the callback here since we return != ERR_OK */
+  return err;
+}
+
+/** @ingroup smtp
+ *  Send an email via the currently selected server, username and password.
+ *
+ * @param from source email address (must be NULL-terminated)
+ * @param to target email address (must be NULL-terminated)
+ * @param subject email subject (must be NULL-terminated)
+ * @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
+ *            (this does not mean the email has been successfully sent!)
+ *          - another err_t on error.
+ */
+err_t
+smtp_send_mail(const char* from, const char* to, const char* subject, const char* body,
+               smtp_result_fn callback_fn, void* callback_arg)
+{
+  struct smtp_session* s;
+  size_t from_len = strlen(from);
+  size_t to_len = strlen(to);
+  size_t subject_len = strlen(subject);
+  size_t body_len = strlen(body);
+  size_t mem_len = sizeof(struct smtp_session);
+  char *sfrom, *sto, *ssubject, *sbody;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  mem_len += from_len + to_len + subject_len + body_len + 4;
+  if (mem_len > 0xffff) {
+    /* too long! */
+    return ERR_MEM;
+  }
+
+  /* Allocate memory to keep this email's session state */
+  s = (struct smtp_session *)SMTP_STATE_MALLOC((mem_size_t)mem_len);
+  if (s == NULL) {
+    return ERR_MEM;
+  }
+  /* initialize the structure */
+  memset(s, 0, mem_len);
+  s->from = sfrom = (char*)s + sizeof(struct smtp_session);
+  s->from_len = (u16_t)from_len;
+  s->to = sto = sfrom + from_len + 1;
+  s->to_len = (u16_t)to_len;
+  s->subject = ssubject = sto + to_len + 1;
+  s->subject_len = (u16_t)subject_len;
+  s->body = sbody = ssubject + subject_len + 1;
+  s->body_len = (u16_t)body_len;
+  /* copy source and target email address */
+  /* cast to size_t is a hack to cast away constness */
+  MEMCPY(sfrom, from, from_len + 1);
+  MEMCPY(sto, to, to_len + 1);
+  MEMCPY(ssubject, subject, subject_len + 1);
+  MEMCPY(sbody, body, body_len + 1);
+
+  s->callback_fn = callback_fn;
+  s->callback_arg = callback_arg;
+
+  /* call the actual implementation of this function */
+  return smtp_send_mail_alloced(s);
+}
+
+/** @ingroup smtp
+ * Same as smtp_send_mail, but doesn't copy from, to, subject and body into
+ * an internal buffer to save memory.
+ * WARNING: the above data must stay untouched until the callback function is
+ *          called (unless the function returns != ERR_OK)
+ */
+err_t
+smtp_send_mail_static(const char *from, const char* to, const char* subject,
+  const char* body, smtp_result_fn callback_fn, void* callback_arg)
+{
+  struct smtp_session* s;
+  size_t len;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  s = (struct smtp_session*)SMTP_STATE_MALLOC(sizeof(struct smtp_session));
+  if (s == NULL) {
+    return ERR_MEM;
+  }
+  memset(s, 0, sizeof(struct smtp_session));
+  /* initialize the structure */
+  s->from = from;
+  len = strlen(from);
+  LWIP_ASSERT("string is too long", len <= 0xffff);
+  s->from_len = (u16_t)len;
+  s->to = to;
+  len = strlen(to);
+  LWIP_ASSERT("string is too long", len <= 0xffff);
+  s->to_len = (u16_t)len;
+  s->subject = subject;
+  len = strlen(subject);
+  LWIP_ASSERT("string is too long", len <= 0xffff);
+  s->subject_len = (u16_t)len;
+  s->body = body;
+  len = strlen(body);
+  LWIP_ASSERT("string is too long", len <= 0xffff);
+  s->body_len = (u16_t)len;
+  s->callback_fn = callback_fn;
+  s->callback_arg = callback_arg;
+  /* call the actual implementation of this function */
+  return smtp_send_mail_alloced(s);
+}
+
+
+/** @ingroup smtp
+ * Same as smtp_send_mail but takes a struct smtp_send_request as single
+ * parameter which contains all the other parameters.
+ * To be used with tcpip_callback to send mail from interrupt context or from
+ * another thread.
+ *
+ * WARNING: server and authentication must stay untouched until this function has run!
+ *
+ * Usage example:
+ * - allocate a struct smtp_send_request (in a way that is allowed in interrupt context)
+ * - fill the members of the struct as if calling smtp_send_mail
+ * - specify a callback_function
+ * - set callback_arg to the structure itself
+ * - call this function
+ * - wait for the callback function to be called
+ * - in the callback function, deallocate the structure (passed as arg)
+ */
+void
+smtp_send_mail_int(void *arg)
+{
+  struct smtp_send_request *req = (struct smtp_send_request*)arg;
+  err_t err;
+
+  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ASSERT("smtp_send_mail_int: no argument given", arg != NULL);
+
+  if (req->static_data) {
+    err = smtp_send_mail_static(req->from, req->to, req->subject, req->body,
+      req->callback_fn, req->callback_arg);
+  } else {
+    err = smtp_send_mail(req->from, req->to, req->subject, req->body,
+      req->callback_fn, req->callback_arg);
+  }
+  if ((err != ERR_OK) && (req->callback_fn != NULL)) {
+    req->callback_fn(req->callback_arg, SMTP_RESULT_ERR_UNKNOWN, 0, err);
+  }
+}
+
+#if SMTP_CHECK_DATA
+/** Verify that a given string conforms to the SMTP rules
+ * (7-bit only, no single CR or LF,
+ *  @todo: no line consisting of a single dot only)
+ */
+static err_t
+smtp_verify(const char *data, size_t data_len, u8_t linebreaks_allowed)
+{
+  size_t i;
+  u8_t last_was_cr = 0;
+  for (i = 0; i < data_len; i++) {
+    char current = data[i];
+    if ((current & 0x80) != 0) {
+      LWIP_DEBUGF(SMTP_DEBUG_WARN, ("smtp_verify: no 8-bit data supported: %s\n", data));
+      return ERR_ARG;
+    }
+    if (current == '\r') {
+      if (!linebreaks_allowed) {
+        LWIP_DEBUGF(SMTP_DEBUG_WARN, ("smtp_verify: found CR where no linebreaks allowed: %s\n", data));
+        return ERR_ARG;
+      }
+      if (last_was_cr) {
+        LWIP_DEBUGF(SMTP_DEBUG_WARN, ("smtp_verify: found double CR: %s\n", data));
+        return ERR_ARG;
+      }
+      last_was_cr = 1;
+    } else {
+      if (current == '\n') {
+        if (!last_was_cr) {
+          LWIP_DEBUGF(SMTP_DEBUG_WARN, ("smtp_verify: found LF without CR before: %s\n", data));
+          return ERR_ARG;
+        }
+      }
+      last_was_cr = 0;
+    }
+  }
+  return ERR_OK;
+}
+#endif /* SMTP_CHECK_DATA */
+
+/** Frees the smtp_session and calls the callback function */
+static void
+smtp_free(struct smtp_session *s, u8_t result, u16_t srv_err, err_t err)
+{
+  smtp_result_fn fn = s->callback_fn;
+  void *arg = s->callback_arg;
+  if (s->p != NULL) {
+    pbuf_free(s->p);
+  }
+  smtp_free_struct(s);
+  if (fn != NULL) {
+    fn(arg, result, srv_err, err);
+  }
+}
+
+/** Try to close a pcb and free the arg if successful */
+static void
+smtp_close(struct smtp_session *s, struct altcp_pcb *pcb, u8_t result,
+           u16_t srv_err, err_t err)
+{
+  if (pcb != NULL) {
+     altcp_arg(pcb, NULL);
+     if (altcp_close(pcb) == ERR_OK) {
+       if (s != NULL) {
+         smtp_free(s, result, srv_err, err);
+       }
+     } else {
+       /* close failed, set back arg */
+       altcp_arg(pcb, s);
+     }
+  } else {
+    if (s != NULL) {
+      smtp_free(s, result, srv_err, err);
+    }
+  }
+}
+
+/** Raw API TCP err callback: pcb is already deallocated */
+static void
+smtp_tcp_err(void *arg, err_t err)
+{
+  LWIP_UNUSED_ARG(err);
+  if (arg != NULL) {
+    LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("smtp_tcp_err: connection reset by remote host\n"));
+    smtp_free((struct smtp_session*)arg, SMTP_RESULT_ERR_CLOSED, 0, err);
+  }
+}
+
+/** Raw API TCP poll callback */
+static err_t
+smtp_tcp_poll(void *arg, struct altcp_pcb *pcb)
+{
+  if (arg != NULL) {
+    struct smtp_session *s = (struct smtp_session*)arg;
+    if (s->timer != 0) {
+      s->timer--;
+    }
+  }
+  smtp_process(arg, pcb, NULL);
+  return ERR_OK;
+}
+
+/** Raw API TCP sent callback */
+static err_t
+smtp_tcp_sent(void *arg, struct altcp_pcb *pcb, u16_t len)
+{
+  LWIP_UNUSED_ARG(len);
+
+  smtp_process(arg, pcb, NULL);
+
+  return ERR_OK;
+}
+
+/** Raw API TCP recv callback */
+static err_t
+smtp_tcp_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err)
+{
+  LWIP_UNUSED_ARG(err);
+  if (p != NULL) {
+    altcp_recved(pcb, p->tot_len);
+    smtp_process(arg, pcb, p);
+  } else {
+    LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("smtp_tcp_recv: connection closed by remote host\n"));
+    smtp_close((struct smtp_session*)arg, pcb, SMTP_RESULT_ERR_CLOSED, 0, err);
+  }
+  return ERR_OK;
+}
+
+static err_t
+smtp_tcp_connected(void *arg, struct altcp_pcb *pcb, err_t err)
+{
+  LWIP_UNUSED_ARG(arg);
+
+  if (err == ERR_OK) {
+    LWIP_DEBUGF(SMTP_DEBUG_STATE, ("smtp_connected: Waiting for 220\n"));
+  } else {
+    /* shouldn't happen, but we still check 'err', only to be sure */
+    LWIP_DEBUGF(SMTP_DEBUG_WARN, ("smtp_connected: %d\n", (int)err));
+    smtp_close((struct smtp_session*)arg, pcb, SMTP_RESULT_ERR_CONNECT, 0, err);
+  }
+  return ERR_OK;
+}
+
+#if LWIP_DNS
+/** DNS callback
+ * If ipaddr is non-NULL, resolving succeeded, otherwise it failed.
+ */
+static void
+smtp_dns_found(const char* hostname, const ip_addr_t *ipaddr, void *arg)
+{
+  struct smtp_session *s = (struct smtp_session*)arg;
+  struct altcp_pcb *pcb;
+  err_t err;
+  u8_t result;
+
+  LWIP_UNUSED_ARG(hostname);
+
+  if (ipaddr != NULL) {
+    pcb = smtp_setup_pcb(s, ipaddr);
+    if (pcb != NULL) {
+      LWIP_DEBUGF(SMTP_DEBUG_STATE, ("smtp_dns_found: hostname resolved, connecting\n"));
+      err = altcp_connect(pcb, ipaddr, smtp_server_port, smtp_tcp_connected);
+      if (err == ERR_OK) {
+        return;
+      }
+      LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("tcp_connect failed: %d\n", (int)err));
+      result = SMTP_RESULT_ERR_CONNECT;
+    } else {
+      LWIP_DEBUGF(SMTP_DEBUG_STATE, ("smtp_dns_found: failed to allocate tcp pcb\n"));
+      result = SMTP_RESULT_ERR_MEM;
+      err = ERR_MEM;
+    }
+  } else {
+    LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("smtp_dns_found: failed to resolve hostname: %s\n",
+      hostname));
+    pcb = NULL;
+    result = SMTP_RESULT_ERR_HOSTNAME;
+    err = ERR_ARG;
+  }
+  smtp_close(s, pcb, result, 0, err);
+}
+#endif /* LWIP_DNS */
+
+#if SMTP_SUPPORT_AUTH_PLAIN || SMTP_SUPPORT_AUTH_LOGIN
+
+/** Table 6-bit-index-to-ASCII used for base64-encoding */
+static const char base64_table[] = {
+  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+  'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
+  'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+  'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
+  'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
+  'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  '+', '/'
+};
+
+/** Base64 encoding */
+static size_t
+smtp_base64_encode(char* target, size_t target_len, const char* source, size_t source_len)
+{
+  size_t i;
+  s8_t j;
+  size_t target_idx = 0;
+  size_t longer = (source_len % 3) ? (3 - (source_len % 3)) : 0;
+  size_t source_len_b64 = source_len + longer;
+  size_t len = (((source_len_b64) * 4) / 3);
+  u8_t x = 5;
+  u8_t current = 0;
+  LWIP_UNUSED_ARG(target_len);
+
+  LWIP_ASSERT("target_len is too short", target_len >= len);
+
+  for (i = 0; i < source_len_b64; i++) {
+    u8_t b = (i < source_len ? (u8_t)source[i] : 0);
+    for (j = 7; j >= 0; j--, x--) {
+      if ((b & (1 << j)) != 0) {
+        current = (u8_t)(current | (1U << x));
+      }
+      if (x == 0) {
+        target[target_idx++] = base64_table[current];
+        x = 6;
+        current = 0;
+      }
+    }
+  }
+  for (i = len - longer; i < len; i++) {
+    target[i] = '=';
+  }
+  return len;
+}
+#endif /* SMTP_SUPPORT_AUTH_PLAIN || SMTP_SUPPORT_AUTH_LOGIN */
+
+/** Parse pbuf to see if it contains the beginning of an answer.
+ * If so, it returns the contained response code as number between 1 and 999.
+ * If not, zero is returned.
+ *
+ * @param s smtp session struct
+ */
+static u16_t
+smtp_is_response(struct smtp_session *s)
+{
+  char digits[4];
+  long num;
+
+  if (s->p == NULL) {
+    return 0;
+  }
+  /* copy three digits and convert them to int */
+  if (pbuf_copy_partial(s->p, digits, 3, 0) != 3) {
+    /* pbuf was too short */
+    return 0;
+  }
+  digits[3] = 0;
+  num = strtol(digits, NULL, 10);
+  if ((num <= 0) || (num >= 1000)) {
+    /* failed to find response code at start of line */
+    return 0;
+  }
+  return (u16_t)num;
+}
+
+/** Parse pbuf to see if it contains a fully received answer.
+ * If one is found, ERR_OK is returned.
+ * If none is found, ERR_VAL is returned.
+ *
+ * A fully received answer is a 3-digit number followed by a space,
+ * some string and a CRLF as line ending.
+ *
+ * @param s smtp session struct
+ */
+static err_t
+smtp_is_response_finished(struct smtp_session *s)
+{
+  u8_t sp;
+  u16_t crlf;
+  u16_t offset;
+
+  if (s->p == NULL) {
+    return ERR_VAL;
+  }
+  offset = 0;
+again:
+  /* We could check the response number here, but we trust the
+   * protocol definition which says the client can rely on it being
+   * the same on every line. */
+
+  /* find CRLF */
+  if (offset > 0xFFFF - 4) {
+    /* would overflow */
+    return ERR_VAL;
+  }
+  crlf = pbuf_memfind(s->p, SMTP_CRLF, SMTP_CRLF_LEN, (u16_t)(offset + 4));
+  if (crlf == 0xFFFF) {
+    /* no CRLF found */
+    return ERR_VAL;
+  }
+  sp = pbuf_get_at(s->p, (u16_t)(offset + 3));
+  if (sp == '-') {
+    /* no space after response code -> try next line */
+    offset = (u16_t)(crlf + 2);
+    if (offset < crlf) {
+      /* overflow */
+      return ERR_VAL;
+    }
+    goto again;
+  } else if (sp == ' ') {
+    /* CRLF found after response code + space -> valid response */
+    return ERR_OK;
+  }
+  /* sp contains invalid character */
+  return ERR_VAL;
+}
+
+/** Prepare HELO/EHLO message */
+static enum smtp_session_state
+smtp_prepare_helo(struct smtp_session *s, u16_t *tx_buf_len, struct altcp_pcb *pcb)
+{
+  size_t ipa_len;
+  const char *ipa = ipaddr_ntoa(altcp_get_ip(pcb, 1));
+  LWIP_ASSERT("ipaddr_ntoa returned NULL", ipa != NULL);
+  ipa_len = strlen(ipa);
+  LWIP_ASSERT("string too long", ipa_len <= (SMTP_TX_BUF_LEN-SMTP_CMD_EHLO_1_LEN-SMTP_CMD_EHLO_2_LEN));
+
+  *tx_buf_len = (u16_t)(SMTP_CMD_EHLO_1_LEN + (u16_t)ipa_len + SMTP_CMD_EHLO_2_LEN);
+  LWIP_ASSERT("tx_buf overflow detected", *tx_buf_len <= SMTP_TX_BUF_LEN);
+
+  SMEMCPY(s->tx_buf, SMTP_CMD_EHLO_1, SMTP_CMD_EHLO_1_LEN);
+  MEMCPY(&s->tx_buf[SMTP_CMD_EHLO_1_LEN], ipa, ipa_len);
+  SMEMCPY(&s->tx_buf[SMTP_CMD_EHLO_1_LEN + ipa_len], SMTP_CMD_EHLO_2, SMTP_CMD_EHLO_2_LEN);
+  return SMTP_HELO;
+}
+
+#if SMTP_SUPPORT_AUTH_PLAIN || SMTP_SUPPORT_AUTH_LOGIN
+/** Parse last server response (in rx_buf) for supported authentication method,
+ * create data to send out (to tx_buf), set tx_data_len correctly
+ * and return the next state.
+ */
+static enum smtp_session_state
+smtp_prepare_auth_or_mail(struct smtp_session *s, u16_t *tx_buf_len)
+{
+  /* check response for supported authentication method */
+  u16_t auth = pbuf_strstr(s->p, SMTP_KEYWORD_AUTH_SP);
+  if (auth == 0xFFFF) {
+    auth = pbuf_strstr(s->p, SMTP_KEYWORD_AUTH_EQ);
+  }
+  if (auth != 0xFFFF) {
+    u16_t crlf = pbuf_memfind(s->p, SMTP_CRLF, SMTP_CRLF_LEN, auth);
+    if ((crlf != 0xFFFF) && (crlf > auth)) {
+      /* use tx_buf temporarily */
+      u16_t copied = pbuf_copy_partial(s->p, s->tx_buf, (u16_t)(crlf - auth), auth);
+      if (copied != 0) {
+        char *sep = s->tx_buf + SMTP_KEYWORD_AUTH_LEN;
+        s->tx_buf[copied] = 0;
+#if SMTP_SUPPORT_AUTH_PLAIN
+        /* favour PLAIN over LOGIN since it involves less requests */
+        if (strstr(sep, SMTP_AUTH_PARAM_PLAIN) != NULL) {
+          size_t auth_len;
+          /* server supports AUTH PLAIN */
+          SMEMCPY(s->tx_buf, SMTP_CMD_AUTHPLAIN_1, SMTP_CMD_AUTHPLAIN_1_LEN);
+
+          /* add base64-encoded string "\0username\0password" */
+          auth_len = smtp_base64_encode(&s->tx_buf[SMTP_CMD_AUTHPLAIN_1_LEN],
+            SMTP_TX_BUF_LEN - SMTP_CMD_AUTHPLAIN_1_LEN, SMTP_AUTH_PLAIN_DATA(s),
+            SMTP_AUTH_PLAIN_LEN(s));
+          LWIP_ASSERT("string too long", auth_len <= (SMTP_TX_BUF_LEN-SMTP_CMD_AUTHPLAIN_1_LEN-SMTP_CMD_AUTHPLAIN_2_LEN));
+          *tx_buf_len = (u16_t)(SMTP_CMD_AUTHPLAIN_1_LEN + SMTP_CMD_AUTHPLAIN_2_LEN + (u16_t)auth_len);
+          SMEMCPY(&s->tx_buf[SMTP_CMD_AUTHPLAIN_1_LEN + auth_len], SMTP_CMD_AUTHPLAIN_2,
+            SMTP_CMD_AUTHPLAIN_2_LEN);
+          return SMTP_AUTH_PLAIN;
+        } else
+#endif /* SMTP_SUPPORT_AUTH_PLAIN */
+        {
+#if SMTP_SUPPORT_AUTH_LOGIN
+          if (strstr(sep, SMTP_AUTH_PARAM_LOGIN) != NULL) {
+            /* server supports AUTH LOGIN */
+            *tx_buf_len = SMTP_CMD_AUTHLOGIN_LEN;
+            SMEMCPY(s->tx_buf, SMTP_CMD_AUTHLOGIN, SMTP_CMD_AUTHLOGIN_LEN);
+            return SMTP_AUTH_LOGIN_UNAME;
+          }
+#endif /* SMTP_SUPPORT_AUTH_LOGIN */
+        }
+      }
+    }
+  }
+  /* server didnt's send correct keywords for AUTH, try sending directly */
+  return smtp_prepare_mail(s, tx_buf_len);
+}
+#endif /* SMTP_SUPPORT_AUTH_PLAIN || SMTP_SUPPORT_AUTH_LOGIN */
+
+#if SMTP_SUPPORT_AUTH_LOGIN
+/** Send base64-encoded username */
+static enum smtp_session_state
+smtp_prepare_auth_login_uname(struct smtp_session *s, u16_t *tx_buf_len)
+{
+  size_t base64_len = smtp_base64_encode(s->tx_buf, SMTP_TX_BUF_LEN,
+    SMTP_USERNAME(s), strlen(SMTP_USERNAME(s)));
+  /* @todo: support base64-encoded longer than 64k */
+  LWIP_ASSERT("string too long", base64_len <= 0xffff);
+  LWIP_ASSERT("tx_buf overflow detected", base64_len <= SMTP_TX_BUF_LEN - SMTP_CRLF_LEN);
+  *tx_buf_len = (u16_t)(base64_len + SMTP_CRLF_LEN);
+
+  SMEMCPY(&s->tx_buf[base64_len], SMTP_CRLF, SMTP_CRLF_LEN);
+  s->tx_buf[*tx_buf_len] = 0;
+  return SMTP_AUTH_LOGIN_PASS;
+}
+
+/** Send base64-encoded password */
+static enum smtp_session_state
+smtp_prepare_auth_login_pass(struct smtp_session *s, u16_t *tx_buf_len)
+{
+  size_t base64_len = smtp_base64_encode(s->tx_buf, SMTP_TX_BUF_LEN,
+    SMTP_PASS(s), strlen(SMTP_PASS(s)));
+  /* @todo: support base64-encoded longer than 64k */
+  LWIP_ASSERT("string too long", base64_len <= 0xffff);
+  LWIP_ASSERT("tx_buf overflow detected", base64_len <= SMTP_TX_BUF_LEN - SMTP_CRLF_LEN);
+  *tx_buf_len = (u16_t)(base64_len + SMTP_CRLF_LEN);
+
+  SMEMCPY(&s->tx_buf[base64_len], SMTP_CRLF, SMTP_CRLF_LEN);
+  s->tx_buf[*tx_buf_len] = 0;
+  return SMTP_AUTH_LOGIN;
+}
+#endif /* SMTP_SUPPORT_AUTH_LOGIN */
+
+/** Prepare MAIL message */
+static enum smtp_session_state
+smtp_prepare_mail(struct smtp_session *s, u16_t *tx_buf_len)
+{
+  char *target = s->tx_buf;
+  LWIP_ASSERT("tx_buf overflow detected", s->from_len <= (SMTP_TX_BUF_LEN - SMTP_CMD_MAIL_1_LEN - SMTP_CMD_MAIL_2_LEN));
+  *tx_buf_len = (u16_t)(SMTP_CMD_MAIL_1_LEN + SMTP_CMD_MAIL_2_LEN + s->from_len);
+  target[*tx_buf_len] = 0;
+
+  SMEMCPY(target, SMTP_CMD_MAIL_1, SMTP_CMD_MAIL_1_LEN);
+  target += SMTP_CMD_MAIL_1_LEN;
+  MEMCPY(target, s->from, s->from_len);
+  target += s->from_len;
+  SMEMCPY(target, SMTP_CMD_MAIL_2, SMTP_CMD_MAIL_2_LEN);
+  return SMTP_MAIL;
+}
+
+/** Prepare RCPT message */
+static enum smtp_session_state
+smtp_prepare_rcpt(struct smtp_session *s, u16_t *tx_buf_len)
+{
+  char *target = s->tx_buf;
+  LWIP_ASSERT("tx_buf overflow detected", s->to_len <= (SMTP_TX_BUF_LEN - SMTP_CMD_RCPT_1_LEN - SMTP_CMD_RCPT_2_LEN));
+  *tx_buf_len = (u16_t)(SMTP_CMD_RCPT_1_LEN + SMTP_CMD_RCPT_2_LEN + s->to_len);
+  target[*tx_buf_len] = 0;
+
+  SMEMCPY(target, SMTP_CMD_RCPT_1, SMTP_CMD_RCPT_1_LEN);
+  target += SMTP_CMD_RCPT_1_LEN;
+  MEMCPY(target, s->to, s->to_len);
+  target += s->to_len;
+  SMEMCPY(target, SMTP_CMD_RCPT_2, SMTP_CMD_RCPT_2_LEN);
+  return SMTP_RCPT;
+}
+
+/** Prepare header of body */
+static enum smtp_session_state
+smtp_prepare_header(struct smtp_session *s, u16_t *tx_buf_len)
+{
+  char *target = s->tx_buf;
+  int len = SMTP_CMD_HEADER_1_LEN + SMTP_CMD_HEADER_2_LEN +
+    SMTP_CMD_HEADER_3_LEN + SMTP_CMD_HEADER_4_LEN + s->from_len + s->to_len +
+    s->subject_len;
+  LWIP_ASSERT("tx_buf overflow detected", len > 0 && len <= SMTP_TX_BUF_LEN);
+  *tx_buf_len = (u16_t)len;
+  target[*tx_buf_len] = 0;
+
+  SMEMCPY(target, SMTP_CMD_HEADER_1, SMTP_CMD_HEADER_1_LEN);
+  target += SMTP_CMD_HEADER_1_LEN;
+  MEMCPY(target, s->from, s->from_len);
+  target += s->from_len;
+  SMEMCPY(target, SMTP_CMD_HEADER_2, SMTP_CMD_HEADER_2_LEN);
+  target += SMTP_CMD_HEADER_2_LEN;
+  MEMCPY(target, s->to, s->to_len);
+  target += s->to_len;
+  SMEMCPY(target, SMTP_CMD_HEADER_3, SMTP_CMD_HEADER_3_LEN);
+  target += SMTP_CMD_HEADER_3_LEN;
+  MEMCPY(target, s->subject, s->subject_len);
+  target += s->subject_len;
+  SMEMCPY(target, SMTP_CMD_HEADER_4, SMTP_CMD_HEADER_4_LEN);
+
+  return SMTP_BODY;
+}
+
+/** Prepare QUIT message */
+static enum smtp_session_state
+smtp_prepare_quit(struct smtp_session *s, u16_t *tx_buf_len)
+{
+  *tx_buf_len = SMTP_CMD_QUIT_LEN;
+  s->tx_buf[*tx_buf_len] = 0;
+  SMEMCPY(s->tx_buf, SMTP_CMD_QUIT, SMTP_CMD_QUIT_LEN);
+  LWIP_ASSERT("tx_buf overflow detected", *tx_buf_len <= SMTP_TX_BUF_LEN);
+  return SMTP_CLOSED;
+}
+
+/** If in state SMTP_BODY, try to send more body data */
+static void
+smtp_send_body(struct smtp_session *s, struct altcp_pcb *pcb)
+{
+  err_t err;
+
+  if (s->state == SMTP_BODY) {
+#if SMTP_BODYDH
+    if (s->bodydh) {
+      smtp_send_body_data_handler(s, pcb);
+    } else
+#endif /* SMTP_BODYDH */
+    {
+      u16_t send_len = (u16_t)(s->body_len - s->body_sent);
+      if (send_len > 0) {
+        u16_t snd_buf = altcp_sndbuf(pcb);
+        if (send_len > snd_buf) {
+          send_len = snd_buf;
+        }
+        if (send_len > 0) {
+          /* try to send something out */
+          err = altcp_write(pcb, &s->body[s->body_sent], (u16_t)send_len, TCP_WRITE_FLAG_COPY);
+          if (err == ERR_OK) {
+            s->timer = SMTP_TIMEOUT_DATABLOCK;
+            s->body_sent = (u16_t)(s->body_sent + send_len);
+            if (s->body_sent < s->body_len) {
+              LWIP_DEBUGF(SMTP_DEBUG_STATE, ("smtp_send_body: %d of %d bytes written\n",
+                s->body_sent, s->body_len));
+            }
+          }
+        }
+      }
+    }
+    if (s->body_sent == s->body_len) {
+      /* the whole body has been written, write last line */
+      LWIP_DEBUGF(SMTP_DEBUG_STATE, ("smtp_send_body: body completely written (%d bytes), appending end-of-body\n",
+        s->body_len));
+      err = altcp_write(pcb, SMTP_CMD_BODY_FINISHED, SMTP_CMD_BODY_FINISHED_LEN, 0);
+      if (err == ERR_OK) {
+        s->timer = SMTP_TIMEOUT_DATATERM;
+        LWIP_DEBUGF(SMTP_DEBUG_STATE, ("smtp_send_body: end-of-body written, changing state to %s\n",
+          smtp_state_str[SMTP_QUIT]));
+        /* last line written, change state, wait for confirmation */
+        s->state = SMTP_QUIT;
+      }
+    }
+  }
+}
+
+/** State machine-like implementation of an SMTP client.
+ */
+static void
+smtp_process(void *arg, struct altcp_pcb *pcb, struct pbuf *p)
+{
+  struct smtp_session* s = (struct smtp_session*)arg;
+  u16_t response_code = 0;
+  u16_t tx_buf_len = 0;
+  enum smtp_session_state next_state;
+
+  if (arg == NULL) {
+    /* already closed SMTP connection */
+    if (p != NULL) {
+      LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("Received %d bytes after closing: %s\n",
+        p->tot_len, smtp_pbuf_str(p)));
+      pbuf_free(p);
+    }
+    return;
+  }
+
+  next_state = s->state;
+
+  if (p != NULL) {
+    /* received data */
+    if (s->p == NULL) {
+      s->p = p;
+    } else {
+      pbuf_cat(s->p, p);
+    }
+  } else {
+    /* idle timer, close connection if timed out */
+    if (s->timer == 0) {
+      LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("smtp_process: connection timed out, closing\n"));
+      smtp_close(s, pcb, SMTP_RESULT_ERR_TIMEOUT, 0, ERR_TIMEOUT);
+      return;
+    }
+    if (s->state == SMTP_BODY) {
+      smtp_send_body(s, pcb);
+      return;
+    }
+  }
+  response_code = smtp_is_response(s);
+  if (response_code) {
+    LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_process: received response code: %d\n", response_code));
+    if (smtp_is_response_finished(s) != ERR_OK) {
+      LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_process: partly received response code: %d\n", response_code));
+      /* wait for next packet to complete the respone */
+      return;
+    }
+  } else {
+    if (s->p != NULL) {
+      LWIP_DEBUGF(SMTP_DEBUG_WARN, ("smtp_process: unknown data received (%s)\n",
+        smtp_pbuf_str(s->p)));
+      pbuf_free(s->p);
+      s->p = NULL;
+    }
+    return;
+  }
+
+  switch(s->state)
+  {
+  case(SMTP_NULL):
+    /* wait for 220 */
+    if (response_code == 220) {
+      /* then send EHLO */
+      next_state = smtp_prepare_helo(s, &tx_buf_len, pcb);
+    }
+    break;
+  case(SMTP_HELO):
+    /* wait for 250 */
+    if (response_code == 250) {
+#if SMTP_SUPPORT_AUTH_PLAIN || SMTP_SUPPORT_AUTH_LOGIN
+      /* then send AUTH or MAIL */
+      next_state = smtp_prepare_auth_or_mail(s, &tx_buf_len);
+    }
+    break;
+  case(SMTP_AUTH_LOGIN):
+  case(SMTP_AUTH_PLAIN):
+    /* wait for 235 */
+    if (response_code == 235) {
+#endif /* SMTP_SUPPORT_AUTH_PLAIN || SMTP_SUPPORT_AUTH_LOGIN */
+      /* send MAIL */
+      next_state = smtp_prepare_mail(s, &tx_buf_len);
+    }
+    break;
+#if SMTP_SUPPORT_AUTH_LOGIN
+  case(SMTP_AUTH_LOGIN_UNAME):
+    /* wait for 334 Username */
+    if (response_code == 334) {
+      if (pbuf_strstr(s->p, SMTP_RESP_LOGIN_UNAME) != 0xFFFF) {
+        /* send username */
+        next_state = smtp_prepare_auth_login_uname(s, &tx_buf_len);
+      }
+    }
+    break;
+  case(SMTP_AUTH_LOGIN_PASS):
+    /* wait for 334 Password */
+    if (response_code == 334) {
+      if (pbuf_strstr(s->p, SMTP_RESP_LOGIN_PASS) != 0xFFFF) {
+        /* send username */
+        next_state = smtp_prepare_auth_login_pass(s, &tx_buf_len);
+      }
+    }
+    break;
+#endif /* SMTP_SUPPORT_AUTH_LOGIN */
+  case(SMTP_MAIL):
+    /* wait for 250 */
+    if (response_code == 250) {
+      /* send RCPT */
+      next_state = smtp_prepare_rcpt(s, &tx_buf_len);
+    }
+    break;
+  case(SMTP_RCPT):
+    /* wait for 250 */
+    if (response_code == 250) {
+      /* send DATA */
+      SMEMCPY(s->tx_buf, SMTP_CMD_DATA, SMTP_CMD_DATA_LEN);
+      tx_buf_len = SMTP_CMD_DATA_LEN;
+      next_state = SMTP_DATA;
+    }
+    break;
+  case(SMTP_DATA):
+    /* wait for 354 */
+    if (response_code == 354) {
+      /* send email header */
+      next_state = smtp_prepare_header(s, &tx_buf_len);
+    }
+    break;
+  case(SMTP_BODY):
+    /* nothing to be done here, handled somewhere else */
+    break;
+  case(SMTP_QUIT):
+    /* wait for 250 */
+    if (response_code == 250) {
+      /* send QUIT */
+      next_state = smtp_prepare_quit(s, &tx_buf_len);
+    }
+    break;
+  case(SMTP_CLOSED):
+    /* nothing to do, wait for connection closed from server */
+    return;
+  default:
+    LWIP_DEBUGF(SMTP_DEBUG_SERIOUS, ("Invalid state: %d/%s\n", (int)s->state,
+      smtp_state_str[s->state]));
+    break;
+  }
+  if (s->state == next_state) {
+    LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("smtp_process[%s]: unexpected response_code, closing: %d (%s)\n",
+      smtp_state_str[s->state], response_code, smtp_pbuf_str(s->p)));
+    /* close connection */
+    smtp_close(s, pcb, SMTP_RESULT_ERR_SVR_RESP, response_code, ERR_OK);
+    return;
+  }
+  if (tx_buf_len > 0) {
+    SMTP_TX_BUF_MAX(tx_buf_len);
+    if (altcp_write(pcb, s->tx_buf, tx_buf_len, TCP_WRITE_FLAG_COPY) == ERR_OK) {
+      LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_process[%s]: received command %d (%s)\n",
+        smtp_state_str[s->state], response_code, smtp_pbuf_str(s->p)));
+      LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_process[%s]: sent %"U16_F" bytes: \"%s\"\n",
+        smtp_state_str[s->state], tx_buf_len, s->tx_buf));
+      s->timer = SMTP_TIMEOUT;
+      pbuf_free(s->p);
+      s->p = NULL;
+      LWIP_DEBUGF(SMTP_DEBUG_STATE, ("smtp_process: changing state from %s to %s\n",
+        smtp_state_str[s->state], smtp_state_str[next_state]));
+      s->state = next_state;
+      if (next_state == SMTP_BODY) {
+        /* try to stream-send body data right now */
+        smtp_send_body(s, pcb);
+      } else if (next_state == SMTP_CLOSED) {
+        /* sent out all data, delete structure */
+        altcp_arg(pcb, NULL);
+        smtp_free(s, SMTP_RESULT_OK, 0, ERR_OK);
+      }
+    }
+  }
+}
+
+#if SMTP_BODYDH
+/** Elementary sub-function to send data
+ *
+ * @returns: BDHALLDATASENT all data has been written
+ *           BDHSOMEDATASENT some data has been written
+ *           0 no data has been written
+ */
+static int
+smtp_send_bodyh_data(struct altcp_pcb *pcb, const char **from, u16_t *howmany)
+{
+  err_t err;
+  u16_t len = *howmany;
+
+  len = (u16_t)LWIP_MIN(len, altcp_sndbuf(pcb));
+  err = altcp_write(pcb, *from, len, TCP_WRITE_FLAG_COPY);
+  if (err == ERR_OK) {
+    *from += len;
+    if ((*howmany -= len) > 0) {
+      return BDHSOMEDATASENT;
+    }
+    return BDHALLDATASENT;
+  }
+  return 0;
+}
+
+/** Same as smtp_send_mail_static, but uses a callback function to send body data
+ */
+err_t
+smtp_send_mail_bodycback(const char *from, const char* to, const char* subject,
+  smtp_bodycback_fn bodycback_fn, smtp_result_fn callback_fn, void* callback_arg)
+{
+  struct smtp_session* s;
+  size_t len;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  s = (struct smtp_session*)SMTP_STATE_MALLOC(sizeof(struct smtp_session));
+  if (s == NULL) {
+    return ERR_MEM;
+  }
+  memset(s, 0, sizeof(struct smtp_session));
+  s->bodydh = (struct smtp_bodydh_state*)SMTP_BODYDH_MALLOC(sizeof(struct smtp_bodydh_state));
+  if (s->bodydh == NULL) {
+    SMTP_STATE_FREE(s);
+    return ERR_MEM;
+  }
+  memset(s->bodydh, 0, sizeof(struct smtp_bodydh_state));
+  /* initialize the structure */
+  s->from = from;
+  len = strlen(from);
+  LWIP_ASSERT("string is too long", len <= 0xffff);
+  s->from_len = (u16_t)len;
+  s->to = to;
+  len = strlen(to);
+  LWIP_ASSERT("string is too long", len <= 0xffff);
+  s->to_len = (u16_t)len;
+  s->subject = subject;
+  len = strlen(subject);
+  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;
+  s->bodydh->state = BDH_SENDING;
+  /* call the actual implementation of this function */
+  return smtp_send_mail_alloced(s);
+}
+
+static void
+smtp_send_body_data_handler(struct smtp_session *s, struct altcp_pcb *pcb)
+{
+  struct smtp_bodydh_state *bdh;
+  int res = 0, ret;
+  LWIP_ASSERT("s != NULL", s != NULL);
+  bdh = s->bodydh;
+  LWIP_ASSERT("bodydh != NULL", bdh != NULL);
+
+  /* resume any leftovers from prior memory constraints */
+  if (s->body_len) {
+    LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_send_body_data_handler: resume\n"));
+    if((res = smtp_send_bodyh_data(pcb, (const char **)&s->body, &s->body_len))
+        != BDHALLDATASENT) {
+      s->body_sent = s->body_len - 1;
+      return;
+    }
+  }
+  ret = res;
+  /* all data on buffer has been queued, resume execution */
+  if (bdh->state == BDH_SENDING) {
+    LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_send_body_data_handler: run\n"));
+    do {
+      ret |= res; /* remember if we once queued something to send */
+      bdh->exposed.length = 0;
+      if (bdh->callback_fn(s->callback_arg, &bdh->exposed) == BDH_DONE) {
+        bdh->state = BDH_STOP;
+      }
+      s->body = bdh->exposed.buffer;
+      s->body_len = bdh->exposed.length;
+      LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_send_body_data_handler: trying to send %u bytes\n", (unsigned int)s->body_len));
+    } while (s->body_len &&
+            ((res = smtp_send_bodyh_data(pcb, (const char **)&s->body, &s->body_len)) == BDHALLDATASENT)
+            && (bdh->state != BDH_STOP));
+  }
+  if ((bdh->state != BDH_SENDING) && (ret != BDHSOMEDATASENT)) {
+    LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_send_body_data_handler: stop\n"));
+    s->body_sent = s->body_len;
+  } else {
+    LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_send_body_data_handler: pause\n"));
+    s->body_sent = s->body_len - 1;
+  }
+}
+#endif /* SMTP_BODYDH */
+
+#endif /* LWIP_TCP && LWIP_CALLBACK_API */
diff --git a/src/apps/snmp/snmp_asn1.c b/src/apps/snmp/snmp_asn1.c
index f35b760..6df34db 100644
--- a/src/apps/snmp/snmp_asn1.c
+++ b/src/apps/snmp/snmp_asn1.c
@@ -54,7 +54,7 @@
  * @return ERR_OK if successful, ERR_ARG if we can't (or won't) encode
  */
 err_t
-snmp_ans1_enc_tlv(struct snmp_pbuf_stream* pbuf_stream, struct snmp_asn1_tlv* tlv)
+snmp_ans1_enc_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv)
 {
   u8_t data;
   u8_t length_bytes_required;
@@ -130,7 +130,7 @@
  * @return ERR_OK if successful, ERR_ARG if we can't (or won't) encode
  */
 err_t
-snmp_asn1_enc_raw(struct snmp_pbuf_stream* pbuf_stream, const u8_t *raw, u16_t raw_len)
+snmp_asn1_enc_raw(struct snmp_pbuf_stream *pbuf_stream, const u8_t *raw, u16_t raw_len)
 {
   PBUF_OP_EXEC(snmp_pbuf_stream_writebuf(pbuf_stream, raw, raw_len));
 
@@ -148,7 +148,7 @@
  * @see snmp_asn1_enc_u32t_cnt()
  */
 err_t
-snmp_asn1_enc_u32t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, u32_t value)
+snmp_asn1_enc_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u32_t value)
 {
   if (octets_needed > 5) {
     return ERR_ARG;
@@ -169,48 +169,6 @@
 
   return ERR_OK;
 }
-
-/**
- * Encodes u64_t (counter64) into a pbuf chained ASN1 msg.
- *
- * @param pbuf_stream points to a pbuf stream
- * @param octets_needed encoding length (from snmp_asn1_enc_u32t_cnt())
- * @param value is the host order u32_t value to be encoded
- * @return ERR_OK if successful, ERR_ARG if we can't (or won't) encode
- *
- * @see snmp_asn1_enc_u64t_cnt()
- */
-err_t
-snmp_asn1_enc_u64t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, const u32_t* value)
-{
-  if (octets_needed > 9) {
-    return ERR_ARG;
-  }
-  if (octets_needed == 9) {
-    /* not enough bits in 'value' add leading 0x00 */
-    PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, 0x00));
-    octets_needed--;
-  }
-
-  while (octets_needed > 4) {
-    octets_needed--;
-    PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)(*value >> ((octets_needed-4) << 3))));
-  }
-
-  /* skip to low u32 */
-  value++;
-
-  while (octets_needed > 1) {
-    octets_needed--;
-    PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)(*value >> (octets_needed << 3))));
-  }
-
-  /* always write at least one octet (also in case of value == 0) */
-  PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)(*value)));
-
-  return ERR_OK;
-}
-
 /**
  * Encodes s32_t integer into a pbuf chained ASN1 msg.
  *
@@ -222,7 +180,7 @@
  * @see snmp_asn1_enc_s32t_cnt()
  */
 err_t
-snmp_asn1_enc_s32t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, s32_t value)
+snmp_asn1_enc_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, s32_t value)
 {
   while (octets_needed > 1) {
     octets_needed--;
@@ -245,7 +203,7 @@
  * @return ERR_OK if successful, ERR_ARG if we can't (or won't) encode
  */
 err_t
-snmp_asn1_enc_oid(struct snmp_pbuf_stream* pbuf_stream, const u32_t *oid, u16_t oid_len)
+snmp_asn1_enc_oid(struct snmp_pbuf_stream *pbuf_stream, const u32_t *oid, u16_t oid_len)
 {
   if (oid_len > 1) {
     /* write compressed first two sub id's */
@@ -330,31 +288,6 @@
 }
 
 /**
- * Returns octet count for an u64_t.
- *
- * @param value value to be encoded
- * @param octets_needed points to the return value
- *
- * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded
- * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value
- * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!!
- */
-void
-snmp_asn1_enc_u64t_cnt(const u32_t *value, u16_t *octets_needed)
-{
-  /* check if high u32 is 0 */
-  if (*value == 0x00) {
-    /* only low u32 is important */
-    value++;
-    snmp_asn1_enc_u32t_cnt(*value, octets_needed);
-  } else {
-    /* low u32 does not matter for length determination */
-    snmp_asn1_enc_u32t_cnt(*value, octets_needed);
-    *octets_needed = *octets_needed + 4; /* add the 4 bytes of low u32 */
-  }
-}
-
-/**
  * Returns octet count for an s32_t.
  *
  * @param value value to be encoded
@@ -420,7 +353,7 @@
  * @return ERR_OK if successful, ERR_VAL if we can't decode
  */
 err_t
-snmp_asn1_dec_tlv(struct snmp_pbuf_stream* pbuf_stream, struct snmp_asn1_tlv* tlv)
+snmp_asn1_dec_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv)
 {
   u8_t data;
 
@@ -442,6 +375,9 @@
     tlv->value_len  = data;
   } else if (data > 0x80) { /* long form */
     u8_t length_bytes = data - 0x80;
+    if (length_bytes > pbuf_stream->length) {
+      return ERR_VAL;
+    }
     tlv->length_len = length_bytes + 1; /* this byte + defined number of length bytes following */
     tlv->value_len = 0;
 
@@ -510,60 +446,6 @@
 }
 
 /**
- * Decodes large positive integer (counter64) into 2x u32_t.
- *
- * @param pbuf_stream points to a pbuf stream
- * @param len length of the coded integer field
- * @param value return host order integer
- * @return ERR_OK if successful, ERR_ARG if we can't (or won't) decode
- *
- * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded
- * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value
- * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!!
- */
-err_t
-snmp_asn1_dec_u64t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value)
-{
-  u8_t data;
-
-  if (len <= 4) {
-    /* high u32 is 0 */
-    *value = 0;
-    /* directly skip to low u32 */
-    value++;
-  }
-
-  if ((len > 0) && (len <= 9)) {
-    PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
-
-    /* expecting sign bit to be zero, only unsigned please! */
-    if (((len == 9) && (data == 0x00)) || ((len < 9) && ((data & 0x80) == 0))) {
-      *value = data;
-      len--;
-
-      while (len > 0) {
-        PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
-
-        if (len == 4) {
-          /* skip to low u32 */
-          value++;
-          *value = 0;
-        } else {
-          *value <<= 8;
-        }
-
-        *value |= data;
-        len--;
-      }
-
-      return ERR_OK;
-    }
-  }
-
-  return ERR_VAL;
-}
-
-/**
  * Decodes integer into s32_t.
  *
  * @param pbuf_stream points to a pbuf stream
@@ -576,51 +458,26 @@
 err_t
 snmp_asn1_dec_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, s32_t *value)
 {
-#if BYTE_ORDER == LITTLE_ENDIAN
-  u8_t *lsb_ptr = (u8_t*)value;
-#endif
-#if BYTE_ORDER == BIG_ENDIAN
-  u8_t *lsb_ptr = (u8_t*)value + sizeof(s32_t) - 1;
-#endif
-  u8_t sign;
   u8_t data;
 
   if ((len > 0) && (len < 5)) {
     PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
-    len--;
 
     if (data & 0x80) {
       /* negative, start from -1 */
       *value = -1;
-      sign = 1;
-      *lsb_ptr &= data;
+      *value = (*value << 8) | data;
     } else {
       /* positive, start from 0 */
-      *value = 0;
-      sign = 0;
-      *lsb_ptr |= data;
+      *value = data;
     }
-
-    /* OR/AND octets with value */
+    len--;
+    /* shift in the remaining value */
     while (len > 0) {
       PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
+      *value = (*value << 8) | data;
       len--;
-
-#if BYTE_ORDER == LITTLE_ENDIAN
-      *value <<= 8;
-#endif
-#if BYTE_ORDER == BIG_ENDIAN
-      *value >>= 8;
-#endif
-
-      if (sign) {
-        *lsb_ptr |= 255;
-        *lsb_ptr &= data;
-      } else {
-        *lsb_ptr |= data;
-      }
     }
-
     return ERR_OK;
   }
 
@@ -638,7 +495,7 @@
  * @return ERR_OK if successful, ERR_ARG if we can't (or won't) decode
  */
 err_t
-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)
+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)
 {
   u32_t *oid_ptr;
   u8_t data;
@@ -729,7 +586,7 @@
  * @return ERR_OK if successful, ERR_ARG if we can't (or won't) decode
  */
 err_t
-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)
+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)
 {
   if (len > buf_max_len) {
     /* not enough dst space */
@@ -746,4 +603,102 @@
   return ERR_OK;
 }
 
+#if LWIP_HAVE_INT64
+/**
+ * Returns octet count for an u64_t.
+ *
+ * @param value value to be encoded
+ * @param octets_needed points to the return value
+ *
+ * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded
+ * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value
+ * of 0xFFFFFFFFFFFFFFFF is preceded with 0x00 and the length is 9 octets!!
+ */
+void
+snmp_asn1_enc_u64t_cnt(u64_t value, u16_t *octets_needed)
+{
+  /* check if high u32 is 0 */
+  if ((value >> 32) == 0) {
+    /* only low u32 is important */
+    snmp_asn1_enc_u32t_cnt((u32_t)value, octets_needed);
+  } else {
+    /* low u32 does not matter for length determination */
+    snmp_asn1_enc_u32t_cnt((u32_t)(value >> 32), octets_needed);
+    *octets_needed = *octets_needed + 4; /* add the 4 bytes of low u32 */
+  }
+}
+
+/**
+ * Decodes large positive integer (counter64) into 2x u32_t.
+ *
+ * @param pbuf_stream points to a pbuf stream
+ * @param len length of the coded integer field
+ * @param value return 64 bit integer
+ * @return ERR_OK if successful, ERR_ARG if we can't (or won't) decode
+ *
+ * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded
+ * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value
+ * of 0xFFFFFFFFFFFFFFFF is preceded with 0x00 and the length is 9 octets!!
+ */
+err_t
+snmp_asn1_dec_u64t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u64_t *value)
+{
+  u8_t data;
+
+  if ((len > 0) && (len <= 9)) {
+    PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
+
+    /* expecting sign bit to be zero, only unsigned please! */
+    if (((len == 9) && (data == 0x00)) || ((len < 9) && ((data & 0x80) == 0))) {
+      *value = data;
+      len--;
+
+      while (len > 0) {
+        PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));
+        *value <<= 8;
+        *value |= data;
+        len--;
+      }
+
+      return ERR_OK;
+    }
+  }
+
+  return ERR_VAL;
+}
+
+/**
+ * Encodes u64_t (counter64) into a pbuf chained ASN1 msg.
+ *
+ * @param pbuf_stream points to a pbuf stream
+ * @param octets_needed encoding length (from snmp_asn1_enc_u32t_cnt())
+ * @param value is the value to be encoded
+ * @return ERR_OK if successful, ERR_ARG if we can't (or won't) encode
+ *
+ * @see snmp_asn1_enc_u64t_cnt()
+ */
+err_t
+snmp_asn1_enc_u64t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u64_t value)
+{
+  if (octets_needed > 9) {
+    return ERR_ARG;
+  }
+  if (octets_needed == 9) {
+    /* not enough bits in 'value' add leading 0x00 */
+    PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, 0x00));
+    octets_needed--;
+  }
+
+  while (octets_needed > 1) {
+    octets_needed--;
+    PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)(value >> (octets_needed << 3))));
+  }
+
+  /* always write at least one octet (also in case of value == 0) */
+  PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)(value)));
+
+  return ERR_OK;
+}
+#endif
+
 #endif /* LWIP_SNMP */
diff --git a/src/apps/snmp/snmp_asn1.h b/src/apps/snmp/snmp_asn1.h
index ec50d8c..87c0973 100644
--- a/src/apps/snmp/snmp_asn1.h
+++ b/src/apps/snmp/snmp_asn1.h
@@ -57,19 +57,21 @@
 #define SNMP_ASN1_DATATYPE_MASK     0x1F
 #define SNMP_ASN1_DATATYPE_EXTENDED 0x1F /* DataType indicating that datatype is encoded in following bytes */
 
-/* context specific (SNMP) tags (from SNMP spec. RFC1157) */
+/* context specific (SNMP) tags (from SNMP spec. RFC1157 and RFC1905) */
 #define SNMP_ASN1_CONTEXT_PDU_GET_REQ      0
 #define SNMP_ASN1_CONTEXT_PDU_GET_NEXT_REQ 1
 #define SNMP_ASN1_CONTEXT_PDU_GET_RESP     2
 #define SNMP_ASN1_CONTEXT_PDU_SET_REQ      3
 #define SNMP_ASN1_CONTEXT_PDU_TRAP         4
 #define SNMP_ASN1_CONTEXT_PDU_GET_BULK_REQ 5
+#define SNMP_ASN1_CONTEXT_PDU_INFORM_REQ   6
+#define SNMP_ASN1_CONTEXT_PDU_V2_TRAP      7
+#define SNMP_ASN1_CONTEXT_PDU_REPORT       8
 
 #define SNMP_ASN1_CONTEXT_VARBIND_NO_SUCH_OBJECT      0
 #define SNMP_ASN1_CONTEXT_VARBIND_END_OF_MIB_VIEW     2
 
-struct snmp_asn1_tlv
-{
+struct snmp_asn1_tlv {
   u8_t  type;       /* only U8 because extended types are not specified by SNMP */
   u8_t  type_len;   /* encoded length of 'type' field (normally 1) */
   u8_t  length_len; /* indicates how many bytes are required to encode the 'value_len' field */
@@ -79,25 +81,28 @@
 #define SNMP_ASN1_TLV_LENGTH(tlv) ((tlv).type_len + (tlv).length_len + (tlv).value_len)
 #define SNMP_ASN1_SET_TLV_PARAMS(tlv, type_, length_len_, value_len_) do { (tlv).type = (type_); (tlv).type_len = 0; (tlv).length_len = (length_len_); (tlv).value_len = (value_len_); } while (0);
 
-err_t snmp_asn1_dec_tlv(struct snmp_pbuf_stream* pbuf_stream, struct snmp_asn1_tlv* tlv);
+err_t snmp_asn1_dec_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv);
 err_t snmp_asn1_dec_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value);
-err_t snmp_asn1_dec_u64t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value);
 err_t snmp_asn1_dec_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, s32_t *value);
-err_t 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);
-err_t 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);
+err_t 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);
+err_t 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);
 
-err_t snmp_ans1_enc_tlv(struct snmp_pbuf_stream* pbuf_stream, struct snmp_asn1_tlv* tlv);
+err_t snmp_ans1_enc_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv);
 
 void snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed);
 void snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed);
-void snmp_asn1_enc_u64t_cnt(const u32_t *value, u16_t *octets_needed);
 void snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed);
 void snmp_asn1_enc_oid_cnt(const u32_t *oid, u16_t oid_len, u16_t *octets_needed);
-err_t snmp_asn1_enc_oid(struct snmp_pbuf_stream* pbuf_stream, const u32_t *oid, u16_t oid_len);
-err_t snmp_asn1_enc_s32t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, s32_t value);
-err_t snmp_asn1_enc_u32t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, u32_t value);
-err_t snmp_asn1_enc_u64t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, const u32_t* value);
-err_t snmp_asn1_enc_raw(struct snmp_pbuf_stream* pbuf_stream, const u8_t *raw, u16_t raw_len);
+err_t snmp_asn1_enc_oid(struct snmp_pbuf_stream *pbuf_stream, const u32_t *oid, u16_t oid_len);
+err_t snmp_asn1_enc_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, s32_t value);
+err_t snmp_asn1_enc_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u32_t value);
+err_t snmp_asn1_enc_raw(struct snmp_pbuf_stream *pbuf_stream, const u8_t *raw, u16_t raw_len);
+
+#if LWIP_HAVE_INT64
+err_t snmp_asn1_dec_u64t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u64_t *value);
+void snmp_asn1_enc_u64t_cnt(u64_t value, u16_t *octets_needed);
+err_t snmp_asn1_enc_u64t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u64_t value);
+#endif
 
 #ifdef __cplusplus
 }
diff --git a/src/apps/snmp/snmp_core.c b/src/apps/snmp/snmp_core.c
index c041833..987f106 100644
--- a/src/apps/snmp/snmp_core.c
+++ b/src/apps/snmp/snmp_core.c
@@ -34,24 +34,24 @@
 */
 
 /**
- * @defgroup snmp SNMPv2c agent
+ * @defgroup snmp SNMPv2c/v3 agent
  * @ingroup apps
- * SNMPv2c compatible agent\n
+ * 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
  * The agent implements the most important MIB2 MIBs including IPv6 support
  * (interfaces, UDP, TCP, SNMP, ICMP, SYSTEM). IP MIB is an older version
- * whithout IPv6 statistics (TODO).\n
+ * without IPv6 statistics (TODO).\n
  * Rewritten by Martin Hentschel <info@cl-soft.de> and
  * Dirk Ziegelmeier <dziegel@gmx.de>\n
- * Work on SNMPv3 has started, but is not finished.\n
  *
  * 0 Agent Capabilities
  * ====================
- * 
+ *
  * Features:
  * ---------
  * - SNMPv2c support.
+ * - SNMPv3 support (a port to ARM mbedtls is provided, LWIP_SNMP_V3_MBEDTLS option).
  * - Low RAM usage - no memory pools, stack only.
  * - MIB2 implementation is separated from SNMP stack.
  * - Support for multiple MIBs (snmp_set_mibs() call) - e.g. for private MIB.
@@ -66,7 +66,7 @@
  * - Simplified thread sync support for MIBs - useful when MIBs
  *   need to access variables shared with other threads where no locking is
  *   possible. Used in MIB2 to access lwIP stats from lwIP thread.
- * 
+ *
  * MIB compiler (code generator):
  * ------------------------------
  * - Provided in lwIP contrib repository.
@@ -78,92 +78,100 @@
  * - 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.
- * 
+ *
  * Notes:
  * ------
  * - Stack and MIB compiler were used to implement a Profinet device.
  *   Compiled/implemented MIBs: LLDP-MIB, LLDP-EXT-DOT3-MIB, LLDP-EXT-PNO-MIB.
- * 
+ *
  * SNMPv1 per RFC1157 and SNMPv2c per RFC 3416
  * -------------------------------------------
  *   Note the S in SNMP stands for "Simple". Note that "Simple" is
  *   relative. SNMP is simple compared to the complex ISO network
  *   management protocols CMIP (Common Management Information Protocol)
  *   and CMOT (CMip Over Tcp).
- * 
+ *
+ * SNMPv3
+ * ------
+ * When SNMPv3 is used, several functions from snmpv3.h must be implemented
+ * by the user. This is mainly user management and persistence handling.
+ * The sample provided in lwip-contrib is insecure, don't use it in production
+ * systems, especially the missing persistence for engine boots variable
+ * simplifies replay attacks.
+ *
  * MIB II
  * ------
  *   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.
- * 
+ *
  *   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.
- * 
+ *
  *   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.
- * 
+ *
  *   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).
- * 
+ *
  * Loading additional MIBs
  * -----------------------
  *   MIBs can only be added in compile-time, not in run-time.
- *  
- * 
+ *
+ *
  * 1 Building the Agent
  * ====================
  * First of all you'll need to add the following define
  * to your local lwipopts.h:
  * \#define LWIP_SNMP               1
- * 
+ *
  * and add the source files your makefile.
- * 
+ *
  * Note you'll might need to adapt you network driver to update
  * the mib2 variables for your interface.
- * 
+ *
  * 2 Running the Agent
  * ===================
  * The following function calls must be made in your program to
  * actually get the SNMP agent running.
- * 
+ *
  * Before starting the agent you should supply pointers
  * for sysContact, sysLocation, and snmpEnableAuthenTraps.
  * You can do this by calling
- * 
+ *
  * - snmp_mib2_set_syscontact()
  * - snmp_mib2_set_syslocation()
  * - snmp_set_auth_traps_enabled()
- * 
- * You can register a callback which is called on successful write access: 
+ *
+ * You can register a callback which is called on successful write access:
  * snmp_set_write_callback().
- * 
+ *
  * Additionally you may want to set
- * 
+ *
  * - snmp_mib2_set_sysdescr()
  * - snmp_set_device_enterprise_oid()
  * - snmp_mib2_set_sysname()
- * 
+ *
  * Also before starting the agent you need to setup
  * one or more trap destinations using these calls:
- * 
+ *
  * - snmp_trap_dst_enable()
  * - snmp_trap_dst_ip_set()
- * 
+ *
  * If you need more than MIB2, set the MIBs you want to use
  * by snmp_set_mibs().
- * 
+ *
  * Finally, enable the agent by calling snmp_init()
  *
  * @defgroup snmp_core Core
  * @ingroup snmp
- * 
+ *
  * @defgroup snmp_traps Traps
  * @ingroup snmp
  */
@@ -180,31 +188,39 @@
 
 
 #if (LWIP_SNMP && (SNMP_TRAP_DESTINATIONS<=0))
-  #error "If you want to use SNMP, you have to define SNMP_TRAP_DESTINATIONS>=1 in your lwipopts.h"
+#error "If you want to use SNMP, you have to define SNMP_TRAP_DESTINATIONS>=1 in your lwipopts.h"
 #endif
 #if (!LWIP_UDP && LWIP_SNMP)
-  #error "If you want to use SNMP, you have to define LWIP_UDP=1 in your lwipopts.h"
+#error "If you want to use SNMP, you have to define LWIP_UDP=1 in your lwipopts.h"
+#endif
+#if SNMP_MAX_OBJ_ID_LEN > 255
+#error "SNMP_MAX_OBJ_ID_LEN must fit into an u8_t"
 #endif
 
 struct snmp_statistics snmp_stats;
 static const struct snmp_obj_id  snmp_device_enterprise_oid_default = {SNMP_DEVICE_ENTERPRISE_OID_LEN, SNMP_DEVICE_ENTERPRISE_OID};
-static const struct snmp_obj_id* snmp_device_enterprise_oid         = &snmp_device_enterprise_oid_default;
+static const struct snmp_obj_id *snmp_device_enterprise_oid         = &snmp_device_enterprise_oid_default;
 
 const u32_t snmp_zero_dot_zero_values[] = { 0, 0 };
 const struct snmp_obj_id_const_ref snmp_zero_dot_zero = { LWIP_ARRAYSIZE(snmp_zero_dot_zero_values), snmp_zero_dot_zero_values };
 
-
-#if SNMP_LWIP_MIB2
+#if SNMP_LWIP_MIB2 && LWIP_SNMP_V3
 #include "lwip/apps/snmp_mib2.h"
-static const struct snmp_mib* const default_mibs[] = { &mib2 };
-static u8_t snmp_num_mibs                          = 1;
+#include "lwip/apps/snmp_snmpv2_framework.h"
+#include "lwip/apps/snmp_snmpv2_usm.h"
+static const struct snmp_mib *const default_mibs[] = { &mib2, &snmpframeworkmib, &snmpusmmib };
+static u8_t snmp_num_mibs                          = LWIP_ARRAYSIZE(default_mibs);
+#elif SNMP_LWIP_MIB2
+#include "lwip/apps/snmp_mib2.h"
+static const struct snmp_mib *const default_mibs[] = { &mib2 };
+static u8_t snmp_num_mibs                          = LWIP_ARRAYSIZE(default_mibs);
 #else
-static const struct snmp_mib* const default_mibs[] = { NULL };
+static const struct snmp_mib *const default_mibs[] = { NULL };
 static u8_t snmp_num_mibs                          = 0;
 #endif
 
 /* List of known mibs */
-static struct snmp_mib const * const *snmp_mibs = default_mibs;
+static struct snmp_mib const *const *snmp_mibs = default_mibs;
 
 /**
  * @ingroup snmp_core
@@ -219,6 +235,7 @@
 void
 snmp_set_mibs(const struct snmp_mib **mibs, u8_t num_mibs)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("mibs pointer must be != NULL", (mibs != NULL));
   LWIP_ASSERT("num_mibs pointer must be != 0", (num_mibs != 0));
   snmp_mibs     = mibs;
@@ -232,15 +249,16 @@
  * The 'device enterprise oid' shall point to an OID located under 'private-enterprises' branch (1.3.6.1.4.1.XXX). If a vendor
  * wants to provide a custom object there, he has to get its own enterprise oid from IANA (http://www.iana.org). It
  * is not allowed to use LWIP enterprise ID!
- * In order to identify a specific device it is recommended to create a dedicated OID for each device type under its own 
+ * In order to identify a specific device it is recommended to create a dedicated OID for each device type under its own
  * enterprise oid.
  * e.g.
  * device a > 1.3.6.1.4.1.XXX(ent-oid).1(devices).1(device a)
  * device b > 1.3.6.1.4.1.XXX(ent-oid).1(devices).2(device b)
  * for more details see description of 'sysObjectID' field in RFC1213-MIB
  */
-void snmp_set_device_enterprise_oid(const struct snmp_obj_id* device_enterprise_oid)
+void snmp_set_device_enterprise_oid(const struct snmp_obj_id *device_enterprise_oid)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   if (device_enterprise_oid == NULL) {
     snmp_device_enterprise_oid = &snmp_device_enterprise_oid_default;
   } else {
@@ -250,10 +268,11 @@
 
 /**
  * @ingroup snmp_core
- * Get 'device enterprise oid' 
+ * Get 'device enterprise oid'
  */
-const struct snmp_obj_id* snmp_get_device_enterprise_oid(void)
+const struct snmp_obj_id *snmp_get_device_enterprise_oid(void)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   return snmp_device_enterprise_oid;
 }
 
@@ -496,16 +515,16 @@
 u8_t
 snmp_oid_to_ip_port(const u32_t *oid, u8_t oid_len, ip_addr_t *ip, u16_t *port)
 {
-  u8_t idx = 0;
+  u8_t idx;
 
   /* InetAddressType + InetAddress */
-  idx += snmp_oid_to_ip(&oid[idx], oid_len-idx, ip);
+  idx = snmp_oid_to_ip(&oid[0], oid_len, ip);
   if (idx == 0) {
     return 0;
   }
 
   /* InetPortNumber */
-  if (oid_len < (idx+1)) {
+  if (oid_len < (idx + 1)) {
     return 0;
   }
   if (oid[idx] > 0xffff) {
@@ -521,14 +540,14 @@
 
 /**
  * Assign an OID to struct snmp_obj_id
- * @param target Assignment target 
+ * @param target Assignment target
  * @param oid OID
  * @param oid_len OID length
  */
 void
-snmp_oid_assign(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len)
+snmp_oid_assign(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len)
 {
-  LWIP_ASSERT("oid_len <= LWIP_SNMP_OBJ_ID_LEN", oid_len <= SNMP_MAX_OBJ_ID_LEN);
+  LWIP_ASSERT("oid_len <= SNMP_MAX_OBJ_ID_LEN", oid_len <= SNMP_MAX_OBJ_ID_LEN);
 
   target->len = oid_len;
 
@@ -544,14 +563,14 @@
  * @param oid_len OID length
  */
 void
-snmp_oid_prefix(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len)
+snmp_oid_prefix(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len)
 {
-  LWIP_ASSERT("target->len + oid_len <= LWIP_SNMP_OBJ_ID_LEN", (target->len + oid_len) <= SNMP_MAX_OBJ_ID_LEN);
+  LWIP_ASSERT("target->len + oid_len <= SNMP_MAX_OBJ_ID_LEN", (target->len + oid_len) <= SNMP_MAX_OBJ_ID_LEN);
 
   if (oid_len > 0) {
     /* move existing OID to make room at the beginning for OID to insert */
     int i;
-    for (i = target->len-1; i>=0; i--) {
+    for (i = target->len - 1; i >= 0; i--) {
       target->id[i + oid_len] = target->id[i];
     }
 
@@ -569,7 +588,7 @@
  * @param oid2_len OID 2 length
  */
 void
-snmp_oid_combine(struct snmp_obj_id* target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len)
+snmp_oid_combine(struct snmp_obj_id *target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len)
 {
   snmp_oid_assign(target, oid1, oid1_len);
   snmp_oid_append(target, oid2, oid2_len);
@@ -582,13 +601,13 @@
  * @param oid_len OID length
  */
 void
-snmp_oid_append(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len)
+snmp_oid_append(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len)
 {
-  LWIP_ASSERT("offset + oid_len <= LWIP_SNMP_OBJ_ID_LEN", (target->len + oid_len) <= SNMP_MAX_OBJ_ID_LEN);
+  LWIP_ASSERT("offset + oid_len <= SNMP_MAX_OBJ_ID_LEN", (target->len + oid_len) <= SNMP_MAX_OBJ_ID_LEN);
 
   if (oid_len > 0) {
     MEMCPY(&target->id[target->len], oid, oid_len * sizeof(u32_t));
-    target->len += oid_len;
+    target->len = (u8_t)(target->len + oid_len);
   }
 }
 
@@ -644,7 +663,7 @@
 u8_t
 snmp_oid_equal(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len)
 {
-  return (snmp_oid_compare(oid1, oid1_len, oid2, oid2_len) == 0)? 1 : 0;
+  return (snmp_oid_compare(oid1, oid1_len, oid2, oid2_len) == 0) ? 1 : 0;
 }
 
 /**
@@ -655,32 +674,18 @@
 u8_t
 netif_to_num(const struct netif *netif)
 {
-  u8_t result = 0;
-  struct netif *netif_iterator = netif_list;
-
-  while (netif_iterator != NULL) {
-    result++;
-
-    if (netif_iterator == netif) {
-      return result;
-    }
-
-    netif_iterator = netif_iterator->next;
-  }
-
-  LWIP_ASSERT("netif not found in netif_list", 0);
-  return 0;
+  return netif_get_index(netif);
 }
 
-static const struct snmp_mib*
+static const struct snmp_mib *
 snmp_get_mib_from_oid(const u32_t *oid, u8_t oid_len)
 {
-  const u32_t* list_oid;
-  const u32_t* searched_oid;
+  const u32_t *list_oid;
+  const u32_t *searched_oid;
   u8_t i, l;
 
   u8_t max_match_len = 0;
-  const struct snmp_mib* matched_mib = NULL;
+  const struct snmp_mib *matched_mib = NULL;
 
   LWIP_ASSERT("'oid' param must not be NULL!", (oid != NULL));
 
@@ -717,11 +722,11 @@
   return matched_mib;
 }
 
-static const struct snmp_mib*
+static const struct snmp_mib *
 snmp_get_next_mib(const u32_t *oid, u8_t oid_len)
 {
   u8_t i;
-  const struct snmp_mib* next_mib = NULL;
+  const struct snmp_mib *next_mib = NULL;
 
   LWIP_ASSERT("'oid' param must not be NULL!", (oid != NULL));
 
@@ -745,10 +750,10 @@
   return next_mib;
 }
 
-static const struct snmp_mib*
+static const struct snmp_mib *
 snmp_get_mib_between(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len)
 {
-  const struct snmp_mib* next_mib = snmp_get_next_mib(oid1, oid1_len);
+  const struct snmp_mib *next_mib = snmp_get_next_mib(oid1, oid1_len);
 
   LWIP_ASSERT("'oid2' param must not be NULL!", (oid2 != NULL));
   LWIP_ASSERT("'oid2_len' param must be greater than 0!", (oid2_len > 0));
@@ -763,7 +768,7 @@
 }
 
 u8_t
-snmp_get_node_instance_from_oid(const u32_t *oid, u8_t oid_len, struct snmp_node_instance* node_instance)
+snmp_get_node_instance_from_oid(const u32_t *oid, u8_t oid_len, struct snmp_node_instance *node_instance)
 {
   u8_t result = SNMP_ERR_NOSUCHOBJECT;
   const struct snmp_mib *mib;
@@ -776,15 +781,15 @@
     mn = snmp_mib_tree_resolve_exact(mib, oid, oid_len, &oid_instance_len);
     if ((mn != NULL) && (mn->node_type != SNMP_NODE_TREE)) {
       /* get instance */
-      const struct snmp_leaf_node* leaf_node = (const struct snmp_leaf_node*)(const void*)mn;
+      const struct snmp_leaf_node *leaf_node = (const struct snmp_leaf_node *)(const void *)mn;
 
       node_instance->node = mn;
       snmp_oid_assign(&node_instance->instance_oid, oid + (oid_len - oid_instance_len), oid_instance_len);
 
       result = leaf_node->get_instance(
-        oid,
-        oid_len - oid_instance_len,
-        node_instance);
+                 oid,
+                 oid_len - oid_instance_len,
+                 node_instance);
 
 #ifdef LWIP_DEBUG
       if (result == SNMP_ERR_NOERROR) {
@@ -803,11 +808,11 @@
 }
 
 u8_t
-snmp_get_next_node_instance_from_oid(const u32_t *oid, u8_t oid_len, snmp_validate_node_instance_method validate_node_instance_method, void* validate_node_instance_arg, struct snmp_obj_id* node_oid, struct snmp_node_instance* node_instance)
+snmp_get_next_node_instance_from_oid(const u32_t *oid, u8_t oid_len, snmp_validate_node_instance_method validate_node_instance_method, void *validate_node_instance_arg, struct snmp_obj_id *node_oid, struct snmp_node_instance *node_instance)
 {
   const struct snmp_mib      *mib;
   const struct snmp_node *mn = NULL;
-  const u32_t* start_oid     = NULL;
+  const u32_t *start_oid     = NULL;
   u8_t         start_oid_len = 0;
 
   /* resolve target MIB from passed OID */
@@ -843,7 +848,7 @@
     /* validate the node; if the node has no further instance or the returned instance is invalid, search for the next in MIB and validate again */
     node_instance->node = mn;
     while (mn != NULL) {
-       u8_t result;
+      u8_t result;
 
       /* clear fields which may have values from previous loops */
       node_instance->asn1_type        = 0;
@@ -855,10 +860,10 @@
       node_instance->reference.ptr    = NULL;
       node_instance->reference_len    = 0;
 
-      result = ((const struct snmp_leaf_node*)(const void*)mn)->get_next_instance(
-        node_oid->id,
-        node_oid->len,
-        node_instance);
+      result = ((const struct snmp_leaf_node *)(const void *)mn)->get_next_instance(
+                 node_oid->id,
+                 node_oid->len,
+                 node_instance);
 
       if (result == SNMP_ERR_NOERROR) {
 #ifdef LWIP_DEBUG
@@ -906,7 +911,7 @@
       /*
       we found a suitable next node,
       now we have to check if a inner MIB is located between the searched OID and the resulting OID.
-      this is possible because MIB's may be located anywhere in the global tree, that means also in 
+      this is possible because MIB's may be located anywhere in the global tree, that means also in
       the subtree of another MIB (e.g. if searched OID is .2 and resulting OID is .4, then another
       MIB having .3 as root node may exist)
       */
@@ -975,17 +980,17 @@
  *
  */
 const struct snmp_node *
-snmp_mib_tree_resolve_exact(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, u8_t* oid_instance_len)
+snmp_mib_tree_resolve_exact(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, u8_t *oid_instance_len)
 {
-  const struct snmp_node* const* node = &mib->root_node;
+  const struct snmp_node *const *node = &mib->root_node;
   u8_t oid_offset = mib->base_oid_len;
 
   while ((oid_offset < oid_len) && ((*node)->node_type == SNMP_NODE_TREE)) {
     /* search for matching sub node */
     u32_t subnode_oid = *(oid + oid_offset);
 
-    u32_t i = (*(const struct snmp_tree_node* const*)node)->subnode_count;
-    node    = (*(const struct snmp_tree_node* const*)node)->subnodes;
+    u32_t i = (*(const struct snmp_tree_node * const *)node)->subnode_count;
+    node    = (*(const struct snmp_tree_node * const *)node)->subnodes;
     while ((i > 0) && ((*node)->oid != subnode_oid)) {
       node++;
       i--;
@@ -1008,12 +1013,12 @@
   return NULL;
 }
 
-const struct snmp_node*
-snmp_mib_tree_resolve_next(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, struct snmp_obj_id* oidret)
+const struct snmp_node *
+snmp_mib_tree_resolve_next(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, struct snmp_obj_id *oidret)
 {
   u8_t  oid_offset = mib->base_oid_len;
-  const struct snmp_node* const* node;
-  const struct snmp_tree_node* node_stack[SNMP_MAX_OBJ_ID_LEN];
+  const struct snmp_node *const *node;
+  const struct snmp_tree_node *node_stack[SNMP_MAX_OBJ_ID_LEN];
   s32_t nsi = 0; /* NodeStackIndex */
   u32_t subnode_oid;
 
@@ -1023,7 +1028,7 @@
   }
 
   /* first build node stack related to passed oid (as far as possible), then go backwards to determine the next node */
-  node_stack[nsi] = (const struct snmp_tree_node*)(const void*)mib->root_node;
+  node_stack[nsi] = (const struct snmp_tree_node *)(const void *)mib->root_node;
   while (oid_offset < oid_len) {
     /* search for matching sub node */
     u32_t i = node_stack[nsi]->subnode_count;
@@ -1041,7 +1046,7 @@
       break;
     }
     nsi++;
-    node_stack[nsi] = (const struct snmp_tree_node*)(const void*)(*node);
+    node_stack[nsi] = (const struct snmp_tree_node *)(const void *)(*node);
 
     oid_offset++;
   }
@@ -1055,7 +1060,7 @@
   }
 
   while (nsi >= 0) {
-    const struct snmp_node* subnode = NULL;
+    const struct snmp_node *subnode = NULL;
 
     /* find next node on current level */
     s32_t i        = node_stack[nsi]->subnode_count;
@@ -1080,7 +1085,7 @@
       if (subnode->node_type == SNMP_NODE_TREE) {
         /* next is a tree node, go into it and start searching */
         nsi++;
-        node_stack[nsi] = (const struct snmp_tree_node*)(const void*)subnode;
+        node_stack[nsi] = (const struct snmp_tree_node *)(const void *)subnode;
         subnode_oid = 0;
       } else {
         /* we found a leaf node -> fill oidret and return it */
@@ -1106,8 +1111,8 @@
 /** initialize struct next_oid_state using this function before passing it to next_oid_check */
 void
 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)
+                   const u32_t *start_oid, u8_t start_oid_len,
+                   u32_t *next_oid_buf, u8_t next_oid_max_len)
 {
   state->start_oid        = start_oid;
   state->start_oid_len    = start_oid_len;
@@ -1121,7 +1126,7 @@
 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 snmp_next_oid_check()*/
 u8_t
-snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, const u8_t oid_len)
+snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len)
 {
   if (state->status != SNMP_NEXT_OID_STATUS_BUF_TO_SMALL) {
     u8_t start_oid_len = (oid_len < state->start_oid_len) ? oid_len : state->start_oid_len;
@@ -1130,7 +1135,7 @@
     if (snmp_oid_compare(oid, oid_len, state->start_oid, start_oid_len) >= 0) {
       /* check if new oid is located closer to start oid than current closest oid */
       if ((state->status == SNMP_NEXT_OID_STATUS_NO_MATCH) ||
-        (snmp_oid_compare(oid, oid_len, state->next_oid, state->next_oid_len) < 0)) {
+          (snmp_oid_compare(oid, oid_len, state->next_oid, state->next_oid_len) < 0)) {
         return 1;
       }
     }
@@ -1141,7 +1146,7 @@
 
 /** checks the passed OID if it is a candidate to be the next one (get_next); returns !=0 if passed oid is currently closest, otherwise 0 */
 u8_t
-snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, const u8_t oid_len, void* reference)
+snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len, void *reference)
 {
   /* do not overwrite a fail result */
   if (state->status != SNMP_NEXT_OID_STATUS_BUF_TO_SMALL) {
@@ -1149,7 +1154,7 @@
     if (snmp_oid_compare(oid, oid_len, state->start_oid, state->start_oid_len) > 0) {
       /* check if new oid is located closer to start oid than current closest oid */
       if ((state->status == SNMP_NEXT_OID_STATUS_NO_MATCH) ||
-        (snmp_oid_compare(oid, oid_len, state->next_oid, state->next_oid_len) < 0)) {
+          (snmp_oid_compare(oid, oid_len, state->next_oid, state->next_oid_len) < 0)) {
         if (oid_len <= state->next_oid_max_len) {
           MEMCPY(state->next_oid, oid, oid_len * sizeof(u32_t));
           state->next_oid_len = oid_len;
@@ -1185,7 +1190,7 @@
 }
 
 snmp_err_t
-snmp_set_test_ok(struct snmp_node_instance* instance, u16_t value_len, void* value)
+snmp_set_test_ok(struct snmp_node_instance *instance, u16_t value_len, void *value)
 {
   LWIP_UNUSED_ARG(instance);
   LWIP_UNUSED_ARG(value_len);
@@ -1228,8 +1233,7 @@
         }
         bits_processed++;
         b <<= 1;
-      }
-      while ((bits_processed & 0x07) != 0); /* &0x07 -> % 8 */
+      } while ((bits_processed & 0x07) != 0); /* &0x07 -> % 8 */
     } else {
       bits_processed += 8;
     }
diff --git a/src/apps/snmp/snmp_core_priv.h b/src/apps/snmp/snmp_core_priv.h
index 5552177..9532c05 100644
--- a/src/apps/snmp/snmp_core_priv.h
+++ b/src/apps/snmp/snmp_core_priv.h
@@ -55,17 +55,24 @@
  */
 #define SNMP_ERR_TOOBIG               1
 #define SNMP_ERR_AUTHORIZATIONERROR   16
+
+#define SNMP_ERR_UNKNOWN_ENGINEID     30
+#define SNMP_ERR_UNKNOWN_SECURITYNAME 31
+#define SNMP_ERR_UNSUPPORTED_SECLEVEL 32
+#define SNMP_ERR_NOTINTIMEWINDOW      33
+#define SNMP_ERR_DECRYIPTION_ERROR    34
+
 #define SNMP_ERR_NOSUCHOBJECT         SNMP_VARBIND_EXCEPTION_OFFSET + SNMP_ASN1_CONTEXT_VARBIND_NO_SUCH_OBJECT
 #define SNMP_ERR_ENDOFMIBVIEW         SNMP_VARBIND_EXCEPTION_OFFSET + SNMP_ASN1_CONTEXT_VARBIND_END_OF_MIB_VIEW
 
 
-const struct snmp_node* snmp_mib_tree_resolve_exact(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, u8_t* oid_instance_len);
-const struct snmp_node* snmp_mib_tree_resolve_next(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, struct snmp_obj_id* oidret);
+const struct snmp_node *snmp_mib_tree_resolve_exact(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, u8_t *oid_instance_len);
+const struct snmp_node *snmp_mib_tree_resolve_next(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, struct snmp_obj_id *oidret);
 
-typedef u8_t (*snmp_validate_node_instance_method)(struct snmp_node_instance*, void*);
+typedef u8_t (*snmp_validate_node_instance_method)(struct snmp_node_instance *, void *);
 
-u8_t snmp_get_node_instance_from_oid(const u32_t *oid, u8_t oid_len, struct snmp_node_instance* node_instance);
-u8_t snmp_get_next_node_instance_from_oid(const u32_t *oid, u8_t oid_len, snmp_validate_node_instance_method validate_node_instance_method, void* validate_node_instance_arg, struct snmp_obj_id* node_oid, struct snmp_node_instance* node_instance);
+u8_t snmp_get_node_instance_from_oid(const u32_t *oid, u8_t oid_len, struct snmp_node_instance *node_instance);
+u8_t snmp_get_next_node_instance_from_oid(const u32_t *oid, u8_t oid_len, snmp_validate_node_instance_method validate_node_instance_method, void *validate_node_instance_arg, struct snmp_obj_id *node_oid, struct snmp_node_instance *node_instance);
 
 #ifdef __cplusplus
 }
diff --git a/src/apps/snmp/snmp_mib2.c b/src/apps/snmp/snmp_mib2.c
index 9d8c43c..3383e44 100644
--- a/src/apps/snmp/snmp_mib2.c
+++ b/src/apps/snmp/snmp_mib2.c
@@ -59,7 +59,7 @@
 #include "lwip/tcpip.h"
 #include "lwip/priv/tcpip_priv.h"
 void
-snmp_mib2_lwip_synchronizer(snmp_threadsync_called_fn fn, void* arg)
+snmp_mib2_lwip_synchronizer(snmp_threadsync_called_fn fn, void *arg)
 {
 #if LWIP_TCPIP_CORE_LOCKING
   LOCK_TCPIP_CORE();
@@ -87,7 +87,7 @@
 extern const struct snmp_tree_node snmp_mib2_at_root;
 extern const struct snmp_tree_node snmp_mib2_ip_root;
 
-static const struct snmp_node* const mib2_nodes[] = {
+static const struct snmp_node *const mib2_nodes[] = {
   &snmp_mib2_system_node.node.node,
   &snmp_mib2_interface_root.node,
 #if LWIP_ARP && LWIP_IPV4
@@ -110,7 +110,7 @@
 
 static const struct snmp_tree_node mib2_root = SNMP_CREATE_TREE_NODE(1, mib2_nodes);
 
-static const u32_t  mib2_base_oid_arr[] = { 1,3,6,1,2,1 };
+static const u32_t  mib2_base_oid_arr[] = { 1, 3, 6, 1, 2, 1 };
 const struct snmp_mib mib2 = SNMP_MIB_CREATE(mib2_base_oid_arr, &mib2_root.node);
 
 #endif /* LWIP_SNMP && SNMP_LWIP_MIB2 */
diff --git a/src/apps/snmp/snmp_mib2_icmp.c b/src/apps/snmp/snmp_mib2_icmp.c
index 995bd32..033d229 100644
--- a/src/apps/snmp/snmp_mib2_icmp.c
+++ b/src/apps/snmp/snmp_mib2_icmp.c
@@ -58,90 +58,90 @@
 static s16_t
 icmp_get_value(const struct snmp_scalar_array_node_def *node, void *value)
 {
-  u32_t *uint_ptr = (u32_t*)value;
+  u32_t *uint_ptr = (u32_t *)value;
 
   switch (node->oid) {
-  case 1: /* icmpInMsgs */
-    *uint_ptr = STATS_GET(mib2.icmpinmsgs);
-    return sizeof(*uint_ptr);
-  case 2: /* icmpInErrors */
-    *uint_ptr = STATS_GET(mib2.icmpinerrors);
-    return sizeof(*uint_ptr);
-  case 3: /* icmpInDestUnreachs */
-    *uint_ptr = STATS_GET(mib2.icmpindestunreachs);
-    return sizeof(*uint_ptr);
-  case 4: /* icmpInTimeExcds */
-    *uint_ptr = STATS_GET(mib2.icmpintimeexcds);
-    return sizeof(*uint_ptr);
-  case 5: /* icmpInParmProbs */
-    *uint_ptr = STATS_GET(mib2.icmpinparmprobs);
-    return sizeof(*uint_ptr);
-  case 6: /* icmpInSrcQuenchs */
-    *uint_ptr = STATS_GET(mib2.icmpinsrcquenchs);
-    return sizeof(*uint_ptr);
-  case 7: /* icmpInRedirects */
-    *uint_ptr = STATS_GET(mib2.icmpinredirects);
-    return sizeof(*uint_ptr);
-  case 8: /* icmpInEchos */
-    *uint_ptr = STATS_GET(mib2.icmpinechos);
-    return sizeof(*uint_ptr);
-  case 9: /* icmpInEchoReps */
-    *uint_ptr = STATS_GET(mib2.icmpinechoreps);
-    return sizeof(*uint_ptr);
-  case 10: /* icmpInTimestamps */
-    *uint_ptr = STATS_GET(mib2.icmpintimestamps);
-    return sizeof(*uint_ptr);
-  case 11: /* icmpInTimestampReps */
-    *uint_ptr = STATS_GET(mib2.icmpintimestampreps);
-    return sizeof(*uint_ptr);
-  case 12: /* icmpInAddrMasks */
-    *uint_ptr = STATS_GET(mib2.icmpinaddrmasks);
-    return sizeof(*uint_ptr);
-  case 13: /* icmpInAddrMaskReps */
-    *uint_ptr = STATS_GET(mib2.icmpinaddrmaskreps);
-    return sizeof(*uint_ptr);
-  case 14: /* icmpOutMsgs */
-    *uint_ptr = STATS_GET(mib2.icmpoutmsgs);
-    return sizeof(*uint_ptr);
-  case 15: /* icmpOutErrors */
-    *uint_ptr = STATS_GET(mib2.icmpouterrors);
-    return sizeof(*uint_ptr);
-  case 16: /* icmpOutDestUnreachs */
-    *uint_ptr = STATS_GET(mib2.icmpoutdestunreachs);
-    return sizeof(*uint_ptr);
-  case 17: /* icmpOutTimeExcds */
-    *uint_ptr = STATS_GET(mib2.icmpouttimeexcds);
-    return sizeof(*uint_ptr);
-  case 18: /* icmpOutParmProbs: not supported -> always 0 */
-    *uint_ptr = 0;
-    return sizeof(*uint_ptr);
-  case 19: /* icmpOutSrcQuenchs: not supported -> always 0 */
-    *uint_ptr = 0;
-    return sizeof(*uint_ptr);
-  case 20: /* icmpOutRedirects: not supported -> always 0 */
-    *uint_ptr = 0;
-    return sizeof(*uint_ptr);
-  case 21: /* icmpOutEchos */
-    *uint_ptr = STATS_GET(mib2.icmpoutechos);
-    return sizeof(*uint_ptr);
-  case 22: /* icmpOutEchoReps */
-    *uint_ptr = STATS_GET(mib2.icmpoutechoreps);
-    return sizeof(*uint_ptr);
-  case 23: /* icmpOutTimestamps: not supported -> always 0 */
-    *uint_ptr = 0;
-    return sizeof(*uint_ptr);
-  case 24: /* icmpOutTimestampReps: not supported -> always 0 */
-    *uint_ptr = 0;
-    return sizeof(*uint_ptr);
-  case 25: /* icmpOutAddrMasks: not supported -> always 0 */
-    *uint_ptr = 0;
-    return sizeof(*uint_ptr);
-  case 26: /* icmpOutAddrMaskReps: not supported -> always 0 */
-    *uint_ptr = 0;
-    return sizeof(*uint_ptr);
-  default:
-    LWIP_DEBUGF(SNMP_MIB_DEBUG,("icmp_get_value(): unknown id: %"S32_F"\n", node->oid));
-    break;
+    case 1: /* icmpInMsgs */
+      *uint_ptr = STATS_GET(mib2.icmpinmsgs);
+      return sizeof(*uint_ptr);
+    case 2: /* icmpInErrors */
+      *uint_ptr = STATS_GET(mib2.icmpinerrors);
+      return sizeof(*uint_ptr);
+    case 3: /* icmpInDestUnreachs */
+      *uint_ptr = STATS_GET(mib2.icmpindestunreachs);
+      return sizeof(*uint_ptr);
+    case 4: /* icmpInTimeExcds */
+      *uint_ptr = STATS_GET(mib2.icmpintimeexcds);
+      return sizeof(*uint_ptr);
+    case 5: /* icmpInParmProbs */
+      *uint_ptr = STATS_GET(mib2.icmpinparmprobs);
+      return sizeof(*uint_ptr);
+    case 6: /* icmpInSrcQuenchs */
+      *uint_ptr = STATS_GET(mib2.icmpinsrcquenchs);
+      return sizeof(*uint_ptr);
+    case 7: /* icmpInRedirects */
+      *uint_ptr = STATS_GET(mib2.icmpinredirects);
+      return sizeof(*uint_ptr);
+    case 8: /* icmpInEchos */
+      *uint_ptr = STATS_GET(mib2.icmpinechos);
+      return sizeof(*uint_ptr);
+    case 9: /* icmpInEchoReps */
+      *uint_ptr = STATS_GET(mib2.icmpinechoreps);
+      return sizeof(*uint_ptr);
+    case 10: /* icmpInTimestamps */
+      *uint_ptr = STATS_GET(mib2.icmpintimestamps);
+      return sizeof(*uint_ptr);
+    case 11: /* icmpInTimestampReps */
+      *uint_ptr = STATS_GET(mib2.icmpintimestampreps);
+      return sizeof(*uint_ptr);
+    case 12: /* icmpInAddrMasks */
+      *uint_ptr = STATS_GET(mib2.icmpinaddrmasks);
+      return sizeof(*uint_ptr);
+    case 13: /* icmpInAddrMaskReps */
+      *uint_ptr = STATS_GET(mib2.icmpinaddrmaskreps);
+      return sizeof(*uint_ptr);
+    case 14: /* icmpOutMsgs */
+      *uint_ptr = STATS_GET(mib2.icmpoutmsgs);
+      return sizeof(*uint_ptr);
+    case 15: /* icmpOutErrors */
+      *uint_ptr = STATS_GET(mib2.icmpouterrors);
+      return sizeof(*uint_ptr);
+    case 16: /* icmpOutDestUnreachs */
+      *uint_ptr = STATS_GET(mib2.icmpoutdestunreachs);
+      return sizeof(*uint_ptr);
+    case 17: /* icmpOutTimeExcds */
+      *uint_ptr = STATS_GET(mib2.icmpouttimeexcds);
+      return sizeof(*uint_ptr);
+    case 18: /* icmpOutParmProbs: not supported -> always 0 */
+      *uint_ptr = 0;
+      return sizeof(*uint_ptr);
+    case 19: /* icmpOutSrcQuenchs: not supported -> always 0 */
+      *uint_ptr = 0;
+      return sizeof(*uint_ptr);
+    case 20: /* icmpOutRedirects: not supported -> always 0 */
+      *uint_ptr = 0;
+      return sizeof(*uint_ptr);
+    case 21: /* icmpOutEchos */
+      *uint_ptr = STATS_GET(mib2.icmpoutechos);
+      return sizeof(*uint_ptr);
+    case 22: /* icmpOutEchoReps */
+      *uint_ptr = STATS_GET(mib2.icmpoutechoreps);
+      return sizeof(*uint_ptr);
+    case 23: /* icmpOutTimestamps: not supported -> always 0 */
+      *uint_ptr = 0;
+      return sizeof(*uint_ptr);
+    case 24: /* icmpOutTimestampReps: not supported -> always 0 */
+      *uint_ptr = 0;
+      return sizeof(*uint_ptr);
+    case 25: /* icmpOutAddrMasks: not supported -> always 0 */
+      *uint_ptr = 0;
+      return sizeof(*uint_ptr);
+    case 26: /* icmpOutAddrMaskReps: not supported -> always 0 */
+      *uint_ptr = 0;
+      return sizeof(*uint_ptr);
+    default:
+      LWIP_DEBUGF(SNMP_MIB_DEBUG, ("icmp_get_value(): unknown id: %"S32_F"\n", node->oid));
+      break;
   }
 
   return 0;
diff --git a/src/apps/snmp/snmp_mib2_interfaces.c b/src/apps/snmp/snmp_mib2_interfaces.c
index 979b507..5f12dd5 100644
--- a/src/apps/snmp/snmp_mib2_interfaces.c
+++ b/src/apps/snmp/snmp_mib2_interfaces.c
@@ -59,16 +59,15 @@
 /* --- interfaces .1.3.6.1.2.1.2 ----------------------------------------------------- */
 
 static s16_t
-interfaces_get_value(struct snmp_node_instance* instance, void* value)
+interfaces_get_value(struct snmp_node_instance *instance, void *value)
 {
   if (instance->node->oid == 1) {
-    s32_t *sint_ptr = (s32_t*)value;
+    s32_t *sint_ptr = (s32_t *)value;
     s32_t num_netifs = 0;
 
-    struct netif *netif = netif_list;
-    while (netif != NULL) {
+    struct netif *netif;
+    NETIF_FOREACH(netif) {
       num_netifs++;
-      netif = netif->next;
     }
 
     *sint_ptr = num_netifs;
@@ -93,7 +92,7 @@
 static const u8_t iftable_ifAdminStatus_down           = 2;
 
 static snmp_err_t
-interfaces_Table_get_cell_instance(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, struct snmp_node_instance* cell_instance)
+interfaces_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 ifIndex;
   struct netif *netif;
@@ -109,14 +108,12 @@
   ifIndex = row_oid[0];
 
   /* find netif with index */
-  netif = netif_list;
-  while (netif != NULL) {
+  NETIF_FOREACH(netif) {
     if (netif_to_num(netif) == ifIndex) {
       /* store netif pointer for subsequent operations (get/test/set) */
       cell_instance->reference.ptr = netif;
       return SNMP_ERR_NOERROR;
     }
-    netif = netif->next;
   }
 
   /* not found */
@@ -124,7 +121,7 @@
 }
 
 static snmp_err_t
-interfaces_Table_get_next_cell_instance(const u32_t* column, struct snmp_obj_id* row_oid, struct snmp_node_instance* cell_instance)
+interfaces_Table_get_next_cell_instance(const u32_t *column, struct snmp_obj_id *row_oid, struct snmp_node_instance *cell_instance)
 {
   struct netif *netif;
   struct snmp_next_oid_state state;
@@ -136,15 +133,12 @@
   snmp_next_oid_init(&state, row_oid->id, row_oid->len, result_temp, LWIP_ARRAYSIZE(interfaces_Table_oid_ranges));
 
   /* iterate over all possible OIDs to find the next one */
-  netif = netif_list;
-  while (netif != NULL) {
+  NETIF_FOREACH(netif) {
     u32_t test_oid[LWIP_ARRAYSIZE(interfaces_Table_oid_ranges)];
     test_oid[0] = netif_to_num(netif);
 
     /* check generated OID: is it a candidate for the next one? */
     snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(interfaces_Table_oid_ranges), netif);
-
-    netif = netif->next;
   }
 
   /* did we find a next one? */
@@ -160,118 +154,117 @@
 }
 
 static s16_t
-interfaces_Table_get_value(struct snmp_node_instance* instance, void* value)
+interfaces_Table_get_value(struct snmp_node_instance *instance, void *value)
 {
-  struct netif *netif = (struct netif*)instance->reference.ptr;
-  u32_t* value_u32 = (u32_t*)value;
-  s32_t* value_s32 = (s32_t*)value;
+  struct netif *netif = (struct netif *)instance->reference.ptr;
+  u32_t *value_u32 = (u32_t *)value;
+  s32_t *value_s32 = (s32_t *)value;
   u16_t value_len;
 
-  switch (SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id))
-  {
-  case 1: /* ifIndex */
-    *value_s32 = netif_to_num(netif);
-    value_len = sizeof(*value_s32);
-    break;
-  case 2: /* ifDescr */
-    value_len = sizeof(netif->name);
-    MEMCPY(value, netif->name, value_len);
-    break;
-  case 3: /* ifType */
-    *value_s32 = netif->link_type;
-    value_len = sizeof(*value_s32);
-    break;
-  case 4: /* ifMtu */
-    *value_s32 = netif->mtu;
-    value_len = sizeof(*value_s32);
-    break;
-  case 5: /* ifSpeed */
-    *value_u32 = netif->link_speed;
-    value_len = sizeof(*value_u32);
-    break;
-  case 6: /* ifPhysAddress */
-    value_len = sizeof(netif->hwaddr);
-    MEMCPY(value, &netif->hwaddr, value_len);
-    break;
-  case 7: /* ifAdminStatus */
-    if (netif_is_up(netif)) {
-      *value_s32 = iftable_ifOperStatus_up;
-    } else {
-      *value_s32 = iftable_ifOperStatus_down;
-    }
-    value_len = sizeof(*value_s32);
-    break;
-  case 8: /* ifOperStatus */
-    if (netif_is_up(netif)) {
-      if (netif_is_link_up(netif)) {
-        *value_s32 = iftable_ifAdminStatus_up;
+  switch (SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id)) {
+    case 1: /* ifIndex */
+      *value_s32 = netif_to_num(netif);
+      value_len = sizeof(*value_s32);
+      break;
+    case 2: /* ifDescr */
+      value_len = sizeof(netif->name);
+      MEMCPY(value, netif->name, value_len);
+      break;
+    case 3: /* ifType */
+      *value_s32 = netif->link_type;
+      value_len = sizeof(*value_s32);
+      break;
+    case 4: /* ifMtu */
+      *value_s32 = netif->mtu;
+      value_len = sizeof(*value_s32);
+      break;
+    case 5: /* ifSpeed */
+      *value_u32 = netif->link_speed;
+      value_len = sizeof(*value_u32);
+      break;
+    case 6: /* ifPhysAddress */
+      value_len = sizeof(netif->hwaddr);
+      MEMCPY(value, &netif->hwaddr, value_len);
+      break;
+    case 7: /* ifAdminStatus */
+      if (netif_is_up(netif)) {
+        *value_s32 = iftable_ifOperStatus_up;
       } else {
-        *value_s32 = iftable_ifAdminStatus_lowerLayerDown;
+        *value_s32 = iftable_ifOperStatus_down;
       }
-    } else {
-      *value_s32 = iftable_ifAdminStatus_down;
-    }
-    value_len = sizeof(*value_s32);
-    break;
-  case 9: /* ifLastChange */
-    *value_u32 = netif->ts;
-    value_len = sizeof(*value_u32);
-    break;
-  case 10: /* ifInOctets */
-    *value_u32 = netif->mib2_counters.ifinoctets;
-    value_len = sizeof(*value_u32);
-    break;
-  case 11: /* ifInUcastPkts */
-    *value_u32 = netif->mib2_counters.ifinucastpkts;
-    value_len = sizeof(*value_u32);
-    break;
-  case 12: /* ifInNUcastPkts */
-    *value_u32 = netif->mib2_counters.ifinnucastpkts;
-    value_len = sizeof(*value_u32);
-    break;
-  case 13: /* ifInDiscards */
-    *value_u32 = netif->mib2_counters.ifindiscards;
-    value_len = sizeof(*value_u32);
-    break;
-  case 14: /* ifInErrors */
-    *value_u32 = netif->mib2_counters.ifinerrors;
-    value_len = sizeof(*value_u32);
-    break;
-  case 15: /* ifInUnkownProtos */
-    *value_u32 = netif->mib2_counters.ifinunknownprotos;
-    value_len = sizeof(*value_u32);
-    break;
-  case 16: /* ifOutOctets */
-    *value_u32 = netif->mib2_counters.ifoutoctets;
-    value_len = sizeof(*value_u32);
-    break;
-  case 17: /* ifOutUcastPkts */
-    *value_u32 = netif->mib2_counters.ifoutucastpkts;
-    value_len = sizeof(*value_u32);
-    break;
-  case 18: /* ifOutNUcastPkts */
-    *value_u32 = netif->mib2_counters.ifoutnucastpkts;
-    value_len = sizeof(*value_u32);
-    break;
-  case 19: /* ifOutDiscarts */
-    *value_u32 = netif->mib2_counters.ifoutdiscards;
-    value_len = sizeof(*value_u32);
-    break;
-  case 20: /* ifOutErrors */
-    *value_u32 = netif->mib2_counters.ifouterrors;
-    value_len = sizeof(*value_u32);
-    break;
-  case 21: /* ifOutQLen */
-    *value_u32 = iftable_ifOutQLen;
-    value_len = sizeof(*value_u32);
-    break;
-  /** @note returning zeroDotZero (0.0) no media specific MIB support */
-  case 22: /* ifSpecific */
-    value_len = snmp_zero_dot_zero.len * sizeof(u32_t);
-    MEMCPY(value, snmp_zero_dot_zero.id, value_len);
-    break;
-  default:
-    return 0;
+      value_len = sizeof(*value_s32);
+      break;
+    case 8: /* ifOperStatus */
+      if (netif_is_up(netif)) {
+        if (netif_is_link_up(netif)) {
+          *value_s32 = iftable_ifAdminStatus_up;
+        } else {
+          *value_s32 = iftable_ifAdminStatus_lowerLayerDown;
+        }
+      } else {
+        *value_s32 = iftable_ifAdminStatus_down;
+      }
+      value_len = sizeof(*value_s32);
+      break;
+    case 9: /* ifLastChange */
+      *value_u32 = netif->ts;
+      value_len = sizeof(*value_u32);
+      break;
+    case 10: /* ifInOctets */
+      *value_u32 = netif->mib2_counters.ifinoctets;
+      value_len = sizeof(*value_u32);
+      break;
+    case 11: /* ifInUcastPkts */
+      *value_u32 = netif->mib2_counters.ifinucastpkts;
+      value_len = sizeof(*value_u32);
+      break;
+    case 12: /* ifInNUcastPkts */
+      *value_u32 = netif->mib2_counters.ifinnucastpkts;
+      value_len = sizeof(*value_u32);
+      break;
+    case 13: /* ifInDiscards */
+      *value_u32 = netif->mib2_counters.ifindiscards;
+      value_len = sizeof(*value_u32);
+      break;
+    case 14: /* ifInErrors */
+      *value_u32 = netif->mib2_counters.ifinerrors;
+      value_len = sizeof(*value_u32);
+      break;
+    case 15: /* ifInUnkownProtos */
+      *value_u32 = netif->mib2_counters.ifinunknownprotos;
+      value_len = sizeof(*value_u32);
+      break;
+    case 16: /* ifOutOctets */
+      *value_u32 = netif->mib2_counters.ifoutoctets;
+      value_len = sizeof(*value_u32);
+      break;
+    case 17: /* ifOutUcastPkts */
+      *value_u32 = netif->mib2_counters.ifoutucastpkts;
+      value_len = sizeof(*value_u32);
+      break;
+    case 18: /* ifOutNUcastPkts */
+      *value_u32 = netif->mib2_counters.ifoutnucastpkts;
+      value_len = sizeof(*value_u32);
+      break;
+    case 19: /* ifOutDiscarts */
+      *value_u32 = netif->mib2_counters.ifoutdiscards;
+      value_len = sizeof(*value_u32);
+      break;
+    case 20: /* ifOutErrors */
+      *value_u32 = netif->mib2_counters.ifouterrors;
+      value_len = sizeof(*value_u32);
+      break;
+    case 21: /* ifOutQLen */
+      *value_u32 = iftable_ifOutQLen;
+      value_len = sizeof(*value_u32);
+      break;
+    /** @note returning zeroDotZero (0.0) no media specific MIB support */
+    case 22: /* ifSpecific */
+      value_len = snmp_zero_dot_zero.len * sizeof(u32_t);
+      MEMCPY(value, snmp_zero_dot_zero.id, value_len);
+      break;
+    default:
+      return 0;
   }
 
   return value_len;
@@ -280,9 +273,9 @@
 #if !SNMP_SAFE_REQUESTS
 
 static snmp_err_t
-interfaces_Table_set_test(struct snmp_node_instance* instance, u16_t len, void *value)
+interfaces_Table_set_test(struct snmp_node_instance *instance, u16_t len, void *value)
 {
-  s32_t *sint_ptr = (s32_t*)value;
+  s32_t *sint_ptr = (s32_t *)value;
 
   /* stack should never call this method for another column,
   because all other columns are set to readonly */
@@ -297,10 +290,10 @@
 }
 
 static snmp_err_t
-interfaces_Table_set_value(struct snmp_node_instance* instance, u16_t len, void *value)
+interfaces_Table_set_value(struct snmp_node_instance *instance, u16_t len, void *value)
 {
-  struct netif *netif = (struct netif*)instance->reference.ptr;
-  s32_t *sint_ptr = (s32_t*)value;
+  struct netif *netif = (struct netif *)instance->reference.ptr;
+  s32_t *sint_ptr = (s32_t *)value;
 
   /* stack should never call this method for another column,
   because all other columns are set to readonly */
@@ -351,21 +344,21 @@
 
 #if !SNMP_SAFE_REQUESTS
 static const struct snmp_table_node interfaces_Table = SNMP_TABLE_CREATE(
-  2, interfaces_Table_columns,
-  interfaces_Table_get_cell_instance, interfaces_Table_get_next_cell_instance,
-  interfaces_Table_get_value, interfaces_Table_set_test, interfaces_Table_set_value);
+      2, interfaces_Table_columns,
+      interfaces_Table_get_cell_instance, interfaces_Table_get_next_cell_instance,
+      interfaces_Table_get_value, interfaces_Table_set_test, interfaces_Table_set_value);
 #else
 static const struct snmp_table_node interfaces_Table = SNMP_TABLE_CREATE(
-  2, interfaces_Table_columns,
-  interfaces_Table_get_cell_instance, interfaces_Table_get_next_cell_instance,
-  interfaces_Table_get_value, NULL, NULL);
+      2, interfaces_Table_columns,
+      interfaces_Table_get_cell_instance, interfaces_Table_get_next_cell_instance,
+      interfaces_Table_get_value, NULL, NULL);
 #endif
 
 /* the following nodes access variables in LWIP stack from SNMP worker thread and must therefore be synced to LWIP (TCPIP) thread */
 CREATE_LWIP_SYNC_NODE(1, interfaces_Number)
 CREATE_LWIP_SYNC_NODE(2, interfaces_Table)
 
-static const struct snmp_node* const interface_nodes[] = {
+static const struct snmp_node *const interface_nodes[] = {
   &SYNC_NODE_NAME(interfaces_Number).node.node,
   &SYNC_NODE_NAME(interfaces_Table).node.node
 };
diff --git a/src/apps/snmp/snmp_mib2_ip.c b/src/apps/snmp/snmp_mib2_ip.c
index 4f05180..6931049 100644
--- a/src/apps/snmp/snmp_mib2_ip.c
+++ b/src/apps/snmp/snmp_mib2_ip.c
@@ -59,85 +59,85 @@
 /* --- ip .1.3.6.1.2.1.4 ----------------------------------------------------- */
 
 static s16_t
-ip_get_value(struct snmp_node_instance* instance, void* value)
+ip_get_value(struct snmp_node_instance *instance, void *value)
 {
-  s32_t* sint_ptr = (s32_t*)value;
-  u32_t* uint_ptr = (u32_t*)value;
+  s32_t *sint_ptr = (s32_t *)value;
+  u32_t *uint_ptr = (u32_t *)value;
 
   switch (instance->node->oid) {
-  case 1: /* ipForwarding */
+    case 1: /* ipForwarding */
 #if IP_FORWARD
-    /* forwarding */
-    *sint_ptr = 1;
+      /* forwarding */
+      *sint_ptr = 1;
 #else
-    /* not-forwarding */
-    *sint_ptr = 2;
+      /* not-forwarding */
+      *sint_ptr = 2;
 #endif
-    return sizeof(*sint_ptr);
-  case 2: /* ipDefaultTTL */
-    *sint_ptr = IP_DEFAULT_TTL;
-    return sizeof(*sint_ptr);
-  case 3: /* ipInReceives */
-    *uint_ptr = STATS_GET(mib2.ipinreceives);
-    return sizeof(*uint_ptr);
-  case 4: /* ipInHdrErrors */
-    *uint_ptr = STATS_GET(mib2.ipinhdrerrors);
-    return sizeof(*uint_ptr);
-  case 5: /* ipInAddrErrors */
-    *uint_ptr = STATS_GET(mib2.ipinaddrerrors);
-    return sizeof(*uint_ptr);
-  case 6: /* ipForwDatagrams */
-    *uint_ptr = STATS_GET(mib2.ipforwdatagrams);
-    return sizeof(*uint_ptr);
-  case 7: /* ipInUnknownProtos */
-    *uint_ptr = STATS_GET(mib2.ipinunknownprotos);
-    return sizeof(*uint_ptr);
-  case 8: /* ipInDiscards */
-    *uint_ptr = STATS_GET(mib2.ipindiscards);
-    return sizeof(*uint_ptr);
-  case 9: /* ipInDelivers */
-    *uint_ptr = STATS_GET(mib2.ipindelivers);
-    return sizeof(*uint_ptr);
-  case 10: /* ipOutRequests */
-    *uint_ptr = STATS_GET(mib2.ipoutrequests);
-    return sizeof(*uint_ptr);
-  case 11: /* ipOutDiscards */
-    *uint_ptr = STATS_GET(mib2.ipoutdiscards);
-    return sizeof(*uint_ptr);
-  case 12: /* ipOutNoRoutes */
-    *uint_ptr = STATS_GET(mib2.ipoutnoroutes);
-    return sizeof(*uint_ptr);
-  case 13: /* ipReasmTimeout */
+      return sizeof(*sint_ptr);
+    case 2: /* ipDefaultTTL */
+      *sint_ptr = IP_DEFAULT_TTL;
+      return sizeof(*sint_ptr);
+    case 3: /* ipInReceives */
+      *uint_ptr = STATS_GET(mib2.ipinreceives);
+      return sizeof(*uint_ptr);
+    case 4: /* ipInHdrErrors */
+      *uint_ptr = STATS_GET(mib2.ipinhdrerrors);
+      return sizeof(*uint_ptr);
+    case 5: /* ipInAddrErrors */
+      *uint_ptr = STATS_GET(mib2.ipinaddrerrors);
+      return sizeof(*uint_ptr);
+    case 6: /* ipForwDatagrams */
+      *uint_ptr = STATS_GET(mib2.ipforwdatagrams);
+      return sizeof(*uint_ptr);
+    case 7: /* ipInUnknownProtos */
+      *uint_ptr = STATS_GET(mib2.ipinunknownprotos);
+      return sizeof(*uint_ptr);
+    case 8: /* ipInDiscards */
+      *uint_ptr = STATS_GET(mib2.ipindiscards);
+      return sizeof(*uint_ptr);
+    case 9: /* ipInDelivers */
+      *uint_ptr = STATS_GET(mib2.ipindelivers);
+      return sizeof(*uint_ptr);
+    case 10: /* ipOutRequests */
+      *uint_ptr = STATS_GET(mib2.ipoutrequests);
+      return sizeof(*uint_ptr);
+    case 11: /* ipOutDiscards */
+      *uint_ptr = STATS_GET(mib2.ipoutdiscards);
+      return sizeof(*uint_ptr);
+    case 12: /* ipOutNoRoutes */
+      *uint_ptr = STATS_GET(mib2.ipoutnoroutes);
+      return sizeof(*uint_ptr);
+    case 13: /* ipReasmTimeout */
 #if IP_REASSEMBLY
-    *sint_ptr = IP_REASS_MAXAGE;
+      *sint_ptr = IP_REASS_MAXAGE;
 #else
-    *sint_ptr = 0;
+      *sint_ptr = 0;
 #endif
-    return sizeof(*sint_ptr);
-  case 14: /* ipReasmReqds */
-    *uint_ptr = STATS_GET(mib2.ipreasmreqds);
-    return sizeof(*uint_ptr);
-  case 15: /* ipReasmOKs */
-    *uint_ptr = STATS_GET(mib2.ipreasmoks);
-    return sizeof(*uint_ptr);
-  case 16: /* ipReasmFails */
-    *uint_ptr = STATS_GET(mib2.ipreasmfails);
-    return sizeof(*uint_ptr);
-  case 17: /* ipFragOKs */
-    *uint_ptr = STATS_GET(mib2.ipfragoks);
-    return sizeof(*uint_ptr);
-  case 18: /* ipFragFails */
-    *uint_ptr = STATS_GET(mib2.ipfragfails);
-    return sizeof(*uint_ptr);
-  case 19: /* ipFragCreates */
-    *uint_ptr = STATS_GET(mib2.ipfragcreates);
-    return sizeof(*uint_ptr);
-  case 23: /* ipRoutingDiscards: not supported -> always 0 */
-    *uint_ptr = 0;
-    return sizeof(*uint_ptr);
-  default:
-    LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_get_value(): unknown id: %"S32_F"\n", instance->node->oid));
-    break;
+      return sizeof(*sint_ptr);
+    case 14: /* ipReasmReqds */
+      *uint_ptr = STATS_GET(mib2.ipreasmreqds);
+      return sizeof(*uint_ptr);
+    case 15: /* ipReasmOKs */
+      *uint_ptr = STATS_GET(mib2.ipreasmoks);
+      return sizeof(*uint_ptr);
+    case 16: /* ipReasmFails */
+      *uint_ptr = STATS_GET(mib2.ipreasmfails);
+      return sizeof(*uint_ptr);
+    case 17: /* ipFragOKs */
+      *uint_ptr = STATS_GET(mib2.ipfragoks);
+      return sizeof(*uint_ptr);
+    case 18: /* ipFragFails */
+      *uint_ptr = STATS_GET(mib2.ipfragfails);
+      return sizeof(*uint_ptr);
+    case 19: /* ipFragCreates */
+      *uint_ptr = STATS_GET(mib2.ipfragcreates);
+      return sizeof(*uint_ptr);
+    case 23: /* ipRoutingDiscards: not supported -> always 0 */
+      *uint_ptr = 0;
+      return sizeof(*uint_ptr);
+    default:
+      LWIP_DEBUGF(SNMP_MIB_DEBUG, ("ip_get_value(): unknown id: %"S32_F"\n", instance->node->oid));
+      break;
   }
 
   return 0;
@@ -154,40 +154,40 @@
  *   otherwise return badvalue.
  */
 static snmp_err_t
-ip_set_test(struct snmp_node_instance* instance, u16_t len, void *value)
+ip_set_test(struct snmp_node_instance *instance, u16_t len, void *value)
 {
   snmp_err_t ret = SNMP_ERR_WRONGVALUE;
-  s32_t *sint_ptr = (s32_t*)value;
+  s32_t *sint_ptr = (s32_t *)value;
 
   LWIP_UNUSED_ARG(len);
   switch (instance->node->oid) {
-  case 1: /* ipForwarding */
+    case 1: /* ipForwarding */
 #if IP_FORWARD
-    /* forwarding */
-    if (*sint_ptr == 1)
+      /* forwarding */
+      if (*sint_ptr == 1)
 #else
-    /* not-forwarding */
-    if (*sint_ptr == 2)
+      /* not-forwarding */
+      if (*sint_ptr == 2)
 #endif
-    {
-      ret = SNMP_ERR_NOERROR;
-    }
-    break;
-  case 2: /* ipDefaultTTL */
-    if (*sint_ptr == IP_DEFAULT_TTL) {
-      ret = SNMP_ERR_NOERROR;
-    }
-    break;
-  default:
-    LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_set_test(): unknown id: %"S32_F"\n", instance->node->oid));
-    break;
+      {
+        ret = SNMP_ERR_NOERROR;
+      }
+      break;
+    case 2: /* ipDefaultTTL */
+      if (*sint_ptr == IP_DEFAULT_TTL) {
+        ret = SNMP_ERR_NOERROR;
+      }
+      break;
+    default:
+      LWIP_DEBUGF(SNMP_MIB_DEBUG, ("ip_set_test(): unknown id: %"S32_F"\n", instance->node->oid));
+      break;
   }
 
   return ret;
 }
 
 static snmp_err_t
-ip_set_value(struct snmp_node_instance* instance, u16_t len, void *value)
+ip_set_value(struct snmp_node_instance *instance, u16_t len, void *value)
 {
   LWIP_UNUSED_ARG(instance);
   LWIP_UNUSED_ARG(len);
@@ -207,48 +207,48 @@
 };
 
 static snmp_err_t
-ip_AddrTable_get_cell_value_core(struct netif *netif, const u32_t* column, union snmp_variant_value* value, u32_t* value_len)
+ip_AddrTable_get_cell_value_core(struct netif *netif, const u32_t *column, union snmp_variant_value *value, u32_t *value_len)
 {
   LWIP_UNUSED_ARG(value_len);
 
   switch (*column) {
-  case 1: /* ipAdEntAddr */
-    value->u32 = netif_ip4_addr(netif)->addr;
-    break;
-  case 2: /* ipAdEntIfIndex */
-    value->u32 = netif_to_num(netif);
-    break;
-  case 3: /* ipAdEntNetMask */
-    value->u32 = netif_ip4_netmask(netif)->addr;
-    break;
-  case 4: /* ipAdEntBcastAddr */
-    /* lwIP oddity, there's no broadcast
-       address in the netif we can rely on */
-    value->u32 = IPADDR_BROADCAST & 1;
-    break;
-  case 5: /* ipAdEntReasmMaxSize */
+    case 1: /* ipAdEntAddr */
+      value->u32 = netif_ip4_addr(netif)->addr;
+      break;
+    case 2: /* ipAdEntIfIndex */
+      value->u32 = netif_to_num(netif);
+      break;
+    case 3: /* ipAdEntNetMask */
+      value->u32 = netif_ip4_netmask(netif)->addr;
+      break;
+    case 4: /* ipAdEntBcastAddr */
+      /* lwIP oddity, there's no broadcast
+         address in the netif we can rely on */
+      value->u32 = IPADDR_BROADCAST & 1;
+      break;
+    case 5: /* ipAdEntReasmMaxSize */
 #if IP_REASSEMBLY
-    /* @todo The theoretical maximum is IP_REASS_MAX_PBUFS * size of the pbufs,
-     * but only if receiving one fragmented packet at a time.
-     * The current solution is to calculate for 2 simultaneous packets...
-     */
-    value->u32 = (IP_HLEN + ((IP_REASS_MAX_PBUFS/2) *
-        (PBUF_POOL_BUFSIZE - PBUF_LINK_ENCAPSULATION_HLEN - PBUF_LINK_HLEN - IP_HLEN)));
+      /* @todo The theoretical maximum is IP_REASS_MAX_PBUFS * size of the pbufs,
+       * but only if receiving one fragmented packet at a time.
+       * The current solution is to calculate for 2 simultaneous packets...
+       */
+      value->u32 = (IP_HLEN + ((IP_REASS_MAX_PBUFS / 2) *
+                               (PBUF_POOL_BUFSIZE - PBUF_LINK_ENCAPSULATION_HLEN - PBUF_LINK_HLEN - IP_HLEN)));
 #else
-    /** @todo returning MTU would be a bad thing and
-        returning a wild guess like '576' isn't good either */
-    value->u32 = 0;
+      /** @todo returning MTU would be a bad thing and
+          returning a wild guess like '576' isn't good either */
+      value->u32 = 0;
 #endif
-    break;
-  default:
-    return SNMP_ERR_NOSUCHINSTANCE;
+      break;
+    default:
+      return SNMP_ERR_NOSUCHINSTANCE;
   }
 
   return SNMP_ERR_NOERROR;
 }
 
 static snmp_err_t
-ip_AddrTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len)
+ip_AddrTable_get_cell_value(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, union snmp_variant_value *value, u32_t *value_len)
 {
   ip4_addr_t ip;
   struct netif *netif;
@@ -262,14 +262,11 @@
   snmp_oid_to_ip4(&row_oid[0], &ip); /* we know it succeeds because of oid_in_range check above */
 
   /* find netif with requested ip */
-  netif = netif_list;
-  while (netif != NULL) {
+  NETIF_FOREACH(netif) {
     if (ip4_addr_cmp(&ip, netif_ip4_addr(netif))) {
       /* fill in object properties */
       return ip_AddrTable_get_cell_value_core(netif, column, value, value_len);
     }
-
-    netif = netif->next;
   }
 
   /* not found */
@@ -277,7 +274,7 @@
 }
 
 static snmp_err_t
-ip_AddrTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len)
+ip_AddrTable_get_next_cell_instance_and_value(const u32_t *column, struct snmp_obj_id *row_oid, union snmp_variant_value *value, u32_t *value_len)
 {
   struct netif *netif;
   struct snmp_next_oid_state state;
@@ -287,22 +284,19 @@
   snmp_next_oid_init(&state, row_oid->id, row_oid->len, result_temp, LWIP_ARRAYSIZE(ip_AddrTable_oid_ranges));
 
   /* iterate over all possible OIDs to find the next one */
-  netif = netif_list;
-  while (netif != NULL) {
+  NETIF_FOREACH(netif) {
     u32_t test_oid[LWIP_ARRAYSIZE(ip_AddrTable_oid_ranges)];
     snmp_ip4_to_oid(netif_ip4_addr(netif), &test_oid[0]);
 
     /* check generated OID: is it a candidate for the next one? */
     snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(ip_AddrTable_oid_ranges), netif);
-
-    netif = netif->next;
   }
 
   /* 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);
     /* fill in object properties */
-    return ip_AddrTable_get_cell_value_core((struct netif*)state.reference, column, value, value_len);
+    return ip_AddrTable_get_cell_value_core((struct netif *)state.reference, column, value, value_len);
   }
 
   /* not found */
@@ -320,86 +314,86 @@
 };
 
 static snmp_err_t
-ip_RouteTable_get_cell_value_core(struct netif *netif, u8_t default_route, const u32_t* column, union snmp_variant_value* value, u32_t* value_len)
+ip_RouteTable_get_cell_value_core(struct netif *netif, u8_t default_route, const u32_t *column, union snmp_variant_value *value, u32_t *value_len)
 {
   switch (*column) {
-  case 1: /* ipRouteDest */
-    if (default_route) {
-       /* default rte has 0.0.0.0 dest */
-      value->u32 = IP4_ADDR_ANY4->addr;
-    } else {
-      /* netifs have netaddress dest */
-      ip4_addr_t tmp;
-      ip4_addr_get_network(&tmp, netif_ip4_addr(netif), netif_ip4_netmask(netif));
-      value->u32 = tmp.addr;
-    }
-    break;
-  case 2: /* ipRouteIfIndex */
-    value->u32 = netif_to_num(netif);
-    break;
-  case 3: /* ipRouteMetric1 */
-    if (default_route) {
-      value->s32 = 1; /* default */
-    } else {
-      value->s32 = 0; /* normal */
-    }
-    break;
-  case 4: /* ipRouteMetric2 */
-  case 5: /* ipRouteMetric3 */
-  case 6: /* ipRouteMetric4 */
-    value->s32 = -1; /* none */
-    break;
-  case 7: /* ipRouteNextHop */
-    if (default_route) {
-      /* default rte: gateway */
-      value->u32 = netif_ip4_gw(netif)->addr;
-    } else {
-      /* other rtes: netif ip_addr  */
-      value->u32 = netif_ip4_addr(netif)->addr;
-    }
-    break;
-  case 8: /* ipRouteType */
-    if (default_route) {
-      /* default rte is indirect */
-      value->u32 = 4; /* indirect */
-    } else {
-      /* other rtes are direct */
-      value->u32 = 3; /* direct */
-    }
-    break;
-  case 9: /* ipRouteProto */
-    /* locally defined routes */
-    value->u32 = 2; /* local */
-    break;
-  case 10: /* ipRouteAge */
-    /* @todo (sysuptime - timestamp last change) / 100 */
-    value->u32 = 0;
-    break;
-  case 11: /* ipRouteMask */
-    if (default_route) {
-      /* default rte use 0.0.0.0 mask */
-      value->u32 = IP4_ADDR_ANY4->addr;
-    } else {
-      /* other rtes use netmask */
-      value->u32 = netif_ip4_netmask(netif)->addr;
-    }
-    break;
-  case 12: /* ipRouteMetric5 */
-    value->s32 = -1; /* none */
-    break;
-  case 13: /* ipRouteInfo */
-    value->const_ptr = snmp_zero_dot_zero.id;
-    *value_len = snmp_zero_dot_zero.len * sizeof(u32_t);
-    break;
-  default:
-    return SNMP_ERR_NOSUCHINSTANCE;
+    case 1: /* ipRouteDest */
+      if (default_route) {
+        /* default rte has 0.0.0.0 dest */
+        value->u32 = IP4_ADDR_ANY4->addr;
+      } else {
+        /* netifs have netaddress dest */
+        ip4_addr_t tmp;
+        ip4_addr_get_network(&tmp, netif_ip4_addr(netif), netif_ip4_netmask(netif));
+        value->u32 = tmp.addr;
+      }
+      break;
+    case 2: /* ipRouteIfIndex */
+      value->u32 = netif_to_num(netif);
+      break;
+    case 3: /* ipRouteMetric1 */
+      if (default_route) {
+        value->s32 = 1; /* default */
+      } else {
+        value->s32 = 0; /* normal */
+      }
+      break;
+    case 4: /* ipRouteMetric2 */
+    case 5: /* ipRouteMetric3 */
+    case 6: /* ipRouteMetric4 */
+      value->s32 = -1; /* none */
+      break;
+    case 7: /* ipRouteNextHop */
+      if (default_route) {
+        /* default rte: gateway */
+        value->u32 = netif_ip4_gw(netif)->addr;
+      } else {
+        /* other rtes: netif ip_addr  */
+        value->u32 = netif_ip4_addr(netif)->addr;
+      }
+      break;
+    case 8: /* ipRouteType */
+      if (default_route) {
+        /* default rte is indirect */
+        value->u32 = 4; /* indirect */
+      } else {
+        /* other rtes are direct */
+        value->u32 = 3; /* direct */
+      }
+      break;
+    case 9: /* ipRouteProto */
+      /* locally defined routes */
+      value->u32 = 2; /* local */
+      break;
+    case 10: /* ipRouteAge */
+      /* @todo (sysuptime - timestamp last change) / 100 */
+      value->u32 = 0;
+      break;
+    case 11: /* ipRouteMask */
+      if (default_route) {
+        /* default rte use 0.0.0.0 mask */
+        value->u32 = IP4_ADDR_ANY4->addr;
+      } else {
+        /* other rtes use netmask */
+        value->u32 = netif_ip4_netmask(netif)->addr;
+      }
+      break;
+    case 12: /* ipRouteMetric5 */
+      value->s32 = -1; /* none */
+      break;
+    case 13: /* ipRouteInfo */
+      value->const_ptr = snmp_zero_dot_zero.id;
+      *value_len = snmp_zero_dot_zero.len * sizeof(u32_t);
+      break;
+    default:
+      return SNMP_ERR_NOSUCHINSTANCE;
   }
 
   return SNMP_ERR_NOERROR;
 }
 
 static snmp_err_t
-ip_RouteTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len)
+ip_RouteTable_get_cell_value(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, union snmp_variant_value *value, u32_t *value_len)
 {
   ip4_addr_t test_ip;
   struct netif *netif;
@@ -419,8 +413,7 @@
   }
 
   /* find netif with requested route */
-  netif = netif_list;
-  while (netif != NULL) {
+  NETIF_FOREACH(netif) {
     ip4_addr_t dst;
     ip4_addr_get_network(&dst, netif_ip4_addr(netif), netif_ip4_netmask(netif));
 
@@ -428,8 +421,6 @@
       /* fill in object properties */
       return ip_RouteTable_get_cell_value_core(netif, 0, column, value, value_len);
     }
-
-    netif = netif->next;
   }
 
   /* not found */
@@ -437,7 +428,7 @@
 }
 
 static snmp_err_t
-ip_RouteTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len)
+ip_RouteTable_get_next_cell_instance_and_value(const u32_t *column, struct snmp_obj_id *row_oid, union snmp_variant_value *value, u32_t *value_len)
 {
   struct netif *netif;
   struct snmp_next_oid_state state;
@@ -454,8 +445,7 @@
   }
 
   /* iterate over all possible OIDs to find the next one */
-  netif = netif_list;
-  while (netif != NULL) {
+  NETIF_FOREACH(netif) {
     ip4_addr_t dst;
     ip4_addr_get_network(&dst, netif_ip4_addr(netif), netif_ip4_netmask(netif));
 
@@ -464,8 +454,6 @@
       snmp_ip4_to_oid(&dst, &test_oid[0]);
       snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(ip_RouteTable_oid_ranges), netif);
     }
-
-    netif = netif->next;
   }
 
   /* did we find a next one? */
@@ -474,7 +462,7 @@
     snmp_oid_to_ip4(&result_temp[0], &dst);
     snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
     /* fill in object properties */
-    return ip_RouteTable_get_cell_value_core((struct netif*)state.reference, ip4_addr_isany_val(dst), column, value, value_len);
+    return ip_RouteTable_get_cell_value_core((struct netif *)state.reference, ip4_addr_isany_val(dst), column, value, value_len);
   } else {
     /* not found */
     return SNMP_ERR_NOSUCHINSTANCE;
@@ -494,7 +482,7 @@
 };
 
 static snmp_err_t
-ip_NetToMediaTable_get_cell_value_core(u8_t arp_table_index, const u32_t* column, union snmp_variant_value* value, u32_t* value_len)
+ip_NetToMediaTable_get_cell_value_core(size_t arp_table_index, const u32_t *column, union snmp_variant_value *value, u32_t *value_len)
 {
   ip4_addr_t *ip;
   struct netif *netif;
@@ -504,32 +492,32 @@
 
   /* value */
   switch (*column) {
-  case 1: /* atIfIndex / ipNetToMediaIfIndex */
-    value->u32 = netif_to_num(netif);
-    break;
-  case 2: /* atPhysAddress / ipNetToMediaPhysAddress */
-    value->ptr = ethaddr;
-    *value_len = sizeof(*ethaddr);
-    break;
-  case 3: /* atNetAddress / ipNetToMediaNetAddress */
-    value->u32 = ip->addr;
-    break;
-  case 4: /* ipNetToMediaType */
-    value->u32 = 3; /* dynamic*/
-    break;
-  default:
-    return SNMP_ERR_NOSUCHINSTANCE;
+    case 1: /* atIfIndex / ipNetToMediaIfIndex */
+      value->u32 = netif_to_num(netif);
+      break;
+    case 2: /* atPhysAddress / ipNetToMediaPhysAddress */
+      value->ptr = ethaddr;
+      *value_len = sizeof(*ethaddr);
+      break;
+    case 3: /* atNetAddress / ipNetToMediaNetAddress */
+      value->u32 = ip->addr;
+      break;
+    case 4: /* ipNetToMediaType */
+      value->u32 = 3; /* dynamic*/
+      break;
+    default:
+      return SNMP_ERR_NOSUCHINSTANCE;
   }
 
   return SNMP_ERR_NOERROR;
 }
 
 static snmp_err_t
-ip_NetToMediaTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len)
+ip_NetToMediaTable_get_cell_value(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, union snmp_variant_value *value, u32_t *value_len)
 {
   ip4_addr_t ip_in;
   u8_t netif_index;
-  u8_t i;
+  size_t i;
 
   /* check if incoming OID length and if values are in plausible range */
   if (!snmp_oid_in_range(row_oid, row_oid_len, ip_NetToMediaTable_oid_ranges, LWIP_ARRAYSIZE(ip_NetToMediaTable_oid_ranges))) {
@@ -541,7 +529,7 @@
   snmp_oid_to_ip4(&row_oid[1], &ip_in); /* we know it succeeds because of oid_in_range check above */
 
   /* find requested entry */
-  for (i=0; i<ARP_TABLE_SIZE; i++) {
+  for (i = 0; i < ARP_TABLE_SIZE; i++) {
     ip4_addr_t *ip;
     struct netif *netif;
     struct eth_addr *ethaddr;
@@ -559,9 +547,9 @@
 }
 
 static snmp_err_t
-ip_NetToMediaTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len)
+ip_NetToMediaTable_get_next_cell_instance_and_value(const u32_t *column, struct snmp_obj_id *row_oid, union snmp_variant_value *value, u32_t *value_len)
 {
-  u8_t i;
+  size_t i;
   struct snmp_next_oid_state state;
   u32_t result_temp[LWIP_ARRAYSIZE(ip_NetToMediaTable_oid_ranges)];
 
@@ -569,7 +557,7 @@
   snmp_next_oid_init(&state, row_oid->id, row_oid->len, result_temp, LWIP_ARRAYSIZE(ip_NetToMediaTable_oid_ranges));
 
   /* iterate over all possible OIDs to find the next one */
-  for (i=0; i<ARP_TABLE_SIZE; i++) {
+  for (i = 0; i < ARP_TABLE_SIZE; i++) {
     ip4_addr_t *ip;
     struct netif *netif;
     struct eth_addr *ethaddr;
@@ -581,7 +569,7 @@
       snmp_ip4_to_oid(ip, &test_oid[1]);
 
       /* check generated OID: is it a candidate for the next one? */
-      snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(ip_NetToMediaTable_oid_ranges), LWIP_PTR_NUMERIC_CAST(void*, i));
+      snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(ip_NetToMediaTable_oid_ranges), LWIP_PTR_NUMERIC_CAST(void *, i));
     }
   }
 
@@ -589,7 +577,7 @@
   if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {
     snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
     /* fill in object properties */
-    return ip_NetToMediaTable_get_cell_value_core(LWIP_PTR_NUMERIC_CAST(u8_t, state.reference), column, value, value_len);
+    return ip_NetToMediaTable_get_cell_value_core(LWIP_PTR_NUMERIC_CAST(size_t, state.reference), column, value, value_len);
   }
 
   /* not found */
@@ -687,7 +675,7 @@
 #endif /* LWIP_ARP */
 CREATE_LWIP_SYNC_NODE(23, ip_RoutingDiscards)
 
-static const struct snmp_node* const ip_nodes[] = {
+static const struct snmp_node *const ip_nodes[] = {
   &SYNC_NODE_NAME(ip_Forwarding).node.node,
   &SYNC_NODE_NAME(ip_DefaultTTL).node.node,
   &SYNC_NODE_NAME(ip_InReceives).node.node,
@@ -733,7 +721,7 @@
 /* the following nodes access variables in LWIP stack from SNMP worker thread and must therefore be synced to LWIP (TCPIP) thread */
 CREATE_LWIP_SYNC_NODE(1, at_Table)
 
-static const struct snmp_node* const at_nodes[] = {
+static const struct snmp_node *const at_nodes[] = {
   &SYNC_NODE_NAME(at_Table).node.node
 };
 
diff --git a/src/apps/snmp/snmp_mib2_snmp.c b/src/apps/snmp/snmp_mib2_snmp.c
index 8a36d61..ca22e41 100644
--- a/src/apps/snmp/snmp_mib2_snmp.c
+++ b/src/apps/snmp/snmp_mib2_snmp.c
@@ -48,105 +48,105 @@
 static s16_t
 snmp_get_value(const struct snmp_scalar_array_node_def *node, void *value)
 {
-  u32_t *uint_ptr = (u32_t*)value;
+  u32_t *uint_ptr = (u32_t *)value;
   switch (node->oid) {
-  case 1: /* snmpInPkts */
-    *uint_ptr = snmp_stats.inpkts;
-    break;
-  case 2: /* snmpOutPkts */
-    *uint_ptr = snmp_stats.outpkts;
-    break;
-  case 3: /* snmpInBadVersions */
-    *uint_ptr = snmp_stats.inbadversions;
-    break;
-  case 4: /* snmpInBadCommunityNames */
-    *uint_ptr = snmp_stats.inbadcommunitynames;
-    break;
-  case 5: /* snmpInBadCommunityUses */
-    *uint_ptr = snmp_stats.inbadcommunityuses;
-    break;
-  case 6: /* snmpInASNParseErrs */
-    *uint_ptr = snmp_stats.inasnparseerrs;
-    break;
-  case 8: /* snmpInTooBigs */
-    *uint_ptr = snmp_stats.intoobigs;
-    break;
-  case 9: /* snmpInNoSuchNames */
-    *uint_ptr = snmp_stats.innosuchnames;
-    break;
-  case 10: /* snmpInBadValues */
-    *uint_ptr = snmp_stats.inbadvalues;
-    break;
-  case 11: /* snmpInReadOnlys */
-    *uint_ptr = snmp_stats.inreadonlys;
-    break;
-  case 12: /* snmpInGenErrs */
-    *uint_ptr = snmp_stats.ingenerrs;
-    break;
-  case 13: /* snmpInTotalReqVars */
-    *uint_ptr = snmp_stats.intotalreqvars;
-    break;
-  case 14: /* snmpInTotalSetVars */
-    *uint_ptr = snmp_stats.intotalsetvars;
-    break;
-  case 15: /* snmpInGetRequests */
-    *uint_ptr = snmp_stats.ingetrequests;
-    break;
-  case 16: /* snmpInGetNexts */
-    *uint_ptr = snmp_stats.ingetnexts;
-    break;
-  case 17: /* snmpInSetRequests */
-    *uint_ptr = snmp_stats.insetrequests;
-    break;
-  case 18: /* snmpInGetResponses */
-    *uint_ptr = snmp_stats.ingetresponses;
-    break;
-  case 19: /* snmpInTraps */
-    *uint_ptr = snmp_stats.intraps;
-    break;
-  case 20: /* snmpOutTooBigs */
-    *uint_ptr = snmp_stats.outtoobigs;
-    break;
-  case 21: /* snmpOutNoSuchNames */
-    *uint_ptr = snmp_stats.outnosuchnames;
-    break;
-  case 22: /* snmpOutBadValues */
-    *uint_ptr = snmp_stats.outbadvalues;
-    break;
-  case 24: /* snmpOutGenErrs */
-    *uint_ptr = snmp_stats.outgenerrs;
-    break;
-  case 25: /* snmpOutGetRequests */
-    *uint_ptr = snmp_stats.outgetrequests;
-    break;
-  case 26: /* snmpOutGetNexts */
-    *uint_ptr = snmp_stats.outgetnexts;
-    break;
-  case 27: /* snmpOutSetRequests */
-    *uint_ptr = snmp_stats.outsetrequests;
-    break;
-  case 28: /* snmpOutGetResponses */
-    *uint_ptr = snmp_stats.outgetresponses;
-    break;
-  case 29: /* snmpOutTraps */
-    *uint_ptr = snmp_stats.outtraps;
-    break;
-  case 30: /* snmpEnableAuthenTraps */
-    if (snmp_get_auth_traps_enabled() == SNMP_AUTH_TRAPS_DISABLED) {
-      *uint_ptr = MIB2_AUTH_TRAPS_DISABLED;
-    } else {
-      *uint_ptr = MIB2_AUTH_TRAPS_ENABLED;
-    }
-    break;
-  case 31: /* snmpSilentDrops */
-    *uint_ptr = 0; /* not supported */
-    break;
-  case 32: /* snmpProxyDrops */
-    *uint_ptr = 0; /* not supported */
-    break;
-  default:
-    LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_get_value(): unknown id: %"S32_F"\n", node->oid));
-    return 0;
+    case 1: /* snmpInPkts */
+      *uint_ptr = snmp_stats.inpkts;
+      break;
+    case 2: /* snmpOutPkts */
+      *uint_ptr = snmp_stats.outpkts;
+      break;
+    case 3: /* snmpInBadVersions */
+      *uint_ptr = snmp_stats.inbadversions;
+      break;
+    case 4: /* snmpInBadCommunityNames */
+      *uint_ptr = snmp_stats.inbadcommunitynames;
+      break;
+    case 5: /* snmpInBadCommunityUses */
+      *uint_ptr = snmp_stats.inbadcommunityuses;
+      break;
+    case 6: /* snmpInASNParseErrs */
+      *uint_ptr = snmp_stats.inasnparseerrs;
+      break;
+    case 8: /* snmpInTooBigs */
+      *uint_ptr = snmp_stats.intoobigs;
+      break;
+    case 9: /* snmpInNoSuchNames */
+      *uint_ptr = snmp_stats.innosuchnames;
+      break;
+    case 10: /* snmpInBadValues */
+      *uint_ptr = snmp_stats.inbadvalues;
+      break;
+    case 11: /* snmpInReadOnlys */
+      *uint_ptr = snmp_stats.inreadonlys;
+      break;
+    case 12: /* snmpInGenErrs */
+      *uint_ptr = snmp_stats.ingenerrs;
+      break;
+    case 13: /* snmpInTotalReqVars */
+      *uint_ptr = snmp_stats.intotalreqvars;
+      break;
+    case 14: /* snmpInTotalSetVars */
+      *uint_ptr = snmp_stats.intotalsetvars;
+      break;
+    case 15: /* snmpInGetRequests */
+      *uint_ptr = snmp_stats.ingetrequests;
+      break;
+    case 16: /* snmpInGetNexts */
+      *uint_ptr = snmp_stats.ingetnexts;
+      break;
+    case 17: /* snmpInSetRequests */
+      *uint_ptr = snmp_stats.insetrequests;
+      break;
+    case 18: /* snmpInGetResponses */
+      *uint_ptr = snmp_stats.ingetresponses;
+      break;
+    case 19: /* snmpInTraps */
+      *uint_ptr = snmp_stats.intraps;
+      break;
+    case 20: /* snmpOutTooBigs */
+      *uint_ptr = snmp_stats.outtoobigs;
+      break;
+    case 21: /* snmpOutNoSuchNames */
+      *uint_ptr = snmp_stats.outnosuchnames;
+      break;
+    case 22: /* snmpOutBadValues */
+      *uint_ptr = snmp_stats.outbadvalues;
+      break;
+    case 24: /* snmpOutGenErrs */
+      *uint_ptr = snmp_stats.outgenerrs;
+      break;
+    case 25: /* snmpOutGetRequests */
+      *uint_ptr = snmp_stats.outgetrequests;
+      break;
+    case 26: /* snmpOutGetNexts */
+      *uint_ptr = snmp_stats.outgetnexts;
+      break;
+    case 27: /* snmpOutSetRequests */
+      *uint_ptr = snmp_stats.outsetrequests;
+      break;
+    case 28: /* snmpOutGetResponses */
+      *uint_ptr = snmp_stats.outgetresponses;
+      break;
+    case 29: /* snmpOutTraps */
+      *uint_ptr = snmp_stats.outtraps;
+      break;
+    case 30: /* snmpEnableAuthenTraps */
+      if (snmp_get_auth_traps_enabled() == SNMP_AUTH_TRAPS_DISABLED) {
+        *uint_ptr = MIB2_AUTH_TRAPS_DISABLED;
+      } else {
+        *uint_ptr = MIB2_AUTH_TRAPS_ENABLED;
+      }
+      break;
+    case 31: /* snmpSilentDrops */
+      *uint_ptr = 0; /* not supported */
+      break;
+    case 32: /* snmpProxyDrops */
+      *uint_ptr = 0; /* not supported */
+      break;
+    default:
+      LWIP_DEBUGF(SNMP_MIB_DEBUG, ("snmp_get_value(): unknown id: %"S32_F"\n", node->oid));
+      return 0;
   }
 
   return sizeof(*uint_ptr);
@@ -160,7 +160,7 @@
 
   if (node->oid == 30) {
     /* snmpEnableAuthenTraps */
-    s32_t *sint_ptr = (s32_t*)value;
+    s32_t *sint_ptr = (s32_t *)value;
 
     /* we should have writable non-volatile mem here */
     if ((*sint_ptr == MIB2_AUTH_TRAPS_DISABLED) || (*sint_ptr == MIB2_AUTH_TRAPS_ENABLED)) {
@@ -177,7 +177,7 @@
 
   if (node->oid == 30) {
     /* snmpEnableAuthenTraps */
-    s32_t *sint_ptr = (s32_t*)value;
+    s32_t *sint_ptr = (s32_t *)value;
     if (*sint_ptr == MIB2_AUTH_TRAPS_DISABLED) {
       snmp_set_auth_traps_enabled(SNMP_AUTH_TRAPS_DISABLED);
     } else {
diff --git a/src/apps/snmp/snmp_mib2_system.c b/src/apps/snmp/snmp_mib2_system.c
index 90e5780..71c1c29 100644
--- a/src/apps/snmp/snmp_mib2_system.c
+++ b/src/apps/snmp/snmp_mib2_system.c
@@ -58,31 +58,31 @@
 
 /** mib-2.system.sysDescr */
 static const u8_t   sysdescr_default[] = SNMP_LWIP_MIB2_SYSDESC;
-static const u8_t*  sysdescr           = sysdescr_default;
-static const u16_t* sysdescr_len       = NULL; /* use strlen for determining len */
+static const u8_t  *sysdescr           = sysdescr_default;
+static const u16_t *sysdescr_len       = NULL; /* use strlen for determining len */
 
 /** mib-2.system.sysContact */
 static const u8_t   syscontact_default[]     = SNMP_LWIP_MIB2_SYSCONTACT;
-static const u8_t*  syscontact               = syscontact_default;
-static const u16_t* syscontact_len           = NULL; /* use strlen for determining len */
-static u8_t*        syscontact_wr            = NULL; /* if writable, points to the same buffer as syscontact (required for correct constness) */
-static u16_t*       syscontact_wr_len        = NULL; /* if writable, points to the same buffer as syscontact_len (required for correct constness) */
+static const u8_t  *syscontact               = syscontact_default;
+static const u16_t *syscontact_len           = NULL; /* use strlen for determining len */
+static u8_t        *syscontact_wr            = NULL; /* if writable, points to the same buffer as syscontact (required for correct constness) */
+static u16_t       *syscontact_wr_len        = NULL; /* if writable, points to the same buffer as syscontact_len (required for correct constness) */
 static u16_t        syscontact_bufsize       = 0;    /* 0=not writable */
 
 /** mib-2.system.sysName */
 static const u8_t   sysname_default[]        = SNMP_LWIP_MIB2_SYSNAME;
-static const u8_t*  sysname                  = sysname_default;
-static const u16_t* sysname_len              = NULL; /* use strlen for determining len */
-static u8_t*        sysname_wr               = NULL; /* if writable, points to the same buffer as sysname (required for correct constness) */
-static u16_t*       sysname_wr_len           = NULL; /* if writable, points to the same buffer as sysname_len (required for correct constness) */
+static const u8_t  *sysname                  = sysname_default;
+static const u16_t *sysname_len              = NULL; /* use strlen for determining len */
+static u8_t        *sysname_wr               = NULL; /* if writable, points to the same buffer as sysname (required for correct constness) */
+static u16_t       *sysname_wr_len           = NULL; /* if writable, points to the same buffer as sysname_len (required for correct constness) */
 static u16_t        sysname_bufsize          = 0;    /* 0=not writable */
 
 /** mib-2.system.sysLocation */
 static const u8_t   syslocation_default[]    = SNMP_LWIP_MIB2_SYSLOCATION;
-static const u8_t*  syslocation              = syslocation_default;
-static const u16_t* syslocation_len           = NULL; /* use strlen for determining len */
-static u8_t*        syslocation_wr            = NULL; /* if writable, points to the same buffer as syslocation (required for correct constness) */
-static u16_t*       syslocation_wr_len        = NULL; /* if writable, points to the same buffer as syslocation_len (required for correct constness) */
+static const u8_t  *syslocation              = syslocation_default;
+static const u16_t *syslocation_len           = NULL; /* use strlen for determining len */
+static u8_t        *syslocation_wr            = NULL; /* if writable, points to the same buffer as syslocation (required for correct constness) */
+static u16_t       *syslocation_wr_len        = NULL; /* if writable, points to the same buffer as syslocation_len (required for correct constness) */
 static u16_t        syslocation_bufsize       = 0;    /* 0=not writable */
 
 /**
@@ -229,48 +229,47 @@
 static s16_t
 system_get_value(const struct snmp_scalar_array_node_def *node, void *value)
 {
-  const u8_t*  var = NULL;
-  const s16_t* var_len;
+  const u8_t  *var = NULL;
+  const s16_t *var_len;
   u16_t result;
 
   switch (node->oid) {
-  case 1: /* sysDescr */
-    var     = sysdescr;
-    var_len = (const s16_t*)sysdescr_len;
-    break;
-  case 2: /* sysObjectID */
-    {
-      const struct snmp_obj_id* dev_enterprise_oid = snmp_get_device_enterprise_oid();
+    case 1: /* sysDescr */
+      var     = sysdescr;
+      var_len = (const s16_t *)sysdescr_len;
+      break;
+    case 2: { /* sysObjectID */
+      const struct snmp_obj_id *dev_enterprise_oid = snmp_get_device_enterprise_oid();
       MEMCPY(value, dev_enterprise_oid->id, dev_enterprise_oid->len * sizeof(u32_t));
       return dev_enterprise_oid->len * sizeof(u32_t);
     }
-  case 3: /* sysUpTime */
-    MIB2_COPY_SYSUPTIME_TO((u32_t*)value);
-    return sizeof(u32_t);
-  case 4: /* sysContact */
-    var     = syscontact;
-    var_len = (const s16_t*)syscontact_len;
-    break;
-  case 5: /* sysName */
-    var     = sysname;
-    var_len = (const s16_t*)sysname_len;
-    break;
-  case 6: /* sysLocation */
-    var     = syslocation;
-    var_len = (const s16_t*)syslocation_len;
-    break;
-  case 7: /* sysServices */
-    *(s32_t*)value = SNMP_SYSSERVICES;
-    return sizeof(s32_t);
-  default:
-    LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_value(): unknown id: %"S32_F"\n", node->oid));
-    return 0;
+    case 3: /* sysUpTime */
+      MIB2_COPY_SYSUPTIME_TO((u32_t *)value);
+      return sizeof(u32_t);
+    case 4: /* sysContact */
+      var     = syscontact;
+      var_len = (const s16_t *)syscontact_len;
+      break;
+    case 5: /* sysName */
+      var     = sysname;
+      var_len = (const s16_t *)sysname_len;
+      break;
+    case 6: /* sysLocation */
+      var     = syslocation;
+      var_len = (const s16_t *)syslocation_len;
+      break;
+    case 7: /* sysServices */
+      *(s32_t *)value = SNMP_SYSSERVICES;
+      return sizeof(s32_t);
+    default:
+      LWIP_DEBUGF(SNMP_MIB_DEBUG, ("system_get_value(): unknown id: %"S32_F"\n", node->oid));
+      return 0;
   }
 
   /* handle string values (OID 1,4,5 and 6) */
   LWIP_ASSERT("", (value != NULL));
   if (var_len == NULL) {
-    result = (s16_t)strlen((const char*)var);
+    result = (s16_t)strlen((const char *)var);
   } else {
     result = *var_len;
   }
@@ -282,27 +281,27 @@
 system_set_test(const struct snmp_scalar_array_node_def *node, u16_t len, void *value)
 {
   snmp_err_t ret = SNMP_ERR_WRONGVALUE;
-  const u16_t* var_bufsize  = NULL;
-  const u16_t* var_wr_len;
+  const u16_t *var_bufsize  = NULL;
+  const u16_t *var_wr_len;
 
   LWIP_UNUSED_ARG(value);
 
   switch (node->oid) {
-  case 4: /* sysContact */
-    var_bufsize  = &syscontact_bufsize;
-    var_wr_len   = syscontact_wr_len;
-    break;
-  case 5: /* sysName */
-    var_bufsize  = &sysname_bufsize;
-    var_wr_len   = sysname_wr_len;
-    break;
-  case 6: /* sysLocation */
-    var_bufsize  = &syslocation_bufsize;
-    var_wr_len   = syslocation_wr_len;
-    break;
-  default:
-    LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_set_test(): unknown id: %"S32_F"\n", node->oid));
-    return ret;
+    case 4: /* sysContact */
+      var_bufsize  = &syscontact_bufsize;
+      var_wr_len   = syscontact_wr_len;
+      break;
+    case 5: /* sysName */
+      var_bufsize  = &sysname_bufsize;
+      var_wr_len   = sysname_wr_len;
+      break;
+    case 6: /* sysLocation */
+      var_bufsize  = &syslocation_bufsize;
+      var_wr_len   = syslocation_wr_len;
+      break;
+    default:
+      LWIP_DEBUGF(SNMP_MIB_DEBUG, ("system_set_test(): unknown id: %"S32_F"\n", node->oid));
+      return ret;
   }
 
   /* check if value is writable at all */
@@ -327,31 +326,31 @@
 static snmp_err_t
 system_set_value(const struct snmp_scalar_array_node_def *node, u16_t len, void *value)
 {
-  u8_t*  var_wr = NULL;
-  u16_t* var_wr_len;
+  u8_t  *var_wr = NULL;
+  u16_t *var_wr_len;
 
   switch (node->oid) {
-  case 4: /* sysContact */
-    var_wr     = syscontact_wr;
-    var_wr_len = syscontact_wr_len;
-    break;
-  case 5: /* sysName */
-    var_wr     = sysname_wr;
-    var_wr_len = sysname_wr_len;
-    break;
-  case 6: /* sysLocation */
-    var_wr     = syslocation_wr;
-    var_wr_len = syslocation_wr_len;
-    break;
-  default:
-    LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_set_value(): unknown id: %"S32_F"\n", node->oid));
-    return SNMP_ERR_GENERROR;
+    case 4: /* sysContact */
+      var_wr     = syscontact_wr;
+      var_wr_len = syscontact_wr_len;
+      break;
+    case 5: /* sysName */
+      var_wr     = sysname_wr;
+      var_wr_len = sysname_wr_len;
+      break;
+    case 6: /* sysLocation */
+      var_wr     = syslocation_wr;
+      var_wr_len = syslocation_wr_len;
+      break;
+    default:
+      LWIP_DEBUGF(SNMP_MIB_DEBUG, ("system_set_value(): unknown id: %"S32_F"\n", node->oid));
+      return SNMP_ERR_GENERROR;
   }
 
   /* no need to check size of target buffer, this was already done in set_test method */
   LWIP_ASSERT("", var_wr != NULL);
   MEMCPY(var_wr, value, len);
-  
+
   if (var_wr_len == NULL) {
     /* add terminating 0 */
     var_wr[len] = 0;
diff --git a/src/apps/snmp/snmp_mib2_tcp.c b/src/apps/snmp/snmp_mib2_tcp.c
index 21f6965..8a321f3 100644
--- a/src/apps/snmp/snmp_mib2_tcp.c
+++ b/src/apps/snmp/snmp_mib2_tcp.c
@@ -59,42 +59,41 @@
 /* --- tcp .1.3.6.1.2.1.6 ----------------------------------------------------- */
 
 static s16_t
-tcp_get_value(struct snmp_node_instance* instance, void* value)
+tcp_get_value(struct snmp_node_instance *instance, void *value)
 {
-  u32_t *uint_ptr = (u32_t*)value;
-  s32_t *sint_ptr = (s32_t*)value;
+  u32_t *uint_ptr = (u32_t *)value;
+  s32_t *sint_ptr = (s32_t *)value;
 
   switch (instance->node->oid) {
-  case 1: /* tcpRtoAlgorithm, vanj(4) */
-    *sint_ptr = 4;
-    return sizeof(*sint_ptr);
-  case 2: /* tcpRtoMin */
-    /* @todo not the actual value, a guess,
-        needs to be calculated */
-    *sint_ptr = 1000;
-    return sizeof(*sint_ptr);
-  case 3: /* tcpRtoMax */
-    /* @todo not the actual value, a guess,
-        needs to be calculated */
-    *sint_ptr = 60000;
-    return sizeof(*sint_ptr);
-  case 4: /* tcpMaxConn */
-    *sint_ptr = MEMP_NUM_TCP_PCB;
-    return sizeof(*sint_ptr);
-  case 5: /* tcpActiveOpens */
-    *uint_ptr = STATS_GET(mib2.tcpactiveopens);
-    return sizeof(*uint_ptr);
-  case 6: /* tcpPassiveOpens */
-    *uint_ptr = STATS_GET(mib2.tcppassiveopens);
-    return sizeof(*uint_ptr);
-  case 7: /* tcpAttemptFails */
-    *uint_ptr = STATS_GET(mib2.tcpattemptfails);
-    return sizeof(*uint_ptr);
-  case 8: /* tcpEstabResets */
-    *uint_ptr = STATS_GET(mib2.tcpestabresets);
-    return sizeof(*uint_ptr);
-  case 9: /* tcpCurrEstab */
-    {
+    case 1: /* tcpRtoAlgorithm, vanj(4) */
+      *sint_ptr = 4;
+      return sizeof(*sint_ptr);
+    case 2: /* tcpRtoMin */
+      /* @todo not the actual value, a guess,
+          needs to be calculated */
+      *sint_ptr = 1000;
+      return sizeof(*sint_ptr);
+    case 3: /* tcpRtoMax */
+      /* @todo not the actual value, a guess,
+          needs to be calculated */
+      *sint_ptr = 60000;
+      return sizeof(*sint_ptr);
+    case 4: /* tcpMaxConn */
+      *sint_ptr = MEMP_NUM_TCP_PCB;
+      return sizeof(*sint_ptr);
+    case 5: /* tcpActiveOpens */
+      *uint_ptr = STATS_GET(mib2.tcpactiveopens);
+      return sizeof(*uint_ptr);
+    case 6: /* tcpPassiveOpens */
+      *uint_ptr = STATS_GET(mib2.tcppassiveopens);
+      return sizeof(*uint_ptr);
+    case 7: /* tcpAttemptFails */
+      *uint_ptr = STATS_GET(mib2.tcpattemptfails);
+      return sizeof(*uint_ptr);
+    case 8: /* tcpEstabResets */
+      *uint_ptr = STATS_GET(mib2.tcpestabresets);
+      return sizeof(*uint_ptr);
+    case 9: { /* tcpCurrEstab */
       u16_t tcpcurrestab = 0;
       struct tcp_pcb *pcb = tcp_active_pcbs;
       while (pcb != NULL) {
@@ -107,30 +106,38 @@
       *uint_ptr = tcpcurrestab;
     }
     return sizeof(*uint_ptr);
-  case 10: /* tcpInSegs */
-    *uint_ptr = STATS_GET(mib2.tcpinsegs);
-    return sizeof(*uint_ptr);
-  case 11: /* tcpOutSegs */
-    *uint_ptr = STATS_GET(mib2.tcpoutsegs);
-    return sizeof(*uint_ptr);
-  case 12: /* tcpRetransSegs */
-    *uint_ptr = STATS_GET(mib2.tcpretranssegs);
-    return sizeof(*uint_ptr);
-  case 14: /* tcpInErrs */
-    *uint_ptr = STATS_GET(mib2.tcpinerrs);
-    return sizeof(*uint_ptr);
-  case 15: /* tcpOutRsts */
-    *uint_ptr = STATS_GET(mib2.tcpoutrsts);
-    return sizeof(*uint_ptr);
-  case 17: /* tcpHCInSegs */
-    memset(value, 0, 2*sizeof(u32_t)); /* not supported */
-    return 2*sizeof(u32_t);
-  case 18: /* tcpHCOutSegs */
-    memset(value, 0, 2*sizeof(u32_t)); /* not supported */
-    return 2*sizeof(u32_t);
-  default:
-    LWIP_DEBUGF(SNMP_MIB_DEBUG,("tcp_get_value(): unknown id: %"S32_F"\n", instance->node->oid));
-    break;
+    case 10: /* tcpInSegs */
+      *uint_ptr = STATS_GET(mib2.tcpinsegs);
+      return sizeof(*uint_ptr);
+    case 11: /* tcpOutSegs */
+      *uint_ptr = STATS_GET(mib2.tcpoutsegs);
+      return sizeof(*uint_ptr);
+    case 12: /* tcpRetransSegs */
+      *uint_ptr = STATS_GET(mib2.tcpretranssegs);
+      return sizeof(*uint_ptr);
+    case 14: /* tcpInErrs */
+      *uint_ptr = STATS_GET(mib2.tcpinerrs);
+      return sizeof(*uint_ptr);
+    case 15: /* tcpOutRsts */
+      *uint_ptr = STATS_GET(mib2.tcpoutrsts);
+      return sizeof(*uint_ptr);
+#if LWIP_HAVE_INT64
+    case 17: { /* tcpHCInSegs */
+      /* use the 32 bit counter for now... */
+      u64_t val64 = STATS_GET(mib2.tcpinsegs);
+      *((u64_t *)value) = val64;
+    }
+    return sizeof(u64_t);
+    case 18: { /* tcpHCOutSegs */
+      /* use the 32 bit counter for now... */
+      u64_t val64 = STATS_GET(mib2.tcpoutsegs);
+      *((u64_t *)value) = val64;
+    }
+    return sizeof(u64_t);
+#endif
+    default:
+      LWIP_DEBUGF(SNMP_MIB_DEBUG, ("tcp_get_value(): unknown id: %"S32_F"\n", instance->node->oid));
+      break;
   }
 
   return 0;
@@ -155,45 +162,45 @@
 };
 
 static snmp_err_t
-tcp_ConnTable_get_cell_value_core(struct tcp_pcb *pcb, const u32_t* column, union snmp_variant_value* value, u32_t* value_len)
+tcp_ConnTable_get_cell_value_core(struct tcp_pcb *pcb, const u32_t *column, union snmp_variant_value *value, u32_t *value_len)
 {
   LWIP_UNUSED_ARG(value_len);
 
   /* value */
   switch (*column) {
-  case 1: /* tcpConnState */
-    value->u32 = pcb->state + 1;
-    break;
-  case 2: /* tcpConnLocalAddress */
-    value->u32 = ip_2_ip4(&pcb->local_ip)->addr;
-    break;
-  case 3: /* tcpConnLocalPort */
-    value->u32 = pcb->local_port;
-    break;
-  case 4: /* tcpConnRemAddress */
-    if (pcb->state == LISTEN) {
-      value->u32 = IP4_ADDR_ANY4->addr;
-    } else {
-      value->u32 = ip_2_ip4(&pcb->remote_ip)->addr;
-    }
-    break;
-  case 5: /* tcpConnRemPort */
-    if (pcb->state == LISTEN) {
-      value->u32 = 0;
-    } else {
-      value->u32 = pcb->remote_port;
-    }
-    break;
-  default:
-    LWIP_ASSERT("invalid id", 0);
-    return SNMP_ERR_NOSUCHINSTANCE;
+    case 1: /* tcpConnState */
+      value->u32 = pcb->state + 1;
+      break;
+    case 2: /* tcpConnLocalAddress */
+      value->u32 = ip_2_ip4(&pcb->local_ip)->addr;
+      break;
+    case 3: /* tcpConnLocalPort */
+      value->u32 = pcb->local_port;
+      break;
+    case 4: /* tcpConnRemAddress */
+      if (pcb->state == LISTEN) {
+        value->u32 = IP4_ADDR_ANY4->addr;
+      } else {
+        value->u32 = ip_2_ip4(&pcb->remote_ip)->addr;
+      }
+      break;
+    case 5: /* tcpConnRemPort */
+      if (pcb->state == LISTEN) {
+        value->u32 = 0;
+      } else {
+        value->u32 = pcb->remote_port;
+      }
+      break;
+    default:
+      LWIP_ASSERT("invalid id", 0);
+      return SNMP_ERR_NOSUCHINSTANCE;
   }
 
   return SNMP_ERR_NOERROR;
 }
 
 static snmp_err_t
-tcp_ConnTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len)
+tcp_ConnTable_get_cell_value(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, union snmp_variant_value *value, u32_t *value_len)
 {
   u8_t i;
   ip4_addr_t local_ip;
@@ -220,7 +227,7 @@
     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_cmp(&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) {
@@ -230,7 +237,7 @@
           }
         } 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_cmp(&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);
           }
@@ -246,7 +253,7 @@
 }
 
 static snmp_err_t
-tcp_ConnTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len)
+tcp_ConnTable_get_next_cell_instance_and_value(const u32_t *column, struct snmp_obj_id *row_oid, union snmp_variant_value *value, u32_t *value_len)
 {
   u8_t i;
   struct tcp_pcb *pcb;
@@ -290,7 +297,7 @@
   if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {
     snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
     /* fill in object properties */
-    return tcp_ConnTable_get_cell_value_core((struct tcp_pcb*)state.reference, column, value, value_len);
+    return tcp_ConnTable_get_cell_value_core((struct tcp_pcb *)state.reference, column, value, value_len);
   }
 
   /* not found */
@@ -302,43 +309,43 @@
 /* --- tcpConnectionTable --- */
 
 static snmp_err_t
-tcp_ConnectionTable_get_cell_value_core(const u32_t* column, struct tcp_pcb *pcb, union snmp_variant_value* value)
+tcp_ConnectionTable_get_cell_value_core(const u32_t *column, struct tcp_pcb *pcb, union snmp_variant_value *value)
 {
   /* all items except tcpConnectionState and tcpConnectionProcess are declared as not-accessible */
   switch (*column) {
-  case 7: /* tcpConnectionState */
-    value->u32 = pcb->state + 1;
-    break;
-  case 8: /* tcpConnectionProcess */
-    value->u32 = 0; /* not supported */
-    break;
-  default:
-    return SNMP_ERR_NOSUCHINSTANCE;
+    case 7: /* tcpConnectionState */
+      value->u32 = pcb->state + 1;
+      break;
+    case 8: /* tcpConnectionProcess */
+      value->u32 = 0; /* not supported */
+      break;
+    default:
+      return SNMP_ERR_NOSUCHINSTANCE;
   }
 
   return SNMP_ERR_NOERROR;
 }
 
 static snmp_err_t
-tcp_ConnectionTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len)
+tcp_ConnectionTable_get_cell_value(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, union snmp_variant_value *value, u32_t *value_len)
 {
   ip_addr_t local_ip, remote_ip;
   u16_t local_port, remote_port;
   struct tcp_pcb *pcb;
   u8_t idx = 0;
   u8_t i;
-  struct tcp_pcb ** const tcp_pcb_nonlisten_lists[] = {&tcp_bound_pcbs, &tcp_active_pcbs, &tcp_tw_pcbs};
+  struct tcp_pcb **const tcp_pcb_nonlisten_lists[] = {&tcp_bound_pcbs, &tcp_active_pcbs, &tcp_tw_pcbs};
 
   LWIP_UNUSED_ARG(value_len);
 
   /* tcpConnectionLocalAddressType + tcpConnectionLocalAddress + tcpConnectionLocalPort */
-  idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len-idx, &local_ip, &local_port);
+  idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len - idx, &local_ip, &local_port);
   if (idx == 0) {
     return SNMP_ERR_NOSUCHINSTANCE;
   }
 
   /* tcpConnectionRemAddressType + tcpConnectionRemAddress + tcpConnectionRemPort */
-  idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len-idx, &remote_ip, &remote_port);
+  idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len - idx, &remote_ip, &remote_port);
   if (idx == 0) {
     return SNMP_ERR_NOSUCHINSTANCE;
   }
@@ -349,9 +356,9 @@
 
     while (pcb != NULL) {
       if (ip_addr_cmp(&local_ip, &pcb->local_ip) &&
-         (local_port == pcb->local_port) &&
-         ip_addr_cmp(&remote_ip, &pcb->remote_ip) &&
-         (remote_port == pcb->remote_port)) {
+          (local_port == pcb->local_port) &&
+          ip_addr_cmp(&remote_ip, &pcb->remote_ip) &&
+          (remote_port == pcb->remote_port)) {
         /* fill in object properties */
         return tcp_ConnectionTable_get_cell_value_core(column, pcb, value);
       }
@@ -364,7 +371,7 @@
 }
 
 static snmp_err_t
-tcp_ConnectionTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len)
+tcp_ConnectionTable_get_next_cell_instance_and_value(const u32_t *column, struct snmp_obj_id *row_oid, union snmp_variant_value *value, u32_t *value_len)
 {
   struct tcp_pcb *pcb;
   struct snmp_next_oid_state state;
@@ -372,7 +379,7 @@
    * 1x tcpConnectionRemAddressType   + 1x OID len + 16x tcpConnectionRemAddress    + 1x tcpConnectionRemPort */
   u32_t  result_temp[38];
   u8_t i;
-  struct tcp_pcb ** const tcp_pcb_nonlisten_lists[] = {&tcp_bound_pcbs, &tcp_active_pcbs, &tcp_tw_pcbs};
+  struct tcp_pcb **const tcp_pcb_nonlisten_lists[] = {&tcp_bound_pcbs, &tcp_active_pcbs, &tcp_tw_pcbs};
 
   LWIP_UNUSED_ARG(value_len);
 
@@ -404,7 +411,7 @@
   if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {
     snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
     /* fill in object properties */
-    return tcp_ConnectionTable_get_cell_value_core(column, (struct tcp_pcb*)state.reference, value);
+    return tcp_ConnectionTable_get_cell_value_core(column, (struct tcp_pcb *)state.reference, value);
   } else {
     /* not found */
     return SNMP_ERR_NOSUCHINSTANCE;
@@ -414,22 +421,22 @@
 /* --- tcpListenerTable --- */
 
 static snmp_err_t
-tcp_ListenerTable_get_cell_value_core(const u32_t* column, union snmp_variant_value* value)
+tcp_ListenerTable_get_cell_value_core(const u32_t *column, union snmp_variant_value *value)
 {
   /* all items except tcpListenerProcess are declared as not-accessible */
   switch (*column) {
-  case 4: /* tcpListenerProcess */
-    value->u32 = 0; /* not supported */
-    break;
-  default:
-    return SNMP_ERR_NOSUCHINSTANCE;
+    case 4: /* tcpListenerProcess */
+      value->u32 = 0; /* not supported */
+      break;
+    default:
+      return SNMP_ERR_NOSUCHINSTANCE;
   }
 
   return SNMP_ERR_NOERROR;
 }
 
 static snmp_err_t
-tcp_ListenerTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len)
+tcp_ListenerTable_get_cell_value(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, union snmp_variant_value *value, u32_t *value_len)
 {
   ip_addr_t local_ip;
   u16_t local_port;
@@ -439,7 +446,7 @@
   LWIP_UNUSED_ARG(value_len);
 
   /* tcpListenerLocalAddressType + tcpListenerLocalAddress + tcpListenerLocalPort */
-  idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len-idx, &local_ip, &local_port);
+  idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len - idx, &local_ip, &local_port);
   if (idx == 0) {
     return SNMP_ERR_NOSUCHINSTANCE;
   }
@@ -448,7 +455,7 @@
   pcb = tcp_listen_pcbs.listen_pcbs;
   while (pcb != NULL) {
     if (ip_addr_cmp(&local_ip, &pcb->local_ip) &&
-       (local_port == pcb->local_port)) {
+        (local_port == pcb->local_port)) {
       /* fill in object properties */
       return tcp_ListenerTable_get_cell_value_core(column, value);
     }
@@ -460,7 +467,7 @@
 }
 
 static snmp_err_t
-tcp_ListenerTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len)
+tcp_ListenerTable_get_next_cell_instance_and_value(const u32_t *column, struct snmp_obj_id *row_oid, union snmp_variant_value *value, u32_t *value_len)
 {
   struct tcp_pcb_listen *pcb;
   struct snmp_next_oid_state state;
@@ -512,8 +519,10 @@
 static const struct snmp_scalar_node tcp_RetransSegs   = SNMP_SCALAR_CREATE_NODE_READONLY(12, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);
 static const struct snmp_scalar_node tcp_InErrs        = SNMP_SCALAR_CREATE_NODE_READONLY(14, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);
 static const struct snmp_scalar_node tcp_OutRsts       = SNMP_SCALAR_CREATE_NODE_READONLY(15, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);
+#if LWIP_HAVE_INT64
 static const struct snmp_scalar_node tcp_HCInSegs      = SNMP_SCALAR_CREATE_NODE_READONLY(17, SNMP_ASN1_TYPE_COUNTER64, tcp_get_value);
 static const struct snmp_scalar_node tcp_HCOutSegs     = SNMP_SCALAR_CREATE_NODE_READONLY(18, SNMP_ASN1_TYPE_COUNTER64, tcp_get_value);
+#endif
 
 #if LWIP_IPV4
 static const struct snmp_table_simple_col_def tcp_ConnTable_columns[] = {
@@ -561,12 +570,14 @@
 #endif /* LWIP_IPV4 */
 CREATE_LWIP_SYNC_NODE(14, tcp_InErrs)
 CREATE_LWIP_SYNC_NODE(15, tcp_OutRsts)
+#if LWIP_HAVE_INT64
 CREATE_LWIP_SYNC_NODE(17, tcp_HCInSegs)
 CREATE_LWIP_SYNC_NODE(18, tcp_HCOutSegs)
+#endif
 CREATE_LWIP_SYNC_NODE(19, tcp_ConnectionTable)
 CREATE_LWIP_SYNC_NODE(20, tcp_ListenerTable)
 
-static const struct snmp_node* const tcp_nodes[] = {
+static const struct snmp_node *const tcp_nodes[] = {
   &SYNC_NODE_NAME(tcp_RtoAlgorithm).node.node,
   &SYNC_NODE_NAME(tcp_RtoMin).node.node,
   &SYNC_NODE_NAME(tcp_RtoMax).node.node,
@@ -585,8 +596,10 @@
   &SYNC_NODE_NAME(tcp_InErrs).node.node,
   &SYNC_NODE_NAME(tcp_OutRsts).node.node,
   &SYNC_NODE_NAME(tcp_HCInSegs).node.node,
+#if LWIP_HAVE_INT64
   &SYNC_NODE_NAME(tcp_HCOutSegs).node.node,
   &SYNC_NODE_NAME(tcp_ConnectionTable).node.node,
+#endif
   &SYNC_NODE_NAME(tcp_ListenerTable).node.node
 };
 
diff --git a/src/apps/snmp/snmp_mib2_udp.c b/src/apps/snmp/snmp_mib2_udp.c
index 6a983df..d0bd5de 100644
--- a/src/apps/snmp/snmp_mib2_udp.c
+++ b/src/apps/snmp/snmp_mib2_udp.c
@@ -58,32 +58,40 @@
 /* --- udp .1.3.6.1.2.1.7 ----------------------------------------------------- */
 
 static s16_t
-udp_get_value(struct snmp_node_instance* instance, void* value)
+udp_get_value(struct snmp_node_instance *instance, void *value)
 {
-  u32_t *uint_ptr = (u32_t*)value;
+  u32_t *uint_ptr = (u32_t *)value;
 
   switch (instance->node->oid) {
-  case 1: /* udpInDatagrams */
-    *uint_ptr = STATS_GET(mib2.udpindatagrams);
-    return sizeof(*uint_ptr);
-  case 2: /* udpNoPorts */
-    *uint_ptr = STATS_GET(mib2.udpnoports);
-    return sizeof(*uint_ptr);
-  case 3: /* udpInErrors */
-    *uint_ptr = STATS_GET(mib2.udpinerrors);
-    return sizeof(*uint_ptr);
-  case 4: /* udpOutDatagrams */
-    *uint_ptr = STATS_GET(mib2.udpoutdatagrams);
-    return sizeof(*uint_ptr);
-  case 8: /* udpHCInDatagrams */
-    memset(value, 0, 2*sizeof(u32_t)); /* not supported */
-    return 2*sizeof(u32_t);
-  case 9: /* udpHCOutDatagrams */
-    memset(value, 0, 2*sizeof(u32_t)); /* not supported */
-    return 2*sizeof(u32_t);
-  default:
-    LWIP_DEBUGF(SNMP_MIB_DEBUG,("udp_get_value(): unknown id: %"S32_F"\n", instance->node->oid));
-    break;
+    case 1: /* udpInDatagrams */
+      *uint_ptr = STATS_GET(mib2.udpindatagrams);
+      return sizeof(*uint_ptr);
+    case 2: /* udpNoPorts */
+      *uint_ptr = STATS_GET(mib2.udpnoports);
+      return sizeof(*uint_ptr);
+    case 3: /* udpInErrors */
+      *uint_ptr = STATS_GET(mib2.udpinerrors);
+      return sizeof(*uint_ptr);
+    case 4: /* udpOutDatagrams */
+      *uint_ptr = STATS_GET(mib2.udpoutdatagrams);
+      return sizeof(*uint_ptr);
+#if LWIP_HAVE_INT64
+    case 8: { /* udpHCInDatagrams */
+      /* use the 32 bit counter for now... */
+      u64_t val64 = STATS_GET(mib2.udpindatagrams);
+      *((u64_t *)value) = val64;
+    }
+    return sizeof(u64_t);
+    case 9: { /* udpHCOutDatagrams */
+      /* use the 32 bit counter for now... */
+      u64_t val64 = STATS_GET(mib2.udpoutdatagrams);
+      *((u64_t *)value) = val64;
+    }
+    return sizeof(u64_t);
+#endif
+    default:
+      LWIP_DEBUGF(SNMP_MIB_DEBUG, ("udp_get_value(): unknown id: %"S32_F"\n", instance->node->oid));
+      break;
   }
 
   return 0;
@@ -92,22 +100,22 @@
 /* --- udpEndpointTable --- */
 
 static snmp_err_t
-udp_endpointTable_get_cell_value_core(const u32_t* column, union snmp_variant_value* value)
+udp_endpointTable_get_cell_value_core(const u32_t *column, union snmp_variant_value *value)
 {
   /* all items except udpEndpointProcess are declared as not-accessible */
   switch (*column) {
-  case 8: /* udpEndpointProcess */
-    value->u32 = 0; /* not supported */
-    break;
-  default:
-    return SNMP_ERR_NOSUCHINSTANCE;
+    case 8: /* udpEndpointProcess */
+      value->u32 = 0; /* not supported */
+      break;
+    default:
+      return SNMP_ERR_NOSUCHINSTANCE;
   }
 
   return SNMP_ERR_NOERROR;
 }
 
 static snmp_err_t
-udp_endpointTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len)
+udp_endpointTable_get_cell_value(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, union snmp_variant_value *value, u32_t *value_len)
 {
   ip_addr_t local_ip, remote_ip;
   u16_t local_port, remote_port;
@@ -117,32 +125,32 @@
   LWIP_UNUSED_ARG(value_len);
 
   /* udpEndpointLocalAddressType + udpEndpointLocalAddress + udpEndpointLocalPort */
-  idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len-idx, &local_ip, &local_port);
+  idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len - idx, &local_ip, &local_port);
   if (idx == 0) {
     return SNMP_ERR_NOSUCHINSTANCE;
   }
 
   /* udpEndpointRemoteAddressType + udpEndpointRemoteAddress + udpEndpointRemotePort */
-  idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len-idx, &remote_ip, &remote_port);
+  idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len - idx, &remote_ip, &remote_port);
   if (idx == 0) {
     return SNMP_ERR_NOSUCHINSTANCE;
   }
 
   /* udpEndpointInstance */
-  if (row_oid_len < (idx+1)) {
+  if (row_oid_len < (idx + 1)) {
     return SNMP_ERR_NOSUCHINSTANCE;
   }
   if (row_oid[idx] != 0) {
     return SNMP_ERR_NOSUCHINSTANCE;
   }
-  
+
   /* find udp_pcb with requested ip and port*/
   pcb = udp_pcbs;
   while (pcb != NULL) {
     if (ip_addr_cmp(&local_ip, &pcb->local_ip) &&
-       (local_port == pcb->local_port) &&
-       ip_addr_cmp(&remote_ip, &pcb->remote_ip) &&
-       (remote_port == pcb->remote_port)) {
+        (local_port == pcb->local_port) &&
+        ip_addr_cmp(&remote_ip, &pcb->remote_ip) &&
+        (remote_port == pcb->remote_port)) {
       /* fill in object properties */
       return udp_endpointTable_get_cell_value_core(column, value);
     }
@@ -153,8 +161,8 @@
   return SNMP_ERR_NOSUCHINSTANCE;
 }
 
-static snmp_err_t 
-udp_endpointTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len)
+static snmp_err_t
+udp_endpointTable_get_next_cell_instance_and_value(const u32_t *column, struct snmp_obj_id *row_oid, union snmp_variant_value *value, u32_t *value_len)
 {
   struct udp_pcb *pcb;
   struct snmp_next_oid_state state;
@@ -181,12 +189,12 @@
     /* udpEndpointRemoteAddressType + udpEndpointRemoteAddress + udpEndpointRemotePort */
     idx += snmp_ip_port_to_oid(&pcb->remote_ip, pcb->remote_port, &test_oid[idx]);
 
-    test_oid[idx] = 0; /* udpEndpointInstance */    
+    test_oid[idx] = 0; /* udpEndpointInstance */
     idx++;
-    
+
     /* check generated OID: is it a candidate for the next one? */
     snmp_next_oid_check(&state, test_oid, idx, NULL);
-    
+
     pcb = pcb->next;
   }
 
@@ -214,29 +222,29 @@
   { 1, 0xffff }  /* Port        */
 };
 
-static snmp_err_t 
-udp_Table_get_cell_value_core(struct udp_pcb *pcb, const u32_t* column, union snmp_variant_value* value, u32_t* value_len)
+static snmp_err_t
+udp_Table_get_cell_value_core(struct udp_pcb *pcb, const u32_t *column, union snmp_variant_value *value, u32_t *value_len)
 {
   LWIP_UNUSED_ARG(value_len);
 
   switch (*column) {
-  case 1: /* udpLocalAddress */
-    /* set reference to PCB local IP and return a generic node that copies IP4 addresses */
-    value->u32 = ip_2_ip4(&pcb->local_ip)->addr;
-    break;
-  case 2: /* udpLocalPort */
-    /* set reference to PCB local port and return a generic node that copies u16_t values */
-    value->u32 = pcb->local_port;
-    break;
-  default:
-    return SNMP_ERR_NOSUCHINSTANCE;
+    case 1: /* udpLocalAddress */
+      /* set reference to PCB local IP and return a generic node that copies IP4 addresses */
+      value->u32 = ip_2_ip4(&pcb->local_ip)->addr;
+      break;
+    case 2: /* udpLocalPort */
+      /* set reference to PCB local port and return a generic node that copies u16_t values */
+      value->u32 = pcb->local_port;
+      break;
+    default:
+      return SNMP_ERR_NOSUCHINSTANCE;
   }
 
   return SNMP_ERR_NOERROR;
 }
 
-static snmp_err_t 
-udp_Table_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len)
+static snmp_err_t
+udp_Table_get_cell_value(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, union snmp_variant_value *value, u32_t *value_len)
 {
   ip4_addr_t ip;
   u16_t port;
@@ -267,8 +275,8 @@
   return SNMP_ERR_NOSUCHINSTANCE;
 }
 
-static snmp_err_t 
-udp_Table_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len)
+static snmp_err_t
+udp_Table_get_next_cell_instance_and_value(const u32_t *column, struct snmp_obj_id *row_oid, union snmp_variant_value *value, u32_t *value_len)
 {
   struct udp_pcb *pcb;
   struct snmp_next_oid_state state;
@@ -289,7 +297,7 @@
       /* check generated OID: is it a candidate for the next one? */
       snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(udp_Table_oid_ranges), pcb);
     }
-    
+
     pcb = pcb->next;
   }
 
@@ -297,7 +305,7 @@
   if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {
     snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
     /* fill in object properties */
-    return udp_Table_get_cell_value_core((struct udp_pcb*)state.reference, column, value, value_len);
+    return udp_Table_get_cell_value_core((struct udp_pcb *)state.reference, column, value, value_len);
   } else {
     /* not found */
     return SNMP_ERR_NOSUCHINSTANCE;
@@ -310,8 +318,10 @@
 static const struct snmp_scalar_node udp_noPorts        = SNMP_SCALAR_CREATE_NODE_READONLY(2, SNMP_ASN1_TYPE_COUNTER,   udp_get_value);
 static const struct snmp_scalar_node udp_inErrors       = SNMP_SCALAR_CREATE_NODE_READONLY(3, SNMP_ASN1_TYPE_COUNTER,   udp_get_value);
 static const struct snmp_scalar_node udp_outDatagrams   = SNMP_SCALAR_CREATE_NODE_READONLY(4, SNMP_ASN1_TYPE_COUNTER,   udp_get_value);
+#if LWIP_HAVE_INT64
 static const struct snmp_scalar_node udp_HCInDatagrams  = SNMP_SCALAR_CREATE_NODE_READONLY(8, SNMP_ASN1_TYPE_COUNTER64, udp_get_value);
 static const struct snmp_scalar_node udp_HCOutDatagrams = SNMP_SCALAR_CREATE_NODE_READONLY(9, SNMP_ASN1_TYPE_COUNTER64, udp_get_value);
+#endif
 
 #if LWIP_IPV4
 static const struct snmp_table_simple_col_def udp_Table_columns[] = {
@@ -322,13 +332,13 @@
 #endif /* LWIP_IPV4 */
 
 static const struct snmp_table_simple_col_def udp_endpointTable_columns[] = {
-  /* all items except udpEndpointProcess are declared as not-accessible */   
+  /* all items except udpEndpointProcess are declared as not-accessible */
   { 8, SNMP_ASN1_TYPE_UNSIGNED32, SNMP_VARIANT_VALUE_TYPE_U32 }  /* udpEndpointProcess */
 };
 
 static const struct snmp_table_simple_node udp_endpointTable = SNMP_TABLE_CREATE_SIMPLE(7, udp_endpointTable_columns, udp_endpointTable_get_cell_value, udp_endpointTable_get_next_cell_instance_and_value);
 
-/* the following nodes access variables in LWIP stack from SNMP worker thread and must therefore be synced to LWIP (TCPIP) thread */ 
+/* the following nodes access variables in LWIP stack from SNMP worker thread and must therefore be synced to LWIP (TCPIP) thread */
 CREATE_LWIP_SYNC_NODE(1, udp_inDatagrams)
 CREATE_LWIP_SYNC_NODE(2, udp_noPorts)
 CREATE_LWIP_SYNC_NODE(3, udp_inErrors)
@@ -337,10 +347,12 @@
 CREATE_LWIP_SYNC_NODE(5, udp_Table)
 #endif /* LWIP_IPV4 */
 CREATE_LWIP_SYNC_NODE(7, udp_endpointTable)
+#if LWIP_HAVE_INT64
 CREATE_LWIP_SYNC_NODE(8, udp_HCInDatagrams)
 CREATE_LWIP_SYNC_NODE(9, udp_HCOutDatagrams)
+#endif
 
-static const struct snmp_node* const udp_nodes[] = {
+static const struct snmp_node *const udp_nodes[] = {
   &SYNC_NODE_NAME(udp_inDatagrams).node.node,
   &SYNC_NODE_NAME(udp_noPorts).node.node,
   &SYNC_NODE_NAME(udp_inErrors).node.node,
@@ -348,9 +360,12 @@
 #if LWIP_IPV4
   &SYNC_NODE_NAME(udp_Table).node.node,
 #endif /* LWIP_IPV4 */
-  &SYNC_NODE_NAME(udp_endpointTable).node.node,
+  &SYNC_NODE_NAME(udp_endpointTable).node.node
+#if LWIP_HAVE_INT64
+  ,
   &SYNC_NODE_NAME(udp_HCInDatagrams).node.node,
   &SYNC_NODE_NAME(udp_HCOutDatagrams).node.node
+#endif
 };
 
 const struct snmp_tree_node snmp_mib2_udp_root = SNMP_CREATE_TREE_NODE(7, udp_nodes);
diff --git a/src/apps/snmp/snmp_msg.c b/src/apps/snmp/snmp_msg.c
index 0cb7ca9..0b6693a 100644
--- a/src/apps/snmp/snmp_msg.c
+++ b/src/apps/snmp/snmp_msg.c
@@ -48,13 +48,21 @@
 #if LWIP_SNMP_V3
 #include "lwip/apps/snmpv3.h"
 #include "snmpv3_priv.h"
-#ifdef LWIP_SNMPV3_INCLUDE_ENGINE
-#include LWIP_SNMPV3_INCLUDE_ENGINE
+#ifdef LWIP_HOOK_FILENAME
+#include LWIP_HOOK_FILENAME
 #endif
 #endif
 
 #include <string.h>
 
+#define SNMP_V3_AUTH_FLAG      0x01
+#define SNMP_V3_PRIV_FLAG      0x02
+
+/* Security levels */
+#define SNMP_V3_NOAUTHNOPRIV   0x00
+#define SNMP_V3_AUTHNOPRIV     SNMP_V3_AUTH_FLAG
+#define SNMP_V3_AUTHPRIV       (SNMP_V3_AUTH_FLAG | SNMP_V3_PRIV_FLAG)
+
 /* public (non-static) constants */
 /** SNMP community string */
 const char *snmp_community = SNMP_COMMUNITY;
@@ -64,7 +72,88 @@
 const char *snmp_community_trap = SNMP_COMMUNITY_TRAP;
 
 snmp_write_callback_fct snmp_write_callback     = NULL;
-void*                   snmp_write_callback_arg = NULL;
+void                   *snmp_write_callback_arg = NULL;
+
+#if LWIP_SNMP_CONFIGURE_VERSIONS
+
+static u8_t v1_enabled = 1;
+static u8_t v2c_enabled = 1;
+static u8_t v3_enabled = 1;
+
+static u8_t
+snmp_version_enabled(u8_t version)
+{
+  if (version == SNMP_VERSION_1) {
+    return v1_enabled;
+  } else if (version == SNMP_VERSION_2c) {
+    return v2c_enabled;
+  }
+#if LWIP_SNMP_V3
+  else if (version == SNMP_VERSION_3) {
+    return v3_enabled;
+  }
+#endif
+  else {
+    LWIP_ASSERT("Invalid SNMP version", 0);
+    return 0;
+  }
+}
+
+u8_t
+snmp_v1_enabled(void)
+{
+  return snmp_version_enabled(SNMP_VERSION_1);
+}
+
+u8_t
+snmp_v2c_enabled(void)
+{
+  return snmp_version_enabled(SNMP_VERSION_2c);
+}
+
+u8_t
+snmp_v3_enabled(void)
+{
+  return snmp_version_enabled(SNMP_VERSION_3);
+}
+
+static void
+snmp_version_enable(u8_t version, u8_t enable)
+{
+  if (version == SNMP_VERSION_1) {
+    v1_enabled = enable;
+  } else if (version == SNMP_VERSION_2c) {
+    v2c_enabled = enable;
+  }
+#if LWIP_SNMP_V3
+  else if (version == SNMP_VERSION_3) {
+    v3_enabled = enable;
+  }
+#endif
+  else {
+    LWIP_ASSERT("Invalid SNMP version", 0);
+  }
+}
+
+void
+snmp_v1_enable(u8_t enable)
+{
+  snmp_version_enable(SNMP_VERSION_1, enable);
+}
+
+void
+snmp_v2c_enable(u8_t enable)
+{
+  snmp_version_enable(SNMP_VERSION_2c, enable);
+}
+
+void
+snmp_v3_enable(u8_t enable)
+{
+  snmp_version_enable(SNMP_VERSION_3, enable);
+}
+
+#endif
 
 /**
  * @ingroup snmp_core
@@ -86,8 +175,9 @@
  * @param community is a pointer to new community string
  */
 void
-snmp_set_community(const char * const community)
+snmp_set_community(const char *const community)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("community string is too long!", strlen(community) <= SNMP_MAX_COMMUNITY_STR_LEN);
   snmp_community = community;
 }
@@ -123,8 +213,9 @@
  * @param community is a pointer to new write-access community string
  */
 void
-snmp_set_community_write(const char * const community)
+snmp_set_community_write(const char *const community)
 {
+  LWIP_ASSERT_CORE_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;
@@ -139,8 +230,9 @@
  * @param community is a pointer to new trap community string
  */
 void
-snmp_set_community_trap(const char * const community)
+snmp_set_community_trap(const char *const community)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("community string is too long!", strlen(community) <= SNMP_MAX_COMMUNITY_STR_LEN);
   snmp_community_trap = community;
 }
@@ -149,9 +241,10 @@
  * @ingroup snmp_core
  * Callback fired on every successful write access
  */
-void 
-snmp_set_write_callback(snmp_write_callback_fct write_callback, void* callback_arg)
+void
+snmp_set_write_callback(snmp_write_callback_fct write_callback, void *callback_arg)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   snmp_write_callback     = write_callback;
   snmp_write_callback_arg = callback_arg;
 }
@@ -180,7 +273,7 @@
 {
   err_t err;
   struct snmp_request request;
-   
+
   memset(&request, 0, sizeof(request));
   request.handle       = handle;
   request.source_ip    = source_ip;
@@ -206,23 +299,83 @@
           err = snmp_process_set_request(&request);
         }
       }
+#if LWIP_SNMP_V3
+      else {
+        struct snmp_varbind vb;
+
+        vb.next = NULL;
+        vb.prev = NULL;
+        vb.type = SNMP_ASN1_TYPE_COUNTER32;
+        vb.value_len = sizeof(u32_t);
+
+        switch (request.error_status) {
+          case SNMP_ERR_AUTHORIZATIONERROR: {
+            static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 5, 0 };
+            snmp_oid_assign(&vb.oid, oid, LWIP_ARRAYSIZE(oid));
+            vb.value = &snmp_stats.wrongdigests;
+          }
+          break;
+          case SNMP_ERR_UNKNOWN_ENGINEID: {
+            static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 4, 0 };
+            snmp_oid_assign(&vb.oid, oid, LWIP_ARRAYSIZE(oid));
+            vb.value = &snmp_stats.unknownengineids;
+          }
+          break;
+          case SNMP_ERR_UNKNOWN_SECURITYNAME: {
+            static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 3, 0 };
+            snmp_oid_assign(&vb.oid, oid, LWIP_ARRAYSIZE(oid));
+            vb.value = &snmp_stats.unknownusernames;
+          }
+          break;
+          case SNMP_ERR_UNSUPPORTED_SECLEVEL: {
+            static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 1, 0 };
+            snmp_oid_assign(&vb.oid, oid, LWIP_ARRAYSIZE(oid));
+            vb.value = &snmp_stats.unsupportedseclevels;
+          }
+          break;
+          case SNMP_ERR_NOTINTIMEWINDOW: {
+            static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 2, 0 };
+            snmp_oid_assign(&vb.oid, oid, LWIP_ARRAYSIZE(oid));
+            vb.value = &snmp_stats.notintimewindows;
+          }
+          break;
+          case SNMP_ERR_DECRYIPTION_ERROR: {
+            static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 6, 0 };
+            snmp_oid_assign(&vb.oid, oid, LWIP_ARRAYSIZE(oid));
+            vb.value = &snmp_stats.decryptionerrors;
+          }
+          break;
+          default:
+            /* Unknown or unhandled error_status */
+            err = ERR_ARG;
+        }
+
+        if (err == ERR_OK) {
+          snmp_append_outbound_varbind(&(request.outbound_pbuf_stream), &vb);
+          request.error_status = SNMP_ERR_NOERROR;
+        }
+
+        request.request_out_type = (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_REPORT);
+        request.request_id = request.msg_id;
+      }
+#endif
 
       if (err == ERR_OK) {
         err = snmp_complete_outbound_frame(&request);
-      
+
         if (err == ERR_OK) {
           err = snmp_sendto(request.handle, request.outbound_pbuf, request.source_ip, request.source_port);
 
-          if ((request.request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) 
-            && (request.error_status == SNMP_ERR_NOERROR) 
-            && (snmp_write_callback != NULL)) {
+          if ((request.request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ)
+              && (request.error_status == SNMP_ERR_NOERROR)
+              && (snmp_write_callback != NULL)) {
             /* raise write notification for all written objects */
             snmp_execute_write_callbacks(&request);
           }
         }
       }
     }
-  
+
     if (request.outbound_pbuf != NULL) {
       pbuf_free(request.outbound_pbuf);
     }
@@ -230,21 +383,23 @@
 }
 
 static u8_t
-snmp_msg_getnext_validate_node_inst(struct snmp_node_instance* node_instance, void* validate_arg)
+snmp_msg_getnext_validate_node_inst(struct snmp_node_instance *node_instance, void *validate_arg)
 {
   if (((node_instance->access & SNMP_NODE_INSTANCE_ACCESS_READ) != SNMP_NODE_INSTANCE_ACCESS_READ) || (node_instance->get_value == NULL)) {
     return SNMP_ERR_NOSUCHINSTANCE;
   }
 
-  if ((node_instance->asn1_type == SNMP_ASN1_TYPE_COUNTER64) && (((struct snmp_request*)validate_arg)->version == SNMP_VERSION_1)) {
+#if LWIP_HAVE_INT64
+  if ((node_instance->asn1_type == SNMP_ASN1_TYPE_COUNTER64) && (((struct snmp_request *)validate_arg)->version == SNMP_VERSION_1)) {
     /* according to RFC 2089 skip Counter64 objects in GetNext requests from v1 clients */
     return SNMP_ERR_NOSUCHINSTANCE;
   }
+#endif
 
   return SNMP_ERR_NOERROR;
 }
 
-static void 
+static void
 snmp_process_varbind(struct snmp_request *request, struct snmp_varbind *vb, u8_t get_next)
 {
   err_t err;
@@ -296,10 +451,10 @@
     }
   } else {
     s16_t len = node_instance.get_value(&node_instance, vb->value);
-    vb->type = node_instance.asn1_type;
 
-    if(len >= 0) {
+    if (len >= 0) {
       vb->value_len = (u16_t)len; /* cast is OK because we checked >= 0 above */
+      vb->type = node_instance.asn1_type;
 
       LWIP_ASSERT("SNMP_MAX_VALUE_SIZE is configured too low", (vb->value_len & ~SNMP_GET_VALUE_RAW_DATA) <= SNMP_MAX_VALUE_SIZE);
       err = snmp_append_outbound_varbind(&request->outbound_pbuf_stream, vb);
@@ -388,7 +543,7 @@
       request->error_status = SNMP_ERR_GENERROR;
     }
   }
-  
+
   return ERR_OK;
 }
 
@@ -447,7 +602,7 @@
   while ((request->error_status == SNMP_ERR_NOERROR) && (repetitions > 0) && (request->outbound_pbuf_stream.offset != repetition_offset)) {
 
     u8_t all_endofmibview = 1;
-    
+
     snmp_vb_enumerator_init(&repetition_varbind_enumerator, request->outbound_pbuf, repetition_offset, request->outbound_pbuf_stream.offset - repetition_offset);
     repetition_offset = request->outbound_pbuf_stream.offset; /* for next loop */
 
@@ -478,7 +633,7 @@
       /* stop when all varbinds in a loop return EndOfMibView */
       break;
     }
-    
+
     repetitions--;
   }
 
@@ -510,7 +665,7 @@
     if (err == SNMP_VB_ENUMERATOR_ERR_OK) {
       struct snmp_node_instance node_instance;
       memset(&node_instance, 0, sizeof(node_instance));
-      
+
       request->error_status = snmp_get_node_instance_from_oid(vb.oid.id, vb.oid.len, &node_instance);
       if (request->error_status == SNMP_ERR_NOERROR) {
         if (node_instance.asn1_type != vb.type) {
@@ -615,9 +770,13 @@
   s32_t parent_tlv_value_len;
   s32_t s32_value;
   err_t err;
+#if LWIP_SNMP_V3
+  snmpv3_auth_algo_t auth;
+  snmpv3_priv_algo_t priv;
+#endif
 
   IF_PARSE_EXEC(snmp_pbuf_stream_init(&pbuf_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len));
-  
+
   /* decode main container consisting of version, community and PDU */
   IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
   IF_PARSE_ASSERT((tlv.type == SNMP_ASN1_TYPE_SEQUENCE) && (tlv.value_len == pbuf_stream.length));
@@ -628,15 +787,19 @@
   IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);
   parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
   IF_PARSE_ASSERT(parent_tlv_value_len > 0);
-  
+
   IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &s32_value));
-  if ((s32_value != SNMP_VERSION_1) &&
-      (s32_value != SNMP_VERSION_2c)
+
+  if (((s32_value != SNMP_VERSION_1) &&
+       (s32_value != SNMP_VERSION_2c)
 #if LWIP_SNMP_V3
-      && (s32_value != SNMP_VERSION_3)
+       && (s32_value != SNMP_VERSION_3)
 #endif
-     )
-  {
+      )
+#if LWIP_SNMP_CONFIGURE_VERSIONS
+      || (!snmp_version_enabled(s32_value))
+#endif
+     ) {
     /* unsupported SNMP version */
     snmp_stats.inbadversions++;
     return ERR_ARG;
@@ -650,8 +813,9 @@
 
     /* SNMPv3 doesn't use communities */
     /* @todo: Differentiate read/write access */
-    strcpy((char*)request->community, snmp_community);
-    request->community_strlen = (u16_t)strlen(snmp_community);
+    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);
 
     /* RFC3414 globalData */
     IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
@@ -720,7 +884,7 @@
     IF_PARSE_ASSERT(parent_tlv_value_len > 0);
 
     IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_authoritative_engine_id,
-        &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH));
+                                    &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH));
     request->msg_authoritative_engine_id_len = (u8_t)u16_value;
 
     /* msgAuthoritativeEngineBoots */
@@ -736,7 +900,6 @@
     parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
     IF_PARSE_ASSERT(parent_tlv_value_len > 0);
     IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->msg_authoritative_engine_time));
-    /* @todo: Implement time window checking */
 
     /* msgUserName */
     IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
@@ -745,10 +908,8 @@
     IF_PARSE_ASSERT(parent_tlv_value_len > 0);
 
     IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_user_name,
-        &u16_value, SNMP_V3_MAX_USER_LENGTH));
+                                    &u16_value, SNMP_V3_MAX_USER_LENGTH));
     request->msg_user_name_len = (u8_t)u16_value;
-    /* @todo: Implement unknown user error response */
-    IF_PARSE_EXEC(snmpv3_get_user((char*)request->msg_user_name, NULL, NULL, NULL, NULL));
 
     /* msgAuthenticationParameters */
     memset(request->msg_authentication_parameters, 0, SNMP_V3_MAX_AUTH_PARAM_LENGTH);
@@ -760,38 +921,10 @@
     inbound_msgAuthenticationParameters_offset = pbuf_stream.offset;
     LWIP_UNUSED_ARG(inbound_msgAuthenticationParameters_offset);
     /* Read auth parameters */
-    IF_PARSE_ASSERT(tlv.value_len <= SNMP_V3_MAX_AUTH_PARAM_LENGTH);
+    /* IF_PARSE_ASSERT(tlv.value_len <= SNMP_V3_MAX_AUTH_PARAM_LENGTH); */
     IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_authentication_parameters,
-        &u16_value, tlv.value_len));
-
-#if LWIP_SNMP_V3_CRYPTO
-    if (request->msg_flags & SNMP_V3_AUTH_FLAG) {
-      const u8_t zero_arr[SNMP_V3_MAX_AUTH_PARAM_LENGTH] = { 0 };
-      u8_t key[20];
-      u8_t algo;
-      u8_t hmac[LWIP_MAX(SNMP_V3_SHA_LEN, SNMP_V3_MD5_LEN)];
-      struct snmp_pbuf_stream auth_stream;
-
-      /* Rewind stream */
-      IF_PARSE_EXEC(snmp_pbuf_stream_init(&pbuf_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len));
-      IF_PARSE_EXEC(snmp_pbuf_stream_seek_abs(&pbuf_stream, inbound_msgAuthenticationParameters_offset));
-      /* Set auth parameters to zero for verification */
-      IF_PARSE_EXEC(snmp_asn1_enc_raw(&pbuf_stream, zero_arr, tlv.value_len));
-
-      /* Verify authentication */
-      IF_PARSE_EXEC(snmp_pbuf_stream_init(&auth_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len));
-
-      IF_PARSE_EXEC(snmpv3_get_user((char*)request->msg_user_name, &algo, key, NULL, NULL));
-      IF_PARSE_EXEC(snmpv3_auth(&auth_stream, request->inbound_pbuf->tot_len, key, algo, hmac));
-      /* @todo: Implement error response */
-      IF_PARSE_EXEC(memcmp(request->msg_authentication_parameters, hmac, SNMP_V3_MAX_AUTH_PARAM_LENGTH));
-    }
-#else
-    /* Ungraceful exit if we encounter cryptography and don't support it.
-     * @todo: Implement error response
-     */
-    IF_PARSE_ASSERT(!(request->msg_flags & (SNMP_V3_AUTH_FLAG | SNMP_V3_PRIV_FLAG)));
-#endif
+                                    &u16_value, tlv.value_len));
+    request->msg_authentication_parameters_len = (u8_t)u16_value;
 
     /* msgPrivacyParameters */
     memset(request->msg_privacy_parameters, 0, SNMP_V3_MAX_PRIV_PARAM_LENGTH);
@@ -801,25 +934,168 @@
     IF_PARSE_ASSERT(parent_tlv_value_len > 0);
 
     IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_privacy_parameters,
-        &u16_value, SNMP_V3_MAX_PRIV_PARAM_LENGTH));
+                                    &u16_value, SNMP_V3_MAX_PRIV_PARAM_LENGTH));
+    request->msg_privacy_parameters_len = (u8_t)u16_value;
 
+    /* validate securityParameters here (do this after decoding because we don't want to increase other counters for wrong frames)
+     * 1) securityParameters was correctly serialized if we reach here.
+     * 2) securityParameters are already cached.
+     * 3) if msgAuthoritativeEngineID is unknown, zero-length or too long:
+         b) https://tools.ietf.org/html/rfc3414#section-7
+     */
+    {
+      const char *eid;
+      u8_t eid_len;
+
+      snmpv3_get_engine_id(&eid, &eid_len);
+
+      if ((request->msg_authoritative_engine_id_len == 0) ||
+          (request->msg_authoritative_engine_id_len != eid_len) ||
+          (memcmp(eid, request->msg_authoritative_engine_id, eid_len) != 0)) {
+        snmp_stats.unknownengineids++;
+        request->msg_flags = 0; /* noauthnopriv */
+        request->error_status = SNMP_ERR_UNKNOWN_ENGINEID;
+        return ERR_OK;
+      }
+    }
+
+    /* 4) verify username */
+    if (snmpv3_get_user((char *)request->msg_user_name, &auth, NULL, &priv, NULL)) {
+      snmp_stats.unknownusernames++;
+      request->msg_flags = 0; /* noauthnopriv */
+      request->error_status = SNMP_ERR_UNKNOWN_SECURITYNAME;
+      return ERR_OK;
+    }
+
+    /* 5) verify security level */
+    switch (request->msg_flags & (SNMP_V3_AUTH_FLAG | SNMP_V3_PRIV_FLAG)) {
+      case SNMP_V3_NOAUTHNOPRIV:
+        if ((auth != SNMP_V3_AUTH_ALGO_INVAL) || (priv != SNMP_V3_PRIV_ALGO_INVAL)) {
+          /* Invalid security level for user */
+          snmp_stats.unsupportedseclevels++;
+          request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
+          request->error_status = SNMP_ERR_UNSUPPORTED_SECLEVEL;
+          return ERR_OK;
+        }
+        break;
 #if LWIP_SNMP_V3_CRYPTO
-    /* Decrypt message */
-    if (request->msg_flags & SNMP_V3_PRIV_FLAG) {
+      case SNMP_V3_AUTHNOPRIV:
+        if ((auth == SNMP_V3_AUTH_ALGO_INVAL) || (priv != SNMP_V3_PRIV_ALGO_INVAL)) {
+          /* Invalid security level for user */
+          snmp_stats.unsupportedseclevels++;
+          request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
+          request->error_status = SNMP_ERR_UNSUPPORTED_SECLEVEL;
+          return ERR_OK;
+        }
+        break;
+      case SNMP_V3_AUTHPRIV:
+        if ((auth == SNMP_V3_AUTH_ALGO_INVAL) || (priv == SNMP_V3_PRIV_ALGO_INVAL)) {
+          /* Invalid security level for user */
+          snmp_stats.unsupportedseclevels++;
+          request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
+          request->error_status = SNMP_ERR_UNSUPPORTED_SECLEVEL;
+          return ERR_OK;
+        }
+        break;
+#endif
+      default:
+        snmp_stats.unsupportedseclevels++;
+        request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
+        request->error_status = SNMP_ERR_UNSUPPORTED_SECLEVEL;
+        return ERR_OK;
+    }
+
+    /* 6) if securitylevel specifies authentication, authenticate message. */
+#if LWIP_SNMP_V3_CRYPTO
+    if (request->msg_flags & SNMP_V3_AUTH_FLAG) {
+      const u8_t zero_arr[SNMP_V3_MAX_AUTH_PARAM_LENGTH] = { 0 };
       u8_t key[20];
-      u8_t algo;
+      u8_t hmac[LWIP_MAX(SNMP_V3_SHA_LEN, SNMP_V3_MD5_LEN)];
+      struct snmp_pbuf_stream auth_stream;
+
+      if (request->msg_authentication_parameters_len > SNMP_V3_MAX_AUTH_PARAM_LENGTH) {
+        snmp_stats.wrongdigests++;
+        request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
+        request->error_status = SNMP_ERR_AUTHORIZATIONERROR;
+        return ERR_OK;
+      }
+
+      /* Rewind stream */
+      IF_PARSE_EXEC(snmp_pbuf_stream_init(&auth_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len));
+      IF_PARSE_EXEC(snmp_pbuf_stream_seek_abs(&auth_stream, inbound_msgAuthenticationParameters_offset));
+      /* Set auth parameters to zero for verification */
+      IF_PARSE_EXEC(snmp_asn1_enc_raw(&auth_stream, zero_arr, request->msg_authentication_parameters_len));
+
+      /* Verify authentication */
+      IF_PARSE_EXEC(snmp_pbuf_stream_init(&auth_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len));
+
+      IF_PARSE_EXEC(snmpv3_get_user((char *)request->msg_user_name, &auth, key, NULL, NULL));
+      IF_PARSE_EXEC(snmpv3_auth(&auth_stream, request->inbound_pbuf->tot_len, key, auth, hmac));
+
+      if (memcmp(request->msg_authentication_parameters, hmac, SNMP_V3_MAX_AUTH_PARAM_LENGTH)) {
+        snmp_stats.wrongdigests++;
+        request->msg_flags = SNMP_V3_NOAUTHNOPRIV;
+        request->error_status = SNMP_ERR_AUTHORIZATIONERROR;
+        return ERR_OK;
+      }
+
+      /* 7) if securitylevel specifies authentication, verify engineboots, enginetime and lastenginetime */
+      {
+        s32_t boots = snmpv3_get_engine_boots_internal();
+        if ((request->msg_authoritative_engine_boots != boots) || (boots == 2147483647UL)) {
+          snmp_stats.notintimewindows++;
+          request->msg_flags = SNMP_V3_AUTHNOPRIV;
+          request->error_status = SNMP_ERR_NOTINTIMEWINDOW;
+          return ERR_OK;
+        }
+      }
+      {
+        s32_t time = snmpv3_get_engine_time_internal();
+        if (request->msg_authoritative_engine_time > (time + 150)) {
+          snmp_stats.notintimewindows++;
+          request->msg_flags = SNMP_V3_AUTHNOPRIV;
+          request->error_status = SNMP_ERR_NOTINTIMEWINDOW;
+          return ERR_OK;
+        } else if (time > 150) {
+          if (request->msg_authoritative_engine_time < (time - 150)) {
+            snmp_stats.notintimewindows++;
+            request->msg_flags = SNMP_V3_AUTHNOPRIV;
+            request->error_status = SNMP_ERR_NOTINTIMEWINDOW;
+            return ERR_OK;
+          }
+        }
+      }
+    }
+#endif
+
+    /* 8) if securitylevel specifies privacy, decrypt message. */
+#if LWIP_SNMP_V3_CRYPTO
+    if (request->msg_flags & SNMP_V3_PRIV_FLAG) {
+      /* Decrypt message */
+
+      u8_t key[20];
 
       IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
       IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);
       parent_tlv_value_len -= SNMP_ASN1_TLV_HDR_LENGTH(tlv);
       IF_PARSE_ASSERT(parent_tlv_value_len > 0);
 
-      IF_PARSE_EXEC(snmpv3_get_user((char*)request->msg_user_name, NULL, NULL, &algo, key));
-      IF_PARSE_EXEC(snmpv3_crypt(&pbuf_stream, tlv.value_len, key,
-          request->msg_privacy_parameters, request->msg_authoritative_engine_boots,
-          request->msg_authoritative_engine_time, algo, SNMP_V3_PRIV_MODE_DECRYPT));
+      IF_PARSE_EXEC(snmpv3_get_user((char *)request->msg_user_name, NULL, NULL, &priv, key));
+      if (snmpv3_crypt(&pbuf_stream, tlv.value_len, key,
+                       request->msg_privacy_parameters, request->msg_authoritative_engine_boots,
+                       request->msg_authoritative_engine_time, priv, SNMP_V3_PRIV_MODE_DECRYPT) != ERR_OK) {
+        snmp_stats.decryptionerrors++;
+        request->msg_flags = SNMP_V3_AUTHNOPRIV;
+        request->error_status = SNMP_ERR_DECRYIPTION_ERROR;
+        return ERR_OK;
+      }
     }
 #endif
+    /* 9) calculate max size of scoped pdu?
+     * 10) securityname for user is retrieved from usertable?
+     * 11) security data is cached?
+     * 12)
+     */
 
     /* Scoped PDU
      * Encryption context
@@ -836,8 +1112,9 @@
     IF_PARSE_ASSERT(parent_tlv_value_len > 0);
 
     IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->context_engine_id,
-        &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH));
+                                    &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH));
     request->context_engine_id_len = (u8_t)u16_value;
+    /* TODO: do we need to verify this contextengineid too? */
 
     /* contextName */
     IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
@@ -846,27 +1123,28 @@
     IF_PARSE_ASSERT(parent_tlv_value_len > 0);
 
     IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->context_name,
-        &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH));
+                                    &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH));
     request->context_name_len = (u8_t)u16_value;
+    /* TODO: do we need to verify this contextname too? */
   } else
 #endif
   {
-  /* decode community */
-  IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
-  IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);
-  parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
-  IF_PARSE_ASSERT(parent_tlv_value_len > 0);
+    /* decode community */
+    IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
+    IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);
+    parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
+    IF_PARSE_ASSERT(parent_tlv_value_len > 0);
 
-  err = snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->community, &request->community_strlen, SNMP_MAX_COMMUNITY_STR_LEN);
-  if (err == ERR_MEM) {
-    /* community string does not fit in our buffer -> its too long -> its invalid */
-    request->community_strlen = 0;
-    snmp_pbuf_stream_seek(&pbuf_stream, tlv.value_len);
-  } else {
-    IF_PARSE_ASSERT(err == ERR_OK);
-  }
-  /* add zero terminator */
-  request->community[request->community_strlen] = 0;
+    err = snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->community, &request->community_strlen, SNMP_MAX_COMMUNITY_STR_LEN);
+    if (err == ERR_MEM) {
+      /* community string does not fit in our buffer -> its too long -> its invalid */
+      request->community_strlen = 0;
+      snmp_pbuf_stream_seek(&pbuf_stream, tlv.value_len);
+    } else {
+      IF_PARSE_ASSERT(err == ERR_OK);
+    }
+    /* add zero terminator */
+    request->community[request->community_strlen] = 0;
   }
 
   /* decode PDU type (next container level) */
@@ -876,7 +1154,7 @@
   parent_tlv_value_len = tlv.value_len;
 
   /* validate PDU type */
-  switch(tlv.type) {
+  switch (tlv.type) {
     case (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_REQ):
       /* GetRequest PDU */
       snmp_stats.ingetrequests++;
@@ -900,9 +1178,9 @@
       /* unsupported input PDU for this agent (no parse error) */
       LWIP_DEBUGF(SNMP_DEBUG, ("Unknown/Invalid SNMP PDU type received: %d", tlv.type)); \
       return ERR_ARG;
-      break;
   }
   request->request_type = tlv.type & SNMP_ASN1_DATATYPE_MASK;
+  request->request_out_type = (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_RESP);
 
   /* validate community (do this after decoding PDU type because we don't want to increase 'inbadcommunitynames' for wrong frame types */
   if (request->community_strlen == 0) {
@@ -915,27 +1193,27 @@
       /* our write community is empty, that means all our objects are readonly */
       request->error_status = SNMP_ERR_NOTWRITABLE;
       request->error_index  = 1;
-    } else if (strncmp(snmp_community_write, (const char*)request->community, SNMP_MAX_COMMUNITY_STR_LEN) != 0) {
+    } else if (strncmp(snmp_community_write, (const char *)request->community, SNMP_MAX_COMMUNITY_STR_LEN) != 0) {
       /* community name does not match */
       snmp_stats.inbadcommunitynames++;
       snmp_authfail_trap();
       return ERR_ARG;
     }
-  } else { 
-    if (strncmp(snmp_community, (const char*)request->community, SNMP_MAX_COMMUNITY_STR_LEN) != 0) {
+  } else {
+    if (strncmp(snmp_community, (const char *)request->community, SNMP_MAX_COMMUNITY_STR_LEN) != 0) {
       /* community name does not match */
       snmp_stats.inbadcommunitynames++;
       snmp_authfail_trap();
       return ERR_ARG;
     }
   }
-  
+
   /* decode request ID */
   IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
   IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);
   parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);
   IF_PARSE_ASSERT(parent_tlv_value_len > 0);
-  
+
   IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->request_id));
 
   /* decode error status / non-repeaters */
@@ -976,7 +1254,7 @@
   /* decode varbind-list type (next container level) */
   IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
   IF_PARSE_ASSERT((tlv.type == SNMP_ASN1_TYPE_SEQUENCE) && (tlv.value_len <= pbuf_stream.length));
-  
+
   request->inbound_varbind_offset = pbuf_stream.offset;
   request->inbound_varbind_len    = pbuf_stream.length - request->inbound_padding_len;
   snmp_vb_enumerator_init(&(request->inbound_varbind_enumerator), request->inbound_pbuf, request->inbound_varbind_offset, request->inbound_varbind_len);
@@ -990,7 +1268,7 @@
 snmp_prepare_outbound_frame(struct snmp_request *request)
 {
   struct snmp_asn1_tlv tlv;
-  struct snmp_pbuf_stream* pbuf_stream = &(request->outbound_pbuf_stream);
+  struct snmp_pbuf_stream *pbuf_stream = &(request->outbound_pbuf_stream);
 
   /* try allocating pbuf(s) for maximum response size */
   request->outbound_pbuf = pbuf_alloc(PBUF_TRANSPORT, 1472, PBUF_RAM);
@@ -1013,13 +1291,13 @@
 #if LWIP_SNMP_V3
   if (request->version < SNMP_VERSION_3) {
 #endif
-  /* community */
-  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->community_strlen);
-  OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
-  OF_BUILD_EXEC( snmp_asn1_enc_raw(pbuf_stream, request->community, request->community_strlen) );
+    /* community */
+    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->community_strlen);
+    OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
+    OF_BUILD_EXEC( snmp_asn1_enc_raw(pbuf_stream, request->community, request->community_strlen) );
 #if LWIP_SNMP_V3
   } else {
-    const char* id;
+    const char *id;
 
     /* globalData */
     request->outbound_msg_global_data_offset = pbuf_stream->offset;
@@ -1152,7 +1430,7 @@
 
   /* 'PDU' sequence */
   request->outbound_pdu_offset = pbuf_stream->offset;
-  SNMP_ASN1_SET_TLV_PARAMS(tlv, (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_RESP), 3, 0);
+  SNMP_ASN1_SET_TLV_PARAMS(tlv, request->request_out_type, 3, 0);
   OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
 
   /* request ID */
@@ -1200,7 +1478,7 @@
         if (varbind->value_len != sizeof (s32_t)) {
           return ERR_VAL;
         }
-        snmp_asn1_enc_s32t_cnt(*((s32_t*) varbind->value), &len->value_value_len);
+        snmp_asn1_enc_s32t_cnt(*((s32_t *) varbind->value), &len->value_value_len);
         break;
       case SNMP_ASN1_TYPE_COUNTER:
       case SNMP_ASN1_TYPE_GAUGE:
@@ -1208,7 +1486,7 @@
         if (varbind->value_len != sizeof (u32_t)) {
           return ERR_VAL;
         }
-        snmp_asn1_enc_u32t_cnt(*((u32_t*) varbind->value), &len->value_value_len);
+        snmp_asn1_enc_u32t_cnt(*((u32_t *) varbind->value), &len->value_value_len);
         break;
       case SNMP_ASN1_TYPE_OCTET_STRING:
       case SNMP_ASN1_TYPE_IPADDR:
@@ -1225,14 +1503,16 @@
         if ((varbind->value_len & 0x03) != 0) {
           return ERR_VAL;
         }
-        snmp_asn1_enc_oid_cnt((u32_t*) varbind->value, varbind->value_len >> 2, &len->value_value_len);
+        snmp_asn1_enc_oid_cnt((u32_t *) varbind->value, varbind->value_len >> 2, &len->value_value_len);
         break;
+#if LWIP_HAVE_INT64
       case SNMP_ASN1_TYPE_COUNTER64:
-        if (varbind->value_len != (2 * sizeof (u32_t))) {
+        if (varbind->value_len != sizeof(u64_t)) {
           return ERR_VAL;
         }
-        snmp_asn1_enc_u64t_cnt((u32_t*) varbind->value, &len->value_value_len);
+        snmp_asn1_enc_u64t_cnt(*(u64_t *)varbind->value, &len->value_value_len);
         break;
+#endif
       default:
         /* unsupported type */
         return ERR_VAL;
@@ -1249,7 +1529,7 @@
 #define OVB_BUILD_EXEC(code) BUILD_EXEC(code, ERR_ARG)
 
 err_t
-snmp_append_outbound_varbind(struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind* varbind)
+snmp_append_outbound_varbind(struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind *varbind)
 {
   struct snmp_asn1_tlv tlv;
   struct snmp_varbind_len len;
@@ -1283,29 +1563,31 @@
 
   if (len.value_value_len > 0) {
     if (varbind->value_len & SNMP_GET_VALUE_RAW_DATA) {
-      OVB_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, (u8_t*) varbind->value, len.value_value_len));
+      OVB_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, (u8_t *) varbind->value, len.value_value_len));
     } else {
       switch (varbind->type) {
         case SNMP_ASN1_TYPE_INTEGER:
-          OVB_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, len.value_value_len, *((s32_t*) varbind->value)));
+          OVB_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, len.value_value_len, *((s32_t *) varbind->value)));
           break;
         case SNMP_ASN1_TYPE_COUNTER:
         case SNMP_ASN1_TYPE_GAUGE:
         case SNMP_ASN1_TYPE_TIMETICKS:
-          OVB_BUILD_EXEC(snmp_asn1_enc_u32t(pbuf_stream, len.value_value_len, *((u32_t*) varbind->value)));
+          OVB_BUILD_EXEC(snmp_asn1_enc_u32t(pbuf_stream, len.value_value_len, *((u32_t *) varbind->value)));
           break;
         case SNMP_ASN1_TYPE_OCTET_STRING:
         case SNMP_ASN1_TYPE_IPADDR:
         case SNMP_ASN1_TYPE_OPAQUE:
-          OVB_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, (u8_t*) varbind->value, len.value_value_len));
+          OVB_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, (u8_t *) varbind->value, len.value_value_len));
           len.value_value_len = varbind->value_len;
           break;
         case SNMP_ASN1_TYPE_OBJECT_ID:
-          OVB_BUILD_EXEC(snmp_asn1_enc_oid(pbuf_stream, (u32_t*) varbind->value, varbind->value_len / sizeof (u32_t)));
+          OVB_BUILD_EXEC(snmp_asn1_enc_oid(pbuf_stream, (u32_t *) varbind->value, varbind->value_len / sizeof (u32_t)));
           break;
+#if LWIP_HAVE_INT64
         case SNMP_ASN1_TYPE_COUNTER64:
-          OVB_BUILD_EXEC(snmp_asn1_enc_u64t(pbuf_stream, len.value_value_len, (u32_t*) varbind->value));
+          OVB_BUILD_EXEC(snmp_asn1_enc_u64t(pbuf_stream, len.value_value_len, *(u64_t *) varbind->value));
           break;
+#endif
         default:
           LWIP_ASSERT("Unknown variable type", 0);
           break;
@@ -1327,8 +1609,8 @@
     if (request->error_status != SNMP_ERR_NOERROR) {
       /* map v2c error codes to v1 compliant error code (according to RFC 2089) */
       switch (request->error_status) {
-        /* mapping of implementation specific "virtual" error codes 
-         * (during processing of frame we already stored them in error_status field, 
+        /* mapping of implementation specific "virtual" error codes
+         * (during processing of frame we already stored them in error_status field,
          * so no need to check all varbinds here for those exceptions as suggested by RFC) */
         case SNMP_ERR_NOSUCHINSTANCE:
         case SNMP_ERR_NOSUCHOBJECT:
@@ -1356,7 +1638,7 @@
         default:
           request->error_status = SNMP_ERR_GENERROR;
           break;
-       }
+      }
     }
   } else {
     if (request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) {
@@ -1384,7 +1666,7 @@
     struct snmp_pbuf_stream inbound_stream;
     OF_BUILD_EXEC( snmp_pbuf_stream_init(&inbound_stream, request->inbound_pbuf, request->inbound_varbind_offset, request->inbound_varbind_len) );
     OF_BUILD_EXEC( snmp_pbuf_stream_init(&(request->outbound_pbuf_stream), request->outbound_pbuf, request->outbound_varbind_offset, request->outbound_pbuf->tot_len - request->outbound_varbind_offset) );
-    snmp_pbuf_stream_writeto(&inbound_stream, &(request->outbound_pbuf_stream), 0);
+    OF_BUILD_EXEC( snmp_pbuf_stream_writeto(&inbound_stream, &(request->outbound_pbuf_stream), 0) );
   }
 
   frame_size = request->outbound_pbuf_stream.offset;
@@ -1395,7 +1677,7 @@
     u8_t i;
     outbound_padding = (8 - (u8_t)((frame_size - request->outbound_scoped_pdu_seq_offset) & 0x07)) & 0x07;
     for (i = 0; i < outbound_padding; i++) {
-      snmp_pbuf_stream_write(&request->outbound_pbuf_stream, 0);
+      OF_BUILD_EXEC( snmp_pbuf_stream_write(&request->outbound_pbuf_stream, 0) );
     }
   }
 #endif
@@ -1410,18 +1692,18 @@
     /* complete missing length in 'globalData' sequence */
     /* - type - length_len(fixed, see snmp_prepare_outbound_frame()) */
     SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 1, request->outbound_msg_global_data_end
-        - request->outbound_msg_global_data_offset - 1 - 1);
+                             - request->outbound_msg_global_data_offset - 1 - 1);
     OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_msg_global_data_offset));
     OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));
 
     /* complete missing length in 'msgSecurityParameters' sequence */
     SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 1, request->outbound_msg_security_parameters_end
-        - request->outbound_msg_security_parameters_str_offset - 1 - 1);
+                             - request->outbound_msg_security_parameters_str_offset - 1 - 1);
     OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_msg_security_parameters_str_offset));
     OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));
 
     SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 1, request->outbound_msg_security_parameters_end
-        - request->outbound_msg_security_parameters_seq_offset - 1 - 1);
+                             - request->outbound_msg_security_parameters_seq_offset - 1 - 1);
     OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_msg_security_parameters_seq_offset));
     OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));
 
@@ -1433,8 +1715,8 @@
 #endif
 
   /* complete missing length in 'PDU' sequence */
-  SNMP_ASN1_SET_TLV_PARAMS(tlv, (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_RESP), 3,
-      frame_size - request->outbound_pdu_offset - 1 - 3); /* - type - length_len(fixed, see snmp_prepare_outbound_frame()) */
+  SNMP_ASN1_SET_TLV_PARAMS(tlv, request->request_out_type, 3,
+                           frame_size - request->outbound_pdu_offset - 1 - 3); /* - type - length_len(fixed, see snmp_prepare_outbound_frame()) */
   OF_BUILD_EXEC( snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_pdu_offset) );
   OF_BUILD_EXEC( snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv) );
 
@@ -1502,42 +1784,42 @@
   /* Encrypt response */
   if (request->version == SNMP_VERSION_3 && (request->msg_flags & SNMP_V3_PRIV_FLAG)) {
     u8_t key[20];
-    u8_t algo;
+    snmpv3_priv_algo_t algo;
 
     /* complete missing length in PDU sequence */
     OF_BUILD_EXEC(snmp_pbuf_stream_init(&request->outbound_pbuf_stream, request->outbound_pbuf, 0, request->outbound_pbuf->tot_len));
     OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_scoped_pdu_string_offset));
     SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 3, frame_size + outbound_padding
-        - request->outbound_scoped_pdu_string_offset - 1 - 3);
+                             - request->outbound_scoped_pdu_string_offset - 1 - 3);
     OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));
 
-    OF_BUILD_EXEC(snmpv3_get_user((char*)request->msg_user_name, NULL, NULL, &algo, key));
+    OF_BUILD_EXEC(snmpv3_get_user((char *)request->msg_user_name, NULL, NULL, &algo, key));
 
     OF_BUILD_EXEC(snmpv3_crypt(&request->outbound_pbuf_stream, tlv.value_len, key,
-        request->msg_privacy_parameters, request->msg_authoritative_engine_boots,
-        request->msg_authoritative_engine_time, algo, SNMP_V3_PRIV_MODE_ENCRYPT));
+                               request->msg_privacy_parameters, request->msg_authoritative_engine_boots,
+                               request->msg_authoritative_engine_time, algo, SNMP_V3_PRIV_MODE_ENCRYPT));
   }
 
   if (request->version == SNMP_VERSION_3 && (request->msg_flags & SNMP_V3_AUTH_FLAG)) {
     u8_t key[20];
-    u8_t algo;
+    snmpv3_auth_algo_t algo;
     u8_t hmac[20];
 
-    OF_BUILD_EXEC(snmpv3_get_user((char*)request->msg_user_name, &algo, key, NULL, NULL));
+    OF_BUILD_EXEC(snmpv3_get_user((char *)request->msg_user_name, &algo, key, NULL, NULL));
     OF_BUILD_EXEC(snmp_pbuf_stream_init(&(request->outbound_pbuf_stream),
-        request->outbound_pbuf, 0, request->outbound_pbuf->tot_len));
+                                        request->outbound_pbuf, 0, request->outbound_pbuf->tot_len));
     OF_BUILD_EXEC(snmpv3_auth(&request->outbound_pbuf_stream, frame_size + outbound_padding, key, algo, hmac));
 
     MEMCPY(request->msg_authentication_parameters, hmac, SNMP_V3_MAX_AUTH_PARAM_LENGTH);
     OF_BUILD_EXEC(snmp_pbuf_stream_init(&request->outbound_pbuf_stream,
-                  request->outbound_pbuf, 0, request->outbound_pbuf->tot_len));
+                                        request->outbound_pbuf, 0, request->outbound_pbuf->tot_len));
     OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&request->outbound_pbuf_stream,
-                  request->outbound_msg_authentication_parameters_offset));
+                                            request->outbound_msg_authentication_parameters_offset));
 
     SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 1, SNMP_V3_MAX_AUTH_PARAM_LENGTH);
     OF_BUILD_EXEC(snmp_ans1_enc_tlv(&request->outbound_pbuf_stream, &tlv));
     OF_BUILD_EXEC(snmp_asn1_enc_raw(&request->outbound_pbuf_stream,
-                  request->msg_authentication_parameters, SNMP_V3_MAX_AUTH_PARAM_LENGTH));
+                                    request->msg_authentication_parameters, SNMP_V3_MAX_AUTH_PARAM_LENGTH));
   }
 #endif
 
@@ -1549,7 +1831,7 @@
   return ERR_OK;
 }
 
-static void 
+static void
 snmp_execute_write_callbacks(struct snmp_request *request)
 {
   struct snmp_varbind_enumerator inbound_varbind_enumerator;
@@ -1569,7 +1851,7 @@
 /* ----------------------------------------------------------------------- */
 
 void
-snmp_vb_enumerator_init(struct snmp_varbind_enumerator* enumerator, struct pbuf* p, u16_t offset, u16_t length)
+snmp_vb_enumerator_init(struct snmp_varbind_enumerator *enumerator, struct pbuf *p, u16_t offset, u16_t length)
 {
   snmp_pbuf_stream_init(&(enumerator->pbuf_stream), p, offset, length);
   enumerator->varbind_count = 0;
@@ -1579,14 +1861,13 @@
 #define VB_PARSE_ASSERT(code) PARSE_ASSERT(code, SNMP_VB_ENUMERATOR_ERR_ASN1ERROR)
 
 snmp_vb_enumerator_err_t
-snmp_vb_enumerator_get_next(struct snmp_varbind_enumerator* enumerator, struct snmp_varbind* varbind)
+snmp_vb_enumerator_get_next(struct snmp_varbind_enumerator *enumerator, struct snmp_varbind *varbind)
 {
   struct snmp_asn1_tlv tlv;
   u16_t  varbind_len;
   err_t  err;
-  
-  if (enumerator->pbuf_stream.length == 0)
-  {
+
+  if (enumerator->pbuf_stream.length == 0) {
     return SNMP_VB_ENUMERATOR_ERR_EOVB;
   }
   enumerator->varbind_count++;
@@ -1599,7 +1880,7 @@
   /* decode varbind name (object id) */
   VB_PARSE_EXEC(snmp_asn1_dec_tlv(&(enumerator->pbuf_stream), &tlv));
   VB_PARSE_ASSERT((tlv.type == SNMP_ASN1_TYPE_OBJECT_ID) && (SNMP_ASN1_TLV_LENGTH(tlv) < varbind_len) && (tlv.value_len < enumerator->pbuf_stream.length));
-   
+
   VB_PARSE_EXEC(snmp_asn1_dec_oid(&(enumerator->pbuf_stream), tlv.value_len, varbind->oid.id, &(varbind->oid.len), SNMP_MAX_OBJ_ID_LEN));
   varbind_len -= SNMP_ASN1_TLV_LENGTH(tlv);
 
@@ -1612,18 +1893,18 @@
   if (varbind->value != NULL) {
     switch (varbind->type) {
       case SNMP_ASN1_TYPE_INTEGER:
-        VB_PARSE_EXEC(snmp_asn1_dec_s32t(&(enumerator->pbuf_stream), tlv.value_len, (s32_t*)varbind->value));
-        varbind->value_len = sizeof(s32_t*);
+        VB_PARSE_EXEC(snmp_asn1_dec_s32t(&(enumerator->pbuf_stream), tlv.value_len, (s32_t *)varbind->value));
+        varbind->value_len = sizeof(s32_t);
         break;
       case SNMP_ASN1_TYPE_COUNTER:
       case SNMP_ASN1_TYPE_GAUGE:
       case SNMP_ASN1_TYPE_TIMETICKS:
-        VB_PARSE_EXEC(snmp_asn1_dec_u32t(&(enumerator->pbuf_stream), tlv.value_len, (u32_t*)varbind->value));
-        varbind->value_len = sizeof(u32_t*);
+        VB_PARSE_EXEC(snmp_asn1_dec_u32t(&(enumerator->pbuf_stream), tlv.value_len, (u32_t *)varbind->value));
+        varbind->value_len = sizeof(u32_t);
         break;
       case SNMP_ASN1_TYPE_OCTET_STRING:
       case SNMP_ASN1_TYPE_OPAQUE:
-        err = snmp_asn1_dec_raw(&(enumerator->pbuf_stream), tlv.value_len, (u8_t*)varbind->value, &varbind->value_len, SNMP_MAX_VALUE_SIZE);
+        err = snmp_asn1_dec_raw(&(enumerator->pbuf_stream), tlv.value_len, (u8_t *)varbind->value, &varbind->value_len, SNMP_MAX_VALUE_SIZE);
         if (err == ERR_MEM) {
           return SNMP_VB_ENUMERATOR_ERR_INVALIDLENGTH;
         }
@@ -1634,7 +1915,7 @@
         break;
       case SNMP_ASN1_TYPE_OBJECT_ID:
         /* misuse tlv.length_len as OID_length transporter */
-        err = snmp_asn1_dec_oid(&(enumerator->pbuf_stream), tlv.value_len, (u32_t*)varbind->value, &tlv.length_len, SNMP_MAX_OBJ_ID_LEN);
+        err = snmp_asn1_dec_oid(&(enumerator->pbuf_stream), tlv.value_len, (u32_t *)varbind->value, &tlv.length_len, SNMP_MAX_OBJ_ID_LEN);
         if (err == ERR_MEM) {
           return SNMP_VB_ENUMERATOR_ERR_INVALIDLENGTH;
         }
@@ -1644,15 +1925,17 @@
       case SNMP_ASN1_TYPE_IPADDR:
         if (tlv.value_len == 4) {
           /* must be exactly 4 octets! */
-          VB_PARSE_EXEC(snmp_asn1_dec_raw(&(enumerator->pbuf_stream), tlv.value_len, (u8_t*)varbind->value, &varbind->value_len, SNMP_MAX_VALUE_SIZE));
+          VB_PARSE_EXEC(snmp_asn1_dec_raw(&(enumerator->pbuf_stream), tlv.value_len, (u8_t *)varbind->value, &varbind->value_len, SNMP_MAX_VALUE_SIZE));
         } else {
           VB_PARSE_ASSERT(0);
         }
         break;
+#if LWIP_HAVE_INT64
       case SNMP_ASN1_TYPE_COUNTER64:
-        VB_PARSE_EXEC(snmp_asn1_dec_u64t(&(enumerator->pbuf_stream), tlv.value_len, (u32_t*)varbind->value));
-        varbind->value_len = 2 * sizeof(u32_t*);
+        VB_PARSE_EXEC(snmp_asn1_dec_u64t(&(enumerator->pbuf_stream), tlv.value_len, (u64_t *)varbind->value));
+        varbind->value_len = sizeof(u64_t);
         break;
+#endif
       default:
         VB_PARSE_ASSERT(0);
         break;
diff --git a/src/apps/snmp/snmp_msg.h b/src/apps/snmp/snmp_msg.h
index 2d01ef3..903f08a 100644
--- a/src/apps/snmp/snmp_msg.h
+++ b/src/apps/snmp/snmp_msg.h
@@ -57,24 +57,12 @@
 extern "C" {
 #endif
 
-/* The listen port of the SNMP agent. Clients have to make their requests to
-   this port. Most standard clients won't work if you change this! */
-#ifndef SNMP_IN_PORT
-#define SNMP_IN_PORT 161
-#endif
-/* The remote port the SNMP agent sends traps to. Most standard trap sinks won't
-   work if you change this! */
-#ifndef SNMP_TRAP_PORT
-#define SNMP_TRAP_PORT 162
-#endif
-
 /* version defines used in PDU */
 #define SNMP_VERSION_1  0
 #define SNMP_VERSION_2c 1
 #define SNMP_VERSION_3  3
 
-struct snmp_varbind_enumerator
-{
+struct snmp_varbind_enumerator {
   struct snmp_pbuf_stream pbuf_stream;
   u16_t varbind_count;
 };
@@ -86,11 +74,10 @@
   SNMP_VB_ENUMERATOR_ERR_INVALIDLENGTH = 3
 } snmp_vb_enumerator_err_t;
 
-void snmp_vb_enumerator_init(struct snmp_varbind_enumerator* enumerator, struct pbuf* p, u16_t offset, u16_t length);
-snmp_vb_enumerator_err_t snmp_vb_enumerator_get_next(struct snmp_varbind_enumerator* enumerator, struct snmp_varbind* varbind);
+void snmp_vb_enumerator_init(struct snmp_varbind_enumerator *enumerator, struct pbuf *p, u16_t offset, u16_t length);
+snmp_vb_enumerator_err_t snmp_vb_enumerator_get_next(struct snmp_varbind_enumerator *enumerator, struct snmp_varbind *varbind);
 
-struct snmp_request
-{
+struct snmp_request {
   /* Communication handle */
   void *handle;
   /* source IP address */
@@ -115,7 +102,10 @@
   s32_t non_repeaters;
   /* max-repetitions (getBulkRequest (SNMPv2c)) */
   s32_t max_repetitions;
-  
+
+  /* Usually response-pdu (2). When snmpv3 errors are detected report-pdu(8) */
+  u8_t request_out_type;
+
 #if LWIP_SNMP_V3
   s32_t msg_id;
   s32_t msg_max_size;
@@ -128,7 +118,9 @@
   u8_t  msg_user_name[SNMP_V3_MAX_USER_LENGTH];
   u8_t  msg_user_name_len;
   u8_t  msg_authentication_parameters[SNMP_V3_MAX_AUTH_PARAM_LENGTH];
+  u8_t  msg_authentication_parameters_len;
   u8_t  msg_privacy_parameters[SNMP_V3_MAX_PRIV_PARAM_LENGTH];
+  u8_t  msg_privacy_parameters_len;
   u8_t  context_engine_id[SNMP_V3_MAX_ENGINE_ID_LENGTH];
   u8_t  context_engine_id_len;
   u8_t  context_name[SNMP_V3_MAX_ENGINE_ID_LENGTH];
@@ -162,8 +154,7 @@
 };
 
 /** A helper struct keeping length information about varbinds */
-struct snmp_varbind_len
-{
+struct snmp_varbind_len {
   u8_t  vb_len_len;
   u16_t vb_value_len;
   u8_t  oid_len_len;
@@ -177,13 +168,13 @@
 /** Agent community string for write access */
 extern const char *snmp_community_write;
 /** handle for sending traps */
-extern void* snmp_traps_handle;
+extern void *snmp_traps_handle;
 
 void snmp_receive(void *handle, struct pbuf *p, const ip_addr_t *source_ip, u16_t port);
 err_t snmp_sendto(void *handle, struct pbuf *p, const ip_addr_t *dst, u16_t port);
-u8_t snmp_get_local_ip_for_dst(void* handle, const ip_addr_t *dst, ip_addr_t *result);
+u8_t snmp_get_local_ip_for_dst(void *handle, const ip_addr_t *dst, ip_addr_t *result);
 err_t snmp_varbind_length(struct snmp_varbind *varbind, struct snmp_varbind_len *len);
-err_t snmp_append_outbound_varbind(struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind* varbind);
+err_t snmp_append_outbound_varbind(struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind *varbind);
 
 #ifdef __cplusplus
 }
diff --git a/src/apps/snmp/snmp_netconn.c b/src/apps/snmp/snmp_netconn.c
index 24c3e26..8850acb 100644
--- a/src/apps/snmp/snmp_netconn.c
+++ b/src/apps/snmp/snmp_netconn.c
@@ -42,6 +42,7 @@
 #include "lwip/udp.h"
 #include "snmp_msg.h"
 #include "lwip/sys.h"
+#include "lwip/prot/iana.h"
 
 /** SNMP netconn API worker thread */
 static void
@@ -51,17 +52,17 @@
   struct netbuf *buf;
   err_t err;
   LWIP_UNUSED_ARG(arg);
-  
+
   /* Bind to SNMP port with default IP address */
 #if LWIP_IPV6
   conn = netconn_new(NETCONN_UDP_IPV6);
-  netconn_bind(conn, IP6_ADDR_ANY, SNMP_IN_PORT);
+  netconn_bind(conn, IP6_ADDR_ANY, LWIP_IANA_PORT_SNMP);
 #else /* LWIP_IPV6 */
   conn = netconn_new(NETCONN_UDP);
-  netconn_bind(conn, IP4_ADDR_ANY, SNMP_IN_PORT);
+  netconn_bind(conn, IP4_ADDR_ANY, LWIP_IANA_PORT_SNMP);
 #endif /* LWIP_IPV6 */
   LWIP_ERROR("snmp_netconn: invalid conn", (conn != NULL), return;);
-  
+
   snmp_traps_handle = conn;
 
   do {
@@ -74,28 +75,28 @@
     if (buf != NULL) {
       netbuf_delete(buf);
     }
-  } while(1);
+  } while (1);
 }
 
-err_t 
+err_t
 snmp_sendto(void *handle, struct pbuf *p, const ip_addr_t *dst, u16_t port)
 {
   err_t result;
   struct netbuf buf;
-  
+
   memset(&buf, 0, sizeof(buf));
   buf.p = p;
-  result = netconn_sendto((struct netconn*)handle, &buf, dst, port);
-  
+  result = netconn_sendto((struct netconn *)handle, &buf, dst, port);
+
   return result;
 }
 
 u8_t
-snmp_get_local_ip_for_dst(void* handle, const ip_addr_t *dst, ip_addr_t *result)
+snmp_get_local_ip_for_dst(void *handle, const ip_addr_t *dst, ip_addr_t *result)
 {
-  struct netconn* conn = (struct netconn*)handle;
+  struct netconn *conn = (struct netconn *)handle;
   struct netif *dst_if;
-  const ip_addr_t* dst_ip;
+  const ip_addr_t *dst_ip;
 
   LWIP_UNUSED_ARG(conn); /* unused in case of IPV4 only configuration */
 
@@ -115,6 +116,7 @@
 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 3c1217d..42867fb 100644
--- a/src/apps/snmp/snmp_pbuf_stream.c
+++ b/src/apps/snmp/snmp_pbuf_stream.c
@@ -44,7 +44,7 @@
 #include <string.h>
 
 err_t
-snmp_pbuf_stream_init(struct snmp_pbuf_stream* pbuf_stream, struct pbuf* p, u16_t offset, u16_t length)
+snmp_pbuf_stream_init(struct snmp_pbuf_stream *pbuf_stream, struct pbuf *p, u16_t offset, u16_t length)
 {
   pbuf_stream->offset = offset;
   pbuf_stream->length = length;
@@ -54,7 +54,7 @@
 }
 
 err_t
-snmp_pbuf_stream_read(struct snmp_pbuf_stream* pbuf_stream, u8_t* data)
+snmp_pbuf_stream_read(struct snmp_pbuf_stream *pbuf_stream, u8_t *data)
 {
   if (pbuf_stream->length == 0) {
     return ERR_BUF;
@@ -71,13 +71,13 @@
 }
 
 err_t
-snmp_pbuf_stream_write(struct snmp_pbuf_stream* pbuf_stream, u8_t data)
+snmp_pbuf_stream_write(struct snmp_pbuf_stream *pbuf_stream, u8_t data)
 {
   return snmp_pbuf_stream_writebuf(pbuf_stream, &data, 1);
 }
 
 err_t
-snmp_pbuf_stream_writebuf(struct snmp_pbuf_stream* pbuf_stream, const void* buf, u16_t buf_len)
+snmp_pbuf_stream_writebuf(struct snmp_pbuf_stream *pbuf_stream, const void *buf, u16_t buf_len)
 {
   if (pbuf_stream->length < buf_len) {
     return ERR_BUF;
@@ -94,7 +94,7 @@
 }
 
 err_t
-snmp_pbuf_stream_writeto(struct snmp_pbuf_stream* pbuf_stream, struct snmp_pbuf_stream* target_pbuf_stream, u16_t len)
+snmp_pbuf_stream_writeto(struct snmp_pbuf_stream *pbuf_stream, struct snmp_pbuf_stream *target_pbuf_stream, u16_t len)
 {
 
   if ((pbuf_stream == NULL) || (target_pbuf_stream == NULL)) {
@@ -112,14 +112,14 @@
     u16_t chunk_len;
     err_t err;
     u16_t target_offset;
-    struct pbuf* pbuf = pbuf_skip(pbuf_stream->pbuf, pbuf_stream->offset, &target_offset);
+    struct pbuf *pbuf = pbuf_skip(pbuf_stream->pbuf, pbuf_stream->offset, &target_offset);
 
     if ((pbuf == NULL) || (pbuf->len == 0)) {
       return ERR_BUF;
     }
 
     chunk_len = LWIP_MIN(len, pbuf->len);
-    err = snmp_pbuf_stream_writebuf(target_pbuf_stream, &((u8_t*)pbuf->payload)[target_offset], chunk_len);
+    err = snmp_pbuf_stream_writebuf(target_pbuf_stream, &((u8_t *)pbuf->payload)[target_offset], chunk_len);
     if (err != ERR_OK) {
       return err;
     }
@@ -133,7 +133,7 @@
 }
 
 err_t
-snmp_pbuf_stream_seek(struct snmp_pbuf_stream* pbuf_stream, s32_t offset)
+snmp_pbuf_stream_seek(struct snmp_pbuf_stream *pbuf_stream, s32_t offset)
 {
   if ((offset < 0) || (offset > pbuf_stream->length)) {
     /* we cannot seek backwards or forward behind stream end */
@@ -147,7 +147,7 @@
 }
 
 err_t
-snmp_pbuf_stream_seek_abs(struct snmp_pbuf_stream* pbuf_stream, u32_t offset)
+snmp_pbuf_stream_seek_abs(struct snmp_pbuf_stream *pbuf_stream, u32_t offset)
 {
   s32_t rel_offset = offset - pbuf_stream->offset;
   return snmp_pbuf_stream_seek(pbuf_stream, rel_offset);
diff --git a/src/apps/snmp/snmp_pbuf_stream.h b/src/apps/snmp/snmp_pbuf_stream.h
index 9778de7..682713f 100644
--- a/src/apps/snmp/snmp_pbuf_stream.h
+++ b/src/apps/snmp/snmp_pbuf_stream.h
@@ -49,20 +49,19 @@
 extern "C" {
 #endif
 
-struct snmp_pbuf_stream
-{
-  struct pbuf* pbuf;
+struct snmp_pbuf_stream {
+  struct pbuf *pbuf;
   u16_t offset;
   u16_t length;
 };
 
-err_t snmp_pbuf_stream_init(struct snmp_pbuf_stream* pbuf_stream, struct pbuf* p, u16_t offset, u16_t length);
-err_t snmp_pbuf_stream_read(struct snmp_pbuf_stream* pbuf_stream, u8_t* data);
-err_t snmp_pbuf_stream_write(struct snmp_pbuf_stream* pbuf_stream, u8_t data);
-err_t snmp_pbuf_stream_writebuf(struct snmp_pbuf_stream* pbuf_stream, const void* buf, u16_t buf_len);
-err_t snmp_pbuf_stream_writeto(struct snmp_pbuf_stream* pbuf_stream, struct snmp_pbuf_stream* target_pbuf_stream, u16_t len);
-err_t snmp_pbuf_stream_seek(struct snmp_pbuf_stream* pbuf_stream, s32_t offset);
-err_t snmp_pbuf_stream_seek_abs(struct snmp_pbuf_stream* pbuf_stream, u32_t offset);
+err_t snmp_pbuf_stream_init(struct snmp_pbuf_stream *pbuf_stream, struct pbuf *p, u16_t offset, u16_t length);
+err_t snmp_pbuf_stream_read(struct snmp_pbuf_stream *pbuf_stream, u8_t *data);
+err_t snmp_pbuf_stream_write(struct snmp_pbuf_stream *pbuf_stream, u8_t data);
+err_t snmp_pbuf_stream_writebuf(struct snmp_pbuf_stream *pbuf_stream, const void *buf, u16_t buf_len);
+err_t snmp_pbuf_stream_writeto(struct snmp_pbuf_stream *pbuf_stream, struct snmp_pbuf_stream *target_pbuf_stream, u16_t len);
+err_t snmp_pbuf_stream_seek(struct snmp_pbuf_stream *pbuf_stream, s32_t offset);
+err_t snmp_pbuf_stream_seek_abs(struct snmp_pbuf_stream *pbuf_stream, u32_t offset);
 
 #ifdef __cplusplus
 }
diff --git a/src/apps/snmp/snmp_raw.c b/src/apps/snmp/snmp_raw.c
index 4a40864..e203cb6 100644
--- a/src/apps/snmp/snmp_raw.c
+++ b/src/apps/snmp/snmp_raw.c
@@ -39,6 +39,7 @@
 
 #include "lwip/udp.h"
 #include "lwip/ip.h"
+#include "lwip/prot/iana.h"
 #include "snmp_msg.h"
 
 /* lwIP UDP receive callback function */
@@ -52,18 +53,18 @@
   pbuf_free(p);
 }
 
-err_t 
+err_t
 snmp_sendto(void *handle, struct pbuf *p, const ip_addr_t *dst, u16_t port)
 {
-  return udp_sendto((struct udp_pcb*)handle, p, dst, port);
+  return udp_sendto((struct udp_pcb *)handle, p, dst, port);
 }
 
 u8_t
-snmp_get_local_ip_for_dst(void* handle, const ip_addr_t *dst, ip_addr_t *result)
+snmp_get_local_ip_for_dst(void *handle, const ip_addr_t *dst, ip_addr_t *result)
 {
-  struct udp_pcb* udp_pcb = (struct udp_pcb*)handle;
+  struct udp_pcb *udp_pcb = (struct udp_pcb *)handle;
   struct netif *dst_if;
-  const ip_addr_t* dst_ip;
+  const ip_addr_t *dst_ip;
 
   LWIP_UNUSED_ARG(udp_pcb); /* unused in case of IPV4 only configuration */
 
@@ -86,14 +87,16 @@
 snmp_init(void)
 {
   err_t err;
-  
+
   struct udp_pcb *snmp_pcb = udp_new_ip_type(IPADDR_TYPE_ANY);
   LWIP_ERROR("snmp_raw: no PCB", (snmp_pcb != NULL), return;);
 
+  LWIP_ASSERT_CORE_LOCKED();
+
   snmp_traps_handle = snmp_pcb;
 
-  udp_recv(snmp_pcb, snmp_recv, (void *)SNMP_IN_PORT);
-  err = udp_bind(snmp_pcb, IP_ANY_TYPE, SNMP_IN_PORT);
+  udp_recv(snmp_pcb, snmp_recv, NULL);
+  err = udp_bind(snmp_pcb, IP_ANY_TYPE, LWIP_IANA_PORT_SNMP);
   LWIP_ERROR("snmp_raw: Unable to bind PCB", (err == ERR_OK), return;);
 }
 
diff --git a/src/apps/snmp/snmp_scalar.c b/src/apps/snmp/snmp_scalar.c
index 136c9ec..094f52f 100644
--- a/src/apps/snmp/snmp_scalar.c
+++ b/src/apps/snmp/snmp_scalar.c
@@ -42,14 +42,14 @@
 #include "lwip/apps/snmp_scalar.h"
 #include "lwip/apps/snmp_core.h"
 
-static s16_t snmp_scalar_array_get_value(struct snmp_node_instance* instance, void* value);
-static snmp_err_t  snmp_scalar_array_set_test(struct snmp_node_instance* instance, u16_t value_len, void* value);
-static snmp_err_t  snmp_scalar_array_set_value(struct snmp_node_instance* instance, u16_t value_len, void* value);
+static s16_t snmp_scalar_array_get_value(struct snmp_node_instance *instance, void *value);
+static snmp_err_t  snmp_scalar_array_set_test(struct snmp_node_instance *instance, u16_t value_len, void *value);
+static snmp_err_t  snmp_scalar_array_set_value(struct snmp_node_instance *instance, u16_t value_len, void *value);
 
-snmp_err_t 
-snmp_scalar_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)
+snmp_err_t
+snmp_scalar_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance)
 {
-  const struct snmp_scalar_node* scalar_node = (const struct snmp_scalar_node*)(const void*)instance->node;
+  const struct snmp_scalar_node *scalar_node = (const struct snmp_scalar_node *)(const void *)instance->node;
 
   LWIP_UNUSED_ARG(root_oid);
   LWIP_UNUSED_ARG(root_oid_len);
@@ -67,8 +67,8 @@
   return SNMP_ERR_NOERROR;
 }
 
-snmp_err_t 
-snmp_scalar_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)
+snmp_err_t
+snmp_scalar_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance)
 {
   /* because our only instance is .0 we can only return a next instance if no instance oid is passed */
   if (instance->instance_oid.len == 0) {
@@ -83,14 +83,14 @@
 
 
 snmp_err_t
-snmp_scalar_array_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)
+snmp_scalar_array_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance)
 {
   LWIP_UNUSED_ARG(root_oid);
   LWIP_UNUSED_ARG(root_oid_len);
 
   if ((instance->instance_oid.len == 2) && (instance->instance_oid.id[1] == 0)) {
-    const struct snmp_scalar_array_node* array_node = (const struct snmp_scalar_array_node*)(const void*)instance->node;
-    const struct snmp_scalar_array_node_def* array_node_def = array_node->array_nodes;
+    const struct snmp_scalar_array_node *array_node = (const struct snmp_scalar_array_node *)(const void *)instance->node;
+    const struct snmp_scalar_array_node_def *array_node_def = array_node->array_nodes;
     u32_t i = 0;
 
     while (i < array_node->array_node_count) {
@@ -118,11 +118,11 @@
 }
 
 snmp_err_t
-snmp_scalar_array_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)
+snmp_scalar_array_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance)
 {
-  const struct snmp_scalar_array_node* array_node = (const struct snmp_scalar_array_node*)(const void*)instance->node;
-  const struct snmp_scalar_array_node_def* array_node_def = array_node->array_nodes;
-  const struct snmp_scalar_array_node_def* result = NULL;
+  const struct snmp_scalar_array_node *array_node = (const struct snmp_scalar_array_node *)(const void *)instance->node;
+  const struct snmp_scalar_array_node_def *array_node_def = array_node->array_nodes;
+  const struct snmp_scalar_array_node_def *result = NULL;
 
   LWIP_UNUSED_ARG(root_oid);
   LWIP_UNUSED_ARG(root_oid_len);
@@ -130,7 +130,7 @@
   if ((instance->instance_oid.len == 0) && (array_node->array_node_count > 0)) {
     /* return node with lowest OID */
     u16_t i = 0;
-    
+
     result = array_node_def;
     array_node_def++;
 
@@ -142,7 +142,7 @@
     }
   } else if (instance->instance_oid.len >= 1) {
     if (instance->instance_oid.len == 1) {
-      /* if we have the requested OID we return its instance, otherwise we search for the next available */    
+      /* if we have the requested OID we return its instance, otherwise we search for the next available */
       u16_t i = 0;
       while (i < array_node->array_node_count) {
         if (array_node_def->oid == instance->instance_oid.id[0]) {
@@ -179,7 +179,7 @@
   instance->instance_oid.len   = 2;
   instance->instance_oid.id[0] = result->oid;
   instance->instance_oid.id[1] = 0;
-  
+
   instance->access              = result->access;
   instance->asn1_type           = result->asn1_type;
   instance->get_value           = snmp_scalar_array_get_value;
@@ -191,30 +191,42 @@
 }
 
 static s16_t
-snmp_scalar_array_get_value(struct snmp_node_instance* instance, void* value)
+snmp_scalar_array_get_value(struct snmp_node_instance *instance, void *value)
 {
-  const struct snmp_scalar_array_node* array_node = (const struct snmp_scalar_array_node*)(const void*)instance->node;
-  const struct snmp_scalar_array_node_def* array_node_def = (const struct snmp_scalar_array_node_def*)instance->reference.const_ptr;
+  s16_t result = -1;
+  const struct snmp_scalar_array_node *array_node = (const struct snmp_scalar_array_node *)(const void *)instance->node;
+  const struct snmp_scalar_array_node_def *array_node_def = (const struct snmp_scalar_array_node_def *)instance->reference.const_ptr;
 
-  return array_node->get_value(array_node_def, value);
+  if (array_node->get_value != NULL) {
+    result = array_node->get_value(array_node_def, value);
+  }
+  return result;
 }
 
 static snmp_err_t
-snmp_scalar_array_set_test(struct snmp_node_instance* instance, u16_t value_len, void* value)
+snmp_scalar_array_set_test(struct snmp_node_instance *instance, u16_t value_len, void *value)
 {
-  const struct snmp_scalar_array_node* array_node = (const struct snmp_scalar_array_node*)(const void*)instance->node;
-  const struct snmp_scalar_array_node_def* array_node_def = (const struct snmp_scalar_array_node_def*)instance->reference.const_ptr;
+  snmp_err_t result = SNMP_ERR_NOTWRITABLE;
+  const struct snmp_scalar_array_node *array_node = (const struct snmp_scalar_array_node *)(const void *)instance->node;
+  const struct snmp_scalar_array_node_def *array_node_def = (const struct snmp_scalar_array_node_def *)instance->reference.const_ptr;
 
-  return array_node->set_test(array_node_def, value_len, value);
+  if (array_node->set_test != NULL) {
+    result = array_node->set_test(array_node_def, value_len, value);
+  }
+  return result;
 }
 
 static snmp_err_t
-snmp_scalar_array_set_value(struct snmp_node_instance* instance, u16_t value_len, void* value)
+snmp_scalar_array_set_value(struct snmp_node_instance *instance, u16_t value_len, void *value)
 {
-  const struct snmp_scalar_array_node* array_node = (const struct snmp_scalar_array_node*)(const void*)instance->node;
-  const struct snmp_scalar_array_node_def* array_node_def = (const struct snmp_scalar_array_node_def*)instance->reference.const_ptr;
+  snmp_err_t result = SNMP_ERR_NOTWRITABLE;
+  const struct snmp_scalar_array_node *array_node = (const struct snmp_scalar_array_node *)(const void *)instance->node;
+  const struct snmp_scalar_array_node_def *array_node_def = (const struct snmp_scalar_array_node_def *)instance->reference.const_ptr;
 
-  return array_node->set_value(array_node_def, value_len, value);
+  if (array_node->set_value != NULL) {
+    result = array_node->set_value(array_node_def, value_len, value);
+  }
+  return result;
 }
 
 #endif /* LWIP_SNMP */
diff --git a/src/apps/snmp/snmp_snmpv2_framework.c b/src/apps/snmp/snmp_snmpv2_framework.c
new file mode 100644
index 0000000..a5611db
--- /dev/null
+++ b/src/apps/snmp/snmp_snmpv2_framework.c
@@ -0,0 +1,90 @@
+/*
+Generated by LwipMibCompiler
+*/
+
+#include "lwip/apps/snmp_opts.h"
+
+#if LWIP_SNMP && LWIP_SNMP_V3 /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/apps/snmp_snmpv2_framework.h"
+#include "lwip/apps/snmp.h"
+#include "lwip/apps/snmp_core.h"
+#include "lwip/apps/snmp_scalar.h"
+#include "lwip/apps/snmp_table.h"
+#include "lwip/apps/snmpv3.h"
+#include "snmpv3_priv.h"
+
+#include "lwip/sys.h"
+
+#include <string.h>
+
+const struct snmp_obj_id usmNoAuthProtocol      = { 10, { 1, 3, 6, 1, 6, 3, 10, 1, 1, 1 } };
+const struct snmp_obj_id usmHMACMD5AuthProtocol = { 10, { 1, 3, 6, 1, 6, 3, 10, 1, 1, 2 } };
+const struct snmp_obj_id usmHMACSHAAuthProtocol = { 10, { 1, 3, 6, 1, 6, 3, 10, 1, 1, 3 } };
+/* .4 sha-224
+ * .5 sha-256
+ * .6 sha-384
+ * .7 sha-512
+ */
+
+const struct snmp_obj_id usmNoPrivProtocol  = { 10, { 1, 3, 6, 1, 6, 3, 10, 1, 2, 1 } };
+const struct snmp_obj_id usmDESPrivProtocol = { 10, { 1, 3, 6, 1, 6, 3, 10, 1, 2, 2 } };
+/* .3 3des-ede */
+const struct snmp_obj_id usmAESPrivProtocol = { 10, { 1, 3, 6, 1, 6, 3, 10, 1, 2, 4 } };
+/* .5 unknown
+ * .6 unknown
+ * .7 unknown
+ */
+
+/* TODO: where should this value come from? */
+#define SNMP_FRAMEWORKMIB_SNMPENGINEMAXMESSAGESIZE 1500
+
+/* --- snmpFrameworkMIBObjects 1.3.6.1.6.3.10.2 ----------------------------------------------------- */
+static s16_t snmpengine_scalars_get_value(const struct snmp_scalar_array_node_def *node, void *value)
+{
+  const char *engineid;
+  u8_t engineid_len;
+
+  switch (node->oid) {
+    case 1: /* snmpEngineID */
+      snmpv3_get_engine_id(&engineid, &engineid_len);
+      MEMCPY(value, engineid, engineid_len);
+      return engineid_len;
+    case 2: /* snmpEngineBoots */
+      *(s32_t *)value = snmpv3_get_engine_boots_internal();
+      return sizeof(s32_t);
+    case 3: /* snmpEngineTime */
+      *(s32_t *)value = snmpv3_get_engine_time_internal();
+      return sizeof(s32_t);
+    case 4: /* snmpEngineMaxMessageSize */
+      *(s32_t *)value = SNMP_FRAMEWORKMIB_SNMPENGINEMAXMESSAGESIZE;
+      return sizeof(s32_t);
+    default:
+      LWIP_DEBUGF(SNMP_MIB_DEBUG, ("snmpengine_scalars_get_value(): unknown id: %"S32_F"\n", node->oid));
+      return 0;
+  }
+}
+
+static const struct snmp_scalar_array_node_def snmpengine_scalars_nodes[] = {
+  {1, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpEngineID */
+  {2, SNMP_ASN1_TYPE_INTEGER,      SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpEngineBoots */
+  {3, SNMP_ASN1_TYPE_INTEGER,      SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpEngineTime */
+  {4, SNMP_ASN1_TYPE_INTEGER,      SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpEngineMaxMessageSize */
+};
+static const struct snmp_scalar_array_node snmpengine_scalars = SNMP_SCALAR_CREATE_ARRAY_NODE(1, snmpengine_scalars_nodes, snmpengine_scalars_get_value, NULL, NULL);
+
+static const struct snmp_node *const snmpframeworkmibobjects_subnodes[] = {
+  &snmpengine_scalars.node.node
+};
+static const struct snmp_tree_node snmpframeworkmibobjects_treenode = SNMP_CREATE_TREE_NODE(2, snmpframeworkmibobjects_subnodes);
+
+/* --- snmpFrameworkMIB  ----------------------------------------------------- */
+static const struct snmp_node *const snmpframeworkmib_subnodes[] = {
+  &snmpframeworkmibobjects_treenode.node
+};
+static const struct snmp_tree_node snmpframeworkmib_root = SNMP_CREATE_TREE_NODE(10, snmpframeworkmib_subnodes);
+static const u32_t snmpframeworkmib_base_oid[] = {1, 3, 6, 1, 6, 3, 10};
+const struct snmp_mib snmpframeworkmib = {snmpframeworkmib_base_oid, LWIP_ARRAYSIZE(snmpframeworkmib_base_oid), &snmpframeworkmib_root.node};
+
+/* --- snmpFrameworkMIB  ----------------------------------------------------- */
+#endif /* LWIP_SNMP */
diff --git a/src/apps/snmp/snmp_snmpv2_usm.c b/src/apps/snmp/snmp_snmpv2_usm.c
new file mode 100644
index 0000000..7490c9c
--- /dev/null
+++ b/src/apps/snmp/snmp_snmpv2_usm.c
@@ -0,0 +1,410 @@
+/*
+Generated by LwipMibCompiler
+*/
+
+#include "lwip/apps/snmp_opts.h"
+#if LWIP_SNMP && LWIP_SNMP_V3
+
+#include "lwip/apps/snmp_snmpv2_usm.h"
+#include "lwip/apps/snmp.h"
+#include "lwip/apps/snmp_core.h"
+#include "lwip/apps/snmp_scalar.h"
+#include "lwip/apps/snmp_table.h"
+#include "lwip/apps/snmpv3.h"
+#include "snmpv3_priv.h"
+
+#include "lwip/apps/snmp_snmpv2_framework.h"
+
+#include <string.h>
+
+/* --- usmUser 1.3.6.1.6.3.15.1.2 ----------------------------------------------------- */
+
+static const struct snmp_oid_range usmUserTable_oid_ranges[] = {
+  { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, { 0, 0xff },
+  { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, { 0, 0xff },
+  { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, { 0, 0xff },
+  { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, { 0, 0xff },
+  { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, { 0, 0xff },
+  { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, { 0, 0xff },
+  { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, { 0, 0xff },
+  { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, { 0, 0xff }
+};
+
+static void snmp_engineid_to_oid(const char *engineid, u32_t *oid, u32_t len)
+{
+  u8_t i;
+
+  for (i = 0; i < len; i++) {
+    oid[i] = engineid[i];
+  }
+}
+
+static void snmp_oid_to_name(char *name, const u32_t *oid, size_t len)
+{
+  u8_t i;
+
+  for (i = 0; i < len; i++) {
+    name[i] = (char)oid[i];
+  }
+}
+
+static void snmp_name_to_oid(const char *name, u32_t *oid, size_t len)
+{
+  u8_t i;
+
+  for (i = 0; i < len; i++) {
+    oid[i] = name[i];
+  }
+}
+
+static const struct snmp_obj_id *snmp_auth_algo_to_oid(snmpv3_auth_algo_t algo)
+{
+  if (algo == SNMP_V3_AUTH_ALGO_MD5) {
+    return &usmHMACMD5AuthProtocol;
+  } else if (algo ==  SNMP_V3_AUTH_ALGO_SHA) {
+    return &usmHMACMD5AuthProtocol;
+  }
+
+  return &usmNoAuthProtocol;
+}
+
+static const struct snmp_obj_id *snmp_priv_algo_to_oid(snmpv3_priv_algo_t algo)
+{
+  if (algo == SNMP_V3_PRIV_ALGO_DES) {
+    return &usmDESPrivProtocol;
+  } else if (algo == SNMP_V3_PRIV_ALGO_AES) {
+    return &usmAESPrivProtocol;
+  }
+
+  return &usmNoPrivProtocol;
+}
+
+char username[32];
+
+static snmp_err_t usmusertable_get_instance(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, struct snmp_node_instance *cell_instance)
+{
+  const char *engineid;
+  u8_t eid_len;
+
+  u32_t engineid_oid[SNMP_V3_MAX_ENGINE_ID_LENGTH];
+
+  u8_t name_len;
+  u8_t engineid_len;
+
+  u8_t name_start;
+  u8_t engineid_start;
+
+  LWIP_UNUSED_ARG(column);
+
+  snmpv3_get_engine_id(&engineid, &eid_len);
+
+  engineid_len = (u8_t)row_oid[0];
+  engineid_start = 1;
+
+  if (engineid_len != eid_len) {
+    /* EngineID length does not match! */
+    return SNMP_ERR_NOSUCHINSTANCE;
+  }
+
+  if (engineid_len > row_oid_len) {
+    /* row OID doesn't contain enough data according to engineid_len.*/
+    return SNMP_ERR_NOSUCHINSTANCE;
+  }
+
+  /* check if incoming OID length and if values are in plausible range */
+  if (!snmp_oid_in_range(&row_oid[engineid_start], engineid_len, usmUserTable_oid_ranges, engineid_len)) {
+    return SNMP_ERR_NOSUCHINSTANCE;
+  }
+
+  snmp_engineid_to_oid(engineid, engineid_oid, engineid_len);
+
+  /* Verify EngineID */
+  if (snmp_oid_equal(&row_oid[engineid_start], engineid_len, engineid_oid, engineid_len)) {
+    return SNMP_ERR_NOSUCHINSTANCE;
+  }
+
+  name_len = (u8_t)row_oid[engineid_start + engineid_len];
+  name_start = engineid_start + engineid_len + 1;
+
+  if (name_len > SNMP_V3_MAX_USER_LENGTH) {
+    /* specified name is too long */
+    return SNMP_ERR_NOSUCHINSTANCE;
+  }
+
+  if (1 + engineid_len + 1 + name_len != row_oid_len) {
+    /* Length of EngineID and name does not match row oid length. (+2 for length fields)*/
+    return SNMP_ERR_NOSUCHINSTANCE;
+  }
+
+  /* check if incoming OID length and if values are in plausible range */
+  if (!snmp_oid_in_range(&row_oid[name_start], name_len, usmUserTable_oid_ranges, name_len)) {
+    return SNMP_ERR_NOSUCHINSTANCE;
+  }
+
+  /* Verify if user exists */
+  memset(username, 0, sizeof(username));
+  snmp_oid_to_name(username, &row_oid[name_start], name_len);
+  if (snmpv3_get_user(username, NULL, NULL, NULL, NULL) != ERR_OK) {
+    return SNMP_ERR_NOSUCHINSTANCE;
+  }
+
+  /* Save name in reference pointer to make it easier to handle later on */
+  cell_instance->reference.ptr = username;
+  cell_instance->reference_len = name_len;
+
+  /* user was found */
+  return SNMP_ERR_NOERROR;
+}
+
+/*
+ * valid oid options
+ * <oid>
+ * <oid>.<EngineID length>
+ * <oid>.<EngineID length>.<partial EngineID>
+ * <oid>.<EngineID length>.<EngineID>
+ * <oid>.<EngineID length>.<EngineID>.<UserName length>
+ * <oid>.<EngineID length>.<EngineID>.<UserName length>.<partial UserName>
+ * <oid>.<EngineID length>.<EngineID>.<UserName length>.<UserName>
+ *
+ */
+static snmp_err_t usmusertable_get_next_instance(const u32_t *column, struct snmp_obj_id *row_oid, struct snmp_node_instance *cell_instance)
+{
+  const char *engineid;
+  u8_t eid_len;
+
+  u32_t engineid_oid[SNMP_V3_MAX_ENGINE_ID_LENGTH];
+
+  u8_t name_len;
+  u8_t engineid_len;
+
+  u8_t name_start;
+  u8_t engineid_start = 1;
+  u8_t i;
+
+  struct snmp_next_oid_state state;
+
+  u32_t result_temp[LWIP_ARRAYSIZE(usmUserTable_oid_ranges)];
+
+  LWIP_UNUSED_ARG(column);
+
+  snmpv3_get_engine_id(&engineid, &eid_len);
+
+  /* If EngineID might be given */
+  if (row_oid->len > 0) {
+    engineid_len = (u8_t)row_oid->id[0];
+    engineid_start = 1;
+
+    if (engineid_len != eid_len) {
+      /* EngineID length does not match! */
+      return SNMP_ERR_NOSUCHINSTANCE;
+    }
+
+    if (engineid_len > row_oid->len) {
+      /* Verify partial EngineID */
+      snmp_engineid_to_oid(engineid, engineid_oid, row_oid->len - 1);
+      if (!snmp_oid_equal(&row_oid->id[engineid_start], row_oid->len - 1, engineid_oid, row_oid->len - 1)) {
+        return SNMP_ERR_NOSUCHINSTANCE;
+      }
+    } else {
+      /* Verify complete EngineID */
+      snmp_engineid_to_oid(engineid, engineid_oid, engineid_len);
+      if (!snmp_oid_equal(&row_oid->id[engineid_start], engineid_len, engineid_oid, engineid_len)) {
+        return SNMP_ERR_NOSUCHINSTANCE;
+      }
+    }
+
+    /* At this point, the given EngineID (partially) matches the local EngineID.*/
+
+    /* If name might also be given */
+    if (row_oid->len > engineid_start + engineid_len) {
+      name_len = (u8_t)row_oid->id[engineid_start + engineid_len];
+      name_start = engineid_start + engineid_len + 1;
+
+      if (name_len > SNMP_V3_MAX_USER_LENGTH) {
+        /* specified name is too long, max length is 32 according to mib file.*/
+        return SNMP_ERR_NOSUCHINSTANCE;
+      }
+
+      if (row_oid->len < engineid_len + name_len + 2) {
+        /* Partial name given according to oid.*/
+        u8_t tmplen = row_oid->len - engineid_len - 2;
+        if (!snmp_oid_in_range(&row_oid->id[name_start], tmplen, usmUserTable_oid_ranges, tmplen)) {
+          return SNMP_ERR_NOSUCHINSTANCE;
+        }
+      } else {
+        /* Full name given according to oid. Also test for too much data.*/
+        u8_t tmplen = row_oid->len - engineid_len - 2;
+        if (!snmp_oid_in_range(&row_oid->id[name_start], name_len, usmUserTable_oid_ranges, tmplen)) {
+          return SNMP_ERR_NOSUCHINSTANCE;
+        }
+      }
+
+      /* At this point the EngineID and (partial) UserName match the local EngineID and UserName.*/
+    }
+  }
+
+  /* init struct to search next oid */
+  snmp_next_oid_init(&state, row_oid->id, row_oid->len, result_temp, LWIP_ARRAYSIZE(usmUserTable_oid_ranges));
+
+  for (i = 0; i < snmpv3_get_amount_of_users(); i++) {
+    u32_t test_oid[LWIP_ARRAYSIZE(usmUserTable_oid_ranges)];
+
+    test_oid[0] = eid_len;
+    snmp_engineid_to_oid(engineid, &test_oid[1], eid_len);
+
+    snmpv3_get_username(username, i);
+
+    test_oid[1 + eid_len] = strlen(username);
+    snmp_name_to_oid(username, &test_oid[2 + eid_len], strlen(username));
+
+    /* check generated OID: is it a candidate for the next one? */
+    snmp_next_oid_check(&state, test_oid, (u8_t)(1 + eid_len + 1 + strlen(username)), LWIP_PTR_NUMERIC_CAST(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 username for subsequent operations (get/test/set) */
+    memset(username, 0, sizeof(username));
+    snmpv3_get_username(username, LWIP_PTR_NUMERIC_CAST(u8_t, state.reference));
+    cell_instance->reference.ptr = username;
+    cell_instance->reference_len = strlen(username);
+    return SNMP_ERR_NOERROR;
+  }
+
+  /* not found */
+  return SNMP_ERR_NOSUCHINSTANCE;
+}
+
+static s16_t usmusertable_get_value(struct snmp_node_instance *cell_instance, void *value)
+{
+  snmpv3_user_storagetype_t storage_type;
+
+  switch (SNMP_TABLE_GET_COLUMN_FROM_OID(cell_instance->instance_oid.id)) {
+    case 3: /* usmUserSecurityName */
+      MEMCPY(value, cell_instance->reference.ptr, cell_instance->reference_len);
+      return (s16_t)cell_instance->reference_len;
+    case 4: /* usmUserCloneFrom */
+      MEMCPY(value, snmp_zero_dot_zero.id, snmp_zero_dot_zero.len * sizeof(u32_t));
+      return snmp_zero_dot_zero.len * sizeof(u32_t);
+    case 5: { /* usmUserAuthProtocol */
+      const struct snmp_obj_id *auth_algo;
+      snmpv3_auth_algo_t auth_algo_val;
+      snmpv3_get_user((const char *)cell_instance->reference.ptr, &auth_algo_val, NULL, NULL, NULL);
+      auth_algo = snmp_auth_algo_to_oid(auth_algo_val);
+      MEMCPY(value, auth_algo->id, auth_algo->len * sizeof(u32_t));
+      return auth_algo->len * sizeof(u32_t);
+    }
+    case 6: /* usmUserAuthKeyChange */
+      return 0;
+    case 7: /* usmUserOwnAuthKeyChange */
+      return 0;
+    case 8: { /* usmUserPrivProtocol */
+      const struct snmp_obj_id *priv_algo;
+      snmpv3_priv_algo_t priv_algo_val;
+      snmpv3_get_user((const char *)cell_instance->reference.ptr, NULL, NULL, &priv_algo_val, NULL);
+      priv_algo = snmp_priv_algo_to_oid(priv_algo_val);
+      MEMCPY(value, priv_algo->id, priv_algo->len * sizeof(u32_t));
+      return priv_algo->len * sizeof(u32_t);
+    }
+    case 9: /* usmUserPrivKeyChange */
+      return 0;
+    case 10: /* usmUserOwnPrivKeyChange */
+      return 0;
+    case 11: /* usmUserPublic */
+      /* TODO: Implement usmUserPublic */
+      return 0;
+    case 12: /* usmUserStorageType */
+      snmpv3_get_user_storagetype((const char *)cell_instance->reference.ptr, &storage_type);
+      *(s32_t *)value = storage_type;
+      return sizeof(s32_t);
+    case 13: /* usmUserStatus */
+      *(s32_t *)value = 1; /* active */
+      return sizeof(s32_t);
+    default:
+      LWIP_DEBUGF(SNMP_MIB_DEBUG, ("usmusertable_get_value(): unknown id: %"S32_F"\n", SNMP_TABLE_GET_COLUMN_FROM_OID(cell_instance->instance_oid.id)));
+      return 0;
+  }
+}
+
+/* --- usmMIBObjects 1.3.6.1.6.3.15.1 ----------------------------------------------------- */
+static s16_t usmstats_scalars_get_value(const struct snmp_scalar_array_node_def *node, void *value)
+{
+  u32_t *uint_ptr = (u32_t *)value;
+  switch (node->oid) {
+    case 1: /* usmStatsUnsupportedSecLevels */
+      *uint_ptr = snmp_stats.unsupportedseclevels;
+      break;
+    case 2: /* usmStatsNotInTimeWindows */
+      *uint_ptr = snmp_stats.notintimewindows;
+      break;
+    case 3: /* usmStatsUnknownUserNames */
+      *uint_ptr = snmp_stats.unknownusernames;
+      break;
+    case 4: /* usmStatsUnknownEngineIDs */
+      *uint_ptr = snmp_stats.unknownengineids;
+      break;
+    case 5: /* usmStatsWrongDigests */
+      *uint_ptr = snmp_stats.wrongdigests;
+      break;
+    case 6: /* usmStatsDecryptionErrors */
+      *uint_ptr = snmp_stats.decryptionerrors;
+      break;
+    default:
+      LWIP_DEBUGF(SNMP_MIB_DEBUG, ("usmstats_scalars_get_value(): unknown id: %"S32_F"\n", node->oid));
+      return 0;
+  }
+
+  return sizeof(*uint_ptr);
+}
+
+/* --- snmpUsmMIB  ----------------------------------------------------- */
+
+/* --- usmUser 1.3.6.1.6.3.15.1.2 ----------------------------------------------------- */
+
+static const struct snmp_table_col_def usmusertable_columns[] = {
+  {3,  SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserSecurityName */
+  {4,  SNMP_ASN1_TYPE_OBJECT_ID,    SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserCloneFrom */
+  {5,  SNMP_ASN1_TYPE_OBJECT_ID,    SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserAuthProtocol */
+  {6,  SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserAuthKeyChange */
+  {7,  SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserOwnAuthKeyChange */
+  {8,  SNMP_ASN1_TYPE_OBJECT_ID,    SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserPrivProtocol */
+  {9,  SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserPrivKeyChange */
+  {10, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserOwnPrivKeyChange */
+  {11, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserPublic */
+  {12, SNMP_ASN1_TYPE_INTEGER,      SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserStorageType */
+  {13, SNMP_ASN1_TYPE_INTEGER,      SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserStatus */
+};
+static const struct snmp_table_node usmusertable = SNMP_TABLE_CREATE(2, usmusertable_columns, usmusertable_get_instance, usmusertable_get_next_instance, usmusertable_get_value, NULL, NULL);
+
+static const struct snmp_node *const usmuser_subnodes[] = {
+  &usmusertable.node.node
+};
+static const struct snmp_tree_node usmuser_treenode = SNMP_CREATE_TREE_NODE(2, usmuser_subnodes);
+
+/* --- usmMIBObjects 1.3.6.1.6.3.15.1 ----------------------------------------------------- */
+static const struct snmp_scalar_array_node_def usmstats_scalars_nodes[] = {
+  {1, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmStatsUnsupportedSecLevels */
+  {2, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmStatsNotInTimeWindows */
+  {3, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmStatsUnknownUserNames */
+  {4, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmStatsUnknownEngineIDs */
+  {5, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmStatsWrongDigests */
+  {6, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmStatsDecryptionErrors */
+};
+static const struct snmp_scalar_array_node usmstats_scalars = SNMP_SCALAR_CREATE_ARRAY_NODE(1, usmstats_scalars_nodes, usmstats_scalars_get_value, NULL, NULL);
+
+static const struct snmp_node *const usmmibobjects_subnodes[] = {
+  &usmstats_scalars.node.node,
+  &usmuser_treenode.node
+};
+static const struct snmp_tree_node usmmibobjects_treenode = SNMP_CREATE_TREE_NODE(1, usmmibobjects_subnodes);
+
+/* --- snmpUsmMIB  ----------------------------------------------------- */
+static const struct snmp_node *const snmpusmmib_subnodes[] = {
+  &usmmibobjects_treenode.node
+};
+static const struct snmp_tree_node snmpusmmib_root = SNMP_CREATE_TREE_NODE(15, snmpusmmib_subnodes);
+static const u32_t snmpusmmib_base_oid[] = {1, 3, 6, 1, 6, 3, 15};
+const struct snmp_mib snmpusmmib = {snmpusmmib_base_oid, LWIP_ARRAYSIZE(snmpusmmib_base_oid), &snmpusmmib_root.node};
+
+#endif /* LWIP_SNMP */
diff --git a/src/apps/snmp/snmp_table.c b/src/apps/snmp/snmp_table.c
index 63ca595..4b77a47 100644
--- a/src/apps/snmp/snmp_table.c
+++ b/src/apps/snmp/snmp_table.c
@@ -43,10 +43,10 @@
 #include "lwip/apps/snmp_table.h"
 #include <string.h>
 
-snmp_err_t snmp_table_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)
+snmp_err_t snmp_table_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance)
 {
   snmp_err_t ret = SNMP_ERR_NOSUCHINSTANCE;
-  const struct snmp_table_node* table_node = (const struct snmp_table_node*)(const void*)instance->node;
+  const struct snmp_table_node *table_node = (const struct snmp_table_node *)(const void *)instance->node;
 
   LWIP_UNUSED_ARG(root_oid);
   LWIP_UNUSED_ARG(root_oid_len);
@@ -55,13 +55,13 @@
   /* fixed row entry always has oid 1 */
   if ((instance->instance_oid.len >= 3) && (instance->instance_oid.id[0] == 1)) {
     /* search column */
-    const struct snmp_table_col_def* col_def = table_node->columns;
+    const struct snmp_table_col_def *col_def = table_node->columns;
     u16_t i = table_node->column_count;
     while (i > 0) {
       if (col_def->index == instance->instance_oid.id[1]) {
         break;
       }
-      
+
       col_def++;
       i--;
     }
@@ -75,20 +75,20 @@
       instance->set_value = table_node->set_value;
 
       ret = table_node->get_cell_instance(
-        &(instance->instance_oid.id[1]),
-        &(instance->instance_oid.id[2]),
-        instance->instance_oid.len-2,
-        instance);
+              &(instance->instance_oid.id[1]),
+              &(instance->instance_oid.id[2]),
+              instance->instance_oid.len - 2,
+              instance);
     }
   }
 
   return ret;
 }
 
-snmp_err_t snmp_table_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)
+snmp_err_t snmp_table_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance)
 {
-  const struct snmp_table_node* table_node = (const struct snmp_table_node*)(const void*)instance->node;
-  const struct snmp_table_col_def* col_def;
+  const struct snmp_table_node *table_node = (const struct snmp_table_node *)(const void *)instance->node;
+  const struct snmp_table_col_def *col_def;
   struct snmp_obj_id row_oid;
   u32_t column = 0;
   snmp_err_t result;
@@ -116,7 +116,7 @@
   /* resolve column and value */
   do {
     u16_t i;
-    const struct snmp_table_col_def* next_col_def = NULL;
+    const struct snmp_table_col_def *next_col_def = NULL;
     col_def = table_node->columns;
 
     for (i = 0; i < table_node->column_count; i++) {
@@ -138,9 +138,9 @@
     instance->access             = next_col_def->access;
 
     result = table_node->get_next_cell_instance(
-      &next_col_def->index,
-      &row_oid,
-      instance);
+               &next_col_def->index,
+               &row_oid,
+               instance);
 
     if (result == SNMP_ERR_NOERROR) {
       col_def = next_col_def;
@@ -161,10 +161,10 @@
 }
 
 
-snmp_err_t snmp_table_simple_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)
+snmp_err_t snmp_table_simple_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance)
 {
   snmp_err_t ret = SNMP_ERR_NOSUCHINSTANCE;
-  const struct snmp_table_simple_node* table_node = (const struct snmp_table_simple_node*)(const void*)instance->node;
+  const struct snmp_table_simple_node *table_node = (const struct snmp_table_simple_node *)(const void *)instance->node;
 
   LWIP_UNUSED_ARG(root_oid);
   LWIP_UNUSED_ARG(root_oid_len);
@@ -173,15 +173,15 @@
   /* fixed row entry always has oid 1 */
   if ((instance->instance_oid.len >= 3) && (instance->instance_oid.id[0] == 1)) {
     ret = table_node->get_cell_value(
-      &(instance->instance_oid.id[1]),
-      &(instance->instance_oid.id[2]),
-      instance->instance_oid.len-2,
-      &instance->reference,
-      &instance->reference_len);
+            &(instance->instance_oid.id[1]),
+            &(instance->instance_oid.id[2]),
+            instance->instance_oid.len - 2,
+            &instance->reference,
+            &instance->reference_len);
 
     if (ret == SNMP_ERR_NOERROR) {
       /* search column */
-      const struct snmp_table_simple_col_def* col_def = table_node->columns;
+      const struct snmp_table_simple_col_def *col_def = table_node->columns;
       u32_t i = table_node->column_count;
       while (i > 0) {
         if (col_def->index == instance->instance_oid.id[1]) {
@@ -212,22 +212,22 @@
           default:
             LWIP_DEBUGF(SNMP_DEBUG, ("snmp_table_simple_get_instance(): unknown column data_type: %d\n", col_def->data_type));
             return SNMP_ERR_GENERROR;
-        }        
+        }
 
         ret = SNMP_ERR_NOERROR;
       } else {
         ret = SNMP_ERR_NOSUCHINSTANCE;
       }
-    } 
+    }
   }
 
   return ret;
 }
 
-snmp_err_t snmp_table_simple_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)
+snmp_err_t snmp_table_simple_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance)
 {
-  const struct snmp_table_simple_node* table_node = (const struct snmp_table_simple_node*)(const void*)instance->node;
-  const struct snmp_table_simple_col_def* col_def;
+  const struct snmp_table_simple_node *table_node = (const struct snmp_table_simple_node *)(const void *)instance->node;
+  const struct snmp_table_simple_col_def *col_def;
   struct snmp_obj_id row_oid;
   u32_t column = 0;
   snmp_err_t result;
@@ -251,7 +251,7 @@
   /* resolve column and value */
   do {
     u32_t i;
-    const struct snmp_table_simple_col_def* next_col_def = NULL;
+    const struct snmp_table_simple_col_def *next_col_def = NULL;
     col_def = table_node->columns;
 
     for (i = 0; i < table_node->column_count; i++) {
@@ -271,10 +271,10 @@
     }
 
     result = table_node->get_next_cell_instance_and_value(
-      &next_col_def->index,
-      &row_oid,
-      &instance->reference,
-      &instance->reference_len);
+               &next_col_def->index,
+               &row_oid,
+               &instance->reference,
+               &instance->reference_len);
 
     if (result == SNMP_ERR_NOERROR) {
       col_def = next_col_def;
@@ -283,8 +283,7 @@
 
     row_oid.len = 0; /* reset row_oid because we switch to next column and start with the first entry there */
     column = next_col_def->index + 1;
-  }
-  while (1);
+  } while (1);
 
   instance->asn1_type = col_def->asn1_type;
   instance->access    = SNMP_NODE_INSTANCE_READ_ONLY;
@@ -318,23 +317,23 @@
 
 
 s16_t
-snmp_table_extract_value_from_s32ref(struct snmp_node_instance* instance, void* value)
+snmp_table_extract_value_from_s32ref(struct snmp_node_instance *instance, void *value)
 {
-  s32_t *dst = (s32_t*)value;
+  s32_t *dst = (s32_t *)value;
   *dst = instance->reference.s32;
   return sizeof(*dst);
 }
 
 s16_t
-snmp_table_extract_value_from_u32ref(struct snmp_node_instance* instance, void* value)
+snmp_table_extract_value_from_u32ref(struct snmp_node_instance *instance, void *value)
 {
-  u32_t *dst = (u32_t*)value;
+  u32_t *dst = (u32_t *)value;
   *dst = instance->reference.u32;
   return sizeof(*dst);
 }
 
 s16_t
-snmp_table_extract_value_from_refconstptr(struct snmp_node_instance* instance, void* value)
+snmp_table_extract_value_from_refconstptr(struct snmp_node_instance *instance, void *value)
 {
   MEMCPY(value, instance->reference.const_ptr, instance->reference_len);
   return (u16_t)instance->reference_len;
diff --git a/src/apps/snmp/snmp_threadsync.c b/src/apps/snmp/snmp_threadsync.c
index 204f265..56d9886 100644
--- a/src/apps/snmp/snmp_threadsync.c
+++ b/src/apps/snmp/snmp_threadsync.c
@@ -40,7 +40,7 @@
 #include "lwip/apps/snmp_core.h"
 #include "lwip/sys.h"
 #include <string.h>
-        
+
 static void
 call_synced_function(struct threadsync_data *call_data, snmp_threadsync_called_fn fn)
 {
@@ -53,17 +53,21 @@
 static void
 threadsync_get_value_synced(void *ctx)
 {
-  struct threadsync_data *call_data = (struct threadsync_data*)ctx;
+  struct threadsync_data *call_data = (struct threadsync_data *)ctx;
 
-  call_data->retval.s16 = call_data->proxy_instance.get_value(&call_data->proxy_instance, call_data->arg1.value);
+  if (call_data->proxy_instance.get_value != NULL) {
+    call_data->retval.s16 = call_data->proxy_instance.get_value(&call_data->proxy_instance, call_data->arg1.value);
+  } else {
+    call_data->retval.s16 = -1;
+  }
 
   sys_sem_signal(&call_data->threadsync_node->instance->sem);
 }
 
 static s16_t
-threadsync_get_value(struct snmp_node_instance* instance, void* value)
+threadsync_get_value(struct snmp_node_instance *instance, void *value)
 {
-  struct threadsync_data *call_data = (struct threadsync_data*)instance->reference.ptr;
+  struct threadsync_data *call_data = (struct threadsync_data *)instance->reference.ptr;
 
   call_data->arg1.value = value;
   call_synced_function(call_data, threadsync_get_value_synced);
@@ -74,17 +78,21 @@
 static void
 threadsync_set_test_synced(void *ctx)
 {
-  struct threadsync_data *call_data = (struct threadsync_data*)ctx;
+  struct threadsync_data *call_data = (struct threadsync_data *)ctx;
 
-  call_data->retval.err = call_data->proxy_instance.set_test(&call_data->proxy_instance, call_data->arg2.len, call_data->arg1.value);
+  if (call_data->proxy_instance.set_test != NULL) {
+    call_data->retval.err = call_data->proxy_instance.set_test(&call_data->proxy_instance, call_data->arg2.len, call_data->arg1.value);
+  } else {
+    call_data->retval.err = SNMP_ERR_NOTWRITABLE;
+  }
 
   sys_sem_signal(&call_data->threadsync_node->instance->sem);
 }
 
 static snmp_err_t
-threadsync_set_test(struct snmp_node_instance* instance, u16_t len, void *value)
+threadsync_set_test(struct snmp_node_instance *instance, u16_t len, void *value)
 {
-  struct threadsync_data *call_data = (struct threadsync_data*)instance->reference.ptr;
+  struct threadsync_data *call_data = (struct threadsync_data *)instance->reference.ptr;
 
   call_data->arg1.value = value;
   call_data->arg2.len = len;
@@ -96,30 +104,34 @@
 static void
 threadsync_set_value_synced(void *ctx)
 {
-  struct threadsync_data *call_data = (struct threadsync_data*)ctx;
+  struct threadsync_data *call_data = (struct threadsync_data *)ctx;
 
-  call_data->retval.err = call_data->proxy_instance.set_value(&call_data->proxy_instance, call_data->arg2.len, call_data->arg1.value);
+  if (call_data->proxy_instance.set_value != NULL) {
+    call_data->retval.err = call_data->proxy_instance.set_value(&call_data->proxy_instance, call_data->arg2.len, call_data->arg1.value);
+  } else {
+    call_data->retval.err = SNMP_ERR_NOTWRITABLE;
+  }
 
   sys_sem_signal(&call_data->threadsync_node->instance->sem);
 }
 
 static snmp_err_t
-threadsync_set_value(struct snmp_node_instance* instance, u16_t len, void *value)
+threadsync_set_value(struct snmp_node_instance *instance, u16_t len, void *value)
 {
-  struct threadsync_data *call_data = (struct threadsync_data*)instance->reference.ptr;
+  struct threadsync_data *call_data = (struct threadsync_data *)instance->reference.ptr;
 
   call_data->arg1.value = value;
   call_data->arg2.len = len;
   call_synced_function(call_data, threadsync_set_value_synced);
-  
+
   return call_data->retval.err;
 }
 
 static void
-threadsync_release_instance_synced(void* ctx)
+threadsync_release_instance_synced(void *ctx)
 {
-  struct threadsync_data *call_data = (struct threadsync_data*)ctx;
-  
+  struct threadsync_data *call_data = (struct threadsync_data *)ctx;
+
   call_data->proxy_instance.release_instance(&call_data->proxy_instance);
 
   sys_sem_signal(&call_data->threadsync_node->instance->sem);
@@ -128,18 +140,18 @@
 static void
 threadsync_release_instance(struct snmp_node_instance *instance)
 {
-  struct threadsync_data *call_data = (struct threadsync_data*)instance->reference.ptr;
-  
+  struct threadsync_data *call_data = (struct threadsync_data *)instance->reference.ptr;
+
   if (call_data->proxy_instance.release_instance != NULL) {
     call_synced_function(call_data, threadsync_release_instance_synced);
   }
 }
 
 static void
-get_instance_synced(void* ctx)
+get_instance_synced(void *ctx)
 {
-  struct threadsync_data *call_data   = (struct threadsync_data*)ctx;
-  const struct snmp_leaf_node *leaf   = (const struct snmp_leaf_node*)(const void*)call_data->proxy_instance.node;
+  struct threadsync_data *call_data   = (struct threadsync_data *)ctx;
+  const struct snmp_leaf_node *leaf   = (const struct snmp_leaf_node *)(const void *)call_data->proxy_instance.node;
 
   call_data->retval.err = leaf->get_instance(call_data->arg1.root_oid, call_data->arg2.root_oid_len, &call_data->proxy_instance);
 
@@ -147,10 +159,10 @@
 }
 
 static void
-get_next_instance_synced(void* ctx)
+get_next_instance_synced(void *ctx)
 {
-  struct threadsync_data *call_data   = (struct threadsync_data*)ctx;
-  const struct snmp_leaf_node *leaf   = (const struct snmp_leaf_node*)(const void*)call_data->proxy_instance.node;
+  struct threadsync_data *call_data   = (struct threadsync_data *)ctx;
+  const struct snmp_leaf_node *leaf   = (const struct snmp_leaf_node *)(const void *)call_data->proxy_instance.node;
 
   call_data->retval.err = leaf->get_next_instance(call_data->arg1.root_oid, call_data->arg2.root_oid_len, &call_data->proxy_instance);
 
@@ -158,9 +170,9 @@
 }
 
 static snmp_err_t
-do_sync(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance, snmp_threadsync_called_fn fn)
+do_sync(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance, snmp_threadsync_called_fn fn)
 {
-  const struct snmp_threadsync_node *threadsync_node = (const struct snmp_threadsync_node*)(const void*)instance->node;
+  const struct snmp_threadsync_node *threadsync_node = (const struct snmp_threadsync_node *)(const void *)instance->node;
   struct threadsync_data *call_data = &threadsync_node->instance->data;
 
   if (threadsync_node->node.node.oid != threadsync_node->target->node.oid) {
@@ -184,9 +196,9 @@
     instance->access           = call_data->proxy_instance.access;
     instance->asn1_type        = call_data->proxy_instance.asn1_type;
     instance->release_instance = threadsync_release_instance;
-    instance->get_value        = (call_data->proxy_instance.get_value != NULL)? threadsync_get_value : NULL;
-    instance->set_value        = (call_data->proxy_instance.set_value != NULL)? threadsync_set_value : NULL;
-    instance->set_test         = (call_data->proxy_instance.set_test != NULL)?  threadsync_set_test  : NULL;
+    instance->get_value        = (call_data->proxy_instance.get_value != NULL) ? threadsync_get_value : NULL;
+    instance->set_value        = (call_data->proxy_instance.set_value != NULL) ? threadsync_set_value : NULL;
+    instance->set_test         = (call_data->proxy_instance.set_test != NULL) ?  threadsync_set_test  : NULL;
     snmp_oid_assign(&instance->instance_oid, call_data->proxy_instance.instance_oid.id, call_data->proxy_instance.instance_oid.len);
   }
 
@@ -194,13 +206,13 @@
 }
 
 snmp_err_t
-snmp_threadsync_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)
+snmp_threadsync_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance)
 {
   return do_sync(root_oid, root_oid_len, instance, get_instance_synced);
 }
 
 snmp_err_t
-snmp_threadsync_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)
+snmp_threadsync_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance)
 {
   return do_sync(root_oid, root_oid_len, instance, get_next_instance_synced);
 }
diff --git a/src/apps/snmp/snmp_traps.c b/src/apps/snmp/snmp_traps.c
index 0d2df64..3c9c817 100644
--- a/src/apps/snmp/snmp_traps.c
+++ b/src/apps/snmp/snmp_traps.c
@@ -46,12 +46,12 @@
 #include "lwip/sys.h"
 #include "lwip/apps/snmp.h"
 #include "lwip/apps/snmp_core.h"
+#include "lwip/prot/iana.h"
 #include "snmp_msg.h"
 #include "snmp_asn1.h"
 #include "snmp_core_priv.h"
 
-struct snmp_msg_trap
-{
+struct snmp_msg_trap {
   /* source enterprise ID (sysObjectID) */
   const struct snmp_obj_id *enterprise;
   /* source IP address, raw network order format */
@@ -78,16 +78,21 @@
 
 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 void snmp_trap_header_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream);
-static void snmp_trap_varbind_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind *varbinds);
+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);
+
+#define BUILD_EXEC(code) \
+  if ((code) != ERR_OK) { \
+    LWIP_DEBUGF(SNMP_DEBUG, ("SNMP error during creation of outbound trap frame!")); \
+    return ERR_ARG; \
+  }
 
 /** Agent community string for sending traps */
 extern const char *snmp_community_trap;
 
-void* snmp_traps_handle;
+void *snmp_traps_handle;
 
-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 */
@@ -106,6 +111,7 @@
 void
 snmp_trap_dst_enable(u8_t dst_idx, u8_t enable)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   if (dst_idx < SNMP_TRAP_DESTINATIONS) {
     trap_dst[dst_idx].enable = enable;
   }
@@ -120,6 +126,7 @@
 void
 snmp_trap_dst_ip_set(u8_t dst_idx, const ip_addr_t *dst)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   if (dst_idx < SNMP_TRAP_DESTINATIONS) {
     ip_addr_set(&trap_dst[dst_idx].dip, dst);
   }
@@ -163,7 +170,7 @@
  * (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)
+snmp_send_trap(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;
@@ -171,6 +178,8 @@
   u16_t i, tot_len;
   err_t err = ERR_OK;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
   trap_msg.snmp_version = 0;
 
   for (i = 0, td = &trap_dst[0]; i < SNMP_TRAP_DESTINATIONS; i++, td++) {
@@ -202,7 +211,7 @@
           struct snmp_pbuf_stream pbuf_stream;
           snmp_pbuf_stream_init(&pbuf_stream, p, 0, tot_len);
 
-          /* pass 1, encode packet ino the pbuf(s) */
+          /* 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);
 
@@ -210,7 +219,7 @@
           snmp_stats.outpkts++;
 
           /** send to the TRAP destination */
-          snmp_sendto(snmp_traps_handle, p, &td->dip, SNMP_TRAP_PORT);
+          snmp_sendto(snmp_traps_handle, p, &td->dip, LWIP_IANA_PORT_SNMP_TRAP);
           pbuf_free(p);
         } else {
           err = ERR_MEM;
@@ -228,7 +237,7 @@
  * @ingroup snmp_traps
  * Send generic SNMP trap
  */
-err_t 
+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 } };
@@ -257,7 +266,7 @@
 
 /**
  * @ingroup snmp_traps
- * Send authentication failure trap (used internally by agent) 
+ * Send authentication failure trap (used internally by agent)
  */
 void
 snmp_authfail_trap(void)
@@ -357,7 +366,7 @@
   return tot_len;
 }
 
-static void
+static err_t
 snmp_trap_varbind_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind *varbinds)
 {
   struct snmp_asn1_tlv tlv;
@@ -366,80 +375,84 @@
   varbind = varbinds;
 
   SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 0, trap->vbseqlen);
-  snmp_ans1_enc_tlv(pbuf_stream, &tlv);
+  BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
 
   while (varbind != NULL) {
-    snmp_append_outbound_varbind(pbuf_stream, varbind);
+    BUILD_EXEC( snmp_append_outbound_varbind(pbuf_stream, varbind) );
 
     varbind = varbind->next;
   }
+
+  return ERR_OK;
 }
 
 /**
  * Encodes trap header from head to tail.
  */
-static void
+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);
-  snmp_ans1_enc_tlv(pbuf_stream, &tlv);
+  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);
-  snmp_ans1_enc_tlv(pbuf_stream, &tlv);
-  snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->snmp_version);
+  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);
-  snmp_ans1_enc_tlv(pbuf_stream, &tlv);
-  snmp_asn1_enc_raw(pbuf_stream,  (const u8_t *)snmp_community_trap, 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);
-  snmp_ans1_enc_tlv(pbuf_stream, &tlv);
+  BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &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);
-  snmp_ans1_enc_tlv(pbuf_stream, &tlv);
-  snmp_asn1_enc_oid(pbuf_stream, trap->enterprise->id, trap->enterprise->len);
+  BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
+  BUILD_EXEC( snmp_asn1_enc_oid(pbuf_stream, trap->enterprise->id, trap->enterprise->len) );
 
   /* IP addr */
   if (IP_IS_V6_VAL(trap->sip)) {
 #if LWIP_IPV6
     SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_IPADDR, 0, sizeof(ip_2_ip6(&trap->sip)->addr));
-    snmp_ans1_enc_tlv(pbuf_stream, &tlv);
-    snmp_asn1_enc_raw(pbuf_stream, (const u8_t *)&ip_2_ip6(&trap->sip)->addr, sizeof(ip_2_ip6(&trap->sip)->addr));
+    BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
+    BUILD_EXEC( snmp_asn1_enc_raw(pbuf_stream, (const u8_t *)&ip_2_ip6(&trap->sip)->addr, sizeof(ip_2_ip6(&trap->sip)->addr)) );
 #endif
   } else {
 #if LWIP_IPV4
     SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_IPADDR, 0, sizeof(ip_2_ip4(&trap->sip)->addr));
-    snmp_ans1_enc_tlv(pbuf_stream, &tlv);
-    snmp_asn1_enc_raw(pbuf_stream, (const u8_t *)&ip_2_ip4(&trap->sip)->addr, sizeof(ip_2_ip4(&trap->sip)->addr));
+    BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
+    BUILD_EXEC( snmp_asn1_enc_raw(pbuf_stream, (const u8_t *)&ip_2_ip4(&trap->sip)->addr, sizeof(ip_2_ip4(&trap->sip)->addr)) );
 #endif
   }
 
   /* trap length */
   SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);
   snmp_asn1_enc_s32t_cnt(trap->gen_trap, &tlv.value_len);
-  snmp_ans1_enc_tlv(pbuf_stream, &tlv);
-  snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->gen_trap);
+  BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
+  BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->gen_trap) );
 
   /* specific trap */
   SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);
   snmp_asn1_enc_s32t_cnt(trap->spc_trap, &tlv.value_len);
-  snmp_ans1_enc_tlv(pbuf_stream, &tlv);
-  snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->spc_trap);
+  BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
+  BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->spc_trap) );
 
   /* timestamp */
   SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_TIMETICKS, 0, 0);
   snmp_asn1_enc_s32t_cnt(trap->ts, &tlv.value_len);
-  snmp_ans1_enc_tlv(pbuf_stream, &tlv);
-  snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->ts);
+  BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
+  BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->ts) );
+
+  return ERR_OK;
 }
 
 #endif /* LWIP_SNMP */
diff --git a/src/apps/snmp/snmpv3.c b/src/apps/snmp/snmpv3.c
index 69fb3a0..ed5a076 100644
--- a/src/apps/snmp/snmpv3.c
+++ b/src/apps/snmp/snmpv3.c
@@ -58,7 +58,7 @@
  * (re-)initialized itself since snmpEngineID
  * was last configured.
  */
-u32_t
+s32_t
 snmpv3_get_engine_boots_internal(void)
 {
   if (snmpv3_get_engine_boots() == 0 ||
@@ -75,7 +75,7 @@
  * Once the timer reaches 2147483647 it gets reset to zero and the
  * engine boot ups get incremented.
  */
-u32_t
+s32_t
 snmpv3_get_engine_time_internal(void)
 {
   if (snmpv3_get_engine_time() >= SNMP_MAX_TIME_BOOT) {
@@ -101,7 +101,7 @@
  * @todo: This is a potential thread safety issue.
  */
 err_t
-snmpv3_build_priv_param(u8_t* priv_param)
+snmpv3_build_priv_param(u8_t *priv_param)
 {
 #ifdef LWIP_RAND /* Based on RFC3826 */
   static u8_t init;
@@ -124,7 +124,7 @@
   }
 #else /* Based on RFC3414 */
   static u32_t ctr;
-  u32_t boots = LWIP_SNMPV3_GET_ENGINE_BOOTS();
+  u32_t boots = snmpv3_get_engine_boots_internal();
   SMEMCPY(&priv_param[0], &boots, 4);
   SMEMCPY(&priv_param[4], &ctr, 4);
   ctr++;
diff --git a/src/apps/snmp/snmpv3_dummy.c b/src/apps/snmp/snmpv3_dummy.c
deleted file mode 100644
index bdfe844..0000000
--- a/src/apps/snmp/snmpv3_dummy.c
+++ /dev/null
@@ -1,145 +0,0 @@
-/**
- * @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_priv.h"
-#include <string.h>
-#include "lwip/err.h"
-
-#if LWIP_SNMP && LWIP_SNMP_V3
-
-/**
- *  @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, u8_t *auth_algo, u8_t *auth_key, u8_t *priv_algo, u8_t *priv_key)
-{
-  const char* engine_id;
-  u8_t engine_id_len;
-  
-  if(strlen(username) == 0) {
-    return ERR_OK;
-  }
-  
-  if(memcmp(username, "lwip", 4) != 0) {
-    return ERR_VAL;
-  }
-  
-  snmpv3_get_engine_id(&engine_id, &engine_id_len);
-  
-  if(auth_key != NULL) {
-    snmpv3_password_to_key_sha((const u8_t*)"maplesyrup", 10,
-      (const u8_t*)engine_id, engine_id_len,
-      auth_key);
-    *auth_algo = SNMP_V3_AUTH_ALGO_SHA;
-  }
-  if(priv_key != NULL) {
-    snmpv3_password_to_key_sha((const u8_t*)"maplesyrup", 10,
-      (const u8_t*)engine_id, engine_id_len,
-      priv_key);
-    *priv_algo = SNMP_V3_PRIV_ALGO_DES;
-  }
-  return ERR_OK;
-}
-
-/**
- * Get engine ID from persistence
- * @param id
- * @param len
- */
-void
-snmpv3_get_engine_id(const char **id, u8_t *len)
-{
-  *id = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02";
-  *len = 12;
-}
-
-/**
- * Store engine ID in persistence
- * @param id
- * @param len
- */
-err_t
-snmpv3_set_engine_id(const char *id, u8_t len)
-{
-  LWIP_UNUSED_ARG(id);
-  LWIP_UNUSED_ARG(len);
-  return ERR_OK;
-}
-
-/**
- * Get engine boots from persistence. Must be increased on each boot.
- * @return 
- */
-u32_t
-snmpv3_get_engine_boots(void)
-{
-  return 0;
-}
-
-/**
- * Store engine boots in persistence
- * @param boots
- */
-void 
-snmpv3_set_engine_boots(u32_t boots)
-{
-  LWIP_UNUSED_ARG(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 0;
-}
-
-/**
- * Reset current engine time to 0
- */
-void
-snmpv3_reset_engine_time(void)
-{
-}
-
-#endif /* LWIP_SNMP && LWIP_SNMP_V3 */
diff --git a/src/apps/snmp/snmpv3_mbedtls.c b/src/apps/snmp/snmpv3_mbedtls.c
index 0b1eefb..48c1a81 100644
--- a/src/apps/snmp/snmpv3_mbedtls.c
+++ b/src/apps/snmp/snmpv3_mbedtls.c
@@ -49,8 +49,8 @@
 #include "mbedtls/sha1.h"
 
 err_t
-snmpv3_auth(struct snmp_pbuf_stream* stream, u16_t length,
-    const u8_t* key, u8_t algo, u8_t* hmac_out)
+snmpv3_auth(struct snmp_pbuf_stream *stream, u16_t length,
+            const u8_t *key, snmpv3_auth_algo_t algo, u8_t *hmac_out)
 {
   u32_t i;
   u8_t key_len;
@@ -70,10 +70,10 @@
   }
 
   mbedtls_md_init(&ctx);
-  if(mbedtls_md_setup(&ctx, md_info, 1) != 0) {
+  if (mbedtls_md_setup(&ctx, md_info, 1) != 0) {
     return ERR_ARG;
   }
-          
+
   if (mbedtls_md_hmac_starts(&ctx, key, key_len) != 0) {
     goto free_md;
   }
@@ -96,7 +96,7 @@
 
   mbedtls_md_free(&ctx);
   return ERR_OK;
-  
+
 free_md:
   mbedtls_md_free(&ctx);
   return ERR_ARG;
@@ -105,9 +105,9 @@
 #if LWIP_SNMP_V3_CRYPTO
 
 err_t
-snmpv3_crypt(struct snmp_pbuf_stream* stream, u16_t length,
-    const u8_t* key, const u8_t* priv_param, const u32_t engine_boots,
-    const u32_t engine_time, u8_t algo, u8_t mode)
+snmpv3_crypt(struct snmp_pbuf_stream *stream, u16_t length,
+             const u8_t *key, const u8_t *priv_param, const u32_t engine_boots,
+             const u32_t engine_time, snmpv3_priv_algo_t algo, snmpv3_priv_mode_t mode)
 {
   size_t i;
   mbedtls_cipher_context_t ctx;
@@ -130,21 +130,21 @@
     }
 
     cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_DES_CBC);
-    if(mbedtls_cipher_setup(&ctx, cipher_info) != 0) {
+    if (mbedtls_cipher_setup(&ctx, cipher_info) != 0) {
       return ERR_ARG;
     }
-    if(mbedtls_cipher_set_padding_mode(&ctx, MBEDTLS_PADDING_NONE) != 0) {
+    if (mbedtls_cipher_set_padding_mode(&ctx, MBEDTLS_PADDING_NONE) != 0) {
       return ERR_ARG;
     }
-    if(mbedtls_cipher_setkey(&ctx, key, 8*8, (mode == SNMP_V3_PRIV_MODE_ENCRYPT)? MBEDTLS_ENCRYPT : MBEDTLS_DECRYPT) != 0) {
+    if (mbedtls_cipher_setkey(&ctx, key, 8 * 8, (mode == SNMP_V3_PRIV_MODE_ENCRYPT) ? MBEDTLS_ENCRYPT : MBEDTLS_DECRYPT) != 0) {
       goto error;
     }
 
-    /* Prepare IV */    
+    /* Prepare IV */
     for (i = 0; i < LWIP_ARRAYSIZE(iv_local); i++) {
       iv_local[i] = priv_param[i] ^ key[i + 8];
     }
-    if(mbedtls_cipher_set_iv(&ctx, iv_local, LWIP_ARRAYSIZE(iv_local)) != 0) {
+    if (mbedtls_cipher_set_iv(&ctx, iv_local, LWIP_ARRAYSIZE(iv_local)) != 0) {
       goto error;
     }
 
@@ -152,31 +152,38 @@
       size_t j;
       u8_t in_bytes[8];
       out_len = LWIP_ARRAYSIZE(out_bytes) ;
-      
+
       for (j = 0; j < LWIP_ARRAYSIZE(in_bytes); j++) {
-        snmp_pbuf_stream_read(&read_stream, &in_bytes[j]);
+        if (snmp_pbuf_stream_read(&read_stream, &in_bytes[j]) != ERR_OK) {
+          goto error;
+        }
       }
 
-      if(mbedtls_cipher_update(&ctx, in_bytes, LWIP_ARRAYSIZE(in_bytes), out_bytes, &out_len) != 0) {
+      if (mbedtls_cipher_update(&ctx, in_bytes, LWIP_ARRAYSIZE(in_bytes), out_bytes, &out_len) != 0) {
         goto error;
       }
 
-      snmp_pbuf_stream_writebuf(&write_stream, out_bytes, out_len);
+      if (snmp_pbuf_stream_writebuf(&write_stream, out_bytes, (u16_t)out_len) != ERR_OK) {
+        goto error;
+      }
     }
-    
+
     out_len = LWIP_ARRAYSIZE(out_bytes);
-    if(mbedtls_cipher_finish(&ctx, out_bytes, &out_len) != 0) {
+    if (mbedtls_cipher_finish(&ctx, out_bytes, &out_len) != 0) {
       goto error;
     }
-    snmp_pbuf_stream_writebuf(&write_stream, out_bytes, out_len);
+
+    if (snmp_pbuf_stream_writebuf(&write_stream, out_bytes, (u16_t)out_len) != ERR_OK) {
+      goto error;
+    }
   } else if (algo == SNMP_V3_PRIV_ALGO_AES) {
     u8_t iv_local[16];
 
     cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_128_CFB128);
-    if(mbedtls_cipher_setup(&ctx, cipher_info) != 0) {
+    if (mbedtls_cipher_setup(&ctx, cipher_info) != 0) {
       return ERR_ARG;
     }
-    if(mbedtls_cipher_setkey(&ctx, key, 16*8, (mode == SNMP_V3_PRIV_MODE_ENCRYPT)? MBEDTLS_ENCRYPT : MBEDTLS_DECRYPT) != 0) {
+    if (mbedtls_cipher_setkey(&ctx, key, 16 * 8, (mode == SNMP_V3_PRIV_MODE_ENCRYPT) ? MBEDTLS_ENCRYPT : MBEDTLS_DECRYPT) != 0) {
       goto error;
     }
 
@@ -193,7 +200,7 @@
     iv_local[4 + 2] = (engine_time  >>  8) & 0xFF;
     iv_local[4 + 3] = (engine_time  >>  0) & 0xFF;
     SMEMCPY(iv_local + 8, priv_param, 8);
-    if(mbedtls_cipher_set_iv(&ctx, iv_local, LWIP_ARRAYSIZE(iv_local)) != 0) {
+    if (mbedtls_cipher_set_iv(&ctx, iv_local, LWIP_ARRAYSIZE(iv_local)) != 0) {
       goto error;
     }
 
@@ -201,12 +208,16 @@
       u8_t in_byte;
       u8_t out_byte;
       size_t out_len = sizeof(out_byte);
-      
-      snmp_pbuf_stream_read(&read_stream, &in_byte);
-      if(mbedtls_cipher_update(&ctx, &in_byte, sizeof(in_byte), &out_byte, &out_len) != 0) {
+
+      if (snmp_pbuf_stream_read(&read_stream, &in_byte) != ERR_OK) {
         goto error;
       }
-      snmp_pbuf_stream_write(&write_stream, out_byte);
+      if (mbedtls_cipher_update(&ctx, &in_byte, sizeof(in_byte), &out_byte, &out_len) != 0) {
+        goto error;
+      }
+      if (snmp_pbuf_stream_write(&write_stream, out_byte) != ERR_OK) {
+        goto error;
+      }
     }
   } else {
     return ERR_ARG;
@@ -223,13 +234,13 @@
 #endif /* LWIP_SNMP_V3_CRYPTO */
 
 /* A.2.1. Password to Key Sample Code for MD5 */
-void 
+void
 snmpv3_password_to_key_md5(
-    const u8_t *password,    /* IN */
-    u8_t        passwordlen, /* IN */
-    const u8_t *engineID,    /* IN  - pointer to snmpEngineID  */
-    u8_t        engineLength,/* IN  - length of snmpEngineID */
-    u8_t       *key)         /* OUT - pointer to caller 16-octet buffer */
+  const u8_t *password,    /* IN */
+  size_t      passwordlen, /* IN */
+  const u8_t *engineID,    /* IN  - pointer to snmpEngineID  */
+  u8_t        engineLength,/* IN  - length of snmpEngineID */
+  u8_t       *key)         /* OUT - pointer to caller 16-octet buffer */
 {
   mbedtls_md5_context MD;
   u8_t *cp, password_buf[64];
@@ -276,13 +287,13 @@
 }
 
 /* A.2.2. Password to Key Sample Code for SHA */
-void 
+void
 snmpv3_password_to_key_sha(
-    const u8_t *password,    /* IN */
-    u8_t        passwordlen, /* IN */
-    const u8_t *engineID,    /* IN  - pointer to snmpEngineID  */
-    u8_t        engineLength,/* IN  - length of snmpEngineID */
-    u8_t       *key)         /* OUT - pointer to caller 20-octet buffer */
+  const u8_t *password,    /* IN */
+  size_t      passwordlen, /* IN */
+  const u8_t *engineID,    /* IN  - pointer to snmpEngineID  */
+  u8_t        engineLength,/* IN  - length of snmpEngineID */
+  u8_t       *key)         /* OUT - pointer to caller 20-octet buffer */
 {
   mbedtls_sha1_context SH;
   u8_t *cp, password_buf[72];
@@ -323,7 +334,7 @@
   mbedtls_sha1_starts(&SH);
   mbedtls_sha1_update(&SH, password_buf, 40 + engineLength);
   mbedtls_sha1_finish(&SH, key);
-  
+
   mbedtls_sha1_free(&SH);
   return;
 }
diff --git a/src/apps/snmp/snmpv3_priv.h b/src/apps/snmp/snmpv3_priv.h
index b87666d..323364c 100644
--- a/src/apps/snmp/snmpv3_priv.h
+++ b/src/apps/snmp/snmpv3_priv.h
@@ -39,6 +39,7 @@
 
 #if LWIP_SNMP && LWIP_SNMP_V3
 
+#include "lwip/apps/snmpv3.h"
 #include "snmp_pbuf_stream.h"
 
 /* According to RFC 3411 */
@@ -48,18 +49,20 @@
 #define SNMP_V3_MAX_AUTH_PARAM_LENGTH  12
 #define SNMP_V3_MAX_PRIV_PARAM_LENGTH  8
 
-#define SNMP_V3_AUTH_FLAG      0x01
-#define SNMP_V3_PRIV_FLAG      0x02
-
 #define SNMP_V3_MD5_LEN        16
 #define SNMP_V3_SHA_LEN        20
 
-u32_t snmpv3_get_engine_boots_internal(void);
-u32_t snmpv3_get_engine_time_internal(void);
-err_t snmpv3_auth(struct snmp_pbuf_stream* stream, u16_t length, const u8_t* key, u8_t algo, u8_t* hmac_out);
-err_t snmpv3_crypt(struct snmp_pbuf_stream* stream, u16_t length, const u8_t* key,
-    const u8_t* priv_param, const u32_t engine_boots, const u32_t engine_time, u8_t algo, u8_t mode);
-err_t snmpv3_build_priv_param(u8_t* priv_param);
+typedef enum {
+  SNMP_V3_PRIV_MODE_DECRYPT = 0,
+  SNMP_V3_PRIV_MODE_ENCRYPT = 1
+} snmpv3_priv_mode_t;
+
+s32_t snmpv3_get_engine_boots_internal(void);
+err_t snmpv3_auth(struct snmp_pbuf_stream *stream, u16_t length, const u8_t *key, snmpv3_auth_algo_t algo, u8_t *hmac_out);
+err_t snmpv3_crypt(struct snmp_pbuf_stream *stream, u16_t length, const u8_t *key,
+                   const u8_t *priv_param, const u32_t engine_boots, const u32_t engine_time, snmpv3_priv_algo_t algo, snmpv3_priv_mode_t mode);
+err_t snmpv3_build_priv_param(u8_t *priv_param);
+void snmpv3_enginetime_timer(void *arg);
 
 #endif
 
diff --git a/src/apps/sntp/sntp.c b/src/apps/sntp/sntp.c
index 71b2abe..b7ff56a 100644
--- a/src/apps/sntp/sntp.c
+++ b/src/apps/sntp/sntp.c
@@ -42,11 +42,10 @@
  * This is simple "SNTP" client for the lwIP raw API.
  * It is a minimal implementation of SNTPv4 as specified in RFC 4330.
  *
- * For a list of some public NTP servers, see this link :
+ * For a list of some public NTP servers, see this link:
  * http://support.ntp.org/bin/view/Servers/NTPPoolServers
  *
  * @todo:
- * - set/change servers at runtime
  * - complete SNTP_CHECK_RESPONSE checks 3 and 4
  */
 
@@ -72,21 +71,12 @@
 #define SNTP_SUPPORT_MULTIPLE_SERVERS 0
 #endif /* NTP_MAX_SERVERS > 1 */
 
-#if (SNTP_UPDATE_DELAY < 15000) && !defined(SNTP_SUPPRESS_DELAY_CHECK)
+#ifndef SNTP_SUPPRESS_DELAY_CHECK
+#if SNTP_UPDATE_DELAY < 15000
 #error "SNTPv4 RFC 4330 enforces a minimum update time of 15 seconds (define SNTP_SUPPRESS_DELAY_CHECK to disable this error)!"
 #endif
-
-/* Configure behaviour depending on microsecond or second precision */
-#ifdef SNTP_SET_SYSTEM_TIME_US
-#define SNTP_CALC_TIME_US           1
-#define SNTP_RECEIVE_TIME_SIZE      2
-#else
-#define SNTP_SET_SYSTEM_TIME_US(sec, us)
-#define SNTP_CALC_TIME_US           0
-#define SNTP_RECEIVE_TIME_SIZE      1
 #endif
 
-
 /* the various debug levels for this file */
 #define SNTP_DEBUG_TRACE        (SNTP_DEBUG | LWIP_DBG_TRACE)
 #define SNTP_DEBUG_STATE        (SNTP_DEBUG | LWIP_DBG_STATE)
@@ -101,10 +91,10 @@
 
 #define SNTP_OFFSET_LI_VN_MODE      0
 #define SNTP_LI_MASK                0xC0
-#define SNTP_LI_NO_WARNING          0x00
-#define SNTP_LI_LAST_MINUTE_61_SEC  0x01
-#define SNTP_LI_LAST_MINUTE_59_SEC  0x02
-#define SNTP_LI_ALARM_CONDITION     0x03 /* (clock not synchronized) */
+#define SNTP_LI_NO_WARNING          (0x00 << 6)
+#define SNTP_LI_LAST_MINUTE_61_SEC  (0x01 << 6)
+#define SNTP_LI_LAST_MINUTE_59_SEC  (0x02 << 6)
+#define SNTP_LI_ALARM_CONDITION     (0x03 << 6) /* (clock not synchronized) */
 
 #define SNTP_VERSION_MASK           0x38
 #define SNTP_VERSION                (4/* NTP Version 4*/<<3)
@@ -121,18 +111,89 @@
 #define SNTP_OFFSET_RECEIVE_TIME    32
 #define SNTP_OFFSET_TRANSMIT_TIME   40
 
-/* number of seconds between 1900 and 1970 (MSB=1)*/
-#define DIFF_SEC_1900_1970         (2208988800UL)
-/* number of seconds between 1970 and Feb 7, 2036 (6:28:16 UTC) (MSB=0) */
-#define DIFF_SEC_1970_2036         (2085978496UL)
+/* Number of seconds between 1970 and Feb 7, 2036 06:28:16 UTC (epoch 1) */
+#define DIFF_SEC_1970_2036          ((u32_t)2085978496L)
+
+/** Convert NTP timestamp fraction to microseconds.
+ */
+#ifndef SNTP_FRAC_TO_US
+# if LWIP_HAVE_INT64
+#  define SNTP_FRAC_TO_US(f)        ((u32_t)(((u64_t)(f) * 1000000UL) >> 32))
+# else
+#  define SNTP_FRAC_TO_US(f)        ((u32_t)(f) / 4295)
+# endif
+#endif /* !SNTP_FRAC_TO_US */
+
+/* Configure behaviour depending on native, microsecond or second precision.
+ * Treat NTP timestamps as signed two's-complement integers. This way,
+ * timestamps that have the MSB set simply become negative offsets from
+ * the epoch (Feb 7, 2036 06:28:16 UTC). Representable dates range from
+ * 1968 to 2104.
+ */
+#ifndef SNTP_SET_SYSTEM_TIME_NTP
+# ifdef SNTP_SET_SYSTEM_TIME_US
+#  define SNTP_SET_SYSTEM_TIME_NTP(s, f) \
+    SNTP_SET_SYSTEM_TIME_US((u32_t)((s) + DIFF_SEC_1970_2036), SNTP_FRAC_TO_US(f))
+# else
+#  define SNTP_SET_SYSTEM_TIME_NTP(s, f) \
+    SNTP_SET_SYSTEM_TIME((u32_t)((s) + DIFF_SEC_1970_2036))
+# endif
+#endif /* !SNTP_SET_SYSTEM_TIME_NTP */
+
+/* Get the system time either natively as NTP timestamp or convert from
+ * Unix time in seconds and microseconds. Take care to avoid overflow if the
+ * microsecond value is at the maximum of 999999. Also add 0.5 us fudge to
+ * avoid special values like 0, and to mask round-off errors that would
+ * otherwise break round-trip conversion identity.
+ */
+#ifndef SNTP_GET_SYSTEM_TIME_NTP
+# define SNTP_GET_SYSTEM_TIME_NTP(s, f) do { \
+    u32_t sec_, usec_; \
+    SNTP_GET_SYSTEM_TIME(sec_, usec_); \
+    (s) = (s32_t)(sec_ - DIFF_SEC_1970_2036); \
+    (f) = usec_ * 4295 - ((usec_ * 2143) >> 16) + 2147; \
+  } while (0)
+#endif /* !SNTP_GET_SYSTEM_TIME_NTP */
+
+/* Start offset of the timestamps to extract from the SNTP packet */
+#define SNTP_OFFSET_TIMESTAMPS \
+    (SNTP_OFFSET_TRANSMIT_TIME + 8 - sizeof(struct sntp_timestamps))
+
+/* Round-trip delay arithmetic helpers */
+#if SNTP_COMP_ROUNDTRIP
+# if !LWIP_HAVE_INT64
+#  error "SNTP round-trip delay compensation requires 64-bit arithmetic"
+# endif
+# define SNTP_SEC_FRAC_TO_S64(s, f) \
+    ((s64_t)(((u64_t)(s) << 32) | (u32_t)(f)))
+# define SNTP_TIMESTAMP_TO_S64(t) \
+    SNTP_SEC_FRAC_TO_S64(lwip_ntohl((t).sec), lwip_ntohl((t).frac))
+#endif /* SNTP_COMP_ROUNDTRIP */
+
+/**
+ * 64-bit NTP timestamp, in network byte order.
+ */
+struct sntp_time {
+  u32_t sec;
+  u32_t frac;
+};
+
+/**
+ * Timestamps to be extracted from the NTP header.
+ */
+struct sntp_timestamps {
+#if SNTP_COMP_ROUNDTRIP || SNTP_CHECK_RESPONSE >= 2
+  struct sntp_time orig;
+  struct sntp_time recv;
+#endif
+  struct sntp_time xmit;
+};
 
 /**
  * SNTP packet format (without optional fields)
  * Timestamps are coded as 64 bits:
- * - 32 bits seconds since Jan 01, 1970, 00:00
- * - 32 bits seconds fraction (0-padded)
- * For future use, if the MSB in the seconds part is set, seconds are based
- * on Feb 07, 2036, 06:28:16.
+ * - signed 32 bits seconds since Feb 07, 2036, 06:28:16 UTC (epoch 1)
+ * - unsigned 32 bits seconds fraction (2^32 = 1 second)
  */
 #ifdef PACK_STRUCT_USE_INCLUDES
 #  include "arch/bpstruct.h"
@@ -163,13 +224,17 @@
 static u8_t sntp_opmode;
 
 /** The UDP pcb used by the SNTP client */
-static struct udp_pcb* sntp_pcb;
+static struct udp_pcb *sntp_pcb;
 /** Names/Addresses of servers */
 struct sntp_server {
 #if SNTP_SERVER_DNS
-  char* name;
+  const char *name;
 #endif /* SNTP_SERVER_DNS */
   ip_addr_t addr;
+#if SNTP_MONITOR_SERVER_REACHABILITY
+  /** Reachability shift register as described in RFC 5905 */
+  u8_t reachability;
+#endif /* SNTP_MONITOR_SERVER_REACHABILITY */
 };
 static struct sntp_server sntp_servers[SNTP_MAX_SERVERS];
 
@@ -199,38 +264,69 @@
 
 #if SNTP_CHECK_RESPONSE >= 2
 /** Saves the last timestamp sent (which is sent back by the server)
- * to compare against in response */
-static u32_t sntp_last_timestamp_sent[2];
+ * to compare against in response. Stored in network byte order. */
+static struct sntp_time sntp_last_timestamp_sent;
 #endif /* SNTP_CHECK_RESPONSE >= 2 */
 
+#if defined(LWIP_DEBUG) && !defined(sntp_format_time)
+/* Debug print helper. */
+static const char *
+sntp_format_time(s32_t sec)
+{
+  time_t ut;
+  ut = (u32_t)((u32_t)sec + DIFF_SEC_1970_2036);
+  return ctime(&ut);
+}
+#endif /* LWIP_DEBUG && !sntp_format_time */
+
 /**
  * SNTP processing of received timestamp
  */
 static void
-sntp_process(u32_t *receive_timestamp)
+sntp_process(const struct sntp_timestamps *timestamps)
 {
-  /* convert SNTP time (1900-based) to unix GMT time (1970-based)
-   * if MSB is 0, SNTP time is 2036-based!
-   */
-  u32_t rx_secs = lwip_ntohl(receive_timestamp[0]);
-  int is_1900_based = ((rx_secs & 0x80000000) != 0);
-  u32_t t = is_1900_based ? (rx_secs - DIFF_SEC_1900_1970) : (rx_secs + DIFF_SEC_1970_2036);
-  time_t tim = t;
+  s32_t sec;
+  u32_t frac;
 
-#if SNTP_CALC_TIME_US
-  u32_t us = lwip_ntohl(receive_timestamp[1]) / 4295;
-  SNTP_SET_SYSTEM_TIME_US(t, us);
-  /* display local time from GMT time */
-  LWIP_DEBUGF(SNTP_DEBUG_TRACE, ("sntp_process: %s, %"U32_F" us", ctime(&tim), us));
+  sec  = (s32_t)lwip_ntohl(timestamps->xmit.sec);
+  frac = lwip_ntohl(timestamps->xmit.frac);
 
-#else /* SNTP_CALC_TIME_US */
+#if SNTP_COMP_ROUNDTRIP
+# if SNTP_CHECK_RESPONSE >= 2
+  if (timestamps->recv.sec != 0 || timestamps->recv.frac != 0)
+# endif
+  {
+    s32_t dest_sec;
+    u32_t dest_frac;
+    u32_t step_sec;
 
-  /* change system time and/or the update the RTC clock */
-  SNTP_SET_SYSTEM_TIME(t);
-  /* display local time from GMT time */
-  LWIP_DEBUGF(SNTP_DEBUG_TRACE, ("sntp_process: %s", ctime(&tim)));
-#endif /* SNTP_CALC_TIME_US */
-  LWIP_UNUSED_ARG(tim);
+    /* Get the destination time stamp, i.e. the current system time */
+    SNTP_GET_SYSTEM_TIME_NTP(dest_sec, dest_frac);
+
+    step_sec = (dest_sec < sec) ? ((u32_t)sec - (u32_t)dest_sec)
+               : ((u32_t)dest_sec - (u32_t)sec);
+    /* In order to avoid overflows, skip the compensation if the clock step
+     * is larger than about 34 years. */
+    if ((step_sec >> 30) == 0) {
+      s64_t t1, t2, t3, t4;
+
+      t4 = SNTP_SEC_FRAC_TO_S64(dest_sec, dest_frac);
+      t3 = SNTP_SEC_FRAC_TO_S64(sec, frac);
+      t1 = SNTP_TIMESTAMP_TO_S64(timestamps->orig);
+      t2 = SNTP_TIMESTAMP_TO_S64(timestamps->recv);
+      /* Clock offset calculation according to RFC 4330 */
+      t4 += ((t2 - t1) + (t3 - t4)) / 2;
+
+      sec  = (s32_t)((u64_t)t4 >> 32);
+      frac = (u32_t)((u64_t)t4);
+    }
+  }
+#endif /* SNTP_COMP_ROUNDTRIP */
+
+  SNTP_SET_SYSTEM_TIME_NTP(sec, frac);
+  LWIP_UNUSED_ARG(frac); /* might be unused if only seconds are set */
+  LWIP_DEBUGF(SNTP_DEBUG_TRACE, ("sntp_process: %s, %" U32_F " us\n",
+                                 sntp_format_time(sec), SNTP_FRAC_TO_US(frac)));
 }
 
 /**
@@ -242,18 +338,23 @@
   memset(req, 0, SNTP_MSG_LEN);
   req->li_vn_mode = SNTP_LI_NO_WARNING | SNTP_VERSION | SNTP_MODE_CLIENT;
 
-#if SNTP_CHECK_RESPONSE >= 2
+#if SNTP_CHECK_RESPONSE >= 2 || SNTP_COMP_ROUNDTRIP
   {
-    u32_t sntp_time_sec, sntp_time_us;
-    /* fill in transmit timestamp and save it in 'sntp_last_timestamp_sent' */
-    SNTP_GET_SYSTEM_TIME(sntp_time_sec, sntp_time_us);
-    sntp_last_timestamp_sent[0] = lwip_htonl(sntp_time_sec + DIFF_SEC_1900_1970);
-    req->transmit_timestamp[0] = sntp_last_timestamp_sent[0];
-    /* we send/save us instead of fraction to be faster... */
-    sntp_last_timestamp_sent[1] = lwip_htonl(sntp_time_us);
-    req->transmit_timestamp[1] = sntp_last_timestamp_sent[1];
+    s32_t secs;
+    u32_t sec, frac;
+    /* Get the transmit timestamp */
+    SNTP_GET_SYSTEM_TIME_NTP(secs, frac);
+    sec  = lwip_htonl((u32_t)secs);
+    frac = lwip_htonl(frac);
+
+# if SNTP_CHECK_RESPONSE >= 2
+    sntp_last_timestamp_sent.sec  = sec;
+    sntp_last_timestamp_sent.frac = frac;
+# endif
+    req->transmit_timestamp[0] = sec;
+    req->transmit_timestamp[1] = frac;
   }
-#endif /* SNTP_CHECK_RESPONSE >= 2 */
+#endif /* SNTP_CHECK_RESPONSE >= 2 || SNTP_COMP_ROUNDTRIP */
 }
 
 /**
@@ -262,12 +363,12 @@
  * @param arg is unused (only necessary to conform to sys_timeout)
  */
 static void
-sntp_retry(void* arg)
+sntp_retry(void *arg)
 {
   LWIP_UNUSED_ARG(arg);
 
   LWIP_DEBUGF(SNTP_DEBUG_STATE, ("sntp_retry: Next request will be sent in %"U32_F" ms\n",
-    sntp_retry_timeout));
+                                 sntp_retry_timeout));
 
   /* set up a timer to send a retry and increase the retry delay */
   sys_timeout(sntp_retry_timeout, sntp_request, NULL);
@@ -296,7 +397,7 @@
  * @param arg is unused (only necessary to conform to sys_timeout)
  */
 static void
-sntp_try_next_server(void* arg)
+sntp_try_next_server(void *arg)
 {
   u8_t old_server, i;
   LWIP_UNUSED_ARG(arg);
@@ -311,9 +412,9 @@
 #if SNTP_SERVER_DNS
         || (sntp_servers[sntp_current_server].name != NULL)
 #endif
-        ) {
+       ) {
       LWIP_DEBUGF(SNTP_DEBUG_STATE, ("sntp_try_next_server: Sending request to server %"U16_F"\n",
-        (u16_t)sntp_current_server));
+                                     (u16_t)sntp_current_server));
       /* new server: reset retry timeout */
       SNTP_RESET_RETRY_TIMEOUT();
       /* instantly send a request to the next server */
@@ -332,25 +433,21 @@
 
 /** UDP recv callback for the sntp pcb */
 static void
-sntp_recv(void *arg, struct udp_pcb* pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
+sntp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
 {
+  struct sntp_timestamps timestamps;
   u8_t mode;
   u8_t stratum;
-  u32_t receive_timestamp[SNTP_RECEIVE_TIME_SIZE];
   err_t err;
 
   LWIP_UNUSED_ARG(arg);
   LWIP_UNUSED_ARG(pcb);
 
-  /* packet received: stop retry timeout  */
-  sys_untimeout(sntp_try_next_server, NULL);
-  sys_untimeout(sntp_request, NULL);
-
   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)) &&
-    (port == SNTP_PORT))
+      (port == SNTP_PORT))
 #else /* SNTP_CHECK_RESPONSE >= 1 */
   LWIP_UNUSED_ARG(addr);
   LWIP_UNUSED_ARG(port);
@@ -358,32 +455,30 @@
   {
     /* process the response */
     if (p->tot_len == SNTP_MSG_LEN) {
-      pbuf_copy_partial(p, &mode, 1, SNTP_OFFSET_LI_VN_MODE);
-      mode &= SNTP_MODE_MASK;
+      mode = pbuf_get_at(p, SNTP_OFFSET_LI_VN_MODE) & SNTP_MODE_MASK;
       /* if this is a SNTP response... */
-      if (((sntp_opmode == SNTP_OPMODE_POLL) && (mode == SNTP_MODE_SERVER)) ||
+      if (((sntp_opmode == SNTP_OPMODE_POLL)       && (mode == SNTP_MODE_SERVER)) ||
           ((sntp_opmode == SNTP_OPMODE_LISTENONLY) && (mode == SNTP_MODE_BROADCAST))) {
-        pbuf_copy_partial(p, &stratum, 1, SNTP_OFFSET_STRATUM);
+        stratum = pbuf_get_at(p, SNTP_OFFSET_STRATUM);
+
         if (stratum == SNTP_STRATUM_KOD) {
           /* Kiss-of-death packet. Use another server or increase UPDATE_DELAY. */
           err = SNTP_ERR_KOD;
           LWIP_DEBUGF(SNTP_DEBUG_STATE, ("sntp_recv: Received Kiss-of-Death\n"));
         } else {
+          pbuf_copy_partial(p, &timestamps, sizeof(timestamps), SNTP_OFFSET_TIMESTAMPS);
 #if SNTP_CHECK_RESPONSE >= 2
           /* check originate_timetamp against sntp_last_timestamp_sent */
-          u32_t originate_timestamp[2];
-          pbuf_copy_partial(p, &originate_timestamp, 8, SNTP_OFFSET_ORIGINATE_TIME);
-          if ((originate_timestamp[0] != sntp_last_timestamp_sent[0]) ||
-              (originate_timestamp[1] != sntp_last_timestamp_sent[1]))
-          {
-            LWIP_DEBUGF(SNTP_DEBUG_WARN, ("sntp_recv: Invalid originate timestamp in response\n"));
+          if (timestamps.orig.sec != sntp_last_timestamp_sent.sec ||
+              timestamps.orig.frac != sntp_last_timestamp_sent.frac) {
+            LWIP_DEBUGF(SNTP_DEBUG_WARN,
+                        ("sntp_recv: Invalid originate timestamp in response\n"));
           } else
 #endif /* SNTP_CHECK_RESPONSE >= 2 */
-          /* @todo: add code for SNTP_CHECK_RESPONSE >= 3 and >= 4 here */
+            /* @todo: add code for SNTP_CHECK_RESPONSE >= 3 and >= 4 here */
           {
             /* correct answer */
             err = ERR_OK;
-            pbuf_copy_partial(p, &receive_timestamp, SNTP_RECEIVE_TIME_SIZE * 4, SNTP_OFFSET_TRANSMIT_TIME);
           }
         }
       } else {
@@ -401,30 +496,39 @@
     err = ERR_TIMEOUT;
   }
 #endif /* SNTP_CHECK_RESPONSE >= 1 */
-  pbuf_free(p);
-  if (err == ERR_OK) {
-    sntp_process(receive_timestamp);
 
+  pbuf_free(p);
+
+  if (err == ERR_OK) {
+    /* correct packet received: process it it */
+    sntp_process(&timestamps);
+
+#if SNTP_MONITOR_SERVER_REACHABILITY
+    /* indicate that server responded */
+    sntp_servers[sntp_current_server].reachability |= 1;
+#endif /* SNTP_MONITOR_SERVER_REACHABILITY */
     /* Set up timeout for next request (only if poll response was received)*/
     if (sntp_opmode == SNTP_OPMODE_POLL) {
+      u32_t sntp_update_delay;
+      sys_untimeout(sntp_try_next_server, NULL);
+      sys_untimeout(sntp_request, NULL);
+
       /* Correct response, reset retry timeout */
       SNTP_RESET_RETRY_TIMEOUT();
 
-      sys_timeout((u32_t)SNTP_UPDATE_DELAY, sntp_request, NULL);
+      sntp_update_delay = (u32_t)SNTP_UPDATE_DELAY;
+      sys_timeout(sntp_update_delay, sntp_request, NULL);
       LWIP_DEBUGF(SNTP_DEBUG_STATE, ("sntp_recv: Scheduled next time request: %"U32_F" ms\n",
-        (u32_t)SNTP_UPDATE_DELAY));
+                                     sntp_update_delay));
     }
-  } else if (err != ERR_TIMEOUT) {
-    /* Errors are only processed in case of an explicit poll response */
+  } else if (err == SNTP_ERR_KOD) {
+    /* KOD errors are only processed in case of an explicit poll response */
     if (sntp_opmode == SNTP_OPMODE_POLL) {
-      if (err == SNTP_ERR_KOD) {
-        /* Kiss-of-death packet. Use another server or increase UPDATE_DELAY. */
-        sntp_try_next_server(NULL);
-      } else {
-        /* another error, try the same server again */
-        sntp_retry(NULL);
-      }
+      /* Kiss-of-death packet. Use another server or increase UPDATE_DELAY. */
+      sntp_try_next_server(NULL);
     }
+  } else {
+    /* ignore any broken packet, poll mode: retry after timeout to avoid flooding */
   }
 }
 
@@ -435,7 +539,10 @@
 static void
 sntp_send_request(const ip_addr_t *server_addr)
 {
-  struct pbuf* p;
+  struct pbuf *p;
+
+  LWIP_ASSERT("server_addr != NULL", server_addr != NULL);
+
   p = pbuf_alloc(PBUF_TRANSPORT, SNTP_MSG_LEN, PBUF_RAM);
   if (p != NULL) {
     struct sntp_msg *sntpmsg = (struct sntp_msg *)p->payload;
@@ -446,15 +553,19 @@
     udp_sendto(sntp_pcb, p, server_addr, SNTP_PORT);
     /* free the pbuf after sending it */
     pbuf_free(p);
+#if SNTP_MONITOR_SERVER_REACHABILITY
+    /* indicate new packet has been sent */
+    sntp_servers[sntp_current_server].reachability <<= 1;
+#endif /* SNTP_MONITOR_SERVER_REACHABILITY */
     /* set up receive timeout: try next server or retry on timeout */
     sys_timeout((u32_t)SNTP_RECV_TIMEOUT, sntp_try_next_server, NULL);
 #if SNTP_CHECK_RESPONSE >= 1
     /* save server address to verify it in sntp_recv */
-    ip_addr_set(&sntp_last_server_address, server_addr);
+    ip_addr_copy(sntp_last_server_address, *server_addr);
 #endif /* SNTP_CHECK_RESPONSE >= 1 */
   } else {
     LWIP_DEBUGF(SNTP_DEBUG_SERIOUS, ("sntp_send_request: Out of memory, trying again in %"U32_F" ms\n",
-      (u32_t)SNTP_RETRY_TIMEOUT));
+                                     (u32_t)SNTP_RETRY_TIMEOUT));
     /* out of memory: set up a timer to send a retry */
     sys_timeout((u32_t)SNTP_RETRY_TIMEOUT, sntp_request, NULL);
   }
@@ -465,7 +576,7 @@
  * DNS found callback when using DNS names as server address.
  */
 static void
-sntp_dns_found(const char* hostname, const ip_addr_t *ipaddr, void *arg)
+sntp_dns_found(const char *hostname, const ip_addr_t *ipaddr, void *arg)
 {
   LWIP_UNUSED_ARG(hostname);
   LWIP_UNUSED_ARG(arg);
@@ -473,6 +584,7 @@
   if (ipaddr != NULL) {
     /* Address resolved, send request */
     LWIP_DEBUGF(SNTP_DEBUG_STATE, ("sntp_dns_found: Server address resolved, sending request\n"));
+    sntp_servers[sntp_current_server].addr = *ipaddr;
     sntp_send_request(ipaddr);
   } else {
     /* DNS resolving failed -> try another server */
@@ -501,7 +613,7 @@
     /* always resolve the name and rely on dns-internal caching & timeout */
     ip_addr_set_zero(&sntp_servers[sntp_current_server].addr);
     err = dns_gethostbyname(sntp_servers[sntp_current_server].name, &sntp_server_address,
-      sntp_dns_found, NULL);
+                            sntp_dns_found, NULL);
     if (err == ERR_INPROGRESS) {
       /* DNS request sent, wait for sntp_dns_found being called */
       LWIP_DEBUGF(SNTP_DEBUG_STATE, ("sntp_request: Waiting for server address to be resolved.\n"));
@@ -518,7 +630,7 @@
 
   if (err == ERR_OK) {
     LWIP_DEBUGF(SNTP_DEBUG_TRACE, ("sntp_request: current server address is %s\n",
-      ipaddr_ntoa(&sntp_server_address)));
+                                   ipaddr_ntoa(&sntp_server_address)));
     sntp_send_request(&sntp_server_address);
   } else {
     /* address conversion failed, try another server */
@@ -535,6 +647,8 @@
 void
 sntp_init(void)
 {
+  /* LWIP_ASSERT_CORE_LOCKED(); is checked by udp_new() */
+
 #ifdef SNTP_SERVER_ADDRESS
 #if SNTP_SERVER_DNS
   sntp_setservername(0, SNTP_SERVER_ADDRESS);
@@ -571,7 +685,14 @@
 void
 sntp_stop(void)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   if (sntp_pcb != NULL) {
+#if SNTP_MONITOR_SERVER_REACHABILITY
+    u8_t i;
+    for (i = 0; i < SNTP_MAX_SERVERS; i++) {
+      sntp_servers[i].reachability = 0;
+    }
+#endif /* SNTP_MONITOR_SERVER_REACHABILITY */
     sys_untimeout(sntp_request, NULL);
     sys_untimeout(sntp_try_next_server, NULL);
     udp_remove(sntp_pcb);
@@ -585,7 +706,7 @@
  */
 u8_t sntp_enabled(void)
 {
-  return (sntp_pcb != NULL)? 1 : 0;
+  return (sntp_pcb != NULL) ? 1 : 0;
 }
 
 /**
@@ -596,6 +717,7 @@
 void
 sntp_setoperatingmode(u8_t operating_mode)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("Invalid operating mode", operating_mode <= SNTP_OPMODE_LISTENONLY);
   LWIP_ASSERT("Operating mode must not be set while SNTP client is running", sntp_pcb == NULL);
   sntp_opmode = operating_mode;
@@ -611,6 +733,23 @@
   return sntp_opmode;
 }
 
+#if SNTP_MONITOR_SERVER_REACHABILITY
+/**
+ * @ingroup sntp
+ * Gets the server reachability shift register as described in RFC 5905.
+ *
+ * @param idx the index of the NTP server
+ */
+u8_t
+sntp_getreachability(u8_t idx)
+{
+  if (idx < SNTP_MAX_SERVERS) {
+    return sntp_servers[idx].reachability;
+  }
+  return 0;
+}
+#endif /* SNTP_MONITOR_SERVER_REACHABILITY */
+
 #if SNTP_GET_SERVERS_FROM_DHCP
 /**
  * Config SNTP server handling by IP address, name, or DHCP; clear table
@@ -620,6 +759,7 @@
 sntp_servermode_dhcp(int set_servers_from_dhcp)
 {
   u8_t new_mode = set_servers_from_dhcp ? 1 : 0;
+  LWIP_ASSERT_CORE_LOCKED();
   if (sntp_set_servers_from_dhcp != new_mode) {
     sntp_set_servers_from_dhcp = new_mode;
   }
@@ -636,6 +776,7 @@
 void
 sntp_setserver(u8_t idx, const ip_addr_t *server)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   if (idx < SNTP_MAX_SERVERS) {
     if (server != NULL) {
       sntp_servers[idx].addr = (*server);
@@ -652,15 +793,15 @@
 /**
  * Initialize one of the NTP servers by IP address, required by DHCP
  *
- * @param numdns the index of the NTP server to set must be < SNTP_MAX_SERVERS
- * @param dnsserver IP address of the NTP server to set
+ * @param num the index of the NTP server to set must be < SNTP_MAX_SERVERS
+ * @param server IP address of the NTP server to set
  */
 void
 dhcp_set_ntp_servers(u8_t num, const ip4_addr_t *server)
 {
   LWIP_DEBUGF(SNTP_DEBUG_TRACE, ("sntp: %s %u.%u.%u.%u as NTP server #%u via DHCP\n",
-    (sntp_set_servers_from_dhcp ? "Got" : "Rejected"),
-    ip4_addr1(server), ip4_addr2(server), ip4_addr3(server), ip4_addr4(server), num));
+                                 (sntp_set_servers_from_dhcp ? "Got" : "Rejected"),
+                                 ip4_addr1(server), ip4_addr2(server), ip4_addr3(server), ip4_addr4(server), num));
   if (sntp_set_servers_from_dhcp && num) {
     u8_t i;
     for (i = 0; (i < num) && (i < SNTP_MAX_SERVERS); i++) {
@@ -683,7 +824,7 @@
  * @return IP address of the indexed NTP server or "ip_addr_any" if the NTP
  *         server has not been configured by address (or at all).
  */
-const ip_addr_t*
+const ip_addr_t *
 sntp_getserver(u8_t idx)
 {
   if (idx < SNTP_MAX_SERVERS) {
@@ -696,12 +837,13 @@
 /**
  * Initialize one of the NTP servers by name
  *
- * @param numdns the index of the NTP server to set must be < SNTP_MAX_SERVERS
- * @param dnsserver DNS name of the NTP server to set, to be resolved at contact time
+ * @param idx the index of the NTP server to set must be < SNTP_MAX_SERVERS
+ * @param server DNS name of the NTP server to set, to be resolved at contact time
  */
 void
-sntp_setservername(u8_t idx, char *server)
+sntp_setservername(u8_t idx, const char *server)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   if (idx < SNTP_MAX_SERVERS) {
     sntp_servers[idx].name = server;
   }
@@ -710,11 +852,11 @@
 /**
  * Obtain one of the currently configured by name NTP servers.
  *
- * @param numdns the index of the NTP server
+ * @param idx the index of the NTP server
  * @return IP address of the indexed NTP server or NULL if the NTP
  *         server has not been configured by name (or at all)
  */
-char *
+const char *
 sntp_getservername(u8_t idx)
 {
   if (idx < SNTP_MAX_SERVERS) {
diff --git a/src/apps/tftp/tftp_server.c b/src/apps/tftp/tftp_server.c
index 243b092..e3f1512 100644
--- a/src/apps/tftp/tftp_server.c
+++ b/src/apps/tftp/tftp_server.c
@@ -1,4 +1,4 @@
-/****************************************************************//**
+/**
  *
  * @file tftp_server.c
  *
@@ -10,9 +10,9 @@
  * 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:
  *
@@ -92,7 +92,7 @@
 
 static struct tftp_state tftp_state;
 
-static void tftp_tmr(void* arg);
+static void tftp_tmr(void *arg);
 
 static void
 close_handle(void)
@@ -100,13 +100,13 @@
   tftp_state.port = 0;
   ip_addr_set_any(0, &tftp_state.addr);
 
-  if(tftp_state.last_data != NULL) {
+  if (tftp_state.last_data != NULL) {
     pbuf_free(tftp_state.last_data);
     tftp_state.last_data = NULL;
   }
 
   sys_untimeout(tftp_tmr, NULL);
-  
+
   if (tftp_state.handle) {
     tftp_state.ctx->close(tftp_state.handle);
     tftp_state.handle = NULL;
@@ -118,15 +118,15 @@
 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;
-  
+  struct pbuf *p;
+  u16_t *payload;
+
   p = pbuf_alloc(PBUF_TRANSPORT, (u16_t)(TFTP_HEADER_LENGTH + str_length + 1), PBUF_RAM);
-  if(p == NULL) {
+  if (p == NULL) {
     return;
   }
 
-  payload = (u16_t*) p->payload;
+  payload = (u16_t *) p->payload;
   payload[0] = PP_HTONS(TFTP_ERROR);
   payload[1] = lwip_htons(code);
   MEMCPY(&payload[2], str, str_length + 1);
@@ -138,15 +138,15 @@
 static void
 send_ack(u16_t blknum)
 {
-  struct pbuf* p;
-  u16_t* payload;
-  
+  struct pbuf *p;
+  u16_t *payload;
+
   p = pbuf_alloc(PBUF_TRANSPORT, TFTP_HEADER_LENGTH, PBUF_RAM);
-  if(p == NULL) {
+  if (p == NULL) {
     return;
   }
-  payload = (u16_t*) p->payload;
-  
+  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);
@@ -157,15 +157,15 @@
 resend_data(void)
 {
   struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, tftp_state.last_data->len, PBUF_RAM);
-  if(p == NULL) {
+  if (p == NULL) {
     return;
   }
 
-  if(pbuf_copy(p, tftp_state.last_data) != ERR_OK) {
+  if (pbuf_copy(p, tftp_state.last_data) != ERR_OK) {
     pbuf_free(p);
     return;
   }
-    
+
   udp_sendto(tftp_state.upcb, p, &tftp_state.addr, tftp_state.port);
   pbuf_free(p);
 }
@@ -176,12 +176,12 @@
   u16_t *payload;
   int ret;
 
-  if(tftp_state.last_data != NULL) {
+  if (tftp_state.last_data != NULL) {
     pbuf_free(tftp_state.last_data);
   }
-  
+
   tftp_state.last_data = pbuf_alloc(PBUF_TRANSPORT, TFTP_HEADER_LENGTH + TFTP_MAX_PAYLOAD_SIZE, PBUF_RAM);
-  if(tftp_state.last_data == NULL) {
+  if (tftp_state.last_data == NULL) {
     return;
   }
 
@@ -208,7 +208,7 @@
 
   LWIP_UNUSED_ARG(arg);
   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))) {
     send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "Only one connection at a time is supported");
@@ -223,37 +223,36 @@
 
   switch (opcode) {
     case PP_HTONS(TFTP_RRQ): /* fall through */
-    case PP_HTONS(TFTP_WRQ):
-    {
+    case PP_HTONS(TFTP_WRQ): {
       const char tftp_null = 0;
-      char filename[TFTP_MAX_FILENAME_LEN];
-      char mode[TFTP_MAX_MODE_LEN];
+      char filename[TFTP_MAX_FILENAME_LEN + 1];
+      char mode[TFTP_MAX_MODE_LEN + 1];
       u16_t filename_end_offset;
       u16_t mode_end_offset;
 
-      if(tftp_state.handle != NULL) {
+      if (tftp_state.handle != NULL) {
         send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "Only one connection at a time is supported");
         break;
       }
-      
+
       sys_timeout(TFTP_TIMER_MSECS, tftp_tmr, NULL);
 
       /* find \0 in pbuf -> end of filename string */
       filename_end_offset = pbuf_memfind(p, &tftp_null, sizeof(tftp_null), 2);
-      if((u16_t)(filename_end_offset-2) > sizeof(filename)) {
+      if ((u16_t)(filename_end_offset - 1) > sizeof(filename)) {
         send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "Filename too long/not NULL terminated");
         break;
       }
-      pbuf_copy_partial(p, filename, filename_end_offset-2, 2);
+      pbuf_copy_partial(p, filename, filename_end_offset - 1, 2);
 
       /* find \0 in pbuf -> end of mode string */
-      mode_end_offset = pbuf_memfind(p, &tftp_null, sizeof(tftp_null), filename_end_offset+1);
-      if((u16_t)(mode_end_offset-filename_end_offset) > sizeof(mode)) {
+      mode_end_offset = pbuf_memfind(p, &tftp_null, sizeof(tftp_null), filename_end_offset + 1);
+      if ((u16_t)(mode_end_offset - filename_end_offset) > sizeof(mode)) {
         send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "Mode too long/not NULL terminated");
         break;
       }
-      pbuf_copy_partial(p, mode, mode_end_offset-filename_end_offset, filename_end_offset+1);
- 
+      pbuf_copy_partial(p, mode, mode_end_offset - filename_end_offset, filename_end_offset + 1);
+
       tftp_state.handle = tftp_state.ctx->open(filename, mode, opcode == PP_HTONS(TFTP_WRQ));
       tftp_state.blknum = 1;
 
@@ -279,12 +278,11 @@
 
       break;
     }
-    
-    case PP_HTONS(TFTP_DATA):
-    {
+
+    case PP_HTONS(TFTP_DATA): {
       int ret;
       u16_t blknum;
-      
+
       if (tftp_state.handle == NULL) {
         send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "No connection");
         break;
@@ -296,24 +294,32 @@
       }
 
       blknum = lwip_ntohs(sbuf[1]);
-      pbuf_header(p, -TFTP_HEADER_LENGTH);
+      if (blknum == tftp_state.blknum) {
+        pbuf_remove_header(p, TFTP_HEADER_LENGTH);
 
-      ret = tftp_state.ctx->write(tftp_state.handle, p);
-      if (ret < 0) {
-        send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "error writing file");
-        close_handle();
-      } else {
+        ret = tftp_state.ctx->write(tftp_state.handle, p);
+        if (ret < 0) {
+          send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "error writing file");
+          close_handle();
+        } else {
+          send_ack(blknum);
+        }
+
+        if (p->tot_len < TFTP_MAX_PAYLOAD_SIZE) {
+          close_handle();
+        } else {
+          tftp_state.blknum++;
+        }
+      } 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);
-      }
-
-      if (p->tot_len < TFTP_MAX_PAYLOAD_SIZE) {
-        close_handle();
+      } else {
+        send_error(addr, port, TFTP_ERROR_UNKNOWN_TRFR_ID, "Wrong block number");
       }
       break;
     }
 
-    case PP_HTONS(TFTP_ACK):
-    {
+    case PP_HTONS(TFTP_ACK): {
       u16_t blknum;
       int lastpkt;
 
@@ -348,7 +354,7 @@
 
       break;
     }
-    
+
     default:
       send_error(addr, port, TFTP_ERROR_ILLEGAL_OPERATION, "Unknown operation");
       break;
@@ -358,10 +364,10 @@
 }
 
 static void
-tftp_tmr(void* arg)
+tftp_tmr(void *arg)
 {
   LWIP_UNUSED_ARG(arg);
-  
+
   tftp_state.timer++;
 
   if (tftp_state.handle == NULL) {
@@ -386,11 +392,12 @@
  * Initialize TFTP server.
  * @param ctx TFTP callback struct
  */
-err_t 
+err_t
 tftp_init(const struct tftp_context *ctx)
 {
   err_t ret;
 
+  /* LWIP_ASSERT_CORE_LOCKED(); is checked by udp_new() */
   struct udp_pcb *pcb = udp_new_ip_type(IPADDR_TYPE_ANY);
   if (pcb == NULL) {
     return ERR_MEM;
@@ -414,4 +421,15 @@
   return ERR_OK;
 }
 
+/** @ingroup tftp
+ * Deinitialize ("turn off") TFTP server.
+ */
+void tftp_cleanup(void)
+{
+  LWIP_ASSERT("Cleanup called on non-initialized TFTP", tftp_state.upcb != NULL);
+  udp_remove(tftp_state.upcb);
+  close_handle();
+  memset(&tftp_state, 0, sizeof(tftp_state));
+}
+
 #endif /* LWIP_UDP */
diff --git a/src/core/altcp.c b/src/core/altcp.c
new file mode 100644
index 0000000..d46d6cd
--- /dev/null
+++ b/src/core/altcp.c
@@ -0,0 +1,681 @@
+/**
+ * @file
+ * @defgroup altcp Application layered TCP Functions
+ * @ingroup altcp_api
+ *
+ * This file contains the common functions for altcp to work.
+ * For more details see @ref altcp_api.
+ */
+
+/**
+ * @defgroup altcp_api Application layered TCP Introduction
+ * @ingroup callbackstyle_api
+ *
+ * Overview
+ * --------
+ * altcp (application layered TCP connection API; to be used from TCPIP thread)
+ * is an abstraction layer that prevents applications linking hard against the
+ * @ref tcp.h functions while providing the same functionality. It is used to
+ * e.g. add SSL/TLS (see LWIP_ALTCP_TLS) or proxy-connect support to an application
+ * written for the tcp callback API without that application knowing the
+ * protocol details.
+ *
+ * * 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).
+ * * This is achieved by simply including "lwip/altcp.h" instead of "lwip/tcp.h",
+ *   replacing "struct tcp_pcb" with "struct altcp_pcb" and prefixing all functions
+ *   with "altcp_" instead of "tcp_".
+ *
+ * With altcp support disabled (LWIP_ALTCP==0), applications written against the
+ * altcp API can still be compiled but are directly linked against the tcp.h
+ * callback API and then cannot use layered protocols. To minimize code changes
+ * in this case, the use of altcp_allocators is strongly suggested.
+ *
+ * Usage
+ * -----
+ * To make use of this API from an existing tcp raw API application:
+ * * Include "lwip/altcp.h" instead of "lwip/tcp.h"
+ * * 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
+ *   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
+ *   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.
+ * * An application can alternatively bind hard to the altcp_tls API by calling
+ *   @ref altcp_tls_new or @ref altcp_tls_wrap.
+ * * The TLS layer is not directly implemented by lwIP, but a port to mbedTLS is
+ *   provided.
+ * * Another altcp layer is proxy-connect to use TLS behind a HTTP proxy (see
+ *   @ref altcp_proxyconnect.h)
+ *
+ * altcp_allocator_t
+ * -----------------
+ * An altcp allocator is created by the application by combining an allocator
+ * callback function and a corresponding state, e.g.:\code{.c}
+ * static const unsigned char cert[] = {0x2D, ... (see mbedTLS doc for how to create this)};
+ * struct altcp_tls_config * conf = altcp_tls_create_config_client(cert, sizeof(cert));
+ * altcp_allocator_t tls_allocator = {
+ *   altcp_tls_alloc, conf
+ * };
+ * \endcode
+ *
+ *
+ * struct altcp_tls_config
+ * -----------------------
+ * The struct altcp_tls_config holds state that is needed to create new TLS client
+ * or server connections (e.g. certificates and private keys).
+ *
+ * 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
+ * for clients).
+ *
+ * For mbedTLS, ensure that certificates can be parsed by 'mbedtls_x509_crt_parse()' and
+ * private keys can be parsed by 'mbedtls_pk_parse_key()'.
+ */
+
+/*
+ * 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"
+
+#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/altcp.h"
+#include "lwip/priv/altcp_priv.h"
+#include "lwip/altcp_tcp.h"
+#include "lwip/tcp.h"
+#include "lwip/mem.h"
+
+#include <string.h>
+
+extern const struct altcp_functions altcp_tcp_functions;
+
+/**
+ * For altcp layer implementations only: allocate a new struct altcp_pcb from the pool
+ * and zero the memory
+ */
+struct altcp_pcb *
+altcp_alloc(void)
+{
+  struct altcp_pcb *ret = (struct altcp_pcb *)memp_malloc(MEMP_ALTCP_PCB);
+  if (ret != NULL) {
+    memset(ret, 0, sizeof(struct altcp_pcb));
+  }
+  return ret;
+}
+
+/**
+ * For altcp layer implementations only: return a struct altcp_pcb to the pool
+ */
+void
+altcp_free(struct altcp_pcb *conn)
+{
+  if (conn) {
+    if (conn->fns && conn->fns->dealloc) {
+      conn->fns->dealloc(conn);
+    }
+    memp_free(MEMP_ALTCP_PCB, conn);
+  }
+}
+
+/**
+ * @ingroup altcp
+ * altcp_new_ip6: @ref altcp_new for IPv6 
+ */
+struct altcp_pcb *
+altcp_new_ip6(altcp_allocator_t *allocator)
+{
+  return altcp_new_ip_type(allocator, IPADDR_TYPE_V6);
+}
+
+/** 
+ * @ingroup altcp
+ * altcp_new: @ref altcp_new for IPv4 
+ */
+struct altcp_pcb *
+altcp_new(altcp_allocator_t *allocator)
+{
+  return altcp_new_ip_type(allocator, IPADDR_TYPE_V4);
+}
+
+/**
+ * @ingroup altcp
+ * altcp_new_ip_type: called by applications to allocate a new pcb with the help of an
+ * allocator function.
+ *
+ * @param allocator allocator function and argument
+ * @param ip_type IP version of the pcb (@ref lwip_ip_addr_type)
+ * @return a new altcp_pcb or NULL on error
+ */
+struct altcp_pcb *
+altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type)
+{
+  struct altcp_pcb *conn;
+  if (allocator == NULL) {
+    /* no allocator given, create a simple TCP connection */
+    return altcp_tcp_new_ip_type(ip_type);
+  }
+  if (allocator->alloc == NULL) {
+    /* illegal allocator */
+    return NULL;
+  }
+  conn = allocator->alloc(allocator->arg, ip_type);
+  if (conn == NULL) {
+    /* allocation failed */
+    return NULL;
+  }
+  return conn;
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_arg()
+ */
+void
+altcp_arg(struct altcp_pcb *conn, void *arg)
+{
+  if (conn) {
+    conn->arg = arg;
+  }
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_accept()
+ */
+void
+altcp_accept(struct altcp_pcb *conn, altcp_accept_fn accept)
+{
+  if (conn != NULL) {
+    conn->accept = accept;
+  }
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_recv()
+ */
+void
+altcp_recv(struct altcp_pcb *conn, altcp_recv_fn recv)
+{
+  if (conn) {
+    conn->recv = recv;
+  }
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_sent()
+ */
+void
+altcp_sent(struct altcp_pcb *conn, altcp_sent_fn sent)
+{
+  if (conn) {
+    conn->sent = sent;
+  }
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_poll()
+ */
+void
+altcp_poll(struct altcp_pcb *conn, altcp_poll_fn poll, u8_t interval)
+{
+  if (conn) {
+    conn->poll = poll;
+    conn->pollinterval = interval;
+    if (conn->fns && conn->fns->set_poll) {
+      conn->fns->set_poll(conn, interval);
+    }
+  }
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_err()
+ */
+void
+altcp_err(struct altcp_pcb *conn, altcp_err_fn err)
+{
+  if (conn) {
+    conn->err = err;
+  }
+}
+
+/* Generic functions calling the "virtual" ones */
+
+/**
+ * @ingroup altcp
+ * @see tcp_recved()
+ */
+void
+altcp_recved(struct altcp_pcb *conn, u16_t len)
+{
+  if (conn && conn->fns && conn->fns->recved) {
+    conn->fns->recved(conn, len);
+  }
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_bind()
+ */
+err_t
+altcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port)
+{
+  if (conn && conn->fns && conn->fns->bind) {
+    return conn->fns->bind(conn, ipaddr, port);
+  }
+  return ERR_VAL;
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_connect()
+ */
+err_t
+altcp_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected)
+{
+  if (conn && conn->fns && conn->fns->connect) {
+    return conn->fns->connect(conn, ipaddr, port, connected);
+  }
+  return ERR_VAL;
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_listen_with_backlog_and_err()
+ */
+struct altcp_pcb *
+altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err)
+{
+  if (conn && conn->fns && conn->fns->listen) {
+    return conn->fns->listen(conn, backlog, err);
+  }
+  return NULL;
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_abort()
+ */
+void
+altcp_abort(struct altcp_pcb *conn)
+{
+  if (conn && conn->fns && conn->fns->abort) {
+    conn->fns->abort(conn);
+  }
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_close()
+ */
+err_t
+altcp_close(struct altcp_pcb *conn)
+{
+  if (conn && conn->fns && conn->fns->close) {
+    return conn->fns->close(conn);
+  }
+  return ERR_VAL;
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_shutdown()
+ */
+err_t
+altcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx)
+{
+  if (conn && conn->fns && conn->fns->shutdown) {
+    return conn->fns->shutdown(conn, shut_rx, shut_tx);
+  }
+  return ERR_VAL;
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_write()
+ */
+err_t
+altcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags)
+{
+  if (conn && conn->fns && conn->fns->write) {
+    return conn->fns->write(conn, dataptr, len, apiflags);
+  }
+  return ERR_VAL;
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_output()
+ */
+err_t
+altcp_output(struct altcp_pcb *conn)
+{
+  if (conn && conn->fns && conn->fns->output) {
+    return conn->fns->output(conn);
+  }
+  return ERR_VAL;
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_mss()
+ */
+u16_t
+altcp_mss(struct altcp_pcb *conn)
+{
+  if (conn && conn->fns && conn->fns->mss) {
+    return conn->fns->mss(conn);
+  }
+  return 0;
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_sndbuf()
+ */
+u16_t
+altcp_sndbuf(struct altcp_pcb *conn)
+{
+  if (conn && conn->fns && conn->fns->sndbuf) {
+    return conn->fns->sndbuf(conn);
+  }
+  return 0;
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_sndqueuelen()
+ */
+u16_t
+altcp_sndqueuelen(struct altcp_pcb *conn)
+{
+  if (conn && conn->fns && conn->fns->sndqueuelen) {
+    return conn->fns->sndqueuelen(conn);
+  }
+  return 0;
+}
+
+void
+altcp_nagle_disable(struct altcp_pcb *conn)
+{
+  if (conn && conn->fns && conn->fns->nagle_disable) {
+    conn->fns->nagle_disable(conn);
+  }
+}
+
+void
+altcp_nagle_enable(struct altcp_pcb *conn)
+{
+  if (conn && conn->fns && conn->fns->nagle_enable) {
+    conn->fns->nagle_enable(conn);
+  }
+}
+
+int
+altcp_nagle_disabled(struct altcp_pcb *conn)
+{
+  if (conn && conn->fns && conn->fns->nagle_disabled) {
+    return conn->fns->nagle_disabled(conn);
+  }
+  return 0;
+}
+
+/**
+ * @ingroup altcp
+ * @see tcp_setprio()
+ */
+void
+altcp_setprio(struct altcp_pcb *conn, u8_t prio)
+{
+  if (conn && conn->fns && conn->fns->setprio) {
+    conn->fns->setprio(conn, prio);
+  }
+}
+
+err_t
+altcp_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port)
+{
+  if (conn && conn->fns && conn->fns->addrinfo) {
+    return conn->fns->addrinfo(conn, local, addr, port);
+  }
+  return ERR_VAL;
+}
+
+ip_addr_t *
+altcp_get_ip(struct altcp_pcb *conn, int local)
+{
+  if (conn && conn->fns && conn->fns->getip) {
+    return conn->fns->getip(conn, local);
+  }
+  return NULL;
+}
+
+u16_t
+altcp_get_port(struct altcp_pcb *conn, int local)
+{
+  if (conn && conn->fns && conn->fns->getport) {
+    return conn->fns->getport(conn, local);
+  }
+  return 0;
+}
+
+#ifdef LWIP_DEBUG
+enum tcp_state
+altcp_dbg_get_tcp_state(struct altcp_pcb *conn)
+{
+  if (conn && conn->fns && conn->fns->dbg_get_tcp_state) {
+    return conn->fns->dbg_get_tcp_state(conn);
+  }
+  return CLOSED;
+}
+#endif
+
+/* Default implementations for the "virtual" functions */
+
+void
+altcp_default_set_poll(struct altcp_pcb *conn, u8_t interval)
+{
+  if (conn && conn->inner_conn) {
+    altcp_poll(conn->inner_conn, conn->poll, interval);
+  }
+}
+
+void
+altcp_default_recved(struct altcp_pcb *conn, u16_t len)
+{
+  if (conn && conn->inner_conn) {
+    altcp_recved(conn->inner_conn, len);
+  }
+}
+
+err_t
+altcp_default_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port)
+{
+  if (conn && conn->inner_conn) {
+    return altcp_bind(conn->inner_conn, ipaddr, port);
+  }
+  return ERR_VAL;
+}
+
+err_t
+altcp_default_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx)
+{
+  if (conn) {
+    if (shut_rx && shut_tx && conn->fns && conn->fns->close) {
+      /* default shutdown for both sides is close */
+      return conn->fns->close(conn);
+    }
+    if (conn->inner_conn) {
+      return altcp_shutdown(conn->inner_conn, shut_rx, shut_tx);
+    }
+  }
+  return ERR_VAL;
+}
+
+err_t
+altcp_default_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags)
+{
+  if (conn && conn->inner_conn) {
+    return altcp_write(conn->inner_conn, dataptr, len, apiflags);
+  }
+  return ERR_VAL;
+}
+
+err_t
+altcp_default_output(struct altcp_pcb *conn)
+{
+  if (conn && conn->inner_conn) {
+    return altcp_output(conn->inner_conn);
+  }
+  return ERR_VAL;
+}
+
+u16_t
+altcp_default_mss(struct altcp_pcb *conn)
+{
+  if (conn && conn->inner_conn) {
+    return altcp_mss(conn->inner_conn);
+  }
+  return 0;
+}
+
+u16_t
+altcp_default_sndbuf(struct altcp_pcb *conn)
+{
+  if (conn && conn->inner_conn) {
+    return altcp_sndbuf(conn->inner_conn);
+  }
+  return 0;
+}
+
+u16_t
+altcp_default_sndqueuelen(struct altcp_pcb *conn)
+{
+  if (conn && conn->inner_conn) {
+    return altcp_sndqueuelen(conn->inner_conn);
+  }
+  return 0;
+}
+
+void
+altcp_default_nagle_disable(struct altcp_pcb *conn)
+{
+  if (conn && conn->inner_conn) {
+    altcp_nagle_disable(conn->inner_conn);
+  }
+}
+
+void
+altcp_default_nagle_enable(struct altcp_pcb *conn)
+{
+  if (conn && conn->inner_conn) {
+    altcp_nagle_enable(conn->inner_conn);
+  }
+}
+
+int
+altcp_default_nagle_disabled(struct altcp_pcb *conn)
+{
+  if (conn && conn->inner_conn) {
+    return altcp_nagle_disabled(conn->inner_conn);
+  }
+  return 0;
+}
+
+void
+altcp_default_setprio(struct altcp_pcb *conn, u8_t prio)
+{
+  if (conn && conn->inner_conn) {
+    altcp_setprio(conn->inner_conn, prio);
+  }
+}
+
+void
+altcp_default_dealloc(struct altcp_pcb *conn)
+{
+  LWIP_UNUSED_ARG(conn);
+  /* nothing to do */
+}
+
+err_t
+altcp_default_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port)
+{
+  if (conn && conn->inner_conn) {
+    return altcp_get_tcp_addrinfo(conn->inner_conn, local, addr, port);
+  }
+  return ERR_VAL;
+}
+
+ip_addr_t *
+altcp_default_get_ip(struct altcp_pcb *conn, int local)
+{
+  if (conn && conn->inner_conn) {
+    return altcp_get_ip(conn->inner_conn, local);
+  }
+  return NULL;
+}
+
+u16_t
+altcp_default_get_port(struct altcp_pcb *conn, int local)
+{
+  if (conn && conn->inner_conn) {
+    return altcp_get_port(conn->inner_conn, local);
+  }
+  return 0;
+}
+
+#ifdef LWIP_DEBUG
+enum tcp_state
+altcp_default_dbg_get_tcp_state(struct altcp_pcb *conn)
+{
+  if (conn && conn->inner_conn) {
+    return altcp_dbg_get_tcp_state(conn->inner_conn);
+  }
+  return CLOSED;
+}
+#endif
+
+
+#endif /* LWIP_ALTCP */
diff --git a/src/core/altcp_alloc.c b/src/core/altcp_alloc.c
new file mode 100644
index 0000000..cd619bc
--- /dev/null
+++ b/src/core/altcp_alloc.c
@@ -0,0 +1,87 @@
+/**
+ * @file
+ * Application layered TCP connection API (to be used from TCPIP thread)\n
+ * 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).
+ *
+ * This file contains allocation implementation that combine several layers.
+ */
+
+/*
+ * 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"
+
+#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/altcp.h"
+#include "lwip/altcp_tcp.h"
+#include "lwip/altcp_tls.h"
+#include "lwip/priv/altcp_priv.h"
+#include "lwip/mem.h"
+
+#include <string.h>
+
+#if LWIP_ALTCP_TLS
+
+/** This standard allocator function creates an altcp pcb for
+ * TLS over TCP */
+struct altcp_pcb *
+altcp_tls_new(struct altcp_tls_config *config, u8_t ip_type)
+{
+  struct altcp_pcb *inner_conn, *ret;
+  LWIP_UNUSED_ARG(ip_type);
+
+  inner_conn = altcp_tcp_new_ip_type(ip_type);
+  if (inner_conn == NULL) {
+    return NULL;
+  }
+  ret = altcp_tls_wrap(config, inner_conn);
+  if (ret == NULL) {
+    altcp_close(inner_conn);
+  }
+  return ret;
+}
+
+/** This standard allocator function creates an altcp pcb for
+ * TLS over TCP */
+struct altcp_pcb *
+altcp_tls_alloc(void *arg, u8_t ip_type)
+{
+  return altcp_tls_new((struct altcp_tls_config *)arg, ip_type);
+}
+
+#endif /* LWIP_ALTCP_TLS */
+
+#endif /* LWIP_ALTCP */
diff --git a/src/core/altcp_tcp.c b/src/core/altcp_tcp.c
new file mode 100644
index 0000000..b715f04
--- /dev/null
+++ b/src/core/altcp_tcp.c
@@ -0,0 +1,543 @@
+/**
+ * @file
+ * Application layered TCP connection API (to be used from TCPIP thread)\n
+ * 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).
+ *
+ * This file contains the base implementation calling into tcp.
+ */
+
+/*
+ * 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"
+
+#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/altcp.h"
+#include "lwip/altcp_tcp.h"
+#include "lwip/priv/altcp_priv.h"
+#include "lwip/tcp.h"
+#include "lwip/mem.h"
+
+#include <string.h>
+
+#define ALTCP_TCP_ASSERT_CONN(conn) do { \
+  LWIP_ASSERT("conn->inner_conn == NULL", (conn)->inner_conn == NULL); \
+  LWIP_UNUSED_ARG(conn); /* for LWIP_NOASSERT */ } while(0)
+#define ALTCP_TCP_ASSERT_CONN_PCB(conn, tpcb) do { \
+  LWIP_ASSERT("pcb mismatch", (conn)->state == tpcb); \
+  LWIP_UNUSED_ARG(tpcb); /* for LWIP_NOASSERT */ \
+  ALTCP_TCP_ASSERT_CONN(conn); } while(0)
+
+
+/* Variable prototype, the actual declaration is at the end of this file
+   since it contains pointers to static functions declared here */
+extern const struct altcp_functions altcp_tcp_functions;
+
+static void altcp_tcp_setup(struct altcp_pcb *conn, struct tcp_pcb *tpcb);
+
+/* callback functions for TCP */
+static err_t
+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) {
+    /* create a new altcp_conn to pass to the next 'accept' callback */
+    struct altcp_pcb *new_conn = altcp_alloc();
+    if (new_conn == NULL) {
+      return ERR_MEM;
+    }
+    altcp_tcp_setup(new_conn, new_tpcb);
+    return listen_conn->accept(listen_conn->arg, new_conn, err);
+  }
+  return ERR_ARG;
+}
+
+static err_t
+altcp_tcp_connected(void *arg, struct tcp_pcb *tpcb, err_t err)
+{
+  struct altcp_pcb *conn = (struct altcp_pcb *)arg;
+  if (conn) {
+    ALTCP_TCP_ASSERT_CONN_PCB(conn, tpcb);
+    if (conn->connected) {
+      return conn->connected(conn->arg, conn, err);
+    }
+  }
+  return ERR_OK;
+}
+
+static err_t
+altcp_tcp_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
+{
+  struct altcp_pcb *conn = (struct altcp_pcb *)arg;
+  if (conn) {
+    ALTCP_TCP_ASSERT_CONN_PCB(conn, tpcb);
+    if (conn->recv) {
+      return conn->recv(conn->arg, conn, p, err);
+    }
+  }
+  if (p != NULL) {
+    /* prevent memory leaks */
+    pbuf_free(p);
+  }
+  return ERR_OK;
+}
+
+static err_t
+altcp_tcp_sent(void *arg, struct tcp_pcb *tpcb, u16_t len)
+{
+  struct altcp_pcb *conn = (struct altcp_pcb *)arg;
+  if (conn) {
+    ALTCP_TCP_ASSERT_CONN_PCB(conn, tpcb);
+    if (conn->sent) {
+      return conn->sent(conn->arg, conn, len);
+    }
+  }
+  return ERR_OK;
+}
+
+static err_t
+altcp_tcp_poll(void *arg, struct tcp_pcb *tpcb)
+{
+  struct altcp_pcb *conn = (struct altcp_pcb *)arg;
+  if (conn) {
+    ALTCP_TCP_ASSERT_CONN_PCB(conn, tpcb);
+    if (conn->poll) {
+      return conn->poll(conn->arg, conn);
+    }
+  }
+  return ERR_OK;
+}
+
+static void
+altcp_tcp_err(void *arg, err_t err)
+{
+  struct altcp_pcb *conn = (struct altcp_pcb *)arg;
+  if (conn) {
+    conn->state = NULL; /* already freed */
+    if (conn->err) {
+      conn->err(conn->arg, err);
+    }
+    altcp_free(conn);
+  }
+}
+
+/* setup functions */
+
+static void
+altcp_tcp_remove_callbacks(struct tcp_pcb *tpcb)
+{
+  tcp_arg(tpcb, NULL);
+  tcp_recv(tpcb, NULL);
+  tcp_sent(tpcb, NULL);
+  tcp_err(tpcb, NULL);
+  tcp_poll(tpcb, NULL, tpcb->pollinterval);
+}
+
+static void
+altcp_tcp_setup_callbacks(struct altcp_pcb *conn, struct tcp_pcb *tpcb)
+{
+  tcp_arg(tpcb, conn);
+  tcp_recv(tpcb, altcp_tcp_recv);
+  tcp_sent(tpcb, altcp_tcp_sent);
+  tcp_err(tpcb, altcp_tcp_err);
+  /* tcp_poll is set when interval is set by application */
+  /* listen is set totally different :-) */
+}
+
+static void
+altcp_tcp_setup(struct altcp_pcb *conn, struct tcp_pcb *tpcb)
+{
+  altcp_tcp_setup_callbacks(conn, tpcb);
+  conn->state = tpcb;
+  conn->fns = &altcp_tcp_functions;
+}
+
+struct altcp_pcb *
+altcp_tcp_new_ip_type(u8_t ip_type)
+{
+  /* Allocate the tcp pcb first to invoke the priority handling code
+     if we're out of pcbs */
+  struct tcp_pcb *tpcb = tcp_new_ip_type(ip_type);
+  if (tpcb != NULL) {
+    struct altcp_pcb *ret = altcp_alloc();
+    if (ret != NULL) {
+      altcp_tcp_setup(ret, tpcb);
+      return ret;
+    } else {
+      /* altcp_pcb allocation failed -> free the tcp_pcb too */
+      tcp_close(tpcb);
+    }
+  }
+  return NULL;
+}
+
+/** altcp_tcp allocator function fitting to @ref altcp_allocator_t / @ref altcp_new.
+*
+* arg pointer is not used for TCP.
+*/
+struct altcp_pcb *
+altcp_tcp_alloc(void *arg, u8_t ip_type)
+{
+  LWIP_UNUSED_ARG(arg);
+  return altcp_tcp_new_ip_type(ip_type);
+}
+
+struct altcp_pcb *
+altcp_tcp_wrap(struct tcp_pcb *tpcb)
+{
+  if (tpcb != NULL) {
+    struct altcp_pcb *ret = altcp_alloc();
+    if (ret != NULL) {
+      altcp_tcp_setup(ret, tpcb);
+      return ret;
+    }
+  }
+  return NULL;
+}
+
+
+/* "virtual" functions calling into tcp */
+static void
+altcp_tcp_set_poll(struct altcp_pcb *conn, u8_t interval)
+{
+  if (conn != NULL) {
+    struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state;
+    ALTCP_TCP_ASSERT_CONN(conn);
+    tcp_poll(pcb, altcp_tcp_poll, interval);
+  }
+}
+
+static void
+altcp_tcp_recved(struct altcp_pcb *conn, u16_t len)
+{
+  if (conn != NULL) {
+    struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state;
+    ALTCP_TCP_ASSERT_CONN(conn);
+    tcp_recved(pcb, len);
+  }
+}
+
+static err_t
+altcp_tcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port)
+{
+  struct tcp_pcb *pcb;
+  if (conn == NULL) {
+    return ERR_VAL;
+  }
+  ALTCP_TCP_ASSERT_CONN(conn);
+  pcb = (struct tcp_pcb *)conn->state;
+  return tcp_bind(pcb, ipaddr, port);
+}
+
+static err_t
+altcp_tcp_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected)
+{
+  struct tcp_pcb *pcb;
+  if (conn == NULL) {
+    return ERR_VAL;
+  }
+  ALTCP_TCP_ASSERT_CONN(conn);
+  conn->connected = connected;
+  pcb = (struct tcp_pcb *)conn->state;
+  return tcp_connect(pcb, ipaddr, port, altcp_tcp_connected);
+}
+
+static struct altcp_pcb *
+altcp_tcp_listen(struct altcp_pcb *conn, u8_t backlog, err_t *err)
+{
+  struct tcp_pcb *pcb;
+  struct tcp_pcb *lpcb;
+  if (conn == NULL) {
+    return NULL;
+  }
+  ALTCP_TCP_ASSERT_CONN(conn);
+  pcb = (struct tcp_pcb *)conn->state;
+  lpcb = tcp_listen_with_backlog_and_err(pcb, backlog, err);
+  if (lpcb != NULL) {
+    conn->state = lpcb;
+    tcp_accept(lpcb, altcp_tcp_accept);
+    return conn;
+  }
+  return NULL;
+}
+
+static void
+altcp_tcp_abort(struct altcp_pcb *conn)
+{
+  if (conn != NULL) {
+    struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state;
+    ALTCP_TCP_ASSERT_CONN(conn);
+    if (pcb) {
+      tcp_abort(pcb);
+    }
+  }
+}
+
+static err_t
+altcp_tcp_close(struct altcp_pcb *conn)
+{
+  struct tcp_pcb *pcb;
+  if (conn == NULL) {
+    return ERR_VAL;
+  }
+  ALTCP_TCP_ASSERT_CONN(conn);
+  pcb = (struct tcp_pcb *)conn->state;
+  if (pcb) {
+    err_t err;
+    tcp_poll_fn oldpoll = pcb->poll;
+    altcp_tcp_remove_callbacks(pcb);
+    err = tcp_close(pcb);
+    if (err != ERR_OK) {
+      /* not closed, set up all callbacks again */
+      altcp_tcp_setup_callbacks(conn, pcb);
+      /* poll callback is not included in the above */
+      tcp_poll(pcb, oldpoll, pcb->pollinterval);
+      return err;
+    }
+    conn->state = NULL; /* unsafe to reference pcb after tcp_close(). */
+  }
+  altcp_free(conn);
+  return ERR_OK;
+}
+
+static err_t
+altcp_tcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx)
+{
+  struct tcp_pcb *pcb;
+  if (conn == NULL) {
+    return ERR_VAL;
+  }
+  ALTCP_TCP_ASSERT_CONN(conn);
+  pcb = (struct tcp_pcb *)conn->state;
+  return tcp_shutdown(pcb, shut_rx, shut_tx);
+}
+
+static err_t
+altcp_tcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags)
+{
+  struct tcp_pcb *pcb;
+  if (conn == NULL) {
+    return ERR_VAL;
+  }
+  ALTCP_TCP_ASSERT_CONN(conn);
+  pcb = (struct tcp_pcb *)conn->state;
+  return tcp_write(pcb, dataptr, len, apiflags);
+}
+
+static err_t
+altcp_tcp_output(struct altcp_pcb *conn)
+{
+  struct tcp_pcb *pcb;
+  if (conn == NULL) {
+    return ERR_VAL;
+  }
+  ALTCP_TCP_ASSERT_CONN(conn);
+  pcb = (struct tcp_pcb *)conn->state;
+  return tcp_output(pcb);
+}
+
+static u16_t
+altcp_tcp_mss(struct altcp_pcb *conn)
+{
+  struct tcp_pcb *pcb;
+  if (conn == NULL) {
+    return 0;
+  }
+  ALTCP_TCP_ASSERT_CONN(conn);
+  pcb = (struct tcp_pcb *)conn->state;
+  return tcp_mss(pcb);
+}
+
+static u16_t
+altcp_tcp_sndbuf(struct altcp_pcb *conn)
+{
+  struct tcp_pcb *pcb;
+  if (conn == NULL) {
+    return 0;
+  }
+  ALTCP_TCP_ASSERT_CONN(conn);
+  pcb = (struct tcp_pcb *)conn->state;
+  return tcp_sndbuf(pcb);
+}
+
+static u16_t
+altcp_tcp_sndqueuelen(struct altcp_pcb *conn)
+{
+  struct tcp_pcb *pcb;
+  if (conn == NULL) {
+    return 0;
+  }
+  ALTCP_TCP_ASSERT_CONN(conn);
+  pcb = (struct tcp_pcb *)conn->state;
+  return tcp_sndqueuelen(pcb);
+}
+
+static void
+altcp_tcp_nagle_disable(struct altcp_pcb *conn)
+{
+  if (conn && conn->state) {
+    struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state;
+    ALTCP_TCP_ASSERT_CONN(conn);
+    tcp_nagle_disable(pcb);
+  }
+}
+
+static void
+altcp_tcp_nagle_enable(struct altcp_pcb *conn)
+{
+  if (conn && conn->state) {
+    struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state;
+    ALTCP_TCP_ASSERT_CONN(conn);
+    tcp_nagle_enable(pcb);
+  }
+}
+
+static int
+altcp_tcp_nagle_disabled(struct altcp_pcb *conn)
+{
+  if (conn && conn->state) {
+    struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state;
+    ALTCP_TCP_ASSERT_CONN(conn);
+    return tcp_nagle_disabled(pcb);
+  }
+  return 0;
+}
+
+static void
+altcp_tcp_setprio(struct altcp_pcb *conn, u8_t prio)
+{
+  if (conn != NULL) {
+    struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state;
+    ALTCP_TCP_ASSERT_CONN(conn);
+    tcp_setprio(pcb, prio);
+  }
+}
+
+static void
+altcp_tcp_dealloc(struct altcp_pcb *conn)
+{
+  LWIP_UNUSED_ARG(conn);
+  ALTCP_TCP_ASSERT_CONN(conn);
+  /* no private state to clean up */
+}
+
+static err_t
+altcp_tcp_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port)
+{
+  if (conn) {
+    struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state;
+    ALTCP_TCP_ASSERT_CONN(conn);
+    return tcp_tcp_get_tcp_addrinfo(pcb, local, addr, port);
+  }
+  return ERR_VAL;
+}
+
+static ip_addr_t *
+altcp_tcp_get_ip(struct altcp_pcb *conn, int local)
+{
+  if (conn) {
+    struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state;
+    ALTCP_TCP_ASSERT_CONN(conn);
+    if (pcb) {
+      if (local) {
+        return &pcb->local_ip;
+      } else {
+        return &pcb->remote_ip;
+      }
+    }
+  }
+  return NULL;
+}
+
+static u16_t
+altcp_tcp_get_port(struct altcp_pcb *conn, int local)
+{
+  if (conn) {
+    struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state;
+    ALTCP_TCP_ASSERT_CONN(conn);
+    if (pcb) {
+      if (local) {
+        return pcb->local_port;
+      } else {
+        return pcb->remote_port;
+      }
+    }
+  }
+  return 0;
+}
+
+#ifdef LWIP_DEBUG
+static enum tcp_state
+altcp_tcp_dbg_get_tcp_state(struct altcp_pcb *conn)
+{
+  if (conn) {
+    struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state;
+    ALTCP_TCP_ASSERT_CONN(conn);
+    if (pcb) {
+      return pcb->state;
+    }
+  }
+  return CLOSED;
+}
+#endif
+const struct altcp_functions altcp_tcp_functions = {
+  altcp_tcp_set_poll,
+  altcp_tcp_recved,
+  altcp_tcp_bind,
+  altcp_tcp_connect,
+  altcp_tcp_listen,
+  altcp_tcp_abort,
+  altcp_tcp_close,
+  altcp_tcp_shutdown,
+  altcp_tcp_write,
+  altcp_tcp_output,
+  altcp_tcp_mss,
+  altcp_tcp_sndbuf,
+  altcp_tcp_sndqueuelen,
+  altcp_tcp_nagle_disable,
+  altcp_tcp_nagle_enable,
+  altcp_tcp_nagle_disabled,
+  altcp_tcp_setprio,
+  altcp_tcp_dealloc,
+  altcp_tcp_get_tcp_addrinfo,
+  altcp_tcp_get_ip,
+  altcp_tcp_get_port
+#ifdef LWIP_DEBUG
+  , altcp_tcp_dbg_get_tcp_state
+#endif
+};
+
+#endif /* LWIP_ALTCP */
diff --git a/src/core/def.c b/src/core/def.c
index 8125313..9da36fe 100644
--- a/src/core/def.c
+++ b/src/core/def.c
@@ -11,7 +11,7 @@
  * \#define lwip_htonl(x) your_htonl
  *
  * Note lwip_ntohs() and lwip_ntohl() are merely references to the htonx counterparts.
- * 
+ *
  * If you \#define them to htons() and htonl(), you should
  * \#define LWIP_DONT_PROVIDE_BYTEORDER_FUNCTIONS to prevent lwIP from
  * defining htonx/ntohx compatibility macros.
@@ -75,7 +75,7 @@
 u16_t
 lwip_htons(u16_t n)
 {
-  return (u16_t)PP_HTONS(n);
+  return PP_HTONS(n);
 }
 #endif /* lwip_htons */
 
@@ -89,7 +89,7 @@
 u32_t
 lwip_htonl(u32_t n)
 {
-  return (u32_t)PP_HTONL(n);
+  return PP_HTONL(n);
 }
 #endif /* lwip_htonl */
 
@@ -101,10 +101,10 @@
  * lwIP default implementation for strnstr() non-standard function.
  * This can be \#defined to strnstr() depending on your platform port.
  */
-char*
-lwip_strnstr(const char* buffer, const char* token, size_t n)
+char *
+lwip_strnstr(const char *buffer, const char *token, size_t n)
 {
-  const char* p;
+  const char *p;
   size_t tokenlen = strlen(token);
   if (tokenlen == 0) {
     return LWIP_CONST_CAST(char *, buffer);
@@ -125,7 +125,7 @@
  * This can be \#defined to stricmp() depending on your platform port.
  */
 int
-lwip_stricmp(const char* str1, const char* str2)
+lwip_stricmp(const char *str1, const char *str2)
 {
   char c1, c2;
 
@@ -160,7 +160,7 @@
  * This can be \#defined to strnicmp() depending on your platform port.
  */
 int
-lwip_strnicmp(const char* str1, const char* str2, size_t len)
+lwip_strnicmp(const char *str1, const char *str2, size_t len)
 {
   char c1, c2;
 
@@ -183,7 +183,8 @@
         return 1;
       }
     }
-  } while (len-- && c1 != 0);
+    len--;
+  } while ((len != 0) && (c1 != 0));
   return 0;
 }
 #endif
@@ -195,28 +196,45 @@
  * This can be \#defined to itoa() or snprintf(result, bufsize, "%d", number) depending on your platform port.
  */
 void
-lwip_itoa(char* result, size_t bufsize, int number)
+lwip_itoa(char *result, size_t bufsize, int number)
 {
-  const int base = 10;
-  char* ptr = result, *ptr1 = result, tmp_char;
-  int tmp_value;
-  LWIP_UNUSED_ARG(bufsize);
+  char *res = result;
+  char *tmp = result + bufsize - 1;
+  int n = (number >= 0) ? number : -number;
 
-  do {
-    tmp_value = number;
-    number /= base;
-    *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - number * base)];
-  } while(number);
+  /* handle invalid bufsize */
+  if (bufsize < 2) {
+    if (bufsize == 1) {
+      *result = 0;
+    }
+    return;
+  }
 
-   /* Apply negative sign */
-  if (tmp_value < 0) {
-     *ptr++ = '-';
+  /* First, add sign */
+  if (number < 0) {
+    *res++ = '-';
   }
-  *ptr-- = '\0';
-  while(ptr1 < ptr) {
-    tmp_char = *ptr;
-    *ptr--= *ptr1;
-    *ptr1++ = tmp_char;
+  /* Then create the string from the end and stop if buffer full,
+     and ensure output string is zero terminated */
+  *tmp = 0;
+  while ((n != 0) && (tmp > res)) {
+    char val = (char)('0' + (n % 10));
+    tmp--;
+    *tmp = val;
+    n = n / 10;
   }
+  if (n) {
+    /* buffer is too small */
+    *result = 0;
+    return;
+  }
+  if (*tmp == 0) {
+    /* Nothing added? */
+    *res++ = '0';
+    *res++ = 0;
+    return;
+  }
+  /* move from temporary buffer to output buffer (sign is not moved) */
+  memmove(res, tmp, (size_t)((result + bufsize) - tmp));
 }
 #endif
diff --git a/src/core/dns.c b/src/core/dns.c
index 12c6f16..9d2f61e 100644
--- a/src/core/dns.c
+++ b/src/core/dns.c
@@ -23,14 +23,16 @@
  * Once a hostname has been resolved (or found to be non-existent),
  * the resolver code calls a specified callback function (which
  * must be implemented by the module that uses the resolver).
- * 
+ *
  * Multicast DNS queries are supported for names ending on ".local".
  * However, only "One-Shot Multicast DNS Queries" are supported (RFC 6762
  * chapter 5.1), this is not a fully compliant implementation of continuous
  * mDNS querying!
  *
  * All functions must be called from TCPIP thread.
- * 
+ *
+ * @see DNS_MAX_SERVERS
+ * @see LWIP_DHCP_MAX_DNS_SERVERS
  * @see @ref netconn_common for thread-safe access.
  */
 
@@ -110,11 +112,6 @@
 #define DNS_PORT_ALLOWED(port) ((port) >= 1024)
 #endif
 
-/** DNS maximum number of retries when asking for a name, before "timeout". */
-#ifndef DNS_MAX_RETRIES
-#define DNS_MAX_RETRIES           4
-#endif
-
 /** DNS resource record max. TTL (one week as default) */
 #ifndef DNS_MAX_TTL
 #define DNS_MAX_TTL               604800
@@ -287,7 +284,7 @@
 /* forward declarations */
 static void dns_recv(void *s, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port);
 static void dns_check_entries(void);
-static void dns_call_found(u8_t idx, ip_addr_t* addr);
+static void dns_call_found(u8_t idx, ip_addr_t *addr);
 
 /*-----------------------------------------------------------------------------
  * Globals
@@ -325,9 +322,9 @@
 #endif /* DNS_SERVER_ADDRESS */
 
   LWIP_ASSERT("sanity check SIZEOF_DNS_QUERY",
-    sizeof(struct dns_query) == SIZEOF_DNS_QUERY);
+              sizeof(struct dns_query) == SIZEOF_DNS_QUERY);
   LWIP_ASSERT("sanity check SIZEOF_DNS_ANSWER",
-    sizeof(struct dns_answer) <= SIZEOF_DNS_ANSWER_ASSERT);
+              sizeof(struct dns_answer) <= SIZEOF_DNS_ANSWER_ASSERT);
 
   LWIP_DEBUGF(DNS_DEBUG, ("dns_init: initializing\n"));
 
@@ -340,7 +337,7 @@
     /* initialize DNS table not needed (initialized to zero since it is a
      * global variable) */
     LWIP_ASSERT("For implicit initialization to work, DNS_STATE_UNUSED needs to be 0",
-      DNS_STATE_UNUSED == 0);
+                DNS_STATE_UNUSED == 0);
 
     /* initialize DNS client */
     udp_bind(dns_pcbs[0], IP_ANY_TYPE, 0);
@@ -380,7 +377,7 @@
  * @return IP address of the indexed DNS server or "ip_addr_any" if the DNS
  *         server has not been configured.
  */
-const ip_addr_t*
+const ip_addr_t *
 dns_getserver(u8_t numdns)
 {
   if (numdns < DNS_MAX_SERVERS) {
@@ -419,7 +416,7 @@
     entry = (struct local_hostlist_entry *)memp_malloc(MEMP_LOCALHOSTLIST);
     LWIP_ASSERT("mem-error in dns_init_local", entry != NULL);
     if (entry != NULL) {
-      char* entry_name = (char*)entry + sizeof(struct local_hostlist_entry);
+      char *entry_name = (char *)entry + sizeof(struct local_hostlist_entry);
       MEMCPY(entry_name, init_entry->name, namelen);
       entry_name[namelen] = 0;
       entry->name = entry_name;
@@ -566,7 +563,7 @@
 {
   struct local_hostlist_entry *entry;
   size_t namelen;
-  char* entry_name;
+  char *entry_name;
   LWIP_ASSERT("invalid host name (NULL)", hostname != NULL);
   namelen = strlen(hostname);
   LWIP_ASSERT("namelen <= DNS_LOCAL_HOSTLIST_MAX_NAMELEN", namelen <= DNS_LOCAL_HOSTLIST_MAX_NAMELEN);
@@ -574,7 +571,7 @@
   if (entry == NULL) {
     return ERR_MEM;
   }
-  entry_name = (char*)entry + sizeof(struct local_hostlist_entry);
+  entry_name = (char *)entry + sizeof(struct local_hostlist_entry);
   MEMCPY(entry_name, hostname, namelen);
   entry_name[namelen] = 0;
   entry->name = entry_name;
@@ -605,8 +602,6 @@
 dns_lookup(const char *name, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype))
 {
   u8_t i;
-#if DNS_LOCAL_HOSTLIST || defined(DNS_LOOKUP_LOCAL_EXTERN)
-#endif /* DNS_LOCAL_HOSTLIST || defined(DNS_LOOKUP_LOCAL_EXTERN) */
 #if DNS_LOCAL_HOSTLIST
   if (dns_lookup_local(name, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype)) == ERR_OK) {
     return ERR_OK;
@@ -624,7 +619,7 @@
         (lwip_strnicmp(name, dns_table[i].name, sizeof(dns_table[i].name)) == 0) &&
         LWIP_DNS_ADDRTYPE_MATCH_IP(dns_addrtype, dns_table[i].ipaddr)) {
       LWIP_DEBUGF(DNS_DEBUG, ("dns_lookup: \"%s\": found = ", name));
-      ip_addr_debug_print(DNS_DEBUG, &(dns_table[i].ipaddr));
+      ip_addr_debug_print_val(DNS_DEBUG, dns_table[i].ipaddr);
       LWIP_DEBUGF(DNS_DEBUG, ("\n"));
       if (addr) {
         ip_addr_copy(*addr, dns_table[i].ipaddr);
@@ -642,22 +637,29 @@
  * entry (otherwise, answers might arrive late for hostname not on the list
  * any more).
  *
+ * For now, this function compares case-insensitive to cope with all kinds of
+ * servers. This also means that "dns 0x20 bit encoding" must be checked
+ * externally, if we want to implement it.
+ * Currently, the request is sent exactly as passed in by he user request.
+ *
  * @param query hostname (not encoded) from the dns_table
  * @param p pbuf containing the encoded hostname in the DNS response
  * @param start_offset offset into p where the name starts
  * @return 0xFFFF: names differ, other: names equal -> offset behind name
  */
 static u16_t
-dns_compare_name(const char *query, struct pbuf* p, u16_t start_offset)
+dns_compare_name(const char *query, struct pbuf *p, u16_t start_offset)
 {
   int n;
   u16_t response_offset = start_offset;
 
   do {
-    n = pbuf_try_get_at(p, response_offset++);
-    if (n < 0) {
+    n = pbuf_try_get_at(p, response_offset);
+    if ((n < 0) || (response_offset == 0xFFFF)) {
+      /* error or overflow */
       return 0xFFFF;
     }
+    response_offset++;
     /** @see RFC 1035 - 4.1.4. Message compression */
     if ((n & 0xc0) == 0xc0) {
       /* Compressed name: cannot be equal since we don't send them */
@@ -669,10 +671,14 @@
         if (c < 0) {
           return 0xFFFF;
         }
-        if ((*query) != (u8_t)c) {
+        if (lwip_tolower((*query)) != lwip_tolower((u8_t)c)) {
           return 0xFFFF;
         }
-        ++response_offset;
+        if (response_offset == 0xFFFF) {
+          /* would overflow */
+          return 0xFFFF;
+        }
+        response_offset++;
         ++query;
         --n;
       }
@@ -684,7 +690,11 @@
     }
   } while (n != 0);
 
-  return response_offset + 1;
+  if (response_offset == 0xFFFF) {
+    /* would overflow */
+    return 0xFFFF;
+  }
+  return (u16_t)(response_offset + 1);
 }
 
 /**
@@ -695,14 +705,14 @@
  * @return index to end of the name
  */
 static u16_t
-dns_skip_name(struct pbuf* p, u16_t query_idx)
+dns_skip_name(struct pbuf *p, u16_t query_idx)
 {
   int n;
   u16_t offset = query_idx;
 
   do {
     n = pbuf_try_get_at(p, offset++);
-    if (n < 0) {
+    if ((n < 0) || (offset == 0)) {
       return 0xFFFF;
     }
     /** @see RFC 1035 - 4.1.4. Message compression */
@@ -722,7 +732,10 @@
     }
   } while (n != 0);
 
-  return offset + 1;
+  if (offset == 0xFFFF) {
+    return 0xFFFF;
+  }
+  return (u16_t)(offset + 1);
 }
 
 /**
@@ -742,16 +755,16 @@
   const char *hostname, *hostname_part;
   u8_t n;
   u8_t pcb_idx;
-  struct dns_table_entry* entry = &dns_table[idx];
+  struct dns_table_entry *entry = &dns_table[idx];
 
   LWIP_DEBUGF(DNS_DEBUG, ("dns_send: dns_servers[%"U16_F"] \"%s\": request\n",
-              (u16_t)(entry->server_idx), entry->name));
+                          (u16_t)(entry->server_idx), entry->name));
   LWIP_ASSERT("dns server out of array", entry->server_idx < DNS_MAX_SERVERS);
   if (ip_addr_isany_val(dns_servers[entry->server_idx])
 #if LWIP_DNS_SUPPORT_MDNS_QUERIES
       && !entry->is_mdns
 #endif
-    ) {
+     ) {
     /* DNS server not valid anymore, e.g. PPP netif has been shut down */
     /* call specified callback function if provided */
     dns_call_found(idx, NULL);
@@ -762,9 +775,9 @@
 
   /* if here, we have either a new query or a retry on a previous query to process */
   p = pbuf_alloc(PBUF_TRANSPORT, (u16_t)(SIZEOF_DNS_HDR + strlen(entry->name) + 2 +
-                 SIZEOF_DNS_QUERY), PBUF_RAM);
+                                         SIZEOF_DNS_QUERY), PBUF_RAM);
   if (p != NULL) {
-    const ip_addr_t* dst;
+    const ip_addr_t *dst;
     u16_t dst_port;
     /* fill dns header */
     memset(&hdr, 0, SIZEOF_DNS_HDR);
@@ -784,9 +797,13 @@
         ++n;
       }
       copy_len = (u16_t)(hostname - hostname_part);
+      if (query_idx + n + 1 > 0xFFFF) {
+        /* u16_t overflow */
+        goto overflow_return;
+      }
       pbuf_put_at(p, query_idx, n);
-      pbuf_take_at(p, hostname_part, copy_len, query_idx + 1);
-      query_idx += n + 1;
+      pbuf_take_at(p, hostname_part, copy_len, (u16_t)(query_idx + 1));
+      query_idx = (u16_t)(query_idx + n + 1);
     } while (*hostname != 0);
     pbuf_put_at(p, query_idx, 0);
     query_idx++;
@@ -807,13 +824,12 @@
 #endif
     /* send dns packet */
     LWIP_DEBUGF(DNS_DEBUG, ("sending DNS request ID %d for name \"%s\" to server %d\r\n",
-      entry->txid, entry->name, entry->server_idx));
+                            entry->txid, entry->name, entry->server_idx));
 #if LWIP_DNS_SUPPORT_MDNS_QUERIES
     if (entry->is_mdns) {
       dst_port = DNS_MQUERY_PORT;
 #if LWIP_IPV6
-      if (LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype))
-      {
+      if (LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype)) {
         dst = &dns_mquery_v6group;
       }
 #endif
@@ -840,35 +856,38 @@
   }
 
   return err;
+overflow_return:
+  pbuf_free(p);
+  return ERR_VAL;
 }
 
 #if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0)
-static struct udp_pcb*
+static struct udp_pcb *
 dns_alloc_random_port(void)
 {
   err_t err;
-  struct udp_pcb* ret;
+  struct udp_pcb *pcb;
 
-  ret = udp_new_ip_type(IPADDR_TYPE_ANY);
-  if (ret == NULL) {
+  pcb = udp_new_ip_type(IPADDR_TYPE_ANY);
+  if (pcb == NULL) {
     /* out of memory, have to reuse an existing pcb */
     return NULL;
   }
   do {
     u16_t port = (u16_t)DNS_RAND_TXID();
-    if (!DNS_PORT_ALLOWED(port)) {
+    if (DNS_PORT_ALLOWED(port)) {
+      err = udp_bind(pcb, IP_ANY_TYPE, port);
+    } else {
       /* this port is not allowed, try again */
       err = ERR_USE;
-      continue;
     }
-    err = udp_bind(ret, IP_ANY_TYPE, port);
   } while (err == ERR_USE);
   if (err != ERR_OK) {
-    udp_remove(ret);
+    udp_remove(pcb);
     return NULL;
   }
-  udp_recv(ret, dns_recv, NULL);
-  return ret;
+  udp_recv(pcb, dns_recv, NULL);
+  return pcb;
 }
 
 /**
@@ -897,8 +916,8 @@
     }
   }
   /* if we come here, creating a new UDP pcb failed, so we have to use
-     an already existing one */
-  for (i = 0, idx = dns_last_pcb_idx + 1; i < DNS_MAX_SOURCE_PORTS; i++, idx++) {
+     an already existing one (so overflow is no issue) */
+  for (i = 0, idx = (u8_t)(dns_last_pcb_idx + 1); i < DNS_MAX_SOURCE_PORTS; i++, idx++) {
     if (idx >= DNS_MAX_SOURCE_PORTS) {
       idx = 0;
     }
@@ -920,7 +939,7 @@
  * @param addr IP address for the hostname (or NULL on error or memory shortage)
  */
 static void
-dns_call_found(u8_t idx, ip_addr_t* addr)
+dns_call_found(u8_t idx, ip_addr_t *addr)
 {
 #if ((LWIP_DNS_SECURE & (LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)) != 0)
   u8_t i;
@@ -999,6 +1018,23 @@
 }
 
 /**
+ * Check whether there are other backup DNS servers available to try
+ */
+static u8_t
+dns_backupserver_available(struct dns_table_entry *pentry)
+{
+  u8_t ret = 0;
+
+  if (pentry) {
+    if ((pentry->server_idx + 1 < DNS_MAX_SERVERS) && !ip_addr_isany_val(dns_servers[pentry->server_idx + 1])) {
+      ret = 1;
+    }
+  }
+
+  return ret;
+}
+
+/**
  * dns_check_entry() - see if entry has not yet been queried and, if so, sends out a query.
  * Check an entry in the dns_table:
  * - send out query for new entries
@@ -1034,11 +1070,11 @@
     case DNS_STATE_ASKING:
       if (--entry->tmr == 0) {
         if (++entry->retries == DNS_MAX_RETRIES) {
-          if ((entry->server_idx + 1 < DNS_MAX_SERVERS) && !ip_addr_isany_val(dns_servers[entry->server_idx + 1])
+          if (dns_backupserver_available(entry)
 #if LWIP_DNS_SUPPORT_MDNS_QUERIES
-            && !entry->is_mdns
+              && !entry->is_mdns
 #endif /* LWIP_DNS_SUPPORT_MDNS_QUERIES */
-            ) {
+             ) {
             /* change of server */
             entry->server_idx++;
             entry->tmr = 1;
@@ -1105,7 +1141,7 @@
   entry->state = DNS_STATE_DONE;
 
   LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response = ", entry->name));
-  ip_addr_debug_print(DNS_DEBUG, (&(entry->ipaddr)));
+  ip_addr_debug_print_val(DNS_DEBUG, entry->ipaddr);
   LWIP_DEBUGF(DNS_DEBUG, ("\n"));
 
   /* read the answer resource record's TTL, and maximize it if needed */
@@ -1126,6 +1162,7 @@
     }
   }
 }
+
 /**
  * Receive input function for DNS response packets arriving for the dns UDP pcb.
  */
@@ -1148,7 +1185,7 @@
   if (p->tot_len < (SIZEOF_DNS_HDR + SIZEOF_DNS_QUERY)) {
     LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: pbuf too small\n"));
     /* free pbuf and return */
-    goto memerr;
+    goto ignore_packet;
   }
 
   /* copy dns payload inside static buffer for processing */
@@ -1156,7 +1193,7 @@
     /* Match the ID in the DNS header with the name table. */
     txid = lwip_htons(hdr.id);
     for (i = 0; i < DNS_TABLE_SIZE; i++) {
-      const struct dns_table_entry *entry = &dns_table[i];
+      struct dns_table_entry *entry = &dns_table[i];
       if ((entry->state == DNS_STATE_ASKING) &&
           (entry->txid == txid)) {
 
@@ -1168,11 +1205,11 @@
         /* Check for correct response. */
         if ((hdr.flags1 & DNS_FLAG1_RESPONSE) == 0) {
           LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": not a response\n", entry->name));
-          goto memerr; /* ignore this packet */
+          goto ignore_packet; /* ignore this packet */
         }
         if (nquestions != 1) {
           LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response not match to query\n", entry->name));
-          goto memerr; /* ignore this packet */
+          goto ignore_packet; /* ignore this packet */
         }
 
 #if LWIP_DNS_SUPPORT_MDNS_QUERIES
@@ -1182,7 +1219,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])) {
-            goto memerr; /* ignore this packet */
+            goto ignore_packet; /* ignore this packet */
           }
         }
 
@@ -1191,38 +1228,58 @@
         res_idx = dns_compare_name(entry->name, p, SIZEOF_DNS_HDR);
         if (res_idx == 0xFFFF) {
           LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response not match to query\n", entry->name));
-          goto memerr; /* ignore this packet */
+          goto ignore_packet; /* ignore this packet */
         }
 
         /* check if "question" part matches the request */
         if (pbuf_copy_partial(p, &qry, SIZEOF_DNS_QUERY, res_idx) != SIZEOF_DNS_QUERY) {
-          goto memerr; /* ignore this packet */
+          goto ignore_packet; /* ignore this packet */
         }
         if ((qry.cls != PP_HTONS(DNS_RRCLASS_IN)) ||
-          (LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype) && (qry.type != PP_HTONS(DNS_RRTYPE_AAAA))) ||
-          (!LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype) && (qry.type != PP_HTONS(DNS_RRTYPE_A)))) {
+            (LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype) && (qry.type != PP_HTONS(DNS_RRTYPE_AAAA))) ||
+            (!LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype) && (qry.type != PP_HTONS(DNS_RRTYPE_A)))) {
           LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response not match to query\n", entry->name));
-          goto memerr; /* ignore this packet */
+          goto ignore_packet; /* ignore this packet */
         }
         /* skip the rest of the "question" part */
-        res_idx += SIZEOF_DNS_QUERY;
+        if (res_idx + SIZEOF_DNS_QUERY > 0xFFFF) {
+          goto ignore_packet;
+        }
+        res_idx = (u16_t)(res_idx + SIZEOF_DNS_QUERY);
 
         /* Check for error. If so, call callback to inform. */
         if (hdr.flags2 & DNS_FLAG2_ERR_MASK) {
           LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": error in flags\n", entry->name));
+
+          /* if there is another backup DNS server to try
+           * then don't stop the DNS request
+           */
+          if (dns_backupserver_available(entry)) {
+            /* avoid retrying the same server */
+            entry->retries = DNS_MAX_RETRIES-1;
+            entry->tmr     = 1;
+
+            /* contact next available server for this entry */
+            dns_check_entry(i);
+
+            goto ignore_packet;
+          }
         } else {
           while ((nanswers > 0) && (res_idx < p->tot_len)) {
             /* skip answer resource record's host name */
             res_idx = dns_skip_name(p, res_idx);
             if (res_idx == 0xFFFF) {
-              goto memerr; /* ignore this packet */
+              goto ignore_packet; /* ignore this packet */
             }
 
             /* Check for IP address type and Internet class. Others are discarded. */
             if (pbuf_copy_partial(p, &ans, SIZEOF_DNS_ANSWER, res_idx) != SIZEOF_DNS_ANSWER) {
-              goto memerr; /* ignore this packet */
+              goto ignore_packet; /* ignore this packet */
             }
-            res_idx += SIZEOF_DNS_ANSWER;
+            if (res_idx + SIZEOF_DNS_ANSWER > 0xFFFF) {
+              goto ignore_packet;
+            }
+            res_idx = (u16_t)(res_idx + SIZEOF_DNS_ANSWER);
 
             if (ans.cls == PP_HTONS(DNS_RRCLASS_IN)) {
 #if LWIP_IPV4
@@ -1234,7 +1291,7 @@
                   ip4_addr_t ip4addr;
                   /* read the IP address after answer resource record's header */
                   if (pbuf_copy_partial(p, &ip4addr, sizeof(ip4_addr_t), res_idx) != sizeof(ip4_addr_t)) {
-                    goto memerr; /* ignore this packet */
+                    goto ignore_packet; /* ignore this packet */
                   }
                   ip_addr_copy_from_ip4(dns_table[i].ipaddr, ip4addr);
                   pbuf_free(p);
@@ -1245,17 +1302,18 @@
               }
 #endif /* LWIP_IPV4 */
 #if LWIP_IPV6
-              if ((ans.type == PP_HTONS(DNS_RRTYPE_AAAA)) && (ans.len == PP_HTONS(sizeof(ip6_addr_t)))) {
+              if ((ans.type == PP_HTONS(DNS_RRTYPE_AAAA)) && (ans.len == PP_HTONS(sizeof(ip6_addr_p_t)))) {
 #if LWIP_IPV4 && LWIP_IPV6
                 if (LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype))
 #endif /* LWIP_IPV4 && LWIP_IPV6 */
                 {
-                  ip6_addr_t ip6addr;
+                  ip6_addr_p_t ip6addr;
                   /* read the IP address after answer resource record's header */
-                  if (pbuf_copy_partial(p, &ip6addr, sizeof(ip6_addr_t), res_idx) != sizeof(ip6_addr_t)) {
-                    goto memerr; /* ignore this packet */
+                  if (pbuf_copy_partial(p, &ip6addr, sizeof(ip6_addr_p_t), res_idx) != sizeof(ip6_addr_p_t)) {
+                    goto ignore_packet; /* ignore this packet */
                   }
-                  ip_addr_copy_from_ip6(dns_table[i].ipaddr, ip6addr);
+                  /* @todo: scope ip6addr? Might be required for link-local addresses at least? */
+                  ip_addr_copy_from_ip6_packed(dns_table[i].ipaddr, ip6addr);
                   pbuf_free(p);
                   /* handle correct response */
                   dns_correct_response(i, lwip_ntohl(ans.ttl));
@@ -1266,9 +1324,9 @@
             }
             /* skip this answer */
             if ((int)(res_idx + lwip_htons(ans.len)) > 0xFFFF) {
-              goto memerr; /* ignore this packet */
+              goto ignore_packet; /* ignore this packet */
             }
-            res_idx += lwip_htons(ans.len);
+            res_idx = (u16_t)(res_idx + lwip_htons(ans.len));
             --nanswers;
           }
 #if LWIP_IPV4 && LWIP_IPV6
@@ -1298,7 +1356,7 @@
     }
   }
 
-memerr:
+ignore_packet:
   /* deallocate memory and return */
   pbuf_free(p);
   return;
@@ -1321,7 +1379,7 @@
   u8_t lseq, lseqi;
   struct dns_table_entry *entry = NULL;
   size_t namelen;
-  struct dns_req_entry* req;
+  struct dns_req_entry *req;
 
 #if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING) != 0)
   u8_t r;
@@ -1364,7 +1422,7 @@
     }
     /* check if this is the oldest completed entry */
     if (entry->state == DNS_STATE_DONE) {
-      u8_t age = dns_seqno - entry->seqno;
+      u8_t age = (u8_t)(dns_seqno - entry->seqno);
       if (age > lseq) {
         lseq = age;
         lseqi = i;
@@ -1415,7 +1473,7 @@
   LWIP_DNS_SET_ADDRTYPE(req->reqaddrtype, dns_addrtype);
   req->found = found;
   req->arg   = callback_arg;
-  namelen = LWIP_MIN(hostnamelen, DNS_MAX_NAME_LENGTH-1);
+  namelen = LWIP_MIN(hostnamelen, DNS_MAX_NAME_LENGTH - 1);
   MEMCPY(entry->name, name, namelen);
   entry->name[namelen] = 0;
 
@@ -1567,7 +1625,7 @@
 
   /* queue query with specified callback */
   return dns_enqueue(hostname, hostnamelen, found, callback_arg LWIP_DNS_ADDRTYPE_ARG(dns_addrtype)
-     LWIP_DNS_ISMDNS_ARG(is_mdns));
+                     LWIP_DNS_ISMDNS_ARG(is_mdns));
 }
 
 #endif /* LWIP_DNS */
diff --git a/src/core/inet_chksum.c b/src/core/inet_chksum.c
index 917f3e4..818c68f 100644
--- a/src/core/inet_chksum.c
+++ b/src/core/inet_chksum.c
@@ -1,6 +1,6 @@
 /**
  * @file
- * Incluse internet checksum functions.\n
+ * Internet checksum functions.\n
  *
  * These are some reference implementations of the checksum algorithm, with the
  * aim of being simple, correct and fully portable. Checksumming is the
@@ -8,7 +8,7 @@
  * your own version, link it in and in your cc.h put:
  *
  * \#define LWIP_CHKSUM your_checksum_routine
- * 
+ *
  * Or you can select from the implementations below by defining
  * LWIP_CHKSUM_ALGORITHM to 1, 2 or 3.
  */
@@ -85,7 +85,7 @@
 
   acc = 0;
   /* dataptr may be at odd or even addresses */
-  octetptr = (const u8_t*)dataptr;
+  octetptr = (const u8_t *)dataptr;
   while (len > 1) {
     /* declare first octet as most significant
        thus assume network order, ignoring host order */
@@ -201,14 +201,14 @@
     len--;
   }
 
-  ps = (const u16_t *)(const void*)pb;
+  ps = (const u16_t *)(const void *)pb;
 
   if (((mem_ptr_t)ps & 3) && len > 1) {
     sum += *ps++;
     len -= 2;
   }
 
-  pl = (const u32_t *)(const void*)ps;
+  pl = (const u32_t *)(const void *)ps;
 
   while (len > 7)  {
     tmp = sum + *pl++;          /* ping */
@@ -260,19 +260,19 @@
 inet_cksum_pseudo_base(struct pbuf *p, u8_t proto, u16_t proto_len, u32_t acc)
 {
   struct pbuf *q;
-  u8_t swapped = 0;
+  int swapped = 0;
 
   /* iterate through all pbuf in chain */
   for (q = p; q != NULL; q = q->next) {
     LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \n",
-      (void *)q, (void *)q->next));
+                             (void *)q, (void *)q->next));
     acc += LWIP_CHKSUM(q->payload, q->len);
     /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped lwip_chksum()=%"X32_F" \n", acc));*/
     /* just executing this next line is probably faster that the if statement needed
        to check whether we really need to execute it, and does no harm */
     acc = FOLD_U32T(acc);
     if (q->len % 2 != 0) {
-      swapped = 1 - swapped;
+      swapped = !swapped;
       acc = SWAP_BYTES_IN_WORD(acc);
     }
     /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%"X32_F" \n", acc));*/
@@ -308,17 +308,17 @@
  */
 u16_t
 inet_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len,
-       const ip4_addr_t *src, const ip4_addr_t *dest)
+                   const ip4_addr_t *src, const ip4_addr_t *dest)
 {
   u32_t acc;
   u32_t addr;
 
   addr = ip4_addr_get_u32(src);
   acc = (addr & 0xffffUL);
-  acc += ((addr >> 16) & 0xffffUL);
+  acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL));
   addr = ip4_addr_get_u32(dest);
-  acc += (addr & 0xffffUL);
-  acc += ((addr >> 16) & 0xffffUL);
+  acc = (u32_t)(acc + (addr & 0xffffUL));
+  acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL));
   /* fold down to 16 bits */
   acc = FOLD_U32T(acc);
   acc = FOLD_U32T(acc);
@@ -341,7 +341,7 @@
  */
 u16_t
 ip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len,
-       const ip6_addr_t *src, const ip6_addr_t *dest)
+                  const ip6_addr_t *src, const ip6_addr_t *dest)
 {
   u32_t acc = 0;
   u32_t addr;
@@ -349,11 +349,11 @@
 
   for (addr_part = 0; addr_part < 4; addr_part++) {
     addr = src->addr[addr_part];
-    acc += (addr & 0xffffUL);
-    acc += ((addr >> 16) & 0xffffUL);
+    acc = (u32_t)(acc + (addr & 0xffffUL));
+    acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL));
     addr = dest->addr[addr_part];
-    acc += (addr & 0xffffUL);
-    acc += ((addr >> 16) & 0xffffUL);
+    acc = (u32_t)(acc + (addr & 0xffffUL));
+    acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL));
   }
   /* fold down to 16 bits */
   acc = FOLD_U32T(acc);
@@ -377,7 +377,7 @@
  */
 u16_t
 ip_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len,
-       const ip_addr_t *src, const ip_addr_t *dest)
+                 const ip_addr_t *src, const ip_addr_t *dest)
 {
 #if LWIP_IPV6
   if (IP_IS_V6(dest)) {
@@ -397,28 +397,28 @@
 /** Parts of the pseudo checksum which are common to IPv4 and IPv6 */
 static u16_t
 inet_cksum_pseudo_partial_base(struct pbuf *p, u8_t proto, u16_t proto_len,
-       u16_t chksum_len, u32_t acc)
+                               u16_t chksum_len, u32_t acc)
 {
   struct pbuf *q;
-  u8_t swapped = 0;
+  int swapped = 0;
   u16_t chklen;
 
   /* iterate through all pbuf in chain */
   for (q = p; (q != NULL) && (chksum_len > 0); q = q->next) {
     LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \n",
-      (void *)q, (void *)q->next));
+                             (void *)q, (void *)q->next));
     chklen = q->len;
     if (chklen > chksum_len) {
       chklen = chksum_len;
     }
     acc += LWIP_CHKSUM(q->payload, chklen);
-    chksum_len -= chklen;
+    chksum_len = (u16_t)(chksum_len - chklen);
     LWIP_ASSERT("delete me", chksum_len < 0x7fff);
     /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped lwip_chksum()=%"X32_F" \n", acc));*/
     /* fold the upper bit down */
     acc = FOLD_U32T(acc);
     if (q->len % 2 != 0) {
-      swapped = 1 - swapped;
+      swapped = !swapped;
       acc = SWAP_BYTES_IN_WORD(acc);
     }
     /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%"X32_F" \n", acc));*/
@@ -454,17 +454,17 @@
  */
 u16_t
 inet_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len,
-       u16_t chksum_len, const ip4_addr_t *src, const ip4_addr_t *dest)
+                           u16_t chksum_len, const ip4_addr_t *src, const ip4_addr_t *dest)
 {
   u32_t acc;
   u32_t addr;
 
   addr = ip4_addr_get_u32(src);
   acc = (addr & 0xffffUL);
-  acc += ((addr >> 16) & 0xffffUL);
+  acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL));
   addr = ip4_addr_get_u32(dest);
-  acc += (addr & 0xffffUL);
-  acc += ((addr >> 16) & 0xffffUL);
+  acc = (u32_t)(acc + (addr & 0xffffUL));
+  acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL));
   /* fold down to 16 bits */
   acc = FOLD_U32T(acc);
   acc = FOLD_U32T(acc);
@@ -489,7 +489,7 @@
  */
 u16_t
 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)
+                          u16_t chksum_len, const ip6_addr_t *src, const ip6_addr_t *dest)
 {
   u32_t acc = 0;
   u32_t addr;
@@ -497,11 +497,11 @@
 
   for (addr_part = 0; addr_part < 4; addr_part++) {
     addr = src->addr[addr_part];
-    acc += (addr & 0xffffUL);
-    acc += ((addr >> 16) & 0xffffUL);
+    acc = (u32_t)(acc + (addr & 0xffffUL));
+    acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL));
     addr = dest->addr[addr_part];
-    acc += (addr & 0xffffUL);
-    acc += ((addr >> 16) & 0xffffUL);
+    acc = (u32_t)(acc + (addr & 0xffffUL));
+    acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL));
   }
   /* fold down to 16 bits */
   acc = FOLD_U32T(acc);
@@ -524,7 +524,7 @@
  */
 u16_t
 ip_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len,
-       u16_t chksum_len, const ip_addr_t *src, const ip_addr_t *dest)
+                         u16_t chksum_len, const ip_addr_t *src, const ip_addr_t *dest)
 {
 #if LWIP_IPV6
   if (IP_IS_V6(dest)) {
@@ -569,15 +569,14 @@
 {
   u32_t acc;
   struct pbuf *q;
-  u8_t swapped;
+  int swapped = 0;
 
   acc = 0;
-  swapped = 0;
   for (q = p; q != NULL; q = q->next) {
     acc += LWIP_CHKSUM(q->payload, q->len);
     acc = FOLD_U32T(acc);
     if (q->len % 2 != 0) {
-      swapped = 1 - swapped;
+      swapped = !swapped;
       acc = SWAP_BYTES_IN_WORD(acc);
     }
   }
diff --git a/src/core/init.c b/src/core/init.c
index ea3b5eb..b3737a3 100644
--- a/src/core/init.c
+++ b/src/core/init.c
@@ -67,8 +67,7 @@
 #  include "arch/bpstruct.h"
 #endif
 PACK_STRUCT_BEGIN
-struct packed_struct_test
-{
+struct packed_struct_test {
   PACK_STRUCT_FLD_8(u8_t  dummy1);
   PACK_STRUCT_FIELD(u32_t dummy2);
 } PACK_STRUCT_STRUCT;
@@ -84,187 +83,183 @@
  * These can be done independently of LWIP_DEBUG, without penalty.
  */
 #ifndef BYTE_ORDER
-  #error "BYTE_ORDER is not defined, you have to define it in your cc.h"
+#error "BYTE_ORDER is not defined, you have to define it in your cc.h"
 #endif
 #if (!IP_SOF_BROADCAST && IP_SOF_BROADCAST_RECV)
-  #error "If you want to use broadcast filter per pcb on recv operations, you have to define IP_SOF_BROADCAST=1 in your lwipopts.h"
+#error "If you want to use broadcast filter per pcb on recv operations, you have to define IP_SOF_BROADCAST=1 in your lwipopts.h"
 #endif
 #if (!LWIP_UDP && LWIP_UDPLITE)
-  #error "If you want to use UDP Lite, you have to define LWIP_UDP=1 in your lwipopts.h"
+#error "If you want to use UDP Lite, you have to define LWIP_UDP=1 in your lwipopts.h"
 #endif
 #if (!LWIP_UDP && LWIP_DHCP)
-  #error "If you want to use DHCP, you have to define LWIP_UDP=1 in your lwipopts.h"
+#error "If you want to use DHCP, you have to define LWIP_UDP=1 in your lwipopts.h"
 #endif
-#if (!LWIP_UDP && LWIP_MULTICAST_TX_OPTIONS)
-  #error "If you want to use IGMP/LWIP_MULTICAST_TX_OPTIONS, you have to define LWIP_UDP=1 in your lwipopts.h"
+#if (!LWIP_UDP && !LWIP_RAW && LWIP_MULTICAST_TX_OPTIONS)
+#error "If you want to use LWIP_MULTICAST_TX_OPTIONS, you have to define LWIP_UDP=1 and/or LWIP_RAW=1 in your lwipopts.h"
 #endif
 #if (!LWIP_UDP && LWIP_DNS)
-  #error "If you want to use DNS, you have to define LWIP_UDP=1 in your lwipopts.h"
+#error "If you want to use DNS, you have to define LWIP_UDP=1 in your lwipopts.h"
 #endif
 #if !MEMP_MEM_MALLOC /* MEMP_NUM_* checks are disabled when not using the pool allocator */
 #if (LWIP_ARP && ARP_QUEUEING && (MEMP_NUM_ARP_QUEUE<=0))
-  #error "If you want to use ARP Queueing, you have to define MEMP_NUM_ARP_QUEUE>=1 in your lwipopts.h"
+#error "If you want to use ARP Queueing, you have to define MEMP_NUM_ARP_QUEUE>=1 in your lwipopts.h"
 #endif
 #if (LWIP_RAW && (MEMP_NUM_RAW_PCB<=0))
-  #error "If you want to use RAW, you have to define MEMP_NUM_RAW_PCB>=1 in your lwipopts.h"
+#error "If you want to use RAW, you have to define MEMP_NUM_RAW_PCB>=1 in your lwipopts.h"
 #endif
 #if (LWIP_UDP && (MEMP_NUM_UDP_PCB<=0))
-  #error "If you want to use UDP, you have to define MEMP_NUM_UDP_PCB>=1 in your lwipopts.h"
+#error "If you want to use UDP, you have to define MEMP_NUM_UDP_PCB>=1 in your lwipopts.h"
 #endif
 #if (LWIP_TCP && (MEMP_NUM_TCP_PCB<=0))
-  #error "If you want to use TCP, you have to define MEMP_NUM_TCP_PCB>=1 in your lwipopts.h"
+#error "If you want to use TCP, you have to define MEMP_NUM_TCP_PCB>=1 in your lwipopts.h"
 #endif
 #if (LWIP_IGMP && (MEMP_NUM_IGMP_GROUP<=1))
-  #error "If you want to use IGMP, you have to define MEMP_NUM_IGMP_GROUP>1 in your lwipopts.h"
+#error "If you want to use IGMP, you have to define MEMP_NUM_IGMP_GROUP>1 in your lwipopts.h"
 #endif
 #if (LWIP_IGMP && !LWIP_MULTICAST_TX_OPTIONS)
-  #error "If you want to use IGMP, you have to define LWIP_MULTICAST_TX_OPTIONS==1 in your lwipopts.h"
+#error "If you want to use IGMP, you have to define LWIP_MULTICAST_TX_OPTIONS==1 in your lwipopts.h"
 #endif
 #if (LWIP_IGMP && !LWIP_IPV4)
-  #error "IGMP needs LWIP_IPV4 enabled in your lwipopts.h"
-#endif
-#if (LWIP_MULTICAST_TX_OPTIONS && !LWIP_IPV4)
-  #error "LWIP_MULTICAST_TX_OPTIONS needs LWIP_IPV4 enabled in your lwipopts.h"
+#error "IGMP needs LWIP_IPV4 enabled in your lwipopts.h"
 #endif
 #if ((LWIP_NETCONN || LWIP_SOCKET) && (MEMP_NUM_TCPIP_MSG_API<=0))
-  #error "If you want to use Sequential API, you have to define MEMP_NUM_TCPIP_MSG_API>=1 in your lwipopts.h"
+#error "If you want to use Sequential API, you have to define MEMP_NUM_TCPIP_MSG_API>=1 in your lwipopts.h"
 #endif
 /* There must be sufficient timeouts, taking into account requirements of the subsystems. */
-#if LWIP_TIMERS && (MEMP_NUM_SYS_TIMEOUT < (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_SUPPORT + (LWIP_IPV6 ? (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD) : 0)))
-  #error "MEMP_NUM_SYS_TIMEOUT is too low to accomodate all required timeouts"
+#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"
 #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!"
+#error "MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS doesn't make sense since each struct ip_reassdata must hold 2 pbufs at least!"
 #endif
 #endif /* !MEMP_MEM_MALLOC */
 #if LWIP_WND_SCALE
 #if (LWIP_TCP && (TCP_WND > 0xffffffff))
-  #error "If you want to use TCP, TCP_WND must fit in an u32_t, so, you have to reduce it in your lwipopts.h"
+#error "If you want to use TCP, TCP_WND must fit in an u32_t, so, you have to reduce it in your lwipopts.h"
 #endif
 #if (LWIP_TCP && (TCP_RCV_SCALE > 14))
-  #error "The maximum valid window scale value is 14!"
+#error "The maximum valid window scale value is 14!"
 #endif
 #if (LWIP_TCP && (TCP_WND > (0xFFFFU << TCP_RCV_SCALE)))
-  #error "TCP_WND is bigger than the configured LWIP_WND_SCALE allows!"
+#error "TCP_WND is bigger than the configured LWIP_WND_SCALE allows!"
 #endif
 #if (LWIP_TCP && ((TCP_WND >> TCP_RCV_SCALE) == 0))
-  #error "TCP_WND is too small for the configured LWIP_WND_SCALE (results in zero window)!"
+#error "TCP_WND is too small for the configured LWIP_WND_SCALE (results in zero window)!"
 #endif
 #else /* LWIP_WND_SCALE */
 #if (LWIP_TCP && (TCP_WND > 0xffff))
-  #error "If you want to use TCP, TCP_WND must fit in an u16_t, so, you have to reduce it in your lwipopts.h (or enable window scaling)"
+#error "If you want to use TCP, TCP_WND must fit in an u16_t, so, you have to reduce it in your lwipopts.h (or enable window scaling)"
 #endif
 #endif /* LWIP_WND_SCALE */
 #if (LWIP_TCP && (TCP_SND_QUEUELEN > 0xffff))
-  #error "If you want to use TCP, TCP_SND_QUEUELEN must fit in an u16_t, so, you have to reduce it in your lwipopts.h"
+#error "If you want to use TCP, TCP_SND_QUEUELEN must fit in an u16_t, so, you have to reduce it in your lwipopts.h"
 #endif
 #if (LWIP_TCP && (TCP_SND_QUEUELEN < 2))
-  #error "TCP_SND_QUEUELEN must be at least 2 for no-copy TCP writes to work"
+#error "TCP_SND_QUEUELEN must be at least 2 for no-copy TCP writes to work"
 #endif
 #if (LWIP_TCP && ((TCP_MAXRTX > 12) || (TCP_SYNMAXRTX > 12)))
-  #error "If you want to use TCP, TCP_MAXRTX and TCP_SYNMAXRTX must less or equal to 12 (due to tcp_backoff table), so, you have to reduce them in your lwipopts.h"
+#error "If you want to use TCP, TCP_MAXRTX and TCP_SYNMAXRTX must less or equal to 12 (due to tcp_backoff table), so, you have to reduce them in your lwipopts.h"
 #endif
 #if (LWIP_TCP && TCP_LISTEN_BACKLOG && ((TCP_DEFAULT_LISTEN_BACKLOG < 0) || (TCP_DEFAULT_LISTEN_BACKLOG > 0xff)))
-  #error "If you want to use TCP backlog, TCP_DEFAULT_LISTEN_BACKLOG must fit into an u8_t"
+#error "If you want to use TCP backlog, TCP_DEFAULT_LISTEN_BACKLOG must fit into an u8_t"
+#endif
+#if (LWIP_TCP && LWIP_TCP_SACK_OUT && !TCP_QUEUE_OOSEQ)
+#error "To use LWIP_TCP_SACK_OUT, TCP_QUEUE_OOSEQ needs to be enabled"
+#endif
+#if (LWIP_TCP && LWIP_TCP_SACK_OUT && (LWIP_TCP_MAX_SACK_NUM < 1))
+#error "LWIP_TCP_MAX_SACK_NUM must be greater than 0"
 #endif
 #if (LWIP_NETIF_API && (NO_SYS==1))
-  #error "If you want to use NETIF API, you have to define NO_SYS=0 in your lwipopts.h"
+#error "If you want to use NETIF API, you have to define NO_SYS=0 in your lwipopts.h"
 #endif
 #if ((LWIP_SOCKET || LWIP_NETCONN) && (NO_SYS==1))
-  #error "If you want to use Sequential API, you have to define NO_SYS=0 in your lwipopts.h"
+#error "If you want to use Sequential API, you have to define NO_SYS=0 in your lwipopts.h"
 #endif
 #if (LWIP_PPP_API && (NO_SYS==1))
-  #error "If you want to use PPP API, you have to define NO_SYS=0 in your lwipopts.h"
+#error "If you want to use PPP API, you have to define NO_SYS=0 in your lwipopts.h"
 #endif
 #if (LWIP_PPP_API && (PPP_SUPPORT==0))
-  #error "If you want to use PPP API, you have to enable PPP_SUPPORT in your lwipopts.h"
+#error "If you want to use PPP API, you have to enable PPP_SUPPORT in your lwipopts.h"
 #endif
 #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"
+#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"
+#error "If you want to use DHCP ARP checking, you have to define LWIP_DHCP=1 and LWIP_ARP=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"
+#error "If you want to use AUTOIP, you have to define LWIP_ARP=1 in your lwipopts.h"
 #endif
 #if (LWIP_TCP && ((LWIP_EVENT_API && LWIP_CALLBACK_API) || (!LWIP_EVENT_API && !LWIP_CALLBACK_API)))
-  #error "One and exactly one of LWIP_EVENT_API and LWIP_CALLBACK_API has to be enabled in your lwipopts.h"
+#error "One and exactly one of LWIP_EVENT_API and LWIP_CALLBACK_API has to be enabled in your lwipopts.h"
+#endif
+#if (LWIP_ALTCP && LWIP_EVENT_API)
+#error "The application layered tcp API does not work with LWIP_EVENT_API"
 #endif
 #if (MEM_LIBC_MALLOC && MEM_USE_POOLS)
-  #error "MEM_LIBC_MALLOC and MEM_USE_POOLS may not both be simultaneously enabled in your lwipopts.h"
+#error "MEM_LIBC_MALLOC and MEM_USE_POOLS may not both be simultaneously enabled in your lwipopts.h"
 #endif
 #if (MEM_USE_POOLS && !MEMP_USE_CUSTOM_POOLS)
-  #error "MEM_USE_POOLS requires custom pools (MEMP_USE_CUSTOM_POOLS) to be enabled in your lwipopts.h"
+#error "MEM_USE_POOLS requires custom pools (MEMP_USE_CUSTOM_POOLS) to be enabled in your lwipopts.h"
 #endif
 #if (PBUF_POOL_BUFSIZE <= MEM_ALIGNMENT)
-  #error "PBUF_POOL_BUFSIZE must be greater than MEM_ALIGNMENT or the offset may take the full first pbuf"
+#error "PBUF_POOL_BUFSIZE must be greater than MEM_ALIGNMENT or the offset may take the full first pbuf"
 #endif
 #if (DNS_LOCAL_HOSTLIST && !DNS_LOCAL_HOSTLIST_IS_DYNAMIC && !(defined(DNS_LOCAL_HOSTLIST_INIT)))
-  #error "you have to define define DNS_LOCAL_HOSTLIST_INIT {{'host1', 0x123}, {'host2', 0x234}} to initialize DNS_LOCAL_HOSTLIST"
+#error "you have to define define DNS_LOCAL_HOSTLIST_INIT {{'host1', 0x123}, {'host2', 0x234}} to initialize DNS_LOCAL_HOSTLIST"
 #endif
 #if PPP_SUPPORT && !PPPOS_SUPPORT && !PPPOE_SUPPORT && !PPPOL2TP_SUPPORT
-  #error "PPP_SUPPORT needs at least one of PPPOS_SUPPORT, PPPOE_SUPPORT or PPPOL2TP_SUPPORT turned on"
+#error "PPP_SUPPORT needs at least one of PPPOS_SUPPORT, PPPOE_SUPPORT or PPPOL2TP_SUPPORT turned on"
 #endif
 #if PPP_SUPPORT && !PPP_IPV4_SUPPORT && !PPP_IPV6_SUPPORT
-  #error "PPP_SUPPORT needs PPP_IPV4_SUPPORT and/or PPP_IPV6_SUPPORT turned on"
+#error "PPP_SUPPORT needs PPP_IPV4_SUPPORT and/or PPP_IPV6_SUPPORT turned on"
 #endif
 #if PPP_SUPPORT && PPP_IPV4_SUPPORT && !LWIP_IPV4
-  #error "PPP_IPV4_SUPPORT needs LWIP_IPV4 turned on"
+#error "PPP_IPV4_SUPPORT needs LWIP_IPV4 turned on"
 #endif
 #if PPP_SUPPORT && PPP_IPV6_SUPPORT && !LWIP_IPV6
-  #error "PPP_IPV6_SUPPORT needs LWIP_IPV6 turned on"
+#error "PPP_IPV6_SUPPORT needs LWIP_IPV6 turned on"
 #endif
 #if !LWIP_ETHERNET && (LWIP_ARP || PPPOE_SUPPORT)
-  #error "LWIP_ETHERNET needs to be turned on for LWIP_ARP or PPPOE_SUPPORT"
+#error "LWIP_ETHERNET needs to be turned on for LWIP_ARP or PPPOE_SUPPORT"
 #endif
 #if LWIP_TCPIP_CORE_LOCKING_INPUT && !LWIP_TCPIP_CORE_LOCKING
-  #error "When using LWIP_TCPIP_CORE_LOCKING_INPUT, LWIP_TCPIP_CORE_LOCKING must be enabled, too"
+#error "When using LWIP_TCPIP_CORE_LOCKING_INPUT, LWIP_TCPIP_CORE_LOCKING must be enabled, too"
 #endif
 #if LWIP_TCP && LWIP_NETIF_TX_SINGLE_PBUF && !TCP_OVERSIZE
-  #error "LWIP_NETIF_TX_SINGLE_PBUF needs TCP_OVERSIZE enabled to create single-pbuf TCP packets"
+#error "LWIP_NETIF_TX_SINGLE_PBUF needs TCP_OVERSIZE enabled to create single-pbuf TCP packets"
 #endif
 #if LWIP_NETCONN && LWIP_TCP
 #if NETCONN_COPY != TCP_WRITE_FLAG_COPY
-  #error "NETCONN_COPY != TCP_WRITE_FLAG_COPY"
+#error "NETCONN_COPY != TCP_WRITE_FLAG_COPY"
 #endif
 #if NETCONN_MORE != TCP_WRITE_FLAG_MORE
-  #error "NETCONN_MORE != TCP_WRITE_FLAG_MORE"
+#error "NETCONN_MORE != TCP_WRITE_FLAG_MORE"
 #endif
 #endif /* LWIP_NETCONN && LWIP_TCP */
 #if LWIP_SOCKET
-/* Check that the SO_* socket options and SOF_* lwIP-internal flags match */
-#if SO_REUSEADDR != SOF_REUSEADDR
-  #error "WARNING: SO_REUSEADDR != SOF_REUSEADDR"
-#endif
-#if SO_KEEPALIVE != SOF_KEEPALIVE
-  #error "WARNING: SO_KEEPALIVE != SOF_KEEPALIVE"
-#endif
-#if SO_BROADCAST != SOF_BROADCAST
-  #error "WARNING: SO_BROADCAST != SOF_BROADCAST"
-#endif
 #endif /* LWIP_SOCKET */
 
 
 /* Compile-time checks for deprecated options.
  */
 #ifdef MEMP_NUM_TCPIP_MSG
-  #error "MEMP_NUM_TCPIP_MSG option is deprecated. Remove it from your lwipopts.h."
+#error "MEMP_NUM_TCPIP_MSG option is deprecated. Remove it from your lwipopts.h."
 #endif
 #ifdef TCP_REXMIT_DEBUG
-  #error "TCP_REXMIT_DEBUG option is deprecated. Remove it from your lwipopts.h."
+#error "TCP_REXMIT_DEBUG option is deprecated. Remove it from your lwipopts.h."
 #endif
 #ifdef RAW_STATS
-  #error "RAW_STATS option is deprecated. Remove it from your lwipopts.h."
+#error "RAW_STATS option is deprecated. Remove it from your lwipopts.h."
 #endif
 #ifdef ETHARP_QUEUE_FIRST
-  #error "ETHARP_QUEUE_FIRST option is deprecated. Remove it from your lwipopts.h."
+#error "ETHARP_QUEUE_FIRST option is deprecated. Remove it from your lwipopts.h."
 #endif
 #ifdef ETHARP_ALWAYS_INSERT
-  #error "ETHARP_ALWAYS_INSERT option is deprecated. Remove it from your lwipopts.h."
+#error "ETHARP_ALWAYS_INSERT option is deprecated. Remove it from your lwipopts.h."
 #endif
 #if !NO_SYS && LWIP_TCPIP_CORE_LOCKING && LWIP_COMPAT_MUTEX && !defined(LWIP_COMPAT_MUTEX_ALLOWED)
-  #error "LWIP_COMPAT_MUTEX cannot prevent priority inversion. It is recommended to implement priority-aware mutexes. (Define LWIP_COMPAT_MUTEX_ALLOWED to disable this error.)"
+#error "LWIP_COMPAT_MUTEX cannot prevent priority inversion. It is recommended to implement priority-aware mutexes. (Define LWIP_COMPAT_MUTEX_ALLOWED to disable this error.)"
 #endif
 
 #ifndef LWIP_DISABLE_TCP_SANITY_CHECKS
@@ -299,31 +294,31 @@
 #if !LWIP_DISABLE_TCP_SANITY_CHECKS
 #if LWIP_TCP
 #if !MEMP_MEM_MALLOC && (MEMP_NUM_TCP_SEG < TCP_SND_QUEUELEN)
-  #error "lwip_sanity_check: WARNING: MEMP_NUM_TCP_SEG should be at least as big as TCP_SND_QUEUELEN. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
+#error "lwip_sanity_check: WARNING: MEMP_NUM_TCP_SEG should be at least as big as TCP_SND_QUEUELEN. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
 #endif
 #if TCP_SND_BUF < (2 * TCP_MSS)
-  #error "lwip_sanity_check: WARNING: TCP_SND_BUF must be at least as much as (2 * TCP_MSS) for things to work smoothly. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
+#error "lwip_sanity_check: WARNING: TCP_SND_BUF must be at least as much as (2 * TCP_MSS) for things to work smoothly. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
 #endif
 #if TCP_SND_QUEUELEN < (2 * (TCP_SND_BUF / TCP_MSS))
-  #error "lwip_sanity_check: WARNING: TCP_SND_QUEUELEN must be at least as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
+#error "lwip_sanity_check: WARNING: TCP_SND_QUEUELEN must be at least as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
 #endif
 #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."
+#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_SNDLOWAT >= (0xFFFF - (4 * TCP_MSS))
-  #error "lwip_sanity_check: WARNING: TCP_SNDLOWAT must at least be 4*MSS below u16_t overflow!"
+#error "lwip_sanity_check: WARNING: TCP_SNDLOWAT must at least be 4*MSS below u16_t overflow!"
 #endif
 #if TCP_SNDQUEUELOWAT >= TCP_SND_QUEUELEN
-  #error "lwip_sanity_check: WARNING: TCP_SNDQUEUELOWAT must be less than TCP_SND_QUEUELEN. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
+#error "lwip_sanity_check: WARNING: TCP_SNDQUEUELOWAT must be less than TCP_SND_QUEUELEN. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
 #endif
 #if !MEMP_MEM_MALLOC && PBUF_POOL_SIZE && (PBUF_POOL_BUFSIZE <= (PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN))
-  #error "lwip_sanity_check: WARNING: PBUF_POOL_BUFSIZE does not provide enough space for protocol headers. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
+#error "lwip_sanity_check: WARNING: PBUF_POOL_BUFSIZE does not provide enough space for protocol headers. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
 #endif
 #if !MEMP_MEM_MALLOC && PBUF_POOL_SIZE && (TCP_WND > (PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - (PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN))))
-  #error "lwip_sanity_check: WARNING: TCP_WND is larger than space provided by PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - protocol headers). If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
+#error "lwip_sanity_check: WARNING: TCP_WND is larger than space provided by PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - protocol headers). If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
 #endif
 #if TCP_WND < TCP_MSS
-  #error "lwip_sanity_check: WARNING: TCP_WND is smaller than MSS. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
+#error "lwip_sanity_check: WARNING: TCP_WND is smaller than MSS. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
 #endif
 #endif /* LWIP_TCP */
 #endif /* !LWIP_DISABLE_TCP_SANITY_CHECKS */
@@ -339,7 +334,7 @@
 #ifndef LWIP_SKIP_CONST_CHECK
   int a = 0;
   LWIP_UNUSED_ARG(a);
-  LWIP_ASSERT("LWIP_CONST_CAST not implemented correctly. Check your lwIP port.", LWIP_CONST_CAST(void*, &a) == &a);
+  LWIP_ASSERT("LWIP_CONST_CAST not implemented correctly. Check your lwIP port.", LWIP_CONST_CAST(void *, &a) == &a);
 #endif
 #ifndef LWIP_SKIP_PACKING_CHECK
   LWIP_ASSERT("Struct packing not implemented correctly. Check your lwIP port.", sizeof(struct packed_struct_test) == PACKED_STRUCT_TEST_EXPECTED_SIZE);
@@ -378,7 +373,7 @@
 #if PPP_SUPPORT
   ppp_init();
 #endif
- 
+
 #if LWIP_TIMERS
   sys_timeouts_init();
 #endif /* LWIP_TIMERS */
diff --git a/src/core/ip.c b/src/core/ip.c
index 2e02408..18514cf 100644
--- a/src/core/ip.c
+++ b/src/core/ip.c
@@ -4,19 +4,19 @@
  *
  * @defgroup ip IP
  * @ingroup callbackstyle_api
- * 
+ *
  * @defgroup ip4 IPv4
  * @ingroup ip
  *
  * @defgroup ip6 IPv6
  * @ingroup ip
- * 
+ *
  * @defgroup ipaddr IP address handling
  * @ingroup infrastructure
- * 
+ *
  * @defgroup ip4addr IPv4 only
  * @ingroup ipaddr
- * 
+ *
  * @defgroup ip6addr IPv6 only
  * @ingroup ipaddr
  */
@@ -69,6 +69,49 @@
 
 /**
  * @ingroup ipaddr
+ * Convert numeric IP address (both versions) into ASCII representation.
+ * returns ptr to static buffer; not reentrant!
+ *
+ * @param addr ip address in network order to convert
+ * @return pointer to a global static (!) buffer that holds the ASCII
+ *         representation of addr
+ */
+char *ipaddr_ntoa(const ip_addr_t *addr)
+{
+  if (addr == NULL) {
+    return NULL;
+  }
+  if (IP_IS_V6(addr)) {
+    return ip6addr_ntoa(ip_2_ip6(addr));
+  } else {
+    return ip4addr_ntoa(ip_2_ip4(addr));
+  }
+}
+
+/**
+ * @ingroup ipaddr
+ * Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used.
+ *
+ * @param addr ip address in network order to convert
+ * @param buf target buffer where the string is stored
+ * @param buflen length of buf
+ * @return either pointer to buf which now holds the ASCII
+ *         representation of addr or NULL if buf was too small
+ */
+char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
+{
+  if (addr == NULL) {
+    return NULL;
+  }
+  if (IP_IS_V6(addr)) {
+    return ip6addr_ntoa_r(ip_2_ip6(addr), buf, buflen);
+  } else {
+    return ip4addr_ntoa_r(ip_2_ip4(addr), buf, buflen);
+  }
+}
+
+/**
+ * @ingroup ipaddr
  * Convert IP address string (both versions) to numeric.
  * The version is auto-detected from the string.
  *
@@ -80,7 +123,7 @@
 ipaddr_aton(const char *cp, ip_addr_t *addr)
 {
   if (cp != NULL) {
-    const char* c;
+    const char *c;
     for (c = cp; *c != 0; c++) {
       if (*c == ':') {
         /* contains a colon: IPv6 address */
diff --git a/src/core/ipv4/autoip.c b/src/core/ipv4/autoip.c
index 10db8a3..9f7139b 100644
--- a/src/core/ipv4/autoip.c
+++ b/src/core/ipv4/autoip.c
@@ -22,7 +22,7 @@
  * With DHCP:
  * - define @ref LWIP_DHCP_AUTOIP_COOP 1 in your lwipopts.h.
  * - Configure your DHCP Client.
- * 
+ *
  * @see netifapi_autoip
  */
 
@@ -95,7 +95,7 @@
 static void autoip_start_probing(struct netif *netif);
 
 /**
- * @ingroup autoip 
+ * @ingroup autoip
  * Set a statically allocated struct autoip to work with.
  * Using this prevents autoip_start to allocate it using mem_malloc.
  *
@@ -105,6 +105,7 @@
 void
 autoip_set_struct(struct netif *netif, struct autoip *autoip)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("netif != NULL", netif != NULL);
   LWIP_ASSERT("autoip != NULL", autoip != NULL);
   LWIP_ASSERT("netif already has a struct autoip set",
@@ -123,7 +124,7 @@
 static void
 autoip_restart(struct netif *netif)
 {
-  struct autoip* autoip = netif_autoip_data(netif);
+  struct autoip *autoip = netif_autoip_data(netif);
   autoip->tried_llipaddr++;
   autoip_start(netif);
 }
@@ -134,7 +135,7 @@
 static void
 autoip_handle_arp_conflict(struct netif *netif)
 {
-  struct autoip* autoip = netif_autoip_data(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
@@ -146,13 +147,13 @@
   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"));
+                ("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_handle_arp_conflict(): we are defend, send ARP Announce\n"));
     autoip_arp_announce(netif);
     autoip->lastconflict = DEFEND_INTERVAL * AUTOIP_TICKS_PER_SECOND;
   }
@@ -167,7 +168,7 @@
 static void
 autoip_create_addr(struct netif *netif, ip4_addr_t *ipaddr)
 {
-  struct autoip* autoip = netif_autoip_data(netif);
+  struct autoip *autoip = netif_autoip_data(netif);
 
   /* Here we create an IP-Address out of range 169.254.1.0 to 169.254.254.255
    * compliant to RFC 3927 Section 2.1
@@ -185,13 +186,13 @@
     addr -= AUTOIP_RANGE_END - AUTOIP_RANGE_START + 1;
   }
   LWIP_ASSERT("AUTOIP address not in range", (addr >= AUTOIP_RANGE_START) &&
-    (addr <= AUTOIP_RANGE_END));
+              (addr <= AUTOIP_RANGE_END));
   ip4_addr_set_u32(ipaddr, lwip_htonl(addr));
 
   LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
-    ("autoip_create_addr(): tried_llipaddr=%"U16_F", %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
-    (u16_t)(autoip->tried_llipaddr), ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr),
-    ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr)));
+              ("autoip_create_addr(): tried_llipaddr=%"U16_F", %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
+               (u16_t)(autoip->tried_llipaddr), ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr),
+               ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr)));
 }
 
 /**
@@ -202,7 +203,7 @@
 static err_t
 autoip_arp_probe(struct netif *netif)
 {
-  struct autoip* autoip = netif_autoip_data(netif);
+  struct autoip *autoip = netif_autoip_data(netif);
   /* this works because netif->ip_addr is ANY */
   return etharp_request(netif, &autoip->llipaddr);
 }
@@ -226,14 +227,14 @@
 static err_t
 autoip_bind(struct netif *netif)
 {
-  struct autoip* autoip = netif_autoip_data(netif);
+  struct autoip *autoip = netif_autoip_data(netif);
   ip4_addr_t sn_mask, gw_addr;
 
   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,
-    ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr),
-    ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr)));
+              ("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,
+               ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr),
+               ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr)));
 
   IP4_ADDR(&sn_mask, 255, 255, 0, 0);
   IP4_ADDR(&gw_addr, 0, 0, 0, 0);
@@ -245,7 +246,7 @@
 }
 
 /**
- * @ingroup autoip 
+ * @ingroup autoip
  * Start AutoIP client
  *
  * @param netif network interface on which start the AutoIP client
@@ -253,9 +254,10 @@
 err_t
 autoip_start(struct netif *netif)
 {
-  struct autoip* autoip = netif_autoip_data(netif);
+  struct autoip *autoip = netif_autoip_data(netif);
   err_t result = ERR_OK;
 
+  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
@@ -264,19 +266,18 @@
   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));
+              ("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,
-      ("autoip_start(): starting new AUTOIP client\n"));
-    autoip = (struct autoip *)mem_malloc(sizeof(struct autoip));
+                ("autoip_start(): starting new AUTOIP client\n"));
+    autoip = (struct autoip *)mem_calloc(1, sizeof(struct autoip));
     if (autoip == NULL) {
       LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
-        ("autoip_start(): could not allocate autoip\n"));
+                  ("autoip_start(): could not allocate autoip\n"));
       return ERR_MEM;
     }
-    memset(autoip, 0, sizeof(struct autoip));
     /* 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"));
@@ -297,14 +298,14 @@
 static void
 autoip_start_probing(struct netif *netif)
 {
-  struct autoip* autoip = netif_autoip_data(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)));
+              ("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.
@@ -331,7 +332,7 @@
 void
 autoip_network_changed(struct netif *netif)
 {
-  struct autoip* autoip = netif_autoip_data(netif);
+  struct autoip *autoip = netif_autoip_data(netif);
 
   if (autoip && (autoip->state != AUTOIP_STATE_OFF)) {
     autoip_start_probing(netif);
@@ -339,7 +340,7 @@
 }
 
 /**
- * @ingroup autoip 
+ * @ingroup autoip
  * Stop AutoIP client
  *
  * @param netif network interface on which stop the AutoIP client
@@ -347,8 +348,9 @@
 err_t
 autoip_stop(struct netif *netif)
 {
-  struct autoip* autoip = netif_autoip_data(netif);
+  struct autoip *autoip = netif_autoip_data(netif);
 
+  LWIP_ASSERT_CORE_LOCKED();
   if (autoip != NULL) {
     autoip->state = AUTOIP_STATE_OFF;
     if (ip4_addr_islinklocal(netif_ip4_addr(netif))) {
@@ -364,10 +366,10 @@
 void
 autoip_tmr(void)
 {
-  struct netif *netif = netif_list;
+  struct netif *netif;
   /* loop through netif's */
-  while (netif != NULL) {
-    struct autoip* autoip = netif_autoip_data(netif);
+  NETIF_FOREACH(netif) {
+    struct autoip *autoip = netif_autoip_data(netif);
     /* only act on AutoIP configured interfaces */
     if (autoip != NULL) {
       if (autoip->lastconflict > 0) {
@@ -375,14 +377,14 @@
       }
 
       LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
-        ("autoip_tmr() AutoIP-State: %"U16_F", ttw=%"U16_F"\n",
-        (u16_t)(autoip->state), autoip->ttw));
+                  ("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) {
+      switch (autoip->state) {
         case AUTOIP_STATE_PROBING:
           if (autoip->ttw == 0) {
             if (autoip->sent_num >= PROBE_NUM) {
@@ -394,9 +396,9 @@
               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)));
+                          ("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"));
@@ -407,8 +409,8 @@
               } 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);
+                                       ((PROBE_MAX - PROBE_MIN) * AUTOIP_TICKS_PER_SECOND) ) +
+                                      PROBE_MIN * AUTOIP_TICKS_PER_SECOND);
               }
             }
           }
@@ -422,13 +424,13 @@
             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)));
+              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;
@@ -438,8 +440,6 @@
           break;
       }
     }
-    /* proceed to next network interface */
-    netif = netif->next;
   }
 }
 
@@ -452,49 +452,49 @@
 void
 autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr)
 {
-  struct autoip* autoip = netif_autoip_data(netif);
+  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
-    */
+    /* 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;
-    ETHADDR16_COPY(netifaddr.addr, netif->hwaddr);
+    SMEMCPY(netifaddr.addr, netif->hwaddr, ETH_HWADDR_LEN);
 
-    /* Copy struct ip4_addr2 to aligned ip4_addr, to support compilers without
+    /* Copy struct ip4_addr_wordaligned to aligned ip4_addr, to support compilers without
      * structure packing (not using structure copy which breaks strict-aliasing rules).
      */
-    IPADDR2_COPY(&sipaddr, &hdr->sipaddr);
-    IPADDR2_COPY(&dipaddr, &hdr->dipaddr);
+    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
-      */
+      /* 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_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
-      */
+      /* 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_arp_reply(): Conflicting ARP-Packet detected\n"));
         autoip_handle_arp_conflict(netif);
       }
     }
@@ -511,7 +511,7 @@
 autoip_supplied_address(const struct netif *netif)
 {
   if ((netif != NULL) && (netif_autoip_data(netif) != NULL)) {
-    struct autoip* autoip = netif_autoip_data(netif);
+    struct autoip *autoip = netif_autoip_data(netif);
     return (autoip->state == AUTOIP_STATE_BOUND) || (autoip->state == AUTOIP_STATE_ANNOUNCING);
   }
   return 0;
@@ -520,7 +520,7 @@
 u8_t
 autoip_accept_packet(struct netif *netif, const ip4_addr_t *addr)
 {
-  struct autoip* autoip = netif_autoip_data(netif);
+  struct autoip *autoip = netif_autoip_data(netif);
   return (autoip != NULL) && ip4_addr_cmp(addr, &(autoip->llipaddr));
 }
 
diff --git a/src/core/ipv4/dhcp.c b/src/core/ipv4/dhcp.c
index 0cf97b0..534574f 100644
--- a/src/core/ipv4/dhcp.c
+++ b/src/core/ipv4/dhcp.c
@@ -21,6 +21,9 @@
  * Use dhcp_release() to end the lease and use dhcp_stop()
  * to remove the DHCP client.
  *
+ * @see LWIP_HOOK_DHCP_APPEND_OPTIONS
+ * @see LWIP_HOOK_DHCP_PARSE_OPTION
+ *
  * @see netifapi_dhcp4
  */
 
@@ -75,9 +78,20 @@
 #include "lwip/dns.h"
 #include "lwip/etharp.h"
 #include "lwip/prot/dhcp.h"
+#include "lwip/prot/iana.h"
 
 #include <string.h>
 
+#ifdef LWIP_HOOK_FILENAME
+#include LWIP_HOOK_FILENAME
+#endif
+#ifndef LWIP_HOOK_DHCP_APPEND_OPTIONS
+#define LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, state, msg, msg_type, options_len_ptr)
+#endif
+#ifndef LWIP_HOOK_DHCP_PARSE_OPTION
+#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_CREATE_RAND_XID: if this is set to 1, the xid is created using
  * LWIP_RAND() (this overrides DHCP_GLOBAL_XID)
  */
@@ -156,7 +170,7 @@
 #if LWIP_DHCP_GET_NTP_SRV
   , DHCP_OPTION_NTP
 #endif /* LWIP_DHCP_GET_NTP_SRV */
-  };
+};
 
 #ifdef DHCP_GLOBAL_XID
 static u32_t xid;
@@ -194,20 +208,18 @@
 
 /* build outgoing messages */
 /* create a DHCP message, fill in common headers */
-static err_t dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type);
-/* free a DHCP request */
-static void dhcp_delete_msg(struct dhcp *dhcp);
+static struct pbuf *dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type, u16_t *options_out_len);
 /* add a DHCP option (type, then length in bytes) */
-static void dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len);
+static u16_t dhcp_option(u16_t options_out_len, u8_t *options, u8_t option_type, u8_t option_len);
 /* add option values */
-static void dhcp_option_byte(struct dhcp *dhcp, u8_t value);
-static void dhcp_option_short(struct dhcp *dhcp, u16_t value);
-static void dhcp_option_long(struct dhcp *dhcp, u32_t value);
+static u16_t dhcp_option_byte(u16_t options_out_len, u8_t *options, u8_t value);
+static u16_t dhcp_option_short(u16_t options_out_len, u8_t *options, u16_t value);
+static u16_t dhcp_option_long(u16_t options_out_len, u8_t *options, u32_t value);
 #if LWIP_NETIF_HOSTNAME
-static void dhcp_option_hostname(struct dhcp *dhcp, struct netif *netif);
+static u16_t dhcp_option_hostname(u16_t options_out_len, u8_t *options, struct netif *netif);
 #endif /* LWIP_NETIF_HOSTNAME */
 /* always add the DHCP options trailer to end and pad */
-static void dhcp_option_trailer(struct dhcp *dhcp);
+static void dhcp_option_trailer(u16_t options_out_len, u8_t *options, struct pbuf *p_out);
 
 /** Ensure DHCP PCB is allocated and bound */
 static err_t
@@ -226,8 +238,8 @@
     ip_set_option(dhcp_pcb, SOF_BROADCAST);
 
     /* set up local and remote port for the pcb -> listen on all interfaces on all src/dest IPs */
-    udp_bind(dhcp_pcb, IP4_ADDR_ANY, DHCP_CLIENT_PORT);
-    udp_connect(dhcp_pcb, IP4_ADDR_ANY, DHCP_SERVER_PORT);
+    udp_bind(dhcp_pcb, IP4_ADDR_ANY, LWIP_IANA_PORT_DHCP_CLIENT);
+    udp_connect(dhcp_pcb, IP4_ADDR_ANY, LWIP_IANA_PORT_DHCP_SERVER);
     udp_recv(dhcp_pcb, dhcp_recv, NULL);
   }
 
@@ -267,7 +279,7 @@
   struct dhcp *dhcp = netif_dhcp_data(netif);
 
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_nak(netif=%p) %c%c%"U16_F"\n",
-    (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
+              (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
   /* Change to a defined state - set this before assigning the address
      to ensure the callback can use dhcp_supplied_address() */
   dhcp_set_state(dhcp, DHCP_STATE_BACKING_OFF);
@@ -294,7 +306,7 @@
   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]));
+              (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. */
@@ -306,7 +318,7 @@
     dhcp->tries++;
   }
   msecs = 500;
-  dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
+  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));
 }
 #endif /* DHCP_DOES_ARP_CHECK */
@@ -317,26 +329,28 @@
  * @param netif the netif under DHCP control
  */
 static void
-dhcp_handle_offer(struct netif *netif)
+dhcp_handle_offer(struct netif *netif, struct dhcp_msg *msg_in)
 {
   struct dhcp *dhcp = netif_dhcp_data(netif);
 
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_offer(netif=%p) %c%c%"U16_F"\n",
-    (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
+              (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
   /* obtain the server address */
   if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) {
+    dhcp->request_timeout = 0; /* stop timer */
+
     ip_addr_set_ip4_u32(&dhcp->server_ip_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SERVER_ID)));
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): server 0x%08"X32_F"\n",
-      ip4_addr_get_u32(ip_2_ip4(&dhcp->server_ip_addr))));
+                ip4_addr_get_u32(ip_2_ip4(&dhcp->server_ip_addr))));
     /* remember offered address */
-    ip4_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
+    ip4_addr_copy(dhcp->offered_ip_addr, msg_in->yiaddr);
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): offer for 0x%08"X32_F"\n",
-      ip4_addr_get_u32(&dhcp->offered_ip_addr)));
+                ip4_addr_get_u32(&dhcp->offered_ip_addr)));
 
     dhcp_select(netif);
   } else {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
-      ("dhcp_handle_offer(netif=%p) did not get server ID!\n", (void*)netif));
+                ("dhcp_handle_offer(netif=%p) did not get server ID!\n", (void *)netif));
   }
 }
 
@@ -351,52 +365,59 @@
 static err_t
 dhcp_select(struct netif *netif)
 {
-  struct dhcp *dhcp = netif_dhcp_data(netif);
+  struct dhcp *dhcp;
   err_t result;
   u16_t msecs;
   u8_t i;
+  struct pbuf *p_out;
+  u16_t options_out_len;
 
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_select(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
+  LWIP_ERROR("dhcp_select: netif != NULL", (netif != NULL), return ERR_ARG;);
+  dhcp = netif_dhcp_data(netif);
+  LWIP_ERROR("dhcp_select: dhcp != NULL", (dhcp != NULL), return ERR_VAL;);
+
+  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_select(netif=%p) %c%c%"U16_F"\n", (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
   dhcp_set_state(dhcp, DHCP_STATE_REQUESTING);
 
   /* create and initialize the DHCP message header */
-  result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
-  if (result == ERR_OK) {
-    dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
-    dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
+  p_out = dhcp_create_msg(netif, dhcp, DHCP_REQUEST, &options_out_len);
+  if (p_out != NULL) {
+    struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload;
+    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));
 
     /* MUST request the offered IP address */
-    dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
-    dhcp_option_long(dhcp, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
+    options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_REQUESTED_IP, 4);
+    options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
 
-    dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4);
-    dhcp_option_long(dhcp, lwip_ntohl(ip4_addr_get_u32(ip_2_ip4(&dhcp->server_ip_addr))));
+    options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_SERVER_ID, 4);
+    options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(ip_2_ip4(&dhcp->server_ip_addr))));
 
-    dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));
+    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++) {
-      dhcp_option_byte(dhcp, dhcp_discover_request_options[i]);
+      options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]);
     }
 
 #if LWIP_NETIF_HOSTNAME
-    dhcp_option_hostname(dhcp, netif);
+    options_out_len = dhcp_option_hostname(options_out_len, msg_out->options, netif);
 #endif /* LWIP_NETIF_HOSTNAME */
 
-    dhcp_option_trailer(dhcp);
-    /* shrink the pbuf to the actual content length */
-    pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
+    LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_REQUESTING, msg_out, DHCP_REQUEST, &options_out_len);
+    dhcp_option_trailer(options_out_len, msg_out->options, p_out);
 
     /* send broadcast to any DHCP server */
-    udp_sendto_if_src(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif, IP4_ADDR_ANY);
-    dhcp_delete_msg(dhcp);
+    result = udp_sendto_if_src(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif, IP4_ADDR_ANY);
+    pbuf_free(p_out);
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_select: REQUESTING\n"));
   } else {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_select: could not allocate DHCP request\n"));
+    result = ERR_MEM;
   }
   if (dhcp->tries < 255) {
     dhcp->tries++;
   }
-  msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000;
-  dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
+  msecs = (u16_t)((dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000);
+  dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_select(): set request timeout %"U16_F" msecs\n", msecs));
   return result;
 }
@@ -408,10 +429,10 @@
 void
 dhcp_coarse_tmr(void)
 {
-  struct netif *netif = netif_list;
+  struct netif *netif;
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_coarse_tmr()\n"));
   /* iterate through all network interfaces */
-  while (netif != NULL) {
+  NETIF_FOREACH(netif) {
     /* only act on DHCP configured interfaces */
     struct dhcp *dhcp = netif_dhcp_data(netif);
     if ((dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF)) {
@@ -419,22 +440,20 @@
       if (dhcp->t0_timeout && (++dhcp->lease_used == dhcp->t0_timeout)) {
         LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t0 timeout\n"));
         /* this clients' lease time has expired */
-        dhcp_release(netif);
-        dhcp_discover(netif);
-      /* timer is active (non zero), and triggers (zeroes) now? */
+        dhcp_release_and_stop(netif);
+        dhcp_start(netif);
+        /* timer is active (non zero), and triggers (zeroes) now? */
       } else if (dhcp->t2_rebind_time && (dhcp->t2_rebind_time-- == 1)) {
         LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t2 timeout\n"));
         /* this clients' rebind timeout triggered */
         dhcp_t2_timeout(netif);
-      /* timer is active (non zero), and triggers (zeroes) now */
+        /* timer is active (non zero), and triggers (zeroes) now */
       } else if (dhcp->t1_renew_time && (dhcp->t1_renew_time-- == 1)) {
         LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t1 timeout\n"));
         /* this clients' renewal timeout triggered */
         dhcp_t1_timeout(netif);
       }
     }
-    /* proceed to next netif */
-    netif = netif->next;
   }
 }
 
@@ -448,26 +467,23 @@
 void
 dhcp_fine_tmr(void)
 {
-  struct netif *netif = netif_list;
+  struct netif *netif;
   /* loop through netif's */
-  while (netif != NULL) {
+  NETIF_FOREACH(netif) {
     struct dhcp *dhcp = netif_dhcp_data(netif);
     /* only act on DHCP configured interfaces */
     if (dhcp != NULL) {
       /* timer is active (non zero), and is about to trigger now */
       if (dhcp->request_timeout > 1) {
         dhcp->request_timeout--;
-      }
-      else if (dhcp->request_timeout == 1) {
+      } else if (dhcp->request_timeout == 1) {
         dhcp->request_timeout--;
-        /* { netif->dhcp->request_timeout == 0 } */
+        /* { dhcp->request_timeout == 0 } */
         LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_fine_tmr(): request timeout\n"));
         /* this client's request timeout triggered */
         dhcp_timeout(netif);
       }
     }
-    /* proceed to next network interface */
-    netif = netif->next;
   }
 }
 
@@ -489,24 +505,24 @@
   if ((dhcp->state == DHCP_STATE_BACKING_OFF) || (dhcp->state == DHCP_STATE_SELECTING)) {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout(): restarting discovery\n"));
     dhcp_discover(netif);
-  /* receiving the requested lease timed out */
+    /* receiving the requested lease timed out */
   } else if (dhcp->state == DHCP_STATE_REQUESTING) {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REQUESTING, DHCP request timed out\n"));
     if (dhcp->tries <= 5) {
       dhcp_select(netif);
     } else {
       LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REQUESTING, releasing, restarting\n"));
-      dhcp_release(netif);
-      dhcp_discover(netif);
+      dhcp_release_and_stop(netif);
+      dhcp_start(netif);
     }
 #if DHCP_DOES_ARP_CHECK
-  /* received no ARP reply for the offered address (which is good) */
+    /* 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 */
+      /* 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);
@@ -542,9 +558,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 = ((dhcp->t2_timeout - dhcp->lease_used) / 2);
+    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);
     }
   }
 }
@@ -569,9 +584,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 = ((dhcp->t0_timeout - dhcp->lease_used) / 2);
+    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);
     }
   }
 }
@@ -582,7 +596,7 @@
  * @param netif the netif under DHCP control
  */
 static void
-dhcp_handle_ack(struct netif *netif)
+dhcp_handle_ack(struct netif *netif, struct dhcp_msg *msg_in)
 {
   struct dhcp *dhcp = netif_dhcp_data(netif);
 
@@ -624,12 +638,12 @@
   }
 
   /* (y)our internet address */
-  ip4_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
+  ip4_addr_copy(dhcp->offered_ip_addr, msg_in->yiaddr);
 
 #if LWIP_DHCP_BOOTP_FILE
   /* copy boot server address,
      boot file name copied in dhcp_parse_reply if not overloaded */
-  ip4_addr_copy(dhcp->offered_si_addr, dhcp->msg_in->siaddr);
+  ip4_addr_copy(dhcp->offered_si_addr, msg_in->siaddr);
 #endif /* LWIP_DHCP_BOOTP_FILE */
 
   /* subnet mask given? */
@@ -658,7 +672,7 @@
   /* DNS servers */
   for (n = 0; (n < LWIP_DHCP_PROVIDE_DNS_SERVERS) && dhcp_option_given(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n); n++) {
     ip_addr_t dns_addr;
-    ip_addr_set_ip4_u32(&dns_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n)));
+    ip_addr_set_ip4_u32_val(dns_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n)));
     dns_setserver(n, &dns_addr);
   }
 #endif /* LWIP_DHCP_PROVIDE_DNS_SERVERS */
@@ -675,6 +689,7 @@
 void
 dhcp_set_struct(struct netif *netif, struct dhcp *dhcp)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("netif != NULL", netif != NULL);
   LWIP_ASSERT("dhcp != NULL", dhcp != NULL);
   LWIP_ASSERT("netif already has a struct dhcp set", netif_dhcp_data(netif) == NULL);
@@ -696,6 +711,7 @@
  */
 void dhcp_cleanup(struct netif *netif)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("netif != NULL", netif != NULL);
 
   if (netif_dhcp_data(netif) != NULL) {
@@ -723,10 +739,11 @@
   struct dhcp *dhcp;
   err_t result;
 
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;);
   LWIP_ERROR("netif is not up, old style port?", netif_is_up(netif), return ERR_ARG;);
   dhcp = netif_dhcp_data(netif);
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
+  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(netif=%p) %c%c%"U16_F"\n", (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
 
   /* check MTU of the netif */
   if (netif->mtu < DHCP_MAX_MSG_LEN_MIN_REQUIRED) {
@@ -746,11 +763,9 @@
     /* 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"));
-  /* already has DHCP client attached */
+    /* already has DHCP client attached */
   } else {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(): restarting DHCP configuration\n"));
-    LWIP_ASSERT("pbuf p_out wasn't freed", dhcp->p_out == NULL);
-    LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL );
 
     if (dhcp->pcb_allocated != 0) {
       dhcp_dec_pcb_refcount(); /* free DHCP PCB if not needed any more */
@@ -769,20 +784,17 @@
   }
   dhcp->pcb_allocated = 1;
 
-#if LWIP_DHCP_CHECK_LINK_UP
   if (!netif_is_link_up(netif)) {
     /* set state INIT and wait for dhcp_network_changed() to call dhcp_discover() */
     dhcp_set_state(dhcp, DHCP_STATE_INIT);
     return ERR_OK;
   }
-#endif /* LWIP_DHCP_CHECK_LINK_UP */
-
 
   /* (re)start the DHCP negotiation */
   result = dhcp_discover(netif);
   if (result != ERR_OK) {
     /* free resources allocated above */
-    dhcp_stop(netif);
+    dhcp_release_and_stop(netif);
     return ERR_MEM;
   }
   return result;
@@ -802,8 +814,10 @@
 dhcp_inform(struct netif *netif)
 {
   struct dhcp dhcp;
-  err_t result = ERR_OK;
+  struct pbuf *p_out;
+  u16_t options_out_len;
 
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ERROR("netif != NULL", (netif != NULL), return;);
 
   if (dhcp_inc_pcb_refcount() != ERR_OK) { /* ensure DHCP PCB is allocated */
@@ -814,20 +828,20 @@
   dhcp_set_state(&dhcp, DHCP_STATE_INFORMING);
 
   /* create and initialize the DHCP message header */
-  result = dhcp_create_msg(netif, &dhcp, DHCP_INFORM);
-  if (result == ERR_OK) {
-    dhcp_option(&dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
-    dhcp_option_short(&dhcp, DHCP_MAX_MSG_LEN(netif));
+  p_out = dhcp_create_msg(netif, &dhcp, DHCP_INFORM, &options_out_len);
+  if (p_out != NULL) {
+    struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload;
+    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));
 
-    dhcp_option_trailer(&dhcp);
-
-    pbuf_realloc(dhcp.p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp.options_out_len);
+    LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, &dhcp, DHCP_STATE_INFORMING, msg_out, DHCP_INFORM, &options_out_len);
+    dhcp_option_trailer(options_out_len, msg_out->options, p_out);
 
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_inform: INFORMING\n"));
 
-    udp_sendto_if(dhcp_pcb, dhcp.p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
+    udp_sendto_if(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif);
 
-    dhcp_delete_msg(&dhcp);
+    pbuf_free(p_out);
   } else {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_inform: could not allocate DHCP request\n"));
   }
@@ -845,33 +859,35 @@
 {
   struct dhcp *dhcp = netif_dhcp_data(netif);
 
-  if (!dhcp)
+  if (!dhcp) {
     return;
+  }
   switch (dhcp->state) {
-  case DHCP_STATE_REBINDING:
-  case DHCP_STATE_RENEWING:
-  case DHCP_STATE_BOUND:
-  case DHCP_STATE_REBOOTING:
-    dhcp->tries = 0;
-    dhcp_reboot(netif);
-    break;
-  case DHCP_STATE_OFF:
-    /* stay off */
-    break;
-  default:
-    /* 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 */
+    case DHCP_STATE_REBINDING:
+    case DHCP_STATE_RENEWING:
+    case DHCP_STATE_BOUND:
+    case DHCP_STATE_REBOOTING:
+      dhcp->tries = 0;
+      dhcp_reboot(netif);
+      break;
+    case DHCP_STATE_OFF:
+      /* stay off */
+      break;
+    default:
+      LWIP_ASSERT("invalid dhcp->state", dhcp->state <= DHCP_STATE_BACKING_OFF);
+      /* 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;
-    }
+      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);
-    break;
+      /* ensure we start with short timeouts, even if already discovering */
+      dhcp->tries = 0;
+      dhcp_discover(netif);
+      break;
   }
 }
 
@@ -894,13 +910,13 @@
   /* 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)));
+                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_arp_reply(): arp reply matched with offered address, declining\n"));
       dhcp_decline(netif);
     }
   }
@@ -919,33 +935,37 @@
 dhcp_decline(struct netif *netif)
 {
   struct dhcp *dhcp = netif_dhcp_data(netif);
-  err_t result = ERR_OK;
+  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 */
-  result = dhcp_create_msg(netif, dhcp, DHCP_DECLINE);
-  if (result == ERR_OK) {
-    dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
-    dhcp_option_long(dhcp, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
+  p_out = dhcp_create_msg(netif, dhcp, DHCP_DECLINE, &options_out_len);
+  if (p_out != NULL) {
+    struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload;
+    options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_REQUESTED_IP, 4);
+    options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
 
-    dhcp_option_trailer(dhcp);
-    /* resize pbuf to reflect true size of options */
-    pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
+    LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_BACKING_OFF, msg_out, DHCP_DECLINE, &options_out_len);
+    dhcp_option_trailer(options_out_len, msg_out->options, p_out);
 
     /* per section 4.4.4, broadcast DECLINE messages */
-    udp_sendto_if_src(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif, IP4_ADDR_ANY);
-    dhcp_delete_msg(dhcp);
+    result = udp_sendto_if_src(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif, IP4_ADDR_ANY);
+    pbuf_free(p_out);
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_decline: BACKING OFF\n"));
   } else {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
-      ("dhcp_decline: could not allocate DHCP request\n"));
+                ("dhcp_decline: could not allocate DHCP request\n"));
+    result = ERR_MEM;
   }
   if (dhcp->tries < 255) {
     dhcp->tries++;
   }
-  msecs = 10*1000;
-  dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
+  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;
 }
@@ -964,30 +984,33 @@
   err_t result = ERR_OK;
   u16_t msecs;
   u8_t i;
+  struct pbuf *p_out;
+  u16_t options_out_len;
+
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover()\n"));
+
   ip4_addr_set_any(&dhcp->offered_ip_addr);
   dhcp_set_state(dhcp, DHCP_STATE_SELECTING);
   /* create and initialize the DHCP message header */
-  result = dhcp_create_msg(netif, dhcp, DHCP_DISCOVER);
-  if (result == ERR_OK) {
+  p_out = dhcp_create_msg(netif, dhcp, DHCP_DISCOVER, &options_out_len);
+  if (p_out != NULL) {
+    struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload;
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: making request\n"));
 
-    dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
-    dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
+    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));
 
-    dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));
+    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++) {
-      dhcp_option_byte(dhcp, dhcp_discover_request_options[i]);
+      options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]);
     }
-    dhcp_option_trailer(dhcp);
+    LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_SELECTING, msg_out, DHCP_DISCOVER, &options_out_len);
+    dhcp_option_trailer(options_out_len, msg_out->options, p_out);
 
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: realloc()ing\n"));
-    pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
-
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, DHCP_SERVER_PORT)\n"));
-    udp_sendto_if_src(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif, IP4_ADDR_ANY);
+    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"));
-    dhcp_delete_msg(dhcp);
+    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"));
@@ -1001,8 +1024,8 @@
     autoip_start(netif);
   }
 #endif /* LWIP_DHCP_AUTOIP_COOP */
-  msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000;
-  dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
+  msecs = (u16_t)((dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000);
+  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;
 }
@@ -1022,23 +1045,23 @@
   LWIP_ERROR("dhcp_bind: netif != NULL", (netif != NULL), return;);
   dhcp = netif_dhcp_data(netif);
   LWIP_ERROR("dhcp_bind: dhcp != NULL", (dhcp != NULL), return;);
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
+  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(netif=%p) %c%c%"U16_F"\n", (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
 
   /* reset time used of lease */
   dhcp->lease_used = 0;
 
   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;
-     }
-     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t0_lease*1000));
+    /* 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;
+    }
+    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t0_lease * 1000));
   }
 
   /* temporary DHCP lease? */
@@ -1053,7 +1076,7 @@
     if (dhcp->t1_timeout == 0) {
       dhcp->t1_timeout = 1;
     }
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t1_renew*1000));
+    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 */
@@ -1067,7 +1090,7 @@
     if (dhcp->t2_timeout == 0) {
       dhcp->t2_timeout = 1;
     }
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t2_rebind*1000));
+    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;
   }
 
@@ -1108,7 +1131,7 @@
 #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)));
+              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
      to ensure the callback can use dhcp_supplied_address() */
   dhcp_set_state(dhcp, DHCP_STATE_BOUND);
@@ -1130,42 +1153,46 @@
   err_t result;
   u16_t msecs;
   u8_t i;
+  struct pbuf *p_out;
+  u16_t options_out_len;
+
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_renew()\n"));
   dhcp_set_state(dhcp, DHCP_STATE_RENEWING);
 
   /* create and initialize the DHCP message header */
-  result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
-  if (result == ERR_OK) {
-    dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
-    dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
+  p_out = dhcp_create_msg(netif, dhcp, DHCP_REQUEST, &options_out_len);
+  if (p_out != NULL) {
+    struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload;
+    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));
 
-    dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));
+    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++) {
-      dhcp_option_byte(dhcp, dhcp_discover_request_options[i]);
+      options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]);
     }
 
 #if LWIP_NETIF_HOSTNAME
-    dhcp_option_hostname(dhcp, netif);
+    options_out_len = dhcp_option_hostname(options_out_len, msg_out->options, netif);
 #endif /* LWIP_NETIF_HOSTNAME */
 
-    /* append DHCP message trailer */
-    dhcp_option_trailer(dhcp);
+    LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_RENEWING, msg_out, DHCP_REQUEST, &options_out_len);
+    dhcp_option_trailer(options_out_len, msg_out->options, p_out);
 
-    pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
-
-    udp_sendto_if(dhcp_pcb, dhcp->p_out, &dhcp->server_ip_addr, DHCP_SERVER_PORT, netif);
-    dhcp_delete_msg(dhcp);
+    result = udp_sendto_if(dhcp_pcb, p_out, &dhcp->server_ip_addr, LWIP_IANA_PORT_DHCP_SERVER, netif);
+    pbuf_free(p_out);
 
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew: RENEWING\n"));
   } else {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_renew: could not allocate DHCP request\n"));
+    result = ERR_MEM;
   }
   if (dhcp->tries < 255) {
     dhcp->tries++;
   }
   /* back-off on retries, but to a maximum of 20 seconds */
-  msecs = dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000;
-  dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
+  msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000);
+  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_renew(): set request timeout %"U16_F" msecs\n", msecs));
   return result;
 }
@@ -1182,40 +1209,44 @@
   err_t result;
   u16_t msecs;
   u8_t i;
+  struct pbuf *p_out;
+  u16_t options_out_len;
+
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind()\n"));
   dhcp_set_state(dhcp, DHCP_STATE_REBINDING);
 
   /* create and initialize the DHCP message header */
-  result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
-  if (result == ERR_OK) {
-    dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
-    dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
+  p_out = dhcp_create_msg(netif, dhcp, DHCP_REQUEST, &options_out_len);
+  if (p_out != NULL) {
+    struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload;
+    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));
 
-    dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));
+    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++) {
-      dhcp_option_byte(dhcp, dhcp_discover_request_options[i]);
+      options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]);
     }
 
 #if LWIP_NETIF_HOSTNAME
-    dhcp_option_hostname(dhcp, netif);
+    options_out_len = dhcp_option_hostname(options_out_len, msg_out->options, netif);
 #endif /* LWIP_NETIF_HOSTNAME */
 
-    dhcp_option_trailer(dhcp);
-
-    pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
+    LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_REBINDING, msg_out, DHCP_DISCOVER, &options_out_len);
+    dhcp_option_trailer(options_out_len, msg_out->options, p_out);
 
     /* broadcast to server */
-    udp_sendto_if(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
-    dhcp_delete_msg(dhcp);
+    result = udp_sendto_if(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif);
+    pbuf_free(p_out);
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind: REBINDING\n"));
   } else {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_rebind: could not allocate DHCP request\n"));
+    result = ERR_MEM;
   }
   if (dhcp->tries < 255) {
     dhcp->tries++;
   }
-  msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
-  dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
+  msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000);
+  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_rebind(): set request timeout %"U16_F" msecs\n", msecs));
   return result;
 }
@@ -1232,68 +1263,76 @@
   err_t result;
   u16_t msecs;
   u8_t i;
+  struct pbuf *p_out;
+  u16_t options_out_len;
+
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot()\n"));
   dhcp_set_state(dhcp, DHCP_STATE_REBOOTING);
 
   /* create and initialize the DHCP message header */
-  result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
-  if (result == ERR_OK) {
-    dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
-    dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN_MIN_REQUIRED);
+  p_out = dhcp_create_msg(netif, dhcp, DHCP_REQUEST, &options_out_len);
+  if (p_out != NULL) {
+    struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload;
+    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_MIN_REQUIRED);
 
-    dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
-    dhcp_option_long(dhcp, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
+    options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_REQUESTED_IP, 4);
+    options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
 
-    dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));
+    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++) {
-      dhcp_option_byte(dhcp, dhcp_discover_request_options[i]);
+      options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]);
     }
 
-    dhcp_option_trailer(dhcp);
+#if LWIP_NETIF_HOSTNAME
+    options_out_len = dhcp_option_hostname(options_out_len, msg_out->options, netif);
+#endif /* LWIP_NETIF_HOSTNAME */
 
-    pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
+    LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_REBOOTING, msg_out, DHCP_REQUEST, &options_out_len);
+    dhcp_option_trailer(options_out_len, msg_out->options, p_out);
 
     /* broadcast to server */
-    udp_sendto_if(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
-    dhcp_delete_msg(dhcp);
+    result = udp_sendto_if(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif);
+    pbuf_free(p_out);
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot: REBOOTING\n"));
   } else {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_reboot: could not allocate DHCP request\n"));
+    result = ERR_MEM;
   }
   if (dhcp->tries < 255) {
     dhcp->tries++;
   }
-  msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
-  dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
+  msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000);
+  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_reboot(): set request timeout %"U16_F" msecs\n", msecs));
   return result;
 }
 
-
 /**
  * @ingroup dhcp4
- * Release a DHCP lease (usually called before @ref dhcp_stop).
+ * Release a DHCP lease and stop DHCP statemachine (and AUTOIP if LWIP_DHCP_AUTOIP_COOP).
  *
- * @param netif network interface which must release its lease
+ * @param netif network interface
  */
-err_t
-dhcp_release(struct netif *netif)
+void
+dhcp_release_and_stop(struct netif *netif)
 {
   struct dhcp *dhcp = netif_dhcp_data(netif);
-  err_t result;
   ip_addr_t server_ip_addr;
-  u8_t is_dhcp_supplied_address;
 
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_release()\n"));
+  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_release_and_stop()\n"));
   if (dhcp == NULL) {
-    return ERR_ARG;
+    return;
   }
+
+  /* already off? -> nothing to do */
+  if (dhcp->state == DHCP_STATE_OFF) {
+    return;
+  }
+
   ip_addr_copy(server_ip_addr, dhcp->server_ip_addr);
 
-  is_dhcp_supplied_address = dhcp_supplied_address(netif);
-
-  /* idle DHCP client */
-  dhcp_set_state(dhcp, DHCP_STATE_OFF);
   /* clean old DHCP offer */
   ip_addr_set_zero_ip4(&dhcp->server_ip_addr);
   ip4_addr_set_zero(&dhcp->offered_ip_addr);
@@ -1305,65 +1344,68 @@
   dhcp->offered_t0_lease = dhcp->offered_t1_renew = dhcp->offered_t2_rebind = 0;
   dhcp->t1_renew_time = dhcp->t2_rebind_time = dhcp->lease_used = dhcp->t0_timeout = 0;
 
-  if (!is_dhcp_supplied_address) {
-    /* don't issue release message when address is not dhcp-assigned */
-    return ERR_OK;
+  /* send release message when current IP was assigned via DHCP */
+  if (dhcp_supplied_address(netif)) {
+    /* create and initialize the DHCP message header */
+    struct pbuf *p_out;
+    u16_t options_out_len;
+    p_out = dhcp_create_msg(netif, dhcp, DHCP_RELEASE, &options_out_len);
+    if (p_out != NULL) {
+      struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload;
+      options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_SERVER_ID, 4);
+      options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(ip_2_ip4(&server_ip_addr))));
+
+      LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, dhcp->state, msg_out, DHCP_RELEASE, &options_out_len);
+      dhcp_option_trailer(options_out_len, msg_out->options, p_out);
+
+      udp_sendto_if(dhcp_pcb, p_out, &server_ip_addr, LWIP_IANA_PORT_DHCP_SERVER, netif);
+      pbuf_free(p_out);
+      LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release: RELEASED, DHCP_STATE_OFF\n"));
+    } else {
+      /* sending release failed, but that's not a problem since the correct behaviour of dhcp does not rely on release */
+      LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_release: could not allocate DHCP request\n"));
+    }
   }
 
-  /* create and initialize the DHCP message header */
-  result = dhcp_create_msg(netif, dhcp, DHCP_RELEASE);
-  if (result == ERR_OK) {
-    dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4);
-    dhcp_option_long(dhcp, lwip_ntohl(ip4_addr_get_u32(ip_2_ip4(&server_ip_addr))));
-
-    dhcp_option_trailer(dhcp);
-
-    pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
-
-    udp_sendto_if(dhcp_pcb, dhcp->p_out, &server_ip_addr, DHCP_SERVER_PORT, netif);
-    dhcp_delete_msg(dhcp);
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release: RELEASED, DHCP_STATE_OFF\n"));
-  } else {
-    /* sending release failed, but that's not a problem since the correct behaviour of dhcp does not rely on release */
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_release: could not allocate DHCP request\n"));
-  }
   /* remove IP address from interface (prevents routing from selecting this interface) */
   netif_set_addr(netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4);
 
-  return result;
+#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 */
+
+  dhcp_set_state(dhcp, DHCP_STATE_OFF);
+
+  if (dhcp->pcb_allocated != 0) {
+    dhcp_dec_pcb_refcount(); /* free DHCP PCB if not needed any more */
+    dhcp->pcb_allocated = 0;
+  }
 }
 
 /**
  * @ingroup dhcp4
- * Remove the DHCP client from the interface.
- *
- * @param netif The network interface to stop DHCP on
+ * This function calls dhcp_release_and_stop() internally.
+ * @deprecated Use dhcp_release_and_stop() instead.
+ */
+err_t
+dhcp_release(struct netif *netif)
+{
+  dhcp_release_and_stop(netif);
+  return ERR_OK;
+}
+
+/**
+ * @ingroup dhcp4
+ * This function calls dhcp_release_and_stop() internally.
+ * @deprecated Use dhcp_release_and_stop() instead.
  */
 void
 dhcp_stop(struct netif *netif)
 {
-  struct dhcp *dhcp;
-  LWIP_ERROR("dhcp_stop: netif != NULL", (netif != NULL), return;);
-  dhcp = netif_dhcp_data(netif);
-
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_stop()\n"));
-  /* netif is DHCP configured? */
-  if (dhcp != NULL) {
-#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_ASSERT("reply wasn't freed", dhcp->msg_in == NULL);
-    dhcp_set_state(dhcp, DHCP_STATE_OFF);
-
-    if (dhcp->pcb_allocated != 0) {
-      dhcp_dec_pcb_refcount(); /* free DHCP PCB if not needed any more */
-      dhcp->pcb_allocated = 0;
-    }
-  }
+  dhcp_release_and_stop(netif);
 }
 
 /*
@@ -1386,45 +1428,49 @@
  * DHCP message.
  *
  */
-static void
-dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len)
+static u16_t
+dhcp_option(u16_t options_out_len, u8_t *options, u8_t option_type, u8_t option_len)
 {
-  LWIP_ASSERT("dhcp_option: dhcp->options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN);
-  dhcp->msg_out->options[dhcp->options_out_len++] = option_type;
-  dhcp->msg_out->options[dhcp->options_out_len++] = option_len;
+  LWIP_ASSERT("dhcp_option: options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN);
+  options[options_out_len++] = option_type;
+  options[options_out_len++] = option_len;
+  return options_out_len;
 }
 /*
  * Concatenate a single byte to the outgoing DHCP message.
  *
  */
-static void
-dhcp_option_byte(struct dhcp *dhcp, u8_t value)
+static u16_t
+dhcp_option_byte(u16_t options_out_len, u8_t *options, u8_t value)
 {
-  LWIP_ASSERT("dhcp_option_byte: dhcp->options_out_len < DHCP_OPTIONS_LEN", dhcp->options_out_len < DHCP_OPTIONS_LEN);
-  dhcp->msg_out->options[dhcp->options_out_len++] = value;
+  LWIP_ASSERT("dhcp_option_byte: options_out_len < DHCP_OPTIONS_LEN", options_out_len < DHCP_OPTIONS_LEN);
+  options[options_out_len++] = value;
+  return options_out_len;
 }
 
-static void
-dhcp_option_short(struct dhcp *dhcp, u16_t value)
+static u16_t
+dhcp_option_short(u16_t options_out_len, u8_t *options, u16_t value)
 {
-  LWIP_ASSERT("dhcp_option_short: dhcp->options_out_len + 2 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U <= DHCP_OPTIONS_LEN);
-  dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff00U) >> 8);
-  dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t) (value & 0x00ffU);
+  LWIP_ASSERT("dhcp_option_short: options_out_len + 2 <= DHCP_OPTIONS_LEN", options_out_len + 2U <= DHCP_OPTIONS_LEN);
+  options[options_out_len++] = (u8_t)((value & 0xff00U) >> 8);
+  options[options_out_len++] = (u8_t) (value & 0x00ffU);
+  return options_out_len;
 }
 
-static void
-dhcp_option_long(struct dhcp *dhcp, u32_t value)
+static u16_t
+dhcp_option_long(u16_t options_out_len, u8_t *options, u32_t value)
 {
-  LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN);
-  dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
-  dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16);
-  dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8);
-  dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x000000ffUL));
+  LWIP_ASSERT("dhcp_option_long: options_out_len + 4 <= DHCP_OPTIONS_LEN", options_out_len + 4U <= DHCP_OPTIONS_LEN);
+  options[options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
+  options[options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16);
+  options[options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8);
+  options[options_out_len++] = (u8_t)((value & 0x000000ffUL));
+  return options_out_len;
 }
 
 #if LWIP_NETIF_HOSTNAME
-static void
-dhcp_option_hostname(struct dhcp *dhcp, struct netif *netif)
+static u16_t
+dhcp_option_hostname(u16_t options_out_len, u8_t *options, struct netif *netif)
 {
   if (netif->hostname != NULL) {
     size_t namelen = strlen(netif->hostname);
@@ -1433,16 +1479,17 @@
       const char *p = netif->hostname;
       /* Shrink len to available bytes (need 2 bytes for OPTION_HOSTNAME
          and 1 byte for trailer) */
-      size_t available = DHCP_OPTIONS_LEN - dhcp->options_out_len - 3;
+      size_t available = DHCP_OPTIONS_LEN - options_out_len - 3;
       LWIP_ASSERT("DHCP: hostname is too long!", namelen <= available);
       len = LWIP_MIN(namelen, available);
       LWIP_ASSERT("DHCP: hostname is too long!", len <= 0xFF);
-      dhcp_option(dhcp, DHCP_OPTION_HOSTNAME, (u8_t)len);
+      options_out_len = dhcp_option(options_out_len, options, DHCP_OPTION_HOSTNAME, (u8_t)len);
       while (len--) {
-        dhcp_option_byte(dhcp, *p++);
+        options_out_len = dhcp_option_byte(options_out_len, options, *p++);
       }
     }
   }
+  return options_out_len;
 }
 #endif /* LWIP_NETIF_HOSTNAME */
 
@@ -1457,7 +1504,7 @@
  *
  */
 static err_t
-dhcp_parse_reply(struct dhcp *dhcp, struct pbuf *p)
+dhcp_parse_reply(struct pbuf *p, struct dhcp *dhcp)
 {
   u8_t *options;
   u16_t offset;
@@ -1467,6 +1514,12 @@
   struct pbuf *q;
   int parse_file_as_options = 0;
   int parse_sname_as_options = 0;
+  struct dhcp_msg *msg_in;
+#if LWIP_DHCP_BOOTP_FILE
+  int file_overloaded = 0;
+#endif
+
+  LWIP_UNUSED_ARG(dhcp);
 
   /* clear received options */
   dhcp_clear_all_options(dhcp);
@@ -1474,7 +1527,7 @@
   if (p->len < DHCP_SNAME_OFS) {
     return ERR_BUF;
   }
-  dhcp->msg_in = (struct dhcp_msg *)p->payload;
+  msg_in = (struct dhcp_msg *)p->payload;
 #if LWIP_DHCP_BOOTP_FILE
   /* clear boot file name */
   dhcp->boot_file_name[0] = 0;
@@ -1489,8 +1542,8 @@
 again:
   q = p;
   while ((q != NULL) && (options_idx >= q->len)) {
-    options_idx -= q->len;
-    options_idx_max -= q->len;
+    options_idx = (u16_t)(options_idx - q->len);
+    options_idx_max = (u16_t)(options_idx_max - q->len);
     q = q->next;
   }
   if (q == NULL) {
@@ -1498,41 +1551,44 @@
   }
   offset = options_idx;
   offset_max = options_idx_max;
-  options = (u8_t*)q->payload;
+  options = (u8_t *)q->payload;
   /* at least 1 byte to read and no end marker, then at least 3 bytes to read? */
   while ((q != NULL) && (offset < offset_max) && (options[offset] != DHCP_OPTION_END)) {
     u8_t op = options[offset];
     u8_t len;
     u8_t decode_len = 0;
     int decode_idx = -1;
-    u16_t val_offset = offset + 2;
+    u16_t val_offset = (u16_t)(offset + 2);
+    if (val_offset < offset) {
+      /* overflow */
+      return ERR_BUF;
+    }
     /* len byte might be in the next pbuf */
     if ((offset + 1) < q->len) {
       len = options[offset + 1];
     } else {
-      len = (q->next != NULL ? ((u8_t*)q->next->payload)[0] : 0);
+      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)); */
     decode_len = len;
-    switch(op) {
+    switch (op) {
       /* case(DHCP_OPTION_END): handled above */
-      case(DHCP_OPTION_PAD):
+      case (DHCP_OPTION_PAD):
         /* special option: no len encoded */
         decode_len = len = 0;
         /* will be increased below */
-        offset--;
         break;
-      case(DHCP_OPTION_SUBNET_MASK):
+      case (DHCP_OPTION_SUBNET_MASK):
         LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
         decode_idx = DHCP_OPTION_IDX_SUBNET_MASK;
         break;
-      case(DHCP_OPTION_ROUTER):
+      case (DHCP_OPTION_ROUTER):
         decode_len = 4; /* only copy the first given router */
         LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;);
         decode_idx = DHCP_OPTION_IDX_ROUTER;
         break;
 #if LWIP_DHCP_PROVIDE_DNS_SERVERS
-      case(DHCP_OPTION_DNS_SERVER):
+      case (DHCP_OPTION_DNS_SERVER):
         /* special case: there might be more than one server */
         LWIP_ERROR("len %% 4 == 0", len % 4 == 0, return ERR_VAL;);
         /* limit number of DNS servers */
@@ -1541,12 +1597,12 @@
         decode_idx = DHCP_OPTION_IDX_DNS_SERVER;
         break;
 #endif /* LWIP_DHCP_PROVIDE_DNS_SERVERS */
-      case(DHCP_OPTION_LEASE_TIME):
+      case (DHCP_OPTION_LEASE_TIME):
         LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
         decode_idx = DHCP_OPTION_IDX_LEASE_TIME;
         break;
 #if LWIP_DHCP_GET_NTP_SRV
-      case(DHCP_OPTION_NTP):
+      case (DHCP_OPTION_NTP):
         /* special case: there might be more than one server */
         LWIP_ERROR("len %% 4 == 0", len % 4 == 0, return ERR_VAL;);
         /* limit number of NTP servers */
@@ -1555,73 +1611,90 @@
         decode_idx = DHCP_OPTION_IDX_NTP_SERVER;
         break;
 #endif /* LWIP_DHCP_GET_NTP_SRV*/
-      case(DHCP_OPTION_OVERLOAD):
+      case (DHCP_OPTION_OVERLOAD):
         LWIP_ERROR("len == 1", len == 1, return ERR_VAL;);
         /* decode overload only in options, not in file/sname: invalid packet */
         LWIP_ERROR("overload in file/sname", options_idx == DHCP_OPTIONS_OFS, return ERR_VAL;);
         decode_idx = DHCP_OPTION_IDX_OVERLOAD;
         break;
-      case(DHCP_OPTION_MESSAGE_TYPE):
+      case (DHCP_OPTION_MESSAGE_TYPE):
         LWIP_ERROR("len == 1", len == 1, return ERR_VAL;);
         decode_idx = DHCP_OPTION_IDX_MSG_TYPE;
         break;
-      case(DHCP_OPTION_SERVER_ID):
+      case (DHCP_OPTION_SERVER_ID):
         LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
         decode_idx = DHCP_OPTION_IDX_SERVER_ID;
         break;
-      case(DHCP_OPTION_T1):
+      case (DHCP_OPTION_T1):
         LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
         decode_idx = DHCP_OPTION_IDX_T1;
         break;
-      case(DHCP_OPTION_T2):
+      case (DHCP_OPTION_T2):
         LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
         decode_idx = DHCP_OPTION_IDX_T2;
         break;
       default:
         decode_len = 0;
         LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", (u16_t)op));
+        LWIP_HOOK_DHCP_PARSE_OPTION(ip_current_netif(), dhcp, dhcp->state, msg_in,
+                                    dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE) ? (u8_t)dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE) : 0,
+                                    op, len, q, val_offset);
         break;
     }
-    offset += len + 2;
-    if (decode_len > 0) {
-      u32_t value = 0;
-      u16_t copy_len;
+    if (op == DHCP_OPTION_PAD) {
+      offset++;
+    } else {
+      if (offset + len + 2 > 0xFFFF) {
+        /* overflow */
+        return ERR_BUF;
+      }
+      offset = (u16_t)(offset + len + 2);
+      if (decode_len > 0) {
+        u32_t value = 0;
+        u16_t copy_len;
 decode_next:
-      LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX);
-      if (!dhcp_option_given(dhcp, decode_idx)) {
-        copy_len = LWIP_MIN(decode_len, 4);
-        if (pbuf_copy_partial(q, &value, copy_len, val_offset) != copy_len) {
-          return ERR_BUF;
-        }
-        if (decode_len > 4) {
-          /* decode more than one u32_t */
-          LWIP_ERROR("decode_len %% 4 == 0", decode_len % 4 == 0, return ERR_VAL;);
+        LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX);
+        if (!dhcp_option_given(dhcp, decode_idx)) {
+          copy_len = LWIP_MIN(decode_len, 4);
+          if (pbuf_copy_partial(q, &value, copy_len, val_offset) != copy_len) {
+            return ERR_BUF;
+          }
+          if (decode_len > 4) {
+            /* decode more than one u32_t */
+            u16_t next_val_offset;
+            LWIP_ERROR("decode_len %% 4 == 0", decode_len % 4 == 0, return ERR_VAL;);
+            dhcp_got_option(dhcp, decode_idx);
+            dhcp_set_option_value(dhcp, decode_idx, lwip_htonl(value));
+            decode_len = (u8_t)(decode_len - 4);
+            next_val_offset = (u16_t)(val_offset + 4);
+            if (next_val_offset < val_offset) {
+              /* overflow */
+              return ERR_BUF;
+            }
+            val_offset = next_val_offset;
+            decode_idx++;
+            goto decode_next;
+          } else if (decode_len == 4) {
+            value = lwip_ntohl(value);
+          } else {
+            LWIP_ERROR("invalid decode_len", decode_len == 1, return ERR_VAL;);
+            value = ((u8_t *)&value)[0];
+          }
           dhcp_got_option(dhcp, decode_idx);
-          dhcp_set_option_value(dhcp, decode_idx, lwip_htonl(value));
-          decode_len -= 4;
-          val_offset += 4;
-          decode_idx++;
-          goto decode_next;
-        } else if (decode_len == 4) {
-          value = lwip_ntohl(value);
-        } else {
-          LWIP_ERROR("invalid decode_len", decode_len == 1, return ERR_VAL;);
-          value = ((u8_t*)&value)[0];
+          dhcp_set_option_value(dhcp, decode_idx, value);
         }
-        dhcp_got_option(dhcp, decode_idx);
-        dhcp_set_option_value(dhcp, decode_idx, value);
       }
     }
     if (offset >= q->len) {
-      offset -= q->len;
-      offset_max -= q->len;
-      if ((offset < offset_max) && offset_max) {
+      offset = (u16_t)(offset - q->len);
+      offset_max = (u16_t)(offset_max - q->len);
+      if (offset < offset_max) {
         q = q->next;
         LWIP_ERROR("next pbuf was null", q != NULL, return ERR_VAL;);
-        options = (u8_t*)q->payload;
+        options = (u8_t *)q->payload;
       } else {
         /* We've run out of bytes, probably no end marker. Don't proceed. */
-        break;
+        return ERR_BUF;
       }
     }
   }
@@ -1642,25 +1715,15 @@
     } else {
       LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("invalid overload option: %d\n", (int)overload));
     }
-#if LWIP_DHCP_BOOTP_FILE
-    if (!parse_file_as_options) {
-      /* only do this for ACK messages */
-      if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE) &&
-        (dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE) == DHCP_ACK))
-      /* copy bootp file name, don't care for sname (server hostname) */
-      if (pbuf_copy_partial(p, dhcp->boot_file_name, DHCP_FILE_LEN-1, DHCP_FILE_OFS) != (DHCP_FILE_LEN-1)) {
-        return ERR_BUF;
-      }
-      /* make sure the string is really NULL-terminated */
-      dhcp->boot_file_name[DHCP_FILE_LEN-1] = 0;
-    }
-#endif /* LWIP_DHCP_BOOTP_FILE */
   }
   if (parse_file_as_options) {
     /* if both are overloaded, parse file first and then sname (RFC 2131 ch. 4.1) */
     parse_file_as_options = 0;
     options_idx = DHCP_FILE_OFS;
     options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN;
+#if LWIP_DHCP_BOOTP_FILE
+    file_overloaded = 1;
+#endif
     goto again;
   } else if (parse_sname_as_options) {
     parse_sname_as_options = 0;
@@ -1668,6 +1731,19 @@
     options_idx_max = DHCP_SNAME_OFS + DHCP_SNAME_LEN;
     goto again;
   }
+#if LWIP_DHCP_BOOTP_FILE
+  if (!file_overloaded) {
+    /* only do this for ACK messages */
+    if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE) &&
+      (dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE) == DHCP_ACK))
+    /* copy bootp file name, don't care for sname (server hostname) */
+    if (pbuf_copy_partial(p, dhcp->boot_file_name, DHCP_FILE_LEN-1, DHCP_FILE_OFS) != (DHCP_FILE_LEN-1)) {
+      return ERR_BUF;
+    }
+    /* make sure the string is really NULL-terminated */
+    dhcp->boot_file_name[DHCP_FILE_LEN-1] = 0;
+  }
+#endif /* LWIP_DHCP_BOOTP_FILE */ 
   return ERR_OK;
 }
 
@@ -1682,6 +1758,7 @@
   struct dhcp_msg *reply_msg = (struct dhcp_msg *)p->payload;
   u8_t msg_type;
   u8_t i;
+  struct dhcp_msg *msg_in;
 
   LWIP_UNUSED_ARG(arg);
 
@@ -1692,8 +1769,8 @@
 
   LWIP_ASSERT("invalid server address type", IP_IS_V4(addr));
 
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_recv(pbuf = %p) from DHCP server %"U16_F".%"U16_F".%"U16_F".%"U16_F" port %"U16_F"\n", (void*)p,
-    ip4_addr1_16(ip_2_ip4(addr)), ip4_addr2_16(ip_2_ip4(addr)), ip4_addr3_16(ip_2_ip4(addr)), ip4_addr4_16(ip_2_ip4(addr)), port));
+  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_recv(pbuf = %p) from DHCP server %"U16_F".%"U16_F".%"U16_F".%"U16_F" port %"U16_F"\n", (void *)p,
+              ip4_addr1_16(ip_2_ip4(addr)), ip4_addr2_16(ip_2_ip4(addr)), ip4_addr3_16(ip_2_ip4(addr)), ip4_addr4_16(ip_2_ip4(addr)), port));
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("pbuf->len = %"U16_F"\n", p->len));
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("pbuf->tot_len = %"U16_F"\n", p->tot_len));
   /* prevent warnings about unused arguments */
@@ -1701,8 +1778,6 @@
   LWIP_UNUSED_ARG(addr);
   LWIP_UNUSED_ARG(port);
 
-  LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL);
-
   if (p->len < DHCP_MIN_REPLY_LEN) {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCP reply message or pbuf too short\n"));
     goto free_pbuf_and_return;
@@ -1713,24 +1788,24 @@
     goto free_pbuf_and_return;
   }
   /* iterate through hardware address and match against DHCP message */
-  for (i = 0; i < netif->hwaddr_len && i < NETIF_MAX_HWADDR_LEN && i < DHCP_CHADDR_LEN; i++) {
+  for (i = 0; i < netif->hwaddr_len && i < LWIP_MIN(DHCP_CHADDR_LEN, NETIF_MAX_HWADDR_LEN); i++) {
     if (netif->hwaddr[i] != reply_msg->chaddr[i]) {
       LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,
-        ("netif->hwaddr[%"U16_F"]==%02"X16_F" != reply_msg->chaddr[%"U16_F"]==%02"X16_F"\n",
-        (u16_t)i, (u16_t)netif->hwaddr[i], (u16_t)i, (u16_t)reply_msg->chaddr[i]));
+                  ("netif->hwaddr[%"U16_F"]==%02"X16_F" != reply_msg->chaddr[%"U16_F"]==%02"X16_F"\n",
+                   (u16_t)i, (u16_t)netif->hwaddr[i], (u16_t)i, (u16_t)reply_msg->chaddr[i]));
       goto free_pbuf_and_return;
     }
   }
   /* match transaction ID against what we expected */
   if (lwip_ntohl(reply_msg->xid) != dhcp->xid) {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,
-      ("transaction id mismatch reply_msg->xid(%"X32_F")!=dhcp->xid(%"X32_F")\n",lwip_ntohl(reply_msg->xid),dhcp->xid));
+                ("transaction id mismatch reply_msg->xid(%"X32_F")!=dhcp->xid(%"X32_F")\n", lwip_ntohl(reply_msg->xid), dhcp->xid));
     goto free_pbuf_and_return;
   }
   /* option fields could be unfold? */
-  if (dhcp_parse_reply(dhcp, p) != ERR_OK) {
+  if (dhcp_parse_reply(p, dhcp) != ERR_OK) {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
-      ("problem unfolding DHCP message - too short on memory?\n"));
+                ("problem unfolding DHCP message - too short on memory?\n"));
     goto free_pbuf_and_return;
   }
 
@@ -1741,6 +1816,7 @@
     goto free_pbuf_and_return;
   }
 
+  msg_in = (struct dhcp_msg *)p->payload;
   /* read DHCP message type */
   msg_type = (u8_t)dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE);
   /* message type is DHCP ACK? */
@@ -1748,7 +1824,7 @@
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_ACK received\n"));
     /* in requesting state? */
     if (dhcp->state == DHCP_STATE_REQUESTING) {
-      dhcp_handle_ack(netif);
+      dhcp_handle_ack(netif, msg_in);
 #if DHCP_DOES_ARP_CHECK
       if ((netif->flags & NETIF_FLAG_ETHARP) != 0) {
         /* check if the acknowledged lease address is already in use */
@@ -1765,29 +1841,25 @@
     /* already bound to the given lease address? */
     else if ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REBINDING) ||
              (dhcp->state == DHCP_STATE_RENEWING)) {
-      dhcp_handle_ack(netif);
+      dhcp_handle_ack(netif, msg_in);
       dhcp_bind(netif);
     }
   }
   /* received a DHCP_NAK in appropriate state? */
   else if ((msg_type == DHCP_NAK) &&
-    ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REQUESTING) ||
-     (dhcp->state == DHCP_STATE_REBINDING) || (dhcp->state == DHCP_STATE_RENEWING  ))) {
+           ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REQUESTING) ||
+            (dhcp->state == DHCP_STATE_REBINDING) || (dhcp->state == DHCP_STATE_RENEWING  ))) {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_NAK received\n"));
     dhcp_handle_nak(netif);
   }
   /* received a DHCP_OFFER in DHCP_STATE_SELECTING state? */
   else if ((msg_type == DHCP_OFFER) && (dhcp->state == DHCP_STATE_SELECTING)) {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_OFFER received in DHCP_STATE_SELECTING state\n"));
-    dhcp->request_timeout = 0;
     /* remember offered lease */
-    dhcp_handle_offer(netif);
+    dhcp_handle_offer(netif, msg_in);
   }
 
 free_pbuf_and_return:
-  if (dhcp != NULL) {
-    dhcp->msg_in = NULL;
-  }
   pbuf_free(p);
 }
 
@@ -1798,10 +1870,14 @@
  * @param dhcp dhcp control struct
  * @param message_type message type of the request
  */
-static err_t
-dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type)
+static struct pbuf *
+dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type, u16_t *options_out_len)
 {
   u16_t i;
+  struct pbuf *p_out;
+  struct dhcp_msg *msg_out;
+  u16_t options_out_len_loc;
+
 #ifndef DHCP_GLOBAL_XID
   /** default global transaction identifier starting value (easy to match
    *  with a packet analyser). We simply increment for each new request.
@@ -1818,18 +1894,16 @@
     xid_initialised = !xid_initialised;
   }
 #endif
-  LWIP_ERROR("dhcp_create_msg: netif != NULL", (netif != NULL), return ERR_ARG;);
-  LWIP_ERROR("dhcp_create_msg: dhcp != NULL", (dhcp != NULL), return ERR_VAL;);
-  LWIP_ASSERT("dhcp_create_msg: dhcp->p_out == NULL", dhcp->p_out == NULL);
-  LWIP_ASSERT("dhcp_create_msg: dhcp->msg_out == NULL", dhcp->msg_out == NULL);
-  dhcp->p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM);
-  if (dhcp->p_out == NULL) {
+  LWIP_ERROR("dhcp_create_msg: netif != NULL", (netif != NULL), return NULL;);
+  LWIP_ERROR("dhcp_create_msg: dhcp != NULL", (dhcp != NULL), return NULL;);
+  p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM);
+  if (p_out == NULL) {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
-      ("dhcp_create_msg(): could not allocate pbuf\n"));
-    return ERR_MEM;
+                ("dhcp_create_msg(): could not allocate pbuf\n"));
+    return NULL;
   }
   LWIP_ASSERT("dhcp_create_msg: check that first pbuf can hold struct dhcp_msg",
-           (dhcp->p_out->len >= sizeof(struct dhcp_msg)));
+              (p_out->len >= sizeof(struct dhcp_msg)));
 
   /* DHCP_REQUEST should reuse 'xid' from DHCPOFFER */
   if ((message_type != DHCP_REQUEST) || (dhcp->state == DHCP_STATE_REBOOTING)) {
@@ -1846,66 +1920,34 @@
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE,
               ("transaction id xid(%"X32_F")\n", xid));
 
-  dhcp->msg_out = (struct dhcp_msg *)dhcp->p_out->payload;
+  msg_out = (struct dhcp_msg *)p_out->payload;
+  memset(msg_out, 0, sizeof(struct dhcp_msg));
 
-  dhcp->msg_out->op = DHCP_BOOTREQUEST;
+  msg_out->op = DHCP_BOOTREQUEST;
   /* @todo: make link layer independent */
-  dhcp->msg_out->htype = DHCP_HTYPE_ETH;
-  dhcp->msg_out->hlen = netif->hwaddr_len;
-  dhcp->msg_out->hops = 0;
-  dhcp->msg_out->xid = lwip_htonl(dhcp->xid);
-  dhcp->msg_out->secs = 0;
+  msg_out->htype = LWIP_IANA_HWTYPE_ETHERNET;
+  msg_out->hlen = netif->hwaddr_len;
+  msg_out->xid = lwip_htonl(dhcp->xid);
   /* we don't need the broadcast flag since we can receive unicast traffic
      before being fully configured! */
-  dhcp->msg_out->flags = 0;
-  ip4_addr_set_zero(&dhcp->msg_out->ciaddr);
   /* set ciaddr to netif->ip_addr based on message_type and state */
   if ((message_type == DHCP_INFORM) || (message_type == DHCP_DECLINE) || (message_type == DHCP_RELEASE) ||
       ((message_type == DHCP_REQUEST) && /* DHCP_STATE_BOUND not used for sending! */
-       ((dhcp->state== DHCP_STATE_RENEWING) || dhcp->state== DHCP_STATE_REBINDING))) {
-    ip4_addr_copy(dhcp->msg_out->ciaddr, *netif_ip4_addr(netif));
+       ((dhcp->state == DHCP_STATE_RENEWING) || dhcp->state == DHCP_STATE_REBINDING))) {
+    ip4_addr_copy(msg_out->ciaddr, *netif_ip4_addr(netif));
   }
-  ip4_addr_set_zero(&dhcp->msg_out->yiaddr);
-  ip4_addr_set_zero(&dhcp->msg_out->siaddr);
-  ip4_addr_set_zero(&dhcp->msg_out->giaddr);
-  for (i = 0; i < DHCP_CHADDR_LEN; i++) {
-    /* copy netif hardware address, pad with zeroes */
-    dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len && i < NETIF_MAX_HWADDR_LEN) ? netif->hwaddr[i] : 0/* pad byte*/;
+  for (i = 0; i < LWIP_MIN(DHCP_CHADDR_LEN, NETIF_MAX_HWADDR_LEN); i++) {
+    /* copy netif hardware address (padded with zeroes through memset already) */
+    msg_out->chaddr[i] = netif->hwaddr[i];
   }
-  for (i = 0; i < DHCP_SNAME_LEN; i++) {
-    dhcp->msg_out->sname[i] = 0;
-  }
-  for (i = 0; i < DHCP_FILE_LEN; i++) {
-    dhcp->msg_out->file[i] = 0;
-  }
-  dhcp->msg_out->cookie = PP_HTONL(DHCP_MAGIC_COOKIE);
-  dhcp->options_out_len = 0;
-  /* fill options field with an incrementing array (for debugging purposes) */
-  for (i = 0; i < DHCP_OPTIONS_LEN; i++) {
-    dhcp->msg_out->options[i] = (u8_t)i; /* for debugging only, no matter if truncated */
-  }
+  msg_out->cookie = PP_HTONL(DHCP_MAGIC_COOKIE);
   /* Add option MESSAGE_TYPE */
-  dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);
-  dhcp_option_byte(dhcp, message_type);
-  return ERR_OK;
-}
-
-/**
- * Free previously allocated memory used to send a DHCP request.
- *
- * @param dhcp the dhcp struct to free the request from
- */
-static void
-dhcp_delete_msg(struct dhcp *dhcp)
-{
-  LWIP_ERROR("dhcp_delete_msg: dhcp != NULL", (dhcp != NULL), return;);
-  LWIP_ASSERT("dhcp_delete_msg: dhcp->p_out != NULL", dhcp->p_out != NULL);
-  LWIP_ASSERT("dhcp_delete_msg: dhcp->msg_out != NULL", dhcp->msg_out != NULL);
-  if (dhcp->p_out != NULL) {
-    pbuf_free(dhcp->p_out);
+  options_out_len_loc = dhcp_option(0, msg_out->options, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);
+  options_out_len_loc = dhcp_option_byte(options_out_len_loc, msg_out->options, message_type);
+  if (options_out_len) {
+    *options_out_len = options_out_len_loc;
   }
-  dhcp->p_out = NULL;
-  dhcp->msg_out = NULL;
+  return p_out;
 }
 
 /**
@@ -1913,22 +1955,19 @@
  *
  * Adds the END option to the DHCP message, and if
  * necessary, up to three padding bytes.
- *
- * @param dhcp DHCP state structure
  */
 static void
-dhcp_option_trailer(struct dhcp *dhcp)
+dhcp_option_trailer(u16_t options_out_len, u8_t *options, struct pbuf *p_out)
 {
-  LWIP_ERROR("dhcp_option_trailer: dhcp != NULL", (dhcp != NULL), return;);
-  LWIP_ASSERT("dhcp_option_trailer: dhcp->msg_out != NULL\n", dhcp->msg_out != NULL);
-  LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN);
-  dhcp->msg_out->options[dhcp->options_out_len++] = DHCP_OPTION_END;
+  options[options_out_len++] = DHCP_OPTION_END;
   /* packet is too small, or not 4 byte aligned? */
-  while (((dhcp->options_out_len < DHCP_MIN_OPTIONS_LEN) || (dhcp->options_out_len & 3)) &&
-         (dhcp->options_out_len < DHCP_OPTIONS_LEN)) {
+  while (((options_out_len < DHCP_MIN_OPTIONS_LEN) || (options_out_len & 3)) &&
+         (options_out_len < DHCP_OPTIONS_LEN)) {
     /* add a fill/padding byte */
-    dhcp->msg_out->options[dhcp->options_out_len++] = 0;
+    options[options_out_len++] = 0;
   }
+  /* shrink the pbuf to the actual content length */
+  pbuf_realloc(p_out, (u16_t)(sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + options_out_len));
 }
 
 /** check if DHCP supplied netif->ip_addr
@@ -1941,7 +1980,7 @@
 dhcp_supplied_address(const struct netif *netif)
 {
   if ((netif != NULL) && (netif_dhcp_data(netif) != NULL)) {
-    struct dhcp* dhcp = netif_dhcp_data(netif);
+    struct dhcp *dhcp = netif_dhcp_data(netif);
     return (dhcp->state == DHCP_STATE_BOUND) || (dhcp->state == DHCP_STATE_RENEWING) ||
            (dhcp->state == DHCP_STATE_REBINDING);
   }
diff --git a/src/core/ipv4/etharp.c b/src/core/ipv4/etharp.c
index 3f48a99..442aac0 100644
--- a/src/core/ipv4/etharp.c
+++ b/src/core/ipv4/etharp.c
@@ -45,13 +45,14 @@
 
 #include "lwip/opt.h"
 
-#if LWIP_ARP || LWIP_ETHERNET
+#if LWIP_IPV4 && LWIP_ARP /* don't build if not configured for use in lwipopts.h */
 
 #include "lwip/etharp.h"
 #include "lwip/stats.h"
 #include "lwip/snmp.h"
 #include "lwip/dhcp.h"
 #include "lwip/autoip.h"
+#include "lwip/prot/iana.h"
 #include "netif/ethernet.h"
 
 #include <string.h>
@@ -60,8 +61,6 @@
 #include LWIP_HOOK_FILENAME
 #endif
 
-#if LWIP_IPV4 && LWIP_ARP /* don't build if not configured for use in lwipopts.h */
-
 /** Re-request a used ARP entry 1 minute before it would expire to prevent
  *  breaking a steadily used connection because the ARP entry timed out. */
 #define ARP_AGE_REREQUEST_USED_UNICAST   (ARP_MAXAGE - 30)
@@ -84,7 +83,7 @@
   ETHARP_STATE_STABLE_REREQUESTING_1,
   ETHARP_STATE_STABLE_REREQUESTING_2
 #if ETHARP_SUPPORT_STATIC_ENTRIES
-  ,ETHARP_STATE_STATIC
+  , ETHARP_STATE_STATIC
 #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
 };
 
@@ -106,7 +105,7 @@
 static struct etharp_entry arp_table[ARP_TABLE_SIZE];
 
 #if !LWIP_NETIF_HWADDRHINT
-static u8_t etharp_cached_entry;
+static netif_addr_idx_t etharp_cached_entry;
 #endif /* !LWIP_NETIF_HWADDRHINT */
 
 /** Try hard to create a new entry - we want the IP address to appear in
@@ -118,20 +117,20 @@
 #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
 
 #if LWIP_NETIF_HWADDRHINT
-#define ETHARP_SET_HINT(netif, hint)  if (((netif) != NULL) && ((netif)->addr_hint != NULL))  \
-                                      *((netif)->addr_hint) = (hint);
+#define ETHARP_SET_ADDRHINT(netif, addrhint)  do { if (((netif) != NULL) && ((netif)->hints != NULL)) { \
+                                              (netif)->hints->addr_hint = (addrhint); }} while(0)
 #else /* LWIP_NETIF_HWADDRHINT */
-#define ETHARP_SET_HINT(netif, hint)  (etharp_cached_entry = (hint))
+#define ETHARP_SET_ADDRHINT(netif, addrhint)  (etharp_cached_entry = (addrhint))
 #endif /* LWIP_NETIF_HWADDRHINT */
 
 
-/* Some checks, instead of etharp_init(): */
-#if (LWIP_ARP && (ARP_TABLE_SIZE > 0x7f))
-  #error "ARP_TABLE_SIZE must fit in an s8_t, you have to reduce it in your lwipopts.h"
+/* Check for maximum ARP_TABLE_SIZE */
+#if (ARP_TABLE_SIZE > NETIF_ADDR_IDX_MAX)
+#error "ARP_TABLE_SIZE must fit in an s16_t, you have to reduce it in your lwipopts.h"
 #endif
 
 
-static err_t etharp_request_dst(struct netif *netif, const ip4_addr_t *ipaddr, const struct eth_addr* hw_dst_addr);
+static err_t etharp_request_dst(struct netif *netif, const ip4_addr_t *ipaddr, const struct eth_addr *hw_dst_addr);
 static err_t etharp_raw(struct netif *netif,
                         const struct eth_addr *ethsrc_addr, const struct eth_addr *ethdst_addr,
                         const struct eth_addr *hwsrc_addr, const ip4_addr_t *ipsrc_addr,
@@ -149,7 +148,6 @@
 {
   struct etharp_q_entry *r;
   LWIP_ASSERT("q != NULL", q != NULL);
-  LWIP_ASSERT("q->p != NULL", q->p != NULL);
   while (q) {
     r = q;
     q = q->next;
@@ -198,7 +196,7 @@
 void
 etharp_tmr(void)
 {
-  u8_t i;
+  int i;
 
   LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer\n"));
   /* remove expired entries from the ARP table */
@@ -206,16 +204,16 @@
     u8_t state = arp_table[i].state;
     if (state != ETHARP_STATE_EMPTY
 #if ETHARP_SUPPORT_STATIC_ENTRIES
-      && (state != ETHARP_STATE_STATIC)
+        && (state != ETHARP_STATE_STATIC)
 #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
-      ) {
+       ) {
       arp_table[i].ctime++;
       if ((arp_table[i].ctime >= ARP_MAXAGE) ||
           ((arp_table[i].state == ETHARP_STATE_PENDING)  &&
            (arp_table[i].ctime >= ARP_MAXPENDING))) {
         /* pending or stable entry has become old! */
-        LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired %s entry %"U16_F".\n",
-             arp_table[i].state >= ETHARP_STATE_STABLE ? "stable" : "pending", (u16_t)i));
+        LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired %s entry %d.\n",
+                                   arp_table[i].state >= ETHARP_STATE_STABLE ? "stable" : "pending", i));
         /* clean up entries that have just been expired */
         etharp_free_entry(i);
       } else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING_1) {
@@ -254,14 +252,14 @@
  * @return The ARP entry index that matched or is created, ERR_MEM if no
  * entry is found or could be recycled.
  */
-static s8_t
-etharp_find_entry(const ip4_addr_t *ipaddr, u8_t flags, struct netif* netif)
+static s16_t
+etharp_find_entry(const ip4_addr_t *ipaddr, u8_t flags, struct netif *netif)
 {
-  s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
-  s8_t empty = ARP_TABLE_SIZE;
-  u8_t i = 0;
+  s16_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
+  s16_t empty = ARP_TABLE_SIZE;
+  s16_t i = 0;
   /* oldest entry with packets on queue */
-  s8_t old_queue = ARP_TABLE_SIZE;
+  s16_t old_queue = ARP_TABLE_SIZE;
   /* its age */
   u16_t age_queue = 0, age_pending = 0, age_stable = 0;
 
@@ -286,19 +284,19 @@
     u8_t state = arp_table[i].state;
     /* no empty entry found yet and now we do find one? */
     if ((empty == ARP_TABLE_SIZE) && (state == ETHARP_STATE_EMPTY)) {
-      LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_find_entry: found empty entry %"U16_F"\n", (u16_t)i));
+      LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_find_entry: found empty entry %d\n", (int)i));
       /* remember first empty entry */
       empty = i;
     } else if (state != ETHARP_STATE_EMPTY) {
       LWIP_ASSERT("state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE",
-        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 ETHARP_TABLE_MATCH_NETIF
           && ((netif == NULL) || (netif == arp_table[i].netif))
 #endif /* ETHARP_TABLE_MATCH_NETIF */
-        ) {
-        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: found matching entry %"U16_F"\n", (u16_t)i));
+         ) {
+        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: found matching entry %d\n", (int)i));
         /* found exact IP address match, simply bail out */
         return i;
       }
@@ -311,14 +309,14 @@
             age_queue = arp_table[i].ctime;
           }
         } else
-        /* pending without queued packets? */
+          /* pending without queued packets? */
         {
           if (arp_table[i].ctime >= age_pending) {
             old_pending = i;
             age_pending = arp_table[i].ctime;
           }
         }
-      /* stable entry? */
+        /* stable entry? */
       } else if (state >= ETHARP_STATE_STABLE) {
 #if ETHARP_SUPPORT_STATIC_ENTRIES
         /* don't record old_stable for static entries since they never expire */
@@ -341,7 +339,7 @@
       /* or no empty entry found and not allowed to recycle? */
       ((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_FLAG_TRY_HARD) == 0))) {
     LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: no empty entry found and not allowed to recycle\n"));
-    return (s8_t)ERR_MEM;
+    return (s16_t)ERR_MEM;
   }
 
   /* b) choose the least destructive entry to recycle:
@@ -356,29 +354,29 @@
   /* 1) empty entry available? */
   if (empty < ARP_TABLE_SIZE) {
     i = empty;
-    LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting empty entry %"U16_F"\n", (u16_t)i));
+    LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting empty entry %d\n", (int)i));
   } else {
     /* 2) found recyclable stable entry? */
     if (old_stable < ARP_TABLE_SIZE) {
       /* recycle oldest stable*/
       i = old_stable;
-      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest stable entry %"U16_F"\n", (u16_t)i));
+      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest stable entry %d\n", (int)i));
       /* no queued packets should exist on stable entries */
       LWIP_ASSERT("arp_table[i].q == NULL", arp_table[i].q == NULL);
-    /* 3) found recyclable pending entry without queued packets? */
+      /* 3) found recyclable pending entry without queued packets? */
     } else if (old_pending < ARP_TABLE_SIZE) {
       /* recycle oldest pending */
       i = old_pending;
-      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest pending entry %"U16_F" (without queue)\n", (u16_t)i));
-    /* 4) found recyclable pending entry with queued packets? */
+      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest pending entry %d (without queue)\n", (int)i));
+      /* 4) found recyclable pending entry with queued packets? */
     } else if (old_queue < ARP_TABLE_SIZE) {
       /* recycle oldest pending (queued packets are free in etharp_free_entry) */
       i = old_queue;
-      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest pending entry %"U16_F", freeing packet queue %p\n", (u16_t)i, (void *)(arp_table[i].q)));
+      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest pending entry %d, freeing packet queue %p\n", (int)i, (void *)(arp_table[i].q)));
       /* no empty or recyclable entries found */
     } else {
       LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: no empty or recyclable entries found\n"));
-      return (s8_t)ERR_MEM;
+      return (s16_t)ERR_MEM;
     }
 
     /* { empty or recyclable entry found } */
@@ -388,7 +386,7 @@
 
   LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE);
   LWIP_ASSERT("arp_table[i].state == ETHARP_STATE_EMPTY",
-    arp_table[i].state == ETHARP_STATE_EMPTY);
+              arp_table[i].state == ETHARP_STATE_EMPTY);
 
   /* IP address given? */
   if (ipaddr != NULL) {
@@ -398,8 +396,8 @@
   arp_table[i].ctime = 0;
 #if ETHARP_TABLE_MATCH_NETIF
   arp_table[i].netif = netif;
-#endif /* ETHARP_TABLE_MATCH_NETIF*/
-  return (err_t)i;
+#endif /* ETHARP_TABLE_MATCH_NETIF */
+  return (s16_t)i;
 }
 
 /**
@@ -423,12 +421,12 @@
 static err_t
 etharp_update_arp_entry(struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, u8_t flags)
 {
-  s8_t i;
+  s16_t i;
   LWIP_ASSERT("netif->hwaddr_len == ETH_HWADDR_LEN", netif->hwaddr_len == ETH_HWADDR_LEN);
   LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: %"U16_F".%"U16_F".%"U16_F".%"U16_F" - %02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F"\n",
-    ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
-    (u16_t)ethaddr->addr[0], (u16_t)ethaddr->addr[1], (u16_t)ethaddr->addr[2],
-    (u16_t)ethaddr->addr[3], (u16_t)ethaddr->addr[4], (u16_t)ethaddr->addr[5]));
+              ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
+              (u16_t)ethaddr->addr[0], (u16_t)ethaddr->addr[1], (u16_t)ethaddr->addr[2],
+              (u16_t)ethaddr->addr[3], (u16_t)ethaddr->addr[4], (u16_t)ethaddr->addr[5]));
   /* non-unicast address? */
   if (ip4_addr_isany(ipaddr) ||
       ip4_addr_isbroadcast(ipaddr, netif) ||
@@ -462,9 +460,9 @@
   /* insert in SNMP ARP index tree */
   mib2_add_arp_entry(netif, &arp_table[i].ipaddr);
 
-  LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: updating stable entry %"S16_F"\n", (s16_t)i));
+  LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: updating stable entry %"S16_F"\n", i));
   /* update address */
-  ETHADDR32_COPY(&arp_table[i].ethaddr, ethaddr);
+  SMEMCPY(&arp_table[i].ethaddr, ethaddr, ETH_HWADDR_LEN);
   /* reset time stamp */
   arp_table[i].ctime = 0;
   /* this is where we will send out queued packets! */
@@ -485,7 +483,7 @@
     arp_table[i].q = NULL;
 #endif /* ARP_QUEUEING */
     /* send the queued IP packet */
-    ethernet_output(netif, p, (struct eth_addr*)(netif->hwaddr), ethaddr, ETHTYPE_IP);
+    ethernet_output(netif, p, (struct eth_addr *)(netif->hwaddr), ethaddr, ETHTYPE_IP);
     /* free the queued IP packet */
     pbuf_free(p);
   }
@@ -505,10 +503,11 @@
 etharp_add_static_entry(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr)
 {
   struct netif *netif;
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_add_static_entry: %"U16_F".%"U16_F".%"U16_F".%"U16_F" - %02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F"\n",
-    ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
-    (u16_t)ethaddr->addr[0], (u16_t)ethaddr->addr[1], (u16_t)ethaddr->addr[2],
-    (u16_t)ethaddr->addr[3], (u16_t)ethaddr->addr[4], (u16_t)ethaddr->addr[5]));
+              ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
+              (u16_t)ethaddr->addr[0], (u16_t)ethaddr->addr[1], (u16_t)ethaddr->addr[2],
+              (u16_t)ethaddr->addr[3], (u16_t)ethaddr->addr[4], (u16_t)ethaddr->addr[5]));
 
   netif = ip4_route(ipaddr);
   if (netif == NULL) {
@@ -529,9 +528,10 @@
 err_t
 etharp_remove_static_entry(const ip4_addr_t *ipaddr)
 {
-  s8_t i;
+  s16_t i;
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_remove_static_entry: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
-    ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr)));
+              ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr)));
 
   /* find or create ARP entry */
   i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY, NULL);
@@ -558,7 +558,7 @@
 void
 etharp_cleanup_netif(struct netif *netif)
 {
-  u8_t i;
+  int i;
 
   for (i = 0; i < ARP_TABLE_SIZE; ++i) {
     u8_t state = arp_table[i].state;
@@ -579,22 +579,22 @@
  * @param ip_ret points to return pointer
  * @return table index if found, -1 otherwise
  */
-s8_t
+ssize_t
 etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr,
-         struct eth_addr **eth_ret, const ip4_addr_t **ip_ret)
+                 struct eth_addr **eth_ret, const ip4_addr_t **ip_ret)
 {
-  s8_t i;
+  s16_t i;
 
   LWIP_ASSERT("eth_ret != NULL && ip_ret != NULL",
-    eth_ret != NULL && ip_ret != NULL);
+              eth_ret != NULL && ip_ret != NULL);
 
   LWIP_UNUSED_ARG(netif);
 
   i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY, netif);
   if ((i >= 0) && (arp_table[i].state >= ETHARP_STATE_STABLE)) {
-      *eth_ret = &arp_table[i].ethaddr;
-      *ip_ret = &arp_table[i].ipaddr;
-      return i;
+    *eth_ret = &arp_table[i].ethaddr;
+    *ip_ret = &arp_table[i].ipaddr;
+    return i;
   }
   return -1;
 }
@@ -608,14 +608,14 @@
  * @param eth_ret return value: ETH address
  * @return 1 on valid index, 0 otherwise
  */
-u8_t
-etharp_get_entry(u8_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret)
+int
+etharp_get_entry(size_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret)
 {
   LWIP_ASSERT("ipaddr != NULL", ipaddr != NULL);
   LWIP_ASSERT("netif != NULL", netif != NULL);
   LWIP_ASSERT("eth_ret != NULL", eth_ret != NULL);
 
-  if((i < ARP_TABLE_SIZE) && (arp_table[i].state >= ETHARP_STATE_STABLE)) {
+  if ((i < ARP_TABLE_SIZE) && (arp_table[i].state >= ETHARP_STATE_STABLE)) {
     *ipaddr  = &arp_table[i].ipaddr;
     *netif   = arp_table[i].netif;
     *eth_ret = &arp_table[i].ethaddr;
@@ -645,18 +645,20 @@
   ip4_addr_t sipaddr, dipaddr;
   u8_t for_us;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
   LWIP_ERROR("netif != NULL", (netif != NULL), return;);
 
   hdr = (struct etharp_hdr *)p->payload;
 
   /* RFC 826 "Packet Reception": */
-  if ((hdr->hwtype != PP_HTONS(HWTYPE_ETHERNET)) ||
+  if ((hdr->hwtype != PP_HTONS(LWIP_IANA_HWTYPE_ETHERNET)) ||
       (hdr->hwlen != ETH_HWADDR_LEN) ||
       (hdr->protolen != sizeof(ip4_addr_t)) ||
       (hdr->proto != PP_HTONS(ETHTYPE_IP)))  {
     LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,
-      ("etharp_input: packet dropped, wrong hw type, hwlen, proto, protolen or ethernet type (%"U16_F"/%"U16_F"/%"U16_F"/%"U16_F")\n",
-      hdr->hwtype, (u16_t)hdr->hwlen, hdr->proto, (u16_t)hdr->protolen));
+                ("etharp_input: packet dropped, wrong hw type, hwlen, proto, protolen or ethernet type (%"U16_F"/%"U16_F"/%"U16_F"/%"U16_F")\n",
+                 hdr->hwtype, (u16_t)hdr->hwlen, hdr->proto, (u16_t)hdr->protolen));
     ETHARP_STATS_INC(etharp.proterr);
     ETHARP_STATS_INC(etharp.drop);
     pbuf_free(p);
@@ -671,10 +673,10 @@
   autoip_arp_reply(netif, hdr);
 #endif /* LWIP_AUTOIP */
 
-  /* Copy struct ip4_addr2 to aligned ip4_addr, to support compilers without
+  /* Copy struct ip4_addr_wordaligned to aligned ip4_addr, to support compilers without
    * structure packing (not using structure copy which breaks strict-aliasing rules). */
-  IPADDR2_COPY(&sipaddr, &hdr->sipaddr);
-  IPADDR2_COPY(&dipaddr, &hdr->dipaddr);
+  IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&sipaddr, &hdr->sipaddr);
+  IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&dipaddr, &hdr->dipaddr);
 
   /* this interface is not configured? */
   if (ip4_addr_isany_val(*netif_ip4_addr(netif))) {
@@ -690,50 +692,50 @@
      ARP message not directed to us?
       ->  update the source IP address in the cache, if present */
   etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr),
-                   for_us ? ETHARP_FLAG_TRY_HARD : ETHARP_FLAG_FIND_ONLY);
+                          for_us ? ETHARP_FLAG_TRY_HARD : ETHARP_FLAG_FIND_ONLY);
 
   /* now act on the message itself */
   switch (hdr->opcode) {
-  /* ARP request? */
-  case PP_HTONS(ARP_REQUEST):
-    /* ARP request. If it asked for our address, we send out a
-     * reply. In any case, we time-stamp any existing ARP entry,
-     * and possibly send out an IP packet that was queued on it. */
+    /* ARP request? */
+    case PP_HTONS(ARP_REQUEST):
+      /* ARP request. If it asked for our address, we send out a
+       * reply. In any case, we time-stamp any existing ARP entry,
+       * and possibly send out an IP packet that was queued on it. */
 
-    LWIP_DEBUGF (ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: incoming ARP request\n"));
-    /* ARP request for our address? */
-    if (for_us) {
-      /* send ARP response */
-      etharp_raw(netif,
-                 (struct eth_addr *)netif->hwaddr, &hdr->shwaddr,
-                 (struct eth_addr *)netif->hwaddr, netif_ip4_addr(netif),
-                 &hdr->shwaddr, &sipaddr,
-                 ARP_REPLY);
-    /* we are not configured? */
-    } else if (ip4_addr_isany_val(*netif_ip4_addr(netif))) {
-      /* { for_us == 0 and netif->ip_addr.addr == 0 } */
-      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: we are unconfigured, ARP request ignored.\n"));
-    /* request was not directed to us */
-    } else {
-      /* { for_us == 0 and netif->ip_addr.addr != 0 } */
-      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: ARP request was not for us.\n"));
-    }
-    break;
-  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"));
+      LWIP_DEBUGF (ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: incoming ARP request\n"));
+      /* ARP request for our address? */
+      if (for_us) {
+        /* send ARP response */
+        etharp_raw(netif,
+                   (struct eth_addr *)netif->hwaddr, &hdr->shwaddr,
+                   (struct eth_addr *)netif->hwaddr, netif_ip4_addr(netif),
+                   &hdr->shwaddr, &sipaddr,
+                   ARP_REPLY);
+        /* we are not configured? */
+      } else if (ip4_addr_isany_val(*netif_ip4_addr(netif))) {
+        /* { for_us == 0 and netif->ip_addr.addr == 0 } */
+        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: we are unconfigured, ARP request ignored.\n"));
+        /* request was not directed to us */
+      } else {
+        /* { for_us == 0 and netif->ip_addr.addr != 0 } */
+        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: ARP request was not for us.\n"));
+      }
+      break;
+    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);
+      /* 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)));
-    ETHARP_STATS_INC(etharp.err);
-    break;
+      break;
+    default:
+      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: ARP unknown opcode type %"S16_F"\n", lwip_htons(hdr->opcode)));
+      ETHARP_STATS_INC(etharp.err);
+      break;
   }
   /* free ARP packet */
   pbuf_free(p);
@@ -743,7 +745,7 @@
  * in the arp_table specified by the index 'arp_idx'.
  */
 static err_t
-etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx)
+etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, netif_addr_idx_t arp_idx)
 {
   LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE",
               arp_table[arp_idx].state >= ETHARP_STATE_STABLE);
@@ -764,7 +766,7 @@
     }
   }
 
-  return ethernet_output(netif, q, (struct eth_addr*)(netif->hwaddr), &arp_table[arp_idx].ethaddr, ETHTYPE_IP);
+  return ethernet_output(netif, q, (struct eth_addr *)(netif->hwaddr), &arp_table[arp_idx].ethaddr, ETHTYPE_IP);
 }
 
 /**
@@ -792,6 +794,7 @@
   struct eth_addr mcastaddr;
   const ip4_addr_t *dst_addr = ipaddr;
 
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("netif != NULL", netif != NULL);
   LWIP_ASSERT("q != NULL", q != NULL);
   LWIP_ASSERT("ipaddr != NULL", ipaddr != NULL);
@@ -803,7 +806,7 @@
   if (ip4_addr_isbroadcast(ipaddr, netif)) {
     /* broadcast on Ethernet also */
     dest = (const struct eth_addr *)&ethbroadcast;
-  /* multicast destination IP address? */
+    /* multicast destination IP address? */
   } else if (ip4_addr_ismulticast(ipaddr)) {
     /* Hash IP multicast address to MAC address.*/
     mcastaddr.addr[0] = LL_IP4_MULTICAST_ADDR_0;
@@ -814,15 +817,15 @@
     mcastaddr.addr[5] = ip4_addr4(ipaddr);
     /* destination Ethernet address is multicast */
     dest = &mcastaddr;
-  /* unicast destination IP address? */
+    /* unicast destination IP address? */
   } else {
-    s8_t i;
+    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)) &&
         !ip4_addr_islinklocal(ipaddr)) {
 #if LWIP_AUTOIP
-      struct ip_hdr *iphdr = LWIP_ALIGNMENT_CAST(struct ip_hdr*, q->payload);
+      struct ip_hdr *iphdr = LWIP_ALIGNMENT_CAST(struct ip_hdr *, q->payload);
       /* According to RFC 3297, chapter 2.6.2 (Forwarding Rules), a packet with
          a link-local source address must always be "directly to its destination
          on the same physical link. The host MUST NOT send the packet to any
@@ -841,7 +844,7 @@
           if (!ip4_addr_isany_val(*netif_ip4_gw(netif))) {
             /* send to hardware address of default gateway IP address */
             dst_addr = netif_ip4_gw(netif);
-          /* no default gateway available */
+            /* no default gateway available */
           } else {
             /* no route to destination error (default gateway missing) */
             return ERR_RTE;
@@ -850,9 +853,9 @@
       }
     }
 #if LWIP_NETIF_HWADDRHINT
-    if (netif->addr_hint != NULL) {
+    if (netif->hints != NULL) {
       /* per-pcb cached entry was given */
-      u8_t etharp_cached_entry = *(netif->addr_hint);
+      netif_addr_idx_t etharp_cached_entry = netif->hints->addr_hint;
       if (etharp_cached_entry < ARP_TABLE_SIZE) {
 #endif /* LWIP_NETIF_HWADDRHINT */
         if ((arp_table[etharp_cached_entry].state >= ETHARP_STATE_STABLE) &&
@@ -878,7 +881,7 @@
 #endif
           (ip4_addr_cmp(dst_addr, &arp_table[i].ipaddr))) {
         /* found an existing, stable entry */
-        ETHARP_SET_HINT(netif, i);
+        ETHARP_SET_ADDRHINT(netif, i);
         return etharp_output_to_arp_index(netif, q, i);
       }
     }
@@ -890,7 +893,7 @@
   /* continuation for multicast/broadcast destinations */
   /* obtain source Ethernet address of the given interface */
   /* send packet directly on the link */
-  return ethernet_output(netif, q, (struct eth_addr*)(netif->hwaddr), dest, ETHTYPE_IP);
+  return ethernet_output(netif, q, (struct eth_addr *)(netif->hwaddr), dest, ETHTYPE_IP);
 }
 
 /**
@@ -929,10 +932,11 @@
 err_t
 etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q)
 {
-  struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr;
+  struct eth_addr *srcaddr = (struct eth_addr *)netif->hwaddr;
   err_t result = ERR_MEM;
   int is_new_entry = 0;
-  s8_t i; /* ARP entry index */
+  s16_t i_err;
+  netif_addr_idx_t i;
 
   /* non-unicast address? */
   if (ip4_addr_isbroadcast(ipaddr, netif) ||
@@ -943,17 +947,19 @@
   }
 
   /* find entry in ARP cache, ask to create entry if queueing packet */
-  i = etharp_find_entry(ipaddr, ETHARP_FLAG_TRY_HARD, netif);
+  i_err = etharp_find_entry(ipaddr, ETHARP_FLAG_TRY_HARD, netif);
 
   /* could not find or create entry? */
-  if (i < 0) {
+  if (i_err < 0) {
     LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not create ARP entry\n"));
     if (q) {
       LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: packet dropped\n"));
       ETHARP_STATS_INC(etharp.memerr);
     }
-    return (err_t)i;
+    return (err_t)i_err;
   }
+  LWIP_ASSERT("type overflow", (size_t)i_err < NETIF_ADDR_IDX_MAX);
+  i = (netif_addr_idx_t)i_err;
 
   /* mark a fresh entry as pending (we just sent a request) */
   if (arp_table[i].state == ETHARP_STATE_EMPTY) {
@@ -965,8 +971,8 @@
 
   /* { i is either a STABLE or (new or existing) PENDING entry } */
   LWIP_ASSERT("arp_table[i].state == PENDING or STABLE",
-  ((arp_table[i].state == ETHARP_STATE_PENDING) ||
-   (arp_table[i].state >= ETHARP_STATE_STABLE)));
+              ((arp_table[i].state == ETHARP_STATE_PENDING) ||
+               (arp_table[i].state >= ETHARP_STATE_STABLE)));
 
   /* do we have a new entry? or an implicit query request? */
   if (is_new_entry || (q == NULL)) {
@@ -988,21 +994,20 @@
   /* stable entry? */
   if (arp_table[i].state >= ETHARP_STATE_STABLE) {
     /* we have a valid IP->Ethernet address mapping */
-    ETHARP_SET_HINT(netif, i);
+    ETHARP_SET_ADDRHINT(netif, i);
     /* send the packet */
     result = ethernet_output(netif, q, srcaddr, &(arp_table[i].ethaddr), ETHTYPE_IP);
-  /* pending entry? (either just created or already pending */
+    /* pending entry? (either just created or already pending */
   } else if (arp_table[i].state == ETHARP_STATE_PENDING) {
     /* entry is still pending, queue the given packet 'q' */
     struct pbuf *p;
     int copy_needed = 0;
-    /* IF q includes a PBUF_REF, PBUF_POOL or PBUF_RAM, we have no choice but
-     * to copy the whole queue into a new PBUF_RAM (see bug #11400)
-     * PBUF_ROMs can be left as they are, since ROM must not get changed. */
+    /* IF q includes a pbuf that must be copied, copy the whole chain into a
+     * 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));
-      if (p->type != PBUF_ROM) {
+      if (PBUF_NEEDS_COPY(p)) {
         copy_needed = 1;
         break;
       }
@@ -1010,13 +1015,7 @@
     }
     if (copy_needed) {
       /* copy the whole packet into new pbufs */
-      p = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM);
-      if (p != NULL) {
-        if (pbuf_copy(p, q) != ERR_OK) {
-          pbuf_free(p);
-          p = NULL;
-        }
-      }
+      p = pbuf_clone(PBUF_LINK, PBUF_RAM, q);
     } else {
       /* referencing the old pbuf is enough */
       p = q;
@@ -1056,7 +1055,7 @@
           memp_free(MEMP_ARP_QUEUE, old);
         }
 #endif
-        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"S16_F"\n", (void *)q, (s16_t)i));
+        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"U16_F"\n", (void *)q, i));
         result = ERR_OK;
       } else {
         /* the pool MEMP_ARP_QUEUE is empty */
@@ -1067,12 +1066,12 @@
 #else /* ARP_QUEUEING */
       /* always queue one packet per ARP request only, freeing a previously queued packet */
       if (arp_table[i].q != NULL) {
-        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: dropped previously queued packet %p for ARP entry %"S16_F"\n", (void *)q, (s16_t)i));
+        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: dropped previously queued packet %p for ARP entry %"U16_F"\n", (void *)q, (u16_t)i));
         pbuf_free(arp_table[i].q);
       }
       arp_table[i].q = p;
       result = ERR_OK;
-      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"S16_F"\n", (void *)q, (s16_t)i));
+      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"U16_F"\n", (void *)q, (u16_t)i));
 #endif /* ARP_QUEUEING */
     } else {
       ETHARP_STATS_INC(etharp.memerr);
@@ -1116,7 +1115,7 @@
   /* could allocate a pbuf for an ARP request? */
   if (p == NULL) {
     LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
-      ("etharp_raw: could not allocate pbuf for ARP request.\n"));
+                ("etharp_raw: could not allocate pbuf for ARP request.\n"));
     ETHARP_STATS_INC(etharp.memerr);
     return ERR_MEM;
   }
@@ -1131,14 +1130,14 @@
               (netif->hwaddr_len == ETH_HWADDR_LEN));
 
   /* Write the ARP MAC-Addresses */
-  ETHADDR16_COPY(&hdr->shwaddr, hwsrc_addr);
-  ETHADDR16_COPY(&hdr->dhwaddr, hwdst_addr);
-  /* Copy struct ip4_addr2 to aligned ip4_addr, to support compilers without
+  SMEMCPY(&hdr->shwaddr, hwsrc_addr, ETH_HWADDR_LEN);
+  SMEMCPY(&hdr->dhwaddr, hwdst_addr, ETH_HWADDR_LEN);
+  /* Copy struct ip4_addr_wordaligned to aligned ip4_addr, to support compilers without
    * structure packing. */
-  IPADDR2_COPY(&hdr->sipaddr, ipsrc_addr);
-  IPADDR2_COPY(&hdr->dipaddr, ipdst_addr);
+  IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T(&hdr->sipaddr, ipsrc_addr);
+  IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T(&hdr->dipaddr, ipdst_addr);
 
-  hdr->hwtype = PP_HTONS(HWTYPE_ETHERNET);
+  hdr->hwtype = PP_HTONS(LWIP_IANA_HWTYPE_ETHERNET);
   hdr->proto = PP_HTONS(ETHTYPE_IP);
   /* set hwlen and protolen */
   hdr->hwlen = ETH_HWADDR_LEN;
@@ -1149,7 +1148,7 @@
   /* If we are using Link-Local, all ARP packets that contain a Link-Local
    * 'sender IP address' MUST be sent using link-layer broadcast instead of
    * link-layer unicast. (See RFC3927 Section 2.5, last paragraph) */
-  if(ip4_addr_islinklocal(ipsrc_addr)) {
+  if (ip4_addr_islinklocal(ipsrc_addr)) {
     ethernet_output(netif, p, ethsrc_addr, &ethbroadcast, ETHTYPE_ARP);
   } else
 #endif /* LWIP_AUTOIP */
@@ -1179,7 +1178,7 @@
  *         any other err_t on failure
  */
 static err_t
-etharp_request_dst(struct netif *netif, const ip4_addr_t *ipaddr, const struct eth_addr* hw_dst_addr)
+etharp_request_dst(struct netif *netif, const ip4_addr_t *ipaddr, const struct eth_addr *hw_dst_addr)
 {
   return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, hw_dst_addr,
                     (struct eth_addr *)netif->hwaddr, netif_ip4_addr(netif), &ethzero,
@@ -1201,6 +1200,5 @@
   LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_request: sending ARP request.\n"));
   return etharp_request_dst(netif, ipaddr, &ethbroadcast);
 }
-#endif /* LWIP_IPV4 && LWIP_ARP */
 
-#endif /* LWIP_ARP || LWIP_ETHERNET */
+#endif /* LWIP_IPV4 && LWIP_ARP */
diff --git a/src/core/ipv4/icmp.c b/src/core/ipv4/icmp.c
index 5ee24ee..a462ccd 100644
--- a/src/core/ipv4/icmp.c
+++ b/src/core/ipv4/icmp.c
@@ -57,7 +57,7 @@
 
 /** Small optimization: set to 0 if incoming PBUF_POOL pbuf always can be
  * used to modify and send a response packet (and to 1 if this is not the case,
- * e.g. when link header is stripped of when receiving) */
+ * e.g. when link header is stripped off when receiving) */
 #ifndef LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
 #define LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN 1
 #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */
@@ -86,191 +86,198 @@
   struct icmp_echo_hdr *iecho;
   const struct ip_hdr *iphdr_in;
   u16_t hlen;
-  const ip4_addr_t* src;
+  const ip4_addr_t *src;
 
   ICMP_STATS_INC(icmp.recv);
   MIB2_STATS_INC(mib2.icmpinmsgs);
 
   iphdr_in = ip4_current_header();
-  hlen = IPH_HL(iphdr_in) * 4;
+  hlen = IPH_HL_BYTES(iphdr_in);
   if (hlen < IP_HLEN) {
     LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: short IP header (%"S16_F" bytes) received\n", hlen));
     goto lenerr;
   }
-  if (p->len < sizeof(u16_t)*2) {
+  if (p->len < sizeof(u16_t) * 2) {
     LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: short ICMP (%"U16_F" bytes) received\n", p->tot_len));
     goto lenerr;
   }
 
   type = *((u8_t *)p->payload);
 #ifdef LWIP_DEBUG
-  code = *(((u8_t *)p->payload)+1);
+  code = *(((u8_t *)p->payload) + 1);
+  /* if debug is enabled but debug statement below is somehow disabled: */
+  LWIP_UNUSED_ARG(code);
 #endif /* LWIP_DEBUG */
   switch (type) {
-  case ICMP_ER:
-    /* This is OK, echo reply might have been parsed by a raw PCB
-       (as obviously, an echo request has been sent, too). */
-    MIB2_STATS_INC(mib2.icmpinechoreps);
-    break;
-  case ICMP_ECHO:
-    MIB2_STATS_INC(mib2.icmpinechos);
-    src = ip4_current_dest_addr();
-    /* multicast destination address? */
-    if (ip4_addr_ismulticast(ip4_current_dest_addr())) {
+    case ICMP_ER:
+      /* This is OK, echo reply might have been parsed by a raw PCB
+         (as obviously, an echo request has been sent, too). */
+      MIB2_STATS_INC(mib2.icmpinechoreps);
+      break;
+    case ICMP_ECHO:
+      MIB2_STATS_INC(mib2.icmpinechos);
+      src = ip4_current_dest_addr();
+      /* multicast destination address? */
+      if (ip4_addr_ismulticast(ip4_current_dest_addr())) {
 #if LWIP_MULTICAST_PING
-      /* For multicast, use address of receiving interface as source address */
-      src = netif_ip4_addr(inp);
+        /* For multicast, use address of receiving interface as source address */
+        src = netif_ip4_addr(inp);
 #else /* LWIP_MULTICAST_PING */
-      LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: Not echoing to multicast pings\n"));
-      goto icmperr;
+        LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: Not echoing to multicast pings\n"));
+        goto icmperr;
 #endif /* LWIP_MULTICAST_PING */
-    }
-    /* broadcast destination address? */
-    if (ip4_addr_isbroadcast(ip4_current_dest_addr(), ip_current_netif())) {
+      }
+      /* broadcast destination address? */
+      if (ip4_addr_isbroadcast(ip4_current_dest_addr(), ip_current_netif())) {
 #if LWIP_BROADCAST_PING
-      /* For broadcast, use address of receiving interface as source address */
-      src = netif_ip4_addr(inp);
+        /* For broadcast, use address of receiving interface as source address */
+        src = netif_ip4_addr(inp);
 #else /* LWIP_BROADCAST_PING */
-      LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: Not echoing to broadcast pings\n"));
-      goto icmperr;
+        LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: Not echoing to broadcast pings\n"));
+        goto icmperr;
 #endif /* LWIP_BROADCAST_PING */
-    }
-    LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n"));
-    if (p->tot_len < sizeof(struct icmp_echo_hdr)) {
-      LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n"));
-      goto lenerr;
-    }
+      }
+      LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n"));
+      if (p->tot_len < sizeof(struct icmp_echo_hdr)) {
+        LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n"));
+        goto lenerr;
+      }
 #if CHECKSUM_CHECK_ICMP
-    IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_CHECK_ICMP) {
-      if (inet_chksum_pbuf(p) != 0) {
-        LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo\n"));
-        pbuf_free(p);
-        ICMP_STATS_INC(icmp.chkerr);
-        MIB2_STATS_INC(mib2.icmpinerrors);
-        return;
-      }
-    }
-#endif
-#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
-    if (pbuf_header(p, (s16_t)(hlen + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN))) {
-      /* p is not big enough to contain link headers
-       * allocate a new one and copy p into it
-       */
-      struct pbuf *r;
-      /* allocate new packet buffer with space for link headers */
-      r = pbuf_alloc(PBUF_LINK, p->tot_len + hlen, PBUF_RAM);
-      if (r == NULL) {
-        LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: allocating new pbuf failed\n"));
-        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"));
-        pbuf_free(r);
-        goto icmperr;
-      }
-      /* copy the ip header */
-      MEMCPY(r->payload, iphdr_in, hlen);
-      /* switch r->payload back to icmp header (cannot fail) */
-      if (pbuf_header(r, (s16_t)-hlen)) {
-        LWIP_ASSERT("icmp_input: moving r->payload to icmp header failed\n", 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"));
-        pbuf_free(r);
-        goto icmperr;
-      }
-      /* free the original p */
-      pbuf_free(p);
-      /* we now have an identical copy of p that has room for link headers */
-      p = r;
-    } else {
-      /* restore p->payload to point to icmp header (cannot fail) */
-      if (pbuf_header(p, -(s16_t)(hlen + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN))) {
-        LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0);
-        goto icmperr;
-      }
-    }
-#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */
-    /* At this point, all checks are OK. */
-    /* We generate an answer by switching the dest and src ip addresses,
-     * setting the icmp type to ECHO_RESPONSE and updating the checksum. */
-    iecho = (struct icmp_echo_hdr *)p->payload;
-    if (pbuf_header(p, (s16_t)hlen)) {
-      LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Can't move over header in packet"));
-    } else {
-      err_t ret;
-      struct ip_hdr *iphdr = (struct ip_hdr*)p->payload;
-      ip4_addr_copy(iphdr->src, *src);
-      ip4_addr_copy(iphdr->dest, *ip4_current_src_addr());
-      ICMPH_TYPE_SET(iecho, ICMP_ER);
-#if CHECKSUM_GEN_ICMP
-      IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_ICMP) {
-        /* adjust the checksum */
-        if (iecho->chksum > PP_HTONS(0xffffU - (ICMP_ECHO << 8))) {
-          iecho->chksum += PP_HTONS(ICMP_ECHO << 8) + 1;
-        } else {
-          iecho->chksum += PP_HTONS(ICMP_ECHO << 8);
+      IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_CHECK_ICMP) {
+        if (inet_chksum_pbuf(p) != 0) {
+          LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo\n"));
+          pbuf_free(p);
+          ICMP_STATS_INC(icmp.chkerr);
+          MIB2_STATS_INC(mib2.icmpinerrors);
+          return;
         }
       }
-#if LWIP_CHECKSUM_CTRL_PER_NETIF
-      else {
-        iecho->chksum = 0;
+#endif
+#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
+      if (pbuf_add_header(p, hlen + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN)) {
+        /* p is not big enough to contain link headers
+         * allocate a new one and copy p into it
+         */
+        struct pbuf *r;
+        u16_t alloc_len = (u16_t)(p->tot_len + hlen);
+        if (alloc_len < p->tot_len) {
+          LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: allocating new pbuf failed (tot_len overflow)\n"));
+          goto icmperr;
+        }
+        /* allocate new packet buffer with space for link headers */
+        r = pbuf_alloc(PBUF_LINK, alloc_len, PBUF_RAM);
+        if (r == NULL) {
+          LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: allocating new pbuf failed\n"));
+          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"));
+          pbuf_free(r);
+          goto icmperr;
+        }
+        /* copy the ip header */
+        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);
+          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"));
+          pbuf_free(r);
+          goto icmperr;
+        }
+        /* free the original p */
+        pbuf_free(p);
+        /* we now have an identical copy of p that has room for link headers */
+        p = r;
+      } 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);
+          goto icmperr;
+        }
       }
+#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */
+      /* At this point, all checks are OK. */
+      /* We generate an answer by switching the dest and src ip addresses,
+       * 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"));
+      } else {
+        err_t ret;
+        struct ip_hdr *iphdr = (struct ip_hdr *)p->payload;
+        ip4_addr_copy(iphdr->src, *src);
+        ip4_addr_copy(iphdr->dest, *ip4_current_src_addr());
+        ICMPH_TYPE_SET(iecho, ICMP_ER);
+#if CHECKSUM_GEN_ICMP
+        IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_ICMP) {
+          /* adjust the checksum */
+          if (iecho->chksum > PP_HTONS(0xffffU - (ICMP_ECHO << 8))) {
+            iecho->chksum = (u16_t)(iecho->chksum + PP_HTONS((u16_t)(ICMP_ECHO << 8)) + 1);
+          } else {
+            iecho->chksum = (u16_t)(iecho->chksum + PP_HTONS(ICMP_ECHO << 8));
+          }
+        }
+#if LWIP_CHECKSUM_CTRL_PER_NETIF
+        else {
+          iecho->chksum = 0;
+        }
 #endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */
 #else /* CHECKSUM_GEN_ICMP */
-      iecho->chksum = 0;
+        iecho->chksum = 0;
 #endif /* CHECKSUM_GEN_ICMP */
 
-      /* Set the correct TTL and recalculate the header checksum. */
-      IPH_TTL_SET(iphdr, ICMP_TTL);
-      IPH_CHKSUM_SET(iphdr, 0);
+        /* Set the correct TTL and recalculate the header checksum. */
+        IPH_TTL_SET(iphdr, ICMP_TTL);
+        IPH_CHKSUM_SET(iphdr, 0);
 #if CHECKSUM_GEN_IP
-      IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_IP) {
-        IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, hlen));
-      }
+        IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_IP) {
+          IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, hlen));
+        }
 #endif /* CHECKSUM_GEN_IP */
 
-      ICMP_STATS_INC(icmp.xmit);
-      /* increase number of messages attempted to send */
-      MIB2_STATS_INC(mib2.icmpoutmsgs);
-      /* increase number of echo replies attempted to send */
-      MIB2_STATS_INC(mib2.icmpoutechoreps);
+        ICMP_STATS_INC(icmp.xmit);
+        /* increase number of messages attempted to send */
+        MIB2_STATS_INC(mib2.icmpoutmsgs);
+        /* increase number of echo replies attempted to send */
+        MIB2_STATS_INC(mib2.icmpoutechoreps);
 
-      /* send an ICMP packet */
-      ret = ip4_output_if(p, src, LWIP_IP_HDRINCL,
-                   ICMP_TTL, 0, IP_PROTO_ICMP, inp);
-      if (ret != ERR_OK) {
-        LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ip_output_if returned an error: %s\n", lwip_strerr(ret)));
+        /* send an ICMP packet */
+        ret = ip4_output_if(p, src, LWIP_IP_HDRINCL,
+                            ICMP_TTL, 0, IP_PROTO_ICMP, inp);
+        if (ret != ERR_OK) {
+          LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ip_output_if returned an error: %s\n", lwip_strerr(ret)));
+        }
       }
-    }
-    break;
-  default:
-    if (type == ICMP_DUR) {
-      MIB2_STATS_INC(mib2.icmpindestunreachs);
-    } else if (type == ICMP_TE) {
-      MIB2_STATS_INC(mib2.icmpintimeexcds);
-    } else if (type == ICMP_PP) {
-      MIB2_STATS_INC(mib2.icmpinparmprobs);
-    } else if (type == ICMP_SQ) {
-      MIB2_STATS_INC(mib2.icmpinsrcquenchs);
-    } else if (type == ICMP_RD) {
-      MIB2_STATS_INC(mib2.icmpinredirects);
-    } else if (type == ICMP_TS) {
-      MIB2_STATS_INC(mib2.icmpintimestamps);
-    } else if (type == ICMP_TSR) {
-      MIB2_STATS_INC(mib2.icmpintimestampreps);
-    } else if (type == ICMP_AM) {
-      MIB2_STATS_INC(mib2.icmpinaddrmasks);
-    } else if (type == ICMP_AMR) {
-      MIB2_STATS_INC(mib2.icmpinaddrmaskreps);
-    }
-    LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" code %"S16_F" not supported.\n",
-                (s16_t)type, (s16_t)code));
-    ICMP_STATS_INC(icmp.proterr);
-    ICMP_STATS_INC(icmp.drop);
+      break;
+    default:
+      if (type == ICMP_DUR) {
+        MIB2_STATS_INC(mib2.icmpindestunreachs);
+      } else if (type == ICMP_TE) {
+        MIB2_STATS_INC(mib2.icmpintimeexcds);
+      } else if (type == ICMP_PP) {
+        MIB2_STATS_INC(mib2.icmpinparmprobs);
+      } else if (type == ICMP_SQ) {
+        MIB2_STATS_INC(mib2.icmpinsrcquenchs);
+      } else if (type == ICMP_RD) {
+        MIB2_STATS_INC(mib2.icmpinredirects);
+      } else if (type == ICMP_TS) {
+        MIB2_STATS_INC(mib2.icmpintimestamps);
+      } else if (type == ICMP_TSR) {
+        MIB2_STATS_INC(mib2.icmpintimestampreps);
+      } else if (type == ICMP_AM) {
+        MIB2_STATS_INC(mib2.icmpinaddrmasks);
+      } else if (type == ICMP_AMR) {
+        MIB2_STATS_INC(mib2.icmpinaddrmaskreps);
+      }
+      LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" code %"S16_F" not supported.\n",
+                               (s16_t)type, (s16_t)code));
+      ICMP_STATS_INC(icmp.proterr);
+      ICMP_STATS_INC(icmp.drop);
   }
   pbuf_free(p);
   return;
@@ -351,7 +358,7 @@
     return;
   }
   LWIP_ASSERT("check that first pbuf can hold icmp message",
-             (q->len >= (sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE)));
+              (q->len >= (sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE)));
 
   iphdr = (struct ip_hdr *)p->payload;
   LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded from "));
@@ -375,7 +382,7 @@
   {
     ip4_addr_t iphdr_dst;
     ip4_addr_copy(iphdr_dst, iphdr->dest);
-    netif = ip4_route_src(&iphdr_src, &iphdr_dst);
+    netif = ip4_route_src(&iphdr_dst, &iphdr_src);
   }
 #else
   netif = ip4_route(&iphdr_src);
diff --git a/src/core/ipv4/igmp.c b/src/core/ipv4/igmp.c
index 74a6c37..b655aa3 100644
--- a/src/core/ipv4/igmp.c
+++ b/src/core/ipv4/igmp.c
@@ -94,10 +94,10 @@
 #include "lwip/stats.h"
 #include "lwip/prot/igmp.h"
 
-#include "string.h"
+#include <string.h>
 
 static struct igmp_group *igmp_lookup_group(struct netif *ifp, const ip4_addr_t *addr);
-static err_t  igmp_remove_group(struct netif* netif, struct igmp_group *group);
+static err_t  igmp_remove_group(struct netif *netif, struct igmp_group *group);
 static void   igmp_timeout(struct netif *netif, struct igmp_group *group);
 static void   igmp_start_timer(struct igmp_group *group, u8_t max_time);
 static void   igmp_delaying_member(struct igmp_group *group, u8_t maxresp);
@@ -127,9 +127,9 @@
 err_t
 igmp_start(struct netif *netif)
 {
-  struct igmp_group* group;
+  struct igmp_group *group;
 
-  LWIP_DEBUGF(IGMP_DEBUG, ("igmp_start: starting IGMP processing on if %p\n", (void*)netif));
+  LWIP_DEBUGF(IGMP_DEBUG, ("igmp_start: starting IGMP processing on if %p\n", (void *)netif));
 
   group = igmp_lookup_group(netif, &allsystems);
 
@@ -141,7 +141,7 @@
     if (netif->igmp_mac_filter != NULL) {
       LWIP_DEBUGF(IGMP_DEBUG, ("igmp_start: igmp_mac_filter(ADD "));
       ip4_addr_debug_print_val(IGMP_DEBUG, allsystems);
-      LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", (void*)netif));
+      LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", (void *)netif));
       netif->igmp_mac_filter(netif, &allsystems, NETIF_ADD_MAC_FILTER);
     }
 
@@ -169,8 +169,8 @@
     /* disable the group at the MAC level */
     if (netif->igmp_mac_filter != NULL) {
       LWIP_DEBUGF(IGMP_DEBUG, ("igmp_stop: igmp_mac_filter(DEL "));
-      ip4_addr_debug_print(IGMP_DEBUG, &group->group_address);
-      LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", (void*)netif));
+      ip4_addr_debug_print_val(IGMP_DEBUG, group->group_address);
+      LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", (void *)netif));
       netif->igmp_mac_filter(netif, &(group->group_address), NETIF_DEL_MAC_FILTER);
     }
 
@@ -193,13 +193,13 @@
 {
   struct igmp_group *group = netif_igmp_data(netif);
 
-  LWIP_DEBUGF(IGMP_DEBUG, ("igmp_report_groups: sending IGMP reports on if %p\n", (void*)netif));
+  LWIP_DEBUGF(IGMP_DEBUG, ("igmp_report_groups: sending IGMP reports on if %p\n", (void *)netif));
 
   /* Skip the first group in the list, it is always the allsystems group added in igmp_start() */
-  if(group != NULL) {
+  if (group != NULL) {
     group = group->next;
   }
-  
+
   while (group != NULL) {
     igmp_delaying_member(group, IGMP_JOIN_DELAYING_MEMBER_TMR);
     group = group->next;
@@ -207,7 +207,7 @@
 }
 
 /**
- * Search for a group in the global igmp_group_list
+ * Search for a group in the netif's igmp group list
  *
  * @param ifp the network interface for which to look
  * @param addr the group ip address to search for
@@ -252,7 +252,7 @@
     /* Group already exists. */
     return group;
   }
-  
+
   /* Group doesn't exist yet, create a new one */
   group = (struct igmp_group *)memp_malloc(MEMP_IGMP_GROUP);
   if (group != NULL) {
@@ -262,37 +262,37 @@
     group->last_reporter_flag = 0;
     group->use                = 0;
 
-    /* Ensure allsystems group is always first in list */    
+    /* Ensure allsystems group is always first in list */
     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_cmp(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_cmp(addr, &allsystems) == 0));
       group->next = list_head->next;
       list_head->next = group;
     }
   }
 
-  LWIP_DEBUGF(IGMP_DEBUG, ("igmp_lookup_group: %sallocated a new group with address ", (group?"":"impossible to ")));
+  LWIP_DEBUGF(IGMP_DEBUG, ("igmp_lookup_group: %sallocated a new group with address ", (group ? "" : "impossible to ")));
   ip4_addr_debug_print(IGMP_DEBUG, addr);
-  LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", (void*)ifp));
+  LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", (void *)ifp));
 
   return group;
 }
 
 /**
- * Remove a group in the global igmp_group_list, but don't free it yet
+ * Remove a group from netif's igmp group list, but don't free it yet
  *
- * @param group the group to remove from the global igmp_group_list
+ * @param group the group to remove from the netif's igmp group list
  * @return ERR_OK if group was removed from the list, an err_t otherwise
  */
 static err_t
-igmp_remove_group(struct netif* netif, struct igmp_group *group)
+igmp_remove_group(struct netif *netif, struct igmp_group *group)
 {
   err_t err = ERR_OK;
   struct igmp_group *tmp_group;
@@ -304,7 +304,7 @@
       break;
     }
   }
-  /* Group not found in the global igmp_group_list */
+  /* Group not found in netif's igmp group list */
   if (tmp_group == NULL) {
     err = ERR_ARG;
   }
@@ -322,9 +322,9 @@
 void
 igmp_input(struct pbuf *p, struct netif *inp, const ip4_addr_t *dest)
 {
-  struct igmp_msg*   igmp;
-  struct igmp_group* group;
-  struct igmp_group* groupref;
+  struct igmp_msg   *igmp;
+  struct igmp_group *group;
+  struct igmp_group *groupref;
 
   IGMP_STATS_INC(igmp.recv);
 
@@ -337,10 +337,10 @@
   }
 
   LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: message from "));
-  ip4_addr_debug_print(IGMP_DEBUG, &(ip4_current_header()->src));
+  ip4_addr_debug_print_val(IGMP_DEBUG, ip4_current_header()->src);
   LWIP_DEBUGF(IGMP_DEBUG, (" to address "));
-  ip4_addr_debug_print(IGMP_DEBUG, &(ip4_current_header()->dest));
-  LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", (void*)inp));
+  ip4_addr_debug_print_val(IGMP_DEBUG, ip4_current_header()->dest);
+  LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", (void *)inp));
 
   /* Now calculate and check the checksum */
   igmp = (struct igmp_msg *)p->payload;
@@ -364,73 +364,73 @@
 
   /* NOW ACT ON THE INCOMING MESSAGE TYPE... */
   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)) {
-      /* 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)));
+    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)) {
+        /* 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)));
 
-      if (igmp->igmp_maxresp == 0) {
-        IGMP_STATS_INC(igmp.rx_v1);
-        LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: got an all hosts query with time== 0 - this is V1 and not implemented - treat as v2\n"));
-        igmp->igmp_maxresp = IGMP_V1_DELAYING_MEMBER_TMR;
-      } else {
-        IGMP_STATS_INC(igmp.rx_general);
-      }
-
-      groupref = netif_igmp_data(inp);
-      
-      /* Do not send messages on the all systems group address! */
-      /* Skip the first group in the list, it is always the allsystems group added in igmp_start() */
-      if(groupref != NULL) {
-        groupref = groupref->next;
-      }
-
-      while (groupref) {
-        igmp_delaying_member(groupref, igmp->igmp_maxresp);
-        groupref = groupref->next;
-      }
-    } else {
-      /* IGMP_MEMB_QUERY to a specific group ? */
-      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(IGMP_DEBUG, &igmp->igmp_group_address);
-        if (ip4_addr_cmp(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 */
-          ip4_addr_copy(groupaddr, igmp->igmp_group_address);
-          group = igmp_lookfor_group(inp, &groupaddr);
+        if (igmp->igmp_maxresp == 0) {
+          IGMP_STATS_INC(igmp.rx_v1);
+          LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: got an all hosts query with time== 0 - this is V1 and not implemented - treat as v2\n"));
+          igmp->igmp_maxresp = IGMP_V1_DELAYING_MEMBER_TMR;
         } else {
-          LWIP_DEBUGF(IGMP_DEBUG, (" with the group address as destination [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp)));
+          IGMP_STATS_INC(igmp.rx_general);
         }
 
-        if (group != NULL) {
-          IGMP_STATS_INC(igmp.rx_group);
-          igmp_delaying_member(group, igmp->igmp_maxresp);
-        } else {
-          IGMP_STATS_INC(igmp.drop);
+        groupref = netif_igmp_data(inp);
+
+        /* Do not send messages on the all systems group address! */
+        /* Skip the first group in the list, it is always the allsystems group added in igmp_start() */
+        if (groupref != NULL) {
+          groupref = groupref->next;
+        }
+
+        while (groupref) {
+          igmp_delaying_member(groupref, igmp->igmp_maxresp);
+          groupref = groupref->next;
         }
       } else {
-        IGMP_STATS_INC(igmp.proterr);
+        /* IGMP_MEMB_QUERY to a specific group ? */
+        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)) {
+            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 */
+            ip4_addr_copy(groupaddr, igmp->igmp_group_address);
+            group = igmp_lookfor_group(inp, &groupaddr);
+          } else {
+            LWIP_DEBUGF(IGMP_DEBUG, (" with the group address as destination [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp)));
+          }
+
+          if (group != NULL) {
+            IGMP_STATS_INC(igmp.rx_group);
+            igmp_delaying_member(group, igmp->igmp_maxresp);
+          } else {
+            IGMP_STATS_INC(igmp.drop);
+          }
+        } else {
+          IGMP_STATS_INC(igmp.proterr);
+        }
       }
-    }
-    break;
-  case IGMP_V2_MEMB_REPORT:
-    LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: IGMP_V2_MEMB_REPORT\n"));
-    IGMP_STATS_INC(igmp.rx_report);
-    if (group->group_state == IGMP_GROUP_DELAYING_MEMBER) {
-      /* This is on a specific group we have already looked up */
-      group->timer = 0; /* stopped */
-      group->group_state = IGMP_GROUP_IDLE_MEMBER;
-      group->last_reporter_flag = 0;
-    }
-    break;
-  default:
-    LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: unexpected msg %d in state %d on group %p on if %p\n",
-      igmp->igmp_msgtype, group->group_state, (void*)&group, (void*)inp));
-    IGMP_STATS_INC(igmp.proterr);
-    break;
+      break;
+    case IGMP_V2_MEMB_REPORT:
+      LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: IGMP_V2_MEMB_REPORT\n"));
+      IGMP_STATS_INC(igmp.rx_report);
+      if (group->group_state == IGMP_GROUP_DELAYING_MEMBER) {
+        /* This is on a specific group we have already looked up */
+        group->timer = 0; /* stopped */
+        group->group_state = IGMP_GROUP_IDLE_MEMBER;
+        group->last_reporter_flag = 0;
+      }
+      break;
+    default:
+      LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: unexpected msg %d in state %d on group %p on if %p\n",
+                               igmp->igmp_msgtype, group->group_state, (void *)&group, (void *)inp));
+      IGMP_STATS_INC(igmp.proterr);
+      break;
   }
 
   pbuf_free(p);
@@ -451,13 +451,14 @@
   err_t err = ERR_VAL; /* no matching interface */
   struct netif *netif;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
   /* 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;);
 
   /* loop through netif's */
-  netif = netif_list;
-  while (netif != NULL) {
+  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)))) {
       err = igmp_joingroup_netif(netif, groupaddr);
@@ -467,8 +468,6 @@
         return err;
       }
     }
-    /* proceed to next network interface */
-    netif = netif->next;
   }
 
   return err;
@@ -487,6 +486,8 @@
 {
   struct igmp_group *group;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
   /* 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;);
@@ -508,10 +509,10 @@
       LWIP_DEBUGF(IGMP_DEBUG, ("\n"));
 
       /* If first use of the group, allow the group at the MAC level */
-      if ((group->use==0) && (netif->igmp_mac_filter != NULL)) {
+      if ((group->use == 0) && (netif->igmp_mac_filter != NULL)) {
         LWIP_DEBUGF(IGMP_DEBUG, ("igmp_joingroup_netif: igmp_mac_filter(ADD "));
         ip4_addr_debug_print(IGMP_DEBUG, groupaddr);
-        LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", (void*)netif));
+        LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", (void *)netif));
         netif->igmp_mac_filter(netif, groupaddr, NETIF_ADD_MAC_FILTER);
       }
 
@@ -547,13 +548,14 @@
   err_t err = ERR_VAL; /* no matching interface */
   struct netif *netif;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
   /* 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;);
 
   /* loop through netif's */
-  netif = netif_list;
-  while (netif != NULL) {
+  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)))) {
       err_t res = igmp_leavegroup_netif(netif, groupaddr);
@@ -562,8 +564,6 @@
         err = res;
       }
     }
-    /* proceed to next network interface */
-    netif = netif->next;
   }
 
   return err;
@@ -582,6 +582,8 @@
 {
   struct igmp_group *group;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
   /* 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;);
@@ -614,7 +616,7 @@
       if (netif->igmp_mac_filter != NULL) {
         LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup_netif: igmp_mac_filter(DEL "));
         ip4_addr_debug_print(IGMP_DEBUG, groupaddr);
-        LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", (void*)netif));
+        LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", (void *)netif));
         netif->igmp_mac_filter(netif, groupaddr, NETIF_DEL_MAC_FILTER);
       }
 
@@ -638,9 +640,9 @@
 void
 igmp_tmr(void)
 {
-  struct netif *netif = netif_list;
+  struct netif *netif;
 
-  while (netif != NULL) {
+  NETIF_FOREACH(netif) {
     struct igmp_group *group = netif_igmp_data(netif);
 
     while (group != NULL) {
@@ -652,7 +654,6 @@
       }
       group = group->next;
     }
-    netif = netif->next;
   }
 }
 
@@ -670,11 +671,11 @@
   if ((group->group_state == IGMP_GROUP_DELAYING_MEMBER) &&
       (!(ip4_addr_cmp(&(group->group_address), &allsystems)))) {
     LWIP_DEBUGF(IGMP_DEBUG, ("igmp_timeout: report membership for group with address "));
-    ip4_addr_debug_print(IGMP_DEBUG, &(group->group_address));
-    LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", (void*)netif));
+    ip4_addr_debug_print_val(IGMP_DEBUG, group->group_address);
+    LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", (void *)netif));
 
     group->group_state = IGMP_GROUP_IDLE_MEMBER;
-    
+
     IGMP_STATS_INC(igmp.tx_report);
     igmp_send(netif, group, IGMP_V2_MEMB_REPORT);
   }
@@ -691,7 +692,7 @@
 igmp_start_timer(struct igmp_group *group, u8_t max_time)
 {
 #ifdef LWIP_RAND
-  group->timer = max_time > 2 ? (LWIP_RAND() % max_time) : 1;
+  group->timer = (u16_t)(max_time > 2 ? (LWIP_RAND() % max_time) : 1);
 #else /* LWIP_RAND */
   /* ATTENTION: use this only if absolutely necessary! */
   group->timer = max_time / 2;
@@ -712,8 +713,8 @@
 igmp_delaying_member(struct igmp_group *group, u8_t maxresp)
 {
   if ((group->group_state == IGMP_GROUP_IDLE_MEMBER) ||
-     ((group->group_state == IGMP_GROUP_DELAYING_MEMBER) &&
-      ((group->timer == 0) || (maxresp < group->timer)))) {
+      ((group->group_state == IGMP_GROUP_DELAYING_MEMBER) &&
+       ((group->timer == 0) || (maxresp < group->timer)))) {
     igmp_start_timer(group, maxresp);
     group->group_state = IGMP_GROUP_DELAYING_MEMBER;
   }
@@ -756,10 +757,10 @@
 static void
 igmp_send(struct netif *netif, struct igmp_group *group, u8_t type)
 {
-  struct pbuf*     p    = NULL;
-  struct igmp_msg* igmp = NULL;
+  struct pbuf     *p    = NULL;
+  struct igmp_msg *igmp = NULL;
   ip4_addr_t   src  = *IP4_ADDR_ANY4;
-  ip4_addr_t*  dest = NULL;
+  ip4_addr_t  *dest = NULL;
 
   /* IP header + "router alert" option + IGMP header */
   p = pbuf_alloc(PBUF_TRANSPORT, IGMP_MINLEN, PBUF_RAM);
@@ -767,7 +768,7 @@
   if (p) {
     igmp = (struct igmp_msg *)p->payload;
     LWIP_ASSERT("igmp_send: check that first pbuf can hold struct igmp_msg",
-               (p->len >= sizeof(struct igmp_msg)));
+                (p->len >= sizeof(struct igmp_msg)));
     ip4_addr_copy(src, *netif_ip4_addr(netif));
 
     if (type == IGMP_V2_MEMB_REPORT) {
diff --git a/src/core/ipv4/ip4.c b/src/core/ipv4/ip4.c
index 4e4eb61..26c26a9 100644
--- a/src/core/ipv4/ip4.c
+++ b/src/core/ipv4/ip4.c
@@ -50,12 +50,12 @@
 #include "lwip/netif.h"
 #include "lwip/icmp.h"
 #include "lwip/igmp.h"
-#include "lwip/raw.h"
+#include "lwip/priv/raw_priv.h"
 #include "lwip/udp.h"
 #include "lwip/priv/tcp_priv.h"
 #include "lwip/autoip.h"
 #include "lwip/stats.h"
-#include "lwip/prot/dhcp.h"
+#include "lwip/prot/iana.h"
 
 #include <string.h>
 
@@ -89,14 +89,14 @@
  */
 #if LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT)
 /* accept DHCP client port and custom port */
-#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) (((port) == PP_NTOHS(DHCP_CLIENT_PORT)) \
+#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) (((port) == PP_NTOHS(LWIP_IANA_PORT_DHCP_CLIENT)) \
          || (LWIP_IP_ACCEPT_UDP_PORT(port)))
 #elif defined(LWIP_IP_ACCEPT_UDP_PORT) /* LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) */
 /* accept custom port only */
 #define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) (LWIP_IP_ACCEPT_UDP_PORT(port))
 #else /* LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) */
 /* accept DHCP client port only */
-#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) ((port) == PP_NTOHS(DHCP_CLIENT_PORT))
+#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) ((port) == PP_NTOHS(LWIP_IANA_PORT_DHCP_CLIENT))
 #endif /* LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) */
 
 #else /* LWIP_DHCP */
@@ -108,13 +108,13 @@
 
 #if LWIP_MULTICAST_TX_OPTIONS
 /** The default netif used for multicast */
-static struct netif* ip4_default_multicast_netif;
+static struct netif *ip4_default_multicast_netif;
 
 /**
  * @ingroup ip4
  * Set a default netif for IPv4 multicast. */
 void
-ip4_set_default_multicast_netif(struct netif* default_multicast_netif)
+ip4_set_default_multicast_netif(struct netif *default_multicast_netif)
 {
   ip4_default_multicast_netif = default_multicast_netif;
 }
@@ -123,14 +123,14 @@
 #ifdef LWIP_HOOK_IP4_ROUTE_SRC
 /**
  * Source based IPv4 routing must be fully implemented in
- * LWIP_HOOK_IP4_ROUTE_SRC(). This function only provides he parameters.
+ * LWIP_HOOK_IP4_ROUTE_SRC(). This function only provides the parameters.
  */
 struct netif *
-ip4_route_src(const ip4_addr_t *dest, const ip4_addr_t *src)
+ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest)
 {
   if (src != NULL) {
     /* when src==NULL, the hook is called from ip4_route(dest) */
-    struct netif *netif = LWIP_HOOK_IP4_ROUTE_SRC(dest, src);
+    struct netif *netif = LWIP_HOOK_IP4_ROUTE_SRC(src, dest);
     if (netif != NULL) {
       return netif;
     }
@@ -151,8 +151,11 @@
 struct netif *
 ip4_route(const ip4_addr_t *dest)
 {
+#if !LWIP_SINGLE_NETIF
   struct netif *netif;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
 #if LWIP_MULTICAST_TX_OPTIONS
   /* Use administratively selected interface for multicast by default */
   if (ip4_addr_ismulticast(dest) && ip4_default_multicast_netif) {
@@ -160,8 +163,11 @@
   }
 #endif /* LWIP_MULTICAST_TX_OPTIONS */
 
+  /* bug #54569: in case LWIP_SINGLE_NETIF=1 and LWIP_DEBUGF() disabled, the following loop is optimized away */
+  LWIP_UNUSED_ARG(dest);
+
   /* iterate through netifs */
-  for (netif = netif_list; netif != NULL; netif = netif->next) {
+  NETIF_FOREACH(netif) {
     /* 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? */
@@ -185,7 +191,7 @@
       return netif_default;
     }
     /* default netif is not up, just use any netif for loopback traffic */
-    for (netif = netif_list; netif != NULL; netif = netif->next) {
+    NETIF_FOREACH(netif) {
       if (netif_is_up(netif)) {
         return netif;
       }
@@ -195,7 +201,7 @@
 #endif /* LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF */
 
 #ifdef LWIP_HOOK_IP4_ROUTE_SRC
-  netif = LWIP_HOOK_IP4_ROUTE_SRC(dest, NULL);
+  netif = LWIP_HOOK_IP4_ROUTE_SRC(NULL, dest);
   if (netif != NULL) {
     return netif;
   }
@@ -205,13 +211,14 @@
     return netif;
   }
 #endif
+#endif /* !LWIP_SINGLE_NETIF */
 
   if ((netif_default == NULL) || !netif_is_up(netif_default) || !netif_is_link_up(netif_default) ||
-      ip4_addr_isany_val(*netif_ip4_addr(netif_default))) {
+      ip4_addr_isany_val(*netif_ip4_addr(netif_default)) || ip4_addr_isloopback(dest)) {
     /* No matching netif found and default netif is not usable.
        If this is not good enough for you, use LWIP_HOOK_IP4_ROUTE() */
     LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_route: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
-      ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));
+                ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));
     IP_STATS_INC(ip.rterr);
     MIB2_STATS_INC(mib2.ipoutnoroutes);
     return NULL;
@@ -233,13 +240,19 @@
 {
   u32_t addr = lwip_htonl(ip4_addr_get_u32(ip4_current_dest_addr()));
 
+#ifdef LWIP_HOOK_IP4_CANFORWARD
+  int ret = LWIP_HOOK_IP4_CANFORWARD(p, addr);
+  if (ret >= 0) {
+    return ret;
+  }
+#endif /* LWIP_HOOK_IP4_CANFORWARD */
+
   if (p->flags & PBUF_FLAG_LLBCAST) {
     /* don't route link-layer broadcasts */
     return 0;
   }
-  if ((p->flags & PBUF_FLAG_LLMCAST) && !IP_MULTICAST(addr)) {
-    /* don't route link-layer multicasts unless the destination address is an IP
-       multicast address */
+  if ((p->flags & PBUF_FLAG_LLMCAST) || IP_MULTICAST(addr)) {
+    /* don't route link-layer multicasts (use LWIP_HOOK_IP4_CANFORWARD instead) */
     return 0;
   }
   if (IP_EXPERIMENTAL(addr)) {
@@ -279,17 +292,17 @@
   /* RFC3927 2.7: do not forward link-local addresses */
   if (ip4_addr_islinklocal(ip4_current_dest_addr())) {
     LWIP_DEBUGF(IP_DEBUG, ("ip4_forward: not forwarding LLA %"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())));
+                           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())));
     goto return_noroute;
   }
 
   /* Find network interface where to forward this IP packet to. */
-  netif = ip4_route_src(ip4_current_dest_addr(), ip4_current_src_addr());
+  netif = ip4_route_src(ip4_current_src_addr(), ip4_current_dest_addr());
   if (netif == NULL) {
     LWIP_DEBUGF(IP_DEBUG, ("ip4_forward: no forwarding route for %"U16_F".%"U16_F".%"U16_F".%"U16_F" found\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())));
+                           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())));
     /* @todo: send ICMP_DUR_NET? */
     goto return_noroute;
   }
@@ -318,14 +331,14 @@
 
   /* Incrementally update the IP checksum. */
   if (IPH_CHKSUM(iphdr) >= PP_HTONS(0xffffU - 0x100)) {
-    IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + PP_HTONS(0x100) + 1);
+    IPH_CHKSUM_SET(iphdr, (u16_t)(IPH_CHKSUM(iphdr) + PP_HTONS(0x100) + 1));
   } else {
-    IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + PP_HTONS(0x100));
+    IPH_CHKSUM_SET(iphdr, (u16_t)(IPH_CHKSUM(iphdr) + PP_HTONS(0x100)));
   }
 
   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())));
+                         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())));
 
   IP_STATS_INC(ip.fw);
   MIB2_STATS_INC(mib2.ipforwdatagrams);
@@ -356,6 +369,45 @@
 }
 #endif /* IP_FORWARD */
 
+/** Return true if the current input packet should be accepted on this netif */
+static int
+ip4_input_accept(struct netif *netif)
+{
+  LWIP_DEBUGF(IP_DEBUG, ("ip_input: iphdr->dest 0x%"X32_F" netif->ip_addr 0x%"X32_F" (0x%"X32_F", 0x%"X32_F", 0x%"X32_F")\n",
+                         ip4_addr_get_u32(ip4_current_dest_addr()), ip4_addr_get_u32(netif_ip4_addr(netif)),
+                         ip4_addr_get_u32(ip4_current_dest_addr()) & ip4_addr_get_u32(netif_ip4_netmask(netif)),
+                         ip4_addr_get_u32(netif_ip4_addr(netif)) & ip4_addr_get_u32(netif_ip4_netmask(netif)),
+                         ip4_addr_get_u32(ip4_current_dest_addr()) & ~ip4_addr_get_u32(netif_ip4_netmask(netif))));
+
+  /* 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)) ||
+        /* or broadcast on this interface network address? */
+        ip4_addr_isbroadcast(ip4_current_dest_addr(), netif)
+#if LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF
+        || (ip4_addr_get_u32(ip4_current_dest_addr()) == PP_HTONL(IPADDR_LOOPBACK))
+#endif /* LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF */
+       ) {
+      LWIP_DEBUGF(IP_DEBUG, ("ip4_input: packet accepted on interface %c%c\n",
+                             netif->name[0], netif->name[1]));
+      /* accept on this netif */
+      return 1;
+    }
+#if LWIP_AUTOIP
+    /* connections to link-local addresses must persist after changing
+        the netif's address (RFC3927 ch. 1.9) */
+    if (autoip_accept_packet(netif, ip4_current_dest_addr())) {
+      LWIP_DEBUGF(IP_DEBUG, ("ip4_input: LLA packet accepted on interface %c%c\n",
+                             netif->name[0], netif->name[1]));
+      /* accept on this netif */
+      return 1;
+    }
+#endif /* LWIP_AUTOIP */
+  }
+  return 0;
+}
+
 /**
  * This function is called by the network interface device driver when
  * an IP packet is received. The function does the basic checks of the
@@ -373,13 +425,18 @@
 err_t
 ip4_input(struct pbuf *p, struct netif *inp)
 {
-  struct ip_hdr *iphdr;
+  const struct ip_hdr *iphdr;
   struct netif *netif;
   u16_t iphdr_hlen;
   u16_t iphdr_len;
 #if IP_ACCEPT_LINK_LAYER_ADDRESSING || LWIP_IGMP
   int check_ip_src = 1;
 #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING || LWIP_IGMP */
+#if LWIP_RAW
+  raw_input_state_t raw_status;
+#endif /* LWIP_RAW */
+
+  LWIP_ASSERT_CORE_LOCKED();
 
   IP_STATS_INC(ip.recv);
   MIB2_STATS_INC(mib2.ipinreceives);
@@ -403,10 +460,8 @@
   }
 #endif
 
-  /* obtain IP header length in number of 32-bit words */
-  iphdr_hlen = IPH_HL(iphdr);
-  /* calculate IP header length in bytes */
-  iphdr_hlen *= 4;
+  /* obtain IP header length in bytes */
+  iphdr_hlen = IPH_HL_BYTES(iphdr);
   /* obtain ip length in bytes */
   iphdr_len = lwip_ntohs(IPH_LEN(iphdr));
 
@@ -419,17 +474,17 @@
   if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len) || (iphdr_hlen < IP_HLEN)) {
     if (iphdr_hlen < IP_HLEN) {
       LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
-        ("ip4_input: short IP header (%"U16_F" bytes) received, IP packet dropped\n", iphdr_hlen));
+                  ("ip4_input: short IP header (%"U16_F" bytes) received, IP packet dropped\n", iphdr_hlen));
     }
     if (iphdr_hlen > p->len) {
       LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
-        ("IP header (len %"U16_F") does not fit in first pbuf (len %"U16_F"), IP packet dropped.\n",
-        iphdr_hlen, p->len));
+                  ("IP header (len %"U16_F") does not fit in first pbuf (len %"U16_F"), IP packet dropped.\n",
+                   iphdr_hlen, p->len));
     }
     if (iphdr_len > p->tot_len) {
       LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
-        ("IP (len %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n",
-        iphdr_len, p->tot_len));
+                  ("IP (len %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n",
+                   iphdr_len, p->tot_len));
     }
     /* free (drop) packet pbufs */
     pbuf_free(p);
@@ -445,7 +500,7 @@
     if (inet_chksum(iphdr, iphdr_hlen) != 0) {
 
       LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
-        ("Checksum (0x%"X16_F") failed, IP packet dropped.\n", inet_chksum(iphdr, iphdr_hlen)));
+                  ("Checksum (0x%"X16_F") failed, IP packet dropped.\n", inet_chksum(iphdr, iphdr_hlen)));
       ip4_debug_print(p);
       pbuf_free(p);
       IP_STATS_INC(ip.chkerr);
@@ -484,62 +539,31 @@
 #endif /* LWIP_IGMP */
   } else {
     /* start trying with inp. if that's not acceptable, start walking the
-       list of configured netifs.
-       'first' is used as a boolean to mark whether we started walking the list */
-    int first = 1;
-    netif = inp;
-    do {
-      LWIP_DEBUGF(IP_DEBUG, ("ip_input: iphdr->dest 0x%"X32_F" netif->ip_addr 0x%"X32_F" (0x%"X32_F", 0x%"X32_F", 0x%"X32_F")\n",
-          ip4_addr_get_u32(&iphdr->dest), ip4_addr_get_u32(netif_ip4_addr(netif)),
-          ip4_addr_get_u32(&iphdr->dest) & ip4_addr_get_u32(netif_ip4_netmask(netif)),
-          ip4_addr_get_u32(netif_ip4_addr(netif)) & ip4_addr_get_u32(netif_ip4_netmask(netif)),
-          ip4_addr_get_u32(&iphdr->dest) & ~ip4_addr_get_u32(netif_ip4_netmask(netif))));
-
-      /* 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)) ||
-            /* or broadcast on this interface network address? */
-            ip4_addr_isbroadcast(ip4_current_dest_addr(), netif)
-#if LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF
-            || (ip4_addr_get_u32(ip4_current_dest_addr()) == PP_HTONL(IPADDR_LOOPBACK))
-#endif /* LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF */
-            ) {
-          LWIP_DEBUGF(IP_DEBUG, ("ip4_input: packet accepted on interface %c%c\n",
-              netif->name[0], netif->name[1]));
-          /* break out of for loop */
-          break;
-        }
-#if LWIP_AUTOIP
-        /* connections to link-local addresses must persist after changing
-           the netif's address (RFC3927 ch. 1.9) */
-        if (autoip_accept_packet(netif, ip4_current_dest_addr())) {
-          LWIP_DEBUGF(IP_DEBUG, ("ip4_input: LLA packet accepted on interface %c%c\n",
-              netif->name[0], netif->name[1]));
-          /* break out of for loop */
-          break;
-        }
-#endif /* LWIP_AUTOIP */
-      }
-      if (first) {
+       list of configured netifs. */
+    if (ip4_input_accept(inp)) {
+      netif = inp;
+    } else {
+      netif = NULL;
 #if !LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF
-        /* Packets sent to the loopback address must not be accepted on an
-         * interface that does not have the loopback address assigned to it,
-         * unless a non-loopback interface is used for loopback traffic. */
-        if (ip4_addr_isloopback(ip4_current_dest_addr())) {
-          netif = NULL;
-          break;
-        }
+      /* Packets sent to the loopback address must not be accepted on an
+       * interface that does not have the loopback address assigned to it,
+       * unless a non-loopback interface is used for loopback traffic. */
+      if (!ip4_addr_isloopback(ip4_current_dest_addr()))
 #endif /* !LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF */
-        first = 0;
-        netif = netif_list;
-      } else {
-        netif = netif->next;
+      {
+#if !LWIP_SINGLE_NETIF
+        NETIF_FOREACH(netif) {
+          if (netif == inp) {
+            /* we checked that before already */
+            continue;
+          }
+          if (ip4_input_accept(netif)) {
+            break;
+          }
+        }
+#endif /* !LWIP_SINGLE_NETIF */
       }
-      if (netif == inp) {
-        netif = netif->next;
-      }
-    } while (netif != NULL);
+    }
   }
 
 #if IP_ACCEPT_LINK_LAYER_ADDRESSING
@@ -555,9 +579,9 @@
   if (netif == NULL) {
     /* remote port is DHCP server? */
     if (IPH_PROTO(iphdr) == IP_PROTO_UDP) {
-      struct udp_hdr *udphdr = (struct udp_hdr *)((u8_t *)iphdr + iphdr_hlen);
+      const struct udp_hdr *udphdr = (const struct udp_hdr *)((const u8_t *)iphdr + iphdr_hlen);
       LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip4_input: UDP packet to DHCP client port %"U16_F"\n",
-        lwip_ntohs(udphdr->dest)));
+                                              lwip_ntohs(udphdr->dest)));
       if (IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(udphdr->dest)) {
         LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip4_input: DHCP packet accepted.\n"));
         netif = inp;
@@ -571,7 +595,7 @@
 #if LWIP_IGMP || IP_ACCEPT_LINK_LAYER_ADDRESSING
   if (check_ip_src
 #if IP_ACCEPT_LINK_LAYER_ADDRESSING
-  /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */
+      /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */
       && !ip4_addr_isany_val(*ip4_current_src_addr())
 #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
      )
@@ -598,7 +622,7 @@
     /* non-broadcast packet? */
     if (!ip4_addr_isbroadcast(ip4_current_dest_addr(), inp)) {
       /* try to forward IP packet on (other) interfaces */
-      ip4_forward(p, iphdr, inp);
+      ip4_forward(p, (struct ip_hdr *)p->payload, inp);
     } else
 #endif /* IP_FORWARD */
     {
@@ -613,18 +637,18 @@
   if ((IPH_OFFSET(iphdr) & PP_HTONS(IP_OFFMASK | IP_MF)) != 0) {
 #if IP_REASSEMBLY /* packet fragment reassembly code present? */
     LWIP_DEBUGF(IP_DEBUG, ("IP packet is a fragment (id=0x%04"X16_F" tot_len=%"U16_F" len=%"U16_F" MF=%"U16_F" offset=%"U16_F"), calling ip4_reass()\n",
-      lwip_ntohs(IPH_ID(iphdr)), p->tot_len, lwip_ntohs(IPH_LEN(iphdr)), (u16_t)!!(IPH_OFFSET(iphdr) & PP_HTONS(IP_MF)), (u16_t)((lwip_ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK)*8)));
+                           lwip_ntohs(IPH_ID(iphdr)), p->tot_len, lwip_ntohs(IPH_LEN(iphdr)), (u16_t)!!(IPH_OFFSET(iphdr) & PP_HTONS(IP_MF)), (u16_t)((lwip_ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK) * 8)));
     /* reassemble the packet*/
     p = ip4_reass(p);
     /* packet not fully reassembled yet? */
     if (p == NULL) {
       return ERR_OK;
     }
-    iphdr = (struct ip_hdr *)p->payload;
+    iphdr = (const struct ip_hdr *)p->payload;
 #else /* IP_REASSEMBLY == 0, no packet fragment reassembly code present */
     pbuf_free(p);
     LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP packet dropped since it was fragmented (0x%"X16_F") (while IP_REASSEMBLY == 0).\n",
-      lwip_ntohs(IPH_OFFSET(iphdr))));
+                lwip_ntohs(IPH_OFFSET(iphdr))));
     IP_STATS_INC(ip.opterr);
     IP_STATS_INC(ip.drop);
     /* unsupported protocol feature */
@@ -659,59 +683,67 @@
   ip_data.current_netif = netif;
   ip_data.current_input_netif = inp;
   ip_data.current_ip4_header = iphdr;
-  ip_data.current_ip_header_tot_len = IPH_HL(iphdr) * 4;
+  ip_data.current_ip_header_tot_len = IPH_HL_BYTES(iphdr);
 
 #if LWIP_RAW
   /* raw input did not eat the packet? */
-  if (raw_input(p, inp) == 0)
+  raw_status = raw_input(p, inp);
+  if (raw_status != RAW_INPUT_EATEN)
 #endif /* LWIP_RAW */
   {
-    pbuf_header(p, -(s16_t)iphdr_hlen); /* Move to payload, no check necessary. */
+    pbuf_remove_header(p, iphdr_hlen); /* Move to payload, no check necessary. */
 
     switch (IPH_PROTO(iphdr)) {
 #if LWIP_UDP
-    case IP_PROTO_UDP:
+      case IP_PROTO_UDP:
 #if LWIP_UDPLITE
-    case IP_PROTO_UDPLITE:
+      case IP_PROTO_UDPLITE:
 #endif /* LWIP_UDPLITE */
-      MIB2_STATS_INC(mib2.ipindelivers);
-      udp_input(p, inp);
-      break;
+        MIB2_STATS_INC(mib2.ipindelivers);
+        udp_input(p, inp);
+        break;
 #endif /* LWIP_UDP */
 #if LWIP_TCP
-    case IP_PROTO_TCP:
-      MIB2_STATS_INC(mib2.ipindelivers);
-      tcp_input(p, inp);
-      break;
+      case IP_PROTO_TCP:
+        MIB2_STATS_INC(mib2.ipindelivers);
+        tcp_input(p, inp);
+        break;
 #endif /* LWIP_TCP */
 #if LWIP_ICMP
-    case IP_PROTO_ICMP:
-      MIB2_STATS_INC(mib2.ipindelivers);
-      icmp_input(p, inp);
-      break;
+      case IP_PROTO_ICMP:
+        MIB2_STATS_INC(mib2.ipindelivers);
+        icmp_input(p, inp);
+        break;
 #endif /* LWIP_ICMP */
 #if LWIP_IGMP
-    case IP_PROTO_IGMP:
-      igmp_input(p, inp, ip4_current_dest_addr());
-      break;
+      case IP_PROTO_IGMP:
+        igmp_input(p, inp, ip4_current_dest_addr());
+        break;
 #endif /* LWIP_IGMP */
-    default:
+      default:
+#if LWIP_RAW
+        if (raw_status == RAW_INPUT_DELIVERED) {
+          MIB2_STATS_INC(mib2.ipindelivers);
+        } else
+#endif /* LWIP_RAW */
+        {
 #if LWIP_ICMP
-      /* send ICMP destination protocol unreachable unless is was a broadcast */
-      if (!ip4_addr_isbroadcast(ip4_current_dest_addr(), netif) &&
-          !ip4_addr_ismulticast(ip4_current_dest_addr())) {
-        pbuf_header_force(p, iphdr_hlen); /* Move to ip header, no check necessary. */
-        p->payload = iphdr;
-        icmp_dest_unreach(p, ICMP_DUR_PROTO);
-      }
+          /* send ICMP destination protocol unreachable unless is was a broadcast */
+          if (!ip4_addr_isbroadcast(ip4_current_dest_addr(), netif) &&
+              !ip4_addr_ismulticast(ip4_current_dest_addr())) {
+            pbuf_header_force(p, (s16_t)iphdr_hlen); /* Move to ip header, no check necessary. */
+            icmp_dest_unreach(p, ICMP_DUR_PROTO);
+          }
 #endif /* LWIP_ICMP */
-      pbuf_free(p);
 
-      LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Unsupported transport protocol %"U16_F"\n", (u16_t)IPH_PROTO(iphdr)));
+          LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Unsupported transport protocol %"U16_F"\n", (u16_t)IPH_PROTO(iphdr)));
 
-      IP_STATS_INC(ip.proterr);
-      IP_STATS_INC(ip.drop);
-      MIB2_STATS_INC(mib2.ipinunknownprotos);
+          IP_STATS_INC(ip.proterr);
+          IP_STATS_INC(ip.drop);
+          MIB2_STATS_INC(mib2.ipinunknownprotos);
+        }
+        pbuf_free(p);
+        break;
     }
   }
 
@@ -753,8 +785,8 @@
  */
 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)
+              u8_t ttl, u8_t tos,
+              u8_t proto, struct netif *netif)
 {
 #if IP_OPTIONS_SEND
   return ip4_output_if_opt(p, src, dest, ttl, tos, proto, netif, NULL, 0);
@@ -768,8 +800,8 @@
  */
 err_t
 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)
+                  u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options,
+                  u16_t optlen)
 {
 #endif /* IP_OPTIONS_SEND */
   const ip4_addr_t *src_used = src;
@@ -781,7 +813,7 @@
 
 #if IP_OPTIONS_SEND
   return ip4_output_if_opt_src(p, src_used, dest, ttl, tos, proto, netif,
-    ip_options, optlen);
+                               ip_options, optlen);
 #else /* IP_OPTIONS_SEND */
   return ip4_output_if_src(p, src_used, dest, ttl, tos, proto, netif);
 #endif /* IP_OPTIONS_SEND */
@@ -793,8 +825,8 @@
  */
 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)
+                  u8_t ttl, u8_t tos,
+                  u8_t proto, struct netif *netif)
 {
 #if IP_OPTIONS_SEND
   return ip4_output_if_opt_src(p, src, dest, ttl, tos, proto, netif, NULL, 0);
@@ -806,8 +838,8 @@
  */
 err_t
 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)
+                      u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options,
+                      u16_t optlen)
 {
 #endif /* IP_OPTIONS_SEND */
   struct ip_hdr *iphdr;
@@ -816,6 +848,7 @@
   u32_t chk_sum = 0;
 #endif /* CHECKSUM_GEN_IP_INLINE */
 
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);
 
   MIB2_STATS_INC(mib2.ipoutrequests);
@@ -829,11 +862,18 @@
 #if CHECKSUM_GEN_IP_INLINE
       int i;
 #endif /* CHECKSUM_GEN_IP_INLINE */
+      if (optlen > (IP_HLEN_MAX - IP_HLEN)) {
+        /* optlen too long */
+        LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_output_if_opt: optlen too long\n"));
+        IP_STATS_INC(ip.err);
+        MIB2_STATS_INC(mib2.ipoutdiscards);
+        return ERR_VAL;
+      }
       /* round up to a multiple of 4 */
-      optlen_aligned = ((optlen + 3) & ~3);
-      ip_hlen += optlen_aligned;
+      optlen_aligned = (u16_t)((optlen + 3) & ~3);
+      ip_hlen = (u16_t)(ip_hlen + optlen_aligned);
       /* First write in the IP options */
-      if (pbuf_header(p, optlen_aligned)) {
+      if (pbuf_add_header(p, optlen_aligned)) {
         LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_output_if_opt: not enough room for IP options in pbuf\n"));
         IP_STATS_INC(ip.err);
         MIB2_STATS_INC(mib2.ipoutdiscards);
@@ -842,17 +882,17 @@
       MEMCPY(p->payload, ip_options, optlen);
       if (optlen < optlen_aligned) {
         /* zero the remaining bytes */
-        memset(((char*)p->payload) + optlen, 0, optlen_aligned - optlen);
+        memset(((char *)p->payload) + optlen, 0, (size_t)(optlen_aligned - optlen));
       }
 #if CHECKSUM_GEN_IP_INLINE
-      for (i = 0; i < optlen_aligned/2; i++) {
-        chk_sum += ((u16_t*)p->payload)[i];
+      for (i = 0; i < optlen_aligned / 2; i++) {
+        chk_sum += ((u16_t *)p->payload)[i];
       }
 #endif /* CHECKSUM_GEN_IP_INLINE */
     }
 #endif /* IP_OPTIONS_SEND */
     /* generate IP header */
-    if (pbuf_header(p, IP_HLEN)) {
+    if (pbuf_add_header(p, IP_HLEN)) {
       LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_output: not enough room for IP header in pbuf\n"));
 
       IP_STATS_INC(ip.err);
@@ -862,7 +902,7 @@
 
     iphdr = (struct ip_hdr *)p->payload;
     LWIP_ASSERT("check that first pbuf can hold struct ip_hdr",
-               (p->len >= sizeof(struct ip_hdr)));
+                (p->len >= sizeof(struct ip_hdr)));
 
     IPH_TTL_SET(iphdr, ttl);
     IPH_PROTO_SET(iphdr, proto);
@@ -924,6 +964,12 @@
 #endif /* CHECKSUM_GEN_IP_INLINE */
   } else {
     /* IP header already included in p */
+    if (p->len < IP_HLEN) {
+      LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_output: LWIP_IP_HDRINCL but pbuf is too short\n"));
+      IP_STATS_INC(ip.err);
+      MIB2_STATS_INC(mib2.ipoutdiscards);
+      return ERR_BUF;
+    }
     iphdr = (struct ip_hdr *)p->payload;
     ip4_addr_copy(dest_addr, iphdr->dest);
     dest = &dest_addr;
@@ -939,7 +985,7 @@
 #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()"));
     return netif_loop_output(netif, p);
@@ -980,15 +1026,15 @@
  */
 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)
+           u8_t ttl, u8_t tos, u8_t proto)
 {
   struct netif *netif;
 
   LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);
 
-  if ((netif = ip4_route_src(dest, src)) == NULL) {
+  if ((netif = ip4_route_src(src, dest)) == NULL) {
     LWIP_DEBUGF(IP_DEBUG, ("ip4_output: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
-      ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));
+                           ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));
     IP_STATS_INC(ip.rterr);
     return ERR_RTE;
   }
@@ -996,7 +1042,7 @@
   return ip4_output_if(p, src, dest, ttl, tos, proto, netif);
 }
 
-#if LWIP_NETIF_HWADDRHINT
+#if LWIP_NETIF_USE_HINTS
 /** Like ip_output, but takes and addr_hint pointer that is passed on to netif->addr_hint
  *  before calling ip_output_if.
  *
@@ -1009,7 +1055,7 @@
  * @param ttl the TTL value to be set in the IP header
  * @param tos the TOS value to be set in the IP header
  * @param proto the PROTOCOL to be set in the IP header
- * @param addr_hint address hint pointer set to netif->addr_hint before
+ * @param netif_hint netif output hint pointer set to netif->hint before
  *        calling ip_output_if()
  *
  * @return ERR_RTE if no route is found
@@ -1017,27 +1063,27 @@
  */
 err_t
 ip4_output_hinted(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,
-          u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint)
+                  u8_t ttl, u8_t tos, u8_t proto, struct netif_hint *netif_hint)
 {
   struct netif *netif;
   err_t err;
 
   LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);
 
-  if ((netif = ip4_route_src(dest, src)) == NULL) {
+  if ((netif = ip4_route_src(src, dest)) == NULL) {
     LWIP_DEBUGF(IP_DEBUG, ("ip4_output: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
-      ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));
+                           ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));
     IP_STATS_INC(ip.rterr);
     return ERR_RTE;
   }
 
-  NETIF_SET_HWADDRHINT(netif, addr_hint);
+  NETIF_SET_HINTS(netif, netif_hint);
   err = ip4_output_if(p, src, dest, ttl, tos, proto, netif);
-  NETIF_SET_HWADDRHINT(netif, NULL);
+  NETIF_RESET_HINTS(netif);
 
   return err;
 }
-#endif /* LWIP_NETIF_HWADDRHINT*/
+#endif /* LWIP_NETIF_USE_HINTS*/
 
 #if IP_DEBUG
 /* Print an IP header by using LWIP_DEBUGF
@@ -1051,34 +1097,34 @@
   LWIP_DEBUGF(IP_DEBUG, ("IP header:\n"));
   LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
   LWIP_DEBUGF(IP_DEBUG, ("|%2"S16_F" |%2"S16_F" |  0x%02"X16_F" |     %5"U16_F"     | (v, hl, tos, len)\n",
-                    (u16_t)IPH_V(iphdr),
-                    (u16_t)IPH_HL(iphdr),
-                    (u16_t)IPH_TOS(iphdr),
-                    lwip_ntohs(IPH_LEN(iphdr))));
+                         (u16_t)IPH_V(iphdr),
+                         (u16_t)IPH_HL(iphdr),
+                         (u16_t)IPH_TOS(iphdr),
+                         lwip_ntohs(IPH_LEN(iphdr))));
   LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
   LWIP_DEBUGF(IP_DEBUG, ("|    %5"U16_F"      |%"U16_F"%"U16_F"%"U16_F"|    %4"U16_F"   | (id, flags, offset)\n",
-                    lwip_ntohs(IPH_ID(iphdr)),
-                    (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) >> 15 & 1),
-                    (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) >> 14 & 1),
-                    (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) >> 13 & 1),
-                    (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK)));
+                         lwip_ntohs(IPH_ID(iphdr)),
+                         (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) >> 15 & 1),
+                         (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) >> 14 & 1),
+                         (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) >> 13 & 1),
+                         (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK)));
   LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
   LWIP_DEBUGF(IP_DEBUG, ("|  %3"U16_F"  |  %3"U16_F"  |    0x%04"X16_F"     | (ttl, proto, chksum)\n",
-                    (u16_t)IPH_TTL(iphdr),
-                    (u16_t)IPH_PROTO(iphdr),
-                    lwip_ntohs(IPH_CHKSUM(iphdr))));
+                         (u16_t)IPH_TTL(iphdr),
+                         (u16_t)IPH_PROTO(iphdr),
+                         lwip_ntohs(IPH_CHKSUM(iphdr))));
   LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
   LWIP_DEBUGF(IP_DEBUG, ("|  %3"U16_F"  |  %3"U16_F"  |  %3"U16_F"  |  %3"U16_F"  | (src)\n",
-                    ip4_addr1_16(&iphdr->src),
-                    ip4_addr2_16(&iphdr->src),
-                    ip4_addr3_16(&iphdr->src),
-                    ip4_addr4_16(&iphdr->src)));
+                         ip4_addr1_16_val(iphdr->src),
+                         ip4_addr2_16_val(iphdr->src),
+                         ip4_addr3_16_val(iphdr->src),
+                         ip4_addr4_16_val(iphdr->src)));
   LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
   LWIP_DEBUGF(IP_DEBUG, ("|  %3"U16_F"  |  %3"U16_F"  |  %3"U16_F"  |  %3"U16_F"  | (dest)\n",
-                    ip4_addr1_16(&iphdr->dest),
-                    ip4_addr2_16(&iphdr->dest),
-                    ip4_addr3_16(&iphdr->dest),
-                    ip4_addr4_16(&iphdr->dest)));
+                         ip4_addr1_16_val(iphdr->dest),
+                         ip4_addr2_16_val(iphdr->dest),
+                         ip4_addr3_16_val(iphdr->dest),
+                         ip4_addr4_16_val(iphdr->dest)));
   LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
 }
 #endif /* IP_DEBUG */
diff --git a/src/core/ipv4/ip4_addr.c b/src/core/ipv4/ip4_addr.c
index 2d47992..33204d1 100644
--- a/src/core/ipv4/ip4_addr.c
+++ b/src/core/ipv4/ip4_addr.c
@@ -64,19 +64,19 @@
   if ((~addr == IPADDR_ANY) ||
       (addr == IPADDR_ANY)) {
     return 1;
-  /* no broadcast support on this network interface? */
+    /* no broadcast support on this network interface? */
   } else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) {
     /* the given address cannot be a broadcast address
      * nor can we check against any broadcast addresses */
     return 0;
-  /* address matches network interface address exactly? => no broadcast */
+    /* address matches network interface address exactly? => no broadcast */
   } else if (addr == ip4_addr_get_u32(netif_ip4_addr(netif))) {
     return 0;
-  /*  on the same (sub) network... */
+    /*  on the same (sub) network... */
   } else if (ip4_addr_netcmp(&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))))) {
+             /* ...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))))) {
     /* => network broadcast address */
     return 1;
   } else {
@@ -112,16 +112,6 @@
   return 1;
 }
 
-/* Here for now until needed in other places in lwIP */
-#ifndef isprint
-#define in_range(c, lo, up)  ((u8_t)c >= lo && (u8_t)c <= up)
-#define isprint(c)           in_range(c, 0x20, 0x7f)
-#define isdigit(c)           in_range(c, '0', '9')
-#define isxdigit(c)          (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F'))
-#define islower(c)           in_range(c, 'a', 'z')
-#define isspace(c)           (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v')
-#endif
-
 /**
  * Ascii internet address interpretation routine.
  * The value returned is in network order.
@@ -167,7 +157,7 @@
      * Values are specified as for C:
      * 0x=hex, 0=octal, 1-9=decimal.
      */
-    if (!isdigit(c)) {
+    if (!lwip_isdigit(c)) {
       return 0;
     }
     val = 0;
@@ -182,11 +172,11 @@
       }
     }
     for (;;) {
-      if (isdigit(c)) {
+      if (lwip_isdigit(c)) {
         val = (val * base) + (u32_t)(c - '0');
         c = *++cp;
-      } else if (base == 16 && isxdigit(c)) {
-        val = (val << 4) | (u32_t)(c + 10 - (islower(c) ? 'a' : 'A'));
+      } else if (base == 16 && lwip_isxdigit(c)) {
+        val = (val << 4) | (u32_t)(c + 10 - (lwip_islower(c) ? 'a' : 'A'));
         c = *++cp;
       } else {
         break;
@@ -211,7 +201,7 @@
   /*
    * Check for trailing characters.
    */
-  if (c != '\0' && !isspace(c)) {
+  if (c != '\0' && !lwip_isspace(c)) {
     return 0;
   }
   /*
@@ -220,44 +210,44 @@
    */
   switch (pp - parts + 1) {
 
-  case 0:
-    return 0;       /* initial nondigit */
+    case 0:
+      return 0;       /* initial nondigit */
 
-  case 1:             /* a -- 32 bits */
-    break;
+    case 1:             /* a -- 32 bits */
+      break;
 
-  case 2:             /* a.b -- 8.24 bits */
-    if (val > 0xffffffUL) {
-      return 0;
-    }
-    if (parts[0] > 0xff) {
-      return 0;
-    }
-    val |= parts[0] << 24;
-    break;
+    case 2:             /* a.b -- 8.24 bits */
+      if (val > 0xffffffUL) {
+        return 0;
+      }
+      if (parts[0] > 0xff) {
+        return 0;
+      }
+      val |= parts[0] << 24;
+      break;
 
-  case 3:             /* a.b.c -- 8.8.16 bits */
-    if (val > 0xffff) {
-      return 0;
-    }
-    if ((parts[0] > 0xff) || (parts[1] > 0xff)) {
-      return 0;
-    }
-    val |= (parts[0] << 24) | (parts[1] << 16);
-    break;
+    case 3:             /* a.b.c -- 8.8.16 bits */
+      if (val > 0xffff) {
+        return 0;
+      }
+      if ((parts[0] > 0xff) || (parts[1] > 0xff)) {
+        return 0;
+      }
+      val |= (parts[0] << 24) | (parts[1] << 16);
+      break;
 
-  case 4:             /* a.b.c.d -- 8.8.8.8 bits */
-    if (val > 0xff) {
-      return 0;
-    }
-    if ((parts[0] > 0xff) || (parts[1] > 0xff) || (parts[2] > 0xff)) {
-      return 0;
-    }
-    val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
-    break;
-  default:
-    LWIP_ASSERT("unhandled", 0);
-    break;
+    case 4:             /* a.b.c.d -- 8.8.8.8 bits */
+      if (val > 0xff) {
+        return 0;
+      }
+      if ((parts[0] > 0xff) || (parts[1] > 0xff) || (parts[2] > 0xff)) {
+        return 0;
+      }
+      val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
+      break;
+    default:
+      LWIP_ASSERT("unhandled", 0);
+      break;
   }
   if (addr) {
     ip4_addr_set_u32(addr, lwip_htonl(val));
@@ -273,7 +263,7 @@
  * @return pointer to a global static (!) buffer that holds the ASCII
  *         representation of addr
  */
-char*
+char *
 ip4addr_ntoa(const ip4_addr_t *addr)
 {
   static char str[IP4ADDR_STRLEN_MAX];
@@ -281,7 +271,7 @@
 }
 
 /**
- * Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used.
+ * Same as ip4addr_ntoa, but reentrant since a user-supplied buffer is used.
  *
  * @param addr ip address in network order to convert
  * @param buf target buffer where the string is stored
@@ -289,7 +279,7 @@
  * @return either pointer to buf which now holds the ASCII
  *         representation of addr or NULL if buf was too small
  */
-char*
+char *
 ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen)
 {
   u32_t s_addr;
diff --git a/src/core/ipv4/ip4_frag.c b/src/core/ipv4/ip4_frag.c
index fdb2088..a445530 100644
--- a/src/core/ipv4/ip4_frag.c
+++ b/src/core/ipv4/ip4_frag.c
@@ -135,7 +135,7 @@
      * clean up the incomplete fragment assembly */
     if (r->timer > 0) {
       r->timer--;
-      LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer dec %"U16_F"\n",(u16_t)r->timer));
+      LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer dec %"U16_F"\n", (u16_t)r->timer));
       prev = r;
       r = r->next;
     } else {
@@ -147,8 +147,8 @@
       r = r->next;
       /* free the helper struct and all enqueued pbufs */
       ip_reass_free_complete_datagram(tmp, prev);
-     }
-   }
+    }
+  }
 }
 
 /**
@@ -186,7 +186,7 @@
     icmp_time_exceeded(p, ICMP_TE_FRAG);
     clen = pbuf_clen(p);
     LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff);
-    pbufs_freed += clen;
+    pbufs_freed = (u16_t)(pbufs_freed + clen);
     pbuf_free(p);
   }
 #endif /* LWIP_ICMP */
@@ -202,13 +202,13 @@
     p = iprh->next_pbuf;
     clen = pbuf_clen(pcur);
     LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff);
-    pbufs_freed += clen;
+    pbufs_freed = (u16_t)(pbufs_freed + clen);
     pbuf_free(pcur);
   }
   /* Then, unchain the struct ip_reassdata from the list and free it. */
   ip_reass_dequeue_datagram(ipr, prev);
-  LWIP_ASSERT("ip_reass_pbufcount >= clen", ip_reass_pbufcount >= pbufs_freed);
-  ip_reass_pbufcount -= pbufs_freed;
+  LWIP_ASSERT("ip_reass_pbufcount >= pbufs_freed", ip_reass_pbufcount >= pbufs_freed);
+  ip_reass_pbufcount = (u16_t)(ip_reass_pbufcount - pbufs_freed);
 
   return pbufs_freed;
 }
@@ -274,10 +274,10 @@
  * @param clen number of pbufs needed to enqueue (used for freeing other datagrams if not enough space)
  * @return A pointer to the queue location into which the fragment was enqueued
  */
-static struct ip_reassdata*
+static struct ip_reassdata *
 ip_reass_enqueue_new_datagram(struct ip_hdr *fraghdr, int clen)
 {
-  struct ip_reassdata* ipr;
+  struct ip_reassdata *ipr;
 #if ! IP_REASS_FREE_OLDEST
   LWIP_UNUSED_ARG(clen);
 #endif
@@ -293,7 +293,7 @@
 #endif /* IP_REASS_FREE_OLDEST */
     {
       IPFRAG_STATS_INC(ip_frag.memerr);
-      LWIP_DEBUGF(IP_REASS_DEBUG,("Failed to alloc reassdata struct\n"));
+      LWIP_DEBUGF(IP_REASS_DEBUG, ("Failed to alloc reassdata struct\n"));
       return NULL;
     }
   }
@@ -343,31 +343,42 @@
 static int
 ip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct pbuf *new_p, int is_last)
 {
-  struct ip_reass_helper *iprh, *iprh_tmp, *iprh_prev=NULL;
+  struct ip_reass_helper *iprh, *iprh_tmp, *iprh_prev = NULL;
   struct pbuf *q;
   u16_t offset, len;
+  u8_t hlen;
   struct ip_hdr *fraghdr;
   int valid = 1;
 
   /* Extract length and fragment offset from current fragment */
-  fraghdr = (struct ip_hdr*)new_p->payload;
-  len = lwip_ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4;
-  offset = (lwip_ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8;
+  fraghdr = (struct ip_hdr *)new_p->payload;
+  len = lwip_ntohs(IPH_LEN(fraghdr));
+  hlen = IPH_HL_BYTES(fraghdr);
+  if (hlen > len) {
+    /* invalid datagram */
+    return IP_REASS_VALIDATE_PBUF_DROPPED;
+  }
+  len = (u16_t)(len - hlen);
+  offset = IPH_OFFSET_BYTES(fraghdr);
 
   /* overwrite the fragment's ip header from the pbuf with our helper struct,
    * and setup the embedded helper structure. */
   /* make sure the struct ip_reass_helper fits into the IP header */
   LWIP_ASSERT("sizeof(struct ip_reass_helper) <= IP_HLEN",
               sizeof(struct ip_reass_helper) <= IP_HLEN);
-  iprh = (struct ip_reass_helper*)new_p->payload;
+  iprh = (struct ip_reass_helper *)new_p->payload;
   iprh->next_pbuf = NULL;
   iprh->start = offset;
-  iprh->end = offset + len;
+  iprh->end = (u16_t)(offset + len);
+  if (iprh->end < offset) {
+    /* u16_t overflow, cannot handle this */
+    return IP_REASS_VALIDATE_PBUF_DROPPED;
+  }
 
   /* Iterate through until we either get to the end of the list (append),
    * or we find one with a larger offset (insert). */
   for (q = ipr->p; q != NULL;) {
-    iprh_tmp = (struct ip_reass_helper*)q->payload;
+    iprh_tmp = (struct ip_reass_helper *)q->payload;
     if (iprh->start < iprh_tmp->start) {
       /* the new pbuf should be inserted before this */
       iprh->next_pbuf = q;
@@ -376,7 +387,7 @@
 #if IP_REASS_CHECK_OVERLAP
         if ((iprh->start < iprh_prev->end) || (iprh->end > iprh_tmp->start)) {
           /* fragment overlaps with previous or following, throw away */
-          goto freepbuf;
+          return IP_REASS_VALIDATE_PBUF_DROPPED;
         }
 #endif /* IP_REASS_CHECK_OVERLAP */
         iprh_prev->next_pbuf = new_p;
@@ -389,7 +400,7 @@
 #if IP_REASS_CHECK_OVERLAP
         if (iprh->end > iprh_tmp->start) {
           /* fragment overlaps with following, throw away */
-          goto freepbuf;
+          return IP_REASS_VALIDATE_PBUF_DROPPED;
         }
 #endif /* IP_REASS_CHECK_OVERLAP */
         /* fragment with the lowest offset */
@@ -398,11 +409,11 @@
       break;
     } else if (iprh->start == iprh_tmp->start) {
       /* received the same datagram twice: no need to keep the datagram */
-      goto freepbuf;
+      return IP_REASS_VALIDATE_PBUF_DROPPED;
 #if IP_REASS_CHECK_OVERLAP
     } else if (iprh->start < iprh_tmp->end) {
       /* overlap: no need to keep the new datagram */
-      goto freepbuf;
+      return IP_REASS_VALIDATE_PBUF_DROPPED;
 #endif /* IP_REASS_CHECK_OVERLAP */
     } else {
       /* Check if the fragments received so far have no holes. */
@@ -433,7 +444,7 @@
     } else {
 #if IP_REASS_CHECK_OVERLAP
       LWIP_ASSERT("no previous fragment, this must be the first fragment!",
-        ipr->p == NULL);
+                  ipr->p == NULL);
 #endif /* IP_REASS_CHECK_OVERLAP */
       /* this is the first fragment we ever received for this ip datagram */
       ipr->p = new_p;
@@ -447,14 +458,14 @@
     if (valid) {
       /* then check if the rest of the fragments is here */
       /* Check if the queue starts with the first datagram */
-      if ((ipr->p == NULL) || (((struct ip_reass_helper*)ipr->p->payload)->start != 0)) {
+      if ((ipr->p == NULL) || (((struct ip_reass_helper *)ipr->p->payload)->start != 0)) {
         valid = 0;
       } else {
         /* and check that there are no holes after this datagram */
         iprh_prev = iprh;
         q = iprh->next_pbuf;
         while (q != NULL) {
-          iprh = (struct ip_reass_helper*)q->payload;
+          iprh = (struct ip_reass_helper *)q->payload;
           if (iprh_prev->end != iprh->start) {
             valid = 0;
             break;
@@ -467,9 +478,9 @@
         if (valid) {
           LWIP_ASSERT("sanity check", ipr->p != NULL);
           LWIP_ASSERT("sanity check",
-            ((struct ip_reass_helper*)ipr->p->payload) != iprh);
+                      ((struct ip_reass_helper *)ipr->p->payload) != iprh);
           LWIP_ASSERT("validate_datagram:next_pbuf!=NULL",
-            iprh->next_pbuf == NULL);
+                      iprh->next_pbuf == NULL);
         }
       }
     }
@@ -480,12 +491,6 @@
   }
   /* If we come here, not all fragments were received, yet! */
   return IP_REASS_VALIDATE_PBUF_QUEUED; /* not yet valid! */
-#if IP_REASS_CHECK_OVERLAP
-freepbuf:
-  ip_reass_pbufcount -= pbuf_clen(new_p);
-  pbuf_free(new_p);
-  return IP_REASS_VALIDATE_PBUF_DROPPED;
-#endif /* IP_REASS_CHECK_OVERLAP */
 }
 
 /**
@@ -502,22 +507,29 @@
   struct ip_reassdata *ipr;
   struct ip_reass_helper *iprh;
   u16_t offset, len, clen;
+  u8_t hlen;
   int valid;
   int is_last;
 
   IPFRAG_STATS_INC(ip_frag.recv);
   MIB2_STATS_INC(mib2.ipreasmreqds);
 
-  fraghdr = (struct ip_hdr*)p->payload;
+  fraghdr = (struct ip_hdr *)p->payload;
 
-  if ((IPH_HL(fraghdr) * 4) != IP_HLEN) {
-    LWIP_DEBUGF(IP_REASS_DEBUG,("ip4_reass: IP options currently not supported!\n"));
+  if (IPH_HL_BYTES(fraghdr) != IP_HLEN) {
+    LWIP_DEBUGF(IP_REASS_DEBUG, ("ip4_reass: IP options currently not supported!\n"));
     IPFRAG_STATS_INC(ip_frag.err);
     goto nullreturn;
   }
 
-  offset = (lwip_ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8;
-  len = lwip_ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4;
+  offset = IPH_OFFSET_BYTES(fraghdr);
+  len = lwip_ntohs(IPH_LEN(fraghdr));
+  hlen = IPH_HL_BYTES(fraghdr);
+  if (hlen > len) {
+    /* invalid datagram */
+    goto nullreturn;
+  }
+  len = (u16_t)(len - hlen);
 
   /* Check if we are allowed to enqueue more datagrams. */
   clen = pbuf_clen(p);
@@ -528,8 +540,8 @@
 #endif /* IP_REASS_FREE_OLDEST */
     {
       /* No datagram could be freed and still too many pbufs enqueued */
-      LWIP_DEBUGF(IP_REASS_DEBUG,("ip4_reass: Overflow condition: pbufct=%d, clen=%d, MAX=%d\n",
-        ip_reass_pbufcount, clen, IP_REASS_MAX_PBUFS));
+      LWIP_DEBUGF(IP_REASS_DEBUG, ("ip4_reass: Overflow condition: pbufct=%d, clen=%d, MAX=%d\n",
+                                   ip_reass_pbufcount, clen, IP_REASS_MAX_PBUFS));
       IPFRAG_STATS_INC(ip_frag.memerr);
       /* @todo: send ICMP time exceeded here? */
       /* drop this pbuf */
@@ -545,14 +557,14 @@
        fragment into the buffer. */
     if (IP_ADDRESSES_AND_ID_MATCH(&ipr->iphdr, fraghdr)) {
       LWIP_DEBUGF(IP_REASS_DEBUG, ("ip4_reass: matching previous fragment ID=%"X16_F"\n",
-        lwip_ntohs(IPH_ID(fraghdr))));
+                                   lwip_ntohs(IPH_ID(fraghdr))));
       IPFRAG_STATS_INC(ip_frag.cachehit);
       break;
     }
   }
 
   if (ipr == NULL) {
-  /* Enqueue a new datagram into the datagram queue */
+    /* Enqueue a new datagram into the datagram queue */
     ipr = ip_reass_enqueue_new_datagram(fraghdr, clen);
     /* Bail if unable to enqueue */
     if (ipr == NULL) {
@@ -560,7 +572,7 @@
     }
   } else {
     if (((lwip_ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) == 0) &&
-      ((lwip_ntohs(IPH_OFFSET(&ipr->iphdr)) & IP_OFFMASK) != 0)) {
+        ((lwip_ntohs(IPH_OFFSET(&ipr->iphdr)) & IP_OFFMASK) != 0)) {
       /* ipr->iphdr is not the header from the first fragment, but fraghdr is
        * -> copy fraghdr into ipr->iphdr since we want to have the header
        * of the first fragment (for ICMP time exceeded and later, for copying
@@ -578,14 +590,14 @@
     u16_t datagram_len = (u16_t)(offset + len);
     if ((datagram_len < offset) || (datagram_len > (0xFFFF - IP_HLEN))) {
       /* u16_t overflow, cannot handle this */
-      goto nullreturn;
+      goto nullreturn_ipr;
     }
   }
   /* find the right place to insert this pbuf */
   /* @todo: trim pbufs if fragments are overlapping */
   valid = ip_reass_chain_frag_into_datagram_and_validate(ipr, p, is_last);
   if (valid == IP_REASS_VALIDATE_PBUF_DROPPED) {
-    goto nullreturn;
+    goto nullreturn_ipr;
   }
   /* if we come here, the pbuf has been enqueued */
 
@@ -598,23 +610,23 @@
     ipr->datagram_len = datagram_len;
     ipr->flags |= IP_REASS_FLAG_LASTFRAG;
     LWIP_DEBUGF(IP_REASS_DEBUG,
-     ("ip4_reass: last fragment seen, total len %"S16_F"\n",
-      ipr->datagram_len));
+                ("ip4_reass: last fragment seen, total len %"S16_F"\n",
+                 ipr->datagram_len));
   }
 
   if (valid == IP_REASS_VALIDATE_TELEGRAM_FINISHED) {
     struct ip_reassdata *ipr_prev;
     /* the totally last fragment (flag more fragments = 0) was received at least
      * once AND all fragments are received */
-    ipr->datagram_len += IP_HLEN;
+    u16_t datagram_len = (u16_t)(ipr->datagram_len + IP_HLEN);
 
     /* save the second pbuf before copying the header over the pointer */
-    r = ((struct ip_reass_helper*)ipr->p->payload)->next_pbuf;
+    r = ((struct ip_reass_helper *)ipr->p->payload)->next_pbuf;
 
     /* copy the original ip header back to the first pbuf */
-    fraghdr = (struct ip_hdr*)(ipr->p->payload);
+    fraghdr = (struct ip_hdr *)(ipr->p->payload);
     SMEMCPY(fraghdr, &ipr->iphdr, IP_HLEN);
-    IPH_LEN_SET(fraghdr, lwip_htons(ipr->datagram_len));
+    IPH_LEN_SET(fraghdr, lwip_htons(datagram_len));
     IPH_OFFSET_SET(fraghdr, 0);
     IPH_CHKSUM_SET(fraghdr, 0);
     /* @todo: do we need to set/calculate the correct checksum? */
@@ -628,10 +640,10 @@
 
     /* chain together the pbufs contained within the reass_data list. */
     while (r != NULL) {
-      iprh = (struct ip_reass_helper*)r->payload;
+      iprh = (struct ip_reass_helper *)r->payload;
 
       /* hide the ip header for every succeeding fragment */
-      pbuf_header(r, -IP_HLEN);
+      pbuf_remove_header(r, IP_HLEN);
       pbuf_cat(p, r);
       r = iprh->next_pbuf;
     }
@@ -651,7 +663,9 @@
     ip_reass_dequeue_datagram(ipr, ipr_prev);
 
     /* and adjust the number of pbufs currently queued for reassembly. */
-    ip_reass_pbufcount -= pbuf_clen(p);
+    clen = pbuf_clen(p);
+    LWIP_ASSERT("ip_reass_pbufcount >= clen", ip_reass_pbufcount >= clen);
+    ip_reass_pbufcount = (u16_t)(ip_reass_pbufcount - clen);
 
     MIB2_STATS_INC(mib2.ipreasmoks);
 
@@ -659,11 +673,19 @@
     return p;
   }
   /* the datagram is not (yet?) reassembled completely */
-  LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass_pbufcount: %d out\n", ip_reass_pbufcount));
+  LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_pbufcount: %d out\n", ip_reass_pbufcount));
   return NULL;
 
+nullreturn_ipr:
+  LWIP_ASSERT("ipr != NULL", ipr != NULL);
+  if (ipr->p == NULL) {
+    /* dropped pbuf after creating a new datagram entry: remove the entry, too */
+    LWIP_ASSERT("not firstalthough just enqueued", ipr == reassdatagrams);
+    ip_reass_dequeue_datagram(ipr, NULL);
+  }
+
 nullreturn:
-  LWIP_DEBUGF(IP_REASS_DEBUG,("ip4_reass: nullreturn\n"));
+  LWIP_DEBUGF(IP_REASS_DEBUG, ("ip4_reass: nullreturn\n"));
   IPFRAG_STATS_INC(ip_frag.drop);
   pbuf_free(p);
   return NULL;
@@ -673,15 +695,15 @@
 #if IP_FRAG
 #if !LWIP_NETIF_TX_SINGLE_PBUF
 /** Allocate a new struct pbuf_custom_ref */
-static struct pbuf_custom_ref*
+static struct pbuf_custom_ref *
 ip_frag_alloc_pbuf_custom_ref(void)
 {
-  return (struct pbuf_custom_ref*)memp_malloc(MEMP_FRAG_PBUF);
+  return (struct pbuf_custom_ref *)memp_malloc(MEMP_FRAG_PBUF);
 }
 
 /** Free a struct pbuf_custom_ref */
 static void
-ip_frag_free_pbuf_custom_ref(struct pbuf_custom_ref* p)
+ip_frag_free_pbuf_custom_ref(struct pbuf_custom_ref *p)
 {
   LWIP_ASSERT("p != NULL", p != NULL);
   memp_free(MEMP_FRAG_PBUF, p);
@@ -692,9 +714,9 @@
 static void
 ipfrag_free_pbuf_custom(struct pbuf *p)
 {
-  struct pbuf_custom_ref *pcr = (struct pbuf_custom_ref*)p;
+  struct pbuf_custom_ref *pcr = (struct pbuf_custom_ref *)p;
   LWIP_ASSERT("pcr != NULL", pcr != NULL);
-  LWIP_ASSERT("pcr == p", (void*)pcr == (void*)p);
+  LWIP_ASSERT("pcr == p", (void *)pcr == (void *)p);
   if (pcr->original != NULL) {
     pbuf_free(pcr->original);
   }
@@ -725,27 +747,33 @@
 #endif
   struct ip_hdr *original_iphdr;
   struct ip_hdr *iphdr;
-  const u16_t nfb = (netif->mtu - IP_HLEN) / 8;
+  const u16_t nfb = (u16_t)((netif->mtu - IP_HLEN) / 8);
   u16_t left, fragsize;
   u16_t ofo;
   int last;
   u16_t poff = IP_HLEN;
   u16_t tmp;
+  int mf_set;
 
   original_iphdr = (struct ip_hdr *)p->payload;
   iphdr = original_iphdr;
-  LWIP_ERROR("ip4_frag() does not support IP options", IPH_HL(iphdr) * 4 == IP_HLEN, return ERR_VAL);
+  if (IPH_HL_BYTES(iphdr) != IP_HLEN) {
+    /* ip4_frag() does not support IP options */
+    return ERR_VAL;
+  }
+  LWIP_ERROR("ip4_frag(): pbuf too short", p->len >= IP_HLEN, return ERR_VAL);
 
   /* Save original offset */
   tmp = lwip_ntohs(IPH_OFFSET(iphdr));
   ofo = tmp & IP_OFFMASK;
-  LWIP_ERROR("ip_frag(): MF already set", (tmp & IP_MF) == 0, return ERR_VAL);
+  /* already fragmented? if so, the last fragment we create must have MF, too */
+  mf_set = tmp & IP_MF;
 
-  left = p->tot_len - IP_HLEN;
+  left = (u16_t)(p->tot_len - IP_HLEN);
 
   while (left) {
     /* Fill this fragment */
-    fragsize = LWIP_MIN(left, nfb * 8);
+    fragsize = LWIP_MIN(left, (u16_t)(nfb * 8));
 
 #if LWIP_NETIF_TX_SINGLE_PBUF
     rambuf = pbuf_alloc(PBUF_IP, fragsize, PBUF_RAM);
@@ -753,16 +781,16 @@
       goto memerr;
     }
     LWIP_ASSERT("this needs a pbuf in one piece!",
-      (rambuf->len == rambuf->tot_len) && (rambuf->next == NULL));
+                (rambuf->len == rambuf->tot_len) && (rambuf->next == NULL));
     poff += pbuf_copy_partial(p, rambuf->payload, fragsize, poff);
     /* make room for the IP header */
-    if (pbuf_header(rambuf, IP_HLEN)) {
+    if (pbuf_add_header(rambuf, IP_HLEN)) {
       pbuf_free(rambuf);
       goto memerr;
     }
     /* fill in the IP header */
     SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN);
-    iphdr = (struct ip_hdr*)rambuf->payload;
+    iphdr = (struct ip_hdr *)rambuf->payload;
 #else /* LWIP_NETIF_TX_SINGLE_PBUF */
     /* When not using a static buffer, create a chain of pbufs.
      * The first will be a PBUF_RAM holding the link and IP header.
@@ -774,14 +802,15 @@
       goto memerr;
     }
     LWIP_ASSERT("this needs a pbuf in one piece!",
-                (p->len >= (IP_HLEN)));
+                (rambuf->len >= (IP_HLEN)));
     SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN);
     iphdr = (struct ip_hdr *)rambuf->payload;
 
     left_to_copy = fragsize;
     while (left_to_copy) {
       struct pbuf_custom_ref *pcr;
-      u16_t plen = p->len - poff;
+      u16_t plen = (u16_t)(p->len - poff);
+      LWIP_ASSERT("p->len >= poff", p->len >= poff);
       newpbuflen = LWIP_MIN(left_to_copy, plen);
       /* Is this pbuf already empty? */
       if (!newpbuflen) {
@@ -796,7 +825,7 @@
       }
       /* Mirror this pbuf, although we might not need all of it. */
       newpbuf = pbuf_alloced_custom(PBUF_RAW, newpbuflen, PBUF_REF, &pcr->pc,
-        (u8_t*)p->payload + poff, newpbuflen);
+                                    (u8_t *)p->payload + poff, newpbuflen);
       if (newpbuf == NULL) {
         ip_frag_free_pbuf_custom_ref(pcr);
         pbuf_free(rambuf);
@@ -810,13 +839,13 @@
        * so that it is removed when pbuf_dechain is later called on rambuf.
        */
       pbuf_cat(rambuf, newpbuf);
-      left_to_copy -= newpbuflen;
+      left_to_copy = (u16_t)(left_to_copy - newpbuflen);
       if (left_to_copy) {
         poff = 0;
         p = p->next;
       }
     }
-    poff += newpbuflen;
+    poff = (u16_t)(poff + newpbuflen);
 #endif /* LWIP_NETIF_TX_SINGLE_PBUF */
 
     /* Correct header */
@@ -824,11 +853,12 @@
 
     /* Set new offset and MF flag */
     tmp = (IP_OFFMASK & (ofo));
-    if (!last) {
+    if (!last || mf_set) {
+      /* the last fragment has MF set if the input frame had it */
       tmp = tmp | IP_MF;
     }
     IPH_OFFSET_SET(iphdr, lwip_htons(tmp));
-    IPH_LEN_SET(iphdr, lwip_htons(fragsize + IP_HLEN));
+    IPH_LEN_SET(iphdr, lwip_htons((u16_t)(fragsize + IP_HLEN)));
     IPH_CHKSUM_SET(iphdr, 0);
 #if CHECKSUM_GEN_IP
     IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_IP) {
@@ -850,8 +880,8 @@
      */
 
     pbuf_free(rambuf);
-    left -= fragsize;
-    ofo += nfb;
+    left = (u16_t)(left - fragsize);
+    ofo = (u16_t)(ofo + nfb);
   }
   MIB2_STATS_INC(mib2.ipfragoks);
   return ERR_OK;
diff --git a/src/core/ipv6/dhcp6.c b/src/core/ipv6/dhcp6.c
index f27a725..7cf98a5 100644
--- a/src/core/ipv6/dhcp6.c
+++ b/src/core/ipv6/dhcp6.c
@@ -1,11 +1,31 @@
 /**
  * @file
  *
- * DHCPv6.
+ * @defgroup dhcp6 DHCPv6
+ * @ingroup ip6
+ * DHCPv6 client: IPv6 address autoconfiguration as per
+ * RFC 3315 (stateful DHCPv6) and
+ * RFC 3736 (stateless DHCPv6).
+ *
+ * For now, only stateless DHCPv6 is implemented!
+ *
+ * TODO:
+ * - enable/disable API to not always start when RA is received
+ * - stateful DHCPv6 (for now, only stateless DHCPv6 for DNS and NTP servers works)
+ * - create Client Identifier?
+ * - 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_disable() disable DHCPv6 for a netif
+ *
+ * When enabled, requests are only issued after receipt of RA with the
+ * corresponding bits set.
  */
 
 /*
- * Copyright (c) 2010 Inico Technologies Ltd.
+ * Copyright (c) 2018 Simon Goldschmidt
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without modification,
@@ -32,19 +52,761 @@
  *
  * This file is part of the lwIP TCP/IP stack.
  *
- * Author: Ivan Delamer <delamer@inicotech.com>
- *
- *
- * Please coordinate changes and requests with Ivan Delamer
- * <delamer@inicotech.com>
+ * Author: Simon Goldschmidt <goldsimon@gmx.de>
  */
 
 #include "lwip/opt.h"
 
 #if LWIP_IPV6 && LWIP_IPV6_DHCP6 /* don't build if not configured for use in lwipopts.h */
 
-#include "lwip/ip6_addr.h"
+#include "lwip/dhcp6.h"
+#include "lwip/prot/dhcp6.h"
 #include "lwip/def.h"
+#include "lwip/udp.h"
+#include "lwip/dns.h"
 
+#include <string.h>
+
+#ifdef LWIP_HOOK_FILENAME
+#include LWIP_HOOK_FILENAME
+#endif
+#ifndef LWIP_HOOK_DHCP6_APPEND_OPTIONS
+#define LWIP_HOOK_DHCP6_APPEND_OPTIONS(netif, dhcp6, state, msg, msg_type, options_len_ptr, max_len)
+#endif
+#ifndef LWIP_HOOK_DHCP6_PARSE_OPTION
+#define LWIP_HOOK_DHCP6_PARSE_OPTION(netif, dhcp6, state, msg, msg_type, option, len, pbuf, offset) do { LWIP_UNUSED_ARG(msg); } while(0)
+#endif
+
+#if LWIP_DNS && LWIP_DHCP6_MAX_DNS_SERVERS
+#if DNS_MAX_SERVERS > LWIP_DHCP6_MAX_DNS_SERVERS
+#define LWIP_DHCP6_PROVIDE_DNS_SERVERS LWIP_DHCP6_MAX_DNS_SERVERS
+#else
+#define LWIP_DHCP6_PROVIDE_DNS_SERVERS DNS_MAX_SERVERS
+#endif
+#else
+#define LWIP_DHCP6_PROVIDE_DNS_SERVERS 0
+#endif
+
+
+/** Option handling: options are parsed in dhcp6_parse_reply
+ * and saved in an array where other functions can load them from.
+ * This might be moved into the struct dhcp6 (not necessarily since
+ * lwIP is single-threaded and the array is only used while in recv
+ * callback). */
+enum dhcp6_option_idx {
+  DHCP6_OPTION_IDX_CLI_ID = 0,
+  DHCP6_OPTION_IDX_SERVER_ID,
+#if LWIP_DHCP6_PROVIDE_DNS_SERVERS
+  DHCP6_OPTION_IDX_DNS_SERVER,
+  DHCP6_OPTION_IDX_DOMAIN_LIST,
+#endif /* LWIP_DHCP_PROVIDE_DNS_SERVERS */
+#if LWIP_DHCP6_GET_NTP_SRV
+  DHCP6_OPTION_IDX_NTP_SERVER,
+#endif /* LWIP_DHCP_GET_NTP_SRV */
+  DHCP6_OPTION_IDX_MAX
+};
+
+struct dhcp6_option_info {
+  u8_t option_given;
+  u16_t val_start;
+  u16_t val_length;
+};
+
+/** Holds the decoded option info, only valid while in dhcp6_recv. */
+struct dhcp6_option_info dhcp6_rx_options[DHCP6_OPTION_IDX_MAX];
+
+#define dhcp6_option_given(dhcp6, idx)           (dhcp6_rx_options[idx].option_given != 0)
+#define dhcp6_got_option(dhcp6, idx)             (dhcp6_rx_options[idx].option_given = 1)
+#define dhcp6_clear_option(dhcp6, idx)           (dhcp6_rx_options[idx].option_given = 0)
+#define dhcp6_clear_all_options(dhcp6)           (memset(dhcp6_rx_options, 0, sizeof(dhcp6_rx_options)))
+#define dhcp6_get_option_start(dhcp6, idx)       (dhcp6_rx_options[idx].val_start)
+#define dhcp6_get_option_length(dhcp6, idx)      (dhcp6_rx_options[idx].val_length)
+#define dhcp6_set_option(dhcp6, idx, start, len) do { dhcp6_rx_options[idx].val_start = (start); dhcp6_rx_options[idx].val_length = (len); }while(0)
+
+
+const ip_addr_t dhcp6_All_DHCP6_Relay_Agents_and_Servers = IPADDR6_INIT_HOST(0xFF020000, 0, 0, 0x00010002);
+const ip_addr_t dhcp6_All_DHCP6_Servers = IPADDR6_INIT_HOST(0xFF020000, 0, 0, 0x00010003);
+
+static struct udp_pcb *dhcp6_pcb;
+static u8_t dhcp6_pcb_refcount;
+
+
+/* receive, unfold, parse and free incoming messages */
+static void dhcp6_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port);
+
+/** Ensure DHCP PCB is allocated and bound */
+static err_t
+dhcp6_inc_pcb_refcount(void)
+{
+  if (dhcp6_pcb_refcount == 0) {
+    LWIP_ASSERT("dhcp6_inc_pcb_refcount(): memory leak", dhcp6_pcb == NULL);
+
+    /* allocate UDP PCB */
+    dhcp6_pcb = udp_new_ip6();
+
+    if (dhcp6_pcb == NULL) {
+      return ERR_MEM;
+    }
+
+    ip_set_option(dhcp6_pcb, SOF_BROADCAST);
+
+    /* set up local and remote port for the pcb -> listen on all interfaces on all src/dest IPs */
+    udp_bind(dhcp6_pcb, IP6_ADDR_ANY, DHCP6_CLIENT_PORT);
+    udp_recv(dhcp6_pcb, dhcp6_recv, NULL);
+  }
+
+  dhcp6_pcb_refcount++;
+
+  return ERR_OK;
+}
+
+/** Free DHCP PCB if the last netif stops using it */
+static void
+dhcp6_dec_pcb_refcount(void)
+{
+  LWIP_ASSERT("dhcp6_pcb_refcount(): refcount error", (dhcp6_pcb_refcount > 0));
+  dhcp6_pcb_refcount--;
+
+  if (dhcp6_pcb_refcount == 0) {
+    udp_remove(dhcp6_pcb);
+    dhcp6_pcb = NULL;
+  }
+}
+
+/**
+ * @ingroup dhcp6
+ * Set a statically allocated struct dhcp6 to work with.
+ * Using this prevents dhcp6_start to allocate it using mem_malloc.
+ *
+ * @param netif the netif for which to set the struct dhcp
+ * @param dhcp6 (uninitialised) dhcp6 struct allocated by the application
+ */
+void
+dhcp6_set_struct(struct netif *netif, struct dhcp6 *dhcp6)
+{
+  LWIP_ASSERT("netif != NULL", netif != NULL);
+  LWIP_ASSERT("dhcp6 != NULL", dhcp6 != NULL);
+  LWIP_ASSERT("netif already has a struct dhcp6 set", netif_dhcp6_data(netif) == NULL);
+
+  /* clear data structure */
+  memset(dhcp6, 0, sizeof(struct dhcp6));
+  /* dhcp6_set_state(&dhcp, DHCP6_STATE_OFF); */
+  netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, dhcp6);
+}
+
+/**
+ * @ingroup dhcp6
+ * Removes a struct dhcp6 from a netif.
+ *
+ * ATTENTION: Only use this when not using dhcp6_set_struct() to allocate the
+ *            struct dhcp6 since the memory is passed back to the heap.
+ *
+ * @param netif the netif from which to remove the struct dhcp
+ */
+void dhcp6_cleanup(struct netif *netif)
+{
+  LWIP_ASSERT("netif != NULL", netif != NULL);
+
+  if (netif_dhcp6_data(netif) != NULL) {
+    mem_free(netif_dhcp6_data(netif));
+    netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, NULL);
+  }
+}
+
+static struct dhcp6*
+dhcp6_get_struct(struct netif *netif, const char *dbg_requester)
+{
+  struct dhcp6 *dhcp6 = netif_dhcp6_data(netif);
+  if (dhcp6 == NULL) {
+    LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("%s: mallocing new DHCPv6 client\n", dbg_requester));
+    dhcp6 = (struct dhcp6 *)mem_malloc(sizeof(struct dhcp6));
+    if (dhcp6 == NULL) {
+      LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("%s: could not allocate dhcp6\n", dbg_requester));
+      return NULL;
+    }
+
+    /* clear data structure, this implies DHCP6_STATE_OFF */
+    memset(dhcp6, 0, sizeof(struct dhcp6));
+    /* store this dhcp6 client in the netif */
+    netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, dhcp6);
+  } else {
+    /* already has DHCP6 client attached */
+    LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("%s: using existing DHCPv6 client\n", dbg_requester));
+  }
+
+  if (!dhcp6->pcb_allocated) {
+    if (dhcp6_inc_pcb_refcount() != ERR_OK) { /* ensure DHCP6 PCB is allocated */
+      mem_free(dhcp6);
+      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));
+    dhcp6->pcb_allocated = 1;
+  }
+  return dhcp6;
+}
+
+/*
+ * Set the DHCPv6 state
+ * If the state changed, reset the number of tries.
+ */
+static void
+dhcp6_set_state(struct dhcp6 *dhcp6, u8_t new_state, const char *dbg_caller)
+{
+  LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("DHCPv6 state: %d -> %d (%s)\n",
+    dhcp6->state, new_state, dbg_caller));
+  if (new_state != dhcp6->state) {
+    dhcp6->state = new_state;
+    dhcp6->tries = 0;
+    dhcp6->request_timeout = 0;
+  }
+}
+
+static int
+dhcp6_stateless_enabled(struct dhcp6 *dhcp6)
+{
+  if ((dhcp6->state == DHCP6_STATE_STATELESS_IDLE) ||
+      (dhcp6->state == DHCP6_STATE_REQUESTING_CONFIG)) {
+    return 1;
+  }
+  return 0;
+}
+
+/*static int
+dhcp6_stateful_enabled(struct dhcp6 *dhcp6)
+{
+  if (dhcp6->state == DHCP6_STATE_OFF) {
+    return 0;
+  }
+  if (dhcp6_stateless_enabled(dhcp6)) {
+    return 0;
+  }
+  return 1;
+}*/
+
+/**
+ * @ingroup dhcp6
+ * Enable stateful DHCPv6 on this netif
+ * Requests are sent on receipt of an RA message with the
+ * ND6_RA_FLAG_MANAGED_ADDR_CONFIG flag set.
+ *
+ * A struct dhcp6 will be allocated for this netif if not
+ * set via @ref dhcp6_set_struct before.
+ *
+ * @todo: stateful DHCPv6 not supported, yet
+ */
+err_t
+dhcp6_enable_stateful(struct netif *netif)
+{
+  LWIP_UNUSED_ARG(netif);
+  LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("stateful dhcp6 not implemented yet"));
+  return ERR_VAL;
+}
+
+/**
+ * @ingroup dhcp6
+ * Enable stateless DHCPv6 on this netif
+ * Requests are sent on receipt of an RA message with the
+ * ND6_RA_FLAG_OTHER_CONFIG flag set.
+ *
+ * A struct dhcp6 will be allocated for this netif if not
+ * set via @ref dhcp6_set_struct before.
+ */
+err_t
+dhcp6_enable_stateless(struct netif *netif)
+{
+  struct dhcp6 *dhcp6;
+
+  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp6_enable_stateless(netif=%p) %c%c%"U16_F"\n", (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
+
+  dhcp6 = dhcp6_get_struct(netif, "dhcp6_enable_stateless()");
+  if (dhcp6 == NULL) {
+    return ERR_MEM;
+  }
+  if (dhcp6_stateless_enabled(dhcp6)) {
+    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp6_enable_stateless(): stateless DHCPv6 already enabled"));
+    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(): stateless DHCPv6 enabled\n"));
+  dhcp6_set_state(dhcp6, DHCP6_STATE_STATELESS_IDLE, "dhcp6_enable_stateless");
+  return ERR_OK;
+}
+
+/**
+ * @ingroup dhcp6
+ * Disable stateful or stateless DHCPv6 on this netif
+ * Requests are sent on receipt of an RA message with the
+ * ND6_RA_FLAG_OTHER_CONFIG flag set.
+ */
+void
+dhcp6_disable(struct netif *netif)
+{
+  struct dhcp6 *dhcp6;
+
+  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp6_disable(netif=%p) %c%c%"U16_F"\n", (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
+
+  dhcp6 = netif_dhcp6_data(netif);
+  if (dhcp6 != NULL) {
+    if (dhcp6->state != DHCP6_STATE_OFF) {
+      LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("dhcp6_disable(): DHCPv6 disabled (old state: %s)\n",
+        (dhcp6_stateless_enabled(dhcp6) ? "stateless" : "stateful")));
+      dhcp6_set_state(dhcp6, DHCP6_STATE_OFF, "dhcp6_disable");
+      if (dhcp6->pcb_allocated != 0) {
+        dhcp6_dec_pcb_refcount(); /* free DHCPv6 PCB if not needed any more */
+        dhcp6->pcb_allocated = 0;
+      }
+    }
+  }
+}
+
+/**
+ * Create a DHCPv6 request, fill in common headers
+ *
+ * @param netif the netif under DHCPv6 control
+ * @param dhcp6 dhcp6 control struct
+ * @param message_type message type of the request
+ * @param opt_len_alloc option length to allocate
+ * @param options_out_len option length on exit
+ * @return a pbuf for the message
+ */
+static struct pbuf *
+dhcp6_create_msg(struct netif *netif, struct dhcp6 *dhcp6, u8_t message_type,
+                 u16_t opt_len_alloc, u16_t *options_out_len)
+{
+  struct pbuf *p_out;
+  struct dhcp6_msg *msg_out;
+
+  LWIP_ERROR("dhcp6_create_msg: netif != NULL", (netif != NULL), return NULL;);
+  LWIP_ERROR("dhcp6_create_msg: dhcp6 != NULL", (dhcp6 != NULL), return NULL;);
+  p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp6_msg) + opt_len_alloc, PBUF_RAM);
+  if (p_out == NULL) {
+    LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
+                ("dhcp6_create_msg(): could not allocate pbuf\n"));
+    return NULL;
+  }
+  LWIP_ASSERT("dhcp6_create_msg: check that first pbuf can hold struct dhcp6_msg",
+              (p_out->len >= sizeof(struct dhcp6_msg) + opt_len_alloc));
+
+  /* @todo: limit new xid for certain message types? */
+  /* reuse transaction identifier in retransmissions */
+  if (dhcp6->tries == 0) {
+    dhcp6->xid = LWIP_RAND() & 0xFFFFFF;
+  }
+
+  LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE,
+              ("transaction id xid(%"X32_F")\n", dhcp6->xid));
+
+  msg_out = (struct dhcp6_msg *)p_out->payload;
+  memset(msg_out, 0, sizeof(struct dhcp6_msg) + opt_len_alloc);
+
+  msg_out->msgtype = message_type;
+  msg_out->transaction_id[0] = (u8_t)(dhcp6->xid >> 16);
+  msg_out->transaction_id[1] = (u8_t)(dhcp6->xid >> 8);
+  msg_out->transaction_id[2] = (u8_t)dhcp6->xid;
+  *options_out_len = 0;
+  return p_out;
+}
+
+static u16_t
+dhcp6_option_short(u16_t options_out_len, u8_t *options, u16_t value)
+{
+  options[options_out_len++] = (u8_t)((value & 0xff00U) >> 8);
+  options[options_out_len++] = (u8_t) (value & 0x00ffU);
+  return options_out_len;
+}
+
+static u16_t
+dhcp6_option_optionrequest(u16_t options_out_len, u8_t *options, const u16_t *req_options,
+                           u16_t num_req_options, u16_t max_len)
+{
+  size_t i;
+  u16_t ret;
+
+  LWIP_ASSERT("dhcp6_option_optionrequest: options_out_len + sizeof(struct dhcp6_msg) + addlen <= max_len",
+    sizeof(struct dhcp6_msg) + options_out_len + 4U + (2U * num_req_options) <= max_len);
+  LWIP_UNUSED_ARG(max_len);
+
+  ret = dhcp6_option_short(options_out_len, options, DHCP6_OPTION_ORO);
+  ret = dhcp6_option_short(ret, options, 2 * num_req_options);
+  for (i = 0; i < num_req_options; i++) {
+    ret = dhcp6_option_short(ret, options, req_options[i]);
+  }
+  return ret;
+}
+
+/* All options are added, shrink the pbuf to the required size */
+static void
+dhcp6_msg_finalize(u16_t options_out_len, struct pbuf *p_out)
+{
+  /* shrink the pbuf to the actual content length */
+  pbuf_realloc(p_out, (u16_t)(sizeof(struct dhcp6_msg) + options_out_len));
+}
+
+
+#if LWIP_IPV6_DHCP6_STATELESS
+static void
+dhcp6_information_request(struct netif *netif, struct dhcp6 *dhcp6)
+{
+  const u16_t requested_options[] = {DHCP6_OPTION_DNS_SERVERS, DHCP6_OPTION_DOMAIN_LIST, DHCP6_OPTION_SNTP_SERVERS};
+  u16_t msecs;
+  struct pbuf *p_out;
+  u16_t options_out_len;
+  LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("dhcp6_information_request()\n"));
+  /* create and initialize the DHCP message header */
+  p_out = dhcp6_create_msg(netif, dhcp6, DHCP6_INFOREQUEST, 4 + sizeof(requested_options), &options_out_len);
+  if (p_out != NULL) {
+    err_t err;
+    struct dhcp6_msg *msg_out = (struct dhcp6_msg *)p_out->payload;
+    u8_t *options = (u8_t *)(msg_out + 1);
+    LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("dhcp6_information_request: making request\n"));
+
+    options_out_len = dhcp6_option_optionrequest(options_out_len, options, requested_options,
+      LWIP_ARRAYSIZE(requested_options), p_out->len);
+    LWIP_HOOK_DHCP6_APPEND_OPTIONS(netif, dhcp6, DHCP6_STATE_REQUESTING_CONFIG, msg_out,
+      DHCP6_INFOREQUEST, options_out_len, p_out->len);
+    dhcp6_msg_finalize(options_out_len, p_out);
+
+    err = udp_sendto_if(dhcp6_pcb, p_out, &dhcp6_All_DHCP6_Relay_Agents_and_Servers, DHCP6_SERVER_PORT, netif);
+    pbuf_free(p_out);
+    LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp6_information_request: INFOREQUESTING -> %d\n", (int)err));
+    LWIP_UNUSED_ARG(err);
+  } else {
+    LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp6_information_request: could not allocate DHCP6 request\n"));
+  }
+  dhcp6_set_state(dhcp6, DHCP6_STATE_REQUESTING_CONFIG, "dhcp6_information_request");
+  if (dhcp6->tries < 255) {
+    dhcp6->tries++;
+  }
+  msecs = (u16_t)((dhcp6->tries < 6 ? 1 << dhcp6->tries : 60) * 1000);
+  dhcp6->request_timeout = (u16_t)((msecs + DHCP6_TIMER_MSECS - 1) / DHCP6_TIMER_MSECS);
+  LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp6_information_request(): set request timeout %"U16_F" msecs\n", msecs));
+}
+
+static err_t
+dhcp6_request_config(struct netif *netif, struct dhcp6 *dhcp6)
+{
+  /* stateless mode enabled and no request running? */
+  if (dhcp6->state == DHCP6_STATE_STATELESS_IDLE) {
+    /* send Information-request and wait for answer; setup receive timeout */
+    dhcp6_information_request(netif, dhcp6);
+  }
+
+  return ERR_OK;
+}
+
+static void
+dhcp6_abort_config_request(struct dhcp6 *dhcp6)
+{
+  if (dhcp6->state == DHCP6_STATE_REQUESTING_CONFIG) {
+    /* abort running request */
+    dhcp6_set_state(dhcp6, DHCP6_STATE_STATELESS_IDLE, "dhcp6_abort_config_request");
+  }
+}
+
+/* Handle a REPLY to INFOREQUEST
+ * This parses DNS and NTP server addresses from the reply.
+ */
+static void
+dhcp6_handle_config_reply(struct netif *netif, struct pbuf *p_msg_in)
+{
+  struct dhcp6 *dhcp6 = netif_dhcp6_data(netif);
+
+  LWIP_UNUSED_ARG(dhcp6);
+  LWIP_UNUSED_ARG(p_msg_in);
+
+#if LWIP_DHCP6_PROVIDE_DNS_SERVERS
+  if (dhcp6_option_given(dhcp6, DHCP6_OPTION_IDX_DNS_SERVER)) {
+    ip_addr_t dns_addr;
+    ip6_addr_t *dns_addr6;
+    u16_t op_start = dhcp6_get_option_start(dhcp6, DHCP6_OPTION_IDX_DNS_SERVER);
+    u16_t op_len = dhcp6_get_option_length(dhcp6, DHCP6_OPTION_IDX_DNS_SERVER);
+    u16_t idx;
+    u8_t n;
+
+    memset(&dns_addr, 0, sizeof(dns_addr));
+    dns_addr6 = ip_2_ip6(&dns_addr);
+    for (n = 0, idx = op_start; (idx < op_start + op_len) && (n < LWIP_DHCP6_PROVIDE_DNS_SERVERS);
+         n++, idx += sizeof(struct ip6_addr_packed)) {
+      u16_t copied = pbuf_copy_partial(p_msg_in, dns_addr6, sizeof(struct ip6_addr_packed), idx);
+      if (copied != sizeof(struct ip6_addr_packed)) {
+        /* pbuf length mismatch */
+        return;
+      }
+      ip6_addr_assign_zone(dns_addr6, IP6_UNKNOWN, netif);
+      /* @todo: do we need a different offset than DHCP(v4)? */
+      dns_setserver(n, &dns_addr);
+    }
+  }
+  /* @ todo: parse and set Domain Search List */
+#endif /* LWIP_DHCP6_PROVIDE_DNS_SERVERS */
+
+#if LWIP_DHCP6_GET_NTP_SRV
+  if (dhcp6_option_given(dhcp6, DHCP6_OPTION_IDX_NTP_SERVER)) {
+    ip_addr_t ntp_server_addrs[LWIP_DHCP6_MAX_NTP_SERVERS];
+    u16_t op_start = dhcp6_get_option_start(dhcp6, DHCP6_OPTION_IDX_NTP_SERVER);
+    u16_t op_len = dhcp6_get_option_length(dhcp6, DHCP6_OPTION_IDX_NTP_SERVER);
+    u16_t idx;
+    u8_t n;
+
+    for (n = 0, idx = op_start; (idx < op_start + op_len) && (n < LWIP_DHCP6_MAX_NTP_SERVERS);
+         n++, idx += sizeof(struct ip6_addr_packed)) {
+      u16_t copied;
+      ip6_addr_t *ntp_addr6 = ip_2_ip6(&ntp_server_addrs[n]);
+      ip_addr_set_zero_ip6(&ntp_server_addrs[n]);
+      copied = pbuf_copy_partial(p_msg_in, ntp_addr6, sizeof(struct ip6_addr_packed), idx);
+      if (copied != sizeof(struct ip6_addr_packed)) {
+        /* pbuf length mismatch */
+        return;
+      }
+      ip6_addr_assign_zone(ntp_addr6, IP6_UNKNOWN, netif);
+    }
+    dhcp6_set_ntp_servers(n, ntp_server_addrs);
+  }
+#endif /* LWIP_DHCP6_GET_NTP_SRV */
+}
+#endif /* LWIP_IPV6_DHCP6_STATELESS */
+
+/** This function is called from nd6 module when an RA messsage is received
+ * It triggers DHCPv6 requests (if enabled).
+ */
+void
+dhcp6_nd6_ra_trigger(struct netif *netif, u8_t managed_addr_config, u8_t other_config)
+{
+  struct dhcp6 *dhcp6;
+
+  LWIP_ASSERT("netif != NULL", netif != NULL);
+  dhcp6 = netif_dhcp6_data(netif);
+
+  LWIP_UNUSED_ARG(managed_addr_config);
+  LWIP_UNUSED_ARG(other_config);
+  LWIP_UNUSED_ARG(dhcp6);
+
+#if LWIP_IPV6_DHCP6_STATELESS
+  if (dhcp6 != NULL) {
+    if (dhcp6_stateless_enabled(dhcp6)) {
+      if (other_config) {
+        dhcp6_request_config(netif, dhcp6);
+      } else {
+        dhcp6_abort_config_request(dhcp6);
+      }
+    }
+  }
+#endif /* LWIP_IPV6_DHCP6_STATELESS */
+}
+
+/**
+ * Parse the DHCPv6 message and extract the DHCPv6 options.
+ *
+ * Extract the DHCPv6 options (offset + length) so that we can later easily
+ * check for them or extract the contents.
+ */
+static err_t
+dhcp6_parse_reply(struct pbuf *p, struct dhcp6 *dhcp6)
+{
+  u16_t offset;
+  u16_t offset_max;
+  u16_t options_idx;
+  struct dhcp6_msg *msg_in;
+
+  LWIP_UNUSED_ARG(dhcp6);
+
+  /* clear received options */
+  dhcp6_clear_all_options(dhcp6);
+  msg_in = (struct dhcp6_msg *)p->payload;
+
+  /* parse options */
+
+  options_idx = sizeof(struct dhcp6_msg);
+  /* parse options to the end of the received packet */
+  offset_max = p->tot_len;
+
+  offset = options_idx;
+  /* at least 4 byte to read? */
+  while ((offset + 4 <= offset_max)) {
+    u8_t op_len_buf[4];
+    u8_t *op_len;
+    u16_t op;
+    u16_t len;
+    u16_t val_offset = (u16_t)(offset + 4);
+    if (val_offset < offset) {
+      /* overflow */
+      return ERR_BUF;
+    }
+    /* copy option + length, might be split accross 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 */
+      return ERR_VAL;
+    }
+    op = (op_len[0] << 8) | op_len[1];
+    len = (op_len[2] << 8) | op_len[3];
+    offset = val_offset + len;
+    if (offset < val_offset) {
+      /* overflow */
+      return ERR_BUF;
+    }
+
+    switch (op) {
+      case (DHCP6_OPTION_CLIENTID):
+        dhcp6_got_option(dhcp6, DHCP6_OPTION_IDX_CLI_ID);
+        dhcp6_set_option(dhcp6, DHCP6_OPTION_IDX_CLI_ID, val_offset, len);
+        break;
+      case (DHCP6_OPTION_SERVERID):
+        dhcp6_got_option(dhcp6, DHCP6_OPTION_IDX_SERVER_ID);
+        dhcp6_set_option(dhcp6, DHCP6_OPTION_IDX_SERVER_ID, val_offset, len);
+        break;
+#if LWIP_DHCP6_PROVIDE_DNS_SERVERS
+      case (DHCP6_OPTION_DNS_SERVERS):
+        dhcp6_got_option(dhcp6, DHCP6_OPTION_IDX_DNS_SERVER);
+        dhcp6_set_option(dhcp6, DHCP6_OPTION_IDX_DNS_SERVER, val_offset, len);
+        break;
+      case (DHCP6_OPTION_DOMAIN_LIST):
+        dhcp6_got_option(dhcp6, DHCP6_OPTION_IDX_DOMAIN_LIST);
+        dhcp6_set_option(dhcp6, DHCP6_OPTION_IDX_DOMAIN_LIST, val_offset, len);
+        break;
+#endif /* LWIP_DHCP6_PROVIDE_DNS_SERVERS */
+#if LWIP_DHCP6_GET_NTP_SRV
+      case (DHCP6_OPTION_SNTP_SERVERS):
+        dhcp6_got_option(dhcp6, DHCP6_OPTION_IDX_NTP_SERVER);
+        dhcp6_set_option(dhcp6, DHCP6_OPTION_IDX_NTP_SERVER, val_offset, len);
+        break;
+#endif /* LWIP_DHCP6_GET_NTP_SRV*/
+      default:
+        LWIP_DEBUGF(DHCP6_DEBUG, ("skipping option %"U16_F" in options\n", op));
+        LWIP_HOOK_DHCP6_PARSE_OPTION(ip_current_netif(), dhcp6, dhcp6->state, msg_in,
+          msg_in->msgtype, op, len, q, val_offset);
+        break;
+    }
+  }
+  return ERR_OK;
+}
+
+static void
+dhcp6_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
+{
+  struct netif *netif = ip_current_input_netif();
+  struct dhcp6 *dhcp6 = netif_dhcp6_data(netif);
+  struct dhcp6_msg *reply_msg = (struct dhcp6_msg *)p->payload;
+  u8_t msg_type;
+  u32_t xid;
+
+  LWIP_UNUSED_ARG(arg);
+
+  /* Caught DHCPv6 message from netif that does not have DHCPv6 enabled? -> not interested */
+  if ((dhcp6 == NULL) || (dhcp6->pcb_allocated == 0)) {
+    goto free_pbuf_and_return;
+  }
+
+  LWIP_ERROR("invalid server address type", IP_IS_V6(addr), goto free_pbuf_and_return;);
+
+  LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("dhcp6_recv(pbuf = %p) from DHCPv6 server %s port %"U16_F"\n", (void *)p,
+    ipaddr_ntoa(addr), port));
+  LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("pbuf->len = %"U16_F"\n", p->len));
+  LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("pbuf->tot_len = %"U16_F"\n", p->tot_len));
+  /* prevent warnings about unused arguments */
+  LWIP_UNUSED_ARG(pcb);
+  LWIP_UNUSED_ARG(addr);
+  LWIP_UNUSED_ARG(port);
+
+  if (p->len < sizeof(struct dhcp6_msg)) {
+    LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCPv6 reply message or pbuf too short\n"));
+    goto free_pbuf_and_return;
+  }
+
+  /* match transaction ID against what we expected */
+  xid = reply_msg->transaction_id[0] << 16;
+  xid |= reply_msg->transaction_id[1] << 8;
+  xid |= reply_msg->transaction_id[2];
+  if (xid != dhcp6->xid) {
+    LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,
+                ("transaction id mismatch reply_msg->xid(%"X32_F")!= dhcp6->xid(%"X32_F")\n", xid, dhcp6->xid));
+    goto free_pbuf_and_return;
+  }
+  /* option fields could be unfold? */
+  if (dhcp6_parse_reply(p, dhcp6) != ERR_OK) {
+    LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
+                ("problem unfolding DHCPv6 message - too short on memory?\n"));
+    goto free_pbuf_and_return;
+  }
+
+  /* read DHCP message type */
+  msg_type = reply_msg->msgtype;
+  /* message type is DHCP6 REPLY? */
+  if (msg_type == DHCP6_REPLY) {
+    LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("DHCP6_REPLY received\n"));
+#if LWIP_IPV6_DHCP6_STATELESS
+    /* in info-requesting state? */
+    if (dhcp6->state == DHCP6_STATE_REQUESTING_CONFIG) {
+      dhcp6_set_state(dhcp6, DHCP6_STATE_STATELESS_IDLE, "dhcp6_recv");
+      dhcp6_handle_config_reply(netif, p);
+    } else
+#endif /* LWIP_IPV6_DHCP6_STATELESS */
+    {
+      /* @todo: handle reply in other states? */
+    }
+  } else {
+    /* @todo: handle other message types */
+  }
+
+free_pbuf_and_return:
+  pbuf_free(p);
+}
+
+/**
+ * A DHCPv6 request has timed out.
+ *
+ * The timer that was started with the DHCPv6 request has
+ * timed out, indicating no response was received in time.
+ */
+static void
+dhcp6_timeout(struct netif *netif, struct dhcp6 *dhcp6)
+{
+  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp6_timeout()\n"));
+
+  LWIP_UNUSED_ARG(netif);
+  LWIP_UNUSED_ARG(dhcp6);
+
+#if LWIP_IPV6_DHCP6_STATELESS
+  /* back-off period has passed, or server selection timed out */
+  if (dhcp6->state == DHCP6_STATE_REQUESTING_CONFIG) {
+    LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("dhcp6_timeout(): retrying information request\n"));
+    dhcp6_information_request(netif, dhcp6);
+  }
+#endif /* LWIP_IPV6_DHCP6_STATELESS */
+}
+
+/**
+ * DHCPv6 timeout handling (this function must be called every 500ms,
+ * see @ref DHCP6_TIMER_MSECS).
+ *
+ * A DHCPv6 server is expected to respond within a short period of time.
+ * This timer checks whether an outstanding DHCPv6 request is timed out.
+ */
+void
+dhcp6_tmr(void)
+{
+  struct netif *netif;
+  /* loop through netif's */
+  NETIF_FOREACH(netif) {
+    struct dhcp6 *dhcp6 = netif_dhcp6_data(netif);
+    /* only act on DHCPv6 configured interfaces */
+    if (dhcp6 != NULL) {
+      /* timer is active (non zero), and is about to trigger now */
+      if (dhcp6->request_timeout > 1) {
+        dhcp6->request_timeout--;
+      } else if (dhcp6->request_timeout == 1) {
+        dhcp6->request_timeout--;
+        /* { dhcp6->request_timeout == 0 } */
+        LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp6_tmr(): request timeout\n"));
+        /* this client's request timeout triggered */
+        dhcp6_timeout(netif, dhcp6);
+      }
+    }
+  }
+}
 
 #endif /* LWIP_IPV6 && LWIP_IPV6_DHCP6 */
diff --git a/src/core/ipv6/ethip6.c b/src/core/ipv6/ethip6.c
index 8f9a91b..fec8b28 100644
--- a/src/core/ipv6/ethip6.c
+++ b/src/core/ipv6/ethip6.c
@@ -82,6 +82,11 @@
   const u8_t *hwaddr;
   err_t result;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
+  /* The destination IP address must be properly zoned from here on down. */
+  IP6_ADDR_ZONECHECK_NETIF(ip6addr, netif);
+
   /* multicast destination IP address? */
   if (ip6_addr_ismulticast(ip6addr)) {
     /* Hash IP multicast address to MAC address.*/
diff --git a/src/core/ipv6/icmp6.c b/src/core/ipv6/icmp6.c
index 323b69a..167738a 100644
--- a/src/core/ipv6/icmp6.c
+++ b/src/core/ipv6/icmp6.c
@@ -57,15 +57,17 @@
 
 #include <string.h>
 
-#ifndef LWIP_ICMP6_DATASIZE
-#define LWIP_ICMP6_DATASIZE   8
-#endif
 #if LWIP_ICMP6_DATASIZE == 0
+#undef LWIP_ICMP6_DATASIZE
 #define LWIP_ICMP6_DATASIZE   8
 #endif
 
 /* Forward declarations */
 static void icmp6_send_response(struct pbuf *p, u8_t code, u32_t data, u8_t type);
+static void icmp6_send_response_with_addrs(struct pbuf *p, u8_t code, u32_t data,
+    u8_t type, const ip6_addr_t *src_addr, const ip6_addr_t *dest_addr);
+static void icmp6_send_response_with_addrs_and_netif(struct pbuf *p, u8_t code, u32_t data,
+    u8_t type, const ip6_addr_t *src_addr, const ip6_addr_t *dest_addr, struct netif *netif);
 
 
 /**
@@ -118,7 +120,6 @@
   case ICMP6_TYPE_PTB: /* Packet too big */
     nd6_input(p, inp);
     return;
-    break;
   case ICMP6_TYPE_RS:
 #if LWIP_IPV6_FORWARD
     /* @todo implement router functionality */
@@ -130,7 +131,6 @@
   case ICMP6_TYPE_MLD:
     mld6_input(p, inp);
     return;
-    break;
 #endif
   case ICMP6_TYPE_EREQ:
 #if !LWIP_MULTICAST_PING
@@ -209,6 +209,9 @@
 /**
  * Send an icmpv6 'destination unreachable' packet.
  *
+ * This function must be used only in direct response to a packet that is being
+ * received right now. Otherwise, address zones would be lost.
+ *
  * @param p the input packet for which the 'unreachable' should be sent,
  *          p->payload pointing to the IPv6 header
  * @param c ICMPv6 code for the unreachable type
@@ -222,6 +225,9 @@
 /**
  * Send an icmpv6 'packet too big' packet.
  *
+ * This function must be used only in direct response to a packet that is being
+ * received right now. Otherwise, address zones would be lost.
+ *
  * @param p the input packet for which the 'packet too big' should be sent,
  *          p->payload pointing to the IPv6 header
  * @param mtu the maximum mtu that we can accept
@@ -235,7 +241,10 @@
 /**
  * Send an icmpv6 'time exceeded' packet.
  *
- * @param p the input packet for which the 'unreachable' should be sent,
+ * This function must be used only in direct response to a packet that is being
+ * received right now. Otherwise, address zones would be lost.
+ *
+ * @param p the input packet for which the 'time exceeded' should be sent,
  *          p->payload pointing to the IPv6 header
  * @param c ICMPv6 code for the time exceeded type
  */
@@ -246,21 +255,49 @@
 }
 
 /**
+ * Send an icmpv6 'time exceeded' packet, with explicit source and destination
+ * addresses.
+ *
+ * This function may be used to send a response sometime after receiving the
+ * packet for which this response is meant. The provided source and destination
+ * addresses are used primarily to retain their zone information.
+ *
+ * @param p the input packet for which the 'time exceeded' should be sent,
+ *          p->payload pointing to the IPv6 header
+ * @param c ICMPv6 code for the time exceeded type
+ * @param src_addr source address of the original packet, with zone information
+ * @param dest_addr destination address of the original packet, with zone
+ *                  information
+ */
+void
+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)
+{
+  icmp6_send_response_with_addrs(p, c, 0, ICMP6_TYPE_TE, src_addr, dest_addr);
+}
+
+/**
  * Send an icmpv6 'parameter problem' packet.
  *
+ * This function must be used only in direct response to a packet that is being
+ * received right now. Otherwise, address zones would be lost and the calculated
+ * offset would be wrong (calculated against ip6_current_header()).
+ *
  * @param p the input packet for which the 'param problem' should be sent,
  *          p->payload pointing to the IP header
  * @param c ICMPv6 code for the param problem type
  * @param pointer the pointer to the byte where the parameter is found
  */
 void
-icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, u32_t pointer)
+icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, const void *pointer)
 {
-  icmp6_send_response(p, c, pointer, ICMP6_TYPE_PP);
+  u32_t pointer_u32 = (u32_t)((const u8_t *)pointer - (const u8_t *)ip6_current_header());
+  icmp6_send_response(p, c, pointer_u32, ICMP6_TYPE_PP);
 }
 
 /**
  * Send an ICMPv6 packet in response to an incoming packet.
+ * The packet is sent *to* ip_current_src_addr() on ip_current_netif().
  *
  * @param p the input packet for which the response should be sent,
  *          p->payload pointing to the IPv6 header
@@ -271,13 +308,85 @@
 static void
 icmp6_send_response(struct pbuf *p, u8_t code, u32_t data, u8_t type)
 {
+  const struct ip6_addr *reply_src, *reply_dest;
+  struct netif *netif = ip_current_netif();
+
+  LWIP_ASSERT("icmpv6 packet not a direct response", netif != NULL);
+  reply_dest = ip6_current_src_addr();
+
+  /* Select an address to use as source. */
+  reply_src = ip_2_ip6(ip6_select_source_address(netif, reply_dest));
+  if (reply_src == NULL) {
+    ICMP6_STATS_INC(icmp6.rterr);
+    return;
+  }
+  icmp6_send_response_with_addrs_and_netif(p, code, data, type, reply_src, reply_dest, netif);
+}
+
+/**
+ * Send an ICMPv6 packet in response to an incoming packet.
+ *
+ * Call this function if the packet is NOT sent as a direct response to an
+ * incoming packet, but rather sometime later (e.g. for a fragment reassembly
+ * timeout). The caller must provide the zoned source and destination addresses
+ * from the original packet with the src_addr and dest_addr parameters. The
+ * reason for this approach is that while the addresses themselves are part of
+ * the original packet, their zone information is not, thus possibly resulting
+ * in a link-local response being sent over the wrong link.
+ *
+ * @param p the input packet for which the response should be sent,
+ *          p->payload pointing to the IPv6 header
+ * @param code Code of the ICMPv6 header
+ * @param data Additional 32-bit parameter in the ICMPv6 header
+ * @param type Type of the ICMPv6 header
+ * @param src_addr original source address
+ * @param dest_addr original destination address
+ */
+static void
+icmp6_send_response_with_addrs(struct pbuf *p, u8_t code, u32_t data, u8_t type,
+    const ip6_addr_t *src_addr, const ip6_addr_t *dest_addr)
+{
+  const struct ip6_addr *reply_src, *reply_dest;
+  struct netif *netif;
+
+  /* Get the destination address and netif for this ICMP message. */
+  LWIP_ASSERT("must provide both source and destination", src_addr != NULL);
+  LWIP_ASSERT("must provide both source and destination", dest_addr != NULL);
+
+  /* Special case, as ip6_current_xxx is either NULL, or points
+     to a different packet than the one that expired. */
+  IP6_ADDR_ZONECHECK(src_addr);
+  IP6_ADDR_ZONECHECK(dest_addr);
+  /* Swap source and destination for the reply. */
+  reply_dest = src_addr;
+  reply_src = dest_addr;
+  netif = ip6_route(reply_src, reply_dest);
+  if (netif == NULL) {
+    ICMP6_STATS_INC(icmp6.rterr);
+    return;
+  }
+  icmp6_send_response_with_addrs_and_netif(p, code, data, type, reply_src,
+    reply_dest, netif);
+}
+
+/**
+ * Send an ICMPv6 packet (with srd/dst address and netif given).
+ *
+ * @param p the input packet for which the response should be sent,
+ *          p->payload pointing to the IPv6 header
+ * @param code Code of the ICMPv6 header
+ * @param data Additional 32-bit parameter in the ICMPv6 header
+ * @param type Type of the ICMPv6 header
+ * @param reply_src source address of the packet to send
+ * @param reply_dest destination address of the packet to send
+ * @param netif netif to send the packet
+ */
+static void
+icmp6_send_response_with_addrs_and_netif(struct pbuf *p, u8_t code, u32_t data, u8_t type,
+    const ip6_addr_t *reply_src, const ip6_addr_t *reply_dest, struct netif *netif)
+{
   struct pbuf *q;
   struct icmp6_hdr *icmp6hdr;
-  const ip6_addr_t *reply_src;
-  ip6_addr_t *reply_dest;
-  ip6_addr_t reply_src_local, reply_dest_local;
-  struct ip6_hdr *ip6hdr;
-  struct netif *netif;
 
   /* ICMPv6 header + IPv6 header + data */
   q = pbuf_alloc(PBUF_IP, sizeof(struct icmp6_hdr) + IP6_HLEN + LWIP_ICMP6_DATASIZE,
@@ -293,46 +402,12 @@
   icmp6hdr = (struct icmp6_hdr *)q->payload;
   icmp6hdr->type = type;
   icmp6hdr->code = code;
-  icmp6hdr->data = data;
+  icmp6hdr->data = lwip_htonl(data);
 
   /* copy fields from original packet */
   SMEMCPY((u8_t *)q->payload + sizeof(struct icmp6_hdr), (u8_t *)p->payload,
           IP6_HLEN + LWIP_ICMP6_DATASIZE);
 
-  /* Get the destination address and netif for this ICMP message. */
-  if ((ip_current_netif() == NULL) ||
-      ((code == ICMP6_TE_FRAG) && (type == ICMP6_TYPE_TE))) {
-    /* Special case, as ip6_current_xxx is either NULL, or points
-     * to a different packet than the one that expired.
-     * We must use the addresses that are stored in the expired packet. */
-    ip6hdr = (struct ip6_hdr *)p->payload;
-    /* copy from packed address to aligned address */
-    ip6_addr_copy(reply_dest_local, ip6hdr->src);
-    ip6_addr_copy(reply_src_local, ip6hdr->dest);
-    reply_dest = &reply_dest_local;
-    reply_src = &reply_src_local;
-    netif = ip6_route(reply_src, reply_dest);
-    if (netif == NULL) {
-      /* drop */
-      pbuf_free(q);
-      ICMP6_STATS_INC(icmp6.rterr);
-      return;
-    }
-  }
-  else {
-    netif = ip_current_netif();
-    reply_dest = ip6_current_src_addr();
-
-    /* Select an address to use as source. */
-    reply_src = ip_2_ip6(ip6_select_source_address(netif, reply_dest));
-    if (reply_src == NULL) {
-      /* drop */
-      pbuf_free(q);
-      ICMP6_STATS_INC(icmp6.rterr);
-      return;
-    }
-  }
-
   /* calculate checksum */
   icmp6hdr->chksum = 0;
 #if CHECKSUM_GEN_ICMP6
diff --git a/src/core/ipv6/ip6.c b/src/core/ipv6/ip6.c
index f14e334..eda11dc 100644
--- a/src/core/ipv6/ip6.c
+++ b/src/core/ipv6/ip6.c
@@ -51,7 +51,7 @@
 #include "lwip/ip6_addr.h"
 #include "lwip/ip6_frag.h"
 #include "lwip/icmp6.h"
-#include "lwip/raw.h"
+#include "lwip/priv/raw_priv.h"
 #include "lwip/udp.h"
 #include "lwip/priv/tcp_priv.h"
 #include "lwip/dhcp6.h"
@@ -68,13 +68,15 @@
  * Finds the appropriate network interface for a given IPv6 address. It tries to select
  * a netif following a sequence of heuristics:
  * 1) if there is only 1 netif, return it
- * 2) if the destination is a link-local address, try to match the src address to a netif.
- *    this is a tricky case because with multiple netifs, link-local addresses only have
- *    meaning within a particular subnet/link.
- * 3) tries to match the destination subnet to a configured address
- * 4) tries to find a router
- * 5) tries to match the source address to the netif
- * 6) returns the default netif, if configured
+ * 2) if the destination is a zoned address, match its zone to a netif
+ * 3) if the either the source or destination address is a scoped address,
+ *    match the source address's zone (if set) or address (if not) to a netif
+ * 4) tries to match the destination subnet to a configured address
+ * 5) tries to find a router-announced route
+ * 6) tries to match the (unscoped) source address to the netif
+ * 7) returns the default netif, if configured
+ *
+ * Note that each of the two given addresses may or may not be properly zoned.
  *
  * @param src the source IPv6 address, if known
  * @param dest the destination IPv6 address for which to find the route
@@ -83,50 +85,101 @@
 struct netif *
 ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest)
 {
+#if LWIP_SINGLE_NETIF
+  LWIP_UNUSED_ARG(src);
+  LWIP_UNUSED_ARG(dest);
+#else /* LWIP_SINGLE_NETIF */
   struct netif *netif;
   s8_t i;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
   /* If single netif configuration, fast return. */
   if ((netif_list != NULL) && (netif_list->next == NULL)) {
-    if (!netif_is_up(netif_list) || !netif_is_link_up(netif_list)) {
+    if (!netif_is_up(netif_list) || !netif_is_link_up(netif_list) ||
+        (ip6_addr_has_zone(dest) && !ip6_addr_test_zone(dest, netif_list))) {
       return NULL;
     }
     return netif_list;
   }
 
-  /* Special processing for link-local addresses. */
-  if (ip6_addr_islinklocal(dest)) {
-    if (ip6_addr_isany(src)) {
-      /* Use default netif, if Up. */
-      if (netif_default == NULL || !netif_is_up(netif_default) ||
-          !netif_is_link_up(netif_default)) {
-        return NULL;
+#if LWIP_IPV6_SCOPES
+  /* Special processing for zoned destination addresses. This includes link-
+   * local unicast addresses and interface/link-local multicast addresses. Use
+   * the zone to find a matching netif. If the address is not zoned, then there
+   * is technically no "wrong" netif to choose, and we leave routing to other
+   * rules; in most cases this should be the scoped-source rule below. */
+  if (ip6_addr_has_zone(dest)) {
+    IP6_ADDR_ZONECHECK(dest);
+    /* Find a netif based on the zone. For custom mappings, one zone may map
+     * to multiple netifs, so find one that can actually send a packet. */
+    NETIF_FOREACH(netif) {
+      if (ip6_addr_test_zone(dest, netif) &&
+          netif_is_up(netif) && netif_is_link_up(netif)) {
+        return netif;
       }
-      return netif_default;
     }
+    /* No matching netif found. Do no try to route to a different netif,
+     * as that would be a zone violation, resulting in any packets sent to
+     * that netif being dropped on output. */
+    return NULL;
+  }
+#endif /* LWIP_IPV6_SCOPES */
 
-    /* Try to find the netif for the source address, checking that link is up. */
-    for (netif = netif_list; netif != NULL; netif = netif->next) {
-      if (!netif_is_up(netif) || !netif_is_link_up(netif)) {
-        continue;
-      }
-      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))) {
+  /* Special processing for scoped source and destination addresses. If we get
+   * here, the destination address does not have a zone, so either way we need
+   * to look at the source address, which may or may not have a zone. If it
+   * does, the zone is restrictive: there is (typically) only one matching
+   * netif for it, and we should avoid routing to any other netif as that would
+   * result in guaranteed zone violations. For scoped source addresses that do
+   * not have a zone, use (only) a netif that has that source address locally
+   * assigned. This case also applies to the loopback source address, which has
+   * an implied link-local scope. If only the destination address is scoped
+   * (but, again, not zoned), we still want to use only the source address to
+   * determine its zone because that's most likely what the user/application
+   * wants, regardless of whether the source address is scoped. Finally, some
+   * of this story also applies if scoping is disabled altogether. */
+#if LWIP_IPV6_SCOPES
+  if (ip6_addr_has_scope(dest, IP6_UNKNOWN) ||
+      ip6_addr_has_scope(src, IP6_UNICAST) ||
+#else /* LWIP_IPV6_SCOPES */
+  if (ip6_addr_islinklocal(dest) || ip6_addr_ismulticast_iflocal(dest) ||
+      ip6_addr_ismulticast_linklocal(dest) || ip6_addr_islinklocal(src) ||
+#endif /* LWIP_IPV6_SCOPES */
+      ip6_addr_isloopback(src)) {
+#if LWIP_IPV6_SCOPES
+    if (ip6_addr_has_zone(src)) {
+      /* Find a netif matching the source zone (relatively cheap). */
+      NETIF_FOREACH(netif) {
+        if (netif_is_up(netif) && netif_is_link_up(netif) &&
+            ip6_addr_test_zone(src, netif)) {
           return netif;
         }
       }
+    } else
+#endif /* LWIP_IPV6_SCOPES */
+    {
+      /* Find a netif matching the source address (relatively expensive). */
+      NETIF_FOREACH(netif) {
+        if (!netif_is_up(netif) || !netif_is_link_up(netif)) {
+          continue;
+        }
+        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))) {
+            return netif;
+          }
+        }
+      }
     }
-
-    /* netif not found, use default netif, if up */
-    if (netif_default == NULL || !netif_is_up(netif_default) ||
-        !netif_is_link_up(netif_default)) {
-      return NULL;
-    }
-    return netif_default;
+    /* Again, do not use any other netif in this case, as that could result in
+     * zone boundary violations. */
+    return NULL;
   }
 
-  /* we come here for non-link-local addresses */
+  /* We come here only if neither source nor destination is scoped. */
+  IP6_ADDR_ZONECHECK(src);
+
 #ifdef LWIP_HOOK_IP6_ROUTE
   netif = LWIP_HOOK_IP6_ROUTE(src, dest);
   if (netif != NULL) {
@@ -134,28 +187,36 @@
   }
 #endif
 
-  /* See if the destination subnet matches a configured address. */
-  for (netif = netif_list; netif != NULL; netif = netif->next) {
+  /* See if the destination subnet matches a configured address. In accordance
+   * with RFC 5942, dynamically configured addresses do not have an implied
+   * local subnet, and thus should be considered /128 assignments. However, as
+   * such, the destination address may still match a local address, and so we
+   * still need to check for exact matches here. By (lwIP) policy, statically
+   * configured addresses do always have an implied local /64 subnet. */
+  NETIF_FOREACH(netif) {
     if (!netif_is_up(netif) || !netif_is_link_up(netif)) {
       continue;
     }
     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_netcmp(dest, netif_ip6_addr(netif, i)) &&
+          (netif_ip6_addr_isstatic(netif, i) ||
+          ip6_addr_nethostcmp(dest, netif_ip6_addr(netif, i)))) {
         return netif;
       }
     }
   }
 
-  /* Get the netif for a suitable router. */
+  /* Get the netif for a suitable router-announced route. */
   netif = nd6_find_route(dest);
-  if ((netif != NULL) && netif_is_up(netif) && netif_is_link_up(netif)) {
+  if (netif != NULL) {
     return netif;
   }
 
-  /* try with the netif that matches the source address. */
+  /* Try with the netif that matches the source address. Given the earlier rule
+   * for scoped source addresses, this applies to unscoped addresses only. */
   if (!ip6_addr_isany(src)) {
-    for (netif = netif_list; netif != NULL; netif = netif->next) {
+    NETIF_FOREACH(netif) {
       if (!netif_is_up(netif) || !netif_is_link_up(netif)) {
         continue;
       }
@@ -176,7 +237,7 @@
       return netif_default;
     }
     /* default netif is not up, just use any netif for loopback traffic */
-    for (netif = netif_list; netif != NULL; netif = netif->next) {
+    NETIF_FOREACH(netif) {
       if (netif_is_up(netif)) {
         return netif;
       }
@@ -184,6 +245,7 @@
     return NULL;
   }
 #endif /* LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF */
+#endif /* !LWIP_SINGLE_NETIF */
 
   /* no matching netif found, use default netif, if up */
   if ((netif_default == NULL) || !netif_is_up(netif_default) || !netif_is_link_up(netif_default)) {
@@ -194,85 +256,100 @@
 
 /**
  * @ingroup ip6
- * Select the best IPv6 source address for a given destination
- * IPv6 address. Loosely follows RFC 3484. "Strong host" behavior
- * is assumed.
+ * Select the best IPv6 source address for a given destination IPv6 address.
+ *
+ * This implementation follows RFC 6724 Sec. 5 to the following extent:
+ * - Rules 1, 2, 3: fully implemented
+ * - Rules 4, 5, 5.5: not applicable
+ * - Rule 6: not implemented
+ * - Rule 7: not applicable
+ * - Rule 8: limited to "prefer /64 subnet match over non-match"
+ *
+ * For Rule 2, we deliberately deviate from RFC 6724 Sec. 3.1 by considering
+ * ULAs to be of smaller scope than global addresses, to avoid that a preferred
+ * ULA is picked over a deprecated global address when given a global address
+ * as destination, as that would likely result in broken two-way communication.
+ *
+ * As long as temporary addresses are not supported (as used in Rule 7), a
+ * proper implementation of Rule 8 would obviate the need to implement Rule 6.
  *
  * @param netif the netif on which to send a packet
- * @param dest the destination we are trying to reach
+ * @param dest the destination we are trying to reach (possibly not properly
+ *             zoned)
  * @return the most suitable source address to use, or NULL if no suitable
  *         source address is found
  */
 const ip_addr_t *
 ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest)
 {
-  const ip_addr_t *src = NULL;
-  u8_t i;
+  const ip_addr_t *best_addr;
+  const ip6_addr_t *cand_addr;
+  s8_t dest_scope, cand_scope;
+  s8_t best_scope = IP6_MULTICAST_SCOPE_RESERVED;
+  u8_t i, cand_pref, cand_bits;
+  u8_t best_pref = 0;
+  u8_t best_bits = 0;
 
-  /* If dest is link-local, choose a link-local source. */
-  if (ip6_addr_islinklocal(dest) || ip6_addr_ismulticast_linklocal(dest) || ip6_addr_ismulticast_iflocal(dest)) {
-    for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
-      if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&
-          ip6_addr_islinklocal(netif_ip6_addr(netif, i))) {
-        return netif_ip_addr6(netif, i);
-      }
-    }
+  /* Start by determining the scope of the given destination address. These
+   * tests are hopefully (roughly) in order of likeliness to match. */
+  if (ip6_addr_isglobal(dest)) {
+    dest_scope = IP6_MULTICAST_SCOPE_GLOBAL;
+  } else if (ip6_addr_islinklocal(dest) || ip6_addr_isloopback(dest)) {
+    dest_scope = IP6_MULTICAST_SCOPE_LINK_LOCAL;
+  } else if (ip6_addr_isuniquelocal(dest)) {
+    dest_scope = IP6_MULTICAST_SCOPE_ORGANIZATION_LOCAL;
+  } else if (ip6_addr_ismulticast(dest)) {
+    dest_scope = ip6_addr_multicast_scope(dest);
+  } else if (ip6_addr_issitelocal(dest)) {
+    dest_scope = IP6_MULTICAST_SCOPE_SITE_LOCAL;
+  } else {
+    /* no match, consider scope global */
+    dest_scope = IP6_MULTICAST_SCOPE_GLOBAL;
   }
 
-  /* Choose a site-local with matching prefix. */
-  if (ip6_addr_issitelocal(dest) || ip6_addr_ismulticast_sitelocal(dest)) {
-    for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
-      if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&
-          ip6_addr_issitelocal(netif_ip6_addr(netif, i)) &&
-          ip6_addr_netcmp(dest, netif_ip6_addr(netif, i))) {
-        return netif_ip_addr6(netif, i);
-      }
-    }
-  }
+  best_addr = NULL;
 
-  /* Choose a unique-local with matching prefix. */
-  if (ip6_addr_isuniquelocal(dest) || ip6_addr_ismulticast_orglocal(dest)) {
-    for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
-      if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&
-          ip6_addr_isuniquelocal(netif_ip6_addr(netif, i)) &&
-          ip6_addr_netcmp(dest, netif_ip6_addr(netif, i))) {
-        return netif_ip_addr6(netif, i);
-      }
-    }
-  }
-
-  /* Choose a global with best matching prefix. */
-  if (ip6_addr_isglobal(dest) || ip6_addr_ismulticast_global(dest)) {
-    for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
-      if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&
-          ip6_addr_isglobal(netif_ip6_addr(netif, i))) {
-        if (src == NULL) {
-          src = netif_ip_addr6(netif, i);
-        }
-        else {
-          /* Replace src only if we find a prefix match. */
-          /* @todo find longest matching prefix. */
-          if ((!(ip6_addr_netcmp(ip_2_ip6(src), dest))) &&
-              ip6_addr_netcmp(netif_ip6_addr(netif, i), dest)) {
-            src = netif_ip_addr6(netif, i);
-          }
-        }
-      }
-    }
-    if (src != NULL) {
-      return src;
-    }
-  }
-
-  /* Last resort: see if arbitrary prefix matches. */
   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))) {
-      return netif_ip_addr6(netif, i);
+    /* Consider only valid (= preferred and deprecated) addresses. */
+    if (!ip6_addr_isvalid(netif_ip6_addr_state(netif, i))) {
+      continue;
+    }
+    /* Determine the scope of this candidate address. Same ordering idea. */
+    cand_addr = netif_ip6_addr(netif, i);
+    if (ip6_addr_isglobal(cand_addr)) {
+      cand_scope = IP6_MULTICAST_SCOPE_GLOBAL;
+    } else if (ip6_addr_islinklocal(cand_addr)) {
+      cand_scope = IP6_MULTICAST_SCOPE_LINK_LOCAL;
+    } else if (ip6_addr_isuniquelocal(cand_addr)) {
+      cand_scope = IP6_MULTICAST_SCOPE_ORGANIZATION_LOCAL;
+    } else if (ip6_addr_issitelocal(cand_addr)) {
+      cand_scope = IP6_MULTICAST_SCOPE_SITE_LOCAL;
+    } else {
+      /* no match, treat as low-priority global scope */
+      cand_scope = IP6_MULTICAST_SCOPE_RESERVEDF;
+    }
+    cand_pref = ip6_addr_ispreferred(netif_ip6_addr_state(netif, i));
+    /* @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)) {
+      return netif_ip_addr6(netif, i); /* Rule 1 */
+    }
+    if ((best_addr == NULL) || /* no alternative yet */
+        ((cand_scope < best_scope) && (cand_scope >= dest_scope)) ||
+        ((cand_scope > best_scope) && (best_scope < dest_scope)) || /* Rule 2 */
+        ((cand_scope == best_scope) && ((cand_pref > best_pref) || /* Rule 3 */
+        ((cand_pref == best_pref) && (cand_bits > best_bits))))) { /* Rule 8 */
+      /* We found a new "winning" candidate. */
+      best_addr = netif_ip_addr6(netif, i);
+      best_scope = cand_scope;
+      best_pref = cand_pref;
+      best_bits = cand_bits;
     }
   }
 
-  return NULL;
+  return best_addr; /* may be NULL */
 }
 
 #if LWIP_IPV6_FORWARD
@@ -321,6 +398,20 @@
     IP6_STATS_INC(ip6.drop);
     return;
   }
+#if LWIP_IPV6_SCOPES
+  /* Do not forward packets with a zoned (e.g., link-local) source address
+   * outside of their zone. We determined the zone a bit earlier, so we know
+   * that the address is properly zoned here, so we can safely use has_zone.
+   * Also skip packets with a loopback source address (link-local implied). */
+  if ((ip6_addr_has_zone(ip6_current_src_addr()) &&
+      !ip6_addr_test_zone(ip6_current_src_addr(), netif)) ||
+      ip6_addr_isloopback(ip6_current_src_addr())) {
+    LWIP_DEBUGF(IP6_DEBUG, ("ip6_forward: not forwarding packet beyond its source address zone.\n"));
+    IP6_STATS_INC(ip6.rterr);
+    IP6_STATS_INC(ip6.drop);
+    return;
+  }
+#endif /* LWIP_IPV6_SCOPES */
   /* Do not forward packets onto the same network interface on which
    * they arrived. */
   if (netif == inp) {
@@ -373,6 +464,33 @@
 }
 #endif /* LWIP_IPV6_FORWARD */
 
+/** Return true if the current input packet should be accepted on this netif */
+static int
+ip6_input_accept(struct netif *netif)
+{
+  /* interface is up? */
+  if (netif_is_up(netif)) {
+    u8_t i;
+    /* unicast to this interface address? address configured? */
+    /* If custom scopes are used, the destination zone will be tested as
+      * part of the local-address comparison, but we need to test the source
+      * 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))
+#if IPV6_CUSTOM_SCOPES
+          && (!ip6_addr_has_zone(ip6_current_src_addr()) ||
+              ip6_addr_test_zone(ip6_current_src_addr(), netif))
+#endif /* IPV6_CUSTOM_SCOPES */
+      ) {
+        /* accept on this netif */
+        return 1;
+      }
+    }
+  }
+  return 0;
+}
+
 /**
  * This function is called by the network interface device driver when
  * an IPv6 packet is received. The function does the basic checks of the
@@ -392,13 +510,17 @@
 {
   struct ip6_hdr *ip6hdr;
   struct netif *netif;
-  u8_t nexth;
-  u16_t hlen; /* the current header length */
-  u8_t i;
+  const u8_t *nexth;
+  u16_t hlen, hlen_tot; /* the current header length */
 #if 0 /*IP_ACCEPT_LINK_LAYER_ADDRESSING*/
   @todo
   int check_ip_src=1;
 #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
+#if LWIP_RAW
+  raw_input_state_t raw_status;
+#endif /* LWIP_RAW */
+
+  LWIP_ASSERT_CORE_LOCKED();
 
   IP6_STATS_INC(ip6.recv);
 
@@ -421,7 +543,7 @@
 #endif
 
   /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */
-  if ((IP6_HLEN > p->len) || ((IP6H_PLEN(ip6hdr) + IP6_HLEN) > p->tot_len)) {
+  if ((IP6_HLEN > p->len) || (IP6H_PLEN(ip6hdr) > (p->tot_len - IP6_HLEN))) {
     if (IP6_HLEN > p->len) {
       LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
         ("IPv6 header (len %"U16_F") does not fit in first pbuf (len %"U16_F"), IP packet dropped.\n",
@@ -441,22 +563,28 @@
 
   /* Trim pbuf. This should have been done at the netif layer,
    * but we'll do it anyway just to be sure that its done. */
-  pbuf_realloc(p, IP6_HLEN + IP6H_PLEN(ip6hdr));
+  pbuf_realloc(p, (u16_t)(IP6_HLEN + IP6H_PLEN(ip6hdr)));
 
   /* copy IP addresses to aligned ip6_addr_t */
-  ip_addr_copy_from_ip6(ip_data.current_iphdr_dest, ip6hdr->dest);
-  ip_addr_copy_from_ip6(ip_data.current_iphdr_src, ip6hdr->src);
+  ip_addr_copy_from_ip6_packed(ip_data.current_iphdr_dest, ip6hdr->dest);
+  ip_addr_copy_from_ip6_packed(ip_data.current_iphdr_src, ip6hdr->src);
 
   /* Don't accept virtual IPv4 mapped IPv6 addresses.
    * Don't accept multicast source addresses. */
   if (ip6_addr_isipv4mappedipv6(ip_2_ip6(&ip_data.current_iphdr_dest)) ||
      ip6_addr_isipv4mappedipv6(ip_2_ip6(&ip_data.current_iphdr_src)) ||
      ip6_addr_ismulticast(ip_2_ip6(&ip_data.current_iphdr_src))) {
+    /* free (drop) packet pbufs */
+    pbuf_free(p);
     IP6_STATS_INC(ip6.err);
     IP6_STATS_INC(ip6.drop);
     return ERR_OK;
   }
 
+  /* Set the appropriate zone identifier on the addresses. */
+  ip6_addr_assign_zone(ip_2_ip6(&ip_data.current_iphdr_dest), IP6_UNKNOWN, inp);
+  ip6_addr_assign_zone(ip_2_ip6(&ip_data.current_iphdr_src), IP6_UNICAST, inp);
+
   /* current header pointer. */
   ip_data.current_ip6_header = ip6hdr;
 
@@ -477,6 +605,7 @@
     }
 #else /* LWIP_IPV6_MLD */
     else if (ip6_addr_issolicitednode(ip6_current_dest_addr())) {
+      u8_t i;
       /* Filter solicited node packets when MLD is not enabled
        * (for Neighbor discovery). */
       netif = NULL;
@@ -496,46 +625,44 @@
     }
   } else {
     /* start trying with inp. if that's not acceptable, start walking the
-       list of configured netifs.
-       'first' is used as a boolean to mark whether we started walking the list */
-    int first = 1;
-    netif = inp;
-    do {
-      /* interface is up? */
-      if (netif_is_up(netif)) {
-        /* unicast to this interface address? address configured? */
-        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))) {
-            /* exit outer loop */
-            goto netif_found;
-          }
-        }
+       list of configured netifs. */
+    if (ip6_input_accept(inp)) {
+      netif = inp;
+    } else {
+      netif = NULL;
+#if !IPV6_CUSTOM_SCOPES
+      /* Shortcut: stop looking for other interfaces if either the source or
+        * the destination has a scope constrained to this interface. Custom
+        * scopes may break the 1:1 link/interface mapping, however. */
+      if (ip6_addr_islinklocal(ip6_current_dest_addr()) ||
+          ip6_addr_islinklocal(ip6_current_src_addr())) {
+        goto netif_found;
       }
-      if (first) {
-        if (ip6_addr_islinklocal(ip6_current_dest_addr())
+#endif /* !IPV6_CUSTOM_SCOPES */
 #if !LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF
-            || ip6_addr_isloopback(ip6_current_dest_addr())
+      /* The loopback address is to be considered link-local. Packets to it
+        * should be dropped on other interfaces, as per RFC 4291 Sec. 2.5.3.
+        * Its implied scope means packets *from* the loopback address should
+        * not be accepted on other interfaces, either. These requirements
+        * cannot be implemented in the case that loopback traffic is sent
+        * across a non-loopback interface, however. */
+      if (ip6_addr_isloopback(ip6_current_dest_addr()) ||
+          ip6_addr_isloopback(ip6_current_src_addr())) {
+        goto netif_found;
+      }
 #endif /* !LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF */
-        ) {
-          /* Do not match link-local addresses to other netifs. The loopback
-           * address is to be considered link-local and packets to it should be
-           * dropped on other interfaces, as per RFC 4291 Sec. 2.5.3. This
-           * requirement cannot be implemented in the case that loopback
-           * traffic is sent across a non-loopback interface, however.
-           */
-          netif = NULL;
+#if !LWIP_SINGLE_NETIF
+      NETIF_FOREACH(netif) {
+        if (netif == inp) {
+          /* we checked that before already */
+          continue;
+        }
+        if (ip6_input_accept(netif)) {
           break;
         }
-        first = 0;
-        netif = netif_list;
-      } else {
-        netif = netif->next;
       }
-      if (netif == inp) {
-        netif = netif->next;
-      }
-    } while (netif != NULL);
+#endif /* !LWIP_SINGLE_NETIF */
+    }
 netif_found:
     LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet accepted on interface %c%c\n",
         netif ? netif->name[0] : 'X', netif? netif->name[1] : 'X'));
@@ -571,29 +698,35 @@
   ip_data.current_netif = netif;
 
   /* Save next header type. */
-  nexth = IP6H_NEXTH(ip6hdr);
+  nexth = &IP6H_NEXTH(ip6hdr);
 
   /* Init header length. */
-  hlen = ip_data.current_ip_header_tot_len = IP6_HLEN;
+  hlen = hlen_tot = IP6_HLEN;
 
   /* Move to payload. */
-  pbuf_header(p, -IP6_HLEN);
+  pbuf_remove_header(p, IP6_HLEN);
 
   /* Process known option extension headers, if present. */
-  while (nexth != IP6_NEXTH_NONE)
+  while (*nexth != IP6_NEXTH_NONE)
   {
-    switch (nexth) {
+    switch (*nexth) {
     case IP6_NEXTH_HOPBYHOP:
+    {
+      s32_t opt_offset;
+      struct ip6_hbh_hdr *hbh_hdr;
+      struct ip6_opt_hdr *opt_hdr;
       LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Hop-by-Hop options header\n"));
+
+      /* Get and check the header length, while staying in packet bounds. */
+      hbh_hdr = (struct ip6_hbh_hdr *)p->payload;
+
       /* Get next header type. */
-      nexth = *((u8_t *)p->payload);
+      nexth = &IP6_HBH_NEXTH(hbh_hdr);
 
       /* Get the header length. */
-      hlen = 8 * (1 + *((u8_t *)p->payload + 1));
-      ip_data.current_ip_header_tot_len += hlen;
+      hlen = (u16_t)(8 * (1 + hbh_hdr->_hlen));
 
-      /* Skip over this header. */
-      if (hlen > p->len) {
+      if ((p->len < 8) || (hlen > p->len)) {
         LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
           ("IPv6 options header (hlen %"U16_F") does not fit in first pbuf (len %"U16_F"), IPv6 packet dropped.\n",
               hlen, p->len));
@@ -604,19 +737,85 @@
         goto ip6_input_cleanup;
       }
 
-      pbuf_header(p, -(s16_t)hlen);
+      hlen_tot = (u16_t)(hlen_tot + hlen);
+
+      /* The extended option header starts right after Hop-by-Hop header. */
+      opt_offset = IP6_HBH_HLEN;
+      while (opt_offset < hlen)
+      {
+        s32_t opt_dlen = 0;
+
+        opt_hdr = (struct ip6_opt_hdr *)((u8_t *)hbh_hdr + opt_offset);
+
+        switch (IP6_OPT_TYPE(opt_hdr)) {
+        /* @todo: process IPV6 Hop-by-Hop option data */
+        case IP6_PAD1_OPTION:
+          /* PAD1 option doesn't have length and value field */
+          opt_dlen = -1;
+          break;
+        case IP6_PADN_OPTION:
+          opt_dlen = IP6_OPT_DLEN(opt_hdr);
+          break;
+        case IP6_ROUTER_ALERT_OPTION:
+          opt_dlen = IP6_OPT_DLEN(opt_hdr);
+          break;
+        case IP6_JUMBO_OPTION:
+          opt_dlen = IP6_OPT_DLEN(opt_hdr);
+          break;
+        default:
+          /* Check 2 MSB of Hop-by-Hop header type. */
+          switch (IP6_OPT_TYPE_ACTION(opt_hdr)) {
+          case 1:
+            /* Discard the packet. */
+            LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid Hop-by-Hop option type dropped.\n"));
+            pbuf_free(p);
+            IP6_STATS_INC(ip6.drop);
+            goto ip6_input_cleanup;
+          case 2:
+            /* Send ICMP Parameter Problem */
+            icmp6_param_problem(p, ICMP6_PP_OPTION, opt_hdr);
+            LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid Hop-by-Hop option type dropped.\n"));
+            pbuf_free(p);
+            IP6_STATS_INC(ip6.drop);
+            goto ip6_input_cleanup;
+          case 3:
+            /* Send ICMP Parameter Problem if destination address is not a multicast address */
+            if (!ip6_addr_ismulticast(ip6_current_dest_addr())) {
+              icmp6_param_problem(p, ICMP6_PP_OPTION, opt_hdr);
+            }
+            LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid Hop-by-Hop option type dropped.\n"));
+            pbuf_free(p);
+            IP6_STATS_INC(ip6.drop);
+            goto ip6_input_cleanup;
+          default:
+            /* Skip over this option. */
+            opt_dlen = IP6_OPT_DLEN(opt_hdr);
+            break;
+          }
+          break;
+        }
+
+        /* Adjust the offset to move to the next extended option header */
+        opt_offset = opt_offset + IP6_OPT_HLEN + opt_dlen;
+      }
+      pbuf_remove_header(p, hlen);
       break;
+    }
     case IP6_NEXTH_DESTOPTS:
+    {
+      s32_t opt_offset;
+      struct ip6_dest_hdr *dest_hdr;
+      struct ip6_opt_hdr *opt_hdr;
       LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Destination options header\n"));
+
+      dest_hdr = (struct ip6_dest_hdr *)p->payload;
+
       /* Get next header type. */
-      nexth = *((u8_t *)p->payload);
+      nexth = &IP6_DEST_NEXTH(dest_hdr);
 
       /* Get the header length. */
-      hlen = 8 * (1 + *((u8_t *)p->payload + 1));
-      ip_data.current_ip_header_tot_len += hlen;
-
-      /* Skip over this header. */
-      if (hlen > p->len) {
+      hlen = 8 * (1 + dest_hdr->_hlen);
+      if ((p->len < 8) || (hlen > p->len)) {
         LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
           ("IPv6 options header (hlen %"U16_F") does not fit in first pbuf (len %"U16_F"), IPv6 packet dropped.\n",
               hlen, p->len));
@@ -627,19 +826,90 @@
         goto ip6_input_cleanup;
       }
 
-      pbuf_header(p, -(s16_t)hlen);
+      hlen_tot = (u16_t)(hlen_tot + hlen);
+
+      /* The extended option header starts right after Destination header. */
+      opt_offset = IP6_DEST_HLEN;
+      while (opt_offset < hlen)
+      {
+        s32_t opt_dlen = 0;
+
+        opt_hdr = (struct ip6_opt_hdr *)((u8_t *)dest_hdr + opt_offset);
+
+        switch (IP6_OPT_TYPE(opt_hdr))
+        {
+        /* @todo: process IPV6 Destination option data */
+        case IP6_PAD1_OPTION:
+          /* PAD1 option deosn't have length and value field */
+          opt_dlen = -1;
+          break;
+        case IP6_PADN_OPTION:
+          opt_dlen = IP6_OPT_DLEN(opt_hdr);
+          break;
+        case IP6_ROUTER_ALERT_OPTION:
+          opt_dlen = IP6_OPT_DLEN(opt_hdr);
+          break;
+        case IP6_JUMBO_OPTION:
+          opt_dlen = IP6_OPT_DLEN(opt_hdr);
+          break;
+        case IP6_HOME_ADDRESS_OPTION:
+          opt_dlen = IP6_OPT_DLEN(opt_hdr);
+          break;
+        default:
+          /* Check 2 MSB of Destination header type. */
+          switch (IP6_OPT_TYPE_ACTION(opt_hdr))
+          {
+          case 1:
+            /* Discard the packet. */
+            LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid destination option type dropped.\n"));
+            pbuf_free(p);
+            IP6_STATS_INC(ip6.drop);
+            goto ip6_input_cleanup;
+          case 2:
+            /* Send ICMP Parameter Problem */
+            icmp6_param_problem(p, ICMP6_PP_OPTION, opt_hdr);
+            LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid destination option type dropped.\n"));
+            pbuf_free(p);
+            IP6_STATS_INC(ip6.drop);
+            goto ip6_input_cleanup;
+          case 3:
+            /* Send ICMP Parameter Problem if destination address is not a multicast address */
+            if (!ip6_addr_ismulticast(ip6_current_dest_addr())) {
+              icmp6_param_problem(p, ICMP6_PP_OPTION, opt_hdr);
+            }
+            LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid destination option type dropped.\n"));
+            pbuf_free(p);
+            IP6_STATS_INC(ip6.drop);
+            goto ip6_input_cleanup;
+          default:
+            /* Skip over this option. */
+            opt_dlen = IP6_OPT_DLEN(opt_hdr);
+            break;
+          }
+          break;
+        }
+
+        /* Adjust the offset to move to the next extended option header */
+        opt_offset = opt_offset + IP6_OPT_HLEN + opt_dlen;
+      }
+
+      pbuf_remove_header(p, hlen);
       break;
+    }
     case IP6_NEXTH_ROUTING:
+    {
+      struct ip6_rout_hdr *rout_hdr;
       LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Routing header\n"));
+
+      rout_hdr = (struct ip6_rout_hdr *)p->payload;
+
       /* Get next header type. */
-      nexth = *((u8_t *)p->payload);
+      nexth = &IP6_ROUT_NEXTH(rout_hdr);
 
       /* Get the header length. */
-      hlen = 8 * (1 + *((u8_t *)p->payload + 1));
-      ip_data.current_ip_header_tot_len += hlen;
+      hlen = 8 * (1 + rout_hdr->_hlen);
 
-      /* Skip over this header. */
-      if (hlen > p->len) {
+      if ((p->len < 8) || (hlen > p->len)) {
         LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
           ("IPv6 options header (hlen %"U16_F") does not fit in first pbuf (len %"U16_F"), IPv6 packet dropped.\n",
               hlen, p->len));
@@ -650,9 +920,41 @@
         goto ip6_input_cleanup;
       }
 
-      pbuf_header(p, -(s16_t)hlen);
-      break;
+      /* Skip over this header. */
+      hlen_tot = (u16_t)(hlen_tot + hlen);
 
+      /* if segment left value is 0 in routing header, ignore the option */
+      if (IP6_ROUT_SEG_LEFT(rout_hdr)) {
+        /* The length field of routing option header must be even */
+        if (rout_hdr->_hlen & 0x1) {
+          /* Discard and send parameter field error */
+          icmp6_param_problem(p, ICMP6_PP_FIELD, &rout_hdr->_hlen);
+          LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid routing type dropped\n"));
+          pbuf_free(p);
+          IP6_STATS_INC(ip6.drop);
+          goto ip6_input_cleanup;
+        }
+
+        switch (IP6_ROUT_TYPE(rout_hdr))
+        {
+        /* TODO: process routing by the type */
+        case IP6_ROUT_TYPE2:
+          break;
+        case IP6_ROUT_RPL:
+          break;
+        default:
+          /* Discard unrecognized routing type and send parameter field error */
+          icmp6_param_problem(p, ICMP6_PP_FIELD, &IP6_ROUT_TYPE(rout_hdr));
+          LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid routing type dropped\n"));
+          pbuf_free(p);
+          IP6_STATS_INC(ip6.drop);
+          goto ip6_input_cleanup;
+        }
+      }
+
+      pbuf_remove_header(p, hlen);
+      break;
+    }
     case IP6_NEXTH_FRAGMENT:
     {
       struct ip6_frag_hdr *frag_hdr;
@@ -661,11 +963,10 @@
       frag_hdr = (struct ip6_frag_hdr *)p->payload;
 
       /* Get next header type. */
-      nexth = frag_hdr->_nexth;
+      nexth = &IP6_FRAG_NEXTH(frag_hdr);
 
       /* Fragment Header length. */
       hlen = 8;
-      ip_data.current_ip_header_tot_len += hlen;
 
       /* Make sure this header fits in current pbuf. */
       if (hlen > p->len) {
@@ -679,16 +980,27 @@
         goto ip6_input_cleanup;
       }
 
+      hlen_tot = (u16_t)(hlen_tot + hlen);
+
+      /* check payload length is multiple of 8 octets when mbit is set */
+      if (IP6_FRAG_MBIT(frag_hdr) && (IP6H_PLEN(ip6hdr) & 0x7)) {
+        /* ipv6 payload length is not multiple of 8 octets */
+        icmp6_param_problem(p, ICMP6_PP_FIELD, LWIP_PACKED_CAST(const void *, &ip6hdr->_plen));
+        LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid payload length dropped\n"));
+        pbuf_free(p);
+        IP6_STATS_INC(ip6.drop);
+        goto ip6_input_cleanup;
+      }
+
       /* Offset == 0 and more_fragments == 0? */
       if ((frag_hdr->_fragment_offset &
            PP_HTONS(IP6_FRAG_OFFSET_MASK | IP6_FRAG_MORE_FLAG)) == 0) {
-        /* This is a 1-fragment packet, usually a packet that we have
-         * already reassembled. Skip this header anc continue. */
-        pbuf_header(p, -(s16_t)hlen);
+        /* This is a 1-fragment packet. Skip this header and continue. */
+        pbuf_remove_header(p, hlen);
       } else {
 #if LWIP_IPV6_REASS
-
         /* reassemble the packet */
+        ip_data.current_ip_header_tot_len = hlen_tot;
         p = ip6_reass(p);
         /* packet not fully reassembled yet? */
         if (p == NULL) {
@@ -698,9 +1010,9 @@
         /* Returned p point to IPv6 header.
          * Update all our variables and pointers and continue. */
         ip6hdr = (struct ip6_hdr *)p->payload;
-        nexth = IP6H_NEXTH(ip6hdr);
-        hlen = ip_data.current_ip_header_tot_len = IP6_HLEN;
-        pbuf_header(p, -IP6_HLEN);
+        nexth = &IP6H_NEXTH(ip6hdr);
+        hlen = hlen_tot = IP6_HLEN;
+        pbuf_remove_header(p, IP6_HLEN);
 
 #else /* LWIP_IPV6_REASS */
         /* free (drop) packet pbufs */
@@ -715,25 +1027,40 @@
     }
     default:
       goto options_done;
-      break;
+    }
+
+    if (*nexth == IP6_NEXTH_HOPBYHOP) {
+      /* Hop-by-Hop header comes only as a first option */
+      icmp6_param_problem(p, ICMP6_PP_HEADER, nexth);
+      LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Hop-by-Hop options header dropped (only valid as a first option)\n"));
+      pbuf_free(p);
+      IP6_STATS_INC(ip6.drop);
+      goto ip6_input_cleanup;
     }
   }
-options_done:
 
-  /* p points to IPv6 header again. */
-  pbuf_header_force(p, (s16_t)ip_data.current_ip_header_tot_len);
+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);
   /* raw input did not eat the packet? */
-  if (raw_input(p, inp) == 0)
-#endif /* LWIP_RAW */
+  raw_status = raw_input(p, inp);
+  if (raw_status != RAW_INPUT_EATEN)
   {
-    switch (nexth) {
+    /* Point to payload. */
+    pbuf_remove_header(p, hlen_tot);
+#else /* LWIP_RAW */
+  {
+#endif /* LWIP_RAW */
+    switch (*nexth) {
     case IP6_NEXTH_NONE:
       pbuf_free(p);
       break;
@@ -742,37 +1069,40 @@
 #if LWIP_UDPLITE
     case IP6_NEXTH_UDPLITE:
 #endif /* LWIP_UDPLITE */
-      /* Point to payload. */
-      pbuf_header(p, -(s16_t)ip_data.current_ip_header_tot_len);
       udp_input(p, inp);
       break;
 #endif /* LWIP_UDP */
 #if LWIP_TCP
     case IP6_NEXTH_TCP:
-      /* Point to payload. */
-      pbuf_header(p, -(s16_t)ip_data.current_ip_header_tot_len);
       tcp_input(p, inp);
       break;
 #endif /* LWIP_TCP */
 #if LWIP_ICMP6
     case IP6_NEXTH_ICMP6:
-      /* Point to payload. */
-      pbuf_header(p, -(s16_t)ip_data.current_ip_header_tot_len);
       icmp6_input(p, inp);
       break;
 #endif /* LWIP_ICMP */
     default:
+#if LWIP_RAW
+        if (raw_status == RAW_INPUT_DELIVERED) {
+          /* @todo: ipv6 mib in-delivers? */
+        } else
+#endif /* LWIP_RAW */
+        {
 #if LWIP_ICMP6
-      /* send ICMP parameter problem unless it was a multicast or ICMPv6 */
-      if ((!ip6_addr_ismulticast(ip6_current_dest_addr())) &&
-          (IP6H_NEXTH(ip6hdr) != IP6_NEXTH_ICMP6)) {
-        icmp6_param_problem(p, ICMP6_PP_HEADER, ip_data.current_ip_header_tot_len - hlen);
-      }
+        /* p points to IPv6 header again for raw_input. */
+        pbuf_add_header_force(p, hlen_tot);
+        /* send ICMP parameter problem unless it was a multicast or ICMPv6 */
+        if ((!ip6_addr_ismulticast(ip6_current_dest_addr())) &&
+            (IP6H_NEXTH(ip6hdr) != IP6_NEXTH_ICMP6)) {
+          icmp6_param_problem(p, ICMP6_PP_HEADER, nexth);
+        }
 #endif /* LWIP_ICMP */
-      LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip6_input: Unsupported transport protocol %"U16_F"\n", (u16_t)IP6H_NEXTH(ip6hdr)));
+        LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip6_input: Unsupported transport protocol %"U16_F"\n", (u16_t)IP6H_NEXTH(ip6hdr)));
+        IP6_STATS_INC(ip6.proterr);
+        IP6_STATS_INC(ip6.drop);
+      }
       pbuf_free(p);
-      IP6_STATS_INC(ip6.proterr);
-      IP6_STATS_INC(ip6.drop);
       break;
     }
   }
@@ -803,15 +1133,17 @@
             IPv6 header and p->payload points to that IPv6 header)
  * @param src the source IPv6 address to send from (if src == IP6_ADDR_ANY, an
  *         IP address of the netif is selected and used as source address.
- *         if src == NULL, IP6_ADDR_ANY is used as source)
- * @param dest the destination IPv6 address to send the packet to
+ *         if src == NULL, IP6_ADDR_ANY is used as source) (src is possibly not
+ *         properly zoned)
+ * @param dest the destination IPv6 address to send the packet to (possibly not
+ *             properly zoned)
  * @param hl the Hop Limit value to be set in the IPv6 header
  * @param tc the Traffic Class value to be set in the IPv6 header
  * @param nexth the Next Header to be set in the IPv6 header
  * @param netif the netif on which to send this packet
  * @return ERR_OK if the packet was sent OK
  *         ERR_BUF if p doesn't have enough space for IPv6/LINK headers
- *         returns errors returned by netif->output
+ *         returns errors returned by netif->output_ip6
  */
 err_t
 ip6_output_if(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest,
@@ -845,12 +1177,27 @@
   struct ip6_hdr *ip6hdr;
   ip6_addr_t dest_addr;
 
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);
 
   /* Should the IPv6 header be generated or is it already included in p? */
   if (dest != LWIP_IP_HDRINCL) {
+#if LWIP_IPV6_SCOPES
+    /* If the destination address is scoped but lacks a zone, add a zone now,
+     * based on the outgoing interface. The lower layers (e.g., nd6) absolutely
+     * require addresses to be properly zoned for correctness. In some cases,
+     * earlier attempts will have been made to add a zone to the destination,
+     * but this function is the only one that is called in all (other) cases,
+     * so we must do this here. */
+    if (ip6_addr_lacks_zone(dest, IP6_UNKNOWN)) {
+      ip6_addr_copy(dest_addr, *dest);
+      ip6_addr_assign_zone(&dest_addr, IP6_UNKNOWN, netif);
+      dest = &dest_addr;
+    }
+#endif /* LWIP_IPV6_SCOPES */
+
     /* generate IPv6 header */
-    if (pbuf_header(p, IP6_HLEN)) {
+    if (pbuf_add_header(p, IP6_HLEN)) {
       LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip6_output: not enough room for IPv6 header in pbuf\n"));
       IP6_STATS_INC(ip6.err);
       return ERR_BUF;
@@ -864,21 +1211,22 @@
     IP6H_NEXTH_SET(ip6hdr, nexth);
 
     /* dest cannot be NULL here */
-    ip6_addr_copy(ip6hdr->dest, *dest);
+    ip6_addr_copy_to_packed(ip6hdr->dest, *dest);
 
     IP6H_VTCFL_SET(ip6hdr, 6, tc, 0);
-    IP6H_PLEN_SET(ip6hdr, p->tot_len - IP6_HLEN);
+    IP6H_PLEN_SET(ip6hdr, (u16_t)(p->tot_len - IP6_HLEN));
 
     if (src == NULL) {
       src = IP6_ADDR_ANY6;
     }
     /* src cannot be NULL here */
-    ip6_addr_copy(ip6hdr->src, *src);
+    ip6_addr_copy_to_packed(ip6hdr->src, *src);
 
   } else {
     /* IP header already included in p */
     ip6hdr = (struct ip6_hdr *)p->payload;
-    ip6_addr_copy(dest_addr, ip6hdr->dest);
+    ip6_addr_copy_from_packed(dest_addr, ip6hdr->dest);
+    ip6_addr_assign_zone(&dest_addr, IP6_UNKNOWN, netif);
     dest = &dest_addr;
   }
 
@@ -904,10 +1252,15 @@
       }
     }
   }
+#if LWIP_MULTICAST_TX_OPTIONS
+  if ((p->flags & PBUF_FLAG_MCASTLOOP) != 0) {
+    netif_loop_output(netif, p);
+  }
+#endif /* LWIP_MULTICAST_TX_OPTIONS */
 #endif /* ENABLE_LOOPBACK */
 #if LWIP_IPV6_FRAG
   /* don't fragment if interface has mtu set to 0 [loopif] */
-  if (netif->mtu && (p->tot_len > nd6_get_destination_mtu(dest, netif))) {
+  if (netif_mtu6(netif) && (p->tot_len > nd6_get_destination_mtu(dest, netif))) {
     return ip6_frag(p, netif, dest);
   }
 #endif /* LWIP_IPV6_FRAG */
@@ -949,8 +1302,8 @@
   } else {
     /* IP header included in p, read addresses. */
     ip6hdr = (struct ip6_hdr *)p->payload;
-    ip6_addr_copy(src_addr, ip6hdr->src);
-    ip6_addr_copy(dest_addr, ip6hdr->dest);
+    ip6_addr_copy_from_packed(src_addr, ip6hdr->src);
+    ip6_addr_copy_from_packed(dest_addr, ip6hdr->dest);
     netif = ip6_route(&src_addr, &dest_addr);
   }
 
@@ -972,7 +1325,7 @@
 }
 
 
-#if LWIP_NETIF_HWADDRHINT
+#if LWIP_NETIF_USE_HINTS
 /** Like ip6_output, but takes and addr_hint pointer that is passed on to netif->addr_hint
  *  before calling ip6_output_if.
  *
@@ -986,7 +1339,7 @@
  * @param hl the Hop Limit value to be set in the IPv6 header
  * @param tc the Traffic Class value to be set in the IPv6 header
  * @param nexth the Next Header to be set in the IPv6 header
- * @param addr_hint address hint pointer set to netif->addr_hint before
+ * @param netif_hint netif output hint pointer set to netif->hint before
  *        calling ip_output_if()
  *
  * @return ERR_RTE if no route is found
@@ -994,7 +1347,7 @@
  */
 err_t
 ip6_output_hinted(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest,
-          u8_t hl, u8_t tc, u8_t nexth, u8_t *addr_hint)
+          u8_t hl, u8_t tc, u8_t nexth, struct netif_hint *netif_hint)
 {
   struct netif *netif;
   struct ip6_hdr *ip6hdr;
@@ -1008,8 +1361,8 @@
   } else {
     /* IP header included in p, read addresses. */
     ip6hdr = (struct ip6_hdr *)p->payload;
-    ip6_addr_copy(src_addr, ip6hdr->src);
-    ip6_addr_copy(dest_addr, ip6hdr->dest);
+    ip6_addr_copy_from_packed(src_addr, ip6hdr->src);
+    ip6_addr_copy_from_packed(dest_addr, ip6hdr->dest);
     netif = ip6_route(&src_addr, &dest_addr);
   }
 
@@ -1027,13 +1380,13 @@
     return ERR_RTE;
   }
 
-  NETIF_SET_HWADDRHINT(netif, addr_hint);
+  NETIF_SET_HINTS(netif, netif_hint);
   err = ip6_output_if(p, src, dest, hl, tc, nexth, netif);
-  NETIF_SET_HWADDRHINT(netif, NULL);
+  NETIF_RESET_HINTS(netif);
 
   return err;
 }
-#endif /* LWIP_NETIF_HWADDRHINT*/
+#endif /* LWIP_NETIF_USE_HINTS*/
 
 #if LWIP_IPV6_MLD
 /**
@@ -1049,25 +1402,42 @@
 err_t
 ip6_options_add_hbh_ra(struct pbuf *p, u8_t nexth, u8_t value)
 {
+  u8_t *opt_data;
+  u32_t offset = 0;
   struct ip6_hbh_hdr *hbh_hdr;
+  struct ip6_opt_hdr *opt_hdr;
 
+  /* fixed 4 bytes for router alert option and 2 bytes padding */
+  const u8_t hlen = (sizeof(struct ip6_opt_hdr) * 2) + IP6_ROUTER_ALERT_DLEN;
   /* Move pointer to make room for hop-by-hop options header. */
-  if (pbuf_header(p, sizeof(struct ip6_hbh_hdr))) {
+  if (pbuf_add_header(p, sizeof(struct ip6_hbh_hdr) + hlen)) {
     LWIP_DEBUGF(IP6_DEBUG, ("ip6_options: no space for options header\n"));
     IP6_STATS_INC(ip6.err);
     return ERR_BUF;
   }
 
+  /* Set fields of Hop-by-Hop header */
   hbh_hdr = (struct ip6_hbh_hdr *)p->payload;
-
-  /* Set fields. */
-  hbh_hdr->_nexth = nexth;
+  IP6_HBH_NEXTH(hbh_hdr) = nexth;
   hbh_hdr->_hlen = 0;
-  hbh_hdr->_ra_opt_type = IP6_ROUTER_ALERT_OPTION;
-  hbh_hdr->_ra_opt_dlen = 2;
-  hbh_hdr->_ra_opt_data = value;
-  hbh_hdr->_padn_opt_type = IP6_PADN_ALERT_OPTION;
-  hbh_hdr->_padn_opt_dlen = 0;
+  offset = IP6_HBH_HLEN;
+
+  /* Set router alert options to Hop-by-Hop extended option header */
+  opt_hdr = (struct ip6_opt_hdr *)((u8_t *)hbh_hdr + offset);
+  IP6_OPT_TYPE(opt_hdr) = IP6_ROUTER_ALERT_OPTION;
+  IP6_OPT_DLEN(opt_hdr) = IP6_ROUTER_ALERT_DLEN;
+  offset += IP6_OPT_HLEN;
+
+  /* Set router alert option data */
+  opt_data = (u8_t *)hbh_hdr + offset;
+  opt_data[0] = value;
+  opt_data[1] = 0;
+  offset += IP6_OPT_DLEN(opt_hdr);
+
+  /* add 2 bytes padding to make 8 bytes Hop-by-Hop header length */
+  opt_hdr = (struct ip6_opt_hdr *)((u8_t *)hbh_hdr + offset);
+  IP6_OPT_TYPE(opt_hdr) = IP6_PADN_OPTION;
+  IP6_OPT_DLEN(opt_hdr) = 0;
 
   return ERR_OK;
 }
diff --git a/src/core/ipv6/ip6_addr.c b/src/core/ipv6/ip6_addr.c
index aa06659..687c02f 100644
--- a/src/core/ipv6/ip6_addr.c
+++ b/src/core/ipv6/ip6_addr.c
@@ -47,18 +47,16 @@
 #include "lwip/ip_addr.h"
 #include "lwip/def.h"
 
+#include <string.h>
+
+#if LWIP_IPV4
+#include "lwip/ip4_addr.h" /* for ip6addr_aton to handle IPv4-mapped addresses */
+#endif /* LWIP_IPV4 */
+
 /* used by IP6_ADDR_ANY(6) in ip6_addr.h */
 const ip_addr_t ip6_addr_any = IPADDR6_INIT(0ul, 0ul, 0ul, 0ul);
 
-#ifndef isprint
-#define in_range(c, lo, up)  ((u8_t)c >= lo && (u8_t)c <= up)
-#define isprint(c)           in_range(c, 0x20, 0x7f)
-#define isdigit(c)           in_range(c, '0', '9')
-#define isxdigit(c)          (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F'))
-#define islower(c)           in_range(c, 'a', 'z')
-#define isspace(c)           (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v')
-#define xchar(i)             ((i) < 10 ? '0' + (i) : 'A' + (i) - 10)
-#endif
+#define lwip_xchar(i)        ((char)((i) < 10 ? '0' + (i) : 'A' + (i) - 10))
 
 /**
  * Check whether "cp" is a valid ascii representation
@@ -74,6 +72,9 @@
 {
   u32_t addr_index, zero_blocks, current_block_index, current_block_value;
   const char *s;
+#if LWIP_IPV4
+  int check_ipv4_mapped = 0;
+#endif /* LWIP_IPV4 */
 
   /* Count the number of colons, to count the number of blocks in a "::" sequence
      zero_blocks may be 1 even if there are no :: sequences */
@@ -81,7 +82,19 @@
   for (s = cp; *s != 0; s++) {
     if (*s == ':') {
       zero_blocks--;
-    } else if (!isxdigit(*s)) {
+#if LWIP_IPV4
+    } else if (*s == '.') {
+      if ((zero_blocks == 5) ||(zero_blocks == 2)) {
+        check_ipv4_mapped = 1;
+        /* last block could be the start of an IPv4 address */
+        zero_blocks--;
+      } else {
+        /* invalid format */
+        return 0;
+      }
+      break;
+#endif /* LWIP_IPV4 */
+    } else if (!lwip_isxdigit(*s)) {
       break;
     }
   }
@@ -101,6 +114,22 @@
         }
       }
       current_block_index++;
+#if LWIP_IPV4
+      if (check_ipv4_mapped) {
+        if (current_block_index == 6) {
+          ip4_addr_t ip4;
+          int ret = ip4addr_aton(s + 1, &ip4);
+          if (ret) {
+            if (addr) {
+              addr->addr[3] = lwip_htonl(ip4.addr);
+              current_block_index++;
+              goto fix_byte_order_and_return;
+            }
+            return 1;
+          }
+        }
+      }
+#endif /* LWIP_IPV4 */
       current_block_value = 0;
       if (current_block_index > 7) {
         /* address too long! */
@@ -129,11 +158,11 @@
           }
         }
       }
-    } else if (isxdigit(*s)) {
+    } else if (lwip_isxdigit(*s)) {
       /* add current digit */
       current_block_value = (current_block_value << 4) +
-          (isdigit(*s) ? (u32_t)(*s - '0') :
-          (u32_t)(10 + (islower(*s) ? *s - 'a' : *s - 'A')));
+          (lwip_isdigit(*s) ? (u32_t)(*s - '0') :
+          (u32_t)(10 + (lwip_islower(*s) ? *s - 'a' : *s - 'A')));
     } else {
       /* unexpected digit, space? CRLF? */
       break;
@@ -147,13 +176,15 @@
     else {
       addr->addr[addr_index] = current_block_value << 16;
     }
-  }
-
-  /* convert to network byte order. */
-  if (addr) {
+#if LWIP_IPV4
+fix_byte_order_and_return:
+#endif
+    /* convert to network byte order. */
     for (addr_index = 0; addr_index < 4; addr_index++) {
       addr->addr[addr_index] = lwip_htonl(addr->addr[addr_index]);
     }
+
+    ip6_addr_clear_zone(addr);
   }
 
   if (current_block_index != 7) {
@@ -194,6 +225,26 @@
   s32_t i;
   u8_t zero_flag, empty_block_flag;
 
+#if LWIP_IPV4
+  if (ip6_addr_isipv4mappedipv6(addr)) {
+    /* This is an IPv4 mapped address */
+    ip4_addr_t addr4;
+    char *ret;
+#define IP4MAPPED_HEADER "::FFFF:"
+    char *buf_ip4 = buf + sizeof(IP4MAPPED_HEADER) - 1;
+    int buflen_ip4 = buflen - sizeof(IP4MAPPED_HEADER) + 1;
+    if (buflen < (int)sizeof(IP4MAPPED_HEADER)) {
+      return NULL;
+    }
+    memcpy(buf, IP4MAPPED_HEADER, sizeof(IP4MAPPED_HEADER));
+    addr4.addr = addr->addr[3];
+    ret = ip4addr_ntoa_r(&addr4, buf_ip4, buflen_ip4);
+    if (ret != buf_ip4) {
+      return NULL;
+    }
+    return buf;
+  }
+#endif /* LWIP_IPV4 */
   i = 0;
   empty_block_flag = 0; /* used to indicate a zero chain for "::' */
 
@@ -250,7 +301,7 @@
     if ((current_block_value & 0xf000) == 0) {
       zero_flag = 1;
     } else {
-      buf[i++] = xchar(((current_block_value & 0xf000) >> 12));
+      buf[i++] = lwip_xchar(((current_block_value & 0xf000) >> 12));
       zero_flag = 0;
       if (i >= buflen) {
         return NULL;
@@ -260,7 +311,7 @@
     if (((current_block_value & 0xf00) == 0) && (zero_flag)) {
       /* do nothing */
     } else {
-      buf[i++] = xchar(((current_block_value & 0xf00) >> 8));
+      buf[i++] = lwip_xchar(((current_block_value & 0xf00) >> 8));
       zero_flag = 0;
       if (i >= buflen) {
         return NULL;
@@ -271,14 +322,14 @@
       /* do nothing */
     }
     else {
-      buf[i++] = xchar(((current_block_value & 0xf0) >> 4));
+      buf[i++] = lwip_xchar(((current_block_value & 0xf0) >> 4));
       zero_flag = 0;
       if (i >= buflen) {
         return NULL;
       }
     }
 
-    buf[i++] = xchar((current_block_value & 0xf));
+    buf[i++] = lwip_xchar((current_block_value & 0xf));
     if (i >= buflen) {
       return NULL;
     }
diff --git a/src/core/ipv6/ip6_frag.c b/src/core/ipv6/ip6_frag.c
index ff07f71..d6c5d22 100644
--- a/src/core/ipv6/ip6_frag.c
+++ b/src/core/ipv6/ip6_frag.c
@@ -71,6 +71,8 @@
 #endif /* IP_REASS_FREE_OLDEST */
 
 #if IPV6_FRAG_COPYHEADER
+/* The number of bytes we need to "borrow" from (i.e., overwrite in) the header
+ * that precedes the fragment header for reassembly pruposes. */
 #define IPV6_FRAG_REQROOM ((s16_t)(sizeof(struct ip6_reass_helper) - IP6_FRAG_HLEN))
 #endif
 
@@ -158,17 +160,28 @@
     /* First, de-queue the first pbuf from r->p. */
     p = ipr->p;
     ipr->p = iprh->next_pbuf;
+    /* Restore the part that we've overwritten with our helper structure, or we
+     * might send garbage (and disclose a pointer) in the ICMPv6 reply. */
+    MEMCPY(p->payload, ipr->orig_hdr, sizeof(iprh));
     /* 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*)IPV6_FRAG_HDRREF(ipr->iphdr)))) {
+    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);
     }
     else {
-      icmp6_time_exceeded(p, ICMP6_TE_FRAG);
+      /* Reconstruct the zoned source and destination addresses, so that we do
+       * not end up sending the ICMP response over the wrong link. */
+      ip6_addr_t src_addr, dest_addr;
+      ip6_addr_copy_from_packed(src_addr, IPV6_FRAG_SRC(ipr));
+      ip6_addr_set_zone(&src_addr, ipr->src_zone);
+      ip6_addr_copy_from_packed(dest_addr, IPV6_FRAG_DEST(ipr));
+      ip6_addr_set_zone(&dest_addr, ipr->dest_zone);
+      /* Send the actual ICMP response. */
+      icmp6_time_exceeded_with_addrs(p, ICMP6_TE_FRAG, &src_addr, &dest_addr);
     }
     clen = pbuf_clen(p);
     LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff);
-    pbufs_freed += clen;
+    pbufs_freed = (u16_t)(pbufs_freed + clen);
     pbuf_free(p);
   }
 #endif /* LWIP_ICMP6 */
@@ -184,7 +197,7 @@
     p = iprh->next_pbuf;
     clen = pbuf_clen(pcur);
     LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff);
-    pbufs_freed += clen;
+    pbufs_freed = (u16_t)(pbufs_freed + clen);
     pbuf_free(pcur);
   }
 
@@ -207,7 +220,7 @@
 
   /* Finally, update number of pbufs in reassembly queue */
   LWIP_ASSERT("ip_reass_pbufcount >= clen", ip6_reass_pbufcount >= pbufs_freed);
-  ip6_reass_pbufcount -= pbufs_freed;
+  ip6_reass_pbufcount = (u16_t)(ip6_reass_pbufcount - pbufs_freed);
 }
 
 #if IP_REASS_FREE_OLDEST
@@ -261,19 +274,17 @@
   struct ip6_reassdata *ipr, *ipr_prev;
   struct ip6_reass_helper *iprh, *iprh_tmp, *iprh_prev=NULL;
   struct ip6_frag_hdr *frag_hdr;
-  u16_t offset, len;
+  u16_t offset, len, start, end;
+  ptrdiff_t hdrdiff;
   u16_t clen;
   u8_t valid = 1;
-  struct pbuf *q;
+  struct pbuf *q, *next_pbuf;
 
   IP6_FRAG_STATS_INC(ip6_frag.recv);
 
-  if ((const void*)ip6_current_header() != ((u8_t*)p->payload) - IP6_HLEN) {
-    /* ip6_frag_hdr must be in the first pbuf, not chained */
-    IP6_FRAG_STATS_INC(ip6_frag.proterr);
-    IP6_FRAG_STATS_INC(ip6_frag.drop);
-    goto nullreturn;
-  }
+  /* ip6_frag_hdr must be in the first pbuf, not chained. Checked by caller. */
+  LWIP_ASSERT("IPv6 fragment header does not fit in first pbuf",
+    p->len >= sizeof(struct ip6_frag_hdr));
 
   frag_hdr = (struct ip6_frag_hdr *) p->payload;
 
@@ -285,8 +296,22 @@
    * Adjust for headers before Fragment Header.
    * And finally adjust by Fragment Header length. */
   len = lwip_ntohs(ip6_current_header()->_plen);
-  len -= (u16_t)(((u8_t*)p->payload - (const u8_t*)ip6_current_header()) - IP6_HLEN);
-  len -= IP6_FRAG_HLEN;
+  hdrdiff = (u8_t*)p->payload - (const u8_t*)ip6_current_header();
+  LWIP_ASSERT("not a valid pbuf (ip6_input check missing?)", hdrdiff <= 0xFFFF);
+  LWIP_ASSERT("not a valid pbuf (ip6_input check missing?)", hdrdiff >= IP6_HLEN);
+  hdrdiff -= IP6_HLEN;
+  hdrdiff += IP6_FRAG_HLEN;
+  if (hdrdiff > len) {
+    IP6_FRAG_STATS_INC(ip6_frag.proterr);
+    goto nullreturn;
+  }
+  len = (u16_t)(len - hdrdiff);
+  start = (offset & IP6_FRAG_OFFSET_MASK);
+  if (start > (0xFFFF - len)) {
+    /* u16_t overflow, cannot handle this */
+    IP6_FRAG_STATS_INC(ip6_frag.proterr);
+    goto nullreturn;
+  }
 
   /* Look for the datagram the fragment belongs to in the current datagram queue,
    * remembering the previous in the queue for later dequeueing. */
@@ -295,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(ip6_current_src_addr(), &(IPV6_FRAG_HDRREF(ipr->iphdr)->src)) &&
-        ip6_addr_cmp(ip6_current_dest_addr(), &(IPV6_FRAG_HDRREF(ipr->iphdr)->dest))) {
+        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_FRAG_STATS_INC(ip6_frag.cachehit);
       break;
     }
@@ -322,13 +347,12 @@
 #endif /* IP_REASS_FREE_OLDEST */
       {
         IP6_FRAG_STATS_INC(ip6_frag.memerr);
-        IP6_FRAG_STATS_INC(ip6_frag.drop);
         goto nullreturn;
       }
     }
 
     memset(ipr, 0, sizeof(struct ip6_reassdata));
-    ipr->timer = IP_REASS_MAXAGE;
+    ipr->timer = IPV6_REASS_MAXAGE;
 
     /* enqueue the new structure to the front of the list */
     ipr->next = reassdatagrams;
@@ -337,13 +361,22 @@
     /* Use the current IPv6 header for src/dest address reference.
      * Eventually, we will replace it when we get the first fragment
      * (it might be this one, in any case, it is done later). */
-#if IPV6_FRAG_COPYHEADER
-    MEMCPY(&ipr->iphdr, ip6_current_header(), IP6_HLEN);
-#else /* IPV6_FRAG_COPYHEADER */
     /* need to use the none-const pointer here: */
     ipr->iphdr = ip_data.current_ip6_header;
+#if IPV6_FRAG_COPYHEADER
+    MEMCPY(&ipr->src, &ip6_current_header()->src, sizeof(ipr->src));
+    MEMCPY(&ipr->dest, &ip6_current_header()->dest, sizeof(ipr->dest));
 #endif /* IPV6_FRAG_COPYHEADER */
-
+#if LWIP_IPV6_SCOPES
+    /* Also store the address zone information.
+     * @todo It is possible that due to netif destruction and recreation, the
+     * stored zones end up resolving to a different interface. In that case, we
+     * risk sending a "time exceeded" ICMP response over the wrong link.
+     * Ideally, netif destruction would clean up matching pending reassembly
+     * structures, but custom zone mappings would make that non-trivial. */
+    ipr->src_zone = ip6_addr_zone(ip6_current_src_addr());
+    ipr->dest_zone = ip6_addr_zone(ip6_current_dest_addr());
+#endif /* LWIP_IPV6_SCOPES */
     /* copy the fragmented packet id. */
     ipr->identification = frag_hdr->_identification;
 
@@ -368,7 +401,6 @@
       /* @todo: send ICMPv6 time exceeded here? */
       /* drop this pbuf */
       IP6_FRAG_STATS_INC(ip6_frag.memerr);
-      IP6_FRAG_STATS_INC(ip6_frag.drop);
       goto nullreturn;
     }
   }
@@ -386,35 +418,37 @@
   LWIP_ASSERT("sizeof(struct ip6_reass_helper) <= IP6_FRAG_HLEN, set IPV6_FRAG_COPYHEADER to 1",
     sizeof(struct ip6_reass_helper) <= IP6_FRAG_HLEN);
 #endif /* IPV6_FRAG_COPYHEADER */
+
+  /* Prepare the pointer to the helper structure, and its initial values.
+   * Do not yet write to the structure itself, as we still have to make a
+   * backup of the original data, and we should not do that until we know for
+   * sure that we are going to add this packet to the list. */
   iprh = (struct ip6_reass_helper *)p->payload;
-  iprh->next_pbuf = NULL;
-  iprh->start = (offset & IP6_FRAG_OFFSET_MASK);
-  iprh->end = (offset & IP6_FRAG_OFFSET_MASK) + len;
+  next_pbuf = NULL;
+  end = (u16_t)(start + len);
 
   /* find the right place to insert this pbuf */
   /* Iterate through until we either get to the end of the list (append),
    * or we find on with a larger offset (insert). */
   for (q = ipr->p; q != NULL;) {
     iprh_tmp = (struct ip6_reass_helper*)q->payload;
-    if (iprh->start < iprh_tmp->start) {
+    if (start < iprh_tmp->start) {
 #if IP_REASS_CHECK_OVERLAP
-      if (iprh->end > iprh_tmp->start) {
+      if (end > iprh_tmp->start) {
         /* fragment overlaps with following, throw away */
         IP6_FRAG_STATS_INC(ip6_frag.proterr);
-        IP6_FRAG_STATS_INC(ip6_frag.drop);
         goto nullreturn;
       }
       if (iprh_prev != NULL) {
-        if (iprh->start < iprh_prev->end) {
+        if (start < iprh_prev->end) {
           /* fragment overlaps with previous, throw away */
           IP6_FRAG_STATS_INC(ip6_frag.proterr);
-          IP6_FRAG_STATS_INC(ip6_frag.drop);
           goto nullreturn;
         }
       }
 #endif /* IP_REASS_CHECK_OVERLAP */
       /* the new pbuf should be inserted before this */
-      iprh->next_pbuf = q;
+      next_pbuf = q;
       if (iprh_prev != NULL) {
         /* not the fragment with the lowest offset */
         iprh_prev->next_pbuf = p;
@@ -423,15 +457,13 @@
         ipr->p = p;
       }
       break;
-    } else if (iprh->start == iprh_tmp->start) {
+    } else if (start == iprh_tmp->start) {
       /* received the same datagram twice: no need to keep the datagram */
-      IP6_FRAG_STATS_INC(ip6_frag.drop);
       goto nullreturn;
 #if IP_REASS_CHECK_OVERLAP
-    } else if (iprh->start < iprh_tmp->end) {
+    } else if (start < iprh_tmp->end) {
       /* overlap: no need to keep the new datagram */
       IP6_FRAG_STATS_INC(ip6_frag.proterr);
-      IP6_FRAG_STATS_INC(ip6_frag.drop);
       goto nullreturn;
 #endif /* IP_REASS_CHECK_OVERLAP */
     } else {
@@ -454,10 +486,10 @@
       /* this is (for now), the fragment with the highest offset:
        * chain it to the last fragment */
 #if IP_REASS_CHECK_OVERLAP
-      LWIP_ASSERT("check fragments don't overlap", iprh_prev->end <= iprh->start);
+      LWIP_ASSERT("check fragments don't overlap", iprh_prev->end <= start);
 #endif /* IP_REASS_CHECK_OVERLAP */
       iprh_prev->next_pbuf = p;
-      if (iprh_prev->end != iprh->start) {
+      if (iprh_prev->end != start) {
         valid = 0;
       }
     } else {
@@ -472,19 +504,23 @@
 
   /* Track the current number of pbufs current 'in-flight', in order to limit
   the number of fragments that may be enqueued at any one time */
-  ip6_reass_pbufcount += clen;
+  ip6_reass_pbufcount = (u16_t)(ip6_reass_pbufcount + clen);
 
   /* Remember IPv6 header if this is the first fragment. */
-  if (iprh->start == 0) {
-#if IPV6_FRAG_COPYHEADER
-    if (iprh->next_pbuf != NULL) {
-      MEMCPY(&ipr->iphdr, ip6_current_header(), IP6_HLEN);
-    }
-#else /* IPV6_FRAG_COPYHEADER */
+  if (start == 0) {
     /* need to use the none-const pointer here: */
     ipr->iphdr = ip_data.current_ip6_header;
-#endif /* IPV6_FRAG_COPYHEADER */
+    /* Make a backup of the part of the packet data that we are about to
+     * overwrite, so that we can restore the original later. */
+    MEMCPY(ipr->orig_hdr, p->payload, sizeof(*iprh));
+    /* For IPV6_FRAG_COPYHEADER there is no need to copy src/dst again, as they
+     * will be the same as they were. With LWIP_IPV6_SCOPES, the same applies
+     * to the source/destination zones. */
   }
+  /* Only after the backup do we get to fill in the actual helper structure. */
+  iprh->next_pbuf = next_pbuf;
+  iprh->start = start;
+  iprh->end = end;
 
   /* If this is the last fragment, calculate total packet length. */
   if ((offset & IP6_FRAG_MORE_FLAG) == 0) {
@@ -520,17 +556,17 @@
     /* chain together the pbufs contained within the ip6_reassdata list. */
     iprh = (struct ip6_reass_helper*) ipr->p->payload;
     while (iprh != NULL) {
-      struct pbuf* next_pbuf = iprh->next_pbuf;
+      next_pbuf = iprh->next_pbuf;
       if (next_pbuf != NULL) {
         /* Save next helper struct (will be hidden in next step). */
         iprh_tmp = (struct ip6_reass_helper*)next_pbuf->payload;
 
         /* hide the fragment header for every succeeding fragment */
-        pbuf_header(next_pbuf, -IP6_FRAG_HLEN);
+        pbuf_remove_header(next_pbuf, IP6_FRAG_HLEN);
 #if IPV6_FRAG_COPYHEADER
         if (IPV6_FRAG_REQROOM > 0) {
           /* hide the extra bytes borrowed from ip6_hdr for struct ip6_reass_helper */
-          u8_t hdrerr = pbuf_header(next_pbuf, -(s16_t)(IPV6_FRAG_REQROOM));
+          u8_t hdrerr = pbuf_remove_header(next_pbuf, IPV6_FRAG_REQROOM);
           LWIP_UNUSED_ARG(hdrerr); /* in case of LWIP_NOASSERT */
           LWIP_ASSERT("no room for struct ip6_reass_helper", hdrerr == 0);
         }
@@ -544,39 +580,61 @@
       iprh = iprh_tmp;
     }
 
+    /* Get the first pbuf. */
+    p = ipr->p;
+
 #if IPV6_FRAG_COPYHEADER
     if (IPV6_FRAG_REQROOM > 0) {
+      u8_t hdrerr;
+      /* Restore (only) the bytes that we overwrote beyond the fragment header.
+       * Those bytes may belong to either the IPv6 header or an extension
+       * header placed before the fragment header. */
+      MEMCPY(p->payload, ipr->orig_hdr, IPV6_FRAG_REQROOM);
       /* get back room for struct ip6_reass_helper (only required if sizeof(void*) > 4) */
-      u8_t hdrerr = pbuf_header(ipr->p, -(s16_t)(IPV6_FRAG_REQROOM));
+      hdrerr = pbuf_remove_header(p, IPV6_FRAG_REQROOM);
       LWIP_UNUSED_ARG(hdrerr); /* in case of LWIP_NOASSERT */
       LWIP_ASSERT("no room for struct ip6_reass_helper", hdrerr == 0);
     }
-    iphdr_ptr = (struct ip6_hdr*)((u8_t*)ipr->p->payload - IP6_HLEN);
-    MEMCPY(iphdr_ptr, &ipr->iphdr, IP6_HLEN);
-#else
-    iphdr_ptr = ipr->iphdr;
 #endif
 
+    /* We need to get rid of the fragment header itself, which is somewhere in
+     * the middle of the packet (but still in the first pbuf of the chain).
+     * Getting rid of the header is required by RFC 2460 Sec. 4.5 and necessary
+     * in order to be able to reassemble packets that are close to full size
+     * (i.e., around 65535 bytes). We simply move up all the headers before the
+     * fragment header, including the IPv6 header, and adjust the payload start
+     * accordingly. This works because all these headers are in the first pbuf
+     * of the chain, and because the caller adjusts all its pointers on
+     * successful reassembly. */
+    MEMMOVE((u8_t*)ipr->iphdr + sizeof(struct ip6_frag_hdr), ipr->iphdr,
+      (size_t)((u8_t*)p->payload - (u8_t*)ipr->iphdr));
+
+    /* This is where the IPv6 header is now. */
+    iphdr_ptr = (struct ip6_hdr*)((u8_t*)ipr->iphdr +
+      sizeof(struct ip6_frag_hdr));
+
     /* Adjust datagram length by adding header lengths. */
-    ipr->datagram_len += (u16_t)(((u8_t*)ipr->p->payload - (u8_t*)iphdr_ptr)
-                         + IP6_FRAG_HLEN
+    ipr->datagram_len = (u16_t)(ipr->datagram_len + ((u8_t*)p->payload - (u8_t*)iphdr_ptr)
                          - IP6_HLEN);
 
     /* Set payload length in ip header. */
     iphdr_ptr->_plen = lwip_htons(ipr->datagram_len);
 
-    /* Get the first pbuf. */
-    p = ipr->p;
+    /* With the fragment header gone, we now need to adjust the next-header
+     * field of whatever header was originally before it. Since the packet made
+     * it through the original header processing routines at least up to the
+     * fragment header, we do not need any further sanity checks here. */
+    if (IP6H_NEXTH(iphdr_ptr) == IP6_NEXTH_FRAGMENT) {
+      iphdr_ptr->_nexth = ipr->nexth;
+    } else {
+      u8_t *ptr = (u8_t *)iphdr_ptr + IP6_HLEN;
+      while (*ptr != IP6_NEXTH_FRAGMENT) {
+        ptr += 8 * (1 + ptr[1]);
+      }
+      *ptr = ipr->nexth;
+    }
 
-    /* Restore Fragment Header in first pbuf. Mark as "single fragment"
-     * packet. Restore nexth. */
-    frag_hdr = (struct ip6_frag_hdr *) p->payload;
-    frag_hdr->_nexth = ipr->nexth;
-    frag_hdr->reserved = 0;
-    frag_hdr->_fragment_offset = 0;
-    frag_hdr->_identification = 0;
-
-    /* release the sources allocate for the fragment queue entry */
+    /* release the resources allocated for the fragment queue entry */
     if (reassdatagrams == ipr) {
       /* it was the first in the list */
       reassdatagrams = ipr->next;
@@ -588,10 +646,11 @@
     memp_free(MEMP_IP6_REASSDATA, ipr);
 
     /* adjust the number of pbufs currently queued for reassembly. */
-    ip6_reass_pbufcount -= pbuf_clen(p);
+    clen = pbuf_clen(p);
+    LWIP_ASSERT("ip6_reass_pbufcount >= clen", ip6_reass_pbufcount >= clen);
+    ip6_reass_pbufcount = (u16_t)(ip6_reass_pbufcount - clen);
 
-    /* Move pbuf back to IPv6 header.
-       This cannot fail since we already checked when receiving this fragment. */
+    /* 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);
       pbuf_free(p);
@@ -605,6 +664,7 @@
   return NULL;
 
 nullreturn:
+  IP6_FRAG_STATS_INC(ip6_frag.drop);
   pbuf_free(p);
   return NULL;
 }
@@ -669,9 +729,9 @@
   u16_t left_to_copy;
 #endif
   static u32_t identification;
-  u16_t nfb;
   u16_t left, cop;
-  u16_t mtu;
+  const u16_t mtu = nd6_get_destination_mtu(dest, netif);
+  const u16_t nfb = (u16_t)((mtu - (IP6_HLEN + IP6_FRAG_HLEN)) & IP6_FRAG_OFFSET_MASK);
   u16_t fragment_offset = 0;
   u16_t last;
   u16_t poff = IP6_HLEN;
@@ -680,12 +740,9 @@
 
   original_ip6hdr = (struct ip6_hdr *)p->payload;
 
-  mtu = nd6_get_destination_mtu(dest, netif);
-
   /* @todo we assume there are no options in the unfragmentable part (IPv6 header). */
-  left = p->tot_len - IP6_HLEN;
-
-  nfb = (mtu - (IP6_HLEN + IP6_FRAG_HLEN)) & IP6_FRAG_OFFSET_MASK;
+  LWIP_ASSERT("p->tot_len >= IP6_HLEN", p->tot_len >= IP6_HLEN);
+  left = (u16_t)(p->tot_len - IP6_HLEN);
 
   while (left) {
     last = (left <= nfb);
@@ -703,7 +760,7 @@
       (rambuf->len == rambuf->tot_len) && (rambuf->next == NULL));
     poff += pbuf_copy_partial(p, (u8_t*)rambuf->payload + IP6_FRAG_HLEN, cop, poff);
     /* make room for the IP header */
-    if (pbuf_header(rambuf, IP6_HLEN)) {
+    if (pbuf_add_header(rambuf, IP6_HLEN)) {
       pbuf_free(rambuf);
       IP6_FRAG_STATS_INC(ip6_frag.memerr);
       return ERR_MEM;
@@ -731,8 +788,8 @@
 
     /* Can just adjust p directly for needed offset. */
     p->payload = (u8_t *)p->payload + poff;
-    p->len -= poff;
-    p->tot_len -= poff;
+    p->len = (u16_t)(p->len - poff);
+    p->tot_len = (u16_t)(p->tot_len - poff);
 
     left_to_copy = cop;
     while (left_to_copy) {
@@ -765,7 +822,7 @@
        * so that it is removed when pbuf_dechain is later called on rambuf.
        */
       pbuf_cat(rambuf, newpbuf);
-      left_to_copy -= newpbuflen;
+      left_to_copy = (u16_t)(left_to_copy - newpbuflen);
       if (left_to_copy) {
         p = p->next;
       }
@@ -776,11 +833,11 @@
     /* Set headers */
     frag_hdr->_nexth = original_ip6hdr->_nexth;
     frag_hdr->reserved = 0;
-    frag_hdr->_fragment_offset = lwip_htons((fragment_offset & IP6_FRAG_OFFSET_MASK) | (last ? 0 : IP6_FRAG_MORE_FLAG));
+    frag_hdr->_fragment_offset = lwip_htons((u16_t)((fragment_offset & IP6_FRAG_OFFSET_MASK) | (last ? 0 : IP6_FRAG_MORE_FLAG)));
     frag_hdr->_identification = lwip_htonl(identification);
 
     IP6H_NEXTH_SET(ip6hdr, IP6_NEXTH_FRAGMENT);
-    IP6H_PLEN_SET(ip6hdr, cop + IP6_FRAG_HLEN);
+    IP6H_PLEN_SET(ip6hdr, (u16_t)(cop + IP6_FRAG_HLEN));
 
     /* No need for separate header pbuf - we allowed room for it in rambuf
      * when allocated.
@@ -796,8 +853,8 @@
      */
 
     pbuf_free(rambuf);
-    left -= cop;
-    fragment_offset += cop;
+    left = (u16_t)(left - cop);
+    fragment_offset = (u16_t)(fragment_offset + cop);
   }
   return ERR_OK;
 }
diff --git a/src/core/ipv6/mld6.c b/src/core/ipv6/mld6.c
index 9acb82f..6387d46 100644
--- a/src/core/ipv6/mld6.c
+++ b/src/core/ipv6/mld6.c
@@ -6,7 +6,12 @@
  * @ingroup ip6
  * Multicast listener discovery for IPv6. Aims to be compliant with RFC 2710.
  * No support for MLDv2.\n
- * To be called from TCPIP thread
+ * 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
+ * The netif flags also need NETIF_FLAG_MLD6 flag set to enable MLD6 on a
+ * netif ("netif->flags |= NETIF_FLAG_MLD6;").\n
+ * To be called from TCPIP thread.
  */
 
 /*
@@ -293,11 +298,17 @@
 
 /**
  * @ingroup mld6
- * Join a group on a network interface.
+ * Join a group on one or all network interfaces.
  *
- * @param srcaddr ipv6 address of the network interface which should
- *                join a new group. If IP6_ADDR_ANY, join on all netifs
- * @param groupaddr the ipv6 address of the group to join
+ * If the group is to be joined on all interfaces, the given group address must
+ * not have a zone set (i.e., it must have its zone index set to IP6_NO_ZONE).
+ * If the group is to be joined on one particular interface, the given group
+ * address may or may not have a zone set.
+ *
+ * @param srcaddr ipv6 address (zoned) of the network interface which should
+ *                join a new group. If IP6_ADDR_ANY6, join on all netifs
+ * @param groupaddr the ipv6 address of the group to join (possibly but not
+ *                  necessarily zoned)
  * @return ERR_OK if group was joined on the netif(s), an err_t otherwise
  */
 err_t
@@ -306,9 +317,10 @@
   err_t         err = ERR_VAL; /* no matching interface */
   struct netif *netif;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
   /* loop through netif's */
-  netif = netif_list;
-  while (netif != NULL) {
+  NETIF_FOREACH(netif) {
     /* Should we join this interface ? */
     if (ip6_addr_isany(srcaddr) ||
         netif_get_ip6_addr_match(netif, srcaddr) >= 0) {
@@ -317,9 +329,6 @@
         return err;
       }
     }
-
-    /* proceed to next network interface */
-    netif = netif->next;
   }
 
   return err;
@@ -330,13 +339,28 @@
  * Join a group on a network interface.
  *
  * @param netif the network interface which should join a new group.
- * @param groupaddr the ipv6 address of the group to join
+ * @param groupaddr the ipv6 address of the group to join (possibly but not
+ *                  necessarily zoned)
  * @return ERR_OK if group was joined on the netif, an err_t otherwise
  */
 err_t
 mld6_joingroup_netif(struct netif *netif, const ip6_addr_t *groupaddr)
 {
   struct mld_group *group;
+#if LWIP_IPV6_SCOPES
+  ip6_addr_t ip6addr;
+
+  /* If the address has a particular scope but no zone set, use the netif to
+   * set one now. Within the mld6 module, all addresses are properly zoned. */
+  if (ip6_addr_lacks_zone(groupaddr, IP6_MULTICAST)) {
+    ip6_addr_set(&ip6addr, groupaddr);
+    ip6_addr_assign_zone(&ip6addr, IP6_MULTICAST, netif);
+    groupaddr = &ip6addr;
+  }
+  IP6_ADDR_ZONECHECK_NETIF(groupaddr, netif);
+#endif /* LWIP_IPV6_SCOPES */
+
+  LWIP_ASSERT_CORE_LOCKED();
 
   /* find group or create a new one if not found */
   group = mld6_lookfor_group(netif, groupaddr);
@@ -368,9 +392,12 @@
  * @ingroup mld6
  * Leave a group on a network interface.
  *
- * @param srcaddr ipv6 address of the network interface which should
- *                leave the group. If IP6_ISANY, leave on all netifs
- * @param groupaddr the ipv6 address of the group to leave
+ * Zoning of address follows the same rules as @ref mld6_joingroup.
+ *
+ * @param srcaddr ipv6 address (zoned) of the network interface which should
+ *                leave the group. If IP6_ADDR_ANY6, leave on all netifs
+ * @param groupaddr the ipv6 address of the group to leave (possibly, but not
+ *                  necessarily zoned)
  * @return ERR_OK if group was left on the netif(s), an err_t otherwise
  */
 err_t
@@ -379,9 +406,10 @@
   err_t         err = ERR_VAL; /* no matching interface */
   struct netif *netif;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
   /* loop through netif's */
-  netif = netif_list;
-  while (netif != NULL) {
+  NETIF_FOREACH(netif) {
     /* Should we leave this interface ? */
     if (ip6_addr_isany(srcaddr) ||
         netif_get_ip6_addr_match(netif, srcaddr) >= 0) {
@@ -391,8 +419,6 @@
         err = res;
       }
     }
-    /* proceed to next network interface */
-    netif = netif->next;
   }
 
   return err;
@@ -403,13 +429,26 @@
  * Leave a group on a network interface.
  *
  * @param netif the network interface which should leave the group.
- * @param groupaddr the ipv6 address of the group to leave
+ * @param groupaddr the ipv6 address of the group to leave (possibly, but not
+ *                  necessarily zoned)
  * @return ERR_OK if group was left on the netif, an err_t otherwise
  */
 err_t
 mld6_leavegroup_netif(struct netif *netif, const ip6_addr_t *groupaddr)
 {
   struct mld_group *group;
+#if LWIP_IPV6_SCOPES
+  ip6_addr_t ip6addr;
+
+  if (ip6_addr_lacks_zone(groupaddr, IP6_MULTICAST)) {
+    ip6_addr_set(&ip6addr, groupaddr);
+    ip6_addr_assign_zone(&ip6addr, IP6_MULTICAST, netif);
+    groupaddr = &ip6addr;
+  }
+  IP6_ADDR_ZONECHECK_NETIF(groupaddr, netif);
+#endif /* LWIP_IPV6_SCOPES */
+
+  LWIP_ASSERT_CORE_LOCKED();
 
   /* find group */
   group = mld6_lookfor_group(netif, groupaddr);
@@ -456,9 +495,9 @@
 void
 mld6_tmr(void)
 {
-  struct netif *netif = netif_list;
+  struct netif *netif;
 
-  while (netif != NULL) {
+  NETIF_FOREACH(netif) {
     struct mld_group *group = netif_mld6_data(netif);
 
     while (group != NULL) {
@@ -475,7 +514,6 @@
       }
       group = group->next;
     }
-    netif = netif->next;
   }
 }
 
@@ -484,20 +522,20 @@
  *
  * @param group the mld_group for which "delaying" membership report
  *              should be sent
- * @param maxresp the max resp delay provided in the query
+ * @param maxresp_in the max resp delay provided in the query
  */
 static void
-mld6_delayed_report(struct mld_group *group, u16_t maxresp)
+mld6_delayed_report(struct mld_group *group, u16_t maxresp_in)
 {
   /* Convert maxresp from milliseconds to tmr ticks */
-  maxresp = maxresp / MLD6_TMR_INTERVAL;
+  u16_t maxresp = maxresp_in / MLD6_TMR_INTERVAL;
   if (maxresp == 0) {
     maxresp = 1;
   }
 
 #ifdef LWIP_RAND
   /* Randomize maxresp. (if LWIP_RAND is supported) */
-  maxresp = LWIP_RAND() % maxresp;
+  maxresp = (u16_t)(LWIP_RAND() % maxresp);
   if (maxresp == 0) {
     maxresp = 1;
   }
@@ -529,14 +567,14 @@
   const ip6_addr_t *src_addr;
 
   /* Allocate a packet. Size is MLD header + IPv6 Hop-by-hop options header. */
-  p = pbuf_alloc(PBUF_IP, sizeof(struct mld_header) + sizeof(struct ip6_hbh_hdr), PBUF_RAM);
+  p = pbuf_alloc(PBUF_IP, sizeof(struct mld_header) + MLD6_HBH_HLEN, PBUF_RAM);
   if (p == NULL) {
     MLD6_STATS_INC(mld6.memerr);
     return;
   }
 
   /* Move to make room for Hop-by-hop options header. */
-  if (pbuf_header(p, -IP6_HBH_HLEN)) {
+  if (pbuf_remove_header(p, MLD6_HBH_HLEN)) {
     pbuf_free(p);
     MLD6_STATS_INC(mld6.lenerr);
     return;
@@ -561,7 +599,7 @@
   mld_hdr->chksum = 0;
   mld_hdr->max_resp_delay = 0;
   mld_hdr->reserved = 0;
-  ip6_addr_set(&(mld_hdr->multicast_address), &(group->group_address));
+  ip6_addr_copy_to_packed(mld_hdr->multicast_address, group->group_address);
 
 #if CHECKSUM_GEN_ICMP6
   IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_ICMP6) {
diff --git a/src/core/ipv6/nd6.c b/src/core/ipv6/nd6.c
index 0b36718..db0c132 100644
--- a/src/core/ipv6/nd6.c
+++ b/src/core/ipv6/nd6.c
@@ -58,6 +58,7 @@
 #include "lwip/netif.h"
 #include "lwip/icmp6.h"
 #include "lwip/mld6.h"
+#include "lwip/dhcp6.h"
 #include "lwip/ip.h"
 #include "lwip/stats.h"
 #include "lwip/dns.h"
@@ -84,31 +85,42 @@
 
 /* Index for cache entries. */
 static u8_t nd6_cached_neighbor_index;
-static u8_t nd6_cached_destination_index;
+static netif_addr_idx_t nd6_cached_destination_index;
 
 /* Multicast address holder. */
 static ip6_addr_t multicast_address;
 
-/* Static buffer to parse RA packet options (size of a prefix option, biggest option) */
-static u8_t nd6_ra_buffer[sizeof(struct prefix_option)];
+static u8_t nd6_tmr_rs_reduction;
+
+/* Static buffer to parse RA packet options */
+union ra_options {
+  struct lladdr_option  lladdr;
+  struct mtu_option     mtu;
+  struct prefix_option  prefix;
+#if LWIP_ND6_RDNSS_MAX_DNS_SERVERS
+  struct rdnss_option   rdnss;
+#endif
+};
+static union ra_options nd6_ra_buffer;
 
 /* Forward declarations. */
 static s8_t nd6_find_neighbor_cache_entry(const ip6_addr_t *ip6addr);
 static s8_t nd6_new_neighbor_cache_entry(void);
 static void nd6_free_neighbor_cache_entry(s8_t i);
-static s8_t nd6_find_destination_cache_entry(const ip6_addr_t *ip6addr);
-static s8_t nd6_new_destination_cache_entry(void);
-static s8_t nd6_is_prefix_in_netif(const ip6_addr_t *ip6addr, struct netif *netif);
+static s16_t nd6_find_destination_cache_entry(const ip6_addr_t *ip6addr);
+static s16_t nd6_new_destination_cache_entry(void);
+static int nd6_is_prefix_in_netif(const ip6_addr_t *ip6addr, struct netif *netif);
 static s8_t nd6_select_router(const ip6_addr_t *ip6addr, struct netif *netif);
 static s8_t nd6_get_router(const ip6_addr_t *router_addr, struct netif *netif);
 static s8_t nd6_new_router(const ip6_addr_t *router_addr, struct netif *netif);
-static s8_t nd6_get_onlink_prefix(ip6_addr_t *prefix, struct netif *netif);
-static s8_t nd6_new_onlink_prefix(ip6_addr_t *prefix, struct netif *netif);
+static s8_t nd6_get_onlink_prefix(const ip6_addr_t *prefix, struct netif *netif);
+static s8_t nd6_new_onlink_prefix(const ip6_addr_t *prefix, struct netif *netif);
 static s8_t nd6_get_next_hop_entry(const ip6_addr_t *ip6addr, struct netif *netif);
 static err_t nd6_queue_packet(s8_t neighbor_index, struct pbuf *q);
 
 #define ND6_SEND_FLAG_MULTICAST_DEST 0x01
 #define ND6_SEND_FLAG_ALLNODES_DEST 0x02
+#define ND6_SEND_FLAG_ANY_SRC 0x04
 static void nd6_send_ns(struct netif *netif, const ip6_addr_t *target_addr, u8_t flags);
 static void nd6_send_na(struct netif *netif, const ip6_addr_t *target_addr, u8_t flags);
 static void nd6_send_neighbor_cache_probe(struct nd6_neighbor_cache_entry *entry, u8_t flags);
@@ -125,6 +137,147 @@
 
 
 /**
+ * A local address has been determined to be a duplicate. Take the appropriate
+ * action(s) on the address and the interface as a whole.
+ *
+ * @param netif the netif that owns the address
+ * @param addr_idx the index of the address detected to be a duplicate
+ */
+static void
+nd6_duplicate_addr_detected(struct netif *netif, s8_t addr_idx)
+{
+
+  /* Mark the address as duplicate, but leave its lifetimes alone. If this was
+   * a manually assigned address, it will remain in existence as duplicate, and
+   * as such be unusable for any practical purposes until manual intervention.
+   * If this was an autogenerated address, the address will follow normal
+   * expiration rules, and thus disappear once its valid lifetime expires. */
+  netif_ip6_addr_set_state(netif, addr_idx, IP6_ADDR_DUPLICATED);
+
+#if LWIP_IPV6_AUTOCONFIG
+  /* If the affected address was the link-local address that we use to generate
+   * all other addresses, then we should not continue to use those derived
+   * addresses either, so mark them as duplicate as well. For autoconfig-only
+   * setups, this will make the interface effectively unusable, approaching the
+   * intention of RFC 4862 Sec. 5.4.5. @todo implement the full requirements */
+  if (addr_idx == 0) {
+    s8_t i;
+    for (i = 1; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
+      if (!ip6_addr_isinvalid(netif_ip6_addr_state(netif, i)) &&
+          !netif_ip6_addr_isstatic(netif, i)) {
+        netif_ip6_addr_set_state(netif, i, IP6_ADDR_DUPLICATED);
+      }
+    }
+  }
+#endif /* LWIP_IPV6_AUTOCONFIG */
+}
+
+#if LWIP_IPV6_AUTOCONFIG
+/**
+ * We received a router advertisement that contains a prefix with the
+ * autoconfiguration flag set. Add or update an associated autogenerated
+ * address.
+ *
+ * @param netif the netif on which the router advertisement arrived
+ * @param prefix_opt a pointer to the prefix option data
+ * @param prefix_addr an aligned copy of the prefix address
+ */
+static void
+nd6_process_autoconfig_prefix(struct netif *netif,
+  struct prefix_option *prefix_opt, const ip6_addr_t *prefix_addr)
+{
+  ip6_addr_t ip6addr;
+  u32_t valid_life, pref_life;
+  u8_t addr_state;
+  s8_t i, free_idx;
+
+  /* The caller already checks RFC 4862 Sec. 5.5.3 points (a) and (b). We do
+   * the rest, starting with checks for (c) and (d) here. */
+  valid_life = lwip_htonl(prefix_opt->valid_lifetime);
+  pref_life = lwip_htonl(prefix_opt->preferred_lifetime);
+  if (pref_life > valid_life || prefix_opt->prefix_length != 64) {
+    return; /* silently ignore this prefix for autoconfiguration purposes */
+  }
+
+  /* If an autogenerated address already exists for this prefix, update its
+   * lifetimes. An address is considered autogenerated if 1) it is not static
+   * (i.e., manually assigned), and 2) there is an advertised autoconfiguration
+   * prefix for it (the one we are processing here). This does not necessarily
+   * exclude the possibility that the address was actually assigned by, say,
+   * DHCPv6. If that distinction becomes important in the future, more state
+   * must be kept. As explained elsewhere we also update lifetimes of tentative
+   * and duplicate addresses. Skip address slot 0 (the link-local address). */
+  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))) {
+      /* 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);
+      if (valid_life > ND6_2HRS || valid_life > remaining_life) {
+        netif_ip6_addr_set_valid_life(netif, i, valid_life);
+      } else if (remaining_life > ND6_2HRS) {
+        netif_ip6_addr_set_valid_life(netif, i, ND6_2HRS);
+      }
+      LWIP_ASSERT("bad valid lifetime", !netif_ip6_addr_isstatic(netif, i));
+      /* Update the preferred lifetime. No bounds checks are needed here. In
+       * rare cases the advertisement may un-deprecate the address, though.
+       * Deprecation is left to the timer code where it is handled anyway. */
+      if (pref_life > 0 && addr_state == IP6_ADDR_DEPRECATED) {
+        netif_ip6_addr_set_state(netif, i, IP6_ADDR_PREFERRED);
+      }
+      netif_ip6_addr_set_pref_life(netif, i, pref_life);
+      return; /* there should be at most one matching address */
+    }
+  }
+
+  /* No autogenerated address exists for this prefix yet. See if we can add a
+   * new one. However, if IPv6 autoconfiguration is administratively disabled,
+   * do not generate new addresses, but do keep updating lifetimes for existing
+   * addresses. Also, when adding new addresses, we must protect explicitly
+   * against a valid lifetime of zero, because again, we use that as a special
+   * value. The generated address would otherwise expire immediately anyway.
+   * Finally, the original link-local address must be usable at all. We start
+   * creating addresses even if the link-local address is still in tentative
+   * state though, and deal with the fallout of that upon DAD collision. */
+  addr_state = netif_ip6_addr_state(netif, 0);
+  if (!netif->ip6_autoconfig_enabled || valid_life == IP6_ADDR_LIFE_STATIC ||
+      ip6_addr_isinvalid(addr_state) || ip6_addr_isduplicated(addr_state)) {
+    return;
+  }
+
+  /* Construct the new address that we intend to use, and then see if that
+   * address really does not exist. It might have been added manually, after
+   * all. As a side effect, find a free slot. Note that we cannot use
+   * netif_add_ip6_address() here, as it would return ERR_OK if the address
+   * already did exist, resulting in that address being given lifetimes. */
+  IP6_ADDR(&ip6addr, prefix_addr->addr[0], prefix_addr->addr[1],
+    netif_ip6_addr(netif, 0)->addr[2], netif_ip6_addr(netif, 0)->addr[3]);
+  ip6_addr_assign_zone(&ip6addr, IP6_UNICAST, netif);
+
+  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))) {
+        return; /* formed address already exists */
+      }
+    } else if (free_idx == 0) {
+      free_idx = i;
+    }
+  }
+  if (free_idx == 0) {
+    return; /* no address slots available, try again on next advertisement */
+  }
+
+  /* Assign the new address to the interface. */
+  ip_addr_copy_from_ip6(netif->ip6_addr[free_idx], ip6addr);
+  netif_ip6_addr_set_valid_life(netif, free_idx, valid_life);
+  netif_ip6_addr_set_pref_life(netif, free_idx, pref_life);
+  netif_ip6_addr_set_state(netif, free_idx, IP6_ADDR_TENTATIVE);
+}
+#endif /* LWIP_IPV6_AUTOCONFIG */
+
+/**
  * Process an incoming neighbor discovery message
  *
  * @param p the nd packet, p->payload pointing to the icmpv6 header
@@ -135,6 +288,7 @@
 {
   u8_t msg_type;
   s8_t i;
+  s16_t dest_idx;
 
   ND6_STATS_INC(nd6.recv);
 
@@ -144,6 +298,7 @@
   {
     struct na_header *na_hdr;
     struct lladdr_option *lladdr_opt;
+    ip6_addr_t target_address;
 
     /* Check that na header fits in packet. */
     if (p->len < (sizeof(struct na_header))) {
@@ -156,36 +311,36 @@
 
     na_hdr = (struct na_header *)p->payload;
 
+    /* Create an aligned, zoned copy of the target address. */
+    ip6_addr_copy_from_packed(target_address, na_hdr->target_address);
+    ip6_addr_assign_zone(&target_address, IP6_UNICAST, inp);
+
+    /* Check a subset of the other RFC 4861 Sec. 7.1.2 requirements. */
+    if (IP6H_HOPLIM(ip6_current_header()) != ND6_HOPLIM || na_hdr->code != 0 ||
+        ip6_addr_ismulticast(&target_address)) {
+      pbuf_free(p);
+      ND6_STATS_INC(nd6.proterr);
+      ND6_STATS_INC(nd6.drop);
+      return;
+    }
+
+    /* @todo RFC MUST: if IP destination is multicast, Solicited flag is zero */
+    /* @todo RFC MUST: all included options have a length greater than zero */
+
     /* Unsolicited NA?*/
     if (ip6_addr_ismulticast(ip6_current_dest_addr())) {
-      ip6_addr_t target_address;
-      
       /* This is an unsolicited NA.
        * link-layer changed?
        * part of DAD mechanism? */
 
-      /* Create an aligned copy. */
-      ip6_addr_set(&target_address, &(na_hdr->target_address));
-
 #if LWIP_IPV6_DUP_DETECT_ATTEMPTS
       /* If the target address matches this netif, it is a DAD response. */
       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))) {
           /* We are using a duplicate address. */
-          netif_ip6_addr_set_state(inp, i, IP6_ADDR_INVALID);
-
-#if LWIP_IPV6_AUTOCONFIG
-          /* Check to see if this address was autoconfigured. */
-          if (!ip6_addr_islinklocal(&target_address)) {
-            i = nd6_get_onlink_prefix(&target_address, inp);
-            if (i >= 0) {
-              /* Mark this prefix as duplicate, so that we don't use it
-               * to generate this address again. */
-              prefix_list[i].flags |= ND6_PREFIX_AUTOCONFIG_ADDRESS_DUPLICATE;
-            }
-          }
-#endif /* LWIP_IPV6_AUTOCONFIG */
+          nd6_duplicate_addr_detected(inp, i);
 
           pbuf_free(p);
           return;
@@ -220,15 +375,10 @@
         }
       }
     } else {
-      ip6_addr_t target_address;
-
       /* This is a solicited NA.
        * neighbor address resolution response?
        * neighbor unreachability detection response? */
 
-      /* Create an aligned copy. */
-      ip6_addr_set(&target_address, &(na_hdr->target_address));
-
       /* Find the cache entry corresponding to this na. */
       i = nd6_find_neighbor_cache_entry(&target_address);
       if (i < 0) {
@@ -278,6 +428,7 @@
   {
     struct ns_header *ns_hdr;
     struct lladdr_option *lladdr_opt;
+    ip6_addr_t target_address;
     u8_t accepted;
 
     /* Check that ns header fits in packet. */
@@ -291,6 +442,23 @@
 
     ns_hdr = (struct ns_header *)p->payload;
 
+    /* Create an aligned, zoned copy of the target address. */
+    ip6_addr_copy_from_packed(target_address, ns_hdr->target_address);
+    ip6_addr_assign_zone(&target_address, IP6_UNICAST, inp);
+
+    /* Check a subset of the other RFC 4861 Sec. 7.1.1 requirements. */
+    if (IP6H_HOPLIM(ip6_current_header()) != ND6_HOPLIM || ns_hdr->code != 0 ||
+       ip6_addr_ismulticast(&target_address)) {
+      pbuf_free(p);
+      ND6_STATS_INC(nd6.proterr);
+      ND6_STATS_INC(nd6.drop);
+      return;
+    }
+
+    /* @todo RFC MUST: all included options have a length greater than zero */
+    /* @todo RFC MUST: if IP source is 'any', destination is solicited-node multicast address */
+    /* @todo RFC MUST: if IP source is 'any', there is no source LL address option */
+
     /* Check if there is a link-layer address provided. Only point to it if in this buffer. */
     if (p->len >= (sizeof(struct ns_header) + 2)) {
       lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct ns_header));
@@ -307,7 +475,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(&(ns_hdr->target_address), netif_ip6_addr(inp, i))) {
+          ip6_addr_cmp(&target_address, netif_ip6_addr(inp, i))) {
         accepted = 1;
         break;
       }
@@ -324,18 +492,16 @@
       /* 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(&(ns_hdr->target_address), netif_ip6_addr(inp, i))) {
+            ip6_addr_cmp(&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))) {
             /* We shouldn't use this address either. */
-            netif_ip6_addr_set_state(inp, i, IP6_ADDR_INVALID);
+            nd6_duplicate_addr_detected(inp, i);
           }
         }
       }
     } else {
-      ip6_addr_t target_address;
-      
       /* Sender is trying to resolve our address. */
       /* Verify that they included their own link-layer address. */
       if (lladdr_opt == NULL) {
@@ -379,9 +545,6 @@
         neighbor_cache[i].counter.delay_time = LWIP_ND6_DELAY_FIRST_PROBE_TIME / ND6_TMR_INTERVAL;
       }
 
-      /* Create an aligned copy. */
-      ip6_addr_set(&target_address, &(ns_hdr->target_address));
-
       /* Send back a NA for us. Allocate the reply pbuf. */
       nd6_send_na(inp, &target_address, ND6_FLAG_SOLICITED | ND6_FLAG_OVERRIDE);
     }
@@ -394,7 +557,7 @@
     u8_t *buffer; /* Used to copy options. */
     u16_t offset;
 #if LWIP_ND6_RDNSS_MAX_DNS_SERVERS
-    /* There can by multiple RDNSS options per RA */
+    /* There can be multiple RDNSS options per RA */
     u8_t rdnss_server_idx = 0;
 #endif /* LWIP_ND6_RDNSS_MAX_DNS_SERVERS */
 
@@ -409,12 +572,25 @@
 
     ra_hdr = (struct ra_header *)p->payload;
 
+    /* Check a subset of the other RFC 4861 Sec. 6.1.2 requirements. */
+    if (!ip6_addr_islinklocal(ip6_current_src_addr()) ||
+        IP6H_HOPLIM(ip6_current_header()) != ND6_HOPLIM || ra_hdr->code != 0) {
+      pbuf_free(p);
+      ND6_STATS_INC(nd6.proterr);
+      ND6_STATS_INC(nd6.drop);
+      return;
+    }
+
+    /* @todo RFC MUST: all included options have a length greater than zero */
+
     /* If we are sending RS messages, stop. */
 #if LWIP_IPV6_SEND_ROUTER_SOLICIT
-    /* ensure at least one solicitation is sent */
+    /* ensure at least one solicitation is sent (see RFC 4861, ch. 6.3.7) */
     if ((inp->rs_count < LWIP_ND6_MAX_MULTICAST_SOLICIT) ||
         (nd6_send_rs(inp) == ERR_OK)) {
       inp->rs_count = 0;
+    } else {
+      inp->rs_count = 1;
     }
 #endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */
 
@@ -451,34 +627,54 @@
     /* Update flags in local entry (incl. preference). */
     default_router_list[i].flags = ra_hdr->flags;
 
+#if LWIP_IPV6_DHCP6
+    /* Trigger DHCPv6 if enabled */
+    dhcp6_nd6_ra_trigger(inp, ra_hdr->flags & ND6_RA_FLAG_MANAGED_ADDR_CONFIG,
+      ra_hdr->flags & ND6_RA_FLAG_OTHER_CONFIG);
+#endif
+
     /* Offset to options. */
     offset = sizeof(struct ra_header);
 
     /* Process each option. */
-    while ((p->tot_len - offset) > 0) {
+    while ((p->tot_len - offset) >= 2) {
+      u8_t option_type;
+      u16_t option_len;
+      int option_len8 = pbuf_try_get_at(p, offset + 1);
+      if (option_len8 <= 0) {
+        /* read beyond end or zero length */
+        goto lenerr_drop_free_return;
+      }
+      option_len = ((u8_t)option_len8) << 3;
+      if (option_len > p->tot_len - offset) {
+        /* short packet (option does not fit in) */
+        goto lenerr_drop_free_return;
+      }
       if (p->len == p->tot_len) {
         /* no need to copy from contiguous pbuf */
         buffer = &((u8_t*)p->payload)[offset];
       } else {
-        buffer = nd6_ra_buffer;
-        if (pbuf_copy_partial(p, buffer, sizeof(struct prefix_option), offset) != sizeof(struct prefix_option)) {
-          pbuf_free(p);
-          ND6_STATS_INC(nd6.lenerr);
-          ND6_STATS_INC(nd6.drop);
-          return;
+        /* check if this option fits into our buffer */
+        if (option_len > sizeof(nd6_ra_buffer)) {
+          option_type = pbuf_get_at(p, offset);
+          /* invalid option length */
+          if (option_type != ND6_OPTION_TYPE_RDNSS) {
+            goto lenerr_drop_free_return;
+          }
+          /* we allow RDNSS option to be longer - we'll just drop some servers */
+          option_len = sizeof(nd6_ra_buffer);
         }
+        buffer = (u8_t*)&nd6_ra_buffer;
+        option_len = pbuf_copy_partial(p, &nd6_ra_buffer, option_len, offset);
       }
-      if (buffer[1] == 0) {
-        /* zero-length extension. drop packet */
-        pbuf_free(p);
-        ND6_STATS_INC(nd6.lenerr);
-        ND6_STATS_INC(nd6.drop);
-        return;
-      }
-      switch (buffer[0]) {
+      option_type = buffer[0];
+      switch (option_type) {
       case ND6_OPTION_TYPE_SOURCE_LLADDR:
       {
         struct lladdr_option *lladdr_opt;
+        if (option_len < sizeof(struct lladdr_option)) {
+          goto lenerr_drop_free_return;
+        }
         lladdr_opt = (struct lladdr_option *)buffer;
         if ((default_router_list[i].neighbor_entry != NULL) &&
             (default_router_list[i].neighbor_entry->state == ND6_INCOMPLETE)) {
@@ -491,10 +687,20 @@
       case ND6_OPTION_TYPE_MTU:
       {
         struct mtu_option *mtu_opt;
+        u32_t mtu32;
+        if (option_len < sizeof(struct mtu_option)) {
+          goto lenerr_drop_free_return;
+        }
         mtu_opt = (struct mtu_option *)buffer;
-        if (lwip_htonl(mtu_opt->mtu) >= 1280) {
+        mtu32 = lwip_htonl(mtu_opt->mtu);
+        if ((mtu32 >= 1280) && (mtu32 <= 0xffff)) {
 #if LWIP_ND6_ALLOW_RA_UPDATES
-          inp->mtu = (u16_t)lwip_htonl(mtu_opt->mtu);
+          if (inp->mtu) {
+            /* don't set the mtu for IPv6 higher than the netif driver supports */
+            inp->mtu6 = LWIP_MIN(inp->mtu, (u16_t)mtu32);
+          } else {
+            inp->mtu6 = (u16_t)mtu32;
+          }
 #endif /* LWIP_ND6_ALLOW_RA_UPDATES */
         }
         break;
@@ -502,35 +708,42 @@
       case ND6_OPTION_TYPE_PREFIX_INFO:
       {
         struct prefix_option *prefix_opt;
+        ip6_addr_t prefix_addr;
+        if (option_len < sizeof(struct prefix_option)) {
+          goto lenerr_drop_free_return;
+        }
+
         prefix_opt = (struct prefix_option *)buffer;
 
-        if ((prefix_opt->flags & ND6_PREFIX_FLAG_ON_LINK) &&
-            (prefix_opt->prefix_length == 64)  &&
-            !ip6_addr_islinklocal(&(prefix_opt->prefix))) {
-          /* Add to on-link prefix list. */
-          s8_t prefix;
-          ip6_addr_t prefix_addr;
+        /* Get a memory-aligned copy of the prefix. */
+        ip6_addr_copy_from_packed(prefix_addr, prefix_opt->prefix);
+        ip6_addr_assign_zone(&prefix_addr, IP6_UNICAST, inp);
 
-          /* Get a memory-aligned copy of the prefix. */
-          ip6_addr_set(&prefix_addr, &(prefix_opt->prefix));
+        if (!ip6_addr_islinklocal(&prefix_addr)) {
+          if ((prefix_opt->flags & ND6_PREFIX_FLAG_ON_LINK) &&
+              (prefix_opt->prefix_length == 64)) {
+            /* Add to on-link prefix list. */
+            u32_t valid_life;
+            s8_t prefix;
 
-          /* find cache entry for this prefix. */
-          prefix = nd6_get_onlink_prefix(&prefix_addr, inp);
-          if (prefix < 0) {
-            /* Create a new cache entry. */
-            prefix = nd6_new_onlink_prefix(&prefix_addr, inp);
-          }
-          if (prefix >= 0) {
-            prefix_list[prefix].invalidation_timer = lwip_htonl(prefix_opt->valid_lifetime);
+            valid_life = lwip_htonl(prefix_opt->valid_lifetime);
 
-#if LWIP_IPV6_AUTOCONFIG
-            if (prefix_opt->flags & ND6_PREFIX_FLAG_AUTONOMOUS) {
-              /* Mark prefix as autonomous, so that address autoconfiguration can take place.
-               * Only OR flag, so that we don't over-write other flags (such as ADDRESS_DUPLICATE)*/
-              prefix_list[prefix].flags |= ND6_PREFIX_AUTOCONFIG_AUTONOMOUS;
+            /* find cache entry for this prefix. */
+            prefix = nd6_get_onlink_prefix(&prefix_addr, inp);
+            if (prefix < 0 && valid_life > 0) {
+              /* Create a new cache entry. */
+              prefix = nd6_new_onlink_prefix(&prefix_addr, inp);
             }
-#endif /* LWIP_IPV6_AUTOCONFIG */
+            if (prefix >= 0) {
+              prefix_list[prefix].invalidation_timer = valid_life;
+            }
           }
+#if LWIP_IPV6_AUTOCONFIG
+          if (prefix_opt->flags & ND6_PREFIX_FLAG_AUTONOMOUS) {
+            /* Perform processing for autoconfiguration. */
+            nd6_process_autoconfig_prefix(inp, prefix_opt, &prefix_addr);
+          }
+#endif /* LWIP_IPV6_AUTOCONFIG */
         }
 
         break;
@@ -545,26 +758,33 @@
       case ND6_OPTION_TYPE_RDNSS:
       {
         u8_t num, n;
+        u16_t copy_offset = offset + SIZEOF_RDNSS_OPTION_BASE;
         struct rdnss_option * rdnss_opt;
+        if (option_len < SIZEOF_RDNSS_OPTION_BASE) {
+          goto lenerr_drop_free_return;
+        }
 
         rdnss_opt = (struct rdnss_option *)buffer;
         num = (rdnss_opt->length - 1) / 2;
         for (n = 0; (rdnss_server_idx < DNS_MAX_SERVERS) && (n < num); n++) {
           ip_addr_t rdnss_address;
 
-          /* Get a memory-aligned copy of the prefix. */
-          ip_addr_copy_from_ip6(rdnss_address, rdnss_opt->rdnss_address[n]);
+          /* Copy directly from pbuf to get an aligned, zoned copy of the prefix. */
+          if (pbuf_copy_partial(p, &rdnss_address, sizeof(ip6_addr_p_t), copy_offset) == sizeof(ip6_addr_p_t)) {
+            IP_SET_TYPE_VAL(rdnss_address, IPADDR_TYPE_V6);
+            ip6_addr_assign_zone(ip_2_ip6(&rdnss_address), IP6_UNKNOWN, inp);
 
-          if (htonl(rdnss_opt->lifetime) > 0) {
-            /* TODO implement Lifetime > 0 */
-            dns_setserver(rdnss_server_idx++, &rdnss_address);
-          } else {
-            /* TODO implement DNS removal in dns.c */
-            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)) {
-                dns_setserver(s, NULL);
+            if (htonl(rdnss_opt->lifetime) > 0) {
+              /* TODO implement Lifetime > 0 */
+              dns_setserver(rdnss_server_idx++, &rdnss_address);
+            } else {
+              /* TODO implement DNS removal in dns.c */
+              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)) {
+                  dns_setserver(s, NULL);
+                }
               }
             }
           }
@@ -578,7 +798,7 @@
         break;
       }
       /* option length is checked earlier to be non-zero to make sure loop ends */
-      offset += 8 * ((u16_t)buffer[1]);
+      offset += 8 * (u8_t)option_len8;
     }
 
     break; /* ICMP6_TYPE_RA */
@@ -587,7 +807,7 @@
   {
     struct redirect_header *redir_hdr;
     struct lladdr_option *lladdr_opt;
-    ip6_addr_t tmp;
+    ip6_addr_t destination_address, target_address;
 
     /* Check that Redir header fits in packet. */
     if (p->len < sizeof(struct redirect_header)) {
@@ -600,6 +820,24 @@
 
     redir_hdr = (struct redirect_header *)p->payload;
 
+    /* Create an aligned, zoned copy of the destination address. */
+    ip6_addr_copy_from_packed(destination_address, redir_hdr->destination_address);
+    ip6_addr_assign_zone(&destination_address, IP6_UNICAST, inp);
+
+    /* Check a subset of the other RFC 4861 Sec. 8.1 requirements. */
+    if (!ip6_addr_islinklocal(ip6_current_src_addr()) ||
+        IP6H_HOPLIM(ip6_current_header()) != ND6_HOPLIM ||
+        redir_hdr->code != 0 || ip6_addr_ismulticast(&destination_address)) {
+      pbuf_free(p);
+      ND6_STATS_INC(nd6.proterr);
+      ND6_STATS_INC(nd6.drop);
+      return;
+    }
+
+    /* @todo RFC MUST: IP source address equals first-hop router for destination_address */
+    /* @todo RFC MUST: ICMP target address is either link-local address or same as destination_address */
+    /* @todo RFC MUST: all included options have a length greater than zero */
+
     if (p->len >= (sizeof(struct redirect_header) + 2)) {
       lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct redirect_header));
       if (p->len < (sizeof(struct redirect_header) + (lladdr_opt->length << 3))) {
@@ -609,33 +847,31 @@
       lladdr_opt = NULL;
     }
 
-    /* Copy original destination address to current source address, to have an aligned copy. */
-    ip6_addr_set(&tmp, &(redir_hdr->destination_address));
-
     /* Find dest address in cache */
-    i = nd6_find_destination_cache_entry(&tmp);
-    if (i < 0) {
+    dest_idx = nd6_find_destination_cache_entry(&destination_address);
+    if (dest_idx < 0) {
       /* Destination not in cache, drop packet. */
       pbuf_free(p);
       return;
     }
 
+    /* Create an aligned, zoned copy of the target address. */
+    ip6_addr_copy_from_packed(target_address, redir_hdr->target_address);
+    ip6_addr_assign_zone(&target_address, IP6_UNICAST, inp);
+
     /* Set the new target address. */
-    ip6_addr_set(&(destination_cache[i].next_hop_addr), &(redir_hdr->target_address));
+    ip6_addr_copy(destination_cache[dest_idx].next_hop_addr, target_address);
 
     /* If Link-layer address of other router is given, try to add to neighbor cache. */
     if (lladdr_opt != NULL) {
       if (lladdr_opt->type == ND6_OPTION_TYPE_TARGET_LLADDR) {
-        /* Copy target address to current source address, to have an aligned copy. */
-        ip6_addr_set(&tmp, &(redir_hdr->target_address));
-
-        i = nd6_find_neighbor_cache_entry(&tmp);
+        i = nd6_find_neighbor_cache_entry(&target_address);
         if (i < 0) {
           i = nd6_new_neighbor_cache_entry();
           if (i >= 0) {
             neighbor_cache[i].netif = inp;
             MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len);
-            ip6_addr_set(&(neighbor_cache[i].next_hop_address), &tmp);
+            ip6_addr_copy(neighbor_cache[i].next_hop_address, target_address);
 
             /* Receiving a message does not prove reachability: only in one direction.
              * Delay probe in case we get confirmation of reachability from upper layer (TCP). */
@@ -661,7 +897,7 @@
     struct icmp6_hdr *icmp6hdr; /* Packet too big message */
     struct ip6_hdr *ip6hdr; /* IPv6 header of the packet which caused the error */
     u32_t pmtu;
-    ip6_addr_t tmp;
+    ip6_addr_t destination_address;
 
     /* Check that ICMPv6 header + IPv6 header fit in payload */
     if (p->len < (sizeof(struct icmp6_hdr) + IP6_HLEN)) {
@@ -675,12 +911,13 @@
     icmp6hdr = (struct icmp6_hdr *)p->payload;
     ip6hdr = (struct ip6_hdr *)((u8_t*)p->payload + sizeof(struct icmp6_hdr));
 
-    /* Copy original destination address to current source address, to have an aligned copy. */
-    ip6_addr_set(&tmp, &(ip6hdr->dest));
+    /* Create an aligned, zoned copy of the destination address. */
+    ip6_addr_copy_from_packed(destination_address, ip6hdr->dest);
+    ip6_addr_assign_zone(&destination_address, IP6_UNKNOWN, inp);
 
     /* Look for entry in destination cache. */
-    i = nd6_find_destination_cache_entry(&tmp);
-    if (i < 0) {
+    dest_idx = nd6_find_destination_cache_entry(&destination_address);
+    if (dest_idx < 0) {
       /* Destination not in cache, drop packet. */
       pbuf_free(p);
       return;
@@ -688,7 +925,7 @@
 
     /* Change the Path MTU. */
     pmtu = lwip_htonl(icmp6hdr->data);
-    destination_cache[i].pmtu = (u16_t)LWIP_MIN(pmtu, 0xFFFF);
+    destination_cache[dest_idx].pmtu = (u16_t)LWIP_MIN(pmtu, 0xFFFF);
 
     break; /* ICMP6_TYPE_PTB */
   }
@@ -700,6 +937,11 @@
   }
 
   pbuf_free(p);
+  return;
+lenerr_drop_free_return:
+  ND6_STATS_INC(nd6.lenerr);
+  ND6_STATS_INC(nd6.drop);
+  pbuf_free(p);
 }
 
 
@@ -709,6 +951,7 @@
  * - Update neighbor reachability states
  * - Update destination cache entries age
  * - Update invalidation timers of default routers and on-link prefixes
+ * - Update lifetimes of our addresses
  * - Perform duplicate address detection (DAD) for our addresses
  * - Send router solicitations
  */
@@ -784,15 +1027,22 @@
   for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) {
     if (default_router_list[i].neighbor_entry != NULL) {
       /* Active entry. */
-      if (default_router_list[i].invalidation_timer > 0) {
-        default_router_list[i].invalidation_timer -= ND6_TMR_INTERVAL / 1000;
-      }
-      if (default_router_list[i].invalidation_timer < ND6_TMR_INTERVAL / 1000) {
-        /* Less than 1 second remaining. Clear this entry. */
+      if (default_router_list[i].invalidation_timer <= ND6_TMR_INTERVAL / 1000) {
+        /* No more than 1 second remaining. Clear this entry. Also clear any of
+         * 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,
+               &default_router_list[i].neighbor_entry->next_hop_address)) {
+             ip6_addr_set_any(&destination_cache[j].destination_addr);
+          }
+        }
         default_router_list[i].neighbor_entry->isrouter = 0;
         default_router_list[i].neighbor_entry = NULL;
         default_router_list[i].invalidation_timer = 0;
         default_router_list[i].flags = 0;
+      } else {
+        default_router_list[i].invalidation_timer -= ND6_TMR_INTERVAL / 1000;
       }
     }
   }
@@ -800,81 +1050,89 @@
   /* Process prefix entries. */
   for (i = 0; i < LWIP_ND6_NUM_PREFIXES; i++) {
     if (prefix_list[i].netif != NULL) {
-      if (prefix_list[i].invalidation_timer < ND6_TMR_INTERVAL / 1000) {
+      if (prefix_list[i].invalidation_timer <= ND6_TMR_INTERVAL / 1000) {
         /* Entry timed out, remove it */
         prefix_list[i].invalidation_timer = 0;
-
-#if LWIP_IPV6_AUTOCONFIG
-        /* If any addresses were configured with this prefix, remove them */
-        if (prefix_list[i].flags & ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED) {
-          s8_t j;
-
-          for (j = 1; j < LWIP_IPV6_NUM_ADDRESSES; j++) {
-            if ((netif_ip6_addr_state(prefix_list[i].netif, j) != IP6_ADDR_INVALID) &&
-                ip6_addr_netcmp(&prefix_list[i].prefix, netif_ip6_addr(prefix_list[i].netif, j))) {
-              netif_ip6_addr_set_state(prefix_list[i].netif, j, IP6_ADDR_INVALID);
-              prefix_list[i].flags = 0;
-
-              /* Exit loop. */
-              break;
-            }
-          }
-        }
-#endif /* LWIP_IPV6_AUTOCONFIG */
-
         prefix_list[i].netif = NULL;
-        prefix_list[i].flags = 0;
       } else {
         prefix_list[i].invalidation_timer -= ND6_TMR_INTERVAL / 1000;
-
-#if LWIP_IPV6_AUTOCONFIG
-        /* Initiate address autoconfiguration for this prefix, if conditions are met. */
-        if (prefix_list[i].netif->ip6_autoconfig_enabled &&
-            (prefix_list[i].flags & ND6_PREFIX_AUTOCONFIG_AUTONOMOUS) &&
-            !(prefix_list[i].flags & ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED)) {
-          s8_t j;
-          /* Try to get an address on this netif that is invalid.
-           * Skip 0 index (link-local address) */
-          for (j = 1; j < LWIP_IPV6_NUM_ADDRESSES; j++) {
-            if (netif_ip6_addr_state(prefix_list[i].netif, j) == IP6_ADDR_INVALID) {
-              /* Generate an address using this prefix and interface ID from link-local address. */
-              netif_ip6_addr_set_parts(prefix_list[i].netif, j,
-                prefix_list[i].prefix.addr[0], prefix_list[i].prefix.addr[1],
-                netif_ip6_addr(prefix_list[i].netif, 0)->addr[2], netif_ip6_addr(prefix_list[i].netif, 0)->addr[3]);
-
-              /* Mark it as tentative (DAD will be performed if configured). */
-              netif_ip6_addr_set_state(prefix_list[i].netif, j, IP6_ADDR_TENTATIVE);
-
-              /* Mark this prefix with ADDRESS_GENERATED, so that we don't try again. */
-              prefix_list[i].flags |= ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED;
-
-              /* Exit loop. */
-              break;
-            }
-          }
-        }
-#endif /* LWIP_IPV6_AUTOCONFIG */
       }
     }
   }
 
-
-  /* Process our own addresses, if DAD configured. */
-  for (netif = netif_list; netif != NULL; netif = netif->next) {
+  /* Process our own addresses, updating address lifetimes and/or DAD state. */
+  NETIF_FOREACH(netif) {
     for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) {
-      u8_t addr_state = netif_ip6_addr_state(netif, i);
+      u8_t addr_state;
+#if LWIP_IPV6_ADDRESS_LIFETIMES
+      /* Step 1: update address lifetimes (valid and preferred). */
+      addr_state = netif_ip6_addr_state(netif, i);
+      /* RFC 4862 is not entirely clear as to whether address lifetimes affect
+       * tentative addresses, and is even less clear as to what should happen
+       * with duplicate addresses. We choose to track and update lifetimes for
+       * both those types, although for different reasons:
+       * - for tentative addresses, the line of thought of Sec. 5.7 combined
+       *   with the potentially long period that an address may be in tentative
+       *   state (due to the interface being down) suggests that lifetimes
+       *   should be independent of external factors which would include DAD;
+       * - for duplicate addresses, retiring them early could result in a new
+       *   but unwanted attempt at marking them as valid, while retiring them
+       *   late/never could clog up address slots on the netif.
+       * As a result, we may end up expiring addresses of either type here.
+       */
+      if (!ip6_addr_isinvalid(addr_state) &&
+          !netif_ip6_addr_isstatic(netif, i)) {
+        u32_t life = netif_ip6_addr_valid_life(netif, i);
+        if (life <= ND6_TMR_INTERVAL / 1000) {
+          /* The address has expired. */
+          netif_ip6_addr_set_valid_life(netif, i, 0);
+          netif_ip6_addr_set_pref_life(netif, i, 0);
+          netif_ip6_addr_set_state(netif, i, IP6_ADDR_INVALID);
+        } else {
+          if (!ip6_addr_life_isinfinite(life)) {
+            life -= ND6_TMR_INTERVAL / 1000;
+            LWIP_ASSERT("bad valid lifetime", life != IP6_ADDR_LIFE_STATIC);
+            netif_ip6_addr_set_valid_life(netif, i, life);
+          }
+          /* The address is still here. Update the preferred lifetime too. */
+          life = netif_ip6_addr_pref_life(netif, i);
+          if (life <= ND6_TMR_INTERVAL / 1000) {
+            /* This case must also trigger if 'life' was already zero, so as to
+             * deal correctly with advertised preferred-lifetime reductions. */
+            netif_ip6_addr_set_pref_life(netif, i, 0);
+            if (addr_state == IP6_ADDR_PREFERRED)
+              netif_ip6_addr_set_state(netif, i, IP6_ADDR_DEPRECATED);
+          } else if (!ip6_addr_life_isinfinite(life)) {
+            life -= ND6_TMR_INTERVAL / 1000;
+            netif_ip6_addr_set_pref_life(netif, i, life);
+          }
+        }
+      }
+      /* The address state may now have changed, so reobtain it next. */
+#endif /* LWIP_IPV6_ADDRESS_LIFETIMES */
+      /* Step 2: update DAD state. */
+      addr_state = netif_ip6_addr_state(netif, i);
       if (ip6_addr_istentative(addr_state)) {
         if ((addr_state & IP6_ADDR_TENTATIVE_COUNT_MASK) >= LWIP_IPV6_DUP_DETECT_ATTEMPTS) {
-          /* No NA received in response. Mark address as valid. */
-          netif_ip6_addr_set_state(netif, i, IP6_ADDR_PREFERRED);
-          /* @todo implement preferred and valid lifetimes. */
-        } else if (netif->flags & NETIF_FLAG_UP) {
-          /* Send a NS for this address. */
-          nd6_send_ns(netif, netif_ip6_addr(netif, i), ND6_SEND_FLAG_MULTICAST_DEST);
+          /* No NA received in response. Mark address as valid. For dynamic
+           * addresses with an expired preferred lifetime, the state is set to
+           * deprecated right away. That should almost never happen, though. */
+          addr_state = IP6_ADDR_PREFERRED;
+#if LWIP_IPV6_ADDRESS_LIFETIMES
+          if (!netif_ip6_addr_isstatic(netif, i) &&
+              netif_ip6_addr_pref_life(netif, i) == 0) {
+            addr_state = IP6_ADDR_DEPRECATED;
+          }
+#endif /* LWIP_IPV6_ADDRESS_LIFETIMES */
+          netif_ip6_addr_set_state(netif, i, addr_state);
+        } else if (netif_is_up(netif) && netif_is_link_up(netif)) {
           /* tentative: set next state by increasing by one */
           netif_ip6_addr_set_state(netif, i, addr_state + 1);
-          /* @todo send max 1 NS per tmr call? enable return*/
-          /*return;*/
+          /* Send a NS for this address. Use the unspecified address as source
+           * address in all cases (RFC 4862 Sec. 5.4.2), not in the least
+           * because as it is, we only consider multicast replies for DAD. */
+          nd6_send_ns(netif, netif_ip6_addr(netif, i),
+            ND6_SEND_FLAG_MULTICAST_DEST | ND6_SEND_FLAG_ANY_SRC);
         }
       }
     }
@@ -882,13 +1140,20 @@
 
 #if LWIP_IPV6_SEND_ROUTER_SOLICIT
   /* Send router solicitation messages, if necessary. */
-  for (netif = netif_list; netif != NULL; netif = netif->next) {
-    if ((netif->rs_count > 0) && (netif->flags & NETIF_FLAG_UP) &&
-        (!ip6_addr_isinvalid(netif_ip6_addr_state(netif, 0)))) {
-      if (nd6_send_rs(netif) == ERR_OK) {
-        netif->rs_count--;
+  if (!nd6_tmr_rs_reduction) {
+    nd6_tmr_rs_reduction = (ND6_RTR_SOLICITATION_INTERVAL / ND6_TMR_INTERVAL) - 1;
+    NETIF_FOREACH(netif) {
+      if ((netif->rs_count > 0) && netif_is_up(netif) &&
+          netif_is_link_up(netif) &&
+          !ip6_addr_isinvalid(netif_ip6_addr_state(netif, 0)) &&
+          !ip6_addr_isduplicated(netif_ip6_addr_state(netif, 0))) {
+        if (nd6_send_rs(netif) == ERR_OK) {
+          netif->rs_count--;
+        }
       }
     }
+  } else {
+    nd6_tmr_rs_reduction--;
   }
 #endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */
 
@@ -920,7 +1185,10 @@
   const ip6_addr_t *src_addr;
   u16_t lladdr_opt_len;
 
-  if (ip6_addr_isvalid(netif_ip6_addr_state(netif,0))) {
+  LWIP_ASSERT("target address is required", target_addr != NULL);
+
+  if (!(flags & ND6_SEND_FLAG_ANY_SRC) &&
+      ip6_addr_isvalid(netif_ip6_addr_state(netif,0))) {
     /* Use link-local address as source address. */
     src_addr = netif_ip6_addr(netif, 0);
     /* calculate option length (in 8-byte-blocks) */
@@ -945,7 +1213,7 @@
   ns_hdr->code = 0;
   ns_hdr->chksum = 0;
   ns_hdr->reserved = 0;
-  ip6_addr_set(&(ns_hdr->target_address), target_addr);
+  ip6_addr_copy_to_packed(ns_hdr->target_address, *target_addr);
 
   if (lladdr_opt_len != 0) {
     struct lladdr_option *lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct ns_header));
@@ -957,6 +1225,7 @@
   /* Generate the solicited node address for the target address. */
   if (flags & ND6_SEND_FLAG_MULTICAST_DEST) {
     ip6_addr_set_solicitednode(&multicast_address, target_addr->addr[3]);
+    ip6_addr_assign_zone(&multicast_address, IP6_MULTICAST, netif);
     target_addr = &multicast_address;
   }
 
@@ -970,7 +1239,7 @@
   /* Send the packet out. */
   ND6_STATS_INC(nd6.xmit);
   ip6_output_if(p, (src_addr == IP6_ADDR_ANY6) ? NULL : src_addr, target_addr,
-      LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, netif);
+      ND6_HOPLIM, 0, IP6_NEXTH_ICMP6, netif);
   pbuf_free(p);
 }
 
@@ -991,6 +1260,8 @@
   const ip6_addr_t *dest_addr;
   u16_t lladdr_opt_len;
 
+  LWIP_ASSERT("target address is required", target_addr != NULL);
+
   /* Use link-local address as source address. */
   /* src_addr = netif_ip6_addr(netif, 0); */
   /* Use target address as source address. */
@@ -1015,7 +1286,7 @@
   na_hdr->reserved[0] = 0;
   na_hdr->reserved[1] = 0;
   na_hdr->reserved[2] = 0;
-  ip6_addr_set(&(na_hdr->target_address), target_addr);
+  ip6_addr_copy_to_packed(na_hdr->target_address, *target_addr);
 
   lladdr_opt->type = ND6_OPTION_TYPE_TARGET_LLADDR;
   lladdr_opt->length = (u8_t)lladdr_opt_len;
@@ -1024,9 +1295,11 @@
   /* Generate the solicited node address for the target address. */
   if (flags & ND6_SEND_FLAG_MULTICAST_DEST) {
     ip6_addr_set_solicitednode(&multicast_address, target_addr->addr[3]);
+    ip6_addr_assign_zone(&multicast_address, IP6_MULTICAST, netif);
     dest_addr = &multicast_address;
   } else if (flags & ND6_SEND_FLAG_ALLNODES_DEST) {
     ip6_addr_set_allnodes_linklocal(&multicast_address);
+    ip6_addr_assign_zone(&multicast_address, IP6_MULTICAST, netif);
     dest_addr = &multicast_address;
   } else {
     dest_addr = ip6_current_src_addr();
@@ -1042,7 +1315,7 @@
   /* Send the packet out. */
   ND6_STATS_INC(nd6.xmit);
   ip6_output_if(p, src_addr, dest_addr,
-      LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, netif);
+      ND6_HOPLIM, 0, IP6_NEXTH_ICMP6, netif);
   pbuf_free(p);
 }
 
@@ -1071,6 +1344,7 @@
 
   /* Generate the all routers target address. */
   ip6_addr_set_allrouters_linklocal(&multicast_address);
+  ip6_addr_assign_zone(&multicast_address, IP6_MULTICAST, netif);
 
   /* Allocate a packet. */
   if (src_addr != IP6_ADDR_ANY6) {
@@ -1109,7 +1383,7 @@
   ND6_STATS_INC(nd6.xmit);
 
   err = ip6_output_if(p, (src_addr == IP6_ADDR_ANY6) ? NULL : src_addr, &multicast_address,
-      LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, netif);
+      ND6_HOPLIM, 0, IP6_NEXTH_ICMP6, netif);
   pbuf_free(p);
 
   return err;
@@ -1282,10 +1556,13 @@
  * @return The destination cache entry index that matched, -1 if no
  * entry is found
  */
-static s8_t
+static s16_t
 nd6_find_destination_cache_entry(const ip6_addr_t *ip6addr)
 {
-  s8_t i;
+  s16_t i;
+
+  IP6_ADDR_ZONECHECK(ip6addr);
+
   for (i = 0; i < LWIP_ND6_NUM_DESTINATIONS; i++) {
     if (ip6_addr_cmp(ip6addr, &(destination_cache[i].destination_addr))) {
       return i;
@@ -1301,10 +1578,10 @@
  * @return The destination cache entry index that was created, -1 if no
  * entry was created
  */
-static s8_t
+static s16_t
 nd6_new_destination_cache_entry(void)
 {
-  s8_t i, j;
+  s16_t i, j;
   u32_t age;
 
   /* Find an empty entry. */
@@ -1343,15 +1620,18 @@
 }
 
 /**
- * Determine whether an address matches an on-link prefix.
+ * Determine whether an address matches an on-link prefix or the subnet of a
+ * statically assigned address.
  *
  * @param ip6addr the IPv6 address to match
  * @return 1 if the address is on-link, 0 otherwise
  */
-static s8_t
+static int
 nd6_is_prefix_in_netif(const ip6_addr_t *ip6addr, struct netif *netif)
 {
   s8_t i;
+
+  /* Check to see if the address matches an on-link prefix. */
   for (i = 0; i < LWIP_ND6_NUM_PREFIXES; i++) {
     if ((prefix_list[i].netif == netif) &&
         (prefix_list[i].invalidation_timer > 0) &&
@@ -1359,9 +1639,13 @@
       return 1;
     }
   }
-  /* Check to see if address prefix matches a (manually?) configured address. */
+  /* Check to see if address prefix matches a manually configured (= static)
+   * address. Static addresses have an implied /64 subnet assignment. Dynamic
+   * addresses (from autoconfiguration) have no implied subnet assignment, and
+   * are thus effectively /128 assignments. See RFC 5942 for more on this. */
   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))) {
       return 1;
     }
@@ -1372,6 +1656,11 @@
 /**
  * Select a default router for a destination.
  *
+ * This function is used both for routing and for finding a next-hop target for
+ * a packet. In the former case, the given netif is NULL, and the returned
+ * router entry must be for a netif suitable for sending packets (up, link up).
+ * In the latter case, the given netif is not NULL and restricts router choice.
+ *
  * @param ip6addr the destination address
  * @param netif the netif for the outgoing packet, if known
  * @return the default router entry index, or -1 if no suitable
@@ -1380,48 +1669,58 @@
 static s8_t
 nd6_select_router(const ip6_addr_t *ip6addr, struct netif *netif)
 {
-  s8_t i;
-  /* last_router is used for round-robin router selection (as recommended
-   * in RFC). This is more robust in case one router is not reachable,
-   * we are not stuck trying to resolve it. */
+  struct netif *router_netif;
+  s8_t i, j, valid_router;
   static s8_t last_router;
-  (void)ip6addr; /* @todo match preferred routes!! (must implement ND6_OPTION_TYPE_ROUTE_INFO) */
+
+  LWIP_UNUSED_ARG(ip6addr); /* @todo match preferred routes!! (must implement ND6_OPTION_TYPE_ROUTE_INFO) */
 
   /* @todo: implement default router preference */
 
-  /* Look for reachable routers. */
+  /* Look for valid routers. A reachable router is preferred. */
+  valid_router = -1;
   for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) {
-    if (++last_router >= LWIP_ND6_NUM_ROUTERS) {
-      last_router = 0;
-    }
-    if ((default_router_list[i].neighbor_entry != NULL) &&
-        (netif != NULL ? netif == default_router_list[i].neighbor_entry->netif : 1) &&
-        (default_router_list[i].invalidation_timer > 0) &&
-        (default_router_list[i].neighbor_entry->state == ND6_REACHABLE)) {
-      return i;
+    /* Is the router netif both set and apppropriate? */
+    if (default_router_list[i].neighbor_entry != NULL) {
+      router_netif = default_router_list[i].neighbor_entry->netif;
+      if ((router_netif != NULL) && (netif != NULL ? netif == router_netif :
+          (netif_is_up(router_netif) && netif_is_link_up(router_netif)))) {
+        /* Is the router valid, i.e., reachable or probably reachable as per
+         * RFC 4861 Sec. 6.3.6? Note that we will never return a router that
+         * has no neighbor cache entry, due to the netif association tests. */
+        if (default_router_list[i].neighbor_entry->state != ND6_INCOMPLETE) {
+          /* Is the router known to be reachable? */
+          if (default_router_list[i].neighbor_entry->state == ND6_REACHABLE) {
+            return i; /* valid and reachable - done! */
+          } else if (valid_router < 0) {
+            valid_router = i; /* valid but not known to be reachable */
+          }
+        }
+      }
     }
   }
-
-  /* Look for router in other reachability states, but still valid according to timer. */
-  for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) {
-    if (++last_router >= LWIP_ND6_NUM_ROUTERS) {
-      last_router = 0;
-    }
-    if ((default_router_list[i].neighbor_entry != NULL) &&
-        (netif != NULL ? netif == default_router_list[i].neighbor_entry->netif : 1) &&
-        (default_router_list[i].invalidation_timer > 0)) {
-      return i;
-    }
+  if (valid_router >= 0) {
+    return valid_router;
   }
 
   /* Look for any router for which we have any information at all. */
-  for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) {
-    if (++last_router >= LWIP_ND6_NUM_ROUTERS) {
-      last_router = 0;
+  /* last_router is used for round-robin selection of incomplete routers, as
+   * recommended in RFC 4861 Sec. 6.3.6 point (2). Advance only when picking a
+   * route, to select the same router as next-hop target in the common case. */
+  if ((netif == NULL) && (++last_router >= LWIP_ND6_NUM_ROUTERS)) {
+    last_router = 0;
+  }
+  i = last_router;
+  for (j = 0; j < LWIP_ND6_NUM_ROUTERS; j++) {
+    if (default_router_list[i].neighbor_entry != NULL) {
+      router_netif = default_router_list[i].neighbor_entry->netif;
+      if ((router_netif != NULL) && (netif != NULL ? netif == router_netif :
+          (netif_is_up(router_netif) && netif_is_link_up(router_netif)))) {
+        return i;
+      }
     }
-    if (default_router_list[i].neighbor_entry != NULL &&
-        (netif != NULL ? netif == default_router_list[i].neighbor_entry->netif : 1)) {
-      return i;
+    if (++i >= LWIP_ND6_NUM_ROUTERS) {
+      i = 0;
     }
   }
 
@@ -1430,10 +1729,11 @@
 }
 
 /**
- * Find a router-announced route to the given destination.
+ * Find a router-announced route to the given destination. This route may be
+ * based on an on-link prefix or a default router.
  *
- * The caller is responsible for checking whether the returned netif, if any,
- * is in a suitable state (up, link up) to be used for packet transmission.
+ * If a suitable route is found, the returned netif is guaranteed to be in a
+ * suitable state (up, link up) to be used for packet transmission.
  *
  * @param ip6addr the destination IPv6 address
  * @return the netif to use for the destination, or NULL if none found
@@ -1441,13 +1741,27 @@
 struct netif *
 nd6_find_route(const ip6_addr_t *ip6addr)
 {
+  struct netif *netif;
   s8_t i;
 
+  /* @todo decide if it makes sense to check the destination cache first */
+
+  /* Check if there is a matching on-link prefix. There may be multiple
+   * 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) &&
+        netif_is_up(netif) && netif_is_link_up(netif)) {
+      return netif;
+    }
+  }
+
+  /* No on-link prefix match. Find a router that can forward the packet. */
   i = nd6_select_router(ip6addr, NULL);
   if (i >= 0) {
-    if (default_router_list[i].neighbor_entry != NULL) {
-      return default_router_list[i].neighbor_entry->netif; /* may be NULL */
-    }
+    LWIP_ASSERT("selected router must have a neighbor entry",
+      default_router_list[i].neighbor_entry != NULL);
+    return default_router_list[i].neighbor_entry->netif;
   }
 
   return NULL;
@@ -1465,6 +1779,8 @@
 {
   s8_t i;
 
+  IP6_ADDR_ZONECHECK_NETIF(router_addr, netif);
+
   /* Look for router. */
   for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) {
     if ((default_router_list[i].neighbor_entry != NULL) &&
@@ -1492,6 +1808,8 @@
   s8_t free_router_index;
   s8_t neighbor_index;
 
+  IP6_ADDR_ZONECHECK_NETIF(router_addr, netif);
+
   /* Do we have a neighbor entry for this router? */
   neighbor_index = nd6_find_neighbor_cache_entry(router_addr);
   if (neighbor_index < 0) {
@@ -1547,7 +1865,7 @@
  * @return the index on the prefix table, or -1 if not found
  */
 static s8_t
-nd6_get_onlink_prefix(ip6_addr_t *prefix, struct netif *netif)
+nd6_get_onlink_prefix(const ip6_addr_t *prefix, struct netif *netif)
 {
   s8_t i;
 
@@ -1571,7 +1889,7 @@
  * @return the index on the prefix table, or -1 if not created
  */
 static s8_t
-nd6_new_onlink_prefix(ip6_addr_t *prefix, struct netif *netif)
+nd6_new_onlink_prefix(const ip6_addr_t *prefix, struct netif *netif)
 {
   s8_t i;
 
@@ -1582,9 +1900,6 @@
       /* Found empty prefix entry. */
       prefix_list[i].netif = netif;
       ip6_addr_set(&(prefix_list[i].prefix), prefix);
-#if LWIP_IPV6_AUTOCONFIG
-      prefix_list[i].flags = 0;
-#endif /* LWIP_IPV6_AUTOCONFIG */
       return i;
     }
   }
@@ -1612,11 +1927,14 @@
   const ip6_addr_t *next_hop_addr;
 #endif /* LWIP_HOOK_ND6_GET_GW */
   s8_t i;
+  s16_t dst_idx;
+
+  IP6_ADDR_ZONECHECK_NETIF(ip6addr, netif);
 
 #if LWIP_NETIF_HWADDRHINT
-  if (netif->addr_hint != NULL) {
+  if (netif->hints != NULL) {
     /* per-pcb cached entry was given */
-    u8_t addr_hint = *(netif->addr_hint);
+    netif_addr_idx_t addr_hint = netif->hints->addr_hint;
     if (addr_hint < LWIP_ND6_NUM_DESTINATIONS) {
       nd6_cached_destination_index = addr_hint;
     }
@@ -1630,16 +1948,18 @@
     ND6_STATS_INC(nd6.cachehit);
   } else {
     /* Search destination cache. */
-    i = nd6_find_destination_cache_entry(ip6addr);
-    if (i >= 0) {
+    dst_idx = nd6_find_destination_cache_entry(ip6addr);
+    if (dst_idx >= 0) {
       /* found destination entry. make it our new cached index. */
-      nd6_cached_destination_index = i;
+      LWIP_ASSERT("type overflow", (size_t)dst_idx < NETIF_ADDR_IDX_MAX);
+      nd6_cached_destination_index = (netif_addr_idx_t)dst_idx;
     } else {
       /* Not found. Create a new destination entry. */
-      i = nd6_new_destination_cache_entry();
-      if (i >= 0) {
+      dst_idx = nd6_new_destination_cache_entry();
+      if (dst_idx >= 0) {
         /* got new destination entry. make it our new cached index. */
-        nd6_cached_destination_index = i;
+        LWIP_ASSERT("type overflow", (size_t)dst_idx < NETIF_ADDR_IDX_MAX);
+        nd6_cached_destination_index = (netif_addr_idx_t)dst_idx;
       } else {
         /* Could not create a destination cache entry. */
         return ERR_MEM;
@@ -1652,7 +1972,7 @@
       if (ip6_addr_islinklocal(ip6addr) ||
           nd6_is_prefix_in_netif(ip6addr, netif)) {
         /* Destination in local link. */
-        destination_cache[nd6_cached_destination_index].pmtu = netif->mtu;
+        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);
 #ifdef LWIP_HOOK_ND6_GET_GW
       } else if ((next_hop_addr = LWIP_HOOK_ND6_GET_GW(netif, ip6addr)) != NULL) {
@@ -1668,16 +1988,16 @@
           ip6_addr_set_any(&(destination_cache[nd6_cached_destination_index].destination_addr));
           return ERR_RTE;
         }
-        destination_cache[nd6_cached_destination_index].pmtu = netif->mtu; /* Start with netif mtu, correct through ICMPv6 if necessary */
+        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);
       }
     }
   }
 
 #if LWIP_NETIF_HWADDRHINT
-  if (netif->addr_hint != NULL) {
+  if (netif->hints != NULL) {
     /* per-pcb cached entry was given */
-    *(netif->addr_hint) = nd6_cached_destination_index;
+    netif->hints->addr_hint = nd6_cached_destination_index;
   }
 #endif /* LWIP_NETIF_HWADDRHINT */
 
@@ -1741,12 +2061,11 @@
     return ERR_ARG;
   }
 
-  /* IF q includes a PBUF_REF, PBUF_POOL or PBUF_RAM, we have no choice but
-   * to copy the whole queue into a new PBUF_RAM (see bug #11400)
-   * PBUF_ROMs can be left as they are, since ROM must not get changed. */
+  /* IF q includes a pbuf that must be copied, we have to copy the whole chain
+   * into a new PBUF_RAM. See the definition of PBUF_NEEDS_COPY for details. */
   p = q;
   while (p) {
-    if (p->type != PBUF_ROM) {
+    if (PBUF_NEEDS_COPY(p)) {
       copy_needed = 1;
       break;
     }
@@ -1754,7 +2073,7 @@
   }
   if (copy_needed) {
     /* copy the whole packet into new pbufs */
-    p = pbuf_alloc(PBUF_LINK, q->tot_len, PBUF_RAM);
+    p = pbuf_clone(PBUF_LINK, PBUF_RAM, q);
     while ((p == NULL) && (neighbor_cache[neighbor_index].q != NULL)) {
       /* Free oldest packet (as per RFC recommendation) */
 #if LWIP_ND6_QUEUEING
@@ -1766,13 +2085,7 @@
       pbuf_free(neighbor_cache[neighbor_index].q);
       neighbor_cache[neighbor_index].q = NULL;
 #endif /* LWIP_ND6_QUEUEING */
-      p = pbuf_alloc(PBUF_LINK, q->tot_len, PBUF_RAM);
-    }
-    if (p != NULL) {
-      if (pbuf_copy(p, q) != ERR_OK) {
-        pbuf_free(p);
-        p = NULL;
-      }
+      p = pbuf_clone(PBUF_LINK, PBUF_RAM, q);
     }
   } else {
     /* referencing the old pbuf is enough */
@@ -1881,7 +2194,9 @@
     /* Get ipv6 header. */
     ip6hdr = (struct ip6_hdr *)(q->p->payload);
     /* Create an aligned copy. */
-    ip6_addr_set(&dest, &(ip6hdr->dest));
+    ip6_addr_copy_from_packed(dest, ip6hdr->dest);
+    /* Restore the zone, if applicable. */
+    ip6_addr_assign_zone(&dest, IP6_UNKNOWN, neighbor_cache[i].netif);
     /* send the queued IPv6 packet */
     (neighbor_cache[i].netif)->output_ip6(neighbor_cache[i].netif, q->p, &dest);
     /* free the queued IP packet */
@@ -1894,7 +2209,9 @@
     /* Get ipv6 header. */
     ip6hdr = (struct ip6_hdr *)(neighbor_cache[i].q->payload);
     /* Create an aligned copy. */
-    ip6_addr_set(&dest, &(ip6hdr->dest));
+    ip6_addr_copy_from_packed(dest, ip6hdr->dest);
+    /* Restore the zone, if applicable. */
+    ip6_addr_assign_zone(&dest, IP6_UNKNOWN, neighbor_cache[i].netif);
     /* send the queued IPv6 packet */
     (neighbor_cache[i].netif)->output_ip6(neighbor_cache[i].netif, neighbor_cache[i].q, &dest);
     /* free the queued IP packet */
@@ -1970,7 +2287,7 @@
 u16_t
 nd6_get_destination_mtu(const ip6_addr_t *ip6addr, struct netif *netif)
 {
-  s8_t i;
+  s16_t i;
 
   i = nd6_find_destination_cache_entry(ip6addr);
   if (i >= 0) {
@@ -1980,7 +2297,7 @@
   }
 
   if (netif != NULL) {
-    return netif->mtu;
+    return netif_mtu6(netif);
   }
 
   return 1280; /* Minimum MTU */
@@ -2001,24 +2318,25 @@
 nd6_reachability_hint(const ip6_addr_t *ip6addr)
 {
   s8_t i;
+  s16_t dst_idx;
 
   /* Find destination in cache. */
   if (ip6_addr_cmp(ip6addr, &(destination_cache[nd6_cached_destination_index].destination_addr))) {
-    i = nd6_cached_destination_index;
+    dst_idx = nd6_cached_destination_index;
     ND6_STATS_INC(nd6.cachehit);
   } else {
-    i = nd6_find_destination_cache_entry(ip6addr);
+    dst_idx = nd6_find_destination_cache_entry(ip6addr);
   }
-  if (i < 0) {
+  if (dst_idx < 0) {
     return;
   }
 
   /* Find next hop neighbor in cache. */
-  if (ip6_addr_cmp(&(destination_cache[i].next_hop_addr), &(neighbor_cache[nd6_cached_neighbor_index].next_hop_address))) {
+  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;
     ND6_STATS_INC(nd6.cachehit);
   } else {
-    i = nd6_find_neighbor_cache_entry(&(destination_cache[i].next_hop_addr));
+    i = nd6_find_neighbor_cache_entry(&(destination_cache[dst_idx].next_hop_addr));
   }
   if (i < 0) {
     return;
@@ -2048,7 +2366,6 @@
   for (i = 0; i < LWIP_ND6_NUM_PREFIXES; i++) {
     if (prefix_list[i].netif == netif) {
       prefix_list[i].netif = NULL;
-      prefix_list[i].flags = 0;
     }
   }
   for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {
@@ -2063,6 +2380,10 @@
       nd6_free_neighbor_cache_entry(i);
     }
   }
+  /* Clear the destination cache, since many entries may now have become
+   * invalid for one of several reasons. As destination cache entries have no
+   * netif association, use a sledgehammer approach (this can be improved). */
+  nd6_clear_destination_cache();
 }
 
 #if LWIP_IPV6_MLD
@@ -2084,11 +2405,12 @@
   /* Determine whether we were, and should be, a member of the solicited-node
    * multicast group for this address. For tentative addresses, the group is
    * not joined until the address enters the TENTATIVE_1 (or VALID) state. */
-  old_member = (old_state != IP6_ADDR_INVALID && old_state != IP6_ADDR_TENTATIVE);
-  new_member = (new_state != IP6_ADDR_INVALID && new_state != IP6_ADDR_TENTATIVE);
+  old_member = (old_state != IP6_ADDR_INVALID && old_state != IP6_ADDR_DUPLICATED && old_state != IP6_ADDR_TENTATIVE);
+  new_member = (new_state != IP6_ADDR_INVALID && new_state != IP6_ADDR_DUPLICATED && new_state != IP6_ADDR_TENTATIVE);
 
   if (old_member != new_member) {
     ip6_addr_set_solicitednode(&multicast_address, netif_ip6_addr(netif, addr_idx)->addr[3]);
+    ip6_addr_assign_zone(&multicast_address, IP6_MULTICAST, netif);
 
     if (new_member) {
       mld6_joingroup_netif(netif, &multicast_address);
@@ -2099,4 +2421,14 @@
 }
 #endif /* LWIP_IPV6_MLD */
 
+/** Netif was added, set up, or reconnected (link up) */
+void
+nd6_restart_netif(struct netif *netif)
+{
+#if LWIP_IPV6_SEND_ROUTER_SOLICIT
+  /* Send Router Solicitation messages (see RFC 4861, ch. 6.3.7). */
+  netif->rs_count = LWIP_ND6_MAX_MULTICAST_SOLICIT;
+#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */
+}
+
 #endif /* LWIP_IPV6 */
diff --git a/src/core/mem.c b/src/core/mem.c
index db3b7cc..315fb3c 100644
--- a/src/core/mem.c
+++ b/src/core/mem.c
@@ -66,6 +66,91 @@
 #include <stdlib.h> /* for malloc()/free() */
 #endif
 
+/* This is overridable for tests only... */
+#ifndef LWIP_MEM_ILLEGAL_FREE
+#define LWIP_MEM_ILLEGAL_FREE(msg)         LWIP_ASSERT(msg, 0)
+#endif
+
+#define MEM_STATS_INC_LOCKED(x)         SYS_ARCH_LOCKED(MEM_STATS_INC(x))
+#define MEM_STATS_INC_USED_LOCKED(x, y) SYS_ARCH_LOCKED(MEM_STATS_INC_USED(x, y))
+#define MEM_STATS_DEC_USED_LOCKED(x, y) SYS_ARCH_LOCKED(MEM_STATS_DEC_USED(x, y))
+
+#if MEM_OVERFLOW_CHECK
+#define MEM_SANITY_OFFSET   MEM_SANITY_REGION_BEFORE_ALIGNED
+#define MEM_SANITY_OVERHEAD (MEM_SANITY_REGION_BEFORE_ALIGNED + MEM_SANITY_REGION_AFTER_ALIGNED)
+#else
+#define MEM_SANITY_OFFSET   0
+#define MEM_SANITY_OVERHEAD 0
+#endif
+
+#if MEM_OVERFLOW_CHECK || MEMP_OVERFLOW_CHECK
+/**
+ * Check if a mep element was victim of an overflow or underflow
+ * (e.g. the restricted area after/before it has been altered)
+ *
+ * @param p the mem element to check
+ * @param size allocated size of the element
+ * @param descr1 description of the element source shown on error
+ * @param descr2 description of the element source shown on error
+ */
+void
+mem_overflow_check_raw(void *p, size_t size, const char *descr1, const char *descr2)
+{
+#if MEM_SANITY_REGION_AFTER_ALIGNED || MEM_SANITY_REGION_BEFORE_ALIGNED
+  u16_t k;
+  u8_t *m;
+
+#if MEM_SANITY_REGION_AFTER_ALIGNED > 0
+  m = (u8_t *)p + size;
+  for (k = 0; k < MEM_SANITY_REGION_AFTER_ALIGNED; k++) {
+    if (m[k] != 0xcd) {
+      char errstr[128];
+      snprintf(errstr, sizeof(errstr), "detected mem overflow in %s%s", descr1, descr2);
+      LWIP_ASSERT(errstr, 0);
+    }
+  }
+#endif /* MEM_SANITY_REGION_AFTER_ALIGNED > 0 */
+
+#if MEM_SANITY_REGION_BEFORE_ALIGNED > 0
+  m = (u8_t *)p - MEM_SANITY_REGION_BEFORE_ALIGNED;
+  for (k = 0; k < MEM_SANITY_REGION_BEFORE_ALIGNED; k++) {
+    if (m[k] != 0xcd) {
+      char errstr[128];
+      snprintf(errstr, sizeof(errstr), "detected mem underflow in %s%s", descr1, descr2);
+      LWIP_ASSERT(errstr, 0);
+    }
+  }
+#endif /* MEM_SANITY_REGION_BEFORE_ALIGNED > 0 */
+#else
+  LWIP_UNUSED_ARG(p);
+  LWIP_UNUSED_ARG(desc);
+  LWIP_UNUSED_ARG(descr);
+#endif
+}
+
+/**
+ * Initialize the restricted area of a mem element.
+ */
+void
+mem_overflow_init_raw(void *p, size_t size)
+{
+#if MEM_SANITY_REGION_BEFORE_ALIGNED > 0 || MEM_SANITY_REGION_AFTER_ALIGNED > 0
+  u8_t *m;
+#if MEM_SANITY_REGION_BEFORE_ALIGNED > 0
+  m = (u8_t *)p - MEM_SANITY_REGION_BEFORE_ALIGNED;
+  memset(m, 0xcd, MEM_SANITY_REGION_BEFORE_ALIGNED);
+#endif
+#if MEM_SANITY_REGION_AFTER_ALIGNED > 0
+  m = (u8_t *)p + size;
+  memset(m, 0xcd, MEM_SANITY_REGION_AFTER_ALIGNED);
+#endif
+#else /* MEM_SANITY_REGION_BEFORE_ALIGNED > 0 || MEM_SANITY_REGION_AFTER_ALIGNED > 0 */
+  LWIP_UNUSED_ARG(p);
+  LWIP_UNUSED_ARG(desc);
+#endif /* MEM_SANITY_REGION_BEFORE_ALIGNED > 0 || MEM_SANITY_REGION_AFTER_ALIGNED > 0 */
+}
+#endif /* MEM_OVERFLOW_CHECK || MEMP_OVERFLOW_CHECK */
+
 #if MEM_LIBC_MALLOC || MEM_USE_POOLS
 
 /** mem_init is not used when using pools instead of a heap or using
@@ -80,7 +165,7 @@
  * C library malloc(): we can't free part of a pool element and the stack
  * support mem_trim() to return a different pointer
  */
-void*
+void *
 mem_trim(void *mem, mem_size_t size)
 {
   LWIP_UNUSED_ARG(size);
@@ -121,15 +206,15 @@
 void *
 mem_malloc(mem_size_t size)
 {
-  void* ret = mem_clib_malloc(size + MEM_LIBC_STATSHELPER_SIZE);
+  void *ret = mem_clib_malloc(size + MEM_LIBC_STATSHELPER_SIZE);
   if (ret == NULL) {
-    MEM_STATS_INC(err);
+    MEM_STATS_INC_LOCKED(err);
   } else {
     LWIP_ASSERT("malloc() must return aligned memory", LWIP_MEM_ALIGN(ret) == ret);
 #if LWIP_STATS && MEM_STATS
-    *(mem_size_t*)ret = size;
-    ret = (u8_t*)ret + MEM_LIBC_STATSHELPER_SIZE;
-    MEM_STATS_INC_USED(used, size);
+    *(mem_size_t *)ret = size;
+    ret = (u8_t *)ret + MEM_LIBC_STATSHELPER_SIZE;
+    MEM_STATS_INC_USED_LOCKED(used, size);
 #endif
   }
   return ret;
@@ -145,8 +230,8 @@
   LWIP_ASSERT("rmem != NULL", (rmem != NULL));
   LWIP_ASSERT("rmem == MEM_ALIGN(rmem)", (rmem == LWIP_MEM_ALIGN(rmem)));
 #if LWIP_STATS && MEM_STATS
-  rmem = (u8_t*)rmem - MEM_LIBC_STATSHELPER_SIZE;
-  MEM_STATS_DEC_USED(used, *(mem_size_t*)rmem);
+  rmem = (u8_t *)rmem - MEM_LIBC_STATSHELPER_SIZE;
+  MEM_STATS_DEC_USED_LOCKED(used, *(mem_size_t *)rmem);
 #endif
   mem_clib_free(rmem);
 }
@@ -174,7 +259,7 @@
     /* is this pool big enough to hold an element of the required size
        plus a struct memp_malloc_helper that saves the pool this element came from? */
     if (required_size <= memp_pools[poolnr]->size) {
-      element = (struct memp_malloc_helper*)memp_malloc(poolnr);
+      element = (struct memp_malloc_helper *)memp_malloc(poolnr);
       if (element == NULL) {
         /* No need to DEBUGF or ASSERT: This error is already taken care of in memp.c */
 #if MEM_USE_POOLS_TRY_BIGGER_POOL
@@ -183,7 +268,7 @@
           continue;
         }
 #endif /* MEM_USE_POOLS_TRY_BIGGER_POOL */
-        MEM_STATS_INC(err);
+        MEM_STATS_INC_LOCKED(err);
         return NULL;
       }
       break;
@@ -191,23 +276,23 @@
   }
   if (poolnr > MEMP_POOL_LAST) {
     LWIP_ASSERT("mem_malloc(): no pool is that big!", 0);
-    MEM_STATS_INC(err);
+    MEM_STATS_INC_LOCKED(err);
     return NULL;
   }
 
   /* save the pool number this element came from */
   element->poolnr = poolnr;
   /* and return a pointer to the memory directly after the struct memp_malloc_helper */
-  ret = (u8_t*)element + LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper));
+  ret = (u8_t *)element + LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper));
 
 #if MEMP_OVERFLOW_CHECK || (LWIP_STATS && MEM_STATS)
   /* truncating to u16_t is safe because struct memp_desc::size is u16_t */
   element->size = (u16_t)size;
-  MEM_STATS_INC_USED(used, element->size);
+  MEM_STATS_INC_USED_LOCKED(used, element->size);
 #endif /* MEMP_OVERFLOW_CHECK || (LWIP_STATS && MEM_STATS) */
 #if MEMP_OVERFLOW_CHECK
   /* initialize unused memory (diff between requested size and selected pool's size) */
-  memset((u8_t*)ret + size, 0xcd, memp_pools[poolnr]->size - size);
+  memset((u8_t *)ret + size, 0xcd, memp_pools[poolnr]->size - size);
 #endif /* MEMP_OVERFLOW_CHECK */
   return ret;
 }
@@ -229,23 +314,23 @@
 
   /* get the original struct memp_malloc_helper */
   /* cast through void* to get rid of alignment warnings */
-  hmem = (struct memp_malloc_helper*)(void*)((u8_t*)rmem - LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper)));
+  hmem = (struct memp_malloc_helper *)(void *)((u8_t *)rmem - LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper)));
 
   LWIP_ASSERT("hmem != NULL", (hmem != NULL));
   LWIP_ASSERT("hmem == MEM_ALIGN(hmem)", (hmem == LWIP_MEM_ALIGN(hmem)));
   LWIP_ASSERT("hmem->poolnr < MEMP_MAX", (hmem->poolnr < MEMP_MAX));
 
-  MEM_STATS_DEC_USED(used, hmem->size);
+  MEM_STATS_DEC_USED_LOCKED(used, hmem->size);
 #if MEMP_OVERFLOW_CHECK
   {
-     u16_t i;
-     LWIP_ASSERT("MEM_USE_POOLS: invalid chunk size",
-        hmem->size <= memp_pools[hmem->poolnr]->size);
-     /* check that unused memory remained untouched (diff between requested size and selected pool's size) */
-     for (i = hmem->size; i < memp_pools[hmem->poolnr]->size; i++) {
-        u8_t data = *((u8_t*)rmem + i);
-        LWIP_ASSERT("MEM_USE_POOLS: mem overflow detected", data == 0xcd);
-     }
+    u16_t i;
+    LWIP_ASSERT("MEM_USE_POOLS: invalid chunk size",
+                hmem->size <= memp_pools[hmem->poolnr]->size);
+    /* check that unused memory remained untouched (diff between requested size and selected pool's size) */
+    for (i = hmem->size; i < memp_pools[hmem->poolnr]->size; i++) {
+      u8_t data = *((u8_t *)rmem + i);
+      LWIP_ASSERT("MEM_USE_POOLS: mem overflow detected", data == 0xcd);
+    }
   }
 #endif /* MEMP_OVERFLOW_CHECK */
 
@@ -268,6 +353,10 @@
   mem_size_t prev;
   /** 1: this area is used; 0: this area is unused */
   u8_t used;
+#if MEM_OVERFLOW_CHECK
+  /** this keeps track of the user allocation size for guard checks */
+  mem_size_t user_size;
+#endif
 };
 
 /** All allocated blocks will be MIN_SIZE bytes big, at least!
@@ -287,7 +376,7 @@
  * how that space is calculated). */
 #ifndef LWIP_RAM_HEAP_POINTER
 /** the heap. we need one struct mem at the end and some room for alignment */
-LWIP_DECLARE_MEMORY_ALIGNED(ram_heap, MEM_SIZE_ALIGNED + (2U*SIZEOF_STRUCT_MEM));
+LWIP_DECLARE_MEMORY_ALIGNED(ram_heap, MEM_SIZE_ALIGNED + (2U * SIZEOF_STRUCT_MEM));
 #define LWIP_RAM_HEAP_POINTER ram_heap
 #endif /* LWIP_RAM_HEAP_POINTER */
 
@@ -295,8 +384,6 @@
 static u8_t *ram;
 /** the last entry, always unused! */
 static struct mem *ram_end;
-/** pointer to the lowest free block, this is used for faster search */
-static struct mem *lfree;
 
 /** concurrent access protection */
 #if !NO_SYS
@@ -314,20 +401,63 @@
 #define LWIP_MEM_ALLOC_DECL_PROTECT() SYS_ARCH_DECL_PROTECT(lev_alloc)
 #define LWIP_MEM_ALLOC_PROTECT()      SYS_ARCH_PROTECT(lev_alloc)
 #define LWIP_MEM_ALLOC_UNPROTECT()    SYS_ARCH_UNPROTECT(lev_alloc)
+#define LWIP_MEM_LFREE_VOLATILE       volatile
 
 #else /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
 
-/* Protect the heap only by using a semaphore */
+/* Protect the heap only by using a mutex */
 #define LWIP_MEM_FREE_DECL_PROTECT()
 #define LWIP_MEM_FREE_PROTECT()    sys_mutex_lock(&mem_mutex)
 #define LWIP_MEM_FREE_UNPROTECT()  sys_mutex_unlock(&mem_mutex)
-/* mem_malloc is protected using semaphore AND LWIP_MEM_ALLOC_PROTECT */
+/* mem_malloc is protected using mutex AND LWIP_MEM_ALLOC_PROTECT */
 #define LWIP_MEM_ALLOC_DECL_PROTECT()
 #define LWIP_MEM_ALLOC_PROTECT()
 #define LWIP_MEM_ALLOC_UNPROTECT()
+#define LWIP_MEM_LFREE_VOLATILE
 
 #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
 
+/** pointer to the lowest free block, this is used for faster search */
+static struct mem * LWIP_MEM_LFREE_VOLATILE lfree;
+
+#if MEM_SANITY_CHECK
+static void mem_sanity(void);
+#define MEM_SANITY() mem_sanity()
+#else
+#define MEM_SANITY()
+#endif
+
+#if MEM_OVERFLOW_CHECK
+static void
+mem_overflow_init_element(struct mem *mem, mem_size_t user_size)
+{
+  void *p = (u8_t *)mem + SIZEOF_STRUCT_MEM + MEM_SANITY_OFFSET;
+  mem->user_size = user_size;
+  mem_overflow_init_raw(p, user_size);
+}
+
+static void
+mem_overflow_check_element(struct mem *mem)
+{
+  void *p = (u8_t *)mem + SIZEOF_STRUCT_MEM + MEM_SANITY_OFFSET;
+  mem_overflow_check_raw(p, mem->user_size, "heap", "");
+}
+#else /* MEM_OVERFLOW_CHECK */
+#define mem_overflow_init_element(mem, size)
+#define mem_overflow_check_element(mem)
+#endif /* MEM_OVERFLOW_CHECK */
+
+static struct mem *
+ptr_to_mem(mem_size_t ptr)
+{
+  return (struct mem *)(void *)&ram[ptr];
+}
+
+static mem_size_t
+mem_to_ptr(void *mem)
+{
+  return (mem_size_t)((u8_t *)mem - ram);
+}
 
 /**
  * "Plug holes" by combining adjacent empty struct mems.
@@ -353,25 +483,29 @@
   /* plug hole forward */
   LWIP_ASSERT("plug_holes: mem->next <= MEM_SIZE_ALIGNED", mem->next <= MEM_SIZE_ALIGNED);
 
-  nmem = (struct mem *)(void *)&ram[mem->next];
+  nmem = ptr_to_mem(mem->next);
   if (mem != nmem && nmem->used == 0 && (u8_t *)nmem != (u8_t *)ram_end) {
     /* if mem->next is unused and not end of ram, combine mem and mem->next */
     if (lfree == nmem) {
       lfree = mem;
     }
     mem->next = nmem->next;
-    ((struct mem *)(void *)&ram[nmem->next])->prev = (mem_size_t)((u8_t *)mem - ram);
+    if (nmem->next != MEM_SIZE_ALIGNED) {
+      ptr_to_mem(nmem->next)->prev = mem_to_ptr(mem);
+    }
   }
 
   /* plug hole backward */
-  pmem = (struct mem *)(void *)&ram[mem->prev];
+  pmem = ptr_to_mem(mem->prev);
   if (pmem != mem && pmem->used == 0) {
     /* if mem->prev is unused, combine mem and mem->prev */
     if (lfree == mem) {
       lfree = pmem;
     }
     pmem->next = mem->next;
-    ((struct mem *)(void *)&ram[mem->next])->prev = (mem_size_t)((u8_t *)pmem - ram);
+    if (mem->next != MEM_SIZE_ALIGNED) {
+      ptr_to_mem(mem->next)->prev = mem_to_ptr(pmem);
+    }
   }
 }
 
@@ -384,7 +518,7 @@
   struct mem *mem;
 
   LWIP_ASSERT("Sanity check alignment",
-    (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT-1)) == 0);
+              (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT - 1)) == 0);
 
   /* align the heap */
   ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);
@@ -394,10 +528,11 @@
   mem->prev = 0;
   mem->used = 0;
   /* initialize the end of the heap */
-  ram_end = (struct mem *)(void *)&ram[MEM_SIZE_ALIGNED];
+  ram_end = ptr_to_mem(MEM_SIZE_ALIGNED);
   ram_end->used = 1;
   ram_end->next = MEM_SIZE_ALIGNED;
   ram_end->prev = MEM_SIZE_ALIGNED;
+  MEM_SANITY();
 
   /* initialize the lowest-free pointer to the start of the heap */
   lfree = (struct mem *)(void *)ram;
@@ -409,6 +544,69 @@
   }
 }
 
+/* Check if a struct mem is correctly linked.
+ * If not, double-free is a possible reason.
+ */
+static int
+mem_link_valid(struct mem *mem)
+{
+  struct mem *nmem, *pmem;
+  mem_size_t rmem_idx;
+  rmem_idx = mem_to_ptr(mem);
+  nmem = ptr_to_mem(mem->next);
+  pmem = ptr_to_mem(mem->prev);
+  if ((mem->next > MEM_SIZE_ALIGNED) || (mem->prev > MEM_SIZE_ALIGNED) ||
+      ((mem->prev != rmem_idx) && (pmem->next != rmem_idx)) ||
+      ((nmem != ram_end) && (nmem->prev != rmem_idx))) {
+    return 0;
+  }
+  return 1;
+}
+
+#if MEM_SANITY_CHECK
+static void
+mem_sanity(void)
+{
+  struct mem *mem;
+  u8_t last_used;
+
+  /* begin with first element here */
+  mem = (struct mem *)ram;
+  LWIP_ASSERT("heap element used valid", (mem->used == 0) || (mem->used == 1));
+  last_used = mem->used;
+  LWIP_ASSERT("heap element prev ptr valid", mem->prev == 0);
+  LWIP_ASSERT("heap element next ptr valid", mem->next <= MEM_SIZE_ALIGNED);
+  LWIP_ASSERT("heap element next ptr aligned", LWIP_MEM_ALIGN(ptr_to_mem(mem->next) == ptr_to_mem(mem->next)));
+
+  /* check all elements before the end of the heap */
+  for (mem = ptr_to_mem(mem->next);
+       ((u8_t *)mem > ram) && (mem < ram_end);
+       mem = ptr_to_mem(mem->next)) {
+    LWIP_ASSERT("heap element aligned", LWIP_MEM_ALIGN(mem) == mem);
+    LWIP_ASSERT("heap element prev ptr valid", mem->prev <= MEM_SIZE_ALIGNED);
+    LWIP_ASSERT("heap element next ptr valid", mem->next <= MEM_SIZE_ALIGNED);
+    LWIP_ASSERT("heap element prev ptr aligned", LWIP_MEM_ALIGN(ptr_to_mem(mem->prev) == ptr_to_mem(mem->prev)));
+    LWIP_ASSERT("heap element next ptr aligned", LWIP_MEM_ALIGN(ptr_to_mem(mem->next) == ptr_to_mem(mem->next)));
+
+    if (last_used == 0) {
+      /* 2 unused elements in a row? */
+      LWIP_ASSERT("heap element unused?", mem->used == 1);
+    } else {
+      LWIP_ASSERT("heap element unused member", (mem->used == 0) || (mem->used == 1));
+    }
+
+    LWIP_ASSERT("heap element link valid", mem_link_valid(mem));
+
+    /* used/unused altering */
+    last_used = mem->used;
+  }
+  LWIP_ASSERT("heap end ptr sanity", mem == ptr_to_mem(MEM_SIZE_ALIGNED));
+  LWIP_ASSERT("heap element used valid", mem->used == 1);
+  LWIP_ASSERT("heap element prev ptr valid", mem->prev == MEM_SIZE_ALIGNED);
+  LWIP_ASSERT("heap element next ptr valid", mem->next == MEM_SIZE_ALIGNED);
+}
+#endif /* MEM_SANITY_CHECK */
+
 /**
  * Put a struct mem back on the heap
  *
@@ -425,28 +623,50 @@
     LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("mem_free(p == NULL) was called.\n"));
     return;
   }
-  LWIP_ASSERT("mem_free: sanity check alignment", (((mem_ptr_t)rmem) & (MEM_ALIGNMENT-1)) == 0);
-
-  LWIP_ASSERT("mem_free: legal memory", (u8_t *)rmem >= (u8_t *)ram &&
-    (u8_t *)rmem < (u8_t *)ram_end);
-
-  if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) {
-    SYS_ARCH_DECL_PROTECT(lev);
-    LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory\n"));
+  if ((((mem_ptr_t)rmem) & (MEM_ALIGNMENT - 1)) != 0) {
+    LWIP_MEM_ILLEGAL_FREE("mem_free: sanity check alignment");
+    LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: sanity check alignment\n"));
     /* protect mem stats from concurrent access */
-    SYS_ARCH_PROTECT(lev);
-    MEM_STATS_INC(illegal);
-    SYS_ARCH_UNPROTECT(lev);
+    MEM_STATS_INC_LOCKED(illegal);
     return;
   }
+
+  /* Get the corresponding struct mem: */
+  /* cast through void* to get rid of alignment warnings */
+  mem = (struct mem *)(void *)((u8_t *)rmem - (SIZEOF_STRUCT_MEM + MEM_SANITY_OFFSET));
+
+  if ((u8_t *)mem < ram || (u8_t *)rmem + MIN_SIZE_ALIGNED > (u8_t *)ram_end) {
+    LWIP_MEM_ILLEGAL_FREE("mem_free: illegal memory");
+    LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory\n"));
+    /* protect mem stats from concurrent access */
+    MEM_STATS_INC_LOCKED(illegal);
+    return;
+  }
+#if MEM_OVERFLOW_CHECK
+  mem_overflow_check_element(mem);
+#endif
   /* protect the heap from concurrent access */
   LWIP_MEM_FREE_PROTECT();
-  /* Get the corresponding struct mem ... */
-  /* cast through void* to get rid of alignment warnings */
-  mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
-  /* ... which has to be in a used state ... */
-  LWIP_ASSERT("mem_free: mem->used", mem->used);
-  /* ... and is now unused. */
+  /* mem has to be in a used state */
+  if (!mem->used) {
+    LWIP_MEM_ILLEGAL_FREE("mem_free: illegal memory: double free");
+    LWIP_MEM_FREE_UNPROTECT();
+    LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory: double free?\n"));
+    /* protect mem stats from concurrent access */
+    MEM_STATS_INC_LOCKED(illegal);
+    return;
+  }
+
+  if (!mem_link_valid(mem)) {
+    LWIP_MEM_ILLEGAL_FREE("mem_free: illegal memory: non-linked: double free");
+    LWIP_MEM_FREE_UNPROTECT();
+    LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory: non-linked: double free?\n"));
+    /* protect mem stats from concurrent access */
+    MEM_STATS_INC_LOCKED(illegal);
+    return;
+  }
+
+  /* mem is now unused. */
   mem->used = 0;
 
   if (mem < lfree) {
@@ -458,6 +678,7 @@
 
   /* finally, see if prev or next are free also */
   plug_holes(mem);
+  MEM_SANITY();
 #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
   mem_free_count = 1;
 #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
@@ -468,16 +689,16 @@
  * Shrink memory returned by mem_malloc().
  *
  * @param rmem pointer to memory allocated by mem_malloc the is to be shrinked
- * @param newsize required size after shrinking (needs to be smaller than or
+ * @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
  *         or NULL if newsize is > old size, in which case rmem is NOT touched
  *         or freed!
  */
 void *
-mem_trim(void *rmem, mem_size_t newsize)
+mem_trim(void *rmem, mem_size_t new_size)
 {
-  mem_size_t size;
+  mem_size_t size, newsize;
   mem_size_t ptr, ptr2;
   struct mem *mem, *mem2;
   /* use the FREE_PROTECT here: it protects with sem OR SYS_ARCH_PROTECT */
@@ -485,36 +706,37 @@
 
   /* Expand the size of the allocated memory region so that we can
      adjust for alignment. */
-  newsize = LWIP_MEM_ALIGN_SIZE(newsize);
-
+  newsize = (mem_size_t)LWIP_MEM_ALIGN_SIZE(new_size);
   if (newsize < MIN_SIZE_ALIGNED) {
     /* every data block must be at least MIN_SIZE_ALIGNED long */
     newsize = MIN_SIZE_ALIGNED;
   }
-
-  if (newsize > MEM_SIZE_ALIGNED) {
+#if MEM_OVERFLOW_CHECK
+  newsize += MEM_SANITY_REGION_BEFORE_ALIGNED + MEM_SANITY_REGION_AFTER_ALIGNED;
+#endif
+  if ((newsize > MEM_SIZE_ALIGNED) || (newsize < new_size)) {
     return NULL;
   }
 
   LWIP_ASSERT("mem_trim: legal memory", (u8_t *)rmem >= (u8_t *)ram &&
-   (u8_t *)rmem < (u8_t *)ram_end);
+              (u8_t *)rmem < (u8_t *)ram_end);
 
   if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) {
-    SYS_ARCH_DECL_PROTECT(lev);
     LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_trim: illegal memory\n"));
     /* protect mem stats from concurrent access */
-    SYS_ARCH_PROTECT(lev);
-    MEM_STATS_INC(illegal);
-    SYS_ARCH_UNPROTECT(lev);
+    MEM_STATS_INC_LOCKED(illegal);
     return rmem;
   }
   /* Get the corresponding struct mem ... */
   /* cast through void* to get rid of alignment warnings */
-  mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
+  mem = (struct mem *)(void *)((u8_t *)rmem - (SIZEOF_STRUCT_MEM + MEM_SANITY_OFFSET));
+#if MEM_OVERFLOW_CHECK
+  mem_overflow_check_element(mem);
+#endif
   /* ... and its offset pointer */
-  ptr = (mem_size_t)((u8_t *)mem - ram);
+  ptr = mem_to_ptr(mem);
 
-  size = mem->next - ptr - SIZEOF_STRUCT_MEM;
+  size = (mem_size_t)((mem_size_t)(mem->next - ptr) - (SIZEOF_STRUCT_MEM + MEM_SANITY_OVERHEAD));
   LWIP_ASSERT("mem_trim can only shrink memory", newsize <= size);
   if (newsize > size) {
     /* not supported */
@@ -528,18 +750,19 @@
   /* protect the heap from concurrent access */
   LWIP_MEM_FREE_PROTECT();
 
-  mem2 = (struct mem *)(void *)&ram[mem->next];
+  mem2 = ptr_to_mem(mem->next);
   if (mem2->used == 0) {
     /* The next struct is unused, we can simply move it at little */
     mem_size_t next;
+    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 */
-    ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
+    ptr2 = (mem_size_t)(ptr + SIZEOF_STRUCT_MEM + newsize);
     if (lfree == mem2) {
-      lfree = (struct mem *)(void *)&ram[ptr2];
+      lfree = ptr_to_mem(ptr2);
     }
-    mem2 = (struct mem *)(void *)&ram[ptr2];
+    mem2 = ptr_to_mem(ptr2);
     mem2->used = 0;
     /* restore the next pointer */
     mem2->next = next;
@@ -551,7 +774,7 @@
      * let 'mem2->next->prev' point to mem2 again. but only if mem2->next is not
      * the end of the heap */
     if (mem2->next != MEM_SIZE_ALIGNED) {
-      ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2;
+      ptr_to_mem(mem2->next)->prev = ptr2;
     }
     MEM_STATS_DEC_USED(used, (size - newsize));
     /* no need to plug holes, we've already done that */
@@ -563,8 +786,9 @@
      * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
      *       region that couldn't hold data, but when mem->next gets freed,
      *       the 2 regions would be combined, resulting in more free memory */
-    ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
-    mem2 = (struct mem *)(void *)&ram[ptr2];
+    ptr2 = (mem_size_t)(ptr + SIZEOF_STRUCT_MEM + newsize);
+    LWIP_ASSERT("invalid next ptr", mem->next != MEM_SIZE_ALIGNED);
+    mem2 = ptr_to_mem(ptr2);
     if (mem2 < lfree) {
       lfree = mem2;
     }
@@ -573,7 +797,7 @@
     mem2->prev = ptr;
     mem->next = ptr2;
     if (mem2->next != MEM_SIZE_ALIGNED) {
-      ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2;
+      ptr_to_mem(mem2->next)->prev = ptr2;
     }
     MEM_STATS_DEC_USED(used, (size - newsize));
     /* the original mem->next is used, so no need to plug holes! */
@@ -584,6 +808,10 @@
     -> don't do anyhting.
     -> the remaining space stays unused since it is too small
   } */
+#if MEM_OVERFLOW_CHECK
+  mem_overflow_init_element(mem, new_size);
+#endif
+  MEM_SANITY();
 #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
   mem_free_count = 1;
 #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
@@ -594,35 +822,36 @@
 /**
  * Allocate a block of memory with a minimum of 'size' bytes.
  *
- * @param size is the minimum size of the requested block in bytes.
+ * @param size_in is the minimum size of the requested block in bytes.
  * @return pointer to allocated memory or NULL if no free memory was found.
  *
  * Note that the returned value will always be aligned (as defined by MEM_ALIGNMENT).
  */
 void *
-mem_malloc(mem_size_t size)
+mem_malloc(mem_size_t size_in)
 {
-  mem_size_t ptr, ptr2;
+  mem_size_t ptr, ptr2, size;
   struct mem *mem, *mem2;
 #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
   u8_t local_mem_free_count = 0;
 #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
   LWIP_MEM_ALLOC_DECL_PROTECT();
 
-  if (size == 0) {
+  if (size_in == 0) {
     return NULL;
   }
 
   /* Expand the size of the allocated memory region so that we can
      adjust for alignment. */
-  size = LWIP_MEM_ALIGN_SIZE(size);
-
+  size = (mem_size_t)LWIP_MEM_ALIGN_SIZE(size_in);
   if (size < MIN_SIZE_ALIGNED) {
     /* every data block must be at least MIN_SIZE_ALIGNED long */
     size = MIN_SIZE_ALIGNED;
   }
-
-  if (size > MEM_SIZE_ALIGNED) {
+#if MEM_OVERFLOW_CHECK
+  size += MEM_SANITY_REGION_BEFORE_ALIGNED + MEM_SANITY_REGION_AFTER_ALIGNED;
+#endif
+  if ((size > MEM_SIZE_ALIGNED) || (size < size_in)) {
     return NULL;
   }
 
@@ -638,9 +867,9 @@
     /* Scan through the heap searching for a free block that is big enough,
      * beginning with the lowest free block.
      */
-    for (ptr = (mem_size_t)((u8_t *)lfree - ram); ptr < MEM_SIZE_ALIGNED - size;
-         ptr = ((struct mem *)(void *)&ram[ptr])->next) {
-      mem = (struct mem *)(void *)&ram[ptr];
+    for (ptr = mem_to_ptr(lfree); ptr < MEM_SIZE_ALIGNED - size;
+         ptr = ptr_to_mem(ptr)->next) {
+      mem = ptr_to_mem(ptr);
 #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
       mem_free_count = 0;
       LWIP_MEM_ALLOC_UNPROTECT();
@@ -670,9 +899,10 @@
            *       region that couldn't hold data, but when mem->next gets freed,
            *       the 2 regions would be combined, resulting in more free memory
            */
-          ptr2 = ptr + SIZEOF_STRUCT_MEM + size;
+          ptr2 = (mem_size_t)(ptr + SIZEOF_STRUCT_MEM + size);
+          LWIP_ASSERT("invalid next ptr",ptr2 != MEM_SIZE_ALIGNED);
           /* create mem2 struct */
-          mem2 = (struct mem *)(void *)&ram[ptr2];
+          mem2 = ptr_to_mem(ptr2);
           mem2->used = 0;
           mem2->next = mem->next;
           mem2->prev = ptr;
@@ -681,7 +911,7 @@
           mem->used = 1;
 
           if (mem2->next != MEM_SIZE_ALIGNED) {
-            ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2;
+            ptr_to_mem(mem2->next)->prev = ptr2;
           }
           MEM_STATS_INC_USED(used, (size + SIZEOF_STRUCT_MEM));
         } else {
@@ -693,7 +923,7 @@
            * will always be used at this point!
            */
           mem->used = 1;
-          MEM_STATS_INC_USED(used, mem->next - (mem_size_t)((u8_t *)mem - ram));
+          MEM_STATS_INC_USED(used, mem->next - mem_to_ptr(mem));
         }
 #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
 mem_malloc_adjust_lfree:
@@ -713,7 +943,7 @@
               goto mem_malloc_adjust_lfree;
             }
 #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
-            cur = (struct mem *)(void *)&ram[cur->next];
+            cur = ptr_to_mem(cur->next);
           }
           lfree = cur;
           LWIP_ASSERT("mem_malloc: !lfree->used", ((lfree == ram_end) || (!lfree->used)));
@@ -721,23 +951,27 @@
         LWIP_MEM_ALLOC_UNPROTECT();
         sys_mutex_unlock(&mem_mutex);
         LWIP_ASSERT("mem_malloc: allocated memory not above ram_end.",
-         (mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end);
+                    (mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end);
         LWIP_ASSERT("mem_malloc: allocated memory properly aligned.",
-         ((mem_ptr_t)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0);
+                    ((mem_ptr_t)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0);
         LWIP_ASSERT("mem_malloc: sanity check alignment",
-          (((mem_ptr_t)mem) & (MEM_ALIGNMENT-1)) == 0);
+                    (((mem_ptr_t)mem) & (MEM_ALIGNMENT - 1)) == 0);
 
-        return (u8_t *)mem + SIZEOF_STRUCT_MEM;
+#if MEM_OVERFLOW_CHECK
+        mem_overflow_init_element(mem, size_in);
+#endif
+        MEM_SANITY();
+        return (u8_t *)mem + SIZEOF_STRUCT_MEM + MEM_SANITY_OFFSET;
       }
     }
 #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
     /* if we got interrupted by a mem_free, try again */
   } while (local_mem_free_count != 0);
 #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
-  LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size));
   MEM_STATS_INC(err);
   LWIP_MEM_ALLOC_UNPROTECT();
   sys_mutex_unlock(&mem_mutex);
+  LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size));
   return NULL;
 }
 
@@ -765,12 +999,18 @@
 mem_calloc(mem_size_t count, mem_size_t size)
 {
   void *p;
+  size_t alloc_size = (size_t)count * (size_t)size;
+
+  if ((size_t)(mem_size_t)alloc_size != alloc_size) {
+    LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_calloc: could not allocate %"SZT_F" bytes\n", alloc_size));
+    return NULL;
+  }
 
   /* allocate 'count' objects of size 'size' */
-  p = mem_malloc(count * size);
+  p = mem_malloc((mem_size_t)alloc_size);
   if (p) {
     /* zero the memory */
-    memset(p, 0, (size_t)count * (size_t)size);
+    memset(p, 0, alloc_size);
   }
   return p;
 }
diff --git a/src/core/memp.c b/src/core/memp.c
index 58fab1a..352ce5a 100644
--- a/src/core/memp.c
+++ b/src/core/memp.c
@@ -57,13 +57,13 @@
 #include "lwip/udp.h"
 #include "lwip/tcp.h"
 #include "lwip/priv/tcp_priv.h"
+#include "lwip/altcp.h"
 #include "lwip/ip4_frag.h"
 #include "lwip/netbuf.h"
 #include "lwip/api.h"
 #include "lwip/priv/tcpip_priv.h"
 #include "lwip/priv/api_msg.h"
-#include "lwip/sockets.h"
-#include "lwip/netifapi.h"
+#include "lwip/priv/sockets_priv.h"
 #include "lwip/etharp.h"
 #include "lwip/igmp.h"
 #include "lwip/timeouts.h"
@@ -78,7 +78,7 @@
 #define LWIP_MEMPOOL(name,num,size,desc) LWIP_MEMPOOL_DECLARE(name,num,size,desc)
 #include "lwip/priv/memp_std.h"
 
-const struct memp_desc* const memp_pools[MEMP_MAX] = {
+const struct memp_desc *const memp_pools[MEMP_MAX] = {
 #define LWIP_MEMPOOL(name,num,size,desc) &memp_ ## name,
 #include "lwip/priv/memp_std.h"
 };
@@ -105,7 +105,7 @@
   t = *desc->tab;
   if (t != NULL) {
     for (h = t->next; (t != NULL) && (h != NULL); t = t->next,
-      h = ((h->next != NULL) ? h->next->next : NULL)) {
+         h = ((h->next != NULL) ? h->next->next : NULL)) {
       if (t == h) {
         return 0;
       }
@@ -118,57 +118,16 @@
 
 #if MEMP_OVERFLOW_CHECK
 /**
- * Check if a memp element was victim of an overflow
- * (e.g. the restricted area after it has been altered)
+ * Check if a memp element was victim of an overflow or underflow
+ * (e.g. the restricted area after/before it has been altered)
  *
  * @param p the memp element to check
  * @param desc the pool p comes from
  */
 static void
-memp_overflow_check_element_overflow(struct memp *p, const struct memp_desc *desc)
+memp_overflow_check_element(struct memp *p, const struct memp_desc *desc)
 {
-#if MEMP_SANITY_REGION_AFTER_ALIGNED > 0
-  u16_t k;
-  u8_t *m;
-  m = (u8_t*)p + MEMP_SIZE + desc->size;
-  for (k = 0; k < MEMP_SANITY_REGION_AFTER_ALIGNED; k++) {
-    if (m[k] != 0xcd) {
-      char errstr[128] = "detected memp overflow in pool ";
-      strcat(errstr, desc->desc);
-      LWIP_ASSERT(errstr, 0);
-    }
-  }
-#else /* MEMP_SANITY_REGION_AFTER_ALIGNED > 0 */
-  LWIP_UNUSED_ARG(p);
-  LWIP_UNUSED_ARG(desc);
-#endif /* MEMP_SANITY_REGION_AFTER_ALIGNED > 0 */
-}
-
-/**
- * Check if a memp element was victim of an underflow
- * (e.g. the restricted area before it has been altered)
- *
- * @param p the memp element to check
- * @param desc the pool p comes from
- */
-static void
-memp_overflow_check_element_underflow(struct memp *p, const struct memp_desc *desc)
-{
-#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0
-  u16_t k;
-  u8_t *m;
-  m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED;
-  for (k = 0; k < MEMP_SANITY_REGION_BEFORE_ALIGNED; k++) {
-    if (m[k] != 0xcd) {
-      char errstr[128] = "detected memp underflow in pool ";
-      strcat(errstr, desc->desc);
-      LWIP_ASSERT(errstr, 0);
-    }
-  }
-#else /* MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 */
-  LWIP_UNUSED_ARG(p);
-  LWIP_UNUSED_ARG(desc);
-#endif /* MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 */
+  mem_overflow_check_raw((u8_t *)p + MEMP_SIZE, desc->size, "pool ", desc->desc);
 }
 
 /**
@@ -177,20 +136,7 @@
 static void
 memp_overflow_init_element(struct memp *p, const struct memp_desc *desc)
 {
-#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 || MEMP_SANITY_REGION_AFTER_ALIGNED > 0
-  u8_t *m;
-#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0
-  m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED;
-  memset(m, 0xcd, MEMP_SANITY_REGION_BEFORE_ALIGNED);
-#endif
-#if MEMP_SANITY_REGION_AFTER_ALIGNED > 0
-  m = (u8_t*)p + MEMP_SIZE + desc->size;
-  memset(m, 0xcd, MEMP_SANITY_REGION_AFTER_ALIGNED);
-#endif
-#else /* MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 || MEMP_SANITY_REGION_AFTER_ALIGNED > 0 */
-  LWIP_UNUSED_ARG(p);
-  LWIP_UNUSED_ARG(desc);
-#endif /* MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 || MEMP_SANITY_REGION_AFTER_ALIGNED > 0 */
+  mem_overflow_init_raw((u8_t *)p + MEMP_SIZE, desc->size);
 }
 
 #if MEMP_OVERFLOW_CHECK >= 2
@@ -208,11 +154,10 @@
   SYS_ARCH_PROTECT(old_level);
 
   for (i = 0; i < MEMP_MAX; ++i) {
-    p = (struct memp*)LWIP_MEM_ALIGN(memp_pools[i]->base);
+    p = (struct memp *)LWIP_MEM_ALIGN(memp_pools[i]->base);
     for (j = 0; j < memp_pools[i]->num; ++j) {
-      memp_overflow_check_element_overflow(p, memp_pools[i]);
-      memp_overflow_check_element_underflow(p, memp_pools[i]);
-      p = LWIP_ALIGNMENT_CAST(struct memp*, ((u8_t*)p + MEMP_SIZE + memp_pools[i]->size + MEMP_SANITY_REGION_AFTER_ALIGNED));
+      memp_overflow_check_element(p, memp_pools[i]);
+      p = LWIP_ALIGNMENT_CAST(struct memp *, ((u8_t *)p + MEMP_SIZE + memp_pools[i]->size + MEM_SANITY_REGION_AFTER_ALIGNED));
     }
   }
   SYS_ARCH_UNPROTECT(old_level);
@@ -236,7 +181,15 @@
   struct memp *memp;
 
   *desc->tab = NULL;
-  memp = (struct memp*)LWIP_MEM_ALIGN(desc->base);
+  memp = (struct memp *)LWIP_MEM_ALIGN(desc->base);
+#if MEMP_MEM_INIT
+  /* force memset on pool memory */
+  memset(memp, 0, (size_t)desc->num * (MEMP_SIZE + desc->size
+#if MEMP_OVERFLOW_CHECK
+                                       + MEM_SANITY_REGION_AFTER_ALIGNED
+#endif
+                                      ));
+#endif
   /* create a linked list of memp elements */
   for (i = 0; i < desc->num; ++i) {
     memp->next = *desc->tab;
@@ -244,12 +197,12 @@
 #if MEMP_OVERFLOW_CHECK
     memp_overflow_init_element(memp, desc);
 #endif /* MEMP_OVERFLOW_CHECK */
-   /* cast through void* to get rid of alignment warnings */
-   memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + desc->size
+    /* cast through void* to get rid of alignment warnings */
+    memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + desc->size
 #if MEMP_OVERFLOW_CHECK
-      + MEMP_SANITY_REGION_AFTER_ALIGNED
+                                   + MEM_SANITY_REGION_AFTER_ALIGNED
 #endif
-    );
+                                  );
   }
 #if MEMP_STATS
   desc->stats->avail = desc->num;
@@ -287,11 +240,11 @@
 #endif /* MEMP_OVERFLOW_CHECK >= 2 */
 }
 
-static void*
+static void *
 #if !MEMP_OVERFLOW_CHECK
 do_memp_malloc_pool(const struct memp_desc *desc)
 #else
-do_memp_malloc_pool_fn(const struct memp_desc *desc, const char* file, const int line)
+do_memp_malloc_pool_fn(const struct memp_desc *desc, const char *file, const int line)
 #endif
 {
   struct memp *memp;
@@ -309,8 +262,7 @@
   if (memp != NULL) {
 #if !MEMP_MEM_MALLOC
 #if MEMP_OVERFLOW_CHECK == 1
-    memp_overflow_check_element_overflow(memp, desc);
-    memp_overflow_check_element_underflow(memp, desc);
+    memp_overflow_check_element(memp, desc);
 #endif /* MEMP_OVERFLOW_CHECK */
 
     *desc->tab = memp->next;
@@ -335,15 +287,15 @@
 #endif
     SYS_ARCH_UNPROTECT(old_level);
     /* cast through u8_t* to get rid of alignment warnings */
-    return ((u8_t*)memp + MEMP_SIZE);
+    return ((u8_t *)memp + MEMP_SIZE);
   } else {
-    LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("memp_malloc: out of memory in pool %s\n", desc->desc));
 #if MEMP_STATS
     desc->stats->err++;
 #endif
+    SYS_ARCH_UNPROTECT(old_level);
+    LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("memp_malloc: out of memory in pool %s\n", desc->desc));
   }
 
-  SYS_ARCH_UNPROTECT(old_level);
   return NULL;
 }
 
@@ -358,7 +310,7 @@
 #if !MEMP_OVERFLOW_CHECK
 memp_malloc_pool(const struct memp_desc *desc)
 #else
-memp_malloc_pool_fn(const struct memp_desc *desc, const char* file, const int line)
+memp_malloc_pool_fn(const struct memp_desc *desc, const char *file, const int line)
 #endif
 {
   LWIP_ASSERT("invalid pool desc", desc != NULL);
@@ -384,7 +336,7 @@
 #if !MEMP_OVERFLOW_CHECK
 memp_malloc(memp_t type)
 #else
-memp_malloc_fn(memp_t type, const char* file, const int line)
+memp_malloc_fn(memp_t type, const char *file, const int line)
 #endif
 {
   void *memp;
@@ -404,22 +356,21 @@
 }
 
 static void
-do_memp_free_pool(const struct memp_desc* desc, void *mem)
+do_memp_free_pool(const struct memp_desc *desc, void *mem)
 {
   struct memp *memp;
   SYS_ARCH_DECL_PROTECT(old_level);
 
   LWIP_ASSERT("memp_free: mem properly aligned",
-                ((mem_ptr_t)mem % MEM_ALIGNMENT) == 0);
+              ((mem_ptr_t)mem % MEM_ALIGNMENT) == 0);
 
   /* cast through void* to get rid of alignment warnings */
-  memp = (struct memp *)(void *)((u8_t*)mem - MEMP_SIZE);
+  memp = (struct memp *)(void *)((u8_t *)mem - MEMP_SIZE);
 
   SYS_ARCH_PROTECT(old_level);
 
 #if MEMP_OVERFLOW_CHECK == 1
-  memp_overflow_check_element_overflow(memp, desc);
-  memp_overflow_check_element_underflow(memp, desc);
+  memp_overflow_check_element(memp, desc);
 #endif /* MEMP_OVERFLOW_CHECK */
 
 #if MEMP_STATS
@@ -449,7 +400,7 @@
  * @param mem the memp element to free
  */
 void
-memp_free_pool(const struct memp_desc* desc, void *mem)
+memp_free_pool(const struct memp_desc *desc, void *mem)
 {
   LWIP_ASSERT("invalid pool desc", desc != NULL);
   if ((desc == NULL) || (mem == NULL)) {
diff --git a/src/core/netif.c b/src/core/netif.c
index 6444654..15200a2 100644
--- a/src/core/netif.c
+++ b/src/core/netif.c
@@ -1,16 +1,16 @@
 /**
  * @file
  * lwIP network interface abstraction
- * 
+ *
  * @defgroup netif Network interface (NETIF)
  * @ingroup callbackstyle_api
- * 
+ *
  * @defgroup netif_ip4 IPv4 address handling
  * @ingroup netif
- * 
+ *
  * @defgroup netif_ip6 IPv6 address handling
  * @ingroup netif
- * 
+ *
  * @defgroup netif_cd Client data handling
  * Store data (void*) on a netif for application usage.
  * @see @ref LWIP_NUM_NETIF_CLIENT_DATA
@@ -50,7 +50,8 @@
 
 #include "lwip/opt.h"
 
-#include <string.h>
+#include <string.h> /* memset */
+#include <stdlib.h> /* atoi */
 
 #include "lwip/def.h"
 #include "lwip/ip_addr.h"
@@ -58,7 +59,7 @@
 #include "lwip/netif.h"
 #include "lwip/priv/tcp_priv.h"
 #include "lwip/udp.h"
-#include "lwip/raw.h"
+#include "lwip/priv/raw_priv.h"
 #include "lwip/snmp.h"
 #include "lwip/igmp.h"
 #include "lwip/etharp.h"
@@ -101,9 +102,16 @@
 #define NETIF_LINK_CALLBACK(n)
 #endif /* LWIP_NETIF_LINK_CALLBACK */
 
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+static netif_ext_callback_t *ext_callback;
+#endif
+
+#if !LWIP_SINGLE_NETIF
 struct netif *netif_list;
+#endif /* !LWIP_SINGLE_NETIF */
 struct netif *netif_default;
 
+#define netif_index_to_num(index)   ((index) - 1)
 static u8_t netif_num;
 
 #if LWIP_NUM_NETIF_CLIENT_DATA > 0
@@ -112,18 +120,21 @@
 
 #define NETIF_REPORT_TYPE_IPV4  0x01
 #define NETIF_REPORT_TYPE_IPV6  0x02
-static void netif_issue_reports(struct netif* netif, u8_t report_type);
+static void netif_issue_reports(struct netif *netif, u8_t report_type);
 
 #if LWIP_IPV6
 static err_t netif_null_output_ip6(struct netif *netif, struct pbuf *p, const ip6_addr_t *ipaddr);
 #endif /* LWIP_IPV6 */
+#if LWIP_IPV4
+static err_t netif_null_output_ip4(struct netif *netif, struct pbuf *p, const ip4_addr_t *ipaddr);
+#endif /* LWIP_IPV4 */
 
 #if LWIP_HAVE_LOOPIF
 #if LWIP_IPV4
-static err_t netif_loop_output_ipv4(struct netif *netif, struct pbuf *p, const ip4_addr_t* addr);
+static err_t netif_loop_output_ipv4(struct netif *netif, struct pbuf *p, const ip4_addr_t *addr);
 #endif
 #if LWIP_IPV6
-static err_t netif_loop_output_ipv6(struct netif *netif, struct pbuf *p, const ip6_addr_t* addr);
+static err_t netif_loop_output_ipv6(struct netif *netif, struct pbuf *p, const ip6_addr_t *addr);
 #endif
 
 
@@ -139,6 +150,8 @@
 static err_t
 netif_loopif_init(struct netif *netif)
 {
+  LWIP_ASSERT("netif_loopif_init: invalid netif", netif != NULL);
+
   /* initialize the snmp variables and counters inside the struct netif
    * ifSpeed: no assumption can be made!
    */
@@ -153,8 +166,9 @@
   netif->output_ip6 = netif_loop_output_ipv6;
 #endif
 #if LWIP_LOOPIF_MULTICAST
-  netif->flags |= NETIF_FLAG_IGMP;
+  netif_set_flags(netif, NETIF_FLAG_IGMP);
 #endif
+  NETIF_SET_CHECKSUM_CTRL(netif, NETIF_CHECKSUM_DISABLE_ALL);
   return ERR_OK;
 }
 #endif /* LWIP_HAVE_LOOPIF */
@@ -166,9 +180,9 @@
 #if LWIP_IPV4
 #define LOOPIF_ADDRINIT &loop_ipaddr, &loop_netmask, &loop_gw,
   ip4_addr_t loop_ipaddr, loop_netmask, loop_gw;
-  IP4_ADDR(&loop_gw, 127,0,0,1);
-  IP4_ADDR(&loop_ipaddr, 127,0,0,1);
-  IP4_ADDR(&loop_netmask, 255,0,0,0);
+  IP4_ADDR(&loop_gw, 127, 0, 0, 1);
+  IP4_ADDR(&loop_ipaddr, 127, 0, 0, 1);
+  IP4_ADDR(&loop_netmask, 255, 0, 0, 0);
 #else /* LWIP_IPV4 */
 #define LOOPIF_ADDRINIT
 #endif /* LWIP_IPV4 */
@@ -196,18 +210,39 @@
  * ethernet_input() or ip_input() depending on netif flags.
  * Don't call directly, pass to netif_add() and call
  * netif->input().
- * Only works if the netif driver correctly sets 
+ * Only works if the netif driver correctly sets
  * NETIF_FLAG_ETHARP and/or NETIF_FLAG_ETHERNET flag!
  */
 err_t
 netif_input(struct pbuf *p, struct netif *inp)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ASSERT("netif_input: invalid pbuf", p != NULL);
+  LWIP_ASSERT("netif_input: invalid netif", inp != NULL);
+
 #if LWIP_ETHERNET
   if (inp->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) {
     return ethernet_input(p, inp);
   } else
 #endif /* LWIP_ETHERNET */
-  return ip_input(p, inp);
+    return ip_input(p, inp);
+}
+
+/**
+ * @ingroup netif
+ * Add a network interface to the list of lwIP netifs.
+ *
+ * Same as @ref netif_add but without IPv4 addresses
+ */
+struct netif *
+netif_add_noaddr(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input)
+{
+  return netif_add(netif,
+#if LWIP_IPV4
+                   NULL, NULL, NULL,
+#endif /* LWIP_IPV4*/
+                   state, init, input);
 }
 
 /**
@@ -229,12 +264,12 @@
  * 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
- * Most members of struct netif should be be initialized by the 
+ * Most members of struct netif should be be initialized by the
  * netif init function = netif driver (init parameter of this function).\n
  * 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).
- * 
+ *
  * @return netif, or NULL if failed.
  */
 struct netif *
@@ -248,33 +283,59 @@
   s8_t i;
 #endif
 
-  LWIP_ASSERT("No init function given", init != NULL);
+  LWIP_ASSERT_CORE_LOCKED();
+
+#if LWIP_SINGLE_NETIF
+  if (netif_default != NULL) {
+    LWIP_ASSERT("single netif already set", 0);
+    return NULL;
+  }
+#endif
+
+  LWIP_ERROR("netif_add: invalid netif", netif != NULL, return NULL);
+  LWIP_ERROR("netif_add: No init function given", init != NULL, return NULL);
+
+#if LWIP_IPV4
+  if (ipaddr == NULL) {
+    ipaddr = ip_2_ip4(IP4_ADDR_ANY);
+  }
+  if (netmask == NULL) {
+    netmask = ip_2_ip4(IP4_ADDR_ANY);
+  }
+  if (gw == NULL) {
+    gw = ip_2_ip4(IP4_ADDR_ANY);
+  }
 
   /* reset new interface configuration state */
-#if LWIP_IPV4
   ip_addr_set_zero_ip4(&netif->ip_addr);
   ip_addr_set_zero_ip4(&netif->netmask);
   ip_addr_set_zero_ip4(&netif->gw);
+  netif->output = netif_null_output_ip4;
 #endif /* LWIP_IPV4 */
 #if LWIP_IPV6
   for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
     ip_addr_set_zero_ip6(&netif->ip6_addr[i]);
     netif->ip6_addr_state[i] = IP6_ADDR_INVALID;
+#if LWIP_IPV6_ADDRESS_LIFETIMES
+    netif->ip6_addr_valid_life[i] = IP6_ADDR_LIFE_STATIC;
+    netif->ip6_addr_pref_life[i] = IP6_ADDR_LIFE_STATIC;
+#endif /* LWIP_IPV6_ADDRESS_LIFETIMES */
   }
   netif->output_ip6 = netif_null_output_ip6;
 #endif /* LWIP_IPV6 */
   NETIF_SET_CHECKSUM_CTRL(netif, NETIF_CHECKSUM_ENABLE_ALL);
+  netif->mtu = 0;
   netif->flags = 0;
 #ifdef netif_get_client_data
   memset(netif->client_data, 0, sizeof(netif->client_data));
 #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;
 #endif /* LWIP_IPV6_AUTOCONFIG */
-#if LWIP_IPV6_SEND_ROUTER_SOLICIT
-  netif->rs_count = LWIP_ND6_MAX_MULTICAST_SOLICIT;
-#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */
+  nd6_restart_netif(netif);
+#endif /* LWIP_IPV6 */
 #if LWIP_NETIF_STATUS_CALLBACK
   netif->status_callback = NULL;
 #endif /* LWIP_NETIF_STATUS_CALLBACK */
@@ -294,10 +355,10 @@
 
   /* remember netif specific state information data */
   netif->state = state;
-  netif->num = netif_num++;
+  netif->num = netif_num;
   netif->input = input;
 
-  NETIF_SET_HWADDRHINT(netif, NULL);
+  NETIF_RESET_HINTS(netif);
 #if ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS
   netif->loop_cnt_current = 0;
 #endif /* ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS */
@@ -310,10 +371,47 @@
   if (init(netif) != ERR_OK) {
     return NULL;
   }
+#if LWIP_IPV6 && LWIP_ND6_ALLOW_RA_UPDATES
+  /* Initialize the MTU for IPv6 to the one set by the netif driver.
+     This can be updated later by RA. */
+  netif->mtu6 = netif->mtu;
+#endif /* LWIP_IPV6 && LWIP_ND6_ALLOW_RA_UPDATES */
+
+#if !LWIP_SINGLE_NETIF
+  /* Assign a unique netif number in the range [0..254], so that (num+1) can
+     serve as an interface index that fits in a u8_t.
+     We assume that the new netif has not yet been added to the list here.
+     This algorithm is O(n^2), but that should be OK for lwIP.
+     */
+  {
+    struct netif *netif2;
+    int num_netifs;
+    do {
+      if (netif->num == 255) {
+        netif->num = 0;
+      }
+      num_netifs = 0;
+      for (netif2 = netif_list; netif2 != NULL; netif2 = netif2->next) {
+        LWIP_ASSERT("netif already added", netif2 != netif);
+        num_netifs++;
+        LWIP_ASSERT("too many netifs, max. supported number is 255", num_netifs <= 255);
+        if (netif2->num == netif->num) {
+          netif->num++;
+          break;
+        }
+      }
+    } while (netif2 != NULL);
+  }
+  if (netif->num == 254) {
+    netif_num = 0;
+  } else {
+    netif_num = (u8_t)(netif->num + 1);
+  }
 
   /* add this netif to the list */
   netif->next = netif_list;
   netif_list = netif;
+#endif /* "LWIP_SINGLE_NETIF */
   mib2_netif_added(netif);
 
 #if LWIP_IGMP
@@ -324,7 +422,7 @@
 #endif /* LWIP_IGMP */
 
   LWIP_DEBUGF(NETIF_DEBUG, ("netif: added interface %c%c IP",
-    netif->name[0], netif->name[1]));
+                            netif->name[0], netif->name[1]));
 #if LWIP_IPV4
   LWIP_DEBUGF(NETIF_DEBUG, (" addr "));
   ip4_addr_debug_print(NETIF_DEBUG, ipaddr);
@@ -334,10 +432,218 @@
   ip4_addr_debug_print(NETIF_DEBUG, gw);
 #endif /* LWIP_IPV4 */
   LWIP_DEBUGF(NETIF_DEBUG, ("\n"));
+
+  netif_invoke_ext_callback(netif, LWIP_NSC_NETIF_ADDED, NULL);
+
   return netif;
 }
 
+static void
+netif_do_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr)
+{
+#if LWIP_TCP
+  tcp_netif_ip_addr_changed(old_addr, new_addr);
+#endif /* LWIP_TCP */
+#if LWIP_UDP
+  udp_netif_ip_addr_changed(old_addr, new_addr);
+#endif /* LWIP_UDP */
+#if LWIP_RAW
+  raw_netif_ip_addr_changed(old_addr, new_addr);
+#endif /* LWIP_RAW */
+}
+
 #if LWIP_IPV4
+static int
+netif_do_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr, ip_addr_t *old_addr)
+{
+  LWIP_ASSERT("invalid pointer", ipaddr != NULL);
+  LWIP_ASSERT("invalid pointer", old_addr != NULL);
+
+  /* address is actually being changed? */
+  if (ip4_addr_cmp(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);
+
+    ip_addr_copy(*old_addr, *netif_ip_addr4(netif));
+
+    LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n"));
+    netif_do_ip_addr_changed(old_addr, &new_addr);
+
+    mib2_remove_ip4(netif);
+    mib2_remove_route_ip4(0, netif);
+    /* set new IP address to netif */
+    ip4_addr_set(ip_2_ip4(&netif->ip_addr), ipaddr);
+    IP_SET_TYPE_VAL(netif->ip_addr, IPADDR_TYPE_V4);
+    mib2_add_ip4(netif);
+    mib2_add_route_ip4(0, netif);
+
+    netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4);
+
+    NETIF_STATUS_CALLBACK(netif);
+    return 1; /* address changed */
+  }
+  return 0; /* address unchanged */
+}
+
+/**
+ * @ingroup netif_ip4
+ * Change the IP address of a network interface
+ *
+ * @param netif the network interface to change
+ * @param ipaddr the new IP address
+ *
+ * @note call netif_set_addr() if you also want to change netmask and
+ * default gateway
+ */
+void
+netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr)
+{
+  ip_addr_t old_addr;
+
+  LWIP_ERROR("netif_set_ipaddr: invalid netif", netif != NULL, return);
+
+  /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */
+  if (ipaddr == NULL) {
+    ipaddr = IP4_ADDR_ANY4;
+  }
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  if (netif_do_set_ipaddr(netif, ipaddr, &old_addr)) {
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+    netif_ext_callback_args_t args;
+    args.ipv4_changed.old_address = &old_addr;
+    netif_invoke_ext_callback(netif, LWIP_NSC_IPV4_ADDRESS_CHANGED, &args);
+#endif
+  }
+}
+
+static int
+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 LWIP_NETIF_EXT_STATUS_CALLBACK
+    LWIP_ASSERT("invalid pointer", old_nm != NULL);
+    ip_addr_copy(*old_nm, *netif_ip_netmask4(netif));
+#else
+    LWIP_UNUSED_ARG(old_nm);
+#endif
+    mib2_remove_route_ip4(0, netif);
+    /* set new netmask to netif */
+    ip4_addr_set(ip_2_ip4(&netif->netmask), netmask);
+    IP_SET_TYPE_VAL(netif->netmask, IPADDR_TYPE_V4);
+    mib2_add_route_ip4(0, netif);
+    LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: netmask of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
+                netif->name[0], netif->name[1],
+                ip4_addr1_16(netif_ip4_netmask(netif)),
+                ip4_addr2_16(netif_ip4_netmask(netif)),
+                ip4_addr3_16(netif_ip4_netmask(netif)),
+                ip4_addr4_16(netif_ip4_netmask(netif))));
+    return 1; /* netmask changed */
+  }
+  return 0; /* netmask unchanged */
+}
+
+/**
+ * @ingroup netif_ip4
+ * Change the netmask of a network interface
+ *
+ * @param netif the network interface to change
+ * @param netmask the new netmask
+ *
+ * @note call netif_set_addr() if you also want to change ip address and
+ * default gateway
+ */
+void
+netif_set_netmask(struct netif *netif, const ip4_addr_t *netmask)
+{
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+  ip_addr_t old_nm_val;
+  ip_addr_t *old_nm = &old_nm_val;
+#else
+  ip_addr_t *old_nm = NULL;
+#endif
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("netif_set_netmask: invalid netif", netif != NULL, return);
+
+  /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */
+  if (netmask == NULL) {
+    netmask = IP4_ADDR_ANY4;
+  }
+
+  if (netif_do_set_netmask(netif, netmask, old_nm)) {
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+    netif_ext_callback_args_t args;
+    args.ipv4_changed.old_netmask = old_nm;
+    netif_invoke_ext_callback(netif, LWIP_NSC_IPV4_NETMASK_CHANGED, &args);
+#endif
+  }
+}
+
+static int
+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 LWIP_NETIF_EXT_STATUS_CALLBACK
+    LWIP_ASSERT("invalid pointer", old_gw != NULL);
+    ip_addr_copy(*old_gw, *netif_ip_gw4(netif));
+#else
+    LWIP_UNUSED_ARG(old_gw);
+#endif
+
+    ip4_addr_set(ip_2_ip4(&netif->gw), gw);
+    IP_SET_TYPE_VAL(netif->gw, IPADDR_TYPE_V4);
+    LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: GW address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
+                netif->name[0], netif->name[1],
+                ip4_addr1_16(netif_ip4_gw(netif)),
+                ip4_addr2_16(netif_ip4_gw(netif)),
+                ip4_addr3_16(netif_ip4_gw(netif)),
+                ip4_addr4_16(netif_ip4_gw(netif))));
+    return 1; /* gateway changed */
+  }
+  return 0; /* gateway unchanged */
+}
+
+/**
+ * @ingroup netif_ip4
+ * Change the default gateway for a network interface
+ *
+ * @param netif the network interface to change
+ * @param gw the new default gateway
+ *
+ * @note call netif_set_addr() if you also want to change ip address and netmask
+ */
+void
+netif_set_gw(struct netif *netif, const ip4_addr_t *gw)
+{
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+  ip_addr_t old_gw_val;
+  ip_addr_t *old_gw = &old_gw_val;
+#else
+  ip_addr_t *old_gw = NULL;
+#endif
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("netif_set_gw: invalid netif", netif != NULL, return);
+
+  /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */
+  if (gw == NULL) {
+    gw = IP4_ADDR_ANY4;
+  }
+
+  if (netif_do_set_gw(netif, gw, old_gw)) {
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+    netif_ext_callback_args_t args;
+    args.ipv4_changed.old_gw = old_gw;
+    netif_invoke_ext_callback(netif, LWIP_NSC_IPV4_GATEWAY_CHANGED, &args);
+#endif
+  }
+}
+
 /**
  * @ingroup netif_ip4
  * Change IP address configuration for a network interface (including netmask
@@ -350,20 +656,74 @@
  */
 void
 netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask,
-    const ip4_addr_t *gw)
+               const ip4_addr_t *gw)
 {
-  if (ip4_addr_isany(ipaddr)) {
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+  netif_nsc_reason_t change_reason = LWIP_NSC_NONE;
+  netif_ext_callback_args_t cb_args;
+  ip_addr_t old_nm_val;
+  ip_addr_t old_gw_val;
+  ip_addr_t *old_nm = &old_nm_val;
+  ip_addr_t *old_gw = &old_gw_val;
+#else
+  ip_addr_t *old_nm = NULL;
+  ip_addr_t *old_gw = NULL;
+#endif
+  ip_addr_t old_addr;
+  int remove;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */
+  if (ipaddr == NULL) {
+    ipaddr = IP4_ADDR_ANY4;
+  }
+  if (netmask == NULL) {
+    netmask = IP4_ADDR_ANY4;
+  }
+  if (gw == NULL) {
+    gw = IP4_ADDR_ANY4;
+  }
+
+  remove = ip4_addr_isany(ipaddr);
+  if (remove) {
     /* when removing an address, we have to remove it *before* changing netmask/gw
        to ensure that tcp RST segment can be sent correctly */
-    netif_set_ipaddr(netif, ipaddr);
-    netif_set_netmask(netif, netmask);
-    netif_set_gw(netif, gw);
-  } else {
-    netif_set_netmask(netif, netmask);
-    netif_set_gw(netif, gw);
-    /* set ipaddr last to ensure netmask/gw have been set when status callback is called */
-    netif_set_ipaddr(netif, ipaddr);
+    if (netif_do_set_ipaddr(netif, ipaddr, &old_addr)) {
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+      change_reason |= LWIP_NSC_IPV4_ADDRESS_CHANGED;
+      cb_args.ipv4_changed.old_address = &old_addr;
+#endif
+    }
   }
+  if (netif_do_set_netmask(netif, netmask, old_nm)) {
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+    change_reason |= LWIP_NSC_IPV4_NETMASK_CHANGED;
+    cb_args.ipv4_changed.old_netmask = old_nm;
+#endif
+  }
+  if (netif_do_set_gw(netif, gw, old_gw)) {
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+    change_reason |= LWIP_NSC_IPV4_GATEWAY_CHANGED;
+    cb_args.ipv4_changed.old_gw = old_gw;
+#endif
+  }
+  if (!remove) {
+    /* set ipaddr last to ensure netmask/gw have been set when status callback is called */
+    if (netif_do_set_ipaddr(netif, ipaddr, &old_addr)) {
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+      change_reason |= LWIP_NSC_IPV4_ADDRESS_CHANGED;
+      cb_args.ipv4_changed.old_address = &old_addr;
+#endif
+    }
+  }
+
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+  if (change_reason != LWIP_NSC_NONE) {
+    change_reason |= LWIP_NSC_IPV4_SETTINGS_CHANGED;
+    netif_invoke_ext_callback(netif, change_reason, &cb_args);
+  }
+#endif
 }
 #endif /* LWIP_IPV4*/
 
@@ -380,21 +740,17 @@
   int i;
 #endif
 
+  LWIP_ASSERT_CORE_LOCKED();
+
   if (netif == NULL) {
     return;
   }
 
+  netif_invoke_ext_callback(netif, LWIP_NSC_NETIF_REMOVED, NULL);
+
 #if LWIP_IPV4
   if (!ip4_addr_isany_val(*netif_ip4_addr(netif))) {
-#if LWIP_TCP
-    tcp_netif_ip_addr_changed(netif_ip_addr4(netif), NULL);
-#endif /* LWIP_TCP */
-#if LWIP_UDP
-    udp_netif_ip_addr_changed(netif_ip_addr4(netif), NULL);
-#endif /* LWIP_UDP */
-#if LWIP_RAW
-    raw_netif_ip_addr_changed(netif_ip_addr4(netif), NULL);
-#endif /* LWIP_RAW */
+    netif_do_ip_addr_changed(netif_ip_addr4(netif), NULL);
   }
 
 #if LWIP_IGMP
@@ -408,15 +764,7 @@
 #if LWIP_IPV6
   for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
     if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i))) {
-#if LWIP_TCP
-      tcp_netif_ip_addr_changed(netif_ip_addr6(netif, i), NULL);
-#endif /* LWIP_TCP */
-#if LWIP_UDP
-      udp_netif_ip_addr_changed(netif_ip_addr6(netif, i), NULL);
-#endif /* LWIP_UDP */
-#if LWIP_RAW
-      raw_netif_ip_addr_changed(netif_ip_addr6(netif, i), NULL);
-#endif /* LWIP_RAW */
+      netif_do_ip_addr_changed(netif_ip_addr6(netif, i), NULL);
     }
   }
 #if LWIP_IPV6_MLD
@@ -436,13 +784,14 @@
     /* reset default netif */
     netif_set_default(NULL);
   }
+#if !LWIP_SINGLE_NETIF
   /*  is it the first netif? */
   if (netif_list == netif) {
     netif_list = netif->next;
   } else {
     /*  look for netif further down the list */
-    struct netif * tmp_netif;
-    for (tmp_netif = netif_list; tmp_netif != NULL; tmp_netif = tmp_netif->next) {
+    struct netif *tmp_netif;
+    NETIF_FOREACH(tmp_netif) {
       if (tmp_netif->next == netif) {
         tmp_netif->next = netif->next;
         break;
@@ -452,6 +801,7 @@
       return; /* netif is not on the list */
     }
   }
+#endif /* !LWIP_SINGLE_NETIF */
   mib2_netif_removed(netif);
 #if LWIP_NETIF_REMOVE_CALLBACK
   if (netif->remove_callback) {
@@ -463,138 +813,6 @@
 
 /**
  * @ingroup netif
- * Find a network interface by searching for its name
- *
- * @param name the name of the netif (like netif->name) plus concatenated number
- * in ascii representation (e.g. 'en0')
- */
-struct netif *
-netif_find(const char *name)
-{
-  struct netif *netif;
-  u8_t num;
-
-  if (name == NULL) {
-    return NULL;
-  }
-
-  num = (u8_t)(name[2] - '0');
-
-  for (netif = netif_list; netif != NULL; netif = netif->next) {
-    if (num == netif->num &&
-       name[0] == netif->name[0] &&
-       name[1] == netif->name[1]) {
-      LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: found %c%c\n", name[0], name[1]));
-      return netif;
-    }
-  }
-  LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: didn't find %c%c\n", name[0], name[1]));
-  return NULL;
-}
-
-#if LWIP_IPV4
-/**
- * @ingroup netif_ip4
- * Change the IP address of a network interface
- *
- * @param netif the network interface to change
- * @param ipaddr the new IP address
- *
- * @note call netif_set_addr() if you also want to change netmask and
- * default gateway
- */
-void
-netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr)
-{
-  ip_addr_t new_addr;
-  *ip_2_ip4(&new_addr) = (ipaddr ? *ipaddr : *IP4_ADDR_ANY4);
-  IP_SET_TYPE_VAL(new_addr, IPADDR_TYPE_V4);
-
-  /* address is actually being changed? */
-  if (ip4_addr_cmp(ip_2_ip4(&new_addr), netif_ip4_addr(netif)) == 0) {
-    LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n"));
-#if LWIP_TCP
-    tcp_netif_ip_addr_changed(netif_ip_addr4(netif), &new_addr);
-#endif /* LWIP_TCP */
-#if LWIP_UDP
-    udp_netif_ip_addr_changed(netif_ip_addr4(netif), &new_addr);
-#endif /* LWIP_UDP */
-#if LWIP_RAW
-    raw_netif_ip_addr_changed(netif_ip_addr4(netif), &new_addr);
-#endif /* LWIP_RAW */
-
-    mib2_remove_ip4(netif);
-    mib2_remove_route_ip4(0, netif);
-    /* set new IP address to netif */
-    ip4_addr_set(ip_2_ip4(&netif->ip_addr), ipaddr);
-    IP_SET_TYPE_VAL(netif->ip_addr, IPADDR_TYPE_V4);
-    mib2_add_ip4(netif);
-    mib2_add_route_ip4(0, netif);
-
-    netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4);
-
-    NETIF_STATUS_CALLBACK(netif);
-  }
-
-  LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: IP address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
-    netif->name[0], netif->name[1],
-    ip4_addr1_16(netif_ip4_addr(netif)),
-    ip4_addr2_16(netif_ip4_addr(netif)),
-    ip4_addr3_16(netif_ip4_addr(netif)),
-    ip4_addr4_16(netif_ip4_addr(netif))));
-}
-
-/**
- * @ingroup netif_ip4
- * Change the default gateway for a network interface
- *
- * @param netif the network interface to change
- * @param gw the new default gateway
- *
- * @note call netif_set_addr() if you also want to change ip address and netmask
- */
-void
-netif_set_gw(struct netif *netif, const ip4_addr_t *gw)
-{
-  ip4_addr_set(ip_2_ip4(&netif->gw), gw);
-  IP_SET_TYPE_VAL(netif->gw, IPADDR_TYPE_V4);
-  LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: GW address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
-    netif->name[0], netif->name[1],
-    ip4_addr1_16(netif_ip4_gw(netif)),
-    ip4_addr2_16(netif_ip4_gw(netif)),
-    ip4_addr3_16(netif_ip4_gw(netif)),
-    ip4_addr4_16(netif_ip4_gw(netif))));
-}
-
-/**
- * @ingroup netif_ip4
- * Change the netmask of a network interface
- *
- * @param netif the network interface to change
- * @param netmask the new netmask
- *
- * @note call netif_set_addr() if you also want to change ip address and
- * default gateway
- */
-void
-netif_set_netmask(struct netif *netif, const ip4_addr_t *netmask)
-{
-  mib2_remove_route_ip4(0, netif);
-  /* set new netmask to netif */
-  ip4_addr_set(ip_2_ip4(&netif->netmask), netmask);
-  IP_SET_TYPE_VAL(netif->netmask, IPADDR_TYPE_V4);
-  mib2_add_route_ip4(0, netif);
-  LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: netmask of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
-    netif->name[0], netif->name[1],
-    ip4_addr1_16(netif_ip4_netmask(netif)),
-    ip4_addr2_16(netif_ip4_netmask(netif)),
-    ip4_addr3_16(netif_ip4_netmask(netif)),
-    ip4_addr4_16(netif_ip4_netmask(netif))));
-}
-#endif /* LWIP_IPV4 */
-
-/**
- * @ingroup netif
  * Set a network interface as the default network interface
  * (used to output all packets for which no specific route is found)
  *
@@ -603,6 +821,8 @@
 void
 netif_set_default(struct netif *netif)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
   if (netif == NULL) {
     /* remove default route */
     mib2_remove_route_ip4(1, netif);
@@ -612,7 +832,7 @@
   }
   netif_default = netif;
   LWIP_DEBUGF(NETIF_DEBUG, ("netif: setting default interface %c%c\n",
-           netif ? netif->name[0] : '\'', netif ? netif->name[1] : '\''));
+                            netif ? netif->name[0] : '\'', netif ? netif->name[1] : '\''));
 }
 
 /**
@@ -623,24 +843,45 @@
 void
 netif_set_up(struct netif *netif)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("netif_set_up: invalid netif", netif != NULL, return);
+
   if (!(netif->flags & NETIF_FLAG_UP)) {
-    netif->flags |= NETIF_FLAG_UP;
+    netif_set_flags(netif, NETIF_FLAG_UP);
 
     MIB2_COPY_SYSUPTIME_TO(&netif->ts);
 
     NETIF_STATUS_CALLBACK(netif);
 
-    if (netif->flags & NETIF_FLAG_LINK_UP) {
-      netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4|NETIF_REPORT_TYPE_IPV6);
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+    {
+      netif_ext_callback_args_t args;
+      args.status_changed.state = 1;
+      netif_invoke_ext_callback(netif, LWIP_NSC_STATUS_CHANGED, &args);
     }
+#endif
+
+    netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4 | NETIF_REPORT_TYPE_IPV6);
+#if LWIP_IPV6
+    nd6_restart_netif(netif);
+#endif /* LWIP_IPV6 */
   }
 }
 
 /** Send ARP/IGMP/MLD/RS events, e.g. on link-up/netif-up or addr-change
  */
 static void
-netif_issue_reports(struct netif* netif, u8_t report_type)
+netif_issue_reports(struct netif *netif, u8_t report_type)
 {
+  LWIP_ASSERT("netif_issue_reports: invalid netif", netif != NULL);
+
+  /* Only send reports when both link and admin states are up */
+  if (!(netif->flags & NETIF_FLAG_LINK_UP) ||
+      !(netif->flags & NETIF_FLAG_UP)) {
+    return;
+  }
+
 #if LWIP_IPV4
   if ((report_type & NETIF_REPORT_TYPE_IPV4) &&
       !ip4_addr_isany_val(*netif_ip4_addr(netif))) {
@@ -666,10 +907,6 @@
     /* send mld memberships */
     mld6_report_groups(netif);
 #endif /* LWIP_IPV6_MLD */
-#if LWIP_IPV6_SEND_ROUTER_SOLICIT
-    /* Send Router Solicitation messages. */
-    netif->rs_count = LWIP_ND6_MAX_MULTICAST_SOLICIT;
-#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */
   }
 #endif /* LWIP_IPV6 */
 }
@@ -681,8 +918,20 @@
 void
 netif_set_down(struct netif *netif)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("netif_set_down: invalid netif", netif != NULL, return);
+
   if (netif->flags & NETIF_FLAG_UP) {
-    netif->flags &= ~NETIF_FLAG_UP;
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+    {
+      netif_ext_callback_args_t args;
+      args.status_changed.state = 0;
+      netif_invoke_ext_callback(netif, LWIP_NSC_STATUS_CHANGED, &args);
+    }
+#endif
+
+    netif_clear_flags(netif, NETIF_FLAG_UP);
     MIB2_COPY_SYSUPTIME_TO(&netif->ts);
 
 #if LWIP_IPV4 && LWIP_ARP
@@ -707,6 +956,8 @@
 void
 netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
   if (netif) {
     netif->status_callback = status_callback;
   }
@@ -721,6 +972,8 @@
 void
 netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
   if (netif) {
     netif->remove_callback = remove_callback;
   }
@@ -734,8 +987,12 @@
 void
 netif_set_link_up(struct netif *netif)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("netif_set_link_up: invalid netif", netif != NULL, return);
+
   if (!(netif->flags & NETIF_FLAG_LINK_UP)) {
-    netif->flags |= NETIF_FLAG_LINK_UP;
+    netif_set_flags(netif, NETIF_FLAG_LINK_UP);
 
 #if LWIP_DHCP
     dhcp_network_changed(netif);
@@ -745,10 +1002,19 @@
     autoip_network_changed(netif);
 #endif /* LWIP_AUTOIP */
 
-    if (netif->flags & NETIF_FLAG_UP) {
-      netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4|NETIF_REPORT_TYPE_IPV6);
-    }
+    netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4 | NETIF_REPORT_TYPE_IPV6);
+#if LWIP_IPV6
+    nd6_restart_netif(netif);
+#endif /* LWIP_IPV6 */
+
     NETIF_LINK_CALLBACK(netif);
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+    {
+      netif_ext_callback_args_t args;
+      args.link_changed.state = 1;
+      netif_invoke_ext_callback(netif, LWIP_NSC_LINK_CHANGED, &args);
+    }
+#endif
   }
 }
 
@@ -757,11 +1023,22 @@
  * Called by a driver when its link goes down
  */
 void
-netif_set_link_down(struct netif *netif )
+netif_set_link_down(struct netif *netif)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("netif_set_link_down: invalid netif", netif != NULL, return);
+
   if (netif->flags & NETIF_FLAG_LINK_UP) {
-    netif->flags &= ~NETIF_FLAG_LINK_UP;
+    netif_clear_flags(netif, NETIF_FLAG_LINK_UP);
     NETIF_LINK_CALLBACK(netif);
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+    {
+      netif_ext_callback_args_t args;
+      args.link_changed.state = 0;
+      netif_invoke_ext_callback(netif, LWIP_NSC_LINK_CHANGED, &args);
+    }
+#endif
   }
 }
 
@@ -773,6 +1050,8 @@
 void
 netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
   if (netif) {
     netif->link_callback = link_callback;
   }
@@ -812,8 +1091,14 @@
   struct netif *stats_if = netif;
 #endif /* LWIP_HAVE_LOOPIF */
 #endif /* MIB2_STATS */
+#if LWIP_NETIF_LOOPBACK_MULTITHREADING
+  u8_t schedule_poll = 0;
+#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */
   SYS_ARCH_DECL_PROTECT(lev);
 
+  LWIP_ASSERT("netif_loop_output: invalid netif", netif != NULL);
+  LWIP_ASSERT("netif_loop_output: invalid pbuf", p != NULL);
+
   /* Allocate a new pbuf */
   r = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM);
   if (r == NULL) {
@@ -826,14 +1111,14 @@
   clen = pbuf_clen(r);
   /* check for overflow or too many pbuf on queue */
   if (((netif->loop_cnt_current + clen) < netif->loop_cnt_current) ||
-     ((netif->loop_cnt_current + clen) > LWIP_LOOPBACK_MAX_PBUFS)) {
+      ((netif->loop_cnt_current + clen) > LWIP_MIN(LWIP_LOOPBACK_MAX_PBUFS, 0xFFFF))) {
     pbuf_free(r);
     LINK_STATS_INC(link.memerr);
     LINK_STATS_INC(link.drop);
     MIB2_STATS_NETIF_INC(stats_if, ifoutdiscards);
     return ERR_MEM;
   }
-  netif->loop_cnt_current += clen;
+  netif->loop_cnt_current = (u16_t)(netif->loop_cnt_current + clen);
 #endif /* LWIP_LOOPBACK_MAX_PBUFS */
 
   /* Copy the whole pbuf queue p into the single pbuf r */
@@ -861,6 +1146,10 @@
   } else {
     netif->loop_first = r;
     netif->loop_last = last;
+#if LWIP_NETIF_LOOPBACK_MULTITHREADING
+    /* No existing packets queued, schedule poll */
+    schedule_poll = 1;
+#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */
   }
   SYS_ARCH_UNPROTECT(lev);
 
@@ -870,7 +1159,9 @@
 
 #if LWIP_NETIF_LOOPBACK_MULTITHREADING
   /* For multithreading environment, schedule a call to netif_poll */
-  tcpip_callback_with_block((tcpip_callback_fn)netif_poll, netif, 0);
+  if (schedule_poll) {
+    tcpip_try_callback((tcpip_callback_fn)netif_poll, netif);
+  }
 #endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */
 
   return ERR_OK;
@@ -879,7 +1170,7 @@
 #if LWIP_HAVE_LOOPIF
 #if LWIP_IPV4
 static err_t
-netif_loop_output_ipv4(struct netif *netif, struct pbuf *p, const ip4_addr_t* addr)
+netif_loop_output_ipv4(struct netif *netif, struct pbuf *p, const ip4_addr_t *addr)
 {
   LWIP_UNUSED_ARG(addr);
   return netif_loop_output(netif, p);
@@ -888,7 +1179,7 @@
 
 #if LWIP_IPV6
 static err_t
-netif_loop_output_ipv6(struct netif *netif, struct pbuf *p, const ip6_addr_t* addr)
+netif_loop_output_ipv6(struct netif *netif, struct pbuf *p, const ip6_addr_t *addr)
 {
   LWIP_UNUSED_ARG(addr);
   return netif_loop_output(netif, p);
@@ -917,6 +1208,8 @@
 #endif /* MIB2_STATS */
   SYS_ARCH_DECL_PROTECT(lev);
 
+  LWIP_ASSERT("netif_poll: invalid netif", netif != NULL);
+
   /* Get a packet from the list. With SYS_LIGHTWEIGHT_PROT=1, this is protected */
   SYS_ARCH_PROTECT(lev);
   while (netif->loop_first != NULL) {
@@ -936,8 +1229,8 @@
 #if LWIP_LOOPBACK_MAX_PBUFS
     /* adjust the number of pbufs on queue */
     LWIP_ASSERT("netif->loop_cnt_current underflow",
-      ((netif->loop_cnt_current - clen) < netif->loop_cnt_current));
-    netif->loop_cnt_current -= clen;
+                ((netif->loop_cnt_current - clen) < netif->loop_cnt_current));
+    netif->loop_cnt_current = (u16_t)(netif->loop_cnt_current - clen);
 #endif /* LWIP_LOOPBACK_MAX_PBUFS */
 
     /* 'in_end' now points to the last pbuf from 'in' */
@@ -953,6 +1246,8 @@
     in_end->next = NULL;
     SYS_ARCH_UNPROTECT(lev);
 
+    in->if_idx = netif_get_index(netif);
+
     LINK_STATS_INC(link.recv);
     MIB2_STATS_NETIF_ADD(stats_if, ifinoctets, in->tot_len);
     MIB2_STATS_NETIF_INC(stats_if, ifinucastpkts);
@@ -972,12 +1267,10 @@
 void
 netif_poll_all(void)
 {
-  struct netif *netif = netif_list;
+  struct netif *netif;
   /* loop through netifs */
-  while (netif != NULL) {
+  NETIF_FOREACH(netif) {
     netif_poll(netif);
-    /* proceed to next network interface */
-    netif = netif->next;
   }
 }
 #endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */
@@ -996,8 +1289,13 @@
   u8_t result = netif_client_id;
   netif_client_id++;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
+#if LWIP_NUM_NETIF_CLIENT_DATA > 256
+#error LWIP_NUM_NETIF_CLIENT_DATA must be <= 256
+#endif
   LWIP_ASSERT("Increase LWIP_NUM_NETIF_CLIENT_DATA in lwipopts.h", result < LWIP_NUM_NETIF_CLIENT_DATA);
-  return result + LWIP_NETIF_CLIENT_DATA_INDEX_MAX;
+  return (u8_t)(result + LWIP_NETIF_CLIENT_DATA_INDEX_MAX);
 }
 #endif
 
@@ -1015,9 +1313,13 @@
 void
 netif_ip6_addr_set(struct netif *netif, s8_t addr_idx, const ip6_addr_t *addr6)
 {
-  LWIP_ASSERT("addr6 != NULL", addr6 != NULL);
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ASSERT("netif_ip6_addr_set: invalid netif", netif != NULL);
+  LWIP_ASSERT("netif_ip6_addr_set: invalid addr6", addr6 != NULL);
+
   netif_ip6_addr_set_parts(netif, addr_idx, addr6->addr[0], addr6->addr[1],
-    addr6->addr[2], addr6->addr[3]);
+                           addr6->addr[2], addr6->addr[3]);
 }
 
 /*
@@ -1033,45 +1335,48 @@
 void
 netif_ip6_addr_set_parts(struct netif *netif, s8_t addr_idx, u32_t i0, u32_t i1, u32_t i2, u32_t i3)
 {
-  const ip6_addr_t *old_addr;
+  ip_addr_t old_addr;
+  ip_addr_t new_ipaddr;
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("netif != NULL", netif != NULL);
   LWIP_ASSERT("invalid index", addr_idx < LWIP_IPV6_NUM_ADDRESSES);
 
-  old_addr = netif_ip6_addr(netif, addr_idx);
+  ip6_addr_copy(*ip_2_ip6(&old_addr), *netif_ip6_addr(netif, addr_idx));
+  IP_SET_TYPE_VAL(old_addr, IPADDR_TYPE_V6);
+
   /* address is actually being changed? */
-  if ((old_addr->addr[0] != i0) || (old_addr->addr[1] != i1) ||
-      (old_addr->addr[2] != i2) || (old_addr->addr[3] != i3)) {
+  if ((ip_2_ip6(&old_addr)->addr[0] != i0) || (ip_2_ip6(&old_addr)->addr[1] != i1) ||
+      (ip_2_ip6(&old_addr)->addr[2] != i2) || (ip_2_ip6(&old_addr)->addr[3] != i3)) {
     LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_ip6_addr_set: netif address being changed\n"));
 
-    if (netif_ip6_addr_state(netif, addr_idx) & IP6_ADDR_VALID) {
-#if LWIP_TCP || LWIP_UDP
-      ip_addr_t new_ipaddr;
-      IP_ADDR6(&new_ipaddr, i0, i1, i2, i3);
-#endif /* LWIP_TCP || LWIP_UDP */
-#if LWIP_TCP
-      tcp_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), &new_ipaddr);
-#endif /* LWIP_TCP */
-#if LWIP_UDP
-      udp_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), &new_ipaddr);
-#endif /* LWIP_UDP */
-#if LWIP_RAW
-      raw_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), &new_ipaddr);
-#endif /* LWIP_RAW */
+    IP_ADDR6(&new_ipaddr, i0, i1, i2, i3);
+    ip6_addr_assign_zone(ip_2_ip6(&new_ipaddr), IP6_UNICAST, netif);
+
+    if (ip6_addr_isvalid(netif_ip6_addr_state(netif, addr_idx))) {
+      netif_do_ip_addr_changed(netif_ip_addr6(netif, addr_idx), &new_ipaddr);
     }
     /* @todo: remove/readd mib2 ip6 entries? */
 
-    IP6_ADDR(ip_2_ip6(&(netif->ip6_addr[addr_idx])), i0, i1, i2, i3);
-    IP_SET_TYPE_VAL(netif->ip6_addr[addr_idx], IPADDR_TYPE_V6);
+    ip_addr_copy(netif->ip6_addr[addr_idx], new_ipaddr);
 
-    if (netif_ip6_addr_state(netif, addr_idx) & IP6_ADDR_VALID) {
+    if (ip6_addr_isvalid(netif_ip6_addr_state(netif, addr_idx))) {
       netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV6);
       NETIF_STATUS_CALLBACK(netif);
     }
+
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+    {
+      netif_ext_callback_args_t args;
+      args.ipv6_set.addr_index  = addr_idx;
+      args.ipv6_set.old_address = &old_addr;
+      netif_invoke_ext_callback(netif, LWIP_NSC_IPV6_SET, &args);
+    }
+#endif
   }
 
   LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: IPv6 address %d of interface %c%c set to %s/0x%"X8_F"\n",
-    addr_idx, netif->name[0], netif->name[1], ip6addr_ntoa(netif_ip6_addr(netif, addr_idx)),
-    netif_ip6_addr_state(netif, addr_idx)));
+              addr_idx, netif->name[0], netif->name[1], ip6addr_ntoa(netif_ip6_addr(netif, addr_idx)),
+              netif_ip6_addr_state(netif, addr_idx)));
 }
 
 /**
@@ -1085,9 +1390,10 @@
  * @param state the new IPv6 address state
  */
 void
-netif_ip6_addr_set_state(struct netif* netif, s8_t addr_idx, u8_t state)
+netif_ip6_addr_set_state(struct netif *netif, s8_t addr_idx, u8_t state)
 {
   u8_t old_state;
+  LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("netif != NULL", netif != NULL);
   LWIP_ASSERT("invalid index", addr_idx < LWIP_IPV6_NUM_ADDRESSES);
 
@@ -1107,39 +1413,47 @@
 
     if (old_valid && !new_valid) {
       /* address about to be removed by setting invalid */
-#if LWIP_TCP
-      tcp_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), NULL);
-#endif /* LWIP_TCP */
-#if LWIP_UDP
-      udp_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), NULL);
-#endif /* LWIP_UDP */
-#if LWIP_RAW
-      raw_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), NULL);
-#endif /* LWIP_RAW */
+      netif_do_ip_addr_changed(netif_ip_addr6(netif, addr_idx), NULL);
       /* @todo: remove mib2 ip6 entries? */
     }
     netif->ip6_addr_state[addr_idx] = state;
 
     if (!old_valid && new_valid) {
       /* address added by setting valid */
+      /* This is a good moment to check that the address is properly zoned. */
+      IP6_ADDR_ZONECHECK_NETIF(netif_ip6_addr(netif, addr_idx), netif);
       /* @todo: add mib2 ip6 entries? */
       netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV6);
     }
-    if ((old_state & IP6_ADDR_PREFERRED) != (state & IP6_ADDR_PREFERRED)) {
-      /* address state has changed (valid flag changed or switched between
-         preferred and deprecated) -> call the callback function */
+    if ((old_state & ~IP6_ADDR_TENTATIVE_COUNT_MASK) !=
+        (state     & ~IP6_ADDR_TENTATIVE_COUNT_MASK)) {
+      /* address state has changed -> call the callback function */
       NETIF_STATUS_CALLBACK(netif);
     }
-  }
 
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+    {
+      netif_ext_callback_args_t args;
+      args.ipv6_addr_state_changed.addr_index = addr_idx;
+      args.ipv6_addr_state_changed.old_state  = old_state;
+      args.ipv6_addr_state_changed.address    = netif_ip_addr6(netif, addr_idx);
+      netif_invoke_ext_callback(netif, LWIP_NSC_IPV6_ADDR_STATE_CHANGED, &args);
+    }
+#endif
+  }
   LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: IPv6 address %d of interface %c%c set to %s/0x%"X8_F"\n",
-    addr_idx, netif->name[0], netif->name[1], ip6addr_ntoa(netif_ip6_addr(netif, addr_idx)),
-    netif_ip6_addr_state(netif, addr_idx)));
+              addr_idx, netif->name[0], netif->name[1], ip6addr_ntoa(netif_ip6_addr(netif, addr_idx)),
+              netif_ip6_addr_state(netif, addr_idx)));
 }
 
 /**
- * Checks if a specific address is assigned to the netif and returns its
- * index.
+ * Checks if a specific local address is present on the netif and returns its
+ * index. Depending on its state, it may or may not be assigned to the
+ * interface (as per RFC terminology).
+ *
+ * The given address may or may not be zoned (i.e., have a zone index other
+ * than IP6_NO_ZONE). If the address is zoned, it must have the correct zone
+ * for the given netif, or no match will be found.
  *
  * @param netif the netif to check
  * @param ip6addr the IPv6 address to find
@@ -1150,9 +1464,21 @@
 netif_get_ip6_addr_match(struct netif *netif, const ip6_addr_t *ip6addr)
 {
   s8_t i;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ASSERT("netif_get_ip6_addr_match: invalid netif", netif != NULL);
+  LWIP_ASSERT("netif_get_ip6_addr_match: invalid ip6addr", ip6addr != NULL);
+
+#if LWIP_IPV6_SCOPES
+  if (ip6_addr_has_zone(ip6addr) && !ip6_addr_test_zone(ip6addr, netif)) {
+    return -1; /* wrong zone, no match */
+  }
+#endif /* LWIP_IPV6_SCOPES */
+
   for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
     if (!ip6_addr_isinvalid(netif_ip6_addr_state(netif, i)) &&
-        ip6_addr_cmp(netif_ip6_addr(netif, i), ip6addr)) {
+        ip6_addr_cmp_zoneless(netif_ip6_addr(netif, i), ip6addr)) {
       return i;
     }
   }
@@ -1172,6 +1498,10 @@
 {
   u8_t i, addr_index;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ASSERT("netif_create_ip6_linklocal_address: invalid netif", netif != NULL);
+
   /* Link-local prefix. */
   ip_2_ip6(&netif->ip6_addr[0])->addr[0] = PP_HTONL(0xfe800000ul);
   ip_2_ip6(&netif->ip6_addr[0])->addr[1] = 0;
@@ -1183,7 +1513,7 @@
         ((u32_t)(netif->hwaddr[1]) << 16) |
         ((u32_t)(netif->hwaddr[2]) << 8) |
         (0xff));
-    ip_2_ip6(&netif->ip6_addr[0])->addr[3] = lwip_htonl((0xfeul << 24) |
+    ip_2_ip6(&netif->ip6_addr[0])->addr[3] = lwip_htonl((u32_t)(0xfeul << 24) |
         ((u32_t)(netif->hwaddr[3]) << 16) |
         ((u32_t)(netif->hwaddr[4]) << 8) |
         (netif->hwaddr[5]));
@@ -1197,10 +1527,20 @@
       if (i == 4) {
         addr_index--;
       }
-      ip_2_ip6(&netif->ip6_addr[0])->addr[addr_index] |= ((u32_t)(netif->hwaddr[netif->hwaddr_len - i - 1])) << (8 * (i & 0x03));
+      ip_2_ip6(&netif->ip6_addr[0])->addr[addr_index] |= lwip_htonl(((u32_t)(netif->hwaddr[netif->hwaddr_len - i - 1])) << (8 * (i & 0x03)));
     }
   }
 
+  /* 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;
+   * 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
+   * zone field, so this should not create any compatibility problems. */
+  ip6_addr_assign_zone(ip_2_ip6(&netif->ip6_addr[0]), IP6_UNICAST, netif);
+
   /* Set address state. */
 #if LWIP_IPV6_DUP_DETECT_ATTEMPTS
   /* Will perform duplicate address detection (DAD). */
@@ -1226,6 +1566,11 @@
 {
   s8_t i;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ASSERT("netif_add_ip6_address: invalid netif", netif != NULL);
+  LWIP_ASSERT("netif_add_ip6_address: invalid ip6addr", ip6addr != NULL);
+
   i = netif_get_ip6_addr_match(netif, ip6addr);
   if (i >= 0) {
     /* Address already added */
@@ -1235,10 +1580,11 @@
     return ERR_OK;
   }
 
-  /* Find a free slot -- musn't be the first one (reserved for link local) */
-  for (i = 1; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
+  /* Find a free slot. The first one is reserved for link-local addresses. */
+  for (i = ip6_addr_islinklocal(ip6addr) ? 0 : 1; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
     if (ip6_addr_isinvalid(netif_ip6_addr_state(netif, i))) {
       ip_addr_copy_from_ip6(netif->ip6_addr[i], *ip6addr);
+      ip6_addr_assign_zone(ip_2_ip6(&netif->ip6_addr[i]), IP6_UNICAST, netif);
       netif_ip6_addr_set_state(netif, i, IP6_ADDR_TENTATIVE);
       if (chosen_idx != NULL) {
         *chosen_idx = i;
@@ -1265,3 +1611,185 @@
   return ERR_IF;
 }
 #endif /* LWIP_IPV6 */
+
+#if LWIP_IPV4
+/** Dummy IPv4 output function for netifs not supporting IPv4
+ */
+static err_t
+netif_null_output_ip4(struct netif *netif, struct pbuf *p, const ip4_addr_t *ipaddr)
+{
+  LWIP_UNUSED_ARG(netif);
+  LWIP_UNUSED_ARG(p);
+  LWIP_UNUSED_ARG(ipaddr);
+
+  return ERR_IF;
+}
+#endif /* LWIP_IPV4 */
+
+/**
+* @ingroup netif
+* Return the interface index for the netif with name
+* or NETIF_NO_INDEX if not found/on error
+*
+* @param name the name of the netif
+*/
+u8_t
+netif_name_to_index(const char *name)
+{
+  struct netif *netif = netif_find(name);
+  if (netif != NULL) {
+    return netif_get_index(netif);
+  }
+  /* No name found, return invalid index */
+  return NETIF_NO_INDEX;
+}
+
+/**
+* @ingroup netif
+* Return the interface name for the netif matching index
+* or NULL if not found/on error
+*
+* @param idx the interface index of the netif
+* @param name char buffer of at least NETIF_NAMESIZE bytes
+*/
+char *
+netif_index_to_name(u8_t idx, char *name)
+{
+  struct netif *netif = netif_get_by_index(idx);
+
+  if (netif != NULL) {
+    name[0] = netif->name[0];
+    name[1] = netif->name[1];
+    lwip_itoa(&name[2], NETIF_NAMESIZE - 2, netif_index_to_num(idx));
+    return name;
+  }
+  return NULL;
+}
+
+/**
+* @ingroup netif
+* Return the interface for the netif index
+*
+* @param idx index of netif to find
+*/
+struct netif *
+netif_get_by_index(u8_t idx)
+{
+  struct netif *netif;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  if (idx != NETIF_NO_INDEX) {
+    NETIF_FOREACH(netif) {
+      if (idx == netif_get_index(netif)) {
+        return netif; /* found! */
+      }
+    }
+  }
+
+  return NULL;
+}
+
+/**
+ * @ingroup netif
+ * Find a network interface by searching for its name
+ *
+ * @param name the name of the netif (like netif->name) plus concatenated number
+ * in ascii representation (e.g. 'en0')
+ */
+struct netif *
+netif_find(const char *name)
+{
+  struct netif *netif;
+  u8_t num;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  if (name == NULL) {
+    return NULL;
+  }
+
+  num = (u8_t)atoi(&name[2]);
+
+  NETIF_FOREACH(netif) {
+    if (num == netif->num &&
+        name[0] == netif->name[0] &&
+        name[1] == netif->name[1]) {
+      LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: found %c%c\n", name[0], name[1]));
+      return netif;
+    }
+  }
+  LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: didn't find %c%c\n", name[0], name[1]));
+  return NULL;
+}
+
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+/**
+ * @ingroup netif
+ * Add extended netif events listener
+ * @param callback pointer to listener structure
+ * @param fn callback function
+ */
+void
+netif_add_ext_callback(netif_ext_callback_t *callback, netif_ext_callback_fn fn)
+{
+  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ASSERT("callback must be != NULL", callback != NULL);
+  LWIP_ASSERT("fn must be != NULL", fn != NULL);
+
+  callback->callback_fn = fn;
+  callback->next        = ext_callback;
+  ext_callback          = callback;
+}
+
+/**
+ * @ingroup netif
+ * Remove extended netif events listener
+ * @param callback pointer to listener structure
+ */
+void
+netif_remove_ext_callback(netif_ext_callback_t* callback)
+{
+  netif_ext_callback_t *last, *iter;
+
+  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ASSERT("callback must be != NULL", callback != NULL);
+
+  if (ext_callback == NULL) {
+    return;
+  }
+
+  if (callback == ext_callback) {
+    ext_callback = ext_callback->next;
+  } else {
+    last = ext_callback;
+    for (iter = ext_callback->next; iter != NULL; last = iter, iter = iter->next) {
+      if (iter == callback) {
+        LWIP_ASSERT("last != NULL", last != NULL);
+        last->next = callback->next;
+        callback->next = NULL;
+        return;
+      }
+    }
+  }
+}
+
+/**
+ * Invoke extended netif status event
+ * @param netif netif that is affected by change
+ * @param reason change reason
+ * @param args depends on reason, see reason description
+ */
+void
+netif_invoke_ext_callback(struct netif *netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t *args)
+{
+  netif_ext_callback_t *callback = ext_callback;
+
+  LWIP_ASSERT("netif must be != NULL", netif != NULL);
+
+  while (callback != NULL) {
+    callback->callback_fn(netif, reason, args);
+    callback = callback->next;
+  }
+}
+#endif /* LWIP_NETIF_EXT_STATUS_CALLBACK */
diff --git a/src/core/pbuf.c b/src/core/pbuf.c
index 059f83a..a209e0c 100644
--- a/src/core/pbuf.c
+++ b/src/core/pbuf.c
@@ -33,48 +33,7 @@
  * Therefore, looping through a pbuf of a single packet, has an
  * loop end condition (tot_len == p->len), NOT (next == NULL).
  *
- * Example of custom pbuf usage for zero-copy RX:
-  @code{.c}
-typedef struct my_custom_pbuf
-{
-   struct pbuf_custom p;
-   void* dma_descriptor;
-} my_custom_pbuf_t;
-
-LWIP_MEMPOOL_DECLARE(RX_POOL, 10, sizeof(my_custom_pbuf_t), "Zero-copy RX PBUF pool");
-
-void my_pbuf_free_custom(void* p)
-{
-  my_custom_pbuf_t* my_puf = (my_custom_pbuf_t*)p;
-
-  LOCK_INTERRUPTS();
-  free_rx_dma_descriptor(my_pbuf->dma_descriptor);
-  LWIP_MEMPOOL_FREE(RX_POOL, my_pbuf);
-  UNLOCK_INTERRUPTS();
-}
-
-void eth_rx_irq()
-{
-  dma_descriptor*   dma_desc = get_RX_DMA_descriptor_from_ethernet();
-  my_custom_pbuf_t* my_pbuf  = (my_custom_pbuf_t*)LWIP_MEMPOOL_ALLOC(RX_POOL);
-
-  my_pbuf->p.custom_free_function = my_pbuf_free_custom;
-  my_pbuf->dma_descriptor         = dma_desc;
-
-  invalidate_cpu_cache(dma_desc->rx_data, dma_desc->rx_length);
-  
-  struct pbuf* p = pbuf_alloced_custom(PBUF_RAW,
-     dma_desc->rx_length,
-     PBUF_REF,
-     &my_pbuf->p,
-     dma_desc->rx_data,
-     dma_desc->max_buffer_size);
-
-  if(netif->input(p, netif) != ERR_OK) {
-    pbuf_free(p);
-  }
-}
-  @endcode
+ * Example of custom pbuf usage: @ref zerocopyrx
  */
 
 /*
@@ -111,12 +70,13 @@
 
 #include "lwip/opt.h"
 
+#include "lwip/pbuf.h"
 #include "lwip/stats.h"
 #include "lwip/def.h"
 #include "lwip/mem.h"
 #include "lwip/memp.h"
-#include "lwip/pbuf.h"
 #include "lwip/sys.h"
+#include "lwip/netif.h"
 #if LWIP_TCP && TCP_QUEUE_OOSEQ
 #include "lwip/priv/tcp_priv.h"
 #endif
@@ -131,6 +91,9 @@
    aligned there. Therefore, PBUF_POOL_BUFSIZE_ALIGNED can be used here. */
 #define PBUF_POOL_BUFSIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE)
 
+static const struct pbuf *
+pbuf_skip_const(const struct pbuf *in, u16_t in_offset, u16_t *out_offset);
+
 #if !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ
 #define PBUF_POOL_IS_EMPTY()
 #else /* !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ */
@@ -139,7 +102,7 @@
 #ifndef PBUF_POOL_FREE_OOSEQ_QUEUE_CALL
 #include "lwip/tcpip.h"
 #define PBUF_POOL_FREE_OOSEQ_QUEUE_CALL()  do { \
-  if (tcpip_callback_with_block(pbuf_free_ooseq_callback, NULL, 0) != ERR_OK) { \
+  if (tcpip_try_callback(pbuf_free_ooseq_callback, NULL) != ERR_OK) { \
       SYS_ARCH_PROTECT(old_level); \
       pbuf_free_ooseq_pending = 0; \
       SYS_ARCH_UNPROTECT(old_level); \
@@ -164,15 +127,14 @@
 void
 pbuf_free_ooseq(void)
 {
-  struct tcp_pcb* pcb;
+  struct tcp_pcb *pcb;
   SYS_ARCH_SET(pbuf_free_ooseq_pending, 0);
 
   for (pcb = tcp_active_pcbs; NULL != pcb; pcb = pcb->next) {
-    if (NULL != pcb->ooseq) {
+    if (pcb->ooseq != NULL) {
       /** Free the ooseq pbufs of one PCB only */
       LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free_ooseq: freeing out-of-sequence pbufs\n"));
-      tcp_segs_free(pcb->ooseq);
-      pcb->ooseq = NULL;
+      tcp_free_ooseq(pcb);
       return;
     }
   }
@@ -212,6 +174,20 @@
 }
 #endif /* !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ */
 
+/* Initialize members of struct pbuf after allocation */
+static void
+pbuf_init_alloced_pbuf(struct pbuf *p, void *payload, u16_t tot_len, u16_t len, pbuf_type type, u8_t flags)
+{
+  p->next = NULL;
+  p->payload = payload;
+  p->tot_len = tot_len;
+  p->len = len;
+  p->type_internal = (u8_t)type;
+  p->flags = flags;
+  p->ref = 1;
+  p->if_idx = NETIF_NO_INDEX;
+}
+
 /**
  * @ingroup pbuf
  * Allocates a pbuf of the given type (possibly a chain for PBUF_POOL type).
@@ -220,7 +196,7 @@
  * layer at which the pbuf is allocated and the requested size
  * (from the size parameter).
  *
- * @param layer flag to define header size
+ * @param layer header size
  * @param length size of the pbuf's payload
  * @param type this parameter decides how and where the pbuf
  * should be allocated as follows:
@@ -247,169 +223,131 @@
 struct pbuf *
 pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
 {
-  struct pbuf *p, *q, *r;
-  u16_t offset;
-  s32_t rem_len; /* remaining length */
+  struct pbuf *p;
+  u16_t offset = (u16_t)layer;
   LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F")\n", length));
 
-  /* determine header offset */
-  switch (layer) {
-  case PBUF_TRANSPORT:
-    /* add room for transport (often TCP) layer header */
-    offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN;
-    break;
-  case PBUF_IP:
-    /* add room for IP layer header */
-    offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN;
-    break;
-  case PBUF_LINK:
-    /* add room for link layer header */
-    offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN;
-    break;
-  case PBUF_RAW_TX:
-    /* add room for encapsulating link layer headers (e.g. 802.11) */
-    offset = PBUF_LINK_ENCAPSULATION_HLEN;
-    break;
-  case PBUF_RAW:
-    /* no offset (e.g. RX buffers or chain successors) */
-    offset = 0;
-    break;
-  default:
-    LWIP_ASSERT("pbuf_alloc: bad pbuf layer", 0);
-    return NULL;
-  }
-
   switch (type) {
-  case PBUF_POOL:
-    /* allocate head of pbuf chain into p */
-    p = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL);
-    LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc: allocated pbuf %p\n", (void *)p));
-    if (p == NULL) {
-      PBUF_POOL_IS_EMPTY();
-      return NULL;
+    case PBUF_REF: /* fall through */
+    case PBUF_ROM:
+      p = pbuf_alloc_reference(NULL, length, type);
+      break;
+    case PBUF_POOL: {
+      struct pbuf *q, *last;
+      u16_t rem_len; /* remaining length */
+      p = NULL;
+      last = NULL;
+      rem_len = length;
+      do {
+        u16_t qlen;
+        q = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL);
+        if (q == NULL) {
+          PBUF_POOL_IS_EMPTY();
+          /* free chain so far allocated */
+          if (p) {
+            pbuf_free(p);
+          }
+          /* bail out unsuccessfully */
+          return NULL;
+        }
+        qlen = LWIP_MIN(rem_len, (u16_t)(PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)));
+        pbuf_init_alloced_pbuf(q, LWIP_MEM_ALIGN((void *)((u8_t *)q + SIZEOF_STRUCT_PBUF + offset)),
+                               rem_len, qlen, type, 0);
+        LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned",
+                    ((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0);
+        LWIP_ASSERT("PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT",
+                    (PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)) > 0 );
+        if (p == NULL) {
+          /* allocated head of pbuf chain (into p) */
+          p = q;
+        } else {
+          /* make previous pbuf point to this pbuf */
+          last->next = q;
+        }
+        last = q;
+        rem_len = (u16_t)(rem_len - qlen);
+        offset = 0;
+      } while (rem_len > 0);
+      break;
     }
-    p->type = type;
-    p->next = NULL;
+    case PBUF_RAM: {
+      u16_t payload_len = (u16_t)(LWIP_MEM_ALIGN_SIZE(offset) + LWIP_MEM_ALIGN_SIZE(length));
+      mem_size_t alloc_len = (mem_size_t)(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF) + payload_len);
 
-    /* make the payload pointer point 'offset' bytes into pbuf data memory */
-    p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)));
-    LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
-            ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
-    /* the total length of the pbuf chain is the requested size */
-    p->tot_len = length;
-    /* set the length of the first pbuf in the chain */
-    p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset));
-    LWIP_ASSERT("check p->payload + p->len does not overflow pbuf",
-                ((u8_t*)p->payload + p->len <=
-                 (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED));
-    LWIP_ASSERT("PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT",
-      (PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)) > 0 );
-    /* set reference count (needed here in case we fail) */
-    p->ref = 1;
-
-    /* now allocate the tail of the pbuf chain */
-
-    /* remember first pbuf for linkage in next iteration */
-    r = p;
-    /* remaining length to be allocated */
-    rem_len = length - p->len;
-    /* any remaining pbufs to be allocated? */
-    while (rem_len > 0) {
-      q = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL);
-      if (q == NULL) {
-        PBUF_POOL_IS_EMPTY();
-        /* free chain so far allocated */
-        pbuf_free(p);
-        /* bail out unsuccessfully */
-        return NULL;
-      }
-      q->type = type;
-      q->flags = 0;
-      q->next = NULL;
-      /* make previous pbuf point to this pbuf */
-      r->next = q;
-      /* set total length of this pbuf and next in chain */
-      LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff);
-      q->tot_len = (u16_t)rem_len;
-      /* this pbuf length is pool size, unless smaller sized tail */
-      q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED);
-      q->payload = (void *)((u8_t *)q + SIZEOF_STRUCT_PBUF);
-      LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned",
-              ((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0);
-      LWIP_ASSERT("check p->payload + p->len does not overflow pbuf",
-                  ((u8_t*)p->payload + p->len <=
-                   (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED));
-      q->ref = 1;
-      /* calculate remaining length to be allocated */
-      rem_len -= q->len;
-      /* remember this pbuf for linkage in next iteration */
-      r = q;
-    }
-    /* end of chain */
-    /*r->next = NULL;*/
-
-    break;
-  case PBUF_RAM:
-    {
-      mem_size_t alloc_len = LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length);
-      
       /* bug #50040: Check for integer overflow when calculating alloc_len */
-      if (alloc_len < LWIP_MEM_ALIGN_SIZE(length)) {
+      if ((payload_len < LWIP_MEM_ALIGN_SIZE(length)) ||
+          (alloc_len < LWIP_MEM_ALIGN_SIZE(length))) {
         return NULL;
       }
-    
+
       /* If pbuf is to be allocated in RAM, allocate memory for it. */
-      p = (struct pbuf*)mem_malloc(alloc_len);
+      p = (struct pbuf *)mem_malloc(alloc_len);
+      if (p == NULL) {
+        return NULL;
+      }
+      pbuf_init_alloced_pbuf(p, LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset)),
+                             length, length, type, 0);
+      LWIP_ASSERT("pbuf_alloc: pbuf->payload properly aligned",
+                  ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
+      break;
     }
-
-    if (p == NULL) {
+    default:
+      LWIP_ASSERT("pbuf_alloc: erroneous type", 0);
       return NULL;
-    }
-    /* Set up internal structure of the pbuf. */
-    p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset));
-    p->len = p->tot_len = length;
-    p->next = NULL;
-    p->type = type;
-
-    LWIP_ASSERT("pbuf_alloc: pbuf->payload properly aligned",
-           ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
-    break;
-  /* pbuf references existing (non-volatile static constant) ROM payload? */
-  case PBUF_ROM:
-  /* pbuf references existing (externally allocated) RAM payload? */
-  case PBUF_REF:
-    /* only allocate memory for the pbuf structure */
-    p = (struct pbuf *)memp_malloc(MEMP_PBUF);
-    if (p == NULL) {
-      LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
-                  ("pbuf_alloc: Could not allocate MEMP_PBUF for PBUF_%s.\n",
-                  (type == PBUF_ROM) ? "ROM" : "REF"));
-      return NULL;
-    }
-    /* caller must set this field properly, afterwards */
-    p->payload = NULL;
-    p->len = p->tot_len = length;
-    p->next = NULL;
-    p->type = type;
-    break;
-  default:
-    LWIP_ASSERT("pbuf_alloc: erroneous type", 0);
-    return NULL;
   }
-  /* set reference count */
-  p->ref = 1;
-  /* set flags */
-  p->flags = 0;
   LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F") == %p\n", length, (void *)p));
   return p;
 }
 
+/**
+ * @ingroup pbuf
+ * Allocates a pbuf for referenced data.
+ * Referenced data can be volatile (PBUF_REF) or long-lived (PBUF_ROM).
+ *
+ * The actual memory allocated for the pbuf is determined by the
+ * layer at which the pbuf is allocated and the requested size
+ * (from the size parameter).
+ *
+ * @param payload referenced payload
+ * @param length size of the pbuf's payload
+ * @param type this parameter decides how and where the pbuf
+ * should be allocated as follows:
+ *
+ * - PBUF_ROM: It is assumed that the memory used is really
+ *             similar to ROM in that it is immutable and will not be
+ *             changed. Memory which is dynamic should generally not
+ *             be attached to PBUF_ROM pbufs. Use PBUF_REF instead.
+ * - PBUF_REF: It is assumed that the pbuf is only
+ *             being used in a single thread. If the pbuf gets queued,
+ *             then pbuf_take should be called to copy the buffer.
+ *
+ * @return the allocated pbuf.
+ */
+struct pbuf *
+pbuf_alloc_reference(void *payload, u16_t length, pbuf_type type)
+{
+  struct pbuf *p;
+  LWIP_ASSERT("invalid pbuf_type", (type == PBUF_REF) || (type == PBUF_ROM));
+  /* only allocate memory for the pbuf structure */
+  p = (struct pbuf *)memp_malloc(MEMP_PBUF);
+  if (p == NULL) {
+    LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
+                ("pbuf_alloc_reference: Could not allocate MEMP_PBUF for PBUF_%s.\n",
+                 (type == PBUF_ROM) ? "ROM" : "REF"));
+    return NULL;
+  }
+  pbuf_init_alloced_pbuf(p, payload, length, length, type, 0);
+  return p;
+}
+
+
 #if LWIP_SUPPORT_CUSTOM_PBUF
 /**
  * @ingroup pbuf
  * Initialize a custom pbuf (already allocated).
+ * Example of custom pbuf usage: @ref zerocopyrx
  *
- * @param l flag to define header size
+ * @param l header size
  * @param length size of the pbuf's payload
  * @param type type of the pbuf (only used to treat the pbuf accordingly, as
  *        this function allocates no memory)
@@ -421,54 +359,25 @@
  * @param payload_mem_len the size of the 'payload_mem' buffer, must be at least
  *        big enough to hold 'length' plus the header size
  */
-struct pbuf*
+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)
 {
-  u16_t offset;
+  u16_t offset = (u16_t)l;
+  void *payload;
   LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloced_custom(length=%"U16_F")\n", length));
 
-  /* determine header offset */
-  switch (l) {
-  case PBUF_TRANSPORT:
-    /* add room for transport (often TCP) layer header */
-    offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN;
-    break;
-  case PBUF_IP:
-    /* add room for IP layer header */
-    offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN;
-    break;
-  case PBUF_LINK:
-    /* add room for link layer header */
-    offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN;
-    break;
-  case PBUF_RAW_TX:
-    /* add room for encapsulating link layer headers (e.g. 802.11) */
-    offset = PBUF_LINK_ENCAPSULATION_HLEN;
-    break;
-  case PBUF_RAW:
-    offset = 0;
-    break;
-  default:
-    LWIP_ASSERT("pbuf_alloced_custom: bad pbuf layer", 0);
-    return NULL;
-  }
-
   if (LWIP_MEM_ALIGN_SIZE(offset) + length > payload_mem_len) {
     LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_WARNING, ("pbuf_alloced_custom(length=%"U16_F") buffer too short\n", length));
     return NULL;
   }
 
-  p->pbuf.next = NULL;
   if (payload_mem != NULL) {
-    p->pbuf.payload = (u8_t *)payload_mem + LWIP_MEM_ALIGN_SIZE(offset);
+    payload = (u8_t *)payload_mem + LWIP_MEM_ALIGN_SIZE(offset);
   } else {
-    p->pbuf.payload = NULL;
+    payload = NULL;
   }
-  p->pbuf.flags = PBUF_FLAG_IS_CUSTOM;
-  p->pbuf.len = p->pbuf.tot_len = length;
-  p->pbuf.type = type;
-  p->pbuf.ref = 1;
+  pbuf_init_alloced_pbuf(&p->pbuf, payload, length, length, type, PBUF_FLAG_IS_CUSTOM);
   return &p->pbuf;
 }
 #endif /* LWIP_SUPPORT_CUSTOM_PBUF */
@@ -494,13 +403,9 @@
 {
   struct pbuf *q;
   u16_t rem_len; /* remaining length */
-  s32_t grow;
+  u16_t shrink;
 
   LWIP_ASSERT("pbuf_realloc: p != NULL", p != NULL);
-  LWIP_ASSERT("pbuf_realloc: sane p->type", p->type == PBUF_POOL ||
-              p->type == PBUF_ROM ||
-              p->type == PBUF_RAM ||
-              p->type == PBUF_REF);
 
   /* desired length larger than current length? */
   if (new_len >= p->tot_len) {
@@ -510,7 +415,7 @@
 
   /* the pbuf chain grows by (new_len - p->tot_len) bytes
    * (which may be negative in case of shrinking) */
-  grow = new_len - p->tot_len;
+  shrink = (u16_t)(p->tot_len - new_len);
 
   /* first, step over any pbufs that should remain in the chain */
   rem_len = new_len;
@@ -518,10 +423,9 @@
   /* should this pbuf be kept? */
   while (rem_len > q->len) {
     /* decrease remaining length by pbuf length */
-    rem_len -= q->len;
+    rem_len = (u16_t)(rem_len - q->len);
     /* decrease total length indicator */
-    LWIP_ASSERT("grow < max_u16_t", grow < 0xffff);
-    q->tot_len += (u16_t)grow;
+    q->tot_len = (u16_t)(q->tot_len - shrink);
     /* proceed to next pbuf in chain */
     q = q->next;
     LWIP_ASSERT("pbuf_realloc: q != NULL", q != NULL);
@@ -531,13 +435,13 @@
 
   /* shrink allocated memory for PBUF_RAM */
   /* (other types merely adjust their length fields */
-  if ((q->type == PBUF_RAM) && (rem_len != q->len)
+  if (pbuf_match_allocsrc(q, PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP) && (rem_len != q->len)
 #if LWIP_SUPPORT_CUSTOM_PBUF
       && ((q->flags & PBUF_FLAG_IS_CUSTOM) == 0)
 #endif /* LWIP_SUPPORT_CUSTOM_PBUF */
      ) {
     /* reallocate and adjust the length of the pbuf that will be split */
-    q = (struct pbuf *)mem_trim(q, (u16_t)((u8_t *)q->payload - (u8_t *)q) + rem_len);
+    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);
   }
   /* adjust length fields for new last pbuf */
@@ -555,8 +459,8 @@
 }
 
 /**
- * Adjusts the payload pointer to hide or reveal headers in the payload.
- * @see pbuf_header.
+ * Adjusts the payload pointer to reveal headers in the payload.
+ * @see pbuf_add_header.
  *
  * @param p pbuf to change the header size.
  * @param header_size_increment Number of bytes to increment header size.
@@ -566,82 +470,159 @@
  *
  */
 static u8_t
-pbuf_header_impl(struct pbuf *p, s16_t header_size_increment, u8_t force)
+pbuf_add_header_impl(struct pbuf *p, size_t header_size_increment, u8_t force)
 {
-  u16_t type;
+  u16_t type_internal;
   void *payload;
   u16_t increment_magnitude;
 
   LWIP_ASSERT("p != NULL", p != NULL);
-  if ((header_size_increment == 0) || (p == NULL)) {
+  if ((p == NULL) || (header_size_increment > 0xFFFF)) {
+    return 1;
+  }
+  if (header_size_increment == 0) {
     return 0;
   }
 
-  if (header_size_increment < 0) {
-    increment_magnitude = (u16_t)-header_size_increment;
-    /* Check that we aren't going to move off the end of the pbuf */
-    LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;);
-  } else {
-    increment_magnitude = (u16_t)header_size_increment;
-#if 0
-    /* Can't assert these as some callers speculatively call
-         pbuf_header() to see if it's OK.  Will return 1 below instead. */
-    /* Check that we've got the correct type of pbuf to work with */
-    LWIP_ASSERT("p->type == PBUF_RAM || p->type == PBUF_POOL",
-                p->type == PBUF_RAM || p->type == PBUF_POOL);
-    /* Check that we aren't going to move off the beginning of the pbuf */
-    LWIP_ASSERT("p->payload - increment_magnitude >= p + SIZEOF_STRUCT_PBUF",
-                (u8_t *)p->payload - increment_magnitude >= (u8_t *)p + SIZEOF_STRUCT_PBUF);
-#endif
+  increment_magnitude = (u16_t)header_size_increment;
+  /* Do not allow tot_len to wrap as a result. */
+  if ((u16_t)(increment_magnitude + p->tot_len) < increment_magnitude) {
+    return 1;
   }
 
-  type = p->type;
-  /* remember current payload pointer */
-  payload = p->payload;
+  type_internal = p->type_internal;
 
   /* pbuf types containing payloads? */
-  if (type == PBUF_RAM || type == PBUF_POOL) {
+  if (type_internal & PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS) {
     /* set new payload pointer */
-    p->payload = (u8_t *)p->payload - header_size_increment;
+    payload = (u8_t *)p->payload - header_size_increment;
     /* boundary check fails? */
-    if ((u8_t *)p->payload < (u8_t *)p + SIZEOF_STRUCT_PBUF) {
+    if ((u8_t *)payload < (u8_t *)p + SIZEOF_STRUCT_PBUF) {
       LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE,
-        ("pbuf_header: failed as %p < %p (not enough space for new header size)\n",
-        (void *)p->payload, (void *)((u8_t *)p + SIZEOF_STRUCT_PBUF)));
-      /* restore old payload pointer */
-      p->payload = payload;
+                   ("pbuf_add_header: failed as %p < %p (not enough space for new header size)\n",
+                    (void *)payload, (void *)((u8_t *)p + SIZEOF_STRUCT_PBUF)));
       /* bail out unsuccessfully */
       return 1;
     }
-  /* pbuf types referring to external payloads? */
-  } else if (type == PBUF_REF || type == PBUF_ROM) {
+    /* pbuf types referring to external payloads? */
+  } else {
     /* hide a header in the payload? */
-    if ((header_size_increment < 0) && (increment_magnitude <= p->len)) {
-      /* increase payload pointer */
-      p->payload = (u8_t *)p->payload - header_size_increment;
-    } else if ((header_size_increment > 0) && force) {
-      p->payload = (u8_t *)p->payload - header_size_increment;
+    if (force) {
+      payload = (u8_t *)p->payload - header_size_increment;
     } else {
       /* cannot expand payload to front (yet!)
        * bail out unsuccessfully */
       return 1;
     }
-  } else {
-    /* Unknown type */
-    LWIP_ASSERT("bad pbuf type", 0);
-    return 1;
   }
-  /* modify pbuf length fields */
-  p->len += header_size_increment;
-  p->tot_len += header_size_increment;
+  LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_add_header: old %p new %p (%"U16_F")\n",
+              (void *)p->payload, (void *)payload, increment_magnitude));
 
-  LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_header: old %p new %p (%"S16_F")\n",
-    (void *)payload, (void *)p->payload, header_size_increment));
+  /* modify pbuf fields */
+  p->payload = payload;
+  p->len = (u16_t)(p->len + increment_magnitude);
+  p->tot_len = (u16_t)(p->tot_len + increment_magnitude);
+
 
   return 0;
 }
 
 /**
+ * Adjusts the payload pointer to reveal headers in the payload.
+ *
+ * Adjusts the ->payload pointer so that space for a header
+ * appears in the pbuf payload.
+ *
+ * The ->payload, ->tot_len and ->len fields are adjusted.
+ *
+ * @param p pbuf to change the header size.
+ * @param header_size_increment Number of bytes to increment header size which
+ *          increases the size of the pbuf. New space is on the front.
+ *          If header_size_increment is 0, this function does nothing and returns successful.
+ *
+ * PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so
+ * the call will fail. A check is made that the increase in header size does
+ * not move the payload pointer in front of the start of the buffer.
+ *
+ * @return non-zero on failure, zero on success.
+ *
+ */
+u8_t
+pbuf_add_header(struct pbuf *p, size_t header_size_increment)
+{
+  return pbuf_add_header_impl(p, header_size_increment, 0);
+}
+
+/**
+ * Same as @ref pbuf_add_header but does not check if 'header_size > 0' is allowed.
+ * This is used internally only, to allow PBUF_REF for RX.
+ */
+u8_t
+pbuf_add_header_force(struct pbuf *p, size_t header_size_increment)
+{
+  return pbuf_add_header_impl(p, header_size_increment, 1);
+}
+
+/**
+ * Adjusts the payload pointer to hide headers in the payload.
+ *
+ * Adjusts the ->payload pointer so that space for a header
+ * disappears in the pbuf payload.
+ *
+ * The ->payload, ->tot_len and ->len fields are adjusted.
+ *
+ * @param p pbuf to change the header size.
+ * @param header_size_decrement Number of bytes to decrement header size which
+ *          decreases the size of the pbuf.
+ *          If header_size_decrement is 0, this function does nothing and returns successful.
+ * @return non-zero on failure, zero on success.
+ *
+ */
+u8_t
+pbuf_remove_header(struct pbuf *p, size_t header_size_decrement)
+{
+  void *payload;
+  u16_t increment_magnitude;
+
+  LWIP_ASSERT("p != NULL", p != NULL);
+  if ((p == NULL) || (header_size_decrement > 0xFFFF)) {
+    return 1;
+  }
+  if (header_size_decrement == 0) {
+    return 0;
+  }
+
+  increment_magnitude = (u16_t)header_size_decrement;
+  /* Check that we aren't going to move off the end of the pbuf */
+  LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;);
+
+  /* remember current payload pointer */
+  payload = p->payload;
+  LWIP_UNUSED_ARG(payload); /* only used in LWIP_DEBUGF below */
+
+  /* increase payload pointer (guarded by length check above) */
+  p->payload = (u8_t *)p->payload + header_size_decrement;
+  /* modify pbuf length fields */
+  p->len = (u16_t)(p->len - increment_magnitude);
+  p->tot_len = (u16_t)(p->tot_len - increment_magnitude);
+
+  LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_remove_header: old %p new %p (%"U16_F")\n",
+              (void *)payload, (void *)p->payload, increment_magnitude));
+
+  return 0;
+}
+
+static u8_t
+pbuf_header_impl(struct pbuf *p, s16_t header_size_increment, u8_t force)
+{
+  if (header_size_increment < 0) {
+    return pbuf_remove_header(p, (size_t) - header_size_increment);
+  } else {
+    return pbuf_add_header_impl(p, (size_t)header_size_increment, force);
+  }
+}
+
+/**
  * Adjusts the payload pointer to hide or reveal headers in the payload.
  *
  * Adjusts the ->payload pointer so that space for a header
@@ -653,7 +634,7 @@
  * @param header_size_increment Number of bytes to increment header size which
  * increases the size of the pbuf. New space is on the front.
  * (Using a negative value decreases the header size.)
- * If hdr_size_inc is 0, this function does nothing and returns successful.
+ * If header_size_increment is 0, this function does nothing and returns successful.
  *
  * PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so
  * the call will fail. A check is made that the increase in header size does
@@ -664,7 +645,7 @@
 u8_t
 pbuf_header(struct pbuf *p, s16_t header_size_increment)
 {
-   return pbuf_header_impl(p, header_size_increment, 0);
+  return pbuf_header_impl(p, header_size_increment, 0);
 }
 
 /**
@@ -674,7 +655,36 @@
 u8_t
 pbuf_header_force(struct pbuf *p, s16_t header_size_increment)
 {
-   return pbuf_header_impl(p, header_size_increment, 1);
+  return pbuf_header_impl(p, header_size_increment, 1);
+}
+
+/** Similar to pbuf_header(-size) but de-refs header pbufs for (size >= p->len)
+ *
+ * @param q pbufs to operate on
+ * @param size The number of bytes to remove from the beginning of the pbuf list.
+ *             While size >= p->len, pbufs are freed.
+ *        ATTENTION: this is the opposite direction as @ref pbuf_header, but
+ *                   takes an u16_t not s16_t!
+ * @return the new head pbuf
+ */
+struct pbuf *
+pbuf_free_header(struct pbuf *q, u16_t size)
+{
+  struct pbuf *p = q;
+  u16_t free_left = size;
+  while (free_left && p) {
+    if (free_left >= p->len) {
+      struct pbuf *f = p;
+      free_left = (u16_t)(free_left - p->len);
+      p = p->next;
+      f->next = 0;
+      pbuf_free(f);
+    } else {
+      pbuf_remove_header(p, free_left);
+      free_left = 0;
+    }
+  }
+  return p;
 }
 
 /**
@@ -714,7 +724,7 @@
 u8_t
 pbuf_free(struct pbuf *p)
 {
-  u16_t type;
+  u8_t alloc_src;
   struct pbuf *q;
   u8_t count;
 
@@ -722,22 +732,18 @@
     LWIP_ASSERT("p != NULL", p != NULL);
     /* if assertions are disabled, proceed with debug output */
     LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
-      ("pbuf_free(p == NULL) was called.\n"));
+                ("pbuf_free(p == NULL) was called.\n"));
     return 0;
   }
   LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free(%p)\n", (void *)p));
 
   PERF_START;
 
-  LWIP_ASSERT("pbuf_free: sane type",
-    p->type == PBUF_RAM || p->type == PBUF_ROM ||
-    p->type == PBUF_REF || p->type == PBUF_POOL);
-
   count = 0;
   /* de-allocate all consecutive pbufs from the head of the chain that
    * obtain a zero reference count after decrementing*/
   while (p != NULL) {
-    u16_t ref;
+    LWIP_PBUF_REF_T ref;
     SYS_ARCH_DECL_PROTECT(old_level);
     /* Since decrementing ref cannot be guaranteed to be a single machine operation
      * we must protect it. We put the new ref into a local variable to prevent
@@ -753,34 +759,37 @@
       /* remember next pbuf in chain for next iteration */
       q = p->next;
       LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: deallocating %p\n", (void *)p));
-      type = p->type;
+      alloc_src = pbuf_get_allocsrc(p);
 #if LWIP_SUPPORT_CUSTOM_PBUF
       /* is this a custom pbuf? */
       if ((p->flags & PBUF_FLAG_IS_CUSTOM) != 0) {
-        struct pbuf_custom *pc = (struct pbuf_custom*)p;
+        struct pbuf_custom *pc = (struct pbuf_custom *)p;
         LWIP_ASSERT("pc->custom_free_function != NULL", pc->custom_free_function != NULL);
         pc->custom_free_function(p);
       } else
 #endif /* LWIP_SUPPORT_CUSTOM_PBUF */
       {
         /* is this a pbuf from the pool? */
-        if (type == PBUF_POOL) {
+        if (alloc_src == PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF_POOL) {
           memp_free(MEMP_PBUF_POOL, p);
-        /* is this a ROM or RAM referencing pbuf? */
-        } else if (type == PBUF_ROM || type == PBUF_REF) {
+          /* is this a ROM or RAM referencing pbuf? */
+        } else if (alloc_src == PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF) {
           memp_free(MEMP_PBUF, p);
-        /* type == PBUF_RAM */
-        } else {
+          /* type == PBUF_RAM */
+        } else if (alloc_src == PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP) {
           mem_free(p);
+        } else {
+          /* @todo: support freeing other types */
+          LWIP_ASSERT("invalid pbuf type", 0);
         }
       }
       count++;
       /* proceed to next pbuf */
       p = q;
-    /* p->ref > 0, this pbuf is still referenced to */
-    /* (and so the remaining pbufs in chain as well) */
+      /* p->ref > 0, this pbuf is still referenced to */
+      /* (and so the remaining pbufs in chain as well) */
     } else {
-      LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: %p has ref %"U16_F", ending here.\n", (void *)p, ref));
+      LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: %p has ref %"U16_F", ending here.\n", (void *)p, (u16_t)ref));
       /* stop walking through the chain */
       p = NULL;
     }
@@ -821,7 +830,7 @@
 {
   /* pbuf given? */
   if (p != NULL) {
-    SYS_ARCH_INC(p->ref, 1);
+    SYS_ARCH_SET(p->ref, (LWIP_PBUF_REF_T)(p->ref + 1));
     LWIP_ASSERT("pbuf ref overflow", p->ref > 0);
   }
 }
@@ -834,6 +843,10 @@
  * @note The caller MAY NOT reference the tail pbuf afterwards.
  * Use pbuf_chain() for that purpose.
  *
+ * This function explicitly does not check for tot_len overflow to prevent
+ * failing to queue too long pbufs. This can produce invalid pbufs, so
+ * handle with care!
+ *
  * @see pbuf_chain()
  */
 void
@@ -847,13 +860,13 @@
   /* proceed to last pbuf of chain */
   for (p = h; p->next != NULL; p = p->next) {
     /* add total length of second chain to all totals of first chain */
-    p->tot_len += t->tot_len;
+    p->tot_len = (u16_t)(p->tot_len + t->tot_len);
   }
   /* { p is last pbuf of first h chain, p->next == NULL } */
   LWIP_ASSERT("p->tot_len == p->len (of last pbuf in chain)", p->tot_len == p->len);
   LWIP_ASSERT("p->next == NULL", p->next == NULL);
   /* add total length of second chain to last pbuf total of first chain */
-  p->tot_len += t->tot_len;
+  p->tot_len = (u16_t)(p->tot_len + t->tot_len);
   /* chain last pbuf of head (p) with first of tail (t) */
   p->next = t;
   /* p->next now references t, but the caller will drop its reference to t,
@@ -907,7 +920,7 @@
     /* assert tot_len invariant: (p->tot_len == p->len + (p->next? p->next->tot_len: 0) */
     LWIP_ASSERT("p->tot_len == p->len + q->tot_len", q->tot_len == p->tot_len - p->len);
     /* enforce invariant if assertion is disabled */
-    q->tot_len = p->tot_len - p->len;
+    q->tot_len = (u16_t)(p->tot_len - p->len);
     /* decouple pbuf from remainder */
     p->next = NULL;
     /* total length of pbuf p is its own length only */
@@ -947,18 +960,17 @@
 err_t
 pbuf_copy(struct pbuf *p_to, const struct pbuf *p_from)
 {
-  u16_t offset_to=0, offset_from=0, len;
+  size_t offset_to = 0, offset_from = 0, len;
 
   LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy(%p, %p)\n",
-    (const void*)p_to, (const void*)p_from));
+              (const void *)p_to, (const void *)p_from));
 
   /* is the target big enough to hold the source? */
   LWIP_ERROR("pbuf_copy: target not big enough to hold source", ((p_to != NULL) &&
              (p_from != NULL) && (p_to->tot_len >= p_from->tot_len)), return ERR_ARG;);
 
   /* iterate through pbuf chain */
-  do
-  {
+  do {
     /* 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 */
@@ -967,7 +979,7 @@
       /* current p_from does not fit into current p_to */
       len = p_to->len - offset_to;
     }
-    MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len);
+    MEMCPY((u8_t *)p_to->payload + offset_to, (u8_t *)p_from->payload + offset_from, len);
     offset_to += len;
     offset_from += len;
     LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len);
@@ -981,7 +993,7 @@
       /* on to next p_to (if any) */
       offset_to = 0;
       p_to = p_to->next;
-      LWIP_ERROR("p_to != NULL", (p_to != NULL) || (p_from == NULL) , return ERR_ARG;);
+      LWIP_ERROR("p_to != NULL", (p_to != NULL) || (p_from == NULL), return ERR_ARG;);
     }
 
     if ((p_from != NULL) && (p_from->len == p_from->tot_len)) {
@@ -992,7 +1004,7 @@
     if ((p_to != NULL) && (p_to->len == p_to->tot_len)) {
       /* don't copy more than one packet! */
       LWIP_ERROR("pbuf_copy() does not allow packet queues!",
-                  (p_to->next == NULL), return ERR_VAL;);
+                 (p_to->next == NULL), return ERR_VAL;);
     }
   } while (p_from);
   LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy: end of chain reached.\n"));
@@ -1015,41 +1027,76 @@
 pbuf_copy_partial(const struct pbuf *buf, void *dataptr, u16_t len, u16_t offset)
 {
   const struct pbuf *p;
-  u16_t left;
+  u16_t left = 0;
   u16_t buf_copy_len;
   u16_t copied_total = 0;
 
   LWIP_ERROR("pbuf_copy_partial: invalid buf", (buf != NULL), return 0;);
   LWIP_ERROR("pbuf_copy_partial: invalid dataptr", (dataptr != NULL), return 0;);
 
-  left = 0;
-
-  if ((buf == NULL) || (dataptr == NULL)) {
-    return 0;
-  }
-
   /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */
   for (p = buf; len != 0 && p != NULL; p = p->next) {
     if ((offset != 0) && (offset >= p->len)) {
       /* don't copy from this buffer -> on to the next */
-      offset -= p->len;
+      offset = (u16_t)(offset - p->len);
     } else {
       /* copy from this buffer. maybe only partially. */
-      buf_copy_len = p->len - offset;
+      buf_copy_len = (u16_t)(p->len - offset);
       if (buf_copy_len > len) {
         buf_copy_len = len;
       }
       /* copy the necessary parts of the buffer */
-      MEMCPY(&((char*)dataptr)[left], &((char*)p->payload)[offset], buf_copy_len);
-      copied_total += buf_copy_len;
-      left += buf_copy_len;
-      len -= buf_copy_len;
+      MEMCPY(&((char *)dataptr)[left], &((char *)p->payload)[offset], buf_copy_len);
+      copied_total = (u16_t)(copied_total + buf_copy_len);
+      left = (u16_t)(left + buf_copy_len);
+      len = (u16_t)(len - buf_copy_len);
       offset = 0;
     }
   }
   return copied_total;
 }
 
+/**
+ * @ingroup pbuf
+ * Get part of a pbuf's payload as contiguous memory. The returned memory is
+ * either a pointer into the pbuf's payload or, if split over multiple pbufs,
+ * a copy into the user-supplied buffer.
+ *
+ * @param p the pbuf from which to copy data
+ * @param buffer the application supplied buffer
+ * @param bufsize size of the application supplied buffer
+ * @param len length of data to copy (dataptr must be big enough). No more
+ * than buf->tot_len will be copied, irrespective of len
+ * @param offset offset into the packet buffer from where to begin copying len bytes
+ * @return the number of bytes copied, or 0 on failure
+ */
+void *
+pbuf_get_contiguous(const struct pbuf *p, void *buffer, size_t bufsize, u16_t len, u16_t offset)
+{
+  const struct pbuf *q;
+  u16_t out_offset;
+
+  LWIP_ERROR("pbuf_get_contiguous: invalid buf", (p != NULL), return NULL;);
+  LWIP_ERROR("pbuf_get_contiguous: invalid dataptr", (buffer != NULL), return NULL;);
+  LWIP_ERROR("pbuf_get_contiguous: invalid dataptr", (bufsize >= len), return NULL;);
+
+  q = pbuf_skip_const(p, offset, &out_offset);
+  if (q != NULL) {
+    if (q->len >= (out_offset + len)) {
+      /* all data in this pbuf, return zero-copy */
+      return (u8_t *)q->payload + out_offset;
+    }
+    /* need to copy */
+    if (pbuf_copy_partial(q, buffer, len, out_offset) != len) {
+      /* copying failed: pbuf is too short */
+      return NULL;
+    }
+    return buffer;
+  }
+  /* pbuf is too short (offset does not fit in) */
+  return NULL;
+}
+
 #if LWIP_TCP && TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
 /**
  * This method modifies a 'pbuf chain', so that its total length is
@@ -1072,8 +1119,8 @@
     struct pbuf *r = p->next;
 
     /* continue until the total length (summed up as u16_t) overflows */
-    while ((r != NULL) && ((u16_t)(tot_len_front + r->len) > tot_len_front)) {
-      tot_len_front += r->len;
+    while ((r != NULL) && ((u16_t)(tot_len_front + r->len) >= tot_len_front)) {
+      tot_len_front = (u16_t)(tot_len_front + r->len);
       i = r;
       r = r->next;
     }
@@ -1084,7 +1131,7 @@
     if (r != NULL) {
       /* Update the tot_len field in the first part */
       for (i = p; i != NULL; i = i->next) {
-        i->tot_len -= r->tot_len;
+        i->tot_len = (u16_t)(i->tot_len - r->tot_len);
         LWIP_ASSERT("tot_len/len mismatch in last pbuf",
                     (i->next != NULL) || (i->tot_len == i->len));
       }
@@ -1101,15 +1148,15 @@
 #endif /* LWIP_TCP && TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
 
 /* Actual implementation of pbuf_skip() but returning const pointer... */
-static const struct pbuf*
-pbuf_skip_const(const struct pbuf* in, u16_t in_offset, u16_t* out_offset)
+static const struct pbuf *
+pbuf_skip_const(const struct pbuf *in, u16_t in_offset, u16_t *out_offset)
 {
   u16_t offset_left = in_offset;
-  const struct pbuf* q = in;
+  const struct pbuf *q = in;
 
   /* get the correct pbuf */
   while ((q != NULL) && (q->len <= offset_left)) {
-    offset_left -= q->len;
+    offset_left = (u16_t)(offset_left - q->len);
     q = q->next;
   }
   if (out_offset != NULL) {
@@ -1127,11 +1174,11 @@
  * @param out_offset resulting offset in the returned pbuf
  * @return the pbuf in the queue where the offset is
  */
-struct pbuf*
-pbuf_skip(struct pbuf* in, u16_t in_offset, u16_t* out_offset)
+struct pbuf *
+pbuf_skip(struct pbuf *in, u16_t in_offset, u16_t *out_offset)
 {
-  const struct pbuf* out = pbuf_skip_const(in, in_offset, out_offset);
-  return LWIP_CONST_CAST(struct pbuf*, out);
+  const struct pbuf *out = pbuf_skip_const(in, in_offset, out_offset);
+  return LWIP_CONST_CAST(struct pbuf *, out);
 }
 
 /**
@@ -1149,9 +1196,9 @@
 pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len)
 {
   struct pbuf *p;
-  u16_t buf_copy_len;
-  u16_t total_copy_len = len;
-  u16_t copied_total = 0;
+  size_t buf_copy_len;
+  size_t total_copy_len = len;
+  size_t copied_total = 0;
 
   LWIP_ERROR("pbuf_take: invalid buf", (buf != NULL), return ERR_ARG;);
   LWIP_ERROR("pbuf_take: invalid dataptr", (dataptr != NULL), return ERR_ARG;);
@@ -1170,7 +1217,7 @@
       buf_copy_len = p->len;
     }
     /* copy the necessary parts of the buffer */
-    MEMCPY(p->payload, &((const char*)dataptr)[copied_total], buf_copy_len);
+    MEMCPY(p->payload, &((const char *)dataptr)[copied_total], buf_copy_len);
     total_copy_len -= buf_copy_len;
     copied_total += buf_copy_len;
   }
@@ -1193,16 +1240,18 @@
 pbuf_take_at(struct pbuf *buf, const void *dataptr, u16_t len, u16_t offset)
 {
   u16_t target_offset;
-  struct pbuf* q = pbuf_skip(buf, offset, &target_offset);
+  struct pbuf *q = pbuf_skip(buf, offset, &target_offset);
 
   /* return requested data if pbuf is OK */
   if ((q != NULL) && (q->tot_len >= target_offset + len)) {
     u16_t remaining_len = len;
-    const u8_t* src_ptr = (const u8_t*)dataptr;
+    const u8_t *src_ptr = (const u8_t *)dataptr;
     /* copy the part that goes into the first pbuf */
-    u16_t first_copy_len = LWIP_MIN(q->len - target_offset, len);
-    MEMCPY(((u8_t*)q->payload) + target_offset, dataptr, first_copy_len);
-    remaining_len -= first_copy_len;
+    u16_t first_copy_len;
+    LWIP_ASSERT("check pbuf_skip result", target_offset < q->len);
+    first_copy_len = (u16_t)LWIP_MIN(q->len - target_offset, len);
+    MEMCPY(((u8_t *)q->payload) + target_offset, dataptr, first_copy_len);
+    remaining_len = (u16_t)(remaining_len - first_copy_len);
     src_ptr += first_copy_len;
     if (remaining_len > 0) {
       return pbuf_take(q->next, src_ptr, remaining_len);
@@ -1225,23 +1274,46 @@
  * @return a new, single pbuf (p->next is NULL)
  *         or the old pbuf if allocation fails
  */
-struct pbuf*
+struct pbuf *
 pbuf_coalesce(struct pbuf *p, pbuf_layer layer)
 {
   struct pbuf *q;
-  err_t err;
   if (p->next == NULL) {
     return p;
   }
-  q = pbuf_alloc(layer, p->tot_len, PBUF_RAM);
+  q = pbuf_clone(layer, PBUF_RAM, p);
   if (q == NULL) {
     /* @todo: what do we do now? */
     return p;
   }
+  pbuf_free(p);
+  return q;
+}
+
+/**
+ * @ingroup pbuf
+ * Allocates a new pbuf of same length (via pbuf_alloc()) and copies the source
+ * pbuf into this new pbuf (using pbuf_copy()).
+ *
+ * @param layer pbuf_layer of the new pbuf
+ * @param type this parameter decides how and where the pbuf should be allocated
+ *             (@see pbuf_alloc())
+ * @param p the source pbuf
+ *
+ * @return a new pbuf or NULL if allocation fails
+ */
+struct pbuf *
+pbuf_clone(pbuf_layer layer, pbuf_type type, struct pbuf *p)
+{
+  struct pbuf *q;
+  err_t err;
+  q = pbuf_alloc(layer, p->tot_len, type);
+  if (q == NULL) {
+    return NULL;
+  }
   err = pbuf_copy(q, p);
   LWIP_UNUSED_ARG(err); /* in case of LWIP_NOASSERT */
   LWIP_ASSERT("pbuf_copy failed", err == ERR_OK);
-  pbuf_free(p);
   return q;
 }
 
@@ -1274,7 +1346,7 @@
     return ERR_ARG;
   }
 
-  dst_ptr = ((char*)p->payload) + start_offset;
+  dst_ptr = ((char *)p->payload) + start_offset;
   copy_chksum = LWIP_CHKSUM_COPY(dst_ptr, dataptr, len);
   if ((start_offset & 1) != 0) {
     copy_chksum = SWAP_BYTES_IN_WORD(copy_chksum);
@@ -1296,7 +1368,7 @@
  * @return byte at an offset into p OR ZERO IF 'offset' >= p->tot_len
  */
 u8_t
-pbuf_get_at(const struct pbuf* p, u16_t offset)
+pbuf_get_at(const struct pbuf *p, u16_t offset)
 {
   int ret = pbuf_try_get_at(p, offset);
   if (ret >= 0) {
@@ -1314,14 +1386,14 @@
  * @return byte at an offset into p [0..0xFF] OR negative if 'offset' >= p->tot_len
  */
 int
-pbuf_try_get_at(const struct pbuf* p, u16_t offset)
+pbuf_try_get_at(const struct pbuf *p, u16_t offset)
 {
   u16_t q_idx;
-  const struct pbuf* q = pbuf_skip_const(p, offset, &q_idx);
+  const struct pbuf *q = pbuf_skip_const(p, offset, &q_idx);
 
   /* return requested data if pbuf is OK */
   if ((q != NULL) && (q->len > q_idx)) {
-    return ((u8_t*)q->payload)[q_idx];
+    return ((u8_t *)q->payload)[q_idx];
   }
   return -1;
 }
@@ -1336,14 +1408,14 @@
  * @param data byte to write at an offset into p
  */
 void
-pbuf_put_at(struct pbuf* p, u16_t offset, u8_t data)
+pbuf_put_at(struct pbuf *p, u16_t offset, u8_t data)
 {
   u16_t q_idx;
-  struct pbuf* q = pbuf_skip(p, offset, &q_idx);
+  struct pbuf *q = pbuf_skip(p, offset, &q_idx);
 
   /* write requested data if pbuf is OK */
   if ((q != NULL) && (q->len > q_idx)) {
-    ((u8_t*)q->payload)[q_idx] = data;
+    ((u8_t *)q->payload)[q_idx] = data;
   }
 }
 
@@ -1359,30 +1431,30 @@
  *         (0xffff if p is too short, diffoffset+1 otherwise)
  */
 u16_t
-pbuf_memcmp(const struct pbuf* p, u16_t offset, const void* s2, u16_t n)
+pbuf_memcmp(const struct pbuf *p, u16_t offset, const void *s2, u16_t n)
 {
   u16_t start = offset;
-  const struct pbuf* q = p;
+  const struct pbuf *q = p;
   u16_t i;
- 
+
   /* pbuf long enough to perform check? */
-  if(p->tot_len < (offset + n)) {
+  if (p->tot_len < (offset + n)) {
     return 0xffff;
   }
- 
+
   /* get the correct pbuf from chain. We know it succeeds because of p->tot_len check above. */
   while ((q != NULL) && (q->len <= start)) {
-    start -= q->len;
+    start = (u16_t)(start - q->len);
     q = q->next;
   }
- 
+
   /* return requested data if pbuf is OK */
   for (i = 0; i < n; i++) {
     /* We know pbuf_get_at() succeeds because of p->tot_len check above. */
-    u8_t a = pbuf_get_at(q, start + i);
-    u8_t b = ((const u8_t*)s2)[i];
+    u8_t a = pbuf_get_at(q, (u16_t)(start + i));
+    u8_t b = ((const u8_t *)s2)[i];
     if (a != b) {
-      return i+1;
+      return (u16_t)LWIP_MIN(i + 1, 0xFFFF);
     }
   }
   return 0;
@@ -1401,12 +1473,12 @@
  * @return 0xFFFF if substr was not found in p or the index where it was found
  */
 u16_t
-pbuf_memfind(const struct pbuf* p, const void* mem, u16_t mem_len, u16_t start_offset)
+pbuf_memfind(const struct pbuf *p, const void *mem, u16_t mem_len, u16_t start_offset)
 {
   u16_t i;
-  u16_t max = p->tot_len - mem_len;
+  u16_t max_cmp_start = (u16_t)(p->tot_len - mem_len);
   if (p->tot_len >= mem_len + start_offset) {
-    for (i = start_offset; i <= max; i++) {
+    for (i = start_offset; i <= max_cmp_start; i++) {
       u16_t plus = pbuf_memcmp(p, i, mem, mem_len);
       if (plus == 0) {
         return i;
@@ -1428,7 +1500,7 @@
  * @return 0xFFFF if substr was not found in p or the index where it was found
  */
 u16_t
-pbuf_strstr(const struct pbuf* p, const char* substr)
+pbuf_strstr(const struct pbuf *p, const char *substr)
 {
   size_t substr_len;
   if ((substr == NULL) || (substr[0] == 0) || (p->tot_len == 0xFFFF)) {
diff --git a/src/core/raw.c b/src/core/raw.c
index 80cf9ec..3b34544 100644
--- a/src/core/raw.c
+++ b/src/core/raw.c
@@ -4,13 +4,13 @@
  * different types of protocols besides (or overriding) those
  * already available in lwIP.\n
  * 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
- * @see @ref raw_api
+ * @see @ref api
  */
 
 /*
@@ -54,6 +54,7 @@
 #include "lwip/ip_addr.h"
 #include "lwip/netif.h"
 #include "lwip/raw.h"
+#include "lwip/priv/raw_priv.h"
 #include "lwip/stats.h"
 #include "lwip/ip6.h"
 #include "lwip/ip6_addr.h"
@@ -65,10 +66,16 @@
 static struct raw_pcb *raw_pcbs;
 
 static u8_t
-raw_input_match(struct raw_pcb *pcb, u8_t broadcast)
+raw_input_local_match(struct raw_pcb *pcb, u8_t broadcast)
 {
   LWIP_UNUSED_ARG(broadcast); /* in IPv6 only case */
 
+  /* check if PCB is bound to specific netif */
+  if ((pcb->netif_idx != NETIF_NO_INDEX) &&
+      (pcb->netif_idx != netif_get_index(ip_data.current_input_netif))) {
+    return 0;
+  }
+
 #if LWIP_IPV4 && LWIP_IPV6
   /* Dual-stack: PCBs listening to any IP type also listen to any IP address */
   if (IP_IS_ANY_TYPE_VAL(pcb->local_ip)) {
@@ -97,11 +104,11 @@
       }
     } else
 #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())) {
-      return 1;
-    }
+      /* 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())) {
+        return 1;
+      }
   }
 
   return 0;
@@ -124,12 +131,12 @@
  *           caller).
  *
  */
-u8_t
+raw_input_state_t
 raw_input(struct pbuf *p, struct netif *inp)
 {
   struct raw_pcb *pcb, *prev;
   s16_t proto;
-  u8_t eaten = 0;
+  raw_input_state_t ret = RAW_INPUT_NONE;
   u8_t broadcast = ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif());
 
   LWIP_UNUSED_ARG(inp);
@@ -156,30 +163,34 @@
   pcb = raw_pcbs;
   /* loop through all raw pcbs until the packet is eaten by one */
   /* this allows multiple pcbs to match against the packet by design */
-  while ((eaten == 0) && (pcb != NULL)) {
-    if ((pcb->protocol == proto) && raw_input_match(pcb, broadcast)) {
+  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()))) {
       /* receive callback function available? */
       if (pcb->recv != NULL) {
+        u8_t eaten;
 #ifndef LWIP_NOASSERT
-        void* old_payload = p->payload;
+        void *old_payload = p->payload;
 #endif
+        ret = RAW_INPUT_DELIVERED;
         /* the receive callback function did not eat the packet? */
         eaten = pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr());
         if (eaten != 0) {
           /* receive function ate the packet */
           p = NULL;
-          eaten = 1;
           if (prev != NULL) {
-          /* move the pcb to the front of raw_pcbs so that is
-             found faster next time */
+            /* move the pcb to the front of raw_pcbs so that is
+               found faster next time */
             prev->next = pcb->next;
             pcb->next = raw_pcbs;
             raw_pcbs = pcb;
           }
+          return RAW_INPUT_EATEN;
         } else {
           /* sanity-check that the receive callback did not alter the pbuf */
           LWIP_ASSERT("raw pcb recv callback altered pbuf payload pointer without eating packet",
-            p->payload == old_payload);
+                      p->payload == old_payload);
         }
       }
       /* no receive callback function was set for this raw PCB */
@@ -188,7 +199,7 @@
     prev = pcb;
     pcb = pcb->next;
   }
-  return eaten;
+  return ret;
 }
 
 /**
@@ -209,15 +220,48 @@
 err_t
 raw_bind(struct raw_pcb *pcb, const ip_addr_t *ipaddr)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   if ((pcb == NULL) || (ipaddr == NULL)) {
     return ERR_VAL;
   }
   ip_addr_set_ipaddr(&pcb->local_ip, ipaddr);
+#if LWIP_IPV6 && LWIP_IPV6_SCOPES
+  /* If the given IP address should have a zone but doesn't, assign one now.
+   * This is legacy support: scope-aware callers should always provide properly
+   * zoned source addresses. */
+  if (IP_IS_V6(&pcb->local_ip) &&
+      ip6_addr_lacks_zone(ip_2_ip6(&pcb->local_ip), IP6_UNKNOWN)) {
+    ip6_addr_select_zone(ip_2_ip6(&pcb->local_ip), ip_2_ip6(&pcb->local_ip));
+  }
+#endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */
   return ERR_OK;
 }
 
 /**
  * @ingroup raw_raw
+ * Bind an RAW PCB to a specific netif.
+ * After calling this function, all packets received via this PCB
+ * are guaranteed to have come in via the specified netif, and all
+ * outgoing packets will go out via the specified netif.
+ *
+ * @param pcb RAW PCB to be bound with netif.
+ * @param netif netif to bind to. Can be NULL.
+ *
+ * @see raw_disconnect()
+ */
+void
+raw_bind_netif(struct raw_pcb *pcb, const struct netif *netif)
+{
+  LWIP_ASSERT_CORE_LOCKED();
+  if (netif != NULL) {
+    pcb->netif_idx = netif_get_index(netif);
+  } else {
+    pcb->netif_idx = NETIF_NO_INDEX;
+  }
+}
+
+/**
+ * @ingroup raw_raw
  * Connect an RAW PCB. This function is required by upper layers
  * of lwip. Using the raw api you could use raw_sendto() instead
  *
@@ -233,15 +277,50 @@
 err_t
 raw_connect(struct raw_pcb *pcb, const ip_addr_t *ipaddr)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   if ((pcb == NULL) || (ipaddr == NULL)) {
     return ERR_VAL;
   }
   ip_addr_set_ipaddr(&pcb->remote_ip, ipaddr);
+#if LWIP_IPV6 && LWIP_IPV6_SCOPES
+  /* If the given IP address should have a zone but doesn't, assign one now,
+   * using the bound address to make a more informed decision when possible. */
+  if (IP_IS_V6(&pcb->remote_ip) &&
+      ip6_addr_lacks_zone(ip_2_ip6(&pcb->remote_ip), IP6_UNKNOWN)) {
+    ip6_addr_select_zone(ip_2_ip6(&pcb->remote_ip), ip_2_ip6(&pcb->local_ip));
+  }
+#endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */
+  raw_set_flags(pcb, RAW_FLAGS_CONNECTED);
   return ERR_OK;
 }
 
 /**
  * @ingroup raw_raw
+ * Disconnect a RAW PCB.
+ *
+ * @param pcb the raw pcb to disconnect.
+ */
+void
+raw_disconnect(struct raw_pcb *pcb)
+{
+  LWIP_ASSERT_CORE_LOCKED();
+  /* reset remote address association */
+#if LWIP_IPV4 && LWIP_IPV6
+  if (IP_IS_ANY_TYPE_VAL(pcb->local_ip)) {
+    ip_addr_copy(pcb->remote_ip, *IP_ANY_TYPE);
+  } else {
+#endif
+    ip_addr_set_any(IP_IS_V6_VAL(pcb->remote_ip), &pcb->remote_ip);
+#if LWIP_IPV4 && LWIP_IPV6
+  }
+#endif
+  pcb->netif_idx = NETIF_NO_INDEX;
+  /* mark PCB as unconnected */
+  raw_clear_flags(pcb, RAW_FLAGS_CONNECTED);
+}
+
+/**
+ * @ingroup raw_raw
  * Set the callback function for received packets that match the
  * raw PCB's protocol and binding.
  *
@@ -254,6 +333,7 @@
 void
 raw_recv(struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   /* remember recv() callback and user data */
   pcb->recv = recv;
   pcb->recv_arg = recv_arg;
@@ -261,11 +341,9 @@
 
 /**
  * @ingroup raw_raw
- * Send the raw IP packet to the given address. Note that actually you cannot
- * modify the IP headers (this is inconsistent with the receive callback where
- * you actually get the IP headers), you can only specify the IP payload here.
- * It requires some more changes in lwIP. (there will be a raw_send() function
- * then.)
+ * Send the raw IP packet to the given address. An IP header will be prepended
+ * to the packet, unless the RAW_FLAGS_HDRINCL flag is set on the PCB. In that
+ * case, the packet must include an IP header, which will then be sent as is.
  *
  * @param pcb the raw pcb which to send
  * @param p the IP payload to send
@@ -275,11 +353,8 @@
 err_t
 raw_sendto(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr)
 {
-  err_t err;
   struct netif *netif;
   const ip_addr_t *src_ip;
-  struct pbuf *q; /* q will be sent down the stack */
-  s16_t header_size;
 
   if ((pcb == NULL) || (ipaddr == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr)) {
     return ERR_VAL;
@@ -287,17 +362,106 @@
 
   LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE, ("raw_sendto\n"));
 
+  if (pcb->netif_idx != NETIF_NO_INDEX) {
+    netif = netif_get_by_index(pcb->netif_idx);
+  } else {
+#if LWIP_MULTICAST_TX_OPTIONS
+    netif = NULL;
+    if (ip_addr_ismulticast(ipaddr)) {
+      /* For multicast-destined packets, use the user-provided interface index to
+       * determine the outgoing interface, if an interface index is set and a
+       * matching netif can be found. Otherwise, fall back to regular routing. */
+      netif = netif_get_by_index(pcb->mcast_ifindex);
+    }
+
+    if (netif == NULL)
+#endif /* LWIP_MULTICAST_TX_OPTIONS */
+    {
+      netif = ip_route(&pcb->local_ip, ipaddr);
+    }
+  }
+
+  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);
+    return ERR_RTE;
+  }
+
+  if (ip_addr_isany(&pcb->local_ip) || ip_addr_ismulticast(&pcb->local_ip)) {
+    /* use outgoing network interface IP address as source address */
+    src_ip = ip_netif_get_local_ip(netif, ipaddr);
+#if LWIP_IPV6
+    if (src_ip == NULL) {
+      return ERR_RTE;
+    }
+#endif /* LWIP_IPV6 */
+  } else {
+    /* use RAW PCB local IP address as source address */
+    src_ip = &pcb->local_ip;
+  }
+
+  return raw_sendto_if_src(pcb, p, ipaddr, netif, src_ip);
+}
+
+/**
+ * @ingroup raw_raw
+ * Send the raw IP packet to the given address, using a particular outgoing
+ * netif and source IP address. An IP header will be prepended to the packet,
+ * unless the RAW_FLAGS_HDRINCL flag is set on the PCB. In that case, the
+ * packet must include an IP header, which will then be sent as is.
+ *
+ * @param pcb RAW PCB used to send the data
+ * @param p chain of pbufs to be sent
+ * @param dst_ip destination IP address
+ * @param netif the netif used for sending
+ * @param src_ip source IP address
+ */
+err_t
+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)
+{
+  err_t err;
+  struct pbuf *q; /* q will be sent down the stack */
+  u16_t header_size;
+  u8_t ttl;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  if ((pcb == NULL) || (dst_ip == NULL) || (netif == NULL) || (src_ip == NULL) ||
+      !IP_ADDR_PCB_VERSION_MATCH(pcb, src_ip) || !IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) {
+    return ERR_VAL;
+  }
+
   header_size = (
 #if LWIP_IPV4 && LWIP_IPV6
-    IP_IS_V6(ipaddr) ? IP6_HLEN : IP_HLEN);
+                  IP_IS_V6(dst_ip) ? IP6_HLEN : IP_HLEN);
 #elif LWIP_IPV4
-    IP_HLEN);
+                  IP_HLEN);
 #else
-    IP6_HLEN);
+                  IP6_HLEN);
 #endif
 
+  /* Handle the HDRINCL option as an exception: none of the code below applies
+   * to this case, and sending the packet needs to be done differently too. */
+  if (pcb->flags & RAW_FLAGS_HDRINCL) {
+    /* A full header *must* be present in the first pbuf of the chain, as the
+     * output routines may access its fields directly. */
+    if (p->len < header_size) {
+      return ERR_VAL;
+    }
+    /* @todo multicast loop support, if at all desired for this scenario.. */
+    NETIF_SET_HINTS(netif, &pcb->netif_hints);
+    err = ip_output_if_hdrincl(p, src_ip, dst_ip, netif);
+    NETIF_RESET_HINTS(netif);
+    return err;
+  }
+
+  /* packet too large to add an IP header without causing an overflow? */
+  if ((u16_t)(p->tot_len + header_size) < p->tot_len) {
+    return ERR_MEM;
+  }
   /* not enough space to add an IP header to first pbuf in given p chain? */
-  if (pbuf_header(p, header_size)) {
+  if (pbuf_add_header(p, header_size)) {
     /* allocate header in new pbuf */
     q = pbuf_alloc(PBUF_IP, 0, PBUF_RAM);
     /* new header pbuf could not be allocated? */
@@ -314,34 +478,16 @@
   } else {
     /* first pbuf q equals given pbuf */
     q = p;
-    if (pbuf_header(q, -header_size)) {
+    if (pbuf_remove_header(q, header_size)) {
       LWIP_ASSERT("Can't restore header we just removed!", 0);
       return ERR_MEM;
     }
   }
 
-  if(IP_IS_ANY_TYPE_VAL(pcb->local_ip)) {
-    /* Don't call ip_route() with IP_ANY_TYPE */
-    netif = ip_route(IP46_ADDR_ANY(IP_GET_TYPE(ipaddr)), ipaddr);
-  } else {
-    netif = ip_route(&pcb->local_ip, ipaddr);
-  }
-
-  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);
-    /* free any temporary header pbuf allocated by pbuf_header() */
-    if (q != p) {
-      pbuf_free(q);
-    }
-    return ERR_RTE;
-  }
-
 #if IP_SOF_BROADCAST
-  if (IP_IS_V4(ipaddr))
-  {
+  if (IP_IS_V4(dst_ip)) {
     /* broadcast filter? */
-    if (!ip_get_option(pcb, SOF_BROADCAST) && ip_addr_isbroadcast(ipaddr, netif)) {
+    if (!ip_get_option(pcb, SOF_BROADCAST) && ip_addr_isbroadcast(dst_ip, netif)) {
       LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ("raw_sendto: SOF_BROADCAST not enabled on pcb %p\n", (void *)pcb));
       /* free any temporary header pbuf allocated by pbuf_header() */
       if (q != p) {
@@ -352,35 +498,33 @@
   }
 #endif /* IP_SOF_BROADCAST */
 
-  if (ip_addr_isany(&pcb->local_ip)) {
-    /* use outgoing network interface IP address as source address */
-    src_ip = ip_netif_get_local_ip(netif, ipaddr);
-#if LWIP_IPV6
-    if (src_ip == NULL) {
-      if (q != p) {
-        pbuf_free(q);
-      }
-      return ERR_RTE;
-    }
-#endif /* LWIP_IPV6 */
-  } else {
-    /* use RAW PCB local IP address as source address */
-    src_ip = &pcb->local_ip;
+  /* Multicast Loop? */
+#if LWIP_MULTICAST_TX_OPTIONS
+  if (((pcb->flags & RAW_FLAGS_MULTICAST_LOOP) != 0) && ip_addr_ismulticast(dst_ip)) {
+    q->flags |= PBUF_FLAG_MCASTLOOP;
   }
+#endif /* LWIP_MULTICAST_TX_OPTIONS */
 
 #if LWIP_IPV6
   /* If requested, based on the IPV6_CHECKSUM socket option per RFC3542,
      compute the checksum and update the checksum in the payload. */
-  if (IP_IS_V6(ipaddr) && pcb->chksum_reqd) {
-    u16_t chksum = ip6_chksum_pseudo(p, pcb->protocol, p->tot_len, ip_2_ip6(src_ip), ip_2_ip6(ipaddr));
+  if (IP_IS_V6(dst_ip) && pcb->chksum_reqd) {
+    u16_t chksum = ip6_chksum_pseudo(p, pcb->protocol, p->tot_len, ip_2_ip6(src_ip), ip_2_ip6(dst_ip));
     LWIP_ASSERT("Checksum must fit into first pbuf", p->len >= (pcb->chksum_offset + 2));
     SMEMCPY(((u8_t *)p->payload) + pcb->chksum_offset, &chksum, sizeof(u16_t));
   }
 #endif
 
-  NETIF_SET_HWADDRHINT(netif, &pcb->addr_hint);
-  err = ip_output_if(q, src_ip, ipaddr, pcb->ttl, pcb->tos, pcb->protocol, netif);
-  NETIF_SET_HWADDRHINT(netif, NULL);
+  /* Determine TTL to use */
+#if LWIP_MULTICAST_TX_OPTIONS
+  ttl = (ip_addr_ismulticast(dst_ip) ? raw_get_multicast_ttl(pcb) : pcb->ttl);
+#else /* LWIP_MULTICAST_TX_OPTIONS */
+  ttl = pcb->ttl;
+#endif /* LWIP_MULTICAST_TX_OPTIONS */
+
+  NETIF_SET_HINTS(netif, &pcb->netif_hints);
+  err = ip_output_if(q, src_ip, dst_ip, ttl, pcb->tos, pcb->protocol, netif);
+  NETIF_RESET_HINTS(netif);
 
   /* did we chain a header earlier? */
   if (q != p) {
@@ -417,6 +561,7 @@
 raw_remove(struct raw_pcb *pcb)
 {
   struct raw_pcb *pcb2;
+  LWIP_ASSERT_CORE_LOCKED();
   /* pcb to be removed is first in list? */
   if (raw_pcbs == pcb) {
     /* make list start at 2nd pcb */
@@ -452,6 +597,7 @@
   struct raw_pcb *pcb;
 
   LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE, ("raw_new\n"));
+  LWIP_ASSERT_CORE_LOCKED();
 
   pcb = (struct raw_pcb *)memp_malloc(MEMP_RAW_PCB);
   /* could allocate RAW PCB? */
@@ -460,6 +606,9 @@
     memset(pcb, 0, sizeof(struct raw_pcb));
     pcb->protocol = proto;
     pcb->ttl = RAW_TTL;
+#if LWIP_MULTICAST_TX_OPTIONS
+    raw_set_multicast_ttl(pcb, RAW_TTL);
+#endif /* LWIP_MULTICAST_TX_OPTIONS */
     pcb->next = raw_pcbs;
     raw_pcbs = pcb;
   }
@@ -485,6 +634,7 @@
 raw_new_ip_type(u8_t type, u8_t proto)
 {
   struct raw_pcb *pcb;
+  LWIP_ASSERT_CORE_LOCKED();
   pcb = raw_new(proto);
 #if LWIP_IPV4 && LWIP_IPV6
   if (pcb != NULL) {
@@ -502,9 +652,9 @@
  * @param old_addr IP address of the netif before change
  * @param new_addr IP address of the netif after change
  */
-void raw_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr)
+void raw_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr)
 {
-  struct raw_pcb* rpcb;
+  struct raw_pcb *rpcb;
 
   if (!ip_addr_isany(old_addr) && !ip_addr_isany(new_addr)) {
     for (rpcb = raw_pcbs; rpcb != NULL; rpcb = rpcb->next) {
diff --git a/src/core/stats.c b/src/core/stats.c
index 893d199..34e9b27 100644
--- a/src/core/stats.c
+++ b/src/core/stats.c
@@ -105,17 +105,17 @@
 stats_display_mem(struct stats_mem *mem, const char *name)
 {
   LWIP_PLATFORM_DIAG(("\nMEM %s\n\t", name));
-  LWIP_PLATFORM_DIAG(("avail: %"U32_F"\n\t", (u32_t)mem->avail));
-  LWIP_PLATFORM_DIAG(("used: %"U32_F"\n\t", (u32_t)mem->used));
-  LWIP_PLATFORM_DIAG(("max: %"U32_F"\n\t", (u32_t)mem->max));
-  LWIP_PLATFORM_DIAG(("err: %"U32_F"\n", (u32_t)mem->err));
+  LWIP_PLATFORM_DIAG(("avail: %"MEM_SIZE_F"\n\t", mem->avail));
+  LWIP_PLATFORM_DIAG(("used: %"MEM_SIZE_F"\n\t", mem->used));
+  LWIP_PLATFORM_DIAG(("max: %"MEM_SIZE_F"\n\t", mem->max));
+  LWIP_PLATFORM_DIAG(("err: %"STAT_COUNTER_F"\n", mem->err));
 }
 
 #if MEMP_STATS
 void
-stats_display_memp(struct stats_mem *mem, int index)
+stats_display_memp(struct stats_mem *mem, int idx)
 {
-  if (index < MEMP_MAX) {
+  if (idx < MEMP_MAX) {
     stats_display_mem(mem, mem->name);
   }
 }
@@ -127,15 +127,15 @@
 stats_display_sys(struct stats_sys *sys)
 {
   LWIP_PLATFORM_DIAG(("\nSYS\n\t"));
-  LWIP_PLATFORM_DIAG(("sem.used:  %"U32_F"\n\t", (u32_t)sys->sem.used));
-  LWIP_PLATFORM_DIAG(("sem.max:   %"U32_F"\n\t", (u32_t)sys->sem.max));
-  LWIP_PLATFORM_DIAG(("sem.err:   %"U32_F"\n\t", (u32_t)sys->sem.err));
-  LWIP_PLATFORM_DIAG(("mutex.used: %"U32_F"\n\t", (u32_t)sys->mutex.used));
-  LWIP_PLATFORM_DIAG(("mutex.max:  %"U32_F"\n\t", (u32_t)sys->mutex.max));
-  LWIP_PLATFORM_DIAG(("mutex.err:  %"U32_F"\n\t", (u32_t)sys->mutex.err));
-  LWIP_PLATFORM_DIAG(("mbox.used:  %"U32_F"\n\t", (u32_t)sys->mbox.used));
-  LWIP_PLATFORM_DIAG(("mbox.max:   %"U32_F"\n\t", (u32_t)sys->mbox.max));
-  LWIP_PLATFORM_DIAG(("mbox.err:   %"U32_F"\n", (u32_t)sys->mbox.err));
+  LWIP_PLATFORM_DIAG(("sem.used:  %"STAT_COUNTER_F"\n\t", sys->sem.used));
+  LWIP_PLATFORM_DIAG(("sem.max:   %"STAT_COUNTER_F"\n\t", sys->sem.max));
+  LWIP_PLATFORM_DIAG(("sem.err:   %"STAT_COUNTER_F"\n\t", sys->sem.err));
+  LWIP_PLATFORM_DIAG(("mutex.used: %"STAT_COUNTER_F"\n\t", sys->mutex.used));
+  LWIP_PLATFORM_DIAG(("mutex.max:  %"STAT_COUNTER_F"\n\t", sys->mutex.max));
+  LWIP_PLATFORM_DIAG(("mutex.err:  %"STAT_COUNTER_F"\n\t", sys->mutex.err));
+  LWIP_PLATFORM_DIAG(("mbox.used:  %"STAT_COUNTER_F"\n\t", sys->mbox.used));
+  LWIP_PLATFORM_DIAG(("mbox.max:   %"STAT_COUNTER_F"\n\t", sys->mbox.max));
+  LWIP_PLATFORM_DIAG(("mbox.err:   %"STAT_COUNTER_F"\n", sys->mbox.err));
 }
 #endif /* SYS_STATS */
 
diff --git a/src/core/sys.c b/src/core/sys.c
index 7059b4d..5f08352 100644
--- a/src/core/sys.c
+++ b/src/core/sys.c
@@ -39,14 +39,52 @@
 /**
  * @defgroup sys_layer Porting (system abstraction layer)
  * @ingroup lwip
- * @verbinclude "sys_arch.txt"
  *
  * @defgroup sys_os OS abstraction layer
  * @ingroup sys_layer
  * 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
+ * mem_malloc() you can run into a circular function call problem. In mem.c
+ * mem_init() tries to allocate a semaphore using mem_malloc, which of course
+ * can't be performed when sys_arch uses mem_malloc.
  *
  * @defgroup sys_sem Semaphores
  * @ingroup sys_os
+ * Semaphores can be either counting or binary - lwIP works with both
+ * kinds.
+ * Semaphores are represented by the type "sys_sem_t" which is typedef'd
+ * in the sys_arch.h file. Mailboxes are equivalently represented by the
+ * type "sys_mbox_t". Mutexes are represented by the type "sys_mutex_t".
+ * lwIP does not place any restrictions on how these types are represented
+ * internally.
  *
  * @defgroup sys_mutex Mutexes
  * @ingroup sys_os
@@ -55,6 +93,10 @@
  *
  * @defgroup sys_mbox Mailboxes
  * @ingroup sys_os
+ * 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. 
  *
  * @defgroup sys_time Time
  * @ingroup sys_layer
diff --git a/src/core/tcp.c b/src/core/tcp.c
index b5144d2..bd7d64e 100644
--- a/src/core/tcp.c
+++ b/src/core/tcp.c
@@ -1,16 +1,68 @@
 /**
- * @file 
+ * @file
  * Transmission Control Protocol for IP
  * See also @ref tcp_raw
  *
  * @defgroup tcp_raw TCP
  * @ingroup callbackstyle_api
  * Transmission Control Protocol for IP\n
- * @see @ref raw_api and @ref netconn
+ * @see @ref api
  *
- * Common functions for the TCP implementation, such as functinos
+ * 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
+ * 
+ * TCP connection setup
+ * --------------------
+ * 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
+ * tcp_new() function. This PCB can then be either set to listen for new
+ * incoming connections or be explicitly connected to another host.
+ * - tcp_new()
+ * - tcp_bind()
+ * - 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
+ * triggering to send by calling tcp_output(). When the data is successfully
+ * transmitted to the remote host, the application will be notified with a
+ * call to a specified callback function.
+ * - tcp_write()
+ * - tcp_output()
+ * - tcp_sent()
+ * 
+ * Receiving TCP data
+ * ------------------
+ * TCP data reception is callback based - an application specified
+ * callback function is called when new data arrives. When the
+ * application has taken the data, it has to call the tcp_recved()
+ * function to indicate that TCP can advertise increase the receive
+ * window.
+ * - tcp_recv()
+ * - tcp_recved()
+ * 
+ * Application polling
+ * -------------------
+ * 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
+ * timer for killing connections that have stayed idle for too long, or
+ * as a method of waiting for memory to become available. For instance,
+ * if a call to tcp_write() has failed because memory wasn't available,
+ * the application may use the polling functionality to call tcp_write()
+ * again when the connection has been idle for a while.
+ * - tcp_poll()
+ *
+ * Closing and aborting connections
+ * --------------------------------
+ * - tcp_close()
+ * - tcp_abort()
+ * - tcp_err()
+ * 
  */
 
 /*
@@ -71,7 +123,7 @@
    "The Dynamic and/or Private Ports are those from 49152 through 65535" */
 #define TCP_LOCAL_PORT_RANGE_START        0xc000
 #define TCP_LOCAL_PORT_RANGE_END          0xffff
-#define TCP_ENSURE_LOCAL_PORT_RANGE(port) ((u16_t)(((port) & ~TCP_LOCAL_PORT_RANGE_START) + TCP_LOCAL_PORT_RANGE_START))
+#define TCP_ENSURE_LOCAL_PORT_RANGE(port) ((u16_t)(((port) & (u16_t)~TCP_LOCAL_PORT_RANGE_START) + TCP_LOCAL_PORT_RANGE_START))
 #endif
 
 #if LWIP_TCP_KEEPALIVE
@@ -89,7 +141,7 @@
 #define INITIAL_MSS TCP_MSS
 #endif
 
-static const char * const tcp_state_str[] = {
+static const char *const tcp_state_str[] = {
   "CLOSED",
   "LISTEN",
   "SYN_SENT",
@@ -109,8 +161,8 @@
 /* Incremented every coarse grained timer shot (typically every 500 ms). */
 u32_t tcp_ticks;
 static const u8_t tcp_backoff[13] =
-    { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7};
- /* Times per slowtmr hits */
+{ 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7};
+/* Times per slowtmr hits */
 static const u8_t tcp_persist_backoff[7] = { 3, 6, 12, 24, 48, 96, 120 };
 
 /* The TCP PCB lists. */
@@ -126,8 +178,9 @@
 struct tcp_pcb *tcp_tw_pcbs;
 
 /** An array with all (non-temporary) PCB lists, mainly used for smaller code size */
-struct tcp_pcb ** const tcp_pcb_lists[] = {&tcp_listen_pcbs.pcbs, &tcp_bound_pcbs,
-  &tcp_active_pcbs, &tcp_tw_pcbs};
+struct tcp_pcb **const tcp_pcb_lists[] = {&tcp_listen_pcbs.pcbs, &tcp_bound_pcbs,
+         &tcp_active_pcbs, &tcp_tw_pcbs
+};
 
 u8_t tcp_active_pcbs_changed;
 
@@ -137,6 +190,9 @@
 static u16_t tcp_new_port(void);
 
 static err_t tcp_close_shutdown_fin(struct tcp_pcb *pcb);
+#if LWIP_TCP_PCB_NUM_EXT_ARGS
+static void tcp_ext_arg_invoke_callbacks_destroyed(struct tcp_pcb_ext_args *ext_args);
+#endif
 
 /**
  * Initialize this module.
@@ -144,9 +200,31 @@
 void
 tcp_init(void)
 {
-#if LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND)
+#ifdef LWIP_RAND
   tcp_port = TCP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND());
-#endif /* LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) */
+#endif /* LWIP_RAND */
+}
+
+/** Free a tcp pcb */
+void
+tcp_free(struct tcp_pcb *pcb)
+{
+  LWIP_ASSERT("tcp_free: LISTEN", pcb->state != LISTEN);
+#if LWIP_TCP_PCB_NUM_EXT_ARGS
+  tcp_ext_arg_invoke_callbacks_destroyed(pcb->ext_args);
+#endif
+  memp_free(MEMP_TCP_PCB, pcb);
+}
+
+/** Free a tcp listen pcb */
+static void
+tcp_free_listen(struct tcp_pcb *pcb)
+{
+  LWIP_ASSERT("tcp_free_listen: !LISTEN", pcb->state != LISTEN);
+#if LWIP_TCP_PCB_NUM_EXT_ARGS
+  tcp_ext_arg_invoke_callbacks_destroyed(pcb->ext_args);
+#endif
+  memp_free(MEMP_TCP_PCB_LISTEN, pcb);
 }
 
 /**
@@ -172,12 +250,15 @@
 static void
 tcp_remove_listener(struct tcp_pcb *list, struct tcp_pcb_listen *lpcb)
 {
-   struct tcp_pcb *pcb;
-   for (pcb = list; pcb != NULL; pcb = pcb->next) {
-      if (pcb->listener == lpcb) {
-         pcb->listener = NULL;
-      }
-   }
+  struct tcp_pcb *pcb;
+
+  LWIP_ASSERT("tcp_remove_listener: invalid listener", lpcb != NULL);
+
+  for (pcb = list; pcb != NULL; pcb = pcb->next) {
+    if (pcb->listener == lpcb) {
+      pcb->listener = NULL;
+    }
+  }
 }
 #endif
 
@@ -192,7 +273,7 @@
   LWIP_ASSERT("pcb != NULL", pcb != NULL);
   LWIP_ASSERT("pcb->state == LISTEN", pcb->state == LISTEN);
   for (i = 1; i < LWIP_ARRAYSIZE(tcp_pcb_lists); i++) {
-    tcp_remove_listener(*tcp_pcb_lists[i], (struct tcp_pcb_listen*)pcb);
+    tcp_remove_listener(*tcp_pcb_lists[i], (struct tcp_pcb_listen *)pcb);
   }
 #endif
   LWIP_UNUSED_ARG(pcb);
@@ -210,14 +291,15 @@
  * @param pcb the connection pcb which is not fully accepted yet
  */
 void
-tcp_backlog_delayed(struct tcp_pcb* pcb)
+tcp_backlog_delayed(struct tcp_pcb *pcb)
 {
   LWIP_ASSERT("pcb != NULL", pcb != NULL);
+  LWIP_ASSERT_CORE_LOCKED();
   if ((pcb->flags & TF_BACKLOGPEND) == 0) {
     if (pcb->listener != NULL) {
       pcb->listener->accepts_pending++;
       LWIP_ASSERT("accepts_pending != 0", pcb->listener->accepts_pending != 0);
-      pcb->flags |= TF_BACKLOGPEND;
+      tcp_set_flags(pcb, TF_BACKLOGPEND);
     }
   }
 }
@@ -232,14 +314,15 @@
  * @param pcb the connection pcb which is now fully accepted (or closed/aborted)
  */
 void
-tcp_backlog_accepted(struct tcp_pcb* pcb)
+tcp_backlog_accepted(struct tcp_pcb *pcb)
 {
   LWIP_ASSERT("pcb != NULL", pcb != NULL);
+  LWIP_ASSERT_CORE_LOCKED();
   if ((pcb->flags & TF_BACKLOGPEND) != 0) {
     if (pcb->listener != NULL) {
       LWIP_ASSERT("accepts_pending != 0", pcb->listener->accepts_pending != 0);
       pcb->listener->accepts_pending--;
-      pcb->flags &= ~TF_BACKLOGPEND;
+      tcp_clear_flags(pcb, TF_BACKLOGPEND);
     }
   }
 }
@@ -264,6 +347,8 @@
 static err_t
 tcp_close_shutdown(struct tcp_pcb *pcb, u8_t rst_on_unacked_data)
 {
+  LWIP_ASSERT("tcp_close_shutdown: invalid pcb", pcb != NULL);
+
   if (rst_on_unacked_data && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) {
     if ((pcb->refused_data != NULL) || (pcb->rcv_wnd != TCP_WND_MAX(pcb))) {
       /* Not all data received by application, send RST to tell the remote
@@ -272,23 +357,17 @@
 
       /* don't call tcp_abort here: we must not deallocate the pcb since
          that might not be expected when calling tcp_close */
-      tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
-               pcb->local_port, pcb->remote_port);
+      tcp_rst(pcb, pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
+              pcb->local_port, pcb->remote_port);
 
       tcp_pcb_purge(pcb);
       TCP_RMV_ACTIVE(pcb);
-      if (pcb->state == ESTABLISHED) {
-        /* move to TIME_WAIT since we close actively */
-        pcb->state = TIME_WAIT;
-        TCP_REG(&tcp_tw_pcbs, pcb);
+      /* Deallocate the pcb since we already sent a RST for it */
+      if (tcp_input_pcb == pcb) {
+        /* prevent using a deallocated pcb: free it from tcp_input later */
+        tcp_trigger_input_pcb_close();
       } else {
-        /* CLOSE_WAIT: deallocate the pcb since we already sent a RST for it */
-        if (tcp_input_pcb == pcb) {
-          /* prevent using a deallocated pcb: free it from tcp_input later */
-          tcp_trigger_input_pcb_close();
-        } else {
-          memp_free(MEMP_TCP_PCB, pcb);
-        }
+        tcp_free(pcb);
       }
       return ERR_OK;
     }
@@ -297,31 +376,31 @@
   /* - states which free the pcb are handled here,
      - states which send FIN and change state are handled in tcp_close_shutdown_fin() */
   switch (pcb->state) {
-  case CLOSED:
-    /* Closing a pcb in the CLOSED state might seem erroneous,
-     * however, it is in this state once allocated and as yet unused
-     * and the user needs some way to free it should the need arise.
-     * Calling tcp_close() with a pcb that has already been closed, (i.e. twice)
-     * or for a pcb that has been used and then entered the CLOSED state
-     * is erroneous, but this should never happen as the pcb has in those cases
-     * been freed, and so any remaining handles are bogus. */
-    if (pcb->local_port != 0) {
-      TCP_RMV(&tcp_bound_pcbs, pcb);
-    }
-    memp_free(MEMP_TCP_PCB, pcb);
-    break;
-  case LISTEN:
-    tcp_listen_closed(pcb);
-    tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb);
-    memp_free(MEMP_TCP_PCB_LISTEN, pcb);
-    break;
-  case SYN_SENT:
-    TCP_PCB_REMOVE_ACTIVE(pcb);
-    memp_free(MEMP_TCP_PCB, pcb);
-    MIB2_STATS_INC(mib2.tcpattemptfails);
-    break;
-  default:
-    return tcp_close_shutdown_fin(pcb);
+    case CLOSED:
+      /* Closing a pcb in the CLOSED state might seem erroneous,
+       * however, it is in this state once allocated and as yet unused
+       * and the user needs some way to free it should the need arise.
+       * Calling tcp_close() with a pcb that has already been closed, (i.e. twice)
+       * or for a pcb that has been used and then entered the CLOSED state
+       * is erroneous, but this should never happen as the pcb has in those cases
+       * been freed, and so any remaining handles are bogus. */
+      if (pcb->local_port != 0) {
+        TCP_RMV(&tcp_bound_pcbs, pcb);
+      }
+      tcp_free(pcb);
+      break;
+    case LISTEN:
+      tcp_listen_closed(pcb);
+      tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb);
+      tcp_free_listen(pcb);
+      break;
+    case SYN_SENT:
+      TCP_PCB_REMOVE_ACTIVE(pcb);
+      tcp_free(pcb);
+      MIB2_STATS_INC(mib2.tcpattemptfails);
+      break;
+    default:
+      return tcp_close_shutdown_fin(pcb);
   }
   return ERR_OK;
 }
@@ -333,31 +412,31 @@
   LWIP_ASSERT("pcb != NULL", pcb != NULL);
 
   switch (pcb->state) {
-  case SYN_RCVD:
-    err = tcp_send_fin(pcb);
-    if (err == ERR_OK) {
-      tcp_backlog_accepted(pcb);
-      MIB2_STATS_INC(mib2.tcpattemptfails);
-      pcb->state = FIN_WAIT_1;
-    }
-    break;
-  case ESTABLISHED:
-    err = tcp_send_fin(pcb);
-    if (err == ERR_OK) {
-      MIB2_STATS_INC(mib2.tcpestabresets);
-      pcb->state = FIN_WAIT_1;
-    }
-    break;
-  case CLOSE_WAIT:
-    err = tcp_send_fin(pcb);
-    if (err == ERR_OK) {
-      MIB2_STATS_INC(mib2.tcpestabresets);
-      pcb->state = LAST_ACK;
-    }
-    break;
-  default:
-    /* Has already been closed, do nothing. */
-    return ERR_OK;
+    case SYN_RCVD:
+      err = tcp_send_fin(pcb);
+      if (err == ERR_OK) {
+        tcp_backlog_accepted(pcb);
+        MIB2_STATS_INC(mib2.tcpattemptfails);
+        pcb->state = FIN_WAIT_1;
+      }
+      break;
+    case ESTABLISHED:
+      err = tcp_send_fin(pcb);
+      if (err == ERR_OK) {
+        MIB2_STATS_INC(mib2.tcpestabresets);
+        pcb->state = FIN_WAIT_1;
+      }
+      break;
+    case CLOSE_WAIT:
+      err = tcp_send_fin(pcb);
+      if (err == ERR_OK) {
+        MIB2_STATS_INC(mib2.tcpestabresets);
+        pcb->state = LAST_ACK;
+      }
+      break;
+    default:
+      /* Has already been closed, do nothing. */
+      return ERR_OK;
   }
 
   if (err == ERR_OK) {
@@ -369,7 +448,7 @@
     tcp_output(pcb);
   } else if (err == ERR_MEM) {
     /* Mark this pcb for closing. Closing is retried from tcp_tmr. */
-    pcb->flags |= TF_CLOSEPEND;
+    tcp_set_flags(pcb, TF_CLOSEPEND);
     /* We have to return ERR_OK from here to indicate to the callers that this
        pcb should not be used any more as it will be freed soon via tcp_tmr.
        This is OK here since sending FIN does not guarantee a time frime for
@@ -390,6 +469,12 @@
  * 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
+ * callback or the polling functionality. If the close succeeds, the
+ * function returns ERR_OK.
  *
  * @param pcb the tcp_pcb to close
  * @return ERR_OK if connection has been closed
@@ -398,12 +483,16 @@
 err_t
 tcp_close(struct tcp_pcb *pcb)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("tcp_close: invalid pcb", pcb != NULL, return ERR_ARG);
   LWIP_DEBUGF(TCP_DEBUG, ("tcp_close: closing in "));
+
   tcp_debug_print_state(pcb->state);
 
   if (pcb->state != LISTEN) {
     /* Set a flag not to receive any more data... */
-    pcb->flags |= TF_RXCLOSED;
+    tcp_set_flags(pcb, TF_RXCLOSED);
   }
   /* ... and close */
   return tcp_close_shutdown(pcb, 1);
@@ -425,12 +514,16 @@
 err_t
 tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("tcp_shutdown: invalid pcb", pcb != NULL, return ERR_ARG);
+
   if (pcb->state == LISTEN) {
     return ERR_CONN;
   }
   if (shut_rx) {
     /* shut down the receive side: set a flag not to receive any more data... */
-    pcb->flags |= TF_RXCLOSED;
+    tcp_set_flags(pcb, TF_RXCLOSED);
     if (shut_tx) {
       /* shutting down the tx AND rx side is the same as closing for the raw API */
       return tcp_close_shutdown(pcb, 1);
@@ -445,14 +538,14 @@
     /* This can't happen twice since if it succeeds, the pcb's state is changed.
        Only close in these states as the others directly deallocate the PCB */
     switch (pcb->state) {
-    case SYN_RCVD:
-    case ESTABLISHED:
-    case CLOSE_WAIT:
-      return tcp_close_shutdown(pcb, (u8_t)shut_rx);
-    default:
-      /* Not (yet?) connected, cannot shutdown the TX side as that would bring us
-        into CLOSED state, where the PCB is deallocated. */
-      return ERR_CONN;
+      case SYN_RCVD:
+      case ESTABLISHED:
+      case CLOSE_WAIT:
+        return tcp_close_shutdown(pcb, (u8_t)shut_rx);
+      default:
+        /* Not (yet?) connected, cannot shutdown the TX side as that would bring us
+          into CLOSED state, where the PCB is deallocated. */
+        return ERR_CONN;
     }
   }
   return ERR_OK;
@@ -475,15 +568,19 @@
 #endif /* LWIP_CALLBACK_API */
   void *errf_arg;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("tcp_abandon: invalid pcb", pcb != NULL, return);
+
   /* pcb->state LISTEN not allowed here */
   LWIP_ASSERT("don't call tcp_abort/tcp_abandon for listen-pcbs",
-    pcb->state != LISTEN);
+              pcb->state != LISTEN);
   /* Figure out on which TCP PCB list we are, and remove us. If we
      are in an active state, call the receive function associated with
      the PCB with a NULL argument, and send an RST to the remote end. */
   if (pcb->state == TIME_WAIT) {
     tcp_pcb_remove(&tcp_tw_pcbs, pcb);
-    memp_free(MEMP_TCP_PCB, pcb);
+    tcp_free(pcb);
   } else {
     int send_rst = 0;
     u16_t local_port = 0;
@@ -518,10 +615,10 @@
     tcp_backlog_accepted(pcb);
     if (send_rst) {
       LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_abandon: sending RST\n"));
-      tcp_rst(seqno, ackno, &pcb->local_ip, &pcb->remote_ip, local_port, pcb->remote_port);
+      tcp_rst(pcb, seqno, ackno, &pcb->local_ip, &pcb->remote_ip, local_port, pcb->remote_port);
     }
     last_state = pcb->state;
-    memp_free(MEMP_TCP_PCB, pcb);
+    tcp_free(pcb);
     TCP_EVENT_ERR(last_state, errf, errf_arg, ERR_ABRT);
   }
 }
@@ -546,12 +643,14 @@
 /**
  * @ingroup tcp_raw
  * Binds the connection to a local port number and IP address. If the
- * IP address is not given (i.e., ipaddr == NULL), the IP address of
- * the outgoing network interface is used instead.
+ * IP address is not given (i.e., ipaddr == IP_ANY_TYPE), the connection is
+ * bound to all local IP addresses.
+ * If another connection is bound to the same port, the function will
+ * return ERR_USE, otherwise ERR_OK is returned.
  *
  * @param pcb the tcp_pcb to bind (no check is done whether this pcb is
  *        already bound!)
- * @param ipaddr the local ip address to bind to (use IP4_ADDR_ANY to bind
+ * @param ipaddr the local ip address to bind to (use IPx_ADDR_ANY to bind
  *        to any local address
  * @param port the local port to bind to
  * @return ERR_USE if the port is already in use
@@ -564,18 +663,22 @@
   int i;
   int max_pcb_list = NUM_TCP_PCB_LISTS;
   struct tcp_pcb *cpcb;
+#if LWIP_IPV6 && LWIP_IPV6_SCOPES
+  ip_addr_t zoned_ipaddr;
+#endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */
+
+  LWIP_ASSERT_CORE_LOCKED();
 
 #if LWIP_IPV4
   /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */
   if (ipaddr == NULL) {
     ipaddr = IP4_ADDR_ANY;
   }
+#else /* LWIP_IPV4 */
+  LWIP_ERROR("tcp_bind: invalid ipaddr", ipaddr != NULL, return ERR_ARG);
 #endif /* LWIP_IPV4 */
 
-  /* still need to check for ipaddr == NULL in IPv6 only case */
-  if ((pcb == NULL) || (ipaddr == NULL)) {
-    return ERR_VAL;
-  }
+  LWIP_ERROR("tcp_bind: invalid pcb", pcb != NULL, return ERR_ARG);
 
   LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_VAL);
 
@@ -590,6 +693,18 @@
   }
 #endif /* SO_REUSE */
 
+#if LWIP_IPV6 && LWIP_IPV6_SCOPES
+  /* If the given IP address should have a zone but doesn't, assign one now.
+   * This is legacy support: scope-aware callers should always provide properly
+   * zoned source addresses. Do the zone selection before the address-in-use
+   * check below; as such we have to make a temporary copy of the address. */
+  if (IP_IS_V6(ipaddr) && ip6_addr_lacks_zone(ip_2_ip6(ipaddr), IP6_UNICAST)) {
+    ip_addr_copy(zoned_ipaddr, *ipaddr);
+    ip6_addr_select_zone(ip_2_ip6(&zoned_ipaddr), ip_2_ip6(&zoned_ipaddr));
+    ipaddr = &zoned_ipaddr;
+  }
+#endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */
+
   if (port == 0) {
     port = tcp_new_port();
     if (port == 0) {
@@ -611,8 +726,8 @@
             /* @todo: check accept_any_ip_version */
             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_isany(ipaddr) ||
+                 ip_addr_cmp(&cpcb->local_ip, ipaddr))) {
               return ERR_USE;
             }
           }
@@ -621,7 +736,11 @@
     }
   }
 
-  if (!ip_addr_isany(ipaddr)) {
+  if (!ip_addr_isany(ipaddr)
+#if LWIP_IPV4 && LWIP_IPV6
+      || (IP_GET_TYPE(ipaddr) != IP_GET_TYPE(&pcb->local_ip))
+#endif /* LWIP_IPV4 && LWIP_IPV6 */
+     ) {
     ip_addr_set(&pcb->local_ip, ipaddr);
   }
   pcb->local_port = port;
@@ -629,6 +748,28 @@
   LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %"U16_F"\n", port));
   return ERR_OK;
 }
+
+/**
+ * @ingroup tcp_raw
+ * Binds the connection to a netif and IP address.
+ * After calling this function, all packets received via this PCB
+ * are guaranteed to have come in via the specified netif, and all
+ * outgoing packets will go out via the specified netif.
+ *
+ * @param pcb the tcp_pcb to bind.
+ * @param netif the netif to bind to. Can be NULL.
+ */
+void
+tcp_bind_netif(struct tcp_pcb *pcb, const struct netif *netif)
+{
+  LWIP_ASSERT_CORE_LOCKED();
+  if (netif != NULL) {
+    pcb->netif_idx = netif_get_index(netif);
+  } else {
+    pcb->netif_idx = NETIF_NO_INDEX;
+  }
+}
+
 #if LWIP_CALLBACK_API
 /**
  * Default accept callback if no accept callback is specified by the user.
@@ -639,6 +780,8 @@
   LWIP_UNUSED_ARG(arg);
   LWIP_UNUSED_ARG(err);
 
+  LWIP_ASSERT("tcp_accept_null: invalid pcb", pcb != NULL);
+
   tcp_abort(pcb);
 
   return ERR_ABRT;
@@ -651,7 +794,25 @@
  * is able to accept incoming connections. The protocol control block
  * is reallocated in order to consume less memory. Setting the
  * connection to LISTEN is an irreversible process.
+ * 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
+ * needed for a connection that is listening, so tcp_listen() will
+ * reclaim the memory needed for the original connection and allocate a
+ * new smaller memory block for the listening connection.
  *
+ * tcp_listen() may return NULL if no memory was available for the
+ * listening connection. If so, the memory associated with the pcb
+ * passed as an argument to tcp_listen() will not be deallocated.
+ *
+ * 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.
@@ -663,6 +824,7 @@
 struct tcp_pcb *
 tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   return tcp_listen_with_backlog_and_err(pcb, backlog, NULL);
 }
 
@@ -689,11 +851,15 @@
   err_t res;
 
   LWIP_UNUSED_ARG(backlog);
-  LWIP_ERROR("tcp_listen: pcb already connected", pcb->state == CLOSED, res = ERR_CLSD; goto done);
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("tcp_listen_with_backlog_and_err: invalid pcb", pcb != NULL, res = ERR_ARG; goto done);
+  LWIP_ERROR("tcp_listen_with_backlog_and_err: pcb already connected", pcb->state == CLOSED, res = ERR_CLSD; goto done);
 
   /* already listening? */
   if (pcb->state == LISTEN) {
-    lpcb = (struct tcp_pcb_listen*)pcb;
+    lpcb = (struct tcp_pcb_listen *)pcb;
     res = ERR_ALREADY;
     goto done;
   }
@@ -723,6 +889,7 @@
   lpcb->state = LISTEN;
   lpcb->prio = pcb->prio;
   lpcb->so_options = pcb->so_options;
+  lpcb->netif_idx = NETIF_NO_INDEX;
   lpcb->ttl = pcb->ttl;
   lpcb->tos = pcb->tos;
 #if LWIP_IPV4 && LWIP_IPV6
@@ -732,7 +899,11 @@
   if (pcb->local_port != 0) {
     TCP_RMV(&tcp_bound_pcbs, pcb);
   }
-  memp_free(MEMP_TCP_PCB, pcb);
+#if LWIP_TCP_PCB_NUM_EXT_ARGS
+  /* copy over ext_args to listening pcb  */
+  memcpy(&lpcb->ext_args, &pcb->ext_args, sizeof(pcb->ext_args));
+#endif
+  tcp_free(pcb);
 #if LWIP_CALLBACK_API
   lpcb->accept = tcp_accept_null;
 #endif /* LWIP_CALLBACK_API */
@@ -758,7 +929,10 @@
 u32_t
 tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
 {
-  u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
+  u32_t new_right_edge;
+
+  LWIP_ASSERT("tcp_update_rcv_ann_wnd: invalid pcb", pcb != NULL);
+  new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
 
   if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {
     /* we can advertise more window */
@@ -793,25 +967,24 @@
 void
 tcp_recved(struct tcp_pcb *pcb, u16_t len)
 {
-  int wnd_inflation;
+  u32_t wnd_inflation;
+  tcpwnd_size_t rcv_wnd;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("tcp_recved: invalid pcb", pcb != NULL, return);
 
   /* pcb->state LISTEN not allowed here */
   LWIP_ASSERT("don't call tcp_recved for listen-pcbs",
-    pcb->state != LISTEN);
+              pcb->state != LISTEN);
 
-  pcb->rcv_wnd += len;
-  if (pcb->rcv_wnd > TCP_WND_MAX(pcb)) {
+  rcv_wnd = (tcpwnd_size_t)(pcb->rcv_wnd + len);
+  if ((rcv_wnd > TCP_WND_MAX(pcb)) || (rcv_wnd < pcb->rcv_wnd)) {
+    /* window got too big or tcpwnd_size_t overflow */
+    LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: window got too big or tcpwnd_size_t overflow\n"));
     pcb->rcv_wnd = TCP_WND_MAX(pcb);
-  } else if (pcb->rcv_wnd == 0) {
-    /* rcv_wnd overflowed */
-    if ((pcb->state == CLOSE_WAIT) || (pcb->state == LAST_ACK)) {
-      /* In passive close, we allow this, since the FIN bit is added to rcv_wnd
-         by the stack itself, since it is not mandatory for an application
-         to call tcp_recved() for the FIN bit, but e.g. the netconn API does so. */
-      pcb->rcv_wnd = TCP_WND_MAX(pcb);
-    } else {
-      LWIP_ASSERT("tcp_recved: len wrapped rcv_wnd\n", 0);
-    }
+  } else  {
+    pcb->rcv_wnd = rcv_wnd;
   }
 
   wnd_inflation = tcp_update_rcv_ann_wnd(pcb);
@@ -826,7 +999,7 @@
   }
 
   LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: received %"U16_F" bytes, wnd %"TCPWNDSIZE_F" (%"TCPWNDSIZE_F").\n",
-         len, pcb->rcv_wnd, (u16_t)(TCP_WND_MAX(pcb) - pcb->rcv_wnd)));
+                          len, pcb->rcv_wnd, (u16_t)(TCP_WND_MAX(pcb) - pcb->rcv_wnd)));
 }
 
 /**
@@ -842,14 +1015,16 @@
   struct tcp_pcb *pcb;
 
 again:
-  if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {
+  tcp_port++;
+  if (tcp_port == TCP_LOCAL_PORT_RANGE_END) {
     tcp_port = TCP_LOCAL_PORT_RANGE_START;
   }
   /* Check all PCB lists. */
   for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
     for (pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) {
       if (pcb->local_port == tcp_port) {
-        if (++n > (TCP_LOCAL_PORT_RANGE_END - TCP_LOCAL_PORT_RANGE_START)) {
+        n++;
+        if (n > (TCP_LOCAL_PORT_RANGE_END - TCP_LOCAL_PORT_RANGE_START)) {
           return 0;
         }
         goto again;
@@ -863,6 +1038,21 @@
  * @ingroup tcp_raw
  * 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. 
+ *
+ * The tcp_connect() function returns immediately; it does not wait for
+ * the connection to be properly setup. Instead, it will call the
+ * function specified as the fourth argument (the "connected" argument)
+ * when the connection is established. If the connection could not be
+ * properly established, either because the other host refused the
+ * connection or because the other host didn't answer, the "err"
+ * callback function of this pcb (registered with tcp_err, see below)
+ * will be called.
+ *
+ * The tcp_connect() function can return ERR_MEM if no memory is
+ * available for enqueueing the SYN segment. If the SYN indeed was
+ * enqueued successfully, the tcp_connect() function returns ERR_OK.
  *
  * @param pcb the tcp_pcb used to establish the connection
  * @param ipaddr the remote ip address to connect to
@@ -875,15 +1065,17 @@
  */
 err_t
 tcp_connect(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port,
-      tcp_connected_fn connected)
+            tcp_connected_fn connected)
 {
+  struct netif *netif = NULL;
   err_t ret;
   u32_t iss;
   u16_t old_local_port;
 
-  if ((pcb == NULL) || (ipaddr == NULL)) {
-    return ERR_VAL;
-  }
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("tcp_connect: invalid pcb", pcb != NULL, return ERR_ARG);
+  LWIP_ERROR("tcp_connect: invalid ipaddr", ipaddr != NULL, return ERR_ARG);
 
   LWIP_ERROR("tcp_connect: can only connect from state CLOSED", pcb->state == CLOSED, return ERR_ISCONN);
 
@@ -891,21 +1083,35 @@
   ip_addr_set(&pcb->remote_ip, ipaddr);
   pcb->remote_port = port;
 
-  /* check if we have a route to the remote host */
+  if (pcb->netif_idx != NETIF_NO_INDEX) {
+    netif = netif_get_by_index(pcb->netif_idx);
+  } else {
+    /* check if we have a route to the remote host */
+    netif = ip_route(&pcb->local_ip, &pcb->remote_ip);
+  }
+  if (netif == NULL) {
+    /* Don't even try to send a SYN packet if we have no route since that will fail. */
+    return ERR_RTE;
+  }
+
+  /* check if local IP has been assigned to pcb, if not, get one */
   if (ip_addr_isany(&pcb->local_ip)) {
-    /* no local IP address set, yet. */
-    struct netif *netif;
-    const ip_addr_t *local_ip;
-    ip_route_get_local_ip(&pcb->local_ip, &pcb->remote_ip, netif, local_ip);
-    if ((netif == NULL) || (local_ip == NULL)) {
-      /* Don't even try to send a SYN packet if we have no route
-         since that will fail. */
+    const ip_addr_t *local_ip = ip_netif_get_local_ip(netif, ipaddr);
+    if (local_ip == NULL) {
       return ERR_RTE;
     }
-    /* Use the address as local address of the pcb. */
     ip_addr_copy(pcb->local_ip, *local_ip);
   }
 
+#if LWIP_IPV6 && LWIP_IPV6_SCOPES
+  /* If the given IP address should have a zone but doesn't, assign one now.
+   * Given that we already have the target netif, this is easy and cheap. */
+  if (IP_IS_V6(&pcb->remote_ip) &&
+      ip6_addr_lacks_zone(ip_2_ip6(&pcb->remote_ip), IP6_UNICAST)) {
+    ip6_addr_assign_zone(ip_2_ip6(&pcb->remote_ip), IP6_UNICAST, netif);
+  }
+#endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */
+
   old_local_port = pcb->local_port;
   if (pcb->local_port == 0) {
     pcb->local_port = tcp_new_port();
@@ -950,7 +1156,7 @@
      The send MSS is updated when an MSS option is received. */
   pcb->mss = INITIAL_MSS;
 #if TCP_CALCULATE_EFF_SEND_MSS
-  pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip);
+  pcb->mss = tcp_eff_send_mss_netif(pcb->mss, netif, &pcb->remote_ip);
 #endif /* TCP_CALCULATE_EFF_SEND_MSS */
   pcb->cwnd = 1;
 #if LWIP_CALLBACK_API
@@ -1010,6 +1216,7 @@
     LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);
     if (pcb->last_timer == tcp_timer_ctr) {
       /* skip this pcb, we have already processed it */
+      prev = pcb;
       pcb = pcb->next;
       continue;
     }
@@ -1021,62 +1228,86 @@
     if (pcb->state == SYN_SENT && pcb->nrtx >= TCP_SYNMAXRTX) {
       ++pcb_remove;
       LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max SYN retries reached\n"));
-    }
-    else if (pcb->nrtx >= TCP_MAXRTX) {
+    } else if (pcb->nrtx >= TCP_MAXRTX) {
       ++pcb_remove;
       LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
     } else {
       if (pcb->persist_backoff > 0) {
-        /* If snd_wnd is zero, use persist timer to send 1 byte probes
-         * instead of using the standard retransmission mechanism. */
-        u8_t backoff_cnt = tcp_persist_backoff[pcb->persist_backoff-1];
-        if (pcb->persist_cnt < backoff_cnt) {
-          pcb->persist_cnt++;
-        }
-        if (pcb->persist_cnt >= backoff_cnt) {
-          if (tcp_zero_window_probe(pcb) == ERR_OK) {
-            pcb->persist_cnt = 0;
-            if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) {
-              pcb->persist_backoff++;
+        LWIP_ASSERT("tcp_slowtimr: persist ticking with in-flight data", pcb->unacked == NULL);
+        LWIP_ASSERT("tcp_slowtimr: persist ticking with empty send buffer", pcb->unsent != NULL);
+        if (pcb->persist_probe >= TCP_MAXRTX) {
+          ++pcb_remove; /* max probes reached */
+        } else {
+          u8_t backoff_cnt = tcp_persist_backoff[pcb->persist_backoff - 1];
+          if (pcb->persist_cnt < backoff_cnt) {
+            pcb->persist_cnt++;
+          }
+          if (pcb->persist_cnt >= backoff_cnt) {
+            int next_slot = 1; /* increment timer to next slot */
+            /* If snd_wnd is zero, send 1 byte probes */
+            if (pcb->snd_wnd == 0) {
+              if (tcp_zero_window_probe(pcb) != ERR_OK) {
+                next_slot = 0; /* try probe again with current slot */
+              }
+              /* snd_wnd not fully closed, split unsent head and fill window */
+            } else {
+              if (tcp_split_unsent_seg(pcb, (u16_t)pcb->snd_wnd) == ERR_OK) {
+                if (tcp_output(pcb) == ERR_OK) {
+                  /* sending will cancel persist timer, else retry with current slot */
+                  next_slot = 0;
+                }
+              }
+            }
+            if (next_slot) {
+              pcb->persist_cnt = 0;
+              if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) {
+                pcb->persist_backoff++;
+              }
             }
           }
         }
       } else {
         /* Increase the retransmission timer if it is running */
-        if (pcb->rtime >= 0) {
+        if ((pcb->rtime >= 0) && (pcb->rtime < 0x7FFF)) {
           ++pcb->rtime;
         }
 
-        if (pcb->unacked != NULL && pcb->rtime >= pcb->rto) {
+        if (pcb->rtime >= pcb->rto) {
           /* Time for a retransmission. */
           LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_slowtmr: rtime %"S16_F
                                       " pcb->rto %"S16_F"\n",
                                       pcb->rtime, pcb->rto));
+          /* If prepare phase fails but we have unsent data but no unacked data,
+             still execute the backoff calculations below, as this means we somehow
+             failed to send segment. */
+          if ((tcp_rexmit_rto_prepare(pcb) == ERR_OK) || ((pcb->unacked == NULL) && (pcb->unsent != NULL))) {
+            /* Double retransmission time-out unless we are trying to
+             * connect to somebody (i.e., we are in SYN_SENT). */
+            if (pcb->state != SYN_SENT) {
+              u8_t backoff_idx = LWIP_MIN(pcb->nrtx, sizeof(tcp_backoff) - 1);
+              int calc_rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[backoff_idx];
+              pcb->rto = (s16_t)LWIP_MIN(calc_rto, 0x7FFF);
+            }
 
-          /* Double retransmission time-out unless we are trying to
-           * connect to somebody (i.e., we are in SYN_SENT). */
-          if (pcb->state != SYN_SENT) {
-            u8_t backoff_idx = LWIP_MIN(pcb->nrtx, sizeof(tcp_backoff)-1);
-            pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[backoff_idx];
+            /* Reset the retransmission timer. */
+            pcb->rtime = 0;
+
+            /* Reduce congestion window and ssthresh. */
+            eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
+            pcb->ssthresh = eff_wnd >> 1;
+            if (pcb->ssthresh < (tcpwnd_size_t)(pcb->mss << 1)) {
+              pcb->ssthresh = (tcpwnd_size_t)(pcb->mss << 1);
+            }
+            pcb->cwnd = pcb->mss;
+            LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: cwnd %"TCPWNDSIZE_F
+                                         " ssthresh %"TCPWNDSIZE_F"\n",
+                                         pcb->cwnd, pcb->ssthresh));
+            pcb->bytes_acked = 0;
+
+            /* The following needs to be called AFTER cwnd is set to one
+               mss - STJ */
+            tcp_rexmit_rto_commit(pcb);
           }
-
-          /* Reset the retransmission timer. */
-          pcb->rtime = 0;
-
-          /* Reduce congestion window and ssthresh. */
-          eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
-          pcb->ssthresh = eff_wnd >> 1;
-          if (pcb->ssthresh < (tcpwnd_size_t)(pcb->mss << 1)) {
-            pcb->ssthresh = (pcb->mss << 1);
-          }
-          pcb->cwnd = pcb->mss;
-          LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: cwnd %"TCPWNDSIZE_F
-                                       " ssthresh %"TCPWNDSIZE_F"\n",
-                                       pcb->cwnd, pcb->ssthresh));
-
-          /* The following needs to be called AFTER cwnd is set to one
-             mss - STJ */
-          tcp_rexmit_rto(pcb);
         }
       }
     }
@@ -1096,21 +1327,19 @@
 
     /* Check if KEEPALIVE should be sent */
     if (ip_get_option(pcb, SOF_KEEPALIVE) &&
-       ((pcb->state == ESTABLISHED) ||
-        (pcb->state == CLOSE_WAIT))) {
+        ((pcb->state == ESTABLISHED) ||
+         (pcb->state == CLOSE_WAIT))) {
       if ((u32_t)(tcp_ticks - pcb->tmr) >
-         (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL)
-      {
+          (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL) {
         LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: KEEPALIVE timeout. Aborting connection to "));
-        ip_addr_debug_print(TCP_DEBUG, &pcb->remote_ip);
+        ip_addr_debug_print_val(TCP_DEBUG, pcb->remote_ip);
         LWIP_DEBUGF(TCP_DEBUG, ("\n"));
 
         ++pcb_remove;
         ++pcb_reset;
       } else if ((u32_t)(tcp_ticks - pcb->tmr) >
-                (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb))
-                / TCP_SLOW_INTERVAL)
-      {
+                 (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb))
+                 / TCP_SLOW_INTERVAL) {
         err = tcp_keepalive(pcb);
         if (err == ERR_OK) {
           pcb->keep_cnt_sent++;
@@ -1123,10 +1352,9 @@
        be retransmitted). */
 #if TCP_QUEUE_OOSEQ
     if (pcb->ooseq != NULL &&
-        (u32_t)tcp_ticks - pcb->tmr >= pcb->rto * TCP_OOSEQ_TIMEOUT) {
-      tcp_segs_free(pcb->ooseq);
-      pcb->ooseq = NULL;
+        (tcp_ticks - pcb->tmr >= (u32_t)pcb->rto * TCP_OOSEQ_TIMEOUT)) {
       LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: dropping OOSEQ queued data\n"));
+      tcp_free_ooseq(pcb);
     }
 #endif /* TCP_QUEUE_OOSEQ */
 
@@ -1167,15 +1395,15 @@
       }
 
       if (pcb_reset) {
-        tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
-                 pcb->local_port, pcb->remote_port);
+        tcp_rst(pcb, pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
+                pcb->local_port, pcb->remote_port);
       }
 
       err_arg = pcb->callback_arg;
       last_state = pcb->state;
       pcb2 = pcb;
       pcb = pcb->next;
-      memp_free(MEMP_TCP_PCB, pcb2);
+      tcp_free(pcb2);
 
       tcp_active_pcbs_changed = 0;
       TCP_EVENT_ERR(last_state, err_fn, err_arg, ERR_ABRT);
@@ -1233,7 +1461,7 @@
       }
       pcb2 = pcb;
       pcb = pcb->next;
-      memp_free(MEMP_TCP_PCB, pcb2);
+      tcp_free(pcb2);
     } else {
       prev = pcb;
       pcb = pcb->next;
@@ -1243,7 +1471,7 @@
 
 /**
  * Is called every TCP_FAST_INTERVAL (250 ms) and process data previously
- * "refused" by upper layer (application) and sends delayed ACKs.
+ * "refused" by upper layer (application) and sends delayed ACKs or pending FINs.
  *
  * Automatically called from tcp_tmr().
  */
@@ -1266,12 +1494,12 @@
         LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n"));
         tcp_ack_now(pcb);
         tcp_output(pcb);
-        pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
+        tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW);
       }
       /* send pending FIN */
       if (pcb->flags & TF_CLOSEPEND) {
         LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: pending FIN\n"));
-        pcb->flags &= ~(TF_CLOSEPEND);
+        tcp_clear_flags(pcb, TF_CLOSEPEND);
         tcp_close_shutdown_fin(pcb);
       }
 
@@ -1312,6 +1540,11 @@
 {
 #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
   struct pbuf *rest;
+#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
+
+  LWIP_ERROR("tcp_process_refused_data: invalid pcb", pcb != NULL, return ERR_ARG);
+
+#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
   while (pcb->refused_data != NULL)
 #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
   {
@@ -1331,7 +1564,7 @@
     TCP_EVENT_RECV(pcb, refused_data, ERR_OK, err);
     if (err == ERR_OK) {
       /* did refused_data include a FIN? */
-      if (refused_flags & PBUF_FLAG_TCP_FIN
+      if ((refused_flags & PBUF_FLAG_TCP_FIN)
 #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
           && (rest == NULL)
 #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
@@ -1401,6 +1634,7 @@
 }
 
 /**
+ * @ingroup tcp
  * Sets the priority of a connection.
  *
  * @param pcb the tcp_pcb to manipulate
@@ -1409,6 +1643,10 @@
 void
 tcp_setprio(struct tcp_pcb *pcb, u8_t prio)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("tcp_setprio: invalid pcb", pcb != NULL, return);
+
   pcb->prio = prio;
 }
 
@@ -1425,6 +1663,8 @@
 {
   struct tcp_seg *cseg;
 
+  LWIP_ASSERT("tcp_seg_copy: invalid seg", seg != NULL);
+
   cseg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG);
   if (cseg == NULL) {
     return NULL;
@@ -1444,6 +1684,9 @@
 tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
 {
   LWIP_UNUSED_ARG(arg);
+
+  LWIP_ERROR("tcp_recv_null: invalid pcb", pcb != NULL, return ERR_ARG);
+
   if (p != NULL) {
     tcp_recved(pcb, p->tot_len);
     pbuf_free(p);
@@ -1455,8 +1698,7 @@
 #endif /* LWIP_CALLBACK_API */
 
 /**
- * Kills the oldest active connection that has the same or lower priority than
- * 'prio'.
+ * Kills the oldest active connection that has a lower priority than 'prio'.
  *
  * @param prio minimum priority
  */
@@ -1469,20 +1711,35 @@
 
   mprio = LWIP_MIN(TCP_PRIO_MAX, prio);
 
-  /* We kill the oldest active connection that has lower priority than prio. */
+  /* 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 
+   * 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.
+   */
+  mprio--;
+
   inactivity = 0;
   inactive = NULL;
   for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
-    if (pcb->prio <= mprio &&
-       (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
+        /* lower prio is always a kill candidate */
+    if ((pcb->prio < mprio) ||
+        /* longer inactivity is also a kill candidate */
+        ((pcb->prio == mprio) && ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity))) {
       inactivity = tcp_ticks - pcb->tmr;
-      inactive = pcb;
-      mprio = pcb->prio;
+      inactive   = pcb;
+      mprio      = pcb->prio;
     }
   }
   if (inactive != NULL) {
     LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_prio: killing oldest PCB %p (%"S32_F")\n",
-           (void *)inactive, inactivity));
+                            (void *)inactive, inactivity));
     tcp_abort(inactive);
   }
 }
@@ -1513,7 +1770,7 @@
   }
   if (inactive != NULL) {
     LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_closing: killing oldest %s PCB %p (%"S32_F")\n",
-           tcp_state_str[state], (void *)inactive, inactivity));
+                            tcp_state_str[state], (void *)inactive, inactivity));
     /* Don't send a RST, since no data is lost. */
     tcp_abandon(inactive, 0);
   }
@@ -1540,11 +1797,33 @@
   }
   if (inactive != NULL) {
     LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_timewait: killing oldest TIME-WAIT PCB %p (%"S32_F")\n",
-           (void *)inactive, inactivity));
+                            (void *)inactive, inactivity));
     tcp_abort(inactive);
   }
 }
 
+/* Called when allocating a pcb fails.
+ * In this case, we want to handle all pcbs that want to close first: if we can
+ * now send the FIN (which failed before), the pcb might be in a state that is
+ * OK for us to now free it.
+ */
+static void
+tcp_handle_closepend(void)
+{
+  struct tcp_pcb *pcb = tcp_active_pcbs;
+
+  while (pcb != NULL) {
+    struct tcp_pcb *next = pcb->next;
+    /* send pending FIN */
+    if (pcb->flags & TF_CLOSEPEND) {
+      LWIP_DEBUGF(TCP_DEBUG, ("tcp_handle_closepend: pending FIN\n"));
+      tcp_clear_flags(pcb, TF_CLOSEPEND);
+      tcp_close_shutdown_fin(pcb);
+    }
+    pcb = next;
+  }
+}
+
 /**
  * Allocate a new tcp_pcb structure.
  *
@@ -1556,8 +1835,13 @@
 {
   struct tcp_pcb *pcb;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
   pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
   if (pcb == NULL) {
+    /* Try to send FIN for all pcbs stuck in TF_CLOSEPEND first */
+    tcp_handle_closepend();
+
     /* Try killing oldest connection in TIME-WAIT. */
     LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection\n"));
     tcp_kill_timewait();
@@ -1576,8 +1860,8 @@
         /* Try to allocate a tcp_pcb again. */
         pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
         if (pcb == NULL) {
-          /* Try killing active connections with lower priority than the new one. */
-          LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing connection with prio lower than %d\n", prio));
+          /* Try killing oldest active connection with lower priority than the new one. */
+          LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing oldest connection with prio lower than %d\n", prio));
           tcp_kill_prio(prio);
           /* Try to allocate a tcp_pcb again. */
           pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
@@ -1648,6 +1932,7 @@
  * 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 tcp_bind().
+ * If memory is not available for creating the new pcb, NULL is returned.
  *
  * @internal: Maybe there should be a idle TCP PCB list where these
  * PCBs are put on. Port reservation using tcp_bind() is implemented but
@@ -1676,7 +1961,7 @@
 struct tcp_pcb *
 tcp_new_ip_type(u8_t type)
 {
-  struct tcp_pcb * pcb;
+  struct tcp_pcb *pcb;
   pcb = tcp_alloc(TCP_PRIO_NORMAL);
 #if LWIP_IPV4 && LWIP_IPV6
   if (pcb != NULL) {
@@ -1691,8 +1976,10 @@
 
 /**
  * @ingroup tcp_raw
- * Used to specify the argument that should be passed callback
- * functions.
+ * Specifies the program specific state that should be passed to all
+ * other callback functions. The "pcb" argument is the current TCP
+ * connection control block, and the "arg" argument is the argument
+ * that will be passed to the callbacks.
  *
  * @param pcb tcp_pcb to set the callback argument
  * @param arg void pointer argument to pass to callback functions
@@ -1700,6 +1987,7 @@
 void
 tcp_arg(struct tcp_pcb *pcb, void *arg)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   /* This function is allowed to be called for both listen pcbs and
      connection pcbs. */
   if (pcb != NULL) {
@@ -1710,8 +1998,11 @@
 
 /**
  * @ingroup tcp_raw
- * Used to specify the function that should be called when a TCP
- * connection receives data.
+ * Sets the callback function that will be called when new data
+ * arrives. The callback function will be passed a NULL pbuf to
+ * indicate that the remote host has closed the connection. If the
+ * callback function returns ERR_OK or ERR_ABRT it must have
+ * freed the pbuf, otherwise it must not have freed it.
  *
  * @param pcb tcp_pcb to set the recv callback
  * @param recv callback function to call for this pcb when data is received
@@ -1719,6 +2010,7 @@
 void
 tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   if (pcb != NULL) {
     LWIP_ASSERT("invalid socket state for recv callback", pcb->state != LISTEN);
     pcb->recv = recv;
@@ -1727,8 +2019,10 @@
 
 /**
  * @ingroup tcp_raw
- * Used to specify the function that should be called when TCP data
- * has been successfully delivered to the remote host.
+ * Specifies the callback function that should be called when data has
+ * successfully been received (i.e., acknowledged) by the remote
+ * host. The len argument passed to the callback function gives the
+ * amount bytes that was acknowledged by the last acknowledgment.
  *
  * @param pcb tcp_pcb to set the sent callback
  * @param sent callback function to call for this pcb when data is successfully sent
@@ -1736,6 +2030,7 @@
 void
 tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   if (pcb != NULL) {
     LWIP_ASSERT("invalid socket state for sent callback", pcb->state != LISTEN);
     pcb->sent = sent;
@@ -1746,9 +2041,14 @@
  * @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
+ * function to be called is set using the tcp_err() function.
  *
  * @note The corresponding pcb is already freed when this callback is called!
- * 
+ *
  * @param pcb tcp_pcb to set the err callback
  * @param err callback function to call for this pcb when a fatal error
  *        has occurred on the connection
@@ -1756,6 +2056,7 @@
 void
 tcp_err(struct tcp_pcb *pcb, tcp_err_fn err)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   if (pcb != NULL) {
     LWIP_ASSERT("invalid socket state for err callback", pcb->state != LISTEN);
     pcb->errf = err;
@@ -1774,8 +2075,9 @@
 void
 tcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   if ((pcb != NULL) && (pcb->state == LISTEN)) {
-    struct tcp_pcb_listen *lpcb = (struct tcp_pcb_listen*)pcb;
+    struct tcp_pcb_listen *lpcb = (struct tcp_pcb_listen *)pcb;
     lpcb->accept = accept;
   }
 }
@@ -1784,15 +2086,29 @@
 
 /**
  * @ingroup tcp_raw
- * Used to specify the function that should be called periodically
- * from TCP. The interval is specified in terms of the TCP coarse
- * timer interval, which is called twice a second.
- *
+ * Specifies the polling interval and the callback function that should
+ * be called to poll the application. The interval is specified in
+ * 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
+ * timer for killing connections that have stayed idle for too long, or
+ * as a method of waiting for memory to become available. For instance,
+ * if a call to tcp_write() has failed because memory wasn't available,
+ * the application may use the polling functionality to call tcp_write()
+ * again when the connection has been idle for a while.
  */
 void
 tcp_poll(struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("tcp_poll: invalid pcb", pcb != NULL, return);
   LWIP_ASSERT("invalid socket state for poll", pcb->state != LISTEN);
+
 #if LWIP_CALLBACK_API
   pcb->poll = poll;
 #else /* LWIP_CALLBACK_API */
@@ -1810,9 +2126,11 @@
 void
 tcp_pcb_purge(struct tcp_pcb *pcb)
 {
+  LWIP_ERROR("tcp_pcb_purge: invalid pcb", pcb != NULL, return);
+
   if (pcb->state != CLOSED &&
-     pcb->state != TIME_WAIT &&
-     pcb->state != LISTEN) {
+      pcb->state != TIME_WAIT &&
+      pcb->state != LISTEN) {
 
     LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge\n"));
 
@@ -1832,9 +2150,8 @@
 #if TCP_QUEUE_OOSEQ
     if (pcb->ooseq != NULL) {
       LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->ooseq\n"));
+      tcp_free_ooseq(pcb);
     }
-    tcp_segs_free(pcb->ooseq);
-    pcb->ooseq = NULL;
 #endif /* TCP_QUEUE_OOSEQ */
 
     /* Stop the retransmission timer as it will expect data on unacked
@@ -1859,15 +2176,18 @@
 void
 tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)
 {
+  LWIP_ASSERT("tcp_pcb_remove: invalid pcb", pcb != NULL);
+  LWIP_ASSERT("tcp_pcb_remove: invalid pcblist", pcblist != NULL);
+
   TCP_RMV(pcblist, pcb);
 
   tcp_pcb_purge(pcb);
 
   /* if there is an outstanding delayed ACKs, send it */
-  if (pcb->state != TIME_WAIT &&
-     pcb->state != LISTEN &&
-     pcb->flags & TF_ACK_DELAY) {
-    pcb->flags |= TF_ACK_NOW;
+  if ((pcb->state != TIME_WAIT) &&
+      (pcb->state != LISTEN) &&
+      (pcb->flags & TF_ACK_DELAY)) {
+    tcp_ack_now(pcb);
     tcp_output(pcb);
   }
 
@@ -1895,10 +2215,12 @@
 tcp_next_iss(struct tcp_pcb *pcb)
 {
 #ifdef LWIP_HOOK_TCP_ISN
+  LWIP_ASSERT("tcp_next_iss: invalid pcb", pcb != NULL);
   return LWIP_HOOK_TCP_ISN(&pcb->local_ip, pcb->local_port, &pcb->remote_ip, pcb->remote_port);
 #else /* LWIP_HOOK_TCP_ISN */
   static u32_t iss = 6510;
 
+  LWIP_ASSERT("tcp_next_iss: invalid pcb", pcb != NULL);
   LWIP_UNUSED_ARG(pcb);
 
   iss += tcp_ticks;       /* XXX */
@@ -1909,21 +2231,19 @@
 #if TCP_CALCULATE_EFF_SEND_MSS
 /**
  * Calculates the effective send mss that can be used for a specific IP address
- * by using ip_route to determine the netif used to send to the address and
- * calculating the minimum of TCP_MSS and that netif's mtu (if set).
+ * by calculating the minimum of TCP_MSS and the mtu (if set) of the target
+ * netif (if not NULL).
  */
 u16_t
-tcp_eff_send_mss_impl(u16_t sendmss, const ip_addr_t *dest
-#if LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING
-                     , const ip_addr_t *src
-#endif /* LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING */
-                     )
+tcp_eff_send_mss_netif(u16_t sendmss, struct netif *outif, const ip_addr_t *dest)
 {
   u16_t mss_s;
-  struct netif *outif;
-  s16_t mtu;
+  u16_t mtu;
 
-  outif = ip_route(src, dest);
+  LWIP_UNUSED_ARG(dest); /* in case IPv6 is disabled */
+
+  LWIP_ASSERT("tcp_eff_send_mss_netif: invalid dst_ip", dest != NULL);
+
 #if LWIP_IPV6
 #if LWIP_IPV4
   if (IP_IS_V6(dest))
@@ -1946,12 +2266,13 @@
 #endif /* LWIP_IPV4 */
 
   if (mtu != 0) {
+    u16_t offset;
 #if LWIP_IPV6
 #if LWIP_IPV4
     if (IP_IS_V6(dest))
 #endif /* LWIP_IPV4 */
     {
-      mss_s = mtu - IP6_HLEN - TCP_HLEN;
+      offset = IP6_HLEN + TCP_HLEN;
     }
 #if LWIP_IPV4
     else
@@ -1959,9 +2280,10 @@
 #endif /* LWIP_IPV6 */
 #if LWIP_IPV4
     {
-      mss_s = mtu - IP_HLEN - TCP_HLEN;
+      offset = IP_HLEN + TCP_HLEN;
     }
 #endif /* LWIP_IPV4 */
+    mss_s = (mtu > offset) ? (u16_t)(mtu - offset) : 0;
     /* RFC 1122, chap 4.2.2.6:
      * Eff.snd.MSS = min(SendMSS+20, MMS_S) - TCPhdrsize - IPoptionsize
      * We correct for TCP options in tcp_write(), and don't support IP options.
@@ -1974,18 +2296,21 @@
 
 /** Helper function for tcp_netif_ip_addr_changed() that iterates a pcb list */
 static void
-tcp_netif_ip_addr_changed_pcblist(const ip_addr_t* old_addr, struct tcp_pcb* pcb_list)
+tcp_netif_ip_addr_changed_pcblist(const ip_addr_t *old_addr, struct tcp_pcb *pcb_list)
 {
   struct tcp_pcb *pcb;
   pcb = pcb_list;
+
+  LWIP_ASSERT("tcp_netif_ip_addr_changed_pcblist: invalid old_addr", old_addr != NULL);
+
   while (pcb != NULL) {
     /* PCB bound to current local interface address? */
     if (ip_addr_cmp(&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)))
+        /* 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)))
 #endif /* LWIP_AUTOIP */
-      ) {
+       ) {
       /* this connection must be aborted */
       struct tcp_pcb *next = pcb->next;
       LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: aborting TCP pcb %p\n", (void *)pcb));
@@ -2003,9 +2328,9 @@
  * @param new_addr IP address of the netif after change or NULL if netif has been removed
  */
 void
-tcp_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr)
+tcp_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr)
 {
-  struct tcp_pcb_listen *lpcb, *next;
+  struct tcp_pcb_listen *lpcb;
 
   if (!ip_addr_isany(old_addr)) {
     tcp_netif_ip_addr_changed_pcblist(old_addr, tcp_active_pcbs);
@@ -2013,8 +2338,7 @@
 
     if (!ip_addr_isany(new_addr)) {
       /* PCB bound to current local interface address? */
-      for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = next) {
-        next = lpcb->next;
+      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)) {
           /* The PCB is listening to the old ipaddr and
@@ -2026,12 +2350,51 @@
   }
 }
 
-const char*
+const char *
 tcp_debug_state_str(enum tcp_state s)
 {
   return tcp_state_str[s];
 }
 
+err_t
+tcp_tcp_get_tcp_addrinfo(struct tcp_pcb *pcb, int local, ip_addr_t *addr, u16_t *port)
+{
+  if (pcb) {
+    if (local) {
+      if (addr) {
+        *addr = pcb->local_ip;
+      }
+      if (port) {
+        *port = pcb->local_port;
+      }
+    } else {
+      if (addr) {
+        *addr = pcb->remote_ip;
+      }
+      if (port) {
+        *port = pcb->remote_port;
+      }
+    }
+    return ERR_OK;
+  }
+  return ERR_VAL;
+}
+
+#if TCP_QUEUE_OOSEQ
+/* Free all ooseq pbufs (and possibly reset SACK state) */
+void
+tcp_free_ooseq(struct tcp_pcb *pcb)
+{
+  if (pcb->ooseq) {
+    tcp_segs_free(pcb->ooseq);
+    pcb->ooseq = NULL;
+#if LWIP_TCP_SACK_OUT
+    memset(pcb->rcv_sacks, 0, sizeof(pcb->rcv_sacks));
+#endif /* LWIP_TCP_SACK_OUT */
+  }
+}
+#endif /* TCP_QUEUE_OOSEQ */
+
 #if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG
 /**
  * Print a tcp header for debugging purposes.
@@ -2044,28 +2407,28 @@
   LWIP_DEBUGF(TCP_DEBUG, ("TCP header:\n"));
   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
   LWIP_DEBUGF(TCP_DEBUG, ("|    %5"U16_F"      |    %5"U16_F"      | (src port, dest port)\n",
-         lwip_ntohs(tcphdr->src), lwip_ntohs(tcphdr->dest)));
+                          lwip_ntohs(tcphdr->src), lwip_ntohs(tcphdr->dest)));
   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
   LWIP_DEBUGF(TCP_DEBUG, ("|           %010"U32_F"          | (seq no)\n",
-          lwip_ntohl(tcphdr->seqno)));
+                          lwip_ntohl(tcphdr->seqno)));
   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
   LWIP_DEBUGF(TCP_DEBUG, ("|           %010"U32_F"          | (ack no)\n",
-         lwip_ntohl(tcphdr->ackno)));
+                          lwip_ntohl(tcphdr->ackno)));
   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
   LWIP_DEBUGF(TCP_DEBUG, ("| %2"U16_F" |   |%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"|     %5"U16_F"     | (hdrlen, flags (",
-       TCPH_HDRLEN(tcphdr),
-         (u16_t)(TCPH_FLAGS(tcphdr) >> 5 & 1),
-         (u16_t)(TCPH_FLAGS(tcphdr) >> 4 & 1),
-         (u16_t)(TCPH_FLAGS(tcphdr) >> 3 & 1),
-         (u16_t)(TCPH_FLAGS(tcphdr) >> 2 & 1),
-         (u16_t)(TCPH_FLAGS(tcphdr) >> 1 & 1),
-         (u16_t)(TCPH_FLAGS(tcphdr)      & 1),
-         lwip_ntohs(tcphdr->wnd)));
+                          TCPH_HDRLEN(tcphdr),
+                          (u16_t)(TCPH_FLAGS(tcphdr) >> 5 & 1),
+                          (u16_t)(TCPH_FLAGS(tcphdr) >> 4 & 1),
+                          (u16_t)(TCPH_FLAGS(tcphdr) >> 3 & 1),
+                          (u16_t)(TCPH_FLAGS(tcphdr) >> 2 & 1),
+                          (u16_t)(TCPH_FLAGS(tcphdr) >> 1 & 1),
+                          (u16_t)(TCPH_FLAGS(tcphdr)      & 1),
+                          lwip_ntohs(tcphdr->wnd)));
   tcp_debug_print_flags(TCPH_FLAGS(tcphdr));
   LWIP_DEBUGF(TCP_DEBUG, ("), win)\n"));
   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
   LWIP_DEBUGF(TCP_DEBUG, ("|    0x%04"X16_F"     |     %5"U16_F"     | (chksum, urgp)\n",
-         lwip_ntohs(tcphdr->chksum), lwip_ntohs(tcphdr->urgp)));
+                          lwip_ntohs(tcphdr->chksum), lwip_ntohs(tcphdr->urgp)));
   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
 }
 
@@ -2127,8 +2490,8 @@
   LWIP_DEBUGF(TCP_DEBUG, ("Active PCB states:\n"));
   for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
     LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ",
-                       pcb->local_port, pcb->remote_port,
-                       pcb->snd_nxt, pcb->rcv_nxt));
+                            pcb->local_port, pcb->remote_port,
+                            pcb->snd_nxt, pcb->rcv_nxt));
     tcp_debug_print_state(pcb->state);
   }
 
@@ -2141,8 +2504,8 @@
   LWIP_DEBUGF(TCP_DEBUG, ("TIME-WAIT PCB states:\n"));
   for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
     LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ",
-                       pcb->local_port, pcb->remote_port,
-                       pcb->snd_nxt, pcb->rcv_nxt));
+                            pcb->local_port, pcb->remote_port,
+                            pcb->snd_nxt, pcb->rcv_nxt));
     tcp_debug_print_state(pcb->state);
   }
 }
@@ -2166,4 +2529,158 @@
 }
 #endif /* TCP_DEBUG */
 
+#if LWIP_TCP_PCB_NUM_EXT_ARGS
+/**
+ * @defgroup tcp_raw_extargs ext arguments
+ * @ingroup tcp_raw
+ * Additional data storage per tcp pcb\n
+ * @see @ref tcp_raw
+ *
+ * When LWIP_TCP_PCB_NUM_EXT_ARGS is > 0, every tcp pcb (including listen pcb)
+ * includes a number of additional argument entries in an array.
+ *
+ * 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 @ref tcp_ext_arg_callbacks).
+ *
+ * After allocating this index, use @ref tcp_ext_arg_set and @ref tcp_ext_arg_get
+ * to store and load arguments from this index for a given pcb.
+ */
+
+static u8_t tcp_ext_arg_id;
+
+/**
+ * @ingroup tcp_raw_extargs
+ * Allocate an index to store data in ext_args member of struct tcp_pcb.
+ * Returned value is an index in mentioned array.
+ * The index is *global* over all pcbs!
+ *
+ * When @ref LWIP_TCP_PCB_NUM_EXT_ARGS is > 0, every tcp pcb (including listen pcb)
+ * includes a number of additional argument entries in an array.
+ *
+ * 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 @ref tcp_ext_arg_callbacks).
+ *
+ * After allocating this index, use @ref tcp_ext_arg_set and @ref tcp_ext_arg_get
+ * to store and load arguments from this index for a given pcb.
+ *
+ * @return a unique index into struct tcp_pcb.ext_args
+ */
+u8_t
+tcp_ext_arg_alloc_id(void)
+{
+  u8_t result = tcp_ext_arg_id;
+  tcp_ext_arg_id++;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+#if LWIP_TCP_PCB_NUM_EXT_ARGS >= 255
+#error LWIP_TCP_PCB_NUM_EXT_ARGS
+#endif
+  LWIP_ASSERT("Increase LWIP_TCP_PCB_NUM_EXT_ARGS in lwipopts.h", result < LWIP_TCP_PCB_NUM_EXT_ARGS);
+  return result;
+}
+
+/**
+ * @ingroup tcp_raw_extargs
+ * Set callbacks for a given index of ext_args on the specified pcb.
+ *
+ * @param pcb tcp_pcb for which to set the callback
+ * @param id ext_args index to set (allocated via @ref tcp_ext_arg_alloc_id)
+ * @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)
+{
+  LWIP_ASSERT("pcb != NULL", pcb != NULL);
+  LWIP_ASSERT("id < LWIP_TCP_PCB_NUM_EXT_ARGS", id < LWIP_TCP_PCB_NUM_EXT_ARGS);
+  LWIP_ASSERT("callbacks != NULL", callbacks != NULL);
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  pcb->ext_args[id].callbacks = callbacks;
+}
+
+/**
+ * @ingroup tcp_raw_extargs
+ * Set data for a given index of ext_args on the specified pcb.
+ *
+ * @param pcb tcp_pcb for which to set the data
+ * @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)
+{
+  LWIP_ASSERT("pcb != NULL", pcb != NULL);
+  LWIP_ASSERT("id < LWIP_TCP_PCB_NUM_EXT_ARGS", id < LWIP_TCP_PCB_NUM_EXT_ARGS);
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  pcb->ext_args[id].data = arg;
+}
+
+/**
+ * @ingroup tcp_raw_extargs
+ * Set data for a given index of ext_args on the specified pcb.
+ *
+ * @param pcb tcp_pcb for which to set the data
+ * @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)
+{
+  LWIP_ASSERT("pcb != NULL", pcb != NULL);
+  LWIP_ASSERT("id < LWIP_TCP_PCB_NUM_EXT_ARGS", id < LWIP_TCP_PCB_NUM_EXT_ARGS);
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  return pcb->ext_args[id].data;
+}
+
+/** This function calls the "destroy" callback for all ext_args once a pcb is
+ * freed.
+ */
+static void
+tcp_ext_arg_invoke_callbacks_destroyed(struct tcp_pcb_ext_args *ext_args)
+{
+  int i;
+  LWIP_ASSERT("ext_args != NULL", ext_args != NULL);
+
+  for (i = 0; i < LWIP_TCP_PCB_NUM_EXT_ARGS; i++) {
+    if (ext_args[i].callbacks != NULL) {
+      if (ext_args[i].callbacks->destroy != NULL) {
+        ext_args[i].callbacks->destroy((u8_t)i, ext_args[i].data);
+      }
+    }
+  }
+}
+
+/** This function calls the "passive_open" callback for all ext_args if a connection
+ * is in the process of being accepted. This is called just after the SYN is
+ * received and before a SYN/ACK is sent, to allow to modify the very first
+ * segment sent even on passive open. Naturally, the "accepted" callback of the
+ * pcb has not been called yet!
+ */
+err_t
+tcp_ext_arg_invoke_callbacks_passive_open(struct tcp_pcb_listen *lpcb, struct tcp_pcb *cpcb)
+{
+  int i;
+  LWIP_ASSERT("lpcb != NULL", lpcb != NULL);
+  LWIP_ASSERT("cpcb != NULL", cpcb != NULL);
+
+  for (i = 0; i < LWIP_TCP_PCB_NUM_EXT_ARGS; i++) {
+    if (lpcb->ext_args[i].callbacks != NULL) {
+      if (lpcb->ext_args[i].callbacks->passive_open != NULL) {
+        err_t err = lpcb->ext_args[i].callbacks->passive_open((u8_t)i, lpcb, cpcb);
+        if (err != ERR_OK) {
+          return err;
+        }
+      }
+    }
+  }
+  return ERR_OK;
+}
+#endif /* LWIP_TCP_PCB_NUM_EXT_ARGS */
+
 #endif /* LWIP_TCP */
diff --git a/src/core/tcp_in.c b/src/core/tcp_in.c
index 5e839ff..428a6f4 100644
--- a/src/core/tcp_in.c
+++ b/src/core/tcp_in.c
@@ -59,8 +59,14 @@
 #include "lwip/nd6.h"
 #endif /* LWIP_ND6_TCP_REACHABILITY_HINTS */
 
+#include <string.h>
+
+#ifdef LWIP_HOOK_FILENAME
+#include LWIP_HOOK_FILENAME
+#endif
+
 /** Initial CWND calculation as defined RFC 2581 */
-#define LWIP_TCP_CALC_INITIAL_CWND(mss) LWIP_MIN((4U * (mss)), LWIP_MAX((2U * (mss)), 4380U));
+#define LWIP_TCP_CALC_INITIAL_CWND(mss) ((tcpwnd_size_t)LWIP_MIN((4U * (mss)), LWIP_MAX((2U * (mss)), 4380U)))
 
 /* These variables are global to all functions involved in the input
    processing of TCP segments. They are set by the tcp_input()
@@ -69,7 +75,7 @@
 static struct tcp_hdr *tcphdr;
 static u16_t tcphdr_optlen;
 static u16_t tcphdr_opt1len;
-static u8_t* tcphdr_opt2;
+static u8_t *tcphdr_opt2;
 static u16_t tcp_optidx;
 static u32_t seqno, ackno;
 static tcpwnd_size_t recv_acked;
@@ -91,6 +97,14 @@
 
 static int tcp_input_delayed_close(struct tcp_pcb *pcb);
 
+#if LWIP_TCP_SACK_OUT
+static void tcp_add_sack(struct tcp_pcb *pcb, u32_t left, u32_t right);
+static void tcp_remove_sacks_lt(struct tcp_pcb *pcb, u32_t seq);
+#if defined(TCP_OOSEQ_BYTES_LIMIT) || defined(TCP_OOSEQ_PBUFS_LIMIT)
+static void tcp_remove_sacks_gt(struct tcp_pcb *pcb, u32_t seq);
+#endif /* TCP_OOSEQ_BYTES_LIMIT || TCP_OOSEQ_PBUFS_LIMIT */
+#endif /* LWIP_TCP_SACK_OUT */
+
 /**
  * The initial input processing of TCP. It verifies the TCP header, demultiplexes
  * the segment between the PCBs and passes it on to tcp_process(), which implements
@@ -113,6 +127,8 @@
   err_t err;
 
   LWIP_UNUSED_ARG(inp);
+  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ASSERT("tcp_input: invalid pbuf", p != NULL);
 
   PERF_START;
 
@@ -144,10 +160,10 @@
   IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_CHECK_TCP) {
     /* Verify TCP checksum. */
     u16_t chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len,
-                               ip_current_src_addr(), ip_current_dest_addr());
+                                    ip_current_src_addr(), ip_current_dest_addr());
     if (chksum != 0) {
-        LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packet discarded due to failing checksum 0x%04"X16_F"\n",
-          chksum));
+      LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packet discarded due to failing checksum 0x%04"X16_F"\n",
+                                    chksum));
       tcp_debug_print(tcphdr);
       TCP_STATS_INC(tcp.chkerr);
       goto dropped;
@@ -156,7 +172,7 @@
 #endif /* CHECKSUM_CHECK_TCP */
 
   /* sanity-check header length */
-  hdrlen_bytes = TCPH_HDRLEN(tcphdr) * 4;
+  hdrlen_bytes = TCPH_HDRLEN_BYTES(tcphdr);
   if ((hdrlen_bytes < TCP_HLEN) || (hdrlen_bytes > p->tot_len)) {
     LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: invalid header length (%"U16_F")\n", (u16_t)hdrlen_bytes));
     TCP_STATS_INC(tcp.lenerr);
@@ -165,12 +181,12 @@
 
   /* Move the payload pointer in the pbuf so that it points to the
      TCP data instead of the TCP header. */
-  tcphdr_optlen = hdrlen_bytes - TCP_HLEN;
+  tcphdr_optlen = (u16_t)(hdrlen_bytes - TCP_HLEN);
   tcphdr_opt2 = NULL;
   if (p->len >= hdrlen_bytes) {
     /* all options are in the first pbuf */
     tcphdr_opt1len = tcphdr_optlen;
-    pbuf_header(p, -(s16_t)hdrlen_bytes); /* cannot fail */
+    pbuf_remove_header(p, hdrlen_bytes); /* cannot fail */
   } else {
     u16_t opt2len;
     /* TCP header fits into first pbuf, options don't - data is in the next pbuf */
@@ -178,15 +194,15 @@
     LWIP_ASSERT("p->next != NULL", p->next != NULL);
 
     /* advance over the TCP header (cannot fail) */
-    pbuf_header(p, -TCP_HLEN);
+    pbuf_remove_header(p, TCP_HLEN);
 
     /* determine how long the first and second parts of the options are */
     tcphdr_opt1len = p->len;
-    opt2len = tcphdr_optlen - tcphdr_opt1len;
+    opt2len = (u16_t)(tcphdr_optlen - tcphdr_opt1len);
 
     /* options continue in the next pbuf: set p to zero length and hide the
         options in the next pbuf (adjusting p->tot_len) */
-    pbuf_header(p, -(s16_t)tcphdr_opt1len);
+    pbuf_remove_header(p, tcphdr_opt1len);
 
     /* check that the options fit in the second pbuf */
     if (opt2len > p->next->len) {
@@ -197,12 +213,12 @@
     }
 
     /* remember the pointer to the second part of the options */
-    tcphdr_opt2 = (u8_t*)p->next->payload;
+    tcphdr_opt2 = (u8_t *)p->next->payload;
 
     /* advance p->next to point after the options, and manually
         adjust p->tot_len to keep it consistent with the changed p->next */
-    pbuf_header(p->next, -(s16_t)opt2len);
-    p->tot_len -= opt2len;
+    pbuf_remove_header(p->next, opt2len);
+    p->tot_len = (u16_t)(p->tot_len - opt2len);
 
     LWIP_ASSERT("p->len == 0", p->len == 0);
     LWIP_ASSERT("p->tot_len == p->next->tot_len", p->tot_len == p->next->tot_len);
@@ -216,7 +232,16 @@
   tcphdr->wnd = lwip_ntohs(tcphdr->wnd);
 
   flags = TCPH_FLAGS(tcphdr);
-  tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
+  tcplen = p->tot_len;
+  if (flags & (TCP_FIN | TCP_SYN)) {
+    tcplen++;
+    if (tcplen < p->tot_len) {
+      /* u16_t overflow, cannot handle this */
+      LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: length u16_t overflow, cannot handle this\n"));
+      TCP_STATS_INC(tcp.lenerr);
+      goto dropped;
+    }
+  }
 
   /* Demultiplex an incoming segment. First, we check if it is destined
      for an active connection. */
@@ -226,6 +251,14 @@
     LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
     LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
     LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
+
+    /* check if PCB is bound to specific netif */
+    if ((pcb->netif_idx != NETIF_NO_INDEX) &&
+        (pcb->netif_idx != netif_get_index(ip_data.current_input_netif))) {
+      prev = pcb;
+      continue;
+    }
+
     if (pcb->remote_port == tcphdr->src &&
         pcb->local_port == tcphdr->dest &&
         ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) &&
@@ -252,6 +285,13 @@
        in the TIME-WAIT state. */
     for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
       LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
+
+      /* check if PCB is bound to specific netif */
+      if ((pcb->netif_idx != NETIF_NO_INDEX) &&
+          (pcb->netif_idx != netif_get_index(ip_data.current_input_netif))) {
+        continue;
+      }
+
       if (pcb->remote_port == tcphdr->src &&
           pcb->local_port == tcphdr->dest &&
           ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) &&
@@ -260,7 +300,13 @@
            of the list since we are not very likely to receive that
            many segments for connections in TIME-WAIT. */
         LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for TIME_WAITing connection.\n"));
-        tcp_timewait_input(pcb);
+#ifdef LWIP_HOOK_TCP_INPACKET_PCB
+        if (LWIP_HOOK_TCP_INPACKET_PCB(pcb, tcphdr, tcphdr_optlen, tcphdr_opt1len,
+                                       tcphdr_opt2, p) == ERR_OK)
+#endif
+        {
+          tcp_timewait_input(pcb);
+        }
         pbuf_free(p);
         return;
       }
@@ -270,6 +316,13 @@
        are LISTENing for incoming connections. */
     prev = NULL;
     for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
+      /* check if PCB is bound to specific netif */
+      if ((lpcb->netif_idx != NETIF_NO_INDEX) &&
+          (lpcb->netif_idx != netif_get_index(ip_data.current_input_netif))) {
+        prev = (struct tcp_pcb *)lpcb;
+        continue;
+      }
+
       if (lpcb->local_port == tcphdr->dest) {
         if (IP_IS_ANY_TYPE_VAL(lpcb->local_ip)) {
           /* found an ANY TYPE (IPv4/IPv6) match */
@@ -290,7 +343,7 @@
             lpcb_prev = prev;
 #else /* SO_REUSE */
             break;
- #endif /* SO_REUSE */
+#endif /* SO_REUSE */
           }
         }
       }
@@ -310,16 +363,22 @@
          arrivals). */
       if (prev != NULL) {
         ((struct tcp_pcb_listen *)prev)->next = lpcb->next;
-              /* our successor is the remainder of the listening list */
+        /* our successor is the remainder of the listening list */
         lpcb->next = tcp_listen_pcbs.listen_pcbs;
-              /* put this listening pcb at the head of the listening list */
+        /* put this listening pcb at the head of the listening list */
         tcp_listen_pcbs.listen_pcbs = lpcb;
       } else {
         TCP_STATS_INC(tcp.cachehit);
       }
 
       LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for LISTENing connection.\n"));
-      tcp_listen_input(lpcb);
+#ifdef LWIP_HOOK_TCP_INPACKET_PCB
+      if (LWIP_HOOK_TCP_INPACKET_PCB((struct tcp_pcb *)lpcb, tcphdr, tcphdr_optlen,
+                                     tcphdr_opt1len, tcphdr_opt2, p) == ERR_OK)
+#endif
+      {
+        tcp_listen_input(lpcb);
+      }
       pbuf_free(p);
       return;
     }
@@ -332,6 +391,13 @@
 #endif /* TCP_INPUT_DEBUG */
 
 
+#ifdef LWIP_HOOK_TCP_INPACKET_PCB
+  if ((pcb != NULL) && LWIP_HOOK_TCP_INPACKET_PCB(pcb, tcphdr, tcphdr_optlen,
+      tcphdr_opt1len, tcphdr_opt2, p) != ERR_OK) {
+    pbuf_free(p);
+    return;
+  }
+#endif
   if (pcb != NULL) {
     /* The incoming segment belongs to a connection. */
 #if TCP_INPUT_DEBUG
@@ -355,7 +421,7 @@
     /* If there is data which was previously "refused" by upper layer */
     if (pcb->refused_data != NULL) {
       if ((tcp_process_refused_data(pcb) == ERR_ABRT) ||
-        ((pcb->refused_data != NULL) && (tcplen > 0))) {
+          ((pcb->refused_data != NULL) && (tcplen > 0))) {
         /* pcb has been aborted or refused data is still refused and the new
            segment contains data */
         if (pcb->rcv_ann_wnd == 0) {
@@ -380,7 +446,7 @@
            deallocate the PCB. */
         TCP_EVENT_ERR(pcb->state, pcb->errf, pcb->callback_arg, ERR_RST);
         tcp_pcb_remove(&tcp_active_pcbs, pcb);
-        memp_free(MEMP_TCP_PCB, pcb);
+        tcp_free(pcb);
       } else {
         err = ERR_OK;
         /* If the application has registered a "sent" function to be
@@ -499,21 +565,19 @@
     recv_data = NULL;
 
     /* give up our reference to inseg.p */
-    if (inseg.p != NULL)
-    {
+    if (inseg.p != NULL) {
       pbuf_free(inseg.p);
       inseg.p = NULL;
     }
   } else {
-
     /* If no matching PCB was found, send a TCP RST (reset) to the
        sender. */
     LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_input: no PCB match found, resetting.\n"));
     if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
       TCP_STATS_INC(tcp.proterr);
       TCP_STATS_INC(tcp.drop);
-      tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(),
-        ip_current_src_addr(), tcphdr->dest, tcphdr->src);
+      tcp_rst(NULL, ackno, seqno + tcplen, ip_current_dest_addr(),
+              ip_current_src_addr(), tcphdr->dest, tcphdr->src);
     }
     pbuf_free(p);
   }
@@ -535,6 +599,8 @@
 static int
 tcp_input_delayed_close(struct tcp_pcb *pcb)
 {
+  LWIP_ASSERT("tcp_input_delayed_close: invalid pcb", pcb != NULL);
+
   if (recv_flags & TF_CLOSED) {
     /* The connection has been closed and we will deallocate the
         PCB. */
@@ -545,7 +611,7 @@
       TCP_EVENT_ERR(pcb->state, pcb->errf, pcb->callback_arg, ERR_CLSD);
     }
     tcp_pcb_remove(&tcp_active_pcbs, pcb);
-    memp_free(MEMP_TCP_PCB, pcb);
+    tcp_free(pcb);
     return 1;
   }
   return 0;
@@ -572,14 +638,16 @@
     return;
   }
 
+  LWIP_ASSERT("tcp_listen_input: invalid pcb", pcb != NULL);
+
   /* In the LISTEN state, we check for incoming SYN segments,
      creates a new PCB, and responds with a SYN|ACK. */
   if (flags & TCP_ACK) {
     /* 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(ackno, seqno + tcplen, ip_current_dest_addr(),
-      ip_current_src_addr(), tcphdr->dest, tcphdr->src);
+    tcp_rst((const struct tcp_pcb *)pcb, 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));
 #if TCP_LISTEN_BACKLOG
@@ -602,7 +670,7 @@
     }
 #if TCP_LISTEN_BACKLOG
     pcb->accepts_pending++;
-    npcb->flags |= TF_BACKLOGPEND;
+    tcp_set_flags(npcb, TF_BACKLOGPEND);
 #endif /* TCP_LISTEN_BACKLOG */
     /* Set up the new PCB. */
     ip_addr_copy(npcb->local_ip, *ip_current_dest_addr());
@@ -624,6 +692,7 @@
 #endif /* LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG */
     /* inherit socket options */
     npcb->so_options = pcb->so_options & SOF_INHERITED;
+    npcb->netif_idx = pcb->netif_idx;
     /* Register the new PCB so that we can begin receiving segments
        for it. */
     TCP_REG_ACTIVE(npcb);
@@ -639,6 +708,13 @@
 
     MIB2_STATS_INC(mib2.tcppassiveopens);
 
+#if LWIP_TCP_PCB_NUM_EXT_ARGS
+    if (tcp_ext_arg_invoke_callbacks_passive_open(pcb, npcb) != ERR_OK) {
+      tcp_abandon(npcb, 0);
+      return;
+    }
+#endif
+
     /* Send a SYN|ACK together with the MSS option. */
     rc = tcp_enqueue_flags(npcb, TCP_SYN | TCP_ACK);
     if (rc != ERR_OK) {
@@ -670,14 +746,17 @@
   if (flags & TCP_RST) {
     return;
   }
+
+  LWIP_ASSERT("tcp_timewait_input: invalid pcb", pcb != NULL);
+
   /* - fourth, check the SYN bit, */
   if (flags & TCP_SYN) {
     /* If an incoming segment is not acceptable, an acknowledgment
        should be sent in reply */
     if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd)) {
       /* If the SYN is in the window it is an error, send a reset */
-      tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(),
-        ip_current_src_addr(), tcphdr->dest, tcphdr->src);
+      tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
+              ip_current_src_addr(), tcphdr->dest, tcphdr->src);
       return;
     }
   } else if (flags & TCP_FIN) {
@@ -688,7 +767,7 @@
 
   if ((tcplen > 0)) {
     /* Acknowledge data, FIN or out-of-window SYN */
-    pcb->flags |= TF_ACK_NOW;
+    tcp_ack_now(pcb);
     tcp_output(pcb);
   }
   return;
@@ -714,6 +793,8 @@
 
   err = ERR_OK;
 
+  LWIP_ASSERT("tcp_process: invalid pcb", pcb != NULL);
+
   /* Process incoming RST segments. */
   if (flags & TCP_RST) {
     /* First, determine if the reset is acceptable. */
@@ -730,10 +811,10 @@
         acceptable = 1;
       } else  if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
                                   pcb->rcv_nxt + pcb->rcv_wnd)) {
-        /* If the sequence number is inside the window, we only send an ACK
+        /* If the sequence number is inside the window, we send a challenge ACK
            and wait for a re-send with matching sequence number.
-           This violates RFC 793, but is required to protection against
-           CVE-2004-0230 (RST spoofing attack). */
+           This follows RFC 5961 section 3.2 and addresses CVE-2004-0230
+           (RST spoofing attack), which is present in RFC 793 RST handling. */
         tcp_ack_now(pcb);
       }
     }
@@ -742,13 +823,13 @@
       LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: Connection RESET\n"));
       LWIP_ASSERT("tcp_input: pcb->state != CLOSED", pcb->state != CLOSED);
       recv_flags |= TF_RESET;
-      pcb->flags &= ~TF_ACK_DELAY;
+      tcp_clear_flags(pcb, TF_ACK_DELAY);
       return ERR_RST;
     } else {
       LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n",
-       seqno, pcb->rcv_nxt));
+                                    seqno, pcb->rcv_nxt));
       LWIP_DEBUGF(TCP_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n",
-       seqno, pcb->rcv_nxt));
+                              seqno, pcb->rcv_nxt));
       return ERR_OK;
     }
   }
@@ -764,198 +845,198 @@
     pcb->tmr = tcp_ticks;
   }
   pcb->keep_cnt_sent = 0;
+  pcb->persist_probe = 0;
 
   tcp_parseopt(pcb);
 
   /* Do different things depending on the TCP state. */
   switch (pcb->state) {
-  case SYN_SENT:
-    LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %"U32_F"\n", ackno,
-     pcb->snd_nxt, lwip_ntohl(pcb->unacked->tcphdr->seqno)));
-    /* received SYN ACK with expected sequence number? */
-    if ((flags & TCP_ACK) && (flags & TCP_SYN)
-        && (ackno == pcb->lastack + 1)) {
-      pcb->rcv_nxt = seqno + 1;
-      pcb->rcv_ann_right_edge = pcb->rcv_nxt;
-      pcb->lastack = ackno;
-      pcb->snd_wnd = tcphdr->wnd;
-      pcb->snd_wnd_max = pcb->snd_wnd;
-      pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
-      pcb->state = ESTABLISHED;
+    case SYN_SENT:
+      LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %"U32_F"\n", ackno,
+                                    pcb->snd_nxt, lwip_ntohl(pcb->unacked->tcphdr->seqno)));
+      /* received SYN ACK with expected sequence number? */
+      if ((flags & TCP_ACK) && (flags & TCP_SYN)
+          && (ackno == pcb->lastack + 1)) {
+        pcb->rcv_nxt = seqno + 1;
+        pcb->rcv_ann_right_edge = pcb->rcv_nxt;
+        pcb->lastack = ackno;
+        pcb->snd_wnd = tcphdr->wnd;
+        pcb->snd_wnd_max = pcb->snd_wnd;
+        pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
+        pcb->state = ESTABLISHED;
 
 #if TCP_CALCULATE_EFF_SEND_MSS
-      pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip);
+        pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip);
 #endif /* TCP_CALCULATE_EFF_SEND_MSS */
 
-      pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss);
-      LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_process (SENT): cwnd %"TCPWNDSIZE_F
-                                   " ssthresh %"TCPWNDSIZE_F"\n",
-                                   pcb->cwnd, pcb->ssthresh));
-      LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0));
-      --pcb->snd_queuelen;
-      LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %"TCPWNDSIZE_F"\n", (tcpwnd_size_t)pcb->snd_queuelen));
-      rseg = pcb->unacked;
-      if (rseg == NULL) {
-        /* might happen if tcp_output fails in tcp_rexmit_rto()
-           in which case the segment is on the unsent list */
-        rseg = pcb->unsent;
-        LWIP_ASSERT("no segment to free", rseg != NULL);
-        pcb->unsent = rseg->next;
-      } else {
-        pcb->unacked = rseg->next;
-      }
-      tcp_seg_free(rseg);
-
-      /* If there's nothing left to acknowledge, stop the retransmit
-         timer, otherwise reset it to start again */
-      if (pcb->unacked == NULL) {
-        pcb->rtime = -1;
-      } else {
-        pcb->rtime = 0;
-        pcb->nrtx = 0;
-      }
-
-      /* Call the user specified function to call when successfully
-       * connected. */
-      TCP_EVENT_CONNECTED(pcb, ERR_OK, err);
-      if (err == ERR_ABRT) {
-        return ERR_ABRT;
-      }
-      tcp_ack_now(pcb);
-    }
-    /* received ACK? possibly a half-open connection */
-    else if (flags & TCP_ACK) {
-      /* send a RST to bring the other side in a non-synchronized state. */
-      tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(),
-        ip_current_src_addr(), tcphdr->dest, tcphdr->src);
-      /* Resend SYN immediately (don't wait for rto timeout) to establish
-        connection faster, but do not send more SYNs than we otherwise would
-        have, or we might get caught in a loop on loopback interfaces. */
-      if (pcb->nrtx < TCP_SYNMAXRTX) {
-        pcb->rtime = 0;
-        tcp_rexmit_rto(pcb);
-      }
-    }
-    break;
-  case SYN_RCVD:
-    if (flags & TCP_ACK) {
-      /* expected ACK number? */
-      if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) {
-        pcb->state = ESTABLISHED;
-        LWIP_DEBUGF(TCP_DEBUG, ("TCP connection established %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
-#if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG
-#if LWIP_CALLBACK_API
-        LWIP_ASSERT("pcb->listener->accept != NULL",
-          (pcb->listener == NULL) || (pcb->listener->accept != NULL));
-#endif
-        if (pcb->listener == NULL) {
-          /* listen pcb might be closed by now */
-          err = ERR_VAL;
-        } else
-#endif /* LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG */
-        {
-          tcp_backlog_accepted(pcb);
-          /* Call the accept function. */
-          TCP_EVENT_ACCEPT(pcb->listener, pcb, pcb->callback_arg, ERR_OK, err);
-        }
-        if (err != ERR_OK) {
-          /* If the accept function returns with an error, we abort
-           * the connection. */
-          /* Already aborted? */
-          if (err != ERR_ABRT) {
-            tcp_abort(pcb);
-          }
-          return ERR_ABRT;
-        }
-        /* If there was any data contained within this ACK,
-         * we'd better pass it on to the application as well. */
-        tcp_receive(pcb);
-
-        /* Prevent ACK for SYN to generate a sent event */
-        if (recv_acked != 0) {
-          recv_acked--;
-        }
-
         pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss);
-        LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_process (SYN_RCVD): cwnd %"TCPWNDSIZE_F
+        LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_process (SENT): cwnd %"TCPWNDSIZE_F
                                      " ssthresh %"TCPWNDSIZE_F"\n",
                                      pcb->cwnd, pcb->ssthresh));
-
-        if (recv_flags & TF_GOT_FIN) {
-          tcp_ack_now(pcb);
-          pcb->state = CLOSE_WAIT;
+        LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0));
+        --pcb->snd_queuelen;
+        LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %"TCPWNDSIZE_F"\n", (tcpwnd_size_t)pcb->snd_queuelen));
+        rseg = pcb->unacked;
+        if (rseg == NULL) {
+          /* might happen if tcp_output fails in tcp_rexmit_rto()
+             in which case the segment is on the unsent list */
+          rseg = pcb->unsent;
+          LWIP_ASSERT("no segment to free", rseg != NULL);
+          pcb->unsent = rseg->next;
+        } else {
+          pcb->unacked = rseg->next;
         }
-      } else {
-        /* incorrect ACK number, send RST */
-        tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(),
-          ip_current_src_addr(), tcphdr->dest, tcphdr->src);
+        tcp_seg_free(rseg);
+
+        /* If there's nothing left to acknowledge, stop the retransmit
+           timer, otherwise reset it to start again */
+        if (pcb->unacked == NULL) {
+          pcb->rtime = -1;
+        } else {
+          pcb->rtime = 0;
+          pcb->nrtx = 0;
+        }
+
+        /* Call the user specified function to call when successfully
+         * connected. */
+        TCP_EVENT_CONNECTED(pcb, ERR_OK, err);
+        if (err == ERR_ABRT) {
+          return ERR_ABRT;
+        }
+        tcp_ack_now(pcb);
       }
-    } 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:
+      /* received ACK? possibly a half-open connection */
+      else if (flags & TCP_ACK) {
+        /* send a RST to bring the other side in a non-synchronized state. */
+        tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
+                ip_current_src_addr(), tcphdr->dest, tcphdr->src);
+        /* Resend SYN immediately (don't wait for rto timeout) to establish
+          connection faster, but do not send more SYNs than we otherwise would
+          have, or we might get caught in a loop on loopback interfaces. */
+        if (pcb->nrtx < TCP_SYNMAXRTX) {
+          pcb->rtime = 0;
+          tcp_rexmit_rto(pcb);
+        }
+      }
+      break;
+    case SYN_RCVD:
+      if (flags & TCP_ACK) {
+        /* expected ACK number? */
+        if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) {
+          pcb->state = ESTABLISHED;
+          LWIP_DEBUGF(TCP_DEBUG, ("TCP connection established %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
+#if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG
+          if (pcb->listener == NULL) {
+            /* listen pcb might be closed by now */
+            err = ERR_VAL;
+          } else
+#endif /* LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG */
+          {
+#if LWIP_CALLBACK_API
+            LWIP_ASSERT("pcb->listener->accept != NULL", pcb->listener->accept != NULL);
+#endif
+            tcp_backlog_accepted(pcb);
+            /* Call the accept function. */
+            TCP_EVENT_ACCEPT(pcb->listener, pcb, pcb->callback_arg, ERR_OK, err);
+          }
+          if (err != ERR_OK) {
+            /* If the accept function returns with an error, we abort
+             * the connection. */
+            /* Already aborted? */
+            if (err != ERR_ABRT) {
+              tcp_abort(pcb);
+            }
+            return ERR_ABRT;
+          }
+          /* If there was any data contained within this ACK,
+           * we'd better pass it on to the application as well. */
+          tcp_receive(pcb);
+
+          /* Prevent ACK for SYN to generate a sent event */
+          if (recv_acked != 0) {
+            recv_acked--;
+          }
+
+          pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss);
+          LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_process (SYN_RCVD): cwnd %"TCPWNDSIZE_F
+                                       " ssthresh %"TCPWNDSIZE_F"\n",
+                                       pcb->cwnd, pcb->ssthresh));
+
+          if (recv_flags & TF_GOT_FIN) {
+            tcp_ack_now(pcb);
+            pcb->state = CLOSE_WAIT;
+          }
+        } else {
+          /* incorrect ACK number, send RST */
+          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:
     /* FALLTHROUGH */
-  case ESTABLISHED:
-    tcp_receive(pcb);
-    if (recv_flags & TF_GOT_FIN) { /* passive close */
-      tcp_ack_now(pcb);
-      pcb->state = CLOSE_WAIT;
-    }
-    break;
-  case FIN_WAIT_1:
-    tcp_receive(pcb);
-    if (recv_flags & TF_GOT_FIN) {
-      if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) &&
-          pcb->unsent == NULL) {
-        LWIP_DEBUGF(TCP_DEBUG,
-          ("TCP connection closed: FIN_WAIT_1 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
+    case ESTABLISHED:
+      tcp_receive(pcb);
+      if (recv_flags & TF_GOT_FIN) { /* passive close */
+        tcp_ack_now(pcb);
+        pcb->state = CLOSE_WAIT;
+      }
+      break;
+    case FIN_WAIT_1:
+      tcp_receive(pcb);
+      if (recv_flags & TF_GOT_FIN) {
+        if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) &&
+            pcb->unsent == NULL) {
+          LWIP_DEBUGF(TCP_DEBUG,
+                      ("TCP connection closed: FIN_WAIT_1 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
+          tcp_ack_now(pcb);
+          tcp_pcb_purge(pcb);
+          TCP_RMV_ACTIVE(pcb);
+          pcb->state = TIME_WAIT;
+          TCP_REG(&tcp_tw_pcbs, pcb);
+        } else {
+          tcp_ack_now(pcb);
+          pcb->state = CLOSING;
+        }
+      } else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) &&
+                 pcb->unsent == NULL) {
+        pcb->state = FIN_WAIT_2;
+      }
+      break;
+    case FIN_WAIT_2:
+      tcp_receive(pcb);
+      if (recv_flags & TF_GOT_FIN) {
+        LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: FIN_WAIT_2 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
         tcp_ack_now(pcb);
         tcp_pcb_purge(pcb);
         TCP_RMV_ACTIVE(pcb);
         pcb->state = TIME_WAIT;
         TCP_REG(&tcp_tw_pcbs, pcb);
-      } else {
-        tcp_ack_now(pcb);
-        pcb->state = CLOSING;
       }
-    } else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) &&
-               pcb->unsent == NULL) {
-      pcb->state = FIN_WAIT_2;
-    }
-    break;
-  case FIN_WAIT_2:
-    tcp_receive(pcb);
-    if (recv_flags & TF_GOT_FIN) {
-      LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: FIN_WAIT_2 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
-      tcp_ack_now(pcb);
-      tcp_pcb_purge(pcb);
-      TCP_RMV_ACTIVE(pcb);
-      pcb->state = TIME_WAIT;
-      TCP_REG(&tcp_tw_pcbs, pcb);
-    }
-    break;
-  case CLOSING:
-    tcp_receive(pcb);
-    if ((flags & TCP_ACK) && ackno == pcb->snd_nxt && pcb->unsent == NULL) {
-      LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: CLOSING %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
-      tcp_pcb_purge(pcb);
-      TCP_RMV_ACTIVE(pcb);
-      pcb->state = TIME_WAIT;
-      TCP_REG(&tcp_tw_pcbs, pcb);
-    }
-    break;
-  case LAST_ACK:
-    tcp_receive(pcb);
-    if ((flags & TCP_ACK) && ackno == pcb->snd_nxt && pcb->unsent == NULL) {
-      LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: LAST_ACK %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
-      /* bugfix #21699: don't set pcb->state to CLOSED here or we risk leaking segments */
-      recv_flags |= TF_CLOSED;
-    }
-    break;
-  default:
-    break;
+      break;
+    case CLOSING:
+      tcp_receive(pcb);
+      if ((flags & TCP_ACK) && ackno == pcb->snd_nxt && pcb->unsent == NULL) {
+        LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: CLOSING %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
+        tcp_pcb_purge(pcb);
+        TCP_RMV_ACTIVE(pcb);
+        pcb->state = TIME_WAIT;
+        TCP_REG(&tcp_tw_pcbs, pcb);
+      }
+      break;
+    case LAST_ACK:
+      tcp_receive(pcb);
+      if ((flags & TCP_ACK) && ackno == pcb->snd_nxt && pcb->unsent == NULL) {
+        LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: LAST_ACK %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
+        /* bugfix #21699: don't set pcb->state to CLOSED here or we risk leaking segments */
+        recv_flags |= TF_CLOSED;
+      }
+      break;
+    default:
+      break;
   }
   return ERR_OK;
 }
@@ -971,6 +1052,8 @@
 {
   struct tcp_seg *old_seg;
 
+  LWIP_ASSERT("tcp_oos_insert_segment: invalid cseg", cseg != NULL);
+
   if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) {
     /* received segment overlaps all following segments */
     tcp_segs_free(next);
@@ -980,7 +1063,7 @@
        oos queue may have segments with FIN flag */
     while (next &&
            TCP_SEQ_GEQ((seqno + cseg->len),
-                      (next->tcphdr->seqno + next->len))) {
+                       (next->tcphdr->seqno + next->len))) {
       /* cseg with FIN already processed */
       if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) {
         TCPH_SET_FLAG(cseg->tcphdr, TCP_FIN);
@@ -1000,6 +1083,48 @@
 }
 #endif /* TCP_QUEUE_OOSEQ */
 
+/** Remove segments from a list if the incoming ACK acknowledges them */
+static struct tcp_seg *
+tcp_free_acked_segments(struct tcp_pcb *pcb, struct tcp_seg *seg_list, const char *dbg_list_name,
+                        struct tcp_seg *dbg_other_seg_list)
+{
+  struct tcp_seg *next;
+  u16_t clen;
+
+  LWIP_UNUSED_ARG(dbg_list_name);
+  LWIP_UNUSED_ARG(dbg_other_seg_list);
+
+  while (seg_list != NULL &&
+         TCP_SEQ_LEQ(lwip_ntohl(seg_list->tcphdr->seqno) +
+                     TCP_TCPLEN(seg_list), ackno)) {
+    LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->%s\n",
+                                  lwip_ntohl(seg_list->tcphdr->seqno),
+                                  lwip_ntohl(seg_list->tcphdr->seqno) + TCP_TCPLEN(seg_list),
+                                  dbg_list_name));
+
+    next = seg_list;
+    seg_list = seg_list->next;
+
+    clen = pbuf_clen(next->p);
+    LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"TCPWNDSIZE_F" ... ",
+                                 (tcpwnd_size_t)pcb->snd_queuelen));
+    LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= clen));
+
+    pcb->snd_queuelen = (u16_t)(pcb->snd_queuelen - clen);
+    recv_acked = (tcpwnd_size_t)(recv_acked + next->len);
+    tcp_seg_free(next);
+
+    LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"TCPWNDSIZE_F" (after freeing %s)\n",
+                                 (tcpwnd_size_t)pcb->snd_queuelen,
+                                 dbg_list_name));
+    if (pcb->snd_queuelen != 0) {
+      LWIP_ASSERT("tcp_receive: valid queue length",
+                  seg_list != NULL || dbg_other_seg_list != NULL);
+    }
+  }
+  return seg_list;
+}
+
 /**
  * Called by tcp_process. Checks if the given segment is an ACK for outstanding
  * data, and if so frees the memory of the buffered data. Next, it places the
@@ -1015,20 +1140,11 @@
 static void
 tcp_receive(struct tcp_pcb *pcb)
 {
-  struct tcp_seg *next;
-#if TCP_QUEUE_OOSEQ
-  struct tcp_seg *prev, *cseg;
-#endif /* TCP_QUEUE_OOSEQ */
-  s32_t off;
   s16_t m;
   u32_t right_wnd_edge;
-  u16_t new_tot_len;
   int found_dupack = 0;
-#if TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS
-  u32_t ooseq_blen;
-  u16_t ooseq_qlen;
-#endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */
 
+  LWIP_ASSERT("tcp_receive: invalid pcb", pcb != NULL);
   LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED);
 
   if (flags & TCP_ACK) {
@@ -1036,8 +1152,8 @@
 
     /* Update window. */
     if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
-       (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
-       (pcb->snd_wl2 == ackno && (u32_t)SND_WND_SCALE(pcb, tcphdr->wnd) > pcb->snd_wnd)) {
+        (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
+        (pcb->snd_wl2 == ackno && (u32_t)SND_WND_SCALE(pcb, tcphdr->wnd) > pcb->snd_wnd)) {
       pcb->snd_wnd = SND_WND_SCALE(pcb, tcphdr->wnd);
       /* keep track of the biggest window announced by the remote host to calculate
          the maximum segment size */
@@ -1046,16 +1162,6 @@
       }
       pcb->snd_wl1 = seqno;
       pcb->snd_wl2 = ackno;
-      if (pcb->snd_wnd == 0) {
-        if (pcb->persist_backoff == 0) {
-          /* start persist timer */
-          pcb->persist_cnt = 0;
-          pcb->persist_backoff = 1;
-        }
-      } else if (pcb->persist_backoff > 0) {
-        /* stop persist timer */
-          pcb->persist_backoff = 0;
-      }
       LWIP_DEBUGF(TCP_WND_DEBUG, ("tcp_receive: window update %"TCPWNDSIZE_F"\n", pcb->snd_wnd));
 #if TCP_WND_DEBUG
     } else {
@@ -1103,13 +1209,11 @@
                 ++pcb->dupacks;
               }
               if (pcb->dupacks > 3) {
-                /* Inflate the congestion window, but not if it means that
-                   the value overflows. */
-                if ((tcpwnd_size_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
-                  pcb->cwnd += pcb->mss;
-                }
-              } else if (pcb->dupacks == 3) {
-                /* Do fast retransmit */
+                /* Inflate the congestion window */
+                TCP_WND_INC(pcb->cwnd, pcb->mss);
+              }
+              if (pcb->dupacks >= 3) {
+                /* Do fast retransmit (checked via TF_INFR, not via dupacks count) */
                 tcp_rexmit_fast(pcb);
               }
             }
@@ -1121,22 +1225,27 @@
       if (!found_dupack) {
         pcb->dupacks = 0;
       }
-    } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) {
+    } 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;
 
       /* Reset the "IN Fast Retransmit" flag, since we are no longer
          in fast retransmit. Also reset the congestion window to the
          slow start threshold. */
       if (pcb->flags & TF_INFR) {
-        pcb->flags &= ~TF_INFR;
+        tcp_clear_flags(pcb, TF_INFR);
         pcb->cwnd = pcb->ssthresh;
+        pcb->bytes_acked = 0;
       }
 
       /* Reset the number of retransmissions. */
       pcb->nrtx = 0;
 
       /* Reset the retransmission time-out. */
-      pcb->rto = (pcb->sa >> 3) + pcb->sv;
+      pcb->rto = (s16_t)((pcb->sa >> 3) + pcb->sv);
+
+      /* Record how much data this ACK acks */
+      acked = (tcpwnd_size_t)(ackno - pcb->lastack);
 
       /* Reset the fast retransmit variables. */
       pcb->dupacks = 0;
@@ -1146,51 +1255,40 @@
          ssthresh). */
       if (pcb->state >= ESTABLISHED) {
         if (pcb->cwnd < pcb->ssthresh) {
-          if ((tcpwnd_size_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
-            pcb->cwnd += pcb->mss;
-          }
+          tcpwnd_size_t increase;
+          /* limit to 1 SMSS segment during period following RTO */
+          u8_t num_seg = (pcb->flags & TF_RTO) ? 1 : 2;
+          /* RFC 3465, section 2.2 Slow Start */
+          increase = LWIP_MIN(acked, (tcpwnd_size_t)(num_seg * pcb->mss));
+          TCP_WND_INC(pcb->cwnd, increase);
           LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: slow start cwnd %"TCPWNDSIZE_F"\n", pcb->cwnd));
         } else {
-          tcpwnd_size_t new_cwnd = (pcb->cwnd + pcb->mss * pcb->mss / pcb->cwnd);
-          if (new_cwnd > pcb->cwnd) {
-            pcb->cwnd = new_cwnd;
+          /* RFC 3465, section 2.1 Congestion Avoidance */
+          TCP_WND_INC(pcb->bytes_acked, acked);
+          if (pcb->bytes_acked >= pcb->cwnd) {
+            pcb->bytes_acked = (tcpwnd_size_t)(pcb->bytes_acked - pcb->cwnd);
+            TCP_WND_INC(pcb->cwnd, pcb->mss);
           }
           LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: congestion avoidance cwnd %"TCPWNDSIZE_F"\n", pcb->cwnd));
         }
       }
       LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: ACK for %"U32_F", unacked->seqno %"U32_F":%"U32_F"\n",
                                     ackno,
-                                    pcb->unacked != NULL?
-                                    lwip_ntohl(pcb->unacked->tcphdr->seqno): 0,
-                                    pcb->unacked != NULL?
-                                    lwip_ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));
+                                    pcb->unacked != NULL ?
+                                    lwip_ntohl(pcb->unacked->tcphdr->seqno) : 0,
+                                    pcb->unacked != NULL ?
+                                    lwip_ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked) : 0));
 
       /* Remove segment from the unacknowledged list if the incoming
          ACK acknowledges them. */
-      while (pcb->unacked != NULL &&
-             TCP_SEQ_LEQ(lwip_ntohl(pcb->unacked->tcphdr->seqno) +
-                         TCP_TCPLEN(pcb->unacked), ackno)) {
-        LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unacked\n",
-                                      lwip_ntohl(pcb->unacked->tcphdr->seqno),
-                                      lwip_ntohl(pcb->unacked->tcphdr->seqno) +
-                                      TCP_TCPLEN(pcb->unacked)));
-
-        next = pcb->unacked;
-        pcb->unacked = pcb->unacked->next;
-
-        LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"TCPWNDSIZE_F" ... ", (tcpwnd_size_t)pcb->snd_queuelen));
-        LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p)));
-
-        pcb->snd_queuelen -= pbuf_clen(next->p);
-        recv_acked += next->len;
-        tcp_seg_free(next);
-
-        LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"TCPWNDSIZE_F" (after freeing unacked)\n", (tcpwnd_size_t)pcb->snd_queuelen));
-        if (pcb->snd_queuelen != 0) {
-          LWIP_ASSERT("tcp_receive: valid queue length", pcb->unacked != NULL ||
-                      pcb->unsent != NULL);
-        }
-      }
+      pcb->unacked = tcp_free_acked_segments(pcb, pcb->unacked, "unacked", pcb->unsent);
+      /* We go through the ->unsent list to see if any of the segments
+         on the list are acknowledged by the ACK. This may seem
+         strange since an "unsent" segment shouldn't be acked. The
+         rationale is that lwIP puts all outstanding segments on the
+         ->unsent list after a retransmission, so these segments may
+         in fact have been sent once. */
+      pcb->unsent = tcp_free_acked_segments(pcb, pcb->unsent, "unsent", pcb->unacked);
 
       /* If there's nothing left to acknowledge, stop the retransmit
          timer, otherwise reset it to start again */
@@ -1202,52 +1300,41 @@
 
       pcb->polltmr = 0;
 
+#if TCP_OVERSIZE
+      if (pcb->unsent == NULL) {
+        pcb->unsent_oversize = 0;
+      }
+#endif /* TCP_OVERSIZE */
+
 #if LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS
       if (ip_current_is_v6()) {
         /* Inform neighbor reachability of forward progress. */
         nd6_reachability_hint(ip6_current_src_addr());
       }
 #endif /* LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS*/
+
+      pcb->snd_buf = (tcpwnd_size_t)(pcb->snd_buf + recv_acked);
+      /* check if this ACK ends our retransmission of in-flight data */
+      if (pcb->flags & TF_RTO) {
+        /* RTO is done if
+            1) both queues are empty or
+            2) unacked is empty and unsent head contains data not part of RTO or
+            3) unacked head contains data not part of RTO */
+        if (pcb->unacked == NULL) {
+          if ((pcb->unsent == NULL) ||
+              (TCP_SEQ_LEQ(pcb->rto_end, lwip_ntohl(pcb->unsent->tcphdr->seqno)))) {
+            tcp_clear_flags(pcb, TF_RTO);
+          }
+        } else if (TCP_SEQ_LEQ(pcb->rto_end, lwip_ntohl(pcb->unacked->tcphdr->seqno))) {
+          tcp_clear_flags(pcb, TF_RTO);
+        }
+      }
+      /* End of ACK for new data processing. */
     } else {
       /* Out of sequence ACK, didn't really ack anything */
       tcp_send_empty_ack(pcb);
     }
 
-    /* We go through the ->unsent list to see if any of the segments
-       on the list are acknowledged by the ACK. This may seem
-       strange since an "unsent" segment shouldn't be acked. The
-       rationale is that lwIP puts all outstanding segments on the
-       ->unsent list after a retransmission, so these segments may
-       in fact have been sent once. */
-    while (pcb->unsent != NULL &&
-           TCP_SEQ_BETWEEN(ackno, lwip_ntohl(pcb->unsent->tcphdr->seqno) +
-                           TCP_TCPLEN(pcb->unsent), pcb->snd_nxt)) {
-      LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unsent\n",
-                                    lwip_ntohl(pcb->unsent->tcphdr->seqno), lwip_ntohl(pcb->unsent->tcphdr->seqno) +
-                                    TCP_TCPLEN(pcb->unsent)));
-
-      next = pcb->unsent;
-      pcb->unsent = pcb->unsent->next;
-#if TCP_OVERSIZE
-      if (pcb->unsent == NULL) {
-        pcb->unsent_oversize = 0;
-      }
-#endif /* TCP_OVERSIZE */
-      LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"TCPWNDSIZE_F" ... ", (tcpwnd_size_t)pcb->snd_queuelen));
-      LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p)));
-      /* Prevent ACK for FIN to generate a sent event */
-      pcb->snd_queuelen -= pbuf_clen(next->p);
-      recv_acked += next->len;
-      tcp_seg_free(next);
-      LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"TCPWNDSIZE_F" (after freeing unsent)\n", (tcpwnd_size_t)pcb->snd_queuelen));
-      if (pcb->snd_queuelen != 0) {
-        LWIP_ASSERT("tcp_receive: valid queue length",
-          pcb->unacked != NULL || pcb->unsent != NULL);
-      }
-    }
-    pcb->snd_buf += recv_acked;
-    /* End of ACK for new data processing. */
-
     LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: pcb->rttest %"U32_F" rtseq %"U32_F" ackno %"U32_F"\n",
                                 pcb->rttest, pcb->rtseq, ackno));
 
@@ -1263,14 +1350,14 @@
                                   m, (u16_t)(m * TCP_SLOW_INTERVAL)));
 
       /* This is taken directly from VJs original code in his paper */
-      m = m - (pcb->sa >> 3);
-      pcb->sa += m;
+      m = (s16_t)(m - (pcb->sa >> 3));
+      pcb->sa = (s16_t)(pcb->sa + m);
       if (m < 0) {
-        m = -m;
+        m = (s16_t) - m;
       }
-      m = m - (pcb->sv >> 2);
-      pcb->sv += m;
-      pcb->rto = (pcb->sa >> 3) + pcb->sv;
+      m = (s16_t)(m - (pcb->sv >> 2));
+      pcb->sv = (s16_t)(pcb->sv + m);
+      pcb->rto = (s16_t)((pcb->sa >> 3) + pcb->sv);
 
       LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: RTO %"U16_F" (%"U16_F" milliseconds)\n",
                                   pcb->rto, (u16_t)(pcb->rto * TCP_SLOW_INTERVAL)));
@@ -1336,35 +1423,25 @@
          length.*/
 
       struct pbuf *p = inseg.p;
-      off = pcb->rcv_nxt - seqno;
+      u32_t off32 = pcb->rcv_nxt - seqno;
+      u16_t new_tot_len, off;
       LWIP_ASSERT("inseg.p != NULL", inseg.p);
-      LWIP_ASSERT("insane offset!", (off < 0x7fff));
-      if (inseg.p->len < off) {
-        LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off));
-        new_tot_len = (u16_t)(inseg.p->tot_len - off);
-        while (p->len < off) {
-          off -= p->len;
-          /* KJM following line changed (with addition of new_tot_len var)
-             to fix bug #9076
-             inseg.p->tot_len -= p->len; */
-          p->tot_len = new_tot_len;
-          p->len = 0;
-          p = p->next;
-        }
-        if (pbuf_header(p, (s16_t)-off)) {
-          /* Do we need to cope with this failing?  Assert for now */
-          LWIP_ASSERT("pbuf_header failed", 0);
-        }
-      } else {
-        if (pbuf_header(inseg.p, (s16_t)-off)) {
-          /* Do we need to cope with this failing?  Assert for now */
-          LWIP_ASSERT("pbuf_header failed", 0);
-        }
+      LWIP_ASSERT("insane offset!", (off32 < 0xffff));
+      off = (u16_t)off32;
+      LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off));
+      inseg.len -= off;
+      new_tot_len = (u16_t)(inseg.p->tot_len - off);
+      while (p->len < off) {
+        off -= p->len;
+        /* all pbufs up to and including this one have len==0, so tot_len is equal */
+        p->tot_len = new_tot_len;
+        p->len = 0;
+        p = p->next;
       }
-      inseg.len -= (u16_t)(pcb->rcv_nxt - seqno);
+      /* cannot fail... */
+      pbuf_remove_header(p, off);
       inseg.tcphdr->seqno = seqno = pcb->rcv_nxt;
-    }
-    else {
+    } else {
       if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)) {
         /* the whole segment is < rcv_nxt */
         /* must be a duplicate of a packet that has already been correctly handled */
@@ -1423,21 +1500,22 @@
               tcp_seg_free(old_ooseq);
             }
           } else {
-            next = pcb->ooseq;
+            struct tcp_seg *next = pcb->ooseq;
             /* Remove all segments on ooseq that are covered by inseg already.
              * FIN is copied from ooseq to inseg if present. */
             while (next &&
                    TCP_SEQ_GEQ(seqno + tcplen,
                                next->tcphdr->seqno + next->len)) {
+              struct tcp_seg *tmp;
               /* inseg cannot have FIN here (already processed above) */
               if ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0 &&
                   (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) == 0) {
                 TCPH_SET_FLAG(inseg.tcphdr, TCP_FIN);
                 tcplen = TCP_TCPLEN(&inseg);
               }
-              prev = next;
+              tmp = next;
               next = next->next;
-              tcp_seg_free(prev);
+              tcp_seg_free(tmp);
             }
             /* Now trim right side of inseg if it overlaps with the first
              * segment on ooseq */
@@ -1494,7 +1572,7 @@
         while (pcb->ooseq != NULL &&
                pcb->ooseq->tcphdr->seqno == pcb->rcv_nxt) {
 
-          cseg = pcb->ooseq;
+          struct tcp_seg *cseg = pcb->ooseq;
           seqno = pcb->ooseq->tcphdr->seqno;
 
           pcb->rcv_nxt += TCP_TCPLEN(cseg);
@@ -1528,12 +1606,34 @@
           pcb->ooseq = cseg->next;
           tcp_seg_free(cseg);
         }
+#if LWIP_TCP_SACK_OUT
+        if (pcb->flags & TF_SACK) {
+          if (pcb->ooseq != NULL) {
+            /* Some segments may have been removed from ooseq, let's remove all SACKs that
+               describe anything before the new beginning of that list. */
+            tcp_remove_sacks_lt(pcb, pcb->ooseq->tcphdr->seqno);
+          } else if (LWIP_TCP_SACK_VALID(pcb, 0)) {
+            /* ooseq has been cleared. Nothing to SACK */
+            memset(pcb->rcv_sacks, 0, sizeof(pcb->rcv_sacks));
+          }
+        }
+#endif /* LWIP_TCP_SACK_OUT */
 #endif /* TCP_QUEUE_OOSEQ */
 
 
         /* Acknowledge the segment(s). */
         tcp_ack(pcb);
 
+#if LWIP_TCP_SACK_OUT
+        if (LWIP_TCP_SACK_VALID(pcb, 0)) {
+          /* Normally the ACK for the data received could be piggy-backed on a data packet,
+             but lwIP currently does not support including SACKs in data packets. So we force
+             it to respond with an empty ACK packet (only if there is at least one SACK to be sent).
+             NOTE: tcp_send_empty_ack() on success clears the ACK flags (set by tcp_ack()) */
+          tcp_send_empty_ack(pcb);
+        }
+#endif /* LWIP_TCP_SACK_OUT */
+
 #if LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS
         if (ip_current_is_v6()) {
           /* Inform neighbor reachability of forward progress. */
@@ -1543,11 +1643,18 @@
 
       } else {
         /* We get here if the incoming segment is out-of-sequence. */
-        tcp_send_empty_ack(pcb);
+
 #if TCP_QUEUE_OOSEQ
         /* We queue the segment on the ->ooseq queue. */
         if (pcb->ooseq == NULL) {
           pcb->ooseq = tcp_seg_copy(&inseg);
+#if LWIP_TCP_SACK_OUT
+          if (pcb->flags & TF_SACK) {
+            /* All the SACKs should be invalid, so we can simply store the most recent one: */
+            pcb->rcv_sacks[0].left = seqno;
+            pcb->rcv_sacks[0].right = seqno + inseg.len;
+          }
+#endif /* LWIP_TCP_SACK_OUT */
         } else {
           /* If the queue is not empty, we walk through the queue and
              try to find a place where the sequence number of the
@@ -1561,7 +1668,12 @@
              segment on the ->ooseq queue, we discard the segment that
              contains less data. */
 
-          prev = NULL;
+#if LWIP_TCP_SACK_OUT
+          /* This is the left edge of the lowest possible SACK range.
+             It may start before the newly received segment (possibly adjusted below). */
+          u32_t sackbeg = TCP_SEQ_LT(seqno, pcb->ooseq->tcphdr->seqno) ? seqno : pcb->ooseq->tcphdr->seqno;
+#endif /* LWIP_TCP_SACK_OUT */
+          struct tcp_seg *next, *prev = NULL;
           for (next = pcb->ooseq; next != NULL; next = next->next) {
             if (seqno == next->tcphdr->seqno) {
               /* The sequence number of the incoming segment is the
@@ -1572,7 +1684,7 @@
                 /* The incoming segment is larger than the old
                    segment. We replace some segments with the new
                    one. */
-                cseg = tcp_seg_copy(&inseg);
+                struct tcp_seg *cseg = tcp_seg_copy(&inseg);
                 if (cseg != NULL) {
                   if (prev != NULL) {
                     prev->next = cseg;
@@ -1595,7 +1707,7 @@
                      than the sequence number of the first segment on the
                      queue. We put the incoming segment first on the
                      queue. */
-                  cseg = tcp_seg_copy(&inseg);
+                  struct tcp_seg *cseg = tcp_seg_copy(&inseg);
                   if (cseg != NULL) {
                     pcb->ooseq = cseg;
                     tcp_oos_insert_segment(cseg, next);
@@ -1605,13 +1717,13 @@
               } else {
                 /*if (TCP_SEQ_LT(prev->tcphdr->seqno, seqno) &&
                   TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {*/
-                if (TCP_SEQ_BETWEEN(seqno, prev->tcphdr->seqno+1, next->tcphdr->seqno-1)) {
+                if (TCP_SEQ_BETWEEN(seqno, prev->tcphdr->seqno + 1, next->tcphdr->seqno - 1)) {
                   /* The sequence number of the incoming segment is in
                      between the sequence numbers of the previous and
                      the next segment on ->ooseq. We trim trim the previous
                      segment, delete next segments that included in received segment
                      and trim received, if needed. */
-                  cseg = tcp_seg_copy(&inseg);
+                  struct tcp_seg *cseg = tcp_seg_copy(&inseg);
                   if (cseg != NULL) {
                     if (TCP_SEQ_GT(prev->tcphdr->seqno + prev->len, seqno)) {
                       /* We need to trim the prev segment. */
@@ -1624,6 +1736,20 @@
                   break;
                 }
               }
+
+#if LWIP_TCP_SACK_OUT
+              /* The new segment goes after the 'next' one. If there is a "hole" in sequence numbers
+                 between 'prev' and the beginning of 'next', we want to move sackbeg. */
+              if (prev != NULL && prev->tcphdr->seqno + prev->len != next->tcphdr->seqno) {
+                sackbeg = next->tcphdr->seqno;
+              }
+#endif /* LWIP_TCP_SACK_OUT */
+
+              /* We don't use 'prev' below, so let's set it to current 'next'.
+                 This way even if we break the loop below, 'prev' will be pointing
+                 at the segment right in front of the newly added one. */
+              prev = next;
+
               /* If the "next" segment is the last segment on the
                  ooseq queue, we add the incoming segment to the end
                  of the list. */
@@ -1662,35 +1788,88 @@
                 break;
               }
             }
-            prev = next;
+          }
+
+#if LWIP_TCP_SACK_OUT
+          if (pcb->flags & TF_SACK) {
+            if (prev == NULL) {
+              /* The new segment is at the beginning. sackbeg should already be set properly.
+                 We need to find the right edge. */
+              next = pcb->ooseq;
+            } else if (prev->next != NULL) {
+              /* The new segment was added after 'prev'. If there is a "hole" between 'prev' and 'prev->next',
+                 we need to move sackbeg. After that we should find the right edge. */
+              next = prev->next;
+              if (prev->tcphdr->seqno + prev->len != next->tcphdr->seqno) {
+                sackbeg = next->tcphdr->seqno;
+              }
+            } else {
+              next = NULL;
+            }
+            if (next != NULL) {
+              u32_t sackend = next->tcphdr->seqno;
+              for ( ; (next != NULL) && (sackend == next->tcphdr->seqno); next = next->next) {
+                sackend += next->len;
+              }
+              tcp_add_sack(pcb, sackbeg, sackend);
+            }
+          }
+#endif /* LWIP_TCP_SACK_OUT */
+        }
+#if defined(TCP_OOSEQ_BYTES_LIMIT) || defined(TCP_OOSEQ_PBUFS_LIMIT)
+        {
+          /* Check that the data on ooseq doesn't exceed one of the limits
+             and throw away everything above that limit. */
+#ifdef TCP_OOSEQ_BYTES_LIMIT
+          const u32_t ooseq_max_blen = TCP_OOSEQ_BYTES_LIMIT(pcb);
+          u32_t ooseq_blen = 0;
+#endif
+#ifdef TCP_OOSEQ_PBUFS_LIMIT
+          const u16_t ooseq_max_qlen = TCP_OOSEQ_PBUFS_LIMIT(pcb);
+          u16_t ooseq_qlen = 0;
+#endif
+          struct tcp_seg *next, *prev = NULL;
+          for (next = pcb->ooseq; next != NULL; prev = next, next = next->next) {
+            struct pbuf *p = next->p;
+            int stop_here = 0;
+#ifdef TCP_OOSEQ_BYTES_LIMIT
+            ooseq_blen += p->tot_len;
+            if (ooseq_blen > ooseq_max_blen) {
+              stop_here = 1;
+            }
+#endif
+#ifdef TCP_OOSEQ_PBUFS_LIMIT
+            ooseq_qlen += pbuf_clen(p);
+            if (ooseq_qlen > ooseq_max_qlen) {
+              stop_here = 1;
+            }
+#endif
+            if (stop_here) {
+#if LWIP_TCP_SACK_OUT
+              if (pcb->flags & TF_SACK) {
+                /* Let's remove all SACKs from next's seqno up. */
+                tcp_remove_sacks_gt(pcb, next->tcphdr->seqno);
+              }
+#endif /* LWIP_TCP_SACK_OUT */
+              /* too much ooseq data, dump this and everything after it */
+              tcp_segs_free(next);
+              if (prev == NULL) {
+                /* first ooseq segment is too much, dump the whole queue */
+                pcb->ooseq = NULL;
+              } else {
+                /* just dump 'next' and everything after it */
+                prev->next = NULL;
+              }
+              break;
+            }
           }
         }
-#if TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS
-        /* Check that the data on ooseq doesn't exceed one of the limits
-           and throw away everything above that limit. */
-        ooseq_blen = 0;
-        ooseq_qlen = 0;
-        prev = NULL;
-        for (next = pcb->ooseq; next != NULL; prev = next, next = next->next) {
-          struct pbuf *p = next->p;
-          ooseq_blen += p->tot_len;
-          ooseq_qlen += pbuf_clen(p);
-          if ((ooseq_blen > TCP_OOSEQ_MAX_BYTES) ||
-              (ooseq_qlen > TCP_OOSEQ_MAX_PBUFS)) {
-             /* too much ooseq data, dump this and everything after it */
-             tcp_segs_free(next);
-             if (prev == NULL) {
-               /* first ooseq segment is too much, dump the whole queue */
-               pcb->ooseq = NULL;
-             } else {
-               /* just dump 'next' and everything after it */
-               prev->next = NULL;
-             }
-             break;
-          }
-        }
-#endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */
+#endif /* TCP_OOSEQ_BYTES_LIMIT || TCP_OOSEQ_PBUFS_LIMIT */
 #endif /* TCP_QUEUE_OOSEQ */
+
+        /* We send the ACK packet after we've (potentially) dealt with SACKs,
+           so they can be included in the acknowledgment. */
+        tcp_send_empty_ack(pcb);
       }
     } else {
       /* The incoming segment is not within the window. */
@@ -1706,13 +1885,14 @@
 }
 
 static u8_t
-tcp_getoptbyte(void)
+tcp_get_next_optbyte(void)
 {
-  if ((tcphdr_opt2 == NULL) || (tcp_optidx < tcphdr_opt1len)) {
-    u8_t* opts = (u8_t *)tcphdr + TCP_HLEN;
-    return opts[tcp_optidx++];
+  u16_t optidx = tcp_optidx++;
+  if ((tcphdr_opt2 == NULL) || (optidx < tcphdr_opt1len)) {
+    u8_t *opts = (u8_t *)tcphdr + TCP_HLEN;
+    return opts[optidx];
   } else {
-    u8_t idx = (u8_t)(tcp_optidx++ - tcphdr_opt1len);
+    u8_t idx = (u8_t)(optidx - tcphdr_opt1len);
     return tcphdr_opt2[idx];
   }
 }
@@ -1734,95 +1914,112 @@
   u32_t tsval;
 #endif
 
+  LWIP_ASSERT("tcp_parseopt: invalid pcb", pcb != NULL);
+
   /* Parse the TCP MSS option, if present. */
   if (tcphdr_optlen != 0) {
     for (tcp_optidx = 0; tcp_optidx < tcphdr_optlen; ) {
-      u8_t opt = tcp_getoptbyte();
+      u8_t opt = tcp_get_next_optbyte();
       switch (opt) {
-      case LWIP_TCP_OPT_EOL:
-        /* End of options. */
-        LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: EOL\n"));
-        return;
-      case LWIP_TCP_OPT_NOP:
-        /* NOP option. */
-        LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: NOP\n"));
-        break;
-      case LWIP_TCP_OPT_MSS:
-        LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: MSS\n"));
-        if (tcp_getoptbyte() != LWIP_TCP_OPT_LEN_MSS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_MSS) > tcphdr_optlen) {
-          /* Bad length */
-          LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n"));
+        case LWIP_TCP_OPT_EOL:
+          /* End of options. */
+          LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: EOL\n"));
           return;
-        }
-        /* An MSS option with the right option length. */
-        mss = (tcp_getoptbyte() << 8);
-        mss |= tcp_getoptbyte();
-        /* Limit the mss to the configured TCP_MSS and prevent division by zero */
-        pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss;
-        break;
-#if LWIP_WND_SCALE
-      case LWIP_TCP_OPT_WS:
-        LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: WND_SCALE\n"));
-        if (tcp_getoptbyte() != LWIP_TCP_OPT_LEN_WS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_WS) > tcphdr_optlen) {
-          /* Bad length */
-          LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n"));
-          return;
-        }
-        /* An WND_SCALE option with the right option length. */
-        data = tcp_getoptbyte();
-        /* If syn was received with wnd scale option,
-           activate wnd scale opt, but only if this is not a retransmission */
-        if ((flags & TCP_SYN) && !(pcb->flags & TF_WND_SCALE)) {
-          pcb->snd_scale = data;
-          if (pcb->snd_scale > 14U) {
-            pcb->snd_scale = 14U;
+        case LWIP_TCP_OPT_NOP:
+          /* NOP option. */
+          LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: NOP\n"));
+          break;
+        case LWIP_TCP_OPT_MSS:
+          LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: MSS\n"));
+          if (tcp_get_next_optbyte() != LWIP_TCP_OPT_LEN_MSS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_MSS) > tcphdr_optlen) {
+            /* Bad length */
+            LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n"));
+            return;
           }
-          pcb->rcv_scale = TCP_RCV_SCALE;
-          pcb->flags |= TF_WND_SCALE;
-          /* window scaling is enabled, we can use the full receive window */
-          LWIP_ASSERT("window not at default value", pcb->rcv_wnd == TCPWND_MIN16(TCP_WND));
-          LWIP_ASSERT("window not at default value", pcb->rcv_ann_wnd == TCPWND_MIN16(TCP_WND));
-          pcb->rcv_wnd = pcb->rcv_ann_wnd = TCP_WND;
-        }
-        break;
-#endif
+          /* An MSS option with the right option length. */
+          mss = (u16_t)(tcp_get_next_optbyte() << 8);
+          mss |= tcp_get_next_optbyte();
+          /* Limit the mss to the configured TCP_MSS and prevent division by zero */
+          pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss;
+          break;
+#if LWIP_WND_SCALE
+        case LWIP_TCP_OPT_WS:
+          LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: WND_SCALE\n"));
+          if (tcp_get_next_optbyte() != LWIP_TCP_OPT_LEN_WS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_WS) > tcphdr_optlen) {
+            /* Bad length */
+            LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n"));
+            return;
+          }
+          /* An WND_SCALE option with the right option length. */
+          data = tcp_get_next_optbyte();
+          /* If syn was received with wnd scale option,
+             activate wnd scale opt, but only if this is not a retransmission */
+          if ((flags & TCP_SYN) && !(pcb->flags & TF_WND_SCALE)) {
+            pcb->snd_scale = data;
+            if (pcb->snd_scale > 14U) {
+              pcb->snd_scale = 14U;
+            }
+            pcb->rcv_scale = TCP_RCV_SCALE;
+            tcp_set_flags(pcb, TF_WND_SCALE);
+            /* window scaling is enabled, we can use the full receive window */
+            LWIP_ASSERT("window not at default value", pcb->rcv_wnd == TCPWND_MIN16(TCP_WND));
+            LWIP_ASSERT("window not at default value", pcb->rcv_ann_wnd == TCPWND_MIN16(TCP_WND));
+            pcb->rcv_wnd = pcb->rcv_ann_wnd = TCP_WND;
+          }
+          break;
+#endif /* LWIP_WND_SCALE */
 #if LWIP_TCP_TIMESTAMPS
-      case LWIP_TCP_OPT_TS:
-        LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: TS\n"));
-        if (tcp_getoptbyte() != LWIP_TCP_OPT_LEN_TS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_TS) > tcphdr_optlen) {
-          /* Bad length */
-          LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n"));
-          return;
-        }
-        /* TCP timestamp option with valid length */
-        tsval = tcp_getoptbyte();
-        tsval |= (tcp_getoptbyte() << 8);
-        tsval |= (tcp_getoptbyte() << 16);
-        tsval |= (tcp_getoptbyte() << 24);
-        if (flags & TCP_SYN) {
-          pcb->ts_recent = lwip_ntohl(tsval);
-          /* Enable sending timestamps in every segment now that we know
-             the remote host supports it. */
-          pcb->flags |= TF_TIMESTAMP;
-        } else if (TCP_SEQ_BETWEEN(pcb->ts_lastacksent, seqno, seqno+tcplen)) {
-          pcb->ts_recent = lwip_ntohl(tsval);
-        }
-        /* Advance to next option (6 bytes already read) */
-        tcp_optidx += LWIP_TCP_OPT_LEN_TS - 6;
-        break;
-#endif
-      default:
-        LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: other\n"));
-        data = tcp_getoptbyte();
-        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;
-        }
-        /* All other options have a length field, so that we easily
-           can skip past them. */
-        tcp_optidx += data - 2;
+        case LWIP_TCP_OPT_TS:
+          LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: TS\n"));
+          if (tcp_get_next_optbyte() != LWIP_TCP_OPT_LEN_TS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_TS) > tcphdr_optlen) {
+            /* Bad length */
+            LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n"));
+            return;
+          }
+          /* TCP timestamp option with valid length */
+          tsval = tcp_get_next_optbyte();
+          tsval |= (tcp_get_next_optbyte() << 8);
+          tsval |= (tcp_get_next_optbyte() << 16);
+          tsval |= (tcp_get_next_optbyte() << 24);
+          if (flags & TCP_SYN) {
+            pcb->ts_recent = lwip_ntohl(tsval);
+            /* Enable sending timestamps in every segment now that we know
+               the remote host supports it. */
+            tcp_set_flags(pcb, TF_TIMESTAMP);
+          } else if (TCP_SEQ_BETWEEN(pcb->ts_lastacksent, seqno, seqno + tcplen)) {
+            pcb->ts_recent = lwip_ntohl(tsval);
+          }
+          /* Advance to next option (6 bytes already read) */
+          tcp_optidx += LWIP_TCP_OPT_LEN_TS - 6;
+          break;
+#endif /* LWIP_TCP_TIMESTAMPS */
+#if LWIP_TCP_SACK_OUT
+        case LWIP_TCP_OPT_SACK_PERM:
+          LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: SACK_PERM\n"));
+          if (tcp_get_next_optbyte() != LWIP_TCP_OPT_LEN_SACK_PERM || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_SACK_PERM) > tcphdr_optlen) {
+            /* Bad length */
+            LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n"));
+            return;
+          }
+          /* TCP SACK_PERM option with valid length */
+          if (flags & TCP_SYN) {
+            /* We only set it if we receive it in a SYN (or SYN+ACK) packet */
+            tcp_set_flags(pcb, TF_SACK);
+          }
+          break;
+#endif /* LWIP_TCP_SACK_OUT */
+        default:
+          LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: other\n"));
+          data = tcp_get_next_optbyte();
+          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;
+          }
+          /* All other options have a length field, so that we easily
+             can skip past them. */
+          tcp_optidx += data - 2;
       }
     }
   }
@@ -1834,4 +2031,148 @@
   recv_flags |= TF_CLOSED;
 }
 
+#if LWIP_TCP_SACK_OUT
+/**
+ * Called by tcp_receive() to add new SACK entry.
+ *
+ * The new SACK entry will be placed at the beginning of rcv_sacks[], as the newest one.
+ * Existing SACK entries will be "pushed back", to preserve their order.
+ * This is the behavior described in RFC 2018, section 4.
+ *
+ * @param pcb the tcp_pcb for which a segment arrived
+ * @param left the left side of the SACK (the first sequence number)
+ * @param right the right side of the SACK (the first sequence number past this SACK)
+ */
+static void
+tcp_add_sack(struct tcp_pcb *pcb, u32_t left, u32_t right)
+{
+  u8_t i;
+  u8_t unused_idx;
+
+  if ((pcb->flags & TF_SACK) == 0 || !TCP_SEQ_LT(left, right)) {
+    return;
+  }
+
+  /* First, let's remove all SACKs that are no longer needed (because they overlap with the newest one),
+     while moving all other SACKs forward.
+     We run this loop for all entries, until we find the first invalid one.
+     There is no point checking after that. */
+  for (i = unused_idx = 0; (i < LWIP_TCP_MAX_SACK_NUM) && LWIP_TCP_SACK_VALID(pcb, i); ++i) {
+    /* We only want to use SACK at [i] if it doesn't overlap with left:right range.
+       It does not overlap if its right side is before the newly added SACK,
+       or if its left side is after the newly added SACK.
+       NOTE: The equality should not really happen, but it doesn't hurt. */
+    if (TCP_SEQ_LEQ(pcb->rcv_sacks[i].right, left) || TCP_SEQ_LEQ(right, pcb->rcv_sacks[i].left)) {
+      if (unused_idx != i) {
+        /* We don't need to copy if it's already in the right spot */
+        pcb->rcv_sacks[unused_idx] = pcb->rcv_sacks[i];
+      }
+      ++unused_idx;
+    }
+  }
+
+  /* Now 'unused_idx' is the index of the first invalid SACK entry,
+     anywhere between 0 (no valid entries) and LWIP_TCP_MAX_SACK_NUM (all entries are valid).
+     We want to clear this and all following SACKs.
+     However, we will be adding another one in the front (and shifting everything else back).
+     So let's just iterate from the back, and set each entry to the one to the left if it's valid,
+     or to 0 if it is not. */
+  for (i = LWIP_TCP_MAX_SACK_NUM - 1; i > 0; --i) {
+    /* [i] is the index we are setting, and the value should be at index [i-1],
+       or 0 if that index is unused (>= unused_idx). */
+    if (i - 1 >= unused_idx) {
+      /* [i-1] is unused. Let's clear [i]. */
+      pcb->rcv_sacks[i].left = pcb->rcv_sacks[i].right = 0;
+    } else {
+      pcb->rcv_sacks[i] = pcb->rcv_sacks[i - 1];
+    }
+  }
+
+  /* And now we can store the newest SACK */
+  pcb->rcv_sacks[0].left = left;
+  pcb->rcv_sacks[0].right = right;
+}
+
+/**
+ * Called to remove a range of SACKs.
+ *
+ * SACK entries will be removed or adjusted to not acknowledge any sequence
+ * numbers that are less than 'seq' passed. It not only invalidates entries,
+ * but also moves all entries that are still valid to the beginning.
+ *
+ * @param pcb the tcp_pcb to modify
+ * @param seq the lowest sequence number to keep in SACK entries
+ */
+static void
+tcp_remove_sacks_lt(struct tcp_pcb *pcb, u32_t seq)
+{
+  u8_t i;
+  u8_t unused_idx;
+
+  /* We run this loop for all entries, until we find the first invalid one.
+     There is no point checking after that. */
+  for (i = unused_idx = 0; (i < LWIP_TCP_MAX_SACK_NUM) && LWIP_TCP_SACK_VALID(pcb, i); ++i) {
+    /* We only want to use SACK at index [i] if its right side is > 'seq'. */
+    if (TCP_SEQ_GT(pcb->rcv_sacks[i].right, seq)) {
+      if (unused_idx != i) {
+        /* We only copy it if it's not in the right spot already. */
+        pcb->rcv_sacks[unused_idx] = pcb->rcv_sacks[i];
+      }
+      /* NOTE: It is possible that its left side is < 'seq', in which case we should adjust it. */
+      if (TCP_SEQ_LT(pcb->rcv_sacks[unused_idx].left, seq)) {
+        pcb->rcv_sacks[unused_idx].left = seq;
+      }
+      ++unused_idx;
+    }
+  }
+
+  /* We also need to invalidate everything from 'unused_idx' till the end */
+  for (i = unused_idx; i < LWIP_TCP_MAX_SACK_NUM; ++i) {
+    pcb->rcv_sacks[i].left = pcb->rcv_sacks[i].right = 0;
+  }
+}
+
+#if defined(TCP_OOSEQ_BYTES_LIMIT) || defined(TCP_OOSEQ_PBUFS_LIMIT)
+/**
+ * Called to remove a range of SACKs.
+ *
+ * SACK entries will be removed or adjusted to not acknowledge any sequence
+ * numbers that are greater than (or equal to) 'seq' passed. It not only invalidates entries,
+ * but also moves all entries that are still valid to the beginning.
+ *
+ * @param pcb the tcp_pcb to modify
+ * @param seq the highest sequence number to keep in SACK entries
+ */
+static void
+tcp_remove_sacks_gt(struct tcp_pcb *pcb, u32_t seq)
+{
+  u8_t i;
+  u8_t unused_idx;
+
+  /* We run this loop for all entries, until we find the first invalid one.
+     There is no point checking after that. */
+  for (i = unused_idx = 0; (i < LWIP_TCP_MAX_SACK_NUM) && LWIP_TCP_SACK_VALID(pcb, i); ++i) {
+    /* We only want to use SACK at index [i] if its left side is < 'seq'. */
+    if (TCP_SEQ_LT(pcb->rcv_sacks[i].left, seq)) {
+      if (unused_idx != i) {
+        /* We only copy it if it's not in the right spot already. */
+        pcb->rcv_sacks[unused_idx] = pcb->rcv_sacks[i];
+      }
+      /* NOTE: It is possible that its right side is > 'seq', in which case we should adjust it. */
+      if (TCP_SEQ_GT(pcb->rcv_sacks[unused_idx].right, seq)) {
+        pcb->rcv_sacks[unused_idx].right = seq;
+      }
+      ++unused_idx;
+    }
+  }
+
+  /* We also need to invalidate everything from 'unused_idx' till the end */
+  for (i = unused_idx; i < LWIP_TCP_MAX_SACK_NUM; ++i) {
+    pcb->rcv_sacks[i].left = pcb->rcv_sacks[i].right = 0;
+  }
+}
+#endif /* TCP_OOSEQ_BYTES_LIMIT || TCP_OOSEQ_PBUFS_LIMIT */
+
+#endif /* LWIP_TCP_SACK_OUT */
+
 #endif /* LWIP_TCP */
diff --git a/src/core/tcp_out.c b/src/core/tcp_out.c
index 2435408..724df10 100644
--- a/src/core/tcp_out.c
+++ b/src/core/tcp_out.c
@@ -4,6 +4,28 @@
  *
  * The output functions of TCP.
  *
+ * There are two distinct ways for TCP segments to get sent:
+ * - queued data: these are segments transferring data or segments containing
+ *   SYN or FIN (which both count as one sequence number). They are created as
+ *   struct @ref pbuf together with a struct tcp_seg and enqueue to the
+ *   unsent list of the pcb. They are sent by tcp_output:
+ *   - @ref tcp_write : creates data segments
+ *   - @ref tcp_split_unsent_seg : splits a data segment
+ *   - @ref tcp_enqueue_flags : creates SYN-only or FIN-only segments
+ *   - @ref tcp_output / tcp_output_segment : finalize the tcp header
+ *      (e.g. sequence numbers, options, checksum) and output to IP
+ *   - the various tcp_rexmit functions shuffle around segments between the
+ *     unsent an unacked lists to retransmit them
+ *   - tcp_create_segment and tcp_pbuf_prealloc allocate pbuf and
+ *     segment for these functions
+ * - direct send: these segments don't contain data but control the connection
+ *   behaviour. They are created as pbuf only and sent directly without
+ *   enqueueing them:
+ *   - @ref tcp_send_empty_ack sends an ACK-only segment
+ *   - @ref tcp_rst sends a RST segment
+ *   - @ref tcp_keepalive sends a keepalive segment
+ *   - @ref tcp_zero_window_probe sends a window probe segment
+ *   - tcp_output_alloc_header allocates a header-only pbuf for these functions
  */
 
 /*
@@ -58,6 +80,17 @@
 
 #include <string.h>
 
+#ifdef LWIP_HOOK_FILENAME
+#include LWIP_HOOK_FILENAME
+#endif
+
+/* Allow to add custom TCP header options by defining this hook */
+#ifdef LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH
+#define LWIP_TCP_OPT_LENGTH_SEGMENT(flags, pcb) LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH(pcb, LWIP_TCP_OPT_LENGTH(flags))
+#else
+#define LWIP_TCP_OPT_LENGTH_SEGMENT(flags, pcb) LWIP_TCP_OPT_LENGTH(flags)
+#endif
+
 /* Define some copy-macros for checksum-on-copy so that the code looks
    nicer by preventing too many ifdef's. */
 #if TCP_CHECKSUM_ON_COPY
@@ -94,75 +127,27 @@
 /* Forward declarations.*/
 static err_t tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif);
 
-/** Allocate a pbuf and create a tcphdr at p->payload, used for output
- * functions other than the default tcp_output -> tcp_output_segment
- * (e.g. tcp_send_empty_ack, etc.)
- *
- * @param pcb tcp pcb for which to send a packet (used to initialize tcp_hdr)
- * @param optlen length of header-options
- * @param datalen length of tcp data to reserve in pbuf
- * @param seqno_be seqno in network byte order (big-endian)
- * @return pbuf with p->payload being the tcp_hdr
- */
-static struct pbuf *
-tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen,
-                      u32_t seqno_be /* already in network byte order */)
+/* tcp_route: common code that returns a fixed bound netif or calls ip_route */
+static struct netif *
+tcp_route(const struct tcp_pcb *pcb, const ip_addr_t *src, const ip_addr_t *dst)
 {
-  struct tcp_hdr *tcphdr;
-  struct pbuf *p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM);
-  if (p != NULL) {
-    LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr",
-                 (p->len >= TCP_HLEN + optlen));
-    tcphdr = (struct tcp_hdr *)p->payload;
-    tcphdr->src = lwip_htons(pcb->local_port);
-    tcphdr->dest = lwip_htons(pcb->remote_port);
-    tcphdr->seqno = seqno_be;
-    tcphdr->ackno = lwip_htonl(pcb->rcv_nxt);
-    TCPH_HDRLEN_FLAGS_SET(tcphdr, (5 + optlen / 4), TCP_ACK);
-    tcphdr->wnd = lwip_htons(TCPWND_MIN16(RCV_WND_SCALE(pcb, pcb->rcv_ann_wnd)));
-    tcphdr->chksum = 0;
-    tcphdr->urgp = 0;
+  LWIP_UNUSED_ARG(src); /* in case IPv4-only and source-based routing is disabled */
 
-    /* If we're sending a packet, update the announced right window edge */
-    pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;
+  if ((pcb != NULL) && (pcb->netif_idx != NETIF_NO_INDEX)) {
+    return netif_get_by_index(pcb->netif_idx);
+  } else {
+    return ip_route(src, dst);
   }
-  return p;
-}
-
-/**
- * Called by tcp_close() to send a segment including FIN flag but not data.
- *
- * @param pcb the tcp_pcb over which to send a segment
- * @return ERR_OK if sent, another err_t otherwise
- */
-err_t
-tcp_send_fin(struct tcp_pcb *pcb)
-{
-  /* first, try to add the fin to the last unsent segment */
-  if (pcb->unsent != NULL) {
-    struct tcp_seg *last_unsent;
-    for (last_unsent = pcb->unsent; last_unsent->next != NULL;
-         last_unsent = last_unsent->next);
-
-    if ((TCPH_FLAGS(last_unsent->tcphdr) & (TCP_SYN | TCP_FIN | TCP_RST)) == 0) {
-      /* no SYN/FIN/RST flag in the header, we can add the FIN flag */
-      TCPH_SET_FLAG(last_unsent->tcphdr, TCP_FIN);
-      pcb->flags |= TF_FIN;
-      return ERR_OK;
-    }
-  }
-  /* no data, no length, flags, copy=1, no optdata */
-  return tcp_enqueue_flags(pcb, TCP_FIN);
 }
 
 /**
  * Create a TCP segment with prefilled header.
  *
- * Called by tcp_write and tcp_enqueue_flags.
+ * Called by @ref tcp_write, @ref tcp_enqueue_flags and @ref tcp_split_unsent_seg
  *
  * @param pcb Protocol control block for the TCP connection.
  * @param p pbuf that is used to hold the TCP header.
- * @param flags TCP flags for header.
+ * @param hdrflags TCP flags for header.
  * @param seqno TCP sequence number of this packet
  * @param optflags options to include in TCP header
  * @return a new tcp_seg pointing to p, or NULL.
@@ -170,10 +155,15 @@
  * p is freed on failure.
  */
 static struct tcp_seg *
-tcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, u8_t optflags)
+tcp_create_segment(const struct tcp_pcb *pcb, struct pbuf *p, u8_t hdrflags, u32_t seqno, u8_t optflags)
 {
   struct tcp_seg *seg;
-  u8_t optlen = LWIP_TCP_OPT_LENGTH(optflags);
+  u8_t optlen;
+
+  LWIP_ASSERT("tcp_create_segment: invalid pcb", pcb != NULL);
+  LWIP_ASSERT("tcp_create_segment: invalid pbuf", p != NULL);
+
+  optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(optflags, pcb);
 
   if ((seg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG)) == NULL) {
     LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_create_segment: no memory.\n"));
@@ -197,7 +187,7 @@
 #endif /* TCP_CHECKSUM_ON_COPY */
 
   /* build TCP header */
-  if (pbuf_header(p, TCP_HLEN)) {
+  if (pbuf_add_header(p, TCP_HLEN)) {
     LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_create_segment: no room for TCP header in pbuf.\n"));
     TCP_STATS_INC(tcp.err);
     tcp_seg_free(seg);
@@ -208,7 +198,7 @@
   seg->tcphdr->dest = lwip_htons(pcb->remote_port);
   seg->tcphdr->seqno = lwip_htonl(seqno);
   /* ackno is set in tcp_output */
-  TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), flags);
+  TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), hdrflags);
   /* wnd and chksum are set in tcp_output */
   seg->tcphdr->urgp = 0;
   return seg;
@@ -220,6 +210,8 @@
  * This function is like pbuf_alloc(layer, length, PBUF_RAM) except
  * there may be extra bytes available at the end.
  *
+ * Called by @ref tcp_write
+ *
  * @param layer flag to define header size.
  * @param length size of the pbuf's payload.
  * @param max_length maximum usable size of payload+oversize.
@@ -231,12 +223,15 @@
 #if TCP_OVERSIZE
 static struct pbuf *
 tcp_pbuf_prealloc(pbuf_layer layer, u16_t length, u16_t max_length,
-                  u16_t *oversize, struct tcp_pcb *pcb, u8_t apiflags,
+                  u16_t *oversize, const struct tcp_pcb *pcb, u8_t apiflags,
                   u8_t first_seg)
 {
   struct pbuf *p;
   u16_t alloc = length;
 
+  LWIP_ASSERT("tcp_pbuf_prealloc: invalid oversize", oversize != NULL);
+  LWIP_ASSERT("tcp_pbuf_prealloc: invalid pcb", pcb != NULL);
+
 #if LWIP_NETIF_TX_SINGLE_PBUF
   LWIP_UNUSED_ARG(max_length);
   LWIP_UNUSED_ARG(pcb);
@@ -280,7 +275,10 @@
 #endif /* TCP_OVERSIZE */
 
 #if TCP_CHECKSUM_ON_COPY
-/** Add a checksum of newly added data to the segment */
+/** Add a checksum of newly added data to the segment.
+ *
+ * Called by tcp_write and tcp_split_unsent_seg.
+ */
 static void
 tcp_seg_add_chksum(u16_t chksum, u16_t len, u16_t *seg_chksum,
                    u8_t *seg_chksum_swapped)
@@ -306,6 +304,8 @@
 static err_t
 tcp_write_checks(struct tcp_pcb *pcb, u16_t len)
 {
+  LWIP_ASSERT("tcp_write_checks: invalid pcb", pcb != NULL);
+
   /* connection is in invalid state for data transmission? */
   if ((pcb->state != ESTABLISHED) &&
       (pcb->state != CLOSE_WAIT) &&
@@ -320,8 +320,8 @@
   /* fail on too much data */
   if (len > pcb->snd_buf) {
     LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("tcp_write: too much data (len=%"U16_F" > snd_buf=%"TCPWNDSIZE_F")\n",
-      len, pcb->snd_buf));
-    pcb->flags |= TF_NAGLEMEMERR;
+                len, pcb->snd_buf));
+    tcp_set_flags(pcb, TF_NAGLEMEMERR);
     return ERR_MEM;
   }
 
@@ -330,19 +330,19 @@
   /* If total number of pbufs on the unsent/unacked queues exceeds the
    * configured maximum, return an error */
   /* check for configured max queuelen and possible overflow */
-  if ((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {
+  if (pcb->snd_queuelen >= LWIP_MIN(TCP_SND_QUEUELEN, (TCP_SNDQUEUELEN_OVERFLOW + 1))) {
     LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("tcp_write: too long queue %"U16_F" (max %"U16_F")\n",
-      pcb->snd_queuelen, (u16_t)TCP_SND_QUEUELEN));
+                pcb->snd_queuelen, (u16_t)TCP_SND_QUEUELEN));
     TCP_STATS_INC(tcp.memerr);
-    pcb->flags |= TF_NAGLEMEMERR;
+    tcp_set_flags(pcb, TF_NAGLEMEMERR);
     return ERR_MEM;
   }
   if (pcb->snd_queuelen != 0) {
     LWIP_ASSERT("tcp_write: pbufs on queue => at least one queue non-empty",
-      pcb->unacked != NULL || pcb->unsent != NULL);
+                pcb->unacked != NULL || pcb->unsent != NULL);
   } else {
     LWIP_ASSERT("tcp_write: no pbufs on queue => both queues empty",
-      pcb->unacked == NULL && pcb->unsent == NULL);
+                pcb->unacked == NULL && pcb->unsent == NULL);
   }
   return ERR_OK;
 }
@@ -355,6 +355,28 @@
  * 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
+ *   for the data to be copied into. If this flag is not given, no new memory
+ *   should be allocated and the data should only be referenced by pointer. This
+ *   also means that the memory behind dataptr must not change until the data is
+ *   ACKed by the remote host
+ * - TCP_WRITE_FLAG_MORE: indicates that more data follows. If this is omitted,
+ *   the PSH flag is set in the last segment created by this call to tcp_write.
+ *   If this flag is given, the PSH flag is not set.
+ *
+ * The tcp_write() function will fail and return ERR_MEM if the length
+ * of the data exceeds the current send buffer size or if the length of
+ * the queue of outgoing segment is larger than the upper limit defined
+ * in lwipopts.h. The number of bytes available in the output queue can
+ * be retrieved with the tcp_sndbuf() function.
+ *
+ * The proper way to use this function is to call the function with at
+ * most tcp_sndbuf() bytes of data. If the function returns ERR_MEM,
+ * the application should wait until some of the currently enqueued
+ * data has been successfully received by the other host and try again.
  *
  * @param pcb Protocol control block for the TCP connection to enqueue data for.
  * @param arg Pointer to the data to be enqueued for sending.
@@ -371,7 +393,7 @@
   struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL;
   u16_t pos = 0; /* position in 'arg' data */
   u16_t queuelen;
-  u8_t optlen = 0;
+  u8_t optlen;
   u8_t optflags = 0;
 #if TCP_OVERSIZE
   u16_t oversize = 0;
@@ -387,17 +409,23 @@
   u16_t concat_chksummed = 0;
 #endif /* TCP_CHECKSUM_ON_COPY */
   err_t err;
+  u16_t mss_local;
+
+  LWIP_ERROR("tcp_write: invalid pcb", pcb != NULL, return ERR_ARG);
+
   /* don't allocate segments bigger than half the maximum window we ever received */
-  u16_t mss_local = LWIP_MIN(pcb->mss, TCPWND_MIN16(pcb->snd_wnd_max/2));
+  mss_local = LWIP_MIN(pcb->mss, TCPWND_MIN16(pcb->snd_wnd_max / 2));
   mss_local = mss_local ? mss_local : pcb->mss;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
 #if LWIP_NETIF_TX_SINGLE_PBUF
   /* Always copy to try to create single pbufs for TX */
   apiflags |= TCP_WRITE_FLAG_COPY;
 #endif /* LWIP_NETIF_TX_SINGLE_PBUF */
 
   LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_write(pcb=%p, data=%p, len=%"U16_F", apiflags=%"U16_F")\n",
-    (void *)pcb, arg, len, (u16_t)apiflags));
+                                 (void *)pcb, arg, len, (u16_t)apiflags));
   LWIP_ERROR("tcp_write: arg == NULL (programmer violates API)",
              arg != NULL, return ERR_ARG;);
 
@@ -412,11 +440,14 @@
     /* Make sure the timestamp option is only included in data segments if we
        agreed about it with the remote host. */
     optflags = TF_SEG_OPTS_TS;
-    optlen = LWIP_TCP_OPT_LENGTH(TF_SEG_OPTS_TS);
+    optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(TF_SEG_OPTS_TS, pcb);
     /* ensure that segments can hold at least one data byte... */
     mss_local = LWIP_MAX(mss_local, LWIP_TCP_OPT_LEN_TS + 1);
-  }
+  } else
 #endif /* LWIP_TCP_TIMESTAMPS */
+  {
+    optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(0, pcb);
+  }
 
 
   /*
@@ -451,7 +482,7 @@
          last_unsent = last_unsent->next);
 
     /* Usable space at the end of the last unsent segment */
-    unsent_optlen = LWIP_TCP_OPT_LENGTH(last_unsent->flags);
+    unsent_optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(last_unsent->flags, pcb);
     LWIP_ASSERT("mss_local is too small", mss_local >= last_unsent->len + unsent_optlen);
     space = mss_local - (last_unsent->len + unsent_optlen);
 
@@ -481,6 +512,7 @@
     LWIP_ASSERT("inconsistent oversize vs. len", (oversize == 0) || (pos == len));
 #endif /* TCP_OVERSIZE */
 
+#if !LWIP_NETIF_TX_SINGLE_PBUF
     /*
      * Phase 2: Chain a new pbuf to the end of pcb->unsent.
      *
@@ -491,6 +523,10 @@
      * We don't extend segments containing SYN/FIN flags or options
      * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at
      * the end.
+     *
+     * This phase is skipped for LWIP_NETIF_TX_SINGLE_PBUF as we could only execute
+     * it after rexmit puts a segment from unacked to unsent and at this point,
+     * oversize info is lost.
      */
     if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
       u16_t seglen = LWIP_MIN(space, len - pos);
@@ -510,7 +546,7 @@
 #if TCP_OVERSIZE_DBGCHECK
         oversize_add = oversize;
 #endif /* TCP_OVERSIZE_DBGCHECK */
-        TCP_DATA_COPY2(concat_p->payload, (const u8_t*)arg + pos, seglen, &concat_chksum, &concat_chksum_swapped);
+        TCP_DATA_COPY2(concat_p->payload, (const u8_t *)arg + pos, seglen, &concat_chksum, &concat_chksum_swapped);
 #if TCP_CHECKSUM_ON_COPY
         concat_chksummed += seglen;
 #endif /* TCP_CHECKSUM_ON_COPY */
@@ -520,7 +556,8 @@
         /* If the last unsent pbuf is of type PBUF_ROM, try to extend it. */
         struct pbuf *p;
         for (p = last_unsent->p; p->next != NULL; p = p->next);
-        if (p->type == PBUF_ROM && (const u8_t *)p->payload + p->len == (const u8_t *)arg) {
+        if (((p->type_internal & (PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS | PBUF_TYPE_FLAG_DATA_VOLATILE)) == 0) &&
+            (const u8_t *)p->payload + p->len == (const u8_t *)arg) {
           LWIP_ASSERT("tcp_write: ROM pbufs cannot be oversized", pos == 0);
           extendlen = seglen;
         } else {
@@ -530,19 +567,20 @@
             goto memerr;
           }
           /* reference the non-volatile payload data */
-          ((struct pbuf_rom*)concat_p)->payload = (const u8_t*)arg + pos;
+          ((struct pbuf_rom *)concat_p)->payload = (const u8_t *)arg + pos;
           queuelen += pbuf_clen(concat_p);
         }
 #if TCP_CHECKSUM_ON_COPY
         /* calculate the checksum of nocopy-data */
-        tcp_seg_add_chksum(~inet_chksum((const u8_t*)arg + pos, seglen), seglen,
-          &concat_chksum, &concat_chksum_swapped);
+        tcp_seg_add_chksum(~inet_chksum((const u8_t *)arg + pos, seglen), seglen,
+                           &concat_chksum, &concat_chksum_swapped);
         concat_chksummed += seglen;
 #endif /* TCP_CHECKSUM_ON_COPY */
       }
 
       pos += seglen;
     }
+#endif /* !LWIP_NETIF_TX_SINGLE_PBUF */
   } else {
 #if TCP_OVERSIZE
     LWIP_ASSERT("unsent_oversize mismatch (pcb->unsent is NULL)",
@@ -575,7 +613,7 @@
       }
       LWIP_ASSERT("tcp_write: check that first pbuf can hold the complete seglen",
                   (p->len >= seglen));
-      TCP_DATA_COPY2((char *)p->payload + optlen, (const u8_t*)arg + pos, seglen, &chksum, &chksum_swapped);
+      TCP_DATA_COPY2((char *)p->payload + optlen, (const u8_t *)arg + pos, seglen, &chksum, &chksum_swapped);
     } else {
       /* Copy is not set: First allocate a pbuf for holding the data.
        * Since the referenced data is available at least until it is
@@ -592,14 +630,14 @@
       }
 #if TCP_CHECKSUM_ON_COPY
       /* calculate the checksum of nocopy-data */
-      chksum = ~inet_chksum((const u8_t*)arg + pos, seglen);
+      chksum = ~inet_chksum((const u8_t *)arg + pos, seglen);
       if (seglen & 1) {
         chksum_swapped = 1;
         chksum = SWAP_BYTES_IN_WORD(chksum);
       }
 #endif /* TCP_CHECKSUM_ON_COPY */
       /* reference the non-volatile payload data */
-      ((struct pbuf_rom*)p2)->payload = (const u8_t*)arg + pos;
+      ((struct pbuf_rom *)p2)->payload = (const u8_t *)arg + pos;
 
       /* Second, allocate a pbuf for the headers. */
       if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
@@ -618,9 +656,9 @@
     /* Now that there are more segments queued, we check again if the
      * length of the queue exceeds the configured maximum or
      * overflows. */
-    if ((queuelen > TCP_SND_QUEUELEN) || (queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {
+    if (queuelen > LWIP_MIN(TCP_SND_QUEUELEN, TCP_SNDQUEUELEN_OVERFLOW)) {
       LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_write: queue too long %"U16_F" (%d)\n",
-        queuelen, (int)TCP_SND_QUEUELEN));
+                  queuelen, (int)TCP_SND_QUEUELEN));
       pbuf_free(p);
       goto memerr;
     }
@@ -649,8 +687,8 @@
     prev_seg = seg;
 
     LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE, ("tcp_write: queueing %"U32_F":%"U32_F"\n",
-      lwip_ntohl(seg->tcphdr->seqno),
-      lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg)));
+                lwip_ntohl(seg->tcphdr->seqno),
+                lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg)));
 
     pos += seglen;
   }
@@ -696,13 +734,13 @@
    */
   if (concat_p != NULL) {
     LWIP_ASSERT("tcp_write: cannot concatenate when pcb->unsent is empty",
-      (last_unsent != NULL));
+                (last_unsent != NULL));
     pbuf_cat(last_unsent->p, concat_p);
     last_unsent->len += concat_p->tot_len;
   } else if (extendlen > 0) {
     struct pbuf *p;
     LWIP_ASSERT("tcp_write: extension of reference requires reference",
-      last_unsent != NULL && last_unsent->p != NULL);
+                last_unsent != NULL && last_unsent->p != NULL);
     for (p = last_unsent->p; p->next != NULL; p = p->next) {
       p->tot_len += extendlen;
     }
@@ -714,13 +752,13 @@
 #if TCP_CHECKSUM_ON_COPY
   if (concat_chksummed) {
     LWIP_ASSERT("tcp_write: concat checksum needs concatenated data",
-        concat_p != NULL || extendlen > 0);
+                concat_p != NULL || extendlen > 0);
     /*if concat checksumm swapped - swap it back */
     if (concat_chksum_swapped) {
       concat_chksum = SWAP_BYTES_IN_WORD(concat_chksum);
     }
     tcp_seg_add_chksum(concat_chksum, concat_chksummed, &last_unsent->chksum,
-      &last_unsent->chksum_swapped);
+                       &last_unsent->chksum_swapped);
     last_unsent->flags |= TF_SEG_DATA_CHECKSUMMED;
   }
 #endif /* TCP_CHECKSUM_ON_COPY */
@@ -743,20 +781,20 @@
   pcb->snd_queuelen = queuelen;
 
   LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_write: %"S16_F" (after enqueued)\n",
-    pcb->snd_queuelen));
+                               pcb->snd_queuelen));
   if (pcb->snd_queuelen != 0) {
     LWIP_ASSERT("tcp_write: valid queue length",
                 pcb->unacked != NULL || pcb->unsent != NULL);
   }
 
   /* Set the PSH flag in the last segment that we enqueued. */
-  if (seg != NULL && seg->tcphdr != NULL && ((apiflags & TCP_WRITE_FLAG_MORE)==0)) {
+  if (seg != NULL && seg->tcphdr != NULL && ((apiflags & TCP_WRITE_FLAG_MORE) == 0)) {
     TCPH_SET_FLAG(seg->tcphdr, TCP_PSH);
   }
 
   return ERR_OK;
 memerr:
-  pcb->flags |= TF_NAGLEMEMERR;
+  tcp_set_flags(pcb, TF_NAGLEMEMERR);
   TCP_STATS_INC(tcp.memerr);
 
   if (concat_p != NULL) {
@@ -767,16 +805,225 @@
   }
   if (pcb->snd_queuelen != 0) {
     LWIP_ASSERT("tcp_write: valid queue length", pcb->unacked != NULL ||
-      pcb->unsent != NULL);
+                pcb->unsent != NULL);
   }
   LWIP_DEBUGF(TCP_QLEN_DEBUG | LWIP_DBG_STATE, ("tcp_write: %"S16_F" (with mem err)\n", pcb->snd_queuelen));
   return ERR_MEM;
 }
 
 /**
- * Enqueue TCP options for transmission.
+ * Split segment on the head of the unsent queue.  If return is not
+ * ERR_OK, existing head remains intact
  *
- * Called by tcp_connect(), tcp_listen_input(), and tcp_send_ctrl().
+ * The split is accomplished by creating a new TCP segment and pbuf
+ * which holds the remainder payload after the split.  The original
+ * pbuf is trimmed to new length.  This allows splitting of read-only
+ * pbufs
+ *
+ * @param pcb the tcp_pcb for which to split the unsent head
+ * @param split the amount of payload to remain in the head
+ */
+err_t
+tcp_split_unsent_seg(struct tcp_pcb *pcb, u16_t split)
+{
+  struct tcp_seg *seg = NULL, *useg = NULL;
+  struct pbuf *p = NULL;
+  u8_t optlen;
+  u8_t optflags;
+  u8_t split_flags;
+  u8_t remainder_flags;
+  u16_t remainder;
+  u16_t offset;
+#if TCP_CHECKSUM_ON_COPY
+  u16_t chksum = 0;
+  u8_t chksum_swapped = 0;
+  struct pbuf *q;
+#endif /* TCP_CHECKSUM_ON_COPY */
+
+  LWIP_ASSERT("tcp_split_unsent_seg: invalid pcb", pcb != NULL);
+
+  useg = pcb->unsent;
+  if (useg == NULL) {
+    return ERR_MEM;
+  }
+
+  if (split == 0) {
+    LWIP_ASSERT("Can't split segment into length 0", 0);
+    return ERR_VAL;
+  }
+
+  if (useg->len <= split) {
+    return ERR_OK;
+  }
+
+  LWIP_ASSERT("split <= mss", split <= pcb->mss);
+  LWIP_ASSERT("useg->len > 0", useg->len > 0);
+
+  /* We should check that we don't exceed TCP_SND_QUEUELEN but we need
+   * to split this packet so we may actually exceed the max value by
+   * one!
+   */
+  LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue: split_unsent_seg: %u\n", (unsigned int)pcb->snd_queuelen));
+
+  optflags = useg->flags;
+#if TCP_CHECKSUM_ON_COPY
+  /* Remove since checksum is not stored until after tcp_create_segment() */
+  optflags &= ~TF_SEG_DATA_CHECKSUMMED;
+#endif /* TCP_CHECKSUM_ON_COPY */
+  optlen = LWIP_TCP_OPT_LENGTH(optflags);
+  remainder = useg->len - split;
+
+  /* Create new pbuf for the remainder of the split */
+  p = pbuf_alloc(PBUF_TRANSPORT, remainder + optlen, PBUF_RAM);
+  if (p == NULL) {
+    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
+                ("tcp_split_unsent_seg: could not allocate memory for pbuf remainder %u\n", remainder));
+    goto memerr;
+  }
+
+  /* Offset into the original pbuf is past TCP/IP headers, options, and split amount */
+  offset = useg->p->tot_len - useg->len + split;
+  /* Copy remainder into new pbuf, headers and options will not be filled out */
+  if (pbuf_copy_partial(useg->p, (u8_t *)p->payload + optlen, remainder, offset ) != remainder) {
+    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
+                ("tcp_split_unsent_seg: could not copy pbuf remainder %u\n", remainder));
+    goto memerr;
+  }
+#if TCP_CHECKSUM_ON_COPY
+  /* calculate the checksum on remainder data */
+  tcp_seg_add_chksum(~inet_chksum((const u8_t *)p->payload + optlen, remainder), remainder,
+                     &chksum, &chksum_swapped);
+#endif /* TCP_CHECKSUM_ON_COPY */
+
+  /* Options are created when calling tcp_output() */
+
+  /* Migrate flags from original segment */
+  split_flags = TCPH_FLAGS(useg->tcphdr);
+  remainder_flags = 0; /* ACK added in tcp_output() */
+
+  if (split_flags & TCP_PSH) {
+    split_flags &= ~TCP_PSH;
+    remainder_flags |= TCP_PSH;
+  }
+  if (split_flags & TCP_FIN) {
+    split_flags &= ~TCP_FIN;
+    remainder_flags |= TCP_FIN;
+  }
+  /* SYN should be left on split, RST should not be present with data */
+
+  seg = tcp_create_segment(pcb, p, remainder_flags, lwip_ntohl(useg->tcphdr->seqno) + split, optflags);
+  if (seg == NULL) {
+    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
+                ("tcp_split_unsent_seg: could not create new TCP segment\n"));
+    goto memerr;
+  }
+
+#if TCP_CHECKSUM_ON_COPY
+  seg->chksum = chksum;
+  seg->chksum_swapped = chksum_swapped;
+  seg->flags |= TF_SEG_DATA_CHECKSUMMED;
+#endif /* TCP_CHECKSUM_ON_COPY */
+
+  /* Remove this segment from the queue since trimming it may free pbufs */
+  pcb->snd_queuelen -= pbuf_clen(useg->p);
+
+  /* Trim the original pbuf into our split size.  At this point our remainder segment must be setup
+  successfully because we are modifying the original segment */
+  pbuf_realloc(useg->p, useg->p->tot_len - remainder);
+  useg->len -= remainder;
+  TCPH_SET_FLAG(useg->tcphdr, split_flags);
+#if TCP_OVERSIZE_DBGCHECK
+  /* By trimming, realloc may have actually shrunk the pbuf, so clear oversize_left */
+  useg->oversize_left = 0;
+#endif /* TCP_OVERSIZE_DBGCHECK */
+
+  /* Add back to the queue with new trimmed pbuf */
+  pcb->snd_queuelen += pbuf_clen(useg->p);
+
+#if TCP_CHECKSUM_ON_COPY
+  /* The checksum on the split segment is now incorrect. We need to re-run it over the split */
+  useg->chksum = 0;
+  useg->chksum_swapped = 0;
+  q = useg->p;
+  offset = q->tot_len - useg->len; /* Offset due to exposed headers */
+
+  /* Advance to the pbuf where the offset ends */
+  while (q != NULL && offset > q->len) {
+    offset -= q->len;
+    q = q->next;
+  }
+  LWIP_ASSERT("Found start of payload pbuf", q != NULL);
+  /* Checksum the first payload pbuf accounting for offset, then other pbufs are all payload */
+  for (; q != NULL; offset = 0, q = q->next) {
+    tcp_seg_add_chksum(~inet_chksum((const u8_t *)q->payload + offset, q->len - offset), q->len - offset,
+                       &useg->chksum, &useg->chksum_swapped);
+  }
+#endif /* TCP_CHECKSUM_ON_COPY */
+
+  /* Update number of segments on the queues. Note that length now may
+   * exceed TCP_SND_QUEUELEN! We don't have to touch pcb->snd_buf
+   * because the total amount of data is constant when packet is split */
+  pcb->snd_queuelen += pbuf_clen(seg->p);
+
+  /* Finally insert remainder into queue after split (which stays head) */
+  seg->next = useg->next;
+  useg->next = seg;
+
+#if TCP_OVERSIZE
+  /* If remainder is last segment on the unsent, ensure we clear the oversize amount
+   * because the remainder is always sized to the exact remaining amount */
+  if (seg->next == NULL) {
+    pcb->unsent_oversize = 0;
+  }
+#endif /* TCP_OVERSIZE */
+
+  return ERR_OK;
+memerr:
+  TCP_STATS_INC(tcp.memerr);
+
+  LWIP_ASSERT("seg == NULL", seg == NULL);
+  if (p != NULL) {
+    pbuf_free(p);
+  }
+
+  return ERR_MEM;
+}
+
+/**
+ * Called by tcp_close() to send a segment including FIN flag but not data.
+ * This FIN may be added to an existing segment or a new, otherwise empty
+ * segment is enqueued.
+ *
+ * @param pcb the tcp_pcb over which to send a segment
+ * @return ERR_OK if sent, another err_t otherwise
+ */
+err_t
+tcp_send_fin(struct tcp_pcb *pcb)
+{
+  LWIP_ASSERT("tcp_send_fin: invalid pcb", pcb != NULL);
+
+  /* first, try to add the fin to the last unsent segment */
+  if (pcb->unsent != NULL) {
+    struct tcp_seg *last_unsent;
+    for (last_unsent = pcb->unsent; last_unsent->next != NULL;
+         last_unsent = last_unsent->next);
+
+    if ((TCPH_FLAGS(last_unsent->tcphdr) & (TCP_SYN | TCP_FIN | TCP_RST)) == 0) {
+      /* no SYN/FIN/RST flag in the header, we can add the FIN flag */
+      TCPH_SET_FLAG(last_unsent->tcphdr, TCP_FIN);
+      tcp_set_flags(pcb, TF_FIN);
+      return ERR_OK;
+    }
+  }
+  /* no data, no length, flags, copy=1, no optdata */
+  return tcp_enqueue_flags(pcb, TCP_FIN);
+}
+
+/**
+ * Enqueue SYN or FIN for transmission.
+ *
+ * Called by @ref tcp_connect, tcp_listen_input, and @ref tcp_close
+ * (via @ref tcp_send_fin)
  *
  * @param pcb Protocol control block for the TCP connection.
  * @param flags TCP header flags to set in the outgoing segment.
@@ -793,17 +1040,12 @@
 
   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);
 
-  /* check for configured max queuelen and possible overflow (FIN flag should always come through!) */
-  if (((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) &&
-      ((flags & TCP_FIN) == 0)) {
-    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("tcp_enqueue_flags: too long queue %"U16_F" (max %"U16_F")\n",
-                                       pcb->snd_queuelen, (u16_t)TCP_SND_QUEUELEN));
-    TCP_STATS_INC(tcp.memerr);
-    pcb->flags |= TF_NAGLEMEMERR;
-    return ERR_MEM;
-  }
+  /* 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
+     only place where a SYN can be sent. */
   if (flags & TCP_SYN) {
     optflags = TF_SEG_OPTS_MSS;
 #if LWIP_WND_SCALE
@@ -813,19 +1055,26 @@
       optflags |= TF_SEG_OPTS_WND_SCALE;
     }
 #endif /* LWIP_WND_SCALE */
+#if LWIP_TCP_SACK_OUT
+    if ((pcb->state != SYN_RCVD) || (pcb->flags & TF_SACK)) {
+      /* In a <SYN,ACK> (sent in state SYN_RCVD), the SACK_PERM option may only
+         be sent if we received a SACK_PERM option from the remote host. */
+      optflags |= TF_SEG_OPTS_SACK_PERM;
+    }
+#endif /* LWIP_TCP_SACK_OUT */
   }
 #if LWIP_TCP_TIMESTAMPS
-  if ((pcb->flags & TF_TIMESTAMP)) {
+  if ((pcb->flags & TF_TIMESTAMP) || ((flags & TCP_SYN) && (pcb->state != SYN_RCVD))) {
     /* Make sure the timestamp option is only included in data segments if we
-       agreed about it with the remote host. */
+       agreed about it with the remote host (and in active open SYN segments). */
     optflags |= TF_SEG_OPTS_TS;
   }
 #endif /* LWIP_TCP_TIMESTAMPS */
-  optlen = LWIP_TCP_OPT_LENGTH(optflags);
+  optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(optflags, pcb);
 
   /* Allocate pbuf with room for TCP header + options */
   if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
-    pcb->flags |= TF_NAGLEMEMERR;
+    tcp_set_flags(pcb, TF_NAGLEMEMERR);
     TCP_STATS_INC(tcp.memerr);
     return ERR_MEM;
   }
@@ -834,7 +1083,7 @@
 
   /* Allocate memory for tcp_seg, and fill in fields. */
   if ((seg = tcp_create_segment(pcb, p, flags, pcb->snd_lbb, optflags)) == NULL) {
-    pcb->flags |= TF_NAGLEMEMERR;
+    tcp_set_flags(pcb, TF_NAGLEMEMERR);
     TCP_STATS_INC(tcp.memerr);
     return ERR_MEM;
   }
@@ -866,7 +1115,7 @@
     /* optlen does not influence snd_buf */
   }
   if (flags & TCP_FIN) {
-    pcb->flags |= TF_FIN;
+    tcp_set_flags(pcb, TF_FIN);
   }
 
   /* update number of segments on the queues */
@@ -874,7 +1123,7 @@
   LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue_flags: %"S16_F" (after enqueued)\n", pcb->snd_queuelen));
   if (pcb->snd_queuelen != 0) {
     LWIP_ASSERT("tcp_enqueue_flags: invalid queue length",
-      pcb->unacked != NULL || pcb->unsent != NULL);
+                pcb->unacked != NULL || pcb->unsent != NULL);
   }
 
   return ERR_OK;
@@ -887,8 +1136,10 @@
  * @param opts option pointer where to store the timestamp option
  */
 static void
-tcp_build_timestamp_option(struct tcp_pcb *pcb, u32_t *opts)
+tcp_build_timestamp_option(const struct tcp_pcb *pcb, u32_t *opts)
 {
+  LWIP_ASSERT("tcp_build_timestamp_option: invalid pcb", pcb != NULL);
+
   /* Pad with two NOP options to make everything nicely aligned */
   opts[0] = PP_HTONL(0x0101080A);
   opts[1] = lwip_htonl(sys_now());
@@ -896,6 +1147,69 @@
 }
 #endif
 
+#if LWIP_TCP_SACK_OUT
+/**
+ * Calculates the number of SACK entries that should be generated.
+ * It takes into account whether TF_SACK flag is set,
+ * the number of SACK entries in tcp_pcb that are valid,
+ * as well as the available options size.
+ *
+ * @param pcb tcp_pcb
+ * @param optlen the length of other TCP options (in bytes)
+ * @return the number of SACK ranges that can be used
+ */
+static u8_t
+tcp_get_num_sacks(const struct tcp_pcb *pcb, u8_t optlen)
+{
+  u8_t num_sacks = 0;
+
+  LWIP_ASSERT("tcp_get_num_sacks: invalid pcb", pcb != NULL);
+
+  if (pcb->flags & TF_SACK) {
+    u8_t i;
+
+    /* The first SACK takes up 12 bytes (it includes SACK header and two NOP options),
+       each additional one - 8 bytes. */
+    optlen += 12;
+
+    /* Max options size = 40, number of SACK array entries = LWIP_TCP_MAX_SACK_NUM */
+    for (i = 0; (i < LWIP_TCP_MAX_SACK_NUM) && (optlen <= TCP_MAX_OPTION_BYTES) &&
+         LWIP_TCP_SACK_VALID(pcb, i); ++i) {
+      ++num_sacks;
+      optlen += 8;
+    }
+  }
+
+  return num_sacks;
+}
+
+/** Build a SACK option (12 or more bytes long) at the specified options pointer)
+ *
+ * @param pcb tcp_pcb
+ * @param opts option pointer where to store the SACK option
+ * @param num_sacks the number of SACKs to store
+ */
+static void
+tcp_build_sack_option(const struct tcp_pcb *pcb, u32_t *opts, u8_t num_sacks)
+{
+  u8_t i;
+
+  LWIP_ASSERT("tcp_build_sack_option: invalid pcb", pcb != NULL);
+  LWIP_ASSERT("tcp_build_sack_option: invalid opts", opts != NULL);
+
+  /* Pad with two NOP options to make everything nicely aligned.
+     We add the length (of just the SACK option, not the NOPs in front of it),
+     which is 2B of header, plus 8B for each SACK. */
+  *(opts++) = PP_HTONL(0x01010500 + 2 + num_sacks * 8);
+
+  for (i = 0; i < num_sacks; ++i) {
+    *(opts++) = lwip_htonl(pcb->rcv_sacks[i].left);
+    *(opts++) = lwip_htonl(pcb->rcv_sacks[i].right);
+  }
+}
+
+#endif
+
 #if LWIP_WND_SCALE
 /** Build a window scale option (3 bytes long) at the specified options pointer)
  *
@@ -904,84 +1218,14 @@
 static void
 tcp_build_wnd_scale_option(u32_t *opts)
 {
+  LWIP_ASSERT("tcp_build_wnd_scale_option: invalid opts", opts != NULL);
+
   /* Pad with one NOP option to make everything nicely aligned */
   opts[0] = PP_HTONL(0x01030300 | TCP_RCV_SCALE);
 }
 #endif
 
 /**
- * Send an ACK without data.
- *
- * @param pcb Protocol control block for the TCP connection to send the ACK
- */
-err_t
-tcp_send_empty_ack(struct tcp_pcb *pcb)
-{
-  err_t err;
-  struct pbuf *p;
-  u8_t optlen = 0;
-  struct netif *netif;
-#if LWIP_TCP_TIMESTAMPS || CHECKSUM_GEN_TCP
-  struct tcp_hdr *tcphdr;
-#endif /* LWIP_TCP_TIMESTAMPS || CHECKSUM_GEN_TCP */
-
-#if LWIP_TCP_TIMESTAMPS
-  if (pcb->flags & TF_TIMESTAMP) {
-    optlen = LWIP_TCP_OPT_LENGTH(TF_SEG_OPTS_TS);
-  }
-#endif
-
-  p = tcp_output_alloc_header(pcb, optlen, 0, lwip_htonl(pcb->snd_nxt));
-  if (p == NULL) {
-    /* let tcp_fasttmr retry sending this ACK */
-    pcb->flags |= (TF_ACK_DELAY | TF_ACK_NOW);
-    LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: (ACK) could not allocate pbuf\n"));
-    return ERR_BUF;
-  }
-#if LWIP_TCP_TIMESTAMPS || CHECKSUM_GEN_TCP
-  tcphdr = (struct tcp_hdr *)p->payload;
-#endif /* LWIP_TCP_TIMESTAMPS || CHECKSUM_GEN_TCP */
-  LWIP_DEBUGF(TCP_OUTPUT_DEBUG,
-              ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt));
-
-  /* NB. MSS and window scale options are only sent on SYNs, so ignore them here */
-#if LWIP_TCP_TIMESTAMPS
-  pcb->ts_lastacksent = pcb->rcv_nxt;
-
-  if (pcb->flags & TF_TIMESTAMP) {
-    tcp_build_timestamp_option(pcb, (u32_t *)(tcphdr + 1));
-  }
-#endif
-
-  netif = ip_route(&pcb->local_ip, &pcb->remote_ip);
-  if (netif == NULL) {
-    err = ERR_RTE;
-  } else {
-#if CHECKSUM_GEN_TCP
-    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) {
-      tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len,
-        &pcb->local_ip, &pcb->remote_ip);
-    }
-#endif
-    NETIF_SET_HWADDRHINT(netif, &(pcb->addr_hint));
-    err = ip_output_if(p, &pcb->local_ip, &pcb->remote_ip,
-      pcb->ttl, pcb->tos, IP_PROTO_TCP, netif);
-    NETIF_SET_HWADDRHINT(netif, NULL);
-  }
-  pbuf_free(p);
-
-  if (err != ERR_OK) {
-    /* let tcp_fasttmr retry sending this ACK */
-    pcb->flags |= (TF_ACK_DELAY | TF_ACK_NOW);
-  } else {
-    /* remove ACK flags from the PCB, as we sent an empty ACK now */
-    pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
-  }
-
-  return err;
-}
-
-/**
  * @ingroup tcp_raw
  * Find out what we can send and send it
  *
@@ -1000,9 +1244,12 @@
   s16_t i = 0;
 #endif /* TCP_CWND_DEBUG */
 
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ASSERT("tcp_output: invalid pcb", pcb != NULL);
   /* pcb->state LISTEN not allowed here */
   LWIP_ASSERT("don't call tcp_output for listen-pcbs",
-    pcb->state != LISTEN);
+              pcb->state != LISTEN);
 
   /* First, check if we are invoked by the TCP input processing
      code. If so, we do not output anything. Instead, we rely on the
@@ -1016,25 +1263,31 @@
 
   seg = pcb->unsent;
 
-  /* If the TF_ACK_NOW flag is set and no data will be sent (either
-   * because the ->unsent queue is empty or because the window does
-   * not allow it), construct an empty ACK segment and send it.
-   *
-   * If data is to be sent, we will just piggyback the ACK (see below).
-   */
-  if (pcb->flags & TF_ACK_NOW &&
-     (seg == NULL ||
-      lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) {
-     return tcp_send_empty_ack(pcb);
+  if (seg == NULL) {
+    LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: nothing to send (%p)\n",
+                                   (void *)pcb->unsent));
+    LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"TCPWNDSIZE_F
+                                 ", cwnd %"TCPWNDSIZE_F", wnd %"U32_F
+                                 ", seg == NULL, ack %"U32_F"\n",
+                                 pcb->snd_wnd, pcb->cwnd, wnd, pcb->lastack));
+
+    /* If the TF_ACK_NOW flag is set and the ->unsent queue is empty, construct
+     * an empty ACK segment and send it. */
+    if (pcb->flags & TF_ACK_NOW) {
+      return tcp_send_empty_ack(pcb);
+    }
+    /* nothing to send: shortcut out of here */
+    goto output_done;
+  } else {
+    LWIP_DEBUGF(TCP_CWND_DEBUG,
+                ("tcp_output: snd_wnd %"TCPWNDSIZE_F", cwnd %"TCPWNDSIZE_F", wnd %"U32_F
+                 ", effwnd %"U32_F", seq %"U32_F", ack %"U32_F"\n",
+                 pcb->snd_wnd, pcb->cwnd, wnd,
+                 lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len,
+                 lwip_ntohl(seg->tcphdr->seqno), pcb->lastack));
   }
 
-  /* useg should point to last segment on unacked queue */
-  useg = pcb->unacked;
-  if (useg != NULL) {
-    for (; useg->next != NULL; useg = useg->next);
-  }
-
-  netif = ip_route(&pcb->local_ip, &pcb->remote_ip);
+  netif = tcp_route(pcb, &pcb->local_ip, &pcb->remote_ip);
   if (netif == NULL) {
     return ERR_RTE;
   }
@@ -1048,45 +1301,33 @@
     ip_addr_copy(pcb->local_ip, *local_ip);
   }
 
-#if TCP_OUTPUT_DEBUG
-  if (seg == NULL) {
-    LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: nothing to send (%p)\n",
-                                   (void*)pcb->unsent));
-  }
-#endif /* TCP_OUTPUT_DEBUG */
-#if TCP_CWND_DEBUG
-  if (seg == NULL) {
-    LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"TCPWNDSIZE_F
-                                 ", cwnd %"TCPWNDSIZE_F", wnd %"U32_F
-                                 ", seg == NULL, ack %"U32_F"\n",
-                                 pcb->snd_wnd, pcb->cwnd, wnd, pcb->lastack));
-  } else {
-    LWIP_DEBUGF(TCP_CWND_DEBUG,
-                ("tcp_output: snd_wnd %"TCPWNDSIZE_F", cwnd %"TCPWNDSIZE_F", wnd %"U32_F
-                 ", effwnd %"U32_F", seq %"U32_F", ack %"U32_F"\n",
-                 pcb->snd_wnd, pcb->cwnd, wnd,
-                 lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len,
-                 lwip_ntohl(seg->tcphdr->seqno), pcb->lastack));
-  }
-#endif /* TCP_CWND_DEBUG */
-  /* Check if we need to start the persistent timer when the next unsent segment
-   * does not fit within the remaining send window and RTO timer is not running (we
-   * have no in-flight data). A traditional approach would fill the remaining window
-   * with part of the unsent segment (which will engage zero-window probing upon
-   * reception of the zero window update from the receiver). This ensures the
-   * subsequent window update is reliably received. With the goal of being lightweight,
-   * we avoid splitting the unsent segment and treat the window as already zero.
-   */
-  if (seg != NULL &&
-      lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd &&
-      wnd > 0 && wnd == pcb->snd_wnd && pcb->unacked == NULL) {
-    /* Start the persist timer */
-    if (pcb->persist_backoff == 0) {
+  /* Handle the current segment not fitting within the window */
+  if (lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd) {
+    /* We need to start the persistent timer when the next unsent segment does not fit
+     * within the remaining (could be 0) send window and RTO timer is not running (we
+     * have no in-flight data). If window is still too small after persist timer fires,
+     * then we split the segment. We don't consider the congestion window since a cwnd
+     * smaller than 1 SMSS implies in-flight data
+     */
+    if (wnd == pcb->snd_wnd && pcb->unacked == NULL && pcb->persist_backoff == 0) {
       pcb->persist_cnt = 0;
       pcb->persist_backoff = 1;
+      pcb->persist_probe = 0;
+    }
+    /* We need an ACK, but can't send data now, so send an empty ACK */
+    if (pcb->flags & TF_ACK_NOW) {
+      return tcp_send_empty_ack(pcb);
     }
     goto output_done;
   }
+  /* Stop persist timer, above conditions are not active */
+  pcb->persist_backoff = 0;
+
+  /* useg should point to last segment on unacked queue */
+  useg = pcb->unacked;
+  if (useg != NULL) {
+    for (; useg->next != NULL; useg = useg->next);
+  }
   /* data available and window allows it to be sent? */
   while (seg != NULL &&
          lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) {
@@ -1100,15 +1341,15 @@
      *   RST is no sent using tcp_write/tcp_output.
      */
     if ((tcp_do_output_nagle(pcb) == 0) &&
-      ((pcb->flags & (TF_NAGLEMEMERR | TF_FIN)) == 0)) {
+        ((pcb->flags & (TF_NAGLEMEMERR | TF_FIN)) == 0)) {
       break;
     }
 #if TCP_CWND_DEBUG
     LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"TCPWNDSIZE_F", cwnd %"TCPWNDSIZE_F", wnd %"U32_F", effwnd %"U32_F", seq %"U32_F", ack %"U32_F", i %"S16_F"\n",
-                            pcb->snd_wnd, pcb->cwnd, wnd,
-                            lwip_ntohl(seg->tcphdr->seqno) + seg->len -
-                            pcb->lastack,
-                            lwip_ntohl(seg->tcphdr->seqno), pcb->lastack, i));
+                                 pcb->snd_wnd, pcb->cwnd, wnd,
+                                 lwip_ntohl(seg->tcphdr->seqno) + seg->len -
+                                 pcb->lastack,
+                                 lwip_ntohl(seg->tcphdr->seqno), pcb->lastack, i));
     ++i;
 #endif /* TCP_CWND_DEBUG */
 
@@ -1116,18 +1357,18 @@
       TCPH_SET_FLAG(seg->tcphdr, TCP_ACK);
     }
 
-#if TCP_OVERSIZE_DBGCHECK
-    seg->oversize_left = 0;
-#endif /* TCP_OVERSIZE_DBGCHECK */
     err = tcp_output_segment(seg, pcb, netif);
     if (err != ERR_OK) {
       /* segment could not be sent, for whatever reason */
-      pcb->flags |= TF_NAGLEMEMERR;
+      tcp_set_flags(pcb, TF_NAGLEMEMERR);
       return err;
     }
+#if TCP_OVERSIZE_DBGCHECK
+    seg->oversize_left = 0;
+#endif /* TCP_OVERSIZE_DBGCHECK */
     pcb->unsent = seg->next;
     if (pcb->state != SYN_SENT) {
-      pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
+      tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW);
     }
     snd_nxt = lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg);
     if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) {
@@ -1140,7 +1381,7 @@
       if (pcb->unacked == NULL) {
         pcb->unacked = seg;
         useg = seg;
-      /* unacked list is not empty? */
+        /* unacked list is not empty? */
       } else {
         /* In the case of fast retransmit, the packet should not go to the tail
          * of the unacked queue, but rather somewhere before it. We need to check for
@@ -1149,8 +1390,8 @@
           /* add segment to before tail of unacked list, keeping the list sorted */
           struct tcp_seg **cur_seg = &(pcb->unacked);
           while (*cur_seg &&
-            TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) {
-              cur_seg = &((*cur_seg)->next );
+                 TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) {
+            cur_seg = &((*cur_seg)->next );
           }
           seg->next = (*cur_seg);
           (*cur_seg) = seg;
@@ -1160,13 +1401,12 @@
           useg = useg->next;
         }
       }
-    /* do not queue empty segments on the unacked list */
+      /* do not queue empty segments on the unacked list */
     } else {
       tcp_seg_free(seg);
     }
     seg = pcb->unsent;
   }
-output_done:
 #if TCP_OVERSIZE
   if (pcb->unsent == NULL) {
     /* last unsent has been removed, reset unsent_oversize */
@@ -1174,10 +1414,36 @@
   }
 #endif /* TCP_OVERSIZE */
 
-  pcb->flags &= ~TF_NAGLEMEMERR;
+output_done:
+  tcp_clear_flags(pcb, TF_NAGLEMEMERR);
   return ERR_OK;
 }
 
+/** Check if a segment's pbufs are used by someone else than TCP.
+ * This can happen on retransmission if the pbuf of this segment is still
+ * referenced by the netif driver due to deferred transmission.
+ * This is the case (only!) if someone down the TX call path called
+ * pbuf_ref() on one of the pbufs!
+ *
+ * @arg seg the tcp segment to check
+ * @return 1 if ref != 1, 0 if ref == 1
+ */
+static int
+tcp_output_segment_busy(const struct tcp_seg *seg)
+{
+  LWIP_ASSERT("tcp_output_segment_busy: invalid seg", seg != NULL);
+
+  /* We only need to check the first pbuf here:
+     If a pbuf is queued for transmission, a driver calls pbuf_ref(),
+     which only changes the ref count of the first pbuf */
+  if (seg->p->ref != 1) {
+    /* other reference found */
+    return 1;
+  }
+  /* no other references found */
+  return 0;
+}
+
 /**
  * Called by tcp_output() to actually send a TCP segment over IP.
  *
@@ -1191,11 +1457,18 @@
   err_t err;
   u16_t len;
   u32_t *opts;
+#if TCP_CHECKSUM_ON_COPY
+  int seg_chksum_was_swapped = 0;
+#endif
 
-  if (seg->p->ref != 1) {
-    /* This can happen if the pbuf of this segment is still referenced by the
-       netif driver due to deferred transmission. Since this function modifies
-       p->len, we must not continue in this case. */
+  LWIP_ASSERT("tcp_output_segment: invalid seg", seg != NULL);
+  LWIP_ASSERT("tcp_output_segment: invalid pcb", pcb != NULL);
+  LWIP_ASSERT("tcp_output_segment: invalid netif", netif != NULL);
+
+  if (tcp_output_segment_busy(seg)) {
+    /* This should not happen: rexmit functions should have checked this.
+       However, since this function modifies p->len, we must not continue in this case. */
+    LWIP_DEBUGF(TCP_RTO_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_output_segment: segment busy\n"));
     return ERR_OK;
   }
 
@@ -1224,7 +1497,7 @@
   if (seg->flags & TF_SEG_OPTS_MSS) {
     u16_t mss;
 #if TCP_CALCULATE_EFF_SEND_MSS
-    mss = tcp_eff_send_mss(TCP_MSS, &pcb->local_ip, &pcb->remote_ip);
+    mss = tcp_eff_send_mss_netif(TCP_MSS, netif, &pcb->remote_ip);
 #else /* TCP_CALCULATE_EFF_SEND_MSS */
     mss = TCP_MSS;
 #endif /* TCP_CALCULATE_EFF_SEND_MSS */
@@ -1245,6 +1518,16 @@
     opts += 1;
   }
 #endif
+#if LWIP_TCP_SACK_OUT
+  if (seg->flags & TF_SEG_OPTS_SACK_PERM) {
+    /* Pad with two NOP options to make everything nicely aligned
+     * NOTE: When we send both timestamp and SACK_PERM options,
+     * we could use the first two NOPs before the timestamp to store SACK_PERM option,
+     * but that would complicate the code.
+     */
+    *(opts++) = PP_HTONL(0x01010402);
+  }
+#endif
 
   /* Set retransmission timer running if it is not currently enabled
      This must be set before checking the route. */
@@ -1259,8 +1542,8 @@
     LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_output_segment: rtseq %"U32_F"\n", pcb->rtseq));
   }
   LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output_segment: %"U32_F":%"U32_F"\n",
-          lwip_htonl(seg->tcphdr->seqno), lwip_htonl(seg->tcphdr->seqno) +
-          seg->len));
+                                 lwip_htonl(seg->tcphdr->seqno), lwip_htonl(seg->tcphdr->seqno) +
+                                 seg->len));
 
   len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload);
   if (len == 0) {
@@ -1274,138 +1557,101 @@
   seg->p->payload = seg->tcphdr;
 
   seg->tcphdr->chksum = 0;
+
+#ifdef LWIP_HOOK_TCP_OUT_ADD_TCPOPTS
+  opts = LWIP_HOOK_TCP_OUT_ADD_TCPOPTS(seg->p, seg->tcphdr, pcb, opts);
+#endif
+  LWIP_ASSERT("options not filled", (u8_t *)opts == ((u8_t *)(seg->tcphdr + 1)) + LWIP_TCP_OPT_LENGTH_SEGMENT(seg->flags, pcb));
+
 #if CHECKSUM_GEN_TCP
   IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) {
 #if TCP_CHECKSUM_ON_COPY
     u32_t acc;
 #if TCP_CHECKSUM_ON_COPY_SANITY_CHECK
     u16_t chksum_slow = ip_chksum_pseudo(seg->p, IP_PROTO_TCP,
-      seg->p->tot_len, &pcb->local_ip, &pcb->remote_ip);
+                                         seg->p->tot_len, &pcb->local_ip, &pcb->remote_ip);
 #endif /* TCP_CHECKSUM_ON_COPY_SANITY_CHECK */
     if ((seg->flags & TF_SEG_DATA_CHECKSUMMED) == 0) {
       LWIP_ASSERT("data included but not checksummed",
-        seg->p->tot_len == (TCPH_HDRLEN(seg->tcphdr) * 4));
+                  seg->p->tot_len == TCPH_HDRLEN_BYTES(seg->tcphdr));
     }
 
     /* rebuild TCP header checksum (TCP header changes for retransmissions!) */
     acc = ip_chksum_pseudo_partial(seg->p, IP_PROTO_TCP,
-      seg->p->tot_len, TCPH_HDRLEN(seg->tcphdr) * 4, &pcb->local_ip, &pcb->remote_ip);
+                                   seg->p->tot_len, TCPH_HDRLEN_BYTES(seg->tcphdr), &pcb->local_ip, &pcb->remote_ip);
     /* add payload checksum */
     if (seg->chksum_swapped) {
+      seg_chksum_was_swapped = 1;
       seg->chksum = SWAP_BYTES_IN_WORD(seg->chksum);
       seg->chksum_swapped = 0;
     }
-    acc += (u16_t)~(seg->chksum);
-    seg->tcphdr->chksum = FOLD_U32T(acc);
+    acc = (u16_t)~acc + seg->chksum;
+    seg->tcphdr->chksum = (u16_t)~FOLD_U32T(acc);
 #if TCP_CHECKSUM_ON_COPY_SANITY_CHECK
     if (chksum_slow != seg->tcphdr->chksum) {
       TCP_CHECKSUM_ON_COPY_SANITY_CHECK_FAIL(
-                  ("tcp_output_segment: calculated checksum is %"X16_F" instead of %"X16_F"\n",
-                  seg->tcphdr->chksum, chksum_slow));
+        ("tcp_output_segment: calculated checksum is %"X16_F" instead of %"X16_F"\n",
+         seg->tcphdr->chksum, chksum_slow));
       seg->tcphdr->chksum = chksum_slow;
     }
 #endif /* TCP_CHECKSUM_ON_COPY_SANITY_CHECK */
 #else /* TCP_CHECKSUM_ON_COPY */
     seg->tcphdr->chksum = ip_chksum_pseudo(seg->p, IP_PROTO_TCP,
-      seg->p->tot_len, &pcb->local_ip, &pcb->remote_ip);
+                                           seg->p->tot_len, &pcb->local_ip, &pcb->remote_ip);
 #endif /* TCP_CHECKSUM_ON_COPY */
   }
 #endif /* CHECKSUM_GEN_TCP */
   TCP_STATS_INC(tcp.xmit);
 
-  NETIF_SET_HWADDRHINT(netif, &(pcb->addr_hint));
+  NETIF_SET_HINTS(netif, &(pcb->netif_hints));
   err = ip_output_if(seg->p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl,
-    pcb->tos, IP_PROTO_TCP, netif);
-  NETIF_SET_HWADDRHINT(netif, NULL);
+                     pcb->tos, IP_PROTO_TCP, netif);
+  NETIF_RESET_HINTS(netif);
+
+#if TCP_CHECKSUM_ON_COPY
+  if (seg_chksum_was_swapped) {
+    /* if data is added to this segment later, chksum needs to be swapped,
+       so restore this now */
+    seg->chksum = SWAP_BYTES_IN_WORD(seg->chksum);
+    seg->chksum_swapped = 1;
+  }
+#endif
+
   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 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(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;
-  struct tcp_hdr *tcphdr;
-  struct netif *netif;
-  p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM);
-  if (p == NULL) {
-    LWIP_DEBUGF(TCP_DEBUG, ("tcp_rst: could not allocate memory for pbuf\n"));
-    return;
-  }
-  LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr",
-              (p->len >= sizeof(struct tcp_hdr)));
-
-  tcphdr = (struct tcp_hdr *)p->payload;
-  tcphdr->src = lwip_htons(local_port);
-  tcphdr->dest = lwip_htons(remote_port);
-  tcphdr->seqno = lwip_htonl(seqno);
-  tcphdr->ackno = lwip_htonl(ackno);
-  TCPH_HDRLEN_FLAGS_SET(tcphdr, TCP_HLEN/4, TCP_RST | TCP_ACK);
-#if LWIP_WND_SCALE
-  tcphdr->wnd = PP_HTONS(((TCP_WND >> TCP_RCV_SCALE) & 0xFFFF));
-#else
-  tcphdr->wnd = PP_HTONS(TCP_WND);
-#endif
-  tcphdr->chksum = 0;
-  tcphdr->urgp = 0;
-
-  TCP_STATS_INC(tcp.xmit);
-  MIB2_STATS_INC(mib2.tcpoutrsts);
-
-  netif = ip_route(local_ip, remote_ip);
-  if (netif != NULL) {
-#if CHECKSUM_GEN_TCP
-    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) {
-      tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len,
-                                        local_ip, remote_ip);
-    }
-#endif
-    /* Send output with hardcoded TTL/HL since we have no access to the pcb */
-    ip_output_if(p, local_ip, remote_ip, TCP_TTL, 0, IP_PROTO_TCP, netif);
-  }
-  pbuf_free(p);
-  LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %"U32_F" ackno %"U32_F".\n", seqno, ackno));
-}
-
-/**
  * Requeue all unacked segments for retransmission
  *
  * Called by tcp_slowtmr() for slow retransmission.
  *
  * @param pcb the tcp_pcb for which to re-enqueue all unacked segments
  */
-void
-tcp_rexmit_rto(struct tcp_pcb *pcb)
+err_t
+tcp_rexmit_rto_prepare(struct tcp_pcb *pcb)
 {
   struct tcp_seg *seg;
 
+  LWIP_ASSERT("tcp_rexmit_rto_prepare: invalid pcb", pcb != NULL);
+
   if (pcb->unacked == NULL) {
-    return;
+    return ERR_VAL;
   }
 
-  /* Move all unacked segments to the head of the unsent queue */
-  for (seg = pcb->unacked; seg->next != NULL; seg = seg->next);
+  /* Move all unacked segments to the head of the unsent queue.
+     However, give up if any of the unsent pbufs are still referenced by the
+     netif driver due to deferred transmission. No point loading the link further
+     if it is struggling to flush its buffered writes. */
+  for (seg = pcb->unacked; seg->next != NULL; seg = seg->next) {
+    if (tcp_output_segment_busy(seg)) {
+      LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_rexmit_rto: segment busy\n"));
+      return ERR_VAL;
+    }
+  }
+  if (tcp_output_segment_busy(seg)) {
+    LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_rexmit_rto: segment busy\n"));
+    return ERR_VAL;
+  }
   /* concatenate unsent queue after unacked queue */
   seg->next = pcb->unsent;
 #if TCP_OVERSIZE_DBGCHECK
@@ -1419,44 +1665,90 @@
   /* unacked queue is now empty */
   pcb->unacked = NULL;
 
+  /* Mark RTO in-progress */
+  tcp_set_flags(pcb, TF_RTO);
+  /* Record the next byte following retransmit */
+  pcb->rto_end = lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg);
+  /* Don't take any RTT measurements after retransmitting. */
+  pcb->rttest = 0;
+
+  return ERR_OK;
+}
+
+/**
+ * Requeue all unacked segments for retransmission
+ *
+ * Called by tcp_slowtmr() for slow retransmission.
+ *
+ * @param pcb the tcp_pcb for which to re-enqueue all unacked segments
+ */
+void
+tcp_rexmit_rto_commit(struct tcp_pcb *pcb)
+{
+  LWIP_ASSERT("tcp_rexmit_rto_commit: invalid pcb", pcb != NULL);
+
   /* increment number of retransmissions */
   if (pcb->nrtx < 0xFF) {
     ++pcb->nrtx;
   }
-
-  /* Don't take any RTT measurements after retransmitting. */
-  pcb->rttest = 0;
-
   /* Do the actual retransmission */
   tcp_output(pcb);
 }
 
 /**
+ * Requeue all unacked segments for retransmission
+ *
+ * Called by tcp_process() only, tcp_slowtmr() needs to do some things between
+ * "prepare" and "commit".
+ *
+ * @param pcb the tcp_pcb for which to re-enqueue all unacked segments
+ */
+void
+tcp_rexmit_rto(struct tcp_pcb *pcb)
+{
+  LWIP_ASSERT("tcp_rexmit_rto: invalid pcb", pcb != NULL);
+
+  if (tcp_rexmit_rto_prepare(pcb) == ERR_OK) {
+    tcp_rexmit_rto_commit(pcb);
+  }
+}
+
+/**
  * Requeue the first unacked segment for retransmission
  *
  * Called by tcp_receive() for fast retransmit.
  *
  * @param pcb the tcp_pcb for which to retransmit the first unacked segment
  */
-void
+err_t
 tcp_rexmit(struct tcp_pcb *pcb)
 {
   struct tcp_seg *seg;
   struct tcp_seg **cur_seg;
 
+  LWIP_ASSERT("tcp_rexmit: invalid pcb", pcb != NULL);
+
   if (pcb->unacked == NULL) {
-    return;
+    return ERR_VAL;
+  }
+
+  seg = pcb->unacked;
+
+  /* Give up if the segment is still referenced by the netif driver
+     due to deferred transmission. */
+  if (tcp_output_segment_busy(seg)) {
+    LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_rexmit busy\n"));
+    return ERR_VAL;
   }
 
   /* Move the first unacked segment to the unsent queue */
   /* Keep the unsent queue sorted. */
-  seg = pcb->unacked;
   pcb->unacked = seg->next;
 
   cur_seg = &(pcb->unsent);
   while (*cur_seg &&
-    TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) {
-      cur_seg = &((*cur_seg)->next );
+         TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) {
+    cur_seg = &((*cur_seg)->next );
   }
   seg->next = *cur_seg;
   *cur_seg = seg;
@@ -1478,6 +1770,7 @@
   MIB2_STATS_INC(mib2.tcpretranssegs);
   /* No need to call tcp_output: we are always called from tcp_input()
      and thus tcp_output directly returns. */
+  return ERR_OK;
 }
 
 
@@ -1489,6 +1782,8 @@
 void
 tcp_rexmit_fast(struct tcp_pcb *pcb)
 {
+  LWIP_ASSERT("tcp_rexmit_fast: invalid pcb", pcb != NULL);
+
   if (pcb->unacked != NULL && !(pcb->flags & TF_INFR)) {
     /* This is fast retransmit. Retransmit the first unacked segment. */
     LWIP_DEBUGF(TCP_FR_DEBUG,
@@ -1496,29 +1791,280 @@
                  "), fast retransmit %"U32_F"\n",
                  (u16_t)pcb->dupacks, pcb->lastack,
                  lwip_ntohl(pcb->unacked->tcphdr->seqno)));
-    tcp_rexmit(pcb);
+    if (tcp_rexmit(pcb) == ERR_OK) {
+      /* Set ssthresh to half of the minimum of the current
+       * cwnd and the advertised window */
+      pcb->ssthresh = LWIP_MIN(pcb->cwnd, pcb->snd_wnd) / 2;
 
-    /* Set ssthresh to half of the minimum of the current
-     * cwnd and the advertised window */
-    pcb->ssthresh = LWIP_MIN(pcb->cwnd, pcb->snd_wnd) / 2;
+      /* The minimum value for ssthresh should be 2 MSS */
+      if (pcb->ssthresh < (2U * pcb->mss)) {
+        LWIP_DEBUGF(TCP_FR_DEBUG,
+                    ("tcp_receive: The minimum value for ssthresh %"TCPWNDSIZE_F
+                     " should be min 2 mss %"U16_F"...\n",
+                     pcb->ssthresh, (u16_t)(2 * pcb->mss)));
+        pcb->ssthresh = 2 * pcb->mss;
+      }
 
-    /* The minimum value for ssthresh should be 2 MSS */
-    if (pcb->ssthresh < (2U * pcb->mss)) {
-      LWIP_DEBUGF(TCP_FR_DEBUG,
-                  ("tcp_receive: The minimum value for ssthresh %"TCPWNDSIZE_F
-                   " should be min 2 mss %"U16_F"...\n",
-                   pcb->ssthresh, (u16_t)(2*pcb->mss)));
-      pcb->ssthresh = 2*pcb->mss;
+      pcb->cwnd = pcb->ssthresh + 3 * pcb->mss;
+      tcp_set_flags(pcb, TF_INFR);
+
+      /* Reset the retransmission timer to prevent immediate rto retransmissions */
+      pcb->rtime = 0;
     }
-
-    pcb->cwnd = pcb->ssthresh + 3 * pcb->mss;
-    pcb->flags |= TF_INFR;
-
-    /* Reset the retransmission timer to prevent immediate rto retransmissions */
-    pcb->rtime = 0;
   }
 }
 
+static struct pbuf *
+tcp_output_alloc_header_common(u32_t ackno, u16_t optlen, u16_t datalen,
+                        u32_t seqno_be /* already in network byte order */,
+                        u16_t src_port, u16_t dst_port, u8_t flags, u16_t wnd)
+{
+  struct tcp_hdr *tcphdr;
+  struct pbuf *p;
+
+  p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM);
+  if (p != NULL) {
+    LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr",
+                (p->len >= TCP_HLEN + optlen));
+    tcphdr = (struct tcp_hdr *)p->payload;
+    tcphdr->src = lwip_htons(src_port);
+    tcphdr->dest = lwip_htons(dst_port);
+    tcphdr->seqno = seqno_be;
+    tcphdr->ackno = lwip_htonl(ackno);
+    TCPH_HDRLEN_FLAGS_SET(tcphdr, (5 + optlen / 4), flags);
+    tcphdr->wnd = lwip_htons(wnd);
+    tcphdr->chksum = 0;
+    tcphdr->urgp = 0;
+  }
+  return p;
+}
+
+/** Allocate a pbuf and create a tcphdr at p->payload, used for output
+ * functions other than the default tcp_output -> tcp_output_segment
+ * (e.g. tcp_send_empty_ack, etc.)
+ *
+ * @param pcb tcp pcb for which to send a packet (used to initialize tcp_hdr)
+ * @param optlen length of header-options
+ * @param datalen length of tcp data to reserve in pbuf
+ * @param seqno_be seqno in network byte order (big-endian)
+ * @return pbuf with p->payload being the tcp_hdr
+ */
+static struct pbuf *
+tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen,
+                        u32_t seqno_be /* already in network byte order */)
+{
+  struct pbuf *p;
+
+  LWIP_ASSERT("tcp_output_alloc_header: invalid pcb", pcb != NULL);
+
+  p = tcp_output_alloc_header_common(pcb->rcv_nxt, optlen, datalen,
+    seqno_be, pcb->local_port, pcb->remote_port, TCP_ACK,
+    TCPWND_MIN16(RCV_WND_SCALE(pcb, pcb->rcv_ann_wnd)));
+  if (p != NULL) {
+    /* If we're sending a packet, update the announced right window edge */
+    pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;
+  }
+  return p;
+}
+
+/* Fill in options for control segments */
+static void
+tcp_output_fill_options(const struct tcp_pcb *pcb, struct pbuf *p, u8_t optflags, u8_t num_sacks)
+{
+  struct tcp_hdr *tcphdr;
+  u32_t *opts;
+  u16_t sacks_len = 0;
+
+  LWIP_ASSERT("tcp_output_fill_options: invalid pbuf", p != NULL);
+
+  tcphdr = (struct tcp_hdr *)p->payload;
+  opts = (u32_t *)(void *)(tcphdr + 1);
+
+  /* NB. MSS and window scale options are only sent on SYNs, so ignore them here */
+
+#if LWIP_TCP_TIMESTAMPS
+  if (optflags & TF_SEG_OPTS_TS) {
+    tcp_build_timestamp_option(pcb, opts);
+    opts += 3;
+  }
+#endif
+
+#if LWIP_TCP_SACK_OUT
+  if (pcb && (num_sacks > 0)) {
+    tcp_build_sack_option(pcb, opts, num_sacks);
+    /* 1 word for SACKs header (including 2xNOP), and 2 words for each SACK */
+    sacks_len = 1 + num_sacks * 2;
+    opts += sacks_len;
+  }
+#else
+  LWIP_UNUSED_ARG(num_sacks);
+#endif
+
+#ifdef LWIP_HOOK_TCP_OUT_ADD_TCPOPTS
+  opts = LWIP_HOOK_TCP_OUT_ADD_TCPOPTS(p, tcphdr, pcb, opts);
+#endif
+
+  LWIP_UNUSED_ARG(pcb);
+  LWIP_UNUSED_ARG(sacks_len);
+  LWIP_ASSERT("options not filled", (u8_t *)opts == ((u8_t *)(tcphdr + 1)) + sacks_len * 4 + LWIP_TCP_OPT_LENGTH_SEGMENT(optflags, pcb));
+  LWIP_UNUSED_ARG(optflags); /* for LWIP_NOASSERT */
+  LWIP_UNUSED_ARG(opts); /* for LWIP_NOASSERT */
+}
+
+/** Output a control segment pbuf to IP.
+ *
+ * Called from tcp_rst, tcp_send_empty_ack, tcp_keepalive and tcp_zero_window_probe,
+ * this function combines selecting a netif for transmission, generating the tcp
+ * header checksum and calling ip_output_if while handling netif hints and stats.
+ */
+static err_t
+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;
+}
+
+/**
+ * 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)
+{
+  struct pbuf *p;
+  u16_t wnd;
+  u8_t optlen;
+
+  LWIP_ASSERT("tcp_rst: invalid local_ip", local_ip != NULL);
+  LWIP_ASSERT("tcp_rst: invalid remote_ip", remote_ip != NULL);
+
+  optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(0, pcb);
+
+#if LWIP_WND_SCALE
+  wnd = PP_HTONS(((TCP_WND >> TCP_RCV_SCALE) & 0xFFFF));
+#else
+  wnd = PP_HTONS(TCP_WND);
+#endif
+
+  p = tcp_output_alloc_header_common(ackno, optlen, 0, lwip_htonl(seqno), local_port,
+    remote_port, TCP_RST | TCP_ACK, wnd);
+  if (p == NULL) {
+    LWIP_DEBUGF(TCP_DEBUG, ("tcp_rst: could not allocate memory for pbuf\n"));
+    return;
+  }
+  tcp_output_fill_options(pcb, p, 0, optlen);
+
+  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));
+}
+
+/**
+ * Send an ACK without data.
+ *
+ * @param pcb Protocol control block for the TCP connection to send the ACK
+ */
+err_t
+tcp_send_empty_ack(struct tcp_pcb *pcb)
+{
+  err_t err;
+  struct pbuf *p;
+  u8_t optlen, optflags = 0;
+  u8_t num_sacks = 0;
+
+  LWIP_ASSERT("tcp_send_empty_ack: invalid pcb", pcb != NULL);
+
+#if LWIP_TCP_TIMESTAMPS
+  if (pcb->flags & TF_TIMESTAMP) {
+    optflags = TF_SEG_OPTS_TS;
+  }
+#endif
+  optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(optflags, pcb);
+
+#if LWIP_TCP_SACK_OUT
+  /* For now, SACKs are only sent with empty ACKs */
+  if ((num_sacks = tcp_get_num_sacks(pcb, optlen)) > 0) {
+    optlen += 4 + num_sacks * 8; /* 4 bytes for header (including 2*NOP), plus 8B for each SACK */
+  }
+#endif
+
+  p = tcp_output_alloc_header(pcb, optlen, 0, lwip_htonl(pcb->snd_nxt));
+  if (p == NULL) {
+    /* let tcp_fasttmr retry sending this ACK */
+    tcp_set_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW);
+    LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: (ACK) could not allocate pbuf\n"));
+    return ERR_BUF;
+  }
+  tcp_output_fill_options(pcb, p, optflags, num_sacks);
+
+#if LWIP_TCP_TIMESTAMPS
+  pcb->ts_lastacksent = pcb->rcv_nxt;
+#endif
+
+  LWIP_DEBUGF(TCP_OUTPUT_DEBUG,
+              ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt));
+  err = tcp_output_control_segment(pcb, p, &pcb->local_ip, &pcb->remote_ip);
+  if (err != ERR_OK) {
+    /* let tcp_fasttmr retry sending this ACK */
+    tcp_set_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW);
+  } else {
+    /* remove ACK flags from the PCB, as we sent an empty ACK now */
+    tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW);
+  }
+
+  return err;
+}
 
 /**
  * Send keepalive packets to keep a connection active although
@@ -1533,47 +2079,31 @@
 {
   err_t err;
   struct pbuf *p;
-  struct netif *netif;
+  u8_t optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(0, pcb);
+
+  LWIP_ASSERT("tcp_keepalive: invalid pcb", pcb != NULL);
 
   LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: sending KEEPALIVE probe to "));
-  ip_addr_debug_print(TCP_DEBUG, &pcb->remote_ip);
+  ip_addr_debug_print_val(TCP_DEBUG, pcb->remote_ip);
   LWIP_DEBUGF(TCP_DEBUG, ("\n"));
 
   LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: tcp_ticks %"U32_F"   pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n",
                           tcp_ticks, pcb->tmr, (u16_t)pcb->keep_cnt_sent));
 
-  p = tcp_output_alloc_header(pcb, 0, 0, lwip_htonl(pcb->snd_nxt - 1));
+  p = tcp_output_alloc_header(pcb, optlen, 0, lwip_htonl(pcb->snd_nxt - 1));
   if (p == NULL) {
     LWIP_DEBUGF(TCP_DEBUG,
                 ("tcp_keepalive: could not allocate memory for pbuf\n"));
     return ERR_MEM;
   }
-  netif = ip_route(&pcb->local_ip, &pcb->remote_ip);
-  if (netif == NULL) {
-    err = ERR_RTE;
-  } else {
-#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,
-        &pcb->local_ip, &pcb->remote_ip);
-    }
-#endif /* CHECKSUM_GEN_TCP */
-    TCP_STATS_INC(tcp.xmit);
-
-    /* Send output to IP */
-    NETIF_SET_HWADDRHINT(netif, &(pcb->addr_hint));
-    err = ip_output_if(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP, netif);
-    NETIF_SET_HWADDRHINT(netif, NULL);
-  }
-  pbuf_free(p);
+  tcp_output_fill_options(pcb, p, 0, optlen);
+  err = tcp_output_control_segment(pcb, p, &pcb->local_ip, &pcb->remote_ip);
 
   LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: seqno %"U32_F" ackno %"U32_F" err %d.\n",
                           pcb->snd_nxt - 1, pcb->rcv_nxt, (int)err));
   return err;
 }
 
-
 /**
  * Send persist timer zero-window probes to keep a connection active
  * when a window update is lost.
@@ -1592,10 +2122,12 @@
   u16_t len;
   u8_t is_fin;
   u32_t snd_nxt;
-  struct netif *netif;
+  u8_t optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(0, pcb);
+
+  LWIP_ASSERT("tcp_zero_window_probe: invalid pcb", pcb != NULL);
 
   LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: sending ZERO WINDOW probe to "));
-  ip_addr_debug_print(TCP_DEBUG, &pcb->remote_ip);
+  ip_addr_debug_print_val(TCP_DEBUG, pcb->remote_ip);
   LWIP_DEBUGF(TCP_DEBUG, ("\n"));
 
   LWIP_DEBUGF(TCP_DEBUG,
@@ -1603,21 +2135,26 @@
                "   pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n",
                tcp_ticks, pcb->tmr, (u16_t)pcb->keep_cnt_sent));
 
-  seg = pcb->unacked;
-
+  /* Only consider unsent, persist timer should be off when there is data in-flight */
+  seg = pcb->unsent;
   if (seg == NULL) {
-    seg = pcb->unsent;
-  }
-  if (seg == NULL) {
-    /* nothing to send, zero window probe not needed */
+    /* Not expected, persist timer should be off when the send buffer is empty */
     return ERR_OK;
   }
 
+  /* increment probe count. NOTE: we record probe even if it fails
+     to actually transmit due to an error. This ensures memory exhaustion/
+     routing problem doesn't leave a zero-window pcb as an indefinite zombie.
+     RTO mechanism has similar behavior, see pcb->nrtx */
+  if (pcb->persist_probe < 0xFF) {
+    ++pcb->persist_probe;
+  }
+
   is_fin = ((TCPH_FLAGS(seg->tcphdr) & TCP_FIN) != 0) && (seg->len == 0);
   /* we want to send one seqno: either FIN or data (no options) */
   len = is_fin ? 0 : 1;
 
-  p = tcp_output_alloc_header(pcb, 0, len, seg->tcphdr->seqno);
+  p = tcp_output_alloc_header(pcb, optlen, len, seg->tcphdr->seqno);
   if (p == NULL) {
     LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: no memory for pbuf\n"));
     return ERR_MEM;
@@ -1641,27 +2178,9 @@
   if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) {
     pcb->snd_nxt = snd_nxt;
   }
+  tcp_output_fill_options(pcb, p, 0, optlen);
 
-  netif = ip_route(&pcb->local_ip, &pcb->remote_ip);
-  if (netif == NULL) {
-    err = ERR_RTE;
-  } else {
-#if CHECKSUM_GEN_TCP
-    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) {
-      tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len,
-        &pcb->local_ip, &pcb->remote_ip);
-    }
-#endif
-    TCP_STATS_INC(tcp.xmit);
-
-    /* Send output to IP */
-    NETIF_SET_HWADDRHINT(netif, &(pcb->addr_hint));
-    err = ip_output_if(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl,
-      0, IP_PROTO_TCP, netif);
-    NETIF_SET_HWADDRHINT(netif, NULL);
-  }
-
-  pbuf_free(p);
+  err = tcp_output_control_segment(pcb, p, &pcb->local_ip, &pcb->remote_ip);
 
   LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: seqno %"U32_F
                           " ackno %"U32_F" err %d.\n",
diff --git a/src/core/timeouts.c b/src/core/timeouts.c
index 8bf209a..f37acfe 100644
--- a/src/core/timeouts.c
+++ b/src/core/timeouts.c
@@ -57,6 +57,7 @@
 #include "lwip/nd6.h"
 #include "lwip/ip6_frag.h"
 #include "lwip/mld6.h"
+#include "lwip/dhcp6.h"
 #include "lwip/sys.h"
 #include "lwip/pbuf.h"
 
@@ -66,6 +67,11 @@
 #define HANDLER(x) x
 #endif /* LWIP_DEBUG_TIMERNAMES */
 
+#define LWIP_MAX_TIMEOUT  0x7fffffff
+
+/* Check if timer's expiry time is greater than time and care about u32_t wraparounds */
+#define TIME_LESS_THAN(t, compare_to) ( (((u32_t)((t)-(compare_to))) > LWIP_MAX_TIMEOUT) ? 1 : 0 )
+
 /** This array contains all stack-internal cyclic timers. To get the number of
  * timers, use LWIP_ARRAYSIZE() */
 const struct lwip_cyclic_timer lwip_cyclic_timers[] = {
@@ -103,14 +109,27 @@
 #if LWIP_IPV6_MLD
   {MLD6_TMR_INTERVAL, HANDLER(mld6_tmr)},
 #endif /* LWIP_IPV6_MLD */
+#if LWIP_IPV6_DHCP6
+  {DHCP6_TIMER_MSECS, HANDLER(dhcp6_tmr)},
+#endif /* LWIP_IPV6_DHCP6 */
 #endif /* LWIP_IPV6 */
 };
+const int lwip_num_cyclic_timers = LWIP_ARRAYSIZE(lwip_cyclic_timers);
 
 #if LWIP_TIMERS && !LWIP_TIMERS_CUSTOM
 
 /** The one and only timeout list */
 static struct sys_timeo *next_timeout;
-static u32_t timeouts_last_time;
+
+static u32_t current_timeout_due_time;
+
+#if LWIP_TESTMODE
+struct sys_timeo**
+sys_timeouts_get_next_timeout(void)
+{
+  return &next_timeout;
+}
+#endif
 
 #if LWIP_TCP
 /** global variable that shows if the tcp timer is currently scheduled or not */
@@ -146,6 +165,8 @@
 void
 tcp_timer_needed(void)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
   /* timer is off but needed again? */
   if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) {
     /* enable and start timer */
@@ -155,20 +176,88 @@
 }
 #endif /* LWIP_TCP */
 
+static void
+#if LWIP_DEBUG_TIMERNAMES
+sys_timeout_abs(u32_t abs_time, sys_timeout_handler handler, void *arg, const char *handler_name)
+#else /* LWIP_DEBUG_TIMERNAMES */
+sys_timeout_abs(u32_t abs_time, sys_timeout_handler handler, void *arg)
+#endif
+{
+  struct sys_timeo *timeout, *t;
+
+  timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT);
+  if (timeout == NULL) {
+    LWIP_ASSERT("sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty", timeout != NULL);
+    return;
+  }
+
+  timeout->next = NULL;
+  timeout->h = handler;
+  timeout->arg = arg;
+  timeout->time = abs_time;
+
+#if LWIP_DEBUG_TIMERNAMES
+  timeout->handler_name = handler_name;
+  LWIP_DEBUGF(TIMERS_DEBUG, ("sys_timeout: %p abs_time=%"U32_F" handler=%s arg=%p\n",
+                             (void *)timeout, abs_time, handler_name, (void *)arg));
+#endif /* LWIP_DEBUG_TIMERNAMES */
+
+  if (next_timeout == NULL) {
+    next_timeout = timeout;
+    return;
+  }
+  if (TIME_LESS_THAN(timeout->time, next_timeout->time)) {
+    timeout->next = next_timeout;
+    next_timeout = timeout;
+  } else {
+    for (t = next_timeout; t != NULL; t = t->next) {
+      if ((t->next == NULL) || TIME_LESS_THAN(timeout->time, t->next->time)) {
+        timeout->next = t->next;
+        t->next = timeout;
+        break;
+      }
+    }
+  }
+}
+
 /**
- * Timer callback function that calls mld6_tmr() and reschedules itself.
+ * Timer callback function that calls cyclic->handler() and reschedules itself.
  *
  * @param arg unused argument
  */
-static void
-cyclic_timer(void *arg)
+#if !LWIP_TESTMODE
+static
+#endif
+void
+lwip_cyclic_timer(void *arg)
 {
-  const struct lwip_cyclic_timer* cyclic = (const struct lwip_cyclic_timer*)arg;
+  u32_t now;
+  u32_t next_timeout_time;
+  const struct lwip_cyclic_timer *cyclic = (const struct lwip_cyclic_timer *)arg;
+
 #if LWIP_DEBUG_TIMERNAMES
   LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: %s()\n", cyclic->handler_name));
 #endif
   cyclic->handler();
-  sys_timeout(cyclic->interval_ms, cyclic_timer, arg);
+
+  now = sys_now();
+  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
+    sys_timeout_abs((u32_t)(now + cyclic->interval_ms), lwip_cyclic_timer, arg, cyclic->handler_name);
+#else
+    sys_timeout_abs((u32_t)(now + cyclic->interval_ms), lwip_cyclic_timer, arg);
+#endif
+
+  } else {
+    /* correct cyclic interval with handler execution delay and sys_check_timeouts jitter */
+#if LWIP_DEBUG_TIMERNAMES
+    sys_timeout_abs(next_timeout_time, lwip_cyclic_timer, arg, cyclic->handler_name);
+#else
+    sys_timeout_abs(next_timeout_time, lwip_cyclic_timer, arg);
+#endif
+  }
 }
 
 /** Initialize this module */
@@ -179,11 +268,8 @@
   for (i = (LWIP_TCP ? 1 : 0); i < LWIP_ARRAYSIZE(lwip_cyclic_timers); i++) {
     /* we have to cast via size_t to get rid of const warning
       (this is OK as cyclic_timer() casts back to const* */
-    sys_timeout(lwip_cyclic_timers[i].interval_ms, cyclic_timer, LWIP_CONST_CAST(void*, &lwip_cyclic_timers[i]));
+    sys_timeout(lwip_cyclic_timers[i].interval_ms, lwip_cyclic_timer, LWIP_CONST_CAST(void *, &lwip_cyclic_timers[i]));
   }
-
-  /* Initialise timestamp for sys_check_timeouts */
-  timeouts_last_time = sys_now();
 }
 
 /**
@@ -198,67 +284,25 @@
  */
 #if LWIP_DEBUG_TIMERNAMES
 void
-sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name)
+sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char *handler_name)
 #else /* LWIP_DEBUG_TIMERNAMES */
 void
 sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg)
 #endif /* LWIP_DEBUG_TIMERNAMES */
 {
-  struct sys_timeo *timeout, *t;
-  u32_t now, diff;
+  u32_t next_timeout_time;
 
-  timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT);
-  if (timeout == NULL) {
-    LWIP_ASSERT("sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty", timeout != NULL);
-    return;
-  }
+  LWIP_ASSERT_CORE_LOCKED();
 
-  now = sys_now();
-  if (next_timeout == NULL) {
-    diff = 0;
-    timeouts_last_time = now;
-  } else {
-    diff = now - timeouts_last_time;
-  }
+  LWIP_ASSERT("Timeout time too long, max is LWIP_UINT32_MAX/4 msecs", msecs <= (LWIP_UINT32_MAX / 4));
 
-  timeout->next = NULL;
-  timeout->h = handler;
-  timeout->arg = arg;
-  timeout->time = msecs + diff;
+  next_timeout_time = (u32_t)(sys_now() + msecs); /* overflow handled by TIME_LESS_THAN macro */ 
+
 #if LWIP_DEBUG_TIMERNAMES
-  timeout->handler_name = handler_name;
-  LWIP_DEBUGF(TIMERS_DEBUG, ("sys_timeout: %p msecs=%"U32_F" handler=%s arg=%p\n",
-    (void *)timeout, msecs, handler_name, (void *)arg));
-#endif /* LWIP_DEBUG_TIMERNAMES */
-
-  if (next_timeout == NULL) {
-    next_timeout = timeout;
-    return;
-  }
-
-  if (next_timeout->time > msecs) {
-    next_timeout->time -= msecs;
-    timeout->next = next_timeout;
-    next_timeout = timeout;
-  } else {
-    for (t = next_timeout; t != NULL; t = t->next) {
-      timeout->time -= t->time;
-      if (t->next == NULL || t->next->time > timeout->time) {
-        if (t->next != NULL) {
-          t->next->time -= timeout->time;
-        } else if (timeout->time > msecs) {
-          /* If this is the case, 'timeouts_last_time' and 'now' differs too much.
-             This can be due to sys_check_timeouts() not being called at the right
-             times, but also when stopping in a breakpoint. Anyway, let's assume
-             this is not wanted, so add the first timer's time instead of 'diff' */
-          timeout->time = msecs + next_timeout->time;
-        }
-        timeout->next = t->next;
-        t->next = timeout;
-        break;
-      }
-    }
-  }
+  sys_timeout_abs(next_timeout_time, handler, arg, handler_name);
+#else
+  sys_timeout_abs(next_timeout_time, handler, arg);
+#endif
 }
 
 /**
@@ -274,6 +318,8 @@
 {
   struct sys_timeo *prev_t, *t;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
   if (next_timeout == NULL) {
     return;
   }
@@ -287,10 +333,6 @@
       } else {
         prev_t->next = t->next;
       }
-      /* If not the last one, add time of this one back to next */
-      if (t->next != NULL) {
-        t->next->time += t->time;
-      }
       memp_free(MEMP_SYS_TIMEOUT, t);
       return;
     }
@@ -306,61 +348,54 @@
  *
  * Must be called periodically from your main loop.
  */
-#if !NO_SYS && !defined __DOXYGEN__
-static
-#endif /* !NO_SYS */
 void
 sys_check_timeouts(void)
 {
-  if (next_timeout) {
+  u32_t now;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  /* Process only timers expired at the start of the function. */
+  now = sys_now();
+
+  do {
     struct sys_timeo *tmptimeout;
-    u32_t diff;
     sys_timeout_handler handler;
     void *arg;
-    u8_t had_one;
-    u32_t now;
 
-    now = sys_now();
-    /* this cares for wraparounds */
-    diff = now - timeouts_last_time;
-    do {
-      PBUF_CHECK_FREE_OOSEQ();
-      had_one = 0;
-      tmptimeout = next_timeout;
-      if (tmptimeout && (tmptimeout->time <= diff)) {
-        /* timeout has expired */
-        had_one = 1;
-        timeouts_last_time += tmptimeout->time;
-        diff -= tmptimeout->time;
-        next_timeout = tmptimeout->next;
-        handler = tmptimeout->h;
-        arg = tmptimeout->arg;
+    PBUF_CHECK_FREE_OOSEQ();
+
+    tmptimeout = next_timeout;
+    if (tmptimeout == NULL) {
+      return;
+    }
+
+    if (TIME_LESS_THAN(now, tmptimeout->time)) {
+      return;
+    }
+
+    /* Timeout has expired */
+    next_timeout = tmptimeout->next;
+    handler = tmptimeout->h;
+    arg = tmptimeout->arg;
+    current_timeout_due_time = tmptimeout->time;
 #if LWIP_DEBUG_TIMERNAMES
-        if (handler != NULL) {
-          LWIP_DEBUGF(TIMERS_DEBUG, ("sct calling h=%s arg=%p\n",
-            tmptimeout->handler_name, arg));
-        }
+    if (handler != NULL) {
+      LWIP_DEBUGF(TIMERS_DEBUG, ("sct calling h=%s t=%"U32_F" arg=%p\n",
+                                 tmptimeout->handler_name, sys_now() - tmptimeout->time, arg));
+    }
 #endif /* LWIP_DEBUG_TIMERNAMES */
-        memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
-        if (handler != NULL) {
-#if !NO_SYS
-          /* For LWIP_TCPIP_CORE_LOCKING, lock the core before calling the
-             timeout handler function. */
-          LOCK_TCPIP_CORE();
-#endif /* !NO_SYS */
-          handler(arg);
-#if !NO_SYS
-          UNLOCK_TCPIP_CORE();
-#endif /* !NO_SYS */
-        }
-        LWIP_TCPIP_THREAD_ALIVE();
-      }
-    /* repeat until all expired timers have been called */
-    } while (had_one);
-  }
+    memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
+    if (handler != NULL) {
+      handler(arg);
+    }
+    LWIP_TCPIP_THREAD_ALIVE();
+
+    /* Repeat until all expired timers have been called */
+  } while (1);
 }
 
-/** Set back the timestamp of the last call to sys_check_timeouts()
+/** Rebase the timeout times to the current time.
  * This is necessary if sys_check_timeouts() hasn't been called for a long
  * time (e.g. while saving energy) to prevent all timer functions of that
  * period being called.
@@ -368,62 +403,45 @@
 void
 sys_restart_timeouts(void)
 {
-  timeouts_last_time = sys_now();
+  u32_t now;
+  u32_t base;
+  struct sys_timeo *t;
+
+  if (next_timeout == NULL) {
+    return;
+  }
+
+  now = sys_now();
+  base = next_timeout->time;
+
+  for (t = next_timeout; t != NULL; t = t->next) {
+    t->time = (t->time - base) + now;
+  }
 }
 
 /** Return the time left before the next timeout is due. If no timeouts are
  * enqueued, returns 0xffffffff
  */
-#if !NO_SYS
-static
-#endif /* !NO_SYS */
 u32_t
 sys_timeouts_sleeptime(void)
 {
-  u32_t diff;
+  u32_t now;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
   if (next_timeout == NULL) {
-    return 0xffffffff;
+    return SYS_TIMEOUTS_SLEEPTIME_INFINITE;
   }
-  diff = sys_now() - timeouts_last_time;
-  if (diff > next_timeout->time) {
+  now = sys_now();
+  if (TIME_LESS_THAN(next_timeout->time, now)) {
     return 0;
   } else {
-    return next_timeout->time - diff;
+    u32_t ret = (u32_t)(next_timeout->time - now);
+    LWIP_ASSERT("invalid sleeptime", ret <= LWIP_MAX_TIMEOUT);
+    return ret;
   }
 }
 
-#if !NO_SYS
-
-/**
- * Wait (forever) for a message to arrive in an mbox.
- * While waiting, timeouts are processed.
- *
- * @param mbox the mbox to fetch the message from
- * @param msg the place to store the message
- */
-void
-sys_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg)
-{
-  u32_t sleeptime;
-
-again:
-  if (!next_timeout) {
-    sys_arch_mbox_fetch(mbox, msg, 0);
-    return;
-  }
-
-  sleeptime = sys_timeouts_sleeptime();
-  if (sleeptime == 0 || sys_arch_mbox_fetch(mbox, msg, sleeptime) == SYS_ARCH_TIMEOUT) {
-    /* If a SYS_ARCH_TIMEOUT value is returned, a timeout occurred
-       before a message could be fetched. */
-    sys_check_timeouts();
-    /* We try again to fetch a message from the mbox. */
-    goto again;
-  }
-}
-
-#endif /* NO_SYS */
-
 #else /* LWIP_TIMERS && !LWIP_TIMERS_CUSTOM */
 /* Satisfy the TCP code which calls this function */
 void
diff --git a/src/core/udp.c b/src/core/udp.c
index ce2e3d2..9d2cb4a 100644
--- a/src/core/udp.c
+++ b/src/core/udp.c
@@ -3,11 +3,11 @@
  * User Datagram Protocol module\n
  * The code for the User Datagram Protocol UDP & UDPLite (RFC 3828).\n
  * See also @ref udp_raw
- * 
+ *
  * @defgroup udp_raw UDP
  * @ingroup callbackstyle_api
  * User Datagram Protocol module\n
- * @see @ref raw_api and @ref netconn
+ * @see @ref api
  */
 
 /*
@@ -70,7 +70,7 @@
    "The Dynamic and/or Private Ports are those from 49152 through 65535" */
 #define UDP_LOCAL_PORT_RANGE_START  0xc000
 #define UDP_LOCAL_PORT_RANGE_END    0xffff
-#define UDP_ENSURE_LOCAL_PORT_RANGE(port) ((u16_t)(((port) & ~UDP_LOCAL_PORT_RANGE_START) + UDP_LOCAL_PORT_RANGE_START))
+#define UDP_ENSURE_LOCAL_PORT_RANGE(port) ((u16_t)(((port) & (u16_t)~UDP_LOCAL_PORT_RANGE_START) + UDP_LOCAL_PORT_RANGE_START))
 #endif
 
 /* last local UDP port */
@@ -86,9 +86,9 @@
 void
 udp_init(void)
 {
-#if LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND)
+#ifdef LWIP_RAND
   udp_port = UDP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND());
-#endif /* LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) */
+#endif /* LWIP_RAND */
 }
 
 /**
@@ -132,6 +132,15 @@
   LWIP_UNUSED_ARG(inp);       /* in IPv6 only case */
   LWIP_UNUSED_ARG(broadcast); /* in IPv6 only case */
 
+  LWIP_ASSERT("udp_input_local_match: invalid pcb", pcb != NULL);
+  LWIP_ASSERT("udp_input_local_match: invalid netif", inp != NULL);
+
+  /* check if PCB is bound to specific netif */
+  if ((pcb->netif_idx != NETIF_NO_INDEX) &&
+      (pcb->netif_idx != netif_get_index(ip_data.current_input_netif))) {
+    return 0;
+  }
+
   /* Dual-stack: PCBs listening to any IP type also listen to any IP address */
   if (IP_IS_ANY_TYPE_VAL(pcb->local_ip)) {
 #if LWIP_IPV4 && IP_SOF_BROADCAST_RECV
@@ -153,17 +162,17 @@
 #endif /* IP_SOF_BROADCAST_RECV */
       {
         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_current_dest_addr()->addr == IPADDR_BROADCAST)) ||
+            ip4_addr_netcmp(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())) {
-      return 1;
-    }
+      /* 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())) {
+        return 1;
+      }
   }
 
   return 0;
@@ -193,6 +202,11 @@
 
   LWIP_UNUSED_ARG(inp);
 
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ASSERT("udp_input: invalid pbuf", p != NULL);
+  LWIP_ASSERT("udp_input: invalid netif", inp != NULL);
+
   PERF_START;
 
   UDP_STATS_INC(udp.recv);
@@ -224,9 +238,9 @@
 
   /* print the UDP source and destination */
   LWIP_DEBUGF(UDP_DEBUG, ("udp ("));
-  ip_addr_debug_print(UDP_DEBUG, ip_current_dest_addr());
+  ip_addr_debug_print_val(UDP_DEBUG, *ip_current_dest_addr());
   LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F") <-- (", lwip_ntohs(udphdr->dest)));
-  ip_addr_debug_print(UDP_DEBUG, ip_current_src_addr());
+  ip_addr_debug_print_val(UDP_DEBUG, *ip_current_src_addr());
   LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F")\n", lwip_ntohs(udphdr->src)));
 
   pcb = NULL;
@@ -239,29 +253,42 @@
   for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
     /* print the PCB local and remote address */
     LWIP_DEBUGF(UDP_DEBUG, ("pcb ("));
-    ip_addr_debug_print(UDP_DEBUG, &pcb->local_ip);
+    ip_addr_debug_print_val(UDP_DEBUG, pcb->local_ip);
     LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F") <-- (", pcb->local_port));
-    ip_addr_debug_print(UDP_DEBUG, &pcb->remote_ip);
+    ip_addr_debug_print_val(UDP_DEBUG, pcb->remote_ip);
     LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F")\n", pcb->remote_port));
 
     /* compare PCB local addr+port to UDP destination addr+port */
     if ((pcb->local_port == dest) &&
         (udp_input_local_match(pcb, inp, broadcast) != 0)) {
-      if (((pcb->flags & UDP_FLAGS_CONNECTED) == 0) &&
-          ((uncon_pcb == NULL)
+      if ((pcb->flags & UDP_FLAGS_CONNECTED) == 0) {
+        if (uncon_pcb == NULL) {
+          /* the first unconnected matching PCB */
+          uncon_pcb = pcb;
+#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))) {
+            /* 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))) {
+              /* better match */
+              uncon_pcb = pcb;
+            }
+          }
+#endif /* LWIP_IPV4 */
+        }
 #if SO_REUSE
-          /* prefer specific IPs over cath-all */
-          || !ip_addr_isany(&pcb->local_ip)
+        else if (!ip_addr_isany(&pcb->local_ip)) {
+          /* prefer specific IPs over catch-all */
+          uncon_pcb = pcb;
+        }
 #endif /* SO_REUSE */
-          )) {
-        /* the first unconnected matching PCB */
-        uncon_pcb = pcb;
       }
 
       /* 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_cmp(&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
@@ -302,7 +329,7 @@
   if (for_us) {
     LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: calculating checksum\n"));
 #if CHECKSUM_CHECK_UDP
-    IF__NETIF_CHECKSUM_ENABLED(inp, CHECKSUM_CHECK_UDP) {
+    IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_CHECK_UDP) {
 #if LWIP_UDPLITE
       if (ip_current_header_proto() == IP_PROTO_UDPLITE) {
         /* Do the UDP Lite checksum */
@@ -319,8 +346,8 @@
           }
         }
         if (ip_chksum_pseudo_partial(p, IP_PROTO_UDPLITE,
-                     p->tot_len, chklen,
-                     ip_current_src_addr(), ip_current_dest_addr()) != 0) {
+                                     p->tot_len, chklen,
+                                     ip_current_src_addr(), ip_current_dest_addr()) != 0) {
           goto chkerr;
         }
       } else
@@ -336,9 +363,9 @@
       }
     }
 #endif /* CHECKSUM_CHECK_UDP */
-    if (pbuf_header(p, -UDP_HLEN)) {
+    if (pbuf_remove_header(p, UDP_HLEN)) {
       /* Can we cope with this failing? Just assert for now */
-      LWIP_ASSERT("pbuf_header failed\n", 0);
+      LWIP_ASSERT("pbuf_remove_header failed\n", 0);
       UDP_STATS_INC(udp.drop);
       MIB2_STATS_INC(mib2.udpinerrors);
       pbuf_free(p);
@@ -353,8 +380,6 @@
         /* pass broadcast- or multicast packets to all multicast pcbs
            if SOF_REUSEADDR is set on the first match */
         struct udp_pcb *mpcb;
-        u8_t p_header_changed = 0;
-        s16_t hdrs_len = (s16_t)(ip_current_header_tot_len() + UDP_HLEN);
         for (mpcb = udp_pcbs; mpcb != NULL; mpcb = mpcb->next) {
           if (mpcb != pcb) {
             /* compare PCB local addr+port to UDP destination addr+port */
@@ -363,28 +388,14 @@
               /* pass a copy of the packet to all local matches */
               if (mpcb->recv != NULL) {
                 struct pbuf *q;
-                /* for that, move payload to IP header again */
-                if (p_header_changed == 0) {
-                  pbuf_header_force(p, hdrs_len);
-                  p_header_changed = 1;
-                }
-                q = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM);
+                q = pbuf_clone(PBUF_RAW, PBUF_POOL, p);
                 if (q != NULL) {
-                  err_t err = pbuf_copy(q, p);
-                  if (err == ERR_OK) {
-                    /* move payload to UDP data */
-                    pbuf_header(q, -hdrs_len);
-                    mpcb->recv(mpcb->recv_arg, mpcb, q, ip_current_src_addr(), src);
-                  }
+                  mpcb->recv(mpcb->recv_arg, mpcb, q, ip_current_src_addr(), src);
                 }
               }
             }
           }
         }
-        if (p_header_changed) {
-          /* and move payload to UDP data again */
-          pbuf_header(p, -hdrs_len);
-        }
       }
 #endif /* SO_REUSE && SO_REUSE_RXTOALL */
       /* callback */
@@ -433,7 +444,8 @@
 
 /**
  * @ingroup udp_raw
- * Send data using UDP.
+ * Sends the pbuf p using UDP. The pbuf is not deallocated.
+ *
  *
  * @param pcb UDP PCB used to send the data.
  * @param p chain of pbuf's to be sent.
@@ -454,7 +466,10 @@
 err_t
 udp_send(struct udp_pcb *pcb, struct pbuf *p)
 {
-  if ((pcb == NULL) || IP_IS_ANY_TYPE_VAL(pcb->remote_ip)) {
+  LWIP_ERROR("udp_send: invalid pcb", pcb != NULL, return ERR_ARG);
+  LWIP_ERROR("udp_send: invalid pbuf", p != NULL, return ERR_ARG);
+
+  if (IP_IS_ANY_TYPE_VAL(pcb->remote_ip)) {
     return ERR_VAL;
   }
 
@@ -470,13 +485,16 @@
 udp_send_chksum(struct udp_pcb *pcb, struct pbuf *p,
                 u8_t have_chksum, u16_t chksum)
 {
-  if ((pcb == NULL) || IP_IS_ANY_TYPE_VAL(pcb->remote_ip)) {
+  LWIP_ERROR("udp_send_chksum: invalid pcb", pcb != NULL, return ERR_ARG);
+  LWIP_ERROR("udp_send_chksum: invalid pbuf", p != NULL, return ERR_ARG);
+
+  if (IP_IS_ANY_TYPE_VAL(pcb->remote_ip)) {
     return ERR_VAL;
   }
 
   /* send to the packet using remote ip and port stored in the pcb */
   return udp_sendto_chksum(pcb, p, &pcb->remote_ip, pcb->remote_port,
-    have_chksum, chksum);
+                           have_chksum, chksum);
 }
 #endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
 
@@ -500,7 +518,7 @@
  */
 err_t
 udp_sendto(struct udp_pcb *pcb, struct pbuf *p,
-  const ip_addr_t *dst_ip, u16_t dst_port)
+           const ip_addr_t *dst_ip, u16_t dst_port)
 {
 #if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP
   return udp_sendto_chksum(pcb, p, dst_ip, dst_port, 0, 0);
@@ -514,43 +532,57 @@
 {
 #endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
   struct netif *netif;
-  const ip_addr_t *dst_ip_route = dst_ip;
 
-  if ((pcb == NULL) || (dst_ip == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) {
+  LWIP_ERROR("udp_sendto: invalid pcb", pcb != NULL, return ERR_ARG);
+  LWIP_ERROR("udp_sendto: invalid pbuf", p != NULL, return ERR_ARG);
+  LWIP_ERROR("udp_sendto: invalid dst_ip", dst_ip != NULL, return ERR_ARG);
+
+  if (!IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) {
     return ERR_VAL;
   }
 
   LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send\n"));
 
-#if LWIP_IPV6 || (LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS)
-  if (ip_addr_ismulticast(dst_ip_route)) {
-#if LWIP_IPV6
-    if (IP_IS_V6(dst_ip)) {
-      /* For multicast, find a netif based on source address. */
-      dst_ip_route = &pcb->local_ip;
-    } else
-#endif /* LWIP_IPV6 */
-    {
-#if LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS
-      /* IPv4 does not use source-based routing by default, so we use an
-         administratively selected interface for multicast by default.
-         However, this can be overridden by setting an interface address
-         in pcb->multicast_ip that is used for routing. */
-      if (!ip_addr_isany_val(pcb->multicast_ip) &&
-          !ip4_addr_cmp(ip_2_ip4(&pcb->multicast_ip), IP4_ADDR_BROADCAST)) {
-        dst_ip_route = &pcb->multicast_ip;
-      }
-#endif /* LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS */
-    }
-  }
-#endif /* LWIP_IPV6 || (LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS) */
-
-  /* find the outgoing network interface for this packet */
-  if(IP_IS_ANY_TYPE_VAL(pcb->local_ip)) {
-    /* Don't call ip_route() with IP_ANY_TYPE */
-    netif = ip_route(IP46_ADDR_ANY(IP_GET_TYPE(dst_ip_route)), dst_ip_route);
+  if (pcb->netif_idx != NETIF_NO_INDEX) {
+    netif = netif_get_by_index(pcb->netif_idx);
   } else {
-    netif = ip_route(&pcb->local_ip, dst_ip_route);
+#if LWIP_MULTICAST_TX_OPTIONS
+    netif = NULL;
+    if (ip_addr_ismulticast(dst_ip)) {
+      /* For IPv6, the interface to use for packets with a multicast destination
+       * is specified using an interface index. The same approach may be used for
+       * IPv4 as well, in which case it overrides the IPv4 multicast override
+       * address below. Here we have to look up the netif by going through the
+       * list, but by doing so we skip a route lookup. If the interface index has
+       * gone stale, we fall through and do the regular route lookup after all. */
+      if (pcb->mcast_ifindex != NETIF_NO_INDEX) {
+        netif = netif_get_by_index(pcb->mcast_ifindex);
+      }
+#if LWIP_IPV4
+      else
+#if LWIP_IPV6
+        if (IP_IS_V4(dst_ip))
+#endif /* LWIP_IPV6 */
+        {
+          /* IPv4 does not use source-based routing by default, so we use an
+             administratively selected interface for multicast by default.
+             However, this can be overridden by setting an interface address
+             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)) {
+            netif = ip4_route_src(ip_2_ip4(&pcb->local_ip), &pcb->mcast_ip4);
+          }
+        }
+#endif /* LWIP_IPV4 */
+    }
+
+    if (netif == NULL)
+#endif /* LWIP_MULTICAST_TX_OPTIONS */
+    {
+      /* find the outgoing network interface for this packet */
+      netif = ip_route(&pcb->local_ip, dst_ip);
+    }
   }
 
   /* no outgoing network interface could be found? */
@@ -590,7 +622,7 @@
  */
 err_t
 udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p,
-  const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif)
+              const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif)
 {
 #if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP
   return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, 0, 0);
@@ -605,14 +637,20 @@
 #endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
   const ip_addr_t *src_ip;
 
-  if ((pcb == NULL) || (dst_ip == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) {
+  LWIP_ERROR("udp_sendto_if: invalid pcb", pcb != NULL, return ERR_ARG);
+  LWIP_ERROR("udp_sendto_if: invalid pbuf", p != NULL, return ERR_ARG);
+  LWIP_ERROR("udp_sendto_if: invalid dst_ip", dst_ip != NULL, return ERR_ARG);
+  LWIP_ERROR("udp_sendto_if: invalid netif", netif != NULL, return ERR_ARG);
+
+  if (!IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) {
     return ERR_VAL;
   }
 
-  /* PCB local address is IP_ANY_ADDR? */
+  /* PCB local address is IP_ANY_ADDR or multicast? */
 #if LWIP_IPV6
   if (IP_IS_V6(dst_ip)) {
-    if (ip6_addr_isany(ip_2_ip6(&pcb->local_ip))) {
+    if (ip6_addr_isany(ip_2_ip6(&pcb->local_ip)) ||
+        ip6_addr_ismulticast(ip_2_ip6(&pcb->local_ip))) {
       src_ip = ip6_select_source_address(netif, ip_2_ip6(dst_ip));
       if (src_ip == NULL) {
         /* No suitable source address was found. */
@@ -632,21 +670,21 @@
   else
 #endif /* LWIP_IPV4 && LWIP_IPV6 */
 #if LWIP_IPV4
-  if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) ||
-      ip4_addr_ismulticast(ip_2_ip4(&pcb->local_ip))) {
-    /* if the local_ip is any or multicast
-     * use the outgoing network interface IP address as source address */
-    src_ip = netif_ip_addr4(netif);
-  } 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))) {
-      /* local_ip doesn't match, drop the packet */
-      return ERR_RTE;
+    if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) ||
+        ip4_addr_ismulticast(ip_2_ip4(&pcb->local_ip))) {
+      /* if the local_ip is any or multicast
+       * use the outgoing network interface IP address as source address */
+      src_ip = netif_ip_addr4(netif);
+    } 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))) {
+        /* local_ip doesn't match, drop the packet */
+        return ERR_RTE;
+      }
+      /* use UDP PCB local IP address as source address */
+      src_ip = &pcb->local_ip;
     }
-    /* use UDP PCB local IP address as source address */
-    src_ip = &pcb->local_ip;
-  }
 #endif /* LWIP_IPV4 */
 #if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP
   return udp_sendto_if_src_chksum(pcb, p, dst_ip, dst_port, netif, have_chksum, chksum, src_ip);
@@ -659,7 +697,7 @@
  * Same as @ref udp_sendto_if, but with source address */
 err_t
 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)
+                  const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif, const ip_addr_t *src_ip)
 {
 #if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP
   return udp_sendto_if_src_chksum(pcb, p, dst_ip, dst_port, netif, 0, 0, src_ip);
@@ -668,8 +706,8 @@
 /** Same as udp_sendto_if_src(), but with checksum */
 err_t
 udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip,
-                     u16_t dst_port, struct netif *netif, u8_t have_chksum,
-                     u16_t chksum, const ip_addr_t *src_ip)
+                         u16_t dst_port, struct netif *netif, u8_t have_chksum,
+                         u16_t chksum, const ip_addr_t *src_ip)
 {
 #endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
   struct udp_hdr *udphdr;
@@ -678,7 +716,15 @@
   u8_t ip_proto;
   u8_t ttl;
 
-  if ((pcb == NULL) || (dst_ip == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, src_ip) ||
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("udp_sendto_if_src: invalid pcb", pcb != NULL, return ERR_ARG);
+  LWIP_ERROR("udp_sendto_if_src: invalid pbuf", p != NULL, return ERR_ARG);
+  LWIP_ERROR("udp_sendto_if_src: invalid dst_ip", dst_ip != NULL, return ERR_ARG);
+  LWIP_ERROR("udp_sendto_if_src: invalid src_ip", src_ip != NULL, return ERR_ARG);
+  LWIP_ERROR("udp_sendto_if_src: invalid netif", netif != NULL, return ERR_ARG);
+
+  if (!IP_ADDR_PCB_VERSION_MATCH(pcb, src_ip) ||
       !IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) {
     return ERR_VAL;
   }
@@ -691,7 +737,7 @@
 #endif /* LWIP_IPV6 */
       ip_addr_isbroadcast(dst_ip, netif)) {
     LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
-      ("udp_sendto_if: SOF_BROADCAST not enabled on pcb %p\n", (void *)pcb));
+                ("udp_sendto_if: SOF_BROADCAST not enabled on pcb %p\n", (void *)pcb));
     return ERR_VAL;
   }
 #endif /* LWIP_IPV4 && IP_SOF_BROADCAST */
@@ -706,8 +752,12 @@
     }
   }
 
+  /* packet too large to add a UDP header without causing an overflow? */
+  if ((u16_t)(p->tot_len + UDP_HLEN) < p->tot_len) {
+    return ERR_MEM;
+  }
   /* not enough space to add an UDP header to first pbuf in given p chain? */
-  if (pbuf_header(p, UDP_HLEN)) {
+  if (pbuf_add_header(p, UDP_HLEN)) {
     /* allocate header in a separate new pbuf */
     q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM);
     /* new header pbuf could not be allocated? */
@@ -738,11 +788,11 @@
   udphdr->chksum = 0x0000;
 
   /* Multicast Loop? */
-#if (LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS) || (LWIP_IPV6 && LWIP_IPV6_MLD)
+#if LWIP_MULTICAST_TX_OPTIONS
   if (((pcb->flags & UDP_FLAGS_MULTICAST_LOOP) != 0) && ip_addr_ismulticast(dst_ip)) {
     q->flags |= PBUF_FLAG_MCASTLOOP;
   }
-#endif /* (LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS) || (LWIP_IPV6 && LWIP_IPV6_MLD) */
+#endif /* LWIP_MULTICAST_TX_OPTIONS */
 
   LWIP_DEBUGF(UDP_DEBUG, ("udp_send: sending datagram of length %"U16_F"\n", q->tot_len));
 
@@ -776,7 +826,7 @@
       }
 #endif /* LWIP_CHECKSUM_ON_COPY */
       udphdr->chksum = ip_chksum_pseudo_partial(q, IP_PROTO_UDPLITE,
-        q->tot_len, chklen, src_ip, dst_ip);
+                       q->tot_len, chklen, src_ip, dst_ip);
 #if LWIP_CHECKSUM_ON_COPY
       if (have_chksum) {
         u32_t acc;
@@ -808,14 +858,14 @@
         if (have_chksum) {
           u32_t acc;
           udpchksum = ip_chksum_pseudo_partial(q, IP_PROTO_UDP,
-            q->tot_len, UDP_HLEN, src_ip, dst_ip);
+                                               q->tot_len, UDP_HLEN, src_ip, dst_ip);
           acc = udpchksum + (u16_t)~(chksum);
           udpchksum = FOLD_U32T(acc);
         } else
 #endif /* LWIP_CHECKSUM_ON_COPY */
         {
           udpchksum = ip_chksum_pseudo(q, IP_PROTO_UDP, q->tot_len,
-            src_ip, dst_ip);
+                                       src_ip, dst_ip);
         }
 
         /* chksum zero must become 0xffff, as zero means 'no checksum' */
@@ -839,9 +889,9 @@
   LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP checksum 0x%04"X16_F"\n", udphdr->chksum));
   LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,0x%02"X16_F",)\n", (u16_t)ip_proto));
   /* output to IP */
-  NETIF_SET_HWADDRHINT(netif, &(pcb->addr_hint));
+  NETIF_SET_HINTS(netif, &(pcb->netif_hints));
   err = ip_output_if_src(q, src_ip, dst_ip, ttl, pcb->tos, ip_proto, netif);
-  NETIF_SET_HWADDRHINT(netif, NULL);
+  NETIF_RESET_HINTS(netif);
 
   /* @todo: must this be increased even if error occurred? */
   MIB2_STATS_INC(mib2.udpoutdatagrams);
@@ -861,9 +911,9 @@
 /**
  * @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 IP4_ADDR_ANY to
+ * @param ipaddr local IP address to bind with. Use IP_ANY_TYPE to
  * bind to all local interfaces.
  * @param port local UDP port to bind with. Use 0 to automatically bind
  * to a random port between UDP_LOCAL_PORT_RANGE_START and
@@ -883,18 +933,22 @@
 {
   struct udp_pcb *ipcb;
   u8_t rebind;
+#if LWIP_IPV6 && LWIP_IPV6_SCOPES
+  ip_addr_t zoned_ipaddr;
+#endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */
+
+  LWIP_ASSERT_CORE_LOCKED();
 
 #if LWIP_IPV4
   /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */
   if (ipaddr == NULL) {
     ipaddr = IP4_ADDR_ANY;
   }
+#else /* LWIP_IPV4 */
+  LWIP_ERROR("udp_bind: invalid ipaddr", ipaddr != NULL, return ERR_ARG);
 #endif /* LWIP_IPV4 */
 
-  /* still need to check for ipaddr == NULL in IPv6 only case */
-  if ((pcb == NULL) || (ipaddr == NULL)) {
-    return ERR_VAL;
-  }
+  LWIP_ERROR("udp_bind: invalid pcb", pcb != NULL, return ERR_ARG);
 
   LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_bind(ipaddr = "));
   ip_addr_debug_print(UDP_DEBUG | LWIP_DBG_TRACE, ipaddr);
@@ -910,6 +964,18 @@
     }
   }
 
+#if LWIP_IPV6 && LWIP_IPV6_SCOPES
+  /* If the given IP address should have a zone but doesn't, assign one now.
+   * This is legacy support: scope-aware callers should always provide properly
+   * zoned source addresses. Do the zone selection before the address-in-use
+   * check below; as such we have to make a temporary copy of the address. */
+  if (IP_IS_V6(ipaddr) && ip6_addr_lacks_zone(ip_2_ip6(ipaddr), IP6_UNKNOWN)) {
+    ip_addr_copy(zoned_ipaddr, *ipaddr);
+    ip6_addr_select_zone(ip_2_ip6(&zoned_ipaddr), ip_2_ip6(&zoned_ipaddr));
+    ipaddr = &zoned_ipaddr;
+  }
+#endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */
+
   /* no port specified? */
   if (port == 0) {
     port = udp_new_port();
@@ -921,9 +987,9 @@
   } else {
     for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
       if (pcb != ipcb) {
-      /* By default, we don't allow to bind to a port that any other udp
-         PCB is already bound to, unless *all* PCBs with that port have tha
-         REUSEADDR flag set. */
+        /* By default, we don't allow to bind to a port that any other udp
+           PCB is already bound to, unless *all* PCBs with that port have tha
+           REUSEADDR flag set. */
 #if SO_REUSE
         if (!ip_get_option(pcb, SOF_REUSEADDR) ||
             !ip_get_option(ipcb, SOF_REUSEADDR))
@@ -931,8 +997,9 @@
         {
           /* port matches that of PCB in list and REUSEADDR not set -> reject */
           if ((ipcb->local_port == port) &&
-              /* IP address matches? */
-              ip_addr_cmp(&ipcb->local_ip, ipaddr)) {
+              /* IP address matches or any IP used? */
+              (ip_addr_cmp(&ipcb->local_ip, ipaddr) || ip_addr_isany(ipaddr) ||
+              ip_addr_isany(&ipcb->local_ip))) {
             /* other PCB already binds to this local IP and port */
             LWIP_DEBUGF(UDP_DEBUG,
                         ("udp_bind: local port %"U16_F" already bound by another pcb\n", port));
@@ -954,16 +1021,39 @@
     udp_pcbs = pcb;
   }
   LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("udp_bind: bound to "));
-  ip_addr_debug_print(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, &pcb->local_ip);
+  ip_addr_debug_print_val(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, pcb->local_ip);
   LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (", port %"U16_F")\n", pcb->local_port));
   return ERR_OK;
 }
 
 /**
  * @ingroup udp_raw
- * Connect an UDP PCB.
+ * Bind an UDP PCB to a specific netif.
+ * After calling this function, all packets received via this PCB
+ * are guaranteed to have come in via the specified netif, and all
+ * outgoing packets will go out via the specified netif.
  *
- * This will associate the UDP PCB with the remote address.
+ * @param pcb UDP PCB to be bound.
+ * @param netif netif to bind udp pcb to. Can be NULL.
+ *
+ * @see udp_disconnect()
+ */
+void
+udp_bind_netif(struct udp_pcb *pcb, const struct netif *netif)
+{
+  LWIP_ASSERT_CORE_LOCKED();
+
+  if (netif != NULL) {
+    pcb->netif_idx = netif_get_index(netif);
+  } else {
+    pcb->netif_idx = NETIF_NO_INDEX;
+  }
+}
+
+/**
+ * @ingroup udp_raw
+ * Sets the remote end of the pcb. This function does not generate any
+ * network traffic, but only sets the remote address of the pcb.
  *
  * @param pcb UDP PCB to be connected with remote address ipaddr and port.
  * @param ipaddr remote IP address to connect with.
@@ -982,9 +1072,10 @@
 {
   struct udp_pcb *ipcb;
 
-  if ((pcb == NULL) || (ipaddr == NULL)) {
-    return ERR_VAL;
-  }
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("udp_connect: invalid pcb", pcb != NULL, return ERR_ARG);
+  LWIP_ERROR("udp_connect: invalid ipaddr", ipaddr != NULL, return ERR_ARG);
 
   if (pcb->local_port == 0) {
     err_t err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);
@@ -994,12 +1085,21 @@
   }
 
   ip_addr_set_ipaddr(&pcb->remote_ip, ipaddr);
+#if LWIP_IPV6 && LWIP_IPV6_SCOPES
+  /* If the given IP address should have a zone but doesn't, assign one now,
+   * using the bound address to make a more informed decision when possible. */
+  if (IP_IS_V6(&pcb->remote_ip) &&
+      ip6_addr_lacks_zone(ip_2_ip6(&pcb->remote_ip), IP6_UNKNOWN)) {
+    ip6_addr_select_zone(ip_2_ip6(&pcb->remote_ip), ip_2_ip6(&pcb->local_ip));
+  }
+#endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */
+
   pcb->remote_port = port;
   pcb->flags |= UDP_FLAGS_CONNECTED;
 
   LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("udp_connect: connected to "));
-  ip_addr_debug_print(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
-                      &pcb->remote_ip);
+  ip_addr_debug_print_val(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
+                          pcb->remote_ip);
   LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (", port %"U16_F")\n", pcb->remote_port));
 
   /* Insert UDP PCB into the list of active UDP PCBs. */
@@ -1017,13 +1117,18 @@
 
 /**
  * @ingroup udp_raw
- * Disconnect a UDP PCB
+ * Remove the remote end of the pcb. This function does not generate
+ * any network traffic, but only removes the remote address of the pcb.
  *
  * @param pcb the udp pcb to disconnect.
  */
 void
 udp_disconnect(struct udp_pcb *pcb)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("udp_disconnect: invalid pcb", pcb != NULL, return);
+
   /* reset remote address association */
 #if LWIP_IPV4 && LWIP_IPV6
   if (IP_IS_ANY_TYPE_VAL(pcb->local_ip)) {
@@ -1035,14 +1140,14 @@
   }
 #endif
   pcb->remote_port = 0;
+  pcb->netif_idx = NETIF_NO_INDEX;
   /* mark PCB as unconnected */
-  pcb->flags &= ~UDP_FLAGS_CONNECTED;
+  udp_clear_flags(pcb, UDP_FLAGS_CONNECTED);
 }
 
 /**
  * @ingroup udp_raw
- * Set a receive callback for a UDP PCB
- *
+ * Set a receive callback for a UDP PCB.
  * This callback will be called when receiving a datagram for the pcb.
  *
  * @param pcb the pcb for which to set the recv callback
@@ -1052,6 +1157,10 @@
 void
 udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("udp_recv: invalid pcb", pcb != NULL, return);
+
   /* remember recv() callback and user data */
   pcb->recv = recv;
   pcb->recv_arg = recv_arg;
@@ -1059,8 +1168,8 @@
 
 /**
  * @ingroup udp_raw
- * Remove an UDP 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.
  *
@@ -1071,6 +1180,10 @@
 {
   struct udp_pcb *pcb2;
 
+  LWIP_ASSERT_CORE_LOCKED();
+
+  LWIP_ERROR("udp_remove: invalid pcb", pcb != NULL, return);
+
   mib2_udp_unbind(pcb);
   /* pcb to be removed is first in list? */
   if (udp_pcbs == pcb) {
@@ -1092,7 +1205,9 @@
 
 /**
  * @ingroup udp_raw
- * Create a UDP PCB.
+ * Creates a new UDP pcb which can be used for UDP communication. The
+ * pcb is not active until it has either been bound to a local address
+ * or connected to a remote address.
  *
  * @return The UDP PCB which was created. NULL if the PCB data structure
  * could not be allocated.
@@ -1103,6 +1218,9 @@
 udp_new(void)
 {
   struct udp_pcb *pcb;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
   pcb = (struct udp_pcb *)memp_malloc(MEMP_UDP_PCB);
   /* could allocate UDP PCB? */
   if (pcb != NULL) {
@@ -1122,7 +1240,9 @@
 /**
  * @ingroup udp_raw
  * 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.
+ * 
  * @param type IP address type, see @ref lwip_ip_addr_type definitions.
  * If you want to listen to IPv4 and IPv6 (dual-stack) packets,
  * supply @ref IPADDR_TYPE_ANY as argument and bind to @ref IP_ANY_TYPE.
@@ -1135,6 +1255,9 @@
 udp_new_ip_type(u8_t type)
 {
   struct udp_pcb *pcb;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
   pcb = udp_new();
 #if LWIP_IPV4 && LWIP_IPV6
   if (pcb != NULL) {
@@ -1152,9 +1275,9 @@
  * @param old_addr IP address of the netif before change
  * @param new_addr IP address of the netif after change
  */
-void udp_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr)
+void udp_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr)
 {
-  struct udp_pcb* upcb;
+  struct udp_pcb *upcb;
 
   if (!ip_addr_isany(old_addr) && !ip_addr_isany(new_addr)) {
     for (upcb = udp_pcbs; upcb != NULL; upcb = upcb->next) {
diff --git a/src/include/posix/sys/socket.h b/src/include/compat/posix/arpa/inet.h
similarity index 100%
copy from src/include/posix/sys/socket.h
copy to src/include/compat/posix/arpa/inet.h
diff --git a/src/include/compat/posix/net/if.h b/src/include/compat/posix/net/if.h
new file mode 100644
index 0000000..6b8e63a
--- /dev/null
+++ b/src/include/compat/posix/net/if.h
@@ -0,0 +1,36 @@
+/**
+ * @file
+ * This file is a posix wrapper for lwip/if_api.h.
+ */
+
+/*
+ * 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.
+ *
+ */
+
+#include "lwip/if_api.h"
diff --git a/src/include/posix/netdb.h b/src/include/compat/posix/netdb.h
similarity index 100%
rename from src/include/posix/netdb.h
rename to src/include/compat/posix/netdb.h
diff --git a/src/include/posix/sys/socket.h b/src/include/compat/posix/sys/socket.h
similarity index 100%
rename from src/include/posix/sys/socket.h
rename to src/include/compat/posix/sys/socket.h
diff --git a/src/include/compat/stdc/errno.h b/src/include/compat/stdc/errno.h
new file mode 100644
index 0000000..98a9aec
--- /dev/null
+++ b/src/include/compat/stdc/errno.h
@@ -0,0 +1,33 @@
+/**
+ * @file
+ * This file is a posix/stdc wrapper for lwip/errno.h.
+ */
+
+/*
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (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/errno.h"
diff --git a/src/include/lwip/altcp.h b/src/include/lwip/altcp.h
new file mode 100644
index 0000000..97abc54
--- /dev/null
+++ b/src/include/lwip/altcp.h
@@ -0,0 +1,201 @@
+/**
+ * @file
+ * Application layered TCP connection API (to be used from TCPIP thread)\n
+ *
+ * This file contains the generic API.
+ * For more details see @ref altcp_api.
+ */
+
+/*
+ * 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_ALTCP_H
+#define LWIP_HDR_ALTCP_H
+
+#include "lwip/opt.h"
+
+#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/tcpbase.h"
+#include "lwip/err.h"
+#include "lwip/pbuf.h"
+#include "lwip/ip_addr.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct altcp_pcb;
+struct altcp_functions;
+
+typedef err_t (*altcp_accept_fn)(void *arg, struct altcp_pcb *new_conn, err_t err);
+typedef err_t (*altcp_connected_fn)(void *arg, struct altcp_pcb *conn, err_t err);
+typedef err_t (*altcp_recv_fn)(void *arg, struct altcp_pcb *conn, struct pbuf *p, err_t err);
+typedef err_t (*altcp_sent_fn)(void *arg, struct altcp_pcb *conn, u16_t len);
+typedef err_t (*altcp_poll_fn)(void *arg, struct altcp_pcb *conn);
+typedef void  (*altcp_err_fn)(void *arg, err_t err);
+
+typedef struct altcp_pcb* (*altcp_new_fn)(void *arg, u8_t ip_type);
+
+struct altcp_pcb {
+  const struct altcp_functions *fns;
+  struct altcp_pcb *inner_conn;
+  void *arg;
+  void *state;
+  /* application callbacks */
+  altcp_accept_fn     accept;
+  altcp_connected_fn  connected;
+  altcp_recv_fn       recv;
+  altcp_sent_fn       sent;
+  altcp_poll_fn       poll;
+  altcp_err_fn        err;
+  u8_t pollinterval;
+};
+
+/** @ingroup altcp */
+typedef struct altcp_allocator_s {
+  /** Allocator function */
+  altcp_new_fn  alloc;
+  /** Argument to allocator function */
+  void         *arg;
+} altcp_allocator_t;
+
+struct altcp_pcb *altcp_new(altcp_allocator_t *allocator);
+struct altcp_pcb *altcp_new_ip6(altcp_allocator_t *allocator);
+struct altcp_pcb *altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type);
+
+void altcp_arg(struct altcp_pcb *conn, void *arg);
+void altcp_accept(struct altcp_pcb *conn, altcp_accept_fn accept);
+void altcp_recv(struct altcp_pcb *conn, altcp_recv_fn recv);
+void altcp_sent(struct altcp_pcb *conn, altcp_sent_fn sent);
+void altcp_poll(struct altcp_pcb *conn, altcp_poll_fn poll, u8_t interval);
+void altcp_err(struct altcp_pcb *conn, altcp_err_fn err);
+
+void  altcp_recved(struct altcp_pcb *conn, u16_t len);
+err_t altcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port);
+err_t altcp_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected);
+
+/* return conn for source code compatibility to tcp callback API only */
+struct altcp_pcb *altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err);
+#define altcp_listen_with_backlog(conn, backlog) altcp_listen_with_backlog_and_err(conn, backlog, NULL)
+/** @ingroup altcp */
+#define altcp_listen(conn) altcp_listen_with_backlog_and_err(conn, TCP_DEFAULT_LISTEN_BACKLOG, NULL)
+
+void altcp_abort(struct altcp_pcb *conn);
+err_t altcp_close(struct altcp_pcb *conn);
+err_t altcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx);
+
+err_t altcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags);
+err_t altcp_output(struct altcp_pcb *conn);
+
+u16_t altcp_mss(struct altcp_pcb *conn);
+u16_t altcp_sndbuf(struct altcp_pcb *conn);
+u16_t altcp_sndqueuelen(struct altcp_pcb *conn);
+void  altcp_nagle_disable(struct altcp_pcb *conn);
+void  altcp_nagle_enable(struct altcp_pcb *conn);
+int   altcp_nagle_disabled(struct altcp_pcb *conn);
+
+void  altcp_setprio(struct altcp_pcb *conn, u8_t prio);
+
+err_t altcp_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port);
+ip_addr_t *altcp_get_ip(struct altcp_pcb *conn, int local);
+u16_t altcp_get_port(struct altcp_pcb *conn, int local);
+
+#ifdef LWIP_DEBUG
+enum tcp_state altcp_dbg_get_tcp_state(struct altcp_pcb *conn);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#else /* LWIP_ALTCP */
+
+/* ALTCP disabled, define everything to link against tcp callback API (e.g. to get a small non-ssl httpd) */
+
+#include "lwip/tcp.h"
+
+#define altcp_accept_fn tcp_accept_fn
+#define altcp_connected_fn tcp_connected_fn
+#define altcp_recv_fn tcp_recv_fn
+#define altcp_sent_fn tcp_sent_fn
+#define altcp_poll_fn tcp_poll_fn
+#define altcp_err_fn tcp_err_fn
+
+#define altcp_pcb tcp_pcb
+#define altcp_tcp_new_ip_type tcp_new_ip_type
+#define altcp_tcp_new tcp_new
+#define altcp_tcp_new_ip6 tcp_new_ip6
+
+#define altcp_new(allocator) tcp_new()
+#define altcp_new_ip6(allocator) tcp_new_ip6()
+#define altcp_new_ip_type(allocator, ip_type) tcp_new_ip_type(ip_type)
+
+#define altcp_arg tcp_arg
+#define altcp_accept tcp_accept
+#define altcp_recv tcp_recv
+#define altcp_sent tcp_sent
+#define altcp_poll tcp_poll
+#define altcp_err tcp_err
+
+#define altcp_recved tcp_recved
+#define altcp_bind tcp_bind
+#define altcp_connect tcp_connect
+
+#define altcp_listen_with_backlog_and_err tcp_listen_with_backlog_and_err
+#define altcp_listen_with_backlog tcp_listen_with_backlog
+#define altcp_listen tcp_listen
+
+#define altcp_abort tcp_abort
+#define altcp_close tcp_close
+#define altcp_shutdown tcp_shutdown
+
+#define altcp_write tcp_write
+#define altcp_output tcp_output
+
+#define altcp_mss tcp_mss
+#define altcp_sndbuf tcp_sndbuf
+#define altcp_sndqueuelen tcp_sndqueuelen
+#define altcp_nagle_disable tcp_nagle_disable
+#define altcp_nagle_enable tcp_nagle_enable
+#define altcp_nagle_disabled tcp_nagle_disabled
+#define altcp_setprio tcp_setprio
+
+#define altcp_get_tcp_addrinfo tcp_get_tcp_addrinfo
+#define altcp_get_ip(pcb, local) ((local) ? (&(pcb)->local_ip) : (&(pcb)->remote_ip))
+
+#ifdef LWIP_DEBUG
+#define altcp_dbg_get_tcp_state tcp_dbg_get_tcp_state
+#endif
+
+#endif /* LWIP_ALTCP */
+
+#endif /* LWIP_HDR_ALTCP_H */
diff --git a/src/include/lwip/altcp_tcp.h b/src/include/lwip/altcp_tcp.h
new file mode 100644
index 0000000..dbde584
--- /dev/null
+++ b/src/include/lwip/altcp_tcp.h
@@ -0,0 +1,72 @@
+/**
+ * @file
+ * Application layered TCP connection API (to be used from TCPIP thread)\n
+ * 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).
+ *
+ * This file contains the base implementation calling into tcp.
+ */
+
+/*
+ * 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_ALTCP_TCP_H
+#define LWIP_HDR_ALTCP_TCP_H
+
+#include "lwip/opt.h"
+
+#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/altcp.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct altcp_pcb *altcp_tcp_new_ip_type(u8_t ip_type);
+
+#define altcp_tcp_new() altcp_tcp_new_ip_type(IPADDR_TYPE_V4)
+#define altcp_tcp_new_ip6() altcp_tcp_new_ip_type(IPADDR_TYPE_V6)
+
+struct altcp_pcb *altcp_tcp_alloc(void *arg, u8_t ip_type);
+
+struct tcp_pcb;
+struct altcp_pcb *altcp_tcp_wrap(struct tcp_pcb *tpcb);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_ALTCP */
+
+#endif /* LWIP_HDR_ALTCP_TCP_H */
diff --git a/src/include/lwip/altcp_tls.h b/src/include/lwip/altcp_tls.h
new file mode 100644
index 0000000..7b17c60
--- /dev/null
+++ b/src/include/lwip/altcp_tls.h
@@ -0,0 +1,117 @@
+/**
+ * @file
+ * Application layered TCP/TLS connection API (to be used from TCPIP thread)
+ *
+ * @defgroup altcp_tls TLS layer
+ * @ingroup altcp
+ * 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).
+ */
+
+/*
+ * 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_ALTCP_TLS_H
+#define LWIP_HDR_ALTCP_TLS_H
+
+#include "lwip/opt.h"
+
+#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */
+
+#if LWIP_ALTCP_TLS
+
+#include "lwip/altcp.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @ingroup altcp_tls
+ * ALTCP_TLS configuration handle, content depends on port (e.g. mbedtls)
+ */
+struct altcp_tls_config;
+
+/** @ingroup altcp_tls
+ * Create an ALTCP_TLS server configuration handle
+ */
+struct altcp_tls_config *altcp_tls_create_config_server_privkey_cert(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);
+
+/** @ingroup altcp_tls
+ * Create an ALTCP_TLS client configuration handle
+ */
+struct altcp_tls_config *altcp_tls_create_config_client(const u8_t *cert, size_t cert_len);
+
+/** @ingroup altcp_tls
+ * Create an ALTCP_TLS client configuration handle with two-way server/client authentication
+ */
+struct altcp_tls_config *altcp_tls_create_config_client_2wayauth(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);
+
+/** @ingroup altcp_tls
+ * Free an ALTCP_TLS configuration handle
+ */
+void altcp_tls_free_config(struct altcp_tls_config *conf);
+
+/** @ingroup altcp_tls
+ * Create new ALTCP_TLS layer wrapping an existing pcb as inner connection (e.g. TLS over TCP)
+ */
+struct altcp_pcb *altcp_tls_wrap(struct altcp_tls_config *config, struct altcp_pcb *inner_pcb);
+
+/** @ingroup altcp_tls
+ * Create new ALTCP_TLS pcb and its inner tcp pcb
+ */
+struct altcp_pcb *altcp_tls_new(struct altcp_tls_config *config, u8_t ip_type);
+
+/** @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
+ 'arg' must contain a struct altcp_tls_config *.
+ */
+struct altcp_pcb *altcp_tls_alloc(void *arg, u8_t ip_type);
+
+/** @ingroup altcp_tls
+ * Return pointer to internal TLS context so application can tweak it.
+ * Real type depends on port (e.g. mbedtls)
+ */
+void *altcp_tls_context(struct altcp_pcb *conn);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_ALTCP_TLS */
+#endif /* LWIP_ALTCP */
+#endif /* LWIP_HDR_ALTCP_TLS_H */
diff --git a/src/include/lwip/api.h b/src/include/lwip/api.h
index 516bd16..c2afaf2 100644
--- a/src/include/lwip/api.h
+++ b/src/include/lwip/api.h
@@ -58,17 +58,25 @@
  */
 
 /* Flags for netconn_write (u8_t) */
-#define NETCONN_NOFLAG    0x00
-#define NETCONN_NOCOPY    0x00 /* Only for source code compatibility */
-#define NETCONN_COPY      0x01
-#define NETCONN_MORE      0x02
-#define NETCONN_DONTBLOCK 0x04
+#define NETCONN_NOFLAG      0x00
+#define NETCONN_NOCOPY      0x00 /* Only for source code compatibility */
+#define NETCONN_COPY        0x01
+#define NETCONN_MORE        0x02
+#define NETCONN_DONTBLOCK   0x04
+#define NETCONN_NOAUTORCVD  0x08 /* prevent netconn_recv_data_tcp() from updating the tcp window - must be done manually via netconn_tcp_recvd() */
+#define NETCONN_NOFIN       0x10 /* upper layer already received data, leave FIN in queue until called again */
 
 /* Flags for struct netconn.flags (u8_t) */
+/** This netconn had an error, don't block on recvmbox/acceptmbox any more */
+#define NETCONN_FLAG_MBOXCLOSED               0x01
 /** Should this netconn avoid blocking? */
 #define NETCONN_FLAG_NON_BLOCKING             0x02
 /** Was the last connect action a non-blocking one? */
 #define NETCONN_FLAG_IN_NONBLOCKING_CONNECT   0x04
+#if LWIP_NETCONN_FULLDUPLEX
+  /** The mbox of this netconn is being deallocated, don't use it anymore */
+#define NETCONN_FLAG_MBOXINVALID              0x08
+#endif /* LWIP_NETCONN_FULLDUPLEX */
 /** If a nonblocking write has been rejected before, poll_tcp needs to
     check if the netconn is writable again */
 #define NETCONN_FLAG_CHECK_WRITESPACE         0x10
@@ -78,7 +86,12 @@
     dual-stack usage by default. */
 #define NETCONN_FLAG_IPV6_V6ONLY              0x20
 #endif /* LWIP_IPV6 */
-
+#if LWIP_NETBUF_RECVINFO
+/** Received packet info will be recorded for this netconn */
+#define NETCONN_FLAG_PKTINFO                  0x40
+#endif /* LWIP_NETBUF_RECVINFO */
+/** A FIN has been received but not passed to the application yet */
+#define NETCONN_FIN_RX_PENDING                0x80
 
 /* Helpers to process several netconn_types by the same code */
 #define NETCONNTYPE_GROUP(t)         ((t)&0xF0)
@@ -214,8 +227,8 @@
     struct udp_pcb *udp;
     struct raw_pcb *raw;
   } pcb;
-  /** the last error this netconn had */
-  err_t last_err;
+  /** the last asynchronous unreported error this netconn had */
+  err_t pending_err;
 #if !LWIP_NETCONN_SEM_PER_THREAD
   /** sem that is used to synchronously execute functions in the core context */
   sys_sem_t op_completed;
@@ -228,6 +241,11 @@
       by the application thread */
   sys_mbox_t acceptmbox;
 #endif /* LWIP_TCP */
+#if LWIP_NETCONN_FULLDUPLEX
+  /** number of threads waiting on an mbox. This is required to unblock
+      all threads when closing while threads are waiting. */
+  int mbox_threads_waiting;
+#endif
   /** only used for socket layer */
 #if LWIP_SOCKET
   int socket;
@@ -240,7 +258,7 @@
 #if LWIP_SO_RCVTIMEO
   /** timeout in milliseconds to wait for new data to be received
       (or connections to arrive for listening netconns) */
-  int recv_timeout;
+  u32_t recv_timeout;
 #endif /* LWIP_SO_RCVTIMEO */
 #if LWIP_SO_RCVBUF
   /** maximum amount of bytes queued in recvmbox
@@ -259,9 +277,6 @@
   u8_t flags;
 #if LWIP_TCP
   /** TCP: when data passed to netconn_write doesn't fit into the send buffer,
-      this temporarily stores how much is already sent. */
-  size_t write_offset;
-  /** TCP: when data passed to netconn_write doesn't fit into the send buffer,
       this temporarily stores the message.
       Also used during connect and close. */
   struct api_msg *current_msg;
@@ -270,21 +285,23 @@
   netconn_callback callback;
 };
 
+/** This vector type is passed to @ref netconn_write_vectors_partly to send
+ * multiple buffers at once.
+ * ATTENTION: This type has to directly map struct iovec since one is casted
+ *            into the other!
+ */
+struct netvector {
+  /** pointer to the application buffer that contains the data to send */
+  const void *ptr;
+  /** size of the application data to send */
+  size_t len;
+};
+
 /** Register an Network connection event */
 #define API_EVENT(c,e,l) if (c->callback) {         \
                            (*c->callback)(c, e, l); \
                          }
 
-/** Set conn->last_err to err but don't overwrite fatal errors */
-#define NETCONN_SET_SAFE_ERR(conn, err) do { if ((conn) != NULL) { \
-  SYS_ARCH_DECL_PROTECT(netconn_set_safe_err_lev); \
-  SYS_ARCH_PROTECT(netconn_set_safe_err_lev); \
-  if (!ERR_IS_FATAL((conn)->last_err)) { \
-    (conn)->last_err = err; \
-  } \
-  SYS_ARCH_UNPROTECT(netconn_set_safe_err_lev); \
-}} while(0);
-
 /* Network connection functions: */
 
 /** @ingroup netconn_common
@@ -294,6 +311,7 @@
 #define netconn_new_with_callback(t, c) netconn_new_with_proto_and_callback(t, 0, c)
 struct netconn *netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto,
                                              netconn_callback callback);
+err_t   netconn_prepare_delete(struct netconn *conn);
 err_t   netconn_delete(struct netconn *conn);
 /** Get the type of a netconn (as enum netconn_type). */
 #define netconn_type(conn) (conn->type)
@@ -306,6 +324,7 @@
 #define netconn_addr(c,i,p) netconn_getaddr(c,i,p,1)
 
 err_t   netconn_bind(struct netconn *conn, const ip_addr_t *addr, u16_t port);
+err_t   netconn_bind_if(struct netconn *conn, u8_t if_idx);
 err_t   netconn_connect(struct netconn *conn, const ip_addr_t *addr, u16_t port);
 err_t   netconn_disconnect (struct netconn *conn);
 err_t   netconn_listen_with_backlog(struct netconn *conn, u8_t backlog);
@@ -313,12 +332,18 @@
 #define netconn_listen(conn) netconn_listen_with_backlog(conn, TCP_DEFAULT_LISTEN_BACKLOG)
 err_t   netconn_accept(struct netconn *conn, struct netconn **new_conn);
 err_t   netconn_recv(struct netconn *conn, struct netbuf **new_buf);
+err_t   netconn_recv_udp_raw_netbuf(struct netconn *conn, struct netbuf **new_buf);
+err_t   netconn_recv_udp_raw_netbuf_flags(struct netconn *conn, struct netbuf **new_buf, u8_t apiflags);
 err_t   netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf);
+err_t   netconn_recv_tcp_pbuf_flags(struct netconn *conn, struct pbuf **new_buf, u8_t apiflags);
+err_t   netconn_tcp_recvd(struct netconn *conn, size_t len);
 err_t   netconn_sendto(struct netconn *conn, struct netbuf *buf,
                              const ip_addr_t *addr, u16_t port);
 err_t   netconn_send(struct netconn *conn, struct netbuf *buf);
 err_t   netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size,
                              u8_t apiflags, size_t *bytes_written);
+err_t   netconn_write_vectors_partly(struct netconn *conn, struct netvector *vectors, u16_t vectorcnt,
+                                     u8_t apiflags, size_t *bytes_written);
 /** @ingroup netconn_tcp */
 #define netconn_write(conn, dataptr, size, apiflags) \
           netconn_write_partly(conn, dataptr, size, apiflags, NULL)
@@ -328,6 +353,8 @@
 #if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)
 err_t   netconn_join_leave_group(struct netconn *conn, const ip_addr_t *multiaddr,
                              const ip_addr_t *netif_addr, enum netconn_igmp join_or_leave);
+err_t   netconn_join_leave_group_netif(struct netconn *conn, const ip_addr_t *multiaddr,
+                             u8_t if_idx, enum netconn_igmp join_or_leave);
 #endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */
 #if LWIP_DNS
 #if LWIP_IPV4 && LWIP_IPV6
@@ -339,14 +366,18 @@
 #endif /* LWIP_IPV4 && LWIP_IPV6 */
 #endif /* LWIP_DNS */
 
-#define netconn_err(conn)               ((conn)->last_err)
+err_t   netconn_err(struct netconn *conn);
 #define netconn_recv_bufsize(conn)      ((conn)->recv_bufsize)
 
+#define netconn_set_flags(conn, set_flags)     do { (conn)->flags = (u8_t)((conn)->flags |  (set_flags)); } while(0)
+#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)
+
 /** Set the blocking status of netconn calls (@todo: write/send is missing) */
 #define netconn_set_nonblocking(conn, val)  do { if(val) { \
-  (conn)->flags |= NETCONN_FLAG_NON_BLOCKING; \
+  netconn_set_flags(conn, NETCONN_FLAG_NON_BLOCKING); \
 } else { \
-  (conn)->flags &= ~ NETCONN_FLAG_NON_BLOCKING; }} while(0)
+  netconn_clear_flags(conn, NETCONN_FLAG_NON_BLOCKING); }} while(0)
 /** Get the blocking status of netconn calls (@todo: write/send is missing) */
 #define netconn_is_nonblocking(conn)        (((conn)->flags & NETCONN_FLAG_NON_BLOCKING) != 0)
 
@@ -355,9 +386,9 @@
  * TCP: Set the IPv6 ONLY status of netconn calls (see NETCONN_FLAG_IPV6_V6ONLY)
  */
 #define netconn_set_ipv6only(conn, val)  do { if(val) { \
-  (conn)->flags |= NETCONN_FLAG_IPV6_V6ONLY; \
+  netconn_set_flags(conn, NETCONN_FLAG_IPV6_V6ONLY); \
 } else { \
-  (conn)->flags &= ~ NETCONN_FLAG_IPV6_V6ONLY; }} while(0)
+  netconn_clear_flags(conn, NETCONN_FLAG_IPV6_V6ONLY); }} while(0)
 /** @ingroup netconn_common
  * TCP: Get the IPv6 ONLY status of netconn calls (see NETCONN_FLAG_IPV6_V6ONLY)
  */
diff --git a/src/include/lwip/apps/altcp_proxyconnect.h b/src/include/lwip/apps/altcp_proxyconnect.h
new file mode 100644
index 0000000..65d3127
--- /dev/null
+++ b/src/include/lwip/apps/altcp_proxyconnect.h
@@ -0,0 +1,79 @@
+/**
+ * @file
+ * Application layered TCP connection API that executes a proxy-connect.
+ *
+ * This file provides a starting layer that executes a proxy-connect e.g. to
+ * set up TLS connections through a http proxy.
+ */
+
+/*
+ * 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.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#ifndef LWIP_HDR_APPS_ALTCP_PROXYCONNECT_H
+#define LWIP_HDR_APPS_ALTCP_PROXYCONNECT_H
+
+#include "lwip/opt.h"
+
+#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/ip_addr.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct altcp_proxyconnect_config {
+  ip_addr_t proxy_addr;
+  u16_t proxy_port;
+};
+
+
+struct altcp_pcb *altcp_proxyconnect_new(struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb);
+struct altcp_pcb *altcp_proxyconnect_new_tcp(struct altcp_proxyconnect_config *config, u8_t ip_type);
+
+struct altcp_pcb *altcp_proxyconnect_alloc(void *arg, u8_t ip_type);
+
+#if LWIP_ALTCP_TLS
+struct altcp_proxyconnect_tls_config {
+  struct altcp_proxyconnect_config proxy;
+  struct altcp_tls_config *tls_config;
+};
+
+struct altcp_pcb *altcp_proxyconnect_tls_alloc(void *arg, u8_t ip_type);
+#endif /* LWIP_ALTCP_TLS */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_ALTCP */
+#endif /* LWIP_HDR_APPS_ALTCP_PROXYCONNECT_H */
diff --git a/src/include/lwip/apps/altcp_tls_mbedtls_opts.h b/src/include/lwip/apps/altcp_tls_mbedtls_opts.h
new file mode 100644
index 0000000..36cddd9
--- /dev/null
+++ b/src/include/lwip/apps/altcp_tls_mbedtls_opts.h
@@ -0,0 +1,67 @@
+/**
+ * @file
+ * Application layered TCP/TLS connection API (to be used from TCPIP thread)
+ *
+ * This file contains options for an mbedtls port of the TLS layer.
+ */
+
+/*
+ * 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_ALTCP_TLS_OPTS_H
+#define LWIP_HDR_ALTCP_TLS_OPTS_H
+
+#include "lwip/opt.h"
+
+#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */
+
+/** LWIP_ALTCP_TLS_MBEDTLS==1: use mbedTLS for TLS support for altcp API
+ * mbedtls include directory must be reachable via include search path
+ */
+#ifndef LWIP_ALTCP_TLS_MBEDTLS
+#define LWIP_ALTCP_TLS_MBEDTLS                        0
+#endif
+
+/** Configure debug level of this file */
+#ifndef ALTCP_MBEDTLS_DEBUG
+#define ALTCP_MBEDTLS_DEBUG                           LWIP_DBG_OFF
+#endif
+
+/** Set a session timeout in seconds for the basic session cache
+ * ATTENTION: Using a session cache can lower security by reusing keys!
+ */
+#ifndef ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS
+#define ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS   0
+#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 bb176fa..67b9a60 100644
--- a/src/include/lwip/apps/fs.h
+++ b/src/include/lwip/apps/fs.h
@@ -52,12 +52,23 @@
 
 #define FS_FILE_FLAGS_HEADER_INCLUDED     0x01
 #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_EXTENSION_T_DEFINED if you have typedef'ed to your private
+ * pointer type (defaults to 'void' so the default usage is 'void*')
+ */
+#ifndef FS_FILE_EXTENSION_T_DEFINED
+typedef void fs_file_extension;
+#endif
 
 struct fs_file {
   const char *data;
   int len;
   int index;
-  void *pextension;
+  /* 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;
 #if HTTPD_PRECALCULATED_CHECKSUM
   const struct fsdata_chksum *chksum;
   u16_t chksum_count;
@@ -96,6 +107,18 @@
 void fs_state_free(struct fs_file *file, void *state);
 #endif /* #if LWIP_HTTPD_FILE_STATE */
 
+struct fsdata_file {
+  const struct fsdata_file *next;
+  const unsigned char *name;
+  const unsigned char *data;
+  int len;
+  u8_t flags;
+#if HTTPD_PRECALCULATED_CHECKSUM
+  u16_t chksum_count;
+  const struct fsdata_chksum *chksum;
+#endif /* HTTPD_PRECALCULATED_CHECKSUM */
+};
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/include/lwip/apps/http_client.h b/src/include/lwip/apps/http_client.h
new file mode 100644
index 0000000..8a06308
--- /dev/null
+++ b/src/include/lwip/apps/http_client.h
@@ -0,0 +1,160 @@
+/**
+ * @file
+ * HTTP client
+ */
+
+/*
+ * Copyright (c) 2018 Simon Goldschmidt <goldsimon@gmx.de>
+ * 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_APPS_HTTP_CLIENT_H
+#define LWIP_HDR_APPS_HTTP_CLIENT_H
+
+#include "lwip/opt.h"
+#include "lwip/ip_addr.h"
+#include "lwip/err.h"
+#include "lwip/altcp.h"
+#include "lwip/prot/iana.h"
+#include "lwip/pbuf.h"
+
+#if LWIP_TCP && LWIP_CALLBACK_API
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @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.
+ */
+#ifndef LWIP_HTTPC_HAVE_FILE_IO
+#define LWIP_HTTPC_HAVE_FILE_IO   0
+#endif
+
+/**
+ * @ingroup httpc 
+ * The default TCP port used for HTTP
+ */
+#define HTTP_DEFAULT_PORT         LWIP_IANA_PORT_HTTP
+
+/**
+ * @ingroup httpc 
+ * HTTP client result codes
+ */
+typedef enum ehttpc_result {
+  /** File successfully received */
+  HTTPC_RESULT_OK            = 0,
+  /** Unknown error */
+  HTTPC_RESULT_ERR_UNKNOWN   = 1,
+  /** Connection to server failed */
+  HTTPC_RESULT_ERR_CONNECT   = 2,
+  /** Failed to resolve server hostname */
+  HTTPC_RESULT_ERR_HOSTNAME  = 3,
+  /** Connection unexpectedly closed by remote server */
+  HTTPC_RESULT_ERR_CLOSED    = 4,
+  /** Connection timed out (server didn't respond in time) */
+  HTTPC_RESULT_ERR_TIMEOUT   = 5,
+  /** Server responded with an error code */
+  HTTPC_RESULT_ERR_SVR_RESP  = 6,
+  /** Local memory error */
+  HTTPC_RESULT_ERR_MEM       = 7,
+  /** Local abort */
+  HTTPC_RESULT_LOCAL_ABORT   = 8,
+  /** Content length mismatch */
+  HTTPC_RESULT_ERR_CONTENT_LEN = 9
+} httpc_result_t;
+
+typedef struct _httpc_state httpc_state_t;
+
+/**
+ * @ingroup httpc 
+ * Prototype of a http client callback function
+ *
+ * @param arg argument specified when initiating the request
+ * @param httpc_result result of the http transfer (see enum httpc_result_t)
+ * @param rx_content_len number of bytes received (without headers)
+ * @param srv_res this contains the http status code received (if any)
+ * @param err an error returned by internal lwip functions, can help to specify
+ *            the source of the error but must not necessarily be != ERR_OK
+ */
+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 
+ * Prototype of http client callback: called when the headers are received
+ *
+ * @param connection http client connection
+ * @param arg argument specified when initiating the request
+ * @param hdr header pbuf(s) (may contain data also)
+ * @param hdr_len length of the heders in 'hdr'
+ * @param content_len content length as received in the headers (-1 if not received)
+ * @return if != ERR_OK is returned, the connection is aborted
+ */
+typedef err_t (*httpc_headers_done_fn)(httpc_state_t *connection, void *arg, struct pbuf *hdr, u16_t hdr_len, u32_t content_len);
+
+typedef struct _httpc_connection {
+  ip_addr_t proxy_addr;
+  u16_t proxy_port;
+  u8_t use_proxy;
+  /* @todo: add username:pass? */
+
+#if LWIP_ALTCP
+  altcp_allocator_t *altcp_allocator;
+#endif
+
+  /* this callback is called when the transfer is finished (or aborted) */
+  httpc_result_fn result_fn;
+  /* this callback is called after receiving the http headers
+     It can abort the connection by returning != ERR_OK */
+  httpc_headers_done_fn headers_done_fn;
+} httpc_connection_t;
+
+err_t 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);
+err_t 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);
+
+#if LWIP_HTTPC_HAVE_FILE_IO
+err_t httpc_get_file_to_disk(const ip_addr_t* server_addr, u16_t port, const char* uri, const httpc_connection_t *settings,
+                     void* callback_arg, const char* local_file_name, httpc_state_t **connection);
+err_t httpc_get_file_dns_to_disk(const char* server_name, u16_t port, const char* uri, const httpc_connection_t *settings,
+                     void* callback_arg, const char* local_file_name, httpc_state_t **connection);
+#endif /* LWIP_HTTPC_HAVE_FILE_IO */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_TCP && LWIP_CALLBACK_API */
+
+#endif /* LWIP_HDR_APPS_HTTP_CLIENT_H */
diff --git a/src/include/lwip/apps/httpd.h b/src/include/lwip/apps/httpd.h
index 40f1811..e872429 100644
--- a/src/include/lwip/apps/httpd.h
+++ b/src/include/lwip/apps/httpd.h
@@ -51,13 +51,14 @@
 
 #if LWIP_HTTPD_CGI
 
-/*
+/**
+ * @ingroup httpd
  * Function pointer for a CGI script handler.
  *
  * This function is called each time the HTTPD server is asked for a file
  * whose name was previously registered as a CGI function using a call to
- * http_set_cgi_handler. The iIndex parameter provides the index of the
- * CGI within the ppcURLs array passed to http_set_cgi_handler. Parameters
+ * http_set_cgi_handlers. The iIndex parameter provides the index of the
+ * CGI within the cgis array passed to http_set_cgi_handlers. Parameters
  * pcParam and pcValue provide access to the parameters provided along with
  * the URI. iNumParams provides a count of the entries in the pcParam and
  * pcValue arrays. Each entry in the pcParam array contains the name of a
@@ -71,8 +72,8 @@
  * browser, for example "/thanks.htm" or "/response/error.ssi".
  *
  * The maximum number of parameters that will be passed to this function via
- * iNumParams is defined by LWIP_HTTPD_MAX_CGI_PARAMETERS. Any parameters in the incoming
- * HTTP request above this number will be discarded.
+ * iNumParams is defined by LWIP_HTTPD_MAX_CGI_PARAMETERS. Any parameters in
+ * the incoming HTTP request above this number will be discarded.
  *
  * Requests intended for use by this CGI mechanism must be sent using the GET
  * method (which encodes all parameters within the URI rather than in a block
@@ -83,7 +84,8 @@
 typedef const char *(*tCGIHandler)(int iIndex, int iNumParams, char *pcParam[],
                              char *pcValue[]);
 
-/*
+/**
+ * @ingroup httpd
  * Structure defining the base filename (URL) of a CGI and the associated
  * function which is to be called when that URL is requested.
  */
@@ -100,11 +102,17 @@
 #if LWIP_HTTPD_CGI || LWIP_HTTPD_CGI_SSI
 
 #if LWIP_HTTPD_CGI_SSI
+/* we have to prototype this struct here to make it available for the handler */
+struct fs_file;
+
 /** Define this generic CGI handler in your application.
  * It is called once for every URI with parameters.
- * The parameters can be stored to 
+ * The parameters can be stored to the object passed as connection_state, which
+ * is allocated to file->state via fs_state_init() from fs_open() or fs_open_custom().
+ * Content creation via SSI or complete dynamic files can retrieve the CGI params from there.
  */
-extern void httpd_cgi_handler(const char* uri, int iNumParams, char **pcParam, char **pcValue
+extern 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 */
@@ -115,34 +123,35 @@
 
 #if LWIP_HTTPD_SSI
 
-/*
+/**
+ * @ingroup httpd
  * Function pointer for the SSI tag handler callback.
  *
  * This function will be called each time the HTTPD server detects a tag of the
- * form <!--#name--> in a .shtml, .ssi or .shtm file where "name" appears as
- * one of the tags supplied to http_set_ssi_handler in the ppcTags array.  The
+ * form <!--#name--> in files with extensions mentioned in the g_pcSSIExtensions
+ * array (currently .shtml, .shtm, .ssi, .xml, .json) where "name" appears as
+ * one of the tags supplied to http_set_ssi_handler in the tags array.  The
  * returned insert string, which will be appended after the the string
- * "<!--#name-->" in file sent back to the client,should be written to pointer
- * pcInsert.  iInsertLen contains the size of the buffer pointed to by
- * pcInsert.  The iIndex parameter provides the zero-based index of the tag as
- * found in the ppcTags array and identifies the tag that is to be processed.
+ * "<!--#name-->" in file sent back to the client, should be written to pointer
+ * pcInsert. iInsertLen contains the size of the buffer pointed to by
+ * pcInsert. The iIndex parameter provides the zero-based index of the tag as
+ * found in the tags array and identifies the tag that is to be processed.
  *
  * The handler returns the number of characters written to pcInsert excluding
- * any terminating NULL or a negative number to indicate a failure (tag not
- * recognized, for example).
+ * any terminating NULL or HTTPD_SSI_TAG_UNKNOWN when tag is not recognized.
  *
  * Note that the behavior of this SSI mechanism is somewhat different from the
  * "normal" SSI processing as found in, for example, the Apache web server.  In
  * this case, the inserted text is appended following the SSI tag rather than
  * replacing the tag entirely.  This allows for an implementation that does not
  * require significant additional buffering of output data yet which will still
- * offer usable SSI functionality.  One downside to this approach is when
+ * offer usable SSI functionality. One downside to this approach is when
  * attempting to use SSI within JavaScript.  The SSI tag is structured to
  * resemble an HTML comment but this syntax does not constitute a comment
  * within JavaScript and, hence, leaving the tag in place will result in
- * problems in these cases.  To work around this, any SSI tag which needs to
- * output JavaScript code must do so in an encapsulated way, sending the whole
- * HTML <script>...</script> section as a single include.
+ * problems in these cases. In order to avoid these problems, define
+ * LWIP_HTTPD_SSI_INCLUDE_TAG as zero in your lwip options file, or use JavaScript
+ * style block comments in the form / * # name * / (without the spaces).
  */
 typedef u16_t (*tSSIHandler)(
 #if LWIP_HTTPD_SSI_RAW
@@ -177,7 +186,9 @@
 
 /* These functions must be implemented by the application */
 
-/** Called when a POST request has been received. The application can decide
+/**
+ * @ingroup httpd
+ * Called when a POST request has been received. The application can decide
  * whether to accept it or not.
  *
  * @param connection Unique connection identifier, valid until httpd_post_end
@@ -199,7 +210,9 @@
                        u16_t http_request_len, int content_len, char *response_uri,
                        u16_t response_uri_len, u8_t *post_auto_wnd);
 
-/** Called for each pbuf of data that has been received for a POST.
+/**
+ * @ingroup httpd
+ * Called for each pbuf of data that has been received for a POST.
  * ATTENTION: The application is responsible for freeing the pbufs passed in!
  *
  * @param connection Unique connection identifier.
@@ -209,7 +222,9 @@
  */
 err_t httpd_post_receive_data(void *connection, struct pbuf *p);
 
-/** Called when all data is received or when the connection is closed.
+/**
+ * @ingroup httpd
+ * Called when all data is received or when the connection is closed.
  * The application must return the filename/URI of a file to send in response
  * to this POST request. If the response_uri buffer is untouched, a 404
  * response is returned.
@@ -228,9 +243,13 @@
 
 void httpd_init(void);
 
+#if HTTPD_ENABLE_HTTPS
+struct altcp_tls_config;
+void httpd_inits(struct altcp_tls_config *conf);
+#endif
 
 #ifdef __cplusplus
 }
 #endif
 
-#endif /* LWIP_HTTPD_H */
+#endif /* LWIP_HDR_APPS_HTTPD_H */
diff --git a/src/include/lwip/apps/httpd_opts.h b/src/include/lwip/apps/httpd_opts.h
index 2506080..8723961 100644
--- a/src/include/lwip/apps/httpd_opts.h
+++ b/src/include/lwip/apps/httpd_opts.h
@@ -42,6 +42,7 @@
 #define LWIP_HDR_APPS_HTTPD_OPTS_H
 
 #include "lwip/opt.h"
+#include "lwip/prot/iana.h"
 
 /**
  * @defgroup httpd_opts Options
@@ -49,27 +50,77 @@
  * @{
  */
 
-/** Set this to 1 to support CGI (old style) */
+/** Set this to 1 to support CGI (old style).
+ *
+ * This old style CGI support works by registering an array of URLs and
+ * associated CGI handler functions (@ref http_set_cgi_handlers).
+ * This list is scanned just before fs_open is called from request handling.
+ * The handler can return a new URL that is used internally by the httpd to
+ * load the returned page (passed to fs_open).
+ *
+ * Use this CGI type e.g. to execute specific actions and return a page that
+ * does not depend on the CGI parameters.
+ */
 #if !defined LWIP_HTTPD_CGI || defined __DOXYGEN__
 #define LWIP_HTTPD_CGI            0
 #endif
 
-/** Set this to 1 to support CGI (new style) */
+/** Set this to 1 to support CGI (new style).
+ *
+ * This new style CGI support works by calling a global function
+ * (@ref tCGIHandler) for all URLs that are found. fs_open is called first
+ * and the URL can not be written by the CGI handler. Instead, this handler gets
+ * passed the http file state, an object where it can store information derived
+ * from the CGI URL or parameters. This file state is later passed to SSI, so
+ * the SSI code can return data depending on CGI input.
+ *
+ * Use this CGI handler if you want CGI information passed on to SSI.
+ */
 #if !defined LWIP_HTTPD_CGI_SSI || defined __DOXYGEN__
 #define LWIP_HTTPD_CGI_SSI        0
 #endif
 
-/** Set this to 1 to support SSI (Server-Side-Includes) */
+/** Set this to 1 to support SSI (Server-Side-Includes)
+ *
+ * In contrast to other http servers, this only calls a preregistered callback
+ * function (@see http_set_ssi_handler) for each tag (in the format of
+ * <!--#tag-->) encountered in SSI-enabled pages.
+ * SSI-enabled pages must have one of the predefined SSI-enabled file extensions.
+ * All files with one of these extensions are parsed when sent.
+ *
+ * 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).
+ *
+ * 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
+ * can be used.
+ */
 #if !defined LWIP_HTTPD_SSI || defined __DOXYGEN__
 #define LWIP_HTTPD_SSI            0
 #endif
 
 /** Set this to 1 to implement an SSI tag handler callback that gets a const char*
- * to the tag (instead of an index into a pre-registered array of known tags) */
+ * to the tag (instead of an index into a pre-registered array of known tags)
+ * If this is 0, the SSI handler callback function is only called pre-registered tags.
+ */
 #if !defined LWIP_HTTPD_SSI_RAW || defined __DOXYGEN__
 #define LWIP_HTTPD_SSI_RAW        0
 #endif
 
+/** 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.
+ *
+ * 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
+ */
+#if !defined LWIP_HTTPD_SSI_BY_FILE_EXTENSION || defined __DOXYGEN__
+#define LWIP_HTTPD_SSI_BY_FILE_EXTENSION  1
+#endif
+
 /** Set this to 1 to support HTTP POST */
 #if !defined LWIP_HTTPD_SUPPORT_POST || defined __DOXYGEN__
 #define LWIP_HTTPD_SUPPORT_POST   0
@@ -88,12 +139,16 @@
 #define LWIP_HTTPD_SSI_MULTIPART    0
 #endif
 
-/* The maximum length of the string comprising the tag name */
+/* The maximum length of the string comprising the SSI tag name
+ * ATTENTION: tags longer than this are ignored, not truncated!
+ */
 #if !defined LWIP_HTTPD_MAX_TAG_NAME_LEN || defined __DOXYGEN__
 #define LWIP_HTTPD_MAX_TAG_NAME_LEN 8
 #endif
 
-/* The maximum length of string that can be returned to replace any given tag */
+/* The maximum length of string that can be returned to replace any given tag
+ * If this buffer is not long enough, use LWIP_HTTPD_SSI_MULTIPART.
+ */
 #if !defined LWIP_HTTPD_MAX_TAG_INSERT_LEN || defined __DOXYGEN__
 #define LWIP_HTTPD_MAX_TAG_INSERT_LEN 192
 #endif
@@ -122,6 +177,9 @@
 
 /** 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
+ * the pool(s).
  */
 #if !defined HTTPD_USE_MEM_POOL || defined __DOXYGEN__
 #define HTTPD_USE_MEM_POOL  0
@@ -129,7 +187,17 @@
 
 /** The server port for HTTPD to use */
 #if !defined HTTPD_SERVER_PORT || defined __DOXYGEN__
-#define HTTPD_SERVER_PORT                   80
+#define HTTPD_SERVER_PORT                   LWIP_IANA_PORT_HTTP
+#endif
+
+/** The https server port for HTTPD to use */
+#if !defined HTTPD_SERVER_PORT_HTTPS || defined __DOXYGEN__
+#define HTTPD_SERVER_PORT_HTTPS             LWIP_IANA_PORT_HTTPS
+#endif
+
+/** Enable https support? */
+#if !defined HTTPD_ENABLE_HTTPS || defined __DOXYGEN__
+#define HTTPD_ENABLE_HTTPS                  0
 #endif
 
 /** Maximum retries before the connection is aborted/closed.
@@ -243,7 +311,8 @@
 #define LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED 0
 #endif
 
-/** Set this to 1 to send URIs without extension without headers */
+/** Set this to 1 to send URIs without extension without headers
+ * (who uses this at all??) */
 #if !defined LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI || defined __DOXYGEN__
 #define LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI 0
 #endif
@@ -260,10 +329,11 @@
 #endif
 
 /* Define this to a function that returns the maximum amount of data to enqueue.
-   The function have this signature: u16_t fn(struct tcp_pcb* pcb); */
+   The function have this signature: u16_t fn(struct altcp_pcb* pcb);
+   The best place to define this is the hooks file (@see LWIP_HOOK_FILENAME) */
 #if !defined HTTPD_MAX_WRITE_LEN || defined __DOXYGEN__
 #if HTTPD_LIMIT_SENDING_TO_2MSS
-#define HTTPD_MAX_WRITE_LEN(pcb)    (2 * tcp_mss(pcb))
+#define HTTPD_MAX_WRITE_LEN(pcb)    ((u16_t)(2 * altcp_mss(pcb)))
 #endif
 #endif
 
@@ -309,10 +379,14 @@
 #define LWIP_HTTPD_FS_ASYNC_READ      0
 #endif
 
-/** Set this to 1 to include "fsdata_custom.c" instead of "fsdata.c" for the
- * file system (to prevent changing the file included in CVS) */
-#if !defined HTTPD_USE_CUSTOM_FSDATA || defined __DOXYGEN__
-#define HTTPD_USE_CUSTOM_FSDATA 0
+/** Filename (including path) to use as FS data file */
+#if !defined HTTPD_FSDATA_FILE || defined __DOXYGEN__
+/* HTTPD_USE_CUSTOM_FSDATA: Compatibility with deprecated lwIP option */
+#if defined(HTTPD_USE_CUSTOM_FSDATA) && (HTTPD_USE_CUSTOM_FSDATA != 0)
+#define HTTPD_FSDATA_FILE "fsdata_custom.c"
+#else
+#define HTTPD_FSDATA_FILE "fsdata.c"
+#endif
 #endif
 
 /**
diff --git a/src/include/lwip/apps/lwiperf.h b/src/include/lwip/apps/lwiperf.h
index 7dbebb0..cc86e7f 100644
--- a/src/include/lwip/apps/lwiperf.h
+++ b/src/include/lwip/apps/lwiperf.h
@@ -63,6 +63,17 @@
   LWIPERF_TCP_ABORTED_REMOTE
 };
 
+/** Control */
+enum lwiperf_client_type
+{
+  /** Unidirectional tx only test */
+  LWIPERF_CLIENT,
+  /** Do a bidirectional test simultaneously */
+  LWIPERF_DUAL,
+  /** Do a bidirectional test individually */
+  LWIPERF_TRADEOFF
+};
+
 /** 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 */
@@ -70,10 +81,15 @@
   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);
 
-
 void* lwiperf_start_tcp_server(const ip_addr_t* local_addr, u16_t local_port,
                                lwiperf_report_fn report_fn, void* report_arg);
 void* lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void* report_arg);
+void* 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);
+void* lwiperf_start_tcp_client_default(const ip_addr_t* remote_addr,
+                               lwiperf_report_fn report_fn, void* report_arg);
+
 void  lwiperf_abort(void* lwiperf_session);
 
 
diff --git a/src/include/lwip/apps/mdns.h b/src/include/lwip/apps/mdns.h
index d036816..20d7ee2 100644
--- a/src/include/lwip/apps/mdns.h
+++ b/src/include/lwip/apps/mdns.h
@@ -34,12 +34,17 @@
  * Author: Erik Ekman <erik@kryo.se>
  *
  */
-#ifndef LWIP_HDR_MDNS_H
-#define LWIP_HDR_MDNS_H
+
+#ifndef LWIP_HDR_APPS_MDNS_H
+#define LWIP_HDR_APPS_MDNS_H
 
 #include "lwip/apps/mdns_opts.h"
 #include "lwip/netif.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #if LWIP_MDNS_RESPONDER
 
 enum mdns_sd_proto {
@@ -47,6 +52,9 @@
   DNSSD_PROTO_TCP = 1
 };
 
+#define MDNS_PROBING_CONFLICT   0
+#define MDNS_PROBING_SUCCESSFUL 1
+
 #define MDNS_LABEL_MAXLEN  63
 
 struct mdns_host;
@@ -55,15 +63,43 @@
 /** 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);
 
+/** Callback function to let application know the result of probing network for name
+ * 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);
+
 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_remove_netif(struct netif *netif);
+err_t mdns_resp_rename_netif(struct netif *netif, const char *hostname);
 
-err_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);
+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);
+
 err_t mdns_resp_add_service_txtitem(struct mdns_service *service, const char *txt, u8_t txt_len);
-void mdns_resp_netif_settings_changed(struct netif *netif);
+
+void mdns_resp_restart(struct netif *netif);
+void mdns_resp_announce(struct netif *netif);
+
+/**
+ * @ingroup mdns
+ * Announce IP settings have changed on netif.
+ * Call this in your callback registered by netif_set_status_callback().
+ * No need to call this function when LWIP_NETIF_EXT_STATUS_CALLBACK==1,
+ * this handled automatically for you.
+ * @param netif The network interface where settings have changed.
+ */
+#define mdns_resp_netif_settings_changed(netif) mdns_resp_announce(netif)
 
 #endif /* LWIP_MDNS_RESPONDER */
 
-#endif /* LWIP_HDR_MDNS_H */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_APPS_MDNS_H */
diff --git a/src/include/lwip/apps/mdns_opts.h b/src/include/lwip/apps/mdns_opts.h
index bf186bc..45f2c50 100644
--- a/src/include/lwip/apps/mdns_opts.h
+++ b/src/include/lwip/apps/mdns_opts.h
@@ -59,6 +59,13 @@
 #define MDNS_MAX_SERVICES               1
 #endif
 
+/** MDNS_RESP_USENETIF_EXTCALLBACK==1: register an ext_callback on the netif
+ * to automatically restart probing/announcing on status or address change.
+ */
+#ifndef MDNS_RESP_USENETIF_EXTCALLBACK
+#define MDNS_RESP_USENETIF_EXTCALLBACK  LWIP_NETIF_EXT_STATUS_CALLBACK
+#endif
+
 /**
  * MDNS_DEBUG: Enable debugging for multicast DNS.
  */
diff --git a/src/include/lwip/apps/mdns_priv.h b/src/include/lwip/apps/mdns_priv.h
index 8ee6db8..9635b5b 100644
--- a/src/include/lwip/apps/mdns_priv.h
+++ b/src/include/lwip/apps/mdns_priv.h
@@ -40,6 +40,10 @@
 #include "lwip/apps/mdns_opts.h"
 #include "lwip/pbuf.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #if LWIP_MDNS_RESPONDER
 
 /* Domain struct and methods - visible for unit tests */
@@ -63,4 +67,8 @@
 
 #endif /* LWIP_MDNS_RESPONDER */
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* LWIP_HDR_MDNS_PRIV_H */
diff --git a/src/include/lwip/apps/mqtt.h b/src/include/lwip/apps/mqtt.h
index 34b230b..c2bb228 100644
--- a/src/include/lwip/apps/mqtt.h
+++ b/src/include/lwip/apps/mqtt.h
@@ -40,16 +40,24 @@
 #include "lwip/apps/mqtt_opts.h"
 #include "lwip/err.h"
 #include "lwip/ip_addr.h"
+#include "lwip/prot/iana.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-typedef struct mqtt_client_t mqtt_client_t;
+typedef struct mqtt_client_s mqtt_client_t;
+
+#if LWIP_ALTCP && LWIP_ALTCP_TLS
+struct altcp_tls_config;
+#endif
 
 /** @ingroup mqtt
- * Default MQTT port */
-#define MQTT_PORT 1883
+ * Default MQTT port (non-TLS) */
+#define MQTT_PORT     LWIP_IANA_PORT_MQTT
+/** @ingroup mqtt
+ * Default MQTT TLS port */
+#define MQTT_TLS_PORT LWIP_IANA_PORT_SECURE_MQTT
 
 /*---------------------------------------------------------------------------------------------- */
 /* Connection with server */
@@ -60,17 +68,25 @@
 struct mqtt_connect_client_info_t {
   /** Client identifier, must be set by caller */
   const char *client_id;
-  /** User name and password, set to NULL if not used */
+  /** User name, set to NULL if not used */
   const char* client_user;
+  /** Password, set to NULL if not used */
   const char* client_pass;
   /** keep alive time in seconds, 0 to disable keep alive functionality*/
   u16_t keep_alive;
   /** will topic, set to NULL if will is not to be used,
       will_msg, will_qos and will retain are then ignored */
   const char* will_topic;
+  /** will_msg, see will_topic */
   const char* will_msg;
+  /** will_qos, see will_topic */
   u8_t will_qos;
+  /** will_retain, see will_topic */
   u8_t will_retain;
+#if LWIP_ALTCP && LWIP_ALTCP_TLS
+  /** TLS configuration for secure connections */
+  struct altcp_tls_config *tls_config;
+#endif
 };
 
 /**
@@ -78,13 +94,21 @@
  * Connection status codes */
 typedef enum
 {
+  /** Accepted */
   MQTT_CONNECT_ACCEPTED                 = 0,
+  /** Refused protocol version */
   MQTT_CONNECT_REFUSED_PROTOCOL_VERSION = 1,
+  /** Refused identifier */
   MQTT_CONNECT_REFUSED_IDENTIFIER       = 2,
+  /** Refused server */
   MQTT_CONNECT_REFUSED_SERVER           = 3,
+  /** Refused user credentials */
   MQTT_CONNECT_REFUSED_USERNAME_PASS    = 4,
+  /** Refused not authorized */
   MQTT_CONNECT_REFUSED_NOT_AUTHORIZED_  = 5,
+  /** Disconnected */
   MQTT_CONNECT_DISCONNECTED             = 256,
+  /** Timeout */
   MQTT_CONNECT_TIMEOUT                  = 257
 } mqtt_connection_status_t;
 
@@ -92,7 +116,7 @@
  * @ingroup mqtt
  * Function prototype for mqtt connection status callback. Called when
  * client has connected to the server after initiating a mqtt connection attempt by
- * calling mqtt_connect() or when connection is closed by server or an error
+ * calling mqtt_client_connect() or when connection is closed by server or an error
  *
  * @param client MQTT client itself
  * @param arg Additional argument to pass to the callback function
@@ -149,80 +173,19 @@
 typedef void (*mqtt_request_cb_t)(void *arg, err_t err);
 
 
-/**
- * Pending request item, binds application callback to pending server requests
- */
-struct mqtt_request_t
-{
-  /** Next item in list, NULL means this is the last in chain,
-      next pointing at itself means request is unallocated */
-  struct mqtt_request_t *next;
-  /** Callback to upper layer */
-  mqtt_request_cb_t cb;
-  void *arg;
-  /** MQTT packet identifier */
-  u16_t pkt_id;
-  /** Expire time relative to element before this  */
-  u16_t timeout_diff;
-};
-
-/** Ring buffer */
-struct mqtt_ringbuf_t {
-  u16_t put;
-  u16_t get;
-  u8_t buf[MQTT_OUTPUT_RINGBUF_SIZE];
-};
-
-/** MQTT client */
-struct mqtt_client_t
-{
-  /** Timers and timeouts */
-  u16_t cyclic_tick;
-  u16_t keep_alive;
-  u16_t server_watchdog;
-  /** Packet identifier generator*/
-  u16_t pkt_id_seq;
-  /** Packet identifier of pending incoming publish */
-  u16_t inpub_pkt_id;
-  /** Connection state */
-  u8_t conn_state;
-  struct tcp_pcb *conn;
-  /** Connection callback */
-  void *connect_arg;
-  mqtt_connection_cb_t connect_cb;
-  /** Pending requests to server */
-  struct mqtt_request_t *pend_req_queue;
-  struct mqtt_request_t req_list[MQTT_REQ_MAX_IN_FLIGHT];
-  void *inpub_arg;
-  /** Incoming data callback */
-  mqtt_incoming_data_cb_t data_cb;
-  mqtt_incoming_publish_cb_t pub_cb;
-  /** Input */
-  u32_t msg_idx;
-  u8_t rx_buffer[MQTT_VAR_HEADER_BUFFER_LEN];
-  /** Output ring-buffer */
-  struct mqtt_ringbuf_t output;
-};
-
-
-/** Connect to server */
 err_t 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);
 
-/** Disconnect from server */
 void mqtt_disconnect(mqtt_client_t *client);
 
-/** Create new client */
 mqtt_client_t *mqtt_client_new(void);
+void mqtt_client_free(mqtt_client_t* client);
 
-/** Check connection status */
 u8_t mqtt_client_is_connected(mqtt_client_t *client);
 
-/** Set callback to call for incoming publish */
 void mqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t,
                              mqtt_incoming_data_cb_t data_cb, void *arg);
 
-/** Common function for subscribe and unsubscribe */
 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);
 
 /** @ingroup mqtt
@@ -232,8 +195,6 @@
  *  Unsubscribe to topic */
 #define mqtt_unsubscribe(client, topic, cb, arg) mqtt_sub_unsub(client, topic, 0, cb, arg, 0)
 
-
-/** Publish data to topic */
 err_t 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);
 
diff --git a/src/include/lwip/apps/mqtt_opts.h b/src/include/lwip/apps/mqtt_opts.h
index ffefacd..4226d21 100644
--- a/src/include/lwip/apps/mqtt_opts.h
+++ b/src/include/lwip/apps/mqtt_opts.h
@@ -39,7 +39,7 @@
 
 #include "lwip/opt.h"
 
-#ifdef	__cplusplus
+#ifdef __cplusplus
 extern "C" {
 #endif
 
diff --git a/src/include/lwip/apps/mqtt_priv.h b/src/include/lwip/apps/mqtt_priv.h
new file mode 100644
index 0000000..b775913
--- /dev/null
+++ b/src/include/lwip/apps/mqtt_priv.h
@@ -0,0 +1,104 @@
+/**
+ * @file
+ * MQTT client (private interface)
+ */
+
+/*
+ * Copyright (c) 2016 Erik Andersson
+ * 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 Andersson
+ *
+ */
+#ifndef LWIP_HDR_APPS_MQTT_PRIV_H
+#define LWIP_HDR_APPS_MQTT_PRIV_H
+
+#include "lwip/apps/mqtt.h"
+#include "lwip/altcp.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Pending request item, binds application callback to pending server requests */
+struct mqtt_request_t
+{
+  /** Next item in list, NULL means this is the last in chain,
+      next pointing at itself means request is unallocated */
+  struct mqtt_request_t *next;
+  /** Callback to upper layer */
+  mqtt_request_cb_t cb;
+  void *arg;
+  /** MQTT packet identifier */
+  u16_t pkt_id;
+  /** Expire time relative to element before this  */
+  u16_t timeout_diff;
+};
+
+/** Ring buffer */
+struct mqtt_ringbuf_t {
+  u16_t put;
+  u16_t get;
+  u8_t buf[MQTT_OUTPUT_RINGBUF_SIZE];
+};
+
+/** MQTT client */
+struct mqtt_client_s
+{
+  /** Timers and timeouts */
+  u16_t cyclic_tick;
+  u16_t keep_alive;
+  u16_t server_watchdog;
+  /** Packet identifier generator*/
+  u16_t pkt_id_seq;
+  /** Packet identifier of pending incoming publish */
+  u16_t inpub_pkt_id;
+  /** Connection state */
+  u8_t conn_state;
+  struct altcp_pcb *conn;
+  /** Connection callback */
+  void *connect_arg;
+  mqtt_connection_cb_t connect_cb;
+  /** Pending requests to server */
+  struct mqtt_request_t *pend_req_queue;
+  struct mqtt_request_t req_list[MQTT_REQ_MAX_IN_FLIGHT];
+  void *inpub_arg;
+  /** Incoming data callback */
+  mqtt_incoming_data_cb_t data_cb;
+  mqtt_incoming_publish_cb_t pub_cb;
+  /** Input */
+  u32_t msg_idx;
+  u8_t rx_buffer[MQTT_VAR_HEADER_BUFFER_LEN];
+  /** Output ring-buffer */
+  struct mqtt_ringbuf_t output;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_APPS_MQTT_PRIV_H */
diff --git a/src/include/lwip/apps/netbiosns.h b/src/include/lwip/apps/netbiosns.h
index c9f68d8..a326d33 100644
--- a/src/include/lwip/apps/netbiosns.h
+++ b/src/include/lwip/apps/netbiosns.h
@@ -34,10 +34,18 @@
 
 #include "lwip/apps/netbiosns_opts.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 void netbiosns_init(void);
 #ifndef NETBIOS_LWIP_NAME
 void netbiosns_set_name(const char* hostname);
 #endif
 void netbiosns_stop(void);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* LWIP_HDR_APPS_NETBIOS_H */
diff --git a/src/include/lwip/apps/netbiosns_opts.h b/src/include/lwip/apps/netbiosns_opts.h
index 0909ef7..1f51ab0 100644
--- a/src/include/lwip/apps/netbiosns_opts.h
+++ b/src/include/lwip/apps/netbiosns_opts.h
@@ -52,6 +52,13 @@
 #define NETBIOS_LWIP_NAME "NETBIOSLWIPDEV"
 #endif
 
+/** Respond to NetBIOS name queries
+ * Default is disabled
+ */
+#if !defined LWIP_NETBIOS_RESPOND_NAME_QUERY || defined __DOXYGEN__
+#define LWIP_NETBIOS_RESPOND_NAME_QUERY   0
+#endif
+
 /**
  * @}
  */
diff --git a/src/include/lwip/apps/smtp.h b/src/include/lwip/apps/smtp.h
new file mode 100644
index 0000000..fb4a4a7
--- /dev/null
+++ b/src/include/lwip/apps/smtp.h
@@ -0,0 +1,128 @@
+#ifndef LWIP_HDR_APPS_SMTP_H
+#define LWIP_HDR_APPS_SMTP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "lwip/apps/smtp_opts.h"
+#include "lwip/err.h"
+#include "lwip/prot/iana.h"
+
+/** The default TCP port used for SMTP */
+#define SMTP_DEFAULT_PORT         LWIP_IANA_PORT_SMTP
+/** The default TCP port used for SMTPS */
+#define SMTPS_DEFAULT_PORT        LWIP_IANA_PORT_SMTPS
+
+/** Email successfully sent */
+#define SMTP_RESULT_OK            0
+/** Unknown error */
+#define SMTP_RESULT_ERR_UNKNOWN   1
+/** Connection to server failed */
+#define SMTP_RESULT_ERR_CONNECT   2
+/** Failed to resolve server hostname */
+#define SMTP_RESULT_ERR_HOSTNAME  3
+/** Connection unexpectedly closed by remote server */
+#define SMTP_RESULT_ERR_CLOSED    4
+/** Connection timed out (server didn't respond in time) */
+#define SMTP_RESULT_ERR_TIMEOUT   5
+/** Server responded with an unknown response code */
+#define SMTP_RESULT_ERR_SVR_RESP  6
+/** Out of resources locally */
+#define SMTP_RESULT_ERR_MEM       7
+
+/** Prototype of an smtp callback function
+ *
+ * @param arg argument specified when initiating the email
+ * @param smtp_result result of the mail transfer (see defines SMTP_RESULT_*)
+ * @param srv_err if aborted by the server, this contains the error code received
+ * @param err an error returned by internal lwip functions, can help to specify
+ *            the source of the error but must not necessarily be != ERR_OK
+ */
+typedef void (*smtp_result_fn)(void *arg, u8_t smtp_result, u16_t srv_err, err_t err);
+
+/** This structure is used as argument for smtp_send_mail_int(),
+ * which in turn can be used with tcpip_callback() to send mail
+ * from interrupt context, e.g. like this:
+ *    struct smtp_send_request *req; (to be filled)
+ *    tcpip_try_callback(smtp_send_mail_int, (void*)req);
+ *
+ * For member description, see parameter description of smtp_send_mail().
+ * When using with tcpip_callback, this structure has to stay allocated
+ * (e.g. using mem_malloc/mem_free) until its 'callback_fn' is called.
+ */
+struct smtp_send_request {
+  const char *from;
+  const char* to;
+  const char* subject;
+  const char* body;
+  smtp_result_fn callback_fn;
+  void* callback_arg;
+  /** If this is != 0, data is *not* copied into an extra buffer
+   * but used from the pointers supplied in this struct.
+   * This means less memory usage, but data must stay untouched until
+   * the callback function is called. */
+  u8_t static_data;
+};
+
+
+#if SMTP_BODYDH
+
+#ifndef SMTP_BODYDH_BUFFER_SIZE
+#define SMTP_BODYDH_BUFFER_SIZE 256
+#endif /* SMTP_BODYDH_BUFFER_SIZE */
+
+struct smtp_bodydh {
+  u16_t state;
+  u16_t length; /* Length of content in buffer */
+  char buffer[SMTP_BODYDH_BUFFER_SIZE]; /* buffer for generated content */
+#ifdef SMTP_BODYDH_USER_SIZE
+  u8_t user[SMTP_BODYDH_USER_SIZE];
+#endif /* SMTP_BODYDH_USER_SIZE */
+};
+
+enum bdh_retvals_e {
+  BDH_DONE = 0,
+  BDH_WORKING
+};
+
+/** Prototype of an smtp body callback function
+ * It receives a struct smtp_bodydh, and a buffer to write data,
+ * must return BDH_WORKING to be called again and BDH_DONE when
+ * it has finished processing. This one tries to fill one TCP buffer with
+ * data, your function will be repeatedly called until that happens; so if you
+ * know you'll be taking too long to serve your request, pause once in a while
+ * by writing length=0 to avoid hogging system resources
+ *
+ * @param arg argument specified when initiating the email
+ * @param smtp_bodydh state handling + buffer structure
+ */
+typedef int (*smtp_bodycback_fn)(void *arg, struct smtp_bodydh *bodydh);
+
+err_t smtp_send_mail_bodycback(const char *from, const char* to, const char* subject,
+                     smtp_bodycback_fn bodycback_fn, smtp_result_fn callback_fn, void* callback_arg);
+
+#endif /* SMTP_BODYDH */
+
+
+err_t smtp_set_server_addr(const char* server);
+void smtp_set_server_port(u16_t port);
+#if LWIP_ALTCP && LWIP_ALTCP_TLS
+struct altcp_tls_config;
+void smtp_set_tls_config(struct altcp_tls_config *tls_config);
+#endif
+err_t smtp_set_auth(const char* username, const char* pass);
+err_t smtp_send_mail(const char *from, const char* to, const char* subject, const char* body,
+                     smtp_result_fn callback_fn, void* callback_arg);
+err_t smtp_send_mail_static(const char *from, const char* to, const char* subject, const char* body,
+                     smtp_result_fn callback_fn, void* callback_arg);
+void smtp_send_mail_int(void *arg);
+#ifdef LWIP_DEBUG
+const char* smtp_result_str(u8_t smtp_result);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_APPS_SMTP_H */
diff --git a/src/include/lwip/apps/smtp_opts.h b/src/include/lwip/apps/smtp_opts.h
new file mode 100644
index 0000000..bc743f6
--- /dev/null
+++ b/src/include/lwip/apps/smtp_opts.h
@@ -0,0 +1,81 @@
+#ifndef LWIP_HDR_APPS_SMTP_OPTS_H
+#define LWIP_HDR_APPS_SMTP_OPTS_H
+
+#include "lwip/opt.h"
+
+#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
+#endif
+
+/** SMTP_DEBUG: Enable debugging for SNTP. */
+#ifndef SMTP_DEBUG
+#define SMTP_DEBUG              LWIP_DBG_OFF
+#endif
+
+/** Maximum length reserved for server name including terminating 0 byte */
+#ifndef SMTP_MAX_SERVERNAME_LEN
+#define SMTP_MAX_SERVERNAME_LEN 256
+#endif
+
+/** Maximum length reserved for username */
+#ifndef SMTP_MAX_USERNAME_LEN
+#define SMTP_MAX_USERNAME_LEN   32
+#endif
+
+/** Maximum length reserved for password */
+#ifndef SMTP_MAX_PASS_LEN
+#define SMTP_MAX_PASS_LEN       32
+#endif
+
+/** Set this to 0 if you know the authentication data will not change
+ * during the smtp session, which saves some heap space. */
+#ifndef SMTP_COPY_AUTHDATA
+#define SMTP_COPY_AUTHDATA      1
+#endif
+
+/** Set this to 0 to save some code space if you know for sure that all data
+ * passed to this module conforms to the requirements in the SMTP RFC.
+ * WARNING: use this with care!
+ */
+#ifndef SMTP_CHECK_DATA
+#define SMTP_CHECK_DATA         1
+#endif
+
+/** Set this to 1 to enable AUTH PLAIN support */
+#ifndef SMTP_SUPPORT_AUTH_PLAIN
+#define SMTP_SUPPORT_AUTH_PLAIN 1
+#endif
+
+/** Set this to 1 to enable AUTH LOGIN support */
+#ifndef SMTP_SUPPORT_AUTH_LOGIN
+#define SMTP_SUPPORT_AUTH_LOGIN 1
+#endif
+
+/* Memory allocation/deallocation can be overridden... */
+#ifndef SMTP_STATE_MALLOC
+#define SMTP_STATE_MALLOC(size)       mem_malloc(size)
+#define SMTP_STATE_FREE(ptr)          mem_free(ptr)
+#endif
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SMTP_OPTS_H */
+
diff --git a/src/include/lwip/apps/snmp.h b/src/include/lwip/apps/snmp.h
index 10e8ff4..a3f8eb1 100644
--- a/src/include/lwip/apps/snmp.h
+++ b/src/include/lwip/apps/snmp.h
@@ -106,6 +106,13 @@
 void snmp_set_auth_traps_enabled(u8_t enable);
 u8_t snmp_get_auth_traps_enabled(void);
 
+u8_t snmp_v1_enabled(void);
+u8_t snmp_v2c_enabled(void);
+u8_t snmp_v3_enabled(void);
+void snmp_v1_enable(u8_t enable);
+void snmp_v2c_enable(u8_t enable);
+void snmp_v3_enable(u8_t enable);
+
 const char * snmp_get_community(void);
 const char * snmp_get_community_write(void);
 const char * snmp_get_community_trap(void);
diff --git a/src/include/lwip/apps/snmp_core.h b/src/include/lwip/apps/snmp_core.h
index e781c53..6021c72 100644
--- a/src/include/lwip/apps/snmp_core.h
+++ b/src/include/lwip/apps/snmp_core.h
@@ -91,7 +91,9 @@
 #define SNMP_ASN1_TYPE_UNSIGNED32     SNMP_ASN1_TYPE_GAUGE
 #define SNMP_ASN1_TYPE_TIMETICKS      (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_TIMETICKS)
 #define SNMP_ASN1_TYPE_OPAQUE         (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_OPAQUE)
+#if LWIP_HAVE_INT64
 #define SNMP_ASN1_TYPE_COUNTER64      (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_COUNTER64)
+#endif
 
 #define SNMP_VARBIND_EXCEPTION_OFFSET 0xF0
 #define SNMP_VARBIND_EXCEPTION_MASK   0x0F
@@ -144,6 +146,9 @@
   const void* const_ptr;
   u32_t u32;
   s32_t s32;
+#if LWIP_HAVE_INT64
+  u64_t u64;
+#endif
 };
 
 
@@ -186,7 +191,7 @@
 typedef snmp_err_t (*node_instance_set_value_method)(struct snmp_node_instance*, u16_t, void*);
 typedef void (*node_instance_release_method)(struct snmp_node_instance*);
 
-#define SNMP_GET_VALUE_RAW_DATA 0x8000
+#define SNMP_GET_VALUE_RAW_DATA 0x4000  /* do not use 0x8000 because return value of node_instance_get_value_method is signed16 and 0x8000 would be the signed bit */
 
 /** SNMP node instance */
 struct snmp_node_instance
@@ -286,8 +291,8 @@
 void 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);
-u8_t snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, const u8_t oid_len);
-u8_t snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, const u8_t oid_len, void* reference);
+u8_t snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len);
+u8_t snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len, void* reference);
 
 void snmp_oid_assign(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len);
 void snmp_oid_combine(struct snmp_obj_id* target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len);
@@ -351,6 +356,14 @@
   u32_t outsetrequests;
   u32_t outgetresponses;
   u32_t outtraps;
+#if LWIP_SNMP_V3
+  u32_t unsupportedseclevels;
+  u32_t notintimewindows;
+  u32_t unknownusernames;
+  u32_t unknownengineids;
+  u32_t wrongdigests;
+  u32_t decryptionerrors;
+#endif
 };
 
 extern struct snmp_statistics snmp_stats;
diff --git a/src/include/lwip/apps/snmp_opts.h b/src/include/lwip/apps/snmp_opts.h
index 6c9ba7b..c892d22 100644
--- a/src/include/lwip/apps/snmp_opts.h
+++ b/src/include/lwip/apps/snmp_opts.h
@@ -133,11 +133,11 @@
 
 #if !defined SNMP_MAX_VALUE_SIZE || defined __DOXYGEN__
 /**
- * The maximum size of a value.
+ * The minimum size of a value.
  */
 #define SNMP_MIN_VALUE_SIZE             (2 * sizeof(u32_t*)) /* size required to store the basic types (8 bytes for counter64) */
 /**
- * The minimum size of a value.
+ * The maximum size of a value.
  */
 #define SNMP_MAX_VALUE_SIZE             LWIP_MAX(LWIP_MAX((SNMP_MAX_OCTET_STRING_LEN), sizeof(u32_t)*(SNMP_MAX_OBJ_ID_LEN)), SNMP_MIN_VALUE_SIZE)
 #endif
@@ -282,12 +282,16 @@
 #define LWIP_SNMP_V3               0
 #endif
 
-#ifndef LWIP_SNMP_V3_CRYPTO
-#define LWIP_SNMP_V3_CRYPTO        LWIP_SNMP_V3
-#endif
-
 #ifndef LWIP_SNMP_V3_MBEDTLS
 #define LWIP_SNMP_V3_MBEDTLS       LWIP_SNMP_V3
 #endif
 
+#ifndef LWIP_SNMP_V3_CRYPTO
+#define LWIP_SNMP_V3_CRYPTO        LWIP_SNMP_V3_MBEDTLS
+#endif
+
+#ifndef LWIP_SNMP_CONFIGURE_VERSIONS
+#define LWIP_SNMP_CONFIGURE_VERSIONS 0
+#endif
+
 #endif /* LWIP_HDR_SNMP_OPTS_H */
diff --git a/src/include/lwip/apps/snmp_snmpv2_framework.h b/src/include/lwip/apps/snmp_snmpv2_framework.h
new file mode 100644
index 0000000..47409cc
--- /dev/null
+++ b/src/include/lwip/apps/snmp_snmpv2_framework.h
@@ -0,0 +1,32 @@
+/*
+Generated by LwipMibCompiler
+*/
+
+#ifndef LWIP_HDR_APPS_SNMP_FRAMEWORK_MIB_H
+#define LWIP_HDR_APPS_SNMP_FRAMEWORK_MIB_H
+
+#include "lwip/apps/snmp_opts.h"
+#if LWIP_SNMP
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include "lwip/apps/snmp_core.h"
+
+extern const struct snmp_obj_id usmNoAuthProtocol;
+extern const struct snmp_obj_id usmHMACMD5AuthProtocol;
+extern const struct snmp_obj_id usmHMACSHAAuthProtocol;
+
+extern const struct snmp_obj_id usmNoPrivProtocol;
+extern const struct snmp_obj_id usmDESPrivProtocol;
+extern const struct snmp_obj_id usmAESPrivProtocol;
+
+extern const struct snmp_mib snmpframeworkmib;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* LWIP_SNMP */
+#endif /* LWIP_HDR_APPS_SNMP_FRAMEWORK_MIB_H */
diff --git a/src/include/lwip/apps/snmp_snmpv2_usm.h b/src/include/lwip/apps/snmp_snmpv2_usm.h
new file mode 100644
index 0000000..88cfcd8
--- /dev/null
+++ b/src/include/lwip/apps/snmp_snmpv2_usm.h
@@ -0,0 +1,24 @@
+/*
+Generated by LwipMibCompiler
+*/
+
+#ifndef LWIP_HDR_APPS_SNMP_USER_BASED_SM_MIB_H
+#define LWIP_HDR_APPS_SNMP_USER_BASED_SM_MIB_H
+
+#include "lwip/apps/snmp_opts.h"
+#if LWIP_SNMP
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include "lwip/apps/snmp_core.h"
+
+extern const struct snmp_mib snmpusmmib;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* LWIP_SNMP */
+#endif /* LWIP_HDR_APPS_SNMP_USER_BASED_SM_MIB_H */
diff --git a/src/include/lwip/apps/snmpv3.h b/src/include/lwip/apps/snmpv3.h
index c99fed4..e0dda64 100644
--- a/src/include/lwip/apps/snmpv3.h
+++ b/src/include/lwip/apps/snmpv3.h
@@ -38,18 +38,34 @@
 #include "lwip/apps/snmp_opts.h"
 #include "lwip/err.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #if LWIP_SNMP && LWIP_SNMP_V3
 
-#define SNMP_V3_AUTH_ALGO_INVAL  0
-#define SNMP_V3_AUTH_ALGO_MD5    1
-#define SNMP_V3_AUTH_ALGO_SHA    2
+typedef enum
+{
+  SNMP_V3_AUTH_ALGO_INVAL = 0,
+  SNMP_V3_AUTH_ALGO_MD5   = 1,
+  SNMP_V3_AUTH_ALGO_SHA   = 2
+} snmpv3_auth_algo_t;
 
-#define SNMP_V3_PRIV_ALGO_INVAL  0
-#define SNMP_V3_PRIV_ALGO_DES    1
-#define SNMP_V3_PRIV_ALGO_AES    2
+typedef enum
+{
+  SNMP_V3_PRIV_ALGO_INVAL = 0,
+  SNMP_V3_PRIV_ALGO_DES   = 1,
+  SNMP_V3_PRIV_ALGO_AES   = 2
+} snmpv3_priv_algo_t;
 
-#define SNMP_V3_PRIV_MODE_DECRYPT  0
-#define SNMP_V3_PRIV_MODE_ENCRYPT  1
+typedef enum
+{
+  SNMP_V3_USER_STORAGETYPE_OTHER       = 1,
+  SNMP_V3_USER_STORAGETYPE_VOLATILE    = 2,
+  SNMP_V3_USER_STORAGETYPE_NONVOLATILE = 3,
+  SNMP_V3_USER_STORAGETYPE_PERMANENT   = 4,
+  SNMP_V3_USER_STORAGETYPE_READONLY    = 5
+} snmpv3_user_storagetype_t;
 
 /*
  * The following callback functions must be implemented by the application.
@@ -65,26 +81,34 @@
 u32_t snmpv3_get_engine_time(void);
 void snmpv3_reset_engine_time(void);
 
-err_t snmpv3_get_user(const char* username, u8_t *auth_algo, u8_t *auth_key, u8_t *priv_algo, u8_t *priv_key);
+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);
+u8_t snmpv3_get_amount_of_users(void);
+err_t snmpv3_get_user_storagetype(const char *username, snmpv3_user_storagetype_t *storagetype);
+err_t snmpv3_get_username(char *username, u8_t index);
 
 /* The following functions are provided by the SNMPv3 agent */
 
 void snmpv3_engine_id_changed(void);
+s32_t snmpv3_get_engine_time_internal(void);
 
 void snmpv3_password_to_key_md5(
     const u8_t *password,     /* IN */
-    u8_t        passwordlen,  /* IN */
+    size_t      passwordlen,  /* IN */
     const u8_t *engineID,     /* IN  - pointer to snmpEngineID  */
     u8_t        engineLength, /* IN  - length of snmpEngineID */
     u8_t       *key);         /* OUT - pointer to caller 16-octet buffer */
 
 void snmpv3_password_to_key_sha(
     const u8_t *password,     /* IN */
-    u8_t        passwordlen,  /* IN */
+    size_t      passwordlen,  /* IN */
     const u8_t *engineID,     /* IN  - pointer to snmpEngineID  */
     u8_t        engineLength, /* IN  - length of snmpEngineID */
     u8_t       *key);         /* OUT - pointer to caller 20-octet buffer */
 
 #endif
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* LWIP_HDR_APPS_SNMP_V3_H */
diff --git a/src/include/lwip/apps/sntp.h b/src/include/lwip/apps/sntp.h
index 40df9cc..3c0f95f 100644
--- a/src/include/lwip/apps/sntp.h
+++ b/src/include/lwip/apps/sntp.h
@@ -58,9 +58,13 @@
 void sntp_setserver(u8_t idx, const ip_addr_t *addr);
 const ip_addr_t* sntp_getserver(u8_t idx);
 
+#if SNTP_MONITOR_SERVER_REACHABILITY
+u8_t sntp_getreachability(u8_t idx);
+#endif /* SNTP_MONITOR_SERVER_REACHABILITY */
+
 #if SNTP_SERVER_DNS
-void sntp_setservername(u8_t idx, char *server);
-char *sntp_getservername(u8_t idx);
+void sntp_setservername(u8_t idx, const char *server);
+const char *sntp_getservername(u8_t idx);
 #endif /* SNTP_SERVER_DNS */
 
 #if SNTP_GET_SERVERS_FROM_DHCP
diff --git a/src/include/lwip/apps/sntp_opts.h b/src/include/lwip/apps/sntp_opts.h
index f3651f9..ed98040 100644
--- a/src/include/lwip/apps/sntp_opts.h
+++ b/src/include/lwip/apps/sntp_opts.h
@@ -38,6 +38,7 @@
 #define LWIP_HDR_APPS_SNTP_OPTS_H
 
 #include "lwip/opt.h"
+#include "lwip/prot/iana.h"
 
 /**
  * @defgroup sntp_opts Options
@@ -46,8 +47,10 @@
  */
 
 /** SNTP macro to change system time in seconds
- * Define SNTP_SET_SYSTEM_TIME_US(sec, us) to set the time in microseconds instead of this one
- * if you need the additional precision.
+ * Define SNTP_SET_SYSTEM_TIME_US(sec, us) to set the time in microseconds
+ * instead of this one if you need the additional precision. Alternatively,
+ * define SNTP_SET_SYSTEM_TIME_NTP(sec, frac) in order to work with native
+ * NTP timestamps instead.
  */
 #if !defined SNTP_SET_SYSTEM_TIME || defined __DOXYGEN__
 #define SNTP_SET_SYSTEM_TIME(sec)   LWIP_UNUSED_ARG(sec)
@@ -81,12 +84,7 @@
 
 /** SNTP server port */
 #if !defined SNTP_PORT || defined __DOXYGEN__
-#define SNTP_PORT                   123
-#endif
-
-/** Set this to 1 to allow config of SNTP server(s) by DNS name */
-#if !defined SNTP_SERVER_DNS || defined __DOXYGEN__
-#define SNTP_SERVER_DNS             0
+#define SNTP_PORT                   LWIP_IANA_PORT_SNTP
 #endif
 
 /** Sanity check:
@@ -96,7 +94,7 @@
  *        response comes from the server we sent the request to.
  * - >= 2 to check returned Originate Timestamp against Transmit Timestamp
  *        sent to the server (to ensure response to older request).
- * - >= 3 @todo: discard reply if any of the LI, Stratum, or Transmit Timestamp
+ * - >= 3 @todo: discard reply if any of the VN, Stratum, or Transmit Timestamp
  *        fields is 0 or the Mode field is not 4 (unicast) or 5 (broadcast).
  * - >= 4 @todo: to check that the Root Delay and Root Dispersion fields are each
  *        greater than or equal to 0 and less than infinity, where infinity is
@@ -107,6 +105,30 @@
 #define SNTP_CHECK_RESPONSE         0
 #endif
 
+/** Enable round-trip delay compensation.
+ * Compensate for the round-trip delay by calculating the clock offset from
+ * the originate, receive, transmit and destination timestamps, as per RFC.
+ *
+ * The calculation requires compiler support for 64-bit integers. Also, either
+ * SNTP_SET_SYSTEM_TIME_US or SNTP_SET_SYSTEM_TIME_NTP has to be implemented
+ * for setting the system clock with sub-second precision. Likewise, either
+ * SNTP_GET_SYSTEM_TIME or SNTP_GET_SYSTEM_TIME_NTP needs to be implemented
+ * with sub-second precision.
+ *
+ * Although not strictly required, it makes sense to combine this option with
+ * SNTP_CHECK_RESPONSE >= 2 for sanity-checking of the received timestamps.
+ * Also, in order for the round-trip calculation to work, the difference
+ * between the local clock and the NTP server clock must not be larger than
+ * about 34 years. If that limit is exceeded, the implementation will fall back
+ * to setting the clock without compensation. In order to ensure that the local
+ * clock is always within the permitted range for compensation, even at first
+ * try, it may be necessary to store at least the current year in non-volatile
+ * memory.
+ */
+#if !defined SNTP_COMP_ROUNDTRIP || defined __DOXYGEN__
+#define SNTP_COMP_ROUNDTRIP         0
+#endif
+
 /** According to the RFC, this shall be a random delay
  * between 1 and 5 minutes (in milliseconds) to prevent load peaks.
  * This can be defined to a random generation function,
@@ -114,33 +136,40 @@
  * Turned off by default.
  */
 #if !defined SNTP_STARTUP_DELAY || defined __DOXYGEN__
+#ifdef LWIP_RAND
+#define SNTP_STARTUP_DELAY          1
+#else
 #define SNTP_STARTUP_DELAY          0
 #endif
+#endif
 
 /** If you want the startup delay to be a function, define this
  * to a function (including the brackets) and define SNTP_STARTUP_DELAY to 1.
  */
 #if !defined SNTP_STARTUP_DELAY_FUNC || defined __DOXYGEN__
-#define SNTP_STARTUP_DELAY_FUNC     SNTP_STARTUP_DELAY
+#define SNTP_STARTUP_DELAY_FUNC     (LWIP_RAND() % 5000)
 #endif
 
 /** SNTP receive timeout - in milliseconds
  * Also used as retry timeout - this shouldn't be too low.
- * Default is 3 seconds.
+ * Default is 15 seconds. Must not be beolw 15 seconds by specification (i.e. 15000)
  */
 #if !defined SNTP_RECV_TIMEOUT || defined __DOXYGEN__
-#define SNTP_RECV_TIMEOUT           3000
+#define SNTP_RECV_TIMEOUT           15000
 #endif
 
 /** SNTP update delay - in milliseconds
- * Default is 1 hour. Must not be beolw 15 seconds by specification (i.e. 15000)
+ * Default is 1 hour. Must not be beolw 60 seconds by specification (i.e. 60000)
  */
 #if !defined SNTP_UPDATE_DELAY || defined __DOXYGEN__
 #define SNTP_UPDATE_DELAY           3600000
 #endif
 
 /** SNTP macro to get system time, used with SNTP_CHECK_RESPONSE >= 2
- * to send in request and compare in response.
+ * to send in request and compare in response. Also used for round-trip
+ * delay compensation if SNTP_COMP_ROUNDTRIP != 0.
+ * Alternatively, define SNTP_GET_SYSTEM_TIME_NTP(sec, frac) in order to
+ * work with native NTP timestamps instead.
  */
 #if !defined SNTP_GET_SYSTEM_TIME || defined __DOXYGEN__
 #define SNTP_GET_SYSTEM_TIME(sec, us)     do { (sec) = 0; (us) = 0; } while(0)
@@ -166,6 +195,13 @@
 #define SNTP_RETRY_TIMEOUT_EXP      1
 #endif
 
+/** Keep a reachability shift register per server
+ * Default is on to conform to RFC.
+ */
+#if !defined SNTP_MONITOR_SERVER_REACHABILITY || defined __DOXYGEN__
+#define SNTP_MONITOR_SERVER_REACHABILITY 1
+#endif
+
 /**
  * @}
  */
diff --git a/src/include/lwip/apps/tftp_opts.h b/src/include/lwip/apps/tftp_opts.h
index 6968a80..198f632 100644
--- a/src/include/lwip/apps/tftp_opts.h
+++ b/src/include/lwip/apps/tftp_opts.h
@@ -1,4 +1,4 @@
-/****************************************************************//**
+/**
  *
  * @file tftp_opts.h
  *
@@ -9,7 +9,7 @@
  * Copyright (c) Deltatee Enterprises Ltd. 2013
  * All rights reserved.
  *
- ********************************************************************/
+ */
 
 /* 
  * Redistribution and use in source and binary forms, with or without
@@ -42,6 +42,7 @@
 #define LWIP_HDR_APPS_TFTP_OPTS_H
 
 #include "lwip/opt.h"
+#include "lwip/prot/iana.h"
 
 /**
  * @defgroup tftp_opts Options
@@ -53,14 +54,14 @@
  * Enable TFTP debug messages
  */
 #if !defined TFTP_DEBUG || defined __DOXYGEN__
-#define TFTP_DEBUG            LWIP_DBG_ON
+#define TFTP_DEBUG            LWIP_DBG_OFF
 #endif
 
 /**
  * TFTP server port
  */
 #if !defined TFTP_PORT || defined __DOXYGEN__
-#define TFTP_PORT             69
+#define TFTP_PORT             LWIP_IANA_PORT_TFTP
 #endif
 
 /**
@@ -81,7 +82,7 @@
  * TFTP timer cyclic interval
  */
 #if !defined TFTP_TIMER_MSECS || defined __DOXYGEN__
-#define TFTP_TIMER_MSECS      50
+#define TFTP_TIMER_MSECS      (TFTP_TIMEOUT_MSECS / 10)
 #endif
 
 /**
diff --git a/src/include/lwip/apps/tftp_server.h b/src/include/lwip/apps/tftp_server.h
index 3fbe701..0a7fbee 100644
--- a/src/include/lwip/apps/tftp_server.h
+++ b/src/include/lwip/apps/tftp_server.h
@@ -1,4 +1,4 @@
-/****************************************************************//**
+/**
  *
  * @file tftp_server.h
  *
@@ -9,7 +9,7 @@
  * Copyright (c) Deltatee Enterprises Ltd. 2013
  * All rights reserved.
  *
- ********************************************************************/
+ */
 
 /* 
  * Redistribution and use in source and binary forms, with or without
@@ -86,6 +86,7 @@
 };
 
 err_t tftp_init(const struct tftp_context* ctx);
+void tftp_cleanup(void);
 
 #ifdef __cplusplus
 }
diff --git a/src/include/lwip/arch.h b/src/include/lwip/arch.h
index 55714e1..58dae33 100644
--- a/src/include/lwip/arch.h
+++ b/src/include/lwip/arch.h
@@ -52,6 +52,8 @@
  * @ingroup sys_layer
  * All defines related to this section must not be placed in lwipopts.h,
  * but in arch/cc.h!
+ * If the compiler does not provide memset() this file must include a
+ * definition of it, or include a file which defines it.
  * These options cannot be \#defined in lwipopts.h since they are not options
  * of lwIP itself, but options of the lwIP port to your system.
  * @{
@@ -116,12 +118,20 @@
 /* Define generic types used in lwIP */
 #if !LWIP_NO_STDINT_H
 #include <stdint.h>
+/* stdint.h is C99 which should also provide support for 64-bit integers */
+#if !defined(LWIP_HAVE_INT64) && defined(UINT64_MAX)
+#define LWIP_HAVE_INT64 1
+#endif
 typedef uint8_t   u8_t;
 typedef int8_t    s8_t;
 typedef uint16_t  u16_t;
 typedef int16_t   s16_t;
 typedef uint32_t  u32_t;
 typedef int32_t   s32_t;
+#if LWIP_HAVE_INT64
+typedef uint64_t  u64_t;
+typedef int64_t   s64_t;
+#endif
 typedef uintptr_t mem_ptr_t;
 #endif
 
@@ -164,7 +174,7 @@
 
 /** Define this to 1 in arch/cc.h of your port if your compiler does not provide
  * the limits.h header. You need to define the type limits yourself in this case
- * (e.g. INT_MAX).
+ * (e.g. INT_MAX, SSIZE_MAX).
  */
 #ifndef LWIP_NO_LIMITS_H
 #define LWIP_NO_LIMITS_H 0
@@ -175,6 +185,56 @@
 #include <limits.h>
 #endif
 
+/* Do we need to define ssize_t? This is a compatibility hack:
+ * Unfortunately, this type seems to be unavailable on some systems (even if
+ * sys/types or unistd.h are available).
+ * Being like that, we define it to 'int' if SSIZE_MAX is not defined.
+ */
+#ifdef SSIZE_MAX
+/* If SSIZE_MAX is defined, unistd.h should provide the type as well */
+#ifndef LWIP_NO_UNISTD_H
+#define LWIP_NO_UNISTD_H 0
+#endif
+#if !LWIP_NO_UNISTD_H
+#include <unistd.h>
+#endif
+#else /* SSIZE_MAX */
+typedef int ssize_t;
+#define SSIZE_MAX INT_MAX
+#endif /* SSIZE_MAX */
+
+/* some maximum values needed in lwip code */
+#define LWIP_UINT32_MAX 0xffffffff
+
+/** Define this to 1 in arch/cc.h of your port if your compiler does not provide
+ * the ctype.h header. If ctype.h is available, a few character functions
+ * are mapped to the appropriate functions (lwip_islower, lwip_isdigit...), if
+ * not, a private implementation is provided.
+ */
+#ifndef LWIP_NO_CTYPE_H
+#define LWIP_NO_CTYPE_H 0
+#endif
+
+#if LWIP_NO_CTYPE_H
+#define lwip_in_range(c, lo, up)  ((u8_t)(c) >= (lo) && (u8_t)(c) <= (up))
+#define lwip_isdigit(c)           lwip_in_range((c), '0', '9')
+#define lwip_isxdigit(c)          (lwip_isdigit(c) || lwip_in_range((c), 'a', 'f') || lwip_in_range((c), 'A', 'F'))
+#define lwip_islower(c)           lwip_in_range((c), 'a', 'z')
+#define lwip_isspace(c)           ((c) == ' ' || (c) == '\f' || (c) == '\n' || (c) == '\r' || (c) == '\t' || (c) == '\v')
+#define lwip_isupper(c)           lwip_in_range((c), 'A', 'Z')
+#define lwip_tolower(c)           (lwip_isupper(c) ? (c) - 'A' + 'a' : c)
+#define lwip_toupper(c)           (lwip_islower(c) ? (c) - 'a' + 'A' : c)
+#else
+#include <ctype.h>
+#define lwip_isdigit(c)           isdigit((unsigned char)(c))
+#define lwip_isxdigit(c)          isxdigit((unsigned char)(c))
+#define lwip_islower(c)           islower((unsigned char)(c))
+#define lwip_isspace(c)           isspace((unsigned char)(c))
+#define lwip_isupper(c)           isupper((unsigned char)(c))
+#define lwip_tolower(c)           tolower((unsigned char)(c))
+#define lwip_toupper(c)           toupper((unsigned char)(c))
+#endif
+
 /** C++ const_cast<target_type>(val) equivalent to remove constness from a value (GCC -Wcast-qual) */
 #ifndef LWIP_CONST_CAST
 #define LWIP_CONST_CAST(target_type, val) ((target_type)((ptrdiff_t)val))
@@ -192,6 +252,11 @@
 #define LWIP_PTR_NUMERIC_CAST(target_type, val) LWIP_CONST_CAST(target_type, val)
 #endif
 
+/** Avoid warnings/errors related to implicitly casting away packed attributes by doing a explicit cast */
+#ifndef LWIP_PACKED_CAST
+#define LWIP_PACKED_CAST(target_type, val) LWIP_CONST_CAST(target_type, val)
+#endif
+
 /** 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
@@ -291,7 +356,7 @@
 #define PACK_STRUCT_FLD_S(x) PACK_STRUCT_FIELD(x)
 #endif /* PACK_STRUCT_FLD_S */
 
-/** Packed structs support using \#include files before and after struct to be packed.\n
+/** 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
  * This can be used to implement struct packing on MS Visual C compilers, see
@@ -308,6 +373,15 @@
 #define LWIP_UNUSED_ARG(x) (void)x
 #endif /* LWIP_UNUSED_ARG */
 
+/** LWIP_PROVIDE_ERRNO==1: Let lwIP provide ERRNO values and the 'errno' variable.
+ * If this is disabled, cc.h must either define 'errno', include <errno.h>,
+ * define LWIP_ERRNO_STDINCLUDE to get <errno.h> included or
+ * define LWIP_ERRNO_INCLUDE to <errno.h> or equivalent.
+ */
+#if defined __DOXYGEN__
+#define LWIP_PROVIDE_ERRNO
+#endif
+
 /**
  * @}
  */
diff --git a/src/include/lwip/debug.h b/src/include/lwip/debug.h
index a142f1c..baa6a40 100644
--- a/src/include/lwip/debug.h
+++ b/src/include/lwip/debug.h
@@ -115,9 +115,6 @@
 #ifndef LWIP_NOASSERT
 #define LWIP_ASSERT(message, assertion) do { if (!(assertion)) { \
   LWIP_PLATFORM_ASSERT(message); }} while(0)
-#ifndef LWIP_PLATFORM_ASSERT
-#error "If you want to use LWIP_ASSERT, LWIP_PLATFORM_ASSERT(message) needs to be defined in your arch/cc.h"
-#endif
 #else  /* LWIP_NOASSERT */
 #define LWIP_ASSERT(message, assertion)
 #endif /* LWIP_NOASSERT */
@@ -145,9 +142,6 @@
 #endif
 
 #ifdef LWIP_DEBUG
-#ifndef LWIP_PLATFORM_DIAG
-#error "If you want to use LWIP_DEBUG, LWIP_PLATFORM_DIAG(message) needs to be defined in your arch/cc.h"
-#endif
 #define LWIP_DEBUGF(debug, message) do { \
                                if ( \
                                    ((debug) & LWIP_DBG_ON) && \
diff --git a/src/include/lwip/def.h b/src/include/lwip/def.h
index 82a9d89..dfb266d 100644
--- a/src/include/lwip/def.h
+++ b/src/include/lwip/def.h
@@ -34,6 +34,17 @@
  * Author: Adam Dunkels <adam@sics.se>
  *
  */
+
+/**
+ * @defgroup perf Performance measurement
+ * @ingroup sys_layer
+ * All defines related to this section must not be placed in lwipopts.h,
+ * but in arch/perf.h!
+ * Measurement calls made throughout lwip, these can be defined to nothing.
+ * - PERF_START: start measuring something.
+ * - PERF_STOP(x): stop measuring something, and record the result.
+ */
+
 #ifndef LWIP_HDR_DEF_H
 #define LWIP_HDR_DEF_H
 
@@ -72,14 +83,14 @@
 #endif
 
 #if BYTE_ORDER == BIG_ENDIAN
-#define lwip_htons(x) (x)
-#define lwip_ntohs(x) (x)
-#define lwip_htonl(x) (x)
-#define lwip_ntohl(x) (x)
-#define PP_HTONS(x) (x)
-#define PP_NTOHS(x) (x)
-#define PP_HTONL(x) (x)
-#define PP_NTOHL(x) (x)
+#define lwip_htons(x) ((u16_t)(x))
+#define lwip_ntohs(x) ((u16_t)(x))
+#define lwip_htonl(x) ((u32_t)(x))
+#define lwip_ntohl(x) ((u32_t)(x))
+#define PP_HTONS(x)   ((u16_t)(x))
+#define PP_NTOHS(x)   ((u16_t)(x))
+#define PP_HTONL(x)   ((u32_t)(x))
+#define PP_NTOHL(x)   ((u32_t)(x))
 #else /* BYTE_ORDER != BIG_ENDIAN */
 #ifndef lwip_htons
 u16_t lwip_htons(u16_t x);
@@ -94,12 +105,12 @@
 /* These macros should be calculated by the preprocessor and are used
    with compile-time constants only (so that there is no little-endian
    overhead at runtime). */
-#define PP_HTONS(x) ((((x) & 0x00ffUL) << 8) | (((x) & 0xff00UL) >> 8))
+#define PP_HTONS(x) ((u16_t)((((x) & (u16_t)0x00ffU) << 8) | (((x) & (u16_t)0xff00U) >> 8)))
 #define PP_NTOHS(x) PP_HTONS(x)
-#define PP_HTONL(x) ((((x) & 0x000000ffUL) << 24) | \
-                     (((x) & 0x0000ff00UL) <<  8) | \
-                     (((x) & 0x00ff0000UL) >>  8) | \
-                     (((x) & 0xff000000UL) >> 24))
+#define PP_HTONL(x) ((((x) & (u32_t)0x000000ffUL) << 24) | \
+                     (((x) & (u32_t)0x0000ff00UL) <<  8) | \
+                     (((x) & (u32_t)0x00ff0000UL) >>  8) | \
+                     (((x) & (u32_t)0xff000000UL) >> 24))
 #define PP_NTOHL(x) PP_HTONL(x)
 #endif /* BYTE_ORDER == BIG_ENDIAN */
 
diff --git a/src/include/lwip/dhcp.h b/src/include/lwip/dhcp.h
index df932af..c78aa0b 100644
--- a/src/include/lwip/dhcp.h
+++ b/src/include/lwip/dhcp.h
@@ -68,8 +68,6 @@
 {
   /** transaction identifier of last sent request */
   u32_t xid;
-  /** incoming msg */
-  struct dhcp_msg *msg_in;
   /** track PCB allocation state */
   u8_t pcb_allocated;
   /** current DHCP state machine state */
@@ -81,9 +79,6 @@
 #endif
   u8_t subnet_mask_given;
 
-  struct pbuf *p_out; /* pbuf of outcoming msg */
-  struct dhcp_msg *msg_out; /* outgoing msg */
-  u16_t options_out_len; /* outgoing msg options length */
   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 */
@@ -114,6 +109,7 @@
 err_t dhcp_renew(struct netif *netif);
 err_t dhcp_release(struct netif *netif);
 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
diff --git a/src/include/lwip/dhcp6.h b/src/include/lwip/dhcp6.h
index 455336d..5cc4a01 100644
--- a/src/include/lwip/dhcp6.h
+++ b/src/include/lwip/dhcp6.h
@@ -1,11 +1,13 @@
 /**
  * @file
  *
- * IPv6 address autoconfiguration as per RFC 4862.
+ * DHCPv6 client: IPv6 address autoconfiguration as per
+ * RFC 3315 (stateful DHCPv6) and
+ * RFC 3736 (stateless DHCPv6).
  */
 
 /*
- * Copyright (c) 2010 Inico Technologies Ltd.
+ * Copyright (c) 2018 Simon Goldschmidt
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without modification,
@@ -32,12 +34,7 @@
  *
  * This file is part of the lwIP TCP/IP stack.
  *
- * Author: Ivan Delamer <delamer@inicotech.com>
- *
- * IPv6 address autoconfiguration as per RFC 4862.
- *
- * Please coordinate changes and requests with Ivan Delamer
- * <delamer@inicotech.com>
+ * Author: Simon Goldschmidt <goldsimon@gmx.de>
  */
 
 #ifndef LWIP_HDR_IP6_DHCP6_H
@@ -47,12 +44,61 @@
 
 #if LWIP_IPV6_DHCP6  /* don't build if not configured for use in lwipopts.h */
 
+#include "lwip/err.h"
+#include "lwip/netif.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** period (in milliseconds) of the application calling dhcp6_tmr() */
+#define DHCP6_TIMER_MSECS   500
 
 struct dhcp6
 {
-  /*@todo: implement DHCP6*/
+  /** transaction identifier of last sent request */
+  u32_t xid;
+  /** track PCB allocation state */
+  u8_t pcb_allocated;
+  /** current DHCPv6 state machine state */
+  u8_t state;
+  /** retries of current request */
+  u8_t tries;
+  /** if request config is triggered while another action is active, this keeps track of it */
+  u8_t request_config_pending;
+  /** #ticks with period DHCP6_TIMER_MSECS for request timeout */
+  u16_t request_timeout;
+#if LWIP_IPV6_DHCP6_STATEFUL
+  /* @todo: add more members here to keep track of stateful DHCPv6 data, like lease times */
+#endif /* LWIP_IPV6_DHCP6_STATEFUL */
 };
 
+void dhcp6_set_struct(struct netif *netif, struct dhcp6 *dhcp6);
+/** Remove a struct dhcp6 previously set to the netif using dhcp6_set_struct() */
+#define dhcp6_remove_struct(netif) netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, NULL)
+void dhcp6_cleanup(struct netif *netif);
+
+err_t dhcp6_enable_stateful(struct netif *netif);
+err_t dhcp6_enable_stateless(struct netif *netif);
+void dhcp6_disable(struct netif *netif);
+
+void dhcp6_tmr(void);
+
+void dhcp6_nd6_ra_trigger(struct netif *netif, u8_t managed_addr_config, u8_t other_config);
+
+#if LWIP_DHCP6_GET_NTP_SRV
+/** This function must exist, in other to add offered NTP servers to
+ * the NTP (or SNTP) engine.
+ * See LWIP_DHCP6_MAX_NTP_SERVERS */
+extern void dhcp6_set_ntp_servers(u8_t num_ntp_servers, const ip_addr_t* ntp_server_addrs);
+#endif /* LWIP_DHCP6_GET_NTP_SRV */
+
+#define netif_dhcp6_data(netif) ((struct dhcp6*)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6))
+
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* LWIP_IPV6_DHCP6 */
 
 #endif /* LWIP_HDR_IP6_DHCP6_H */
diff --git a/src/include/lwip/dns.h b/src/include/lwip/dns.h
index 1453d72..0913415 100644
--- a/src/include/lwip/dns.h
+++ b/src/include/lwip/dns.h
@@ -44,6 +44,7 @@
 #if LWIP_DNS
 
 #include "lwip/ip_addr.h"
+#include "lwip/err.h"
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/lwip/err.h b/src/include/lwip/err.h
index 84e528d..887d9b3 100644
--- a/src/include/lwip/err.h
+++ b/src/include/lwip/err.h
@@ -49,14 +49,6 @@
  * @{
  */
 
-/** Define LWIP_ERR_T in cc.h if you want to use
- *  a different type for your platform (must be signed). */
-#ifdef LWIP_ERR_T
-typedef LWIP_ERR_T err_t;
-#else /* LWIP_ERR_T */
-typedef s8_t err_t;
-#endif /* LWIP_ERR_T*/
-
 /** Definitions for error constants. */
 typedef enum {
 /** No error, everything OK. */
@@ -96,7 +88,13 @@
   ERR_ARG        = -16
 } err_enum_t;
 
-#define ERR_IS_FATAL(e) ((e) <= ERR_ABRT)
+/** Define LWIP_ERR_T in cc.h if you want to use
+ *  a different type for your platform (must be signed). */
+#ifdef LWIP_ERR_T
+typedef LWIP_ERR_T err_t;
+#else /* LWIP_ERR_T */
+typedef s8_t err_t;
+#endif /* LWIP_ERR_T*/
 
 /**
  * @}
diff --git a/src/include/lwip/errno.h b/src/include/lwip/errno.h
index 641cffb..48d6b53 100644
--- a/src/include/lwip/errno.h
+++ b/src/include/lwip/errno.h
@@ -179,10 +179,15 @@
 
 #else /* LWIP_PROVIDE_ERRNO */
 
-/* Define LWIP_ERRNO_INCLUDE to <errno.h> to include the error defines here */
+/* Define LWIP_ERRNO_STDINCLUDE if you want to include <errno.h> here */
+#ifdef LWIP_ERRNO_STDINCLUDE
+#include <errno.h>
+#else /* LWIP_ERRNO_STDINCLUDE */
+/* Define LWIP_ERRNO_INCLUDE to an equivalent of <errno.h> to include the error defines here */
 #ifdef LWIP_ERRNO_INCLUDE
 #include LWIP_ERRNO_INCLUDE
 #endif /* LWIP_ERRNO_INCLUDE */
+#endif /* LWIP_ERRNO_STDINCLUDE */
 
 #endif /* LWIP_PROVIDE_ERRNO */
 
diff --git a/src/include/lwip/etharp.h b/src/include/lwip/etharp.h
index 7080a19..2036b24 100644
--- a/src/include/lwip/etharp.h
+++ b/src/include/lwip/etharp.h
@@ -52,14 +52,14 @@
 #include "lwip/ip4.h"
 #include "lwip/prot/ethernet.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 #if LWIP_IPV4 && LWIP_ARP /* don't build if not configured for use in lwipopts.h */
 
 #include "lwip/prot/etharp.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /** 1 seconds period */
 #define ARP_TMR_INTERVAL 1000
 
@@ -75,9 +75,9 @@
 
 #define etharp_init() /* Compatibility define, no init needed. */
 void etharp_tmr(void);
-s8_t etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr,
+ssize_t etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr,
          struct eth_addr **eth_ret, const ip4_addr_t **ip_ret);
-u8_t etharp_get_entry(u8_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret);
+int etharp_get_entry(size_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret);
 err_t etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr);
 err_t etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q);
 err_t etharp_request(struct netif *netif, const ip4_addr_t *ipaddr);
@@ -93,14 +93,13 @@
 err_t etharp_remove_static_entry(const ip4_addr_t *ipaddr);
 #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
 
-#endif /* LWIP_IPV4 && LWIP_ARP */
-
 void etharp_input(struct pbuf *p, struct netif *netif);
 
 #ifdef __cplusplus
 }
 #endif
 
+#endif /* LWIP_IPV4 && LWIP_ARP */
 #endif /* LWIP_ARP || LWIP_ETHERNET */
 
 #endif /* LWIP_HDR_NETIF_ETHARP_H */
diff --git a/src/include/lwip/icmp6.h b/src/include/lwip/icmp6.h
index a29dc8c..0ccb789 100644
--- a/src/include/lwip/icmp6.h
+++ b/src/include/lwip/icmp6.h
@@ -57,7 +57,9 @@
 void icmp6_dest_unreach(struct pbuf *p, enum icmp6_dur_code c);
 void icmp6_packet_too_big(struct pbuf *p, u32_t mtu);
 void icmp6_time_exceeded(struct pbuf *p, enum icmp6_te_code c);
-void icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, u32_t pointer);
+void 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);
+void icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, const void *pointer);
 
 #endif /* LWIP_ICMP6 && LWIP_IPV6 */
 
diff --git a/src/include/lwip/if_api.h b/src/include/lwip/if_api.h
new file mode 100644
index 0000000..39017ab
--- /dev/null
+++ b/src/include/lwip/if_api.h
@@ -0,0 +1,68 @@
+/**
+ * @file
+ * Interface Identification APIs from:
+ *              RFC 3493: Basic Socket Interface Extensions for IPv6
+ *                  Section 4: Interface Identification
+ */
+
+/*
+ * 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>
+ *
+ */
+#ifndef LWIP_HDR_IF_H
+#define LWIP_HDR_IF_H
+
+#include "lwip/opt.h"
+
+#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/netif.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define IF_NAMESIZE NETIF_NAMESIZE
+
+char * lwip_if_indextoname(unsigned int ifindex, char *ifname);
+unsigned int lwip_if_nametoindex(const char *ifname);
+
+#if LWIP_COMPAT_SOCKETS
+#define if_indextoname(ifindex, ifname)  lwip_if_indextoname(ifindex,ifname)
+#define if_nametoindex(ifname)           lwip_if_nametoindex(ifname)
+#endif /* LWIP_COMPAT_SOCKETS */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_SOCKET */
+
+#endif /* LWIP_HDR_IF_H */
diff --git a/src/include/lwip/inet.h b/src/include/lwip/inet.h
index 4a34f02..2982a0f 100644
--- a/src/include/lwip/inet.h
+++ b/src/include/lwip/inet.h
@@ -134,8 +134,6 @@
 
 #define inet_addr_from_ip4addr(target_inaddr, source_ipaddr) ((target_inaddr)->s_addr = ip4_addr_get_u32(source_ipaddr))
 #define inet_addr_to_ip4addr(target_ipaddr, source_inaddr)   (ip4_addr_set_u32(target_ipaddr, (source_inaddr)->s_addr))
-/* ATTENTION: the next define only works because both s_addr and ip4_addr_t are an u32_t effectively! */
-#define inet_addr_to_ip4addr_p(target_ip4addr_p, source_inaddr)   ((target_ip4addr_p) = (ip4_addr_t*)&((source_inaddr)->s_addr))
 
 /* directly map this to the lwip internal functions */
 #define inet_addr(cp)                   ipaddr_addr(cp)
@@ -153,9 +151,8 @@
 #define inet6_addr_to_ip6addr(target_ip6addr, source_in6addr)   {(target_ip6addr)->addr[0] = (source_in6addr)->un.u32_addr[0]; \
                                                                  (target_ip6addr)->addr[1] = (source_in6addr)->un.u32_addr[1]; \
                                                                  (target_ip6addr)->addr[2] = (source_in6addr)->un.u32_addr[2]; \
-                                                                 (target_ip6addr)->addr[3] = (source_in6addr)->un.u32_addr[3];}
-/* ATTENTION: the next define only works because both in6_addr and ip6_addr_t are an u32_t[4] effectively! */
-#define inet6_addr_to_ip6addr_p(target_ip6addr_p, source_in6addr)   ((target_ip6addr_p) = (ip6_addr_t*)(source_in6addr))
+                                                                 (target_ip6addr)->addr[3] = (source_in6addr)->un.u32_addr[3]; \
+                                                                 ip6_addr_clear_zone(target_ip6addr);}
 
 /* directly map this to the lwip internal functions */
 #define inet6_aton(cp, addr)            ip6addr_aton(cp, (ip6_addr_t*)addr)
diff --git a/src/include/lwip/inet_chksum.h b/src/include/lwip/inet_chksum.h
index 4e23d7f..76893ef 100644
--- a/src/include/lwip/inet_chksum.h
+++ b/src/include/lwip/inet_chksum.h
@@ -49,7 +49,7 @@
 
 /** Split an u32_t in two u16_ts and add them up */
 #ifndef FOLD_U32T
-#define FOLD_U32T(u)          (((u) >> 16) + ((u) & 0x0000ffffUL))
+#define FOLD_U32T(u)          ((u32_t)(((u) >> 16) + ((u) & 0x0000ffffUL)))
 #endif
 
 #if LWIP_CHECKSUM_ON_COPY
diff --git a/src/include/lwip/init.h b/src/include/lwip/init.h
index 3c234cb..a149be1 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      0
+#define LWIP_VERSION_MINOR      1
 /** x.x.X: Revision of the stack */
-#define LWIP_VERSION_REVISION   3
+#define LWIP_VERSION_REVISION   2
 /** 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) */
@@ -81,8 +81,8 @@
 #endif
 
 /** Provides the version of the stack */
-#define LWIP_VERSION   (((u32_t)LWIP_VERSION_MAJOR) << 24   | ((u32_t)LWIP_VERSION_MINOR) << 16 | \
-                        ((u32_t)LWIP_VERSION_REVISION) << 8 | ((u32_t)LWIP_VERSION_RC))
+#define LWIP_VERSION   ((LWIP_VERSION_MAJOR) << 24   | (LWIP_VERSION_MINOR) << 16 | \
+                        (LWIP_VERSION_REVISION) << 8 | (LWIP_VERSION_RC))
 /** Provides the version of the stack as string */
 #define LWIP_VERSION_STRING     LWIP_VERSTR(LWIP_VERSION_MAJOR) "." LWIP_VERSTR(LWIP_VERSION_MINOR) "." LWIP_VERSTR(LWIP_VERSION_REVISION) LWIP_VERSION_STRING_SUFFIX
 
diff --git a/src/include/lwip/init.h.cmake.in b/src/include/lwip/init.h.cmake.in
new file mode 100644
index 0000000..9b609b7
--- /dev/null
+++ b/src/include/lwip/init.h.cmake.in
@@ -0,0 +1,100 @@
+/**
+ * @file
+ * lwIP initialization API
+ */
+
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Adam Dunkels <adam@sics.se>
+ *
+ */
+#ifndef LWIP_HDR_INIT_H
+#define LWIP_HDR_INIT_H
+
+#include "lwip/opt.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup lwip_version Version
+ * @ingroup lwip
+ * @{
+ */
+
+/** X.x.x: Major version of the stack */
+#define LWIP_VERSION_MAJOR      ${LWIP_VERSION_MAJOR}
+/** x.X.x: Minor version of the stack */
+#define LWIP_VERSION_MINOR      ${LWIP_VERSION_MINOR}
+/** x.x.X: Revision of the stack */
+#define LWIP_VERSION_REVISION   ${LWIP_VERSION_REVISION}
+/** 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) */
+#define LWIP_VERSION_RC         ${LWIP_VERSION_RC}
+
+/** LWIP_VERSION_RC is set to LWIP_RC_RELEASE for official releases */
+#define LWIP_RC_RELEASE         255
+/** LWIP_VERSION_RC is set to LWIP_RC_DEVELOPMENT for Git versions */
+#define LWIP_RC_DEVELOPMENT     0
+
+#define LWIP_VERSION_IS_RELEASE     (LWIP_VERSION_RC == LWIP_RC_RELEASE)
+#define LWIP_VERSION_IS_DEVELOPMENT (LWIP_VERSION_RC == LWIP_RC_DEVELOPMENT)
+#define LWIP_VERSION_IS_RC          ((LWIP_VERSION_RC != LWIP_RC_RELEASE) && (LWIP_VERSION_RC != LWIP_RC_DEVELOPMENT))
+
+/* Some helper defines to get a version string */
+#define LWIP_VERSTR2(x) #x
+#define LWIP_VERSTR(x) LWIP_VERSTR2(x)
+#if LWIP_VERSION_IS_RELEASE
+#define LWIP_VERSION_STRING_SUFFIX ""
+#elif LWIP_VERSION_IS_DEVELOPMENT
+#define LWIP_VERSION_STRING_SUFFIX "d"
+#else
+#define LWIP_VERSION_STRING_SUFFIX "rc" LWIP_VERSTR(LWIP_VERSION_RC)
+#endif
+
+/** Provides the version of the stack */
+#define LWIP_VERSION   ((LWIP_VERSION_MAJOR) << 24   | (LWIP_VERSION_MINOR) << 16 | \
+                        (LWIP_VERSION_REVISION) << 8 | (LWIP_VERSION_RC))
+/** Provides the version of the stack as string */
+#define LWIP_VERSION_STRING     LWIP_VERSTR(LWIP_VERSION_MAJOR) "." LWIP_VERSTR(LWIP_VERSION_MINOR) "." LWIP_VERSTR(LWIP_VERSION_REVISION) LWIP_VERSION_STRING_SUFFIX
+
+/**
+ * @}
+ */
+
+/* Modules initialization */
+void lwip_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_INIT_H */
diff --git a/src/include/lwip/ip.h b/src/include/lwip/ip.h
index 0673be9..653c3b2 100644
--- a/src/include/lwip/ip.h
+++ b/src/include/lwip/ip.h
@@ -63,31 +63,33 @@
 #define LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p) LWIP_ASSERT("p->ref == 1", (p)->ref == 1)
 #endif
 
-#if LWIP_NETIF_HWADDRHINT
-#define IP_PCB_ADDRHINT ;u8_t addr_hint
-#else
-#define IP_PCB_ADDRHINT
-#endif /* LWIP_NETIF_HWADDRHINT */
+#if LWIP_NETIF_USE_HINTS
+#define IP_PCB_NETIFHINT ;struct netif_hint netif_hints
+#else /* LWIP_NETIF_USE_HINTS */
+#define IP_PCB_NETIFHINT
+#endif /* LWIP_NETIF_USE_HINTS */
 
 /** This is the common part of all PCB types. It needs to be at the
    beginning of a PCB type definition. It is located here so that
    changes to this common part are made in one location instead of
    having to change all PCB structs. */
-#define IP_PCB \
+#define IP_PCB                             \
   /* ip addresses in network byte order */ \
-  ip_addr_t local_ip; \
-  ip_addr_t remote_ip; \
-   /* Socket options */  \
-  u8_t so_options;      \
-   /* Type Of Service */ \
-  u8_t tos;              \
-  /* Time To Live */     \
-  u8_t ttl               \
+  ip_addr_t local_ip;                      \
+  ip_addr_t remote_ip;                     \
+  /* Bound netif index */                  \
+  u8_t netif_idx;                          \
+  /* Socket options */                     \
+  u8_t so_options;                         \
+  /* Type Of Service */                    \
+  u8_t tos;                                \
+  /* Time To Live */                       \
+  u8_t ttl                                 \
   /* link layer address resolution hint */ \
-  IP_PCB_ADDRHINT
+  IP_PCB_NETIFHINT
 
 struct ip_pcb {
-/* Common members of all PCB types */
+  /* Common members of all PCB types */
   IP_PCB;
 };
 
@@ -110,7 +112,7 @@
   struct netif *current_input_netif;
 #if LWIP_IPV4
   /** Header of the input packet currently being processed. */
-  struct ip_hdr *current_ip4_header;
+  const struct ip_hdr *current_ip4_header;
 #endif /* LWIP_IPV4 */
 #if LWIP_IPV6
   /** Header of the input IPv6 packet currently being processed. */
@@ -146,7 +148,7 @@
 /** 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. */
-#define ip4_current_header()     ((const struct ip_hdr*)(ip_data.current_ip4_header))
+#define ip4_current_header()     ip_data.current_ip4_header
 /** 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. */
@@ -175,7 +177,7 @@
 /** 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. */
-#define ip4_current_header()     ((const struct ip_hdr*)(ip_data.current_ip4_header))
+#define ip4_current_header()     ip_data.current_ip4_header
 /** Always returns FALSE when only supporting IPv4 only */
 #define ip_current_is_v6()        0
 /** Get the transport layer protocol */
@@ -198,7 +200,7 @@
 /** Get the transport layer protocol */
 #define ip_current_header_proto() IP6H_NEXTH(ip6_current_header())
 /** Get the transport layer header */
-#define ip_next_header_ptr()     ((const void*)((const u8_t*)ip6_current_header()))
+#define ip_next_header_ptr()     ((const void*)(((const u8_t*)ip6_current_header()) + ip_current_header_tot_len()))
 /** Source IP6 address of current_header */
 #define ip6_current_src_addr()    (&ip_data.current_iphdr_src)
 /** Destination IP6 address of current_header */
@@ -214,9 +216,9 @@
 /** Gets an IP pcb option (SOF_* flags) */
 #define ip_get_option(pcb, opt)   ((pcb)->so_options & (opt))
 /** Sets an IP pcb option (SOF_* flags) */
-#define ip_set_option(pcb, opt)   ((pcb)->so_options |= (opt))
+#define ip_set_option(pcb, opt)   ((pcb)->so_options = (u8_t)((pcb)->so_options | (opt)))
 /** Resets an IP pcb option (SOF_* flags) */
-#define ip_reset_option(pcb, opt) ((pcb)->so_options &= ~(opt))
+#define ip_reset_option(pcb, opt) ((pcb)->so_options = (u8_t)((pcb)->so_options & ~(opt)))
 
 #if LWIP_IPV4 && LWIP_IPV6
 /**
@@ -243,11 +245,16 @@
         (IP_IS_V6(dest) ? \
         ip6_output_if_src(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, netif) : \
         ip4_output_if_src(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto, netif))
-/** Output IP packet with addr_hint */
-#define ip_output_hinted(p, src, dest, ttl, tos, proto, addr_hint) \
+/** Output IP packet that already includes an IP header. */
+#define ip_output_if_hdrincl(p, src, dest, netif) \
         (IP_IS_V6(dest) ? \
-        ip6_output_hinted(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, addr_hint) : \
-        ip4_output_hinted(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto, addr_hint))
+        ip6_output_if(p, ip_2_ip6(src), LWIP_IP_HDRINCL, 0, 0, 0, netif) : \
+        ip4_output_if(p, ip_2_ip4(src), LWIP_IP_HDRINCL, 0, 0, 0, netif))
+/** Output IP packet with netif_hint */
+#define ip_output_hinted(p, src, dest, ttl, tos, proto, netif_hint) \
+        (IP_IS_V6(dest) ? \
+        ip6_output_hinted(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, netif_hint) : \
+        ip4_output_hinted(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto, netif_hint))
 /**
  * @ingroup ip
  * Get netif for address combination. See \ref ip6_route and \ref ip4_route
@@ -255,7 +262,7 @@
 #define ip_route(src, dest) \
         (IP_IS_V6(dest) ? \
         ip6_route(ip_2_ip6(src), ip_2_ip6(dest)) : \
-        ip4_route_src(ip_2_ip4(dest), ip_2_ip4(src)))
+        ip4_route_src(ip_2_ip4(src), ip_2_ip4(dest)))
 /**
  * @ingroup ip
  * Get netif for IP.
@@ -275,10 +282,12 @@
         ip4_output_if(p, src, dest, ttl, tos, proto, netif)
 #define ip_output_if_src(p, src, dest, ttl, tos, proto, netif) \
         ip4_output_if_src(p, src, dest, ttl, tos, proto, netif)
-#define ip_output_hinted(p, src, dest, ttl, tos, proto, addr_hint) \
-        ip4_output_hinted(p, src, dest, ttl, tos, proto, addr_hint)
+#define ip_output_hinted(p, src, dest, ttl, tos, proto, netif_hint) \
+        ip4_output_hinted(p, src, dest, ttl, tos, proto, netif_hint)
+#define ip_output_if_hdrincl(p, src, dest, netif) \
+        ip4_output_if(p, src, LWIP_IP_HDRINCL, 0, 0, 0, netif)
 #define ip_route(src, dest) \
-        ip4_route_src(dest, src)
+        ip4_route_src(src, dest)
 #define ip_netif_get_local_ip(netif, dest) \
         ip4_netif_get_local_ip(netif)
 #define ip_debug_print(is_ipv6, p) ip4_debug_print(p)
@@ -293,8 +302,10 @@
         ip6_output_if(p, src, dest, ttl, tos, proto, netif)
 #define ip_output_if_src(p, src, dest, ttl, tos, proto, netif) \
         ip6_output_if_src(p, src, dest, ttl, tos, proto, netif)
-#define ip_output_hinted(p, src, dest, ttl, tos, proto, addr_hint) \
-        ip6_output_hinted(p, src, dest, ttl, tos, proto, addr_hint)
+#define ip_output_hinted(p, src, dest, ttl, tos, proto, netif_hint) \
+        ip6_output_hinted(p, src, dest, ttl, tos, proto, netif_hint)
+#define ip_output_if_hdrincl(p, src, dest, netif) \
+        ip6_output_if(p, src, LWIP_IP_HDRINCL, 0, 0, 0, netif)
 #define ip_route(src, dest) \
         ip6_route(src, dest)
 #define ip_netif_get_local_ip(netif, dest) \
diff --git a/src/include/lwip/ip4.h b/src/include/lwip/ip4.h
index 48246ec..fd35a33 100644
--- a/src/include/lwip/ip4.h
+++ b/src/include/lwip/ip4.h
@@ -64,9 +64,9 @@
 #define ip_init() /* Compatibility define, no init needed. */
 struct netif *ip4_route(const ip4_addr_t *dest);
 #if LWIP_IPV4_SRC_ROUTING
-struct netif *ip4_route_src(const ip4_addr_t *dest, const ip4_addr_t *src);
+struct netif *ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest);
 #else /* LWIP_IPV4_SRC_ROUTING */
-#define ip4_route_src(dest, src) ip4_route(dest)
+#define ip4_route_src(src, dest) ip4_route(dest)
 #endif /* LWIP_IPV4_SRC_ROUTING */
 err_t ip4_input(struct pbuf *p, struct netif *inp);
 err_t ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,
@@ -75,10 +75,10 @@
        u8_t ttl, u8_t tos, u8_t proto, struct netif *netif);
 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);
-#if LWIP_NETIF_HWADDRHINT
+#if LWIP_NETIF_USE_HINTS
 err_t ip4_output_hinted(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,
-       u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint);
-#endif /* LWIP_NETIF_HWADDRHINT */
+       u8_t ttl, u8_t tos, u8_t proto, struct netif_hint *netif_hint);
+#endif /* LWIP_NETIF_USE_HINTS */
 #if IP_OPTIONS_SEND
 err_t 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,
diff --git a/src/include/lwip/ip4_addr.h b/src/include/lwip/ip4_addr.h
index 51b46b8..f244c4f 100644
--- a/src/include/lwip/ip4_addr.h
+++ b/src/include/lwip/ip4_addr.h
@@ -56,22 +56,6 @@
  * operate both on ip4_addr_t as well as on ip4_addr_p_t. */
 typedef struct ip4_addr ip4_addr_t;
 
-/**
- * struct ipaddr2 is used in the definition of the ARP packet format in
- * order to support compilers that don't have structure packing.
- */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct ip4_addr2 {
-  PACK_STRUCT_FIELD(u16_t addrw[2]);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
 /* Forward declaration to not include netif.h */
 struct netif;
 
@@ -119,13 +103,6 @@
 /** Set an IP address given by the four byte-parts */
 #define IP4_ADDR(ipaddr, a,b,c,d)  (ipaddr)->addr = PP_HTONL(LWIP_MAKEU32(a,b,c,d))
 
-/** MEMCPY-like copying of IP addresses where addresses are known to be
- * 16-bit-aligned if the port is correctly configured (so a port could define
- * this to copying 2 u16_t's) - no NULL-pointer-checking needed. */
-#ifndef IPADDR2_COPY
-#define IPADDR2_COPY(dest, src) SMEMCPY(dest, src, sizeof(ip4_addr_t))
-#endif
-
 /** Copy IP address - faster than ip4_addr_set: no NULL check */
 #define ip4_addr_copy(dest, src) ((dest).addr = (src).addr)
 /** Safely copy one IP address to another (src may be NULL) */
@@ -190,22 +167,34 @@
                       (u16_t)((ipaddr) != NULL ? ip4_addr4_16(ipaddr) : 0))
 #define ip4_addr_debug_print_val(debug, ipaddr) \
   ip4_addr_debug_print_parts(debug, \
-                      ip4_addr1_16(&(ipaddr)),       \
-                      ip4_addr2_16(&(ipaddr)),       \
-                      ip4_addr3_16(&(ipaddr)),       \
-                      ip4_addr4_16(&(ipaddr)))
+                      ip4_addr1_16_val(ipaddr),       \
+                      ip4_addr2_16_val(ipaddr),       \
+                      ip4_addr3_16_val(ipaddr),       \
+                      ip4_addr4_16_val(ipaddr))
 
 /* Get one byte from the 4-byte address */
-#define ip4_addr1(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[0])
-#define ip4_addr2(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[1])
-#define ip4_addr3(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[2])
-#define ip4_addr4(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[3])
+#define ip4_addr_get_byte(ipaddr, idx) (((const u8_t*)(&(ipaddr)->addr))[idx])
+#define ip4_addr1(ipaddr) ip4_addr_get_byte(ipaddr, 0)
+#define ip4_addr2(ipaddr) ip4_addr_get_byte(ipaddr, 1)
+#define ip4_addr3(ipaddr) ip4_addr_get_byte(ipaddr, 2)
+#define ip4_addr4(ipaddr) ip4_addr_get_byte(ipaddr, 3)
+/* Get one byte from the 4-byte address, but argument is 'ip4_addr_t',
+ * not a pointer */
+#define ip4_addr_get_byte_val(ipaddr, idx) ((u8_t)(((ipaddr).addr >> (idx * 8)) & 0xff))
+#define ip4_addr1_val(ipaddr) ip4_addr_get_byte_val(ipaddr, 0)
+#define ip4_addr2_val(ipaddr) ip4_addr_get_byte_val(ipaddr, 1)
+#define ip4_addr3_val(ipaddr) ip4_addr_get_byte_val(ipaddr, 2)
+#define ip4_addr4_val(ipaddr) ip4_addr_get_byte_val(ipaddr, 3)
 /* These are cast to u16_t, with the intent that they are often arguments
  * to printf using the U16_F format from cc.h. */
 #define ip4_addr1_16(ipaddr) ((u16_t)ip4_addr1(ipaddr))
 #define ip4_addr2_16(ipaddr) ((u16_t)ip4_addr2(ipaddr))
 #define ip4_addr3_16(ipaddr) ((u16_t)ip4_addr3(ipaddr))
 #define ip4_addr4_16(ipaddr) ((u16_t)ip4_addr4(ipaddr))
+#define ip4_addr1_16_val(ipaddr) ((u16_t)ip4_addr1_val(ipaddr))
+#define ip4_addr2_16_val(ipaddr) ((u16_t)ip4_addr2_val(ipaddr))
+#define ip4_addr3_16_val(ipaddr) ((u16_t)ip4_addr3_val(ipaddr))
+#define ip4_addr4_16_val(ipaddr) ((u16_t)ip4_addr4_val(ipaddr))
 
 #define IP4ADDR_STRLEN_MAX  16
 
diff --git a/src/include/lwip/ip6.h b/src/include/lwip/ip6.h
index 099b94f..f894e06 100644
--- a/src/include/lwip/ip6.h
+++ b/src/include/lwip/ip6.h
@@ -66,10 +66,10 @@
                             u8_t hl, u8_t tc, u8_t nexth, struct netif *netif);
 err_t         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);
-#if LWIP_NETIF_HWADDRHINT
+#if LWIP_NETIF_USE_HINTS
 err_t         ip6_output_hinted(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest,
-                                u8_t hl, u8_t tc, u8_t nexth, u8_t *addr_hint);
-#endif /* LWIP_NETIF_HWADDRHINT */
+                                u8_t hl, u8_t tc, u8_t nexth, struct netif_hint *netif_hint);
+#endif /* LWIP_NETIF_USE_HINTS */
 #if LWIP_IPV6_MLD
 err_t         ip6_options_add_hbh_ra(struct pbuf * p, u8_t nexth, u8_t value);
 #endif /* LWIP_IPV6_MLD */
diff --git a/src/include/lwip/ip6_addr.h b/src/include/lwip/ip6_addr.h
index ee381ae..29c2a34 100644
--- a/src/include/lwip/ip6_addr.h
+++ b/src/include/lwip/ip6_addr.h
@@ -47,6 +47,7 @@
 
 #if LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */
 
+#include "lwip/ip6_zone.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -57,6 +58,9 @@
     used as local variable, on the stack, etc. */
 struct ip6_addr {
   u32_t addr[4];
+#if LWIP_IPV6_SCOPES
+  u8_t zone;
+#endif /* LWIP_IPV6_SCOPES */
 };
 
 /** IPv6 address */
@@ -72,7 +76,8 @@
   (ip6addr)->addr[0] = idx0; \
   (ip6addr)->addr[1] = idx1; \
   (ip6addr)->addr[2] = idx2; \
-  (ip6addr)->addr[3] = idx3; } while(0)
+  (ip6addr)->addr[3] = idx3; \
+  ip6_addr_clear_zone(ip6addr); } while(0)
 
 /** Access address in 16-bit block */
 #define IP6_ADDR_BLOCK1(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[0]) >> 16) & 0xffff))
@@ -95,18 +100,34 @@
 #define ip6_addr_copy(dest, src) do{(dest).addr[0] = (src).addr[0]; \
                                     (dest).addr[1] = (src).addr[1]; \
                                     (dest).addr[2] = (src).addr[2]; \
-                                    (dest).addr[3] = (src).addr[3];}while(0)
+                                    (dest).addr[3] = (src).addr[3]; \
+                                    ip6_addr_copy_zone((dest), (src)); }while(0)
 /** Safely copy one IPv6 address to another (src may be NULL) */
 #define ip6_addr_set(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : (src)->addr[0]; \
                                    (dest)->addr[1] = (src) == NULL ? 0 : (src)->addr[1]; \
                                    (dest)->addr[2] = (src) == NULL ? 0 : (src)->addr[2]; \
-                                   (dest)->addr[3] = (src) == NULL ? 0 : (src)->addr[3];}while(0)
+                                   (dest)->addr[3] = (src) == NULL ? 0 : (src)->addr[3]; \
+                                   ip6_addr_set_zone((dest), (src) == NULL ? IP6_NO_ZONE : ip6_addr_zone(src)); }while(0)
+
+/** Copy packed IPv6 address to unpacked IPv6 address; zone is not set */
+#define ip6_addr_copy_from_packed(dest, src) do{(dest).addr[0] = (src).addr[0]; \
+                                    (dest).addr[1] = (src).addr[1]; \
+                                    (dest).addr[2] = (src).addr[2]; \
+                                    (dest).addr[3] = (src).addr[3]; \
+                                    ip6_addr_clear_zone(&dest); }while(0)
+
+/** Copy unpacked IPv6 address to packed IPv6 address; zone is lost */
+#define ip6_addr_copy_to_packed(dest, src) do{(dest).addr[0] = (src).addr[0]; \
+                                    (dest).addr[1] = (src).addr[1]; \
+                                    (dest).addr[2] = (src).addr[2]; \
+                                    (dest).addr[3] = (src).addr[3]; }while(0)
 
 /** Set complete address to zero */
 #define ip6_addr_set_zero(ip6addr)    do{(ip6addr)->addr[0] = 0; \
                                          (ip6addr)->addr[1] = 0; \
                                          (ip6addr)->addr[2] = 0; \
-                                         (ip6addr)->addr[3] = 0;}while(0)
+                                         (ip6addr)->addr[3] = 0; \
+                                         ip6_addr_clear_zone(ip6addr);}while(0)
 
 /** Set address to ipv6 'any' (no need for lwip_htonl()) */
 #define ip6_addr_set_any(ip6addr)       ip6_addr_set_zero(ip6addr)
@@ -114,29 +135,57 @@
 #define ip6_addr_set_loopback(ip6addr) do{(ip6addr)->addr[0] = 0; \
                                           (ip6addr)->addr[1] = 0; \
                                           (ip6addr)->addr[2] = 0; \
-                                          (ip6addr)->addr[3] = PP_HTONL(0x00000001UL);}while(0)
+                                          (ip6addr)->addr[3] = PP_HTONL(0x00000001UL); \
+                                          ip6_addr_clear_zone(ip6addr);}while(0)
 /** Safely copy one IPv6 address to another and change byte order
  * from host- to network-order. */
 #define ip6_addr_set_hton(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : lwip_htonl((src)->addr[0]); \
                                         (dest)->addr[1] = (src) == NULL ? 0 : lwip_htonl((src)->addr[1]); \
                                         (dest)->addr[2] = (src) == NULL ? 0 : lwip_htonl((src)->addr[2]); \
-                                        (dest)->addr[3] = (src) == NULL ? 0 : lwip_htonl((src)->addr[3]);}while(0)
+                                        (dest)->addr[3] = (src) == NULL ? 0 : lwip_htonl((src)->addr[3]); \
+                                        ip6_addr_set_zone((dest), (src) == NULL ? IP6_NO_ZONE : ip6_addr_zone(src));}while(0)
 
 
+/** Compare IPv6 networks, ignoring zone information. To be used sparingly! */
+#define ip6_addr_netcmp_zoneless(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
+                                               ((addr1)->addr[1] == (addr2)->addr[1]))
+
 /**
  * Determine if two IPv6 address are on the same network.
  *
- * @arg addr1 IPv6 address 1
- * @arg addr2 IPv6 address 2
- * @return !0 if the network identifiers of both address match
+ * @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) (((addr1)->addr[0] == (addr2)->addr[0]) && \
-                                       ((addr1)->addr[1] == (addr2)->addr[1]))
+#define ip6_addr_netcmp(addr1, addr2) (ip6_addr_netcmp_zoneless((addr1), (addr2)) && \
+                                       ip6_addr_cmp_zone((addr1), (addr2)))
 
-#define ip6_addr_cmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
+/* Exact-host comparison *after* ip6_addr_netcmp() succeeded, for efficiency. */
+#define ip6_addr_nethostcmp(addr1, addr2) (((addr1)->addr[2] == (addr2)->addr[2]) && \
+                                           ((addr1)->addr[3] == (addr2)->addr[3]))
+
+/** Compare IPv6 addresses, ignoring zone information. To be used sparingly! */
+#define ip6_addr_cmp_zoneless(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]))
+/**
+ * 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.
+ *
+ * @param addr1 IPv6 address 1
+ * @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)))
+
+/** Compare IPv6 address to packed address and zone */
+#define ip6_addr_cmp_packed(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]) && \
+                                    ip6_addr_equals_zone((ip6addr), (zone_idx)))
 
 #define ip6_get_subnet_id(ip6addr)   (lwip_htonl((ip6addr)->addr[2]) & 0x0000ffffUL)
 
@@ -183,7 +232,13 @@
 #define ip6_addr_ismulticast_orglocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff080000UL))
 #define ip6_addr_ismulticast_global(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff0e0000UL))
 
-/* @todo define get/set for well-know multicast addresses, e.g. ff02::1 */
+/* Scoping note: while interface-local and link-local multicast addresses do
+ * have a scope (i.e., they are meaningful only in the context of a particular
+ * interface), the following functions are not assigning or comparing zone
+ * indices. The reason for this is backward compatibility. Any call site that
+ * produces a non-global multicast address must assign a multicast address as
+ * appropriate itself. */
+
 #define ip6_addr_isallnodes_iflocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff010000UL)) && \
     ((ip6addr)->addr[1] == 0UL) && \
     ((ip6addr)->addr[2] == 0UL) && \
@@ -196,7 +251,8 @@
 #define ip6_addr_set_allnodes_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
                 (ip6addr)->addr[1] = 0; \
                 (ip6addr)->addr[2] = 0; \
-                (ip6addr)->addr[3] = PP_HTONL(0x00000001UL);}while(0)
+                (ip6addr)->addr[3] = PP_HTONL(0x00000001UL); \
+                ip6_addr_clear_zone(ip6addr); }while(0)
 
 #define ip6_addr_isallrouters_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
     ((ip6addr)->addr[1] == 0UL) && \
@@ -205,7 +261,8 @@
 #define ip6_addr_set_allrouters_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
                 (ip6addr)->addr[1] = 0; \
                 (ip6addr)->addr[2] = 0; \
-                (ip6addr)->addr[3] = PP_HTONL(0x00000002UL);}while(0)
+                (ip6addr)->addr[3] = PP_HTONL(0x00000002UL); \
+                ip6_addr_clear_zone(ip6addr); }while(0)
 
 #define ip6_addr_issolicitednode(ip6addr) ( ((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
         ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \
@@ -214,7 +271,8 @@
 #define ip6_addr_set_solicitednode(ip6addr, if_id) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
                 (ip6addr)->addr[1] = 0; \
                 (ip6addr)->addr[2] = PP_HTONL(0x00000001UL); \
-                (ip6addr)->addr[3] = (PP_HTONL(0xff000000UL) | (if_id));}while(0)
+                (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)) && \
                                     ((ip6addr)->addr[1] == 0) && \
@@ -234,6 +292,7 @@
 #define IP6_ADDR_VALID        0x10 /* This bit marks an address as valid (preferred or deprecated) */
 #define IP6_ADDR_PREFERRED    0x30
 #define IP6_ADDR_DEPRECATED   0x10 /* Same as VALID (valid but not preferred) */
+#define IP6_ADDR_DUPLICATED   0x40 /* Failed DAD test, not valid */
 
 #define IP6_ADDR_TENTATIVE_COUNT_MASK 0x07 /* 1-7 probes sent */
 
@@ -242,6 +301,14 @@
 #define ip6_addr_isvalid(addr_state) (addr_state & IP6_ADDR_VALID) /* Include valid, preferred, and deprecated. */
 #define ip6_addr_ispreferred(addr_state) (addr_state == IP6_ADDR_PREFERRED)
 #define ip6_addr_isdeprecated(addr_state) (addr_state == IP6_ADDR_DEPRECATED)
+#define ip6_addr_isduplicated(addr_state) (addr_state == IP6_ADDR_DUPLICATED)
+
+#if LWIP_IPV6_ADDRESS_LIFETIMES
+#define IP6_ADDR_LIFE_STATIC   (0)
+#define IP6_ADDR_LIFE_INFINITE (0xffffffffUL)
+#define ip6_addr_life_isstatic(addr_life) ((addr_life) == IP6_ADDR_LIFE_STATIC)
+#define ip6_addr_life_isinfinite(addr_life) ((addr_life) == IP6_ADDR_LIFE_INFINITE)
+#endif /* LWIP_IPV6_ADDRESS_LIFETIMES */
 
 #define ip6_addr_debug_print_parts(debug, a, b, c, d, e, f, g, h) \
   LWIP_DEBUGF(debug, ("%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F, \
diff --git a/src/include/lwip/ip6_frag.h b/src/include/lwip/ip6_frag.h
index 6be2747..87e0e86 100644
--- a/src/include/lwip/ip6_frag.h
+++ b/src/include/lwip/ip6_frag.h
@@ -54,24 +54,34 @@
 
 #if LWIP_IPV6 && LWIP_IPV6_REASS  /* don't build if not configured for use in lwipopts.h */
 
-/** IP6_FRAG_COPYHEADER==1: for platforms where sizeof(void*) > 4, this needs to
- * be enabled (to not overwrite part of the data). When enabled, the IPv6 header
- * is copied instead of referencing it, which gives more room for struct ip6_reass_helper */
+/** The IPv6 reassembly timer interval in milliseconds. */
+#define IP6_REASS_TMR_INTERVAL 1000
+
+/** IP6_FRAG_COPYHEADER==1: for platforms where sizeof(void*) > 4, "struct
+ * ip6_reass_helper" is too large to be stored in the IPv6 fragment header, and
+ * will bleed into the header before it, which may be the IPv6 header or an
+ * extension header. This means that for each first fragment packet, we need to
+ * 1) make a copy of some IPv6 header fields (src+dest) that we need later on,
+ * just in case we do overwrite part of the IPv6 header, and 2) make a copy of
+ * the header data that we overwrote, so that we can restore it before either
+ * completing reassembly or sending an ICMPv6 reply. The last part is true even
+ * if this setting is disabled, but if it is enabled, we need to save a bit
+ * more data (up to the size of a pointer) because we overwrite more. */
 #ifndef IPV6_FRAG_COPYHEADER
 #define IPV6_FRAG_COPYHEADER   0
 #endif
 
-/** The IPv6 reassembly timer interval in milliseconds. */
-#define IP6_REASS_TMR_INTERVAL 1000
-
-/* Copy the complete header of the first fragment to struct ip6_reassdata
-   or just point to its original location in the first pbuf? */
+/* With IPV6_FRAG_COPYHEADER==1, a helper structure may (or, depending on the
+ * presence of extensions, may not) overwrite part of the IP header. Therefore,
+ * we copy the fields that we need from the IP header for as long as the helper
+ * structure may still be in place. This is easier than temporarily restoring
+ * those fields in the IP header each time we need to perform checks on them. */
 #if IPV6_FRAG_COPYHEADER
-#define IPV6_FRAG_HDRPTR
-#define IPV6_FRAG_HDRREF(hdr) (&(hdr))
+#define IPV6_FRAG_SRC(ipr) ((ipr)->src)
+#define IPV6_FRAG_DEST(ipr) ((ipr)->dest)
 #else /* IPV6_FRAG_COPYHEADER */
-#define IPV6_FRAG_HDRPTR *
-#define IPV6_FRAG_HDRREF(hdr) (hdr)
+#define IPV6_FRAG_SRC(ipr) ((ipr)->iphdr->src)
+#define IPV6_FRAG_DEST(ipr) ((ipr)->iphdr->dest)
 #endif /* IPV6_FRAG_COPYHEADER */
 
 /** IPv6 reassembly helper struct.
@@ -80,11 +90,25 @@
 struct ip6_reassdata {
   struct ip6_reassdata *next;
   struct pbuf *p;
-  struct ip6_hdr IPV6_FRAG_HDRPTR iphdr;
+  struct ip6_hdr *iphdr; /* pointer to the first (original) IPv6 header */
+#if IPV6_FRAG_COPYHEADER
+  ip6_addr_p_t src; /* copy of the source address in the IP header */
+  ip6_addr_p_t dest; /* copy of the destination address in the IP header */
+  /* This buffer (for the part of the original header that we overwrite) will
+   * be slightly oversized, but we cannot compute the exact size from here. */
+  u8_t orig_hdr[sizeof(struct ip6_frag_hdr) + sizeof(void*)];
+#else /* IPV6_FRAG_COPYHEADER */
+  /* In this case we still need the buffer, for sending ICMPv6 replies. */
+  u8_t orig_hdr[sizeof(struct ip6_frag_hdr)];
+#endif /* IPV6_FRAG_COPYHEADER */
   u32_t identification;
   u16_t datagram_len;
   u8_t nexth;
   u8_t timer;
+#if LWIP_IPV6_SCOPES
+  u8_t src_zone; /* zone of original packet's source address */
+  u8_t dest_zone; /* zone of original packet's destination address */
+#endif /* LWIP_IPV6_SCOPES */
 };
 
 #define ip6_reass_init() /* Compatibility define */
diff --git a/src/include/lwip/ip6_zone.h b/src/include/lwip/ip6_zone.h
new file mode 100644
index 0000000..525790e
--- /dev/null
+++ b/src/include/lwip/ip6_zone.h
@@ -0,0 +1,304 @@
+/**
+ * @file
+ *
+ * IPv6 address scopes, zones, and scoping policy.
+ *
+ * This header provides the means to implement support for IPv6 address scopes,
+ * as per RFC 4007. An address scope can be either global or more constrained.
+ * In lwIP, we say that an address "has a scope" or "is scoped" when its scope
+ * is constrained, in which case the address is meaningful only in a specific
+ * "zone." For unicast addresses, only link-local addresses have a scope; in
+ * that case, the scope is the link. For multicast addresses, there are various
+ * scopes defined by RFC 4007 and others. For any constrained scope, a system
+ * must establish a (potentially one-to-many) mapping between zones and local
+ * interfaces. For example, a link-local address is valid on only one link (its
+ * zone). That link may be attached to one or more local interfaces. The
+ * decisions on which scopes are constrained and the mapping between zones and
+ * interfaces is together what we refer to as the "scoping policy" - more on
+ * this in a bit.
+ *
+ * In lwIP, each IPv6 address has an associated zone index. This zone index may
+ * be set to "no zone" (IP6_NO_ZONE, 0) or an actual zone. We say that an
+ * address "has a zone" or "is zoned" when its zone index is *not* set to "no
+ * zone." In lwIP, in principle, each address should be "properly zoned," which
+ * means that if the address has a zone if and only if has a scope. As such, it
+ * is a rule that an unscoped (e.g., global) address must never have a zone.
+ * Even though one could argue that there is always one zone even for global
+ * scopes, this rule exists for implementation simplicity. Violation of the
+ * rule will trigger assertions or otherwise result in undesired behavior.
+ *
+ * Backward compatibility prevents us from requiring that applications always
+ * provide properly zoned addresses. We do enforce the rule that the in the
+ * lwIP link layer (everything below netif->output_ip6() and in particular ND6)
+ * *all* addresses are properly zoned. Thus, on the output paths down the
+ * stack, various places deal with the case of addresses that lack a zone.
+ * Some of them are best-effort for efficiency (e.g. the PCB bind and connect
+ * API calls' attempts to add missing zones); ultimately the IPv6 output
+ * handler (@ref ip6_output_if_src) will set a zone if necessary.
+ *
+ * Aside from dealing with scoped addresses lacking a zone, a proper IPv6
+ * implementation must also ensure that a packet with a scoped source and/or
+ * destination address does not leave its zone. This is currently implemented
+ * in the input and forward functions. However, for output, these checks are
+ * deliberately omitted in order to keep the implementation lightweight. The
+ * routing algorithm in @ref ip6_route will take decisions such that it will
+ * not cause zone violations unless the application sets bad addresses, though.
+ *
+ * In terms of scoping policy, lwIP implements the default policy from RFC 4007
+ * using macros in this file. This policy considers link-local unicast
+ * addresses and (only) interface-local and link-local multicast addresses as
+ * having a scope. For all these addresses, the zone is equal to the interface.
+ * As shown below in this file, it is possible to implement a custom policy.
+ */
+
+/*
+ * Copyright (c) 2017 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.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: David van Moolenbroek <david@minix3.org>
+ *
+ */
+#ifndef LWIP_HDR_IP6_ZONE_H
+#define LWIP_HDR_IP6_ZONE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup ip6_zones IPv6 Zones
+ * @ingroup ip6
+ * @{
+ */
+
+#if LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */
+
+/** Identifier for "no zone". */
+#define IP6_NO_ZONE 0
+
+#if LWIP_IPV6_SCOPES
+
+/** Zone initializer for static IPv6 address initialization, including comma. */
+#define IPADDR6_ZONE_INIT , IP6_NO_ZONE
+
+/** Return the zone index of the given IPv6 address; possibly "no zone". */
+#define ip6_addr_zone(ip6addr) ((ip6addr)->zone)
+
+/** Does the given IPv6 address have a zone set? (0/1) */
+#define ip6_addr_has_zone(ip6addr) (ip6_addr_zone(ip6addr) != IP6_NO_ZONE)
+
+/** Set the zone field of an IPv6 address to a particular value. */
+#define ip6_addr_set_zone(ip6addr, zone_idx) ((ip6addr)->zone = (zone_idx))
+
+/** Clear the zone field of an IPv6 address, setting it to "no zone". */
+#define ip6_addr_clear_zone(ip6addr) ((ip6addr)->zone = IP6_NO_ZONE)
+
+/** Copy the zone field from the second IPv6 address to the first one. */
+#define ip6_addr_copy_zone(ip6addr1, ip6addr2) ((ip6addr1).zone = (ip6addr2).zone)
+
+/** 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))
+
+/** 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)
+
+/** Symbolic constants for the 'type' parameters in some of the macros.
+ * These exist for efficiency only, allowing the macros to avoid certain tests
+ * when the address is known not to be of a certain type. Dead code elimination
+ * will do the rest. IP6_MULTICAST is supported but currently not optimized.
+ * @see ip6_addr_has_scope, ip6_addr_assign_zone, ip6_addr_lacks_zone.
+ */
+enum lwip_ipv6_scope_type
+{
+  /** Unknown */
+  IP6_UNKNOWN   = 0,
+  /** Unicast */
+  IP6_UNICAST   = 1,
+  /** Multicast */
+  IP6_MULTICAST = 2
+};
+
+/** IPV6_CUSTOM_SCOPES: together, the following three macro definitions,
+ * @ref ip6_addr_has_scope, @ref ip6_addr_assign_zone, and
+ * @ref ip6_addr_test_zone, completely define the lwIP scoping policy.
+ * The definitions below implement the default policy from RFC 4007 Sec. 6.
+ * Should an implementation desire to implement a different policy, it can
+ * define IPV6_CUSTOM_SCOPES to 1 and supply its own definitions for the three
+ * macros instead.
+ */
+#ifndef IPV6_CUSTOM_SCOPES
+#define IPV6_CUSTOM_SCOPES 0
+#endif /* !IPV6_CUSTOM_SCOPES */
+
+#if !IPV6_CUSTOM_SCOPES
+
+/**
+ * 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.
+ *
+ * This default implementation follows the default model of RFC 4007, where
+ * only interface-local and link-local scopes are defined.
+ *
+ * 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.
+ *
+ * @param ip6addr the IPv6 address (const); only its address part is examined.
+ * @param type address type; see @ref lwip_ipv6_scope_type.
+ * @return 1 if the address has a constrained scope, 0 if it does not.
+ */
+#define ip6_addr_has_scope(ip6addr, type) \
+  (ip6_addr_islinklocal(ip6addr) || (((type) != IP6_UNICAST) && \
+   (ip6_addr_ismulticast_iflocal(ip6addr) || \
+    ip6_addr_ismulticast_linklocal(ip6addr))))
+
+/**
+ * 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".
+ *
+ * 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.
+ *
+ * @param ip6addr the IPv6 address; its address part is examined, and its zone
+ *                index is assigned.
+ * @param type address type; see @ref lwip_ipv6_scope_type.
+ * @param netif the network interface (const).
+ */
+#define ip6_addr_assign_zone(ip6addr, type, netif) \
+    (ip6_addr_set_zone((ip6addr), \
+      ip6_addr_has_scope((ip6addr), (type)) ? netif_get_index(netif) : 0))
+
+/**
+ * Test whether an IPv6 address is "zone-compatible" with a network interface.
+ * That is, test whether the network interface is part of the zone associated
+ * with the address. For efficiency, this macro is only ever called if the
+ * given address is either scoped or zoned, and thus, it need not test this.
+ * If an address is scoped but not zoned, or zoned and not scoped, it is
+ * considered not zone-compatible with any netif.
+ *
+ * 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, there is always only one matching netif for a specific zone index,
+ * but all call sites of this macro currently support multiple matching netifs
+ * as well (at no additional expense in the common case).
+ *
+ * @param ip6addr the IPv6 address (const).
+ * @param netif the network interface (const).
+ * @return 1 if the address is scope-compatible with the netif, 0 if not.
+ */
+#define ip6_addr_test_zone(ip6addr, netif) \
+    (ip6_addr_equals_zone((ip6addr), netif_get_index(netif)))
+
+#endif /* !IPV6_CUSTOM_SCOPES */
+
+/** Does the given IPv6 address have a scope, and as such should also have a
+ * zone to be meaningful, but does not actually have a zone? (0/1) */
+#define ip6_addr_lacks_zone(ip6addr, type) \
+    (!ip6_addr_has_zone(ip6addr) && ip6_addr_has_scope((ip6addr), (type)))
+
+/**
+ * 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.
+ *
+ * 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.
+ *
+ * It may be impossible to select a zone, e.g. if there are no netifs.  In that
+ * case, the address's zone field will be left as is.
+ *
+ * @param dest the IPv6 address for which to select and set a zone.
+ * @param src source IPv6 address (const); may be equal to dest.
+ */
+#define ip6_addr_select_zone(dest, src) do { struct netif *selected_netif; \
+  selected_netif = ip6_route((src), (dest)); \
+  if (selected_netif != NULL) { \
+    ip6_addr_assign_zone((dest), IP6_UNKNOWN, selected_netif); \
+  } } while (0)
+
+/**
+ * @}
+ */
+
+#else /* LWIP_IPV6_SCOPES */
+
+#define IPADDR6_ZONE_INIT
+#define ip6_addr_zone(ip6addr) (IP6_NO_ZONE)
+#define ip6_addr_has_zone(ip6addr) (0)
+#define ip6_addr_set_zone(ip6addr, zone_idx)
+#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 IPV6_CUSTOM_SCOPES 0
+#define ip6_addr_has_scope(ip6addr, type) (0)
+#define ip6_addr_assign_zone(ip6addr, type, netif)
+#define ip6_addr_test_zone(ip6addr, netif) (1)
+#define ip6_addr_lacks_zone(ip6addr, type) (0)
+#define ip6_addr_select_zone(ip6addr, src)
+
+#endif /* LWIP_IPV6_SCOPES */
+
+#if LWIP_IPV6_SCOPES && LWIP_IPV6_SCOPES_DEBUG
+
+/** Verify that the given IPv6 address is properly zoned. */
+#define IP6_ADDR_ZONECHECK(ip6addr) LWIP_ASSERT("IPv6 zone check failed", \
+    ip6_addr_has_scope(ip6addr, IP6_UNKNOWN) == ip6_addr_has_zone(ip6addr))
+
+/** Verify that the given IPv6 address is properly zoned for the given netif. */
+#define IP6_ADDR_ZONECHECK_NETIF(ip6addr, netif) LWIP_ASSERT("IPv6 netif zone check failed", \
+    ip6_addr_has_scope(ip6addr, IP6_UNKNOWN) ? \
+    (ip6_addr_has_zone(ip6addr) && \
+     (((netif) == NULL) || ip6_addr_test_zone((ip6addr), (netif)))) : \
+    !ip6_addr_has_zone(ip6addr))
+
+#else /* LWIP_IPV6_SCOPES && LWIP_IPV6_SCOPES_DEBUG */
+
+#define IP6_ADDR_ZONECHECK(ip6addr)
+#define IP6_ADDR_ZONECHECK_NETIF(ip6addr, netif)
+
+#endif /* LWIP_IPV6_SCOPES && LWIP_IPV6_SCOPES_DEBUG */
+
+#endif /* LWIP_IPV6 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_IP6_ZONE_H */
diff --git a/src/include/lwip/ip_addr.h b/src/include/lwip/ip_addr.h
index 11f65d2..2f97770 100644
--- a/src/include/lwip/ip_addr.h
+++ b/src/include/lwip/ip_addr.h
@@ -78,18 +78,19 @@
 extern const ip_addr_t ip_addr_any_type;
 
 /** @ingroup ip4addr */
-#define IPADDR4_INIT(u32val)          { { { { u32val, 0ul, 0ul, 0ul } } }, IPADDR_TYPE_V4 }
+#define IPADDR4_INIT(u32val)          { { { { u32val, 0ul, 0ul, 0ul } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_V4 }
 /** @ingroup ip4addr */
 #define IPADDR4_INIT_BYTES(a,b,c,d)   IPADDR4_INIT(PP_HTONL(LWIP_MAKEU32(a,b,c,d)))
+
 /** @ingroup ip6addr */
-#define IPADDR6_INIT(a, b, c, d)      { { { { a, b, c, d } } }, IPADDR_TYPE_V6 }
+#define IPADDR6_INIT(a, b, c, d)      { { { { a, b, c, d } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_V6 }
 /** @ingroup ip6addr */
-#define IPADDR6_INIT_HOST(a, b, c, d) { { { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } } }, IPADDR_TYPE_V6 }
+#define IPADDR6_INIT_HOST(a, b, c, d) { { { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_V6 }
 
 /** @ingroup ipaddr */
 #define IP_IS_ANY_TYPE_VAL(ipaddr)    (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_ANY)
 /** @ingroup ipaddr */
-#define IPADDR_ANY_TYPE_INIT          { { { { 0ul, 0ul, 0ul, 0ul } } }, IPADDR_TYPE_ANY }
+#define IPADDR_ANY_TYPE_INIT          { { { { 0ul, 0ul, 0ul, 0ul } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_ANY }
 
 /** @ingroup ip4addr */
 #define IP_IS_V4_VAL(ipaddr)          (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V4)
@@ -104,6 +105,8 @@
 #define IP_SET_TYPE(ipaddr, iptype)     do { if((ipaddr) != NULL) { IP_SET_TYPE_VAL(*(ipaddr), iptype); }}while(0)
 #define IP_GET_TYPE(ipaddr)           ((ipaddr)->type)
 
+#define IP_ADDR_RAW_SIZE(ipaddr)      (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V4 ? sizeof(ip4_addr_t) : sizeof(ip6_addr_t))
+
 #define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) (IP_GET_TYPE(&pcb->local_ip) == IP_GET_TYPE(ipaddr))
 #define IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr) (IP_IS_ANY_TYPE_VAL(pcb->local_ip) || IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr))
 
@@ -125,26 +128,37 @@
 /** @ingroup ip6addr */
 #define IP_ADDR6_HOST(ipaddr,i0,i1,i2,i3)  IP_ADDR6(ipaddr,PP_HTONL(i0),PP_HTONL(i1),PP_HTONL(i2),PP_HTONL(i3))
 
+#define ip_clear_no4(ipaddr)  do { ip_2_ip6(ipaddr)->addr[1] = \
+                                   ip_2_ip6(ipaddr)->addr[2] = \
+                                   ip_2_ip6(ipaddr)->addr[3] = 0; \
+                                   ip6_addr_clear_zone(ip_2_ip6(ipaddr)); }while(0)
+
 /** @ingroup ipaddr */
 #define ip_addr_copy(dest, src)      do{ IP_SET_TYPE_VAL(dest, IP_GET_TYPE(&src)); if(IP_IS_V6_VAL(src)){ \
   ip6_addr_copy(*ip_2_ip6(&(dest)), *ip_2_ip6(&(src))); }else{ \
-  ip4_addr_copy(*ip_2_ip4(&(dest)), *ip_2_ip4(&(src))); }}while(0)
+  ip4_addr_copy(*ip_2_ip4(&(dest)), *ip_2_ip4(&(src))); ip_clear_no4(&dest); }}while(0)
 /** @ingroup ip6addr */
 #define ip_addr_copy_from_ip6(dest, src)      do{ \
   ip6_addr_copy(*ip_2_ip6(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V6); }while(0)
+/** @ingroup ip6addr */
+#define ip_addr_copy_from_ip6_packed(dest, src)      do{ \
+  ip6_addr_copy_from_packed(*ip_2_ip6(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V6); }while(0)
 /** @ingroup ip4addr */
 #define ip_addr_copy_from_ip4(dest, src)      do{ \
-  ip4_addr_copy(*ip_2_ip4(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V4); }while(0)
+  ip4_addr_copy(*ip_2_ip4(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V4); ip_clear_no4(&dest); }while(0)
 /** @ingroup ip4addr */
 #define ip_addr_set_ip4_u32(ipaddr, val)  do{if(ipaddr){ip4_addr_set_u32(ip_2_ip4(ipaddr), val); \
-  IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0)
+  IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(ipaddr); }}while(0)
+/** @ingroup ip4addr */
+#define ip_addr_set_ip4_u32_val(ipaddr, val)  do{ ip4_addr_set_u32(ip_2_ip4(&(ipaddr)), val); \
+  IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(&ipaddr); }while(0)
 /** @ingroup ip4addr */
 #define ip_addr_get_ip4_u32(ipaddr)  (((ipaddr) && IP_IS_V4(ipaddr)) ? \
   ip4_addr_get_u32(ip_2_ip4(ipaddr)) : 0)
 /** @ingroup ipaddr */
 #define ip_addr_set(dest, src) do{ IP_SET_TYPE(dest, IP_GET_TYPE(src)); if(IP_IS_V6(src)){ \
   ip6_addr_set(ip_2_ip6(dest), ip_2_ip6(src)); }else{ \
-  ip4_addr_set(ip_2_ip4(dest), ip_2_ip4(src)); }}while(0)
+  ip4_addr_set(ip_2_ip4(dest), ip_2_ip4(src)); ip_clear_no4(dest); }}while(0)
 /** @ingroup ipaddr */
 #define ip_addr_set_ipaddr(dest, src) ip_addr_set(dest, src)
 /** @ingroup ipaddr */
@@ -159,15 +173,23 @@
 /** @ingroup ipaddr */
 #define ip_addr_set_any(is_ipv6, ipaddr)      do{if(is_ipv6){ \
   ip6_addr_set_any(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \
-  ip4_addr_set_any(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0)
+  ip4_addr_set_any(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(ipaddr); }}while(0)
+/** @ingroup ipaddr */
+#define ip_addr_set_any_val(is_ipv6, ipaddr)      do{if(is_ipv6){ \
+  ip6_addr_set_any(ip_2_ip6(&(ipaddr))); IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V6); }else{ \
+  ip4_addr_set_any(ip_2_ip4(&(ipaddr))); IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(&ipaddr); }}while(0)
 /** @ingroup ipaddr */
 #define ip_addr_set_loopback(is_ipv6, ipaddr) do{if(is_ipv6){ \
   ip6_addr_set_loopback(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \
-  ip4_addr_set_loopback(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0)
+  ip4_addr_set_loopback(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(ipaddr); }}while(0)
+/** @ingroup ipaddr */
+#define ip_addr_set_loopback_val(is_ipv6, ipaddr) do{if(is_ipv6){ \
+  ip6_addr_set_loopback(ip_2_ip6(&(ipaddr))); IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V6); }else{ \
+  ip4_addr_set_loopback(ip_2_ip4(&(ipaddr))); IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(&ipaddr); }}while(0)
 /** @ingroup ipaddr */
 #define ip_addr_set_hton(dest, src)  do{if(IP_IS_V6(src)){ \
-  ip6_addr_set_hton(ip_2_ip6(ipaddr), (src)); IP_SET_TYPE(dest, IPADDR_TYPE_V6); }else{ \
-  ip4_addr_set_hton(ip_2_ip4(ipaddr), (src)); IP_SET_TYPE(dest, IPADDR_TYPE_V4); }}while(0)
+  ip6_addr_set_hton(ip_2_ip6(dest), ip_2_ip6(src)); IP_SET_TYPE(dest, IPADDR_TYPE_V6); }else{ \
+  ip4_addr_set_hton(ip_2_ip4(dest), ip_2_ip4(src)); IP_SET_TYPE(dest, IPADDR_TYPE_V4); ip_clear_no4(ipaddr); }}while(0)
 /** @ingroup ipaddr */
 #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 { \
@@ -181,9 +203,13 @@
   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_isany(ipaddr)        ((IP_IS_V6(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 */
+#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)))
+  ip4_addr_isany(ip_2_ip4(ipaddr))))
 /** @ingroup ipaddr */
 #define ip_addr_isany_val(ipaddr)        ((IP_IS_V6_VAL(ipaddr)) ? \
   ip6_addr_isany_val(*ip_2_ip6(&(ipaddr))) : \
@@ -210,12 +236,8 @@
 #define ip_addr_debug_print_val(debug, ipaddr) do { if(IP_IS_V6_VAL(ipaddr)) { \
   ip6_addr_debug_print_val(debug, *ip_2_ip6(&(ipaddr))); } else { \
   ip4_addr_debug_print_val(debug, *ip_2_ip4(&(ipaddr))); }}while(0)
-/** @ingroup ipaddr */
-#define ipaddr_ntoa(addr)   (((addr) == NULL) ? "NULL" : \
-  ((IP_IS_V6(addr)) ? ip6addr_ntoa(ip_2_ip6(addr)) : ip4addr_ntoa(ip_2_ip4(addr))))
-/** @ingroup ipaddr */
-#define ipaddr_ntoa_r(addr, buf, buflen)   (((addr) == NULL) ? "NULL" : \
-  ((IP_IS_V6(addr)) ? ip6addr_ntoa_r(ip_2_ip6(addr), buf, buflen) : ip4addr_ntoa_r(ip_2_ip4(addr), buf, buflen)))
+char *ipaddr_ntoa(const ip_addr_t *addr);
+char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen);
 int ipaddr_aton(const char *cp, ip_addr_t *addr);
 
 /** @ingroup ipaddr */
@@ -226,7 +248,8 @@
   (ip6addr)->addr[3] = (ip4addr)->addr; \
   (ip6addr)->addr[2] = PP_HTONL(0x0000FFFFUL); \
   (ip6addr)->addr[1] = 0; \
-  (ip6addr)->addr[0] = 0; } while(0);
+  (ip6addr)->addr[0] = 0; \
+  ip6_addr_clear_zone(ip6addr); } while(0);
 
 /** @ingroup ipaddr */
 #define unmap_ipv4_mapped_ipv6(ip4addr, ip6addr) \
@@ -236,8 +259,11 @@
 
 #else /* LWIP_IPV4 && LWIP_IPV6 */
 
-#define IP_ADDR_PCB_VERSION_MATCH(addr, pcb)         1
-#define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) 1
+#define IP_ADDR_PCB_VERSION_MATCH(addr, pcb)          1
+#define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr)  1
+
+#define ip_addr_set_any_val(is_ipv6, ipaddr)          ip_addr_set_any(is_ipv6, &(ipaddr))
+#define ip_addr_set_loopback_val(is_ipv6, ipaddr)     ip_addr_set_loopback(is_ipv6, &(ipaddr))
 
 #if LWIP_IPV4
 
@@ -252,12 +278,14 @@
 #define IP_SET_TYPE_VAL(ipaddr, iptype)
 #define IP_SET_TYPE(ipaddr, iptype)
 #define IP_GET_TYPE(ipaddr)                     IPADDR_TYPE_V4
+#define IP_ADDR_RAW_SIZE(ipaddr)                sizeof(ip4_addr_t)
 #define ip_2_ip4(ipaddr)                        (ipaddr)
 #define IP_ADDR4(ipaddr,a,b,c,d)                IP4_ADDR(ipaddr,a,b,c,d)
 
 #define ip_addr_copy(dest, src)                 ip4_addr_copy(dest, src)
 #define ip_addr_copy_from_ip4(dest, src)        ip4_addr_copy(dest, src)
 #define ip_addr_set_ip4_u32(ipaddr, val)        ip4_addr_set_u32(ip_2_ip4(ipaddr), val)
+#define ip_addr_set_ip4_u32_val(ipaddr, val)    ip_addr_set_ip4_u32(&(ipaddr), val)
 #define ip_addr_get_ip4_u32(ipaddr)             ip4_addr_get_u32(ip_2_ip4(ipaddr))
 #define ip_addr_set(dest, src)                  ip4_addr_set(dest, src)
 #define ip_addr_set_ipaddr(dest, src)           ip4_addr_set(dest, src)
@@ -288,8 +316,8 @@
 #else /* LWIP_IPV4 */
 
 typedef ip6_addr_t ip_addr_t;
-#define IPADDR6_INIT(a, b, c, d)                { { a, b, c, d } }
-#define IPADDR6_INIT_HOST(a, b, c, d)           { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } }
+#define IPADDR6_INIT(a, b, c, d)                { { a, b, c, d } IPADDR6_ZONE_INIT }
+#define IPADDR6_INIT_HOST(a, b, c, d)           { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } IPADDR6_ZONE_INIT }
 #define IP_IS_V4_VAL(ipaddr)                    0
 #define IP_IS_V6_VAL(ipaddr)                    1
 #define IP_IS_V4(ipaddr)                        0
@@ -298,12 +326,14 @@
 #define IP_SET_TYPE_VAL(ipaddr, iptype)
 #define IP_SET_TYPE(ipaddr, iptype)
 #define IP_GET_TYPE(ipaddr)                     IPADDR_TYPE_V6
+#define IP_ADDR_RAW_SIZE(ipaddr)                sizeof(ip6_addr_t)
 #define ip_2_ip6(ipaddr)                        (ipaddr)
 #define IP_ADDR6(ipaddr,i0,i1,i2,i3)            IP6_ADDR(ipaddr,i0,i1,i2,i3)
 #define IP_ADDR6_HOST(ipaddr,i0,i1,i2,i3)       IP_ADDR6(ipaddr,PP_HTONL(i0),PP_HTONL(i1),PP_HTONL(i2),PP_HTONL(i3))
 
 #define ip_addr_copy(dest, src)                 ip6_addr_copy(dest, src)
 #define ip_addr_copy_from_ip6(dest, src)        ip6_addr_copy(dest, src)
+#define ip_addr_copy_from_ip6_packed(dest, src) ip6_addr_copy_from_packed(dest, src)
 #define ip_addr_set(dest, src)                  ip6_addr_set(dest, src)
 #define ip_addr_set_ipaddr(dest, src)           ip6_addr_set(dest, src)
 #define ip_addr_set_zero(ipaddr)                ip6_addr_set_zero(ipaddr)
@@ -314,6 +344,7 @@
 #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_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)
diff --git a/src/include/lwip/memp.h b/src/include/lwip/memp.h
index 562cd05..1630b26 100644
--- a/src/include/lwip/memp.h
+++ b/src/include/lwip/memp.h
@@ -90,7 +90,7 @@
  *   - free: LWIP_MEMPOOL_FREE(my_private_pool, my_new_mem);
  *
  * To relocate a pool, declare it as extern in cc.h. Example for GCC:
- *   extern u8_t __attribute__((section(".onchip_mem"))) memp_memory_my_private_pool[];
+ *   extern u8_t \_\_attribute\_\_((section(".onchip_mem"))) memp_memory_my_private_pool_base[];
  */
 #define LWIP_MEMPOOL_DECLARE(name,num,size,desc) \
   LWIP_DECLARE_MEMORY_ALIGNED(memp_memory_ ## name ## _base, ((num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size)))); \
diff --git a/src/include/lwip/nd6.h b/src/include/lwip/nd6.h
index 8204fa4..c30e624 100644
--- a/src/include/lwip/nd6.h
+++ b/src/include/lwip/nd6.h
@@ -58,6 +58,11 @@
 /** 1 second period */
 #define ND6_TMR_INTERVAL 1000
 
+/** Router solicitations are sent in 4 second intervals (see RFC 4861, ch. 6.3.7) */
+#ifndef ND6_RTR_SOLICITATION_INTERVAL
+#define ND6_RTR_SOLICITATION_INTERVAL  4000
+#endif
+
 struct pbuf;
 struct netif;
 
@@ -74,6 +79,7 @@
 #if LWIP_IPV6_MLD
 void nd6_adjust_mld_membership(struct netif *netif, s8_t addr_idx, u8_t new_state);
 #endif /* LWIP_IPV6_MLD */
+void nd6_restart_netif(struct netif *netif);
 
 #ifdef __cplusplus
 }
diff --git a/src/include/lwip/netbuf.h b/src/include/lwip/netbuf.h
index e6865f8..42a911b 100644
--- a/src/include/lwip/netbuf.h
+++ b/src/include/lwip/netbuf.h
@@ -62,9 +62,7 @@
   ip_addr_t addr;
   u16_t port;
 #if LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY
-#if LWIP_CHECKSUM_ON_COPY
   u8_t flags;
-#endif /* LWIP_CHECKSUM_ON_COPY */
   u16_t toport_chksum;
 #if LWIP_NETBUF_RECVINFO
   ip_addr_t toaddr;
diff --git a/src/include/lwip/netif.h b/src/include/lwip/netif.h
index 67a2d24..911196a 100644
--- a/src/include/lwip/netif.h
+++ b/src/include/lwip/netif.h
@@ -63,6 +63,12 @@
 #define NETIF_MAX_HWADDR_LEN 6U
 #endif
 
+/** The size of a fully constructed netif name which the
+ * netif can be identified by in APIs. Composed of
+ * 2 chars, 3 (max) digits, and 1 \0
+ */
+#define NETIF_NAMESIZE 6
+
 /**
  * @defgroup netif_flags Flags
  * @ingroup netif
@@ -106,6 +112,7 @@
 
 enum lwip_internal_netif_client_data_index
 {
+#if LWIP_IPV4
 #if LWIP_DHCP
    LWIP_NETIF_CLIENT_DATA_INDEX_DHCP,
 #endif
@@ -115,9 +122,15 @@
 #if LWIP_IGMP
    LWIP_NETIF_CLIENT_DATA_INDEX_IGMP,
 #endif
+#endif /* LWIP_IPV4 */
+#if LWIP_IPV6
+#if LWIP_IPV6_DHCP6
+   LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6,
+#endif
 #if LWIP_IPV6_MLD
    LWIP_NETIF_CLIENT_DATA_INDEX_MLD6,
 #endif
+#endif /* LWIP_IPV6 */
    LWIP_NETIF_CLIENT_DATA_INDEX_MAX
 };
 
@@ -158,6 +171,9 @@
  *
  * @param p The received packet, copied into a pbuf
  * @param inp The netif which received the packet
+ * @return ERR_OK if the packet was handled
+ *         != ERR_OK is the packet was NOT handled, in this case, the caller has
+ *                   to free the pbuf
  */
 typedef err_t (*netif_input_fn)(struct pbuf *p, struct netif *inp);
 
@@ -207,8 +223,10 @@
        const ip6_addr_t *group, enum netif_mac_filter_action action);
 #endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
 
-#if LWIP_DHCP || LWIP_AUTOIP || LWIP_IGMP || LWIP_IPV6_MLD || (LWIP_NUM_NETIF_CLIENT_DATA > 0)
+#if LWIP_DHCP || LWIP_AUTOIP || LWIP_IGMP || LWIP_IPV6_MLD || LWIP_IPV6_DHCP6 || (LWIP_NUM_NETIF_CLIENT_DATA > 0)
+#if LWIP_NUM_NETIF_CLIENT_DATA > 0
 u8_t netif_alloc_client_data_id(void);
+#endif
 /** @ingroup netif_cd
  * Set client data. Obtain ID from netif_alloc_client_data_id().
  */
@@ -217,14 +235,33 @@
  * Get client data. Obtain ID from netif_alloc_client_data_id().
  */
 #define netif_get_client_data(netif, id)       (netif)->client_data[(id)]
-#endif /* LWIP_DHCP || LWIP_AUTOIP || (LWIP_NUM_NETIF_CLIENT_DATA > 0) */
+#endif
+
+#if (LWIP_IPV4 && LWIP_ARP && (ARP_TABLE_SIZE > 0x7f)) || (LWIP_IPV6 && (LWIP_ND6_NUM_DESTINATIONS > 0x7f))
+typedef u16_t netif_addr_idx_t;
+#define NETIF_ADDR_IDX_MAX 0x7FFF
+#else
+typedef u8_t netif_addr_idx_t;
+#define NETIF_ADDR_IDX_MAX 0x7F
+#endif
+
+#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 */
 
 /** Generic data structure used for all lwIP network interfaces.
  *  The following fields should be filled in by the initialization
  *  function for the device driver: hwaddr_len, hwaddr[], mtu, flags */
 struct netif {
+#if !LWIP_SINGLE_NETIF
   /** pointer to next in linked list */
   struct netif *next;
+#endif
 
 #if LWIP_IPV4
   /** IP address configuration in network byte order */
@@ -238,6 +275,13 @@
   /** The state of each IPv6 address (Tentative, Preferred, etc).
    * @see ip6_addr.h */
   u8_t ip6_addr_state[LWIP_IPV6_NUM_ADDRESSES];
+#if LWIP_IPV6_ADDRESS_LIFETIMES
+  /** Remaining valid and preferred lifetime of each IPv6 address, in seconds.
+   * For valid lifetimes, the special value of IP6_ADDR_LIFE_STATIC (0)
+   * indicates the address is static and has no lifetimes. */
+  u32_t ip6_addr_valid_life[LWIP_IPV6_NUM_ADDRESSES];
+  u32_t ip6_addr_pref_life[LWIP_IPV6_NUM_ADDRESSES];
+#endif /* LWIP_IPV6_ADDRESS_LIFETIMES */
 #endif /* LWIP_IPV6 */
   /** This function is called by the network device driver
    *  to pass a packet up the TCP/IP stack. */
@@ -280,14 +324,6 @@
 #ifdef netif_get_client_data
   void* client_data[LWIP_NETIF_CLIENT_DATA_INDEX_MAX + LWIP_NUM_NETIF_CLIENT_DATA];
 #endif
-#if LWIP_IPV6_AUTOCONFIG
-  /** is this netif enabled for IPv6 autoconfiguration */
-  u8_t ip6_autoconfig_enabled;
-#endif /* LWIP_IPV6_AUTOCONFIG */
-#if LWIP_IPV6_SEND_ROUTER_SOLICIT
-  /** Number of Router Solicitation messages that remain to be sent. */
-  u8_t rs_count;
-#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */
 #if LWIP_NETIF_HOSTNAME
   /* the hostname for this netif, NULL is a valid value */
   const char*  hostname;
@@ -297,16 +333,29 @@
 #endif /* LWIP_CHECKSUM_CTRL_PER_NETIF*/
   /** maximum transfer unit (in bytes) */
   u16_t mtu;
-  /** number of bytes used in hwaddr */
-  u8_t hwaddr_len;
+#if LWIP_IPV6 && LWIP_ND6_ALLOW_RA_UPDATES
+  /** maximum transfer unit (in bytes), updated by RA */
+  u16_t mtu6;
+#endif /* LWIP_IPV6 && LWIP_ND6_ALLOW_RA_UPDATES */
   /** link level hardware address of this interface */
   u8_t hwaddr[NETIF_MAX_HWADDR_LEN];
+  /** number of bytes used in hwaddr */
+  u8_t hwaddr_len;
   /** flags (@see @ref netif_flags) */
   u8_t flags;
   /** descriptive abbreviation */
   char name[2];
-  /** number of this interface */
+  /** 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
+  /** is this netif enabled for IPv6 autoconfiguration */
+  u8_t ip6_autoconfig_enabled;
+#endif /* LWIP_IPV6_AUTOCONFIG */
+#if LWIP_IPV6_SEND_ROUTER_SOLICIT
+  /** Number of Router Solicitation messages that remain to be sent. */
+  u8_t rs_count;
+#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */
 #if MIB2_STATS
   /** link type (from "snmp_ifType" enum from snmp_mib2.h) */
   u8_t link_type;
@@ -327,9 +376,9 @@
       filter table of the ethernet MAC. */
   netif_mld_mac_filter_fn mld_mac_filter;
 #endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
-#if LWIP_NETIF_HWADDRHINT
-  u8_t *addr_hint;
-#endif /* LWIP_NETIF_HWADDRHINT */
+#if LWIP_NETIF_USE_HINTS
+  struct netif_hint *hints;
+#endif /* LWIP_NETIF_USE_HINTS */
 #if ENABLE_LOOPBACK
   /* List of packets to be queued for ourselves. */
   struct pbuf *loop_first;
@@ -349,21 +398,28 @@
 #define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag)
 #endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */
 
+#if LWIP_SINGLE_NETIF
+#define NETIF_FOREACH(netif) if (((netif) = netif_default) != NULL)
+#else /* LWIP_SINGLE_NETIF */
 /** The list of network interfaces. */
 extern struct netif *netif_list;
+#define NETIF_FOREACH(netif) for ((netif) = netif_list; (netif) != NULL; (netif) = (netif)->next)
+#endif /* LWIP_SINGLE_NETIF */
 /** The default network interface. */
 extern struct netif *netif_default;
 
 void netif_init(void);
 
+struct netif *netif_add_noaddr(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input);
+
+#if LWIP_IPV4
 struct netif *netif_add(struct netif *netif,
-#if LWIP_IPV4
-                        const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw,
-#endif /* LWIP_IPV4 */
-                        void *state, netif_init_fn init, netif_input_fn input);
-#if LWIP_IPV4
+                            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);
 void netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask,
                     const ip4_addr_t *gw);
+#else /* LWIP_IPV4 */
+struct netif *netif_add(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input);
 #endif /* LWIP_IPV4 */
 void netif_remove(struct netif * netif);
 
@@ -393,6 +449,10 @@
 #define netif_ip_gw4(netif)      ((const ip_addr_t*)&((netif)->gw))
 #endif /* LWIP_IPV4 */
 
+#define netif_set_flags(netif, set_flags)     do { (netif)->flags = (u8_t)((netif)->flags |  (set_flags)); } while(0)
+#define netif_clear_flags(netif, clr_flags)   do { (netif)->flags = (u8_t)((netif)->flags & (u8_t)(~(clr_flags) & 0xff)); } while(0)
+#define netif_is_flag_set(nefif, flag)        (((netif)->flags & (flag)) != 0)
+
 void netif_set_up(struct netif *netif);
 void netif_set_down(struct netif *netif);
 /** @ingroup netif
@@ -459,13 +519,148 @@
 void netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit);
 err_t netif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t *chosen_idx);
 #define netif_set_ip6_autoconfig_enabled(netif, action) do { if(netif) { (netif)->ip6_autoconfig_enabled = (action); }}while(0)
+#if LWIP_IPV6_ADDRESS_LIFETIMES
+#define netif_ip6_addr_valid_life(netif, i)  \
+    (((netif) != NULL) ? ((netif)->ip6_addr_valid_life[i]) : IP6_ADDR_LIFE_STATIC)
+#define netif_ip6_addr_set_valid_life(netif, i, secs) \
+    do { if (netif != NULL) { (netif)->ip6_addr_valid_life[i] = (secs); }} while (0)
+#define netif_ip6_addr_pref_life(netif, i)  \
+    (((netif) != NULL) ? ((netif)->ip6_addr_pref_life[i]) : IP6_ADDR_LIFE_STATIC)
+#define netif_ip6_addr_set_pref_life(netif, i, secs) \
+    do { if (netif != NULL) { (netif)->ip6_addr_pref_life[i] = (secs); }} while (0)
+#define netif_ip6_addr_isstatic(netif, i)  \
+    (netif_ip6_addr_valid_life((netif), (i)) == IP6_ADDR_LIFE_STATIC)
+#else /* !LWIP_IPV6_ADDRESS_LIFETIMES */
+#define netif_ip6_addr_isstatic(netif, i)  (1) /* all addresses are static */
+#endif /* !LWIP_IPV6_ADDRESS_LIFETIMES */
+#if LWIP_ND6_ALLOW_RA_UPDATES
+#define netif_mtu6(netif) ((netif)->mtu6)
+#else /* LWIP_ND6_ALLOW_RA_UPDATES */
+#define netif_mtu6(netif) ((netif)->mtu)
+#endif /* LWIP_ND6_ALLOW_RA_UPDATES */
 #endif /* LWIP_IPV6 */
 
-#if LWIP_NETIF_HWADDRHINT
-#define NETIF_SET_HWADDRHINT(netif, hint) ((netif)->addr_hint = (hint))
-#else /* LWIP_NETIF_HWADDRHINT */
-#define NETIF_SET_HWADDRHINT(netif, hint)
-#endif /* LWIP_NETIF_HWADDRHINT */
+#if LWIP_NETIF_USE_HINTS
+#define NETIF_SET_HINTS(netif, netifhint)  (netif)->hints = (netifhint)
+#define NETIF_RESET_HINTS(netif)      (netif)->hints = NULL
+#else /* LWIP_NETIF_USE_HINTS */
+#define NETIF_SET_HINTS(netif, netifhint)
+#define NETIF_RESET_HINTS(netif)
+#endif /* LWIP_NETIF_USE_HINTS */
+
+u8_t netif_name_to_index(const char *name);
+char * netif_index_to_name(u8_t idx, char *name);
+struct netif* netif_get_by_index(u8_t idx);
+
+/* Interface indexes always start at 1 per RFC 3493, section 4, num starts at 0 (internal index is 0..254)*/
+#define netif_get_index(netif)      ((u8_t)((netif)->num + 1))
+#define NETIF_NO_INDEX              (0)
+
+/**
+ * @ingroup netif
+ * Extended netif status callback (NSC) reasons flags.
+ * May be extended in the future!
+ */
+typedef u16_t netif_nsc_reason_t;
+
+/* used for initialization only */
+#define LWIP_NSC_NONE                     0x0000
+/** netif was added. arg: NULL. Called AFTER netif was added. */
+#define LWIP_NSC_NETIF_ADDED              0x0001
+/** netif was removed. arg: NULL. Called BEFORE netif is removed. */
+#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
+  * down is called BEFORE the netif is actually set down. */
+#define LWIP_NSC_STATUS_CHANGED           0x0008
+/** IPv4 address has changed */
+#define LWIP_NSC_IPV4_ADDRESS_CHANGED     0x0010
+/** IPv4 gateway has changed */
+#define LWIP_NSC_IPV4_GATEWAY_CHANGED     0x0020
+/** IPv4 netmask has changed */
+#define LWIP_NSC_IPV4_NETMASK_CHANGED     0x0040
+/** called AFTER IPv4 address/gateway/netmask changes have been applied */
+#define LWIP_NSC_IPV4_SETTINGS_CHANGED    0x0080
+/** IPv6 address was added */
+#define LWIP_NSC_IPV6_SET                 0x0100
+/** IPv6 address state has changed */
+#define LWIP_NSC_IPV6_ADDR_STATE_CHANGED  0x0200
+
+/** @ingroup netif
+ * Argument supplied to netif_ext_callback_fn.
+ */
+typedef union
+{
+  /** Args to LWIP_NSC_LINK_CHANGED callback */
+  struct link_changed_s
+  {
+    /** 1: up; 0: down */
+    u8_t state;
+  } link_changed;
+  /** Args to LWIP_NSC_STATUS_CHANGED callback */
+  struct status_changed_s
+  {
+    /** 1: up; 0: down */
+    u8_t state;
+  } status_changed;
+  /** Args to LWIP_NSC_IPV4_ADDRESS_CHANGED|LWIP_NSC_IPV4_GATEWAY_CHANGED|LWIP_NSC_IPV4_NETMASK_CHANGED|LWIP_NSC_IPV4_SETTINGS_CHANGED callback */
+  struct ipv4_changed_s
+  {
+    /** Old IPv4 address */
+    const ip_addr_t* old_address;
+    const ip_addr_t* old_netmask;
+    const ip_addr_t* old_gw;
+  } ipv4_changed;
+  /** Args to LWIP_NSC_IPV6_SET callback */
+  struct ipv6_set_s
+  {
+    /** Index of changed IPv6 address */
+    s8_t addr_index;
+    /** Old IPv6 address */
+    const ip_addr_t* old_address;
+  } ipv6_set;
+  /** Args to LWIP_NSC_IPV6_ADDR_STATE_CHANGED callback */
+  struct ipv6_addr_state_changed_s
+  {
+    /** Index of affected IPv6 address */
+    s8_t addr_index;
+    /** Old IPv6 address state */
+    u8_t old_state;
+    /** Affected IPv6 address */
+    const ip_addr_t* address;
+  } ipv6_addr_state_changed;
+} netif_ext_callback_args_t;
+
+/**
+ * @ingroup netif
+ * Function used for extended netif status callbacks
+ * Note: When parsing reason argument, keep in mind that more reasons may be added in the future!
+ * @param netif netif that is affected by change
+ * @param reason change reason
+ * @param args depends on reason, see reason description
+ */
+typedef void (*netif_ext_callback_fn)(struct netif* netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t* args);
+
+#if LWIP_NETIF_EXT_STATUS_CALLBACK
+struct netif_ext_callback;
+typedef struct netif_ext_callback
+{
+  netif_ext_callback_fn callback_fn;
+  struct netif_ext_callback* next;
+} netif_ext_callback_t;
+
+#define NETIF_DECLARE_EXT_CALLBACK(name) static netif_ext_callback_t name;
+void netif_add_ext_callback(netif_ext_callback_t* callback, netif_ext_callback_fn fn);
+void netif_remove_ext_callback(netif_ext_callback_t* callback);
+void netif_invoke_ext_callback(struct netif* netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t* args);
+#else
+#define NETIF_DECLARE_EXT_CALLBACK(name)
+#define netif_add_ext_callback(callback, fn)
+#define netif_remove_ext_callback(callback)
+#define netif_invoke_ext_callback(netif, reason, args)
+#endif
 
 #ifdef __cplusplus
 }
diff --git a/src/include/lwip/netifapi.h b/src/include/lwip/netifapi.h
index 8bd2b4f..e063179 100644
--- a/src/include/lwip/netifapi.h
+++ b/src/include/lwip/netifapi.h
@@ -41,43 +41,27 @@
 #include "lwip/dhcp.h"
 #include "lwip/autoip.h"
 #include "lwip/priv/tcpip_priv.h"
+#include "lwip/priv/api_msg.h"
+#include "lwip/prot/ethernet.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#if LWIP_MPU_COMPATIBLE
-#define NETIFAPI_IPADDR_DEF(type, m)  type m
-#else /* LWIP_MPU_COMPATIBLE */
-#define NETIFAPI_IPADDR_DEF(type, m)  const type * m
-#endif /* LWIP_MPU_COMPATIBLE */
-
-typedef void (*netifapi_void_fn)(struct netif *netif);
-typedef err_t (*netifapi_errt_fn)(struct netif *netif);
-
-struct netifapi_msg {
-  struct tcpip_api_call_data call;
-  struct netif *netif;
-  union {
-    struct {
-#if LWIP_IPV4
-      NETIFAPI_IPADDR_DEF(ip4_addr_t, ipaddr);
-      NETIFAPI_IPADDR_DEF(ip4_addr_t, netmask);
-      NETIFAPI_IPADDR_DEF(ip4_addr_t, gw);
-#endif /* LWIP_IPV4 */
-      void *state;
-      netif_init_fn init;
-      netif_input_fn input;
-    } add;
-    struct {
-      netifapi_void_fn voidfunc;
-      netifapi_errt_fn errtfunc;
-    } common;
-  } msg;
+/* API for application */
+#if LWIP_ARP && LWIP_IPV4
+/* Used for netfiapi_arp_* APIs */
+enum netifapi_arp_entry {
+  NETIFAPI_ARP_PERM /* Permanent entry */
+  /* Other entry types can be added here */
 };
 
+/** @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 */
+err_t netifapi_arp_remove(const ip4_addr_t *ipaddr, enum netifapi_arp_entry type);
+#endif /* LWIP_ARP && LWIP_IPV4 */
 
-/* API for application */
 err_t netifapi_netif_add(struct netif *netif,
 #if LWIP_IPV4
                          const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw,
@@ -93,16 +77,33 @@
                             netifapi_errt_fn errtfunc);
 
 /** @ingroup netifapi_netif */
+err_t netifapi_netif_name_to_index(const char *name, u8_t *index);
+/** @ingroup netifapi_netif */
+err_t netifapi_netif_index_to_name(u8_t index, char *name);
+
+/** @ingroup netifapi_netif
+  * @see netif_remove()
+  */
 #define netifapi_netif_remove(n)        netifapi_netif_common(n, netif_remove, NULL)
-/** @ingroup netifapi_netif */
+/** @ingroup netifapi_netif
+  * @see netif_set_up()
+  */
 #define netifapi_netif_set_up(n)        netifapi_netif_common(n, netif_set_up, NULL)
-/** @ingroup netifapi_netif */
+/** @ingroup netifapi_netif
+  * @see netif_set_down()
+  */
 #define netifapi_netif_set_down(n)      netifapi_netif_common(n, netif_set_down, NULL)
-/** @ingroup netifapi_netif */
+/** @ingroup netifapi_netif
+  * @see netif_set_default()
+  */
 #define netifapi_netif_set_default(n)   netifapi_netif_common(n, netif_set_default, NULL)
-/** @ingroup netifapi_netif */
+/** @ingroup netifapi_netif
+  * @see netif_set_link_up()
+  */
 #define netifapi_netif_set_link_up(n)   netifapi_netif_common(n, netif_set_link_up, NULL)
-/** @ingroup netifapi_netif */
+/** @ingroup netifapi_netif
+  * @see netif_set_link_down()
+  */
 #define netifapi_netif_set_link_down(n) netifapi_netif_common(n, netif_set_link_down, NULL)
 
 /**
@@ -110,25 +111,45 @@
  * @ingroup netifapi
  * To be called from non-TCPIP threads
  */
-/** @ingroup netifapi_dhcp4 */
-#define netifapi_dhcp_start(n)        netifapi_netif_common(n, NULL, dhcp_start)
-/** @ingroup netifapi_dhcp4 */
-#define netifapi_dhcp_stop(n)         netifapi_netif_common(n, dhcp_stop, NULL)
-/** @ingroup netifapi_dhcp4 */
-#define netifapi_dhcp_inform(n)       netifapi_netif_common(n, dhcp_inform, NULL)
-/** @ingroup netifapi_dhcp4 */
-#define netifapi_dhcp_renew(n)        netifapi_netif_common(n, NULL, dhcp_renew)
-/** @ingroup netifapi_dhcp4 */
-#define netifapi_dhcp_release(n)      netifapi_netif_common(n, NULL, dhcp_release)
+/** @ingroup netifapi_dhcp4
+  * @see dhcp_start()
+  */
+#define netifapi_dhcp_start(n)            netifapi_netif_common(n, NULL, dhcp_start)
+/**
+ * @ingroup netifapi_dhcp4
+ * @deprecated Use netifapi_dhcp_release_and_stop() instead.
+ */
+#define netifapi_dhcp_stop(n)             netifapi_netif_common(n, dhcp_stop, NULL)
+/** @ingroup netifapi_dhcp4
+  * @see dhcp_inform()
+  */
+#define netifapi_dhcp_inform(n)           netifapi_netif_common(n, dhcp_inform, NULL)
+/** @ingroup netifapi_dhcp4
+  * @see dhcp_renew()
+  */
+#define netifapi_dhcp_renew(n)            netifapi_netif_common(n, NULL, dhcp_renew)
+/**
+ * @ingroup netifapi_dhcp4
+ * @deprecated Use netifapi_dhcp_release_and_stop() instead.
+ */
+#define netifapi_dhcp_release(n)          netifapi_netif_common(n, NULL, dhcp_release)
+/** @ingroup netifapi_dhcp4
+  * @see dhcp_release_and_stop()
+  */
+#define netifapi_dhcp_release_and_stop(n) netifapi_netif_common(n, dhcp_release_and_stop, NULL)
 
 /**
  * @defgroup netifapi_autoip AUTOIP
  * @ingroup netifapi
  * To be called from non-TCPIP threads
  */
-/** @ingroup netifapi_autoip */
+/** @ingroup netifapi_autoip
+  * @see autoip_start()
+  */
 #define netifapi_autoip_start(n)      netifapi_netif_common(n, NULL, autoip_start)
-/** @ingroup netifapi_autoip */
+/** @ingroup netifapi_autoip
+  * @see autoip_stop()
+  */
 #define netifapi_autoip_stop(n)       netifapi_netif_common(n, NULL, autoip_stop)
 
 #ifdef __cplusplus
diff --git a/src/include/lwip/opt.h b/src/include/lwip/opt.h
index fd459af..82c420c 100644
--- a/src/include/lwip/opt.h
+++ b/src/include/lwip/opt.h
@@ -144,6 +144,15 @@
 #if !defined SMEMCPY || defined __DOXYGEN__
 #define SMEMCPY(dst,src,len)            memcpy(dst,src,len)
 #endif
+
+/**
+ * MEMMOVE: override this if you have a faster implementation at hand than the
+ * one included in your C library.  lwIP currently uses MEMMOVE only when IPv6
+ * fragmentation support is enabled.
+ */
+#if !defined MEMMOVE || defined __DOXYGEN__
+#define MEMMOVE(dst,src,len)            memmove(dst,src,len)
+#endif
 /**
  * @}
  */
@@ -203,6 +212,29 @@
 #if !defined SYS_LIGHTWEIGHT_PROT || defined __DOXYGEN__
 #define SYS_LIGHTWEIGHT_PROT            1
 #endif
+
+/**
+ * Macro/function to check whether lwIP's threading/locking
+ * requirements are satisfied during current function call.
+ * This macro usually calls a function that is implemented in the OS-dependent
+ * sys layer and performs the following checks:
+ * - Not in ISR (this should be checked for NO_SYS==1, too!)
+ * - If @ref LWIP_TCPIP_CORE_LOCKING = 1: TCPIP core lock is held
+ * - If @ref LWIP_TCPIP_CORE_LOCKING = 0: function is called from TCPIP thread
+ * @see @ref multithreading
+ */
+#if !defined LWIP_ASSERT_CORE_LOCKED || defined __DOXYGEN__
+#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
 /**
  * @}
  */
@@ -240,6 +272,15 @@
 #endif
 
 /**
+ * MEMP_MEM_INIT==1: Force use of memset to initialize pool memory.
+ * Useful if pool are moved in uninitialized section of memory. This will ensure
+ * default values in pcbs struct are well initialized in all conditions.
+ */
+#if !defined MEMP_MEM_INIT || defined __DOXYGEN__
+#define MEMP_MEM_INIT                   0
+#endif
+
+/**
  * 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
@@ -278,6 +319,27 @@
 #endif
 
 /**
+ * MEM_OVERFLOW_CHECK: mem overflow protection reserves a configurable
+ * amount of bytes before and after each heap allocation chunk and fills
+ * it with a prominent default value.
+ *    MEM_OVERFLOW_CHECK == 0 no checking
+ *    MEM_OVERFLOW_CHECK == 1 checks each element when it is freed
+ *    MEM_OVERFLOW_CHECK >= 2 checks all heap elements every time
+ *      mem_malloc() or mem_free() is called (useful but slow!)
+ */
+#if !defined MEM_OVERFLOW_CHECK || defined __DOXYGEN__
+#define MEM_OVERFLOW_CHECK              0
+#endif
+
+/**
+ * MEM_SANITY_CHECK==1: run a sanity check after each mem_free() to make
+ * sure that the linked list of heap elements is not corrupted.
+ */
+#if !defined MEM_SANITY_CHECK || defined __DOXYGEN__
+#define MEM_SANITY_CHECK                0
+#endif
+
+/**
  * MEM_USE_POOLS==1: Use an alternative to malloc() by allocating from a set
  * of memory pools of various sizes. When mem_malloc is called, an element of
  * the smallest pool that can provide the length needed is returned.
@@ -391,6 +453,16 @@
 #endif
 
 /**
+ * MEMP_NUM_ALTCP_PCB: the number of simultaneously active altcp layer pcbs.
+ * (requires the LWIP_ALTCP option)
+ * Connections with multiple layers require more than one altcp_pcb (e.g. TLS
+ * over TCP requires 2 altcp_pcbs, one for TLS and one for TCP).
+ */
+#if !defined MEMP_NUM_ALTCP_PCB || defined __DOXYGEN__
+#define MEMP_NUM_ALTCP_PCB              MEMP_NUM_TCP_PCB
+#endif
+
+/**
  * MEMP_NUM_REASSDATA: the number of IP packets simultaneously queued for
  * reassembly (whole packets, not fragments!)
  */
@@ -430,12 +502,18 @@
 #endif
 
 /**
+ * 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)))
+
+/**
  * MEMP_NUM_SYS_TIMEOUT: the number of simultaneously active timeouts.
  * The default number of timeouts is calculated here for all enabled modules.
  * The formula expects settings to be either '0' or '1'.
  */
 #if !defined MEMP_NUM_SYS_TIMEOUT || defined __DOXYGEN__
-#define MEMP_NUM_SYS_TIMEOUT            (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + (PPP_SUPPORT*6*MEMP_NUM_PPP_PCB) + (LWIP_IPV6 ? (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD) : 0))
+#define MEMP_NUM_SYS_TIMEOUT            LWIP_NUM_SYS_TIMEOUT_INTERNAL
 #endif
 
 /**
@@ -455,6 +533,15 @@
 #endif
 
 /**
+ * MEMP_NUM_SELECT_CB: the number of struct lwip_select_cb.
+ * (Only needed if you have LWIP_MPU_COMPATIBLE==1 and use the socket API.
+ * In that case, you need one per thread calling lwip_select.)
+ */
+#if !defined MEMP_NUM_SELECT_CB || defined __DOXYGEN__
+#define MEMP_NUM_SELECT_CB              4
+#endif
+
+/**
  * 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)
@@ -617,7 +704,7 @@
  * (but this should only occur for AutoIP).
  */
 #if !defined ETHARP_TABLE_MATCH_NETIF || defined __DOXYGEN__
-#define ETHARP_TABLE_MATCH_NETIF        0
+#define ETHARP_TABLE_MATCH_NETIF        !LWIP_SINGLE_NETIF
 #endif
 /**
  * @}
@@ -692,7 +779,7 @@
  * in this time, the whole packet is discarded.
  */
 #if !defined IP_REASS_MAXAGE || defined __DOXYGEN__
-#define IP_REASS_MAXAGE                 3
+#define IP_REASS_MAXAGE                 15
 #endif
 
 /**
@@ -700,6 +787,8 @@
  * 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!
+ * When IPv4 *and* IPv6 are enabled, this even changes to
+ * (PBUF_POOL_SIZE > 2 * IP_REASS_MAX_PBUFS)!
  */
 #if !defined IP_REASS_MAX_PBUFS || defined __DOXYGEN__
 #define IP_REASS_MAX_PBUFS              10
@@ -739,15 +828,6 @@
 #if !defined IP_FORWARD_ALLOW_TX_ON_RX_NETIF || defined __DOXYGEN__
 #define IP_FORWARD_ALLOW_TX_ON_RX_NETIF 0
 #endif
-
-/**
- * LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS==1: randomize the local port for the first
- * local TCP/UDP pcb (default==0). This can prevent creating predictable port
- * numbers after booting a device.
- */
-#if !defined LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS || defined __DOXYGEN__
-#define LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS 0
-#endif
 /**
  * @}
  */
@@ -774,7 +854,7 @@
  * ICMP_TTL: Default value for Time-To-Live used by ICMP packets.
  */
 #if !defined ICMP_TTL || defined __DOXYGEN__
-#define ICMP_TTL                       (IP_DEFAULT_TTL)
+#define ICMP_TTL                        IP_DEFAULT_TTL
 #endif
 
 /**
@@ -815,7 +895,7 @@
  * LWIP_RAW==1: Enable application layer to hook into the IP layer itself.
  */
 #if !defined RAW_TTL || defined __DOXYGEN__
-#define RAW_TTL                        (IP_DEFAULT_TTL)
+#define RAW_TTL                         IP_DEFAULT_TTL
 #endif
 /**
  * @}
@@ -847,17 +927,7 @@
  * DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address.
  */
 #if !defined DHCP_DOES_ARP_CHECK || defined __DOXYGEN__
-#define DHCP_DOES_ARP_CHECK             ((LWIP_DHCP) && (LWIP_ARP))
-#endif
-
-/**
- * LWIP_DHCP_CHECK_LINK_UP==1: dhcp_start() only really starts if the netif has
- * NETIF_FLAG_LINK_UP set in its flags. As this is only an optimization and
- * netif drivers might not set this flag, the default is off. If enabled,
- * netif_set_link_up() must be called to continue dhcp starting.
- */
-#if !defined LWIP_DHCP_CHECK_LINK_UP
-#define LWIP_DHCP_CHECK_LINK_UP         0
+#define DHCP_DOES_ARP_CHECK             (LWIP_DHCP && LWIP_ARP)
 #endif
 
 /**
@@ -885,7 +955,7 @@
 
 /**
  * LWIP_DHCP_MAX_DNS_SERVERS > 0: Request DNS servers with discover/select.
- * DHCP servers received in the response are passed to DNS via @ref dns_setserver()
+ * DNS servers received in the response are passed to DNS via @ref dns_setserver()
  * (up to the maximum limit defined here).
  */
 #if !defined LWIP_DHCP_MAX_DNS_SERVERS || defined __DOXYGEN__
@@ -963,7 +1033,29 @@
 
 /*
    ----------------------------------
-   ----- Multicast/IGMP options -----
+   -------- Multicast options -------
+   ----------------------------------
+*/
+/**
+ * @defgroup lwip_opts_multicast Multicast
+ * @ingroup lwip_opts_infrastructure
+ * @{
+ */
+/**
+ * LWIP_MULTICAST_TX_OPTIONS==1: Enable multicast TX support like the socket options
+ * IP_MULTICAST_TTL/IP_MULTICAST_IF/IP_MULTICAST_LOOP, as well as (currently only)
+ * core support for the corresponding IPv6 options.
+ */
+#if !defined LWIP_MULTICAST_TX_OPTIONS || defined __DOXYGEN__
+#define LWIP_MULTICAST_TX_OPTIONS       ((LWIP_IGMP || LWIP_IPV6_MLD) && (LWIP_UDP || LWIP_RAW))
+#endif
+/**
+ * @}
+ */
+
+/*
+   ----------------------------------
+   ---------- IGMP options ----------
    ----------------------------------
 */
 /**
@@ -981,14 +1073,6 @@
 #undef LWIP_IGMP
 #define LWIP_IGMP                       0
 #endif
-
-/**
- * LWIP_MULTICAST_TX_OPTIONS==1: Enable multicast TX support like the socket options
- * IP_MULTICAST_TTL/IP_MULTICAST_IF/IP_MULTICAST_LOOP
- */
-#if !defined LWIP_MULTICAST_TX_OPTIONS || defined __DOXYGEN__
-#define LWIP_MULTICAST_TX_OPTIONS       (LWIP_IGMP && LWIP_UDP)
-#endif
 /**
  * @}
  */
@@ -1029,6 +1113,11 @@
 #define DNS_MAX_SERVERS                 2
 #endif
 
+/** DNS maximum number of retries when asking for a name, before "timeout". */
+#if !defined DNS_MAX_RETRIES || defined __DOXYGEN__
+#define DNS_MAX_RETRIES                 4
+#endif
+
 /** DNS do a name checking between the query and the response. */
 #if !defined DNS_DOES_NAME_CHECK || defined __DOXYGEN__
 #define DNS_DOES_NAME_CHECK             1
@@ -1068,7 +1157,7 @@
 /** Set this to 1 to enable querying ".local" names via mDNS
  *  using a One-Shot Multicast DNS Query */
 #if !defined LWIP_DNS_SUPPORT_MDNS_QUERIES || defined __DOXYGEN__
-#define LWIP_DNS_SUPPORT_MDNS_QUERIES  0
+#define LWIP_DNS_SUPPORT_MDNS_QUERIES   0
 #endif
 /**
  * @}
@@ -1102,7 +1191,7 @@
  * UDP_TTL: Default Time-To-Live value.
  */
 #if !defined UDP_TTL || defined __DOXYGEN__
-#define UDP_TTL                         (IP_DEFAULT_TTL)
+#define UDP_TTL                         IP_DEFAULT_TTL
 #endif
 
 /**
@@ -1136,7 +1225,7 @@
  * TCP_TTL: Default Time-To-Live value.
  */
 #if !defined TCP_TTL || defined __DOXYGEN__
-#define TCP_TTL                         (IP_DEFAULT_TTL)
+#define TCP_TTL                         IP_DEFAULT_TTL
 #endif
 
 /**
@@ -1169,7 +1258,28 @@
  * Define to 0 if your device is low on memory.
  */
 #if !defined TCP_QUEUE_OOSEQ || defined __DOXYGEN__
-#define TCP_QUEUE_OOSEQ                 (LWIP_TCP)
+#define TCP_QUEUE_OOSEQ                 LWIP_TCP
+#endif
+
+/**
+ * LWIP_TCP_SACK_OUT==1: TCP will support sending selective acknowledgements (SACKs).
+ */
+#if !defined LWIP_TCP_SACK_OUT || defined __DOXYGEN__
+#define LWIP_TCP_SACK_OUT               0
+#endif
+
+/**
+ * LWIP_TCP_MAX_SACK_NUM: The maximum number of SACK values to include in TCP segments.
+ * Must be at least 1, but is only used if LWIP_TCP_SACK_OUT is enabled.
+ * NOTE: Even though we never send more than 3 or 4 SACK ranges in a single segment
+ * (depending on other options), setting this option to values greater than 4 is not pointless.
+ * This is basically the max number of SACK ranges we want to keep track of.
+ * As new data is delivered, some of the SACK ranges may be removed or merged.
+ * In that case some of those older SACK ranges may be used again.
+ * The amount of memory used to store SACK ranges is LWIP_TCP_MAX_SACK_NUM * 8 bytes for each TCP PCB.
+ */
+#if !defined LWIP_TCP_MAX_SACK_NUM || defined __DOXYGEN__
+#define LWIP_TCP_MAX_SACK_NUM           4
 #endif
 
 /**
@@ -1231,22 +1341,52 @@
 #endif
 
 /**
- * TCP_OOSEQ_MAX_BYTES: The maximum number of bytes queued on ooseq per pcb.
- * Default is 0 (no limit). Only valid for TCP_QUEUE_OOSEQ==1.
+ * TCP_OOSEQ_MAX_BYTES: The default maximum number of bytes queued on ooseq per
+ * pcb if TCP_OOSEQ_BYTES_LIMIT is not defined. Default is 0 (no limit).
+ * Only valid for TCP_QUEUE_OOSEQ==1.
  */
 #if !defined TCP_OOSEQ_MAX_BYTES || defined __DOXYGEN__
 #define TCP_OOSEQ_MAX_BYTES             0
 #endif
 
 /**
- * TCP_OOSEQ_MAX_PBUFS: The maximum number of pbufs queued on ooseq per pcb.
- * Default is 0 (no limit). Only valid for TCP_QUEUE_OOSEQ==1.
+ * TCP_OOSEQ_BYTES_LIMIT(pcb): Return the maximum number of bytes to be queued
+ * on ooseq per pcb, given the pcb. Only valid for TCP_QUEUE_OOSEQ==1 &&
+ * TCP_OOSEQ_MAX_BYTES==1.
+ * Use this to override TCP_OOSEQ_MAX_BYTES to a dynamic value per pcb.
+ */
+#if !defined TCP_OOSEQ_BYTES_LIMIT
+#if TCP_OOSEQ_MAX_BYTES
+#define TCP_OOSEQ_BYTES_LIMIT(pcb)      TCP_OOSEQ_MAX_BYTES
+#elif defined __DOXYGEN__
+#define TCP_OOSEQ_BYTES_LIMIT(pcb)
+#endif
+#endif
+
+/**
+ * TCP_OOSEQ_MAX_PBUFS: The default maximum number of pbufs queued on ooseq per
+ * pcb if TCP_OOSEQ_BYTES_LIMIT is not defined. Default is 0 (no limit).
+ * Only valid for TCP_QUEUE_OOSEQ==1.
  */
 #if !defined TCP_OOSEQ_MAX_PBUFS || defined __DOXYGEN__
 #define TCP_OOSEQ_MAX_PBUFS             0
 #endif
 
 /**
+ * TCP_OOSEQ_PBUFS_LIMIT(pcb): Return the maximum number of pbufs to be queued
+ * on ooseq per pcb, given the pcb.  Only valid for TCP_QUEUE_OOSEQ==1 &&
+ * TCP_OOSEQ_MAX_PBUFS==1.
+ * Use this to override TCP_OOSEQ_MAX_PBUFS to a dynamic value per pcb.
+ */
+#if !defined TCP_OOSEQ_PBUFS_LIMIT
+#if TCP_OOSEQ_MAX_PBUFS
+#define TCP_OOSEQ_PBUFS_LIMIT(pcb)      TCP_OOSEQ_MAX_PBUFS
+#elif defined __DOXYGEN__
+#define TCP_OOSEQ_PBUFS_LIMIT(pcb)
+#endif
+#endif
+
+/**
  * TCP_LISTEN_BACKLOG: Enable the backlog option for tcp listen pcb.
  */
 #if !defined TCP_LISTEN_BACKLOG || defined __DOXYGEN__
@@ -1295,7 +1435,7 @@
  * explicit window update
  */
 #if !defined TCP_WND_UPDATE_THRESHOLD || defined __DOXYGEN__
-#define TCP_WND_UPDATE_THRESHOLD   LWIP_MIN((TCP_WND / 4), (TCP_MSS * 4))
+#define TCP_WND_UPDATE_THRESHOLD        LWIP_MIN((TCP_WND / 4), (TCP_MSS * 4))
 #endif
 
 /**
@@ -1329,6 +1469,41 @@
 #define LWIP_WND_SCALE                  0
 #define TCP_RCV_SCALE                   0
 #endif
+
+/**
+ * LWIP_TCP_PCB_NUM_EXT_ARGS:
+ * When this is > 0, every tcp pcb (including listen pcb) includes a number of
+ * additional argument entries in an array (see tcp_ext_arg_alloc_id)
+ */
+#if !defined LWIP_TCP_PCB_NUM_EXT_ARGS || defined __DOXYGEN__
+#define LWIP_TCP_PCB_NUM_EXT_ARGS       0
+#endif
+
+/** LWIP_ALTCP==1: enable the altcp API.
+ * altcp is an abstraction layer that prevents applications linking against the
+ * tcp.h functions but provides the same functionality. It is used to e.g. add
+ * SSL/TLS or proxy-connect support to an application written for the tcp callback
+ * API without that application knowing the protocol details.
+ *
+ * With LWIP_ALTCP==0, applications written against the altcp API can still be
+ * compiled but are directly linked against the tcp.h callback API and then
+ * cannot use layered protocols.
+ *
+ * See @ref altcp_api
+ */
+#if !defined LWIP_ALTCP || defined __DOXYGEN__
+#define LWIP_ALTCP                      0
+#endif
+
+/** LWIP_ALTCP_TLS==1: enable TLS support for altcp API.
+ * This needs a port of the functions in altcp_tls.h to a TLS library.
+ * A port to ARM mbedtls is provided with lwIP, see apps/altcp_tls/ directory
+ * and LWIP_ALTCP_TLS_MBEDTLS option.
+ */
+#if !defined LWIP_ALTCP_TLS || defined __DOXYGEN__
+#define LWIP_ALTCP_TLS                  0
+#endif
+
 /**
  * @}
  */
@@ -1361,7 +1536,7 @@
  * for an additional encapsulation header before ethernet headers (e.g. 802.11)
  */
 #if !defined PBUF_LINK_ENCAPSULATION_HLEN || defined __DOXYGEN__
-#define PBUF_LINK_ENCAPSULATION_HLEN    0u
+#define PBUF_LINK_ENCAPSULATION_HLEN    0
 #endif
 
 /**
@@ -1372,6 +1547,14 @@
 #if !defined PBUF_POOL_BUFSIZE || defined __DOXYGEN__
 #define PBUF_POOL_BUFSIZE               LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN)
 #endif
+
+/**
+ * LWIP_PBUF_REF_T: Refcount type in pbuf.
+ * Default width of u8_t can be increased if 255 refs are not enough for you.
+ */
+#if !defined LWIP_PBUF_REF_T || defined __DOXYGEN__
+#define LWIP_PBUF_REF_T                 u8_t
+#endif
 /**
  * @}
  */
@@ -1387,6 +1570,14 @@
  * @{
  */
 /**
+ * LWIP_SINGLE_NETIF==1: use a single netif only. This is the common case for
+ * small real-life targets. Some code like routing etc. can be left out.
+ */
+#if !defined LWIP_SINGLE_NETIF || defined __DOXYGEN__
+#define LWIP_SINGLE_NETIF               0
+#endif
+
+/**
  * LWIP_NETIF_HOSTNAME==1: use DHCP_OPTION_HOSTNAME with netif's hostname
  * field.
  */
@@ -1410,6 +1601,15 @@
 #endif
 
 /**
+ * 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
+ */
+#if !defined LWIP_NETIF_EXT_STATUS_CALLBACK || defined __DOXYGEN__
+#define LWIP_NETIF_EXT_STATUS_CALLBACK  0
+#endif
+
+/**
  * LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface
  * whenever the link changes (i.e., link down)
  */
@@ -1437,24 +1637,33 @@
 #endif
 
 /**
- * LWIP_NETIF_TX_SINGLE_PBUF: if this is set to 1, lwIP tries to put all data
+ * LWIP_NETIF_TX_SINGLE_PBUF: if this is set to 1, lwIP *tries* to put all data
  * to be sent into one single pbuf. This is for compatibility with DMA-enabled
  * MACs that do not support scatter-gather.
  * Beware that this might involve CPU-memcpy before transmitting that would not
  * be needed without this flag! Use this only if you need to!
  *
- * @todo: TCP and IP-frag do not work with this, yet:
+ * ATTENTION: a driver should *NOT* rely on getting single pbufs but check TX
+ * pbufs for being in one piece. If not, @ref pbuf_clone can be used to get
+ * a single pbuf:
+ *   if (p->next != NULL) {
+ *     struct pbuf *q = pbuf_clone(PBUF_RAW, PBUF_RAM, p);
+ *     if (q == NULL) {
+ *       return ERR_MEM;
+ *     }
+ *     p = q; ATTENTION: do NOT free the old 'p' as the ref belongs to the caller!
+ *   }
  */
 #if !defined LWIP_NETIF_TX_SINGLE_PBUF || defined __DOXYGEN__
-#define LWIP_NETIF_TX_SINGLE_PBUF             0
+#define LWIP_NETIF_TX_SINGLE_PBUF       0
 #endif /* LWIP_NETIF_TX_SINGLE_PBUF */
 
 /**
  * LWIP_NUM_NETIF_CLIENT_DATA: Number of clients that may store
- * data in client_data member array of struct netif.
+ * data in client_data member array of struct netif (max. 256).
  */
 #if !defined LWIP_NUM_NETIF_CLIENT_DATA || defined __DOXYGEN__
-#define LWIP_NUM_NETIF_CLIENT_DATA            0
+#define LWIP_NUM_NETIF_CLIENT_DATA      0
 #endif
 /**
  * @}
@@ -1476,14 +1685,14 @@
  * netif is available, loopback traffic uses this netif.
  */
 #if !defined LWIP_HAVE_LOOPIF || defined __DOXYGEN__
-#define LWIP_HAVE_LOOPIF                LWIP_NETIF_LOOPBACK
+#define LWIP_HAVE_LOOPIF                (LWIP_NETIF_LOOPBACK && !LWIP_SINGLE_NETIF)
 #endif
 
 /**
  * LWIP_LOOPIF_MULTICAST==1: Support multicast/IGMP on loop interface (127.0.0.1).
  */
 #if !defined LWIP_LOOPIF_MULTICAST || defined __DOXYGEN__
-#define LWIP_LOOPIF_MULTICAST               0
+#define LWIP_LOOPIF_MULTICAST           0
 #endif
 
 /**
@@ -1536,7 +1745,7 @@
  * TCPIP_THREAD_NAME: The name assigned to the main tcpip thread.
  */
 #if !defined TCPIP_THREAD_NAME || defined __DOXYGEN__
-#define TCPIP_THREAD_NAME              "tcpip_thread"
+#define TCPIP_THREAD_NAME               "tcpip_thread"
 #endif
 
 /**
@@ -1578,7 +1787,7 @@
  * SLIPIF_THREAD_NAME: The name assigned to the slipif_loop thread.
  */
 #if !defined SLIPIF_THREAD_NAME || defined __DOXYGEN__
-#define SLIPIF_THREAD_NAME             "slipif_loop"
+#define SLIPIF_THREAD_NAME              "slipif_loop"
 #endif
 
 /**
@@ -1603,7 +1812,7 @@
  * DEFAULT_THREAD_NAME: The name assigned to any other lwIP thread.
  */
 #if !defined DEFAULT_THREAD_NAME || defined __DOXYGEN__
-#define DEFAULT_THREAD_NAME            "lwIP"
+#define DEFAULT_THREAD_NAME             "lwIP"
 #endif
 
 /**
@@ -1733,13 +1942,6 @@
 #define LWIP_SOCKET                     1
 #endif
 
-/* LWIP_SOCKET_SET_ERRNO==1: Set errno when socket functions cannot complete
- * successfully, as required by POSIX. Default is POSIX-compliant.
- */
-#if !defined LWIP_SOCKET_SET_ERRNO || defined __DOXYGEN__
-#define LWIP_SOCKET_SET_ERRNO           1
-#endif
-
 /**
  * LWIP_COMPAT_SOCKETS==1: Enable BSD-style sockets functions names through defines.
  * LWIP_COMPAT_SOCKETS==2: Same as ==1 but correctly named functions are created.
@@ -1858,6 +2060,24 @@
 #if !defined LWIP_FIONREAD_LINUXMODE || defined __DOXYGEN__
 #define LWIP_FIONREAD_LINUXMODE         0
 #endif
+
+/**
+ * LWIP_SOCKET_SELECT==1 (default): enable select() for sockets (uses a netconn
+ * callback to keep track of events).
+ * This saves RAM (counters per socket) and code (netconn event callback), which
+ * should improve performance a bit).
+ */
+#if !defined LWIP_SOCKET_SELECT || defined __DOXYGEN__
+#define LWIP_SOCKET_SELECT              1
+#endif
+
+/**
+ * LWIP_SOCKET_POLL==1 (default): enable poll() for sockets (including
+ * struct pollfd, nfds_t, and constants)
+ */
+#if !defined LWIP_SOCKET_POLL || defined __DOXYGEN__
+#define LWIP_SOCKET_POLL                1
+#endif
 /**
  * @}
  */
@@ -2154,6 +2374,46 @@
 #endif
 
 /**
+ * IPV6_REASS_MAXAGE: Maximum time (in multiples of IP6_REASS_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.
+ */
+#if !defined IPV6_REASS_MAXAGE || defined __DOXYGEN__
+#define IPV6_REASS_MAXAGE               60
+#endif
+
+/**
+ * LWIP_IPV6_SCOPES==1: Enable support for IPv6 address scopes, ensuring that
+ * e.g. link-local addresses are really treated as link-local. Disable this
+ * setting only for single-interface configurations.
+ * 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 
+ * 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
+ * relevant macros. For now it is still possible to turn off scopes support
+ * through the new LWIP_IPV6_SCOPES option. When upgrading an implementation that
+ * uses the core API directly, it is highly recommended to enable
+ * LWIP_IPV6_SCOPES_DEBUG at least for a while, to ensure e.g. proper address
+ * initialization.
+ */
+#if !defined LWIP_IPV6_SCOPES || defined __DOXYGEN__
+#define LWIP_IPV6_SCOPES                (LWIP_IPV6 && !LWIP_SINGLE_NETIF)
+#endif
+
+/**
+ * LWIP_IPV6_SCOPES_DEBUG==1: Perform run-time checks to verify that addresses
+ * are properly zoned (see ip6_zone.h on what that means) where it matters.
+ * Enabling this setting is highly recommended when upgrading from an existing
+ * installation that is not yet scope-aware; otherwise it may be too expensive.
+ */
+#if !defined LWIP_IPV6_SCOPES_DEBUG || defined __DOXYGEN__
+#define LWIP_IPV6_SCOPES_DEBUG          0
+#endif
+
+/**
  * LWIP_IPV6_NUM_ADDRESSES: Number of IPv6 addresses per netif.
  */
 #if !defined LWIP_IPV6_NUM_ADDRESSES || defined __DOXYGEN__
@@ -2171,14 +2431,14 @@
  * LWIP_IPV6_FRAG==1: Fragment outgoing IPv6 packets that are too big.
  */
 #if !defined LWIP_IPV6_FRAG || defined __DOXYGEN__
-#define LWIP_IPV6_FRAG                  0
+#define LWIP_IPV6_FRAG                  1
 #endif
 
 /**
  * LWIP_IPV6_REASS==1: reassemble incoming IPv6 packets that fragmented
  */
 #if !defined LWIP_IPV6_REASS || defined __DOXYGEN__
-#define LWIP_IPV6_REASS                 (LWIP_IPV6)
+#define LWIP_IPV6_REASS                 LWIP_IPV6
 #endif
 
 /**
@@ -2193,7 +2453,18 @@
  * LWIP_IPV6_AUTOCONFIG==1: Enable stateless address autoconfiguration as per RFC 4862.
  */
 #if !defined LWIP_IPV6_AUTOCONFIG || defined __DOXYGEN__
-#define LWIP_IPV6_AUTOCONFIG            (LWIP_IPV6)
+#define LWIP_IPV6_AUTOCONFIG            LWIP_IPV6
+#endif
+
+/**
+ * LWIP_IPV6_ADDRESS_LIFETIMES==1: Keep valid and preferred lifetimes for each
+ * IPv6 address. Required for LWIP_IPV6_AUTOCONFIG. May still be enabled
+ * otherwise, in which case the application may assign address lifetimes with
+ * the appropriate macros. Addresses with no lifetime are assumed to be static.
+ * If this option is disabled, all addresses are assumed to be static.
+ */
+#if !defined LWIP_IPV6_ADDRESS_LIFETIMES || defined __DOXYGEN__
+#define LWIP_IPV6_ADDRESS_LIFETIMES     LWIP_IPV6_AUTOCONFIG
 #endif
 
 /**
@@ -2215,7 +2486,7 @@
  * LWIP_ICMP6==1: Enable ICMPv6 (mandatory per RFC)
  */
 #if !defined LWIP_ICMP6 || defined __DOXYGEN__
-#define LWIP_ICMP6                      (LWIP_IPV6)
+#define LWIP_ICMP6                      LWIP_IPV6
 #endif
 
 /**
@@ -2247,7 +2518,7 @@
  * indiscriminately pass all inbound IPv6 multicast traffic to lwIP.
  */
 #if !defined LWIP_IPV6_MLD || defined __DOXYGEN__
-#define LWIP_IPV6_MLD                   (LWIP_IPV6)
+#define LWIP_IPV6_MLD                   LWIP_IPV6
 #endif
 
 /**
@@ -2273,7 +2544,7 @@
  * is being resolved.
  */
 #if !defined LWIP_ND6_QUEUEING || defined __DOXYGEN__
-#define LWIP_ND6_QUEUEING               (LWIP_IPV6)
+#define LWIP_ND6_QUEUEING               LWIP_IPV6
 #endif
 
 /**
@@ -2394,12 +2665,60 @@
  */
 
 /**
- * LWIP_IPV6_DHCP6==1: enable DHCPv6 stateful address autoconfiguration.
+ * @defgroup lwip_opts_dhcpv6 DHCPv6
+ * @ingroup lwip_opts_ipv6
+ * @{
+ */
+/**
+ * LWIP_IPV6_DHCP6==1: enable DHCPv6 stateful/stateless address autoconfiguration.
  */
 #if !defined LWIP_IPV6_DHCP6 || defined __DOXYGEN__
 #define LWIP_IPV6_DHCP6                 0
 #endif
 
+/**
+ * LWIP_IPV6_DHCP6_STATEFUL==1: enable DHCPv6 stateful address autoconfiguration.
+ * (not supported, yet!)
+ */
+#if !defined LWIP_IPV6_DHCP6_STATEFUL || defined __DOXYGEN__
+#define LWIP_IPV6_DHCP6_STATEFUL        0
+#endif
+
+/**
+ * LWIP_IPV6_DHCP6_STATELESS==1: enable DHCPv6 stateless address autoconfiguration.
+ */
+#if !defined LWIP_IPV6_DHCP6_STATELESS || defined __DOXYGEN__
+#define LWIP_IPV6_DHCP6_STATELESS       LWIP_IPV6_DHCP6
+#endif
+
+/**
+ * LWIP_DHCP6_GETS_NTP==1: Request NTP servers via DHCPv6. For each
+ * response packet, a callback is called, which has to be provided by the port:
+ * void dhcp6_set_ntp_servers(u8_t num_ntp_servers, ip_addr_t* ntp_server_addrs);
+*/
+#if !defined LWIP_DHCP6_GET_NTP_SRV || defined __DOXYGEN__
+#define LWIP_DHCP6_GET_NTP_SRV          0
+#endif
+
+/**
+ * The maximum of NTP servers requested
+ */
+#if !defined LWIP_DHCP6_MAX_NTP_SERVERS || defined __DOXYGEN__
+#define LWIP_DHCP6_MAX_NTP_SERVERS      1
+#endif
+
+/**
+ * LWIP_DHCP6_MAX_DNS_SERVERS > 0: Request DNS servers via DHCPv6.
+ * DNS servers received in the response are passed to DNS via @ref dns_setserver()
+ * (up to the maximum limit defined here).
+ */
+#if !defined LWIP_DHCP6_MAX_DNS_SERVERS || defined __DOXYGEN__
+#define LWIP_DHCP6_MAX_DNS_SERVERS      DNS_MAX_SERVERS
+#endif
+/**
+ * @}
+ */
+
 /*
    ---------------------------------------
    ---------- Hook options ---------------
@@ -2414,8 +2733,8 @@
  */
 
 /**
- * LWIP_HOOK_FILENAME: Custom filename to #include in files that provide hooks.
- * Declare your hook function prototypes in there, you may also #include all headers
+ * LWIP_HOOK_FILENAME: Custom filename to \#include in files that provide hooks.
+ * Declare your hook function prototypes in there, you may also \#include all headers
  * providing data types that are need in this file.
  */
 #ifdef __DOXYGEN__
@@ -2431,7 +2750,9 @@
  * 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
- * Signature: 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);
+ * 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
  * Arguments:
  * - local_ip: pointer to the local IP address of the connection
@@ -2446,8 +2767,88 @@
 #endif
 
 /**
+ * LWIP_HOOK_TCP_INPACKET_PCB:
+ * Hook for intercepting incoming packets before they are passed to a pcb. This
+ * allows updating some state or even dropping a packet.
+ * Signature:\code{.c}
+ * err_t my_hook_tcp_inpkt(struct tcp_pcb *pcb, struct tcp_hdr *hdr, u16_t optlen, u16_t opt1len, u8_t *opt2, struct pbuf *p);
+ * \endcode
+ * Arguments:
+ * - pcb: tcp_pcb selected for input of this packet (ATTENTION: this may be
+ *        struct tcp_pcb_listen if pcb->state == LISTEN)
+ * - hdr: pointer to tcp header (ATTENTION: tcp options may not be in one piece!)
+ * - optlen: tcp option length
+ * - opt1len: tcp option length 1st part
+ * - 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;'
+ * - p: input packet, p->payload points to application data (that's why tcp hdr
+ *      and options are passed in seperately)
+ * Return value:
+ * - ERR_OK: continue input of this packet as normal
+ * - != ERR_OK: drop this packet for input (don't continue input processing)
+ *
+ * ATTENTION: don't call any tcp api functions that might change tcp state (pcb
+ * state or any pcb lists) from this callback!
+ */
+#ifdef __DOXYGEN__
+#define LWIP_HOOK_TCP_INPACKET_PCB(pcb, hdr, optlen, opt1len, opt2, p)
+#endif
+
+/**
+ * LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH:
+ * Hook for increasing the size of the options allocated with a tcp header.
+ * Together with LWIP_HOOK_TCP_OUT_ADD_TCPOPTS, this can be used to add custom
+ * options to outgoing tcp segments.
+ * Signature:\code{.c}
+ * u8_t my_hook_tcp_out_tcpopt_length(const struct tcp_pcb *pcb, u8_t internal_option_length);
+ * \endcode
+ * Arguments:
+ * - pcb: tcp_pcb that transmits (ATTENTION: this may be NULL or
+ *        struct tcp_pcb_listen if pcb->state == LISTEN)
+ * - internal_option_length: tcp option length used by the stack internally
+ * Return value:
+ * - a number of bytes to allocate for tcp options (internal_option_length <= ret <= 40)
+ *
+ * ATTENTION: don't call any tcp api functions that might change tcp state (pcb
+ * state or any pcb lists) from this callback!
+ */
+#ifdef __DOXYGEN__
+#define LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH(pcb, internal_len)
+#endif
+
+/**
+ * LWIP_HOOK_TCP_OUT_ADD_TCPOPTS:
+ * Hook for adding custom options to outgoing tcp segments.
+ * Space for these custom options has to be reserved via LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH.
+ * Signature:\code{.c}
+ * u32_t *my_hook_tcp_out_add_tcpopts(struct pbuf *p, struct tcp_hdr *hdr, const struct tcp_pcb *pcb, u32_t *opts);
+ * \endcode
+ * Arguments:
+ * - p: output packet, p->payload pointing to tcp header, data follows
+ * - hdr: tcp header
+ * - pcb: tcp_pcb that transmits (ATTENTION: this may be NULL or
+ *        struct tcp_pcb_listen if pcb->state == LISTEN)
+ * - opts: pointer where to add the custom options (there may already be options
+ *         between the header and these)
+ * Return value:
+ * - pointer pointing directly after the inserted options
+ *
+ * ATTENTION: don't call any tcp api functions that might change tcp state (pcb
+ * state or any pcb lists) from this callback!
+ */
+#ifdef __DOXYGEN__
+#define LWIP_HOOK_TCP_OUT_ADD_TCPOPTS(p, hdr, pcb, opts)
+#endif
+
+/**
  * LWIP_HOOK_IP4_INPUT(pbuf, input_netif):
- * - called from ip_input() (IPv4)
+ * Called from ip_input() (IPv4)
+ * Signature:\code{.c}
+ *   int my_hook(struct pbuf *pbuf, struct netif *input_netif);
+ * \endcode
+ * Arguments:
  * - pbuf: received struct pbuf passed to ip_input()
  * - input_netif: struct netif on which the packet has been received
  * Return values:
@@ -2462,30 +2863,71 @@
 
 /**
  * LWIP_HOOK_IP4_ROUTE(dest):
- * - called from ip_route() (IPv4)
+ * Called from ip_route() (IPv4)
+ * Signature:\code{.c}
+ *   struct netif *my_hook(const ip4_addr_t *dest);
+ * \endcode
+ * Arguments:
  * - dest: destination IPv4 address
- * Returns the destination netif or NULL if no destination netif is found. In
- * that case, ip_route() continues as normal.
+ * Returns values:
+ * - the destination netif
+ * - NULL if no destination netif is found. In that case, ip_route() continues as normal.
  */
 #ifdef __DOXYGEN__
 #define LWIP_HOOK_IP4_ROUTE()
 #endif
 
 /**
- * LWIP_HOOK_IP4_ROUTE_SRC(dest, src):
- * - source-based routing for IPv4 (see LWIP_HOOK_IP4_ROUTE(), src may be NULL)
+ * LWIP_HOOK_IP4_ROUTE_SRC(src, dest):
+ * Source-based routing for IPv4 - called from ip_route() (IPv4)
+ * Signature:\code{.c}
+ *   struct netif *my_hook(const ip4_addr_t *src, const ip4_addr_t *dest);
+ * \endcode
+ * Arguments:
+ * - src: local/source IPv4 address
+ * - dest: destination IPv4 address
+ * Returns values:
+ * - the destination netif
+ * - NULL if no destination netif is found. In that case, ip_route() continues as normal.
  */
 #ifdef __DOXYGEN__
-#define LWIP_HOOK_IP4_ROUTE_SRC(dest, src)
+#define LWIP_HOOK_IP4_ROUTE_SRC(src, dest)
+#endif
+
+/**
+ * LWIP_HOOK_IP4_CANFORWARD(src, dest):
+ * Check if an IPv4 can be forwarded - called from:
+ * ip4_input() -> ip4_forward() -> ip4_canforward() (IPv4)
+ * - source address is available via ip4_current_src_addr()
+ * - calling an output function in this context (e.g. multicast router) is allowed
+ * Signature:\code{.c}
+ *   int my_hook(struct pbuf *p, u32_t dest_addr_hostorder);
+ * \endcode
+ * Arguments:
+ * - p: packet to forward
+ * - dest: destination IPv4 address
+ * Returns values:
+ * - 1: forward
+ * - 0: don't forward
+ * - -1: no decision. In that case, ip4_canforward() continues as normal.
+ */
+#ifdef __DOXYGEN__
+#define LWIP_HOOK_IP4_CANFORWARD(src, dest)
 #endif
 
 /**
  * LWIP_HOOK_ETHARP_GET_GW(netif, dest):
- * - called from etharp_output() (IPv4)
+ * Called from etharp_output() (IPv4)
+ * Signature:\code{.c}
+ *   const ip4_addr_t *my_hook(struct netif *netif, const ip4_addr_t *dest);
+ * \endcode
+ * Arguments:
  * - netif: the netif used for sending
  * - dest: the destination IPv4 address
- * Returns the IPv4 address of the gateway to handle the specified destination
- * IPv4 address. If NULL is returned, the netif's default gateway is used.
+ * Return values:
+ * - the IPv4 address of the gateway to handle the specified destination IPv4 address
+ * - NULL, in which case the netif's default gateway is used
+ *
  * The returned address MUST be directly reachable on the specified netif!
  * This function is meant to implement advanced IPv4 routing together with
  * LWIP_HOOK_IP4_ROUTE(). The actual routing/gateway table implementation is
@@ -2497,7 +2939,11 @@
 
 /**
  * LWIP_HOOK_IP6_INPUT(pbuf, input_netif):
- * - called from ip6_input() (IPv6)
+ * Called from ip6_input() (IPv6)
+ * Signature:\code{.c}
+ *   int my_hook(struct pbuf *pbuf, struct netif *input_netif);
+ * \endcode
+ * Arguments:
  * - pbuf: received struct pbuf passed to ip6_input()
  * - input_netif: struct netif on which the packet has been received
  * Return values:
@@ -2512,11 +2958,16 @@
 
 /**
  * LWIP_HOOK_IP6_ROUTE(src, dest):
- * - called from ip6_route() (IPv6)
- * - src: sourc IPv6 address
+ * Called from ip_route() (IPv6)
+ * Signature:\code{.c}
+ *   struct netif *my_hook(const ip6_addr_t *dest, const ip6_addr_t *src);
+ * \endcode
+ * Arguments:
+ * - src: source IPv6 address
  * - dest: destination IPv6 address
- * Returns the destination netif or NULL if no destination netif is found. In
- * that case, ip6_route() continues as normal.
+ * Return values:
+ * - the destination netif
+ * - NULL if no destination netif is found. In that case, ip6_route() continues as normal.
  */
 #ifdef __DOXYGEN__
 #define LWIP_HOOK_IP6_ROUTE(src, dest)
@@ -2524,11 +2975,17 @@
 
 /**
  * LWIP_HOOK_ND6_GET_GW(netif, dest):
- * - called from nd6_get_next_hop_entry() (IPv6)
+ * Called from nd6_get_next_hop_entry() (IPv6)
+ * Signature:\code{.c}
+ *   const ip6_addr_t *my_hook(struct netif *netif, const ip6_addr_t *dest);
+ * \endcode
+ * Arguments:
  * - netif: the netif used for sending
  * - dest: the destination IPv6 address
- * Returns the IPv6 address of the next hop to handle the specified destination
- * IPv6 address. If NULL is returned, a NDP-discovered router is used instead.
+ * Return values:
+ * - the IPv6 address of the next hop to handle the specified destination IPv6 address
+ * - NULL, in which case a NDP-discovered router is used instead
+ *
  * The returned address MUST be directly reachable on the specified netif!
  * This function is meant to implement advanced IPv6 routing together with
  * LWIP_HOOK_IP6_ROUTE(). The actual routing/gateway table implementation is
@@ -2540,7 +2997,11 @@
 
 /**
  * LWIP_HOOK_VLAN_CHECK(netif, eth_hdr, vlan_hdr):
- * - called from ethernet_input() if VLAN support is enabled
+ * Called from ethernet_input() if VLAN support is enabled
+ * Signature:\code{.c}
+ *   int my_hook(struct netif *netif, struct eth_hdr *eth_hdr, struct eth_vlan_hdr *vlan_hdr);
+ * \endcode
+ * Arguments:
  * - netif: struct netif on which the packet has been received
  * - eth_hdr: struct eth_hdr of the packet
  * - vlan_hdr: struct eth_vlan_hdr of the packet
@@ -2557,7 +3018,9 @@
  * 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
- * Signature: 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
+ * 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
+ * \endcode
  * Arguments:
  * - netif: struct netif that the packet will be sent through
  * - p: struct pbuf packet to be sent
@@ -2576,7 +3039,10 @@
 
 /**
  * LWIP_HOOK_MEMP_AVAILABLE(memp_t_type):
- * - called from memp_free() when a memp pool was empty and an item is now available
+ * Called from memp_free() when a memp pool was empty and an item is now available
+ * Signature:\code{.c}
+ *   void my_hook(memp_t type);
+ * \endcode
  */
 #ifdef __DOXYGEN__
 #define LWIP_HOOK_MEMP_AVAILABLE(memp_t_type)
@@ -2585,12 +3051,175 @@
 /**
  * LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(pbuf, netif):
  * Called from ethernet_input() when an unknown eth type is encountered.
- * Return ERR_OK if packet is accepted, any error code otherwise.
+ * Signature:\code{.c}
+ *   err_t my_hook(struct pbuf* pbuf, struct netif* netif);
+ * \endcode
+ * Arguments:
+ * - p: rx packet with unknown eth type
+ * - netif: netif on which the packet has been received
+ * Return values:
+ * - ERR_OK if packet is accepted (hook function now owns the pbuf)
+ * - any error code otherwise (pbuf is freed)
+ *
  * Payload points to ethernet header!
  */
 #ifdef __DOXYGEN__
 #define LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(pbuf, netif)
 #endif
+
+/**
+ * LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, state, msg, msg_type, options_len_ptr):
+ * Called from various dhcp functions when sending a DHCP message.
+ * This hook is called just before the DHCP message trailer is added, so the
+ * options are at the end of a DHCP message.
+ * Signature:\code{.c}
+ *   void my_hook(struct netif *netif, struct dhcp *dhcp, u8_t state, struct dhcp_msg *msg,
+ *                u8_t msg_type, u16_t *options_len_ptr);
+ * \endcode
+ * Arguments:
+ * - netif: struct netif that the packet will be sent through
+ * - dhcp: struct dhcp on that netif
+ * - state: current dhcp state (dhcp_state_enum_t as an u8_t)
+ * - msg: struct dhcp_msg that will be sent
+ * - msg_type: dhcp message type to be sent (u8_t)
+ * - options_len_ptr: pointer to the current length of options in the dhcp_msg "msg"
+ *                    (must be increased when options are added!)
+ *
+ * Options need to appended like this:
+ *   LWIP_ASSERT("dhcp option overflow", *options_len_ptr + option_len + 2 <= DHCP_OPTIONS_LEN);
+ *   msg->options[(*options_len_ptr)++] = &lt;option_number&gt;;
+ *   msg->options[(*options_len_ptr)++] = &lt;option_len&gt;;
+ *   msg->options[(*options_len_ptr)++] = &lt;option_bytes&gt;;
+ *   [...]
+ */
+#ifdef __DOXYGEN__
+#define LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, state, msg, msg_type, options_len_ptr)
+#endif
+
+/**
+ * LWIP_HOOK_DHCP_PARSE_OPTION(netif, dhcp, state, msg, msg_type, option, len, pbuf, option_value_offset):
+ * Called from dhcp_parse_reply when receiving a DHCP message.
+ * This hook is called for every option in the received message that is not handled internally.
+ * Signature:\code{.c}
+ *   void my_hook(struct netif *netif, struct dhcp *dhcp, u8_t state, struct dhcp_msg *msg,
+ *                u8_t msg_type, u8_t option, u8_t option_len, struct pbuf *pbuf, u16_t option_value_offset);
+ * \endcode
+ * Arguments:
+ * - netif: struct netif that the packet will be sent through
+ * - dhcp: struct dhcp on that netif
+ * - state: current dhcp state (dhcp_state_enum_t as an u8_t)
+ * - msg: struct dhcp_msg that was received
+ * - msg_type: dhcp message type received (u8_t, ATTENTION: only valid after
+ *             the message type option has been parsed!)
+ * - option: option value (u8_t)
+ * - len: option data length (u8_t)
+ * - pbuf: pbuf where option data is contained
+ * - option_value_offset: offset in pbuf where option data begins
+ *
+ * A nice way to get the option contents is pbuf_get_contiguous():
+ *  u8_t buf[32];
+ *  u8_t *ptr = (u8_t*)pbuf_get_contiguous(p, buf, sizeof(buf), LWIP_MIN(option_len, sizeof(buf)), offset);
+ */
+#ifdef __DOXYGEN__
+#define LWIP_HOOK_DHCP_PARSE_OPTION(netif, dhcp, state, msg, msg_type, option, len, pbuf, offset)
+#endif
+
+/**
+ * LWIP_HOOK_DHCP6_APPEND_OPTIONS(netif, dhcp6, state, msg, msg_type, options_len_ptr, max_len):
+ * 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:\code{.c}
+ *   void my_hook(struct netif *netif, struct dhcp6 *dhcp, u8_t state, struct dhcp6_msg *msg,
+ *                u8_t msg_type, u16_t *options_len_ptr);
+ * \endcode
+ * Arguments:
+ * - netif: struct netif that the packet will be sent through
+ * - dhcp6: struct dhcp6 on that netif
+ * - state: current dhcp6 state (dhcp6_state_enum_t as an u8_t)
+ * - msg: struct dhcp6_msg that will be sent
+ * - msg_type: dhcp6 message type to be sent (u8_t)
+ * - options_len_ptr: pointer to the current length of options in the dhcp6_msg "msg"
+ *                    (must be increased when options are added!)
+ *
+ * Options need to appended like this:
+ *   u8_t *options = (u8_t *)(msg + 1);
+ *   LWIP_ASSERT("dhcp option overflow", sizeof(struct dhcp6_msg) + *options_len_ptr + newoptlen <= max_len);
+ *   options[(*options_len_ptr)++] = &lt;option_data&gt;;
+ *   [...]
+ */
+#ifdef __DOXYGEN__
+#define LWIP_HOOK_DHCP6_APPEND_OPTIONS(netif, dhcp6, state, msg, msg_type, options_len_ptr, max_len)
+#endif
+
+/**
+ * LWIP_HOOK_SOCKETS_SETSOCKOPT(s, sock, level, optname, optval, optlen, err)
+ * Called from socket API to implement setsockopt() for options not provided by lwIP.
+ * Core lock is held when this hook is called.
+ * Signature:\code{.c}
+ *   int my_hook(int s, struct lwip_sock *sock, int level, int optname, const void *optval, socklen_t optlen, int *err)
+ * \endcode
+ * Arguments:
+ * - s: socket file descriptor
+ * - sock: internal socket descriptor (see lwip/priv/sockets_priv.h)
+ * - level: protocol level at which the option resides
+ * - optname: option to set
+ * - optval: value to set
+ * - optlen: size of optval
+ * - err: output error
+ * Return values:
+ * - 0: Hook has not consumed the option, code continues as normal (to internal options)
+ * - != 0: Hook has consumed the option, 'err' is returned
+ */
+#ifdef __DOXYGEN__
+#define LWIP_HOOK_SOCKETS_SETSOCKOPT(s, sock, level, optname, optval, optlen, err)
+#endif
+
+/**
+ * LWIP_HOOK_SOCKETS_GETSOCKOPT(s, sock, level, optname, optval, optlen, err)
+ * Called from socket API to implement getsockopt() for options not provided by lwIP.
+ * Core lock is held when this hook is called.
+ * Signature:\code{.c}
+ *   int my_hook(int s, struct lwip_sock *sock, int level, int optname, void *optval, socklen_t *optlen, int *err)
+ * \endcode
+ * Arguments:
+ * - s: socket file descriptor
+ * - sock: internal socket descriptor (see lwip/priv/sockets_priv.h)
+ * - level: protocol level at which the option resides
+ * - optname: option to get
+ * - optval: value to get
+ * - optlen: size of optval
+ * - err: output error
+ * Return values:
+ * - 0: Hook has not consumed the option, code continues as normal (to internal options)
+ * - != 0: Hook has consumed the option, 'err' is returned
+ */
+#ifdef __DOXYGEN__
+#define LWIP_HOOK_SOCKETS_GETSOCKOPT(s, sock, level, optname, optval, optlen, err)
+#endif
+
+/**
+ * LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE(name, addr, addrtype, err)
+ * Called from netconn APIs (not usable with callback apps) allowing an
+ * external DNS resolver (which uses sequential API) to handle the query.
+ * Signature:\code{.c}
+ *   int my_hook(const char *name, ip_addr_t *addr, u8_t addrtype, err_t *err)
+ * \endcode
+ * Arguments:
+ * - name: hostname to resolve
+ * - addr: output host address
+ * - addrtype: type of address to query
+ * - err: output error
+ * Return values:
+ * - 0: Hook has not consumed hostname query, query continues into DNS module
+ * - != 0: Hook has consumed the query
+ *
+ * err must also be checked to determine if the hook consumed the query, but
+ * the query failed
+ */
+#ifdef __DOXYGEN__
+#define LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE(name, addr, addrtype, err)
+#endif
 /**
  * @}
  */
@@ -2848,10 +3477,24 @@
 #if !defined IP6_DEBUG || defined __DOXYGEN__
 #define IP6_DEBUG                       LWIP_DBG_OFF
 #endif
+
+/**
+ * DHCP6_DEBUG: Enable debugging in dhcp6.c.
+ */
+#if !defined DHCP6_DEBUG || defined __DOXYGEN__
+#define DHCP6_DEBUG                     LWIP_DBG_OFF
+#endif
 /**
  * @}
  */
 
+/**
+ * LWIP_TESTMODE: Changes to make unit test possible
+ */
+#if !defined LWIP_TESTMODE
+#define LWIP_TESTMODE                   0
+#endif
+
 /*
    --------------------------------------------------
    ---------- Performance tracking options ----------
diff --git a/src/include/lwip/pbuf.h b/src/include/lwip/pbuf.h
index 9061046..82902a4 100644
--- a/src/include/lwip/pbuf.h
+++ b/src/include/lwip/pbuf.h
@@ -55,6 +55,23 @@
 #define LWIP_SUPPORT_CUSTOM_PBUF ((IP_FRAG && !LWIP_NETIF_TX_SINGLE_PBUF) || (LWIP_IPV6 && LWIP_IPV6_FRAG))
 #endif
 
+/** @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:
+ * it will make a copy iof any pbuf chain that does not consist entirely of
+ * PBUF_ROM type pbufs. For setups with zero-copy support, it may be redefined
+ * to evaluate to true in all cases, for example. However, doing so also has an
+ * effect on the application side: any buffers that are *not* copied must also
+ * *not* be reused by the application after passing them to lwIP. For example,
+ * when setting PBUF_NEEDS_COPY to (0), after using udp_send() with a PBUF_RAM
+ * pbuf, the application must free the pbuf immediately, rather than reusing it
+ * for other purposes. For more background information on this, see tasks #6735
+ * and #7896, and bugs #11400 and #49914. */
+#ifndef PBUF_NEEDS_COPY
+#define PBUF_NEEDS_COPY(p)  ((p)->type_internal & PBUF_TYPE_FLAG_DATA_VOLATILE)
+#endif /* PBUF_NEEDS_COPY */
+
 /* @todo: We need a mechanism to prevent wasting memory in every pbuf
    (TCP vs. UDP, IPv4 vs. IPv6: UDP/IPv4 packets may waste up to 28 bytes) */
 
@@ -73,27 +90,54 @@
   /** Includes spare room for transport layer header, e.g. UDP header.
    * Use this if you intend to pass the pbuf to functions like udp_send().
    */
-  PBUF_TRANSPORT,
+  PBUF_TRANSPORT = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN,
   /** Includes spare room for IP header.
    * Use this if you intend to pass the pbuf to functions like raw_send().
    */
-  PBUF_IP,
+  PBUF_IP = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN,
   /** Includes spare room for link layer header (ethernet header).
    * Use this if you intend to pass the pbuf to functions like ethernet_output().
    * @see PBUF_LINK_HLEN
    */
-  PBUF_LINK,
+  PBUF_LINK = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN,
   /** Includes spare room for additional encapsulation header before ethernet
    * headers (e.g. 802.11).
    * Use this if you intend to pass the pbuf to functions like netif->linkoutput().
    * @see PBUF_LINK_ENCAPSULATION_HLEN
    */
-  PBUF_RAW_TX,
+  PBUF_RAW_TX = PBUF_LINK_ENCAPSULATION_HLEN,
   /** Use this for input packets in a netif driver when calling netif->input()
    * in the most common case - ethernet-layer netif driver. */
-  PBUF_RAW
+  PBUF_RAW = 0
 } pbuf_layer;
 
+
+/* Base flags for pbuf_type definitions: */
+
+/** Indicates that the payload directly follows the struct pbuf.
+ *  This makes @ref pbuf_header work in both directions. */
+#define PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS       0x80
+/** Indicates the data stored in this pbuf can change. If this pbuf needs
+ * to be queued, it must be copied/duplicated. */
+#define PBUF_TYPE_FLAG_DATA_VOLATILE                0x40
+/** 4 bits are reserved for 16 allocation sources (e.g. heap, pool1, pool2, etc)
+ * Internally, we use: 0=heap, 1=MEMP_PBUF, 2=MEMP_PBUF_POOL -> 13 types free*/
+#define PBUF_TYPE_ALLOC_SRC_MASK                    0x0F
+/** Indicates this pbuf is used for RX (if not set, indicates use for TX).
+ * This information can be used to keep some spare RX buffers e.g. for
+ * receiving TCP ACKs to unblock a connection) */
+#define PBUF_ALLOC_FLAG_RX                          0x0100
+/** Indicates the application needs the pbuf payload to be in one piece */
+#define PBUF_ALLOC_FLAG_DATA_CONTIGUOUS             0x0200
+
+#define PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP           0x00
+#define PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF      0x01
+#define PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF_POOL 0x02
+/** First pbuf allocation type for applications */
+#define PBUF_TYPE_ALLOC_SRC_MASK_APP_MIN            0x03
+/** Last pbuf allocation type for applications */
+#define PBUF_TYPE_ALLOC_SRC_MASK_APP_MAX            PBUF_TYPE_ALLOC_SRC_MASK
+
 /**
  * @ingroup pbuf
  * Enumeration of pbuf types
@@ -105,22 +149,22 @@
       pbuf_alloc() allocates PBUF_RAM pbufs as unchained pbufs (although that might
       change in future versions).
       This should be used for all OUTGOING packets (TX).*/
-  PBUF_RAM,
+  PBUF_RAM = (PBUF_ALLOC_FLAG_DATA_CONTIGUOUS | PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS | PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP),
   /** pbuf data is stored in ROM, i.e. struct pbuf and its payload are located in
       totally different memory areas. Since it points to ROM, payload does not
       have to be copied when queued for transmission. */
-  PBUF_ROM,
+  PBUF_ROM = PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF,
   /** pbuf comes from the pbuf pool. Much like PBUF_ROM but payload might change
       so it has to be duplicated when queued before transmitting, depending on
       who has a 'ref' to it. */
-  PBUF_REF,
+  PBUF_REF = (PBUF_TYPE_FLAG_DATA_VOLATILE | PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF),
   /** pbuf payload refers to RAM. This one comes from a pool and should be used
       for RX. Payload can be chained (scatter-gather RX) but like PBUF_RAM, struct
       pbuf and its payload are allocated in one piece of contiguous memory (so
       the first payload byte can be calculated from struct pbuf).
       Don't use this for TX, if the pool becomes empty e.g. because of TCP queuing,
       you are unable to receive TCP acks! */
-  PBUF_POOL
+  PBUF_POOL = (PBUF_ALLOC_FLAG_RX | PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS | PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF_POOL)
 } pbuf_type;
 
 
@@ -158,8 +202,10 @@
   /** length of this buffer */
   u16_t len;
 
-  /** pbuf_type as u8_t instead of enum to save space */
-  u8_t /*pbuf_type*/ type;
+  /** a bit field indicating pbuf type and allocation sources
+      (see PBUF_TYPE_FLAG_*, PBUF_ALLOC_FLAG_* and PBUF_TYPE_ALLOC_SRC_MASK)
+    */
+  u8_t type_internal;
 
   /** misc flags */
   u8_t flags;
@@ -169,7 +215,10 @@
    * that refer to this pbuf. This can be pointers from an application,
    * the stack itself, or pbuf->next pointers from a chain.
    */
-  u16_t ref;
+  LWIP_PBUF_REF_T ref;
+
+  /** For incoming packets, this contains the input netif's index */
+  u8_t if_idx;
 };
 
 
@@ -221,14 +270,22 @@
 #define pbuf_init()
 
 struct pbuf *pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type);
+struct pbuf *pbuf_alloc_reference(void *payload, u16_t length, pbuf_type type);
 #if LWIP_SUPPORT_CUSTOM_PBUF
 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);
 #endif /* LWIP_SUPPORT_CUSTOM_PBUF */
 void pbuf_realloc(struct pbuf *p, u16_t size);
+#define pbuf_get_allocsrc(p)          ((p)->type_internal & PBUF_TYPE_ALLOC_SRC_MASK)
+#define pbuf_match_allocsrc(p, type)  (pbuf_get_allocsrc(p) == ((type) & PBUF_TYPE_ALLOC_SRC_MASK))
+#define pbuf_match_type(p, type)      pbuf_match_allocsrc(p, type)
 u8_t pbuf_header(struct pbuf *p, s16_t header_size);
 u8_t pbuf_header_force(struct pbuf *p, s16_t header_size);
+u8_t pbuf_add_header(struct pbuf *p, size_t header_size_increment);
+u8_t pbuf_add_header_force(struct pbuf *p, size_t header_size_increment);
+u8_t pbuf_remove_header(struct pbuf *p, size_t header_size);
+struct pbuf *pbuf_free_header(struct pbuf *q, u16_t size);
 void pbuf_ref(struct pbuf *p);
 u8_t pbuf_free(struct pbuf *p);
 u16_t pbuf_clen(const struct pbuf *p);
@@ -237,10 +294,12 @@
 struct pbuf *pbuf_dechain(struct pbuf *p);
 err_t pbuf_copy(struct pbuf *p_to, const struct pbuf *p_from);
 u16_t pbuf_copy_partial(const struct pbuf *p, void *dataptr, u16_t len, u16_t offset);
+void *pbuf_get_contiguous(const struct pbuf *p, void *buffer, size_t bufsize, u16_t len, u16_t offset);
 err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len);
 err_t pbuf_take_at(struct pbuf *buf, const void *dataptr, u16_t len, u16_t offset);
 struct pbuf *pbuf_skip(struct pbuf* in, u16_t in_offset, u16_t* out_offset);
 struct pbuf *pbuf_coalesce(struct pbuf *p, pbuf_layer layer);
+struct pbuf *pbuf_clone(pbuf_layer l, pbuf_type type, struct pbuf *p);
 #if LWIP_CHECKSUM_ON_COPY
 err_t pbuf_fill_chksum(struct pbuf *p, u16_t start_offset, const void *dataptr,
                        u16_t len, u16_t *chksum);
diff --git a/src/include/lwip/priv/altcp_priv.h b/src/include/lwip/priv/altcp_priv.h
new file mode 100644
index 0000000..2d3b2fd
--- /dev/null
+++ b/src/include/lwip/priv/altcp_priv.h
@@ -0,0 +1,146 @@
+/**
+ * @file
+ * Application layered TCP connection API (to be used from TCPIP thread)\n
+ * 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).
+ */
+
+/*
+ * 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_ALTCP_PRIV_H
+#define LWIP_HDR_ALTCP_PRIV_H
+
+#include "lwip/opt.h"
+
+#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/altcp.h"
+#include "lwip/ip_addr.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct altcp_pcb *altcp_alloc(void);
+void altcp_free(struct altcp_pcb *conn);
+
+/* Function prototypes for application layers */
+typedef void (*altcp_set_poll_fn)(struct altcp_pcb *conn, u8_t interval);
+typedef void (*altcp_recved_fn)(struct altcp_pcb *conn, u16_t len);
+typedef err_t (*altcp_bind_fn)(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port);
+typedef err_t (*altcp_connect_fn)(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected);
+
+typedef struct altcp_pcb *(*altcp_listen_fn)(struct altcp_pcb *conn, u8_t backlog, err_t *err);
+
+typedef void  (*altcp_abort_fn)(struct altcp_pcb *conn);
+typedef err_t (*altcp_close_fn)(struct altcp_pcb *conn);
+typedef err_t (*altcp_shutdown_fn)(struct altcp_pcb *conn, int shut_rx, int shut_tx);
+
+typedef err_t (*altcp_write_fn)(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags);
+typedef err_t (*altcp_output_fn)(struct altcp_pcb *conn);
+
+typedef u16_t (*altcp_mss_fn)(struct altcp_pcb *conn);
+typedef u16_t (*altcp_sndbuf_fn)(struct altcp_pcb *conn);
+typedef u16_t (*altcp_sndqueuelen_fn)(struct altcp_pcb *conn);
+typedef void  (*altcp_nagle_disable_fn)(struct altcp_pcb *conn);
+typedef void  (*altcp_nagle_enable_fn)(struct altcp_pcb *conn);
+typedef int   (*altcp_nagle_disabled_fn)(struct altcp_pcb *conn);
+
+typedef void  (*altcp_setprio_fn)(struct altcp_pcb *conn, u8_t prio);
+
+typedef void  (*altcp_dealloc_fn)(struct altcp_pcb *conn);
+
+typedef err_t (*altcp_get_tcp_addrinfo_fn)(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port);
+typedef ip_addr_t *(*altcp_get_ip_fn)(struct altcp_pcb *conn, int local);
+typedef u16_t (*altcp_get_port_fn)(struct altcp_pcb *conn, int local);
+
+#ifdef LWIP_DEBUG
+typedef enum tcp_state (*altcp_dbg_get_tcp_state_fn)(struct altcp_pcb *conn);
+#endif
+
+struct altcp_functions {
+  altcp_set_poll_fn           set_poll;
+  altcp_recved_fn             recved;
+  altcp_bind_fn               bind;
+  altcp_connect_fn            connect;
+  altcp_listen_fn             listen;
+  altcp_abort_fn              abort;
+  altcp_close_fn              close;
+  altcp_shutdown_fn           shutdown;
+  altcp_write_fn              write;
+  altcp_output_fn             output;
+  altcp_mss_fn                mss;
+  altcp_sndbuf_fn             sndbuf;
+  altcp_sndqueuelen_fn        sndqueuelen;
+  altcp_nagle_disable_fn      nagle_disable;
+  altcp_nagle_enable_fn       nagle_enable;
+  altcp_nagle_disabled_fn     nagle_disabled;
+  altcp_setprio_fn            setprio;
+  altcp_dealloc_fn            dealloc;
+  altcp_get_tcp_addrinfo_fn   addrinfo;
+  altcp_get_ip_fn             getip;
+  altcp_get_port_fn           getport;
+#ifdef LWIP_DEBUG
+  altcp_dbg_get_tcp_state_fn  dbg_get_tcp_state;
+#endif
+};
+
+void  altcp_default_set_poll(struct altcp_pcb *conn, u8_t interval);
+void  altcp_default_recved(struct altcp_pcb *conn, u16_t len);
+err_t altcp_default_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port);
+err_t altcp_default_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx);
+err_t altcp_default_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags);
+err_t altcp_default_output(struct altcp_pcb *conn);
+u16_t altcp_default_mss(struct altcp_pcb *conn);
+u16_t altcp_default_sndbuf(struct altcp_pcb *conn);
+u16_t altcp_default_sndqueuelen(struct altcp_pcb *conn);
+void  altcp_default_nagle_disable(struct altcp_pcb *conn);
+void  altcp_default_nagle_enable(struct altcp_pcb *conn);
+int   altcp_default_nagle_disabled(struct altcp_pcb *conn);
+void  altcp_default_setprio(struct altcp_pcb *conn, u8_t prio);
+void  altcp_default_dealloc(struct altcp_pcb *conn);
+err_t altcp_default_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port);
+ip_addr_t *altcp_default_get_ip(struct altcp_pcb *conn, int local);
+u16_t altcp_default_get_port(struct altcp_pcb *conn, int local);
+#ifdef LWIP_DEBUG
+enum tcp_state altcp_default_dbg_get_tcp_state(struct altcp_pcb *conn);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_ALTCP */
+
+#endif /* LWIP_HDR_ALTCP_PRIV_H */
diff --git a/src/include/lwip/priv/api_msg.h b/src/include/lwip/priv/api_msg.h
index f12b8b7..9e8ffc9 100644
--- a/src/include/lwip/priv/api_msg.h
+++ b/src/include/lwip/priv/api_msg.h
@@ -39,10 +39,6 @@
 
 #include "lwip/opt.h"
 
-#if LWIP_NETCONN || LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */
-/* Note: Netconn API is always available when sockets are enabled -
- * sockets are implemented on top of them */
-
 #include "lwip/arch.h"
 #include "lwip/ip_addr.h"
 #include "lwip/err.h"
@@ -55,6 +51,10 @@
 extern "C" {
 #endif
 
+#if LWIP_NETCONN || LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */
+/* Note: Netconn API is always available when sockets are enabled -
+ * sockets are implemented on top of them */
+
 #if LWIP_MPU_COMPATIBLE
 #if LWIP_NETCONN_SEM_PER_THREAD
 #define API_MSG_M_DEF_SEM(m)  *m
@@ -94,6 +94,7 @@
     struct {
       API_MSG_M_DEF_C(ip_addr_t, ipaddr);
       u16_t port;
+      u8_t if_idx;
     } bc;
     /** used for lwip_netconn_do_getaddr */
     struct {
@@ -103,8 +104,16 @@
     } ad;
     /** used for lwip_netconn_do_write */
     struct {
-      const void *dataptr;
+      /** current vector to write */
+      const struct netvector *vector;
+      /** number of unwritten vectors */
+      u16_t vector_cnt;
+      /** offset into current vector */
+      size_t vector_off;
+      /** total length across vectors */
       size_t len;
+      /** offset into total length/output of bytes written when err == ERR_OK */
+      size_t offset;
       u8_t apiflags;
 #if LWIP_SO_SNDTIMEO
       u32_t time_started;
@@ -112,7 +121,7 @@
     } w;
     /** used for lwip_netconn_do_recv */
     struct {
-      u32_t len;
+      size_t len;
     } r;
 #if LWIP_TCP
     /** used for lwip_netconn_do_close (/shutdown) */
@@ -130,6 +139,7 @@
     struct {
       API_MSG_M_DEF_C(ip_addr_t, multiaddr);
       API_MSG_M_DEF_C(ip_addr_t, netif_addr);
+      u8_t if_idx;
       enum netconn_igmp join_or_leave;
     } jl;
 #endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */
@@ -177,13 +187,14 @@
 };
 #endif /* LWIP_DNS */
 
-#if LWIP_TCP
-extern u8_t netconn_aborted;
-#endif /* LWIP_TCP */
-
+#if LWIP_NETCONN_FULLDUPLEX
+int lwip_netconn_is_deallocated_msg(void *msg);
+#endif
+int lwip_netconn_is_err_msg(void *msg, err_t *err);
 void lwip_netconn_do_newconn         (void *m);
 void lwip_netconn_do_delconn         (void *m);
 void lwip_netconn_do_bind            (void *m);
+void lwip_netconn_do_bind_if         (void *m);
 void lwip_netconn_do_connect         (void *m);
 void lwip_netconn_do_disconnect      (void *m);
 void lwip_netconn_do_listen          (void *m);
@@ -198,6 +209,7 @@
 void lwip_netconn_do_shutdown        (void *m);
 #if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)
 void lwip_netconn_do_join_leave_group(void *m);
+void lwip_netconn_do_join_leave_group_netif(void *m);
 #endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */
 
 #if LWIP_DNS
@@ -207,10 +219,54 @@
 struct netconn* netconn_alloc(enum netconn_type t, netconn_callback callback);
 void netconn_free(struct netconn *conn);
 
+#endif /* LWIP_NETCONN || LWIP_SOCKET */
+
+#if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */
+
+/* netifapi related lwIP internal definitions */
+
+#if LWIP_MPU_COMPATIBLE
+#define NETIFAPI_IPADDR_DEF(type, m)  type m
+#else /* LWIP_MPU_COMPATIBLE */
+#define NETIFAPI_IPADDR_DEF(type, m)  const type * m
+#endif /* LWIP_MPU_COMPATIBLE */
+
+typedef void (*netifapi_void_fn)(struct netif *netif);
+typedef err_t (*netifapi_errt_fn)(struct netif *netif);
+
+struct netifapi_msg {
+  struct tcpip_api_call_data call;
+  struct netif *netif;
+  union {
+    struct {
+#if LWIP_IPV4
+      NETIFAPI_IPADDR_DEF(ip4_addr_t, ipaddr);
+      NETIFAPI_IPADDR_DEF(ip4_addr_t, netmask);
+      NETIFAPI_IPADDR_DEF(ip4_addr_t, gw);
+#endif /* LWIP_IPV4 */
+      void *state;
+      netif_init_fn init;
+      netif_input_fn input;
+    } add;
+    struct {
+      netifapi_void_fn voidfunc;
+      netifapi_errt_fn errtfunc;
+    } common;
+    struct {
+#if LWIP_MPU_COMPATIBLE
+      char name[NETIF_NAMESIZE];
+#else /* LWIP_MPU_COMPATIBLE */
+      char *name;
+#endif /* LWIP_MPU_COMPATIBLE */
+      u8_t index;
+    } ifs;
+  } msg;
+};
+
+#endif /* LWIP_NETIF_API */
+
 #ifdef __cplusplus
 }
 #endif
 
-#endif /* LWIP_NETCONN || LWIP_SOCKET */
-
 #endif /* LWIP_HDR_API_MSG_H */
diff --git a/src/include/lwip/priv/mem_priv.h b/src/include/lwip/priv/mem_priv.h
new file mode 100644
index 0000000..8630d75
--- /dev/null
+++ b/src/include/lwip/priv/mem_priv.h
@@ -0,0 +1,84 @@
+/**
+ * @file
+ * lwIP internal memory implementations (do not use in application code)
+ */
+
+/*
+ * Copyright (c) 2018 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_MEM_PRIV_H
+#define LWIP_HDR_MEM_PRIV_H
+
+#include "lwip/opt.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "lwip/mem.h"
+
+#if MEM_OVERFLOW_CHECK || MEMP_OVERFLOW_CHECK
+/* if MEM_OVERFLOW_CHECK or MEMP_OVERFLOW_CHECK is turned on, we reserve some
+ * bytes at the beginning and at the end of each element, initialize them as
+ * 0xcd and check them later.
+ * If MEM(P)_OVERFLOW_CHECK is >= 2, on every call to mem(p)_malloc or mem(p)_free,
+ * every single element in each pool/heap is checked!
+ * This is VERY SLOW but also very helpful.
+ * MEM_SANITY_REGION_BEFORE and MEM_SANITY_REGION_AFTER can be overridden in
+ * lwipopts.h to change the amount reserved for checking. */
+#ifndef MEM_SANITY_REGION_BEFORE
+#define MEM_SANITY_REGION_BEFORE  16
+#endif /* MEM_SANITY_REGION_BEFORE*/
+#if MEM_SANITY_REGION_BEFORE > 0
+#define MEM_SANITY_REGION_BEFORE_ALIGNED    LWIP_MEM_ALIGN_SIZE(MEM_SANITY_REGION_BEFORE)
+#else
+#define MEM_SANITY_REGION_BEFORE_ALIGNED    0
+#endif /* MEM_SANITY_REGION_BEFORE*/
+#ifndef MEM_SANITY_REGION_AFTER
+#define MEM_SANITY_REGION_AFTER   16
+#endif /* MEM_SANITY_REGION_AFTER*/
+#if MEM_SANITY_REGION_AFTER > 0
+#define MEM_SANITY_REGION_AFTER_ALIGNED     LWIP_MEM_ALIGN_SIZE(MEM_SANITY_REGION_AFTER)
+#else
+#define MEM_SANITY_REGION_AFTER_ALIGNED     0
+#endif /* MEM_SANITY_REGION_AFTER*/
+
+void mem_overflow_init_raw(void *p, size_t size);
+void mem_overflow_check_raw(void *p, size_t size, const char *descr1, const char *descr2);
+
+#endif /* MEM_OVERFLOW_CHECK || MEMP_OVERFLOW_CHECK */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_MEMP_PRIV_H */
diff --git a/src/include/lwip/priv/memp_priv.h b/src/include/lwip/priv/memp_priv.h
index f246061..1f14cb1 100644
--- a/src/include/lwip/priv/memp_priv.h
+++ b/src/include/lwip/priv/memp_priv.h
@@ -45,36 +45,14 @@
 #endif
 
 #include "lwip/mem.h"
+#include "lwip/priv/mem_priv.h"
 
 #if MEMP_OVERFLOW_CHECK
-/* if MEMP_OVERFLOW_CHECK is turned on, we reserve some bytes at the beginning
- * and at the end of each element, initialize them as 0xcd and check
- * them later. */
-/* If MEMP_OVERFLOW_CHECK is >= 2, on every call to memp_malloc or memp_free,
- * every single element in each pool is checked!
- * This is VERY SLOW but also very helpful. */
-/* MEMP_SANITY_REGION_BEFORE and MEMP_SANITY_REGION_AFTER can be overridden in
- * lwipopts.h to change the amount reserved for checking. */
-#ifndef MEMP_SANITY_REGION_BEFORE
-#define MEMP_SANITY_REGION_BEFORE  16
-#endif /* MEMP_SANITY_REGION_BEFORE*/
-#if MEMP_SANITY_REGION_BEFORE > 0
-#define MEMP_SANITY_REGION_BEFORE_ALIGNED    LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_BEFORE)
-#else
-#define MEMP_SANITY_REGION_BEFORE_ALIGNED    0
-#endif /* MEMP_SANITY_REGION_BEFORE*/
-#ifndef MEMP_SANITY_REGION_AFTER
-#define MEMP_SANITY_REGION_AFTER   16
-#endif /* MEMP_SANITY_REGION_AFTER*/
-#if MEMP_SANITY_REGION_AFTER > 0
-#define MEMP_SANITY_REGION_AFTER_ALIGNED     LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_AFTER)
-#else
-#define MEMP_SANITY_REGION_AFTER_ALIGNED     0
-#endif /* MEMP_SANITY_REGION_AFTER*/
+
 
 /* MEMP_SIZE: save space for struct memp and for sanity check */
-#define MEMP_SIZE          (LWIP_MEM_ALIGN_SIZE(sizeof(struct memp)) + MEMP_SANITY_REGION_BEFORE_ALIGNED)
-#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x) + MEMP_SANITY_REGION_AFTER_ALIGNED)
+#define MEMP_SIZE          (LWIP_MEM_ALIGN_SIZE(sizeof(struct memp)) + MEM_SANITY_REGION_BEFORE_ALIGNED)
+#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x) + MEM_SANITY_REGION_AFTER_ALIGNED)
 
 #else /* MEMP_OVERFLOW_CHECK */
 
diff --git a/src/include/lwip/priv/memp_std.h b/src/include/lwip/priv/memp_std.h
index ce9fd50..669ad4d 100644
--- a/src/include/lwip/priv/memp_std.h
+++ b/src/include/lwip/priv/memp_std.h
@@ -28,7 +28,7 @@
 #ifndef LWIP_PBUF_MEMPOOL
 /* This treats "pbuf pools" just like any other pool.
  * Allocates buffers for a pbuf struct AND a payload size */
-#define LWIP_PBUF_MEMPOOL(name, num, payload, desc) LWIP_MEMPOOL(name, num, (MEMP_ALIGN_SIZE(sizeof(struct pbuf)) + MEMP_ALIGN_SIZE(payload)), desc)
+#define LWIP_PBUF_MEMPOOL(name, num, payload, desc) LWIP_MEMPOOL(name, num, (LWIP_MEM_ALIGN_SIZE(sizeof(struct pbuf)) + LWIP_MEM_ALIGN_SIZE(payload)), desc)
 #endif /* LWIP_PBUF_MEMPOOL */
 
 
@@ -52,6 +52,10 @@
 LWIP_MEMPOOL(TCP_SEG,        MEMP_NUM_TCP_SEG,         sizeof(struct tcp_seg),        "TCP_SEG")
 #endif /* LWIP_TCP */
 
+#if LWIP_ALTCP && LWIP_TCP
+LWIP_MEMPOOL(ALTCP_PCB,      MEMP_NUM_ALTCP_PCB,       sizeof(struct altcp_pcb),      "ALTCP_PCB")
+#endif /* LWIP_ALTCP && LWIP_TCP */
+
 #if LWIP_IPV4 && IP_REASSEMBLY
 LWIP_MEMPOOL(REASSDATA,      MEMP_NUM_REASSDATA,       sizeof(struct ip_reassdata),   "REASSDATA")
 #endif /* LWIP_IPV4 && IP_REASSEMBLY */
@@ -74,6 +78,9 @@
 #if LWIP_SOCKET && !LWIP_TCPIP_CORE_LOCKING
 LWIP_MEMPOOL(SOCKET_SETGETSOCKOPT_DATA, MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA, sizeof(struct lwip_setgetsockopt_data), "SOCKET_SETGETSOCKOPT_DATA")
 #endif
+#if LWIP_SOCKET && (LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL)
+LWIP_MEMPOOL(SELECT_CB,      MEMP_NUM_SELECT_CB,       sizeof(struct lwip_select_cb), "SELECT_CB")
+#endif /* LWIP_SOCKET && (LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL) */
 #if LWIP_NETIF_API
 LWIP_MEMPOOL(NETIFAPI_MSG,   MEMP_NUM_NETIFAPI_MSG,    sizeof(struct netifapi_msg),   "NETIFAPI_MSG")
 #endif
@@ -103,15 +110,15 @@
 #endif /* LWIP_DNS && DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
 
 #if LWIP_IPV6 && LWIP_ND6_QUEUEING
-LWIP_MEMPOOL(ND6_QUEUE,      MEMP_NUM_ND6_QUEUE,       sizeof(struct nd6_q_entry), "ND6_QUEUE")
+LWIP_MEMPOOL(ND6_QUEUE,      MEMP_NUM_ND6_QUEUE,       sizeof(struct nd6_q_entry),    "ND6_QUEUE")
 #endif /* LWIP_IPV6 && LWIP_ND6_QUEUEING */
 
 #if LWIP_IPV6 && LWIP_IPV6_REASS
-LWIP_MEMPOOL(IP6_REASSDATA,      MEMP_NUM_REASSDATA,       sizeof(struct ip6_reassdata),   "IP6_REASSDATA")
+LWIP_MEMPOOL(IP6_REASSDATA,  MEMP_NUM_REASSDATA,       sizeof(struct ip6_reassdata),  "IP6_REASSDATA")
 #endif /* LWIP_IPV6 && LWIP_IPV6_REASS */
 
 #if LWIP_IPV6 && LWIP_IPV6_MLD
-LWIP_MEMPOOL(MLD6_GROUP,     MEMP_NUM_MLD6_GROUP,      sizeof(struct mld_group),     "MLD6_GROUP")
+LWIP_MEMPOOL(MLD6_GROUP,     MEMP_NUM_MLD6_GROUP,      sizeof(struct mld_group),      "MLD6_GROUP")
 #endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
 
 
@@ -123,7 +130,7 @@
  *     This allocates enough space for the pbuf struct and a payload.
  *     (Example: pbuf_payload_size=0 allocates only size for the struct)
  */
-LWIP_PBUF_MEMPOOL(PBUF,      MEMP_NUM_PBUF,            0,                             "PBUF_REF/ROM")
+LWIP_MEMPOOL(PBUF,           MEMP_NUM_PBUF,            sizeof(struct pbuf),           "PBUF_REF/ROM")
 LWIP_PBUF_MEMPOOL(PBUF_POOL, PBUF_POOL_SIZE,           PBUF_POOL_BUFSIZE,             "PBUF_POOL")
 
 
diff --git a/src/include/lwip/priv/nd6_priv.h b/src/include/lwip/priv/nd6_priv.h
index 4bda0b7..cc3007d 100644
--- a/src/include/lwip/priv/nd6_priv.h
+++ b/src/include/lwip/priv/nd6_priv.h
@@ -83,7 +83,7 @@
   u8_t state;
   u8_t isrouter;
   union {
-    u32_t reachable_time; /* in ms since value may originate from network packet */
+    u32_t reachable_time; /* in seconds */
     u32_t delay_time;     /* ticks (ND6_TMR_INTERVAL) */
     u32_t probes_sent;
     u32_t stale_time;     /* ticks (ND6_TMR_INTERVAL) */
@@ -100,18 +100,12 @@
 struct nd6_prefix_list_entry {
   ip6_addr_t prefix;
   struct netif *netif;
-  u32_t invalidation_timer; /* in ms since value may originate from network packet */
-#if LWIP_IPV6_AUTOCONFIG
-  u8_t flags;
-#define ND6_PREFIX_AUTOCONFIG_AUTONOMOUS 0x01
-#define ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED 0x02
-#define ND6_PREFIX_AUTOCONFIG_ADDRESS_DUPLICATE 0x04
-#endif /* LWIP_IPV6_AUTOCONFIG */
+  u32_t invalidation_timer; /* in seconds */
 };
 
 struct nd6_router_list_entry {
   struct nd6_neighbor_cache_entry *neighbor_entry;
-  u32_t invalidation_timer; /* in ms since value may originate from network packet */
+  u32_t invalidation_timer; /* in seconds */
   u8_t flags;
 };
 
@@ -124,6 +118,10 @@
   ND6_PROBE
 };
 
+#define ND6_HOPLIM 255 /* maximum hop limit, required in all ND packets */
+
+#define ND6_2HRS 7200 /* two hours, expressed in number of seconds */
+
 /* Router tables. */
 /* @todo make these static? and entries accessible through API? */
 extern struct nd6_neighbor_cache_entry neighbor_cache[];
diff --git a/src/include/lwip/priv/raw_priv.h b/src/include/lwip/priv/raw_priv.h
new file mode 100644
index 0000000..d4561d4
--- /dev/null
+++ b/src/include/lwip/priv/raw_priv.h
@@ -0,0 +1,69 @@
+/**
+ * @file
+ * raw API internal implementations (do not use in application code)
+ */
+
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Adam Dunkels <adam@sics.se>
+ *
+ */
+#ifndef LWIP_HDR_RAW_PRIV_H
+#define LWIP_HDR_RAW_PRIV_H
+
+#include "lwip/opt.h"
+
+#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/raw.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** return codes for raw_input */
+typedef enum raw_input_state
+{
+  RAW_INPUT_NONE = 0, /* pbuf did not match any pcbs */
+  RAW_INPUT_EATEN,    /* pbuf handed off and delivered to pcb */
+  RAW_INPUT_DELIVERED /* pbuf only delivered to pcb (pbuf can still be referenced) */
+} raw_input_state_t;
+
+/* The following functions are the lower layer interface to RAW. */
+raw_input_state_t raw_input(struct pbuf *p, struct netif *inp);
+
+void raw_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_RAW */
+
+#endif /* LWIP_HDR_RAW_PRIV_H */
diff --git a/src/include/lwip/priv/sockets_priv.h b/src/include/lwip/priv/sockets_priv.h
new file mode 100644
index 0000000..d8f9904
--- /dev/null
+++ b/src/include/lwip/priv/sockets_priv.h
@@ -0,0 +1,175 @@
+/**
+ * @file
+ * Sockets API internal implementations (do not use in application code)
+ */
+
+/*
+ * 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>
+ *
+ */
+#ifndef LWIP_HDR_SOCKETS_PRIV_H
+#define LWIP_HDR_SOCKETS_PRIV_H
+
+#include "lwip/opt.h"
+
+#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/err.h"
+#include "lwip/sockets.h"
+#include "lwip/sys.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define NUM_SOCKETS MEMP_NUM_NETCONN
+
+/** This is overridable for the rare case where more than 255 threads
+ * select on the same socket...
+ */
+#ifndef SELWAIT_T
+#define SELWAIT_T u8_t
+#endif
+
+union lwip_sock_lastdata {
+  struct netbuf *netbuf;
+  struct pbuf *pbuf;
+};
+
+/** Contains all internal pointers and states used for a socket */
+struct lwip_sock {
+  /** sockets currently are built on netconns, each socket has one netconn */
+  struct netconn *conn;
+  /** data that was left from the previous read */
+  union lwip_sock_lastdata lastdata;
+#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL
+  /** number of times data was received, set by event_callback(),
+      tested by the receive and select functions */
+  s16_t rcvevent;
+  /** number of times data was ACKed (free send buffer), set by event_callback(),
+      tested by select */
+  u16_t sendevent;
+  /** error happened for this socket, set by event_callback(), tested by select */
+  u16_t errevent;
+  /** counter of how many threads are waiting for this socket using select */
+  SELWAIT_T select_waiting;
+#endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */
+#if LWIP_NETCONN_FULLDUPLEX
+  /* counter of how many threads are using a struct lwip_sock (not the 'int') */
+  u8_t fd_used;
+  /* status of pending close/delete actions */
+  u8_t fd_free_pending;
+#define LWIP_SOCK_FD_FREE_TCP  1
+#define LWIP_SOCK_FD_FREE_FREE 2
+#endif
+};
+
+#ifndef set_errno
+#define set_errno(err) do { if (err) { errno = (err); } } while(0)
+#endif
+
+#if !LWIP_TCPIP_CORE_LOCKING
+/** 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
+ * functions running in tcpip_thread context (only a void* is allowed) */
+struct lwip_setgetsockopt_data {
+  /** socket index for which to change options */
+  int s;
+  /** level of the option to process */
+  int level;
+  /** name of the option to process */
+  int optname;
+  /** set: value to set the option to
+    * get: value of the option is stored here */
+#if LWIP_MPU_COMPATIBLE
+  u8_t optval[LWIP_SETGETSOCKOPT_MAXOPTLEN];
+#else
+  union {
+    void *p;
+    const void *pc;
+  } optval;
+#endif
+  /** size of *optval */
+  socklen_t optlen;
+  /** if an error occurs, it is temporarily stored here */
+  int err;
+  /** semaphore to wake up the calling task */
+  void* completed_sem;
+};
+#endif /* !LWIP_TCPIP_CORE_LOCKING */
+
+#ifdef __cplusplus
+}
+#endif
+
+struct lwip_sock* lwip_socket_dbg_get_socket(int fd);
+
+#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL
+
+#if LWIP_NETCONN_SEM_PER_THREAD
+#define SELECT_SEM_T        sys_sem_t*
+#define SELECT_SEM_PTR(sem) (sem)
+#else /* LWIP_NETCONN_SEM_PER_THREAD */
+#define SELECT_SEM_T        sys_sem_t
+#define SELECT_SEM_PTR(sem) (&(sem))
+#endif /* LWIP_NETCONN_SEM_PER_THREAD */
+
+/** Description for a task waiting in select */
+struct lwip_select_cb {
+  /** Pointer to the next waiting task */
+  struct lwip_select_cb *next;
+  /** Pointer to the previous waiting task */
+  struct lwip_select_cb *prev;
+#if LWIP_SOCKET_SELECT
+  /** readset passed to select */
+  fd_set *readset;
+  /** writeset passed to select */
+  fd_set *writeset;
+  /** unimplemented: exceptset passed to select */
+  fd_set *exceptset;
+#endif /* LWIP_SOCKET_SELECT */
+#if LWIP_SOCKET_POLL
+  /** fds passed to poll; NULL if select */
+  struct pollfd *poll_fds;
+  /** nfds passed to poll; 0 if select */
+  nfds_t poll_nfds;
+#endif /* LWIP_SOCKET_POLL */
+  /** don't signal the same semaphore twice: set to 1 when signalled */
+  int sem_signalled;
+  /** semaphore to wake up a task waiting for select */
+  SELECT_SEM_T sem;
+};
+#endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */
+
+#endif /* LWIP_SOCKET */
+
+#endif /* LWIP_HDR_SOCKETS_PRIV_H */
diff --git a/src/include/lwip/priv/tcp_priv.h b/src/include/lwip/priv/tcp_priv.h
index 73e8967..72f9126 100644
--- a/src/include/lwip/priv/tcp_priv.h
+++ b/src/include/lwip/priv/tcp_priv.h
@@ -77,9 +77,12 @@
 void             tcp_input   (struct pbuf *p, struct netif *inp);
 /* Used within the TCP code only: */
 struct tcp_pcb * tcp_alloc   (u8_t prio);
+void             tcp_free    (struct tcp_pcb *pcb);
 void             tcp_abandon (struct tcp_pcb *pcb, int reset);
 err_t            tcp_send_empty_ack(struct tcp_pcb *pcb);
-void             tcp_rexmit  (struct tcp_pcb *pcb);
+err_t            tcp_rexmit  (struct tcp_pcb *pcb);
+err_t            tcp_rexmit_rto_prepare(struct tcp_pcb *pcb);
+void             tcp_rexmit_rto_commit(struct tcp_pcb *pcb);
 void             tcp_rexmit_rto  (struct tcp_pcb *pcb);
 void             tcp_rexmit_fast (struct tcp_pcb *pcb);
 u32_t            tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb);
@@ -174,6 +177,8 @@
                 ret = lwip_tcp_event((pcb)->callback_arg, (pcb), LWIP_EVENT_POLL, NULL, 0, ERR_OK); \
                 } else {                                                                            \
                 ret = ERR_ARG; } } while(0)
+/* For event API, last state SYN_RCVD must be excluded here: the application
+   has not seen this pcb, yet! */
 #define TCP_EVENT_ERR(last_state,errf,arg,err)  do { if (last_state != SYN_RCVD) {                \
                 lwip_tcp_event((arg), NULL, LWIP_EVENT_ERR, NULL, 0, (err)); } } while(0)
 
@@ -259,11 +264,12 @@
   u8_t  chksum_swapped;
 #endif /* TCP_CHECKSUM_ON_COPY */
   u8_t  flags;
-#define TF_SEG_OPTS_MSS         (u8_t)0x01U /* Include MSS option. */
+#define TF_SEG_OPTS_MSS         (u8_t)0x01U /* Include MSS option (only used in SYN segments) */
 #define TF_SEG_OPTS_TS          (u8_t)0x02U /* Include timestamp option. */
 #define TF_SEG_DATA_CHECKSUMMED (u8_t)0x04U /* ALL data (not the header) is
                                                checksummed into 'chksum' */
-#define TF_SEG_OPTS_WND_SCALE   (u8_t)0x08U /* Include WND SCALE option */
+#define TF_SEG_OPTS_WND_SCALE   (u8_t)0x08U /* Include WND SCALE option (only used in SYN segments) */
+#define TF_SEG_OPTS_SACK_PERM   (u8_t)0x10U /* Include SACK Permitted option (only used in SYN segments) */
   struct tcp_hdr *tcphdr;  /* the TCP header */
 };
 
@@ -271,6 +277,7 @@
 #define LWIP_TCP_OPT_NOP        1
 #define LWIP_TCP_OPT_MSS        2
 #define LWIP_TCP_OPT_WS         3
+#define LWIP_TCP_OPT_SACK_PERM  4
 #define LWIP_TCP_OPT_TS         8
 
 #define LWIP_TCP_OPT_LEN_MSS    4
@@ -287,10 +294,18 @@
 #define LWIP_TCP_OPT_LEN_WS_OUT 0
 #endif
 
+#if LWIP_TCP_SACK_OUT
+#define LWIP_TCP_OPT_LEN_SACK_PERM     2
+#define LWIP_TCP_OPT_LEN_SACK_PERM_OUT 4 /* aligned for output (includes NOP padding) */
+#else
+#define LWIP_TCP_OPT_LEN_SACK_PERM_OUT 0
+#endif
+
 #define LWIP_TCP_OPT_LENGTH(flags) \
-  (flags & TF_SEG_OPTS_MSS       ? LWIP_TCP_OPT_LEN_MSS    : 0) + \
-  (flags & TF_SEG_OPTS_TS        ? LWIP_TCP_OPT_LEN_TS_OUT : 0) + \
-  (flags & TF_SEG_OPTS_WND_SCALE ? LWIP_TCP_OPT_LEN_WS_OUT : 0)
+  ((flags) & TF_SEG_OPTS_MSS       ? LWIP_TCP_OPT_LEN_MSS           : 0) + \
+  ((flags) & TF_SEG_OPTS_TS        ? LWIP_TCP_OPT_LEN_TS_OUT        : 0) + \
+  ((flags) & TF_SEG_OPTS_WND_SCALE ? LWIP_TCP_OPT_LEN_WS_OUT        : 0) + \
+  ((flags) & TF_SEG_OPTS_SACK_PERM ? LWIP_TCP_OPT_LEN_SACK_PERM_OUT : 0)
 
 /** This returns a TCP header option for MSS in an u32_t */
 #define TCP_BUILD_MSS_OPTION(mss) lwip_htonl(0x02040000 | ((mss) & 0xFFFF))
@@ -342,7 +357,7 @@
 #if TCP_DEBUG_PCB_LISTS
 #define TCP_REG(pcbs, npcb) do {\
                             struct tcp_pcb *tcp_tmp_pcb; \
-                            LWIP_DEBUGF(TCP_DEBUG, ("TCP_REG %p local port %d\n", (npcb), (npcb)->local_port)); \
+                            LWIP_DEBUGF(TCP_DEBUG, ("TCP_REG %p local port %"U16_F"\n", (void *)(npcb), (npcb)->local_port)); \
                             for (tcp_tmp_pcb = *(pcbs); \
           tcp_tmp_pcb != NULL; \
         tcp_tmp_pcb = tcp_tmp_pcb->next) { \
@@ -352,13 +367,13 @@
                             (npcb)->next = *(pcbs); \
                             LWIP_ASSERT("TCP_REG: npcb->next != npcb", (npcb)->next != (npcb)); \
                             *(pcbs) = (npcb); \
-                            LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \
+                            LWIP_ASSERT("TCP_REG: tcp_pcbs sane", tcp_pcbs_sane()); \
               tcp_timer_needed(); \
                             } while(0)
 #define TCP_RMV(pcbs, npcb) do { \
                             struct tcp_pcb *tcp_tmp_pcb; \
                             LWIP_ASSERT("TCP_RMV: pcbs != NULL", *(pcbs) != NULL); \
-                            LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removing %p from %p\n", (npcb), *(pcbs))); \
+                            LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removing %p from %p\n", (void *)(npcb), (void *)(*(pcbs)))); \
                             if(*(pcbs) == (npcb)) { \
                                *(pcbs) = (*pcbs)->next; \
                             } else for (tcp_tmp_pcb = *(pcbs); tcp_tmp_pcb != NULL; tcp_tmp_pcb = tcp_tmp_pcb->next) { \
@@ -369,7 +384,7 @@
                             } \
                             (npcb)->next = NULL; \
                             LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \
-                            LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removed %p from %p\n", (npcb), *(pcbs))); \
+                            LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removed %p from %p\n", (void *)(npcb), (void *)(*(pcbs)))); \
                             } while(0)
 
 #else /* LWIP_DEBUG */
@@ -433,45 +448,38 @@
 #define tcp_ack(pcb)                               \
   do {                                             \
     if((pcb)->flags & TF_ACK_DELAY) {              \
-      (pcb)->flags &= ~TF_ACK_DELAY;               \
-      (pcb)->flags |= TF_ACK_NOW;                  \
+      tcp_clear_flags(pcb, TF_ACK_DELAY);          \
+      tcp_ack_now(pcb);                            \
     }                                              \
     else {                                         \
-      (pcb)->flags |= TF_ACK_DELAY;                \
+      tcp_set_flags(pcb, TF_ACK_DELAY);            \
     }                                              \
   } while (0)
 
 #define tcp_ack_now(pcb)                           \
-  do {                                             \
-    (pcb)->flags |= TF_ACK_NOW;                    \
-  } while (0)
+  tcp_set_flags(pcb, TF_ACK_NOW)
 
 err_t tcp_send_fin(struct tcp_pcb *pcb);
 err_t tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags);
 
 void tcp_rexmit_seg(struct tcp_pcb *pcb, struct tcp_seg *seg);
 
-void tcp_rst(u32_t seqno, u32_t ackno,
+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);
 
 u32_t tcp_next_iss(struct tcp_pcb *pcb);
 
 err_t tcp_keepalive(struct tcp_pcb *pcb);
+err_t tcp_split_unsent_seg(struct tcp_pcb *pcb, u16_t split);
 err_t tcp_zero_window_probe(struct tcp_pcb *pcb);
 void  tcp_trigger_input_pcb_close(void);
 
 #if TCP_CALCULATE_EFF_SEND_MSS
-u16_t tcp_eff_send_mss_impl(u16_t sendmss, const ip_addr_t *dest
-#if LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING
-                           , const ip_addr_t *src
-#endif /* LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING */
-                           );
-#if LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING
-#define tcp_eff_send_mss(sendmss, src, dest) tcp_eff_send_mss_impl(sendmss, dest, src)
-#else /* LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING */
-#define tcp_eff_send_mss(sendmss, src, dest) tcp_eff_send_mss_impl(sendmss, dest)
-#endif /* LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING */
+u16_t tcp_eff_send_mss_netif(u16_t sendmss, struct netif *outif,
+                             const ip_addr_t *dest);
+#define tcp_eff_send_mss(sendmss, src, dest) \
+    tcp_eff_send_mss_netif(sendmss, ip_route(src, dest), dest)
 #endif /* TCP_CALCULATE_EFF_SEND_MSS */
 
 #if LWIP_CALLBACK_API
@@ -498,6 +506,14 @@
 
 void tcp_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr);
 
+#if TCP_QUEUE_OOSEQ
+void tcp_free_ooseq(struct tcp_pcb *pcb);
+#endif
+
+#if LWIP_TCP_PCB_NUM_EXT_ARGS
+err_t tcp_ext_arg_invoke_callbacks_passive_open(struct tcp_pcb_listen *lpcb, struct tcp_pcb *cpcb);
+#endif
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/include/lwip/priv/tcpip_priv.h b/src/include/lwip/priv/tcpip_priv.h
index 630efb1..74be634 100644
--- a/src/include/lwip/priv/tcpip_priv.h
+++ b/src/include/lwip/priv/tcpip_priv.h
@@ -55,12 +55,13 @@
 #if LWIP_MPU_COMPATIBLE
 #define API_VAR_REF(name)               (*(name))
 #define API_VAR_DECLARE(type, name)     type * name
-#define API_VAR_ALLOC(type, pool, name, errorval) do { \
+#define API_VAR_ALLOC_EXT(type, pool, name, errorblock) do { \
                                           name = (type *)memp_malloc(pool); \
                                           if (name == NULL) { \
-                                            return errorval; \
+                                            errorblock; \
                                           } \
                                         } while(0)
+#define API_VAR_ALLOC(type, pool, name, errorval) API_VAR_ALLOC_EXT(type, pool, name, return errorval)
 #define API_VAR_ALLOC_POOL(type, pool, name, errorval) do { \
                                           name = (type *)LWIP_MEMPOOL_ALLOC(pool); \
                                           if (name == NULL) { \
@@ -81,6 +82,7 @@
 #else /* LWIP_MPU_COMPATIBLE */
 #define API_VAR_REF(name)               name
 #define API_VAR_DECLARE(type, name)     type name
+#define API_VAR_ALLOC_EXT(type, pool, name, errorblock)
 #define API_VAR_ALLOC(type, pool, name, errorval)
 #define API_VAR_ALLOC_POOL(type, pool, name, errorval)
 #define API_VAR_FREE(pool, name)
@@ -109,9 +111,13 @@
 err_t tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call);
 
 enum tcpip_msg_type {
+#if !LWIP_TCPIP_CORE_LOCKING
   TCPIP_MSG_API,
   TCPIP_MSG_API_CALL,
+#endif /* !LWIP_TCPIP_CORE_LOCKING */
+#if !LWIP_TCPIP_CORE_LOCKING_INPUT
   TCPIP_MSG_INPKT,
+#endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */
 #if LWIP_TCPIP_TIMEOUT && LWIP_TIMERS
   TCPIP_MSG_TIMEOUT,
   TCPIP_MSG_UNTIMEOUT,
@@ -123,6 +129,7 @@
 struct tcpip_msg {
   enum tcpip_msg_type type;
   union {
+#if !LWIP_TCPIP_CORE_LOCKING
     struct {
       tcpip_callback_fn function;
       void* msg;
@@ -132,11 +139,14 @@
       struct tcpip_api_call_data *arg;
       sys_sem_t *sem;
     } api_call;
+#endif /* LWIP_TCPIP_CORE_LOCKING */
+#if !LWIP_TCPIP_CORE_LOCKING_INPUT
     struct {
       struct pbuf *p;
       struct netif *netif;
       netif_input_fn input_fn;
     } inp;
+#endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */
     struct {
       tcpip_callback_fn function;
       void *ctx;
diff --git a/src/include/lwip/prot/dhcp.h b/src/include/lwip/prot/dhcp.h
index 112953c..ab18dca 100644
--- a/src/include/lwip/prot/dhcp.h
+++ b/src/include/lwip/prot/dhcp.h
@@ -39,15 +39,13 @@
 #define LWIP_HDR_PROT_DHCP_H
 
 #include "lwip/opt.h"
+#include "lwip/arch.h"
+#include "lwip/prot/ip4.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#define DHCP_CLIENT_PORT  68
-#define DHCP_SERVER_PORT  67
-
-
  /* DHCP message item offsets and length */
 #define DHCP_CHADDR_LEN   16U
 #define DHCP_SNAME_OFS    44U
@@ -128,9 +126,6 @@
 #define DHCP_RELEASE                7
 #define DHCP_INFORM                 8
 
-/** DHCP hardware type, currently only ethernet is supported */
-#define DHCP_HTYPE_ETH              1
-
 #define DHCP_MAGIC_COOKIE           0x63825363UL
 
 /* This is a list of options for BOOTP and DHCP, see RFC 2132 for descriptions */
@@ -180,4 +175,4 @@
 }
 #endif
 
-#endif /*LWIP_HDR_PROT_DHCP_H*/
+#endif /* LWIP_HDR_PROT_DHCP_H */
diff --git a/src/include/lwip/prot/dhcp6.h b/src/include/lwip/prot/dhcp6.h
new file mode 100644
index 0000000..0754c91
--- /dev/null
+++ b/src/include/lwip/prot/dhcp6.h
@@ -0,0 +1,138 @@
+/**
+ * @file
+ * DHCPv6 protocol definitions
+ */
+
+/*
+ * Copyright (c) 2017 Simon Goldschmidt <goldsimon@gmx.de>
+ * 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_PROT_DHCP6_H
+#define LWIP_HDR_PROT_DHCP6_H
+
+#include "lwip/opt.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define DHCP6_CLIENT_PORT  546
+#define DHCP6_SERVER_PORT  547
+
+
+ /* DHCPv6 message item offsets and length */
+#define DHCP6_TRANSACTION_ID_LEN   3
+
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/bpstruct.h"
+#endif
+PACK_STRUCT_BEGIN
+/** minimum set of fields of any DHCPv6 message */
+struct dhcp6_msg
+{
+  PACK_STRUCT_FLD_8(u8_t msgtype);
+  PACK_STRUCT_FLD_8(u8_t transaction_id[DHCP6_TRANSACTION_ID_LEN]);
+  /* options follow */
+} PACK_STRUCT_STRUCT;
+PACK_STRUCT_END
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/epstruct.h"
+#endif
+
+
+/* DHCP6 client states */
+typedef enum {
+  DHCP6_STATE_OFF               = 0,
+  DHCP6_STATE_STATELESS_IDLE    = 1,
+  DHCP6_STATE_REQUESTING_CONFIG = 2
+} dhcp6_state_enum_t;
+
+/* DHCPv6 message types */
+#define DHCP6_SOLICIT               1
+#define DHCP6_ADVERTISE             2
+#define DHCP6_REQUEST               3
+#define DHCP6_CONFIRM               4
+#define DHCP6_RENEW                 5
+#define DHCP6_REBIND                6
+#define DHCP6_REPLY                 7
+#define DHCP6_RELEASE               8
+#define DHCP6_DECLINE               9
+#define DHCP6_RECONFIGURE           10
+#define DHCP6_INFOREQUEST           11
+#define DHCP6_RELAYFORW             12
+#define DHCP6_RELAYREPL             13
+/* More message types see https://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xhtml */
+
+/** DHCPv6 status codes */
+#define DHCP6_STATUS_SUCCESS        0 /* Success. */
+#define DHCP6_STATUS_UNSPECFAIL     1 /* Failure, reason unspecified; this status code is sent by either a client or a server to indicate a failure not explicitly specified in this document. */
+#define DHCP6_STATUS_NOADDRSAVAIL   2 /* Server has no addresses available to assign to the IA(s). */
+#define DHCP6_STATUS_NOBINDING      3 /* Client record (binding) unavailable. */
+#define DHCP6_STATUS_NOTONLINK      4 /* The prefix for the address is not appropriate for the link to which the client is attached. */
+#define DHCP6_STATUS_USEMULTICAST   5 /* Sent by a server to a client to force the client to send messages to the server using the All_DHCP_Relay_Agents_and_Servers address. */
+/* More status codes see https://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xhtml */
+
+/** DHCPv6 DUID types */
+#define DHCP6_DUID_LLT              1 /* LLT: Link-layer Address Plus Time */
+#define DHCP6_DUID_EN               2 /* EN: Enterprise number */
+#define DHCP6_DUID_LL               3 /* LL: Link-layer Address */
+#define DHCP6_DUID_UUID             4 /* UUID (RFC 6355) */
+
+/* DHCPv6 options */
+#define DHCP6_OPTION_CLIENTID       1
+#define DHCP6_OPTION_SERVERID       2
+#define DHCP6_OPTION_IA_NA          3
+#define DHCP6_OPTION_IA_TA          4
+#define DHCP6_OPTION_IAADDR         5
+#define DHCP6_OPTION_ORO            6
+#define DHCP6_OPTION_PREFERENCE     7
+#define DHCP6_OPTION_ELAPSED_TIME   8
+#define DHCP6_OPTION_RELAY_MSG      9
+#define DHCP6_OPTION_AUTH           11
+#define DHCP6_OPTION_UNICAST        12
+#define DHCP6_OPTION_STATUS_CODE    13
+#define DHCP6_OPTION_RAPID_COMMIT   14
+#define DHCP6_OPTION_USER_CLASS     15
+#define DHCP6_OPTION_VENDOR_CLASS   16
+#define DHCP6_OPTION_VENDOR_OPTS    17
+#define DHCP6_OPTION_INTERFACE_ID   18
+#define DHCP6_OPTION_RECONF_MSG     19
+#define DHCP6_OPTION_RECONF_ACCEPT  20
+/* More options see https://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xhtml */
+#define DHCP6_OPTION_DNS_SERVERS    23 /* RFC 3646 */
+#define DHCP6_OPTION_DOMAIN_LIST    24 /* RFC 3646 */
+#define DHCP6_OPTION_SNTP_SERVERS   31 /* RFC 4075 */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_PROT_DHCP6_H */
diff --git a/src/include/lwip/prot/etharp.h b/src/include/lwip/prot/etharp.h
index ec78305..811c228 100644
--- a/src/include/lwip/prot/etharp.h
+++ b/src/include/lwip/prot/etharp.h
@@ -39,7 +39,6 @@
 
 #include "lwip/arch.h"
 #include "lwip/prot/ethernet.h"
-#include "lwip/ip4_addr.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -49,6 +48,36 @@
 #define ETHARP_HWADDR_LEN     ETH_HWADDR_LEN
 #endif
 
+/**
+ * struct ip4_addr_wordaligned is used in the definition of the ARP packet format in
+ * order to support compilers that don't have structure packing.
+ */
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/bpstruct.h"
+#endif
+PACK_STRUCT_BEGIN
+struct ip4_addr_wordaligned {
+  PACK_STRUCT_FIELD(u16_t addrw[2]);
+} PACK_STRUCT_STRUCT;
+PACK_STRUCT_END
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/epstruct.h"
+#endif
+
+/** MEMCPY-like copying of IP addresses where addresses are known to be
+ * 16-bit-aligned if the port is correctly configured (so a port could define
+ * this to copying 2 u16_t's) - no NULL-pointer-checking needed. */
+#ifndef IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T
+#define IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(dest, src) SMEMCPY(dest, src, sizeof(ip4_addr_t))
+#endif
+
+ /** MEMCPY-like copying of IP addresses where addresses are known to be
+ * 16-bit-aligned if the port is correctly configured (so a port could define
+ * this to copying 2 u16_t's) - no NULL-pointer-checking needed. */
+#ifndef IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T
+#define IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T(dest, src) SMEMCPY(dest, src, sizeof(ip4_addr_t))
+#endif
+
 #ifdef PACK_STRUCT_USE_INCLUDES
 #  include "arch/bpstruct.h"
 #endif
@@ -61,9 +90,9 @@
   PACK_STRUCT_FLD_8(u8_t  protolen);
   PACK_STRUCT_FIELD(u16_t opcode);
   PACK_STRUCT_FLD_S(struct eth_addr shwaddr);
-  PACK_STRUCT_FLD_S(struct ip4_addr2 sipaddr);
+  PACK_STRUCT_FLD_S(struct ip4_addr_wordaligned sipaddr);
   PACK_STRUCT_FLD_S(struct eth_addr dhwaddr);
-  PACK_STRUCT_FLD_S(struct ip4_addr2 dipaddr);
+  PACK_STRUCT_FLD_S(struct ip4_addr_wordaligned dipaddr);
 } PACK_STRUCT_STRUCT;
 PACK_STRUCT_END
 #ifdef PACK_STRUCT_USE_INCLUDES
@@ -72,12 +101,6 @@
 
 #define SIZEOF_ETHARP_HDR 28
 
-/* ARP hwtype values */
-enum etharp_hwtype {
-  HWTYPE_ETHERNET = 1
-  /* others not used */
-};
-
 /* ARP message types (opcodes) */
 enum etharp_opcode {
   ARP_REQUEST = 1,
diff --git a/src/include/lwip/prot/ethernet.h b/src/include/lwip/prot/ethernet.h
index e4baa29..309e574 100644
--- a/src/include/lwip/prot/ethernet.h
+++ b/src/include/lwip/prot/ethernet.h
@@ -38,6 +38,7 @@
 #define LWIP_HDR_PROT_ETHERNET_H
 
 #include "lwip/arch.h"
+#include "lwip/prot/ieee.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -55,6 +56,7 @@
 #  include "arch/bpstruct.h"
 #endif
 PACK_STRUCT_BEGIN
+/** An Ethernet MAC address */
 struct eth_addr {
   PACK_STRUCT_FLD_8(u8_t addr[ETH_HWADDR_LEN]);
 } PACK_STRUCT_STRUCT;
@@ -63,6 +65,9 @@
 #  include "arch/epstruct.h"
 #endif
 
+/** Initialize a struct eth_addr with its 6 bytes (takes care of correct braces) */
+#define ETH_ADDR(b0, b1, b2, b3, b4, b5) {{b0, b1, b2, b3, b4, b5}}
+
 #ifdef PACK_STRUCT_USE_INCLUDES
 #  include "arch/bpstruct.h"
 #endif
@@ -102,44 +107,6 @@
 #define SIZEOF_VLAN_HDR 4
 #define VLAN_ID(vlan_hdr) (lwip_htons((vlan_hdr)->prio_vid) & 0xFFF)
 
-/**
- * @ingroup ethernet
- * A list of often ethtypes (although lwIP does not use all of them): */
-enum eth_type {
-  /** Internet protocol v4 */
-  ETHTYPE_IP        = 0x0800U,
-  /** Address resolution protocol */
-  ETHTYPE_ARP       = 0x0806U, 
-  /** Wake on lan */
-  ETHTYPE_WOL       = 0x0842U,
-  /** RARP */
-  ETHTYPE_RARP      = 0x8035U,
-  /** Virtual local area network */
-  ETHTYPE_VLAN      = 0x8100U,
-  /** Internet protocol v6 */
-  ETHTYPE_IPV6      = 0x86DDU,
-  /** PPP Over Ethernet Discovery Stage */
-  ETHTYPE_PPPOEDISC = 0x8863U,
-  /** PPP Over Ethernet Session Stage */
-  ETHTYPE_PPPOE     = 0x8864U,
-  /** Jumbo Frames */
-  ETHTYPE_JUMBO     = 0x8870U,
-  /** Process field network */
-  ETHTYPE_PROFINET  = 0x8892U,
-  /** Ethernet for control automation technology */
-  ETHTYPE_ETHERCAT  = 0x88A4U,
-  /** Link layer discovery protocol */
-  ETHTYPE_LLDP      = 0x88CCU,
-  /** Serial real-time communication system */
-  ETHTYPE_SERCOS    = 0x88CDU,
-  /** Media redundancy protocol */
-  ETHTYPE_MRP       = 0x88E3U,
-  /** Precision time protocol */
-  ETHTYPE_PTP       = 0x88F7U,
-  /** Q-in-Q, 802.1ad */
-  ETHTYPE_QINQ      = 0x9100U
-};
-
 /** The 24-bit IANA IPv4-multicast OUI is 01-00-5e: */
 #define LL_IP4_MULTICAST_ADDR_0 0x01
 #define LL_IP4_MULTICAST_ADDR_1 0x00
@@ -149,18 +116,6 @@
 #define LL_IP6_MULTICAST_ADDR_0 0x33
 #define LL_IP6_MULTICAST_ADDR_1 0x33
 
-/** MEMCPY-like macro to copy to/from struct eth_addr's that are local variables
- * or known to be 32-bit aligned within the protocol header. */
-#ifndef ETHADDR32_COPY
-#define ETHADDR32_COPY(dst, src)  SMEMCPY(dst, src, ETH_HWADDR_LEN)
-#endif
-
-/** MEMCPY-like macro to copy to/from struct eth_addr's that are no local
- * variables and known to be 16-bit aligned within the protocol header. */
-#ifndef ETHADDR16_COPY
-#define ETHADDR16_COPY(dst, src)  SMEMCPY(dst, src, ETH_HWADDR_LEN)
-#endif
-
 #define eth_addr_cmp(addr1, addr2) (memcmp((addr1)->addr, (addr2)->addr, ETH_HWADDR_LEN) == 0)
 
 #ifdef __cplusplus
diff --git a/src/include/lwip/prot/iana.h b/src/include/lwip/prot/iana.h
new file mode 100644
index 0000000..32890cc
--- /dev/null
+++ b/src/include/lwip/prot/iana.h
@@ -0,0 +1,97 @@
+/**
+ * @file
+ * IANA assigned numbers (RFC 1700 and successors)
+ *
+ * @defgroup iana IANA assigned numbers
+ * @ingroup infrastructure
+ */
+
+/*
+ * 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.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Dirk Ziegelmeier <dziegel@gmx.de>
+ *
+ */
+
+#ifndef LWIP_HDR_PROT_IANA_H
+#define LWIP_HDR_PROT_IANA_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @ingroup iana
+ * Hardware types
+ */
+enum lwip_iana_hwtype {
+  /** Ethernet */
+  LWIP_IANA_HWTYPE_ETHERNET = 1
+};
+
+/**
+ * @ingroup iana
+ * Port numbers
+ * https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt
+ */
+enum lwip_iana_port_number {
+  /** SMTP */
+  LWIP_IANA_PORT_SMTP        = 25,
+  /** DHCP server */
+  LWIP_IANA_PORT_DHCP_SERVER = 67,
+  /** DHCP client */
+  LWIP_IANA_PORT_DHCP_CLIENT = 68,
+  /** TFTP */
+  LWIP_IANA_PORT_TFTP        = 69,
+  /** HTTP */
+  LWIP_IANA_PORT_HTTP        = 80,
+  /** SNTP */
+  LWIP_IANA_PORT_SNTP        = 123,
+  /** NETBIOS */
+  LWIP_IANA_PORT_NETBIOS     = 137,
+  /** SNMP */
+  LWIP_IANA_PORT_SNMP        = 161,
+  /** SNMP traps */
+  LWIP_IANA_PORT_SNMP_TRAP   = 162,
+  /** HTTPS */
+  LWIP_IANA_PORT_HTTPS       = 443,
+  /** SMTPS */
+  LWIP_IANA_PORT_SMTPS       = 465,
+  /** MQTT */
+  LWIP_IANA_PORT_MQTT        = 1883,
+  /** MDNS */
+  LWIP_IANA_PORT_MDNS        = 5353,
+  /** Secure MQTT */
+  LWIP_IANA_PORT_SECURE_MQTT = 8883
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_PROT_IANA_H */
diff --git a/src/include/lwip/prot/ieee.h b/src/include/lwip/prot/ieee.h
new file mode 100644
index 0000000..abbb9e3
--- /dev/null
+++ b/src/include/lwip/prot/ieee.h
@@ -0,0 +1,91 @@
+/**
+ * @file
+ * IEEE assigned numbers
+ *
+ * @defgroup ieee IEEE assigned numbers
+ * @ingroup infrastructure
+ */
+
+/*
+ * 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.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Dirk Ziegelmeier <dziegel@gmx.de>
+ *
+ */
+
+#ifndef LWIP_HDR_PROT_IEEE_H
+#define LWIP_HDR_PROT_IEEE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @ingroup ieee
+ * A list of often ethtypes (although lwIP does not use all of them).
+ */
+enum lwip_ieee_eth_type {
+  /** Internet protocol v4 */
+  ETHTYPE_IP        = 0x0800U,
+  /** Address resolution protocol */
+  ETHTYPE_ARP       = 0x0806U, 
+  /** Wake on lan */
+  ETHTYPE_WOL       = 0x0842U,
+  /** RARP */
+  ETHTYPE_RARP      = 0x8035U,
+  /** Virtual local area network */
+  ETHTYPE_VLAN      = 0x8100U,
+  /** Internet protocol v6 */
+  ETHTYPE_IPV6      = 0x86DDU,
+  /** PPP Over Ethernet Discovery Stage */
+  ETHTYPE_PPPOEDISC = 0x8863U,
+  /** PPP Over Ethernet Session Stage */
+  ETHTYPE_PPPOE     = 0x8864U,
+  /** Jumbo Frames */
+  ETHTYPE_JUMBO     = 0x8870U,
+  /** Process field network */
+  ETHTYPE_PROFINET  = 0x8892U,
+  /** Ethernet for control automation technology */
+  ETHTYPE_ETHERCAT  = 0x88A4U,
+  /** Link layer discovery protocol */
+  ETHTYPE_LLDP      = 0x88CCU,
+  /** Serial real-time communication system */
+  ETHTYPE_SERCOS    = 0x88CDU,
+  /** Media redundancy protocol */
+  ETHTYPE_MRP       = 0x88E3U,
+  /** Precision time protocol */
+  ETHTYPE_PTP       = 0x88F7U,
+  /** Q-in-Q, 802.1ad */
+  ETHTYPE_QINQ      = 0x9100U
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_PROT_IEEE_H */
diff --git a/src/include/lwip/prot/igmp.h b/src/include/lwip/prot/igmp.h
index d60cb31..46b81a9 100644
--- a/src/include/lwip/prot/igmp.h
+++ b/src/include/lwip/prot/igmp.h
@@ -38,7 +38,7 @@
 #define LWIP_HDR_PROT_IGMP_H
 
 #include "lwip/arch.h"
-#include "lwip/ip4_addr.h"
+#include "lwip/prot/ip4.h"
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/lwip/prot/ip.h b/src/include/lwip/prot/ip.h
index bbfae36..223158f 100644
--- a/src/include/lwip/prot/ip.h
+++ b/src/include/lwip/prot/ip.h
@@ -39,6 +39,10 @@
 
 #include "lwip/arch.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #define IP_PROTO_ICMP    1
 #define IP_PROTO_IGMP    2
 #define IP_PROTO_UDP     17
@@ -48,4 +52,8 @@
 /** This operates on a void* by loading the first byte */
 #define IP_HDR_GET_VERSION(ptr)   ((*(u8_t*)(ptr)) >> 4)
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* LWIP_HDR_PROT_IP_H */
diff --git a/src/include/lwip/prot/ip4.h b/src/include/lwip/prot/ip4.h
index bd442c6..9347461 100644
--- a/src/include/lwip/prot/ip4.h
+++ b/src/include/lwip/prot/ip4.h
@@ -62,6 +62,8 @@
 
 /* Size of the IPv4 header. Same as 'sizeof(struct ip_hdr)'. */
 #define IP_HLEN 20
+/* Maximum size of the IPv4 header with options. */
+#define IP_HLEN_MAX 60
 
 #ifdef PACK_STRUCT_USE_INCLUDES
 #  include "arch/bpstruct.h"
@@ -101,10 +103,12 @@
 /* Macros to get struct ip_hdr fields: */
 #define IPH_V(hdr)  ((hdr)->_v_hl >> 4)
 #define IPH_HL(hdr) ((hdr)->_v_hl & 0x0f)
+#define IPH_HL_BYTES(hdr) ((u8_t)(IPH_HL(hdr) * 4))
 #define IPH_TOS(hdr) ((hdr)->_tos)
 #define IPH_LEN(hdr) ((hdr)->_len)
 #define IPH_ID(hdr) ((hdr)->_id)
 #define IPH_OFFSET(hdr) ((hdr)->_offset)
+#define IPH_OFFSET_BYTES(hdr) ((u16_t)((lwip_ntohs(IPH_OFFSET(hdr)) & IP_OFFMASK) * 8U))
 #define IPH_TTL(hdr) ((hdr)->_ttl)
 #define IPH_PROTO(hdr) ((hdr)->_proto)
 #define IPH_CHKSUM(hdr) ((hdr)->_chksum)
diff --git a/src/include/lwip/prot/ip6.h b/src/include/lwip/prot/ip6.h
index 6e1e263..0f6de45 100644
--- a/src/include/lwip/prot/ip6.h
+++ b/src/include/lwip/prot/ip6.h
@@ -43,7 +43,7 @@
 #ifdef __cplusplus
 extern "C" {
 #endif
-   
+
 /** This is the packed version of ip6_addr_t,
     used in network headers that are itself packed */
 #ifdef PACK_STRUCT_USE_INCLUDES
@@ -94,13 +94,50 @@
 #ifdef PACK_STRUCT_USE_INCLUDES
 #  include "arch/epstruct.h"
 #endif
+#define IP6H_V(hdr)  ((lwip_ntohl((hdr)->_v_tc_fl) >> 28) & 0x0f)
+#define IP6H_TC(hdr) ((lwip_ntohl((hdr)->_v_tc_fl) >> 20) & 0xff)
+#define IP6H_FL(hdr) (lwip_ntohl((hdr)->_v_tc_fl) & 0x000fffff)
+#define IP6H_PLEN(hdr) (lwip_ntohs((hdr)->_plen))
+#define IP6H_NEXTH(hdr) ((hdr)->_nexth)
+#define IP6H_NEXTH_P(hdr) ((u8_t *)(hdr) + 6)
+#define IP6H_HOPLIM(hdr) ((hdr)->_hoplim)
+#define IP6H_VTCFL_SET(hdr, v, tc, fl) (hdr)->_v_tc_fl = (lwip_htonl((((u32_t)(v)) << 28) | (((u32_t)(tc)) << 20) | (fl)))
+#define IP6H_PLEN_SET(hdr, plen) (hdr)->_plen = lwip_htons(plen)
+#define IP6H_NEXTH_SET(hdr, nexth) (hdr)->_nexth = (nexth)
+#define IP6H_HOPLIM_SET(hdr, hl) (hdr)->_hoplim = (u8_t)(hl)
 
-/* Hop-by-hop router alert option. */
-#define IP6_HBH_HLEN    8
-#define IP6_PAD1_OPTION         0
-#define IP6_PADN_ALERT_OPTION   1
-#define IP6_ROUTER_ALERT_OPTION 5
-#define IP6_ROUTER_ALERT_VALUE_MLD 0
+/* ipv6 extended options header */
+#define IP6_PAD1_OPTION             0
+#define IP6_PADN_OPTION             1
+#define IP6_ROUTER_ALERT_OPTION     5
+#define IP6_JUMBO_OPTION            194
+#define IP6_HOME_ADDRESS_OPTION     201
+#define IP6_ROUTER_ALERT_DLEN       2
+#define IP6_ROUTER_ALERT_VALUE_MLD  0
+
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/bpstruct.h"
+#endif
+PACK_STRUCT_BEGIN
+struct ip6_opt_hdr {
+  /* router alert option type */
+  PACK_STRUCT_FLD_8(u8_t _opt_type);
+  /* router alert option data len */
+  PACK_STRUCT_FLD_8(u8_t _opt_dlen);
+} PACK_STRUCT_STRUCT;
+PACK_STRUCT_END
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/epstruct.h"
+#endif
+#define IP6_OPT_HLEN 2
+#define IP6_OPT_TYPE_ACTION(hdr) ((((hdr)->_opt_type) >> 6) & 0x3)
+#define IP6_OPT_TYPE_CHANGE(hdr) ((((hdr)->_opt_type) >> 5) & 0x1)
+#define IP6_OPT_TYPE(hdr) ((hdr)->_opt_type)
+#define IP6_OPT_DLEN(hdr) ((hdr)->_opt_dlen)
+
+/* Hop-by-Hop header. */
+#define IP6_HBH_HLEN    2
+
 #ifdef PACK_STRUCT_USE_INCLUDES
 #  include "arch/bpstruct.h"
 #endif
@@ -108,28 +145,65 @@
 struct ip6_hbh_hdr {
   /* next header */
   PACK_STRUCT_FLD_8(u8_t _nexth);
-  /* header length */
+  /* header length in 8-octet units */
   PACK_STRUCT_FLD_8(u8_t _hlen);
-  /* router alert option type */
-  PACK_STRUCT_FLD_8(u8_t _ra_opt_type);
-  /* router alert option data len */
-  PACK_STRUCT_FLD_8(u8_t _ra_opt_dlen);
-  /* router alert option data */
-  PACK_STRUCT_FIELD(u16_t _ra_opt_data);
-  /* PadN option type */
-  PACK_STRUCT_FLD_8(u8_t _padn_opt_type);
-  /* PadN option data len */
-  PACK_STRUCT_FLD_8(u8_t _padn_opt_dlen);
 } PACK_STRUCT_STRUCT;
 PACK_STRUCT_END
 #ifdef PACK_STRUCT_USE_INCLUDES
 #  include "arch/epstruct.h"
 #endif
+#define IP6_HBH_NEXTH(hdr) ((hdr)->_nexth)
+
+/* Destination header. */
+#define IP6_DEST_HLEN   2
+
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/bpstruct.h"
+#endif
+PACK_STRUCT_BEGIN
+struct ip6_dest_hdr {
+  /* next header */
+  PACK_STRUCT_FLD_8(u8_t _nexth);
+  /* header length in 8-octet units */
+  PACK_STRUCT_FLD_8(u8_t _hlen);
+} PACK_STRUCT_STRUCT;
+PACK_STRUCT_END
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/epstruct.h"
+#endif
+#define IP6_DEST_NEXTH(hdr) ((hdr)->_nexth)
+
+/* Routing header */
+#define IP6_ROUT_TYPE2  2
+#define IP6_ROUT_RPL    3
+
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/bpstruct.h"
+#endif
+PACK_STRUCT_BEGIN
+struct ip6_rout_hdr {
+  /* next header */
+  PACK_STRUCT_FLD_8(u8_t _nexth);
+  /* reserved */
+  PACK_STRUCT_FLD_8(u8_t _hlen);
+  /* fragment offset */
+  PACK_STRUCT_FIELD(u8_t _routing_type);
+  /* fragmented packet identification */
+  PACK_STRUCT_FIELD(u8_t _segments_left);
+} PACK_STRUCT_STRUCT;
+PACK_STRUCT_END
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/epstruct.h"
+#endif
+#define IP6_ROUT_NEXTH(hdr) ((hdr)->_nexth)
+#define IP6_ROUT_TYPE(hdr) ((hdr)->_routing_type)
+#define IP6_ROUT_SEG_LEFT(hdr) ((hdr)->_segments_left)
 
 /* Fragment header. */
 #define IP6_FRAG_HLEN    8
 #define IP6_FRAG_OFFSET_MASK    0xfff8
 #define IP6_FRAG_MORE_FLAG      0x0001
+
 #ifdef PACK_STRUCT_USE_INCLUDES
 #  include "arch/bpstruct.h"
 #endif
@@ -148,19 +222,9 @@
 #ifdef PACK_STRUCT_USE_INCLUDES
 #  include "arch/epstruct.h"
 #endif
-
-#define IP6H_V(hdr)  ((lwip_ntohl((hdr)->_v_tc_fl) >> 28) & 0x0f)
-#define IP6H_TC(hdr) ((lwip_ntohl((hdr)->_v_tc_fl) >> 20) & 0xff)
-#define IP6H_FL(hdr) (lwip_ntohl((hdr)->_v_tc_fl) & 0x000fffff)
-#define IP6H_PLEN(hdr) (lwip_ntohs((hdr)->_plen))
-#define IP6H_NEXTH(hdr) ((hdr)->_nexth)
-#define IP6H_NEXTH_P(hdr) ((u8_t *)(hdr) + 6)
-#define IP6H_HOPLIM(hdr) ((hdr)->_hoplim)
-
-#define IP6H_VTCFL_SET(hdr, v, tc, fl) (hdr)->_v_tc_fl = (lwip_htonl((((u32_t)(v)) << 28) | (((u32_t)(tc)) << 20) | (fl)))
-#define IP6H_PLEN_SET(hdr, plen) (hdr)->_plen = lwip_htons(plen)
-#define IP6H_NEXTH_SET(hdr, nexth) (hdr)->_nexth = (nexth)
-#define IP6H_HOPLIM_SET(hdr, hl) (hdr)->_hoplim = (u8_t)(hl)
+#define IP6_FRAG_NEXTH(hdr) ((hdr)->_nexth)
+#define IP6_FRAG_MBIT(hdr) (lwip_ntohs((hdr)->_fragment_offset) & 0x1)
+#define IP6_FRAG_ID(hdr) (lwip_ntohl((hdr)->_identification))
 
 #ifdef __cplusplus
 }
diff --git a/src/include/lwip/prot/mld6.h b/src/include/lwip/prot/mld6.h
index be3a006..71f1dcb 100644
--- a/src/include/lwip/prot/mld6.h
+++ b/src/include/lwip/prot/mld6.h
@@ -44,6 +44,7 @@
 extern "C" {
 #endif
 
+#define MLD6_HBH_HLEN 8
 /** Multicast listener report/query/done message header. */
 #ifdef PACK_STRUCT_USE_INCLUDES
 #  include "arch/bpstruct.h"
diff --git a/src/include/lwip/prot/nd6.h b/src/include/lwip/prot/nd6.h
index 2d4903d..c270d07 100644
--- a/src/include/lwip/prot/nd6.h
+++ b/src/include/lwip/prot/nd6.h
@@ -248,11 +248,6 @@
 #endif
 
 /** Recursive DNS Server Option. */
-#if LWIP_ND6_RDNSS_MAX_DNS_SERVERS
-#define LWIP_RDNSS_OPTION_MAX_SERVERS LWIP_ND6_RDNSS_MAX_DNS_SERVERS
-#else
-#define LWIP_RDNSS_OPTION_MAX_SERVERS 1
-#endif
 #define ND6_OPTION_TYPE_RDNSS (25)
 #ifdef PACK_STRUCT_USE_INCLUDES
 #  include "arch/bpstruct.h"
@@ -263,13 +258,15 @@
   PACK_STRUCT_FLD_8(u8_t length);
   PACK_STRUCT_FIELD(u16_t reserved);
   PACK_STRUCT_FIELD(u32_t lifetime);
-  PACK_STRUCT_FLD_S(ip6_addr_p_t rdnss_address[LWIP_RDNSS_OPTION_MAX_SERVERS]);
+  PACK_STRUCT_FLD_S(ip6_addr_p_t rdnss_address[1]);
 } PACK_STRUCT_STRUCT;
 PACK_STRUCT_END
 #ifdef PACK_STRUCT_USE_INCLUDES
 #  include "arch/epstruct.h"
 #endif
 
+#define SIZEOF_RDNSS_OPTION_BASE 8 /* size without addresses */
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/include/lwip/prot/tcp.h b/src/include/lwip/prot/tcp.h
index 67fe7b9..c1d7de1 100644
--- a/src/include/lwip/prot/tcp.h
+++ b/src/include/lwip/prot/tcp.h
@@ -80,8 +80,11 @@
 /* Valid TCP header flags */
 #define TCP_FLAGS 0x3fU
 
+#define TCP_MAX_OPTION_BYTES 40
+
 #define TCPH_HDRLEN(phdr) ((u16_t)(lwip_ntohs((phdr)->_hdrlen_rsvd_flags) >> 12))
-#define TCPH_FLAGS(phdr)  ((u16_t)(lwip_ntohs((phdr)->_hdrlen_rsvd_flags) & TCP_FLAGS))
+#define TCPH_HDRLEN_BYTES(phdr) ((u8_t)(TCPH_HDRLEN(phdr) << 2))
+#define TCPH_FLAGS(phdr)  ((u8_t)((lwip_ntohs((phdr)->_hdrlen_rsvd_flags) & TCP_FLAGS)))
 
 #define TCPH_HDRLEN_SET(phdr, len) (phdr)->_hdrlen_rsvd_flags = lwip_htons(((len) << 12) | TCPH_FLAGS(phdr))
 #define TCPH_FLAGS_SET(phdr, flags) (phdr)->_hdrlen_rsvd_flags = (((phdr)->_hdrlen_rsvd_flags & PP_HTONS(~TCP_FLAGS)) | lwip_htons(flags))
diff --git a/src/include/lwip/raw.h b/src/include/lwip/raw.h
index 30aa147..b129bd3 100644
--- a/src/include/lwip/raw.h
+++ b/src/include/lwip/raw.h
@@ -52,6 +52,10 @@
 extern "C" {
 #endif
 
+#define RAW_FLAGS_CONNECTED      0x01U
+#define RAW_FLAGS_HDRINCL        0x02U
+#define RAW_FLAGS_MULTICAST_LOOP 0x04U
+
 struct raw_pcb;
 
 /** Function prototype for raw pcb receive callback functions.
@@ -75,6 +79,14 @@
   struct raw_pcb *next;
 
   u8_t protocol;
+  u8_t flags;
+
+#if LWIP_MULTICAST_TX_OPTIONS
+  /** outgoing network interface for multicast packets, by interface index (if nonzero) */
+  u8_t mcast_ifindex;
+  /** TTL for outgoing multicast packets */
+  u8_t mcast_ttl;
+#endif /* LWIP_MULTICAST_TX_OPTIONS */
 
   /** receive callback function */
   raw_recv_fn recv;
@@ -93,22 +105,35 @@
 struct raw_pcb * raw_new_ip_type(u8_t type, u8_t proto);
 void             raw_remove     (struct raw_pcb *pcb);
 err_t            raw_bind       (struct raw_pcb *pcb, const ip_addr_t *ipaddr);
+void             raw_bind_netif (struct raw_pcb *pcb, const struct netif *netif);
 err_t            raw_connect    (struct raw_pcb *pcb, const ip_addr_t *ipaddr);
+void             raw_disconnect (struct raw_pcb *pcb);
 
 err_t            raw_sendto     (struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr);
+err_t            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);
 err_t            raw_send       (struct raw_pcb *pcb, struct pbuf *p);
 
 void             raw_recv       (struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg);
 
-/* The following functions are the lower layer interface to RAW. */
-u8_t             raw_input      (struct pbuf *p, struct netif *inp);
-#define raw_init() /* Compatibility define, no init needed. */
+#define          raw_flags(pcb) ((pcb)->flags)
+#define          raw_setflags(pcb,f)  ((pcb)->flags = (f))
 
-void raw_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr);
+#define          raw_set_flags(pcb, set_flags)     do { (pcb)->flags = (u8_t)((pcb)->flags |  (set_flags)); } while(0)
+#define          raw_clear_flags(pcb, clr_flags)   do { (pcb)->flags = (u8_t)((pcb)->flags & (u8_t)(~(clr_flags) & 0xff)); } while(0)
+#define          raw_is_flag_set(pcb, flag)        (((pcb)->flags & (flag)) != 0)
+
+#define raw_init() /* Compatibility define, no init needed. */
 
 /* for compatibility with older implementation */
 #define raw_new_ip6(proto) raw_new_ip_type(IPADDR_TYPE_V6, proto)
 
+#if LWIP_MULTICAST_TX_OPTIONS
+#define raw_set_multicast_netif_index(pcb, idx) ((pcb)->mcast_ifindex = (idx))
+#define raw_get_multicast_netif_index(pcb)      ((pcb)->mcast_ifindex)
+#define raw_set_multicast_ttl(pcb, value)       ((pcb)->mcast_ttl = (value))
+#define raw_get_multicast_ttl(pcb)              ((pcb)->mcast_ttl)
+#endif /* LWIP_MULTICAST_TX_OPTIONS */
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/include/lwip/sockets.h b/src/include/lwip/sockets.h
index 2522056..d70d36c 100644
--- a/src/include/lwip/sockets.h
+++ b/src/include/lwip/sockets.h
@@ -44,10 +44,13 @@
 #if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */
 
 #include "lwip/ip_addr.h"
+#include "lwip/netif.h"
 #include "lwip/err.h"
 #include "lwip/inet.h"
 #include "lwip/errno.h"
 
+#include <string.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -108,39 +111,11 @@
 typedef u32_t socklen_t;
 #endif
 
-struct lwip_sock;
-
-#if !LWIP_TCPIP_CORE_LOCKING
-/** Maximum optlen used by setsockopt/getsockopt */
-#define LWIP_SETGETSOCKOPT_MAXOPTLEN 16
-
-/** This struct is used to pass data to the set/getsockopt_internal
- * functions running in tcpip_thread context (only a void* is allowed) */
-struct lwip_setgetsockopt_data {
-  /** socket index for which to change options */
-  int s;
-  /** level of the option to process */
-  int level;
-  /** name of the option to process */
-  int optname;
-  /** set: value to set the option to
-    * get: value of the option is stored here */
-#if LWIP_MPU_COMPATIBLE
-  u8_t optval[LWIP_SETGETSOCKOPT_MAXOPTLEN];
-#else
-  union {
-     void *p;
-     const void *pc;
-  } optval;
-#endif
-  /** size of *optval */
-  socklen_t optlen;
-  /** if an error occurs, it is temporarily stored here */
-  err_t err;
-  /** semaphore to wake up the calling task */
-  void* completed_sem;
-};
-#endif /* !LWIP_TCPIP_CORE_LOCKING */
+#if !defined IOV_MAX
+#define IOV_MAX 0xFFFF
+#elif IOV_MAX > 0xFFFF
+#error "IOV_MAX larger than supported by LwIP"
+#endif /* IOV_MAX */
 
 #if !defined(iovec)
 struct iovec {
@@ -159,6 +134,56 @@
   int           msg_flags;
 };
 
+/* struct msghdr->msg_flags bit field values */
+#define MSG_TRUNC   0x04
+#define MSG_CTRUNC  0x08
+
+/* RFC 3542, Section 20: Ancillary Data */
+struct cmsghdr {
+  socklen_t  cmsg_len;   /* number of bytes, including header */
+  int        cmsg_level; /* originating protocol */
+  int        cmsg_type;  /* protocol-specific type */
+};
+/* Data section follows header and possible padding, typically referred to as
+      unsigned char cmsg_data[]; */
+
+/* cmsg header/data alignment. NOTE: we align to native word size (double word
+size on 16-bit arch) so structures are not placed at an unaligned address.
+16-bit arch needs double word to ensure 32-bit alignment because socklen_t
+could be 32 bits. If we ever have cmsg data with a 64-bit variable, alignment
+will need to increase long long */
+#define ALIGN_H(size) (((size) + sizeof(long) - 1U) & ~(sizeof(long)-1U))
+#define ALIGN_D(size) ALIGN_H(size)
+
+#define CMSG_FIRSTHDR(mhdr) \
+          ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \
+           (struct cmsghdr *)(mhdr)->msg_control : \
+           (struct cmsghdr *)NULL)
+
+#define CMSG_NXTHDR(mhdr, cmsg) \
+        (((cmsg) == NULL) ? CMSG_FIRSTHDR(mhdr) : \
+         (((u8_t *)(cmsg) + ALIGN_H((cmsg)->cmsg_len) \
+                            + ALIGN_D(sizeof(struct cmsghdr)) > \
+           (u8_t *)((mhdr)->msg_control) + (mhdr)->msg_controllen) ? \
+          (struct cmsghdr *)NULL : \
+          (struct cmsghdr *)((void*)((u8_t *)(cmsg) + \
+                                      ALIGN_H((cmsg)->cmsg_len)))))
+
+#define CMSG_DATA(cmsg) ((void*)((u8_t *)(cmsg) + \
+                         ALIGN_D(sizeof(struct cmsghdr))))
+
+#define CMSG_SPACE(length) (ALIGN_D(sizeof(struct cmsghdr)) + \
+                            ALIGN_H(length))
+
+#define CMSG_LEN(length) (ALIGN_D(sizeof(struct cmsghdr)) + \
+                           length)
+
+/* Set socket options argument */
+#define IFNAMSIZ NETIF_NAMESIZE
+struct ifreq {
+  char ifr_name[IFNAMSIZ]; /* Interface name */
+};
+
 /* Socket protocol types (TCP/UDP/RAW) */
 #define SOCK_STREAM     1
 #define SOCK_DGRAM      2
@@ -175,32 +200,32 @@
 /*
  * Additional options, not kept in so_options.
  */
-#define SO_DEBUG       0x0001 /* Unimplemented: turn on debugging info recording */
-#define SO_ACCEPTCONN  0x0002 /* socket has had listen() */
-#define SO_DONTROUTE   0x0010 /* Unimplemented: just use interface addresses */
-#define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */
-#define SO_LINGER      0x0080 /* linger on close if data present */
-#define SO_DONTLINGER  ((int)(~SO_LINGER))
-#define SO_OOBINLINE   0x0100 /* Unimplemented: leave received OOB data in line */
-#define SO_REUSEPORT   0x0200 /* Unimplemented: allow local address & port reuse */
-#define SO_SNDBUF      0x1001 /* Unimplemented: send buffer size */
-#define SO_RCVBUF      0x1002 /* receive buffer size */
-#define SO_SNDLOWAT    0x1003 /* Unimplemented: send low-water mark */
-#define SO_RCVLOWAT    0x1004 /* Unimplemented: receive low-water mark */
-#define SO_SNDTIMEO    0x1005 /* send timeout */
-#define SO_RCVTIMEO    0x1006 /* receive timeout */
-#define SO_ERROR       0x1007 /* get error status and clear */
-#define SO_TYPE        0x1008 /* get socket type */
-#define SO_CONTIMEO    0x1009 /* Unimplemented: connect timeout */
-#define SO_NO_CHECK    0x100a /* don't create UDP checksum */
-
+#define SO_DEBUG        0x0001 /* Unimplemented: turn on debugging info recording */
+#define SO_ACCEPTCONN   0x0002 /* socket has had listen() */
+#define SO_DONTROUTE    0x0010 /* Unimplemented: just use interface addresses */
+#define SO_USELOOPBACK  0x0040 /* Unimplemented: bypass hardware when possible */
+#define SO_LINGER       0x0080 /* linger on close if data present */
+#define SO_DONTLINGER   ((int)(~SO_LINGER))
+#define SO_OOBINLINE    0x0100 /* Unimplemented: leave received OOB data in line */
+#define SO_REUSEPORT    0x0200 /* Unimplemented: allow local address & port reuse */
+#define SO_SNDBUF       0x1001 /* Unimplemented: send buffer size */
+#define SO_RCVBUF       0x1002 /* receive buffer size */
+#define SO_SNDLOWAT     0x1003 /* Unimplemented: send low-water mark */
+#define SO_RCVLOWAT     0x1004 /* Unimplemented: receive low-water mark */
+#define SO_SNDTIMEO     0x1005 /* send timeout */
+#define SO_RCVTIMEO     0x1006 /* receive timeout */
+#define SO_ERROR        0x1007 /* get error status and clear */
+#define SO_TYPE         0x1008 /* get socket type */
+#define SO_CONTIMEO     0x1009 /* Unimplemented: connect timeout */
+#define SO_NO_CHECK     0x100a /* don't create UDP checksum */
+#define SO_BINDTODEVICE 0x100b /* bind to device */
 
 /*
  * Structure used for manipulating linger option.
  */
 struct linger {
-       int l_onoff;                /* option on/off */
-       int l_linger;               /* linger time in seconds */
+  int l_onoff;                /* option on/off */
+  int l_linger;               /* linger time in seconds */
 };
 
 /*
@@ -237,6 +262,7 @@
 #define MSG_OOB        0x04    /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */
 #define MSG_DONTWAIT   0x08    /* Nonblocking i/o for this operation only */
 #define MSG_MORE       0x10    /* Sender will send more */
+#define MSG_NOSIGNAL   0x20    /* Uninmplemented: Requests not to send the SIGPIPE signal if an attempt to send is made on a stream-oriented socket that is no longer connected. */
 
 
 /*
@@ -244,6 +270,7 @@
  */
 #define IP_TOS             1
 #define IP_TTL             2
+#define IP_PKTINFO         8
 
 #if LWIP_TCP
 /*
@@ -295,6 +322,28 @@
 } ip_mreq;
 #endif /* LWIP_IGMP */
 
+#if LWIP_IPV4
+struct in_pktinfo {
+  unsigned int   ipi_ifindex;  /* Interface index */
+  struct in_addr ipi_addr;     /* Destination (from header) address */
+};
+#endif /* LWIP_IPV4 */
+
+#if LWIP_IPV6_MLD
+/*
+ * Options and types related to IPv6 multicast membership
+ */
+#define IPV6_JOIN_GROUP      12
+#define IPV6_ADD_MEMBERSHIP  IPV6_JOIN_GROUP
+#define IPV6_LEAVE_GROUP     13
+#define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
+
+typedef struct ipv6_mreq {
+  struct in6_addr ipv6mr_multiaddr; /*  IPv6 multicast addr */
+  unsigned int    ipv6mr_interface; /*  interface index, or 0 */
+} ipv6_mreq;
+#endif /* LWIP_IPV6_MLD */
+
 /*
  * The Type of Service provides an indication of the abstract
  * parameters of the quality of service desired.  These parameters are
@@ -358,11 +407,11 @@
 #define IOC_INOUT       (IOC_IN|IOC_OUT)
                                         /* 0x20000000 distinguishes new &
                                            old ioctl's */
-#define _IO(x,y)        (IOC_VOID|((x)<<8)|(y))
+#define _IO(x,y)        ((long)(IOC_VOID|((x)<<8)|(y)))
 
-#define _IOR(x,y,t)     (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
+#define _IOR(x,y,t)     ((long)(IOC_OUT|((sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)))
 
-#define _IOW(x,y,t)     (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
+#define _IOW(x,y,t)     ((long)(IOC_IN|((sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)))
 #endif /* !defined(FIONREAD) || !defined(FIONBIO) */
 
 #ifndef FIONREAD
@@ -395,7 +444,16 @@
 #define O_NONBLOCK  1 /* nonblocking I/O */
 #endif
 #ifndef O_NDELAY
-#define O_NDELAY    1 /* same as O_NONBLOCK, for compatibility */
+#define O_NDELAY    O_NONBLOCK /* same as O_NONBLOCK, for compatibility */
+#endif
+#ifndef O_RDONLY
+#define O_RDONLY    2
+#endif
+#ifndef O_WRONLY
+#define O_WRONLY    4
+#endif
+#ifndef O_RDWR
+#define O_RDWR      (O_RDONLY|O_WRONLY)
 #endif
 
 #ifndef SHUT_RD
@@ -409,13 +467,14 @@
 #undef  FD_SETSIZE
 /* Make FD_SETSIZE match NUM_SOCKETS in socket.c */
 #define FD_SETSIZE    MEMP_NUM_NETCONN
+#define LWIP_SELECT_MAXNFDS (FD_SETSIZE + LWIP_SOCKET_OFFSET)
 #define FDSETSAFESET(n, code) do { \
   if (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0)) { \
   code; }} while(0)
 #define FDSETSAFEGET(n, code) (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0) ?\
   (code) : 0)
-#define FD_SET(n, p)  FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] |=  (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
-#define FD_CLR(n, p)  FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] &= ~(1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
+#define FD_SET(n, p)  FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] = (u8_t)((p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] |  (1 << (((n)-LWIP_SOCKET_OFFSET) & 7))))
+#define FD_CLR(n, p)  FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] = (u8_t)((p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] & ~(1 << (((n)-LWIP_SOCKET_OFFSET) & 7))))
 #define FD_ISSET(n,p) FDSETSAFEGET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] &   (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
 #define FD_ZERO(p)    memset((void*)(p), 0, sizeof(*(p)))
 
@@ -424,12 +483,35 @@
   unsigned char fd_bits [(FD_SETSIZE+7)/8];
 } fd_set;
 
-#elif LWIP_SOCKET_OFFSET
-#error LWIP_SOCKET_OFFSET does not work with external FD_SET!
-#elif FD_SETSIZE < MEMP_NUM_NETCONN
+#elif FD_SETSIZE < (LWIP_SOCKET_OFFSET + MEMP_NUM_NETCONN)
 #error "external FD_SETSIZE too small for number of sockets"
+#else
+#define LWIP_SELECT_MAXNFDS FD_SETSIZE
 #endif /* FD_SET */
 
+/* poll-related defines and types */
+/* @todo: find a better way to guard the definition of these defines and types if already defined */
+#if !defined(POLLIN) && !defined(POLLOUT)
+#define POLLIN     0x1
+#define POLLOUT    0x2
+#define POLLERR    0x4
+#define POLLNVAL   0x8
+/* Below values are unimplemented */
+#define POLLRDNORM 0x10
+#define POLLRDBAND 0x20
+#define POLLPRI    0x40
+#define POLLWRNORM 0x80
+#define POLLWRBAND 0x100
+#define POLLHUP    0x200
+typedef unsigned int nfds_t;
+struct pollfd
+{
+  int fd;
+  short events;
+  short revents;
+};
+#endif
+
 /** LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided
  * by your system, set this to 0 and include <sys/time.h> in cc.h */
 #ifndef LWIP_TIMEVAL_PRIVATE
@@ -460,23 +542,34 @@
 #define lwip_connect      connect
 #define lwip_listen       listen
 #define lwip_recv         recv
+#define lwip_recvmsg      recvmsg
 #define lwip_recvfrom     recvfrom
 #define lwip_send         send
 #define lwip_sendmsg      sendmsg
 #define lwip_sendto       sendto
 #define lwip_socket       socket
+#if LWIP_SOCKET_SELECT
 #define lwip_select       select
-#define lwip_ioctlsocket  ioctl
+#endif
+#if LWIP_SOCKET_POLL
+#define lwip_poll         poll
+#endif
+#define lwip_ioctl        ioctlsocket
+#define lwip_inet_ntop    inet_ntop
+#define lwip_inet_pton    inet_pton
 
 #if LWIP_POSIX_SOCKETS_IO_NAMES
 #define lwip_read         read
+#define lwip_readv        readv
 #define lwip_write        write
 #define lwip_writev       writev
 #undef lwip_close
 #define lwip_close        close
 #define closesocket(s)    close(s)
-#define lwip_fcntl        fcntl
+int fcntl(int s, int cmd, ...);
+#undef lwip_ioctl
 #define lwip_ioctl        ioctl
+#define ioctlsocket       ioctl
 #endif /* LWIP_POSIX_SOCKETS_IO_NAMES */
 #endif /* LWIP_COMPAT_SOCKETS == 2 */
 
@@ -487,24 +580,33 @@
 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_close(int s);
 int lwip_connect(int s, const struct sockaddr *name, socklen_t namelen);
 int lwip_listen(int s, int backlog);
-int lwip_recv(int s, void *mem, size_t len, int flags);
-int lwip_read(int s, void *mem, size_t len);
-int lwip_recvfrom(int s, void *mem, size_t len, int flags,
+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);
-int lwip_send(int s, const void *dataptr, size_t size, int flags);
-int lwip_sendmsg(int s, const struct msghdr *message, int flags);
-int lwip_sendto(int s, const void *dataptr, size_t size, int flags,
+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);
-int lwip_write(int s, const void *dataptr, size_t size);
-int lwip_writev(int s, const struct iovec *iov, int iovcnt);
+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);
 
 #if LWIP_COMPAT_SOCKETS
 #if LWIP_COMPAT_SOCKETS != 2
@@ -531,6 +633,8 @@
 /** @ingroup socket */
 #define recv(s,mem,len,flags)                     lwip_recv(s,mem,len,flags)
 /** @ingroup socket */
+#define recvmsg(s,message,flags)                  lwip_recvmsg(s,message,flags)
+/** @ingroup socket */
 #define recvfrom(s,mem,len,flags,from,fromlen)    lwip_recvfrom(s,mem,len,flags,from,fromlen)
 /** @ingroup socket */
 #define send(s,dataptr,size,flags)                lwip_send(s,dataptr,size,flags)
@@ -540,15 +644,27 @@
 #define sendto(s,dataptr,size,flags,to,tolen)     lwip_sendto(s,dataptr,size,flags,to,tolen)
 /** @ingroup socket */
 #define socket(domain,type,protocol)              lwip_socket(domain,type,protocol)
+#if LWIP_SOCKET_SELECT
 /** @ingroup socket */
 #define select(maxfdp1,readset,writeset,exceptset,timeout)     lwip_select(maxfdp1,readset,writeset,exceptset,timeout)
+#endif
+#if LWIP_SOCKET_POLL
+/** @ingroup socket */
+#define poll(fds,nfds,timeout)                    lwip_poll(fds,nfds,timeout)
+#endif
 /** @ingroup socket */
 #define ioctlsocket(s,cmd,argp)                   lwip_ioctl(s,cmd,argp)
+/** @ingroup socket */
+#define inet_ntop(af,src,dst,size)                lwip_inet_ntop(af,src,dst,size)
+/** @ingroup socket */
+#define inet_pton(af,src,dst)                     lwip_inet_pton(af,src,dst)
 
 #if LWIP_POSIX_SOCKETS_IO_NAMES
 /** @ingroup socket */
 #define read(s,mem,len)                           lwip_read(s,mem,len)
 /** @ingroup socket */
+#define readv(s,iov,iovcnt)                       lwip_readv(s,iov,iovcnt)
+/** @ingroup socket */
 #define write(s,dataptr,len)                      lwip_write(s,dataptr,len)
 /** @ingroup socket */
 #define writev(s,iov,iovcnt)                      lwip_writev(s,iov,iovcnt)
@@ -561,27 +677,6 @@
 #endif /* LWIP_POSIX_SOCKETS_IO_NAMES */
 #endif /* LWIP_COMPAT_SOCKETS != 2 */
 
-#if LWIP_IPV4 && LWIP_IPV6
-/** @ingroup socket */
-#define inet_ntop(af,src,dst,size) \
-    (((af) == AF_INET6) ? ip6addr_ntoa_r((const ip6_addr_t*)(src),(dst),(size)) \
-     : (((af) == AF_INET) ? ip4addr_ntoa_r((const ip4_addr_t*)(src),(dst),(size)) : NULL))
-/** @ingroup socket */
-#define inet_pton(af,src,dst) \
-    (((af) == AF_INET6) ? ip6addr_aton((src),(ip6_addr_t*)(dst)) \
-     : (((af) == AF_INET) ? ip4addr_aton((src),(ip4_addr_t*)(dst)) : 0))
-#elif LWIP_IPV4 /* LWIP_IPV4 && LWIP_IPV6 */
-#define inet_ntop(af,src,dst,size) \
-    (((af) == AF_INET) ? ip4addr_ntoa_r((const ip4_addr_t*)(src),(dst),(size)) : NULL)
-#define inet_pton(af,src,dst) \
-    (((af) == AF_INET) ? ip4addr_aton((src),(ip4_addr_t*)(dst)) : 0)
-#else /* LWIP_IPV4 && LWIP_IPV6 */
-#define inet_ntop(af,src,dst,size) \
-    (((af) == AF_INET6) ? ip6addr_ntoa_r((const ip6_addr_t*)(src),(dst),(size)) : NULL)
-#define inet_pton(af,src,dst) \
-    (((af) == AF_INET6) ? ip6addr_aton((src),(ip6_addr_t*)(dst)) : 0)
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-
 #endif /* LWIP_COMPAT_SOCKETS */
 
 #ifdef __cplusplus
diff --git a/src/include/lwip/stats.h b/src/include/lwip/stats.h
index 5cde4a0..b570dba 100644
--- a/src/include/lwip/stats.h
+++ b/src/include/lwip/stats.h
@@ -308,7 +308,7 @@
 
 #define STATS_INC(x) ++lwip_stats.x
 #define STATS_DEC(x) --lwip_stats.x
-#define STATS_INC_USED(x, y) do { lwip_stats.x.used += y; \
+#define STATS_INC_USED(x, y, type) do { lwip_stats.x.used = (type)(lwip_stats.x.used + y); \
                                 if (lwip_stats.x.max < lwip_stats.x.used) { \
                                     lwip_stats.x.max = lwip_stats.x.used; \
                                 } \
@@ -318,7 +318,7 @@
 #define stats_init()
 #define STATS_INC(x)
 #define STATS_DEC(x)
-#define STATS_INC_USED(x)
+#define STATS_INC_USED(x, y, type)
 #endif /* LWIP_STATS */
 
 #if TCP_STATS
@@ -387,9 +387,9 @@
 
 #if MEM_STATS
 #define MEM_STATS_AVAIL(x, y) lwip_stats.mem.x = y
-#define MEM_STATS_INC(x) SYS_ARCH_INC(lwip_stats.mem.x, 1)
-#define MEM_STATS_INC_USED(x, y) SYS_ARCH_INC(lwip_stats.mem.x, y)
-#define MEM_STATS_DEC_USED(x, y) SYS_ARCH_DEC(lwip_stats.mem.x, y)
+#define MEM_STATS_INC(x) STATS_INC(mem.x)
+#define MEM_STATS_INC_USED(x, y) STATS_INC_USED(mem, y, mem_size_t)
+#define MEM_STATS_DEC_USED(x, y) lwip_stats.mem.x = (mem_size_t)((lwip_stats.mem.x) - (y))
 #define MEM_STATS_DISPLAY() stats_display_mem(&lwip_stats.mem, "HEAP")
 #else
 #define MEM_STATS_AVAIL(x, y)
@@ -412,7 +412,7 @@
 #if SYS_STATS
 #define SYS_STATS_INC(x) STATS_INC(sys.x)
 #define SYS_STATS_DEC(x) STATS_DEC(sys.x)
-#define SYS_STATS_INC_USED(x) STATS_INC_USED(sys.x, 1)
+#define SYS_STATS_INC_USED(x) STATS_INC_USED(sys.x, 1, STAT_COUNTER)
 #define SYS_STATS_DISPLAY() stats_display_sys(&lwip_stats.sys)
 #else
 #define SYS_STATS_INC(x)
diff --git a/src/include/lwip/sys.h b/src/include/lwip/sys.h
index d12bae0..168e465 100644
--- a/src/include/lwip/sys.h
+++ b/src/include/lwip/sys.h
@@ -125,39 +125,51 @@
  * Create a new mutex.
  * Note that mutexes are expected to not be taken recursively by the lwIP code,
  * so both implementation types (recursive or non-recursive) should work.
+ * The mutex is allocated to the memory that 'mutex'
+ * points to (which can be both a pointer or the actual OS structure).
+ * 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
  */
 err_t sys_mutex_new(sys_mutex_t *mutex);
 /**
  * @ingroup sys_mutex
- * Lock a mutex
+ * Blocks the thread until the mutex can be grabbed.
  * @param mutex the mutex to lock
  */
 void sys_mutex_lock(sys_mutex_t *mutex);
 /**
  * @ingroup sys_mutex
- * Unlock a mutex
+ * Releases the mutex previously locked through 'sys_mutex_lock()'.
  * @param mutex the mutex to unlock
  */
 void sys_mutex_unlock(sys_mutex_t *mutex);
 /**
  * @ingroup sys_mutex
- * Delete a semaphore
+ * Deallocates a mutex.
  * @param mutex the mutex to delete
  */
 void sys_mutex_free(sys_mutex_t *mutex);
 #ifndef sys_mutex_valid
 /**
  * @ingroup sys_mutex
- * Check if a mutex is valid/allocated: return 1 for valid, 0 for invalid
+ * Returns 1 if the mutes is valid, 0 if it is not valid.
+ * When using pointers, a simple way is to check the pointer for != NULL.
+ * When directly using OS structures, implementing this may be more complex.
+ * This may also be a define, in which case the function is not prototyped.
  */
 int sys_mutex_valid(sys_mutex_t *mutex);
 #endif
 #ifndef sys_mutex_set_invalid
 /**
  * @ingroup sys_mutex
- * Set a mutex invalid so that sys_mutex_valid returns 0
+ * Invalidate a mutex so that sys_mutex_valid() returns 0.
+ * ATTENTION: This does NOT mean that the mutex shall be deallocated:
+ * sys_mutex_free() is always called before calling this function!
+ * This may also be a define, in which case the function is not prototyped.
  */
 void sys_mutex_set_invalid(sys_mutex_t *mutex);
 #endif
@@ -168,6 +180,14 @@
 /**
  * @ingroup sys_sem
  * Create a new semaphore
+ * Creates a new semaphore. The semaphore is allocated to the memory that 'sem'
+ * points to (which can be both a pointer or the actual OS structure).
+ * The "count" argument specifies the initial state of the semaphore (which is
+ * either 0 or 1).
+ * If the semaphore 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 sem pointer to the semaphore to create
  * @param count initial count of the semaphore
  * @return ERR_OK if successful, another err_t otherwise
@@ -181,16 +201,25 @@
 void sys_sem_signal(sys_sem_t *sem);
 /**
  * @ingroup sys_sem
- * Wait for a semaphore for the specified timeout
+ *  Blocks the thread while waiting for the semaphore to be signaled. If the
+ * "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 time (in milliseconds) waited for the semaphore
- *         or SYS_ARCH_TIMEOUT on timeout
+ * @return SYS_ARCH_TIMEOUT on timeout, any other value on success
  */
 u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout);
 /**
  * @ingroup sys_sem
- * Delete a semaphore
+ * Deallocates a semaphore.
  * @param sem semaphore to delete
  */
 void sys_sem_free(sys_sem_t *sem);
@@ -199,14 +228,20 @@
 #ifndef sys_sem_valid
 /**
  * @ingroup sys_sem
- * Check if a semaphore is valid/allocated: return 1 for valid, 0 for invalid
+ * Returns 1 if the semaphore is valid, 0 if it is not valid.
+ * When using pointers, a simple way is to check the pointer for != NULL.
+ * When directly using OS structures, implementing this may be more complex.
+ * This may also be a define, in which case the function is not prototyped.
  */
 int sys_sem_valid(sys_sem_t *sem);
 #endif
 #ifndef sys_sem_set_invalid
 /**
  * @ingroup sys_sem
- * Set a semaphore invalid so that sys_sem_valid returns 0
+ * Invalidate a semaphore so that sys_sem_valid() returns 0.
+ * ATTENTION: This does NOT mean that the semaphore shall be deallocated:
+ * sys_sem_free() is always called before calling this function!
+ * This may also be a define, in which case the function is not prototyped.
  */
 void sys_sem_set_invalid(sys_sem_t *sem);
 #endif
@@ -235,7 +270,14 @@
 
 /**
  * @ingroup sys_mbox
- * Create a new mbox of specified size
+ * Creates an empty mailbox for maximum "size" elements. Elements stored
+ * in mailboxes are pointers. You have to define macros "_MBOX_SIZE"
+ * in your lwipopts.h, or ignore this parameter in your implementation
+ * and use a default size.
+ * 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
@@ -244,34 +286,67 @@
 /**
  * @ingroup sys_mbox
  * Post a message to an mbox - may not fail
- * -> blocks if full, only used from tasks not from ISR
+ * -> 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)
  */
 void sys_mbox_post(sys_mbox_t *mbox, void *msg);
 /**
  * @ingroup sys_mbox
- * Try to post a message to an mbox - may fail if full or ISR
+ * 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)
  */
 err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg);
 /**
  * @ingroup sys_mbox
- * Wait for a new message to arrive in the mbox
+ * 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)
+ */
+err_t sys_mbox_trypost_fromisr(sys_mbox_t *mbox, void *msg);
+/**
+ * @ingroup sys_mbox
+ * Blocks the thread until a message arrives in the mailbox, but does
+ * not block the thread longer than "timeout" milliseconds (similar to
+ * the sys_arch_sem_wait() function). If "timeout" is 0, the thread should
+ * be blocked until a message arrives. The "msg" argument is a result
+ * parameter that is set by the function (i.e., by doing "*msg =
+ * ptr"). The "msg" parameter maybe NULL to indicate that the message
+ * should be dropped.
+ * 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. 
+ * 
  * @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)
- * @return time (in milliseconds) waited for a message, may be 0 if not waited
-           or SYS_ARCH_TIMEOUT on timeout
- *         The returned time has to be accurate to prevent timer jitter!
+ * @return SYS_ARCH_TIMEOUT on timeout, any other value if a message has been received
  */
 u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout);
 /* Allow port to override with a macro, e.g. special timeout for sys_arch_mbox_fetch() */
 #ifndef sys_arch_mbox_tryfetch
 /**
  * @ingroup sys_mbox
- * Wait for a new message to arrive in the mbox
+ * This is similar to sys_arch_mbox_fetch, however if a message is not
+ * present in the mailbox, it immediately returns with the code
+ * SYS_MBOX_EMPTY. On success 0 is returned.
+ * To allow for efficient implementations, this can be defined as a
+ * function-like macro in sys_arch.h instead of a normal function. For
+ * 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
@@ -285,7 +360,10 @@
 #define sys_mbox_tryfetch(mbox, msg) sys_arch_mbox_tryfetch(mbox, msg)
 /**
  * @ingroup sys_mbox
- * Delete an mbox
+ * 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);
@@ -293,14 +371,20 @@
 #ifndef sys_mbox_valid
 /**
  * @ingroup sys_mbox
- * Check if an mbox is valid/allocated: return 1 for valid, 0 for invalid
+ * Returns 1 if the mailbox is valid, 0 if it is not valid.
+ * When using pointers, a simple way is to check the pointer for != NULL.
+ * When directly using OS structures, implementing this may be more complex.
+ * This may also be a define, in which case the function is not prototyped.
  */
 int sys_mbox_valid(sys_mbox_t *mbox);
 #endif
 #ifndef sys_mbox_set_invalid
 /**
  * @ingroup sys_mbox
- * Set an mbox invalid so that sys_mbox_valid returns 0
+ * Invalidate a mailbox so that sys_mbox_valid() returns 0.
+ * ATTENTION: This does NOT mean that the mailbox shall be deallocated:
+ * sys_mbox_free() is always called before calling this function!
+ * This may also be a define, in which case the function is not prototyped.
  */
 void sys_mbox_set_invalid(sys_mbox_t *mbox);
 #endif
@@ -321,8 +405,13 @@
 /**
  * @ingroup sys_misc
  * The only thread function:
- * Creates a new thread
+ * Starts a new thread named "name" with priority "prio" that will begin its
+ * execution in the function "thread()". The "arg" argument will be passed as an
+ * argument to the thread() function. The stack size to used for this thread is
+ * 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'
@@ -332,7 +421,11 @@
 
 #endif /* NO_SYS */
 
-/* sys_init() must be called before anything else. */
+/**
+ * @ingroup sys_misc
+ * sys_init() must be called before anything else.
+ * Initialize the sys_arch layer.
+ */
 void sys_init(void);
 
 #ifndef sys_jiffies
@@ -346,6 +439,9 @@
  * @ingroup sys_time
  * Returns the current time in milliseconds,
  * may be the same as sys_jiffies or at least based on it.
+ * Don't care for wraparound, this is only used for time diffs.
+ * Not implementing this function means you cannot use some modules (e.g. TCP
+ * timestamps, internal timeouts for NO_SYS==1).
  */
 u32_t sys_now(void);
 
@@ -447,6 +543,15 @@
                               } while(0)
 #endif /* SYS_ARCH_SET */
 
+#ifndef SYS_ARCH_LOCKED
+#define SYS_ARCH_LOCKED(code) do { \
+                                SYS_ARCH_DECL_PROTECT(old_level); \
+                                SYS_ARCH_PROTECT(old_level); \
+                                code; \
+                                SYS_ARCH_UNPROTECT(old_level); \
+                              } while(0)
+#endif /* SYS_ARCH_LOCKED */
+
 
 #ifdef __cplusplus
 }
diff --git a/src/include/lwip/tcp.h b/src/include/lwip/tcp.h
index 34d1c10..daf7599 100644
--- a/src/include/lwip/tcp.h
+++ b/src/include/lwip/tcp.h
@@ -42,6 +42,7 @@
 
 #if LWIP_TCP /* don't build if not configured for use in lwipopts.h */
 
+#include "lwip/tcpbase.h"
 #include "lwip/mem.h"
 #include "lwip/pbuf.h"
 #include "lwip/ip.h"
@@ -55,6 +56,7 @@
 #endif
 
 struct tcp_pcb;
+struct tcp_pcb_listen;
 
 /** Function prototype for tcp accept callback functions. Called when a new
  * connection can be accepted on a listening pcb.
@@ -136,34 +138,73 @@
 #define SND_WND_SCALE(pcb, wnd) (((wnd) << (pcb)->snd_scale))
 #define TCPWND16(x)             ((u16_t)LWIP_MIN((x), 0xFFFF))
 #define TCP_WND_MAX(pcb)        ((tcpwnd_size_t)(((pcb)->flags & TF_WND_SCALE) ? TCP_WND : TCPWND16(TCP_WND)))
-typedef u32_t tcpwnd_size_t;
 #else
 #define RCV_WND_SCALE(pcb, wnd) (wnd)
 #define SND_WND_SCALE(pcb, wnd) (wnd)
 #define TCPWND16(x)             (x)
 #define TCP_WND_MAX(pcb)        TCP_WND
-typedef u16_t tcpwnd_size_t;
 #endif
+/* Increments a tcpwnd_size_t and holds at max value rather than rollover */
+#define TCP_WND_INC(wnd, inc)   do { \
+                                  if ((tcpwnd_size_t)(wnd + inc) >= wnd) { \
+                                    wnd = (tcpwnd_size_t)(wnd + inc); \
+                                  } else { \
+                                    wnd = (tcpwnd_size_t)-1; \
+                                  } \
+                                } while(0)
 
-#if LWIP_WND_SCALE || TCP_LISTEN_BACKLOG || LWIP_TCP_TIMESTAMPS
-typedef u16_t tcpflags_t;
-#else
-typedef u8_t tcpflags_t;
-#endif
-
-enum tcp_state {
-  CLOSED      = 0,
-  LISTEN      = 1,
-  SYN_SENT    = 2,
-  SYN_RCVD    = 3,
-  ESTABLISHED = 4,
-  FIN_WAIT_1  = 5,
-  FIN_WAIT_2  = 6,
-  CLOSE_WAIT  = 7,
-  CLOSING     = 8,
-  LAST_ACK    = 9,
-  TIME_WAIT   = 10
+#if LWIP_TCP_SACK_OUT
+/** SACK ranges to include in ACK packets.
+ * SACK entry is invalid if left==right. */
+struct tcp_sack_range {
+  /** Left edge of the SACK: the first acknowledged sequence number. */
+  u32_t left;
+  /** Right edge of the SACK: the last acknowledged sequence number +1 (so first NOT acknowledged). */
+  u32_t right;
 };
+#endif /* LWIP_TCP_SACK_OUT */
+
+/** Function prototype for deallocation of arguments. Called *just before* the
+ * pcb is freed, so don't expect to be able to do anything with this pcb!
+ *
+ * @param id ext arg id (allocated via @ref tcp_ext_arg_alloc_id)
+ * @param data pointer to the data (set via @ref tcp_ext_arg_set before)
+ */
+typedef void (*tcp_extarg_callback_pcb_destroyed_fn)(u8_t id, void *data);
+
+/** Function prototype to transition arguments from a listening pcb to an accepted pcb
+ *
+ * @param id ext arg id (allocated via @ref tcp_ext_arg_alloc_id)
+ * @param lpcb the listening pcb accepting a connection
+ * @param cpcb the newly allocated connection pcb
+ * @return ERR_OK if OK, any error if connection should be dropped
+ */
+typedef err_t (*tcp_extarg_callback_passive_open_fn)(u8_t id, struct tcp_pcb_listen *lpcb, struct tcp_pcb *cpcb);
+
+/** A table of callback functions that is invoked for ext arguments */
+struct tcp_ext_arg_callbacks {
+  /** @ref tcp_extarg_callback_pcb_destroyed_fn */
+  tcp_extarg_callback_pcb_destroyed_fn destroy;
+  /** @ref tcp_extarg_callback_passive_open_fn */
+  tcp_extarg_callback_passive_open_fn passive_open;
+};
+
+#define LWIP_TCP_PCB_NUM_EXT_ARG_ID_INVALID 0xFF
+
+#if LWIP_TCP_PCB_NUM_EXT_ARGS
+/* This is the structure for ext args in tcp pcbs (used as array) */
+struct tcp_pcb_ext_args {
+  const struct tcp_ext_arg_callbacks *callbacks;
+  void *data;
+};
+/* This is a helper define to prevent zero size arrays if disabled */
+#define TCP_PCB_EXTARGS struct tcp_pcb_ext_args ext_args[LWIP_TCP_PCB_NUM_EXT_ARGS];
+#else
+#define TCP_PCB_EXTARGS
+#endif
+
+typedef u16_t tcpflags_t;
+#define TCP_ALLFLAGS 0xffffU
 
 /**
  * members common to struct tcp_pcb and struct tcp_listen_pcb
@@ -171,6 +212,7 @@
 #define TCP_PCB_COMMON(type) \
   type *next; /* for the linked list */ \
   void *callback_arg; \
+  TCP_PCB_EXTARGS \
   enum tcp_state state; /* TCP state */ \
   u8_t prio; \
   /* ports are in host byte order */ \
@@ -224,6 +266,10 @@
 #if LWIP_TCP_TIMESTAMPS
 #define TF_TIMESTAMP   0x0400U   /* Timestamp option enabled */
 #endif
+#define TF_RTO         0x0800U /* RTO timer has fired, in-flight data moved to unsent and being retransmitted */
+#if LWIP_TCP_SACK_OUT
+#define TF_SACK        0x1000U /* Selective ACKs enabled */
+#endif
 
   /* the rest of the fields are in host byte order
      as we have to do some math with them */
@@ -239,6 +285,12 @@
   tcpwnd_size_t rcv_ann_wnd; /* receiver window to announce */
   u32_t rcv_ann_right_edge; /* announced right edge of window */
 
+#if LWIP_TCP_SACK_OUT
+  /* SACK ranges to include in ACK packets (entry is invalid if left==right) */
+  struct tcp_sack_range rcv_sacks[LWIP_TCP_MAX_SACK_NUM];
+#define LWIP_TCP_SACK_VALID(pcb, idx) ((pcb)->rcv_sacks[idx].left != (pcb)->rcv_sacks[idx].right)
+#endif /* LWIP_TCP_SACK_OUT */
+
   /* Retransmission timer. */
   s16_t rtime;
 
@@ -247,9 +299,9 @@
   /* RTT (round trip time) estimation variables */
   u32_t rttest; /* RTT estimate in 500ms ticks */
   u32_t rtseq;  /* sequence number being timed */
-  s16_t sa, sv; /* @todo document this */
+  s16_t sa, sv; /* @see "Congestion Avoidance and Control" by Van Jacobson and Karels */
 
-  s16_t rto;    /* retransmission time-out */
+  s16_t rto;    /* retransmission time-out (in ticks of TCP_SLOW_INTERVAL) */
   u8_t nrtx;    /* number of retransmissions */
 
   /* fast retransmit/recovery */
@@ -260,6 +312,9 @@
   tcpwnd_size_t cwnd;
   tcpwnd_size_t ssthresh;
 
+  /* first byte following last rto byte */
+  u32_t rto_end;
+
   /* sender variables */
   u32_t snd_nxt;   /* next new seqno to be sent */
   u32_t snd_wl1, snd_wl2; /* Sequence and acknowledgement numbers of last
@@ -277,6 +332,8 @@
   u16_t unsent_oversize;
 #endif /* TCP_OVERSIZE */
 
+  tcpwnd_size_t bytes_acked;
+
   /* These are ordered by sequence number: */
   struct tcp_seg *unsent;   /* Unsent (queued) segments. */
   struct tcp_seg *unacked;  /* Sent but unacknowledged segments. */
@@ -319,6 +376,8 @@
   u8_t persist_cnt;
   /* Persist timer back-off */
   u8_t persist_backoff;
+  /* Number of persist probes */
+  u8_t persist_probe;
 
   /* KEEPALIVE counter */
   u8_t keep_cnt_sent;
@@ -361,19 +420,26 @@
 #endif /* LWIP_CALLBACK_API */
 void             tcp_poll    (struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval);
 
+#define          tcp_set_flags(pcb, set_flags)     do { (pcb)->flags = (tcpflags_t)((pcb)->flags |  (set_flags)); } while(0)
+#define          tcp_clear_flags(pcb, clr_flags)   do { (pcb)->flags = (tcpflags_t)((pcb)->flags & (tcpflags_t)(~(clr_flags) & TCP_ALLFLAGS)); } while(0)
+#define          tcp_is_flag_set(pcb, flag)        (((pcb)->flags & (flag)) != 0)
+
 #if LWIP_TCP_TIMESTAMPS
 #define          tcp_mss(pcb)             (((pcb)->flags & TF_TIMESTAMP) ? ((pcb)->mss - 12)  : (pcb)->mss)
 #else /* LWIP_TCP_TIMESTAMPS */
+/** @ingroup tcp_raw */
 #define          tcp_mss(pcb)             ((pcb)->mss)
 #endif /* LWIP_TCP_TIMESTAMPS */
+/** @ingroup tcp_raw */
 #define          tcp_sndbuf(pcb)          (TCPWND16((pcb)->snd_buf))
+/** @ingroup tcp_raw */
 #define          tcp_sndqueuelen(pcb)     ((pcb)->snd_queuelen)
 /** @ingroup tcp_raw */
-#define          tcp_nagle_disable(pcb)   ((pcb)->flags |= TF_NODELAY)
+#define          tcp_nagle_disable(pcb)   tcp_set_flags(pcb, TF_NODELAY)
 /** @ingroup tcp_raw */
-#define          tcp_nagle_enable(pcb)    ((pcb)->flags = (tcpflags_t)((pcb)->flags & ~TF_NODELAY))
+#define          tcp_nagle_enable(pcb)    tcp_clear_flags(pcb, TF_NODELAY)
 /** @ingroup tcp_raw */
-#define          tcp_nagle_disabled(pcb)  (((pcb)->flags & TF_NODELAY) != 0)
+#define          tcp_nagle_disabled(pcb)  tcp_is_flag_set(pcb, TF_NODELAY)
 
 #if TCP_LISTEN_BACKLOG
 #define          tcp_backlog_set(pcb, new_backlog) do { \
@@ -386,11 +452,12 @@
 #define          tcp_backlog_delayed(pcb)
 #define          tcp_backlog_accepted(pcb)
 #endif /* TCP_LISTEN_BACKLOG */
-#define          tcp_accepted(pcb) /* compatibility define, not needed any more */
+#define          tcp_accepted(pcb) do { LWIP_UNUSED_ARG(pcb); } while(0) /* compatibility define, not needed any more */
 
 void             tcp_recved  (struct tcp_pcb *pcb, u16_t len);
 err_t            tcp_bind    (struct tcp_pcb *pcb, const ip_addr_t *ipaddr,
                               u16_t port);
+void             tcp_bind_netif(struct tcp_pcb *pcb, const struct netif *netif);
 err_t            tcp_connect (struct tcp_pcb *pcb, const ip_addr_t *ipaddr,
                               u16_t port, tcp_connected_fn connected);
 
@@ -403,27 +470,27 @@
 err_t            tcp_close   (struct tcp_pcb *pcb);
 err_t            tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx);
 
-/* Flags for "apiflags" parameter in tcp_write */
-#define TCP_WRITE_FLAG_COPY 0x01
-#define TCP_WRITE_FLAG_MORE 0x02
-
 err_t            tcp_write   (struct tcp_pcb *pcb, const void *dataptr, u16_t len,
                               u8_t apiflags);
 
 void             tcp_setprio (struct tcp_pcb *pcb, u8_t prio);
 
-#define TCP_PRIO_MIN    1
-#define TCP_PRIO_NORMAL 64
-#define TCP_PRIO_MAX    127
-
 err_t            tcp_output  (struct tcp_pcb *pcb);
 
+err_t            tcp_tcp_get_tcp_addrinfo(struct tcp_pcb *pcb, int local, ip_addr_t *addr, u16_t *port);
 
-const char* tcp_debug_state_str(enum tcp_state s);
+#define tcp_dbg_get_tcp_state(pcb) ((pcb)->state)
 
 /* for compatibility with older implementation */
 #define tcp_new_ip6() tcp_new_ip_type(IPADDR_TYPE_V6)
 
+#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);
+#endif
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/include/lwip/tcpbase.h b/src/include/lwip/tcpbase.h
new file mode 100644
index 0000000..0023074
--- /dev/null
+++ b/src/include/lwip/tcpbase.h
@@ -0,0 +1,88 @@
+/**
+ * @file
+ * Base TCP API definitions shared by TCP and ALTCP\n
+ * See also @ref tcp_raw
+ */
+
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Adam Dunkels <adam@sics.se>
+ *
+ */
+#ifndef LWIP_HDR_TCPBASE_H
+#define LWIP_HDR_TCPBASE_H
+
+#include "lwip/opt.h"
+
+#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if LWIP_WND_SCALE
+typedef u32_t tcpwnd_size_t;
+#else
+typedef u16_t tcpwnd_size_t;
+#endif
+
+enum tcp_state {
+  CLOSED      = 0,
+  LISTEN      = 1,
+  SYN_SENT    = 2,
+  SYN_RCVD    = 3,
+  ESTABLISHED = 4,
+  FIN_WAIT_1  = 5,
+  FIN_WAIT_2  = 6,
+  CLOSE_WAIT  = 7,
+  CLOSING     = 8,
+  LAST_ACK    = 9,
+  TIME_WAIT   = 10
+};
+/* ATTENTION: this depends on state number ordering! */
+#define TCP_STATE_IS_CLOSING(state) ((state) >= FIN_WAIT_1)
+
+/* Flags for "apiflags" parameter in tcp_write */
+#define TCP_WRITE_FLAG_COPY 0x01
+#define TCP_WRITE_FLAG_MORE 0x02
+
+#define TCP_PRIO_MIN    1
+#define TCP_PRIO_NORMAL 64
+#define TCP_PRIO_MAX    127
+
+const char* tcp_debug_state_str(enum tcp_state s);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_TCP */
+
+#endif /* LWIP_HDR_TCPBASE_H */
diff --git a/src/include/lwip/tcpip.h b/src/include/lwip/tcpip.h
index f2f6b46..0b8880a 100644
--- a/src/include/lwip/tcpip.h
+++ b/src/include/lwip/tcpip.h
@@ -52,10 +52,12 @@
 #if LWIP_TCPIP_CORE_LOCKING
 /** The global semaphore to lock the stack. */
 extern sys_mutex_t lock_tcpip_core;
+#if !defined LOCK_TCPIP_CORE || defined __DOXYGEN__
 /** Lock lwIP core mutex (needs @ref LWIP_TCPIP_CORE_LOCKING 1) */
 #define LOCK_TCPIP_CORE()     sys_mutex_lock(&lock_tcpip_core)
 /** Unlock lwIP core mutex (needs @ref LWIP_TCPIP_CORE_LOCKING 1) */
 #define UNLOCK_TCPIP_CORE()   sys_mutex_unlock(&lock_tcpip_core)
+#endif /* LOCK_TCPIP_CORE */
 #else /* LWIP_TCPIP_CORE_LOCKING */
 #define LOCK_TCPIP_CORE()
 #define UNLOCK_TCPIP_CORE()
@@ -77,16 +79,17 @@
 err_t  tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn);
 err_t  tcpip_input(struct pbuf *p, struct netif *inp);
 
-err_t  tcpip_callback_with_block(tcpip_callback_fn function, void *ctx, u8_t block);
-/**
- * @ingroup lwip_os
- * @see tcpip_callback_with_block
+err_t  tcpip_try_callback(tcpip_callback_fn function, void *ctx);
+err_t  tcpip_callback(tcpip_callback_fn function, void *ctx);
+/**  @ingroup lwip_os
+ * @deprecated use tcpip_try_callback() or tcpip_callback() instead
  */
-#define tcpip_callback(f, ctx)  tcpip_callback_with_block(f, ctx, 1)
+#define tcpip_callback_with_block(function, ctx, block) ((block != 0)? tcpip_callback(function, ctx) : tcpip_try_callback(function, ctx))
 
 struct tcpip_callback_msg* tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx);
 void   tcpip_callbackmsg_delete(struct tcpip_callback_msg* msg);
-err_t  tcpip_trycallback(struct tcpip_callback_msg* msg);
+err_t  tcpip_callbackmsg_trycallback(struct tcpip_callback_msg* msg);
+err_t  tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg* msg);
 
 /* free pbufs or heap memory from another context without blocking */
 err_t  pbuf_free_callback(struct pbuf *p);
@@ -97,6 +100,10 @@
 err_t  tcpip_untimeout(sys_timeout_handler h, void *arg);
 #endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */
 
+#ifdef TCPIP_THREAD_TEST
+int tcpip_thread_poll_one(void);
+#endif
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/include/lwip/timeouts.h b/src/include/lwip/timeouts.h
index c9b93aa..b601f9e 100644
--- a/src/include/lwip/timeouts.h
+++ b/src/include/lwip/timeouts.h
@@ -56,6 +56,11 @@
 #endif /* LWIP_DEBUG*/
 #endif
 
+/** Returned by sys_timeouts_sleeptime() to indicate there is no timer, so we
+ * can sleep forever.
+ */
+#define SYS_TIMEOUTS_SLEEPTIME_INFINITE 0xFFFFFFFF
+
 /** Function prototype for a stack-internal timer function that has to be
  * called at a defined interval */
 typedef void (* lwip_cyclic_timer_handler)(void);
@@ -71,8 +76,10 @@
 };
 
 /** This array contains all stack-internal cyclic timers. To get the number of
- * timers, use LWIP_ARRAYSIZE() */
+ * timers, use lwip_num_cyclic_timers */
 extern const struct lwip_cyclic_timer lwip_cyclic_timers[];
+/** Array size of lwip_cyclic_timers[] */
+extern const int lwip_num_cyclic_timers;
 
 #if LWIP_TIMERS
 
@@ -104,13 +111,13 @@
 
 void sys_untimeout(sys_timeout_handler handler, void *arg);
 void sys_restart_timeouts(void);
-#if NO_SYS
 void sys_check_timeouts(void);
 u32_t sys_timeouts_sleeptime(void);
-#else /* NO_SYS */
-void sys_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg);
-#endif /* NO_SYS */
 
+#if LWIP_TESTMODE
+struct sys_timeo** sys_timeouts_get_next_timeout(void);
+void lwip_cyclic_timer(void *arg);
+#endif
 
 #endif /* LWIP_TIMERS */
 
diff --git a/src/include/lwip/udp.h b/src/include/lwip/udp.h
index b929907..b1c78e5 100644
--- a/src/include/lwip/udp.h
+++ b/src/include/lwip/udp.h
@@ -91,8 +91,12 @@
   u16_t local_port, remote_port;
 
 #if LWIP_MULTICAST_TX_OPTIONS
-  /** outgoing network interface for multicast packets */
-  ip_addr_t multicast_ip;
+#if LWIP_IPV4
+  /** outgoing network interface for multicast packets, by IPv4 address (if not 'any') */
+  ip4_addr_t mcast_ip4;
+#endif /* LWIP_IPV4 */
+  /** outgoing network interface for multicast packets, by interface index (if nonzero) */
+  u8_t mcast_ifindex;
   /** TTL for outgoing multicast packets */
   u8_t mcast_ttl;
 #endif /* LWIP_MULTICAST_TX_OPTIONS */
@@ -117,6 +121,7 @@
 void             udp_remove     (struct udp_pcb *pcb);
 err_t            udp_bind       (struct udp_pcb *pcb, const ip_addr_t *ipaddr,
                                  u16_t port);
+void             udp_bind_netif (struct udp_pcb *pcb, const struct netif* netif);
 err_t            udp_connect    (struct udp_pcb *pcb, const ip_addr_t *ipaddr,
                                  u16_t port);
 void             udp_disconnect (struct udp_pcb *pcb);
@@ -150,6 +155,10 @@
 #define          udp_flags(pcb) ((pcb)->flags)
 #define          udp_setflags(pcb, f)  ((pcb)->flags = (f))
 
+#define          udp_set_flags(pcb, set_flags)     do { (pcb)->flags = (u8_t)((pcb)->flags |  (set_flags)); } while(0)
+#define          udp_clear_flags(pcb, clr_flags)   do { (pcb)->flags = (u8_t)((pcb)->flags & (u8_t)(~(clr_flags) & 0xff)); } while(0)
+#define          udp_is_flag_set(pcb, flag)        (((pcb)->flags & (flag)) != 0)
+
 /* The following functions are the lower layer interface to UDP. */
 void             udp_input      (struct pbuf *p, struct netif *inp);
 
@@ -159,9 +168,13 @@
 #define udp_new_ip6() udp_new_ip_type(IPADDR_TYPE_V6)
 
 #if LWIP_MULTICAST_TX_OPTIONS
-#define udp_set_multicast_netif_addr(pcb, ip4addr) ip_addr_copy_from_ip4((pcb)->multicast_ip, *(ip4addr))
-#define udp_get_multicast_netif_addr(pcb)          ip_2_ip4(&(pcb)->multicast_ip)
-#define udp_set_multicast_ttl(pcb, value)      do { (pcb)->mcast_ttl = value; } while(0)
+#if LWIP_IPV4
+#define udp_set_multicast_netif_addr(pcb, ip4addr) ip4_addr_copy((pcb)->mcast_ip4, *(ip4addr))
+#define udp_get_multicast_netif_addr(pcb)          (&(pcb)->mcast_ip4)
+#endif /* LWIP_IPV4 */
+#define udp_set_multicast_netif_index(pcb, idx)    ((pcb)->mcast_ifindex = (idx))
+#define udp_get_multicast_netif_index(pcb)         ((pcb)->mcast_ifindex)
+#define udp_set_multicast_ttl(pcb, value)          ((pcb)->mcast_ttl = (value))
 #define udp_get_multicast_ttl(pcb)                 ((pcb)->mcast_ttl)
 #endif /* LWIP_MULTICAST_TX_OPTIONS */
 
diff --git a/src/include/netif/bridgeif.h b/src/include/netif/bridgeif.h
new file mode 100644
index 0000000..f4f8cf1
--- /dev/null
+++ b/src/include/netif/bridgeif.h
@@ -0,0 +1,127 @@
+/**
+ * @file
+ * lwIP netif implementing an IEEE 802.1D MAC Bridge
+ */
+
+/*
+ * 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_NETIF_BRIDGEIF_H
+#define LWIP_HDR_NETIF_BRIDGEIF_H
+
+#include "netif/bridgeif_opts.h"
+
+#include "lwip/err.h"
+#include "lwip/prot/ethernet.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct netif;
+
+#if (BRIDGEIF_MAX_PORTS < 0) || (BRIDGEIF_MAX_PORTS >= 64)
+#error BRIDGEIF_MAX_PORTS must be [1..63]
+#elif BRIDGEIF_MAX_PORTS < 8
+typedef u8_t bridgeif_portmask_t;
+#elif BRIDGEIF_MAX_PORTS < 16
+typedef u16_t bridgeif_portmask_t;
+#elif BRIDGEIF_MAX_PORTS < 32
+typedef u32_t bridgeif_portmask_t;
+#elif BRIDGEIF_MAX_PORTS < 64
+typedef u64_t bridgeif_portmask_t;
+#endif
+
+#define BR_FLOOD ((bridgeif_portmask_t)-1)
+
+/** @ingroup bridgeif
+ * Initialisation data for @ref bridgeif_init.
+ * An instance of this type must be passed as parameter 'state' to @ref netif_add
+ * when the bridge is added.
+ */
+typedef struct bridgeif_initdata_s {
+  /** MAC address of the bridge (cannot use the netif's addresses) */
+  struct eth_addr ethaddr;
+  /** Maximum number of ports in the bridge (ports are stored in an array, this
+      influences memory allocated for netif->state of the bridge netif). */
+  u8_t            max_ports;
+  /** Maximum number of dynamic/learning entries in the bridge's forwarding database.
+      In the default implementation, this controls memory consumption only. */
+  u16_t           max_fdb_dynamic_entries;
+  /** Maximum number of static forwarding entries. Influences memory consumption! */
+  u16_t           max_fdb_static_entries;
+} bridgeif_initdata_t;
+
+/** @ingroup bridgeif
+ * Use this for constant initialization of a bridgeif_initdat_t
+ * (ethaddr must be passed as ETH_ADDR())
+ */
+#define BRIDGEIF_INITDATA1(max_ports, max_fdb_dynamic_entries, max_fdb_static_entries, ethaddr) {ethaddr, max_ports, max_fdb_dynamic_entries, max_fdb_static_entries}
+/** @ingroup bridgeif
+ * Use this for constant initialization of a bridgeif_initdat_t
+ * (each byte of ethaddr must be passed)
+ */
+#define BRIDGEIF_INITDATA2(max_ports, max_fdb_dynamic_entries, max_fdb_static_entries, e0, e1, e2, e3, e4, e5) {{e0, e1, e2, e3, e4, e5}, max_ports, max_fdb_dynamic_entries, max_fdb_static_entries}
+
+err_t bridgeif_init(struct netif *netif);
+err_t bridgeif_add_port(struct netif *bridgeif, struct netif *portif);
+err_t bridgeif_fdb_add(struct netif *bridgeif, const struct eth_addr *addr, bridgeif_portmask_t ports);
+err_t bridgeif_fdb_remove(struct netif *bridgeif, const struct eth_addr *addr);
+
+/* FDB interface, can be replaced by own implementation */
+void                bridgeif_fdb_update_src(void *fdb_ptr, struct eth_addr *src_addr, u8_t port_idx);
+bridgeif_portmask_t bridgeif_fdb_get_dst_ports(void *fdb_ptr, struct eth_addr *dst_addr);
+void*               bridgeif_fdb_init(u16_t max_fdb_entries);
+
+#if BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT
+#ifndef BRIDGEIF_DECL_PROTECT
+/* define bridgeif protection to sys_arch_protect... */
+#include "lwip/sys.h"
+#define BRIDGEIF_DECL_PROTECT(lev)    SYS_ARCH_DECL_PROTECT(lev)
+#define BRIDGEIF_READ_PROTECT(lev)    SYS_ARCH_PROTECT(lev)
+#define BRIDGEIF_READ_UNPROTECT(lev)  SYS_ARCH_UNPROTECT(lev)
+#define BRIDGEIF_WRITE_PROTECT(lev)
+#define BRIDGEIF_WRITE_UNPROTECT(lev)
+#endif
+#else /* BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT */
+#include "lwip/tcpip.h"
+#define BRIDGEIF_DECL_PROTECT(lev)
+#define BRIDGEIF_READ_PROTECT(lev)
+#define BRIDGEIF_READ_UNPROTECT(lev)
+#define BRIDGEIF_WRITE_PROTECT(lev)
+#define BRIDGEIF_WRITE_UNPROTECT(lev)
+#endif /* BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_NETIF_BRIDGEIF_H */
diff --git a/src/include/netif/bridgeif_opts.h b/src/include/netif/bridgeif_opts.h
new file mode 100644
index 0000000..b85c301
--- /dev/null
+++ b/src/include/netif/bridgeif_opts.h
@@ -0,0 +1,90 @@
+/**
+ * @file
+ * lwIP netif implementing an IEEE 802.1D MAC Bridge
+ */
+
+/*
+ * 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_NETIF_BRIDGEIF_OPTS_H
+#define LWIP_HDR_NETIF_BRIDGEIF_OPTS_H
+
+#include "lwip/opt.h"
+
+/**
+ * @defgroup bridgeif_opts Options
+ * @ingroup bridgeif
+ * @{
+ */
+
+/** BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT==1: set port netif's 'input' function
+ * to call directly into bridgeif code and on top of that, directly call into
+ * the selected forwarding port's 'linkoutput' function.
+ * This means that the bridgeif input/output path is protected from concurrent access
+ * but as well, *all* bridge port netif's drivers must correctly handle concurrent access!
+ * == 0: get into tcpip_thread for every input packet (no multithreading)
+ * ATTENTION: as ==0 relies on tcpip.h, the default depends on NO_SYS setting
+ */
+#ifndef BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT
+#define BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT  NO_SYS
+#endif
+
+/** BRIDGEIF_MAX_PORTS: this is used to create a typedef used for forwarding
+ * bit-fields: the number of bits required is this + 1 (for the internal/cpu port)
+ * (63 is the maximum, resulting in an u64_t for the bit mask)
+ * ATTENTION: this controls the maximum number of the implementation only!
+ * The max. number of ports per bridge must still be passed via netif_add parameter!
+ */
+#ifndef BRIDGEIF_MAX_PORTS
+#define BRIDGEIF_MAX_PORTS                  7
+#endif
+
+/** BRIDGEIF_DEBUG: Enable generic debugging in bridgeif.c. */
+#ifndef BRIDGEIF_DEBUG
+#define BRIDGEIF_DEBUG                      LWIP_DBG_OFF
+#endif
+
+/** BRIDGEIF_DEBUG: Enable FDB debugging in bridgeif.c. */
+#ifndef BRIDGEIF_FDB_DEBUG
+#define BRIDGEIF_FDB_DEBUG                  LWIP_DBG_OFF
+#endif
+
+/** BRIDGEIF_DEBUG: Enable forwarding debugging in bridgeif.c. */
+#ifndef BRIDGEIF_FW_DEBUG
+#define BRIDGEIF_FW_DEBUG                   LWIP_DBG_OFF
+#endif
+
+/**
+ * @}
+ */
+
+#endif /* LWIP_HDR_NETIF_BRIDGEIF_OPTS_H */
diff --git a/src/include/netif/ieee802154.h b/src/include/netif/ieee802154.h
new file mode 100644
index 0000000..54e019f
--- /dev/null
+++ b/src/include/netif/ieee802154.h
@@ -0,0 +1,112 @@
+/**
+ * @file
+ * Definitions for IEEE 802.15.4 MAC frames
+ */
+
+/*
+ * 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.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+#ifndef LWIP_HDR_NETIF_IEEE802154_H
+#define LWIP_HDR_NETIF_IEEE802154_H
+
+#include "lwip/opt.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/bpstruct.h"
+#endif
+PACK_STRUCT_BEGIN
+/** General MAC frame format
+ * This shows the full featured header, mainly for documentation.
+ * Some fields are omitted or shortened to achieve frame compression.
+ */
+struct ieee_802154_hdr {
+  /** See IEEE_802154_FC_* defines */
+  PACK_STRUCT_FIELD(u16_t frame_control);
+  /** Sequence number is omitted if IEEE_802154_FC_SEQNO_SUPPR is set in frame_control */
+  PACK_STRUCT_FLD_8(u8_t  sequence_number);
+  /** Destination PAN ID is omitted if Destination Addressing Mode is 0 */
+  PACK_STRUCT_FIELD(u16_t destination_pan_id);
+  /** Destination Address is omitted if Destination Addressing Mode is 0 */
+  PACK_STRUCT_FLD_8(u8_t destination_address[8]);
+  /** Source PAN ID is omitted if Source Addressing Mode is 0
+      or if IEEE_802154_FC_PANID_COMPR is set in frame control*/
+  PACK_STRUCT_FIELD(u16_t source_pan_id);
+  /** Source Address is omitted if Source Addressing Mode is 0 */
+  PACK_STRUCT_FLD_8(u8_t source_address[8]);
+  /* The rest is variable */
+} PACK_STRUCT_STRUCT;
+PACK_STRUCT_END
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/epstruct.h"
+#endif
+
+/* Addressing modes (2 bits) */
+#define IEEE_802154_ADDR_MODE_NO_ADDR   0x00 /* PAN ID and address fields are not present */
+#define IEEE_802154_ADDR_MODE_RESERVED  0x01 /* Reserved */
+#define IEEE_802154_ADDR_MODE_SHORT     0x02 /* Address field contains a short address (16 bit) */
+#define IEEE_802154_ADDR_MODE_EXT       0x03 /* Address field contains an extended address (64 bit) */
+
+/* IEEE 802.15.4 Frame Control definitions (2 bytes; see IEEE 802.15.4-2015 ch. 7.2.1) */
+#define IEEE_802154_FC_FT_MASK             0x0007 /* bits 0..2: Frame Type */
+#define IEEE_802154_FC_FT_BEACON               0x00
+#define IEEE_802154_FC_FT_DATA                 0x01
+#define IEEE_802154_FC_FT_ACK                  0x02
+#define IEEE_802154_FC_FT_MAC_CMD              0x03
+#define IEEE_802154_FC_FT_RESERVED             0x04
+#define IEEE_802154_FC_FT_MULTIPURPOSE         0x05
+#define IEEE_802154_FC_FT_FRAG                 0x06
+#define IEEE_802154_FC_FT_EXT                  0x07
+#define IEEE_802154_FC_SEC_EN              0x0008 /* bit 3: Security Enabled */
+#define IEEE_802154_FC_FRAME_PEND          0x0010 /* bit 4: Frame Pending */
+#define IEEE_802154_FC_ACK_REQ             0x0020 /* bit 5: AR (ACK required) */
+#define IEEE_802154_FC_PANID_COMPR         0x0040 /* bit 6: PAN ID Compression (src and dst are equal, src PAN ID omitted) */
+#define IEEE_802154_FC_RESERVED            0x0080
+#define IEEE_802154_FC_SEQNO_SUPPR         0x0100 /* bit 8: Sequence Number Suppression */
+#define IEEE_802154_FC_IE_PRESENT          0x0200 /* bit 9: IE Present */
+#define IEEE_802154_FC_DST_ADDR_MODE_MASK  0x0c00 /* bits 10..11: Destination Addressing Mode */
+#define IEEE_802154_FC_DST_ADDR_MODE_NO_ADDR   (IEEE_802154_ADDR_MODE_NO_ADDR << 10)
+#define IEEE_802154_FC_DST_ADDR_MODE_SHORT     (IEEE_802154_ADDR_MODE_SHORT << 10)
+#define IEEE_802154_FC_DST_ADDR_MODE_EXT       (IEEE_802154_ADDR_MODE_EXT << 10)
+#define IEEE_802154_FC_FRAME_VERSION_MASK  0x3000 /* bits 12..13: Frame Version */
+#define IEEE_802154_FC_FRAME_VERSION_GET(x)    (((x) & IEEE_802154_FC_FRAME_VERSION_MASK) >> 12)
+#define IEEE_802154_FC_SRC_ADDR_MODE_MASK  0xc000 /* bits 14..15: Source Addressing Mode */
+#define IEEE_802154_FC_SRC_ADDR_MODE_SHORT     (IEEE_802154_ADDR_MODE_SHORT << 14)
+#define IEEE_802154_FC_SRC_ADDR_MODE_EXT       (IEEE_802154_ADDR_MODE_EXT << 14)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_NETIF_IEEE802154_H */
diff --git a/src/include/netif/lowpan6.h b/src/include/netif/lowpan6.h
index 4174644..ecff24b 100644
--- a/src/include/netif/lowpan6.h
+++ b/src/include/netif/lowpan6.h
@@ -44,8 +44,9 @@
 
 #include "netif/lowpan6_opts.h"
 
-#if LWIP_IPV6 && LWIP_6LOWPAN /* don't build if not configured for use in lwipopts.h */
+#if LWIP_IPV6
 
+#include "netif/lowpan6_common.h"
 #include "lwip/pbuf.h"
 #include "lwip/ip.h"
 #include "lwip/ip_addr.h"
@@ -55,12 +56,12 @@
 extern "C" {
 #endif
 
-/** 1 second period */
+/** 1 second period for reassembly */
 #define LOWPAN6_TMR_INTERVAL 1000
 
 void lowpan6_tmr(void);
 
-err_t lowpan6_set_context(u8_t index, const ip6_addr_t * context);
+err_t lowpan6_set_context(u8_t idx, const ip6_addr_t * context);
 err_t lowpan6_set_short_addr(u8_t addr_high, u8_t addr_low);
 
 #if LWIP_IPV4
@@ -73,6 +74,8 @@
 /* pan_id in network byte order. */
 err_t lowpan6_set_pan_id(u16_t pan_id);
 
+u16_t lowpan6_calc_crc(const void *buf, u16_t len);
+
 #if !NO_SYS
 err_t tcpip_6lowpan_input(struct pbuf *p, struct netif *inp);
 #endif /* !NO_SYS */
@@ -81,6 +84,6 @@
 }
 #endif
 
-#endif /* LWIP_IPV6 && LWIP_6LOWPAN */
+#endif /* LWIP_IPV6 */
 
 #endif /* LWIP_HDR_LOWPAN6_H */
diff --git a/src/include/netif/lowpan6_ble.h b/src/include/netif/lowpan6_ble.h
new file mode 100644
index 0000000..01896a7
--- /dev/null
+++ b/src/include/netif/lowpan6_ble.h
@@ -0,0 +1,78 @@
+/**
+ * @file
+ * 6LowPAN over BLE for IPv6 (RFC7668).
+ */
+
+/*
+ * 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,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (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: 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
+
+#include "netif/lowpan6_opts.h"
+
+#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */
+
+#include "netif/lowpan6_common.h"
+#include "lwip/pbuf.h"
+#include "lwip/ip.h"
+#include "lwip/ip_addr.h"
+#include "lwip/netif.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+err_t rfc7668_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr);
+err_t rfc7668_input(struct pbuf * p, struct netif *netif);
+err_t rfc7668_set_local_addr_eui64(struct netif *netif, const u8_t *local_addr, size_t local_addr_len);
+err_t rfc7668_set_local_addr_mac48(struct netif *netif, const u8_t *local_addr, size_t local_addr_len, int is_public_addr);
+err_t rfc7668_set_peer_addr_eui64(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len);
+err_t rfc7668_set_peer_addr_mac48(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len, int is_public_addr);
+err_t rfc7668_set_context(u8_t index, const ip6_addr_t * context);
+err_t rfc7668_if_init(struct netif *netif);
+
+#if !NO_SYS
+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);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_IPV6 */
+
+#endif /* LWIP_HDR_LOWPAN6_BLE_H */
diff --git a/src/include/netif/lowpan6_common.h b/src/include/netif/lowpan6_common.h
new file mode 100644
index 0000000..0dc13ab
--- /dev/null
+++ b/src/include/netif/lowpan6_common.h
@@ -0,0 +1,82 @@
+/**
+ * @file
+ *
+ * Common 6LowPAN routines for IPv6. Uses ND tables for link-layer addressing. Fragments packets to 6LowPAN units.
+ */
+
+/*
+ * Copyright (c) 2015 Inico Technologies 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. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (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: Ivan Delamer <delamer@inicotech.com>
+ *
+ *
+ * Please coordinate changes and requests with Ivan Delamer
+ * <delamer@inicotech.com>
+ */
+
+#ifndef LWIP_HDR_LOWPAN6_COMMON_H
+#define LWIP_HDR_LOWPAN6_COMMON_H
+
+#include "netif/lowpan6_opts.h"
+
+#if LWIP_IPV6 /* don't build if IPv6 is disabled in lwipopts.h */
+
+#include "lwip/pbuf.h"
+#include "lwip/ip.h"
+#include "lwip/ip6_addr.h"
+#include "lwip/netif.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Helper define for a link layer address, which can be encoded as 0, 2 or 8 bytes */
+struct lowpan6_link_addr {
+  /* encoded length of the address */
+  u8_t addr_len;
+  /* address bytes */
+  u8_t addr[8];
+};
+
+s8_t lowpan6_get_address_mode(const ip6_addr_t *ip6addr, const struct lowpan6_link_addr *mac_addr);
+
+#if LWIP_6LOWPAN_IPHC
+err_t lowpan6_compress_headers(struct netif *netif, u8_t *inbuf, size_t inbuf_size, u8_t *outbuf, size_t outbuf_size,
+                               u8_t *lowpan6_header_len_out, u8_t *hidden_header_len_out, ip6_addr_t *lowpan6_contexts,
+                               const struct lowpan6_link_addr *src, const struct lowpan6_link_addr *dst);
+struct pbuf *lowpan6_decompress(struct pbuf *p, u16_t datagram_size, ip6_addr_t *lowpan6_contexts,
+                                struct lowpan6_link_addr *src, struct lowpan6_link_addr *dest);
+#endif /* LWIP_6LOWPAN_IPHC */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_IPV6 */
+
+#endif /* LWIP_HDR_LOWPAN6_COMMON_H */
diff --git a/src/include/netif/lowpan6_opts.h b/src/include/netif/lowpan6_opts.h
index fb93ea0..17d46cd 100644
--- a/src/include/netif/lowpan6_opts.h
+++ b/src/include/netif/lowpan6_opts.h
@@ -43,28 +43,80 @@
 
 #include "lwip/opt.h"
 
-#ifndef LWIP_6LOWPAN
-#define LWIP_6LOWPAN                     0
-#endif
-
+/** LWIP_6LOWPAN_NUM_CONTEXTS: define the number of compression
+ * contexts per netif type
+ */
 #ifndef LWIP_6LOWPAN_NUM_CONTEXTS
 #define LWIP_6LOWPAN_NUM_CONTEXTS        10
 #endif
 
+/** LWIP_6LOWPAN_INFER_SHORT_ADDRESS: set this to 0 to disable creating
+ * short addresses for matching addresses (debug only)
+ */
 #ifndef LWIP_6LOWPAN_INFER_SHORT_ADDRESS
 #define LWIP_6LOWPAN_INFER_SHORT_ADDRESS 1
 #endif
 
+/** LWIP_6LOWPAN_IPHC: set this to 0 to disable IP header compression as per
+ * RFC 6282 (which is mandatory for BLE)
+ */
 #ifndef LWIP_6LOWPAN_IPHC
 #define LWIP_6LOWPAN_IPHC                1
 #endif
 
-#ifndef LWIP_6LOWPAN_HW_CRC
-#define LWIP_6LOWPAN_HW_CRC              1
+/** Set this to 1 if your IEEE 802.15.4 interface can calculate and check the
+ * CRC in hardware. This means TX packets get 2 zero bytes added on transmission
+ * which are to be filled with the CRC.
+ */
+#ifndef LWIP_6LOWPAN_802154_HW_CRC
+#define LWIP_6LOWPAN_802154_HW_CRC       0
 #endif
 
-#ifndef LOWPAN6_DEBUG
-#define LOWPAN6_DEBUG                    LWIP_DBG_OFF
+/** If LWIP_6LOWPAN_802154_HW_CRC==0, this can override the default slow
+ * implementation of the CRC used for 6LoWPAN over IEEE 802.15.4 (which uses
+ * a shift register).
+ */
+#ifndef LWIP_6LOWPAN_CALC_CRC
+#define LWIP_6LOWPAN_CALC_CRC(buf, len)  lowpan6_calc_crc(buf, len)
 #endif
 
+/** Debug level for 6LoWPAN in general */
+#ifndef LWIP_LOWPAN6_DEBUG
+#define LWIP_LOWPAN6_DEBUG               LWIP_DBG_OFF
+#endif
+
+/** Debug level for 6LoWPAN over IEEE 802.15.4 */
+#ifndef LWIP_LOWPAN6_802154_DEBUG
+#define LWIP_LOWPAN6_802154_DEBUG        LWIP_DBG_OFF
+#endif
+
+/** LWIP_LOWPAN6_IP_COMPRESSED_DEBUG: enable compressed IP frame
+ * output debugging
+ */
+#ifndef LWIP_LOWPAN6_IP_COMPRESSED_DEBUG
+#define LWIP_LOWPAN6_IP_COMPRESSED_DEBUG      LWIP_DBG_OFF
+#endif
+
+/** LWIP_LOWPAN6_DECOMPRESSION_DEBUG: enable decompression debug output
+ */
+#ifndef LWIP_LOWPAN6_DECOMPRESSION_DEBUG
+#define LWIP_LOWPAN6_DECOMPRESSION_DEBUG      LWIP_DBG_OFF
+#endif
+
+/** LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG: enable decompressed IP frame
+ * output debugging */
+#ifndef LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG
+#define LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG    LWIP_DBG_OFF
+#endif
+
+/** 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
+ * not (=0) */
+#ifndef LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS
+#define LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS 1
+#endif
+
+
 #endif /* LWIP_HDR_LOWPAN6_OPTS_H */
diff --git a/src/include/netif/ppp/ccp.h b/src/include/netif/ppp/ccp.h
index 14dd659..b228522 100644
--- a/src/include/netif/ppp/ccp.h
+++ b/src/include/netif/ppp/ccp.h
@@ -36,6 +36,10 @@
 #ifndef CCP_H
 #define CCP_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /*
  * CCP codes.
  */
@@ -152,5 +156,9 @@
 
 void ccp_resetrequest(ppp_pcb *pcb);  /* Issue a reset-request. */
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* CCP_H */
 #endif /* PPP_SUPPORT && CCP_SUPPORT */
diff --git a/src/include/netif/ppp/chap-new.h b/src/include/netif/ppp/chap-new.h
index 64eae32..2d8cd9c 100644
--- a/src/include/netif/ppp/chap-new.h
+++ b/src/include/netif/ppp/chap-new.h
@@ -36,6 +36,10 @@
 
 #include "ppp.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /*
  * CHAP packets begin with a standard header with code, id, len (2 bytes).
  */
@@ -188,5 +192,9 @@
 /* Represents the CHAP protocol to the main pppd code */
 extern const struct protent chap_protent;
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* CHAP_H */
 #endif /* PPP_SUPPORT && CHAP_SUPPORT */
diff --git a/src/include/netif/ppp/ecp.h b/src/include/netif/ppp/ecp.h
index 5cdce29..d8808c3 100644
--- a/src/include/netif/ppp/ecp.h
+++ b/src/include/netif/ppp/ecp.h
@@ -34,6 +34,13 @@
 #include "netif/ppp/ppp_opts.h"
 #if PPP_SUPPORT && ECP_SUPPORT  /* don't build if not configured for use in lwipopts.h */
 
+#ifndef ECP_H
+#define ECP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 typedef struct ecp_options {
     bool required;		/* Is ECP required? */
     unsigned enctype;		/* Encryption type */
@@ -47,4 +54,9 @@
 
 extern const struct protent ecp_protent;
 
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ECP_H */
 #endif /* PPP_SUPPORT && ECP_SUPPORT */
diff --git a/src/include/netif/ppp/eui64.h b/src/include/netif/ppp/eui64.h
index 20ac22e..5adeb48 100644
--- a/src/include/netif/ppp/eui64.h
+++ b/src/include/netif/ppp/eui64.h
@@ -41,6 +41,10 @@
 #ifndef EUI64_H
 #define EUI64_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /*
  * @todo:
  *
@@ -90,5 +94,9 @@
 
 char *eui64_ntoa(eui64_t);	/* Returns ascii representation of id */
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* EUI64_H */
 #endif /* PPP_SUPPORT && PPP_IPV6_SUPPORT */
diff --git a/src/include/netif/ppp/fsm.h b/src/include/netif/ppp/fsm.h
index b6915d3..8dec700 100644
--- a/src/include/netif/ppp/fsm.h
+++ b/src/include/netif/ppp/fsm.h
@@ -50,6 +50,10 @@
 
 #include "ppp.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /*
  * Packet header = Code, id, length.
  */
@@ -170,6 +174,9 @@
 void fsm_protreject(fsm *f);
 void fsm_sdata(fsm *f, u_char code, u_char id, const u_char *data, int datalen);
 
+#ifdef __cplusplus
+}
+#endif
 
 #endif /* FSM_H */
 #endif /* PPP_SUPPORT */
diff --git a/src/include/netif/ppp/ipcp.h b/src/include/netif/ppp/ipcp.h
index 45f46b3..32fdd1c 100644
--- a/src/include/netif/ppp/ipcp.h
+++ b/src/include/netif/ppp/ipcp.h
@@ -48,6 +48,10 @@
 #ifndef IPCP_H
 #define	IPCP_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /*
  * Options.
  */
@@ -122,5 +126,9 @@
 
 extern const struct protent ipcp_protent;
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* IPCP_H */
 #endif /* PPP_SUPPORT && PPP_IPV4_SUPPORT */
diff --git a/src/include/netif/ppp/ipv6cp.h b/src/include/netif/ppp/ipv6cp.h
index 07d1ae3..9099973 100644
--- a/src/include/netif/ppp/ipv6cp.h
+++ b/src/include/netif/ppp/ipv6cp.h
@@ -146,6 +146,10 @@
 
 #include "eui64.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /*
  * Options.
  */
@@ -179,5 +183,9 @@
 
 extern const struct protent ipv6cp_protent;
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* IPV6CP_H */
 #endif /* PPP_SUPPORT && PPP_IPV6_SUPPORT */
diff --git a/src/include/netif/ppp/lcp.h b/src/include/netif/ppp/lcp.h
index 12e2a05..18ad1cb 100644
--- a/src/include/netif/ppp/lcp.h
+++ b/src/include/netif/ppp/lcp.h
@@ -50,6 +50,10 @@
 
 #include "ppp.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /*
  * Options.
  */
@@ -167,5 +171,9 @@
 #define DEFLOOPBACKFAIL	10
 #endif /* moved to ppp_opts.h */
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* LCP_H */
 #endif /* PPP_SUPPORT */
diff --git a/src/include/netif/ppp/magic.h b/src/include/netif/ppp/magic.h
index a2a9b53..a165e18 100644
--- a/src/include/netif/ppp/magic.h
+++ b/src/include/netif/ppp/magic.h
@@ -80,6 +80,10 @@
 #ifndef MAGIC_H
 #define MAGIC_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /***********************
 *** PUBLIC FUNCTIONS ***
 ***********************/
@@ -117,6 +121,10 @@
  */
 u32_t magic_pow(u8_t pow);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* MAGIC_H */
 
 #endif /* PPP_SUPPORT */
diff --git a/src/include/netif/ppp/mppe.h b/src/include/netif/ppp/mppe.h
index 1ae8a5d..5de1128 100644
--- a/src/include/netif/ppp/mppe.h
+++ b/src/include/netif/ppp/mppe.h
@@ -41,6 +41,10 @@
 
 #include "netif/ppp/pppcrypt.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #define MPPE_PAD		4	/* MPPE growth per frame */
 #define MPPE_MAX_KEY_LEN	16	/* largest key length (128-bit) */
 
@@ -169,5 +173,9 @@
 void mppe_decomp_reset(ppp_pcb *pcb, ppp_mppe_state *state);
 err_t mppe_decompress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* MPPE_H */
 #endif /* PPP_SUPPORT && MPPE_SUPPORT */
diff --git a/src/include/netif/ppp/ppp.h b/src/include/netif/ppp/ppp.h
index d9ea097..3d73c36 100644
--- a/src/include/netif/ppp/ppp.h
+++ b/src/include/netif/ppp/ppp.h
@@ -47,6 +47,10 @@
 #include "lwip/ip6_addr.h"
 #endif /* PPP_IPV6_SUPPORT */
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /* Disable non-working or rarely used PPP feature, so rarely that we don't want to bloat ppp_opts.h with them */
 #ifndef PPP_OPTIONS
 #define PPP_OPTIONS         0
@@ -685,6 +689,10 @@
 #define ppp_set_netif_linkcallback(ppp, link_cb)           \
         netif_set_link_callback(ppp->netif, link_cb);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* PPP_H */
 
 #endif /* PPP_SUPPORT */
diff --git a/src/include/netif/ppp/ppp_impl.h b/src/include/netif/ppp/ppp_impl.h
index 1d4c774..40843d5 100644
--- a/src/include/netif/ppp/ppp_impl.h
+++ b/src/include/netif/ppp/ppp_impl.h
@@ -53,6 +53,10 @@
 #include "ppp.h"
 #include "pppdebug.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /*
  * Memory used for control packets.
  *
@@ -406,9 +410,6 @@
 /* function called to process input packet */
 void ppp_input(ppp_pcb *pcb, struct pbuf *pb);
 
-/* helper function, merge a pbuf chain into one pbuf */
-struct pbuf *ppp_singlebuf(struct pbuf *p);
-
 
 /*
  * Functions called by PPP protocols.
@@ -624,6 +625,98 @@
                                 /* dump packet to debug log if interesting */
 #endif /* PRINTPKT_SUPPORT */
 
+/*
+ * Number of necessary timers analysis.
+ *
+ * PPP use at least one timer per each of its protocol, but not all protocols are
+ * active at the same time, thus the number of necessary timeouts is actually
+ * lower than enabled protocols. Here is the actual necessary timeouts based
+ * on code analysis.
+ *
+ * Note that many features analysed here are not working at all and are only
+ * there for a comprehensive analysis of necessary timers in order to prevent
+ * having to redo that each time we add a feature.
+ *
+ * Timer list
+ *
+ * | holdoff timeout
+ *  | low level protocol timeout (PPPoE or PPPoL2P)
+ *   | LCP delayed UP
+ *    | LCP retransmit (FSM)
+ *     | LCP Echo timer
+ *     .| PAP or CHAP or EAP authentication
+ *     . | ECP retransmit (FSM)
+ *     .  | CCP retransmit (FSM) when MPPE is enabled
+ *     .   | CCP retransmit (FSM) when MPPE is NOT enabled
+ *     .    | IPCP retransmit (FSM)
+ *     .    .| IP6CP retransmit (FSM)
+ *     .    . | Idle time limit
+ *     .    .  | Max connect time
+ *     .    .   | Max octets
+ *     .    .    | CCP RACK timeout
+ *     .    .    .
+ * PPP_PHASE_DEAD
+ * PPP_PHASE_HOLDOFF
+ * |   .    .    .
+ * PPP_PHASE_INITIALIZE
+ *  |  .    .    .
+ * PPP_PHASE_ESTABLISH
+ *   | .    .    .
+ *    |.    .    .
+ *     |    .    .
+ * PPP_PHASE_AUTHENTICATE
+ *     |    .    .
+ *     ||   .    .
+ * PPP_PHASE_NETWORK
+ *     | || .    .
+ *     |   |||   .
+ * PPP_PHASE_RUNNING
+ *     |    .|||||
+ *     |    . ||||
+ * PPP_PHASE_TERMINATE
+ *     |    . ||||
+ * PPP_PHASE_NETWORK
+ *    |.         .
+ * PPP_PHASE_ESTABLISH
+ * PPP_PHASE_DISCONNECT
+ * PPP_PHASE_DEAD
+ *
+ * Alright, PPP basic retransmission and LCP Echo consume one timer.
+ *  1
+ *
+ * If authentication is enabled one timer is necessary during authentication.
+ *  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
+ *
+ * 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
+ *
+ * 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)
+ *
+ * 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)
+ *
+ * Thus, the following is enough for now.
+ * 1 + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT
+ */
+
+#ifdef __cplusplus
+}
+#endif
 
 #endif /* PPP_SUPPORT */
 #endif /* LWIP_HDR_PPP_IMPL_H */
diff --git a/src/include/netif/ppp/ppp_opts.h b/src/include/netif/ppp/ppp_opts.h
index fa79c09..6702bec 100644
--- a/src/include/netif/ppp/ppp_opts.h
+++ b/src/include/netif/ppp/ppp_opts.h
@@ -72,15 +72,27 @@
 #define LWIP_PPP_API                    (PPP_SUPPORT && (NO_SYS == 0))
 #endif
 
+#if PPP_SUPPORT
+
 /**
  * MEMP_NUM_PPP_PCB: the number of simultaneously active PPP
  * connections (requires the PPP_SUPPORT option)
  */
 #ifndef MEMP_NUM_PPP_PCB
-#define MEMP_NUM_PPP_PCB       1
+#define MEMP_NUM_PPP_PCB                1
 #endif
 
-#if PPP_SUPPORT
+/**
+ * PPP_NUM_TIMEOUTS_PER_PCB: the number of sys_timeouts running in parallel per
+ * ppp_pcb. See the detailed explanation at the end of ppp_impl.h about simultaneous
+ * timers analysis.
+ */
+#ifndef PPP_NUM_TIMEOUTS_PER_PCB
+#define PPP_NUM_TIMEOUTS_PER_PCB        (1 + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT)
+#endif
+
+/* The number of sys_timeouts required for the PPP module */
+#define PPP_NUM_TIMEOUTS                (PPP_SUPPORT * PPP_NUM_TIMEOUTS_PER_PCB * MEMP_NUM_PPP_PCB)
 
 /**
  * MEMP_NUM_PPPOS_INTERFACES: the number of concurrently active PPPoS
@@ -590,4 +602,9 @@
 
 #endif /* PPP_SUPPORT */
 
+/* Default value if unset */
+#ifndef PPP_NUM_TIMEOUTS
+#define PPP_NUM_TIMEOUTS                0
+#endif /* PPP_NUM_TIMEOUTS */
+
 #endif /* LWIP_PPP_OPTS_H */
diff --git a/src/include/netif/ppp/pppcrypt.h b/src/include/netif/ppp/pppcrypt.h
index a7b2099..c0230bb 100644
--- a/src/include/netif/ppp/pppcrypt.h
+++ b/src/include/netif/ppp/pppcrypt.h
@@ -44,6 +44,10 @@
  */
 #include "lwip/arch.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /*
  * Map hashes and ciphers functions to PolarSSL
  */
@@ -131,6 +135,10 @@
 
 void pppcrypt_56_to_64_bit_key(u_char *key, u_char *des_key);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* PPPCRYPT_H */
 
 #endif /* PPP_SUPPORT */
diff --git a/src/include/netif/ppp/pppdebug.h b/src/include/netif/ppp/pppdebug.h
index 7ead045..36ee4f9 100644
--- a/src/include/netif/ppp/pppdebug.h
+++ b/src/include/netif/ppp/pppdebug.h
@@ -40,6 +40,10 @@
 #ifndef PPPDEBUG_H
 #define PPPDEBUG_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /* Trace levels. */
 #define LOG_CRITICAL  (PPP_DEBUG | LWIP_DBG_LEVEL_SEVERE)
 #define LOG_ERR       (PPP_DEBUG | LWIP_DBG_LEVEL_SEVERE)
@@ -75,6 +79,10 @@
 
 #endif /* PPP_DEBUG */
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* PPPDEBUG_H */
 
 #endif /* PPP_SUPPORT */
diff --git a/src/include/netif/ppp/pppoe.h b/src/include/netif/ppp/pppoe.h
index 9f8f289..08ab7ab 100644
--- a/src/include/netif/ppp/pppoe.h
+++ b/src/include/netif/ppp/pppoe.h
@@ -76,6 +76,10 @@
 #include "ppp.h"
 #include "lwip/etharp.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #ifdef PACK_STRUCT_USE_INCLUDES
 #  include "arch/bpstruct.h"
 #endif
@@ -174,6 +178,10 @@
 void pppoe_disc_input(struct netif *netif, struct pbuf *p);
 void pppoe_data_input(struct netif *netif, struct pbuf *p);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* PPP_OE_H */
 
 #endif /* PPP_SUPPORT && PPPOE_SUPPORT */
diff --git a/src/include/netif/ppp/pppol2tp.h b/src/include/netif/ppp/pppol2tp.h
index f03950e..1221ca1 100644
--- a/src/include/netif/ppp/pppol2tp.h
+++ b/src/include/netif/ppp/pppol2tp.h
@@ -39,6 +39,10 @@
 
 #include "ppp.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /* Timeout */
 #define PPPOL2TP_CONTROL_TIMEOUT         (5*1000)  /* base for quick timeout calculation */
 #define PPPOL2TP_SLOW_RETRY              (60*1000) /* persistent retry interval */
@@ -179,7 +183,7 @@
   u16_t tunnel_port;           /* Tunnel port */
   u16_t our_ns;                /* NS to peer */
   u16_t peer_nr;               /* NR from peer */
-  u16_t peer_ns;               /* NS from peer */
+  u16_t peer_ns;               /* Expected NS from peer */
   u16_t source_tunnel_id;      /* Tunnel ID assigned by peer */
   u16_t remote_tunnel_id;      /* Tunnel ID assigned to peer */
   u16_t source_session_id;     /* Session ID assigned by peer */
@@ -197,5 +201,9 @@
        const u8_t *secret, u8_t secret_len,
        ppp_link_status_cb_fn link_status_cb, void *ctx_cb);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* PPPOL2TP_H */
 #endif /* PPP_SUPPORT && PPPOL2TP_SUPPORT */
diff --git a/src/include/netif/ppp/pppos.h b/src/include/netif/ppp/pppos.h
index d924a9f..380a965 100644
--- a/src/include/netif/ppp/pppos.h
+++ b/src/include/netif/ppp/pppos.h
@@ -42,6 +42,10 @@
 #include "ppp.h"
 #include "vj.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /* PPP packet parser states.  Current state indicates operation yet to be
  * completed. */
 enum {
@@ -114,5 +118,9 @@
 err_t pppos_input_sys(struct pbuf *p, struct netif *inp);
 #endif /* !NO_SYS && !PPP_INPROC_IRQ_SAFE */
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* PPPOS_H */
 #endif /* PPP_SUPPORT && PPPOL2TP_SUPPORT */
diff --git a/src/include/netif/ppp/upap.h b/src/include/netif/ppp/upap.h
index 7da792e..540d981 100644
--- a/src/include/netif/ppp/upap.h
+++ b/src/include/netif/ppp/upap.h
@@ -50,6 +50,10 @@
 
 #include "ppp.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /*
  * Packet header = Code, id, length.
  */
@@ -119,5 +123,9 @@
 
 extern const struct protent pap_protent;
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* UPAP_H */
 #endif /* PPP_SUPPORT && PAP_SUPPORT */
diff --git a/src/include/netif/ppp/vj.h b/src/include/netif/ppp/vj.h
index 7f389c8..77d9976 100644
--- a/src/include/netif/ppp/vj.h
+++ b/src/include/netif/ppp/vj.h
@@ -31,6 +31,10 @@
 #include "lwip/ip.h"
 #include "lwip/priv/tcp_priv.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #define MAX_SLOTS 16 /* must be > 2 and < 256 */
 #define MAX_HDR   128
 
@@ -156,6 +160,10 @@
 extern int   vj_uncompress_uncomp(struct pbuf *nb, struct vjcompress *comp);
 extern int   vj_uncompress_tcp   (struct pbuf **nb, struct vjcompress *comp);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* VJ_H */
 
 #endif /* PPP_SUPPORT && VJ_SUPPORT */
diff --git a/src/include/netif/zepif.h b/src/include/netif/zepif.h
new file mode 100644
index 0000000..2a801b4
--- /dev/null
+++ b/src/include/netif/zepif.h
@@ -0,0 +1,81 @@
+/**
+ * @file
+ *
+ * A netif implementing the ZigBee Eencapsulation Protocol (ZEP).
+ * This is used to tunnel 6LowPAN over UDP.
+ */
+
+/*
+ * 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.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#ifndef LWIP_HDR_ZEPIF_H
+#define LWIP_HDR_ZEPIF_H
+
+#include "lwip/opt.h"
+#include "netif/lowpan6.h"
+
+#if LWIP_IPV6 && LWIP_UDP /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/netif.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZEPIF_DEFAULT_UDP_PORT  17754
+
+/** Pass this struct as 'state' to netif_add to control the behaviour
+ * of this netif. If NULL is passed, default behaviour is chosen */
+struct zepif_init {
+  /** The UDP port used to ZEP frames from (0 = default) */
+  u16_t               zep_src_udp_port;
+  /** The UDP port used to ZEP frames to (0 = default) */
+  u16_t               zep_dst_udp_port;
+  /** The IP address to sed ZEP frames from (NULL = ANY) */
+  const ip_addr_t    *zep_src_ip_addr;
+  /** The IP address to sed ZEP frames to (NULL = BROADCAST) */
+  const ip_addr_t    *zep_dst_ip_addr;
+  /** If != NULL, the udp pcb is bound to this netif */
+  const struct netif *zep_netif;
+  /** MAC address of the 6LowPAN device */
+  u8_t                addr[6];
+};
+
+err_t zepif_init(struct netif *netif);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_IPV6 && LWIP_UDP */
+
+#endif /* LWIP_HDR_ZEPIF_H */
diff --git a/src/include/posix/errno.h b/src/include/posix/errno.h
deleted file mode 100644
index 5917c75..0000000
--- a/src/include/posix/errno.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * @file
- * This file is a posix wrapper for lwip/errno.h.
- */
-
-/*
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (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/errno.h"
diff --git a/src/netif/FILES b/src/netif/FILES
index a3ff431..1ffd6f2 100644
--- a/src/netif/FILES
+++ b/src/netif/FILES
@@ -5,14 +5,13 @@
 ethernet.c
           Shared code for Ethernet based interfaces.
 
-ethernetif.c
-          An example of how an Ethernet device driver could look. This
-          file can be used as a "skeleton" for developing new Ethernet
-          network device drivers. It uses the etharp.c ARP code.
-
 lowpan6.c
           A 6LoWPAN implementation as a netif.
 
+lowpan6_ble.c
+          A 6LoWPAN over Bluetooth Low Energy (BLE) implementation as netif,
+          according to RFC-7668.
+
 slipif.c
           A generic implementation of the SLIP (Serial Line IP)
           protocol. It requires a sio (serial I/O) module to work.
diff --git a/src/netif/bridgeif.c b/src/netif/bridgeif.c
new file mode 100644
index 0000000..8a97bce
--- /dev/null
+++ b/src/netif/bridgeif.c
@@ -0,0 +1,563 @@
+/**
+ * @file
+ * lwIP netif implementing an IEEE 802.1D MAC Bridge
+ */
+
+/*
+ * 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>
+ *
+ */
+
+/**
+ * @defgroup bridgeif IEEE 802.1D bridge
+ * @ingroup netifs
+ * This file implements an IEEE 802.1D bridge by using a multilayer netif approach
+ * (one hardware-independent netif for the bridge that uses hardware netifs for its ports).
+ * On transmit, the bridge selects the outgoing port(s).
+ * On receive, the port netif calls into the bridge (via its netif->input function) and
+ * the bridge selects the port(s) (and/or its netif->input function) to pass the received pbuf to.
+ *
+ * Usage:
+ * - add the port netifs just like you would when using them as dedicated netif without a bridge
+ *   - only NETIF_FLAG_ETHARP/NETIF_FLAG_ETHERNET netifs are supported as bridge ports
+ *   - add the bridge port netifs without IPv4 addresses (i.e. pass 'NULL, NULL, NULL')
+ *   - don't add IPv6 addresses to the port netifs!
+ * - set up the bridge configuration in a global variable of type 'bridgeif_initdata_t' that contains
+ *   - the MAC address of the bridge
+ *   - some configuration options controlling the memory consumption (maximum number of ports
+ *     and FDB entries)
+ *   - e.g. for a bridge MAC address 00-01-02-03-04-05, 2 bridge ports, 1024 FDB entries + 16 static MAC entries:
+ *     bridgeif_initdata_t mybridge_initdata = BRIDGEIF_INITDATA1(2, 1024, 16, ETH_ADDR(0, 1, 2, 3, 4, 5));
+ * - add the bridge netif (with IPv4 config):
+ *   struct netif bridge_netif;
+ *   netif_add(&bridge_netif, &my_ip, &my_netmask, &my_gw, &mybridge_initdata, bridgeif_init, tcpip_input);
+ *   NOTE: the passed 'input' function depends on BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT setting,
+ *         which controls where the forwarding is done (netif low level input context vs. tcpip_thread)
+ * - set up all ports netifs and the bridge netif
+ *
+ * - When adding a port netif, NETIF_FLAG_ETHARP flag will be removed from a port
+ *   to prevent ETHARP working on that port netif (we only want one IP per bridge not per port).
+ * - When adding a port netif, its input function is changed to call into the bridge.
+ *
+ *
+ * @todo:
+ * - compact static FDB entries (instead of walking the whole array)
+ * - add FDB query/read access
+ * - add FDB change callback (when learning or dropping auto-learned entries)
+ * - prefill FDB with MAC classes that should never be forwarded
+ * - multicast snooping? (and only forward group addresses to interested ports)
+ * - support removing ports
+ * - check SNMP integration
+ * - VLAN handling / trunk ports
+ * - priority handling? (although that largely depends on TX queue limitations and lwIP doesn't provide tx-done handling)
+ */
+
+#include "netif/bridgeif.h"
+#include "lwip/netif.h"
+#include "lwip/sys.h"
+#include "lwip/etharp.h"
+#include "lwip/ethip6.h"
+#include "lwip/snmp.h"
+#include "lwip/timeouts.h"
+#include <string.h>
+
+#if LWIP_NUM_NETIF_CLIENT_DATA
+
+/* Define those to better describe your network interface. */
+#define IFNAME0 'b'
+#define IFNAME1 'r'
+
+struct bridgeif_private_s;
+typedef struct bridgeif_port_private_s {
+  struct bridgeif_private_s *bridge;
+  struct netif *port_netif;
+  u8_t port_num;
+} bridgeif_port_t;
+
+typedef struct bridgeif_fdb_static_entry_s {
+  u8_t used;
+  bridgeif_portmask_t dst_ports;
+  struct eth_addr addr;
+} bridgeif_fdb_static_entry_t;
+
+typedef struct bridgeif_private_s {
+  struct netif     *netif;
+  struct eth_addr   ethaddr;
+  u8_t              max_ports;
+  u8_t              num_ports;
+  bridgeif_port_t  *ports;
+  u16_t             max_fdbs_entries;
+  bridgeif_fdb_static_entry_t *fdbs;
+  u16_t             max_fdbd_entries;
+  void             *fdbd;
+} bridgeif_private_t;
+
+/* netif data index to get the bridge on input */
+u8_t bridgeif_netif_client_id = 0xff;
+
+/**
+ * @ingroup bridgeif
+ * Add a static entry to the forwarding database.
+ * A static entry marks where frames to a specific eth address (unicast or group address) are
+ * forwarded.
+ * bits [0..(BRIDGEIF_MAX_PORTS-1)]: hw ports
+ * bit [BRIDGEIF_MAX_PORTS]: cpu port
+ * 0: drop
+ */
+err_t
+bridgeif_fdb_add(struct netif *bridgeif, const struct eth_addr *addr, bridgeif_portmask_t ports)
+{
+  int i;
+  bridgeif_private_t *br;
+  BRIDGEIF_DECL_PROTECT(lev);
+  LWIP_ASSERT("invalid netif", bridgeif != NULL);
+  br = (bridgeif_private_t *)bridgeif->state;
+  LWIP_ASSERT("invalid state", br != NULL);
+
+  BRIDGEIF_READ_PROTECT(lev);
+  for (i = 0; i < br->max_fdbs_entries; i++) {
+    if (!br->fdbs[i].used) {
+      BRIDGEIF_WRITE_PROTECT(lev);
+      if (!br->fdbs[i].used) {
+        br->fdbs[i].used = 1;
+        br->fdbs[i].dst_ports = ports;
+        memcpy(&br->fdbs[i].addr, addr, sizeof(struct eth_addr));
+        BRIDGEIF_WRITE_UNPROTECT(lev);
+        BRIDGEIF_READ_UNPROTECT(lev);
+        return ERR_OK;
+      }
+      BRIDGEIF_WRITE_UNPROTECT(lev);
+    }
+  }
+  BRIDGEIF_READ_UNPROTECT(lev);
+  return ERR_MEM;
+}
+
+/**
+ * @ingroup bridgeif
+ * Remove a static entry from the forwarding database
+ */
+err_t
+bridgeif_fdb_remove(struct netif *bridgeif, const struct eth_addr *addr)
+{
+  int i;
+  bridgeif_private_t *br;
+  BRIDGEIF_DECL_PROTECT(lev);
+  LWIP_ASSERT("invalid netif", bridgeif != NULL);
+  br = (bridgeif_private_t *)bridgeif->state;
+  LWIP_ASSERT("invalid state", br != NULL);
+
+  BRIDGEIF_READ_PROTECT(lev);
+  for (i = 0; i < br->max_fdbs_entries; i++) {
+    if (br->fdbs[i].used && !memcmp(&br->fdbs[i].addr, addr, sizeof(struct eth_addr))) {
+      BRIDGEIF_WRITE_PROTECT(lev);
+      if (br->fdbs[i].used && !memcmp(&br->fdbs[i].addr, addr, sizeof(struct eth_addr))) {
+        memset(&br->fdbs[i], 0, sizeof(bridgeif_fdb_static_entry_t));
+        BRIDGEIF_WRITE_UNPROTECT(lev);
+        BRIDGEIF_READ_UNPROTECT(lev);
+        return ERR_OK;
+      }
+      BRIDGEIF_WRITE_UNPROTECT(lev);
+    }
+  }
+  BRIDGEIF_READ_UNPROTECT(lev);
+  return ERR_VAL;
+}
+
+/** Get the forwarding port(s) (as bit mask) for the specified destination mac address */
+static bridgeif_portmask_t
+bridgeif_find_dst_ports(bridgeif_private_t *br, struct eth_addr *dst_addr)
+{
+  int i;
+  BRIDGEIF_DECL_PROTECT(lev);
+  BRIDGEIF_READ_PROTECT(lev);
+  /* first check for static entries */
+  for (i = 0; i < br->max_fdbs_entries; i++) {
+    if (br->fdbs[i].used) {
+      if (!memcmp(&br->fdbs[i].addr, dst_addr, sizeof(struct eth_addr))) {
+        bridgeif_portmask_t ret = br->fdbs[i].dst_ports;
+        BRIDGEIF_READ_UNPROTECT(lev);
+        return ret;
+      }
+    }
+  }
+  if (dst_addr->addr[0] & 1) {
+    /* no match found: flood remaining group address */
+    BRIDGEIF_READ_UNPROTECT(lev);
+    return BR_FLOOD;
+  }
+  BRIDGEIF_READ_UNPROTECT(lev);
+  /* no match found: check dynamic fdb for port or fall back to flooding */
+  return bridgeif_fdb_get_dst_ports(br->fdbd, dst_addr);
+}
+
+/** Helper function to see if a destination mac belongs to the bridge
+ * (bridge netif or one of the port netifs), in which case the frame
+ * is sent to the cpu only.
+ */
+static int
+bridgeif_is_local_mac(bridgeif_private_t *br, struct eth_addr *addr)
+{
+  int i;
+  BRIDGEIF_DECL_PROTECT(lev);
+  if (!memcmp(br->netif->hwaddr, addr, sizeof(struct eth_addr))) {
+    return 1;
+  }
+  BRIDGEIF_READ_PROTECT(lev);
+  for (i = 0; i < br->num_ports; i++) {
+    struct netif *portif = br->ports[i].port_netif;
+    if (portif != NULL) {
+      if (!memcmp(portif->hwaddr, addr, sizeof(struct eth_addr))) {
+        BRIDGEIF_READ_UNPROTECT(lev);
+        return 1;
+      }
+    }
+  }
+  BRIDGEIF_READ_UNPROTECT(lev);
+  return 0;
+}
+
+/* Output helper function */
+static err_t
+bridgeif_send_to_port(bridgeif_private_t *br, struct pbuf *p, u8_t dstport_idx)
+{
+  if (dstport_idx < BRIDGEIF_MAX_PORTS) {
+    /* possibly an external port */
+    if (dstport_idx < br->max_ports) {
+      struct netif *portif = br->ports[dstport_idx].port_netif;
+      if ((portif != NULL) && (portif->linkoutput != NULL)) {
+        /* prevent sending out to rx port */
+        if (netif_get_index(portif) != p->if_idx) {
+          if (netif_is_link_up(portif)) {
+            LWIP_DEBUGF(BRIDGEIF_FW_DEBUG, ("br -> flood(%p:%d) -> %d\n", (void *)p, p->if_idx, netif_get_index(portif)));
+            return portif->linkoutput(portif, p);
+          }
+        }
+      }
+    }
+  } else {
+    LWIP_ASSERT("invalid port index", dstport_idx == BRIDGEIF_MAX_PORTS);
+  }
+  return ERR_OK;
+}
+
+/** Helper function to pass a pbuf to all ports marked in 'dstports'
+ */
+static err_t
+bridgeif_send_to_ports(bridgeif_private_t *br, struct pbuf *p, bridgeif_portmask_t dstports)
+{
+  err_t err, ret_err = ERR_OK;
+  u8_t i;
+  bridgeif_portmask_t mask = 1;
+  BRIDGEIF_DECL_PROTECT(lev);
+  BRIDGEIF_READ_PROTECT(lev);
+  for (i = 0; i < BRIDGEIF_MAX_PORTS; i++, mask = (bridgeif_portmask_t)(mask << 1)) {
+    if (dstports & mask) {
+      err = bridgeif_send_to_port(br, p, i);
+      if (err != ERR_OK) {
+        ret_err = err;
+      }
+    }
+  }
+  BRIDGEIF_READ_UNPROTECT(lev);
+  return ret_err;
+}
+
+/** Output function of the application port of the bridge (the one with an ip address).
+ * The forwarding port(s) where this pbuf is sent on is/are automatically selected
+ * from the FDB.
+ */
+static err_t
+bridgeif_output(struct netif *netif, struct pbuf *p)
+{
+  err_t err;
+  bridgeif_private_t *br = (bridgeif_private_t *)netif->state;
+  struct eth_addr *dst = (struct eth_addr *)(p->payload);
+
+  bridgeif_portmask_t dstports = bridgeif_find_dst_ports(br, dst);
+  err = bridgeif_send_to_ports(br, p, dstports);
+
+  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 */
+
+  LINK_STATS_INC(link.xmit);
+
+  return err;
+}
+
+/** The actual bridge input function. Port netif's input is changed to call
+ * here. This function decides where the frame is forwarded.
+ */
+static err_t
+bridgeif_input(struct pbuf *p, struct netif *netif)
+{
+  u8_t rx_idx;
+  bridgeif_portmask_t dstports;
+  struct eth_addr *src, *dst;
+  bridgeif_private_t *br;
+  bridgeif_port_t *port;
+  if (p == NULL || netif == NULL) {
+    return ERR_VAL;
+  }
+  port = (bridgeif_port_t *)netif_get_client_data(netif, bridgeif_netif_client_id);
+  LWIP_ASSERT("port data not set", port != NULL);
+  if (port == NULL || port->bridge == NULL) {
+    return ERR_VAL;
+  }
+  br = (bridgeif_private_t *)port->bridge;
+  rx_idx = netif_get_index(netif);
+  /* store receive index in pbuf */
+  p->if_idx = rx_idx;
+
+  dst = (struct eth_addr *)p->payload;
+  src = (struct eth_addr *)(((u8_t *)p->payload) + sizeof(struct eth_addr));
+
+  if ((src->addr[0] & 1) == 0) {
+    /* update src for all non-group addresses */
+    bridgeif_fdb_update_src(br->fdbd, src, port->port_num);
+  }
+
+  if (dst->addr[0] & 1) {
+    /* group address -> flood + cpu? */
+    dstports = bridgeif_find_dst_ports(br, dst);
+    bridgeif_send_to_ports(br, p, dstports);
+    if (dstports & (1 << BRIDGEIF_MAX_PORTS)) {
+      /* we pass the reference to ->input or have to free it */
+      LWIP_DEBUGF(BRIDGEIF_FW_DEBUG, ("br -> input(%p)\n", (void *)p));
+      if (br->netif->input(p, br->netif) != ERR_OK) {
+        pbuf_free(p);
+      }
+    } else {
+      /* all references done */
+      pbuf_free(p);
+    }
+    /* always return ERR_OK here to prevent the caller freeing the pbuf */
+    return ERR_OK;
+  } else {
+    /* is this for one of the local ports? */
+    if (bridgeif_is_local_mac(br, dst)) {
+      /* yes, send to cpu port only */
+      LWIP_DEBUGF(BRIDGEIF_FW_DEBUG, ("br -> input(%p)\n", (void *)p));
+      return br->netif->input(p, br->netif);
+    }
+
+    /* get dst port */
+    dstports = bridgeif_find_dst_ports(br, dst);
+    bridgeif_send_to_ports(br, p, dstports);
+    /* no need to send to cpu, flooding is for external ports only */
+    /* by  this, we consumed the pbuf */
+    pbuf_free(p);
+    /* always return ERR_OK here to prevent the caller freeing the pbuf */
+    return ERR_OK;
+  }
+}
+
+#if !BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT
+/** Input function for port netifs used to synchronize into tcpip_thread.
+ */
+static err_t
+bridgeif_tcpip_input(struct pbuf *p, struct netif *netif)
+{
+  return tcpip_inpkt(p, netif, bridgeif_input);
+}
+#endif /* BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT */
+
+/**
+ * @ingroup bridgeif
+ * Initialization function passed to netif_add().
+ *
+ * ATTENTION: A pointer to a @ref bridgeif_initdata_t must be passed as 'state'
+ *            to @ref netif_add when adding the bridge. I supplies MAC address
+ *            and controls memory allocation (number of ports, FDB size).
+ *
+ * @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
+bridgeif_init(struct netif *netif)
+{
+  bridgeif_initdata_t *init_data;
+  bridgeif_private_t *br;
+  size_t alloc_len_sizet;
+  mem_size_t alloc_len;
+
+  LWIP_ASSERT("netif != NULL", (netif != NULL));
+  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"));
+  }
+#endif
+
+  if (bridgeif_netif_client_id == 0xFF) {
+    bridgeif_netif_client_id = netif_alloc_client_data_id();
+  }
+
+  init_data = (bridgeif_initdata_t *)netif->state;
+  LWIP_ASSERT("init_data != NULL", (init_data != NULL));
+  LWIP_ASSERT("init_data->max_ports <= BRIDGEIF_MAX_PORTS",
+              init_data->max_ports <= BRIDGEIF_MAX_PORTS);
+
+  alloc_len_sizet = sizeof(bridgeif_private_t) + (init_data->max_ports * sizeof(bridgeif_port_t) + (init_data->max_fdb_static_entries * sizeof(bridgeif_fdb_static_entry_t)));
+  alloc_len = (mem_size_t)alloc_len_sizet;
+  LWIP_ASSERT("alloc_len == alloc_len_sizet", alloc_len == alloc_len_sizet);
+  LWIP_DEBUGF(BRIDGEIF_DEBUG, ("bridgeif_init: allocating %d bytes for private data\n", (int)alloc_len));
+  br = (bridgeif_private_t *)mem_calloc(1, alloc_len);
+  if (br == NULL) {
+    LWIP_DEBUGF(NETIF_DEBUG, ("bridgeif_init: out of memory\n"));
+    return ERR_MEM;
+  }
+  memcpy(&br->ethaddr, &init_data->ethaddr, sizeof(br->ethaddr));
+  br->netif = netif;
+
+  br->max_ports = init_data->max_ports;
+  br->ports = (bridgeif_port_t *)(br + 1);
+
+  br->max_fdbs_entries = init_data->max_fdb_static_entries;
+  br->fdbs = (bridgeif_fdb_static_entry_t *)(((u8_t *)(br + 1)) + (init_data->max_ports * sizeof(bridgeif_port_t)));
+
+  br->max_fdbd_entries = init_data->max_fdb_dynamic_entries;
+  br->fdbd = bridgeif_fdb_init(init_data->max_fdb_dynamic_entries);
+  if (br->fdbd == NULL) {
+    LWIP_DEBUGF(NETIF_DEBUG, ("bridgeif_init: out of memory in fdb_init\n"));
+    mem_free(br);
+    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, 0);
+
+  netif->state = br;
+  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 = bridgeif_output;
+
+  /* set MAC hardware address length */
+  netif->hwaddr_len = ETH_HWADDR_LEN;
+
+  /* set MAC hardware address */
+  memcpy(netif->hwaddr, &br->ethaddr, ETH_HWADDR_LEN);
+
+  /* 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_ETHERNET | NETIF_FLAG_IGMP | NETIF_FLAG_MLD6 | 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 */
+
+  return ERR_OK;
+}
+
+/**
+ * @ingroup bridgeif
+ * Add a port to the bridge
+ */
+err_t
+bridgeif_add_port(struct netif *bridgeif, struct netif *portif)
+{
+  bridgeif_private_t *br;
+  bridgeif_port_t *port;
+
+  LWIP_ASSERT("bridgeif != NULL", bridgeif != NULL);
+  LWIP_ASSERT("bridgeif->state != NULL", bridgeif->state != NULL);
+  LWIP_ASSERT("portif != NULL", portif != NULL);
+
+  if (!(portif->flags & NETIF_FLAG_ETHARP) || !(portif->flags & NETIF_FLAG_ETHERNET)) {
+    /* can only add ETHERNET/ETHARP interfaces */
+    return ERR_VAL;
+  }
+
+  br = (bridgeif_private_t *)bridgeif->state;
+
+  if (br->num_ports >= br->max_ports) {
+    return ERR_VAL;
+  }
+  port = &br->ports[br->num_ports];
+  port->port_netif = portif;
+  port->port_num = br->num_ports;
+  port->bridge = br;
+  br->num_ports++;
+
+  /* let the port call us on input */
+#if BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT
+  portif->input = bridgeif_input;
+#else
+  portif->input = bridgeif_tcpip_input;
+#endif
+  /* store pointer to bridge in netif */
+  netif_set_client_data(portif, bridgeif_netif_client_id, port);
+  /* remove ETHARP flag to prevent sending report events on netif-up */
+  netif_clear_flags(portif, NETIF_FLAG_ETHARP);
+
+  return ERR_OK;
+}
+
+#endif /* LWIP_NUM_NETIF_CLIENT_DATA */
diff --git a/src/netif/bridgeif_fdb.c b/src/netif/bridgeif_fdb.c
new file mode 100644
index 0000000..6739fc2
--- /dev/null
+++ b/src/netif/bridgeif_fdb.c
@@ -0,0 +1,212 @@
+/**
+ * @file
+ * lwIP netif implementing an FDB for IEEE 802.1D MAC Bridge
+ */
+
+/*
+ * 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>
+ *
+ */
+
+/**
+ * @defgroup bridgeif_fdb FDB example code
+ * @ingroup bridgeif
+ * This file implements an example for an FDB (Forwarding DataBase)
+ */
+
+#include "netif/bridgeif.h"
+#include "lwip/sys.h"
+#include "lwip/mem.h"
+#include "lwip/timeouts.h"
+#include <string.h>
+
+#define BRIDGEIF_AGE_TIMER_MS 1000
+
+#define BR_FDB_TIMEOUT_SEC  (60*5) /* 5 minutes FDB timeout */
+
+typedef struct bridgeif_dfdb_entry_s {
+  u8_t used;
+  u8_t port;
+  u32_t ts;
+  struct eth_addr addr;
+} bridgeif_dfdb_entry_t;
+
+typedef struct bridgeif_dfdb_s {
+  u16_t max_fdb_entries;
+  bridgeif_dfdb_entry_t *fdb;
+} bridgeif_dfdb_t;
+
+/**
+ * @ingroup bridgeif_fdb
+ * A real simple and slow implementation of an auto-learning forwarding database that
+ * 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 
+ * provide a better implementation :-)
+ */
+void
+bridgeif_fdb_update_src(void *fdb_ptr, struct eth_addr *src_addr, u8_t port_idx)
+{
+  int i;
+  bridgeif_dfdb_t *fdb = (bridgeif_dfdb_t *)fdb_ptr;
+  BRIDGEIF_DECL_PROTECT(lev);
+  BRIDGEIF_READ_PROTECT(lev);
+  for (i = 0; i < fdb->max_fdb_entries; i++) {
+    bridgeif_dfdb_entry_t *e = &fdb->fdb[i];
+    if (e->used && e->ts) {
+      if (!memcmp(&e->addr, src_addr, sizeof(struct eth_addr))) {
+        LWIP_DEBUGF(BRIDGEIF_FDB_DEBUG, ("br: update src %02x:%02x:%02x:%02x:%02x:%02x (from %d) @ idx %d\n",
+                                         src_addr->addr[0], src_addr->addr[1], src_addr->addr[2], src_addr->addr[3], src_addr->addr[4], src_addr->addr[5],
+                                         port_idx, i));
+        BRIDGEIF_WRITE_PROTECT(lev);
+        e->ts = BR_FDB_TIMEOUT_SEC;
+        e->port = port_idx;
+        BRIDGEIF_WRITE_UNPROTECT(lev);
+        BRIDGEIF_READ_UNPROTECT(lev);
+        return;
+      }
+    }
+  }
+  /* not found, allocate new entry from free */
+  for (i = 0; i < fdb->max_fdb_entries; i++) {
+    bridgeif_dfdb_entry_t *e = &fdb->fdb[i];
+    if (!e->used || !e->ts) {
+      BRIDGEIF_WRITE_PROTECT(lev);
+      /* check again when protected */
+      if (!e->used || !e->ts) {
+        LWIP_DEBUGF(BRIDGEIF_FDB_DEBUG, ("br: create src %02x:%02x:%02x:%02x:%02x:%02x (from %d) @ idx %d\n",
+                                         src_addr->addr[0], src_addr->addr[1], src_addr->addr[2], src_addr->addr[3], src_addr->addr[4], src_addr->addr[5],
+                                         port_idx, i));
+        memcpy(&e->addr, src_addr, sizeof(struct eth_addr));
+        e->ts = BR_FDB_TIMEOUT_SEC;
+        e->port = port_idx;
+        e->used = 1;
+        BRIDGEIF_WRITE_UNPROTECT(lev);
+        BRIDGEIF_READ_UNPROTECT(lev);
+        return;
+      }
+      BRIDGEIF_WRITE_UNPROTECT(lev);
+    }
+  }
+  BRIDGEIF_READ_UNPROTECT(lev);
+  /* 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 
+ */
+bridgeif_portmask_t
+bridgeif_fdb_get_dst_ports(void *fdb_ptr, struct eth_addr *dst_addr)
+{
+  int i;
+  bridgeif_dfdb_t *fdb = (bridgeif_dfdb_t *)fdb_ptr;
+  BRIDGEIF_DECL_PROTECT(lev);
+  BRIDGEIF_READ_PROTECT(lev);
+  for (i = 0; i < fdb->max_fdb_entries; i++) {
+    bridgeif_dfdb_entry_t *e = &fdb->fdb[i];
+    if (e->used && e->ts) {
+      if (!memcmp(&e->addr, dst_addr, sizeof(struct eth_addr))) {
+        bridgeif_portmask_t ret = (bridgeif_portmask_t)(1 << e->port);
+        BRIDGEIF_READ_UNPROTECT(lev);
+        return ret;
+      }
+    }
+  }
+  BRIDGEIF_READ_UNPROTECT(lev);
+  return BR_FLOOD;
+}
+
+/**
+ * @ingroup bridgeif_fdb
+ * Aging implementation of our simple fdb
+ */
+static void
+bridgeif_fdb_age_one_second(void *fdb_ptr)
+{
+  int i;
+  bridgeif_dfdb_t *fdb;
+  BRIDGEIF_DECL_PROTECT(lev);
+
+  fdb = (bridgeif_dfdb_t *)fdb_ptr;
+  BRIDGEIF_READ_PROTECT(lev);
+
+  for (i = 0; i < fdb->max_fdb_entries; i++) {
+    bridgeif_dfdb_entry_t *e = &fdb->fdb[i];
+    if (e->used && e->ts) {
+      BRIDGEIF_WRITE_PROTECT(lev);
+      /* check again when protected */
+      if (e->used && e->ts) {
+        if (--e->ts == 0) {
+          e->used = 0;
+        }
+      }
+      BRIDGEIF_WRITE_UNPROTECT(lev);
+    }
+  }
+  BRIDGEIF_READ_UNPROTECT(lev);
+}
+
+/** Timer callback for fdb aging, called once per second */
+static void
+bridgeif_age_tmr(void *arg)
+{
+  bridgeif_dfdb_t *fdb = (bridgeif_dfdb_t *)arg;
+
+  LWIP_ASSERT("invalid arg", arg != NULL);
+
+  bridgeif_fdb_age_one_second(fdb);
+  sys_timeout(BRIDGEIF_AGE_TIMER_MS, bridgeif_age_tmr, arg);
+}
+
+/**
+ * @ingroup bridgeif_fdb
+ * Init our simple fdb list
+ */
+void *
+bridgeif_fdb_init(u16_t max_fdb_entries)
+{
+  bridgeif_dfdb_t *fdb;
+  size_t alloc_len_sizet = sizeof(bridgeif_dfdb_t) + (max_fdb_entries * sizeof(bridgeif_dfdb_entry_t));
+  mem_size_t alloc_len = (mem_size_t)alloc_len_sizet;
+  LWIP_ASSERT("alloc_len == alloc_len_sizet", alloc_len == alloc_len_sizet);
+  LWIP_DEBUGF(BRIDGEIF_DEBUG, ("bridgeif_fdb_init: allocating %d bytes for private FDB data\n", (int)alloc_len));
+  fdb = (bridgeif_dfdb_t *)mem_calloc(1, alloc_len);
+  if (fdb == NULL) {
+    return NULL;
+  }
+  fdb->max_fdb_entries = max_fdb_entries;
+  fdb->fdb = (bridgeif_dfdb_entry_t *)(fdb + 1);
+
+  sys_timeout(BRIDGEIF_AGE_TIMER_MS, bridgeif_age_tmr, fdb);
+
+  return fdb;
+}
diff --git a/src/netif/ethernet.c b/src/netif/ethernet.c
index 52ea423..dd171e2 100644
--- a/src/netif/ethernet.c
+++ b/src/netif/ethernet.c
@@ -1,7 +1,7 @@
 /**
  * @file
  * Ethernet common functions
- * 
+ *
  * @defgroup ethernet Ethernet
  * @ingroup callbackstyle_api
  */
@@ -60,8 +60,8 @@
 #include LWIP_HOOK_FILENAME
 #endif
 
-const struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}};
-const struct eth_addr ethzero = {{0,0,0,0,0,0}};
+const struct eth_addr ethbroadcast = {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}};
+const struct eth_addr ethzero = {{0, 0, 0, 0, 0, 0}};
 
 /**
  * @ingroup lwip_nosys
@@ -72,7 +72,7 @@
  *
  * @param p the received packet, p->payload pointing to the ethernet header
  * @param netif the network interface on which the packet was received
- * 
+ *
  * @see LWIP_HOOK_UNKNOWN_ETH_PROTOCOL
  * @see ETHARP_SUPPORT_VLAN
  * @see LWIP_HOOK_VLAN_CHECK
@@ -80,12 +80,14 @@
 err_t
 ethernet_input(struct pbuf *p, struct netif *netif)
 {
-  struct eth_hdr* ethhdr;
+  struct eth_hdr *ethhdr;
   u16_t type;
 #if LWIP_ARP || ETHARP_SUPPORT_VLAN || LWIP_IPV6
-  s16_t ip_hdr_offset = SIZEOF_ETH_HDR;
+  u16_t next_hdr_offset = SIZEOF_ETH_HDR;
 #endif /* LWIP_ARP || ETHARP_SUPPORT_VLAN */
 
+  LWIP_ASSERT_CORE_LOCKED();
+
   if (p->len <= SIZEOF_ETH_HDR) {
     /* a packet with only an ethernet header (or less) is not valid for us */
     ETHARP_STATS_INC(etharp.proterr);
@@ -94,20 +96,25 @@
     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,
-    ("ethernet_input: dest:%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F", src:%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F", type:%"X16_F"\n",
-     (unsigned)ethhdr->dest.addr[0], (unsigned)ethhdr->dest.addr[1], (unsigned)ethhdr->dest.addr[2],
-     (unsigned)ethhdr->dest.addr[3], (unsigned)ethhdr->dest.addr[4], (unsigned)ethhdr->dest.addr[5],
-     (unsigned)ethhdr->src.addr[0],  (unsigned)ethhdr->src.addr[1],  (unsigned)ethhdr->src.addr[2],
-     (unsigned)ethhdr->src.addr[3],  (unsigned)ethhdr->src.addr[4],  (unsigned)ethhdr->src.addr[5],
-     lwip_htons(ethhdr->type)));
+              ("ethernet_input: dest:%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F", src:%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F", type:%"X16_F"\n",
+               (unsigned char)ethhdr->dest.addr[0], (unsigned char)ethhdr->dest.addr[1], (unsigned char)ethhdr->dest.addr[2],
+               (unsigned char)ethhdr->dest.addr[3], (unsigned char)ethhdr->dest.addr[4], (unsigned char)ethhdr->dest.addr[5],
+               (unsigned char)ethhdr->src.addr[0],  (unsigned char)ethhdr->src.addr[1],  (unsigned char)ethhdr->src.addr[2],
+               (unsigned char)ethhdr->src.addr[3],  (unsigned char)ethhdr->src.addr[4],  (unsigned char)ethhdr->src.addr[5],
+               lwip_htons(ethhdr->type)));
 
   type = ethhdr->type;
 #if ETHARP_SUPPORT_VLAN
   if (type == PP_HTONS(ETHTYPE_VLAN)) {
-    struct eth_vlan_hdr *vlan = (struct eth_vlan_hdr*)(((char*)ethhdr) + SIZEOF_ETH_HDR);
+    struct eth_vlan_hdr *vlan = (struct eth_vlan_hdr *)(((char *)ethhdr) + SIZEOF_ETH_HDR);
+    next_hdr_offset = SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR;
     if (p->len <= SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR) {
       /* a packet with only an ethernet/vlan header (or less) is not valid for us */
       ETHARP_STATS_INC(etharp.proterr);
@@ -129,7 +136,6 @@
     }
 #endif /* defined(LWIP_HOOK_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK_FN) */
     type = vlan->tpid;
-    ip_hdr_offset = SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR;
   }
 #endif /* ETHARP_SUPPORT_VLAN */
 
@@ -151,8 +157,8 @@
 #if LWIP_IPV6
     else if ((ethhdr->dest.addr[0] == LL_IP6_MULTICAST_ADDR_0) &&
              (ethhdr->dest.addr[1] == LL_IP6_MULTICAST_ADDR_1)) {
-        /* mark the pbuf as link-layer multicast */
-        p->flags |= PBUF_FLAG_LLMCAST;
+      /* mark the pbuf as link-layer multicast */
+      p->flags |= PBUF_FLAG_LLMCAST;
     }
 #endif /* LWIP_IPV6 */
     else if (eth_addr_cmp(&ethhdr->dest, &ethbroadcast)) {
@@ -168,11 +174,11 @@
       if (!(netif->flags & NETIF_FLAG_ETHARP)) {
         goto free_and_return;
       }
-      /* skip Ethernet header */
-      if ((p->len < ip_hdr_offset) || pbuf_header(p, (s16_t)-ip_hdr_offset)) {
+      /* skip Ethernet header (min. size checked above) */
+      if (pbuf_remove_header(p, next_hdr_offset)) {
         LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,
-          ("ethernet_input: IPv4 packet dropped, too short (%"S16_F"/%"S16_F")\n",
-          p->tot_len, ip_hdr_offset));
+                    ("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"));
         goto free_and_return;
       } else {
@@ -185,11 +191,11 @@
       if (!(netif->flags & NETIF_FLAG_ETHARP)) {
         goto free_and_return;
       }
-      /* skip Ethernet header */
-      if ((p->len < ip_hdr_offset) || pbuf_header(p, (s16_t)-ip_hdr_offset)) {
+      /* skip Ethernet header (min. size checked above) */
+      if (pbuf_remove_header(p, next_hdr_offset)) {
         LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,
-          ("ethernet_input: ARP response packet dropped, too short (%"S16_F"/%"S16_F")\n",
-          p->tot_len, ip_hdr_offset));
+                    ("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"));
         ETHARP_STATS_INC(etharp.lenerr);
         ETHARP_STATS_INC(etharp.drop);
@@ -213,10 +219,10 @@
 #if LWIP_IPV6
     case PP_HTONS(ETHTYPE_IPV6): /* IPv6 */
       /* skip Ethernet header */
-      if ((p->len < ip_hdr_offset) || pbuf_header(p, (s16_t)-ip_hdr_offset)) {
+      if ((p->len < next_hdr_offset) || pbuf_remove_header(p, next_hdr_offset)) {
         LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,
-          ("ethernet_input: IPv6 packet dropped, too short (%"S16_F"/%"S16_F")\n",
-          p->tot_len, ip_hdr_offset));
+                    ("ethernet_input: IPv6 packet dropped, too short (%"U16_F"/%"U16_F")\n",
+                     p->tot_len, next_hdr_offset));
         goto free_and_return;
       } else {
         /* pass to IPv6 layer */
@@ -227,7 +233,7 @@
 
     default:
 #ifdef LWIP_HOOK_UNKNOWN_ETH_PROTOCOL
-      if(LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(p, netif) == ERR_OK) {
+      if (LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(p, netif) == ERR_OK) {
         break;
       }
 #endif
@@ -257,28 +263,27 @@
  * @param p the packet to send. pbuf layer must be @ref PBUF_LINK.
  * @param src the source MAC address to be copied into the ethernet header
  * @param dst the destination MAC address to be copied into the ethernet header
- * @param eth_type ethernet type (@ref eth_type)
+ * @param eth_type ethernet type (@ref lwip_ieee_eth_type)
  * @return ERR_OK if the packet was sent, any other err_t on failure
  */
 err_t
-ethernet_output(struct netif* netif, struct pbuf* p,
-                const struct eth_addr* src, const struct eth_addr* dst,
-                u16_t eth_type)
-{
-  struct eth_hdr* ethhdr;
+ethernet_output(struct netif * netif, struct pbuf * p,
+                const struct eth_addr * src, const struct eth_addr * dst,
+                u16_t eth_type) {
+  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 (vlan_prio_vid >= 0) {
-    struct eth_vlan_hdr* vlanhdr;
+    struct eth_vlan_hdr *vlanhdr;
 
     LWIP_ASSERT("prio_vid must be <= 0xFFFF", vlan_prio_vid <= 0xFFFF);
 
-    if (pbuf_header(p, SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR) != 0) {
+    if (pbuf_add_header(p, SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR) != 0) {
       goto pbuf_header_failed;
     }
-    vlanhdr = (struct eth_vlan_hdr*)(((u8_t*)p->payload) + SIZEOF_ETH_HDR);
+    vlanhdr = (struct eth_vlan_hdr *)(((u8_t *)p->payload) + SIZEOF_ETH_HDR);
     vlanhdr->tpid     = eth_type_be;
     vlanhdr->prio_vid = lwip_htons((u16_t)vlan_prio_vid);
 
@@ -286,27 +291,29 @@
   } else
 #endif /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
   {
-    if (pbuf_header(p, SIZEOF_ETH_HDR) != 0) {
+    if (pbuf_add_header(p, SIZEOF_ETH_HDR) != 0) {
       goto pbuf_header_failed;
     }
   }
 
-  ethhdr = (struct eth_hdr*)p->payload;
+  LWIP_ASSERT_CORE_LOCKED();
+
+  ethhdr = (struct eth_hdr *)p->payload;
   ethhdr->type = eth_type_be;
-  ETHADDR32_COPY(&ethhdr->dest, dst);
-  ETHADDR16_COPY(&ethhdr->src,  src);
+  SMEMCPY(&ethhdr->dest, dst, ETH_HWADDR_LEN);
+  SMEMCPY(&ethhdr->src,  src, ETH_HWADDR_LEN);
 
   LWIP_ASSERT("netif->hwaddr_len must be 6 for ethernet_output!",
-    (netif->hwaddr_len == ETH_HWADDR_LEN));
+              (netif->hwaddr_len == ETH_HWADDR_LEN));
   LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE,
-    ("ethernet_output: sending packet %p\n", (void *)p));
+              ("ethernet_output: sending packet %p\n", (void *)p));
 
   /* send the packet */
   return netif->linkoutput(netif, p);
 
 pbuf_header_failed:
   LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
-    ("ethernet_output: could not allocate room for header.\n"));
+              ("ethernet_output: could not allocate room for header.\n"));
   LINK_STATS_INC(link.lenerr);
   return ERR_BUF;
 }
diff --git a/src/netif/ethernetif_template.c b/src/netif/ethernetif_template.c
deleted file mode 100644
index dc8ae6c..0000000
--- a/src/netif/ethernetif_template.c
+++ /dev/null
@@ -1,335 +0,0 @@
-/**
- * @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_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_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_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_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...) */
-  netif->output = etharp_output;
-#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/src/netif/lowpan6.c b/src/netif/lowpan6.c
index cb1c688..7f0d276 100644
--- a/src/netif/lowpan6.c
+++ b/src/netif/lowpan6.c
@@ -1,7 +1,10 @@
 /**
-  * @file
+ * @file
  *
  * 6LowPAN output for IPv6. Uses ND tables for link-layer addressing. Fragments packets to 6LowPAN units.
+ *
+ * This implementation aims to conform to IEEE 802.15.4(-2015), RFC 4944 and RFC 6282.
+ * @todo: RFC 6775.
  */
 
 /*
@@ -40,14 +43,14 @@
  */
 
 /**
- * @defgroup sixlowpan 6LowPAN netif
- * @ingroup addons
+ * @defgroup sixlowpan 6LoWPAN (RFC4944)
+ * @ingroup netifs
  * 6LowPAN netif implementation
  */
 
 #include "netif/lowpan6.h"
 
-#if LWIP_IPV6 && LWIP_6LOWPAN
+#if LWIP_IPV6
 
 #include "lwip/ip.h"
 #include "lwip/pbuf.h"
@@ -58,40 +61,255 @@
 #include "lwip/udp.h"
 #include "lwip/tcpip.h"
 #include "lwip/snmp.h"
+#include "netif/ieee802154.h"
 
 #include <string.h>
 
-struct ieee_802154_addr {
-  u8_t addr_len;
-  u8_t addr[8];
-};
+#if LWIP_6LOWPAN_802154_HW_CRC
+#define LWIP_6LOWPAN_DO_CALC_CRC(buf, len) 0
+#else
+#define LWIP_6LOWPAN_DO_CALC_CRC(buf, len) LWIP_6LOWPAN_CALC_CRC(buf, len)
+#endif
 
-/** This is a helper struct.
+/** This is a helper struct for reassembly of fragments
+ * (IEEE 802.15.4 limits to 127 bytes)
  */
 struct lowpan6_reass_helper {
-  struct pbuf *pbuf;
   struct lowpan6_reass_helper *next_packet;
+  struct pbuf *reass;
+  struct pbuf *frags;
   u8_t timer;
-  struct ieee_802154_addr sender_addr;
+  struct lowpan6_link_addr sender_addr;
   u16_t datagram_size;
   u16_t datagram_tag;
 };
 
-static struct lowpan6_reass_helper * reass_list;
+/** This struct keeps track of per-netif state */
+struct lowpan6_ieee802154_data {
+  /** fragment reassembly list */
+  struct lowpan6_reass_helper *reass_list;
+#if LWIP_6LOWPAN_NUM_CONTEXTS > 0
+  /** address context for compression */
+  ip6_addr_t lowpan6_context[LWIP_6LOWPAN_NUM_CONTEXTS];
+#endif
+  /** Datagram Tag for fragmentation */
+  u16_t tx_datagram_tag;
+  /** local PAN ID for IEEE 802.15.4 header */
+  u16_t ieee_802154_pan_id;
+  /** Sequence Number for IEEE 802.15.4 transmission */
+  u8_t tx_frame_seq_num;
+};
+
+/* Maximum frame size is 127 bytes minus CRC size */
+#define LOWPAN6_MAX_PAYLOAD (127 - 2)
+
+/** Currently, this state is global, since there's only one 6LoWPAN netif */
+static struct lowpan6_ieee802154_data lowpan6_data;
 
 #if LWIP_6LOWPAN_NUM_CONTEXTS > 0
-static ip6_addr_t lowpan6_context[LWIP_6LOWPAN_NUM_CONTEXTS];
+#define LWIP_6LOWPAN_CONTEXTS(netif) lowpan6_data.lowpan6_context
+#else
+#define LWIP_6LOWPAN_CONTEXTS(netif) NULL
 #endif
 
-static u16_t ieee_802154_pan_id;
-
-static const struct ieee_802154_addr ieee_802154_broadcast = {2, {0xff, 0xff}};
+static const struct lowpan6_link_addr ieee_802154_broadcast = {2, {0xff, 0xff}};
 
 #if LWIP_6LOWPAN_INFER_SHORT_ADDRESS
-static struct ieee_802154_addr short_mac_addr = {2, {0,0}};
+static struct lowpan6_link_addr short_mac_addr = {2, {0, 0}};
 #endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */
 
-static err_t dequeue_datagram(struct lowpan6_reass_helper *lrh);
+/* IEEE 802.15.4 specific functions: */
+
+/** Write the IEEE 802.15.4 header that encapsulates the 6LoWPAN frame.
+ * Src and dst PAN IDs are filled with the ID set by @ref lowpan6_set_pan_id.
+ *
+ * Since the length is variable:
+ * @returns the header length
+ */
+static u8_t
+lowpan6_write_iee802154_header(struct ieee_802154_hdr *hdr, const struct lowpan6_link_addr *src,
+                               const struct lowpan6_link_addr *dst)
+{
+  u8_t ieee_header_len;
+  u8_t *buffer;
+  u8_t i;
+  u16_t fc;
+
+  fc = IEEE_802154_FC_FT_DATA; /* send data packet (2003 frame version) */
+  fc |= IEEE_802154_FC_PANID_COMPR; /* set PAN ID compression, for now src and dst PANs are equal */
+  if (dst != &ieee_802154_broadcast) {
+    fc |= IEEE_802154_FC_ACK_REQ; /* data packet, no broadcast: ack required. */
+  }
+  if (dst->addr_len == 2) {
+    fc |= IEEE_802154_FC_DST_ADDR_MODE_SHORT;
+  } else {
+    LWIP_ASSERT("invalid dst address length", dst->addr_len == 8);
+    fc |= IEEE_802154_FC_DST_ADDR_MODE_EXT;
+  }
+  if (src->addr_len == 2) {
+    fc |= IEEE_802154_FC_SRC_ADDR_MODE_SHORT;
+  } else {
+    LWIP_ASSERT("invalid src address length", src->addr_len == 8);
+    fc |= IEEE_802154_FC_SRC_ADDR_MODE_EXT;
+  }
+  hdr->frame_control = fc;
+  hdr->sequence_number = lowpan6_data.tx_frame_seq_num++;
+  hdr->destination_pan_id = lowpan6_data.ieee_802154_pan_id; /* pan id */
+
+  buffer = (u8_t *)hdr;
+  ieee_header_len = 5;
+  i = dst->addr_len;
+  /* reverse memcpy of dst addr */
+  while (i-- > 0) {
+    buffer[ieee_header_len++] = dst->addr[i];
+  }
+  /* Source PAN ID skipped due to PAN ID Compression */
+  i = src->addr_len;
+  /* reverse memcpy of src addr */
+  while (i-- > 0) {
+    buffer[ieee_header_len++] = src->addr[i];
+  }
+  return ieee_header_len;
+}
+
+/** Parse the IEEE 802.15.4 header from a pbuf.
+ * If successful, the header is hidden from the pbuf.
+ *
+ * PAN IDs and seuqence number are not checked
+ *
+ * @param p input pbuf, p->payload pointing at the IEEE 802.15.4 header
+ * @param src pointer to source address filled from the header
+ * @param dest pointer to destination address filled from the header
+ * @returns ERR_OK if successful
+ */
+static err_t
+lowpan6_parse_iee802154_header(struct pbuf *p, struct lowpan6_link_addr *src,
+                               struct lowpan6_link_addr *dest)
+{
+  u8_t *puc;
+  s8_t i;
+  u16_t frame_control, addr_mode;
+  u16_t datagram_offset;
+
+  /* Parse IEEE 802.15.4 header */
+  puc = (u8_t *)p->payload;
+  frame_control = puc[0] | (puc[1] << 8);
+  datagram_offset = 2;
+  if (frame_control & IEEE_802154_FC_SEQNO_SUPPR) {
+    if (IEEE_802154_FC_FRAME_VERSION_GET(frame_control) <= 1) {
+      /* sequence number suppressed, this is not valid for versions 0/1 */
+      return ERR_VAL;
+    }
+  } else {
+    datagram_offset++;
+  }
+  datagram_offset += 2; /* Skip destination PAN ID */
+  addr_mode = frame_control & IEEE_802154_FC_DST_ADDR_MODE_MASK;
+  if (addr_mode == IEEE_802154_FC_DST_ADDR_MODE_EXT) {
+    /* extended address (64 bit) */
+    dest->addr_len = 8;
+    /* reverse memcpy: */
+    for (i = 0; i < 8; i++) {
+      dest->addr[i] = puc[datagram_offset + 7 - i];
+    }
+    datagram_offset += 8;
+  } else if (addr_mode == IEEE_802154_FC_DST_ADDR_MODE_SHORT) {
+    /* short address (16 bit) */
+    dest->addr_len = 2;
+    /* reverse memcpy: */
+    dest->addr[0] = puc[datagram_offset + 1];
+    dest->addr[1] = puc[datagram_offset];
+    datagram_offset += 2;
+  } else {
+    /* unsupported address mode (do we need "no address"?) */
+    return ERR_VAL;
+  }
+
+  if (!(frame_control & IEEE_802154_FC_PANID_COMPR)) {
+    /* No PAN ID compression, skip source PAN ID */
+    datagram_offset += 2;
+  }
+
+  addr_mode = frame_control & IEEE_802154_FC_SRC_ADDR_MODE_MASK;
+  if (addr_mode == IEEE_802154_FC_SRC_ADDR_MODE_EXT) {
+    /* extended address (64 bit) */
+    src->addr_len = 8;
+    /* reverse memcpy: */
+    for (i = 0; i < 8; i++) {
+      src->addr[i] = puc[datagram_offset + 7 - i];
+    }
+    datagram_offset += 8;
+  } else if (addr_mode == IEEE_802154_FC_DST_ADDR_MODE_SHORT) {
+    /* short address (16 bit) */
+    src->addr_len = 2;
+    src->addr[0] = puc[datagram_offset + 1];
+    src->addr[1] = puc[datagram_offset];
+    datagram_offset += 2;
+  } else {
+    /* unsupported address mode (do we need "no address"?) */
+    return ERR_VAL;
+  }
+
+  /* hide IEEE802.15.4 header. */
+  if (pbuf_remove_header(p, datagram_offset)) {
+    return ERR_VAL;
+  }
+  return ERR_OK;
+}
+
+/** Calculate the 16-bit CRC as required by IEEE 802.15.4 */
+u16_t
+lowpan6_calc_crc(const void* buf, u16_t len)
+{
+#define CCITT_POLY_16 0x8408U
+  u16_t i;
+  u8_t b;
+  u16_t crc = 0;
+  const u8_t* p = (const u8_t*)buf;
+
+  for (i = 0; i < len; i++) {
+    u8_t data = *p;
+    for (b = 0U; b < 8U; b++) {
+      if (((data ^ crc) & 1) != 0) {
+        crc = (u16_t)((crc >> 1) ^ CCITT_POLY_16);
+      } else {
+        crc = (u16_t)(crc >> 1);
+      }
+      data = (u8_t)(data >> 1);
+    }
+    p++;
+  }
+  return crc;
+}
+
+/* Fragmentation specific functions: */
+
+static void
+free_reass_datagram(struct lowpan6_reass_helper *lrh)
+{
+  if (lrh->reass) {
+    pbuf_free(lrh->reass);
+  }
+  if (lrh->frags) {
+    pbuf_free(lrh->frags);
+  }
+  mem_free(lrh);
+}
+
+/**
+ * Removes a datagram from the reassembly queue.
+ **/
+static void
+dequeue_datagram(struct lowpan6_reass_helper *lrh, struct lowpan6_reass_helper *prev)
+{
+  if (lowpan6_data.reass_list == lrh) {
+    lowpan6_data.reass_list = lowpan6_data.reass_list->next_packet;
+  } else {
+    /* it wasn't the first, so it must have a valid 'prev' */
+    LWIP_ASSERT("sanity check linked list", prev != NULL);
+    prev->next_packet = lrh->next_packet;
+  }
+}
 
 /**
  * Periodic timer for 6LowPAN functions:
@@ -101,362 +319,72 @@
 void
 lowpan6_tmr(void)
 {
-  struct lowpan6_reass_helper *lrh, *lrh_temp;
+  struct lowpan6_reass_helper *lrh, *lrh_next, *lrh_prev = NULL;
 
-  lrh = reass_list;
+  lrh = lowpan6_data.reass_list;
   while (lrh != NULL) {
-    lrh_temp = lrh->next_packet;
+    lrh_next = lrh->next_packet;
     if ((--lrh->timer) == 0) {
-      dequeue_datagram(lrh);
-      pbuf_free(lrh->pbuf);
-      mem_free(lrh);
+      dequeue_datagram(lrh, lrh_prev);
+      free_reass_datagram(lrh);
+    } else {
+      lrh_prev = lrh;
     }
-    lrh = lrh_temp;
+    lrh = lrh_next;
   }
 }
 
-/**
- * Removes a datagram from the reassembly queue.
- **/
-static err_t
-dequeue_datagram(struct lowpan6_reass_helper *lrh)
-{
-  struct lowpan6_reass_helper *lrh_temp;
-
-  if (reass_list == lrh) {
-    reass_list = reass_list->next_packet;
-  } else {
-    lrh_temp = reass_list;
-    while (lrh_temp != NULL) {
-      if (lrh_temp->next_packet == lrh) {
-        lrh_temp->next_packet = lrh->next_packet;
-        break;
-      }
-      lrh_temp = lrh_temp->next_packet;
-    }
-  }
-
-  return ERR_OK;
-}
-
-static s8_t
-lowpan6_context_lookup(const ip6_addr_t *ip6addr)
-{
-  s8_t i;
-
-  for (i = 0; i < LWIP_6LOWPAN_NUM_CONTEXTS; i++) {
-    if (ip6_addr_netcmp(&lowpan6_context[i], ip6addr)) {
-      return i;
-    }
-  }
-
-  return -1;
-}
-
-/* Determine compression mode for unicast address. */
-static s8_t
-lowpan6_get_address_mode(const ip6_addr_t *ip6addr, const struct ieee_802154_addr *mac_addr)
-{
-  if (mac_addr->addr_len == 2) {
-    if ((ip6addr->addr[2] == (u32_t)PP_HTONL(0x000000ff)) &&
-      ((ip6addr->addr[3]  & PP_HTONL(0xffff0000)) == PP_NTOHL(0xfe000000))) {
-      if ((ip6addr->addr[3]  & PP_HTONL(0x0000ffff)) == lwip_ntohl((mac_addr->addr[0] << 8) | mac_addr->addr[1])) {
-        return 3;
-      }
-    }
-  } else if (mac_addr->addr_len == 8) {
-    if ((ip6addr->addr[2] == lwip_ntohl(((mac_addr->addr[0] ^ 2) << 24) | (mac_addr->addr[1] << 16) | mac_addr->addr[2] << 8 | mac_addr->addr[3])) &&
-      (ip6addr->addr[3] == lwip_ntohl((mac_addr->addr[4] << 24) | (mac_addr->addr[5] << 16) | mac_addr->addr[6] << 8 | mac_addr->addr[7]))) {
-      return 3;
-    }
-  }
-
-  if ((ip6addr->addr[2] == PP_HTONL(0x000000ffUL)) &&
-    ((ip6addr->addr[3]  & PP_HTONL(0xffff0000)) == PP_NTOHL(0xfe000000UL))) {
-    return 2;
-  }
-
-  return 1;
-}
-
-/* Determine compression mode for multicast address. */
-static s8_t
-lowpan6_get_address_mode_mc(const ip6_addr_t *ip6addr)
-{
-  if ((ip6addr->addr[0] == PP_HTONL(0xff020000)) &&
-      (ip6addr->addr[1] == 0) &&
-      (ip6addr->addr[2] == 0) &&
-      ((ip6addr->addr[3]  & PP_HTONL(0xffffff00)) == 0)) {
-    return 3;
-  } else if (((ip6addr->addr[0] & PP_HTONL(0xff00ffff)) == PP_HTONL(0xff000000)) &&
-              (ip6addr->addr[1] == 0)) {
-    if ((ip6addr->addr[2] == 0) &&
-        ((ip6addr->addr[3]  & PP_HTONL(0xff000000)) == 0)) {
-      return 2;
-    } else if ((ip6addr->addr[2]  & PP_HTONL(0xffffff00)) == 0) {
-      return 1;
-    }
-  }
-
-  return 0;
-}
-
 /*
  * Encapsulates data into IEEE 802.15.4 frames.
  * Fragments an IPv6 datagram into 6LowPAN units, which fit into IEEE 802.15.4 frames.
  * If configured, will compress IPv6 and or UDP headers.
  * */
 static err_t
-lowpan6_frag(struct netif *netif, struct pbuf *p, const struct ieee_802154_addr *src, const struct ieee_802154_addr *dst)
+lowpan6_frag(struct netif *netif, struct pbuf *p, const struct lowpan6_link_addr *src, const struct lowpan6_link_addr *dst)
 {
-  struct pbuf * p_frag;
-  u16_t frag_len, remaining_len;
-  u8_t * buffer;
+  struct pbuf *p_frag;
+  u16_t frag_len, remaining_len, max_data_len;
+  u8_t *buffer;
   u8_t ieee_header_len;
   u8_t lowpan6_header_len;
-  s8_t i;
-  static u8_t frame_seq_num;
-  static u16_t datagram_tag;
+  u8_t hidden_header_len;
+  u16_t crc;
   u16_t datagram_offset;
   err_t err = ERR_IF;
 
+  LWIP_ASSERT("lowpan6_frag: netif->linkoutput not set", netif->linkoutput != NULL);
+
   /* We'll use a dedicated pbuf for building 6LowPAN fragments. */
   p_frag = pbuf_alloc(PBUF_RAW, 127, PBUF_RAM);
   if (p_frag == NULL) {
     MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
     return ERR_MEM;
   }
+  LWIP_ASSERT("this needs a pbuf in one piece", p_frag->len == p_frag->tot_len);
 
   /* Write IEEE 802.15.4 header. */
-  buffer  = (u8_t*)p_frag->payload;
-  ieee_header_len = 0;
-  if (dst == &ieee_802154_broadcast) {
-    buffer[ieee_header_len++] = 0x01; /* data packet, no ack required. */
-  } else {
-    buffer[ieee_header_len++] = 0x21; /* data packet, ack required. */
-  }
-  buffer[ieee_header_len] = (0x00 << 4); /* 2003 frame version */
-  buffer[ieee_header_len] |= (dst->addr_len == 2) ? (0x02 << 2) : (0x03 << 2); /* destination addressing mode  */
-  buffer[ieee_header_len] |= (src->addr_len == 2) ? (0x02 << 6) : (0x03 << 6); /* source addressing mode */
-  ieee_header_len++;
-  buffer[ieee_header_len++] = frame_seq_num++;
-
-  buffer[ieee_header_len++] = ieee_802154_pan_id & 0xff; /* pan id */
-  buffer[ieee_header_len++] = (ieee_802154_pan_id >> 8) & 0xff; /* pan id */
-  i = dst->addr_len;
-  while (i-- > 0) {
-    buffer[ieee_header_len++] = dst->addr[i];
-  }
-
-  buffer[ieee_header_len++] = ieee_802154_pan_id & 0xff; /* pan id */
-  buffer[ieee_header_len++] = (ieee_802154_pan_id >> 8) & 0xff; /* pan id */
-  i = src->addr_len;
-  while (i-- > 0) {
-    buffer[ieee_header_len++] = src->addr[i];
-  }
+  buffer = (u8_t *)p_frag->payload;
+  ieee_header_len = lowpan6_write_iee802154_header((struct ieee_802154_hdr *)buffer, src, dst);
+  LWIP_ASSERT("ieee_header_len < p_frag->len", ieee_header_len < p_frag->len);
 
 #if LWIP_6LOWPAN_IPHC
   /* Perform 6LowPAN IPv6 header compression according to RFC 6282 */
-  {
-    struct ip6_hdr *ip6hdr;
-
-    /* Point to ip6 header and align copies of src/dest addresses. */
-    ip6hdr = (struct ip6_hdr *)p->payload;
-    ip_addr_copy_from_ip6(ip_data.current_iphdr_dest, ip6hdr->dest);
-    ip_addr_copy_from_ip6(ip_data.current_iphdr_src, ip6hdr->src);
-
-    /* Basic length of 6LowPAN header, set dispatch and clear fields. */
-    lowpan6_header_len = 2;
-    buffer[ieee_header_len] = 0x60;
-    buffer[ieee_header_len + 1] = 0;
-
-    /* Determine whether there will be a Context Identifier Extension byte or not.
-    * If so, set it already. */
-#if LWIP_6LOWPAN_NUM_CONTEXTS > 0
-    buffer[ieee_header_len + 2] = 0;
-
-    i = lowpan6_context_lookup(ip_2_ip6(&ip_data.current_iphdr_src));
-    if (i >= 0) {
-      /* Stateful source address compression. */
-      buffer[ieee_header_len + 1] |= 0x40;
-      buffer[ieee_header_len + 2] |= (i & 0x0f) << 4;
-    }
-
-    i = lowpan6_context_lookup(ip_2_ip6(&ip_data.current_iphdr_dest));
-    if (i >= 0) {
-      /* Stateful destination address compression. */
-      buffer[ieee_header_len + 1] |= 0x04;
-      buffer[ieee_header_len + 2] |= i & 0x0f;
-    }
-
-    if (buffer[ieee_header_len + 2] != 0x00) {
-      /* Context identifier extension byte is appended. */
-      buffer[ieee_header_len + 1] |= 0x80;
-      lowpan6_header_len++;
-    }
-#endif /* LWIP_6LOWPAN_NUM_CONTEXTS > 0 */
-
-    /* Determine TF field: Traffic Class, Flow Label */
-    if (IP6H_FL(ip6hdr) == 0) {
-      /* Flow label is elided. */
-      buffer[ieee_header_len] |= 0x10;
-      if (IP6H_TC(ip6hdr) == 0) {
-        /* Traffic class (ECN+DSCP) elided too. */
-        buffer[ieee_header_len] |= 0x08;
-      } else {
-        /* Traffic class (ECN+DSCP) appended. */
-        buffer[ieee_header_len + lowpan6_header_len++] = IP6H_TC(ip6hdr);
-      }
-    } else {
-      if (((IP6H_TC(ip6hdr) & 0x3f) == 0)) {
-        /* DSCP portion of Traffic Class is elided, ECN and FL are appended (3 bytes) */
-        buffer[ieee_header_len] |= 0x08;
-
-        buffer[ieee_header_len + lowpan6_header_len] = IP6H_TC(ip6hdr) & 0xc0;
-        buffer[ieee_header_len + lowpan6_header_len++] |= (IP6H_FL(ip6hdr) >> 16) & 0x0f;
-        buffer[ieee_header_len + lowpan6_header_len++] = (IP6H_FL(ip6hdr) >> 8) & 0xff;
-        buffer[ieee_header_len + lowpan6_header_len++] = IP6H_FL(ip6hdr) & 0xff;
-      } else {
-        /* Traffic class and flow label are appended (4 bytes) */
-        buffer[ieee_header_len + lowpan6_header_len++] = IP6H_TC(ip6hdr);
-        buffer[ieee_header_len + lowpan6_header_len++] = (IP6H_FL(ip6hdr) >> 16) & 0x0f;
-        buffer[ieee_header_len + lowpan6_header_len++] = (IP6H_FL(ip6hdr) >> 8) & 0xff;
-        buffer[ieee_header_len + lowpan6_header_len++] = IP6H_FL(ip6hdr) & 0xff;
-      }
-    }
-
-    /* Compress NH?
-    * Only if UDP for now. @todo support other NH compression. */
-    if (IP6H_NEXTH(ip6hdr) == IP6_NEXTH_UDP) {
-      buffer[ieee_header_len] |= 0x04;
-    } else {
-      /* append nexth. */
-      buffer[ieee_header_len + lowpan6_header_len++] = IP6H_NEXTH(ip6hdr);
-    }
-
-    /* Compress hop limit? */
-    if (IP6H_HOPLIM(ip6hdr) == 255) {
-      buffer[ieee_header_len] |= 0x03;
-    } else if (IP6H_HOPLIM(ip6hdr) == 64) {
-      buffer[ieee_header_len] |= 0x02;
-    } else if (IP6H_HOPLIM(ip6hdr) == 1) {
-      buffer[ieee_header_len] |= 0x01;
-    } else {
-      /* append hop limit */
-      buffer[ieee_header_len + lowpan6_header_len++] = IP6H_HOPLIM(ip6hdr);
-    }
-
-    /* Compress source address */
-    if (((buffer[ieee_header_len + 1] & 0x40) != 0) ||
-        (ip6_addr_islinklocal(ip_2_ip6(&ip_data.current_iphdr_src)))) {
-      /* Context-based or link-local source address compression. */
-      i = lowpan6_get_address_mode(ip_2_ip6(&ip_data.current_iphdr_src), src);
-      buffer[ieee_header_len + 1] |= (i & 0x03) << 4;
-      if (i == 1) {
-        MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 16, 8);
-        lowpan6_header_len += 8;
-      } else if (i == 2) {
-        MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 22, 2);
-        lowpan6_header_len += 2;
-      }
-    } else if (ip6_addr_isany(ip_2_ip6(&ip_data.current_iphdr_src))) {
-      /* Special case: mark SAC and leave SAM=0 */
-      buffer[ieee_header_len + 1] |= 0x40;
-    } else {
-      /* Append full address. */
-      MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 8, 16);
-      lowpan6_header_len += 16;
-    }
-
-    /* Compress destination address */
-    if (ip6_addr_ismulticast(ip_2_ip6(&ip_data.current_iphdr_dest))) {
-      /* @todo support stateful multicast address compression */
-
-      buffer[ieee_header_len + 1] |= 0x08;
-
-      i = lowpan6_get_address_mode_mc(ip_2_ip6(&ip_data.current_iphdr_dest));
-      buffer[ieee_header_len + 1] |= i & 0x03;
-      if (i == 0) {
-        MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 24, 16);
-        lowpan6_header_len += 16;
-      } else if (i == 1) {
-        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[25];
-        MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 35, 5);
-        lowpan6_header_len += 5;
-      } else if (i == 2) {
-        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[25];
-        MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 37, 3);
-        lowpan6_header_len += 3;
-      } else if (i == 3) {
-        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[39];
-      }
-    } else if (((buffer[ieee_header_len + 1] & 0x04) != 0) ||
-               (ip6_addr_islinklocal(ip_2_ip6(&ip_data.current_iphdr_dest)))) {
-      /* Context-based or link-local destination address compression. */
-      i = lowpan6_get_address_mode(ip_2_ip6(&ip_data.current_iphdr_dest), dst);
-      buffer[ieee_header_len + 1] |= i & 0x03;
-      if (i == 1) {
-        MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 32, 8);
-        lowpan6_header_len += 8;
-      } else if (i == 2) {
-        MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 38, 2);
-        lowpan6_header_len += 2;
-      }
-    } else {
-      /* Append full address. */
-      MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 24, 16);
-      lowpan6_header_len += 16;
-    }
-
-    /* Move to payload. */
-    pbuf_header(p, -IP6_HLEN);
-
-    /* Compress UDP header? */
-    if (IP6H_NEXTH(ip6hdr) == IP6_NEXTH_UDP) {
-      /* @todo support optional checksum compression */
-
-      buffer[ieee_header_len + lowpan6_header_len] = 0xf0;
-
-      /* determine port compression mode. */
-      if ((((u8_t *)p->payload)[0] == 0xf0) && ((((u8_t *)p->payload)[1] & 0xf0) == 0xb0) &&
-          (((u8_t *)p->payload)[2] == 0xf0) && ((((u8_t *)p->payload)[3] & 0xf0) == 0xb0)) {
-        /* Compress source and dest ports. */
-        buffer[ieee_header_len + lowpan6_header_len++] |= 0x03;
-        buffer[ieee_header_len + lowpan6_header_len++] = ((((u8_t *)p->payload)[1] & 0x0f) << 4) | (((u8_t *)p->payload)[3] & 0x0f);
-      } else if (((u8_t *)p->payload)[0] == 0xf0) {
-        /* Compress source port. */
-        buffer[ieee_header_len + lowpan6_header_len++] |= 0x02;
-        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[1];
-        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[2];
-        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[3];
-      } else if (((u8_t *)p->payload)[2] == 0xf0) {
-        /* Compress dest port. */
-        buffer[ieee_header_len + lowpan6_header_len++] |= 0x01;
-        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[0];
-        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[1];
-        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[3];
-      } else {
-        /* append full ports. */
-        lowpan6_header_len++;
-        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[0];
-        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[1];
-        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[2];
-        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[3];
-      }
-
-      /* elide length and copy checksum */
-      buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[6];
-      buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[7];
-
-      pbuf_header(p, -UDP_HLEN);
-    }
+  /* do the header compression (this does NOT copy any non-compressed data) */
+  err = lowpan6_compress_headers(netif, (u8_t *)p->payload, p->len,
+    &buffer[ieee_header_len], p_frag->len - ieee_header_len, &lowpan6_header_len,
+    &hidden_header_len, LWIP_6LOWPAN_CONTEXTS(netif), src, dst);
+  if (err != ERR_OK) {
+    MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
+    pbuf_free(p_frag);
+    return err;
   }
+  pbuf_remove_header(p, hidden_header_len);
 
-#else /* LWIP_6LOWPAN_HC */
+#else /* LWIP_6LOWPAN_IPHC */
   /* Send uncompressed IPv6 header with appropriate dispatch byte. */
   lowpan6_header_len = 1;
   buffer[ieee_header_len] = 0x41; /* IPv6 dispatch */
-#endif /* LWIP_6LOWPAN_HC */
+#endif /* LWIP_6LOWPAN_IPHC */
 
   /* Calculate remaining packet length */
   remaining_len = p->tot_len;
@@ -469,49 +397,50 @@
   }
 
   /* Fragment, or 1 packet? */
-  if (remaining_len > (127 - ieee_header_len - lowpan6_header_len - 3)) { /* 127 - header - 1 byte dispatch - 2 bytes CRC */
+  max_data_len = LOWPAN6_MAX_PAYLOAD - ieee_header_len - lowpan6_header_len;
+  if (remaining_len > max_data_len) {
+    u16_t data_len;
     /* We must move the 6LowPAN header to make room for the FRAG header. */
-    i = lowpan6_header_len;
-    while (i-- != 0) {
-      buffer[ieee_header_len + i + 4] = buffer[ieee_header_len + i];
-    }
+    memmove(&buffer[ieee_header_len + 4], &buffer[ieee_header_len], lowpan6_header_len);
 
     /* Now we need to fragment the packet. FRAG1 header first */
-    buffer[ieee_header_len] = 0xc0 | (((p->tot_len + lowpan6_header_len) >> 8) & 0x7);
-    buffer[ieee_header_len + 1] = (p->tot_len + lowpan6_header_len) & 0xff;
+    buffer[ieee_header_len] = 0xc0 | (((p->tot_len + hidden_header_len) >> 8) & 0x7);
+    buffer[ieee_header_len + 1] = (p->tot_len + hidden_header_len) & 0xff;
 
-    datagram_tag++;
-    buffer[ieee_header_len + 2] = datagram_tag & 0xff;
-    buffer[ieee_header_len + 3] = (datagram_tag >> 8) & 0xff;
+    lowpan6_data.tx_datagram_tag++;
+    buffer[ieee_header_len + 2] = (lowpan6_data.tx_datagram_tag >> 8) & 0xff;
+    buffer[ieee_header_len + 3] = lowpan6_data.tx_datagram_tag & 0xff;
 
     /* Fragment follows. */
-    frag_len = (127 - ieee_header_len - 4 - 2) & 0xf8;
+    data_len = (max_data_len - 4) & 0xf8;
+    frag_len = data_len + lowpan6_header_len;
 
     pbuf_copy_partial(p, buffer + ieee_header_len + lowpan6_header_len + 4, frag_len - lowpan6_header_len, 0);
     remaining_len -= frag_len - lowpan6_header_len;
-    datagram_offset = frag_len;
-
-    /* 2 bytes CRC */
-#if LWIP_6LOWPAN_HW_CRC
-    /* Leave blank, will be filled by HW. */
-#else /* LWIP_6LOWPAN_HW_CRC */
-    /* @todo calculate CRC */
-#endif /* LWIP_6LOWPAN_HW_CRC */
+    /* datagram offset holds the offset before compression */
+    datagram_offset = frag_len - lowpan6_header_len + hidden_header_len;
+    LWIP_ASSERT("datagram offset must be a multiple of 8", (datagram_offset & 7) == 0);
 
     /* Calculate frame length */
-    p_frag->len = p_frag->tot_len = ieee_header_len + 4 + frag_len + 2; /* add 2 dummy bytes for crc*/
+    p_frag->len = p_frag->tot_len = ieee_header_len + 4 + frag_len + 2; /* add 2 bytes for crc*/
+
+    /* 2 bytes CRC */
+    crc = LWIP_6LOWPAN_DO_CALC_CRC(p_frag->payload, p_frag->len - 2);
+    pbuf_take_at(p_frag, &crc, 2, p_frag->len - 2);
 
     /* send the packet */
     MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p_frag->tot_len);
-    LWIP_DEBUGF(LOWPAN6_DEBUG | LWIP_DBG_TRACE, ("lowpan6_send: sending packet %p\n", (void *)p));
+    LWIP_DEBUGF(LWIP_LOWPAN6_DEBUG | LWIP_DBG_TRACE, ("lowpan6_send: sending packet %p\n", (void *)p));
     err = netif->linkoutput(netif, p_frag);
 
     while ((remaining_len > 0) && (err == ERR_OK)) {
+      struct ieee_802154_hdr *hdr = (struct ieee_802154_hdr *)buffer;
       /* new frame, new seq num for ACK */
-      buffer[2] = frame_seq_num++;
+      hdr->sequence_number = lowpan6_data.tx_frame_seq_num++;
 
       buffer[ieee_header_len] |= 0x20; /* Change FRAG1 to FRAGN */
 
+      LWIP_ASSERT("datagram offset must be a multiple of 8", (datagram_offset & 7) == 0);
       buffer[ieee_header_len + 4] = (u8_t)(datagram_offset >> 3); /* datagram offset in FRAGN header (datagram_offset is max. 11 bit) */
 
       frag_len = (127 - ieee_header_len - 5 - 2) & 0xf8;
@@ -523,19 +452,16 @@
       remaining_len -= frag_len;
       datagram_offset += frag_len;
 
-      /* 2 bytes CRC */
-#if LWIP_6LOWPAN_HW_CRC
-      /* Leave blank, will be filled by HW. */
-#else /* LWIP_6LOWPAN_HW_CRC */
-      /* @todo calculate CRC */
-#endif /* LWIP_6LOWPAN_HW_CRC */
-
       /* Calculate frame length */
       p_frag->len = p_frag->tot_len = frag_len + 5 + ieee_header_len + 2;
 
+      /* 2 bytes CRC */
+      crc = LWIP_6LOWPAN_DO_CALC_CRC(p_frag->payload, p_frag->len - 2);
+      pbuf_take_at(p_frag, &crc, 2, p_frag->len - 2);
+
       /* send the packet */
       MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p_frag->tot_len);
-      LWIP_DEBUGF(LOWPAN6_DEBUG | LWIP_DBG_TRACE, ("lowpan6_send: sending packet %p\n", (void *)p));
+      LWIP_DEBUGF(LWIP_LOWPAN6_DEBUG | LWIP_DBG_TRACE, ("lowpan6_send: sending packet %p\n", (void *)p));
       err = netif->linkoutput(netif, p_frag);
     }
   } else {
@@ -546,19 +472,17 @@
     pbuf_copy_partial(p, buffer + ieee_header_len + lowpan6_header_len, frag_len, 0);
     remaining_len = 0;
 
-    /* 2 bytes CRC */
-#if LWIP_6LOWPAN_HW_CRC
-    /* Leave blank, will be filled by HW. */
-#else /* LWIP_6LOWPAN_HW_CRC */
-    /* @todo calculate CRC */
-#endif /* LWIP_6LOWPAN_HW_CRC */
-
     /* Calculate frame length */
     p_frag->len = p_frag->tot_len = frag_len + lowpan6_header_len + ieee_header_len + 2;
+    LWIP_ASSERT("", p_frag->len <= 127);
+
+    /* 2 bytes CRC */
+    crc = LWIP_6LOWPAN_DO_CALC_CRC(p_frag->payload, p_frag->len - 2);
+    pbuf_take_at(p_frag, &crc, 2, p_frag->len - 2);
 
     /* send the packet */
     MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p_frag->tot_len);
-    LWIP_DEBUGF(LOWPAN6_DEBUG | LWIP_DBG_TRACE, ("lowpan6_send: sending packet %p\n", (void *)p));
+    LWIP_DEBUGF(LWIP_LOWPAN6_DEBUG | LWIP_DBG_TRACE, ("lowpan6_send: sending packet %p\n", (void *)p));
     err = netif->linkoutput(netif, p_frag);
   }
 
@@ -567,19 +491,35 @@
   return err;
 }
 
+/**
+ * @ingroup sixlowpan
+ * Set context
+ */
 err_t
-lowpan6_set_context(u8_t idx, const ip6_addr_t * context)
+lowpan6_set_context(u8_t idx, const ip6_addr_t *context)
 {
+#if LWIP_6LOWPAN_NUM_CONTEXTS > 0
   if (idx >= LWIP_6LOWPAN_NUM_CONTEXTS) {
     return ERR_ARG;
   }
 
-  ip6_addr_set(&lowpan6_context[idx], context);
+  IP6_ADDR_ZONECHECK(context);
+
+  ip6_addr_set(&lowpan6_data.lowpan6_context[idx], context);
 
   return ERR_OK;
+#else
+  LWIP_UNUSED_ARG(idx);
+  LWIP_UNUSED_ARG(context);
+  return ERR_ARG;
+#endif
 }
 
 #if LWIP_6LOWPAN_INFER_SHORT_ADDRESS
+/**
+ * @ingroup sixlowpan
+ * Set short address
+ */
 err_t
 lowpan6_set_short_addr(u8_t addr_high, u8_t addr_low)
 {
@@ -590,19 +530,28 @@
 }
 #endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */
 
-#if LWIP_IPV4
-err_t
-lowpan4_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr)
+/* Create IEEE 802.15.4 address from netif address */
+static err_t
+lowpan6_hwaddr_to_addr(struct netif *netif, struct lowpan6_link_addr *addr)
 {
-  (void)netif;
-  (void)q;
-  (void)ipaddr;
-
-  return ERR_IF;
+  addr->addr_len = 8;
+  if (netif->hwaddr_len == 8) {
+    LWIP_ERROR("NETIF_MAX_HWADDR_LEN >= 8 required", sizeof(netif->hwaddr) >= 8, return ERR_VAL;);
+    SMEMCPY(addr->addr, netif->hwaddr, 8);
+  } else if (netif->hwaddr_len == 6) {
+    /* Copy from MAC-48 */
+    SMEMCPY(addr->addr, netif->hwaddr, 3);
+    addr->addr[3] = addr->addr[4] = 0xff;
+    SMEMCPY(&addr->addr[5], &netif->hwaddr[3], 3);
+  } else {
+    /* Invalid address length, don't know how to convert this */
+    return ERR_VAL;
+  }
+  return ERR_OK;
 }
-#endif /* LWIP_IPV4 */
 
 /**
+ * @ingroup sixlowpan
  * Resolve and fill-in IEEE 802.15.4 address header for outgoing IPv6 packet.
  *
  * Perform Header Compression and fragment if necessary.
@@ -618,16 +567,17 @@
 {
   err_t result;
   const u8_t *hwaddr;
-  struct ieee_802154_addr src, dest;
+  struct lowpan6_link_addr src, dest;
 #if LWIP_6LOWPAN_INFER_SHORT_ADDRESS
   ip6_addr_t ip6_src;
-  struct ip6_hdr * ip6_hdr;
+  struct ip6_hdr *ip6_hdr;
 #endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */
 
 #if LWIP_6LOWPAN_INFER_SHORT_ADDRESS
   /* Check if we can compress source address (use aligned copy) */
   ip6_hdr = (struct ip6_hdr *)q->payload;
-  ip6_addr_set(&ip6_src, &ip6_hdr->src);
+  ip6_addr_copy_from_packed(ip6_src, ip6_hdr->src);
+  ip6_addr_assign_zone(&ip6_src, IP6_UNICAST, netif);
   if (lowpan6_get_address_mode(&ip6_src, &short_mac_addr) == 3) {
     src.addr_len = 2;
     src.addr[0] = short_mac_addr.addr[0];
@@ -635,8 +585,11 @@
   } else
 #endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */
   {
-    src.addr_len = netif->hwaddr_len;
-    SMEMCPY(src.addr, netif->hwaddr, netif->hwaddr_len);
+    result = lowpan6_hwaddr_to_addr(netif, &src);
+    if (result != ERR_OK) {
+      MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
+      return result;
+    }
   }
 
   /* multicast destination IP address? */
@@ -652,11 +605,11 @@
 #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. */
+     * is also compressable 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(&ip6_hdr->src, &ip6_hdr->dest)) &&
+    if ((src.addr_len == 2) && (ip6_addr_netcmp_zoneless(&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);
@@ -678,378 +631,82 @@
 
   /* Send out the packet using the returned hardware address. */
   dest.addr_len = netif->hwaddr_len;
+  /* XXX: Inferring the length of the source address from the destination address
+   * is not correct for IEEE 802.15.4, but currently we don't get this information
+   * from the neighbor cache */
   SMEMCPY(dest.addr, hwaddr, netif->hwaddr_len);
   MIB2_STATS_NETIF_INC(netif, ifoutucastpkts);
   return lowpan6_frag(netif, q, &src, &dest);
 }
-
-static struct pbuf *
-lowpan6_decompress(struct pbuf * p, struct ieee_802154_addr * src, struct ieee_802154_addr * dest)
-{
-  struct pbuf * q;
-  u8_t * lowpan6_buffer;
-  s8_t lowpan6_offset;
-  struct ip6_hdr *ip6hdr;
-  s8_t i;
-  s8_t ip6_offset = IP6_HLEN;
-
-
-  q = pbuf_alloc(PBUF_IP, p->len + IP6_HLEN + UDP_HLEN, PBUF_POOL);
-  if (q == NULL) {
-    pbuf_free(p);
-    return NULL;
-  }
-
-  lowpan6_buffer = (u8_t *)p->payload;
-  ip6hdr = (struct ip6_hdr *)q->payload;
-
-  lowpan6_offset = 2;
-  if (lowpan6_buffer[1] & 0x80) {
-    lowpan6_offset++;
-  }
-
-  /* Set IPv6 version, traffic class and flow label. */
-  if ((lowpan6_buffer[0] & 0x18) == 0x00) {
-    IP6H_VTCFL_SET(ip6hdr, 6, lowpan6_buffer[lowpan6_offset], ((lowpan6_buffer[lowpan6_offset+1] & 0x0f) << 16) | (lowpan6_buffer[lowpan6_offset + 2] << 8) | lowpan6_buffer[lowpan6_offset+3]);
-    lowpan6_offset += 4;
-  } else if ((lowpan6_buffer[0] & 0x18) == 0x08) {
-    IP6H_VTCFL_SET(ip6hdr, 6, lowpan6_buffer[lowpan6_offset] & 0xc0, ((lowpan6_buffer[lowpan6_offset] & 0x0f) << 16) | (lowpan6_buffer[lowpan6_offset + 1] << 8) | lowpan6_buffer[lowpan6_offset+2]);
-    lowpan6_offset += 3;
-  } else if ((lowpan6_buffer[0] & 0x18) == 0x10) {
-    IP6H_VTCFL_SET(ip6hdr, 6, lowpan6_buffer[lowpan6_offset],0);
-    lowpan6_offset += 1;
-  } else if ((lowpan6_buffer[0] & 0x18) == 0x18) {
-    IP6H_VTCFL_SET(ip6hdr, 6, 0, 0);
-  }
-
-  /* Set Next Header */
-  if ((lowpan6_buffer[0] & 0x04) == 0x00) {
-    IP6H_NEXTH_SET(ip6hdr, lowpan6_buffer[lowpan6_offset++]);
-  } else {
-    /* We should fill this later with NHC decoding */
-    IP6H_NEXTH_SET(ip6hdr, 0);
-  }
-
-  /* Set Hop Limit */
-  if ((lowpan6_buffer[0] & 0x03) == 0x00) {
-    IP6H_HOPLIM_SET(ip6hdr, lowpan6_buffer[lowpan6_offset++]);
-  } else if ((lowpan6_buffer[0] & 0x03) == 0x01) {
-    IP6H_HOPLIM_SET(ip6hdr, 1);
-  } else if ((lowpan6_buffer[0] & 0x03) == 0x02) {
-    IP6H_HOPLIM_SET(ip6hdr, 64);
-  } else if ((lowpan6_buffer[0] & 0x03) == 0x03) {
-    IP6H_HOPLIM_SET(ip6hdr, 255);
-  }
-
-  /* Source address decoding. */
-  if ((lowpan6_buffer[1] & 0x40) == 0x00) {
-    /* Stateless compression */
-    if ((lowpan6_buffer[1] & 0x30) == 0x00) {
-      /* copy full address */
-      MEMCPY((void *)&ip6hdr->src.addr[0], lowpan6_buffer + lowpan6_offset, 16);
-      lowpan6_offset += 16;
-    } else if ((lowpan6_buffer[1] & 0x30) == 0x10) {
-      ip6hdr->src.addr[0] = PP_HTONL(0xfe800000UL);
-      ip6hdr->src.addr[1] = 0;
-      MEMCPY((void *)&ip6hdr->src.addr[2], lowpan6_buffer + lowpan6_offset, 8);
-      lowpan6_offset += 8;
-    } else if ((lowpan6_buffer[1] & 0x30) == 0x20) {
-      ip6hdr->src.addr[0] = PP_HTONL(0xfe800000UL);
-      ip6hdr->src.addr[1] = 0;
-      ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL);
-      ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (lowpan6_buffer[lowpan6_offset] << 8) |
-                                  lowpan6_buffer[lowpan6_offset+1]);
-      lowpan6_offset += 2;
-    } else if ((lowpan6_buffer[1] & 0x30) == 0x30) {
-      ip6hdr->src.addr[0] = PP_HTONL(0xfe800000UL);
-      ip6hdr->src.addr[1] = 0;
-      if (src->addr_len == 2) {
-        ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL);
-        ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (src->addr[0] << 8) | src->addr[1]);
-      } else {
-        ip6hdr->src.addr[2] = lwip_htonl(((src->addr[0] ^ 2) << 24) | (src->addr[1] << 16) |
-                                    (src->addr[2] << 8) | src->addr[3]);
-        ip6hdr->src.addr[3] = lwip_htonl((src->addr[4] << 24) | (src->addr[5] << 16) |
-                                    (src->addr[6] << 8) | src->addr[7]);
-      }
-    }
-  } else {
-    /* Stateful compression */
-    if ((lowpan6_buffer[1] & 0x30) == 0x00) {
-      /* ANY address */
-      ip6hdr->src.addr[0] = 0;
-      ip6hdr->src.addr[1] = 0;
-      ip6hdr->src.addr[2] = 0;
-      ip6hdr->src.addr[3] = 0;
-    } else {
-      /* Set prefix from context info */
-      if (lowpan6_buffer[1] & 0x80) {
-        i = (lowpan6_buffer[2] >> 4) & 0x0f;
-      } else {
-        i = 0;
-      }
-      if (i >= LWIP_6LOWPAN_NUM_CONTEXTS) {
-        /* Error */
-        pbuf_free(p);
-        pbuf_free(q);
-        return NULL;
-      }
-
-      ip6hdr->src.addr[0] = lowpan6_context[i].addr[0];
-      ip6hdr->src.addr[1] = lowpan6_context[i].addr[1];
-    }
-
-    if ((lowpan6_buffer[1] & 0x30) == 0x10) {
-      MEMCPY((void *)&ip6hdr->src.addr[2], lowpan6_buffer + lowpan6_offset, 8);
-      lowpan6_offset += 8;
-    } else if ((lowpan6_buffer[1] & 0x30) == 0x20) {
-      ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL);
-      ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (lowpan6_buffer[lowpan6_offset] << 8) | lowpan6_buffer[lowpan6_offset+1]);
-      lowpan6_offset += 2;
-    } else if ((lowpan6_buffer[1] & 0x30) == 0x30) {
-      if (src->addr_len == 2) {
-        ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL);
-        ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (src->addr[0] << 8) | src->addr[1]);
-      } else {
-        ip6hdr->src.addr[2] = lwip_htonl(((src->addr[0] ^ 2) << 24) | (src->addr[1] << 16) | (src->addr[2] << 8) | src->addr[3]);
-        ip6hdr->src.addr[3] = lwip_htonl((src->addr[4] << 24) | (src->addr[5] << 16) | (src->addr[6] << 8) | src->addr[7]);
-      }
-    }
-  }
-
-  /* Destination address decoding. */
-  if (lowpan6_buffer[1] & 0x08) {
-    /* Multicast destination */
-    if (lowpan6_buffer[1] & 0x04) {
-      /* @todo support stateful multicast addressing */
-      pbuf_free(p);
-      pbuf_free(q);
-      return NULL;
-    }
-
-    if ((lowpan6_buffer[1] & 0x03) == 0x00) {
-      /* copy full address */
-      MEMCPY((void *)&ip6hdr->dest.addr[0], lowpan6_buffer + lowpan6_offset, 16);
-      lowpan6_offset += 16;
-    } else if ((lowpan6_buffer[1] & 0x03) == 0x01) {
-      ip6hdr->dest.addr[0] = lwip_htonl(0xff000000UL | (lowpan6_buffer[lowpan6_offset++] << 16));
-      ip6hdr->dest.addr[1] = 0;
-      ip6hdr->dest.addr[2] = lwip_htonl(lowpan6_buffer[lowpan6_offset++]);
-      ip6hdr->dest.addr[3] = lwip_htonl((lowpan6_buffer[lowpan6_offset] << 24) | (lowpan6_buffer[lowpan6_offset + 1] << 16) | (lowpan6_buffer[lowpan6_offset + 2] << 8) | lowpan6_buffer[lowpan6_offset + 3]);
-      lowpan6_offset += 4;
-    } else if ((lowpan6_buffer[1] & 0x03) == 0x02) {
-      ip6hdr->dest.addr[0] = lwip_htonl(0xff000000UL | lowpan6_buffer[lowpan6_offset++]);
-      ip6hdr->dest.addr[1] = 0;
-      ip6hdr->dest.addr[2] = 0;
-      ip6hdr->dest.addr[3] = lwip_htonl((lowpan6_buffer[lowpan6_offset] << 16) | (lowpan6_buffer[lowpan6_offset + 1] << 8) | lowpan6_buffer[lowpan6_offset + 2]);
-      lowpan6_offset += 3;
-    } else if ((lowpan6_buffer[1] & 0x03) == 0x03) {
-      ip6hdr->dest.addr[0] = PP_HTONL(0xff020000UL);
-      ip6hdr->dest.addr[1] = 0;
-      ip6hdr->dest.addr[2] = 0;
-      ip6hdr->dest.addr[3] = lwip_htonl(lowpan6_buffer[lowpan6_offset++]);
-    }
-
-  } else {
-    if (lowpan6_buffer[1] & 0x04) {
-      /* Stateful destination compression */
-      /* Set prefix from context info */
-      if (lowpan6_buffer[1] & 0x80) {
-        i = lowpan6_buffer[2] & 0x0f;
-      } else {
-        i = 0;
-      }
-      if (i >= LWIP_6LOWPAN_NUM_CONTEXTS) {
-        /* Error */
-        pbuf_free(p);
-        pbuf_free(q);
-        return NULL;
-      }
-
-      ip6hdr->dest.addr[0] = lowpan6_context[i].addr[0];
-      ip6hdr->dest.addr[1] = lowpan6_context[i].addr[1];
-    } else {
-      /* Link local address compression */
-      ip6hdr->dest.addr[0] = PP_HTONL(0xfe800000UL);
-      ip6hdr->dest.addr[1] = 0;
-    }
-
-    if ((lowpan6_buffer[1] & 0x03) == 0x00) {
-      /* copy full address */
-      MEMCPY((void *)&ip6hdr->dest.addr[0], lowpan6_buffer + lowpan6_offset, 16);
-      lowpan6_offset += 16;
-    } else if ((lowpan6_buffer[1] & 0x03) == 0x01) {
-      MEMCPY((void *)&ip6hdr->dest.addr[2], lowpan6_buffer + lowpan6_offset, 8);
-      lowpan6_offset += 8;
-    } else if ((lowpan6_buffer[1] & 0x03) == 0x02) {
-      ip6hdr->dest.addr[2] = PP_HTONL(0x000000ffUL);
-      ip6hdr->dest.addr[3] = lwip_htonl(0xfe000000UL | (lowpan6_buffer[lowpan6_offset] << 8) | lowpan6_buffer[lowpan6_offset + 1]);
-      lowpan6_offset += 2;
-    } else if ((lowpan6_buffer[1] & 0x03) == 0x03) {
-      if (dest->addr_len == 2) {
-        ip6hdr->dest.addr[2] = PP_HTONL(0x000000ffUL);
-        ip6hdr->dest.addr[3] = lwip_htonl(0xfe000000UL | (dest->addr[0] << 8) | dest->addr[1]);
-      } else {
-        ip6hdr->dest.addr[2] = lwip_htonl(((dest->addr[0] ^ 2) << 24) | (dest->addr[1] << 16) | dest->addr[2] << 8 | dest->addr[3]);
-        ip6hdr->dest.addr[3] = lwip_htonl((dest->addr[4] << 24) | (dest->addr[5] << 16) | dest->addr[6] << 8 | dest->addr[7]);
-      }
-    }
-  }
-
-
-  /* Next Header Compression (NHC) decoding? */
-  if (lowpan6_buffer[0] & 0x04) {
-    if ((lowpan6_buffer[lowpan6_offset] & 0xf8) == 0xf0) {
-      struct udp_hdr *udphdr;
-
-      /* UDP compression */
-      IP6H_NEXTH_SET(ip6hdr, IP6_NEXTH_UDP);
-      udphdr = (struct udp_hdr *)((u8_t *)q->payload + ip6_offset);
-
-      if (lowpan6_buffer[lowpan6_offset] & 0x04) {
-        /* @todo support checksum decompress */
-        pbuf_free(p);
-        pbuf_free(q);
-        return NULL;
-      }
-
-      /* Decompress ports */
-      i = lowpan6_buffer[lowpan6_offset++] & 0x03;
-      if (i == 0) {
-        udphdr->src = lwip_htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]);
-        udphdr->dest = lwip_htons(lowpan6_buffer[lowpan6_offset + 2] << 8 | lowpan6_buffer[lowpan6_offset + 3]);
-        lowpan6_offset += 4;
-      } else if (i == 0x01) {
-        udphdr->src = lwip_htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]);
-        udphdr->dest = lwip_htons(0xf000 | lowpan6_buffer[lowpan6_offset + 2]);
-        lowpan6_offset += 3;
-      } else if (i == 0x02) {
-        udphdr->src = lwip_htons(0xf000 | lowpan6_buffer[lowpan6_offset]);
-        udphdr->dest = lwip_htons(lowpan6_buffer[lowpan6_offset + 1] << 8 | lowpan6_buffer[lowpan6_offset + 2]);
-        lowpan6_offset += 3;
-      } else if (i == 0x03) {
-        udphdr->src = lwip_htons(0xf0b0 | ((lowpan6_buffer[lowpan6_offset] >> 4) & 0x0f));
-        udphdr->dest = lwip_htons(0xf0b0 | (lowpan6_buffer[lowpan6_offset] & 0x0f));
-        lowpan6_offset += 1;
-      }
-
-      udphdr->chksum = lwip_htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]);
-      lowpan6_offset += 2;
-      udphdr->len = lwip_htons(p->tot_len - lowpan6_offset + UDP_HLEN);
-
-      ip6_offset += UDP_HLEN;
-    } else {
-      /* @todo support NHC other than UDP */
-      pbuf_free(p);
-      pbuf_free(q);
-      return NULL;
-    }
-  }
-
-  /* Now we copy leftover contents from p to q, so we have all L2 and L3 headers (and L4?) in a single PBUF.
-  * Replace p with q, and free p */
-  pbuf_header(p, -lowpan6_offset);
-  MEMCPY((u8_t*)q->payload + ip6_offset, p->payload, p->len);
-  q->len = q->tot_len = ip6_offset + p->len;
-  if (p->next != NULL) {
-    pbuf_cat(q, p->next);
-  }
-  p->next = NULL;
-  pbuf_free(p);
-
-  /* Infer IPv6 payload length for header */
-  IP6H_PLEN_SET(ip6hdr, q->tot_len - IP6_HLEN);
-
-  /* all done */
-  return q;
-}
-
+/**
+ * @ingroup sixlowpan
+ * NETIF input function: don't free the input pbuf when returning != ERR_OK!
+ */
 err_t
-lowpan6_input(struct pbuf * p, struct netif *netif)
+lowpan6_input(struct pbuf *p, struct netif *netif)
 {
-  u8_t * puc;
+  u8_t *puc, b;
   s8_t i;
-  struct ieee_802154_addr src, dest;
-  u16_t datagram_size, datagram_offset, datagram_tag;
-  struct lowpan6_reass_helper *lrh, *lrh_temp;
+  struct lowpan6_link_addr src, dest;
+  u16_t datagram_size = 0;
+  u16_t datagram_offset, datagram_tag;
+  struct lowpan6_reass_helper *lrh, *lrh_next, *lrh_prev = NULL;
+
+  if (p == NULL) {
+    return ERR_OK;
+  }
 
   MIB2_STATS_NETIF_ADD(netif, ifinoctets, p->tot_len);
 
-  /* Analyze header. @todo validate. */
-  puc = (u8_t*)p->payload;
-  datagram_offset = 5;
-  if ((puc[1] & 0x0c) == 0x0c) {
-    dest.addr_len = 8;
-    for (i = 0; i < 8; i++) {
-      dest.addr[i] = puc[datagram_offset + 7 - i];
-    }
-    datagram_offset += 8;
-  } else {
-    dest.addr_len = 2;
-    dest.addr[0] = puc[datagram_offset + 1];
-    dest.addr[1] = puc[datagram_offset];
-    datagram_offset += 2;
+  if (p->len != p->tot_len) {
+    /* for now, this needs a pbuf in one piece */
+    goto lowpan6_input_discard;
   }
 
-  datagram_offset += 2; /* skip PAN ID. */
-
-  if ((puc[1] & 0xc0) == 0xc0) {
-    src.addr_len = 8;
-    for (i = 0; i < 8; i++) {
-      src.addr[i] = puc[datagram_offset + 7 - i];
-    }
-    datagram_offset += 8;
-  } else {
-    src.addr_len = 2;
-    src.addr[0] = puc[datagram_offset + 1];
-    src.addr[1] = puc[datagram_offset];
-    datagram_offset += 2;
+  if (lowpan6_parse_iee802154_header(p, &src, &dest) != ERR_OK) {
+    goto lowpan6_input_discard;
   }
 
-  pbuf_header(p, -datagram_offset); /* hide IEEE802.15.4 header. */
-
   /* Check dispatch. */
-  puc = (u8_t*)p->payload;
+  puc = (u8_t *)p->payload;
 
-  if ((*puc & 0xf8) == 0xc0) {
+  b = *puc;
+  if ((b & 0xf8) == 0xc0) {
     /* FRAG1 dispatch. add this packet to reassembly list. */
     datagram_size = ((u16_t)(puc[0] & 0x07) << 8) | (u16_t)puc[1];
     datagram_tag = ((u16_t)puc[2] << 8) | (u16_t)puc[3];
 
     /* check for duplicate */
-    lrh = reass_list;
+    lrh = lowpan6_data.reass_list;
     while (lrh != NULL) {
+      uint8_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)) {
         /* address match with packet in reassembly. */
         if ((datagram_tag == lrh->datagram_tag) && (datagram_size == lrh->datagram_size)) {
-          MIB2_STATS_NETIF_INC(netif, ifindiscards);
           /* duplicate fragment. */
-          pbuf_free(p);
-          return ERR_OK;
+          goto lowpan6_input_discard;
         } else {
           /* We are receiving the start of a new datagram. Discard old one (incomplete). */
-          lrh_temp = lrh->next_packet;
-          dequeue_datagram(lrh);
-          pbuf_free(lrh->pbuf);
-          mem_free(lrh);
-
-          /* Check next datagram in queue. */
-          lrh = lrh_temp;
+          discard = 1;
         }
-      } else {
-        /* Check next datagram in queue. */
-        lrh = lrh->next_packet;
       }
+      if (discard) {
+        dequeue_datagram(lrh, lrh_prev);
+        free_reass_datagram(lrh);
+      } else {
+        lrh_prev = lrh;
+      }
+      /* Check next datagram in queue. */
+      lrh = lrh_next;
     }
 
-    pbuf_header(p, -4); /* hide frag1 dispatch */
+    pbuf_remove_header(p, 4); /* hide frag1 dispatch */
 
     lrh = (struct lowpan6_reass_helper *) mem_malloc(sizeof(struct lowpan6_reass_helper));
     if (lrh == NULL) {
-      MIB2_STATS_NETIF_INC(netif, ifindiscards);
-      pbuf_free(p);
-      return ERR_MEM;
+      goto lowpan6_input_discard;
     }
 
     lrh->sender_addr.addr_len = src.addr_len;
@@ -1058,20 +715,33 @@
     }
     lrh->datagram_size = datagram_size;
     lrh->datagram_tag = datagram_tag;
-    lrh->pbuf = p;
-    lrh->next_packet = reass_list;
+    lrh->frags = NULL;
+    if (*(u8_t *)p->payload == 0x41) {
+      /* This is a complete IPv6 packet, just skip dispatch byte. */
+      pbuf_remove_header(p, 1); /* hide dispatch byte. */
+      lrh->reass = p;
+    } else if ((*(u8_t *)p->payload & 0xe0 ) == 0x60) {
+      lrh->reass = lowpan6_decompress(p, datagram_size, LWIP_6LOWPAN_CONTEXTS(netif), &src, &dest);
+      if (lrh->reass == NULL) {
+        /* decompression failed */
+        mem_free(lrh);
+        goto lowpan6_input_discard;
+      }
+    }
+    /* TODO: handle the case where we already have FRAGN received */
+    lrh->next_packet = lowpan6_data.reass_list;
     lrh->timer = 2;
-    reass_list = lrh;
+    lowpan6_data.reass_list = lrh;
 
     return ERR_OK;
-  } else if ((*puc & 0xf8) == 0xe0) {
+  } else if ((b & 0xf8) == 0xe0) {
     /* FRAGN dispatch, find packet being reassembled. */
     datagram_size = ((u16_t)(puc[0] & 0x07) << 8) | (u16_t)puc[1];
     datagram_tag = ((u16_t)puc[2] << 8) | (u16_t)puc[3];
     datagram_offset = (u16_t)puc[4] << 3;
-    pbuf_header(p, -5); /* hide frag1 dispatch */
+    pbuf_remove_header(p, 4); /* hide frag1 dispatch but keep datagram offset for reassembly */
 
-    for (lrh = reass_list; lrh != NULL; lrh = lrh->next_packet) {
+    for (lrh = lowpan6_data.reass_list; lrh != NULL; lrh_prev = lrh, lrh = lrh->next_packet) {
       if ((lrh->sender_addr.addr_len == src.addr_len) &&
           (memcmp(lrh->sender_addr.addr, src.addr, src.addr_len) == 0) &&
           (datagram_tag == lrh->datagram_tag) &&
@@ -1081,79 +751,131 @@
     }
     if (lrh == NULL) {
       /* rogue fragment */
-      MIB2_STATS_NETIF_INC(netif, ifindiscards);
-      pbuf_free(p);
-      return ERR_OK;
+      goto lowpan6_input_discard;
     }
-
-    if (lrh->pbuf->tot_len < datagram_offset) {
-      /* duplicate, ignore. */
-      pbuf_free(p);
-      return ERR_OK;
-    } else if (lrh->pbuf->tot_len > datagram_offset) {
-      MIB2_STATS_NETIF_INC(netif, ifindiscards);
-      /* We have missed a fragment. Delete whole reassembly. */
-      dequeue_datagram(lrh);
-      pbuf_free(lrh->pbuf);
-      mem_free(lrh);
-      pbuf_free(p);
-      return ERR_OK;
+    /* Insert new pbuf into list of fragments. Each fragment is a pbuf,
+       this only works for unchained pbufs. */
+    LWIP_ASSERT("p->next == NULL", p->next == NULL);
+    if (lrh->reass != NULL) {
+      /* FRAG1 already received, check this offset against first len */
+      if (datagram_offset < lrh->reass->len) {
+        /* fragment overlap, discard old fragments */
+        dequeue_datagram(lrh, lrh_prev);
+        free_reass_datagram(lrh);
+        goto lowpan6_input_discard;
+      }
     }
-    pbuf_cat(lrh->pbuf, p);
-    p = NULL;
-
-    /* is packet now complete?*/
-    if (lrh->pbuf->tot_len >= lrh->datagram_size) {
-      /* dequeue from reass list. */
-      dequeue_datagram(lrh);
-
-      /* get pbuf */
-      p = lrh->pbuf;
-
-      /* release helper */
-      mem_free(lrh);
+    if (lrh->frags == NULL) {
+      /* first FRAGN */
+      lrh->frags = p;
     } else {
-      return ERR_OK;
+      /* find the correct place to insert */
+      struct pbuf *q, *last;
+      u16_t new_frag_len = p->len - 1; /* p->len includes datagram_offset byte */
+      for (q = lrh->frags, last = NULL; q != NULL; last = q, q = q->next) {
+        u16_t q_datagram_offset = ((u8_t *)q->payload)[0] << 3;
+        u16_t q_frag_len = q->len - 1;
+        if (datagram_offset < q_datagram_offset) {
+          if (datagram_offset + new_frag_len > q_datagram_offset) {
+            /* overlap, discard old fragments */
+            dequeue_datagram(lrh, lrh_prev);
+            free_reass_datagram(lrh);
+            goto lowpan6_input_discard;
+          }
+          /* insert here */
+          break;
+        } else if (datagram_offset == q_datagram_offset) {
+          if (q_frag_len != new_frag_len) {
+            /* fragment mismatch, discard old fragments */
+            dequeue_datagram(lrh, lrh_prev);
+            free_reass_datagram(lrh);
+            goto lowpan6_input_discard;
+          }
+          /* duplicate, ignore */
+          pbuf_free(p);
+          return ERR_OK;
+        }
+      }
+      /* insert fragment */
+      if (last == NULL) {
+        lrh->frags = p;
+      } else {
+        last->next = p;
+        p->next = q;
+      }
     }
-  }
+    /* check if all fragments were received */
+    if (lrh->reass) {
+      u16_t offset = lrh->reass->len;
+      struct pbuf *q;
+      for (q = lrh->frags; q != NULL; q = q->next) {
+        u16_t q_datagram_offset = ((u8_t *)q->payload)[0] << 3;
+        if (q_datagram_offset != offset) {
+          /* not complete, wait for more fragments */
+          return ERR_OK;
+        }
+        offset += q->len - 1;
+      }
+      if (offset == datagram_size) {
+        /* all fragments received, combine pbufs */
+        u16_t datagram_left = datagram_size - lrh->reass->len;
+        for (q = lrh->frags; q != NULL; q = q->next) {
+          /* hide datagram_offset byte now */
+          pbuf_remove_header(q, 1);
+          q->tot_len = datagram_left;
+          datagram_left -= q->len;
+        }
+        LWIP_ASSERT("datagram_left == 0", datagram_left == 0);
+        q = lrh->reass;
+        q->tot_len = datagram_size;
+        q->next = lrh->frags;
+        lrh->frags = NULL;
+        lrh->reass = NULL;
+        dequeue_datagram(lrh, lrh_prev);
+        mem_free(lrh);
 
-  if (p == NULL) {
+        /* @todo: distinguish unicast/multicast */
+        MIB2_STATS_NETIF_INC(netif, ifinucastpkts);
+        return ip6_input(q, netif);
+      }
+    }
+    /* pbuf enqueued, waiting for more fragments */
     return ERR_OK;
-  }
-
-  /* We have a complete packet, check dispatch for headers. */
-  puc = (u8_t*)p->payload;
-
-  if (*puc == 0x41) {
-    /* This is a complete IPv6 packet, just skip dispatch byte. */
-    pbuf_header(p, -1); /* hide dispatch byte. */
-  } else if ((*puc & 0xe0 )== 0x60) {
-    /* IPv6 headers are compressed using IPHC. */
-    p = lowpan6_decompress(p, &src, &dest);
-    if (p == NULL) {
-      MIB2_STATS_NETIF_INC(netif, ifindiscards);
-      return ERR_OK;
-    }
   } else {
-    MIB2_STATS_NETIF_INC(netif, ifindiscards);
-    pbuf_free(p);
-    return ERR_OK;
+    if (b == 0x41) {
+      /* This is a complete IPv6 packet, just skip dispatch byte. */
+      pbuf_remove_header(p, 1); /* hide dispatch byte. */
+    } else if ((b & 0xe0 ) == 0x60) {
+      /* IPv6 headers are compressed using IPHC. */
+      p = lowpan6_decompress(p, datagram_size, LWIP_6LOWPAN_CONTEXTS(netif), &src, &dest);
+      if (p == NULL) {
+        MIB2_STATS_NETIF_INC(netif, ifindiscards);
+        return ERR_OK;
+      }
+    } else {
+      goto lowpan6_input_discard;
+    }
+
+    /* @todo: distinguish unicast/multicast */
+    MIB2_STATS_NETIF_INC(netif, ifinucastpkts);
+
+    return ip6_input(p, netif);
   }
-
-  /* @todo: distinguish unicast/multicast */
-  MIB2_STATS_NETIF_INC(netif, ifinucastpkts);
-
-  return ip6_input(p, netif);
+lowpan6_input_discard:
+  MIB2_STATS_NETIF_INC(netif, ifindiscards);
+  pbuf_free(p);
+  /* always return ERR_OK here to prevent the caller freeing the pbuf */
+  return ERR_OK;
 }
 
+/**
+ * @ingroup sixlowpan
+ */
 err_t
 lowpan6_if_init(struct netif *netif)
 {
   netif->name[0] = 'L';
   netif->name[1] = '6';
-#if LWIP_IPV4
-  netif->output = lowpan4_output;
-#endif /* LWIP_IPV4 */
   netif->output_ip6 = lowpan6_output;
 
   MIB2_INIT_NETIF(netif, snmp_ifType_other, 0);
@@ -1167,16 +889,21 @@
   return ERR_OK;
 }
 
+/**
+ * @ingroup sixlowpan
+ * Set PAN ID
+ */
 err_t
 lowpan6_set_pan_id(u16_t pan_id)
 {
-  ieee_802154_pan_id = pan_id;
+  lowpan6_data.ieee_802154_pan_id = pan_id;
 
   return ERR_OK;
 }
 
 #if !NO_SYS
 /**
+ * @ingroup sixlowpan
  * Pass a received packet to tcpip_thread for input processing
  *
  * @param p the received packet, p->payload pointing to the
@@ -1190,4 +917,4 @@
 }
 #endif /* !NO_SYS */
 
-#endif /* LWIP_IPV6 && LWIP_6LOWPAN */
+#endif /* LWIP_IPV6 */
diff --git a/src/netif/lowpan6_ble.c b/src/netif/lowpan6_ble.c
new file mode 100644
index 0000000..d89816d
--- /dev/null
+++ b/src/netif/lowpan6_ble.c
@@ -0,0 +1,447 @@
+/**
+ * @file
+ * 6LowPAN over BLE output for IPv6 (RFC7668).
+*/
+
+/*
+ * 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,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (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: Benjamin Aigner <aignerb@technikum-wien.at>
+ * 
+ * Based on the original 6lowpan implementation of lwIP ( @see 6lowpan.c)
+ */
+
+
+/**
+ * @defgroup rfc7668if 6LoWPAN over BLE (RFC7668)
+ * @ingroup netifs
+ * This file implements a RFC7668 implementation for 6LoWPAN over
+ * Bluetooth Low Energy. The specification is very similar to 6LoWPAN,
+ * so most of the code is re-used.
+ * Compared to 6LoWPAN, much functionality is already implemented in
+ * lower BLE layers (fragmenting, session management,...).
+ *
+ * Usage:
+ * - add this netif
+ *   - don't add IPv4 addresses (no IPv4 support in RFC7668), pass 'NULL','NULL','NULL'
+ *   - use the BLE to EUI64 conversation util to create an IPv6 link-local address from the BLE MAC (@ref ble_addr_to_eui64)
+ *   - input function: @ref rfc7668_input
+ * - set the link output function, which transmits output data to an established L2CAP channel
+ * - If data arrives (HCI event "L2CAP_DATA_PACKET"):
+ *   - allocate a @ref PBUF_RAW buffer
+ *   - let the pbuf struct point to the incoming data or copy it to the buffer
+ *   - call netif->input
+ *
+ * @todo:
+ * - further testing
+ * - support compression contexts
+ * - support multiple addresses
+ * - support multicast
+ * - support neighbor discovery
+ */
+
+
+#include "netif/lowpan6_ble.h"
+
+#if LWIP_IPV6
+
+#include "lwip/ip.h"
+#include "lwip/pbuf.h"
+#include "lwip/ip_addr.h"
+#include "lwip/netif.h"
+#include "lwip/nd6.h"
+#include "lwip/mem.h"
+#include "lwip/udp.h"
+#include "lwip/tcpip.h"
+#include "lwip/snmp.h"
+
+#include <string.h>
+
+#if LWIP_6LOWPAN_NUM_CONTEXTS > 0
+/** context memory, containing IPv6 addresses */
+static ip6_addr_t rfc7668_context[LWIP_6LOWPAN_NUM_CONTEXTS];
+#else
+#define rfc7668_context NULL
+#endif
+
+static struct lowpan6_link_addr rfc7668_local_addr;
+static struct lowpan6_link_addr rfc7668_peer_addr;
+
+/**
+ * @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)
+{
+  /* according to RFC7668 ch 3.2.2. */
+  memcpy(dst, src, 3);
+  dst[3] = 0xFF;
+  dst[4] = 0xFE;
+  memcpy(&dst[5], &src[3], 3);
+#if LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS
+  if(public_addr) {
+    dst[0] &= ~0x02;
+  } else {
+    dst[0] |= 0x02;
+  }
+#else
+  LWIP_UNUSED_ARG(public_addr);
+#endif
+}
+
+/**
+ * @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)
+{
+  /* according to RFC7668 ch 3.2.2. */
+  memcpy(dst,src,3);
+  memcpy(&dst[3],&src[5],3);
+}
+
+/** Set an address used for stateful compression.
+ * This expects an address of 6 or 8 bytes.
+ */
+static err_t
+rfc7668_set_addr(struct lowpan6_link_addr *addr, const u8_t *in_addr, size_t in_addr_len, int is_mac_48, int is_public_addr)
+{
+  if ((in_addr == NULL) || (addr == NULL)) {
+    return ERR_VAL;
+  }
+  if (is_mac_48) {
+    if (in_addr_len != 6) {
+      return ERR_VAL;
+    }
+    addr->addr_len = 8;
+    ble_addr_to_eui64(addr->addr, in_addr, is_public_addr);
+  } else {
+    if (in_addr_len != 8) {
+      return ERR_VAL;
+    }
+    addr->addr_len = 8;
+    memcpy(addr->addr, in_addr, 8);
+  }
+  return ERR_OK;
+}
+
+
+/** Set the local address used for stateful compression.
+ * This expects an address of 8 bytes.
+ */
+err_t
+rfc7668_set_local_addr_eui64(struct netif *netif, const u8_t *local_addr, size_t local_addr_len)
+{
+  /* netif not used for now, the address is stored globally... */
+  LWIP_UNUSED_ARG(netif);
+  return rfc7668_set_addr(&rfc7668_local_addr, local_addr, local_addr_len, 0, 0);
+}
+
+/** Set the local address used for stateful compression.
+ * This expects an address of 6 bytes.
+ */
+err_t
+rfc7668_set_local_addr_mac48(struct netif *netif, const u8_t *local_addr, size_t local_addr_len, int is_public_addr)
+{
+  /* netif not used for now, the address is stored globally... */
+  LWIP_UNUSED_ARG(netif);
+  return rfc7668_set_addr(&rfc7668_local_addr, local_addr, local_addr_len, 1, is_public_addr);
+}
+
+/** Set the peer address used for stateful compression.
+ * This expects an address of 8 bytes.
+ */
+err_t
+rfc7668_set_peer_addr_eui64(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len)
+{
+  /* netif not used for now, the address is stored globally... */
+  LWIP_UNUSED_ARG(netif);
+  return rfc7668_set_addr(&rfc7668_peer_addr, peer_addr, peer_addr_len, 0, 0);
+}
+
+/** Set the peer address used for stateful compression.
+ * This expects an address of 6 bytes.
+ */
+err_t
+rfc7668_set_peer_addr_mac48(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len, int is_public_addr)
+{
+  /* netif not used for now, the address is stored globally... */
+  LWIP_UNUSED_ARG(netif);
+  return rfc7668_set_addr(&rfc7668_peer_addr, peer_addr, peer_addr_len, 1, is_public_addr);
+}
+
+/** 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
+rfc7668_compress(struct netif *netif, struct pbuf *p)
+{
+  struct pbuf *p_frag;
+  u16_t remaining_len;
+  u8_t *buffer;
+  u8_t lowpan6_header_len;
+  u8_t hidden_header_len;
+  err_t err;
+
+  LWIP_ASSERT("lowpan6_frag: netif->linkoutput not set", netif->linkoutput != NULL);
+
+#if LWIP_6LOWPAN_IPHC
+
+  /* We'll use a dedicated pbuf for building BLE fragments.
+   * We'll over-allocate it by the bytes saved for header compression.
+   */
+  p_frag = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM);
+  if (p_frag == NULL) {
+    MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
+    return ERR_MEM;
+  }
+  LWIP_ASSERT("this needs a pbuf in one piece", p_frag->len == p_frag->tot_len);
+
+  /* Write IP6 header (with IPHC). */
+  buffer = (u8_t*)p_frag->payload;
+
+  err = lowpan6_compress_headers(netif, (u8_t *)p->payload, p->len, buffer, p_frag->len,
+    &lowpan6_header_len, &hidden_header_len, rfc7668_context, &rfc7668_local_addr, &rfc7668_peer_addr);
+  if (err != ERR_OK) {
+    MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
+    pbuf_free(p_frag);
+    return err;
+  }
+  pbuf_remove_header(p, hidden_header_len);
+
+  /* Calculate remaining packet length */
+  remaining_len = p->tot_len;
+
+  /* Copy IPv6 packet */
+  pbuf_copy_partial(p, buffer + lowpan6_header_len, remaining_len, 0);
+
+  /* Calculate frame length */
+  p_frag->len = p_frag->tot_len = remaining_len + lowpan6_header_len;
+
+  /* send the packet */
+  MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p_frag->tot_len);
+  LWIP_DEBUGF(LWIP_LOWPAN6_DEBUG|LWIP_DBG_TRACE, ("rfc7668_output: sending packet %p\n", (void *)p));
+  err = netif->linkoutput(netif, p_frag);
+
+  pbuf_free(p_frag);
+
+  return err;
+#else /* LWIP_6LOWPAN_IPHC */
+  /* 6LoWPAN over BLE requires IPHC! */
+  return ERR_IF;
+#endif/* LWIP_6LOWPAN_IPHC */
+}
+
+/**
+ * @ingroup rfc7668if
+ * Set context id IPv6 address
+ *
+ * Store one IPv6 address to a given context id.
+ *
+ * @param idx Context id
+ * @param context IPv6 addr for this context
+ *
+ * @return ERR_OK (if everything is fine), ERR_ARG (if the context id is out of range), ERR_VAL (if contexts disabled)
+ */
+err_t
+rfc7668_set_context(u8_t idx, const ip6_addr_t *context)
+{
+#if LWIP_6LOWPAN_NUM_CONTEXTS > 0
+  /* check if the ID is possible */
+  if (idx >= LWIP_6LOWPAN_NUM_CONTEXTS) {
+    return ERR_ARG;
+  }
+  /* copy IPv6 address to context storage */
+  ip6_addr_set(&rfc7668_context[idx], context);
+  return ERR_OK;
+#else
+  LWIP_UNUSED_ARG(idx);
+  LWIP_UNUSED_ARG(context);
+  return ERR_VAL;
+#endif
+}
+
+/**
+ * @ingroup rfc7668if
+ * Compress outgoing IPv6 packet and pass it on to netif->linkoutput
+ *
+ * @param netif The lwIP network interface which the IP packet will be sent on.
+ * @param q The pbuf(s) containing the IP packet to be sent.
+ * @param ip6addr The IP address of the packet destination.
+ *
+ * @return See rfc7668_compress
+ */
+err_t
+rfc7668_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr)
+{
+  /* dst ip6addr is not used here, we only have one peer */
+  LWIP_UNUSED_ARG(ip6addr);
+
+  return rfc7668_compress(netif, q);
+}
+
+/**
+ * @ingroup rfc7668if
+ * Process a received raw payload from an L2CAP channel
+ *
+ * @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
+rfc7668_input(struct pbuf * p, struct netif *netif)
+{
+  u8_t * puc;
+
+  MIB2_STATS_NETIF_ADD(netif, ifinoctets, p->tot_len);
+
+  /* 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));
+    /* This is a complete IPv6 packet, just skip header byte. */
+    pbuf_remove_header(p, 1);
+  /* IPHC header compression */
+  } else if ((*puc & 0xe0 )== 0x60) {
+    LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Completed packet, decompress dispatch: 0x%2x \n", *puc));
+    /* IPv6 headers are compressed using IPHC. */
+    p = lowpan6_decompress(p, 0, rfc7668_context, &rfc7668_peer_addr, &rfc7668_local_addr);
+    /* if no pbuf is returned, handle as discarded packet */
+    if (p == NULL) {
+      MIB2_STATS_NETIF_INC(netif, ifindiscards);
+      return ERR_OK;
+    }
+  /* invalid header byte, discard */
+  } else {
+    LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Completed packet, discarding: 0x%2x \n", *puc));
+    MIB2_STATS_NETIF_INC(netif, ifindiscards);
+    pbuf_free(p);
+    return ERR_OK;
+  }
+  /* @todo: distinguish unicast/multicast */
+  MIB2_STATS_NETIF_INC(netif, ifinucastpkts);
+
+#if LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG
+  {
+    u16_t i;
+    LWIP_DEBUGF(LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG, ("IPv6 payload:\n"));
+    for (i = 0; i < p->len; i++) {
+      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, ("\np->len: %d\n", p->len));
+  }
+#endif
+  /* pass data to ip6_input */
+  return ip6_input(p, netif);
+}
+
+/**
+ * @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
+rfc7668_if_init(struct netif *netif)
+{
+  netif->name[0] = 'b';
+  netif->name[1] = 't';
+  /* local function as IPv6 output */
+  netif->output_ip6 = rfc7668_output;
+
+  MIB2_INIT_NETIF(netif, snmp_ifType_other, 0);
+
+  /* maximum transfer unit, set according to RFC7668 ch2.4 */
+  netif->mtu = 1280;
+
+  /* no flags set (no broadcast, ethernet,...)*/
+  netif->flags = 0;
+
+  /* everything fine */
+  return ERR_OK;
+}
+
+#if !NO_SYS
+/**
+ * Pass a received packet to tcpip_thread for input processing
+ *
+ * @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
+tcpip_rfc7668_input(struct pbuf *p, struct netif *inp)
+{
+  /* send data to upper layer, return the result */
+  return tcpip_inpkt(p, inp, rfc7668_input);
+}
+#endif /* !NO_SYS */
+
+#endif /* LWIP_IPV6 */
diff --git a/src/netif/lowpan6_common.c b/src/netif/lowpan6_common.c
new file mode 100644
index 0000000..baea206
--- /dev/null
+++ b/src/netif/lowpan6_common.c
@@ -0,0 +1,841 @@
+/**
+ * @file
+ *
+ * Common 6LowPAN routines for IPv6. Uses ND tables for link-layer addressing. Fragments packets to 6LowPAN units.
+ *
+ * This implementation aims to conform to IEEE 802.15.4(-2015), RFC 4944 and RFC 6282.
+ * @todo: RFC 6775.
+ */
+
+/*
+ * Copyright (c) 2015 Inico Technologies 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. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (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: Ivan Delamer <delamer@inicotech.com>
+ *
+ *
+ * Please coordinate changes and requests with Ivan Delamer
+ * <delamer@inicotech.com>
+ */
+
+/**
+ * @defgroup sixlowpan 6LoWPAN (RFC4944)
+ * @ingroup netifs
+ * 6LowPAN netif implementation
+ */
+
+#include "netif/lowpan6_common.h"
+
+#if LWIP_IPV6
+
+#include "lwip/ip.h"
+#include "lwip/pbuf.h"
+#include "lwip/ip_addr.h"
+#include "lwip/netif.h"
+#include "lwip/udp.h"
+
+#include <string.h>
+
+/* Determine compression mode for unicast address. */
+s8_t
+lowpan6_get_address_mode(const ip6_addr_t *ip6addr, const struct lowpan6_link_addr *mac_addr)
+{
+  if (mac_addr->addr_len == 2) {
+    if ((ip6addr->addr[2] == (u32_t)PP_HTONL(0x000000ff)) &&
+        ((ip6addr->addr[3]  & PP_HTONL(0xffff0000)) == PP_NTOHL(0xfe000000))) {
+      if ((ip6addr->addr[3]  & PP_HTONL(0x0000ffff)) == lwip_ntohl((mac_addr->addr[0] << 8) | mac_addr->addr[1])) {
+        return 3;
+      }
+    }
+  } else if (mac_addr->addr_len == 8) {
+    if ((ip6addr->addr[2] == lwip_ntohl(((mac_addr->addr[0] ^ 2) << 24) | (mac_addr->addr[1] << 16) | mac_addr->addr[2] << 8 | mac_addr->addr[3])) &&
+        (ip6addr->addr[3] == lwip_ntohl((mac_addr->addr[4] << 24) | (mac_addr->addr[5] << 16) | mac_addr->addr[6] << 8 | mac_addr->addr[7]))) {
+      return 3;
+    }
+  }
+
+  if ((ip6addr->addr[2] == PP_HTONL(0x000000ffUL)) &&
+      ((ip6addr->addr[3]  & PP_HTONL(0xffff0000)) == PP_NTOHL(0xfe000000UL))) {
+    return 2;
+  }
+
+  return 1;
+}
+
+#if LWIP_6LOWPAN_IPHC
+
+/* Determine compression mode for multicast address. */
+static s8_t
+lowpan6_get_address_mode_mc(const ip6_addr_t *ip6addr)
+{
+  if ((ip6addr->addr[0] == PP_HTONL(0xff020000)) &&
+      (ip6addr->addr[1] == 0) &&
+      (ip6addr->addr[2] == 0) &&
+      ((ip6addr->addr[3]  & PP_HTONL(0xffffff00)) == 0)) {
+    return 3;
+  } else if (((ip6addr->addr[0] & PP_HTONL(0xff00ffff)) == PP_HTONL(0xff000000)) &&
+             (ip6addr->addr[1] == 0)) {
+    if ((ip6addr->addr[2] == 0) &&
+        ((ip6addr->addr[3]  & PP_HTONL(0xff000000)) == 0)) {
+      return 2;
+    } else if ((ip6addr->addr[2]  & PP_HTONL(0xffffff00)) == 0) {
+      return 1;
+    }
+  }
+
+  return 0;
+}
+
+#if LWIP_6LOWPAN_NUM_CONTEXTS > 0
+static s8_t
+lowpan6_context_lookup(const ip6_addr_t *lowpan6_contexts, const ip6_addr_t *ip6addr)
+{
+  s8_t i;
+
+  for (i = 0; i < LWIP_6LOWPAN_NUM_CONTEXTS; i++) {
+    if (ip6_addr_netcmp(&lowpan6_contexts[i], ip6addr)) {
+      return i;
+    }
+  }
+  return -1;
+}
+#endif /* LWIP_6LOWPAN_NUM_CONTEXTS > 0 */
+
+/*
+ * Compress IPv6 and/or UDP headers.
+ * */
+err_t
+lowpan6_compress_headers(struct netif *netif, u8_t *inbuf, size_t inbuf_size, u8_t *outbuf, size_t outbuf_size,
+                         u8_t *lowpan6_header_len_out, u8_t *hidden_header_len_out, ip6_addr_t *lowpan6_contexts,
+                         const struct lowpan6_link_addr *src, const struct lowpan6_link_addr *dst)
+{
+  u8_t *buffer, *inptr;
+  u8_t lowpan6_header_len;
+  u8_t hidden_header_len = 0;
+  s8_t i;
+  struct ip6_hdr *ip6hdr;
+  ip_addr_t ip6src, ip6dst;
+
+  LWIP_ASSERT("netif != NULL", netif != NULL);
+  LWIP_ASSERT("inbuf != NULL", inbuf != NULL);
+  LWIP_ASSERT("outbuf != NULL", outbuf != NULL);
+  LWIP_ASSERT("lowpan6_header_len_out != NULL", lowpan6_header_len_out != NULL);
+  LWIP_ASSERT("hidden_header_len_out != NULL", hidden_header_len_out != NULL);
+
+  /* Perform 6LowPAN IPv6 header compression according to RFC 6282 */
+  buffer = outbuf;
+  inptr = inbuf;
+
+  if (inbuf_size < IP6_HLEN) {
+    /* input buffer too short */
+    return ERR_VAL;
+  }
+  if (outbuf_size < IP6_HLEN) {
+    /* output buffer too short for worst case */
+    return ERR_MEM;
+  }
+
+  /* Point to ip6 header and align copies of src/dest addresses. */
+  ip6hdr = (struct ip6_hdr *)inptr;
+  ip_addr_copy_from_ip6_packed(ip6dst, ip6hdr->dest);
+  ip6_addr_assign_zone(ip_2_ip6(&ip6dst), IP6_UNKNOWN, netif);
+  ip_addr_copy_from_ip6_packed(ip6src, ip6hdr->src);
+  ip6_addr_assign_zone(ip_2_ip6(&ip6src), IP6_UNKNOWN, netif);
+
+  /* Basic length of 6LowPAN header, set dispatch and clear fields. */
+  lowpan6_header_len = 2;
+  buffer[0] = 0x60;
+  buffer[1] = 0;
+
+  /* Determine whether there will be a Context Identifier Extension byte or not.
+   * If so, set it already. */
+#if LWIP_6LOWPAN_NUM_CONTEXTS > 0
+  buffer[2] = 0;
+
+  i = lowpan6_context_lookup(lowpan6_contexts, ip_2_ip6(&ip6src));
+  if (i >= 0) {
+    /* Stateful source address compression. */
+    buffer[1] |= 0x40;
+    buffer[2] |= (i & 0x0f) << 4;
+  }
+
+  i = lowpan6_context_lookup(lowpan6_contexts, ip_2_ip6(&ip6dst));
+  if (i >= 0) {
+    /* Stateful destination address compression. */
+    buffer[1] |= 0x04;
+    buffer[2] |= i & 0x0f;
+  }
+
+  if (buffer[2] != 0x00) {
+    /* Context identifier extension byte is appended. */
+    buffer[1] |= 0x80;
+    lowpan6_header_len++;
+  }
+#else /* LWIP_6LOWPAN_NUM_CONTEXTS > 0 */
+  LWIP_UNUSED_ARG(lowpan6_contexts);
+#endif /* LWIP_6LOWPAN_NUM_CONTEXTS > 0 */
+
+  /* Determine TF field: Traffic Class, Flow Label */
+  if (IP6H_FL(ip6hdr) == 0) {
+    /* Flow label is elided. */
+    buffer[0] |= 0x10;
+    if (IP6H_TC(ip6hdr) == 0) {
+      /* Traffic class (ECN+DSCP) elided too. */
+      buffer[0] |= 0x08;
+    } else {
+      /* Traffic class (ECN+DSCP) appended. */
+      buffer[lowpan6_header_len++] = IP6H_TC(ip6hdr);
+    }
+  } else {
+    if (((IP6H_TC(ip6hdr) & 0x3f) == 0)) {
+      /* DSCP portion of Traffic Class is elided, ECN and FL are appended (3 bytes) */
+      buffer[0] |= 0x08;
+
+      buffer[lowpan6_header_len] = IP6H_TC(ip6hdr) & 0xc0;
+      buffer[lowpan6_header_len++] |= (IP6H_FL(ip6hdr) >> 16) & 0x0f;
+      buffer[lowpan6_header_len++] = (IP6H_FL(ip6hdr) >> 8) & 0xff;
+      buffer[lowpan6_header_len++] = IP6H_FL(ip6hdr) & 0xff;
+    } else {
+      /* Traffic class and flow label are appended (4 bytes) */
+      buffer[lowpan6_header_len++] = IP6H_TC(ip6hdr);
+      buffer[lowpan6_header_len++] = (IP6H_FL(ip6hdr) >> 16) & 0x0f;
+      buffer[lowpan6_header_len++] = (IP6H_FL(ip6hdr) >> 8) & 0xff;
+      buffer[lowpan6_header_len++] = IP6H_FL(ip6hdr) & 0xff;
+    }
+  }
+
+  /* Compress NH?
+  * Only if UDP for now. @todo support other NH compression. */
+  if (IP6H_NEXTH(ip6hdr) == IP6_NEXTH_UDP) {
+    buffer[0] |= 0x04;
+  } else {
+    /* append nexth. */
+    buffer[lowpan6_header_len++] = IP6H_NEXTH(ip6hdr);
+  }
+
+  /* Compress hop limit? */
+  if (IP6H_HOPLIM(ip6hdr) == 255) {
+    buffer[0] |= 0x03;
+  } else if (IP6H_HOPLIM(ip6hdr) == 64) {
+    buffer[0] |= 0x02;
+  } else if (IP6H_HOPLIM(ip6hdr) == 1) {
+    buffer[0] |= 0x01;
+  } else {
+    /* append hop limit */
+    buffer[lowpan6_header_len++] = IP6H_HOPLIM(ip6hdr);
+  }
+
+  /* Compress source address */
+  if (((buffer[1] & 0x40) != 0) ||
+      (ip6_addr_islinklocal(ip_2_ip6(&ip6src)))) {
+    /* Context-based or link-local source address compression. */
+    i = lowpan6_get_address_mode(ip_2_ip6(&ip6src), src);
+    buffer[1] |= (i & 0x03) << 4;
+    if (i == 1) {
+      MEMCPY(buffer + lowpan6_header_len, inptr + 16, 8);
+      lowpan6_header_len += 8;
+    } else if (i == 2) {
+      MEMCPY(buffer + lowpan6_header_len, inptr + 22, 2);
+      lowpan6_header_len += 2;
+    }
+  } else if (ip6_addr_isany(ip_2_ip6(&ip6src))) {
+    /* Special case: mark SAC and leave SAM=0 */
+    buffer[1] |= 0x40;
+  } else {
+    /* Append full address. */
+    MEMCPY(buffer + lowpan6_header_len, inptr + 8, 16);
+    lowpan6_header_len += 16;
+  }
+
+  /* Compress destination address */
+  if (ip6_addr_ismulticast(ip_2_ip6(&ip6dst))) {
+    /* @todo support stateful multicast address compression */
+
+    buffer[1] |= 0x08;
+
+    i = lowpan6_get_address_mode_mc(ip_2_ip6(&ip6dst));
+    buffer[1] |= i & 0x03;
+    if (i == 0) {
+      MEMCPY(buffer + lowpan6_header_len, inptr + 24, 16);
+      lowpan6_header_len += 16;
+    } else if (i == 1) {
+      buffer[lowpan6_header_len++] = inptr[25];
+      MEMCPY(buffer + lowpan6_header_len, inptr + 35, 5);
+      lowpan6_header_len += 5;
+    } else if (i == 2) {
+      buffer[lowpan6_header_len++] = inptr[25];
+      MEMCPY(buffer + lowpan6_header_len, inptr + 37, 3);
+      lowpan6_header_len += 3;
+    } else if (i == 3) {
+      buffer[lowpan6_header_len++] = (inptr)[39];
+    }
+  } else if (((buffer[1] & 0x04) != 0) ||
+              (ip6_addr_islinklocal(ip_2_ip6(&ip6dst)))) {
+    /* Context-based or link-local destination address compression. */
+    i = lowpan6_get_address_mode(ip_2_ip6(&ip6dst), dst);
+    buffer[1] |= i & 0x03;
+    if (i == 1) {
+      MEMCPY(buffer + lowpan6_header_len, inptr + 32, 8);
+      lowpan6_header_len += 8;
+    } else if (i == 2) {
+      MEMCPY(buffer + lowpan6_header_len, inptr + 38, 2);
+      lowpan6_header_len += 2;
+    }
+  } else {
+    /* Append full address. */
+    MEMCPY(buffer + lowpan6_header_len, inptr + 24, 16);
+    lowpan6_header_len += 16;
+  }
+
+  /* Move to payload. */
+  inptr += IP6_HLEN;
+  hidden_header_len += IP6_HLEN;
+
+#if LWIP_UDP
+  /* Compress UDP header? */
+  if (IP6H_NEXTH(ip6hdr) == IP6_NEXTH_UDP) {
+    /* @todo support optional checksum compression */
+
+    if (inbuf_size < IP6_HLEN + UDP_HLEN) {
+      /* input buffer too short */
+      return ERR_VAL;
+    }
+    if (outbuf_size < (size_t)(hidden_header_len + 7)) {
+      /* output buffer too short for worst case */
+      return ERR_MEM;
+    }
+
+    buffer[lowpan6_header_len] = 0xf0;
+
+    /* determine port compression mode. */
+    if ((inptr[0] == 0xf0) && ((inptr[1] & 0xf0) == 0xb0) &&
+        (inptr[2] == 0xf0) && ((inptr[3] & 0xf0) == 0xb0)) {
+      /* Compress source and dest ports. */
+      buffer[lowpan6_header_len++] |= 0x03;
+      buffer[lowpan6_header_len++] = ((inptr[1] & 0x0f) << 4) | (inptr[3] & 0x0f);
+    } else if (inptr[0] == 0xf0) {
+      /* Compress source port. */
+      buffer[lowpan6_header_len++] |= 0x02;
+      buffer[lowpan6_header_len++] = inptr[1];
+      buffer[lowpan6_header_len++] = inptr[2];
+      buffer[lowpan6_header_len++] = inptr[3];
+    } else if (inptr[2] == 0xf0) {
+      /* Compress dest port. */
+      buffer[lowpan6_header_len++] |= 0x01;
+      buffer[lowpan6_header_len++] = inptr[0];
+      buffer[lowpan6_header_len++] = inptr[1];
+      buffer[lowpan6_header_len++] = inptr[3];
+    } else {
+      /* append full ports. */
+      lowpan6_header_len++;
+      buffer[lowpan6_header_len++] = inptr[0];
+      buffer[lowpan6_header_len++] = inptr[1];
+      buffer[lowpan6_header_len++] = inptr[2];
+      buffer[lowpan6_header_len++] = inptr[3];
+    }
+
+    /* elide length and copy checksum */
+    buffer[lowpan6_header_len++] = inptr[6];
+    buffer[lowpan6_header_len++] = inptr[7];
+
+    hidden_header_len += UDP_HLEN;
+  }
+#endif /* LWIP_UDP */
+
+  *lowpan6_header_len_out = lowpan6_header_len;
+  *hidden_header_len_out = hidden_header_len;
+
+  return ERR_OK;
+}
+
+/** Decompress IPv6 and UDP headers compressed according to RFC 6282
+ *
+ * @param lowpan6_buffer compressed headers, first byte is the dispatch byte
+ * @param lowpan6_bufsize size of lowpan6_buffer (may include data after headers)
+ * @param decomp_buffer buffer where the decompressed headers are stored
+ * @param decomp_bufsize size of decomp_buffer
+ * @param hdr_size_comp returns the size of the compressed headers (skip to get to data)
+ * @param hdr_size_decomp returns the size of the decompressed headers (IPv6 + UDP)
+ * @param datagram_size datagram size from fragments or 0 if unfragmented
+ * @param compressed_size compressed datagram size (for unfragmented rx)
+ * @param lowpan6_contexts context addresses
+ * @param src source address of the outer layer, used for address compression
+ * @param dest destination address of the outer layer, used for address compression
+ * @return ERR_OK if decompression succeeded, an error otherwise
+ */
+static err_t
+lowpan6_decompress_hdr(u8_t *lowpan6_buffer, size_t lowpan6_bufsize,
+                       u8_t *decomp_buffer, size_t decomp_bufsize,
+                       u16_t *hdr_size_comp, u16_t *hdr_size_decomp,
+                       u16_t datagram_size, u16_t compressed_size,
+                       ip6_addr_t *lowpan6_contexts,
+                       struct lowpan6_link_addr *src, struct lowpan6_link_addr *dest)
+{
+  u16_t lowpan6_offset;
+  struct ip6_hdr *ip6hdr;
+  s8_t i;
+  u32_t header_temp;
+  u16_t ip6_offset = IP6_HLEN;
+
+  LWIP_ASSERT("lowpan6_buffer != NULL", lowpan6_buffer != NULL);
+  LWIP_ASSERT("decomp_buffer != NULL", decomp_buffer != NULL);
+  LWIP_ASSERT("src != NULL", src != NULL);
+  LWIP_ASSERT("dest != NULL", dest != NULL);
+  LWIP_ASSERT("hdr_size_comp != NULL", hdr_size_comp != NULL);
+  LWIP_ASSERT("dehdr_size_decompst != NULL", hdr_size_decomp != NULL);
+
+  ip6hdr = (struct ip6_hdr *)decomp_buffer;
+  if (decomp_bufsize < IP6_HLEN) {
+    return ERR_MEM;
+  }
+
+  /* output the full compressed packet, if set in @see lowpan6_opts.h */
+#if LWIP_LOWPAN6_IP_COMPRESSED_DEBUG
+  {
+    u16_t j;
+    LWIP_DEBUGF(LWIP_LOWPAN6_IP_COMPRESSED_DEBUG, ("lowpan6_decompress_hdr: IP6 payload (compressed): \n"));
+    for (j = 0; j < lowpan6_bufsize; j++) {
+      if ((j % 4) == 0) {
+        LWIP_DEBUGF(LWIP_LOWPAN6_IP_COMPRESSED_DEBUG, ("\n"));
+      }
+      LWIP_DEBUGF(LWIP_LOWPAN6_IP_COMPRESSED_DEBUG, ("%2X ", lowpan6_buffer[j]));
+    }
+    LWIP_DEBUGF(LWIP_LOWPAN6_IP_COMPRESSED_DEBUG, ("\np->len: %d", lowpan6_bufsize));
+  }
+#endif
+
+  /* offset for inline IP headers (RFC 6282 ch3)*/
+  lowpan6_offset = 2;
+  /* 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++;
+  }
+
+  /* Set IPv6 version, traffic class and flow label. (RFC6282, ch 3.1.1.)*/
+  if ((lowpan6_buffer[0] & 0x18) == 0x00) {
+    header_temp = ((lowpan6_buffer[lowpan6_offset+1] & 0x0f) << 16) | \
+      (lowpan6_buffer[lowpan6_offset + 2] << 8) | lowpan6_buffer[lowpan6_offset+3];
+    LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("TF: 00, ECN: 0x%2x, Flowlabel+DSCP: 0x%8X\n", \
+      lowpan6_buffer[lowpan6_offset],header_temp));
+    IP6H_VTCFL_SET(ip6hdr, 6, lowpan6_buffer[lowpan6_offset], header_temp);
+    /* increase offset, processed 4 bytes here:
+     * TF=00:  ECN + DSCP + 4-bit Pad + Flow Label (4 bytes)*/
+    lowpan6_offset += 4;
+  } else if ((lowpan6_buffer[0] & 0x18) == 0x08) {
+    header_temp = ((lowpan6_buffer[lowpan6_offset] & 0x0f) << 16) | (lowpan6_buffer[lowpan6_offset + 1] << 8) | lowpan6_buffer[lowpan6_offset+2];
+    LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("TF: 01, ECN: 0x%2x, Flowlabel: 0x%2X, DSCP ignored\n", \
+      lowpan6_buffer[lowpan6_offset] & 0xc0,header_temp));
+    IP6H_VTCFL_SET(ip6hdr, 6, lowpan6_buffer[lowpan6_offset] & 0xc0, header_temp);
+    /* increase offset, processed 3 bytes here:
+     * TF=01:  ECN + 2-bit Pad + Flow Label (3 bytes), DSCP is elided.*/
+    lowpan6_offset += 3;
+  } else if ((lowpan6_buffer[0] & 0x18) == 0x10) {
+    LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("TF: 10, DCSP+ECN: 0x%2x, Flowlabel ignored\n", lowpan6_buffer[lowpan6_offset]));
+    IP6H_VTCFL_SET(ip6hdr, 6, lowpan6_buffer[lowpan6_offset],0);
+    /* increase offset, processed 1 byte here:
+     * ECN + DSCP (1 byte), Flow Label is elided.*/
+    lowpan6_offset += 1;
+  } else if ((lowpan6_buffer[0] & 0x18) == 0x18) {
+    LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("TF: 11, DCSP/ECN & Flowlabel ignored\n"));
+    /* don't increase offset, no bytes processed here */
+    IP6H_VTCFL_SET(ip6hdr, 6, 0, 0);
+  }
+
+  /* Set Next Header (NH) */
+  if ((lowpan6_buffer[0] & 0x04) == 0x00) {
+    /* 0: full next header byte carried inline (increase offset)*/
+    LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("NH: 0x%2X\n", lowpan6_buffer[lowpan6_offset+1]));
+    IP6H_NEXTH_SET(ip6hdr, lowpan6_buffer[lowpan6_offset++]);
+  } else {
+    /* 1: NH compression, LOWPAN_NHC (RFC6282, ch 4.1) */
+    /* We should fill this later with NHC decoding */
+    LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("NH: skipped, later done with NHC\n"));
+    IP6H_NEXTH_SET(ip6hdr, 0);
+  }
+
+  /* Set Hop Limit, either carried inline or 3 different hops (1,64,255) */
+  if ((lowpan6_buffer[0] & 0x03) == 0x00) {
+    LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Hops: full value: %d\n", lowpan6_buffer[lowpan6_offset+1]));
+    IP6H_HOPLIM_SET(ip6hdr, lowpan6_buffer[lowpan6_offset++]);
+  } else if ((lowpan6_buffer[0] & 0x03) == 0x01) {
+    LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Hops: compressed: 1\n"));
+    IP6H_HOPLIM_SET(ip6hdr, 1);
+  } else if ((lowpan6_buffer[0] & 0x03) == 0x02) {
+    LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Hops: compressed: 64\n"));
+    IP6H_HOPLIM_SET(ip6hdr, 64);
+  } else if ((lowpan6_buffer[0] & 0x03) == 0x03) {
+    LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Hops: compressed: 255\n"));
+    IP6H_HOPLIM_SET(ip6hdr, 255);
+  }
+
+  /* Source address decoding. */
+  if ((lowpan6_buffer[1] & 0x40) == 0x00) {
+    /* Source address compression (SAC) = 0 -> stateless compression */
+    LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAC == 0, no context byte\n"));
+    /* Stateless compression */
+    if ((lowpan6_buffer[1] & 0x30) == 0x00) {
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == 00, no src compression, fetching 128bits inline\n"));
+      /* copy full address, increase offset by 16 Bytes */
+      MEMCPY(&ip6hdr->src.addr[0], lowpan6_buffer + lowpan6_offset, 16);
+      lowpan6_offset += 16;
+    } else if ((lowpan6_buffer[1] & 0x30) == 0x10) {
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == 01, src compression, 64bits inline\n"));
+      /* set 64 bits to link local */
+      ip6hdr->src.addr[0] = PP_HTONL(0xfe800000UL);
+      ip6hdr->src.addr[1] = 0;
+      /* copy 8 Bytes, increase offset */
+      MEMCPY(&ip6hdr->src.addr[2], lowpan6_buffer + lowpan6_offset, 8);
+      lowpan6_offset += 8;
+    } else if ((lowpan6_buffer[1] & 0x30) == 0x20) {
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == 10, src compression, 16bits inline\n"));
+      /* set 96 bits to link local */
+      ip6hdr->src.addr[0] = PP_HTONL(0xfe800000UL);
+      ip6hdr->src.addr[1] = 0;
+      ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL);
+      /* extract remaining 16bits from inline bytes, increase offset */
+      ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (lowpan6_buffer[lowpan6_offset] << 8) |
+                                       lowpan6_buffer[lowpan6_offset + 1]);
+      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 */
+      ip6hdr->src.addr[0] = PP_HTONL(0xfe800000UL);
+      ip6hdr->src.addr[1] = 0;
+      if (src->addr_len == 2) {
+        ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL);
+        ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (src->addr[0] << 8) | src->addr[1]);
+      } else if (src->addr_len == 8) {
+        ip6hdr->src.addr[2] = lwip_htonl(((src->addr[0] ^ 2) << 24) | (src->addr[1] << 16) |
+                                         (src->addr[2] << 8) | src->addr[3]);
+        ip6hdr->src.addr[3] = lwip_htonl((src->addr[4] << 24) | (src->addr[5] << 16) |
+                                         (src->addr[6] << 8) | src->addr[7]);
+      } else {
+        /* invalid source address length */
+        LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Invalid source address length\n"));
+        return ERR_VAL;
+      }
+    }
+  } else {
+    /* Source address compression (SAC) = 1 -> stateful/context-based compression */
+    LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAC == 1, additional context byte\n"));
+    if ((lowpan6_buffer[1] & 0x30) == 0x00) {
+      /* SAM=00, address=> :: (ANY) */
+      ip6hdr->src.addr[0] = 0;
+      ip6hdr->src.addr[1] = 0;
+      ip6hdr->src.addr[2] = 0;
+      ip6hdr->src.addr[3] = 0;
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == 00, context compression, ANY (::)\n"));
+    } else {
+      /* Set prefix from context info */
+      if (lowpan6_buffer[1] & 0x80) {
+        i = (lowpan6_buffer[2] >> 4) & 0x0f;
+      } else {
+        i = 0;
+      }
+      if (i >= LWIP_6LOWPAN_NUM_CONTEXTS) {
+        /* Error */
+        return ERR_VAL;
+      }
+#if LWIP_6LOWPAN_NUM_CONTEXTS > 0
+      ip6hdr->src.addr[0] = lowpan6_contexts[i].addr[0];
+      ip6hdr->src.addr[1] = lowpan6_contexts[i].addr[1];
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == xx, context compression found @%d: %8X, %8X\n", (int)i, ip6hdr->src.addr[0], ip6hdr->src.addr[1]));
+#else
+      LWIP_UNUSED_ARG(lowpan6_contexts);
+#endif
+    }
+
+    /* determine further address bits */
+    if ((lowpan6_buffer[1] & 0x30) == 0x10) {
+      /* SAM=01, load additional 64bits */
+      MEMCPY(&ip6hdr->src.addr[2], lowpan6_buffer + lowpan6_offset, 8);
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == 01, context compression, 64bits inline\n"));
+      lowpan6_offset += 8;
+    } else if ((lowpan6_buffer[1] & 0x30) == 0x20) {
+      /* SAM=01, load additional 16bits */
+      ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL);
+      ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (lowpan6_buffer[lowpan6_offset] << 8) | lowpan6_buffer[lowpan6_offset + 1]);
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == 10, context compression, 16bits inline\n"));
+      lowpan6_offset += 2;
+    } else if ((lowpan6_buffer[1] & 0x30) == 0x30) {
+      /* SAM=11, address is fully elided, load from other layers */
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == 11, context compression, 0bits inline, using other headers\n"));
+      if (src->addr_len == 2) {
+        ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL);
+        ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (src->addr[0] << 8) | src->addr[1]);
+      } else if (src->addr_len == 8) {
+        ip6hdr->src.addr[2] = lwip_htonl(((src->addr[0] ^ 2) << 24) | (src->addr[1] << 16) | (src->addr[2] << 8) | src->addr[3]);
+        ip6hdr->src.addr[3] = lwip_htonl((src->addr[4] << 24) | (src->addr[5] << 16) | (src->addr[6] << 8) | src->addr[7]);
+      } else {
+        /* invalid source address length */
+        LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Invalid source address length\n"));
+        return ERR_VAL;
+      }
+    }
+  }
+
+  /* Destination address decoding. */
+  if (lowpan6_buffer[1] & 0x08) {
+    LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("M=1: multicast\n"));
+    /* Multicast destination */
+    if (lowpan6_buffer[1] & 0x04) {
+      LWIP_DEBUGF(LWIP_DBG_ON,("DAC == 1, context multicast: unsupported!!!\n"));
+      /* @todo support stateful multicast addressing */
+      return ERR_VAL;
+    }
+
+    if ((lowpan6_buffer[1] & 0x03) == 0x00) {
+      /* DAM = 00, copy full address (128bits) */
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAM == 00, no dst compression, fetching 128bits inline\n"));
+      MEMCPY(&ip6hdr->dest.addr[0], lowpan6_buffer + lowpan6_offset, 16);
+      lowpan6_offset += 16;
+    } else if ((lowpan6_buffer[1] & 0x03) == 0x01) {
+      /* DAM = 01, copy 4 bytes (32bits) */
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAM == 01, dst address form (48bits): ffXX::00XX:XXXX:XXXX\n"));
+      ip6hdr->dest.addr[0] = lwip_htonl(0xff000000UL | (lowpan6_buffer[lowpan6_offset++] << 16));
+      ip6hdr->dest.addr[1] = 0;
+      ip6hdr->dest.addr[2] = lwip_htonl(lowpan6_buffer[lowpan6_offset++]);
+      ip6hdr->dest.addr[3] = lwip_htonl((lowpan6_buffer[lowpan6_offset] << 24) | (lowpan6_buffer[lowpan6_offset + 1] << 16) | (lowpan6_buffer[lowpan6_offset + 2] << 8) | lowpan6_buffer[lowpan6_offset + 3]);
+      lowpan6_offset += 4;
+    } else if ((lowpan6_buffer[1] & 0x03) == 0x02) {
+      /* DAM = 10, copy 3 bytes (24bits) */
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAM == 10, dst address form (32bits): ffXX::00XX:XXXX\n"));
+      ip6hdr->dest.addr[0] = lwip_htonl(0xff000000UL | (lowpan6_buffer[lowpan6_offset++] << 16));
+      ip6hdr->dest.addr[1] = 0;
+      ip6hdr->dest.addr[2] = 0;
+      ip6hdr->dest.addr[3] = lwip_htonl((lowpan6_buffer[lowpan6_offset] << 16) | (lowpan6_buffer[lowpan6_offset + 1] << 8) | lowpan6_buffer[lowpan6_offset + 2]);
+      lowpan6_offset += 3;
+    } else if ((lowpan6_buffer[1] & 0x03) == 0x03) {
+      /* DAM = 11, copy 1 byte (8bits) */
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAM == 11, dst address form (8bits): ff02::00XX\n"));
+      ip6hdr->dest.addr[0] = PP_HTONL(0xff020000UL);
+      ip6hdr->dest.addr[1] = 0;
+      ip6hdr->dest.addr[2] = 0;
+      ip6hdr->dest.addr[3] = lwip_htonl(lowpan6_buffer[lowpan6_offset++]);
+    }
+
+  } else {
+    /* no Multicast (M=0) */
+    if (lowpan6_buffer[1] & 0x04) {
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAC == 1, stateful compression\n"));
+      /* Stateful destination compression */
+      /* Set prefix from context info */
+      if (lowpan6_buffer[1] & 0x80) {
+        i = lowpan6_buffer[2] & 0x0f;
+      } else {
+        i = 0;
+      }
+      if (i >= LWIP_6LOWPAN_NUM_CONTEXTS) {
+        /* Error */
+        return ERR_VAL;
+      }
+#if LWIP_6LOWPAN_NUM_CONTEXTS > 0
+      ip6hdr->dest.addr[0] = lowpan6_contexts[i].addr[0];
+      ip6hdr->dest.addr[1] = lowpan6_contexts[i].addr[1];
+#endif
+    } else {
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAC == 0, stateless compression, setting link local prefix\n"));
+      /* Link local address compression */
+      ip6hdr->dest.addr[0] = PP_HTONL(0xfe800000UL);
+      ip6hdr->dest.addr[1] = 0;
+    }
+
+    /* 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"));
+      /* DAM=00, copy full address */
+      MEMCPY(&ip6hdr->dest.addr[0], lowpan6_buffer + lowpan6_offset, 16);
+      lowpan6_offset += 16;
+    } else if ((lowpan6_buffer[1] & 0x03) == 0x01) {
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAM == 01, dst compression, 64bits inline\n"));
+      /* DAM=01, copy 64 inline bits, increase offset */
+      MEMCPY(&ip6hdr->dest.addr[2], lowpan6_buffer + lowpan6_offset, 8);
+      lowpan6_offset += 8;
+    } else if ((lowpan6_buffer[1] & 0x03) == 0x02) {
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAM == 01, dst compression, 16bits inline\n"));
+      /* DAM=10, copy 16 inline bits, increase offset */
+      ip6hdr->dest.addr[2] = PP_HTONL(0x000000ffUL);
+      ip6hdr->dest.addr[3] = lwip_htonl(0xfe000000UL | (lowpan6_buffer[lowpan6_offset] << 8) | lowpan6_buffer[lowpan6_offset + 1]);
+      lowpan6_offset += 2;
+    } else if ((lowpan6_buffer[1] & 0x03) == 0x03) {
+      /* DAM=11, no bits available, use other headers (not done here) */
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG,("DAM == 01, dst compression, 0bits inline, using other headers\n"));
+      if (dest->addr_len == 2) {
+        ip6hdr->dest.addr[2] = PP_HTONL(0x000000ffUL);
+        ip6hdr->dest.addr[3] = lwip_htonl(0xfe000000UL | (dest->addr[0] << 8) | dest->addr[1]);
+      } else if (dest->addr_len == 8) {
+        ip6hdr->dest.addr[2] = lwip_htonl(((dest->addr[0] ^ 2) << 24) | (dest->addr[1] << 16) | dest->addr[2] << 8 | dest->addr[3]);
+        ip6hdr->dest.addr[3] = lwip_htonl((dest->addr[4] << 24) | (dest->addr[5] << 16) | dest->addr[6] << 8 | dest->addr[7]);
+      } else {
+        /* invalid destination address length */
+        LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Invalid destination address length\n"));
+        return ERR_VAL;
+      }
+    }
+  }
+
+
+  /* Next Header Compression (NHC) decoding? */
+  if (lowpan6_buffer[0] & 0x04) {
+    LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("NHC decoding\n"));
+#if LWIP_UDP
+    if ((lowpan6_buffer[lowpan6_offset] & 0xf8) == 0xf0) {
+      /* NHC: UDP */
+      struct udp_hdr *udphdr;
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("NHC: UDP\n"));
+
+      /* UDP compression */
+      IP6H_NEXTH_SET(ip6hdr, IP6_NEXTH_UDP);
+      udphdr = (struct udp_hdr *)((u8_t *)decomp_buffer + ip6_offset);
+      if (decomp_bufsize < IP6_HLEN + UDP_HLEN) {
+        return ERR_MEM;
+      }
+
+      /* Checksum decompression */
+      if (lowpan6_buffer[lowpan6_offset] & 0x04) {
+        /* @todo support checksum decompress */
+        LWIP_DEBUGF(LWIP_DBG_ON, ("NHC: UDP chechsum decompression UNSUPPORTED\n"));
+        return ERR_VAL;
+      }
+
+      /* Decompress ports, according to RFC4944 */
+      i = lowpan6_buffer[lowpan6_offset++] & 0x03;
+      if (i == 0) {
+        udphdr->src = lwip_htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]);
+        udphdr->dest = lwip_htons(lowpan6_buffer[lowpan6_offset + 2] << 8 | lowpan6_buffer[lowpan6_offset + 3]);
+        lowpan6_offset += 4;
+      } else if (i == 0x01) {
+        udphdr->src = lwip_htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]);
+        udphdr->dest = lwip_htons(0xf000 | lowpan6_buffer[lowpan6_offset + 2]);
+        lowpan6_offset += 3;
+      } else if (i == 0x02) {
+        udphdr->src = lwip_htons(0xf000 | lowpan6_buffer[lowpan6_offset]);
+        udphdr->dest = lwip_htons(lowpan6_buffer[lowpan6_offset + 1] << 8 | lowpan6_buffer[lowpan6_offset + 2]);
+        lowpan6_offset += 3;
+      } else if (i == 0x03) {
+        udphdr->src = lwip_htons(0xf0b0 | ((lowpan6_buffer[lowpan6_offset] >> 4) & 0x0f));
+        udphdr->dest = lwip_htons(0xf0b0 | (lowpan6_buffer[lowpan6_offset] & 0x0f));
+        lowpan6_offset += 1;
+      }
+
+      udphdr->chksum = lwip_htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]);
+      lowpan6_offset += 2;
+      ip6_offset += UDP_HLEN;
+      if (datagram_size == 0) {
+        datagram_size = compressed_size - lowpan6_offset + ip6_offset;
+      }
+      udphdr->len = lwip_htons(datagram_size - IP6_HLEN);
+
+    } else
+#endif /* LWIP_UDP */
+    {
+      LWIP_DEBUGF(LWIP_DBG_ON,("NHC: unsupported protocol!\n"));
+      /* @todo support NHC other than UDP */
+      return ERR_VAL;
+    }
+  }
+  if (datagram_size == 0) {
+    datagram_size = compressed_size - lowpan6_offset + ip6_offset;
+  }
+  /* Infer IPv6 payload length for header */
+  IP6H_PLEN_SET(ip6hdr, datagram_size - IP6_HLEN);
+
+  if (lowpan6_offset > lowpan6_bufsize) {
+    /* input buffer overflow */
+    return ERR_VAL;
+  }
+  *hdr_size_comp = lowpan6_offset;
+  *hdr_size_decomp = ip6_offset;
+
+  return ERR_OK;
+}
+
+struct pbuf *
+lowpan6_decompress(struct pbuf *p, u16_t datagram_size, ip6_addr_t *lowpan6_contexts,
+                   struct lowpan6_link_addr *src, struct lowpan6_link_addr *dest)
+{
+  struct pbuf *q;
+  u16_t lowpan6_offset, ip6_offset;
+  err_t err;
+
+#if LWIP_UDP
+#define UDP_HLEN_ALLOC UDP_HLEN
+#else
+#define UDP_HLEN_ALLOC 0
+#endif
+
+  /* Allocate a buffer for decompression. This buffer will be too big and will be
+     trimmed once the final size is known. */
+  q = pbuf_alloc(PBUF_IP, p->len + IP6_HLEN + UDP_HLEN_ALLOC, PBUF_POOL);
+  if (q == NULL) {
+    pbuf_free(p);
+    return NULL;
+  }
+  if (q->len < IP6_HLEN + UDP_HLEN_ALLOC) {
+    /* The headers need to fit into the first pbuf */
+    pbuf_free(p);
+    pbuf_free(q);
+    return NULL;
+  }
+
+  /* Decompress the IPv6 (and possibly UDP) header(s) into the new pbuf */
+  err = lowpan6_decompress_hdr((u8_t *)p->payload, p->len, (u8_t *)q->payload, q->len,
+    &lowpan6_offset, &ip6_offset, datagram_size, p->tot_len, lowpan6_contexts, src, dest);
+  if (err != ERR_OK) {
+    pbuf_free(p);
+    pbuf_free(q);
+    return NULL;
+  }
+
+  /* Now we copy leftover contents from p to q, so we have all L2 and L3 headers
+     (and L4?) in a single pbuf: */
+
+  /* Hide the compressed headers in p */
+  pbuf_remove_header(p, lowpan6_offset);
+  /* Temporarily hide the headers in q... */
+  pbuf_remove_header(q, ip6_offset);
+  /* ... copy the rest of p into q... */
+  pbuf_copy(q, p);
+  /* ... and reveal the headers again... */
+  pbuf_add_header_force(q, ip6_offset);
+  /* ... trim the pbuf to its correct size... */
+  pbuf_realloc(q, ip6_offset + p->len);
+  /* ... and cat possibly remaining (data-only) pbufs */
+  if (p->next != NULL) {
+    pbuf_cat(q, p->next);
+  }
+  /* the original (first) pbuf can now be freed */
+  p->next = NULL;
+  pbuf_free(p);
+
+  /* all done */
+  return q;
+}
+
+#endif /* LWIP_6LOWPAN_IPHC */
+#endif /* LWIP_IPV6 */
diff --git a/src/netif/ppp/fsm.c b/src/netif/ppp/fsm.c
index 81eba11..b1f08af 100644
--- a/src/netif/ppp/fsm.c
+++ b/src/netif/ppp/fsm.c
@@ -236,7 +236,7 @@
  */
 void fsm_close(fsm *f, const char *reason) {
     f->term_reason = reason;
-    f->term_reason_len = (reason == NULL? 0: LWIP_MIN(strlen(reason), 0xFF) );
+    f->term_reason_len = (reason == NULL? 0: (u8_t)LWIP_MIN(strlen(reason), 0xFF) );
     switch( f->state ){
     case PPP_FSM_STARTING:
 	f->state = PPP_FSM_INITIAL;
diff --git a/src/netif/ppp/mppe.c b/src/netif/ppp/mppe.c
index 331039f..4cca89d 100644
--- a/src/netif/ppp/mppe.c
+++ b/src/netif/ppp/mppe.c
@@ -201,13 +201,13 @@
 	/* TCP stack requires that we don't change the packet payload, therefore we copy
 	 * the whole packet before encryption.
 	 */
-	np = pbuf_alloc(PBUF_RAW, MPPE_OVHD + sizeof(protocol) + (*pb)->tot_len, PBUF_POOL);
+	np = pbuf_alloc(PBUF_RAW, MPPE_OVHD + sizeof(protocol) + (*pb)->tot_len, PBUF_RAM);
 	if (!np) {
 		return ERR_MEM;
 	}
 
 	/* Hide MPPE header + protocol */
-	pbuf_header(np, -(s16_t)(MPPE_OVHD + sizeof(protocol)));
+	pbuf_remove_header(np, MPPE_OVHD + sizeof(protocol));
 
 	if ((err = pbuf_copy(np, *pb)) != ERR_OK) {
 		pbuf_free(np);
@@ -215,7 +215,7 @@
 	}
 
 	/* Reveal MPPE header + protocol */
-	pbuf_header(np, (s16_t)(MPPE_OVHD + sizeof(protocol)));
+	pbuf_add_header(np, MPPE_OVHD + sizeof(protocol));
 
 	*pb = np;
 	pl = (u8_t*)np->payload;
@@ -246,7 +246,7 @@
 	pl[1] = protocol;
 
 	/* Hide MPPE header */
-	pbuf_header(np, -(s16_t)MPPE_OVHD);
+	pbuf_remove_header(np, MPPE_OVHD);
 
 	/* Encrypt packet */
 	for (n = np; n != NULL; n = n->next) {
@@ -257,7 +257,7 @@
 	}
 
 	/* Reveal MPPE header */
-	pbuf_header(np, (s16_t)MPPE_OVHD);
+	pbuf_add_header(np, MPPE_OVHD);
 
 	return ERR_OK;
 }
@@ -382,7 +382,7 @@
 	}
 
 	/* Hide MPPE header */
-	pbuf_header(n0, -(s16_t)(MPPE_OVHD));
+	pbuf_remove_header(n0, MPPE_OVHD);
 
 	/* Decrypt the packet. */
 	for (n = n0; n != NULL; n = n->next) {
diff --git a/src/netif/ppp/ppp.c b/src/netif/ppp/ppp.c
index 8b77765..a9c18e3 100644
--- a/src/netif/ppp/ppp.c
+++ b/src/netif/ppp/ppp.c
@@ -80,8 +80,8 @@
  */
 
 /**
- * @defgroup ppp PPP netif
- * @ingroup addons
+ * @defgroup ppp PPP
+ * @ingroup netifs
  * @verbinclude "ppp.txt"
  */
 
@@ -203,9 +203,9 @@
 /* Prototypes for procedures local to this file. */
 static void ppp_do_connect(void *arg);
 static err_t ppp_netif_init_cb(struct netif *netif);
-#if LWIP_IPV4
+#if PPP_IPV4_SUPPORT
 static err_t ppp_netif_output_ip4(struct netif *netif, struct pbuf *pb, const ip4_addr_t *ipaddr);
-#endif /* LWIP_IPV4 */
+#endif /* PPP_IPV4_SUPPORT */
 #if PPP_IPV6_SUPPORT
 static err_t ppp_netif_output_ip6(struct netif *netif, struct pbuf *pb, const ip6_addr_t *ipaddr);
 #endif /* PPP_IPV6_SUPPORT */
@@ -216,6 +216,7 @@
 /***********************************/
 #if PPP_AUTH_SUPPORT
 void ppp_set_auth(ppp_pcb *pcb, u8_t authtype, const char *user, const char *passwd) {
+  LWIP_ASSERT_CORE_LOCKED();
 #if PAP_SUPPORT
   pcb->settings.refuse_pap = !(authtype & PPPAUTHTYPE_PAP);
 #endif /* PAP_SUPPORT */
@@ -268,12 +269,15 @@
  * established before calling this.
  */
 err_t ppp_connect(ppp_pcb *pcb, u16_t holdoff) {
+  LWIP_ASSERT_CORE_LOCKED();
   if (pcb->phase != PPP_PHASE_DEAD) {
     return ERR_ALREADY;
   }
 
   PPPDEBUG(LOG_DEBUG, ("ppp_connect[%d]: holdoff=%d\n", pcb->netif->num, holdoff));
 
+  magic_randomize();
+
   if (holdoff == 0) {
     ppp_do_connect(pcb);
     return ERR_OK;
@@ -294,12 +298,15 @@
  * established before calling this.
  */
 err_t ppp_listen(ppp_pcb *pcb) {
+  LWIP_ASSERT_CORE_LOCKED();
   if (pcb->phase != PPP_PHASE_DEAD) {
     return ERR_ALREADY;
   }
 
   PPPDEBUG(LOG_DEBUG, ("ppp_listen[%d]\n", pcb->netif->num));
 
+  magic_randomize();
+
   if (pcb->link_cb->listen) {
     new_phase(pcb, PPP_PHASE_INITIALIZE);
     pcb->link_cb->listen(pcb, pcb->link_ctx_cb);
@@ -323,6 +330,8 @@
 err_t
 ppp_close(ppp_pcb *pcb, u8_t nocarrier)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
   pcb->err_code = PPPERR_USER;
 
   /* holdoff phase, cancel the reconnection */
@@ -383,6 +392,7 @@
  */
 err_t ppp_free(ppp_pcb *pcb) {
   err_t err;
+  LWIP_ASSERT_CORE_LOCKED();
   if (pcb->phase != PPP_PHASE_DEAD) {
     return ERR_CONN;
   }
@@ -402,6 +412,7 @@
 err_t
 ppp_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg)
 {
+  LWIP_ASSERT_CORE_LOCKED();
   if (pcb == NULL) {
     return ERR_VAL;
   }
@@ -456,10 +467,9 @@
 static err_t ppp_netif_init_cb(struct netif *netif) {
   netif->name[0] = 'p';
   netif->name[1] = 'p';
-#if LWIP_IPV4
-  /* FIXME: change that when netif_null_output_ip4() will materialize */
+#if PPP_IPV4_SUPPORT
   netif->output = ppp_netif_output_ip4;
-#endif /* LWIP_IPV4 */
+#endif /* PPP_IPV4_SUPPORT */
 #if PPP_IPV6_SUPPORT
   netif->output_ip6 = ppp_netif_output_ip6;
 #endif /* PPP_IPV6_SUPPORT */
@@ -471,21 +481,15 @@
   return ERR_OK;
 }
 
-#if LWIP_IPV4
+#if PPP_IPV4_SUPPORT
 /*
  * Send an IPv4 packet on the given connection.
  */
 static err_t ppp_netif_output_ip4(struct netif *netif, struct pbuf *pb, const ip4_addr_t *ipaddr) {
   LWIP_UNUSED_ARG(ipaddr);
-#if PPP_IPV4_SUPPORT
   return ppp_netif_output(netif, pb, PPP_IP);
-#else /* PPP_IPV4_SUPPORT */
-  LWIP_UNUSED_ARG(netif);
-  LWIP_UNUSED_ARG(pb);
-  return ERR_IF;
-#endif /* PPP_IPV4_SUPPORT */
 }
-#endif /* LWIP_IPV4 */
+#endif /* PPP_IPV4_SUPPORT */
 
 #if PPP_IPV6_SUPPORT
 /*
@@ -784,7 +788,7 @@
   ppp_dump_packet(pcb, "rcvd", (unsigned char *)pb->payload, pb->len);
 #endif /* PRINTPKT_SUPPORT */
 
-  pbuf_header(pb, -(s16_t)sizeof(protocol));
+  pbuf_remove_header(pb, sizeof(protocol));
 
   LINK_STATS_INC(link.recv);
   MIB2_STATS_NETIF_INC(pcb->netif, ifinucastpkts);
@@ -860,10 +864,10 @@
     pl = (u8_t*)pb->payload;
     if (pl[0] & 0x01) {
       protocol = pl[0];
-      pbuf_header(pb, -(s16_t)1);
+      pbuf_remove_header(pb, 1);
     } else {
       protocol = (pl[0] << 8) | pl[1];
-      pbuf_header(pb, -(s16_t)2);
+      pbuf_remove_header(pb, 2);
     }
   }
 #endif /* CCP_SUPPORT */
@@ -923,7 +927,7 @@
        */
       for (i = 0; (protp = protocols[i]) != NULL; ++i) {
         if (protp->protocol == protocol) {
-          pb = ppp_singlebuf(pb);
+          pb = pbuf_coalesce(pb, PBUF_RAW);
           (*protp->input)(pcb, (u8_t*)pb->payload, pb->len);
           goto out;
         }
@@ -957,7 +961,10 @@
 #endif /* PPP_PROTOCOLNAME */
         ppp_warn("Unsupported protocol 0x%x received", protocol);
 #endif /* PPP_DEBUG */
-        pbuf_header(pb, (s16_t)sizeof(protocol));
+        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);
       }
       break;
@@ -971,32 +978,6 @@
   pbuf_free(pb);
 }
 
-/* merge a pbuf chain into one pbuf */
-struct pbuf *ppp_singlebuf(struct pbuf *p) {
-  struct pbuf *q, *b;
-  u8_t *pl;
-
-  if(p->tot_len == p->len) {
-    return p;
-  }
-
-  q = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM);
-  if(!q) {
-    PPPDEBUG(LOG_ERR,
-             ("ppp_singlebuf: unable to alloc new buf (%d)\n", p->tot_len));
-    return p; /* live dangerously */
-  }
-
-  for(b = p, pl = (u8_t*)q->payload; b != NULL; b = b->next) {
-    MEMCPY(pl, b->payload, b->len);
-    pl += b->len;
-  }
-
-  pbuf_free(p);
-
-  return q;
-}
-
 /*
  * Write a pbuf to a ppp link, only used from PPP functions
  * to send PPP packets.
@@ -1127,9 +1108,9 @@
   ip_addr_t ns;
   LWIP_UNUSED_ARG(pcb);
 
-  ip_addr_set_ip4_u32(&ns, ns1);
+  ip_addr_set_ip4_u32_val(ns, ns1);
   dns_setserver(0, &ns);
-  ip_addr_set_ip4_u32(&ns, ns2);
+  ip_addr_set_ip4_u32_val(ns, ns2);
   dns_setserver(1, &ns);
   return 1;
 }
@@ -1144,12 +1125,12 @@
   LWIP_UNUSED_ARG(pcb);
 
   nsa = dns_getserver(0);
-  ip_addr_set_ip4_u32(&nsb, ns1);
+  ip_addr_set_ip4_u32_val(nsb, ns1);
   if (ip_addr_cmp(nsa, &nsb)) {
     dns_setserver(0, IP_ADDR_ANY);
   }
   nsa = dns_getserver(1);
-  ip_addr_set_ip4_u32(&nsb, ns2);
+  ip_addr_set_ip4_u32_val(nsb, ns2);
   if (ip_addr_cmp(nsa, &nsb)) {
     dns_setserver(1, IP_ADDR_ANY);
   }
@@ -1274,8 +1255,8 @@
   LWIP_UNUSED_ARG(our_eui64);
   LWIP_UNUSED_ARG(his_eui64);
 
-  netif_ip6_addr_set(pcb->netif, 0, IP6_ADDR_ANY6);
   netif_ip6_addr_set_state(pcb->netif, 0, IP6_ADDR_INVALID);
+  netif_ip6_addr_set(pcb->netif, 0, IP6_ADDR_ANY6);
   return 1;
 }
 
diff --git a/src/netif/ppp/pppoe.c b/src/netif/ppp/pppoe.c
index 3fcd190..8ed2d63 100644
--- a/src/netif/ppp/pppoe.c
+++ b/src/netif/ppp/pppoe.c
@@ -177,6 +177,7 @@
   struct pppoe_softc *sc;
   LWIP_UNUSED_ARG(service_name);
   LWIP_UNUSED_ARG(concentrator_name);
+  LWIP_ASSERT_CORE_LOCKED();
 
   sc = (struct pppoe_softc *)LWIP_MEMPOOL_ALLOC(PPPOE_IF);
   if (sc == NULL) {
@@ -210,7 +211,7 @@
 #endif /* MIB2_STATS */
 
   /* skip address & flags */
-  pbuf_header(p, -(s16_t)2);
+  pbuf_remove_header(p, 2);
 
   ph = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HEADERLEN), PBUF_RAM);
   if(!ph) {
@@ -221,7 +222,7 @@
     return ERR_MEM;
   }
 
-  pbuf_header(ph, -(s16_t)PPPOE_HEADERLEN); /* hide PPPoE header */
+  pbuf_remove_header(ph, PPPOE_HEADERLEN); /* hide PPPoE header */
   pbuf_cat(ph, p);
 #if MIB2_STATS
   tot_len = ph->tot_len;
@@ -261,7 +262,7 @@
     return ERR_MEM;
   }
 
-  pbuf_header(pb, -(s16_t)PPPOE_HEADERLEN);
+  pbuf_remove_header(pb, PPPOE_HEADERLEN);
 
   pl = (u8_t*)pb->payload;
   PUTSHORT(protocol, pl);
@@ -371,7 +372,7 @@
 void
 pppoe_disc_input(struct netif *netif, struct pbuf *pb)
 {
-  u16_t tag, len;
+  u16_t tag, len, off;
   u16_t session, plen;
   struct pppoe_softc *sc;
 #if PPP_DEBUG
@@ -385,10 +386,7 @@
 #endif
   struct pppoehdr *ph;
   struct pppoetag pt;
-  int off;
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
   int err;
-#endif
   struct eth_hdr *ethhdr;
 
   /* don't do anything if there is not a single PPPoE instance */
@@ -397,13 +395,9 @@
     return;
   }
 
-  pb = ppp_singlebuf(pb);
+  pb = pbuf_coalesce(pb, PBUF_RAW);
 
-  if (pb->len < sizeof(*ethhdr)) {
-    goto done;
-  }
   ethhdr = (struct eth_hdr *)pb->payload;
-  off = sizeof(*ethhdr);
 
   ac_cookie = NULL;
   ac_cookie_len = 0;
@@ -412,7 +406,8 @@
   hunique_len = 0;
 #endif
   session = 0;
-  if (pb->len - off < (u16_t)PPPOE_HEADERLEN) {
+  off = sizeof(struct eth_hdr) + sizeof(struct pppoehdr);
+  if (pb->len < off) {
     PPPDEBUG(LOG_DEBUG, ("pppoe: packet too short: %d\n", pb->len));
     goto done;
   }
@@ -424,15 +419,18 @@
   }
   session = lwip_ntohs(ph->session);
   plen = lwip_ntohs(ph->plen);
-  off += sizeof(*ph);
 
-  if (plen + off > pb->len) {
+  if (plen > (pb->len - off)) {
     PPPDEBUG(LOG_DEBUG, ("pppoe: packet content does not fit: data available = %d, packet size = %u\n",
         pb->len - off, plen));
     goto done;
   }
   if(pb->tot_len == pb->len) {
-    pb->tot_len = pb->len = (u16_t)off + plen; /* ignore trailing garbage */
+    u16_t framelen = off + plen;
+    if (framelen < pb->len) {
+      /* ignore trailing garbage */
+      pb->tot_len = pb->len = framelen;
+    }
   }
   tag = 0;
   len = 0;
@@ -605,14 +603,10 @@
       sys_untimeout(pppoe_timeout, sc);
       sc->sc_padr_retried = 0;
       sc->sc_state = PPPOE_STATE_PADR_SENT;
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
-      if ((err = pppoe_send_padr(sc)) != 0) 
-      {
+      if ((err = pppoe_send_padr(sc)) != 0) {
         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 */
       }
-#else
-      pppoe_send_padr(sc);
-#endif 	/*defined(LWIP_DEBUG) && (DEBUG_LOG == LWIP_DEBUG_ON) */
       sys_timeout(PPPOE_DISC_TIMEOUT * (1 + sc->sc_padr_retried), pppoe_timeout, sc);
       break;
     case PPPOE_CODE_PADS:
@@ -667,9 +661,9 @@
 #ifdef PPPOE_TERM_UNKNOWN_SESSIONS
   MEMCPY(shost, ((struct eth_hdr *)pb->payload)->src.addr, sizeof(shost));
 #endif
-  if (pbuf_header(pb, -(s16_t)sizeof(struct eth_hdr)) != 0) {
+  if (pbuf_remove_header(pb, sizeof(struct eth_hdr)) != 0) {
     /* bail out */
-    PPPDEBUG(LOG_ERR, ("pppoe_data_input: pbuf_header failed\n"));
+    PPPDEBUG(LOG_ERR, ("pppoe_data_input: pbuf_remove_header failed\n"));
     LINK_STATS_INC(link.lenerr);
     goto drop;
   } 
@@ -700,9 +694,9 @@
 
   plen = lwip_ntohs(ph->plen);
 
-  if (pbuf_header(pb, -(s16_t)(PPPOE_HEADERLEN)) != 0) {
+  if (pbuf_remove_header(pb, PPPOE_HEADERLEN) != 0) {
     /* bail out */
-    PPPDEBUG(LOG_ERR, ("pppoe_data_input: pbuf_header PPPOE_HEADERLEN failed\n"));
+    PPPDEBUG(LOG_ERR, ("pppoe_data_input: pbuf_remove_header PPPOE_HEADERLEN failed\n"));
     LINK_STATS_INC(link.lenerr);
     goto drop;
   } 
@@ -731,7 +725,7 @@
   err_t res;
 
   /* make room for Ethernet header - should not fail */
-  if (pbuf_header(pb, (s16_t)(sizeof(struct eth_hdr))) != 0) {
+  if (pbuf_add_header(pb, sizeof(struct eth_hdr)) != 0) {
     /* bail out */
     PPPDEBUG(LOG_ERR, ("pppoe: %c%c%"U16_F": pppoe_output: could not allocate room for Ethernet header\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));
     LINK_STATS_INC(link.lenerr);
@@ -823,9 +817,7 @@
 pppoe_timeout(void *arg)
 {
   u32_t retry_wait;
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
   int err;
-#endif
   struct pppoe_softc *sc = (struct pppoe_softc*)arg;
 
   PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": timeout\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));
@@ -858,14 +850,11 @@
       }
       /* initialize for quick retry mode */
       retry_wait = LWIP_MIN(PPPOE_DISC_TIMEOUT * sc->sc_padi_retried, PPPOE_SLOW_RETRY);
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
       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 */
       }
-#else
-      pppoe_send_padi(sc);
-#endif
       sys_timeout(retry_wait, pppoe_timeout, sc);
       break;
 
@@ -875,26 +864,18 @@
         MEMCPY(&sc->sc_dest, ethbroadcast.addr, sizeof(sc->sc_dest));
         sc->sc_state = PPPOE_STATE_PADI_SENT;
         sc->sc_padr_retried = 0;
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
         if ((err = pppoe_send_padi(sc)) != 0) {
           PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": failed to send 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 */
         }
-#else
-        pppoe_send_padi(sc);
-#endif
         sys_timeout(PPPOE_DISC_TIMEOUT * (1 + sc->sc_padi_retried), pppoe_timeout, sc);
         return;
       }
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
       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 */
       }
-#else
-      if (pppoe_send_padr(sc) != 0) {
-        sc->sc_padr_retried--; 
-      }
-#endif
       sys_timeout(PPPOE_DISC_TIMEOUT * (1 + sc->sc_padr_retried), pppoe_timeout, sc);
       break;
     default:
@@ -906,9 +887,7 @@
 static void
 pppoe_connect(ppp_pcb *ppp, void *ctx)
 {
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
   err_t err;
-#endif
   struct pppoe_softc *sc = (struct pppoe_softc *)ctx;
   lcp_options *lcp_wo;
   lcp_options *lcp_ao;
@@ -956,13 +935,9 @@
 
   /* save state, in case we fail to send PADI */
   sc->sc_state = PPPOE_STATE_PADI_SENT;
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
   if ((err = pppoe_send_padi(sc)) != 0) {
     PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": failed to send PADI, error=%d\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err));
-    }
-#else
-    pppoe_send_padi(sc);
-#endif
+  }
   sys_timeout(PPPOE_DISC_TIMEOUT, pppoe_timeout, sc);
 }
 
@@ -1069,7 +1044,12 @@
   }
   LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len);
 
-  pbuf_header(pb, (s16_t)sizeof(struct eth_hdr));
+  if (pbuf_add_header(pb, sizeof(struct eth_hdr))) {
+    PPPDEBUG(LOG_ERR, ("pppoe: pppoe_send_padt: could not allocate room for PPPoE header\n"));
+    LINK_STATS_INC(link.lenerr);
+    pbuf_free(pb);
+    return ERR_BUF;
+  }
   ethhdr = (struct eth_hdr *)pb->payload;
   ethhdr->type = PP_HTONS(ETHTYPE_PPPOEDISC);
   MEMCPY(&ethhdr->dest.addr, dest, sizeof(ethhdr->dest.addr));
@@ -1163,7 +1143,7 @@
   len = pb->tot_len;
 
   /* make room for PPPoE header - should not fail */
-  if (pbuf_header(pb, (s16_t)(PPPOE_HEADERLEN)) != 0) {
+  if (pbuf_add_header(pb, PPPOE_HEADERLEN) != 0) {
     /* bail out */
     PPPDEBUG(LOG_ERR, ("pppoe: %c%c%"U16_F": pppoe_xmit: could not allocate room for PPPoE header\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));
     LINK_STATS_INC(link.lenerr);
diff --git a/src/netif/ppp/pppol2tp.c b/src/netif/ppp/pppol2tp.c
index 846a21e..4c4557f 100644
--- a/src/netif/ppp/pppol2tp.c
+++ b/src/netif/ppp/pppol2tp.c
@@ -85,7 +85,7 @@
 static err_t pppol2tp_send_scccn(pppol2tp_pcb *l2tp, u16_t ns);
 static err_t pppol2tp_send_icrq(pppol2tp_pcb *l2tp, u16_t ns);
 static err_t pppol2tp_send_iccn(pppol2tp_pcb *l2tp, u16_t ns);
-static err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp, u16_t ns);
+static err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp, u16_t ns, u16_t nr);
 static err_t pppol2tp_send_stopccn(pppol2tp_pcb *l2tp, u16_t ns);
 static err_t pppol2tp_xmit(pppol2tp_pcb *l2tp, struct pbuf *pb);
 static err_t pppol2tp_udp_send(pppol2tp_pcb *l2tp, struct pbuf *pb);
@@ -181,7 +181,7 @@
     return ERR_MEM;
   }
 
-  pbuf_header(ph, -(s16_t)PPPOL2TP_OUTPUT_DATA_HEADER_LEN); /* hide L2TP header */
+  pbuf_remove_header(ph, PPPOL2TP_OUTPUT_DATA_HEADER_LEN); /* hide L2TP header */
   pbuf_cat(ph, p);
 #if MIB2_STATS
   tot_len = ph->tot_len;
@@ -221,7 +221,7 @@
     return ERR_MEM;
   }
 
-  pbuf_header(pb, -(s16_t)PPPOL2TP_OUTPUT_DATA_HEADER_LEN);
+  pbuf_remove_header(pb, PPPOL2TP_OUTPUT_DATA_HEADER_LEN);
 
   pl = (u8_t*)pb->payload;
   PUTSHORT(protocol, pl);
@@ -256,9 +256,7 @@
 
 /* Be a LAC, connect to a LNS. */
 static void pppol2tp_connect(ppp_pcb *ppp, void *ctx) {
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
   err_t err;
-#endif
   pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
   lcp_options *lcp_wo;
   lcp_options *lcp_ao;
@@ -324,13 +322,9 @@
   /* save state, in case we fail to send SCCRQ */
   l2tp->sccrq_retried = 0;
   l2tp->phase = PPPOL2TP_STATE_SCCRQ_SENT;
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
   if ((err = pppol2tp_send_sccrq(l2tp)) != 0) {
     PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send SCCRQ, error=%d\n", err));
   }
-#else
-  pppol2tp_send_sccrq(l2tp);
-#endif
   sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
 }
 
@@ -440,7 +434,7 @@
   /* printf("HLEN = %d\n", hlen); */
 
   /* skip L2TP header */
-  if (pbuf_header(p, -(s16_t)hlen) != 0) {
+  if (pbuf_remove_header(p, hlen) != 0) {
     goto free_and_return;
   }
 
@@ -475,7 +469,7 @@
   if (p->len >= 2) {
     GETSHORT(hflags, inp);
     if (hflags == 0xff03) {
-      pbuf_header(p, -(s16_t)2);
+      pbuf_remove_header(p, 2);
     }
   }
   /* Dispatch the packet thereby consuming it. */
@@ -492,30 +486,50 @@
 static void pppol2tp_dispatch_control_packet(pppol2tp_pcb *l2tp, u16_t port, struct pbuf *p, u16_t ns, u16_t nr) {
   u8_t *inp;
   u16_t avplen, avpflags, vendorid, attributetype, messagetype=0;
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
   err_t err;
-#endif
 #if PPPOL2TP_AUTH_SUPPORT
   lwip_md5_context md5_ctx;
   u8_t md5_hash[16];
   u8_t challenge_id = 0;
 #endif /* PPPOL2TP_AUTH_SUPPORT */
 
-  l2tp->peer_nr = nr;
-  l2tp->peer_ns = ns;
   /* printf("L2TP CTRL INPUT, ns=%d, nr=%d, len=%d\n", ns, nr, p->len); */
 
+  /* Drop unexpected packet */
+  if (ns != l2tp->peer_ns) {
+    PPPDEBUG(LOG_DEBUG, ("pppol2tp: drop unexpected packet: received NS=%d, expected NS=%d\n", ns, l2tp->peer_ns));
+    /*
+     * In order to ensure that all messages are acknowledged properly
+     * (particularly in the case of a lost ZLB ACK message), receipt
+     * of duplicate messages MUST be acknowledged.
+     *
+     * In this very special case we Ack a packet we previously received.
+     * Therefore our NS is the NR we just received. And our NR is the
+     * NS we just received plus one.
+     */
+    if ((s16_t)(ns - l2tp->peer_ns) < 0) {
+      pppol2tp_send_zlb(l2tp, nr, ns+1);
+    }
+    return;
+  }
+
+  l2tp->peer_nr = nr;
+
   /* Handle the special case of the ICCN acknowledge */
-  if (l2tp->phase == PPPOL2TP_STATE_ICCN_SENT && l2tp->peer_nr > l2tp->our_ns) {
+  if (l2tp->phase == PPPOL2TP_STATE_ICCN_SENT && (s16_t)(l2tp->peer_nr - l2tp->our_ns) > 0) {
     l2tp->phase = PPPOL2TP_STATE_DATA;
+    sys_untimeout(pppol2tp_timeout, l2tp);
+    ppp_start(l2tp->ppp); /* notify upper layers */
   }
 
   /* ZLB packets */
   if (p->tot_len == 0) {
     return;
   }
+  /* A ZLB packet does not consume a NS slot thus we don't record the NS value for ZLB packets */
+  l2tp->peer_ns = ns+1;
 
-  p = ppp_singlebuf(p);
+  p = pbuf_coalesce(p, PBUF_RAW);
   inp = (u8_t*)p->payload;
   /* Decode AVPs */
   while (p->len > 0) {
@@ -557,7 +571,7 @@
           break;
         /* Stop Control Connection Notification */
         case PPPOL2TP_MESSAGETYPE_STOPCCN:
-          pppol2tp_send_zlb(l2tp, l2tp->our_ns); /* Ack the StopCCN before we switch to down state */
+          pppol2tp_send_zlb(l2tp, l2tp->our_ns+1, l2tp->peer_ns); /* Ack the StopCCN before we switch to down state */
           if (l2tp->phase < PPPOL2TP_STATE_DATA) {
             pppol2tp_abort_connect(l2tp);
           } else if (l2tp->phase == PPPOL2TP_STATE_DATA) {
@@ -662,7 +676,7 @@
 nextavp:
     /* printf("AVP Found, vendor=%d, attribute=%d, len=%d\n", vendorid, attributetype, avplen); */
     /* next AVP */
-    if (pbuf_header(p, -(s16_t)(avplen + sizeof(avpflags) + sizeof(vendorid) + sizeof(attributetype)) ) != 0) {
+    if (pbuf_remove_header(p, avplen + sizeof(avpflags) + sizeof(vendorid) + sizeof(attributetype)) != 0) {
       return;
     }
   }
@@ -677,21 +691,15 @@
       l2tp->icrq_retried = 0;
       l2tp->phase = PPPOL2TP_STATE_ICRQ_SENT;
       l2tp->our_ns++;
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
       if ((err = pppol2tp_send_scccn(l2tp, l2tp->our_ns)) != 0) {
         PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send SCCCN, error=%d\n", err));
+        LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */
       }
-#else
-      pppol2tp_send_scccn(l2tp, l2tp->our_ns);
-#endif
       l2tp->our_ns++;
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
       if ((err = pppol2tp_send_icrq(l2tp, l2tp->our_ns)) != 0) {
         PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICRQ, error=%d\n", err));
+        LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */
       }
-#else
-      pppol2tp_send_icrq(l2tp, l2tp->our_ns);
-#endif
       sys_untimeout(pppol2tp_timeout, l2tp);
       sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
       break;
@@ -700,14 +708,10 @@
       l2tp->iccn_retried = 0;
       l2tp->phase = PPPOL2TP_STATE_ICCN_SENT;
       l2tp->our_ns++;
-      ppp_start(l2tp->ppp); /* notify upper layers */
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
       if ((err = pppol2tp_send_iccn(l2tp, l2tp->our_ns)) != 0) {
         PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICCN, error=%d\n", err));
+        LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */
       }
-#else
-      pppol2tp_send_iccn(l2tp, l2tp->our_ns);
-#endif
       sys_untimeout(pppol2tp_timeout, l2tp);
       sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
       break;
@@ -718,7 +722,7 @@
   return;
 
 send_zlb:
-  pppol2tp_send_zlb(l2tp, l2tp->our_ns);
+  pppol2tp_send_zlb(l2tp, l2tp->our_ns+1, l2tp->peer_ns);
   return;
 packet_too_short:
   PPPDEBUG(LOG_DEBUG, ("pppol2tp: packet too short: %d\n", p->len));
@@ -727,9 +731,7 @@
 /* L2TP Timeout handler */
 static void pppol2tp_timeout(void *arg) {
   pppol2tp_pcb *l2tp = (pppol2tp_pcb*)arg;
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
   err_t err;
-#endif
   u32_t retry_wait;
 
   PPPDEBUG(LOG_DEBUG, ("pppol2tp: timeout\n"));
@@ -746,16 +748,11 @@
       }
       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 defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
       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 */
       }
-#else
-      if(pppol2tp_send_sccrq(l2tp) !=0) {
-        l2tp->sccrq_retried--;
-      }        
-#endif
       sys_timeout(retry_wait, pppol2tp_timeout, l2tp);
       break;
 
@@ -766,32 +763,20 @@
         return;
       }
       PPPDEBUG(LOG_DEBUG, ("pppol2tp: icrq_retried=%d\n", l2tp->icrq_retried));
-      if (l2tp->peer_nr <= l2tp->our_ns -1) { /* the SCCCN was not acknowledged */
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
+      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));
-	  sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
-	  break;
-	}
-#else
-        if (pppol2tp_send_scccn(l2tp, l2tp->our_ns -1) != 0) {
-	  l2tp->icrq_retried--;
-	  sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
-	  break;
-	}
-#endif
+          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);
+          break;
+        }
       }
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
       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));
+        l2tp->icrq_retried--;
+        PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICRQ, error=%d\n", err));
+        LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */
       }
-#else
-      if (pppol2tp_send_icrq(l2tp, l2tp->our_ns) != 0) {
-	l2tp->icrq_retried--;
-      }
-#endif
       sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
       break;
 
@@ -802,16 +787,11 @@
         return;
       }
       PPPDEBUG(LOG_DEBUG, ("pppol2tp: iccn_retried=%d\n", l2tp->iccn_retried));
-#if defined(LWIP_DEBUG) && (LOG_DEBUG == LWIP_DBG_ON)
       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));
+        l2tp->iccn_retried--;
+        PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICCN, error=%d\n", err));
+        LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */
       }
-#else
-      if (pppol2tp_send_iccn(l2tp, l2tp->our_ns) != 0) {
-	l2tp->iccn_retried--;
-      }
-#endif
       sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
       break;
 
@@ -951,7 +931,7 @@
   PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */
   PUTSHORT(0, p); /* Session Id */
   PUTSHORT(ns, p); /* NS Sequence number - to peer */
-  PUTSHORT(l2tp->peer_ns+1, p); /* NR Sequence number - expected for peer */
+  PUTSHORT(l2tp->peer_ns, p); /* NR Sequence number - expected for peer */
 
   /* AVP - Message type */
   PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */
@@ -998,7 +978,7 @@
   PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */
   PUTSHORT(0, p); /* Session Id */
   PUTSHORT(ns, p); /* NS Sequence number - to peer */
-  PUTSHORT(l2tp->peer_ns+1, p); /* NR Sequence number - expected for peer */
+  PUTSHORT(l2tp->peer_ns, p); /* NR Sequence number - expected for peer */
 
   /* AVP - Message type */
   PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */
@@ -1046,7 +1026,7 @@
   PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */
   PUTSHORT(l2tp->source_session_id, p); /* Session Id */
   PUTSHORT(ns, p); /* NS Sequence number - to peer */
-  PUTSHORT(l2tp->peer_ns+1, p); /* NR Sequence number - expected for peer */
+  PUTSHORT(l2tp->peer_ns, p); /* NR Sequence number - expected for peer */
 
   /* AVP - Message type */
   PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */
@@ -1070,7 +1050,7 @@
 }
 
 /* Send a ZLB ACK packet */
-static err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp, u16_t ns) {
+static err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp, u16_t ns, u16_t nr) {
   struct pbuf *pb;
   u8_t *p;
   u16_t len;
@@ -1093,7 +1073,7 @@
   PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */
   PUTSHORT(0, p); /* Session Id */
   PUTSHORT(ns, p); /* NS Sequence number - to peer */
-  PUTSHORT(l2tp->peer_ns+1, p); /* NR Sequence number - expected for peer */
+  PUTSHORT(nr, p); /* NR Sequence number - expected for peer */
 
   return pppol2tp_udp_send(l2tp, pb);
 }
@@ -1122,7 +1102,7 @@
   PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */
   PUTSHORT(0, p); /* Session Id */
   PUTSHORT(ns, p); /* NS Sequence number - to peer */
-  PUTSHORT(l2tp->peer_ns+1, p); /* NR Sequence number - expected for peer */
+  PUTSHORT(l2tp->peer_ns, p); /* NR Sequence number - expected for peer */
 
   /* AVP - Message type */
   PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */
@@ -1149,7 +1129,7 @@
   u8_t *p;
 
   /* make room for L2TP header - should not fail */
-  if (pbuf_header(pb, (s16_t)PPPOL2TP_OUTPUT_DATA_HEADER_LEN) != 0) {
+  if (pbuf_add_header(pb, PPPOL2TP_OUTPUT_DATA_HEADER_LEN) != 0) {
     /* bail out */
     PPPDEBUG(LOG_ERR, ("pppol2tp: pppol2tp_pcb: could not allocate room for L2TP header\n"));
     LINK_STATS_INC(link.lenerr);
diff --git a/src/netif/ppp/pppos.c b/src/netif/ppp/pppos.c
index fb48df4..dff0255 100644
--- a/src/netif/ppp/pppos.c
+++ b/src/netif/ppp/pppos.c
@@ -176,6 +176,7 @@
 {
   pppos_pcb *pppos;
   ppp_pcb *ppp;
+  LWIP_ASSERT_CORE_LOCKED();
 
   pppos = (pppos_pcb *)LWIP_MEMPOOL_ALLOC(PPPOS_PCB);
   if (pppos == NULL) {
@@ -206,7 +207,9 @@
   err_t err;
   LWIP_UNUSED_ARG(ppp);
 
-  /* Grab an output buffer. */
+  /* 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);
   if (nb == NULL) {
     PPPDEBUG(LOG_WARNING, ("pppos_write[%d]: alloc fail\n", ppp->netif->num));
@@ -217,6 +220,9 @@
     return ERR_MEM;
   }
 
+  /* Set nb->tot_len to actual payload length */
+  nb->tot_len = p->len;
+
   /* If the link has been idle, we'll send a fresh flag character to
    * flush any noise. */
   err = ERR_OK;
@@ -252,7 +258,9 @@
   err_t err;
   LWIP_UNUSED_ARG(ppp);
 
-  /* Grab an output buffer. */
+  /* 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);
   if (nb == NULL) {
     PPPDEBUG(LOG_WARNING, ("pppos_netif_output[%d]: alloc fail\n", ppp->netif->num));
@@ -262,6 +270,9 @@
     return ERR_MEM;
   }
 
+  /* Set nb->tot_len to actual payload length */
+  nb->tot_len = pb->tot_len;
+
   /* If the link has been idle, we'll send a fresh flag character to
    * flush any noise. */
   err = ERR_OK;
@@ -402,6 +413,8 @@
 #if !NO_SYS && !PPP_INPROC_IRQ_SAFE
 /** Pass received raw characters to PPPoS to be decoded through lwIP TCPIP thread.
  *
+ * This is one of the only functions that may be called outside of the TCPIP thread!
+ *
  * @param ppp PPP descriptor index, returned by pppos_create()
  * @param s received data
  * @param l length of received data
@@ -429,6 +442,7 @@
 err_t pppos_input_sys(struct pbuf *p, struct netif *inp) {
   ppp_pcb *ppp = (ppp_pcb*)inp->state;
   struct pbuf *n;
+  LWIP_ASSERT_CORE_LOCKED();
 
   for (n = p; n; n = n->next) {
     pppos_input(ppp, (u8_t*)n->payload, n->len);
@@ -468,6 +482,9 @@
   u8_t cur_char;
   u8_t escaped;
   PPPOS_DECL_PROTECT(lev);
+#if !PPP_INPROC_IRQ_SAFE
+  LWIP_ASSERT_CORE_LOCKED();
+#endif
 
   PPPDEBUG(LOG_DEBUG, ("pppos_input[%d]: got %d bytes\n", ppp->netif->num, l));
   while (l-- > 0) {
@@ -541,10 +558,10 @@
           pppos->in_tail = NULL;
 #if IP_FORWARD || LWIP_IPV6_FORWARD
           /* hide the room for Ethernet forwarding header */
-          pbuf_header(inp, -(s16_t)(PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN));
+          pbuf_remove_header(inp, PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN);
 #endif /* IP_FORWARD || LWIP_IPV6_FORWARD */
 #if PPP_INPROC_IRQ_SAFE
-          if(tcpip_callback_with_block(pppos_input_callback, inp, 0) != ERR_OK) {
+          if(tcpip_try_callback(pppos_input_callback, inp) != ERR_OK) {
             PPPDEBUG(LOG_ERR, ("pppos_input[%d]: tcpip_callback() failed, dropping packet\n", ppp->netif->num));
             pbuf_free(inp);
             LINK_STATS_INC(link.drop);
@@ -599,6 +616,7 @@
 
           /* 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) {
@@ -614,7 +632,9 @@
             pppos->in_state = PDSTART;
           }
 #endif
-        case PDPROTOCOL1:               /* Process protocol field 1. */
+          /* Fall through */
+
+      case PDPROTOCOL1:               /* Process protocol field 1. */
           /* If the lower bit is set, this is the end of the protocol
            * field. */
           if (cur_char & 1) {
@@ -698,8 +718,8 @@
   ppp_pcb *ppp;
 
   ppp = ((struct pppos_input_header*)pb->payload)->ppp;
-  if(pbuf_header(pb, -(s16_t)sizeof(struct pppos_input_header))) {
-    LWIP_ASSERT("pbuf_header failed\n", 0);
+  if(pbuf_remove_header(pb, sizeof(struct pppos_input_header))) {
+    LWIP_ASSERT("pbuf_remove_header failed\n", 0);
     goto drop;
   }
 
diff --git a/src/netif/ppp/upap.c b/src/netif/ppp/upap.c
index d00c2d7..3b2399d 100644
--- a/src/netif/ppp/upap.c
+++ b/src/netif/ppp/upap.c
@@ -159,9 +159,9 @@
 
     /* Save the username and password we're given */
     pcb->upap.us_user = user;
-    pcb->upap.us_userlen = LWIP_MIN(strlen(user), 0xff);
+    pcb->upap.us_userlen = (u8_t)LWIP_MIN(strlen(user), 0xff);
     pcb->upap.us_passwd = password;
-    pcb->upap.us_passwdlen = LWIP_MIN(strlen(password), 0xff);
+    pcb->upap.us_passwdlen = (u8_t)LWIP_MIN(strlen(password), 0xff);
     pcb->upap.us_transmits = 0;
 
     /* Lower layer up yet? */
diff --git a/src/netif/ppp/utils.c b/src/netif/ppp/utils.c
index 008c633..f1366da 100644
--- a/src/netif/ppp/utils.c
+++ b/src/netif/ppp/utils.c
@@ -58,8 +58,6 @@
 #endif
 #endif /* UNUSED */
 
-#include <ctype.h>  /* isdigit() */
-
 #include "netif/ppp/ppp_impl.h"
 
 #include "netif/ppp/fsm.h"
@@ -180,7 +178,7 @@
 	    width = va_arg(args, int);
 	    c = *++fmt;
 	} else {
-	    while (isdigit(c)) {
+	    while (lwip_isdigit(c)) {
 		width = width * 10 + c - '0';
 		c = *++fmt;
 	    }
@@ -192,7 +190,7 @@
 		c = *++fmt;
 	    } else {
 		prec = 0;
-		while (isdigit(c)) {
+		while (lwip_isdigit(c)) {
 		    prec = prec * 10 + c - '0';
 		    c = *++fmt;
 		}
diff --git a/src/netif/ppp/vj.c b/src/netif/ppp/vj.c
index 168c340..3fecba6 100644
--- a/src/netif/ppp/vj.c
+++ b/src/netif/ppp/vj.c
@@ -202,16 +202,11 @@
 
   /* TCP stack requires that we don't change the packet payload, therefore we copy
    * the whole packet before compression. */
-  np = pbuf_alloc(PBUF_RAW, np->tot_len, PBUF_POOL);
+  np = pbuf_clone(PBUF_RAW, PBUF_RAM, *pb);
   if (!np) {
     return (TYPE_IP);
   }
 
-  if (pbuf_copy(np, *pb) != ERR_OK) {
-    pbuf_free(np);
-    return (TYPE_IP);
-  }
-
   *pb = np;
   ip = (struct ip_hdr *)np->payload;
 
@@ -412,18 +407,18 @@
   if (!comp->compressSlot || comp->last_xmit != cs->cs_id) {
     comp->last_xmit = cs->cs_id;
     hlen -= deltaS + 4;
-    if (pbuf_header(np, -(s16_t)hlen)){
+    if (pbuf_remove_header(np, hlen)){
       /* Can we cope with this failing?  Just assert for now */
-      LWIP_ASSERT("pbuf_header failed\n", 0);
+      LWIP_ASSERT("pbuf_remove_header failed\n", 0);
     }
     cp = (u8_t*)np->payload;
     *cp++ = (u8_t)(changes | NEW_C);
     *cp++ = cs->cs_id;
   } else {
     hlen -= deltaS + 3;
-    if (pbuf_header(np, -(s16_t)hlen)) {
+    if (pbuf_remove_header(np, hlen)) {
       /* Can we cope with this failing?  Just assert for now */
-      LWIP_ASSERT("pbuf_header failed\n", 0);
+      LWIP_ASSERT("pbuf_remove_header failed\n", 0);
     }
     cp = (u8_t*)np->payload;
     *cp++ = (u8_t)changes;
@@ -471,19 +466,20 @@
   hlen = IPH_HL(ip) << 2;
   if (IPH_PROTO(ip) >= MAX_SLOTS
       || hlen + sizeof(struct tcp_hdr) > nb->len
-      || (hlen += TCPH_HDRLEN(((struct tcp_hdr *)&((char *)ip)[hlen])) << 2)
+      || (hlen += TCPH_HDRLEN_BYTES((struct tcp_hdr *)&((char *)ip)[hlen]))
           > nb->len
       || hlen > MAX_HDR) {
     PPPDEBUG(LOG_INFO, ("vj_uncompress_uncomp: bad cid=%d, hlen=%d buflen=%d\n",
       IPH_PROTO(ip), hlen, nb->len));
-    comp->flags |= VJF_TOSS;
-    INCR(vjs_errorin);
+    vj_uncompress_err(comp);
     return -1;
   }
   cs = &comp->rstate[comp->last_recv = IPH_PROTO(ip)];
   comp->flags &=~ VJF_TOSS;
   IPH_PROTO_SET(ip, IP_PROTO_TCP);
-  MEMCPY(&cs->cs_ip, ip, hlen);
+  /* copy from/to bigger buffers checked above instead of cs->cs_ip and ip
+     just to help static code analysis to see this is correct ;-) */
+  MEMCPY(&cs->cs_hdr, nb->payload, hlen);
   cs->cs_hlen = (u16_t)hlen;
   INCR(vjs_uncompressedin);
   return 0;
@@ -623,15 +619,14 @@
   IPH_CHKSUM_SET(&cs->cs_ip,  (u16_t)(~tmp));
 
   /* Remove the compressed header and prepend the uncompressed header. */
-  if (pbuf_header(n0, -(s16_t)vjlen)) {
+  if (pbuf_remove_header(n0, vjlen)) {
     /* Can we cope with this failing?  Just assert for now */
-    LWIP_ASSERT("pbuf_header failed\n", 0);
+    LWIP_ASSERT("pbuf_remove_header failed\n", 0);
     goto bad;
   }
 
   if(LWIP_MEM_ALIGN(n0->payload) != n0->payload) {
-    struct pbuf *np, *q;
-    u8_t *bufptr;
+    struct pbuf *np;
 
 #if IP_FORWARD
     /* If IP forwarding is enabled we are using a PBUF_LINK packet type so
@@ -647,17 +642,13 @@
       goto bad;
     }
 
-    if (pbuf_header(np, -(s16_t)cs->cs_hlen)) {
+    if (pbuf_remove_header(np, cs->cs_hlen)) {
       /* Can we cope with this failing?  Just assert for now */
-      LWIP_ASSERT("pbuf_header failed\n", 0);
+      LWIP_ASSERT("pbuf_remove_header failed\n", 0);
       goto bad;
     }
 
-    bufptr = (u8_t*)n0->payload;
-    for(q = np; q != NULL; q = q->next) {
-      MEMCPY(q->payload, bufptr, q->len);
-      bufptr += q->len;
-    }
+    pbuf_take(np, n0->payload, n0->len);
 
     if(n0->next) {
       pbuf_chain(np, n0->next);
@@ -667,7 +658,7 @@
     n0 = np;
   }
 
-  if (pbuf_header(n0, (s16_t)cs->cs_hlen)) {
+  if (pbuf_add_header(n0, cs->cs_hlen)) {
     struct pbuf *np;
 
     LWIP_ASSERT("vj_uncompress_tcp: cs->cs_hlen <= PBUF_POOL_BUFSIZE", cs->cs_hlen <= PBUF_POOL_BUFSIZE);
@@ -687,8 +678,7 @@
   return vjlen;
 
 bad:
-  comp->flags |= VJF_TOSS;
-  INCR(vjs_errorin);
+  vj_uncompress_err(comp);
   return (-1);
 }
 
diff --git a/src/netif/slipif.c b/src/netif/slipif.c
index 6eb83c3..9b175dc 100644
--- a/src/netif/slipif.c
+++ b/src/netif/slipif.c
@@ -40,8 +40,8 @@
 
 
 /**
- * @defgroup slipif SLIP netif
- * @ingroup addons
+ * @defgroup slipif SLIP
+ * @ingroup netifs
  *
  * 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
@@ -88,8 +88,8 @@
 #endif
 
 enum slipif_recv_state {
-    SLIP_RECV_NORMAL,
-    SLIP_RECV_ESCAPE
+  SLIP_RECV_NORMAL,
+  SLIP_RECV_ESCAPE
 };
 
 struct slipif_priv {
@@ -124,7 +124,7 @@
   LWIP_ASSERT("netif->state != NULL", (netif->state != NULL));
   LWIP_ASSERT("p != NULL", (p != NULL));
 
-  LWIP_DEBUGF(SLIP_DEBUG, ("slipif_output(%"U16_F"): sending %"U16_F" bytes\n", (u16_t)netif->num, p->tot_len));
+  LWIP_DEBUGF(SLIP_DEBUG, ("slipif_output: sending %"U16_F" bytes\n", p->tot_len));
   priv = (struct slipif_priv *)netif->state;
 
   /* Send pbuf out on the serial I/O device. */
@@ -135,20 +135,20 @@
     for (i = 0; i < q->len; i++) {
       c = ((u8_t *)q->payload)[i];
       switch (c) {
-      case SLIP_END:
-        /* need to escape this byte (0xC0 -> 0xDB, 0xDC) */
-        sio_send(SLIP_ESC, priv->sd);
-        sio_send(SLIP_ESC_END, priv->sd);
-        break;
-      case SLIP_ESC:
-        /* need to escape this byte (0xDB -> 0xDB, 0xDD) */
-        sio_send(SLIP_ESC, priv->sd);
-        sio_send(SLIP_ESC_ESC, priv->sd);
-        break;
-      default:
-        /* normal byte - no need for escaping */
-        sio_send(c, priv->sd);
-        break;
+        case SLIP_END:
+          /* need to escape this byte (0xC0 -> 0xDB, 0xDC) */
+          sio_send(SLIP_ESC, priv->sd);
+          sio_send(SLIP_ESC_END, priv->sd);
+          break;
+        case SLIP_ESC:
+          /* need to escape this byte (0xDB -> 0xDB, 0xDD) */
+          sio_send(SLIP_ESC, priv->sd);
+          sio_send(SLIP_ESC_ESC, priv->sd);
+          break;
+        default:
+          /* normal byte - no need for escaping */
+          sio_send(c, priv->sd);
+          break;
       }
     }
   }
@@ -203,7 +203,7 @@
  *        return a complete packet, NULL is returned before - used for polling)
  * @return The IP packet when SLIP_END is received
  */
-static struct pbuf*
+static struct pbuf *
 slipif_rxbyte(struct netif *netif, u8_t c)
 {
   struct slipif_priv *priv;
@@ -215,47 +215,47 @@
   priv = (struct slipif_priv *)netif->state;
 
   switch (priv->state) {
-  case SLIP_RECV_NORMAL:
-    switch (c) {
-    case SLIP_END:
-      if (priv->recved > 0) {
-        /* Received whole packet. */
-        /* Trim the pbuf to the size of the received packet. */
-        pbuf_realloc(priv->q, priv->recved);
+    case SLIP_RECV_NORMAL:
+      switch (c) {
+        case SLIP_END:
+          if (priv->recved > 0) {
+            /* Received whole packet. */
+            /* Trim the pbuf to the size of the received packet. */
+            pbuf_realloc(priv->q, priv->recved);
 
-        LINK_STATS_INC(link.recv);
+            LINK_STATS_INC(link.recv);
 
-        LWIP_DEBUGF(SLIP_DEBUG, ("slipif: Got packet (%"U16_F" bytes)\n", priv->recved));
-        t = priv->q;
-        priv->p = priv->q = NULL;
-        priv->i = priv->recved = 0;
-        return t;
+            LWIP_DEBUGF(SLIP_DEBUG, ("slipif: Got packet (%"U16_F" bytes)\n", priv->recved));
+            t = priv->q;
+            priv->p = priv->q = NULL;
+            priv->i = priv->recved = 0;
+            return t;
+          }
+          return NULL;
+        case SLIP_ESC:
+          priv->state = SLIP_RECV_ESCAPE;
+          return NULL;
+        default:
+          break;
+      } /* end switch (c) */
+      break;
+    case SLIP_RECV_ESCAPE:
+      /* un-escape END or ESC bytes, leave other bytes
+         (although that would be a protocol error) */
+      switch (c) {
+        case SLIP_ESC_END:
+          c = SLIP_END;
+          break;
+        case SLIP_ESC_ESC:
+          c = SLIP_ESC;
+          break;
+        default:
+          break;
       }
-      return NULL;
-    case SLIP_ESC:
-      priv->state = SLIP_RECV_ESCAPE;
-      return NULL;
-    default:
-      break;
-    } /* end switch (c) */
-    break;
-  case SLIP_RECV_ESCAPE:
-    /* un-escape END or ESC bytes, leave other bytes
-       (although that would be a protocol error) */
-    switch (c) {
-    case SLIP_ESC_END:
-      c = SLIP_END;
-      break;
-    case SLIP_ESC_ESC:
-      c = SLIP_ESC;
+      priv->state = SLIP_RECV_NORMAL;
       break;
     default:
       break;
-    }
-    priv->state = SLIP_RECV_NORMAL;
-    break;
-  default:
-    break;
   } /* end switch (priv->state) */
 
   /* byte received, packet not yet completely received */
@@ -290,11 +290,11 @@
       priv->i = 0;
       if (priv->p->next != NULL && priv->p->next->len > 0) {
         /* p is a chain, on to the next in the chain */
-          priv->p = priv->p->next;
+        priv->p = priv->p->next;
       } else {
         /* p is a single pbuf, set it to NULL so next time a new
          * pbuf is allocated */
-          priv->p = NULL;
+        priv->p = NULL;
       }
     }
   }
@@ -342,6 +342,7 @@
 #endif /* SLIP_USE_RX_THREAD */
 
 /**
+ * @ingroup slipif
  * SLIP netif initialization
  *
  * Call the arch specific sio_open and remember
@@ -352,9 +353,7 @@
  *         ERR_MEM if no memory could be allocated,
  *         ERR_IF is serial line couldn't be opened
  *
- * @note netif->num must contain the number of the serial port to open
- *       (0 by default). If netif->state is != NULL, it is interpreted as an
- *       u8_t pointer pointing to the serial port number instead of netif->num.
+ * @note If netif->state is interpreted as an u8_t serial port number.
  *
  */
 err_t
@@ -363,7 +362,12 @@
   struct slipif_priv *priv;
   u8_t sio_num;
 
-  LWIP_DEBUGF(SLIP_DEBUG, ("slipif_init: netif->num=%"U16_F"\n", (u16_t)netif->num));
+  LWIP_ASSERT("slipif needs an input callback", netif->input != NULL);
+
+  /* netif->state contains serial port number */
+  sio_num = LWIP_PTR_NUMERIC_CAST(u8_t, netif->state);
+
+  LWIP_DEBUGF(SLIP_DEBUG, ("slipif_init: netif->num=%"U16_F"\n", (u16_t)sio_num));
 
   /* Allocate private data */
   priv = (struct slipif_priv *)mem_malloc(sizeof(struct slipif_priv));
@@ -381,12 +385,6 @@
 #endif /* LWIP_IPV6 */
   netif->mtu = SLIP_MAX_SIZE;
 
-  /* netif->state or netif->num contain the port number */
-  if (netif->state != NULL) {
-    sio_num = *(u8_t*)netif->state;
-  } else {
-    sio_num = netif->num;
-  }
   /* Try to open the serial port. */
   priv->sd = sio_open(sio_num);
   if (!priv->sd) {
@@ -413,12 +411,13 @@
 #if SLIP_USE_RX_THREAD
   /* Create a thread to poll the serial line. */
   sys_thread_new(SLIPIF_THREAD_NAME, slipif_loop_thread, netif,
-    SLIPIF_THREAD_STACKSIZE, SLIPIF_THREAD_PRIO);
+                 SLIPIF_THREAD_STACKSIZE, SLIPIF_THREAD_PRIO);
 #endif /* SLIP_USE_RX_THREAD */
   return ERR_OK;
 }
 
 /**
+ * @ingroup slipif
  * Polls the serial device and feeds the IP layer with incoming packets.
  *
  * @param netif The lwip network interface structure for this slipif
@@ -441,6 +440,7 @@
 
 #if SLIP_RX_FROM_ISR
 /**
+ * @ingroup slipif
  * Feeds the IP layer with incoming packets that were receive
  *
  * @param netif The lwip network interface structure for this slipif
@@ -476,6 +476,7 @@
     }
     SYS_ARCH_PROTECT(old_level);
   }
+  SYS_ARCH_UNPROTECT(old_level);
 }
 
 /** Like slipif_rxbyte, but queues completed packets.
@@ -514,6 +515,7 @@
 }
 
 /**
+ * @ingroup slipif
  * Process a received byte, completed packets are put on a queue that is
  * fed into IP through slipif_process_rxqueue().
  *
@@ -531,6 +533,7 @@
 }
 
 /**
+ * @ingroup slipif
  * Process multiple received byte, completed packets are put on a queue that is
  * fed into IP through slipif_process_rxqueue().
  *
diff --git a/src/netif/zepif.c b/src/netif/zepif.c
new file mode 100644
index 0000000..b403303
--- /dev/null
+++ b/src/netif/zepif.c
@@ -0,0 +1,300 @@
+/**
+ * @file
+ *
+ * @defgroup zepif ZEP - ZigBee Encapsulation Protocol
+ * @ingroup netifs
+ * A netif implementing the ZigBee Encapsulation Protocol (ZEP).
+ * This is used to tunnel 6LowPAN over UDP.
+ *
+ * Usage (there must be a default netif before!):
+ * @code{.c}
+ *   netif_add(&zep_netif, NULL, NULL, NULL, NULL, zepif_init, tcpip_6lowpan_input);
+ *   netif_create_ip6_linklocal_address(&zep_netif, 1);
+ *   netif_set_up(&zep_netif);
+ *   netif_set_link_up(&zep_netif);
+ * @endcode
+ */
+
+/*
+ * 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.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#include "netif/zepif.h"
+
+#if LWIP_IPV6 && LWIP_UDP
+
+#include "netif/lowpan6.h"
+#include "lwip/udp.h"
+#include "lwip/timeouts.h"
+#include <string.h>
+
+/** Define this to 1 to loop back TX packets for testing */
+#ifndef ZEPIF_LOOPBACK
+#define ZEPIF_LOOPBACK    0
+#endif
+
+#define ZEP_MAX_DATA_LEN  127
+
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/bpstruct.h"
+#endif
+PACK_STRUCT_BEGIN
+struct zep_hdr {
+  PACK_STRUCT_FLD_8(u8_t prot_id[2]);
+  PACK_STRUCT_FLD_8(u8_t prot_version);
+  PACK_STRUCT_FLD_8(u8_t type);
+  PACK_STRUCT_FLD_8(u8_t channel_id);
+  PACK_STRUCT_FIELD(u16_t device_id);
+  PACK_STRUCT_FLD_8(u8_t crc_mode);
+  PACK_STRUCT_FLD_8(u8_t unknown_1);
+  PACK_STRUCT_FIELD(u32_t timestamp[2]);
+  PACK_STRUCT_FIELD(u32_t seq_num);
+  PACK_STRUCT_FLD_8(u8_t unknown_2[10]);
+  PACK_STRUCT_FLD_8(u8_t len);
+} PACK_STRUCT_STRUCT;
+PACK_STRUCT_END
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/epstruct.h"
+#endif
+
+struct zepif_state {
+  struct zepif_init init;
+  struct udp_pcb *pcb;
+  u32_t seqno;
+};
+
+static u8_t zep_lowpan_timer_running;
+
+/* Helper function that calls the 6LoWPAN timer and reschedules itself */
+static void
+zep_lowpan_timer(void *arg)
+{
+  lowpan6_tmr();
+  if (zep_lowpan_timer_running) {
+    sys_timeout(LOWPAN6_TMR_INTERVAL, zep_lowpan_timer, arg);
+  }
+}
+
+/* Pass received pbufs into 6LowPAN netif */
+static void
+zepif_udp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p,
+               const ip_addr_t *addr, u16_t port)
+{
+  err_t err;
+  struct netif *netif_lowpan6 = (struct netif *)arg;
+  struct zep_hdr *zep;
+
+  LWIP_ASSERT("arg != NULL", arg != NULL);
+  LWIP_ASSERT("pcb != NULL", pcb != NULL);
+  LWIP_UNUSED_ARG(pcb); /* for LWIP_NOASSERT */
+  LWIP_UNUSED_ARG(addr);
+  LWIP_UNUSED_ARG(port);
+  if (p == NULL) {
+    return;
+  }
+
+  /* Parse and hide the ZEP header */
+  if (p->len < sizeof(struct zep_hdr)) {
+    /* need the zep_hdr in one piece */
+    goto err_return;
+  }
+  zep = (struct zep_hdr *)p->payload;
+  if (zep->prot_id[0] != 'E') {
+    goto err_return;
+  }
+  if (zep->prot_id[1] != 'X') {
+    goto err_return;
+  }
+  if (zep->prot_version != 2) {
+    /* we only support this version for now */
+    goto err_return;
+  }
+  if (zep->type != 1) {
+    goto err_return;
+  }
+  if (zep->crc_mode != 1) {
+    goto err_return;
+  }
+  if (zep->len != p->tot_len - sizeof(struct zep_hdr)) {
+    goto err_return;
+  }
+  /* everything seems to be OK, hide the ZEP header */
+  if (pbuf_remove_header(p, sizeof(struct zep_hdr))) {
+    goto err_return;
+  }
+  /* TODO Check CRC? */
+  /* remove CRC trailer */
+  pbuf_realloc(p, p->tot_len - 2);
+
+  /* Call into 6LoWPAN code. */
+  err = netif_lowpan6->input(p, netif_lowpan6);
+  if (err == ERR_OK) {
+    return;
+  }
+err_return:
+  pbuf_free(p);
+}
+
+/* Send 6LoWPAN TX packets as UDP broadcast */
+static err_t
+zepif_linkoutput(struct netif *netif, struct pbuf *p)
+{
+  err_t err;
+  struct pbuf *q;
+  struct zep_hdr *zep;
+  struct zepif_state *state;
+
+  LWIP_ASSERT("invalid netif", netif != NULL);
+  LWIP_ASSERT("invalid pbuf", p != NULL);
+
+  if (p->tot_len > ZEP_MAX_DATA_LEN) {
+    return ERR_VAL;
+  }
+  LWIP_ASSERT("TODO: support chained pbufs", p->next == NULL);
+
+  state = (struct zepif_state *)netif->state;
+  LWIP_ASSERT("state->pcb != NULL", state->pcb != NULL);
+
+  q = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct zep_hdr) + p->tot_len, PBUF_RAM);
+  if (q == NULL) {
+    return ERR_MEM;
+  }
+  zep = (struct zep_hdr *)q->payload;
+  memset(zep, 0, sizeof(struct zep_hdr));
+  zep->prot_id[0] = 'E';
+  zep->prot_id[1] = 'X';
+  zep->prot_version = 2;
+  zep->type = 1; /* Data */
+  zep->channel_id = 0; /* whatever */
+  zep->device_id = lwip_htons(1); /* whatever */
+  zep->crc_mode = 1;
+  zep->unknown_1 = 0xff;
+  zep->seq_num = lwip_htonl(state->seqno);
+  state->seqno++;
+  zep->len = (u8_t)p->tot_len;
+
+  err = pbuf_take_at(q, p->payload, p->tot_len, sizeof(struct zep_hdr));
+  if (err == ERR_OK) {
+#if ZEPIF_LOOPBACK
+    zepif_udp_recv(netif, state->pcb, pbuf_clone(PBUF_RAW, PBUF_RAM, q), NULL, 0);
+#endif
+    err = udp_sendto(state->pcb, q, state->init.zep_dst_ip_addr, state->init.zep_dst_udp_port);
+  }
+  pbuf_free(q);
+
+  return err;
+}
+
+/**
+ * @ingroup zepif
+ * Set up a raw 6LowPAN netif and surround it with input- and output
+ * functions for ZEP
+ */
+err_t
+zepif_init(struct netif *netif)
+{
+  err_t err;
+  struct zepif_init *init_state = (struct zepif_init *)netif->state;
+  struct zepif_state *state = (struct zepif_state *)mem_malloc(sizeof(struct zepif_state));
+
+  LWIP_ASSERT("zepif needs an input callback", netif->input != NULL);
+
+  if (state == NULL) {
+    return ERR_MEM;
+  }
+  memset(state, 0, sizeof(struct zepif_state));
+  if (init_state != NULL) {
+    memcpy(&state->init, init_state, sizeof(struct zepif_init));
+  }
+  if (state->init.zep_src_udp_port == 0) {
+    state->init.zep_src_udp_port = ZEPIF_DEFAULT_UDP_PORT;
+  }
+  if (state->init.zep_dst_udp_port == 0) {
+    state->init.zep_dst_udp_port = ZEPIF_DEFAULT_UDP_PORT;
+  }
+#if LWIP_IPV4
+  if (state->init.zep_dst_ip_addr == NULL) {
+    /* With IPv4 enabled, default to broadcasting packets if no address is set */
+    state->init.zep_dst_ip_addr = IP_ADDR_BROADCAST;
+  }
+#endif /* LWIP_IPV4 */
+
+  netif->state = NULL;
+
+  state->pcb = udp_new_ip_type(IPADDR_TYPE_ANY);
+  if (state->pcb == NULL) {
+    err = ERR_MEM;
+    goto err_ret;
+  }
+  err = udp_bind(state->pcb, state->init.zep_src_ip_addr, state->init.zep_src_udp_port);
+  if (err != ERR_OK) {
+    goto err_ret;
+  }
+  if (state->init.zep_netif != NULL) {
+    udp_bind_netif(state->pcb, state->init.zep_netif);
+  }
+  LWIP_ASSERT("udp_bind(lowpan6_broadcast_pcb) failed", err == ERR_OK);
+  ip_set_option(state->pcb, SOF_BROADCAST);
+  udp_recv(state->pcb, zepif_udp_recv, netif);
+
+  err = lowpan6_if_init(netif);
+  LWIP_ASSERT("lowpan6_if_init set a state", netif->state == NULL);
+  if (err == ERR_OK) {
+    netif->state = state;
+    netif->hwaddr_len = 6;
+    if (init_state != NULL) {
+      memcpy(netif->hwaddr, init_state->addr, 6);
+    } else {
+      u8_t i;
+      for (i = 0; i < 6; i++) {
+        netif->hwaddr[i] = i;
+      }
+      netif->hwaddr[0] &= 0xfc;
+    }
+    netif->linkoutput = zepif_linkoutput;
+
+    if (!zep_lowpan_timer_running) {
+      sys_timeout(LOWPAN6_TMR_INTERVAL, zep_lowpan_timer, NULL);
+      zep_lowpan_timer_running = 1;
+    }
+
+    return ERR_OK;
+  }
+
+err_ret:
+  if (state->pcb != NULL) {
+    udp_remove(state->pcb);
+  }
+  mem_free(state);
+  return err;
+}
+
+#endif /* LWIP_IPV6 && LWIP_UDP */
diff --git a/st_readme.txt b/st_readme.txt
index 2feaa86..19f76bb 100644
--- a/st_readme.txt
+++ b/st_readme.txt
@@ -46,6 +46,14 @@
   *
   ******************************************************************************
   @endverbatim
+### 15-March-2019 ###
+========================
+  + Upgrade to use LwIP V2.1.2 version
+     - For more details about new features and bug fixes please refer to CHANGELOG.txt and UPGRADING files
+  + sys_arch.c:
+     - Add new API sys_mbox_trypost_fromisr to post preallocated messages from an ISR to the tcpip thread
+     - Remove check on Flag LWIP_SOCKET_SET_ERRNO: this flag has been removed since LwIP 2.1.0
+
 ### 13-August-2018 ###
 ========================
   + Add support to CMSIS-RTOS V2 API
diff --git a/system/OS/sys_arch.c b/system/OS/sys_arch.c
index c52977e..65d9bf9 100644
--- a/system/OS/sys_arch.c
+++ b/system/OS/sys_arch.c
@@ -41,7 +41,7 @@
 
 #include "cmsis_os.h"
 
-#if defined(LWIP_SOCKET_SET_ERRNO) && defined(LWIP_PROVIDE_ERRNO)
+#if defined(LWIP_PROVIDE_ERRNO)
 int errno;
 #endif
 
@@ -137,6 +137,14 @@
   return result;
 }
 
+
+/*-----------------------------------------------------------------------------------*/
+//   Try to post the "msg" to the mailbox.
+err_t sys_mbox_trypost_fromisr(sys_mbox_t *mbox, void *msg)
+{
+  return sys_mbox_trypost(mbox, msg);
+}
+
 /*-----------------------------------------------------------------------------------*/
 /*
   Blocks the thread until a message arrives in the mailbox, but does
diff --git a/test/fuzz/Makefile b/test/fuzz/Makefile
index 67ffb19..ccbe956 100644
--- a/test/fuzz/Makefile
+++ b/test/fuzz/Makefile
@@ -34,13 +34,14 @@
 
 CC=afl-gcc
 LDFLAGS=-lm
-CFLAGS=-O0
+# use 'make D=-DUSER_DEFINE' to pass a user define to gcc
+CFLAGS=-O0 $(D)
 
 CONTRIBDIR=../../../lwip-contrib
 include $(CONTRIBDIR)/ports/unix/Common.mk
 
 clean:
-	rm -f *.o $(LWIPLIBCOMMON) lwip_fuzz *.s .depend* *.core core
+	rm -f *.o $(LWIPLIBCOMMON) $(APPLIB) lwip_fuzz *.s .depend* *.core core
 
 depend dep: .depend
 
@@ -49,5 +50,5 @@
 .depend: fuzz.c $(LWIPFILES) $(APPFILES)
 	$(CCDEP) $(CFLAGS) -MM $^ > .depend || rm -f .depend
 
-lwip_fuzz: .depend $(LWIPLIBCOMMON) fuzz.o
-	$(CC) $(CFLAGS) -o lwip_fuzz fuzz.o $(LWIPLIBCOMMON) $(LDFLAGS)
+lwip_fuzz: .depend $(LWIPLIBCOMMON) $(APPLIB) fuzz.o
+	$(CC) $(CFLAGS) -o lwip_fuzz fuzz.o $(APPLIB) $(LWIPLIBCOMMON) $(LDFLAGS)
diff --git a/test/fuzz/README b/test/fuzz/README
index 1d1e3d8..de6fb75 100644
--- a/test/fuzz/README
+++ b/test/fuzz/README
@@ -10,6 +10,9 @@
 
 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!).
+
 Then run afl with:
 
 afl-fuzz -i inputs/<INPUT> -o output ./lwip_fuzz
diff --git a/test/fuzz/fuzz.c b/test/fuzz/fuzz.c
index a9157f1..8aa07ec 100644
--- a/test/fuzz/fuzz.c
+++ b/test/fuzz/fuzz.c
@@ -32,14 +32,31 @@
 
 #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)
 {
@@ -56,7 +73,7 @@
   netif->linkoutput = lwip_tx_func;
   netif->mtu = 1500;
   netif->hwaddr_len = 6;
-  netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
+  netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP;
 
   netif->hwaddr[0] = 0x00;
   netif->hwaddr[1] = 0x23;
@@ -93,13 +110,40 @@
   }
 }
 
+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 */
+}
+
 int main(int argc, char** argv)
 {
   struct netif net_test;
   ip4_addr_t addr;
   ip4_addr_t netmask;
   ip4_addr_t gw;
-  u8_t pktbuf[2000];
   size_t len;
 
   lwip_init();
@@ -110,10 +154,19 @@
 
   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;
@@ -130,7 +183,7 @@
   } else {
     len = fread(pktbuf, 1, sizeof(pktbuf), stdin);
   }
-  input_pkt(&net_test, pktbuf, len);
+  input_pkts(&net_test, pktbuf, len);
 
   return 0;
 }
diff --git a/test/fuzz/lwipopts.h b/test/fuzz/lwipopts.h
index 4aff09b..4ab26f2 100644
--- a/test/fuzz/lwipopts.h
+++ b/test/fuzz/lwipopts.h
@@ -42,8 +42,14 @@
 #define IPV6_FRAG_COPYHEADER            1
 #define LWIP_IPV6_DUP_DETECT_ATTEMPTS   0
 
-/* Enable DHCP to test it */
+/* Enable some protocols to test them */
 #define LWIP_DHCP                       1
+#define LWIP_AUTOIP                     1
+
+#define LWIP_IGMP                       1
+#define LWIP_DNS                        1
+
+#define LWIP_ALTCP                      1
 
 /* Turn off checksum verification of fuzzed data */
 #define CHECKSUM_CHECK_IP               0
@@ -56,13 +62,19 @@
 #define MEM_SIZE                        16000
 #define TCP_SND_QUEUELEN                40
 #define MEMP_NUM_TCP_SEG                TCP_SND_QUEUELEN
+#define TCP_OVERSIZE                    1
 #define TCP_SND_BUF                     (12 * TCP_MSS)
 #define TCP_WND                         (10 * TCP_MSS)
 #define LWIP_WND_SCALE                  1
-#define TCP_RCV_SCALE                   0
+#define TCP_RCV_SCALE                   2
 #define PBUF_POOL_SIZE                  400 /* pbuf tests need ~200KByte */
 
 /* Minimal changes to opt.h required for etharp unit tests: */
 #define ETHARP_SUPPORT_STATIC_ENTRIES   1
 
+#define LWIP_NUM_NETIF_CLIENT_DATA      1
+#define LWIP_SNMP                       1
+#define MIB2_STATS                      1
+#define LWIP_MDNS_RESPONDER             1
+
 #endif /* LWIP_HDR_LWIPOPTS_H__ */
diff --git a/test/sockets/sockets_stresstest.c b/test/sockets/sockets_stresstest.c
new file mode 100644
index 0000000..3ac553b
--- /dev/null
+++ b/test/sockets/sockets_stresstest.c
@@ -0,0 +1,726 @@
+/**
+ * @file
+ * Sockets stresstest
+ *
+ * This file uses the lwIP socket API to do stress tests that should test the
+ * stability when used in many different situations, with many concurrent
+ * sockets making concurrent transfers in different manners.
+ *
+ * - test rely on loopback sockets for now, so netif drivers are not tested
+ * - all enabled functions shall be used
+ * - parallelism of the tests depend on enough resources being available
+ *   (configure your lwipopts.h settings high enough)
+ * - test should also be able to run in a real target
+ *
+ * TODO:
+ * - full duplex
+ * - add asserts about internal socket/netconn/pcb state?
+ */
+ 
+ /*
+ * 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 "sockets_stresstest.h"
+
+#include "lwip/sockets.h"
+#include "lwip/sys.h"
+
+#include "lwip/mem.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#if LWIP_SOCKET && LWIP_IPV4 /* this uses IPv4 loopback sockets, currently */
+
+#ifndef TEST_SOCKETS_STRESS
+#define TEST_SOCKETS_STRESS   LWIP_DBG_OFF
+#endif
+
+#define TEST_TIME_SECONDS     10
+#define TEST_TXRX_BUFSIZE     (TCP_MSS * 2)
+#define TEST_MAX_RXWAIT_MS    50
+#define TEST_MAX_CONNECTIONS  50
+
+#define TEST_SOCK_READABLE    0x01
+#define TEST_SOCK_WRITABLE    0x02
+#define TEST_SOCK_ERR         0x04
+
+#define TEST_MODE_SELECT      0x01
+#define TEST_MODE_POLL        0x02
+#define TEST_MODE_NONBLOCKING 0x04
+#define TEST_MODE_WAIT        0x08
+#define TEST_MODE_RECVTIMEO   0x10
+#define TEST_MODE_SLEEP       0x20
+
+static int sockets_stresstest_numthreads;
+
+struct test_settings {
+  struct sockaddr_storage addr;
+  int start_client;
+  int loop_cnt;
+};
+
+struct sockets_stresstest_fullduplex {
+  int s;
+  volatile int closed;
+};
+
+static void
+fill_test_data(void *buf, size_t buf_len_bytes)
+{
+  u8_t *p = (u8_t*)buf;
+  u16_t i, chk;
+
+  LWIP_ASSERT("buffer too short", buf_len_bytes >= 4);
+  LWIP_ASSERT("buffer too big", buf_len_bytes <= 0xFFFF);
+  /* store the total number of bytes */
+  p[0] = (u8_t)(buf_len_bytes >> 8);
+  p[1] = (u8_t)buf_len_bytes;
+
+  /* fill buffer with random */
+  chk = 0;
+  for (i = 4; i < buf_len_bytes; i++) {
+    u8_t rnd = (u8_t)LWIP_RAND();
+    p[i] = rnd;
+    chk += rnd;
+  }
+  /* store checksum */
+  p[2] = (u8_t)(chk >> 8);
+  p[3] = (u8_t)chk;
+}
+
+static size_t
+check_test_data(const void *buf, size_t buf_len_bytes)
+{
+  u8_t *p = (u8_t*)buf;
+  u16_t i, chk, chk_rx, len_rx;
+
+  LWIP_ASSERT("buffer too short", buf_len_bytes >= 4);
+  len_rx = (((u16_t)p[0]) << 8) | p[1];
+  LWIP_ASSERT("len too short", len_rx >= 4);
+  if (len_rx > buf_len_bytes) {
+    /* not all data received in this segment */
+    LWIP_DEBUGF(TEST_SOCKETS_STRESS | LWIP_DBG_TRACE, ("check-\n"));
+    return buf_len_bytes;
+  }
+  chk_rx = (((u16_t)p[2]) << 8) | p[3];
+  /* calculate received checksum */
+  chk = 0;
+  for (i = 4; i < len_rx; i++) {
+    chk += p[i];
+  }
+  LWIP_ASSERT("invalid checksum", chk == chk_rx);
+  if (len_rx < buf_len_bytes) {
+    size_t data_left = buf_len_bytes - len_rx;
+    memmove(p, &p[len_rx], data_left);
+    return data_left;
+  }
+  /* if we come here, we received exactly one chunk
+     -> next offset is 0 */
+  return 0;
+}
+
+static size_t
+recv_and_check_data_return_offset(int s, char *rxbuf, size_t rxbufsize, size_t rxoff, int *closed, const char *dbg)
+{
+  ssize_t ret;
+
+  ret = lwip_read(s, &rxbuf[rxoff], rxbufsize - rxoff);
+  if (ret == 0) {
+    *closed = 1;
+    return rxoff;
+  }
+  *closed = 0;
+  LWIP_DEBUGF(TEST_SOCKETS_STRESS | LWIP_DBG_TRACE, ("%s %d rx %d\n", dbg, s, (int)ret));
+  if (ret == -1) {
+    /* TODO: for this to work, 'errno' has to support multithreading... */
+    int err = errno;
+    if (err == ENOTCONN) {
+      *closed = 1;
+      return 0;
+    }
+    LWIP_ASSERT("err == 0", err == 0);
+  }
+  LWIP_ASSERT("ret > 0", ret > 0);
+  return check_test_data(rxbuf, rxoff + ret);
+}
+
+#if LWIP_SOCKET_SELECT
+static int
+sockets_stresstest_wait_readable_select(int s, int timeout_ms)
+{
+  int ret;
+  struct timeval tv;
+  fd_set fs_r;
+  fd_set fs_w;
+  fd_set fs_e;
+
+  FD_ZERO(&fs_r);
+  FD_ZERO(&fs_w);
+  FD_ZERO(&fs_e);
+
+  FD_SET(s, &fs_r);
+  FD_SET(s, &fs_e);
+
+  tv.tv_sec = timeout_ms / 1000;
+  tv.tv_usec = (timeout_ms - (tv.tv_sec * 1000)) * 1000;
+  ret = lwip_select(s + 1, &fs_r, &fs_w, &fs_e, &tv);
+  LWIP_ASSERT("select error", ret >= 0);
+  if (ret) {
+    /* convert poll flags to our flags */
+    ret = 0;
+    if (FD_ISSET(s, &fs_r)) {
+      ret |= TEST_SOCK_READABLE;
+    }
+    if (FD_ISSET(s, &fs_w)) {
+      ret |= TEST_SOCK_WRITABLE;
+    }
+    if (FD_ISSET(s, &fs_e)) {
+      ret |= TEST_SOCK_ERR;
+    }
+    return ret;
+  }
+  return 0;
+}
+#endif
+
+#if LWIP_SOCKET_POLL
+static int
+sockets_stresstest_wait_readable_poll(int s, int timeout_ms)
+{
+  int ret;
+  struct pollfd pfd;
+
+  pfd.fd = s;
+  pfd.revents = 0;
+  pfd.events = POLLIN | POLLERR;
+
+  ret = lwip_poll(&pfd, 1, timeout_ms);
+  if (ret) {
+    /* convert poll flags to our flags */
+    ret = 0;
+    if (pfd.revents & POLLIN) {
+      ret |= TEST_SOCK_READABLE;
+    }
+    if (pfd.revents & POLLOUT) {
+      ret |= TEST_SOCK_WRITABLE;
+    }
+    if (pfd.revents & POLLERR) {
+      ret |= TEST_SOCK_ERR;
+    }
+    return ret;
+  }
+  return 0;
+}
+#endif
+
+#if LWIP_SO_RCVTIMEO
+static int
+sockets_stresstest_wait_readable_recvtimeo(int s, int timeout_ms)
+{
+  int ret;
+  char buf;
+#if LWIP_SO_SNDRCVTIMEO_NONSTANDARD
+  int opt_on = timeout_ms;
+  int opt_off = 0;
+#else
+  struct timeval opt_on, opt_off;
+  opt_on.tv_sec = timeout_ms / 1000;
+  opt_on.tv_usec = (timeout_ms - (opt_on.tv_sec * 1000)) * 1000;
+  opt_off.tv_sec = 0;
+  opt_off.tv_usec = 0;
+#endif
+
+  /* enable receive timeout */
+  ret = lwip_setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &opt_on, sizeof(opt_on));
+  LWIP_ASSERT("setsockopt error", ret == 0);
+
+  /* peek for one byte with timeout */
+  ret = lwip_recv(s, &buf, 1, MSG_PEEK);
+
+  /* disable receive timeout */
+  ret = lwip_setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &opt_off, sizeof(opt_off));
+  LWIP_ASSERT("setsockopt error", ret == 0);
+
+  if (ret == 1) {
+    return TEST_SOCK_READABLE;
+  }
+  if (ret == 0) {
+    return 0;
+  }
+  if (ret == -1) {
+    return TEST_SOCK_ERR;
+  }
+  LWIP_ASSERT("invalid return value", 0);
+  return TEST_SOCK_ERR;
+}
+#endif
+
+static int
+sockets_stresstest_wait_readable_wait_peek(int s, int timeout_ms)
+{
+  int ret;
+  char buf;
+
+  LWIP_UNUSED_ARG(timeout_ms); /* cannot time out here */
+
+  /* peek for one byte */
+  ret = lwip_recv(s, &buf, 1, MSG_PEEK);
+
+  if (ret == 1) {
+    return TEST_SOCK_READABLE;
+  }
+  if (ret == 0) {
+    return 0;
+  }
+  if (ret == -1) {
+    return TEST_SOCK_ERR;
+  }
+  LWIP_ASSERT("invalid return value", 0);
+  return TEST_SOCK_ERR;
+}
+
+static int
+sockets_stresstest_wait_readable_nonblock(int s, int timeout_ms)
+{
+  int ret;
+  char buf;
+  u32_t wait_until = sys_now() + timeout_ms;
+
+  while(sys_now() < wait_until) {
+    /* peek for one byte */
+    ret = lwip_recv(s, &buf, 1, MSG_PEEK | MSG_DONTWAIT);
+
+    if (ret == 1) {
+      return TEST_SOCK_READABLE;
+    }
+    if (ret == -1) {
+      /* TODO: for this to work, 'errno' has to support multithreading... */
+      int err = errno;
+      if (err != EWOULDBLOCK) {
+        return TEST_SOCK_ERR;
+      }
+    }
+    /* TODO: sleep? */
+  }
+  return 0;
+}
+
+static int sockets_stresstest_rand_mode(int allow_wait, int allow_rx)
+{
+  u32_t random_value = LWIP_RAND();
+#if LWIP_SOCKET_SELECT
+  if (random_value & TEST_MODE_SELECT) {
+    return TEST_MODE_SELECT;
+  }
+#endif
+#if LWIP_SOCKET_POLL
+  if (random_value & TEST_MODE_POLL) {
+    return TEST_MODE_POLL;
+  }
+#endif
+  if (!allow_rx) {
+    return TEST_MODE_SLEEP;
+  }
+#if LWIP_SO_RCVTIMEO
+  if (random_value & TEST_MODE_RECVTIMEO) {
+    return TEST_MODE_RECVTIMEO;
+  }
+#endif
+  if (allow_wait) {
+    if (random_value & TEST_MODE_RECVTIMEO) {
+      return TEST_MODE_RECVTIMEO;
+    }
+  }
+  return TEST_MODE_NONBLOCKING;
+}
+
+static int
+sockets_stresstest_wait_readable(int mode, int s, int timeout_ms)
+{
+  switch(mode)
+  {
+#if LWIP_SOCKET_SELECT
+  case TEST_MODE_SELECT:
+    return sockets_stresstest_wait_readable_select(s, timeout_ms);
+#endif
+#if LWIP_SOCKET_POLL
+  case TEST_MODE_POLL:
+    return sockets_stresstest_wait_readable_poll(s, timeout_ms);
+#endif
+#if LWIP_SO_RCVTIMEO
+  case TEST_MODE_RECVTIMEO:
+    return sockets_stresstest_wait_readable_recvtimeo(s, timeout_ms);
+#endif
+  case TEST_MODE_WAIT:
+    return sockets_stresstest_wait_readable_wait_peek(s, timeout_ms);
+  case TEST_MODE_NONBLOCKING:
+    return sockets_stresstest_wait_readable_nonblock(s, timeout_ms);
+  case TEST_MODE_SLEEP:
+    {
+      sys_msleep(timeout_ms);
+      return 1;
+    }
+  default:
+    LWIP_ASSERT("invalid mode", 0);
+    break;
+  }
+  return 0;
+}
+
+#if LWIP_NETCONN_FULLDUPLEX
+static void
+sockets_stresstest_conn_client_r(void *arg)
+{
+  struct sockets_stresstest_fullduplex *fd = (struct sockets_stresstest_fullduplex *)arg;
+  int s = fd->s;
+  size_t rxoff = 0;
+  char rxbuf[TEST_TXRX_BUFSIZE];
+
+  while (1) {
+    int closed;
+    if (fd->closed) {
+      break;
+    }
+    rxoff = recv_and_check_data_return_offset(s, rxbuf, sizeof(rxbuf), rxoff, &closed, "cli");
+    if (fd->closed) {
+      break;
+    }
+    if (closed) {
+      lwip_close(s);
+      break;
+    }
+  }
+
+  SYS_ARCH_DEC(sockets_stresstest_numthreads, 1);
+  LWIP_ASSERT("", sockets_stresstest_numthreads >= 0);
+}
+#endif
+
+static void
+sockets_stresstest_conn_client(void *arg)
+{
+  struct sockaddr_storage addr;
+  struct sockaddr_in *addr_in;
+  int s, ret;
+  char txbuf[TEST_TXRX_BUFSIZE];
+  char rxbuf[TEST_TXRX_BUFSIZE];
+  size_t rxoff = 0;
+  u32_t max_time = sys_now() + (TEST_TIME_SECONDS * 1000);
+  int do_rx = 1;
+  struct sockets_stresstest_fullduplex *data = NULL;
+
+  memcpy(&addr, arg, sizeof(addr));
+  LWIP_ASSERT("", addr.ss_family == AF_INET);
+  addr_in = (struct sockaddr_in *)&addr;
+  addr_in->sin_addr.s_addr = inet_addr("127.0.0.1");
+
+  /* sleep a random time between 1 and 2 seconds */
+  sys_msleep(1000 + (LWIP_RAND() % 1000));
+
+  /* connect to the server */
+  s = lwip_socket(addr.ss_family, SOCK_STREAM, 0);
+  LWIP_ASSERT("s >= 0", s >= 0);
+
+#if LWIP_NETCONN_FULLDUPLEX
+  if (LWIP_RAND() & 1) {
+    sys_thread_t t;
+    data = (struct sockets_stresstest_fullduplex*)mem_malloc(sizeof(struct sockets_stresstest_fullduplex));
+    LWIP_ASSERT("data != NULL", data != 0);
+    SYS_ARCH_INC(sockets_stresstest_numthreads, 1);
+    data->s = s;
+    data->closed = 0;
+    t = sys_thread_new("sockets_stresstest_conn_client_r", sockets_stresstest_conn_client_r, data, 0, 0);
+    LWIP_ASSERT("thread != NULL", t != 0);
+    do_rx = 0;
+  }
+#endif
+
+  /* @todo: nonblocking connect? */
+  ret = lwip_connect(s, (struct sockaddr *)&addr, sizeof(struct sockaddr_storage));
+  LWIP_ASSERT("ret == 0", ret == 0);
+
+  while (sys_now() < max_time) {
+    int closed;
+    int mode = sockets_stresstest_rand_mode(0, do_rx);
+    int timeout_ms = LWIP_RAND() % TEST_MAX_RXWAIT_MS;
+    ret = sockets_stresstest_wait_readable(mode, s, timeout_ms);
+    if (ret) {
+      if (do_rx) {
+        /* read some */
+        LWIP_ASSERT("readable", ret == TEST_SOCK_READABLE);
+        rxoff = recv_and_check_data_return_offset(s, rxbuf, sizeof(rxbuf), rxoff, &closed, "cli");
+        LWIP_ASSERT("client got closed", !closed);
+      }
+    } else {
+      /* timeout, send some */
+      size_t send_len = (LWIP_RAND() % (sizeof(txbuf) - 4)) + 4;
+      fill_test_data(txbuf, send_len);
+      LWIP_DEBUGF(TEST_SOCKETS_STRESS | LWIP_DBG_TRACE, ("cli %d tx %d\n", s, (int)send_len));
+      ret = lwip_write(s, txbuf, send_len);
+      if (ret == -1) {
+        /* TODO: for this to work, 'errno' has to support multithreading... */
+        int err = errno;
+        LWIP_ASSERT("err == 0", err == 0);
+      }
+      LWIP_ASSERT("ret == send_len", ret == (int)send_len);
+    }
+  }
+  if (data) {
+    data->closed = 1;
+  }
+  ret = lwip_close(s);
+  LWIP_ASSERT("ret == 0", ret == 0);
+
+  SYS_ARCH_DEC(sockets_stresstest_numthreads, 1);
+  LWIP_ASSERT("", sockets_stresstest_numthreads >= 0);
+}
+
+static void
+sockets_stresstest_conn_server(void *arg)
+{
+  int s, ret;
+  char txbuf[TEST_TXRX_BUFSIZE];
+  char rxbuf[TEST_TXRX_BUFSIZE];
+  size_t rxoff = 0;
+
+  s = (int)arg;
+
+  while (1) {
+    int closed;
+    int mode = sockets_stresstest_rand_mode(1, 1);
+    int timeout_ms = LWIP_RAND() % TEST_MAX_RXWAIT_MS;
+    ret = sockets_stresstest_wait_readable(mode, s, timeout_ms);
+    if (ret) {
+      if (ret & TEST_SOCK_ERR) {
+        /* closed? */
+        break;
+      }
+      /* read some */
+      LWIP_ASSERT("readable", ret == TEST_SOCK_READABLE);
+      rxoff = recv_and_check_data_return_offset(s, rxbuf, sizeof(rxbuf), rxoff, &closed, "srv");
+      if (closed) {
+        break;
+      }
+    } else {
+      /* timeout, send some */
+      size_t send_len = (LWIP_RAND() % (sizeof(txbuf) - 4)) + 4;
+      fill_test_data(txbuf, send_len);
+      LWIP_DEBUGF(TEST_SOCKETS_STRESS | LWIP_DBG_TRACE, ("srv %d tx %d\n", s, (int)send_len));
+      ret = lwip_write(s, txbuf, send_len);
+      if (ret == -1) {
+        /* TODO: for this to work, 'errno' has to support multithreading... */
+        int err = errno;
+        if (err == ECONNRESET) {
+          break;
+        }
+        if (err == ENOTCONN) {
+          break;
+        }
+        LWIP_ASSERT("unknown error", 0);
+      }
+      LWIP_ASSERT("ret == send_len", ret == (int)send_len);
+    }
+  }
+  ret = lwip_close(s);
+  LWIP_ASSERT("ret == 0", ret == 0);
+
+  SYS_ARCH_DEC(sockets_stresstest_numthreads, 1);
+  LWIP_ASSERT("", sockets_stresstest_numthreads >= 0);
+}
+
+static int
+sockets_stresstest_start_clients(const struct sockaddr_storage *remote_addr)
+{
+  /* limit the number of connections */
+  const int max_connections = LWIP_MIN(TEST_MAX_CONNECTIONS, MEMP_NUM_TCP_PCB/3);
+  int i;
+
+  for (i = 0; i < max_connections; i++) {
+    sys_thread_t t;
+    SYS_ARCH_INC(sockets_stresstest_numthreads, 1);
+    t = sys_thread_new("sockets_stresstest_conn_client", sockets_stresstest_conn_client, (void*)remote_addr, 0, 0);
+    LWIP_ASSERT("thread != NULL", t != 0);
+  }
+  return max_connections;
+}
+
+static void
+sockets_stresstest_listener(void *arg)
+{
+  int slisten;
+  int ret;
+  struct sockaddr_storage addr;
+  socklen_t addr_len;
+  struct test_settings *settings = (struct test_settings *)arg;
+  int num_clients, num_servers = 0;
+
+  slisten = lwip_socket(AF_INET, SOCK_STREAM, 0);
+  LWIP_ASSERT("slisten >= 0", slisten >= 0);
+
+  memcpy(&addr, &settings->addr, sizeof(struct sockaddr_storage));
+  ret = lwip_bind(slisten, (struct sockaddr *)&addr, sizeof(addr));
+  LWIP_ASSERT("ret == 0", ret == 0);
+
+  ret = lwip_listen(slisten, 0);
+  LWIP_ASSERT("ret == 0", ret == 0);
+
+  addr_len = sizeof(addr);
+  ret = lwip_getsockname(slisten, (struct sockaddr *)&addr, &addr_len);
+  LWIP_ASSERT("ret == 0", ret == 0);
+
+  num_clients = sockets_stresstest_start_clients(&addr);
+
+  while (num_servers < num_clients) {
+    struct sockaddr_storage aclient;
+    socklen_t aclient_len = sizeof(aclient);
+    int sclient = lwip_accept(slisten, (struct sockaddr *)&aclient, &aclient_len);
+#if 1
+    /* using server threads */
+    {
+      sys_thread_t t;
+      SYS_ARCH_INC(sockets_stresstest_numthreads, 1);
+      num_servers++;
+      t = sys_thread_new("sockets_stresstest_conn_server", sockets_stresstest_conn_server, (void*)sclient, 0, 0);
+      LWIP_ASSERT("thread != NULL", t != 0);
+    }
+#else
+    /* using server select */
+#endif
+  }
+  LWIP_DEBUGF(TEST_SOCKETS_STRESS | LWIP_DBG_STATE, ("sockets_stresstest_listener: all %d connections established\n", num_clients));
+
+  /* accepted all clients */
+  while (sockets_stresstest_numthreads > 0) {
+    sys_msleep(1);
+  }
+
+  ret = lwip_close(slisten);
+  LWIP_ASSERT("ret == 0", ret == 0);
+
+  LWIP_DEBUGF(TEST_SOCKETS_STRESS |LWIP_DBG_STATE, ("sockets_stresstest_listener: done\n"));
+}
+
+static void
+sockets_stresstest_listener_loop(void *arg)
+{
+  int i;
+  struct test_settings *settings = (struct test_settings *)arg;
+
+  if (settings->loop_cnt) {
+    for (i = 0; i < settings->loop_cnt; i++) {
+      LWIP_DEBUGF(TEST_SOCKETS_STRESS |LWIP_DBG_STATE, ("sockets_stresstest_listener_loop: iteration %d\n", i));
+      sockets_stresstest_listener(arg);
+      sys_msleep(2);
+    }
+    LWIP_DEBUGF(TEST_SOCKETS_STRESS |LWIP_DBG_STATE, ("sockets_stresstest_listener_loop: done\n"));
+  } else {
+    for (i = 0; ; i++) {
+      LWIP_DEBUGF(TEST_SOCKETS_STRESS |LWIP_DBG_STATE, ("sockets_stresstest_listener_loop: iteration %d\n", i));
+      sockets_stresstest_listener(arg);
+      sys_msleep(2);
+    }
+  }
+}
+
+void
+sockets_stresstest_init_loopback(int addr_family)
+{
+  sys_thread_t t;
+  struct test_settings *settings = (struct test_settings *)mem_malloc(sizeof(struct test_settings));
+
+  LWIP_ASSERT("OOM", settings != NULL);
+  memset(settings, 0, sizeof(struct test_settings));
+#if LWIP_IPV4 && LWIP_IPV6
+  LWIP_ASSERT("invalid addr_family", (addr_family == AF_INET) || (addr_family == AF_INET6));
+#endif
+  settings->addr.ss_family = (sa_family_t)addr_family;
+  LWIP_UNUSED_ARG(addr_family);
+  settings->start_client = 1;
+
+  t = sys_thread_new("sockets_stresstest_listener_loop", sockets_stresstest_listener_loop, settings, 0, 0);
+  LWIP_ASSERT("thread != NULL", t != 0);
+}
+
+void
+sockets_stresstest_init_server(int addr_family, u16_t server_port)
+{
+  sys_thread_t t;
+  struct test_settings *settings = (struct test_settings *)mem_malloc(sizeof(struct test_settings));
+
+  LWIP_ASSERT("OOM", settings != NULL);
+  memset(settings, 0, sizeof(struct test_settings));
+#if LWIP_IPV4 && LWIP_IPV6
+  LWIP_ASSERT("invalid addr_family", (addr_family == AF_INET) || (addr_family == AF_INET6));
+  settings->addr.ss_family = (sa_family_t)addr_family;
+#endif
+  LWIP_UNUSED_ARG(addr_family);
+  ((struct sockaddr_in *)(&settings->addr))->sin_port = server_port;
+
+  t = sys_thread_new("sockets_stresstest_listener", sockets_stresstest_listener, settings, 0, 0);
+  LWIP_ASSERT("thread != NULL", t != 0);
+}
+
+void
+sockets_stresstest_init_client(const char *remote_ip, u16_t remote_port)
+{
+#if LWIP_IPV4
+  ip4_addr_t ip4;
+#endif
+#if LWIP_IPV6
+  ip6_addr_t ip6;
+#endif
+  struct sockaddr_storage *addr = (struct sockaddr_storage *)mem_malloc(sizeof(struct sockaddr_storage));
+
+  LWIP_ASSERT("OOM", addr != NULL);
+  memset(addr, 0, sizeof(struct test_settings));
+#if LWIP_IPV4
+  if (ip4addr_aton(remote_ip, &ip4)) {
+    addr->ss_family = AF_INET;
+    ((struct sockaddr_in *)addr)->sin_addr.s_addr = ip4_addr_get_u32(&ip4);
+  }
+#endif
+#if LWIP_IPV4 && LWIP_IPV6
+  else
+#endif
+#if LWIP_IPV6
+  if (ip6addr_aton(remote_ip, &ip6)) {
+    addr->ss_family = AF_INET6;
+    /* todo: copy ipv6 address */
+  }
+#endif
+  ((struct sockaddr_in *)addr)->sin_port = remote_port;
+  sockets_stresstest_start_clients(addr);
+}
+
+#endif /* LWIP_SOCKET && LWIP_IPV4 */
diff --git a/test/sockets/sockets_stresstest.h b/test/sockets/sockets_stresstest.h
new file mode 100644
index 0000000..178e604
--- /dev/null
+++ b/test/sockets/sockets_stresstest.h
@@ -0,0 +1,40 @@
+/*
+ * 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_TEST_SOCKETS_STRESSTEST
+#define LWIP_HDR_TEST_SOCKETS_STRESSTEST
+
+void sockets_stresstest_init_loopback(int addr_family);
+void sockets_stresstest_init_server(int addr_family, u16_t server_port);
+void sockets_stresstest_init_client(const char *remote_ip, u16_t remote_port);
+
+#endif /* LWIP_HDR_TEST_SOCKETS_STRESSTEST */
diff --git a/test/unit/Filelists.cmake b/test/unit/Filelists.cmake
new file mode 100644
index 0000000..e1f40bc
--- /dev/null
+++ b/test/unit/Filelists.cmake
@@ -0,0 +1,31 @@
+# This file is indended to be included in end-user CMakeLists.txt
+# include(/path/to/Filelists.cmake)
+# It assumes the variable LWIP_DIR is defined pointing to the
+# root path of lwIP 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.
+
+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_mem.c
+	${LWIP_TESTDIR}/core/test_netif.c
+	${LWIP_TESTDIR}/core/test_pbuf.c
+	${LWIP_TESTDIR}/core/test_timers.c
+	${LWIP_TESTDIR}/dhcp/test_dhcp.c
+	${LWIP_TESTDIR}/etharp/test_etharp.c
+	${LWIP_TESTDIR}/ip4/test_ip4.c
+	${LWIP_TESTDIR}/ip6/test_ip6.c
+	${LWIP_TESTDIR}/mdns/test_mdns.c
+	${LWIP_TESTDIR}/mqtt/test_mqtt.c
+	${LWIP_TESTDIR}/tcp/tcp_helper.c
+	${LWIP_TESTDIR}/tcp/test_tcp_oos.c
+	${LWIP_TESTDIR}/tcp/test_tcp.c
+	${LWIP_TESTDIR}/udp/test_udp.c
+)
diff --git a/test/unit/Filelists.mk b/test/unit/Filelists.mk
new file mode 100644
index 0000000..4b77078
--- /dev/null
+++ b/test/unit/Filelists.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>
+#
+
+TESTDIR=$(LWIPDIR)/../test/unit
+TESTFILES=$(TESTDIR)/lwip_unittests.c \
+	$(TESTDIR)/api/test_sockets.c \
+	$(TESTDIR)/arch/sys_arch.c \
+	$(TESTDIR)/core/test_def.c \
+	$(TESTDIR)/core/test_mem.c \
+	$(TESTDIR)/core/test_netif.c \
+	$(TESTDIR)/core/test_pbuf.c \
+	$(TESTDIR)/core/test_timers.c \
+	$(TESTDIR)/dhcp/test_dhcp.c \
+	$(TESTDIR)/etharp/test_etharp.c \
+	$(TESTDIR)/ip4/test_ip4.c \
+	$(TESTDIR)/ip6/test_ip6.c \
+	$(TESTDIR)/mdns/test_mdns.c \
+	$(TESTDIR)/mqtt/test_mqtt.c \
+	$(TESTDIR)/tcp/tcp_helper.c \
+	$(TESTDIR)/tcp/test_tcp_oos.c \
+	$(TESTDIR)/tcp/test_tcp.c \
+	$(TESTDIR)/udp/test_udp.c
+
diff --git a/test/unit/api/test_sockets.c b/test/unit/api/test_sockets.c
new file mode 100644
index 0000000..472fa48
--- /dev/null
+++ b/test/unit/api/test_sockets.c
@@ -0,0 +1,852 @@
+#include "test_sockets.h"
+
+#include "lwip/mem.h"
+#include "lwip/opt.h"
+#include "lwip/sockets.h"
+#include "lwip/priv/sockets_priv.h"
+#include "lwip/stats.h"
+
+#include "lwip/tcpip.h"
+#include "lwip/priv/tcp_priv.h"
+#include "lwip/api.h"
+
+
+static int
+test_sockets_get_used_count(void)
+{
+  int used = 0;
+  int i;
+
+  for (i = 0; i < NUM_SOCKETS; i++) {
+    struct lwip_sock* s = lwip_socket_dbg_get_socket(i);
+    if (s != NULL) {
+      if (s->fd_used) {
+        used++;
+      }
+    }
+  }
+  return used;
+}
+
+
+/* Setups/teardown functions */
+
+static void
+sockets_setup(void)
+{
+  /* expect full free heap */
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
+}
+
+static void
+sockets_teardown(void)
+{
+  fail_unless(test_sockets_get_used_count() == 0);
+  /* poll until all memory is released... */
+  tcpip_thread_poll_one();
+  while (tcp_tw_pcbs) {
+    tcp_abort(tcp_tw_pcbs);
+    tcpip_thread_poll_one();
+  }
+  tcpip_thread_poll_one();
+  /* ensure full free heap */
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
+}
+
+#ifndef NUM_SOCKETS
+#define NUM_SOCKETS MEMP_NUM_NETCONN
+#endif
+
+#if LWIP_SOCKET
+static int
+test_sockets_alloc_socket_nonblocking(int domain, int type)
+{
+  int s = lwip_socket(domain, type, 0);
+  if (s >= 0) {
+    int ret = lwip_fcntl(s, F_SETFL, O_NONBLOCK);
+    fail_unless(ret == 0);
+  }
+  return s;
+}
+
+/* Verify basic sockets functionality
+ */
+START_TEST(test_sockets_basics)
+{
+  int s, i, ret;
+  int s2[NUM_SOCKETS];
+  LWIP_UNUSED_ARG(_i);
+
+  s = lwip_socket(AF_INET, SOCK_STREAM, 0);
+  fail_unless(s >= 0);
+  lwip_close(s);
+
+  for (i = 0; i < NUM_SOCKETS; i++) {
+    s2[i] = lwip_socket(AF_INET, SOCK_STREAM, 0);
+    fail_unless(s2[i] >= 0);
+  }
+
+  /* all sockets used, now it should fail */
+  s = lwip_socket(AF_INET, SOCK_STREAM, 0);
+  fail_unless(s == -1);
+  /* close one socket */
+  ret = lwip_close(s2[0]);
+  fail_unless(ret == 0);
+  /* now it should succeed */
+  s2[0] = lwip_socket(AF_INET, SOCK_STREAM, 0);
+  fail_unless(s2[0] >= 0);
+
+  /* close all sockets */
+  for (i = 0; i < NUM_SOCKETS; i++) {
+    ret = lwip_close(s2[i]);
+    fail_unless(ret == 0);
+  }
+}
+END_TEST
+
+static void test_sockets_allfunctions_basic_domain(int domain)
+{
+  int s, s2, s3, ret;
+  struct sockaddr_storage addr, addr2;
+  socklen_t addrlen, addr2len;
+  char buf[4];
+  /* listen socket */
+  s = lwip_socket(domain, SOCK_STREAM, 0);
+  fail_unless(s >= 0);
+
+  ret = lwip_listen(s, 0);
+  fail_unless(ret == 0);
+
+  addrlen = sizeof(addr);
+  ret = lwip_getsockname(s, (struct sockaddr*)&addr, &addrlen);
+  fail_unless(ret == 0);
+
+  s2 = test_sockets_alloc_socket_nonblocking(domain, SOCK_STREAM);
+  fail_unless(s2 >= 0);
+  /* nonblocking connect s2 to s (but use loopback address) */
+  if (domain == AF_INET) {
+#if LWIP_IPV4
+    struct sockaddr_in *addr4 = (struct sockaddr_in *)&addr;
+    addr4->sin_addr.s_addr = PP_HTONL(INADDR_LOOPBACK);
+#endif
+  } else {
+#if LWIP_IPV6
+    struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&addr;
+    struct in6_addr lo6 = IN6ADDR_LOOPBACK_INIT;
+    addr6->sin6_addr = lo6;
+#endif
+  }
+  ret = lwip_connect(s2, (struct sockaddr*)&addr, addrlen);
+  fail_unless(ret == -1);
+  fail_unless(errno == EINPROGRESS);
+  ret = lwip_connect(s2, (struct sockaddr*)&addr, addrlen);
+  fail_unless(ret == -1);
+  fail_unless(errno == EALREADY);
+
+  while(tcpip_thread_poll_one());
+
+  s3 = lwip_accept(s, (struct sockaddr*)&addr2, &addr2len);
+  fail_unless(s3 >= 0);
+
+  ret = lwip_connect(s2, (struct sockaddr*)&addr, addrlen);
+  fail_unless(ret == -1);
+  fail_unless(errno == EISCONN);
+
+  /* write from server to client */
+  ret = write(s3, "test", 4);
+  fail_unless(ret == 4);
+
+  ret = lwip_shutdown(s3, SHUT_WR);
+  fail_unless(ret == 0);
+
+  while(tcpip_thread_poll_one());
+
+  ret = lwip_recv(s2, buf, 3, MSG_PEEK);
+  fail_unless(ret == 3);
+
+  ret = lwip_recv(s2, buf, 3, MSG_PEEK);
+  fail_unless(ret == 3);
+
+  ret = lwip_read(s2, buf, 4);
+  fail_unless(ret == 4);
+
+  ret = lwip_read(s2, buf, 1);
+  fail_unless(ret == 0);
+
+  ret = lwip_read(s2, buf, 1);
+  fail_unless(ret == -1);
+
+  ret = lwip_write(s2, "foo", 3);
+  fail_unless(ret == 3);
+
+  ret = lwip_close(s2);
+  fail_unless(ret == 0);
+
+  while(tcpip_thread_poll_one());
+
+  /* read one byte more than available to check handling FIN */
+  ret = lwip_read(s3, buf, 4);
+  fail_unless(ret == 3);
+
+  ret = lwip_read(s3, buf, 1);
+  fail_unless(ret == 0);
+
+  ret = lwip_read(s3, buf, 1);
+  fail_unless(ret == -1);
+
+  while(tcpip_thread_poll_one());
+
+  ret = lwip_close(s);
+  fail_unless(ret == 0);
+  ret = lwip_close(s3);
+  fail_unless(ret == 0);
+}
+
+/* Try to step through all sockets functions once...
+ */
+START_TEST(test_sockets_allfunctions_basic)
+{
+  LWIP_UNUSED_ARG(_i);
+#if LWIP_IPV4
+  test_sockets_allfunctions_basic_domain(AF_INET);
+#endif
+#if LWIP_IPV6
+  test_sockets_allfunctions_basic_domain(AF_INET6);
+#endif
+}
+END_TEST
+
+static void test_sockets_init_loopback_addr(int domain, struct sockaddr_storage *addr_st, socklen_t *sz)
+{
+  memset(addr_st, 0, sizeof(*addr_st));
+  switch(domain) {
+#if LWIP_IPV6
+    case AF_INET6: {
+      struct sockaddr_in6 *addr = (struct sockaddr_in6*)addr_st;
+      struct in6_addr lo6 = IN6ADDR_LOOPBACK_INIT;
+      addr->sin6_family = AF_INET6;
+      addr->sin6_port = 0; /* use ephemeral port */
+      addr->sin6_addr = lo6;
+      *sz = sizeof(*addr);
+   }
+      break;
+#endif /* LWIP_IPV6 */
+#if LWIP_IPV4
+    case AF_INET: {
+      struct sockaddr_in *addr = (struct sockaddr_in*)addr_st;
+      addr->sin_family = AF_INET;
+      addr->sin_port = 0; /* use ephemeral port */
+      addr->sin_addr.s_addr = PP_HTONL(INADDR_LOOPBACK);
+      *sz = sizeof(*addr);
+    }
+      break;
+#endif /* LWIP_IPV4 */
+    default:
+      *sz = 0;
+      fail();
+      break;
+  }
+}
+
+static void test_sockets_msgapi_update_iovs(struct msghdr *msg, size_t bytes)
+{
+  int 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 */
+  
+  /* process fully consumed vectors */
+  for (i = 0; i < msg->msg_iovlen; i++) {
+    if (msg->msg_iov[i].iov_len <= bytes) {
+      /* reduce bytes by amount of this vector */
+      bytes -= msg->msg_iov[i].iov_len;
+    } else {
+      break; /* iov not fully consumed */
+    }
+  }
+
+  /* slide down over fully consumed vectors */
+  msg->msg_iov = &msg->msg_iov[i];
+  msg->msg_iovlen -= i;
+
+  /* update new first vector with any remaining amount */
+  msg->msg_iov[0].iov_base = ((u8_t *)msg->msg_iov[0].iov_base + bytes);
+  msg->msg_iov[0].iov_len -= bytes;
+}
+
+static void test_sockets_msgapi_tcp(int domain)
+{
+  #define BUF_SZ          (TCP_SND_BUF/4)
+  #define TOTAL_DATA_SZ   (BUF_SZ*8) /* ~(TCP_SND_BUF*2) that accounts for integer rounding */
+  #define NEED_TRAILER    (BUF_SZ % 4 != 0)
+  int listnr, s1, s2, i, ret, opt;
+  int bytes_written, bytes_read;
+  struct sockaddr_storage addr_storage;
+  socklen_t addr_size;
+  struct iovec siovs[8];
+  struct msghdr smsg;
+  u8_t * snd_buf;
+  struct iovec riovs[5];
+  struct iovec riovs_tmp[5];
+  struct msghdr rmsg;
+  u8_t * rcv_buf;
+  int    rcv_off;
+  int    rcv_trailer = 0;
+  u8_t val;
+
+  test_sockets_init_loopback_addr(domain, &addr_storage, &addr_size);
+
+  listnr = test_sockets_alloc_socket_nonblocking(domain, SOCK_STREAM);
+  fail_unless(listnr >= 0);
+  s1 = test_sockets_alloc_socket_nonblocking(domain, SOCK_STREAM);
+  fail_unless(s1 >= 0);
+
+  /* setup a listener socket on loopback with ephemeral port */
+  ret = lwip_bind(listnr, (struct sockaddr*)&addr_storage, addr_size);
+  fail_unless(ret == 0);
+  ret = lwip_listen(listnr, 0);
+  fail_unless(ret == 0);
+
+  /* update address with ephemeral port */
+  ret = lwip_getsockname(listnr, (struct sockaddr*)&addr_storage, &addr_size);
+  fail_unless(ret == 0);
+
+  /* connect, won't complete until we accept it */
+  ret = lwip_connect(s1, (struct sockaddr*)&addr_storage, addr_size);
+  fail_unless(ret == -1);
+  fail_unless(errno == EINPROGRESS);
+
+  while (tcpip_thread_poll_one());
+
+  /* accept, creating the other side of the connection */
+  s2 = lwip_accept(listnr, NULL, NULL);
+  fail_unless(s2 >= 0);
+
+  /* double check s1 is connected */
+  ret = lwip_connect(s1, (struct sockaddr*)&addr_storage, addr_size);
+  fail_unless(ret == -1);
+  fail_unless(errno == EISCONN);
+
+  /* set s2 to non-blocking, not inherited from listener */
+  opt = lwip_fcntl(s2, F_GETFL, 0);
+  fail_unless(opt == 6);
+  opt = O_NONBLOCK;
+  ret = lwip_fcntl(s2, F_SETFL, opt);
+  fail_unless(ret == 0);
+
+  /* we are done with listener, close it */
+  ret = lwip_close(listnr);
+  fail_unless(ret == 0);
+
+  /* allocate a buffer for a stream of incrementing hex (0x00..0xFF) which we will use
+     to create an input vector set that is larger than the TCP's send buffer. This will
+     force execution of the partial IO vector send case */
+  snd_buf = (u8_t*)mem_malloc(BUF_SZ);
+  val = 0x00;
+  fail_unless(snd_buf != NULL);
+  for (i = 0; i < BUF_SZ; i++,val++) {
+    snd_buf[i] = val;
+  }
+
+  /* send the buffer 8 times in one message, equating to TOTAL_DATA_SZ */
+  for (i = 0; i < 8; i++) {
+    siovs[i].iov_base = snd_buf;
+    siovs[i].iov_len = BUF_SZ;
+  }
+
+  /* allocate a receive buffer, same size as snd_buf for easy verification */
+  rcv_buf = (u8_t*)mem_calloc(1, BUF_SZ);
+  fail_unless(rcv_buf != NULL);
+  /* split across iovs */
+  for (i = 0; i < 4; i++) {
+    riovs[i].iov_base = &rcv_buf[i*(BUF_SZ/4)];
+    riovs[i].iov_len = BUF_SZ/4;
+  }
+  /* handling trailing bytes if buffer doesn't evenly divide by 4 */
+#if NEED_TRAILER
+  if ((BUF_SZ % 4) != 0) {
+    riovs[5].iov_base = &rcv_buf[4*(BUF_SZ/4)];
+    riovs[5].iov_len = BUF_SZ - (4*(BUF_SZ/4));
+    rcv_trailer = 1;
+  }
+#endif /* NEED_TRAILER */
+
+  /* we use a copy of riovs since we'll be modifying base and len during
+     receiving. This gives us an easy way to reset the iovs for next recvmsg */
+  memcpy(riovs_tmp, riovs, sizeof(riovs));
+
+  memset(&smsg, 0, sizeof(smsg));
+  smsg.msg_iov = siovs;
+  smsg.msg_iovlen = 8;
+
+  memset(&rmsg, 0, sizeof(rmsg));
+  rmsg.msg_iov = riovs_tmp;
+  rmsg.msg_iovlen = (rcv_trailer ? 5 : 4);
+
+  bytes_written = 0;
+  bytes_read = 0;
+  rcv_off = 0;
+
+  while (bytes_written < TOTAL_DATA_SZ && (bytes_read < TOTAL_DATA_SZ)) {
+    /* send data */
+    if (bytes_written < TOTAL_DATA_SZ) {
+      ret = lwip_sendmsg(s1, &smsg, 0);
+      /* note: since we always receive after sending, there will be open
+         space in the send buffer */
+      fail_unless(ret > 0);
+    
+      bytes_written += ret;
+      if (bytes_written < TOTAL_DATA_SZ) {
+        test_sockets_msgapi_update_iovs(&smsg, (size_t)ret);
+      }
+    }
+
+    while (tcpip_thread_poll_one());
+
+    /* receive and verify data */
+    do {
+      if (bytes_read < TOTAL_DATA_SZ) {
+        ret = lwip_recvmsg(s2, &rmsg, 0);
+        fail_unless(ret > 0 || (ret == -1 && errno == EWOULDBLOCK));
+
+        if (ret > 0) {
+          rcv_off += ret;
+          /* we have received a full buffer */
+          if (rcv_off == BUF_SZ) {
+            /* note: since iovs are just pointers, compare underlying buf */
+            fail_unless(!memcmp(snd_buf, rcv_buf, BUF_SZ));
+            bytes_read += BUF_SZ;
+            /* reset receive state for next buffer */
+            rcv_off = 0;
+            memset(rcv_buf, 0, BUF_SZ);
+            memcpy(riovs_tmp, riovs, sizeof(riovs));
+            rmsg.msg_iov = riovs_tmp;
+            rmsg.msg_iovlen = (rcv_trailer ? 5 : 4);
+          } else { /* partial read */
+            test_sockets_msgapi_update_iovs(&rmsg, (size_t)ret);
+          }
+        }
+      } else {
+        break;
+      }
+    } while(ret > 0);
+  }
+  
+  ret = lwip_close(s1);
+  fail_unless(ret == 0);
+  ret = lwip_close(s2);
+  fail_unless(ret == 0);
+  mem_free(snd_buf);
+  mem_free(rcv_buf);
+}
+
+static void test_sockets_msgapi_udp_send_recv_loop(int s, struct msghdr *smsg, struct msghdr *rmsg)
+{
+  int i, ret;
+
+  /* send/receive our datagram of IO vectors 10 times */
+  for (i = 0; i < 10; i++) {
+    ret = lwip_sendmsg(s, smsg, 0);
+    fail_unless(ret == 4);
+
+    while (tcpip_thread_poll_one());
+
+    /* receive the datagram split across 4 buffers */
+    ret = lwip_recvmsg(s, rmsg, 0);
+    fail_unless(ret == 4);
+
+    /* verify data */
+    fail_unless(*((u8_t*)rmsg->msg_iov[0].iov_base) == 0xDE);
+    fail_unless(*((u8_t*)rmsg->msg_iov[1].iov_base) == 0xAD);
+    fail_unless(*((u8_t*)rmsg->msg_iov[2].iov_base) == 0xBE);
+    fail_unless(*((u8_t*)rmsg->msg_iov[3].iov_base) == 0xEF);
+
+    /* clear rcv_buf to ensure no data is being skipped */
+    *((u8_t*)rmsg->msg_iov[0].iov_base) = 0x00;
+    *((u8_t*)rmsg->msg_iov[1].iov_base) = 0x00;
+    *((u8_t*)rmsg->msg_iov[2].iov_base) = 0x00;
+    *((u8_t*)rmsg->msg_iov[3].iov_base) = 0x00;
+  }
+}
+
+static void test_sockets_msgapi_udp(int domain)
+{
+  int s, i, ret;
+  struct sockaddr_storage addr_storage;
+  socklen_t addr_size;
+  struct iovec riovs[4];
+  struct msghdr rmsg;
+  u8_t rcv_buf[4];
+  struct iovec siovs[4];
+  struct msghdr smsg;
+  u8_t snd_buf[4] = {0xDE, 0xAD, 0xBE, 0xEF};
+
+  /* initialize IO vectors with data */
+  for (i = 0; i < 4; i++) {
+    siovs[i].iov_base = &snd_buf[i];
+    siovs[i].iov_len = sizeof(u8_t);
+    riovs[i].iov_base = &rcv_buf[i];
+    riovs[i].iov_len = sizeof(u8_t);
+  }
+
+  test_sockets_init_loopback_addr(domain, &addr_storage, &addr_size);
+
+  s = test_sockets_alloc_socket_nonblocking(domain, SOCK_DGRAM);
+  fail_unless(s >= 0);
+
+  ret = lwip_bind(s, (struct sockaddr*)&addr_storage, addr_size);
+  fail_unless(ret == 0);
+
+  /* Update addr with epehermal port */
+  ret = lwip_getsockname(s, (struct sockaddr*)&addr_storage, &addr_size);
+  fail_unless(ret == 0);
+  switch(domain) {
+#if LWIP_IPV6
+    case AF_INET6:
+      fail_unless(addr_size == sizeof(struct sockaddr_in6));
+      break;
+#endif /* LWIP_IPV6 */
+#if LWIP_IPV4
+    case AF_INET:
+        fail_unless(addr_size == sizeof(struct sockaddr_in));
+        break;
+#endif /* LWIP_IPV6 */
+    default:
+      fail();
+      break;
+  }
+
+  /* send and receive the datagram in 4 pieces */
+  memset(&smsg, 0, sizeof(smsg));
+  smsg.msg_iov = siovs;
+  smsg.msg_iovlen = 4;
+  memset(&rmsg, 0, sizeof(rmsg));
+  rmsg.msg_iov = riovs;
+  rmsg.msg_iovlen = 4;
+
+  /* perform a sendmsg with remote host (self) */
+  smsg.msg_name = &addr_storage;
+  smsg.msg_namelen = addr_size;
+
+  test_sockets_msgapi_udp_send_recv_loop(s, &smsg, &rmsg);
+
+  /* Connect to self, allowing us to not pass message name */
+  ret = lwip_connect(s, (struct sockaddr*)&addr_storage, addr_size);
+  fail_unless(ret == 0);
+
+  smsg.msg_name = NULL;
+  smsg.msg_namelen = 0;
+
+  test_sockets_msgapi_udp_send_recv_loop(s, &smsg, &rmsg);
+
+  ret = lwip_close(s);
+  fail_unless(ret == 0);
+}
+
+#if LWIP_IPV4
+static void test_sockets_msgapi_cmsg(int domain)
+{
+  int s, ret, enable;
+  struct sockaddr_storage addr_storage;
+  socklen_t addr_size;
+  struct iovec iov;
+  struct msghdr msg;
+  struct cmsghdr *cmsg;
+  struct in_pktinfo *pktinfo;
+  u8_t rcv_buf[4];
+  u8_t snd_buf[4] = {0xDE, 0xAD, 0xBE, 0xEF};
+  u8_t cmsg_buf[CMSG_SPACE(sizeof(struct in_pktinfo))];
+
+  test_sockets_init_loopback_addr(domain, &addr_storage, &addr_size);
+
+  s = test_sockets_alloc_socket_nonblocking(domain, SOCK_DGRAM);
+  fail_unless(s >= 0);
+
+  ret = lwip_bind(s, (struct sockaddr*)&addr_storage, addr_size);
+  fail_unless(ret == 0);
+
+  /* Update addr with epehermal port */
+  ret = lwip_getsockname(s, (struct sockaddr*)&addr_storage, &addr_size);
+  fail_unless(ret == 0);
+
+  enable = 1;
+  ret = lwip_setsockopt(s, IPPROTO_IP, IP_PKTINFO, &enable, sizeof(enable));
+  fail_unless(ret == 0);
+
+  /* Receive full message, including control message */
+  iov.iov_base = rcv_buf;
+  iov.iov_len = sizeof(rcv_buf);
+  msg.msg_control = cmsg_buf;
+  msg.msg_controllen = sizeof(cmsg_buf);
+  msg.msg_flags = 0;
+  msg.msg_iov = &iov;
+  msg.msg_iovlen = 1;
+  msg.msg_name = NULL;
+  msg.msg_namelen = 0;
+
+  memset(rcv_buf, 0, sizeof(rcv_buf));
+  ret = lwip_sendto(s, snd_buf, sizeof(snd_buf), 0, (struct sockaddr*)&addr_storage, addr_size);
+  fail_unless(ret == sizeof(snd_buf));
+  
+  tcpip_thread_poll_one();
+
+  ret = lwip_recvmsg(s, &msg, 0);
+  fail_unless(ret == sizeof(rcv_buf));
+  fail_unless(!memcmp(rcv_buf, snd_buf, sizeof(rcv_buf)));
+  
+  /* Verify message header */
+  cmsg = CMSG_FIRSTHDR(&msg);
+  fail_unless(cmsg != NULL);
+  fail_unless(cmsg->cmsg_len > 0);
+  fail_unless(cmsg->cmsg_level == IPPROTO_IP);
+  fail_unless(cmsg->cmsg_type == IP_PKTINFO);
+
+  /* Verify message data */
+  pktinfo = (struct in_pktinfo*)CMSG_DATA(cmsg);
+  /* We only have loopback interface enabled */
+  fail_unless(pktinfo->ipi_ifindex == 1);
+  fail_unless(pktinfo->ipi_addr.s_addr == PP_HTONL(INADDR_LOOPBACK));
+
+  /* Verify there are no additional messages */
+  cmsg = CMSG_NXTHDR(&msg, cmsg);
+  fail_unless(cmsg == NULL);
+
+  /* Send datagram again, testing truncation */
+  memset(rcv_buf, 0, sizeof(rcv_buf));
+  ret = lwip_sendto(s, snd_buf, sizeof(snd_buf), 0, (struct sockaddr*)&addr_storage, addr_size);
+  fail_unless(ret == sizeof(snd_buf));
+
+  tcpip_thread_poll_one();
+
+  msg.msg_controllen = 1;
+  msg.msg_flags = 0;
+  ret = lwip_recvmsg(s, &msg, 0);
+  fail_unless(ret == sizeof(rcv_buf));
+  fail_unless(!memcmp(rcv_buf, snd_buf, sizeof(rcv_buf)));
+  /* Ensure truncation was returned */
+  fail_unless(msg.msg_flags & MSG_CTRUNC);
+  /* Ensure no control messages were returned */
+  fail_unless(msg.msg_controllen == 0);
+
+  ret = lwip_close(s);
+  fail_unless(ret == 0);
+}
+#endif /* LWIP_IPV4 */
+
+START_TEST(test_sockets_msgapis)
+{
+  LWIP_UNUSED_ARG(_i);
+#if LWIP_IPV4
+  test_sockets_msgapi_udp(AF_INET);
+  test_sockets_msgapi_tcp(AF_INET);
+  test_sockets_msgapi_cmsg(AF_INET);
+#endif
+#if LWIP_IPV6
+  test_sockets_msgapi_udp(AF_INET6);
+  test_sockets_msgapi_tcp(AF_INET6);
+#endif
+}
+END_TEST
+
+START_TEST(test_sockets_select)
+{
+#if LWIP_SOCKET_SELECT
+  int s;
+  int ret;
+  fd_set readset;
+  fd_set writeset;
+  fd_set errset;
+  struct timeval tv;
+
+  fail_unless(test_sockets_get_used_count() == 0);
+
+  s = lwip_socket(AF_INET, SOCK_STREAM, 0);
+  fail_unless(s >= 0);
+  fail_unless(test_sockets_get_used_count() == 0);
+
+  FD_ZERO(&readset);
+  FD_SET(s, &readset);
+  FD_ZERO(&writeset);
+  FD_SET(s, &writeset);
+  FD_ZERO(&errset);
+  FD_SET(s, &errset);
+
+  tv.tv_sec = tv.tv_usec = 0;
+  ret = lwip_select(s + 1, &readset, &writeset, &errset, &tv);
+  fail_unless(ret == 0);
+  fail_unless(test_sockets_get_used_count() == 0);
+
+  ret = lwip_close(s);
+  fail_unless(ret == 0);
+
+#endif
+  LWIP_UNUSED_ARG(_i);
+}
+END_TEST
+
+START_TEST(test_sockets_recv_after_rst)
+{
+  int sl, sact;
+  int spass = -1;
+  int ret;
+  struct sockaddr_in sa_listen;
+  const u16_t port = 1234;
+  int arg;
+  const char txbuf[] = "something";
+  char rxbuf[16];
+  struct lwip_sock *sact_sock;
+  int err;
+  LWIP_UNUSED_ARG(_i);
+
+  fail_unless(test_sockets_get_used_count() == 0);
+
+  memset(&sa_listen, 0, sizeof(sa_listen));
+  sa_listen.sin_family = AF_INET;
+  sa_listen.sin_port = PP_HTONS(port);
+  sa_listen.sin_addr.s_addr = PP_HTONL(INADDR_LOOPBACK);
+
+  /* set up the listener */
+  sl = lwip_socket(AF_INET, SOCK_STREAM, 0);
+  fail_unless(sl >= 0);
+  fail_unless(test_sockets_get_used_count() == 0);
+
+  ret = lwip_bind(sl, (struct sockaddr *)&sa_listen, sizeof(sa_listen));
+  fail_unless(ret == 0);
+  ret = lwip_listen(sl, 0);
+  fail_unless(ret == 0);
+
+  /* set up the client */
+  sact = lwip_socket(AF_INET, SOCK_STREAM, 0);
+  fail_unless(sact >= 0);
+  fail_unless(test_sockets_get_used_count() == 0);
+  /* set the client to nonblocking to simplify this test */
+  arg = 1;
+  ret = lwip_ioctl(sact, FIONBIO, &arg);
+  fail_unless(ret == 0);
+  /* connect */
+  do {
+    ret = lwip_connect(sact, (struct sockaddr *)&sa_listen, sizeof(sa_listen));
+    err = errno;
+    fail_unless((ret == 0) || (ret == -1));
+    if (ret != 0) {
+      if (err == EISCONN) {
+        /* Although this is not valid, use EISCONN as an indicator for successful connection.
+           This marks us as "connect phase is done". On error, we would either have a different
+           errno code or "send" fails later... -> good enough for this test. */
+        ret = 0;
+      } else {
+        fail_unless(err == EINPROGRESS);
+        if (err != EINPROGRESS) {
+          goto cleanup;
+        }
+        /* we're in progress: little side check: test for EALREADY */
+        ret = lwip_connect(sact, (struct sockaddr *)&sa_listen, sizeof(sa_listen));
+        err = errno;
+        fail_unless(ret == -1);
+        fail_unless(err == EALREADY);
+        if ((ret != -1) || (err != EALREADY)) {
+          goto cleanup;
+        }
+      }
+      tcpip_thread_poll_one();
+      tcpip_thread_poll_one();
+      tcpip_thread_poll_one();
+      tcpip_thread_poll_one();
+    }
+  } while (ret != 0);
+  fail_unless(ret == 0);
+
+  /* accept the server connection part */
+  spass = lwip_accept(sl, NULL, NULL);
+  fail_unless(spass >= 0);
+
+  /* write data from client */
+  ret = lwip_send(sact, txbuf, sizeof(txbuf), 0);
+  fail_unless(ret == sizeof(txbuf));
+
+  tcpip_thread_poll_one();
+  tcpip_thread_poll_one();
+
+  /* issue RST (This is a HACK, don't try this in your own app!) */
+  sact_sock = lwip_socket_dbg_get_socket(sact);
+  fail_unless(sact_sock != NULL);
+  if (sact_sock != NULL) {
+    struct netconn *sact_conn = sact_sock->conn;
+    fail_unless(sact_conn != NULL);
+    if (sact_conn != NULL) {
+      struct tcp_pcb *pcb = sact_conn->pcb.tcp;
+      fail_unless(pcb != NULL);
+      if (pcb != NULL) {
+        tcp_rst(pcb, pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
+                     pcb->local_port, pcb->remote_port);
+      }
+    }
+  }
+  tcpip_thread_poll_one();
+  tcpip_thread_poll_one();
+
+  /* expect to receive data first */
+  ret = lwip_recv(spass, rxbuf, sizeof(rxbuf), 0);
+  fail_unless(ret > 0);
+  tcpip_thread_poll_one();
+  tcpip_thread_poll_one();
+
+  /* expect to receive RST indication */
+  ret = lwip_recv(spass, rxbuf, sizeof(rxbuf), 0);
+  fail_unless(ret == -1);
+  err = errno;
+  fail_unless(err == ECONNRESET);
+  tcpip_thread_poll_one();
+  tcpip_thread_poll_one();
+
+  /* expect to receive ENOTCONN indication */
+  ret = lwip_recv(spass, rxbuf, sizeof(rxbuf), 0);
+  fail_unless(ret == -1);
+  err = errno;
+  fail_unless(err == ENOTCONN);
+  tcpip_thread_poll_one();
+  tcpip_thread_poll_one();
+
+  /* expect to receive ENOTCONN indication */
+  ret = lwip_recv(spass, rxbuf, sizeof(rxbuf), 0);
+  fail_unless(ret == -1);
+  err = errno;
+  fail_unless(err == ENOTCONN);
+  tcpip_thread_poll_one();
+  tcpip_thread_poll_one();
+
+cleanup:
+  ret = lwip_close(sl);
+  fail_unless(ret == 0);
+  ret = lwip_close(sact);
+  fail_unless(ret == 0);
+  if (spass >= 0) {
+    ret = lwip_close(spass);
+    fail_unless(ret == 0);
+  }
+}
+END_TEST
+
+/** Create the suite including all tests for this module */
+Suite *
+sockets_suite(void)
+{
+  testfunc tests[] = {
+    TESTFUNC(test_sockets_basics),
+    TESTFUNC(test_sockets_allfunctions_basic),
+    TESTFUNC(test_sockets_msgapis),
+    TESTFUNC(test_sockets_select),
+    TESTFUNC(test_sockets_recv_after_rst),
+  };
+  return create_suite("SOCKETS", tests, sizeof(tests)/sizeof(testfunc), sockets_setup, sockets_teardown);
+}
+
+#else /* LWIP_SOCKET */
+
+Suite *
+sockets_suite(void)
+{
+  return create_suite("SOCKETS", NULL, 0, NULL, NULL);
+}
+#endif /* LWIP_SOCKET */
diff --git a/test/unit/api/test_sockets.h b/test/unit/api/test_sockets.h
new file mode 100644
index 0000000..0abb7a3
--- /dev/null
+++ b/test/unit/api/test_sockets.h
@@ -0,0 +1,8 @@
+#ifndef LWIP_HDR_TEST_SOCKETS_H
+#define LWIP_HDR_TEST_SOCKETS_H
+
+#include "../lwip_check.h"
+
+Suite *sockets_suite(void);
+
+#endif
diff --git a/test/unit/arch/sys_arch.c b/test/unit/arch/sys_arch.c
new file mode 100644
index 0000000..cf826eb
--- /dev/null
+++ b/test/unit/arch/sys_arch.c
@@ -0,0 +1,371 @@
+/*
+ * 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
+ *
+ */
+
+
+#include <lwip/opt.h>
+#include <lwip/arch.h>
+#if !NO_SYS
+#include "sys_arch.h"
+#endif
+#include <lwip/stats.h>
+#include <lwip/debug.h>
+#include <lwip/sys.h>
+
+#include <string.h>
+
+u32_t lwip_sys_now;
+
+u32_t
+sys_jiffies(void)
+{
+  return lwip_sys_now;
+}
+
+u32_t
+sys_now(void)
+{
+  return lwip_sys_now;
+}
+
+void
+sys_init(void)
+{
+}
+
+#if !NO_SYS
+
+test_sys_arch_waiting_fn the_waiting_fn;
+
+void
+test_sys_arch_wait_callback(test_sys_arch_waiting_fn waiting_fn)
+{
+  the_waiting_fn = waiting_fn;
+}
+
+err_t
+sys_sem_new(sys_sem_t *sem, u8_t count)
+{
+  LWIP_ASSERT("sem != NULL", sem != NULL);
+  *sem = count + 1;
+  return ERR_OK;
+}
+
+void
+sys_sem_free(sys_sem_t *sem)
+{
+  LWIP_ASSERT("sem != NULL", sem != NULL);
+  *sem = 0;
+}
+
+void
+sys_sem_set_invalid(sys_sem_t *sem)
+{
+  LWIP_ASSERT("sem != NULL", sem != NULL);
+  *sem = 0;
+}
+
+/* semaphores are 1-based because RAM is initialized as 0, which would be valid */
+u32_t
+sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
+{
+  u32_t ret = 0;
+  LWIP_ASSERT("sem != NULL", sem != NULL);
+  LWIP_ASSERT("*sem > 0", *sem > 0);
+  if (*sem == 1) {
+    /* need to wait */
+    if(!timeout)
+    {
+      /* wait infinite */
+      LWIP_ASSERT("cannot wait without waiting callback", the_waiting_fn != NULL);
+      do {
+        int expectSomething = the_waiting_fn(sem, NULL);
+        LWIP_ASSERT("*sem > 0", *sem > 0);
+        LWIP_ASSERT("expecting a semaphore count but it's 0", !expectSomething || (*sem > 1));
+        ret++;
+        if (ret == SYS_ARCH_TIMEOUT) {
+          ret--;
+        }
+      } while(*sem == 1);
+    }
+    else
+    {
+      if (the_waiting_fn) {
+        int expectSomething = the_waiting_fn(sem, NULL);
+        LWIP_ASSERT("expecting a semaphore count but it's 0", !expectSomething || (*sem > 1));
+      }
+      LWIP_ASSERT("*sem > 0", *sem > 0);
+      if (*sem == 1) {
+        return SYS_ARCH_TIMEOUT;
+      }
+      ret = 1;
+    }
+  }
+  LWIP_ASSERT("*sem > 0", *sem > 0);
+  (*sem)--;
+  LWIP_ASSERT("*sem > 0", *sem > 0);
+  /* return the time we waited for the sem */
+  return ret;
+}
+
+void
+sys_sem_signal(sys_sem_t *sem)
+{
+  LWIP_ASSERT("sem != NULL", sem != NULL);
+  LWIP_ASSERT("*sem > 0", *sem > 0);
+  (*sem)++;
+  LWIP_ASSERT("*sem > 0", *sem > 0);
+}
+
+err_t
+sys_mutex_new(sys_mutex_t *mutex)
+{
+  LWIP_ASSERT("mutex != NULL", mutex != NULL);
+  *mutex = 1; /* 1 allocated */
+  return ERR_OK;
+}
+
+void
+sys_mutex_free(sys_mutex_t *mutex)
+{
+  /* parameter check */
+  LWIP_ASSERT("mutex != NULL", mutex != NULL);
+  LWIP_ASSERT("*mutex >= 1", *mutex >= 1);
+  *mutex = 0;
+}
+
+void
+sys_mutex_set_invalid(sys_mutex_t *mutex)
+{
+  LWIP_ASSERT("mutex != NULL", mutex != NULL);
+  *mutex = 0;
+}
+
+void
+sys_mutex_lock(sys_mutex_t *mutex)
+{
+  /* nothing to do, no multithreading supported */
+  LWIP_ASSERT("mutex != NULL", mutex != NULL);
+  /* check that the mutext is valid and unlocked (no nested locking) */
+  LWIP_ASSERT("*mutex >= 1", *mutex == 1);
+  /* we count up just to check the correct pairing of lock/unlock */
+  (*mutex)++;
+  LWIP_ASSERT("*mutex >= 1", *mutex >= 1);
+}
+
+void
+sys_mutex_unlock(sys_mutex_t *mutex)
+{
+  /* nothing to do, no multithreading supported */
+  LWIP_ASSERT("mutex != NULL", mutex != NULL);
+  LWIP_ASSERT("*mutex >= 1", *mutex >= 1);
+  /* we count down just to check the correct pairing of lock/unlock */
+  (*mutex)--;
+  LWIP_ASSERT("*mutex >= 1", *mutex >= 1);
+}
+
+
+sys_thread_t
+sys_thread_new(const char *name, lwip_thread_fn function, void *arg, int stacksize, int prio)
+{
+  LWIP_UNUSED_ARG(name);
+  LWIP_UNUSED_ARG(function);
+  LWIP_UNUSED_ARG(arg);
+  LWIP_UNUSED_ARG(stacksize);
+  LWIP_UNUSED_ARG(prio);
+  /* threads not supported */
+  return 0;
+}
+
+err_t
+sys_mbox_new(sys_mbox_t *mbox, int size)
+{
+  int mboxsize = size;
+  LWIP_ASSERT("mbox != NULL", mbox != NULL);
+  LWIP_ASSERT("size >= 0", size >= 0);
+  if (size == 0) {
+    mboxsize = 1024;
+  }
+  mbox->head = mbox->tail = 0;
+  mbox->sem = mbox; /* just point to something for sys_mbox_valid() */
+  mbox->q_mem = (void**)malloc(sizeof(void*)*mboxsize);
+  mbox->size = mboxsize;
+  mbox->used = 0;
+
+  memset(mbox->q_mem, 0, sizeof(void*)*mboxsize);
+  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 == mbox", mbox->sem == mbox);
+  LWIP_ASSERT("mbox->q_mem != NULL", mbox->q_mem != NULL);
+  mbox->sem = NULL;
+  free(mbox->q_mem);
+  mbox->q_mem = NULL;
+}
+
+void
+sys_mbox_set_invalid(sys_mbox_t *mbox)
+{
+  LWIP_ASSERT("mbox != NULL", mbox != NULL);
+  LWIP_ASSERT("mbox->q_mem == NULL", mbox->q_mem == NULL);
+  mbox->sem = NULL;
+  mbox->q_mem = NULL;
+}
+
+void
+sys_mbox_post(sys_mbox_t *q, void *msg)
+{
+  LWIP_ASSERT("q != SYS_MBOX_NULL", q != SYS_MBOX_NULL);
+  LWIP_ASSERT("q->sem == q", q->sem == q);
+  LWIP_ASSERT("q->q_mem != NULL", q->q_mem != NULL);
+  LWIP_ASSERT("q->used >= 0", q->used >= 0);
+  LWIP_ASSERT("q->size > 0", q->size > 0);
+
+  LWIP_ASSERT("mbox already full", q->used < q->size);
+
+  q->q_mem[q->head] = msg;
+  q->head++;
+  if (q->head >= (unsigned int)q->size) {
+    q->head = 0;
+  }
+  LWIP_ASSERT("mbox is full!", q->head != q->tail);
+  q->used++;
+}
+
+err_t
+sys_mbox_trypost(sys_mbox_t *q, void *msg)
+{
+  LWIP_ASSERT("q != SYS_MBOX_NULL", q != SYS_MBOX_NULL);
+  LWIP_ASSERT("q->sem == q", q->sem == q);
+  LWIP_ASSERT("q->q_mem != NULL", q->q_mem != NULL);
+  LWIP_ASSERT("q->used >= 0", q->used >= 0);
+  LWIP_ASSERT("q->size > 0", q->size > 0);
+  LWIP_ASSERT("q->used <= q->size", q->used <= q->size);
+
+  if (q->used == q->size) {
+    return ERR_MEM;
+  }
+  sys_mbox_post(q, msg);
+  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)
+{
+  u32_t ret = 0;
+  u32_t ret2;
+  LWIP_ASSERT("q != SYS_MBOX_NULL", q != SYS_MBOX_NULL);
+  LWIP_ASSERT("q->sem == q", q->sem == q);
+  LWIP_ASSERT("q->q_mem != NULL", q->q_mem != NULL);
+  LWIP_ASSERT("q->used >= 0", q->used >= 0);
+  LWIP_ASSERT("q->size > 0", q->size > 0);
+
+  if (q->used == 0) {
+    /* need to wait */
+    /* need to wait */
+    if(!timeout)
+    {
+      /* wait infinite */
+      LWIP_ASSERT("cannot wait without waiting callback", the_waiting_fn != NULL);
+      do {
+        int expectSomething = the_waiting_fn(NULL, q);
+        LWIP_ASSERT("q->used >= 0", q->used >= 0);
+        LWIP_ASSERT("expecting item available but it's 0", !expectSomething || (q->used > 0));
+        ret++;
+        if (ret == SYS_ARCH_TIMEOUT) {
+          ret--;
+        }
+      } while(q->used == 0);
+    }
+    else
+    {
+      if (the_waiting_fn) {
+        int expectSomething = the_waiting_fn(NULL, q);
+        LWIP_ASSERT("expecting item available count but it's 0", !expectSomething || (q->used > 0));
+      }
+      LWIP_ASSERT("q->used >= 0", q->used >= 0);
+      if (q->used == 0) {
+        if(msg) {
+          *msg = NULL;
+        }
+        return SYS_ARCH_TIMEOUT;
+      }
+      ret = 1;
+    }
+  }
+  LWIP_ASSERT("q->used > 0", q->used > 0);
+  ret2 = sys_arch_mbox_tryfetch(q, msg);
+  LWIP_ASSERT("got no message", ret2 == 0);
+  return ret;
+}
+
+u32_t
+sys_arch_mbox_tryfetch(sys_mbox_t *q, void **msg)
+{
+  LWIP_ASSERT("q != SYS_MBOX_NULL", q != SYS_MBOX_NULL);
+  LWIP_ASSERT("q->sem == q", q->sem == q);
+  LWIP_ASSERT("q->q_mem != NULL", q->q_mem != NULL);
+  LWIP_ASSERT("q->used >= 0", q->used >= 0);
+  LWIP_ASSERT("q->size > 0", q->size > 0);
+
+  if (!q->used) {
+    return SYS_ARCH_TIMEOUT;
+  }
+  if(msg) {
+    *msg = q->q_mem[q->tail];
+  }
+
+  q->tail++;
+  if (q->tail >= (unsigned int)q->size) {
+    q->tail = 0;
+  }
+  q->used--;
+  LWIP_ASSERT("q->used >= 0", q->used >= 0);
+  return 0;
+}
+
+#if LWIP_NETCONN_SEM_PER_THREAD
+#error LWIP_NETCONN_SEM_PER_THREAD==1 not supported
+#endif /* LWIP_NETCONN_SEM_PER_THREAD */
+
+#endif /* !NO_SYS */
diff --git a/test/unit/arch/sys_arch.h b/test/unit/arch/sys_arch.h
new file mode 100644
index 0000000..331c2f2
--- /dev/null
+++ b/test/unit/arch/sys_arch.h
@@ -0,0 +1,72 @@
+/*
+ * 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
+ *
+ */
+#ifndef LWIP_HDR_TEST_SYS_ARCH_H
+#define LWIP_HDR_TEST_SYS_ARCH_H
+
+typedef int sys_sem_t;
+#define sys_sem_valid(sema) ((sema) != NULL)
+
+typedef int sys_mutex_t;
+#define sys_mutex_valid(mutex) (((mutex) != NULL)
+
+struct lwip_mbox {
+  void* sem;
+  void** q_mem;
+  unsigned int head, tail;
+  int size;
+  int used;
+};
+typedef struct lwip_mbox sys_mbox_t;
+#define SYS_MBOX_NULL NULL
+#define sys_mbox_valid(mbox) ((mbox != NULL) && ((mbox)->sem != NULL)  && ((mbox)->sem != (void*)-1))
+#define sys_mbox_valid_val(mbox) (((mbox).sem != NULL)  && ((mbox).sem != (void*)-1))
+
+/* DWORD (thread id) is used for sys_thread_t but we won't include windows.h */
+typedef u32_t sys_thread_t;
+
+#define SYS_ARCH_DECL_PROTECT(lev)
+#define SYS_ARCH_PROTECT(lev)
+#define SYS_ARCH_UNPROTECT(lev)
+
+/* to implement doing something while blocking on an mbox or semaphore:
+ * pass a function to test_sys_arch_wait_callback() that returns
+ * '0' if waiting again and
+ * '1' if now there should be something to do (used for asserting)
+ */
+typedef int (*test_sys_arch_waiting_fn)(sys_sem_t* wait_sem, sys_mbox_t* wait_mbox);
+void test_sys_arch_wait_callback(test_sys_arch_waiting_fn waiting_fn);
+
+/* current time */
+extern u32_t lwip_sys_now;
+
+#endif /* LWIP_HDR_TEST_SYS_ARCH_H */
+
diff --git a/test/unit/core/test_def.c b/test/unit/core/test_def.c
new file mode 100644
index 0000000..0ae2e9c
--- /dev/null
+++ b/test/unit/core/test_def.c
@@ -0,0 +1,84 @@
+#include "test_def.h"
+
+#include "lwip/def.h"
+
+#define MAGIC_UNTOUCHED_BYTE  0x7a
+#define TEST_BUFSIZE          32
+#define GUARD_SIZE            4
+
+/* Setups/teardown functions */
+
+static void
+def_setup(void)
+{
+}
+
+static void
+def_teardown(void)
+{
+}
+
+static void
+def_check_range_untouched(const char *buf, size_t len)
+{
+  size_t i;
+
+  for (i = 0; i < len; i++) {
+    fail_unless(buf[i] == (char)MAGIC_UNTOUCHED_BYTE);
+  }
+}
+
+static void test_def_itoa(int number, const char *expected)
+{
+  char buf[TEST_BUFSIZE];
+  char *test_buf = &buf[GUARD_SIZE];
+
+  size_t exp_len = strlen(expected);
+  fail_unless(exp_len + 4 < (TEST_BUFSIZE - (2 * GUARD_SIZE)));
+
+  memset(buf, MAGIC_UNTOUCHED_BYTE, sizeof(buf));
+  lwip_itoa(test_buf, exp_len + 1, number);
+  def_check_range_untouched(buf, GUARD_SIZE);
+  fail_unless(test_buf[exp_len] == 0);
+  fail_unless(!memcmp(test_buf, expected, exp_len));
+  def_check_range_untouched(&test_buf[exp_len + 1], TEST_BUFSIZE - GUARD_SIZE - exp_len - 1);
+
+  /* check with too small buffer */
+  memset(buf, MAGIC_UNTOUCHED_BYTE, sizeof(buf));
+  lwip_itoa(test_buf, exp_len, number);
+  def_check_range_untouched(buf, GUARD_SIZE);
+  def_check_range_untouched(&test_buf[exp_len + 1], TEST_BUFSIZE - GUARD_SIZE - exp_len - 1);
+
+  /* check with too large buffer */
+  memset(buf, MAGIC_UNTOUCHED_BYTE, sizeof(buf));
+  lwip_itoa(test_buf, exp_len + 4, number);
+  def_check_range_untouched(buf, GUARD_SIZE);
+  fail_unless(test_buf[exp_len] == 0);
+  fail_unless(!memcmp(test_buf, expected, exp_len));
+  def_check_range_untouched(&test_buf[exp_len + 4], TEST_BUFSIZE - GUARD_SIZE - exp_len - 4);
+}
+
+START_TEST(test_def_lwip_itoa)
+{
+  LWIP_UNUSED_ARG(_i);
+
+  test_def_itoa(0, "0");
+  test_def_itoa(1, "1");
+  test_def_itoa(-1, "-1");
+  test_def_itoa(15, "15");
+  test_def_itoa(-15, "-15");
+  test_def_itoa(156, "156");
+  test_def_itoa(1192, "1192");
+  test_def_itoa(-156, "-156");
+}
+END_TEST
+
+/** Create the suite including all tests for this module */
+Suite *
+def_suite(void)
+{
+  testfunc tests[] = {
+    TESTFUNC(test_def_lwip_itoa)
+  };
+  return create_suite("DEF", tests, sizeof(tests)/sizeof(testfunc), def_setup, def_teardown);
+}
diff --git a/test/unit/core/test_def.h b/test/unit/core/test_def.h
new file mode 100644
index 0000000..7316051
--- /dev/null
+++ b/test/unit/core/test_def.h
@@ -0,0 +1,8 @@
+#ifndef LWIP_HDR_TEST_DEF_H
+#define LWIP_HDR_TEST_DEF_H
+
+#include "../lwip_check.h"
+
+Suite *def_suite(void);
+
+#endif
diff --git a/test/unit/core/test_mem.c b/test/unit/core/test_mem.c
index 66b4877..2aeb20c 100644
--- a/test/unit/core/test_mem.c
+++ b/test/unit/core/test_mem.c
@@ -15,11 +15,13 @@
 static void
 mem_setup(void)
 {
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
 }
 
 static void
 mem_teardown(void)
 {
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
 }
 
 
@@ -109,13 +111,114 @@
 }
 END_TEST
 
+START_TEST(test_mem_invalid_free)
+{
+  u8_t *ptr, *ptr_low, *ptr_high;
+  LWIP_UNUSED_ARG(_i);
+
+  fail_unless(lwip_stats.mem.used == 0);
+  fail_unless(lwip_stats.mem.illegal == 0);
+
+  ptr = (u8_t *)mem_malloc(1);
+  fail_unless(ptr != NULL);
+  fail_unless(lwip_stats.mem.used != 0);
+
+  ptr_low = ptr - 0x10;
+  mem_free(ptr_low);
+  fail_unless(lwip_stats.mem.illegal == 1);
+  lwip_stats.mem.illegal = 0;
+
+  ptr_high = ptr + (MEM_SIZE * 2);
+  mem_free(ptr_high);
+  fail_unless(lwip_stats.mem.illegal == 1);
+  lwip_stats.mem.illegal = 0;
+
+  mem_free(ptr);
+  fail_unless(lwip_stats.mem.illegal == 0);
+  fail_unless(lwip_stats.mem.used == 0);
+}
+END_TEST
+
+START_TEST(test_mem_double_free)
+{
+  u8_t *ptr1b, *ptr1, *ptr2, *ptr3;
+  LWIP_UNUSED_ARG(_i);
+
+  fail_unless(lwip_stats.mem.used == 0);
+  fail_unless(lwip_stats.mem.illegal == 0);
+
+  ptr1 = (u8_t *)mem_malloc(1);
+  fail_unless(ptr1 != NULL);
+  fail_unless(lwip_stats.mem.used != 0);
+
+  ptr2 = (u8_t *)mem_malloc(1);
+  fail_unless(ptr2 != NULL);
+  fail_unless(lwip_stats.mem.used != 0);
+
+  ptr3 = (u8_t *)mem_malloc(1);
+  fail_unless(ptr3 != NULL);
+  fail_unless(lwip_stats.mem.used != 0);
+
+  /* free the middle mem */
+  mem_free(ptr2);
+  fail_unless(lwip_stats.mem.illegal == 0);
+
+  /* double-free of middle mem: should fail */
+  mem_free(ptr2);
+  fail_unless(lwip_stats.mem.illegal == 1);
+  lwip_stats.mem.illegal = 0;
+
+  /* free upper memory and try again */
+  mem_free(ptr3);
+  fail_unless(lwip_stats.mem.illegal == 0);
+
+  mem_free(ptr2);
+  fail_unless(lwip_stats.mem.illegal == 1);
+  lwip_stats.mem.illegal = 0;
+
+  /* free lower memory and try again */
+  mem_free(ptr1);
+  fail_unless(lwip_stats.mem.illegal == 0);
+  fail_unless(lwip_stats.mem.used == 0);
+
+  mem_free(ptr2);
+  fail_unless(lwip_stats.mem.illegal == 1);
+  fail_unless(lwip_stats.mem.used == 0);
+  lwip_stats.mem.illegal = 0;
+
+  /* reallocate lowest memory, now overlapping already freed ptr2 */
+#ifndef MIN_SIZE
+#define MIN_SIZE 12
+#endif
+  ptr1b = (u8_t *)mem_malloc(MIN_SIZE * 2);
+  fail_unless(ptr1b != NULL);
+  fail_unless(lwip_stats.mem.used != 0);
+
+  mem_free(ptr2);
+  fail_unless(lwip_stats.mem.illegal == 1);
+  lwip_stats.mem.illegal = 0;
+
+  memset(ptr1b, 1, MIN_SIZE * 2);
+
+  mem_free(ptr2);
+  fail_unless(lwip_stats.mem.illegal == 1);
+  lwip_stats.mem.illegal = 0;
+
+  mem_free(ptr1b);
+  fail_unless(lwip_stats.mem.illegal == 0);
+  fail_unless(lwip_stats.mem.used == 0);
+}
+END_TEST
+
 /** Create the suite including all tests for this module */
 Suite *
 mem_suite(void)
 {
   testfunc tests[] = {
     TESTFUNC(test_mem_one),
-    TESTFUNC(test_mem_random)
+    TESTFUNC(test_mem_random),
+    TESTFUNC(test_mem_invalid_free),
+    TESTFUNC(test_mem_double_free)
   };
   return create_suite("MEM", tests, sizeof(tests)/sizeof(testfunc), mem_setup, mem_teardown);
 }
diff --git a/test/unit/core/test_netif.c b/test/unit/core/test_netif.c
new file mode 100644
index 0000000..2f68725
--- /dev/null
+++ b/test/unit/core/test_netif.c
@@ -0,0 +1,227 @@
+#include "test_netif.h"
+
+#include "lwip/netif.h"
+#include "lwip/stats.h"
+#include "lwip/etharp.h"
+#include "netif/ethernet.h"
+
+#if !LWIP_NETIF_EXT_STATUS_CALLBACK
+#error "This tests needs LWIP_NETIF_EXT_STATUS_CALLBACK enabled"
+#endif
+
+struct netif net_test;
+
+
+/* Setups/teardown functions */
+
+static void
+netif_setup(void)
+{
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
+}
+
+static void
+netif_teardown(void)
+{
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
+}
+
+/* test helper functions */
+
+static err_t
+testif_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] = 'c';
+  netif->name[1] = 'h';
+  netif->output = etharp_output;
+  netif->linkoutput = testif_tx_func;
+  netif->mtu = 1500;
+  netif->hwaddr_len = 6;
+  netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP | NETIF_FLAG_MLD6;
+
+  netif->hwaddr[0] = 0x02;
+  netif->hwaddr[1] = 0x03;
+  netif->hwaddr[2] = 0x04;
+  netif->hwaddr[3] = 0x05;
+  netif->hwaddr[4] = 0x06;
+  netif->hwaddr[5] = 0x07;
+
+  return ERR_OK;
+}
+
+#define MAX_NSC_REASON_IDX 10
+static netif_nsc_reason_t expected_reasons;
+static int callback_ctr;
+
+static int dummy_active;
+
+static void
+test_netif_ext_callback_dummy(struct netif* netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t* args)
+{
+  LWIP_UNUSED_ARG(netif);
+  LWIP_UNUSED_ARG(reason);
+  LWIP_UNUSED_ARG(args);
+
+  fail_unless(dummy_active);
+}
+
+static void
+test_netif_ext_callback(struct netif* netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t* args)
+{
+  LWIP_UNUSED_ARG(args); /* @todo */
+  callback_ctr++;
+
+  fail_unless(netif == &net_test);
+
+  fail_unless(expected_reasons == reason);
+}
+
+/* Test functions */
+
+NETIF_DECLARE_EXT_CALLBACK(netif_callback_1)
+NETIF_DECLARE_EXT_CALLBACK(netif_callback_2)
+NETIF_DECLARE_EXT_CALLBACK(netif_callback_3)
+
+START_TEST(test_netif_extcallbacks)
+{
+  ip4_addr_t addr;
+  ip4_addr_t netmask;
+  ip4_addr_t gw;
+  LWIP_UNUSED_ARG(_i);
+
+  IP4_ADDR(&addr, 0, 0, 0, 0);
+  IP4_ADDR(&netmask, 0, 0, 0, 0);
+  IP4_ADDR(&gw, 0, 0, 0, 0);
+
+  netif_add_ext_callback(&netif_callback_3, test_netif_ext_callback_dummy);
+  netif_add_ext_callback(&netif_callback_2, test_netif_ext_callback);
+  netif_add_ext_callback(&netif_callback_1, test_netif_ext_callback_dummy);
+
+  dummy_active = 1;
+
+  /* positive tests: check that single events come as expected */
+
+  expected_reasons = LWIP_NSC_NETIF_ADDED;
+  callback_ctr = 0;
+  netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);
+  fail_unless(callback_ctr == 1);
+
+  expected_reasons = LWIP_NSC_LINK_CHANGED;
+  callback_ctr = 0;
+  netif_set_link_up(&net_test);
+  fail_unless(callback_ctr == 1);
+
+  expected_reasons = LWIP_NSC_STATUS_CHANGED;
+  callback_ctr = 0;
+  netif_set_up(&net_test);
+  fail_unless(callback_ctr == 1);
+
+  IP4_ADDR(&addr, 1, 2, 3, 4);
+  expected_reasons = LWIP_NSC_IPV4_ADDRESS_CHANGED;
+  callback_ctr = 0;
+  netif_set_ipaddr(&net_test, &addr);
+  fail_unless(callback_ctr == 1);
+
+  IP4_ADDR(&netmask, 255, 255, 255, 0);
+  expected_reasons = LWIP_NSC_IPV4_NETMASK_CHANGED;
+  callback_ctr = 0;
+  netif_set_netmask(&net_test, &netmask);
+  fail_unless(callback_ctr == 1);
+
+  IP4_ADDR(&gw, 1, 2, 3, 254);
+  expected_reasons = LWIP_NSC_IPV4_GATEWAY_CHANGED;
+  callback_ctr = 0;
+  netif_set_gw(&net_test, &gw);
+  fail_unless(callback_ctr == 1);
+
+  IP4_ADDR(&addr, 0, 0, 0, 0);
+  expected_reasons = LWIP_NSC_IPV4_ADDRESS_CHANGED;
+  callback_ctr = 0;
+  netif_set_ipaddr(&net_test, &addr);
+  fail_unless(callback_ctr == 1);
+
+  IP4_ADDR(&netmask, 0, 0, 0, 0);
+  expected_reasons = LWIP_NSC_IPV4_NETMASK_CHANGED;
+  callback_ctr = 0;
+  netif_set_netmask(&net_test, &netmask);
+  fail_unless(callback_ctr == 1);
+
+  IP4_ADDR(&gw, 0, 0, 0, 0);
+  expected_reasons = LWIP_NSC_IPV4_GATEWAY_CHANGED;
+  callback_ctr = 0;
+  netif_set_gw(&net_test, &gw);
+  fail_unless(callback_ctr == 1);
+
+  /* check for multi-events (only one combined callback expected) */
+
+  IP4_ADDR(&addr, 1, 2, 3, 4);
+  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);
+  callback_ctr = 0;
+  netif_set_addr(&net_test, &addr, &netmask, &gw);
+  fail_unless(callback_ctr == 1);
+
+  /* check that for no-change, no callback is expected */
+  expected_reasons = LWIP_NSC_NONE;
+  callback_ctr = 0;
+  netif_set_ipaddr(&net_test, &addr);
+  fail_unless(callback_ctr == 0);
+
+  netif_set_netmask(&net_test, &netmask);
+  callback_ctr = 0;
+  fail_unless(callback_ctr == 0);
+
+  callback_ctr = 0;
+  netif_set_gw(&net_test, &gw);
+  fail_unless(callback_ctr == 0);
+
+  callback_ctr = 0;
+  netif_set_addr(&net_test, &addr, &netmask, &gw);
+  fail_unless(callback_ctr == 0);
+
+  /* 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);
+  callback_ctr = 0;
+  netif_set_addr(&net_test, &addr, &netmask, &gw);
+  fail_unless(callback_ctr == 1);
+
+  expected_reasons = LWIP_NSC_STATUS_CHANGED;
+  callback_ctr = 0;
+  netif_set_down(&net_test);
+  fail_unless(callback_ctr == 1);
+
+  expected_reasons = LWIP_NSC_NETIF_REMOVED;
+  callback_ctr = 0;
+  netif_remove(&net_test);
+  fail_unless(callback_ctr == 1);
+
+  expected_reasons = LWIP_NSC_NONE;
+
+  netif_remove_ext_callback(&netif_callback_2);
+  netif_remove_ext_callback(&netif_callback_3);
+  netif_remove_ext_callback(&netif_callback_1);
+  dummy_active = 0;
+}
+END_TEST
+
+
+/** Create the suite including all tests for this module */
+Suite *
+netif_suite(void)
+{
+  testfunc tests[] = {
+    TESTFUNC(test_netif_extcallbacks)
+  };
+  return create_suite("NETIF", tests, sizeof(tests)/sizeof(testfunc), netif_setup, netif_teardown);
+}
diff --git a/test/unit/core/test_netif.h b/test/unit/core/test_netif.h
new file mode 100644
index 0000000..8f2b6b4
--- /dev/null
+++ b/test/unit/core/test_netif.h
@@ -0,0 +1,8 @@
+#ifndef LWIP_HDR_TEST_NETIF_H
+#define LWIP_HDR_TEST_NETIF_H
+
+#include "../lwip_check.h"
+
+Suite *netif_suite(void);
+
+#endif
diff --git a/test/unit/core/test_pbuf.c b/test/unit/core/test_pbuf.c
index 9315c4c..57087d2 100644
--- a/test/unit/core/test_pbuf.c
+++ b/test/unit/core/test_pbuf.c
@@ -18,11 +18,13 @@
 static void
 pbuf_setup(void)
 {
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
 }
 
 static void
 pbuf_teardown(void)
 {
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
 }
 
 
@@ -37,6 +39,36 @@
 static u8_t testbuf_3a[TESTBUFSIZE_3];
 
 /* Test functions */
+START_TEST(test_pbuf_alloc_zero_pbufs)
+{
+  struct pbuf *p;
+  LWIP_UNUSED_ARG(_i);
+
+  p = pbuf_alloc(PBUF_RAW, 0, PBUF_ROM);
+  fail_unless(p != NULL);
+  if (p != NULL) {
+    pbuf_free(p);
+  }
+
+  p = pbuf_alloc(PBUF_RAW, 0, PBUF_RAM);
+  fail_unless(p != NULL);
+  if (p != NULL) {
+    pbuf_free(p);
+  }
+
+  p = pbuf_alloc(PBUF_RAW, 0, PBUF_REF);
+  fail_unless(p != NULL);
+  if (p != NULL) {
+    pbuf_free(p);
+  }
+
+  p = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL);
+  fail_unless(p != NULL);
+  if (p != NULL) {
+    pbuf_free(p);
+  }
+}
+END_TEST
 
 /** Call pbuf_copy on a pbuf with zero length */
 START_TEST(test_pbuf_copy_zero_pbuf)
@@ -129,12 +161,9 @@
   pbuf_copy_partial(p1, testbuf_1a, TESTBUFSIZE_1, 0);
   pbuf_copy_partial(rest2, testbuf_2a, TESTBUFSIZE_2, 0);
   pbuf_copy_partial(rest3, testbuf_3a, TESTBUFSIZE_3, 0);
-  for(i = 0; i < TESTBUFSIZE_1; i++)
-    fail_unless(testbuf_1[i] == testbuf_1a[i]);
-  for(i = 0; i < TESTBUFSIZE_2; i++)
-    fail_unless(testbuf_2[i] == testbuf_2a[i]);
-  for(i = 0; i < TESTBUFSIZE_3; i++)
-    fail_unless(testbuf_3[i] == testbuf_3a[i]);
+  fail_if(memcmp(testbuf_1, testbuf_1a, TESTBUFSIZE_1));
+  fail_if(memcmp(testbuf_2, testbuf_2a, TESTBUFSIZE_2));
+  fail_if(memcmp(testbuf_3, testbuf_3a, TESTBUFSIZE_3));
 
   pbuf_free(p1);
   pbuf_free(rest2);
@@ -192,6 +221,7 @@
     fail_unless(out[i] == testdata[i],
       "Bad data at pos %d, was %02X, expected %02X", p->len+i, out[i], testdata[i]);
   }
+  pbuf_free(p);
 }
 END_TEST
 
@@ -221,6 +251,7 @@
   getdata = pbuf_get_at(p, p->len);
   fail_unless(*out == getdata,
     "pbuf_get_at() returned bad data at pos %d, was %02X, expected %02X", p->len, getdata, *out);
+  pbuf_free(p);
 }
 END_TEST
 
@@ -229,6 +260,7 @@
 pbuf_suite(void)
 {
   testfunc tests[] = {
+    TESTFUNC(test_pbuf_alloc_zero_pbufs),
     TESTFUNC(test_pbuf_copy_zero_pbuf),
     TESTFUNC(test_pbuf_split_64k_on_small_pbufs),
     TESTFUNC(test_pbuf_queueing_bigger_than_64k),
diff --git a/test/unit/core/test_timers.c b/test/unit/core/test_timers.c
new file mode 100644
index 0000000..820b718
--- /dev/null
+++ b/test/unit/core/test_timers.c
@@ -0,0 +1,233 @@
+#include "test_timers.h"
+
+#include "lwip/def.h"
+#include "lwip/timeouts.h"
+#include "arch/sys_arch.h"
+
+/* Setups/teardown functions */
+
+static struct sys_timeo* old_list_head;
+
+static void
+timers_setup(void)
+{
+  struct sys_timeo** list_head = sys_timeouts_get_next_timeout();
+  old_list_head = *list_head;
+  *list_head = NULL;
+}
+
+static void
+timers_teardown(void)
+{
+  struct sys_timeo** list_head = sys_timeouts_get_next_timeout();
+  *list_head = old_list_head;
+  lwip_sys_now = 0;
+}
+
+static int fired[3];
+static void
+dummy_handler(void* arg)
+{
+  int index = LWIP_PTR_NUMERIC_CAST(int, arg);
+  fired[index] = 1;
+}
+
+#define HANDLER_EXECUTION_TIME 5
+static int cyclic_fired;
+static void
+dummy_cyclic_handler(void)
+{
+   cyclic_fired = 1;
+   lwip_sys_now += HANDLER_EXECUTION_TIME;
+}
+
+struct lwip_cyclic_timer test_cyclic = {10, dummy_cyclic_handler};
+
+static void
+do_test_cyclic_timers(u32_t offset)
+{
+  struct sys_timeo** list_head = sys_timeouts_get_next_timeout();
+
+  /* verify normal timer expiration */
+  lwip_sys_now = offset + 0;
+  sys_timeout(test_cyclic.interval_ms, lwip_cyclic_timer, &test_cyclic);
+
+  cyclic_fired = 0;
+  sys_check_timeouts();
+  fail_unless(cyclic_fired == 0);
+
+  lwip_sys_now = offset + test_cyclic.interval_ms;
+  sys_check_timeouts();
+  fail_unless(cyclic_fired == 1);
+
+  fail_unless((*list_head)->time == (u32_t)(lwip_sys_now + test_cyclic.interval_ms - HANDLER_EXECUTION_TIME));
+  
+  sys_untimeout(lwip_cyclic_timer, &test_cyclic);
+
+
+  /* verify "overload" - next cyclic timer execution is already overdue twice */
+  lwip_sys_now = offset + 0;
+  sys_timeout(test_cyclic.interval_ms, lwip_cyclic_timer, &test_cyclic);
+
+  cyclic_fired = 0;
+  sys_check_timeouts();
+  fail_unless(cyclic_fired == 0);
+
+  lwip_sys_now = offset + 2*test_cyclic.interval_ms;
+  sys_check_timeouts();
+  fail_unless(cyclic_fired == 1);
+
+  fail_unless((*list_head)->time == (u32_t)(lwip_sys_now + test_cyclic.interval_ms));
+}
+
+START_TEST(test_cyclic_timers)
+{
+  LWIP_UNUSED_ARG(_i);
+
+  /* check without u32_t wraparound */
+  do_test_cyclic_timers(0);
+
+  /* check with u32_t wraparound */
+  do_test_cyclic_timers(0xfffffff0);
+}
+END_TEST
+
+/* reproduce bug #52748: the bug in timeouts.c */
+START_TEST(test_bug52748)
+{
+  LWIP_UNUSED_ARG(_i);
+
+  memset(&fired, 0, sizeof(fired));
+
+  lwip_sys_now = 50;
+  sys_timeout(20, dummy_handler, LWIP_PTR_NUMERIC_CAST(void*, 0));
+  sys_timeout( 5, dummy_handler, LWIP_PTR_NUMERIC_CAST(void*, 2));
+
+  lwip_sys_now = 55;
+  sys_check_timeouts();
+  fail_unless(fired[0] == 0);
+  fail_unless(fired[1] == 0);
+  fail_unless(fired[2] == 1);
+
+  lwip_sys_now = 60;
+  sys_timeout(10, dummy_handler, LWIP_PTR_NUMERIC_CAST(void*, 1));
+  sys_check_timeouts();
+  fail_unless(fired[0] == 0);
+  fail_unless(fired[1] == 0);
+  fail_unless(fired[2] == 1);
+
+  lwip_sys_now = 70;
+  sys_check_timeouts();
+  fail_unless(fired[0] == 1);
+  fail_unless(fired[1] == 1);
+  fail_unless(fired[2] == 1);
+}
+END_TEST
+
+static void
+do_test_timers(u32_t offset)
+{
+  struct sys_timeo** list_head = sys_timeouts_get_next_timeout();
+  
+  lwip_sys_now = offset + 0;
+
+  sys_timeout(10, dummy_handler, LWIP_PTR_NUMERIC_CAST(void*, 0));
+  fail_unless(sys_timeouts_sleeptime() == 10);
+  sys_timeout(20, dummy_handler, LWIP_PTR_NUMERIC_CAST(void*, 1));
+  fail_unless(sys_timeouts_sleeptime() == 10);
+  sys_timeout( 5, dummy_handler, LWIP_PTR_NUMERIC_CAST(void*, 2));
+  fail_unless(sys_timeouts_sleeptime() == 5);
+
+  /* linked list correctly sorted? */
+  fail_unless((*list_head)->time             == (u32_t)(lwip_sys_now + 5));
+  fail_unless((*list_head)->next->time       == (u32_t)(lwip_sys_now + 10));
+  fail_unless((*list_head)->next->next->time == (u32_t)(lwip_sys_now + 20));
+  
+  /* check timers expire in correct order */
+  memset(&fired, 0, sizeof(fired));
+
+  lwip_sys_now += 4;
+  sys_check_timeouts();
+  fail_unless(fired[2] == 0);
+
+  lwip_sys_now += 1;
+  sys_check_timeouts();
+  fail_unless(fired[2] == 1);
+
+  lwip_sys_now += 4;
+  sys_check_timeouts();
+  fail_unless(fired[0] == 0);
+
+  lwip_sys_now += 1;
+  sys_check_timeouts();
+  fail_unless(fired[0] == 1);
+
+  lwip_sys_now += 9;
+  sys_check_timeouts();
+  fail_unless(fired[1] == 0);
+
+  lwip_sys_now += 1;
+  sys_check_timeouts();
+  fail_unless(fired[1] == 1);
+
+  sys_untimeout(dummy_handler, LWIP_PTR_NUMERIC_CAST(void*, 0));
+  sys_untimeout(dummy_handler, LWIP_PTR_NUMERIC_CAST(void*, 1));
+  sys_untimeout(dummy_handler, LWIP_PTR_NUMERIC_CAST(void*, 2));
+}
+
+START_TEST(test_timers)
+{
+  LWIP_UNUSED_ARG(_i);
+
+  /* check without u32_t wraparound */
+  do_test_timers(0);
+
+  /* check with u32_t wraparound */
+  do_test_timers(0xfffffff0);
+}
+END_TEST
+
+START_TEST(test_long_timer)
+{
+  LWIP_UNUSED_ARG(_i);
+
+  memset(&fired, 0, sizeof(fired));
+  lwip_sys_now = 0;
+
+  sys_timeout(LWIP_UINT32_MAX / 4, dummy_handler, LWIP_PTR_NUMERIC_CAST(void*, 0));
+  fail_unless(sys_timeouts_sleeptime() == LWIP_UINT32_MAX / 4);
+
+  sys_check_timeouts();
+  fail_unless(fired[0] == 0);
+
+  lwip_sys_now += LWIP_UINT32_MAX / 8;
+
+  sys_check_timeouts();
+  fail_unless(fired[0] == 0);
+
+  lwip_sys_now += LWIP_UINT32_MAX / 8;
+
+  sys_check_timeouts();
+  fail_unless(fired[0] == 0);
+
+  lwip_sys_now += 1;
+
+  sys_check_timeouts();
+  fail_unless(fired[0] == 1);
+
+  sys_untimeout(dummy_handler, LWIP_PTR_NUMERIC_CAST(void*, 0));
+}
+END_TEST
+
+/** Create the suite including all tests for this module */
+Suite *
+timers_suite(void)
+{
+  testfunc tests[] = {
+    TESTFUNC(test_bug52748),
+    TESTFUNC(test_cyclic_timers),
+    TESTFUNC(test_timers),
+    TESTFUNC(test_long_timer),
+  };
+  return create_suite("TIMERS", tests, LWIP_ARRAYSIZE(tests), timers_setup, timers_teardown);
+}
diff --git a/test/unit/core/test_timers.h b/test/unit/core/test_timers.h
new file mode 100644
index 0000000..b16ab75
--- /dev/null
+++ b/test/unit/core/test_timers.h
@@ -0,0 +1,8 @@
+#ifndef LWIP_HDR_TEST_TIMERS_H
+#define LWIP_HDR_TEST_TIMERS_H
+
+#include "../lwip_check.h"
+
+Suite *timers_suite(void);
+
+#endif
diff --git a/test/unit/dhcp/test_dhcp.c b/test/unit/dhcp/test_dhcp.c
index 47aaa08..4cefa33 100644
--- a/test/unit/dhcp/test_dhcp.c
+++ b/test/unit/dhcp/test_dhcp.c
@@ -121,7 +121,8 @@
   TEST_LWIP_DHCP_NAK,
   TEST_LWIP_DHCP_RELAY,
   TEST_LWIP_DHCP_NAK_NO_ENDMARKER,
-  TEST_LWIP_DHCP_INVALID_OVERLOAD
+  TEST_LWIP_DHCP_INVALID_OVERLOAD,
+  TEST_NONE
 } tcase;
 
 static int debug = 0;
@@ -188,10 +189,12 @@
 static void dhcp_setup(void)
 {
   txpacket = 0;
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
 }
 
 static void dhcp_teardown(void)
 {
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
 }
 
 static void check_pkt(struct pbuf *p, u32_t pos, const u8_t *mem, u32_t len)
@@ -445,6 +448,7 @@
   IP4_ADDR(&gw, 0, 0, 0, 0);
 
   netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);
+  netif_set_link_up(&net_test);
   netif_set_up(&net_test);
 
   dhcp_start(&net_test);
@@ -490,6 +494,9 @@
   fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));
   fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));
 
+  tcase = TEST_NONE;
+  dhcp_stop(&net_test);
+  dhcp_cleanup(&net_test);
   netif_remove(&net_test);
 }
 END_TEST
@@ -514,6 +521,7 @@
   IP4_ADDR(&gw, 0, 0, 0, 0);
 
   netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);
+  netif_set_link_up(&net_test);
   netif_set_up(&net_test);
 
   dhcp_start(&net_test);
@@ -552,6 +560,9 @@
 
   fail_unless(txpacket == 4); /* DHCP nak sent */
 
+  tcase = TEST_NONE;
+  dhcp_stop(&net_test);
+  dhcp_cleanup(&net_test);
   netif_remove(&net_test);
 }
 END_TEST
@@ -732,6 +743,7 @@
   IP4_ADDR(&gw, 0, 0, 0, 0);
 
   netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);
+  netif_set_link_up(&net_test);
   netif_set_up(&net_test);
 
   dhcp_start(&net_test);
@@ -796,6 +808,9 @@
 
   fail_unless(txpacket == 7, "txpacket = %d", txpacket);
 
+  tcase = TEST_NONE;
+  dhcp_stop(&net_test);
+  dhcp_cleanup(&net_test);
   netif_remove(&net_test);
 
 }
@@ -860,6 +875,9 @@
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
   };
   u32_t xid;
+  struct dhcp* dhcp;
+  u8_t tries;
+  u16_t request_timeout;
   LWIP_UNUSED_ARG(_i);
 
   tcase = TEST_LWIP_DHCP_NAK_NO_ENDMARKER;
@@ -870,12 +888,14 @@
   IP4_ADDR(&gw, 0, 0, 0, 0);
 
   netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);
+  netif_set_link_up(&net_test);
   netif_set_up(&net_test);
 
   dhcp_start(&net_test);
+  dhcp = netif_dhcp_data(&net_test);
 
   fail_unless(txpacket == 1); /* DHCP discover sent */
-  xid = netif_dhcp_data(&net_test)->xid; /* Write bad xid, not using htonl! */
+  xid = dhcp->xid; /* Write bad xid, not using htonl! */
   memcpy(&dhcp_offer[46], &xid, 4);
   send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer));
 
@@ -885,20 +905,29 @@
   fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));
 
   fail_unless(txpacket == 1); /* Nothing more sent */
-  xid = htonl(netif_dhcp_data(&net_test)->xid);
+  xid = htonl(dhcp->xid);
   memcpy(&dhcp_offer[46], &xid, 4); /* insert correct transaction id */
   send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer));
-  
-  fail_unless(netif_dhcp_data(&net_test)->state == DHCP_STATE_REQUESTING);
+
+  fail_unless(dhcp->state == DHCP_STATE_REQUESTING);
 
   fail_unless(txpacket == 2); /* No more sent */
-  xid = htonl(netif_dhcp_data(&net_test)->xid); /* xid updated */
+  xid = htonl(dhcp->xid); /* xid updated */
   memcpy(&dhcp_nack_no_endmarker[46], &xid, 4); /* insert transaction id */
+  tries = dhcp->tries;
+  request_timeout = dhcp->request_timeout;
   send_pkt(&net_test, dhcp_nack_no_endmarker, sizeof(dhcp_nack_no_endmarker));
 
-  /* NAK should put us in another state for a while, no other way detecting it */
-  fail_unless(netif_dhcp_data(&net_test)->state != DHCP_STATE_REQUESTING);
+  /* NAK should be ignored */
+  fail_unless(dhcp->state == DHCP_STATE_REQUESTING);
+  fail_unless(txpacket == 2); /* No more sent */
+  fail_unless(xid == htonl(dhcp->xid));
+  fail_unless(tries == dhcp->tries);
+  fail_unless(request_timeout == dhcp->request_timeout);
 
+  tcase = TEST_NONE;
+  dhcp_stop(&net_test);
+  dhcp_cleanup(&net_test);
   netif_remove(&net_test);
 }
 END_TEST
@@ -966,6 +995,7 @@
   IP4_ADDR(&gw, 0, 0, 0, 0);
 
   netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);
+  netif_set_link_up(&net_test);
   netif_set_up(&net_test);
 
   dhcp_start(&net_test);
@@ -1005,6 +1035,9 @@
   fail_unless(txpacket == 2); /* No more sent */
   xid = htonl(netif_dhcp_data(&net_test)->xid); /* xid updated */
 
+  tcase = TEST_NONE;
+  dhcp_stop(&net_test);
+  dhcp_cleanup(&net_test);
   netif_remove(&net_test);
 }
 END_TEST
diff --git a/test/unit/etharp/test_etharp.c b/test/unit/etharp/test_etharp.c
index 59d73b9..8eb506c 100644
--- a/test/unit/etharp/test_etharp.c
+++ b/test/unit/etharp/test_etharp.c
@@ -4,6 +4,7 @@
 #include "lwip/etharp.h"
 #include "netif/ethernet.h"
 #include "lwip/stats.h"
+#include "lwip/prot/iana.h"
 
 #if !LWIP_STATS || !UDP_STATS || !MEMP_STATS || !ETHARP_STATS
 #error "This tests needs UDP-, MEMP- and ETHARP-statistics enabled"
@@ -89,7 +90,7 @@
   ethhdr->src = test_ethaddr2;
   ethhdr->type = htons(ETHTYPE_ARP);
 
-  etharphdr->hwtype = htons(/*HWTYPE_ETHERNET*/ 1);
+  etharphdr->hwtype = htons(LWIP_IANA_HWTYPE_ETHERNET);
   etharphdr->proto = htons(ETHTYPE_IP);
   etharphdr->hwlen = ETHARP_HWADDR_LEN;
   etharphdr->protolen = sizeof(ip4_addr_t);
@@ -119,6 +120,7 @@
 {
   etharp_remove_all();
   default_netif_add();
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
 }
 
 static void
@@ -126,6 +128,7 @@
 {
   etharp_remove_all();
   default_netif_remove();
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
 }
 
 
@@ -136,7 +139,7 @@
 #if ETHARP_SUPPORT_STATIC_ENTRIES
   err_t err;
 #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
-  s8_t idx;
+  ssize_t idx;
   const ip4_addr_t *unused_ipaddr;
   struct eth_addr *unused_ethaddr;
   struct udp_pcb* pcb;
diff --git a/test/unit/ip4/test_ip4.c b/test/unit/ip4/test_ip4.c
index e0e82d8..a5a7fd9 100644
--- a/test/unit/ip4/test_ip4.c
+++ b/test/unit/ip4/test_ip4.c
@@ -6,6 +6,8 @@
 #include "lwip/prot/ip.h"
 #include "lwip/prot/ip4.h"
 
+#include "lwip/tcpip.h"
+
 #if !LWIP_IPV4 || !IP_REASSEMBLY || !MIB2_STATS || !IPFRAG_STATS
 #error "This tests needs LWIP_IPV4, IP_REASSEMBLY; MIB2- and IPFRAG-statistics enabled"
 #endif
@@ -55,6 +57,7 @@
 static void
 ip4_setup(void)
 {
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
 }
 
 static void
@@ -65,6 +68,9 @@
     netif_list->loop_first = NULL;
   }
   netif_list->loop_last = NULL;
+  /* poll until all memory is released... */
+  tcpip_thread_poll_one();
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
 }
 
 
diff --git a/test/unit/ip6/test_ip6.c b/test/unit/ip6/test_ip6.c
new file mode 100644
index 0000000..f337136
--- /dev/null
+++ b/test/unit/ip6/test_ip6.c
@@ -0,0 +1,321 @@
+#include "test_ip6.h"
+
+#include "lwip/ethip6.h"
+#include "lwip/ip6.h"
+#include "lwip/inet_chksum.h"
+#include "lwip/nd6.h"
+#include "lwip/stats.h"
+#include "lwip/prot/ethernet.h"
+#include "lwip/prot/ip.h"
+#include "lwip/prot/ip6.h"
+
+#include "lwip/tcpip.h"
+
+#if LWIP_IPV6 /* allow to build the unit tests without IPv6 support */
+
+static struct netif test_netif6;
+static int linkoutput_ctr;
+
+static err_t
+default_netif_linkoutput(struct netif *netif, struct pbuf *p)
+{
+  fail_unless(netif == &test_netif6);
+  fail_unless(p != NULL);
+  linkoutput_ctr++;
+  return ERR_OK;
+}
+
+static err_t
+default_netif_init(struct netif *netif)
+{
+  fail_unless(netif != NULL);
+  netif->linkoutput = default_netif_linkoutput;
+  netif->output_ip6 = ethip6_output;
+  netif->mtu = 1500;
+  netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHERNET | NETIF_FLAG_MLD6;
+  netif->hwaddr_len = ETH_HWADDR_LEN;
+  return ERR_OK;
+}
+
+static void
+default_netif_add(void)
+{
+  struct netif *n;
+  fail_unless(netif_default == NULL);
+  n = netif_add_noaddr(&test_netif6, NULL, default_netif_init, NULL);
+  fail_unless(n == &test_netif6);
+  netif_set_default(&test_netif6);
+}
+
+static void
+default_netif_remove(void)
+{
+  fail_unless(netif_default == &test_netif6);
+  netif_remove(&test_netif6);
+}
+
+static void
+ip6_test_handle_timers(int count)
+{
+  int i;
+  for (i = 0; i < count; i++) {
+    nd6_tmr();
+  }
+}
+
+/* Setups/teardown functions */
+
+static void
+ip6_setup(void)
+{
+  default_netif_add();
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
+}
+
+static void
+ip6_teardown(void)
+{
+  if (netif_list->loop_first != NULL) {
+    pbuf_free(netif_list->loop_first);
+    netif_list->loop_first = NULL;
+  }
+  netif_list->loop_last = NULL;
+  /* poll until all memory is released... */
+  tcpip_thread_poll_one();
+  default_netif_remove();
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
+}
+
+
+/* Test functions */
+
+static void
+test_ip6_ll_addr_iter(int expected_ctr1, int expected_ctr2)
+{
+  fail_unless(linkoutput_ctr == 0);
+
+  /* test that nothing is sent with link uo but netif down */
+  netif_set_link_up(&test_netif6);
+  ip6_test_handle_timers(500);
+  fail_unless(linkoutput_ctr == 0);
+  netif_set_link_down(&test_netif6);
+  fail_unless(linkoutput_ctr == 0);
+
+  /* test that nothing is sent with link down but netif up */
+  netif_set_up(&test_netif6);
+  ip6_test_handle_timers(500);
+  fail_unless(linkoutput_ctr == 0);
+  netif_set_down(&test_netif6);
+  fail_unless(linkoutput_ctr == 0);
+
+  /* test what is sent with link up + netif up */
+  netif_set_link_up(&test_netif6);
+  netif_set_up(&test_netif6);
+  ip6_test_handle_timers(500);
+  fail_unless(linkoutput_ctr == expected_ctr1);
+  netif_set_down(&test_netif6);
+  netif_set_link_down(&test_netif6);
+  fail_unless(linkoutput_ctr == expected_ctr1);
+  linkoutput_ctr = 0;
+
+  netif_set_up(&test_netif6);
+  netif_set_link_up(&test_netif6);
+  ip6_test_handle_timers(500);
+  fail_unless(linkoutput_ctr == expected_ctr2);
+  netif_set_link_down(&test_netif6);
+  netif_set_down(&test_netif6);
+  fail_unless(linkoutput_ctr == expected_ctr2);
+  linkoutput_ctr = 0;
+}
+
+START_TEST(test_ip6_ll_addr)
+{
+  LWIP_UNUSED_ARG(_i);
+
+  /* test without link-local address */
+  test_ip6_ll_addr_iter(0, 0);
+
+  /* test with link-local address */
+  netif_create_ip6_linklocal_address(&test_netif6, 1);
+  test_ip6_ll_addr_iter(3 + LWIP_IPV6_DUP_DETECT_ATTEMPTS + LWIP_IPV6_MLD, 3);
+}
+END_TEST
+
+START_TEST(test_ip6_aton_ipv4mapped)
+{
+  int ret;
+  ip_addr_t addr;
+  ip6_addr_t addr6;
+  const ip_addr_t addr_expected = IPADDR6_INIT_HOST(0, 0, 0xFFFF, 0xD4CC65D2);
+  const char *full_ipv6_addr = "0:0:0:0:0:FFFF:D4CC:65D2";
+  const char *shortened_ipv6_addr = "::FFFF:D4CC:65D2";
+  const char *full_ipv4_mapped_addr = "0:0:0:0:0:FFFF:212.204.101.210";
+  const char *shortened_ipv4_mapped_addr = "::FFFF:212.204.101.210";
+  const char *bogus_ipv4_mapped_addr = "::FFFF:212.204.101.2101";
+  LWIP_UNUSED_ARG(_i);
+
+  /* check IPv6 representation */
+  memset(&addr6, 0, sizeof(addr6));
+  ret = ip6addr_aton(full_ipv6_addr, &addr6);
+  fail_unless(ret == 1);
+  fail_unless(memcmp(&addr6, &addr_expected, 16) == 0);
+  memset(&addr, 0, sizeof(addr));
+  ret = ipaddr_aton(full_ipv6_addr, &addr);
+  fail_unless(ret == 1);
+  fail_unless(memcmp(&addr, &addr_expected, 16) == 0);
+
+  /* check shortened IPv6 representation */
+  memset(&addr6, 0, sizeof(addr6));
+  ret = ip6addr_aton(shortened_ipv6_addr, &addr6);
+  fail_unless(ret == 1);
+  fail_unless(memcmp(&addr6, &addr_expected, 16) == 0);
+  memset(&addr, 0, sizeof(addr));
+  ret = ipaddr_aton(shortened_ipv6_addr, &addr);
+  fail_unless(ret == 1);
+  fail_unless(memcmp(&addr, &addr_expected, 16) == 0);
+
+  /* checked shortened mixed representation */
+  memset(&addr6, 0, sizeof(addr6));
+  ret = ip6addr_aton(shortened_ipv4_mapped_addr, &addr6);
+  fail_unless(ret == 1);
+  fail_unless(memcmp(&addr6, &addr_expected, 16) == 0);
+  memset(&addr, 0, sizeof(addr));
+  ret = ipaddr_aton(shortened_ipv4_mapped_addr, &addr);
+  fail_unless(ret == 1);
+  fail_unless(memcmp(&addr, &addr_expected, 16) == 0);
+
+  /* checked mixed representation */
+  memset(&addr6, 0, sizeof(addr6));
+  ret = ip6addr_aton(full_ipv4_mapped_addr, &addr6);
+  fail_unless(ret == 1);
+  fail_unless(memcmp(&addr6, &addr_expected, 16) == 0);
+  memset(&addr, 0, sizeof(addr));
+  ret = ipaddr_aton(full_ipv4_mapped_addr, &addr);
+  fail_unless(ret == 1);
+  fail_unless(memcmp(&addr, &addr_expected, 16) == 0);
+
+  /* checked bogus mixed representation */
+  memset(&addr6, 0, sizeof(addr6));
+  ret = ip6addr_aton(bogus_ipv4_mapped_addr, &addr6);
+  fail_unless(ret == 0);
+  memset(&addr, 0, sizeof(addr));
+  ret = ipaddr_aton(bogus_ipv4_mapped_addr, &addr);
+  fail_unless(ret == 0);
+}
+END_TEST
+
+START_TEST(test_ip6_ntoa_ipv4mapped)
+{
+  const ip_addr_t addr = IPADDR6_INIT_HOST(0, 0, 0xFFFF, 0xD4CC65D2);
+  char buf[128];
+  char *str;
+  LWIP_UNUSED_ARG(_i);
+
+  str = ip6addr_ntoa_r(ip_2_ip6(&addr), buf, sizeof(buf));
+  fail_unless(str == buf);
+  fail_unless(!strcmp(str, "::FFFF:212.204.101.210"));
+}
+END_TEST
+
+struct test_addr_and_str {
+  ip_addr_t addr;
+  const char *str;
+};
+
+START_TEST(test_ip6_ntoa)
+{
+  struct test_addr_and_str tests[] = {
+    {IPADDR6_INIT_HOST(0xfe800000, 0x00000000, 0xb2a1a2ff, 0xfea3a4a5), "FE80::B2A1:A2FF:FEA3:A4A5"}, /* test shortened zeros */
+    {IPADDR6_INIT_HOST(0xfe800000, 0xff000000, 0xb2a1a2ff, 0xfea3a4a5), "FE80:0:FF00:0:B2A1:A2FF:FEA3:A4A5"}, /* don't omit single zero blocks */
+    {IPADDR6_INIT_HOST(0xfe800000, 0xff000000, 0xb2000000, 0x0000a4a5), "FE80:0:FF00:0:B200::A4A5"}, /* omit longest zero block */
+  };
+  char buf[128];
+  char *str;
+  size_t i;
+  LWIP_UNUSED_ARG(_i);
+
+  for (i = 0; i < LWIP_ARRAYSIZE(tests); i++) {
+    str = ip6addr_ntoa_r(ip_2_ip6(&tests[i].addr), buf, sizeof(buf));
+    fail_unless(str == buf);
+    fail_unless(!strcmp(str, tests[i].str));
+  }
+}
+END_TEST
+
+START_TEST(test_ip6_lladdr)
+{
+  u8_t zeros[128];
+  const u8_t test_mac_addr[6] = {0xb0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5};
+  const u32_t expected_ip6_addr_1[4] = {PP_HTONL(0xfe800000), 0, PP_HTONL(0xb2a1a2ff), PP_HTONL(0xfea3a4a5)};
+  const u32_t expected_ip6_addr_2[4] = {PP_HTONL(0xfe800000), 0, PP_HTONL(0x0000b0a1), PP_HTONL(0xa2a3a4a5)};
+  LWIP_UNUSED_ARG(_i);
+  memset(zeros, 0, sizeof(zeros));
+
+  fail_unless(test_netif6.hwaddr_len == 6);
+  fail_unless(!memcmp(test_netif6.hwaddr, zeros, 6));
+
+  fail_unless(test_netif6.ip6_addr_state[0] == 0);
+  fail_unless(!memcmp(netif_ip6_addr(&test_netif6, 0), zeros, sizeof(ip6_addr_t)));
+
+  /* set specific mac addr */
+  memcpy(test_netif6.hwaddr, test_mac_addr, 6);
+
+  /* create link-local addr based on mac (EUI-48) */
+  netif_create_ip6_linklocal_address(&test_netif6, 1);
+  fail_unless(IP_IS_V6(&test_netif6.ip6_addr[0]));
+  fail_unless(!memcmp(&netif_ip6_addr(&test_netif6, 0)->addr, expected_ip6_addr_1, 16));
+#if LWIP_IPV6_SCOPES
+  fail_unless(netif_ip6_addr(&test_netif6, 0)->zone == (test_netif6.num + 1));
+#endif
+  /* reset address */
+  memset(&test_netif6.ip6_addr[0], 0, sizeof(ip6_addr_t));
+  test_netif6.ip6_addr_state[0] = 0;
+
+  /* create link-local addr based interface ID */
+  netif_create_ip6_linklocal_address(&test_netif6, 0);
+  fail_unless(IP_IS_V6(&test_netif6.ip6_addr[0]));
+  fail_unless(!memcmp(&netif_ip6_addr(&test_netif6, 0)->addr, expected_ip6_addr_2, 16));
+#if LWIP_IPV6_SCOPES
+  fail_unless(netif_ip6_addr(&test_netif6, 0)->zone == (test_netif6.num + 1));
+#endif
+  /* reset address */
+  memset(&test_netif6.ip6_addr[0], 0, sizeof(ip6_addr_t));
+  test_netif6.ip6_addr_state[0] = 0;
+
+  /* reset mac address */
+  memset(&test_netif6.hwaddr, 0, sizeof(test_netif6.hwaddr));
+}
+END_TEST
+
+/** Create the suite including all tests for this module */
+Suite *
+ip6_suite(void)
+{
+  testfunc tests[] = {
+    TESTFUNC(test_ip6_ll_addr),
+    TESTFUNC(test_ip6_aton_ipv4mapped),
+    TESTFUNC(test_ip6_ntoa_ipv4mapped),
+    TESTFUNC(test_ip6_ntoa),
+    TESTFUNC(test_ip6_lladdr)
+  };
+  return create_suite("IPv6", tests, sizeof(tests)/sizeof(testfunc), ip6_setup, ip6_teardown);
+}
+
+#else /* LWIP_IPV6 */
+
+/* allow to build the unit tests without IPv6 support */
+START_TEST(test_ip6_dummy)
+{
+  LWIP_UNUSED_ARG(_i);
+}
+END_TEST
+
+Suite *
+ip6_suite(void)
+{
+  testfunc tests[] = {
+    TESTFUNC(test_ip6_dummy),
+  };
+  return create_suite("IPv6", tests, sizeof(tests)/sizeof(testfunc), NULL, NULL);
+}
+#endif /* LWIP_IPV6 */
diff --git a/test/unit/ip6/test_ip6.h b/test/unit/ip6/test_ip6.h
new file mode 100644
index 0000000..a09345b
--- /dev/null
+++ b/test/unit/ip6/test_ip6.h
@@ -0,0 +1,8 @@
+#ifndef LWIP_HDR_TEST_IP6_H
+#define LWIP_HDR_TEST_IP6_H
+
+#include "../lwip_check.h"
+
+Suite* ip6_suite(void);
+
+#endif
diff --git a/test/unit/lwip_check.h b/test/unit/lwip_check.h
index 0c218d1..522a9c3 100644
--- a/test/unit/lwip_check.h
+++ b/test/unit/lwip_check.h
@@ -34,4 +34,9 @@
 int lwip_unittests_run(void)
 #endif
 
+/* helper functions */
+#define SKIP_POOL(x) (1 << x)
+#define SKIP_HEAP    (1 << MEMP_MAX)
+void lwip_check_ensure_no_alloc(unsigned int skip);
+
 #endif /* LWIP_HDR_LWIP_CHECK_H */
diff --git a/test/unit/lwip_unittests.c b/test/unit/lwip_unittests.c
index 76be870..497a44b 100644
--- a/test/unit/lwip_unittests.c
+++ b/test/unit/lwip_unittests.c
@@ -1,16 +1,25 @@
 #include "lwip_check.h"
 
 #include "ip4/test_ip4.h"
+#include "ip6/test_ip6.h"
 #include "udp/test_udp.h"
 #include "tcp/test_tcp.h"
 #include "tcp/test_tcp_oos.h"
+#include "core/test_def.h"
 #include "core/test_mem.h"
+#include "core/test_netif.h"
 #include "core/test_pbuf.h"
+#include "core/test_timers.h"
 #include "etharp/test_etharp.h"
 #include "dhcp/test_dhcp.h"
 #include "mdns/test_mdns.h"
+#include "mqtt/test_mqtt.h"
+#include "api/test_sockets.h"
 
 #include "lwip/init.h"
+#if !NO_SYS
+#include "lwip/tcpip.h"
+#endif
 
 Suite* create_suite(const char* name, testfunc *tests, size_t num_tests, SFun setup, SFun teardown)
 {
@@ -28,6 +37,21 @@
   return s;
 }
 
+void lwip_check_ensure_no_alloc(unsigned int skip)
+{
+  int i;
+  unsigned int mask;
+
+  if (!(skip & SKIP_HEAP)) {
+    fail_unless(lwip_stats.mem.used == 0);
+  }
+  for (i = 0, mask = 1; i < MEMP_MAX; i++, mask <<= 1) {
+    if (!(skip & mask)) {
+      fail_unless(lwip_stats.memp[i]->used == 0);
+    }
+  }
+}
+
 #ifdef LWIP_UNITTESTS_LIB
 int lwip_unittests_run(void)
 #else
@@ -39,21 +63,32 @@
   size_t i;
   suite_getter_fn* suites[] = {
     ip4_suite,
+    ip6_suite,
     udp_suite,
     tcp_suite,
     tcp_oos_suite,
+    def_suite,
     mem_suite,
+    netif_suite,
     pbuf_suite,
+    timers_suite,
     etharp_suite,
     dhcp_suite,
-    mdns_suite
+    mdns_suite,
+    mqtt_suite,
+    sockets_suite
   };
   size_t num = sizeof(suites)/sizeof(void*);
   LWIP_ASSERT("No suites defined", num > 0);
 
+#if NO_SYS
   lwip_init();
+#else
+  tcpip_init(NULL, NULL);
+#endif
 
   sr = srunner_create((suites[0])());
+  srunner_set_xml(sr, "lwip_unittests.xml");
   for(i = 1; i < num; i++) {
     srunner_add_suite(sr, ((suite_getter_fn*)suites[i])());
   }
diff --git a/test/unit/lwipopts.h b/test/unit/lwipopts.h
index fc2ca5d..c00ace1 100644
--- a/test/unit/lwipopts.h
+++ b/test/unit/lwipopts.h
@@ -32,11 +32,23 @@
 #ifndef LWIP_HDR_LWIPOPTS_H
 #define LWIP_HDR_LWIPOPTS_H
 
-/* Prevent having to link sys_arch.c (we don't test the API layers in unit tests) */
-#define NO_SYS                          1
+#define LWIP_TESTMODE                   1
+
+#define LWIP_IPV6                       1
+
+#define LWIP_CHECKSUM_ON_COPY           1
+#define TCP_CHECKSUM_ON_COPY_SANITY_CHECK 1
+#define TCP_CHECKSUM_ON_COPY_SANITY_CHECK_FAIL(printfmsg) LWIP_ASSERT("TCP_CHECKSUM_ON_COPY_SANITY_CHECK_FAIL", 0)
+
+/* We link to special sys_arch.c (for basic non-waiting API layers unit tests) */
+#define NO_SYS                          0
 #define SYS_LIGHTWEIGHT_PROT            0
-#define LWIP_NETCONN                    0
-#define LWIP_SOCKET                     0
+#define LWIP_NETCONN                    !NO_SYS
+#define LWIP_SOCKET                     !NO_SYS
+#define LWIP_NETCONN_FULLDUPLEX         LWIP_SOCKET
+#define LWIP_NETBUF_RECVINFO            1
+#define LWIP_HAVE_LOOPIF                1
+#define TCPIP_THREAD_TEST
 
 /* Enable DHCP to test it, disable UDP checksum to easier inject packets */
 #define LWIP_DHCP                       1
@@ -59,7 +71,15 @@
 /* Minimal changes to opt.h required for etharp unit tests: */
 #define ETHARP_SUPPORT_STATIC_ENTRIES   1
 
+#define MEMP_NUM_SYS_TIMEOUT            (LWIP_NUM_SYS_TIMEOUT_INTERNAL + 8)
+
 /* MIB2 stats are required to check IPv4 reassembly results */
 #define MIB2_STATS                      1
 
+/* netif tests want to test this, so enable: */
+#define LWIP_NETIF_EXT_STATUS_CALLBACK  1
+
+/* Check lwip_stats.mem.illegal instead of asserting */
+#define LWIP_MEM_ILLEGAL_FREE(msg)      /* to nothing */
+
 #endif /* LWIP_HDR_LWIPOPTS_H */
diff --git a/test/unit/mdns/test_mdns.c b/test/unit/mdns/test_mdns.c
index ca9be64..6385163 100644
--- a/test/unit/mdns/test_mdns.c
+++ b/test/unit/mdns/test_mdns.c
@@ -45,8 +45,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
   offset = mdns_readname(p, 0, &domain);
   pbuf_free(p);
   fail_unless(offset == sizeof(data));
@@ -64,8 +64,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
   offset = mdns_readname(p, 0, &domain);
   pbuf_free(p);
   fail_unless(offset == sizeof(data));
@@ -83,8 +83,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
   offset = mdns_readname(p, 0, &domain);
   pbuf_free(p);
   fail_unless(offset == MDNS_READNAME_ERROR);
@@ -108,8 +108,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
   offset = mdns_readname(p, 0, &domain);
   pbuf_free(p);
   fail_unless(offset == MDNS_READNAME_ERROR);
@@ -164,8 +164,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
   offset = mdns_readname(p, 0, &domain);
   pbuf_free(p);
   fail_unless(offset == MDNS_READNAME_ERROR);
@@ -189,8 +189,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
   offset = mdns_readname(p, 20, &domain);
   pbuf_free(p);
   fail_unless(offset == sizeof(data));
@@ -218,8 +218,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
   offset = mdns_readname(p, 0x18, &domain);
   pbuf_free(p);
   fail_unless(offset == sizeof(data));
@@ -252,8 +252,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
   offset = mdns_readname(p, 0x30, &domain);
   pbuf_free(p);
   fail_unless(offset == sizeof(data));
@@ -278,8 +278,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
   offset = mdns_readname(p, 0, &domain);
   pbuf_free(p);
   fail_unless(offset == 13);
@@ -300,8 +300,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
   offset = mdns_readname(p, 0, &domain);
   pbuf_free(p);
   fail_unless(offset == MDNS_READNAME_ERROR);
@@ -319,8 +319,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
   offset = mdns_readname(p, 0, &domain);
   pbuf_free(p);
   fail_unless(offset == MDNS_READNAME_ERROR);
@@ -339,8 +339,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
   offset = mdns_readname(p, 10, &domain);
   pbuf_free(p);
   fail_unless(offset == MDNS_READNAME_ERROR);
@@ -359,8 +359,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
   offset = mdns_readname(p, 10, &domain);
   pbuf_free(p);
   fail_unless(offset == MDNS_READNAME_ERROR);
@@ -603,8 +603,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
 
   memset(&domain, 0, sizeof(domain));
   res = mdns_domain_add_label(&domain, "foobar", 6);
@@ -638,8 +638,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
 
   memset(&domain, 0, sizeof(domain));
   res = mdns_domain_add_label(&domain, "foobar", 6);
@@ -675,8 +675,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
 
   memset(&domain, 0, sizeof(domain));
   res = mdns_domain_add_label(&domain, "foobar", 6);
@@ -710,8 +710,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
 
   memset(&domain, 0, sizeof(domain));
   res = mdns_domain_add_label(&domain, "foobar", 6);
@@ -744,8 +744,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
 
   memset(&domain, 0, sizeof(domain));
   res = mdns_domain_add_label(&domain, "lwip", 4);
@@ -779,8 +779,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
 
   memset(&domain, 0, sizeof(domain));
   res = mdns_domain_add_label(&domain, "foobar", 6);
@@ -816,8 +816,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
 
   memset(&domain, 0, sizeof(domain));
   res = mdns_domain_add_label(&domain, "foobar", 6);
@@ -856,8 +856,8 @@
   LWIP_UNUSED_ARG(_i);
 
   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
-  p->payload = (void *)(size_t)data;
   fail_if(p == NULL);
+  p->payload = (void *)(size_t)data;
 
   memset(&domain, 0, sizeof(domain));
   res = mdns_domain_add_label(&domain, "foobar", 6);
diff --git a/test/unit/mqtt/test_mqtt.c b/test/unit/mqtt/test_mqtt.c
new file mode 100644
index 0000000..7cff13e
--- /dev/null
+++ b/test/unit/mqtt/test_mqtt.c
@@ -0,0 +1,115 @@
+#include "test_mqtt.h"
+
+#include "lwip/pbuf.h"
+#include "lwip/apps/mqtt.h"
+#include "lwip/apps/mqtt_priv.h"
+#include "lwip/netif.h"
+
+const ip_addr_t test_mqtt_local_ip = IPADDR4_INIT_BYTES(192, 168, 1, 1);
+const ip_addr_t test_mqtt_remote_ip = IPADDR4_INIT_BYTES(192, 168, 1, 2);
+const ip_addr_t test_mqtt_netmask = IPADDR4_INIT_BYTES(255, 255, 255, 0);
+
+static err_t test_mqtt_netif_output(struct netif *netif, struct pbuf *p,
+       const ip4_addr_t *ipaddr)
+{
+  LWIP_UNUSED_ARG(netif);
+  LWIP_UNUSED_ARG(ipaddr);
+  LWIP_UNUSED_ARG(p);
+  return ERR_OK;
+}
+
+static void
+test_mqtt_init_netif(struct netif *netif, const ip_addr_t *ip_addr, const ip_addr_t *netmask)
+{
+  struct netif *n;
+  memset(netif, 0, sizeof(struct netif));
+  netif->output = test_mqtt_netif_output;
+  netif->flags |= NETIF_FLAG_UP | NETIF_FLAG_LINK_UP;
+  ip_addr_copy_from_ip4(netif->netmask, *ip_2_ip4(netmask));
+  ip_addr_copy_from_ip4(netif->ip_addr, *ip_2_ip4(ip_addr));
+  for (n = netif_list; n != NULL; n = n->next) {
+    if (n == netif) {
+      return;
+    }
+  }
+  netif->next = NULL;
+  netif_list = netif;
+}
+
+/* Setups/teardown functions */
+static struct netif *old_netif_list;
+static struct netif *old_netif_default;
+
+static void
+mqtt_setup(void)
+{
+  old_netif_list = netif_list;
+  old_netif_default = netif_default;
+  netif_list = NULL;
+  netif_default = NULL;
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
+}
+
+static void
+mqtt_teardown(void)
+{
+  netif_list = NULL;
+  netif_default = NULL;
+  /* 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));
+}
+
+static void test_mqtt_connection_cb(mqtt_client_t *client, void *arg, mqtt_connection_status_t status)
+{
+  LWIP_UNUSED_ARG(client);
+  LWIP_UNUSED_ARG(arg);
+  LWIP_UNUSED_ARG(status);
+}
+
+START_TEST(basic_connect)
+{
+  mqtt_client_t* client;
+  struct netif netif;
+  err_t err;
+  struct mqtt_connect_client_info_t client_info = {
+    "dumm",
+    NULL, NULL,
+    10,
+    NULL, NULL, 0, 0
+  };
+  struct pbuf *p;
+  unsigned char rxbuf[] = {0x20, 0x02, 0x00, 0x00};
+  LWIP_UNUSED_ARG(_i);
+
+  test_mqtt_init_netif(&netif, &test_mqtt_local_ip, &test_mqtt_netmask);
+
+  client = mqtt_client_new();
+  fail_unless(client != NULL);
+  err = mqtt_client_connect(client, &test_mqtt_remote_ip, 1234, test_mqtt_connection_cb, NULL, &client_info);
+  fail_unless(err == ERR_OK);
+
+  client->conn->connected(client->conn->callback_arg, client->conn, ERR_OK);
+  p = pbuf_alloc(PBUF_RAW, sizeof(rxbuf), PBUF_REF);
+  fail_unless(p != NULL);
+  p->payload = rxbuf;
+  /* since we hack the rx path, we have to hack the rx window, too: */
+  client->conn->rcv_wnd -= p->tot_len;
+  if (client->conn->recv(client->conn->callback_arg, client->conn, p, ERR_OK) != ERR_OK) {
+    pbuf_free(p);
+  }
+
+  mqtt_disconnect(client);
+  /* fixme: mqtt_client_fre() is missing... */
+  mem_free(client);
+}
+END_TEST
+
+Suite* mqtt_suite(void)
+{
+  testfunc tests[] = {
+    TESTFUNC(basic_connect),
+  };
+  return create_suite("MQTT", tests, sizeof(tests)/sizeof(testfunc), mqtt_setup, mqtt_teardown);
+}
diff --git a/test/unit/mqtt/test_mqtt.h b/test/unit/mqtt/test_mqtt.h
new file mode 100644
index 0000000..181758c
--- /dev/null
+++ b/test/unit/mqtt/test_mqtt.h
@@ -0,0 +1,8 @@
+#ifndef LWIP_HDR_TEST_MQTT_H__
+#define LWIP_HDR_TEST_MQTT_H__
+
+#include "../lwip_check.h"
+
+Suite* mqtt_suite(void);
+
+#endif
diff --git a/test/unit/tcp/tcp_helper.c b/test/unit/tcp/tcp_helper.c
index 64121ca..8689b71 100644
--- a/test/unit/tcp/tcp_helper.c
+++ b/test/unit/tcp/tcp_helper.c
@@ -10,6 +10,10 @@
 #error "This tests needs TCP- and MEMP-statistics enabled"
 #endif
 
+const ip_addr_t test_local_ip = IPADDR4_INIT_BYTES(192, 168, 1, 1);
+const ip_addr_t test_remote_ip = IPADDR4_INIT_BYTES(192, 168, 1, 2);
+const ip_addr_t test_netmask = IPADDR4_INIT_BYTES(255, 255, 255, 0);
+
 /** Remove all pcbs on the given list. */
 static void
 tcp_remove(struct tcp_pcb* pcb_list)
@@ -29,6 +33,7 @@
 tcp_remove_all(void)
 {
   tcp_remove(tcp_listen_pcbs.pcbs);
+  tcp_remove(tcp_bound_pcbs);
   tcp_remove(tcp_active_pcbs);
   tcp_remove(tcp_tw_pcbs);
   fail_unless(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
@@ -138,8 +143,8 @@
 
 /** Safely bring a tcp_pcb into the requested state */
 void
-tcp_set_state(struct tcp_pcb* pcb, enum tcp_state state, ip_addr_t* local_ip,
-                   ip_addr_t* remote_ip, u16_t local_port, u16_t remote_port)
+tcp_set_state(struct tcp_pcb* pcb, enum tcp_state state, const ip_addr_t* local_ip,
+                   const ip_addr_t* remote_ip, u16_t local_port, u16_t remote_port)
 {
   u32_t iss;
 
@@ -292,7 +297,7 @@
 }
 
 void test_tcp_init_netif(struct netif *netif, struct test_tcp_txcounters *txcounters,
-                         ip_addr_t *ip_addr, ip_addr_t *netmask)
+                         const ip_addr_t *ip_addr, const ip_addr_t *netmask)
 {
   struct netif *n;
   memset(netif, 0, sizeof(struct netif));
diff --git a/test/unit/tcp/tcp_helper.h b/test/unit/tcp/tcp_helper.h
index 0497481..cc72e2a 100644
--- a/test/unit/tcp/tcp_helper.h
+++ b/test/unit/tcp/tcp_helper.h
@@ -26,6 +26,12 @@
   struct pbuf *tx_packets;
 };
 
+extern const ip_addr_t test_local_ip;
+extern const ip_addr_t test_remote_ip;
+extern const ip_addr_t test_netmask;
+#define TEST_REMOTE_PORT    0x100
+#define TEST_LOCAL_PORT     0x101
+
 /* Helper functions */
 void tcp_remove_all(void);
 
@@ -36,8 +42,8 @@
                    u32_t seqno_offset, u32_t ackno_offset, u8_t headerflags);
 struct pbuf* tcp_create_rx_segment_wnd(struct tcp_pcb* pcb, void* data, size_t data_len,
                    u32_t seqno_offset, u32_t ackno_offset, u8_t headerflags, u16_t wnd);
-void tcp_set_state(struct tcp_pcb* pcb, enum tcp_state state, ip_addr_t* local_ip,
-                   ip_addr_t* remote_ip, u16_t local_port, u16_t remote_port);
+void tcp_set_state(struct tcp_pcb* pcb, enum tcp_state state, const ip_addr_t* local_ip,
+                   const ip_addr_t* remote_ip, u16_t local_port, u16_t remote_port);
 void test_tcp_counters_err(void* arg, err_t err);
 err_t test_tcp_counters_recv(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t err);
 
@@ -46,7 +52,7 @@
 void test_tcp_input(struct pbuf *p, struct netif *inp);
 
 void test_tcp_init_netif(struct netif *netif, struct test_tcp_txcounters *txcounters,
-                         ip_addr_t *ip_addr, ip_addr_t *netmask);
+                         const ip_addr_t *ip_addr, const ip_addr_t *netmask);
 
 
 #endif
diff --git a/test/unit/tcp/test_tcp.c b/test/unit/tcp/test_tcp.c
index d99b807..c7f85f6 100644
--- a/test/unit/tcp/test_tcp.c
+++ b/test/unit/tcp/test_tcp.c
@@ -16,6 +16,17 @@
 #error "This tests needs TCP_SND_BUF to be > TCP_WND"
 #endif
 
+/* used with check_seqnos() */
+#define SEQNO1 (0xFFFFFF00 - TCP_MSS)
+#define ISS    6510
+static u32_t seqnos[] = {
+    SEQNO1,
+    SEQNO1 + (1 * TCP_MSS),
+    SEQNO1 + (2 * TCP_MSS),
+    SEQNO1 + (3 * TCP_MSS),
+    SEQNO1 + (4 * TCP_MSS),
+    SEQNO1 + (5 * TCP_MSS) };
+
 static u8_t test_tcp_timer;
 
 /* our own version of tcp_tmr so we can reset fast/slow timer state */
@@ -29,18 +40,27 @@
 }
 
 /* Setups/teardown functions */
+static struct netif *old_netif_list;
+static struct netif *old_netif_default;
 
 static void
 tcp_setup(void)
 {
+  struct tcp_pcb dummy_pcb; /* we need this for tcp_next_iss() only */
+
+  old_netif_list = netif_list;
+  old_netif_default = netif_default;
+  netif_list = NULL;
+  netif_default = NULL;
   /* reset iss to default (6510) */
   tcp_ticks = 0;
-  tcp_ticks = 0 - (tcp_next_iss(NULL) - 6510);
-  tcp_next_iss(NULL);
+  tcp_ticks = 0 - (tcp_next_iss(&dummy_pcb) - 6510);
+  tcp_next_iss(&dummy_pcb);
   tcp_ticks = 0;
 
   test_tcp_timer = 0;
   tcp_remove_all();
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
 }
 
 static void
@@ -49,6 +69,10 @@
   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));
 }
 
 
@@ -72,6 +96,65 @@
 }
 END_TEST
 
+/** Call tcp_new() and tcp_abort() and test memp stats */
+START_TEST(test_tcp_listen_passive_open)
+{
+  struct tcp_pcb *pcb, *pcbl;
+  struct tcp_pcb_listen *lpcb;
+  struct netif netif;
+  struct test_tcp_txcounters txcounters;
+  struct test_tcp_counters counters;
+  struct pbuf *p;
+  ip_addr_t src_addr;
+  err_t err;
+  LWIP_UNUSED_ARG(_i);
+
+  fail_unless(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+
+  test_tcp_init_netif(&netif, &txcounters, &test_local_ip, &test_netmask);
+  /* initialize counter struct */
+  memset(&counters, 0, sizeof(counters));
+
+  pcb = tcp_new();
+  EXPECT_RET(pcb != NULL);
+  err = tcp_bind(pcb, &netif.ip_addr, 1234);
+  EXPECT(err == ERR_OK);
+  pcbl = tcp_listen(pcb);
+  EXPECT_RET(pcbl != NULL);
+  EXPECT_RET(pcbl != pcb);
+  lpcb = (struct tcp_pcb_listen *)pcbl;
+
+  ip_addr_set_ip4_u32_val(src_addr, lwip_htonl(lwip_ntohl(ip_addr_get_ip4_u32(&lpcb->local_ip)) + 1));
+
+  /* check correct syn packet */
+  p = tcp_create_segment(&src_addr, &lpcb->local_ip, 12345,
+    lpcb->local_port, NULL, 0, 12345, 54321, TCP_SYN);
+  EXPECT(p != NULL);
+  if (p != NULL) {
+    /* pass the segment to tcp_input */
+    test_tcp_input(p, &netif);
+    /* check if counters are as expected */
+    EXPECT(txcounters.num_tx_calls == 1);
+  }
+
+  /* check syn packet with short length */
+  p = tcp_create_segment(&src_addr, &lpcb->local_ip, 12345,
+    lpcb->local_port, NULL, 0, 12345, 54321, TCP_SYN);
+  EXPECT(p != NULL);
+  EXPECT(p->next == NULL);
+  if ((p != NULL) && (p->next == NULL)) {
+    p->len -= 2;
+    p->tot_len -= 2;
+    /* pass the segment to tcp_input */
+    test_tcp_input(p, &netif);
+    /* check if counters are as expected */
+    EXPECT(txcounters.num_tx_calls == 1);
+  }
+
+  tcp_close(pcbl);
+}
+END_TEST
+
 /** Create an ESTABLISHED pcb and check if receive callback is called */
 START_TEST(test_tcp_recv_inseq)
 {
@@ -79,19 +162,13 @@
   struct tcp_pcb* pcb;
   struct pbuf* p;
   char data[] = {1, 2, 3, 4};
-  ip_addr_t remote_ip, local_ip, netmask;
   u16_t data_len;
-  u16_t remote_port = 0x100, local_port = 0x101;
   struct netif netif;
   struct test_tcp_txcounters txcounters;
   LWIP_UNUSED_ARG(_i);
 
   /* initialize local vars */
-  memset(&netif, 0, sizeof(netif));
-  IP_ADDR4(&local_ip, 192, 168, 1, 1);
-  IP_ADDR4(&remote_ip, 192, 168, 1, 2);
-  IP_ADDR4(&netmask,   255, 255, 255, 0);
-  test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask);
+  test_tcp_init_netif(&netif, &txcounters, &test_local_ip, &test_netmask);
   data_len = sizeof(data);
   /* initialize counter struct */
   memset(&counters, 0, sizeof(counters));
@@ -101,7 +178,7 @@
   /* create and initialize the pcb */
   pcb = test_tcp_new_counters_pcb(&counters);
   EXPECT_RET(pcb != NULL);
-  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
+  tcp_set_state(pcb, ESTABLISHED, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
 
   /* create a segment */
   p = tcp_create_rx_segment(pcb, counters.expected_data, data_len, 0, 0, 0);
@@ -123,6 +200,183 @@
 }
 END_TEST
 
+/** Create an ESTABLISHED pcb and check if receive callback is called if a segment
+ * overlapping rcv_nxt is received */
+START_TEST(test_tcp_recv_inseq_trim)
+{
+  struct test_tcp_counters counters;
+  struct tcp_pcb* pcb;
+  struct pbuf* p;
+  char data[PBUF_POOL_BUFSIZE*2];
+  u16_t data_len;
+  struct netif netif;
+  struct test_tcp_txcounters txcounters;
+  const u32_t new_data_len = 40;
+  LWIP_UNUSED_ARG(_i);
+
+  /* initialize local vars */
+  test_tcp_init_netif(&netif, &txcounters, &test_local_ip, &test_netmask);
+  data_len = sizeof(data);
+  memset(data, 0, sizeof(data));
+  /* initialize counter struct */
+  memset(&counters, 0, sizeof(counters));
+  counters.expected_data_len = data_len;
+  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);
+
+  /* create a segment (with an overlapping/old seqno so that the new data begins in the 2nd pbuf) */
+  p = tcp_create_rx_segment(pcb, counters.expected_data, data_len, (u32_t)(0-(data_len-new_data_len)), 0, 0);
+  EXPECT(p != NULL);
+  if (p != NULL) {
+    EXPECT(p->next != NULL);
+    if (p->next != NULL) {
+      EXPECT(p->next->next != NULL);
+    }
+  }
+  if ((p != NULL) && (p->next != NULL) && (p->next->next != NULL)) {
+    /* pass the segment to tcp_input */
+    test_tcp_input(p, &netif);
+    /* check if counters are as expected */
+    EXPECT(counters.close_calls == 0);
+    EXPECT(counters.recv_calls == 1);
+    EXPECT(counters.recved_bytes == new_data_len);
+    EXPECT(counters.err_calls == 0);
+  }
+
+  /* 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
+
+static err_t test_tcp_recv_expect1byte(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t err);
+
+static err_t
+test_tcp_recv_expectclose(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t err)
+{
+  EXPECT_RETX(pcb != NULL, ERR_OK);
+  EXPECT_RETX(err == ERR_OK, ERR_OK);
+  LWIP_UNUSED_ARG(arg);
+
+  if (p != NULL) {
+    fail();
+  } else {
+    /* correct: FIN received; close our end, too */
+    err_t err2 = tcp_close(pcb);
+    fail_unless(err2 == ERR_OK);
+    /* set back to some other rx function, just to not get here again */
+    tcp_recv(pcb, test_tcp_recv_expect1byte);
+  }
+  return ERR_OK;
+}
+
+static err_t
+test_tcp_recv_expect1byte(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t err)
+{
+  EXPECT_RETX(pcb != NULL, ERR_OK);
+  EXPECT_RETX(err == ERR_OK, ERR_OK);
+  LWIP_UNUSED_ARG(arg);
+
+  if (p != NULL) {
+    if ((p->len == 1) && (p->tot_len == 1)) {
+      tcp_recv(pcb, test_tcp_recv_expectclose);
+    } else {
+      fail();
+    }
+    pbuf_free(p);
+  } else {
+    fail();
+  }
+  return ERR_OK;
+}
+
+START_TEST(test_tcp_passive_close)
+{
+  struct test_tcp_counters counters;
+  struct tcp_pcb* pcb;
+  struct pbuf* p;
+  char data = 0x0f;
+  struct netif netif;
+  struct test_tcp_txcounters txcounters;
+  LWIP_UNUSED_ARG(_i);
+
+  /* initialize local vars */
+  test_tcp_init_netif(&netif, &txcounters, &test_local_ip, &test_netmask);
+
+  /* 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);
+
+  /* create a segment without data */
+  p = tcp_create_rx_segment(pcb, &data, 1, 0, 0, TCP_FIN);
+  EXPECT(p != NULL);
+  if (p != NULL) {
+    tcp_recv(pcb, test_tcp_recv_expect1byte);
+    /* pass the segment to tcp_input */
+    test_tcp_input(p, &netif);
+  }
+  /* don't free the pcb here (part of the test!) */
+}
+END_TEST
+
+START_TEST(test_tcp_active_abort)
+{
+  struct test_tcp_counters counters;
+  struct tcp_pcb* pcb;
+  char data = 0x0f;
+  struct netif netif;
+  struct test_tcp_txcounters txcounters;
+  LWIP_UNUSED_ARG(_i);
+
+  memset(&txcounters, 0, sizeof(txcounters));
+
+  /* initialize local vars */
+  test_tcp_init_netif(&netif, &txcounters, &test_local_ip, &test_netmask);
+
+  /* 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);
+
+  /* abort the pcb */
+  EXPECT_RET(txcounters.num_tx_calls == 0);
+  txcounters.copy_tx_packets = 1;
+  tcp_abort(pcb);
+  txcounters.copy_tx_packets = 0;
+  EXPECT(txcounters.num_tx_calls == 1);
+  EXPECT(txcounters.num_tx_bytes == 40U);
+  EXPECT(txcounters.tx_packets != NULL);
+  if (txcounters.tx_packets != NULL) {
+    u16_t ret;
+    struct tcp_hdr tcphdr;
+    ret = pbuf_copy_partial(txcounters.tx_packets, &tcphdr, 20, 20);
+    EXPECT(ret == 20);
+    EXPECT(tcphdr.dest == PP_HTONS(TEST_REMOTE_PORT));
+    EXPECT(tcphdr.src == PP_HTONS(TEST_LOCAL_PORT));
+    pbuf_free(txcounters.tx_packets);
+    txcounters.tx_packets = NULL;
+  }
+
+  /* don't free the pcb here (part of the test!) */
+}
+END_TEST
+
 /** Check that we handle malformed tcp headers, and discard the pbuf(s) */
 START_TEST(test_tcp_malformed_header)
 {
@@ -130,20 +384,14 @@
   struct tcp_pcb* pcb;
   struct pbuf* p;
   char data[] = {1, 2, 3, 4};
-  ip_addr_t remote_ip, local_ip, netmask;
   u16_t data_len, chksum;
-  u16_t remote_port = 0x100, local_port = 0x101;
   struct netif netif;
   struct test_tcp_txcounters txcounters;
   struct tcp_hdr *hdr;
   LWIP_UNUSED_ARG(_i);
 
   /* initialize local vars */
-  memset(&netif, 0, sizeof(netif));
-  IP_ADDR4(&local_ip, 192, 168, 1, 1);
-  IP_ADDR4(&remote_ip, 192, 168, 1, 2);
-  IP_ADDR4(&netmask,   255, 255, 255, 0);
-  test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask);
+  test_tcp_init_netif(&netif, &txcounters, &test_local_ip, &test_netmask);
   data_len = sizeof(data);
   /* initialize counter struct */
   memset(&counters, 0, sizeof(counters));
@@ -153,7 +401,7 @@
   /* create and initialize the pcb */
   pcb = test_tcp_new_counters_pcb(&counters);
   EXPECT_RET(pcb != NULL);
-  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
+  tcp_set_state(pcb, ESTABLISHED, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
 
   /* create a segment */
   p = tcp_create_rx_segment(pcb, counters.expected_data, data_len, 0, 0, 0);
@@ -166,7 +414,7 @@
   hdr->chksum = 0;
 
   chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len,
-                             &remote_ip, &local_ip);
+                             &test_remote_ip, &test_local_ip);
 
   hdr->chksum = chksum;
 
@@ -207,22 +455,17 @@
   char data4[] = {13, 14, 15, 16};
   char data5[] = {17, 18, 19, 20};
   char data6[TCP_MSS] = {21, 22, 23, 24};
-  ip_addr_t remote_ip, local_ip, netmask;
-  u16_t remote_port = 0x100, local_port = 0x101;
   err_t err;
   LWIP_UNUSED_ARG(_i);
 
   /* initialize local vars */
-  IP_ADDR4(&local_ip,  192, 168,   1, 1);
-  IP_ADDR4(&remote_ip, 192, 168,   1, 2);
-  IP_ADDR4(&netmask,   255, 255, 255, 0);
-  test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask);
+  test_tcp_init_netif(&netif, &txcounters, &test_local_ip, &test_netmask);
   memset(&counters, 0, sizeof(counters));
 
   /* create and initialize the pcb */
   pcb = test_tcp_new_counters_pcb(&counters);
   EXPECT_RET(pcb != NULL);
-  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
+  tcp_set_state(pcb, ESTABLISHED, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
   pcb->mss = TCP_MSS;
   /* disable initial congestion window (we don't send a SYN here...) */
   pcb->cwnd = pcb->snd_wnd;
@@ -388,19 +631,9 @@
   struct test_tcp_counters counters;
   struct tcp_pcb* pcb;
   struct pbuf* p;
-  ip_addr_t remote_ip, local_ip, netmask;
-  u16_t remote_port = 0x100, local_port = 0x101;
   err_t err;
-#define SEQNO1 (0xFFFFFF00 - TCP_MSS)
-#define ISS    6510
-  u16_t i, sent_total = 0;
-  u32_t seqnos[] = {
-    SEQNO1,
-    SEQNO1 + (1 * TCP_MSS),
-    SEQNO1 + (2 * TCP_MSS),
-    SEQNO1 + (3 * TCP_MSS),
-    SEQNO1 + (4 * TCP_MSS),
-    SEQNO1 + (5 * TCP_MSS)};
+  size_t i;
+  u16_t sent_total = 0;
   LWIP_UNUSED_ARG(_i);
 
   for (i = 0; i < sizeof(tx_data); i++) {
@@ -408,17 +641,14 @@
   }
 
   /* initialize local vars */
-  IP_ADDR4(&local_ip,  192, 168,   1, 1);
-  IP_ADDR4(&remote_ip, 192, 168,   1, 2);
-  IP_ADDR4(&netmask,   255, 255, 255, 0);
-  test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask);
+  test_tcp_init_netif(&netif, &txcounters, &test_local_ip, &test_netmask);
   memset(&counters, 0, sizeof(counters));
 
   /* create and initialize the pcb */
   tcp_ticks = SEQNO1 - ISS;
   pcb = test_tcp_new_counters_pcb(&counters);
   EXPECT_RET(pcb != NULL);
-  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
+  tcp_set_state(pcb, ESTABLISHED, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
   pcb->mss = TCP_MSS;
   /* disable initial congestion window (we don't send a SYN here...) */
   pcb->cwnd = 2*TCP_MSS;
@@ -488,19 +718,10 @@
   struct test_tcp_txcounters txcounters;
   struct test_tcp_counters counters;
   struct tcp_pcb* pcb;
-  ip_addr_t remote_ip, local_ip, netmask;
-  u16_t remote_port = 0x100, local_port = 0x101;
+  struct tcp_pcb dummy_pcb_for_iss; /* we need this for tcp_next_iss() only */
   err_t err;
-#define SEQNO1 (0xFFFFFF00 - TCP_MSS)
-#define ISS    6510
-  u16_t i, sent_total = 0;
-  u32_t seqnos[] = {
-    SEQNO1,
-    SEQNO1 + (1 * TCP_MSS),
-    SEQNO1 + (2 * TCP_MSS),
-    SEQNO1 + (3 * TCP_MSS),
-    SEQNO1 + (4 * TCP_MSS),
-    SEQNO1 + (5 * TCP_MSS)};
+  size_t i;
+  u16_t sent_total = 0;
   LWIP_UNUSED_ARG(_i);
 
   for (i = 0; i < sizeof(tx_data); i++) {
@@ -508,19 +729,16 @@
   }
 
   /* initialize local vars */
-  IP_ADDR4(&local_ip,  192, 168,   1, 1);
-  IP_ADDR4(&remote_ip, 192, 168,   1, 2);
-  IP_ADDR4(&netmask,   255, 255, 255, 0);
-  test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask);
+  test_tcp_init_netif(&netif, &txcounters, &test_local_ip, &test_netmask);
   memset(&counters, 0, sizeof(counters));
 
   /* create and initialize the pcb */
   tcp_ticks = 0;
-  tcp_ticks = 0 - tcp_next_iss(NULL);
-  tcp_ticks = SEQNO1 - tcp_next_iss(NULL);
+  tcp_ticks = 0 - tcp_next_iss(&dummy_pcb_for_iss);
+  tcp_ticks = SEQNO1 - tcp_next_iss(&dummy_pcb_for_iss);
   pcb = test_tcp_new_counters_pcb(&counters);
   EXPECT_RET(pcb != NULL);
-  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
+  tcp_set_state(pcb, ESTABLISHED, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
   pcb->mss = TCP_MSS;
   /* disable initial congestion window (we don't send a SYN here...) */
   pcb->cwnd = 2*TCP_MSS;
@@ -577,10 +795,9 @@
   struct test_tcp_counters counters;
   struct tcp_pcb* pcb;
   struct pbuf *p;
-  ip_addr_t remote_ip, local_ip, netmask;
-  u16_t remote_port = 0x100, local_port = 0x101;
   err_t err;
-  u16_t sent_total, i;
+  size_t i;
+  u16_t sent_total;
   u8_t expected = 0xFE;
 
   for (i = 0; i < sizeof(tx_data); i++) {
@@ -597,17 +814,13 @@
   }
 
   /* initialize local vars */
-  IP_ADDR4(&local_ip,  192, 168,   1, 1);
-  IP_ADDR4(&remote_ip, 192, 168,   1, 2);
-  IP_ADDR4(&netmask,   255, 255, 255, 0);
-  test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask);
+  test_tcp_init_netif(&netif, &txcounters, &test_local_ip, &test_netmask);
   memset(&counters, 0, sizeof(counters));
-  memset(&txcounters, 0, sizeof(txcounters));
 
   /* create and initialize the pcb */
   pcb = test_tcp_new_counters_pcb(&counters);
   EXPECT_RET(pcb != NULL);
-  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
+  tcp_set_state(pcb, ESTABLISHED, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
   pcb->mss = TCP_MSS;
   /* disable initial congestion window (we don't send a SYN here...) */
   pcb->cwnd = pcb->snd_wnd;
@@ -662,7 +875,9 @@
     /* ensure this didn't trigger any transmission */
     EXPECT(txcounters.num_tx_calls == 0);
     EXPECT(txcounters.num_tx_bytes == 0);
-    EXPECT(pcb->persist_backoff == 1);
+    /* window is completely full, but persist timer is off since send buffer is empty */
+    EXPECT(pcb->snd_wnd == 0);
+    EXPECT(pcb->persist_backoff == 0);
   }
 
   /* send one byte more (out of window) -> persist timer starts */
@@ -726,19 +941,755 @@
 }
 END_TEST
 
+/** Send data, provoke retransmission and then add data to a segment
+ * that already has been sent before. */
+START_TEST(test_tcp_retx_add_to_sent)
+{
+  struct netif netif;
+  struct test_tcp_txcounters txcounters;
+  struct test_tcp_counters counters;
+  struct tcp_pcb* pcb;
+  struct pbuf* p;
+  char data1a[] = {  1,  2,  3};
+  char data1b[] = {  4};
+  char data2a[] = {  5,  6,  7,  8};
+  char data2b[] = {  5,  6,  7};
+  char data3[] = {  9, 10, 11, 12, 12};
+  char data4[] = { 13, 14, 15, 16,17};
+  err_t err;
+  int i;
+  LWIP_UNUSED_ARG(_i);
+
+  /* initialize local vars */
+  test_tcp_init_netif(&netif, &txcounters, &test_local_ip, &test_netmask);
+  memset(&counters, 0, sizeof(counters));
+
+  /* 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);
+  pcb->mss = TCP_MSS;
+  /* disable initial congestion window (we don't send a SYN here...) */
+  pcb->cwnd = pcb->snd_wnd;
+
+  /* send data1 */
+  err = tcp_write(pcb, data1a, sizeof(data1a), TCP_WRITE_FLAG_COPY);
+  EXPECT_RET(err == ERR_OK);
+  err = tcp_write(pcb, data1b, sizeof(data1b), TCP_WRITE_FLAG_COPY);
+  EXPECT_RET(err == ERR_OK);
+  err = tcp_output(pcb);
+  EXPECT_RET(err == ERR_OK);
+  EXPECT_RET(txcounters.num_tx_calls == 1);
+  EXPECT_RET(txcounters.num_tx_bytes == sizeof(data1a) + sizeof(data1b) + sizeof(struct tcp_hdr) + sizeof(struct ip_hdr));
+  memset(&txcounters, 0, sizeof(txcounters));
+ /* "recv" ACK for data1 */
+  p = tcp_create_rx_segment(pcb, NULL, 0, 0, 4, TCP_ACK);
+  EXPECT_RET(p != NULL);
+  test_tcp_input(p, &netif);
+  EXPECT_RET(txcounters.num_tx_calls == 0);
+  EXPECT_RET(pcb->unacked == NULL);
+  /* send data2 */
+  err = tcp_write(pcb, data2a, sizeof(data2a), TCP_WRITE_FLAG_COPY);
+  EXPECT_RET(err == ERR_OK);
+  err = tcp_write(pcb, data2b, sizeof(data2b), TCP_WRITE_FLAG_COPY);
+  EXPECT_RET(err == ERR_OK);
+  err = tcp_output(pcb);
+  EXPECT_RET(err == ERR_OK);
+  EXPECT_RET(txcounters.num_tx_calls == 1);
+  EXPECT_RET(txcounters.num_tx_bytes == sizeof(data2a) + sizeof(data2b) + sizeof(struct tcp_hdr) + sizeof(struct ip_hdr));
+  memset(&txcounters, 0, sizeof(txcounters));
+  /* send data3 */
+  err = tcp_write(pcb, data3, sizeof(data3), TCP_WRITE_FLAG_COPY);
+  EXPECT_RET(err == ERR_OK);
+  err = tcp_output(pcb);
+  EXPECT_RET(err == ERR_OK);
+  EXPECT_RET(txcounters.num_tx_calls == 0);
+  EXPECT_RET(txcounters.num_tx_bytes == 0);
+  memset(&txcounters, 0, sizeof(txcounters));
+
+  /* data3 not sent yet (nagle) */
+  EXPECT_RET(pcb->unacked != NULL);
+  EXPECT_RET(pcb->unsent != NULL);
+
+  /* disable nagle for this test so data to sent segment can be added below... */
+  tcp_nagle_disable(pcb);
+
+  /* call the tcp timer some times */
+  for (i = 0; i < 20; i++) {
+    test_tcp_tmr();
+    if (txcounters.num_tx_calls != 0) {
+      break;
+    }
+  }
+  /* data3 sent */
+  EXPECT_RET(txcounters.num_tx_calls == 1);
+  EXPECT_RET(txcounters.num_tx_bytes == sizeof(data3) + sizeof(struct tcp_hdr) + sizeof(struct ip_hdr));
+  EXPECT_RET(pcb->unacked != NULL);
+  EXPECT_RET(pcb->unsent == NULL);
+  memset(&txcounters, 0, sizeof(txcounters));
+
+  tcp_nagle_enable(pcb);
+
+  /* call the tcp timer some times */
+  for (i = 0; i < 20; i++) {
+    test_tcp_tmr();
+    if (txcounters.num_tx_calls != 0) {
+      break;
+    }
+  }
+  /* RTO: rexmit of data2 */
+  EXPECT_RET(txcounters.num_tx_calls == 1);
+  EXPECT_RET(txcounters.num_tx_bytes == sizeof(data2a) + sizeof(data2b) + sizeof(struct tcp_hdr) + sizeof(struct ip_hdr));
+  EXPECT_RET(pcb->unacked != NULL);
+  EXPECT_RET(pcb->unsent != NULL);
+  memset(&txcounters, 0, sizeof(txcounters));
+
+  /* send data4 */
+  err = tcp_write(pcb, data4, sizeof(data4), TCP_WRITE_FLAG_COPY);
+  EXPECT_RET(err == ERR_OK);
+  /* disable nagle for this test so data to transmit without further ACKs... */
+  tcp_nagle_disable(pcb);
+  err = tcp_output(pcb);
+  EXPECT_RET(err == ERR_OK);
+  /* nagle enabled, no tx calls */
+  EXPECT_RET(txcounters.num_tx_calls == 1);
+  EXPECT_RET(txcounters.num_tx_bytes == sizeof(data3) + sizeof(data4) + sizeof(struct tcp_hdr) + sizeof(struct ip_hdr));
+  memset(&txcounters, 0, sizeof(txcounters));
+  /* make sure the pcb is freed */
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);
+  tcp_abort(pcb);
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+}
+END_TEST
+
+START_TEST(test_tcp_rto_tracking)
+{
+  struct netif netif;
+  struct test_tcp_txcounters txcounters;
+  struct test_tcp_counters counters;
+  struct tcp_pcb* pcb;
+  struct pbuf* p;
+  err_t err;
+  size_t i;
+  u16_t sent_total = 0;
+  LWIP_UNUSED_ARG(_i);
+
+  for (i = 0; i < sizeof(tx_data); i++) {
+    tx_data[i] = (u8_t)i;
+  }
+
+  /* initialize local vars */
+  test_tcp_init_netif(&netif, &txcounters, &test_local_ip, &test_netmask);
+  memset(&counters, 0, sizeof(counters));
+
+  /* create and initialize the pcb */
+  tcp_ticks = SEQNO1 - ISS;
+  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);
+  pcb->mss = TCP_MSS;
+  /* Set congestion window large enough to send all our segments */
+  pcb->cwnd = 5*TCP_MSS;
+
+  /* send 5 mss-sized segments */
+  for (i = 0; i < 5; i++) {
+    err = tcp_write(pcb, &tx_data[sent_total], TCP_MSS, TCP_WRITE_FLAG_COPY);
+    EXPECT_RET(err == ERR_OK);
+    sent_total += TCP_MSS;
+  }
+  check_seqnos(pcb->unsent, 5, seqnos);
+  EXPECT(pcb->unacked == NULL);
+  err = tcp_output(pcb);
+  EXPECT(txcounters.num_tx_calls == 5);
+  EXPECT(txcounters.num_tx_bytes == 5 * (TCP_MSS + 40U));
+  memset(&txcounters, 0, sizeof(txcounters));
+  /* Check all 5 are in-flight */
+  EXPECT(pcb->unsent == NULL);
+  check_seqnos(pcb->unacked, 5, seqnos);
+
+  /* Force us into retransmisson timeout */
+  while (!(pcb->flags & TF_RTO)) {
+    test_tcp_tmr();
+  }
+  /* Ensure 4 remaining segments are back on unsent, ready for retransmission */
+  check_seqnos(pcb->unsent, 4, &seqnos[1]);
+  /* Ensure 1st segment is on unacked (already retransmitted) */
+  check_seqnos(pcb->unacked, 1, seqnos);
+  EXPECT(txcounters.num_tx_calls == 1);
+  EXPECT(txcounters.num_tx_bytes == TCP_MSS + 40U);
+  memset(&txcounters, 0, sizeof(txcounters));
+  /* Ensure rto_end points to next byte */
+  EXPECT(pcb->rto_end == seqnos[5]);
+  EXPECT(pcb->rto_end == pcb->snd_nxt);
+  /* Check cwnd was reset */
+  EXPECT(pcb->cwnd == pcb->mss);
+
+  /* Add another segment to send buffer which is outside of RTO */
+  err = tcp_write(pcb, &tx_data[sent_total], TCP_MSS, TCP_WRITE_FLAG_COPY);
+  EXPECT_RET(err == ERR_OK);
+  sent_total += TCP_MSS;
+  check_seqnos(pcb->unsent, 5, &seqnos[1]);
+  /* Ensure no new data was sent */
+  EXPECT(txcounters.num_tx_calls == 0);
+  EXPECT(txcounters.num_tx_bytes == 0);
+  EXPECT(pcb->rto_end == pcb->snd_nxt);
+
+  /* ACK first segment */
+  p = tcp_create_rx_segment(pcb, NULL, 0, 0, TCP_MSS, TCP_ACK);
+  test_tcp_input(p, &netif);
+  /* Next two retranmissions should go out, due to cwnd in slow start */
+  EXPECT(txcounters.num_tx_calls == 2);
+  EXPECT(txcounters.num_tx_bytes == 2 * (TCP_MSS + 40U));
+  memset(&txcounters, 0, sizeof(txcounters));
+  check_seqnos(pcb->unacked, 2, &seqnos[1]);
+  check_seqnos(pcb->unsent, 3, &seqnos[3]);
+  /* RTO should still be marked */
+  EXPECT(pcb->flags & TF_RTO);
+  /* cwnd should have only grown by 1 MSS */
+  EXPECT(pcb->cwnd == (tcpwnd_size_t)(2 * pcb->mss));
+  /* Ensure no new data was sent */
+  EXPECT(pcb->rto_end == pcb->snd_nxt);
+
+  /* ACK the next two segments */
+  p = tcp_create_rx_segment(pcb, NULL, 0, 0, 2*TCP_MSS, TCP_ACK);
+  test_tcp_input(p, &netif);
+  /* Final 2 retransmissions and 1 new data should go out */
+  EXPECT(txcounters.num_tx_calls == 3);
+  EXPECT(txcounters.num_tx_bytes == 3 * (TCP_MSS + 40U));
+  memset(&txcounters, 0, sizeof(txcounters));
+  check_seqnos(pcb->unacked, 3, &seqnos[3]);
+  EXPECT(pcb->unsent == NULL);
+  /* RTO should still be marked */
+  EXPECT(pcb->flags & TF_RTO);
+  /* cwnd should have only grown by 1 MSS */
+  EXPECT(pcb->cwnd == (tcpwnd_size_t)(3 * pcb->mss));
+  /* snd_nxt should have been advanced past rto_end */
+  EXPECT(TCP_SEQ_GT(pcb->snd_nxt, pcb->rto_end));
+
+  /* ACK the next two segments, finishing our RTO, leaving new segment unacked */
+  p = tcp_create_rx_segment(pcb, NULL, 0, 0, 2*TCP_MSS, TCP_ACK);
+  test_tcp_input(p, &netif);
+  EXPECT(!(pcb->flags & TF_RTO));
+  check_seqnos(pcb->unacked, 1, &seqnos[5]);
+  /* We should be in ABC congestion avoidance, so no change in cwnd */
+  EXPECT(pcb->cwnd == (tcpwnd_size_t)(3 * pcb->mss));
+  EXPECT(pcb->cwnd >= pcb->ssthresh);
+  /* Ensure ABC congestion avoidance is tracking bytes acked */
+  EXPECT(pcb->bytes_acked == (tcpwnd_size_t)(2 * pcb->mss));
+
+  /* make sure the pcb is freed */
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);
+  tcp_abort(pcb);
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+}
+END_TEST
+
+static void test_tcp_rto_timeout_impl(int link_down)
+{
+  struct netif netif;
+  struct test_tcp_txcounters txcounters;
+  struct test_tcp_counters counters;
+  struct tcp_pcb *pcb, *cur;
+  err_t err;
+  size_t i;
+  const size_t max_wait_ctr = 1024 * 1024;
+
+  /* Setup data for a single segment */
+  for (i = 0; i < TCP_MSS; i++) {
+    tx_data[i] = (u8_t)i;
+  }
+
+  /* initialize local vars */
+  test_tcp_init_netif(&netif, &txcounters, &test_local_ip, &test_netmask);
+  memset(&counters, 0, sizeof(counters));
+
+  /* create and initialize the pcb */
+  tcp_ticks = SEQNO1 - ISS;
+  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);
+  pcb->mss = TCP_MSS;
+  pcb->cwnd = TCP_MSS;
+
+  /* send our segment */
+  err = tcp_write(pcb, &tx_data[0], TCP_MSS, TCP_WRITE_FLAG_COPY);
+  EXPECT_RET(err == ERR_OK);
+  err = tcp_output(pcb);
+  EXPECT(txcounters.num_tx_calls == 1);
+  EXPECT(txcounters.num_tx_bytes == 1 * (TCP_MSS + 40U));
+  memset(&txcounters, 0, sizeof(txcounters));
+
+  /* ensure no errors have been recorded */
+  EXPECT(counters.err_calls == 0);
+  EXPECT(counters.last_err == ERR_OK);
+
+  /* Force us into retransmisson timeout */
+   for (i = 0; !(pcb->flags & TF_RTO) && i < max_wait_ctr; i++) {
+    test_tcp_tmr();
+  }
+   EXPECT(i < max_wait_ctr);
+
+  /* check first rexmit */
+  EXPECT(pcb->nrtx == 1);
+  EXPECT(txcounters.num_tx_calls == 1);
+  EXPECT(txcounters.num_tx_bytes == 1 * (TCP_MSS + 40U));
+
+  /* still no error expected */
+  EXPECT(counters.err_calls == 0);
+  EXPECT(counters.last_err == ERR_OK);
+
+  if (link_down) {
+    netif_set_link_down(&netif);
+  }
+
+  /* keep running the timer till we hit our maximum RTO */
+  for (i = 0;  counters.last_err == ERR_OK && i < max_wait_ctr; i++) {
+    test_tcp_tmr();
+  }
+  EXPECT(i < max_wait_ctr);
+
+  /* check number of retransmissions */
+  if (link_down) {
+    EXPECT(txcounters.num_tx_calls == 1);
+    EXPECT(txcounters.num_tx_bytes == 1 * (TCP_MSS + 40U));
+  } else {
+    EXPECT(txcounters.num_tx_calls == TCP_MAXRTX);
+    EXPECT(txcounters.num_tx_bytes == TCP_MAXRTX * (TCP_MSS + 40U));
+  }
+
+  /* check the connection (pcb) has been aborted */
+  EXPECT(counters.err_calls == 1);
+  EXPECT(counters.last_err == ERR_ABRT);
+  /* check our pcb is no longer active */
+  for (cur = tcp_active_pcbs; cur != NULL; cur = cur->next) {
+    EXPECT(cur != pcb);
+  }  
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+}
+
+START_TEST(test_tcp_rto_timeout)
+{
+  LWIP_UNUSED_ARG(_i);
+  test_tcp_rto_timeout_impl(0);
+}
+END_TEST
+
+START_TEST(test_tcp_rto_timeout_link_down)
+{
+  LWIP_UNUSED_ARG(_i);
+  test_tcp_rto_timeout_impl(1);
+}
+END_TEST
+
+static void test_tcp_rto_timeout_syn_sent_impl(int link_down)
+{
+  struct netif netif;
+  struct test_tcp_txcounters txcounters;
+  struct test_tcp_counters counters;
+  struct tcp_pcb *pcb, *cur;
+  err_t err;
+  size_t i;
+  const size_t max_wait_ctr = 1024 * 1024;
+  const u16_t tcp_syn_opts_len = LWIP_TCP_OPT_LENGTH(TF_SEG_OPTS_MSS|TF_SEG_OPTS_WND_SCALE|TF_SEG_OPTS_SACK_PERM|TF_SEG_OPTS_TS);
+
+  /* Setup data for a single segment */
+  for (i = 0; i < TCP_MSS; i++) {
+    tx_data[i] = (u8_t)i;
+  }
+
+  /* initialize local vars */
+  test_tcp_init_netif(&netif, &txcounters, &test_local_ip, &test_netmask);
+  memset(&counters, 0, sizeof(counters));
+
+  /* create and initialize the pcb */
+  tcp_ticks = SEQNO1 - ISS;
+  pcb = test_tcp_new_counters_pcb(&counters);
+  EXPECT_RET(pcb != NULL);
+  err = tcp_connect(pcb, &netif.gw, 123, NULL);
+  EXPECT_RET(err == ERR_OK);
+  EXPECT_RET(pcb->state == SYN_SENT);
+  EXPECT(txcounters.num_tx_calls == 1);
+  EXPECT(txcounters.num_tx_bytes == 40U + tcp_syn_opts_len);
+
+  /* ensure no errors have been recorded */
+  EXPECT(counters.err_calls == 0);
+  EXPECT(counters.last_err == ERR_OK);
+
+  txcounters.num_tx_calls = 0;
+  txcounters.num_tx_bytes = 0;
+
+  /* Force us into retransmisson timeout */
+  for (i = 0; !(pcb->flags & TF_RTO) && i < max_wait_ctr; i++) {
+    test_tcp_tmr();
+  }
+  EXPECT(i < max_wait_ctr);
+
+  /* check first rexmit */
+  EXPECT(pcb->nrtx == 1);
+  EXPECT(txcounters.num_tx_calls == 1);
+  EXPECT(txcounters.num_tx_bytes == 40U + tcp_syn_opts_len); /* 40: headers; >=: options */
+
+  /* still no error expected */
+  EXPECT(counters.err_calls == 0);
+  EXPECT(counters.last_err == ERR_OK);
+
+  if (link_down) {
+    /* set link down and check what happens to the RTO counter */
+    netif_set_link_down(&netif);
+  }
+
+  /* keep running the timer till we hit our maximum RTO */
+  for (i = 0;  counters.last_err == ERR_OK && i < max_wait_ctr; i++) {
+    test_tcp_tmr();
+  }
+  EXPECT(i < max_wait_ctr);
+
+  /* check number of retransmissions */
+  if (link_down) {
+    EXPECT(txcounters.num_tx_calls == 1);
+    EXPECT(txcounters.num_tx_bytes == 40U + tcp_syn_opts_len);
+  } else {
+    EXPECT(txcounters.num_tx_calls == TCP_SYNMAXRTX);
+    EXPECT(txcounters.num_tx_bytes == TCP_SYNMAXRTX * (tcp_syn_opts_len + 40U));
+  }
+
+  /* check the connection (pcb) has been aborted */
+  EXPECT(counters.err_calls == 1);
+  EXPECT(counters.last_err == ERR_ABRT);
+  /* check our pcb is no longer active */
+  for (cur = tcp_active_pcbs; cur != NULL; cur = cur->next) {
+    EXPECT(cur != pcb);
+  }  
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+}
+
+START_TEST(test_tcp_rto_timeout_syn_sent)
+{
+  LWIP_UNUSED_ARG(_i);
+  test_tcp_rto_timeout_syn_sent_impl(0);
+}
+END_TEST
+
+START_TEST(test_tcp_rto_timeout_syn_sent_link_down)
+{
+  LWIP_UNUSED_ARG(_i);
+  test_tcp_rto_timeout_syn_sent_impl(1);
+}
+END_TEST
+
+static void test_tcp_zwp_timeout_impl(int link_down)
+{
+  struct netif netif;
+  struct test_tcp_txcounters txcounters;
+  struct test_tcp_counters counters;
+  struct tcp_pcb *pcb, *cur;
+  struct pbuf* p;
+  err_t err;
+  size_t i;
+
+  /* Setup data for two segments */
+  for (i = 0; i < 2*TCP_MSS; i++) {
+    tx_data[i] = (u8_t)i;
+  }
+
+  /* initialize local vars */
+  test_tcp_init_netif(&netif, &txcounters, &test_local_ip, &test_netmask);
+  memset(&counters, 0, sizeof(counters));
+
+  /* create and initialize the pcb */
+  tcp_ticks = SEQNO1 - ISS;
+  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);
+  pcb->mss = TCP_MSS;
+  pcb->cwnd = TCP_MSS;
+
+  /* send first segment */
+  err = tcp_write(pcb, &tx_data[0], TCP_MSS, TCP_WRITE_FLAG_COPY);
+  EXPECT(err == ERR_OK);
+  err = tcp_output(pcb);
+  EXPECT(err == ERR_OK);
+  
+  /* verify segment is in-flight */
+  EXPECT(pcb->unsent == NULL);
+  check_seqnos(pcb->unacked, 1, seqnos);
+  EXPECT(txcounters.num_tx_calls == 1);
+  EXPECT(txcounters.num_tx_bytes == 1 * (TCP_MSS + 40U));
+  memset(&txcounters, 0, sizeof(txcounters));
+
+  /* ACK the segment and close the TX window */
+  p = tcp_create_rx_segment_wnd(pcb, NULL, 0, 0, TCP_MSS, TCP_ACK, 0);
+  test_tcp_input(p, &netif);
+  EXPECT(pcb->unacked == NULL);
+  EXPECT(pcb->unsent == NULL);
+  /* send buffer empty, persist should be off */
+  EXPECT(pcb->persist_backoff == 0);
+  EXPECT(pcb->snd_wnd == 0);
+
+  /* send second segment, should be buffered */
+  err = tcp_write(pcb, &tx_data[TCP_MSS], TCP_MSS, TCP_WRITE_FLAG_COPY);
+  EXPECT(err == ERR_OK);
+  err = tcp_output(pcb);
+  EXPECT(err == ERR_OK);
+
+  /* ensure it is buffered and persist timer started */
+  EXPECT(pcb->unacked == NULL);
+  check_seqnos(pcb->unsent, 1, &seqnos[1]);
+  EXPECT(txcounters.num_tx_calls == 0);
+  EXPECT(txcounters.num_tx_bytes == 0);
+  EXPECT(pcb->persist_backoff == 1);
+
+  /* ensure no errors have been recorded */
+  EXPECT(counters.err_calls == 0);
+  EXPECT(counters.last_err == ERR_OK);
+
+  /* run timer till first probe */
+  EXPECT(pcb->persist_probe == 0);
+  while (pcb->persist_probe == 0) {
+    test_tcp_tmr();
+  }
+  EXPECT(txcounters.num_tx_calls == 1);
+  EXPECT(txcounters.num_tx_bytes == (1 + 40U));
+  memset(&txcounters, 0, sizeof(txcounters));
+
+  /* respond to probe with remote's current SEQ, ACK, and zero-window */
+  p = tcp_create_rx_segment_wnd(pcb, NULL, 0, 0, 0, TCP_ACK, 0);
+  test_tcp_input(p, &netif);
+  /* ensure zero-window is still active, but probe count reset */
+  EXPECT(pcb->persist_backoff > 1);
+  EXPECT(pcb->persist_probe == 0);
+  EXPECT(pcb->snd_wnd == 0);
+
+  /* ensure no errors have been recorded */
+  EXPECT(counters.err_calls == 0);
+  EXPECT(counters.last_err == ERR_OK);
+
+  if (link_down) {
+    netif_set_link_down(&netif);
+  }
+
+  /* now run the timer till we hit our maximum probe count */
+  while (counters.last_err == ERR_OK) {
+    test_tcp_tmr();
+  }
+
+  if (link_down) {
+    EXPECT(txcounters.num_tx_calls == 0);
+    EXPECT(txcounters.num_tx_bytes == 0);
+  } else {
+    /* check maximum number of 1 byte probes were sent */
+    EXPECT(txcounters.num_tx_calls == TCP_MAXRTX);
+    EXPECT(txcounters.num_tx_bytes == TCP_MAXRTX * (1 + 40U));
+  }
+
+  /* check the connection (pcb) has been aborted */
+  EXPECT(counters.err_calls == 1);
+  EXPECT(counters.last_err == ERR_ABRT);
+  /* check our pcb is no longer active */
+  for (cur = tcp_active_pcbs; cur != NULL; cur = cur->next) {
+    EXPECT(cur != pcb);
+  }  
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+}
+
+START_TEST(test_tcp_zwp_timeout)
+{
+  LWIP_UNUSED_ARG(_i);
+  test_tcp_zwp_timeout_impl(0);
+}
+END_TEST
+
+START_TEST(test_tcp_zwp_timeout_link_down)
+{
+  LWIP_UNUSED_ARG(_i);
+  test_tcp_zwp_timeout_impl(1);
+}
+END_TEST
+
+START_TEST(test_tcp_persist_split)
+{
+  struct netif netif;
+  struct test_tcp_txcounters txcounters;
+  struct test_tcp_counters counters;
+  struct tcp_pcb *pcb;
+  struct pbuf* p;
+  err_t err;
+  size_t i;
+  LWIP_UNUSED_ARG(_i);
+
+  /* Setup data for four segments */
+  for (i = 0; i < 4 * TCP_MSS; i++) {
+    tx_data[i] = (u8_t)i;
+  }
+
+  /* initialize local vars */
+  test_tcp_init_netif(&netif, &txcounters, &test_local_ip, &test_netmask);
+  memset(&counters, 0, sizeof(counters));
+
+  /* create and initialize the pcb */
+  tcp_ticks = SEQNO1 - ISS;
+  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);
+  pcb->mss = TCP_MSS;
+  /* set window to three segments */
+  pcb->cwnd = 3 * TCP_MSS;
+  pcb->snd_wnd = 3 * TCP_MSS;
+  pcb->snd_wnd_max = 3 * TCP_MSS;
+
+  /* send four segments. Fourth should stay buffered and is a 3/4 MSS segment to
+     get coverage on the oversized segment case */
+  err = tcp_write(pcb, &tx_data[0], (3 * TCP_MSS) + (TCP_MSS - (TCP_MSS / 4)), TCP_WRITE_FLAG_COPY);
+  EXPECT(err == ERR_OK);
+  err = tcp_output(pcb);
+  EXPECT(err == ERR_OK);
+
+  /* verify 3 segments are in-flight */
+  EXPECT(pcb->unacked != NULL);
+  check_seqnos(pcb->unacked, 3, seqnos);
+  EXPECT(txcounters.num_tx_calls == 3);
+  EXPECT(txcounters.num_tx_bytes == 3 * (TCP_MSS + 40U));
+  memset(&txcounters, 0, sizeof(txcounters));
+  /* verify 4th segment is on unsent */
+  EXPECT(pcb->unsent != NULL);
+  EXPECT(pcb->unsent->len == TCP_MSS - (TCP_MSS / 4));
+  check_seqnos(pcb->unsent, 1, &seqnos[3]);
+#if TCP_OVERSIZE
+  EXPECT(pcb->unsent_oversize == TCP_MSS / 4);
+#if TCP_OVERSIZE_DBGCHECK
+  EXPECT(pcb->unsent->oversize_left == pcb->unsent_oversize);
+#endif /* TCP_OVERSIZE_DBGCHECK */
+#endif /* TCP_OVERSIZE */
+
+  /* ACK the 3 segments and update the window to only 1/2 TCP_MSS.
+     4th segment should stay on unsent because it's bigger than 1/2 MSS */
+  p = tcp_create_rx_segment_wnd(pcb, NULL, 0, 0, 3 * TCP_MSS, TCP_ACK, TCP_MSS / 2);
+  test_tcp_input(p, &netif);
+  EXPECT(pcb->unacked == NULL);
+  EXPECT(pcb->snd_wnd == TCP_MSS / 2);
+  EXPECT(pcb->unsent != NULL);
+  check_seqnos(pcb->unsent, 1, &seqnos[3]);
+  EXPECT(txcounters.num_tx_calls == 0);
+  EXPECT(txcounters.num_tx_bytes == 0);
+  /* persist timer should be started since 4th segment is stuck waiting on snd_wnd */
+  EXPECT(pcb->persist_backoff == 1);
+
+  /* ensure no errors have been recorded */
+  EXPECT(counters.err_calls == 0);
+  EXPECT(counters.last_err == ERR_OK);
+
+  /* call tcp_timer some more times to let persist timer count up */
+    for (i = 0; i < 4; i++) {
+      test_tcp_tmr();
+      EXPECT(txcounters.num_tx_calls == 0);
+      EXPECT(txcounters.num_tx_bytes == 0);
+    }
+
+  /* this should be the first timer shot, which should split the
+   * segment and send a runt (of the remaining window size) */
+  txcounters.copy_tx_packets = 1;
+  test_tcp_tmr();
+  txcounters.copy_tx_packets = 0;
+  /* persist will be disabled as RTO timer takes over */
+  EXPECT(pcb->persist_backoff == 0);
+  EXPECT(txcounters.num_tx_calls == 1);
+  EXPECT(txcounters.num_tx_bytes == ((TCP_MSS /2) + 40U));
+  /* verify 1/2 MSS segment sent, 1/4 MSS still buffered */
+  EXPECT(pcb->unsent != NULL);
+  EXPECT(pcb->unsent->len == TCP_MSS / 4);
+  EXPECT(pcb->unacked != NULL);
+  EXPECT(pcb->unacked->len == TCP_MSS / 2);
+#if TCP_OVERSIZE
+  /* verify there is no oversized remaining since during the
+     segment split, the remainder pbuf is always the exact length */
+  EXPECT(pcb->unsent_oversize == 0);
+#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) */
+  EXPECT(pcb->unsent->oversize_left == pcb->unsent_oversize);
+#endif /* TCP_OVERSIZE_DBGCHECK */
+#endif /* TCP_OVERSIZE */
+
+  /* verify first half segment */
+  EXPECT(txcounters.tx_packets != NULL);
+  if (txcounters.tx_packets != NULL) {
+    u8_t sent[TCP_MSS / 2];
+    u16_t ret;
+    ret = pbuf_copy_partial(txcounters.tx_packets, &sent, TCP_MSS / 2, 40U);
+    EXPECT(ret == TCP_MSS / 2);
+    EXPECT(memcmp(sent, &tx_data[3 * TCP_MSS], TCP_MSS / 2) == 0);
+  }
+  if (txcounters.tx_packets != NULL) {
+    pbuf_free(txcounters.tx_packets);
+    txcounters.tx_packets = NULL;
+  }
+  memset(&txcounters, 0, sizeof(txcounters));
+
+  /* ACK the half segment, leave window at half segment */
+  p = tcp_create_rx_segment_wnd(pcb, NULL, 0, 0, TCP_MSS / 2, TCP_ACK, TCP_MSS / 2);
+  txcounters.copy_tx_packets = 1;
+  test_tcp_input(p, &netif);
+  txcounters.copy_tx_packets = 0;
+  /* ensure remaining segment was sent */
+  EXPECT(txcounters.num_tx_calls == 1);
+  EXPECT(txcounters.num_tx_bytes == ((TCP_MSS / 4) + 40U));
+  EXPECT(pcb->unsent == NULL);
+  EXPECT(pcb->unacked != NULL);
+  EXPECT(pcb->unacked->len == TCP_MSS / 4);
+  EXPECT(pcb->snd_wnd == TCP_MSS / 2);
+
+  /* verify remainder segment */
+  EXPECT(txcounters.tx_packets != NULL);
+  if (txcounters.tx_packets != NULL) {
+    u8_t sent[TCP_MSS / 4];
+    u16_t ret;
+    ret = pbuf_copy_partial(txcounters.tx_packets, &sent, TCP_MSS / 4, 40U);
+    EXPECT(ret == TCP_MSS / 4);
+    EXPECT(memcmp(sent, &tx_data[(3 * TCP_MSS) + TCP_MSS / 2], TCP_MSS / 4) == 0);
+  }
+  if (txcounters.tx_packets != NULL) {
+    pbuf_free(txcounters.tx_packets);
+    txcounters.tx_packets = NULL;
+  }
+
+  /* ensure no errors have been recorded */
+  EXPECT(counters.err_calls == 0);
+  EXPECT(counters.last_err == ERR_OK);
+
+  /* make sure the pcb is freed */
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);
+  tcp_abort(pcb);
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+}
+END_TEST
+
 /** Create the suite including all tests for this module */
 Suite *
 tcp_suite(void)
 {
   testfunc tests[] = {
     TESTFUNC(test_tcp_new_abort),
+    TESTFUNC(test_tcp_listen_passive_open),
     TESTFUNC(test_tcp_recv_inseq),
+    TESTFUNC(test_tcp_recv_inseq_trim),
+    TESTFUNC(test_tcp_passive_close),
+    TESTFUNC(test_tcp_active_abort),
     TESTFUNC(test_tcp_malformed_header),
     TESTFUNC(test_tcp_fast_retx_recover),
     TESTFUNC(test_tcp_fast_rexmit_wraparound),
     TESTFUNC(test_tcp_rto_rexmit_wraparound),
     TESTFUNC(test_tcp_tx_full_window_lost_from_unacked),
-    TESTFUNC(test_tcp_tx_full_window_lost_from_unsent)
+    TESTFUNC(test_tcp_tx_full_window_lost_from_unsent),
+    TESTFUNC(test_tcp_retx_add_to_sent),
+    TESTFUNC(test_tcp_rto_tracking),
+    TESTFUNC(test_tcp_rto_timeout),
+    TESTFUNC(test_tcp_rto_timeout_link_down),
+    TESTFUNC(test_tcp_rto_timeout_syn_sent),
+    TESTFUNC(test_tcp_rto_timeout_syn_sent_link_down),
+    TESTFUNC(test_tcp_zwp_timeout),
+    TESTFUNC(test_tcp_zwp_timeout_link_down),
+    TESTFUNC(test_tcp_persist_split)
   };
   return create_suite("TCP", tests, sizeof(tests)/sizeof(testfunc), tcp_setup, tcp_teardown);
 }
diff --git a/test/unit/tcp/test_tcp_oos.c b/test/unit/tcp/test_tcp_oos.c
index be61172..a190e7d 100644
--- a/test/unit/tcp/test_tcp_oos.c
+++ b/test/unit/tcp/test_tcp_oos.c
@@ -118,19 +118,30 @@
 }
 
 /* Setup/teardown functions */
+static struct netif *old_netif_list;
+static struct netif *old_netif_default;
 
 static void
 tcp_oos_setup(void)
 {
+  old_netif_list = netif_list;
+  old_netif_default = netif_default;
+  netif_list = NULL;
+  netif_default = NULL;
   tcp_remove_all();
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
 }
 
 static void
 tcp_oos_teardown(void)
 {
-  tcp_remove_all();
   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));
 }
 
 
@@ -150,18 +161,12 @@
      5,  6,  7,  8,
      9, 10, 11, 12,
     13, 14, 15, 16};
-  ip_addr_t remote_ip, local_ip, netmask;
   u16_t data_len;
-  u16_t remote_port = 0x100, local_port = 0x101;
   struct netif netif;
   LWIP_UNUSED_ARG(_i);
 
   /* initialize local vars */
-  memset(&netif, 0, sizeof(netif));
-  IP_ADDR4(&local_ip, 192, 168, 1, 1);
-  IP_ADDR4(&remote_ip, 192, 168, 1, 2);
-  IP_ADDR4(&netmask,   255, 255, 255, 0);
-  test_tcp_init_netif(&netif, NULL, &local_ip, &netmask);
+  test_tcp_init_netif(&netif, NULL, &test_local_ip, &test_netmask);
   data_len = sizeof(data);
   /* initialize counter struct */
   memset(&counters, 0, sizeof(counters));
@@ -171,7 +176,7 @@
   /* create and initialize the pcb */
   pcb = test_tcp_new_counters_pcb(&counters);
   EXPECT_RET(pcb != NULL);
-  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
+  tcp_set_state(pcb, ESTABLISHED, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
 
   /* create segments */
   /* pinseq is sent as last segment! */
@@ -292,18 +297,12 @@
      5,  6,  7,  8,
      9, 10, 11, 12,
     13, 14, 15, 16};
-  ip_addr_t remote_ip, local_ip, netmask;
   u16_t data_len;
-  u16_t remote_port = 0x100, local_port = 0x101;
   struct netif netif;
   LWIP_UNUSED_ARG(_i);
 
   /* initialize local vars */
-  memset(&netif, 0, sizeof(netif));
-  IP_ADDR4(&local_ip, 192, 168, 1, 1);
-  IP_ADDR4(&remote_ip, 192, 168, 1, 2);
-  IP_ADDR4(&netmask,   255, 255, 255, 0);
-  test_tcp_init_netif(&netif, NULL, &local_ip, &netmask);
+  test_tcp_init_netif(&netif, NULL, &test_local_ip, &test_netmask);
   data_len = sizeof(data);
   /* initialize counter struct */
   memset(&counters, 0, sizeof(counters));
@@ -313,7 +312,7 @@
   /* create and initialize the pcb */
   pcb = test_tcp_new_counters_pcb(&counters);
   EXPECT_RET(pcb != NULL);
-  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
+  tcp_set_state(pcb, ESTABLISHED, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
 
   /* create segments */
   /* p1: 7 bytes - 2 before FIN */
@@ -465,8 +464,6 @@
   struct test_tcp_counters counters;
   struct tcp_pcb* pcb;
   struct pbuf *pinseq, *p_ovr;
-  ip_addr_t remote_ip, local_ip, netmask;
-  u16_t remote_port = 0x100, local_port = 0x101;
   struct netif netif;
   int datalen = 0;
   int datalen2;
@@ -476,11 +473,7 @@
   }
 
   /* initialize local vars */
-  memset(&netif, 0, sizeof(netif));
-  IP_ADDR4(&local_ip, 192, 168, 1, 1);
-  IP_ADDR4(&remote_ip, 192, 168, 1, 2);
-  IP_ADDR4(&netmask,   255, 255, 255, 0);
-  test_tcp_init_netif(&netif, NULL, &local_ip, &netmask);
+  test_tcp_init_netif(&netif, NULL, &test_local_ip, &test_netmask);
   /* initialize counter struct */
   memset(&counters, 0, sizeof(counters));
   counters.expected_data_len = TCP_WND;
@@ -489,7 +482,7 @@
   /* create and initialize the pcb */
   pcb = test_tcp_new_counters_pcb(&counters);
   EXPECT_RET(pcb != NULL);
-  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
+  tcp_set_state(pcb, ESTABLISHED, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
   pcb->rcv_nxt = 0x8000;
 
   /* create segments */
@@ -558,8 +551,6 @@
   struct test_tcp_counters counters;
   struct tcp_pcb* pcb;
   struct pbuf *pinseq, *p_ovr;
-  ip_addr_t remote_ip, local_ip, netmask;
-  u16_t remote_port = 0x100, local_port = 0x101;
   struct netif netif;
   int datalen = 0;
   int datalen2;
@@ -569,11 +560,7 @@
   }
 
   /* initialize local vars */
-  memset(&netif, 0, sizeof(netif));
-  IP_ADDR4(&local_ip, 192, 168, 1, 1);
-  IP_ADDR4(&remote_ip, 192, 168, 1, 2);
-  IP_ADDR4(&netmask,   255, 255, 255, 0);
-  test_tcp_init_netif(&netif, NULL, &local_ip, &netmask);
+  test_tcp_init_netif(&netif, NULL, &test_local_ip, &test_netmask);
   /* initialize counter struct */
   memset(&counters, 0, sizeof(counters));
   counters.expected_data_len = TCP_WND;
@@ -582,7 +569,7 @@
   /* create and initialize the pcb */
   pcb = test_tcp_new_counters_pcb(&counters);
   EXPECT_RET(pcb != NULL);
-  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
+  tcp_set_state(pcb, ESTABLISHED, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
   pcb->rcv_nxt = 0xffffffff - (TCP_WND / 2);
 
   /* create segments */
@@ -650,8 +637,6 @@
   struct test_tcp_counters counters;
   struct tcp_pcb* pcb;
   struct pbuf *p_ovr;
-  ip_addr_t remote_ip, local_ip, netmask;
-  u16_t remote_port = 0x100, local_port = 0x101;
   struct netif netif;
   int datalen = 0;
   int datalen2;
@@ -661,11 +646,7 @@
   }
 
   /* initialize local vars */
-  memset(&netif, 0, sizeof(netif));
-  IP_ADDR4(&local_ip, 192, 168, 1, 1);
-  IP_ADDR4(&remote_ip, 192, 168, 1, 2);
-  IP_ADDR4(&netmask,   255, 255, 255, 0);
-  test_tcp_init_netif(&netif, NULL, &local_ip, &netmask);
+  test_tcp_init_netif(&netif, NULL, &test_local_ip, &test_netmask);
   /* initialize counter struct */
   memset(&counters, 0, sizeof(counters));
   counters.expected_data_len = TCP_WND;
@@ -674,7 +655,7 @@
   /* create and initialize the pcb */
   pcb = test_tcp_new_counters_pcb(&counters);
   EXPECT_RET(pcb != NULL);
-  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
+  tcp_set_state(pcb, ESTABLISHED, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
   pcb->rcv_nxt = 0x8000;
 
   /* don't 'recv' the first segment (1 byte) so that all other segments will be ooseq */
@@ -731,8 +712,6 @@
   struct test_tcp_counters counters;
   struct tcp_pcb* pcb;
   struct pbuf *p_ovr;
-  ip_addr_t remote_ip, local_ip, netmask;
-  u16_t remote_port = 0x100, local_port = 0x101;
   struct netif netif;
   int datalen = 0;
   int datalen2;
@@ -742,11 +721,7 @@
   }
 
   /* initialize local vars */
-  memset(&netif, 0, sizeof(netif));
-  IP_ADDR4(&local_ip, 192, 168, 1, 1);
-  IP_ADDR4(&remote_ip, 192, 168, 1, 2);
-  IP_ADDR4(&netmask,   255, 255, 255, 0);
-  test_tcp_init_netif(&netif, NULL, &local_ip, &netmask);
+  test_tcp_init_netif(&netif, NULL, &test_local_ip, &test_netmask);
   /* initialize counter struct */
   memset(&counters, 0, sizeof(counters));
   counters.expected_data_len = TCP_WND;
@@ -755,7 +730,7 @@
   /* create and initialize the pcb */
   pcb = test_tcp_new_counters_pcb(&counters);
   EXPECT_RET(pcb != NULL);
-  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
+  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
   pcb->rcv_nxt = 0x8000;
 
   /* don't 'recv' the first segment (1 byte) so that all other segments will be ooseq */
@@ -834,8 +809,6 @@
   struct test_tcp_counters counters;
   struct tcp_pcb* pcb;
   struct pbuf *p_normal_fin, *p_data_after_fin, *p, *p_2nd_fin_ooseq;
-  ip_addr_t remote_ip, local_ip, netmask;
-  u16_t remote_port = 0x100, local_port = 0x101;
   struct netif netif;
   u32_t exp_rx_calls = 0, exp_rx_bytes = 0, exp_close_calls = 0, exp_oos_pbufs = 0, exp_oos_tcplen = 0;
   int first_dropped = 0xff;
@@ -845,11 +818,7 @@
   }
 
   /* initialize local vars */
-  memset(&netif, 0, sizeof(netif));
-  IP_ADDR4(&local_ip, 192, 168, 1, 1);
-  IP_ADDR4(&remote_ip, 192, 168, 1, 2);
-  IP_ADDR4(&netmask,   255, 255, 255, 0);
-  test_tcp_init_netif(&netif, NULL, &local_ip, &netmask);
+  test_tcp_init_netif(&netif, NULL, &test_local_ip, &test_netmask);
   /* initialize counter struct */
   memset(&counters, 0, sizeof(counters));
   counters.expected_data_len = TCP_WND;
@@ -858,7 +827,7 @@
   /* create and initialize the pcb */
   pcb = test_tcp_new_counters_pcb(&counters);
   EXPECT_RET(pcb != NULL);
-  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
+  tcp_set_state(pcb, ESTABLISHED, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
   pcb->rcv_nxt = 0x8000;
 
   /* create segments */
diff --git a/test/unit/udp/test_udp.c b/test/unit/udp/test_udp.c
index 147822f..e26a83e 100644
--- a/test/unit/udp/test_udp.c
+++ b/test/unit/udp/test_udp.c
@@ -2,11 +2,23 @@
 
 #include "lwip/udp.h"
 #include "lwip/stats.h"
+#include "lwip/inet_chksum.h"
 
 #if !LWIP_STATS || !UDP_STATS || !MEMP_STATS
 #error "This tests needs UDP- and MEMP-statistics enabled"
 #endif
 
+struct test_udp_rxdata {
+  u32_t rx_cnt;
+  u32_t rx_bytes;
+  struct udp_pcb *pcb;
+};
+
+static struct netif test_netif1, test_netif2;
+static ip4_addr_t test_gw1, test_ipaddr1, test_netmask1;
+static ip4_addr_t test_gw2, test_ipaddr2, test_netmask2;
+static int output_ctr, linkoutput_ctr;
+
 /* Helper functions */
 static void
 udp_remove_all(void)
@@ -22,18 +34,99 @@
   fail_unless(MEMP_STATS_GET(used, MEMP_UDP_PCB) == 0);
 }
 
+static err_t
+default_netif_output(struct netif *netif, struct pbuf *p, const ip4_addr_t *ipaddr)
+{
+  fail_unless((netif == &test_netif1) || (netif == &test_netif2));
+  fail_unless(p != NULL);
+  fail_unless(ipaddr != NULL);
+  output_ctr++;
+  return ERR_OK;
+}
+
+static err_t
+default_netif_linkoutput(struct netif *netif, struct pbuf *p)
+{
+  fail_unless((netif == &test_netif1) || (netif == &test_netif2));
+  fail_unless(p != NULL);
+  linkoutput_ctr++;
+  return ERR_OK;
+}
+
+static err_t
+default_netif_init(struct netif *netif)
+{
+  fail_unless(netif != NULL);
+  netif->output = default_netif_output;
+  netif->linkoutput = default_netif_linkoutput;
+  netif->mtu = 1500;
+  netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
+  netif->hwaddr_len = 6;
+  return ERR_OK;
+}
+
+static void
+default_netif_add(void)
+{
+  struct netif *n;
+
+#if LWIP_HAVE_LOOPIF
+  fail_unless(netif_list != NULL); /* the loopif */
+  fail_unless(netif_list->next == NULL);
+#else
+  fail_unless(netif_list == NULL);
+#endif
+  fail_unless(netif_default == NULL);
+
+  IP4_ADDR(&test_ipaddr1, 192,168,0,1);
+  IP4_ADDR(&test_netmask1, 255,255,255,0);
+  IP4_ADDR(&test_gw1, 192,168,0,254);
+  n = netif_add(&test_netif1, &test_ipaddr1, &test_netmask1,
+                &test_gw1, NULL, default_netif_init, NULL);
+  fail_unless(n == &test_netif1);
+
+  IP4_ADDR(&test_ipaddr2, 192,168,1,1);
+  IP4_ADDR(&test_netmask2, 255,255,255,0);
+  IP4_ADDR(&test_gw2, 192,168,1,254);
+  n = netif_add(&test_netif2, &test_ipaddr2, &test_netmask2,
+                &test_gw2, NULL, default_netif_init, NULL);
+  fail_unless(n == &test_netif2);
+
+  netif_set_default(&test_netif1);
+  netif_set_up(&test_netif1);
+  netif_set_up(&test_netif2);
+}
+
+static void
+default_netif_remove(void)
+{
+  fail_unless(netif_default == &test_netif1);
+  netif_remove(&test_netif1);
+  netif_remove(&test_netif2);
+  fail_unless(netif_default == NULL);
+#if LWIP_HAVE_LOOPIF
+  fail_unless(netif_list != NULL); /* the loopif */
+  fail_unless(netif_list->next == NULL);
+#else
+  fail_unless(netif_list == NULL);
+#endif
+}
 /* Setups/teardown functions */
 
 static void
 udp_setup(void)
 {
   udp_remove_all();
+  default_netif_add();
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
 }
 
 static void
 udp_teardown(void)
 {
   udp_remove_all();
+  default_netif_remove();
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
 }
 
 
@@ -56,6 +149,191 @@
 }
 END_TEST
 
+static void test_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p,
+    const ip_addr_t *addr, u16_t port)
+{
+  struct test_udp_rxdata *ctr = (struct test_udp_rxdata *)arg;
+
+  LWIP_UNUSED_ARG(addr);
+  LWIP_UNUSED_ARG(port);
+
+  fail_unless(arg != NULL);
+  fail_unless(ctr->pcb == pcb);
+
+  ctr->rx_cnt++;
+  ctr->rx_bytes += p->tot_len;
+
+  if (p != NULL) {
+    pbuf_free(p);
+  }
+}
+
+static struct pbuf *
+test_udp_create_test_packet(u16_t length, u16_t port, u32_t dst_addr)
+{
+  err_t err;
+  u8_t ret;
+  struct udp_hdr *uh;
+  struct ip_hdr *ih;
+  struct pbuf *p;
+  const u8_t test_data[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
+
+  p = pbuf_alloc(PBUF_TRANSPORT, length, PBUF_POOL);
+  fail_unless(p != NULL);
+  if (p == NULL) {
+    return NULL;
+  }
+  fail_unless(p->next == NULL);
+  err = pbuf_take(p, test_data, length);
+  fail_unless(err == ERR_OK);
+
+  /* add UDP header */
+  ret = pbuf_add_header(p, sizeof(struct udp_hdr));
+  fail_unless(!ret);
+  uh = (struct udp_hdr *)p->payload;
+  uh->chksum = 0;
+  uh->dest = uh->src = lwip_htons(port);
+  uh->len = lwip_htons(p->tot_len);
+  /* add IPv4 header */
+  ret = pbuf_add_header(p, sizeof(struct ip_hdr));
+  fail_unless(!ret);
+  ih = (struct ip_hdr *)p->payload;
+  memset(ih, 0, sizeof(*ih));
+  ih->dest.addr = dst_addr;
+  ih->_len = lwip_htons(p->tot_len);
+  ih->_ttl = 32;
+  ih->_proto = IP_PROTO_UDP;
+  IPH_VHL_SET(ih, 4, sizeof(struct ip_hdr) / 4);
+  IPH_CHKSUM_SET(ih, inet_chksum(ih, sizeof(struct ip_hdr)));
+  return p;
+}
+
+/* bind 2 pcbs to specific netif IP and test which one gets broadcasts */
+START_TEST(test_udp_broadcast_rx_with_2_netifs)
+{
+  err_t err;
+  struct udp_pcb *pcb1, *pcb2;
+  const u16_t port = 12345;
+  struct test_udp_rxdata ctr1, ctr2;
+  struct pbuf *p;
+#if SO_REUSE
+  struct udp_pcb *pcb_any;
+  struct test_udp_rxdata ctr_any;
+#endif
+  LWIP_UNUSED_ARG(_i);
+
+  pcb1 = udp_new();
+  fail_unless(pcb1 != NULL);
+  pcb2 = udp_new();
+  fail_unless(pcb2 != NULL);
+
+#if SO_REUSE
+  pcb_any = udp_new();
+  fail_unless(pcb_any != NULL);
+
+  ip_set_option(pcb1, SOF_REUSEADDR);
+  ip_set_option(pcb2, SOF_REUSEADDR);
+  ip_set_option(pcb_any, SOF_REUSEADDR);
+
+  err = udp_bind(pcb_any, NULL, port);
+  fail_unless(err == ERR_OK);
+  memset(&ctr_any, 0, sizeof(ctr_any));
+  ctr_any.pcb = pcb_any;
+  udp_recv(pcb_any, test_recv, &ctr_any);
+#endif
+
+  err = udp_bind(pcb1, &test_netif1.ip_addr, port);
+  fail_unless(err == ERR_OK);
+  err = udp_bind(pcb2, &test_netif2.ip_addr, port);
+  fail_unless(err == ERR_OK);
+
+  memset(&ctr1, 0, sizeof(ctr1));
+  ctr1.pcb = pcb1;
+  memset(&ctr2, 0, sizeof(ctr2));
+  ctr2.pcb = pcb2;
+
+  udp_recv(pcb1, test_recv, &ctr1);
+  udp_recv(pcb2, test_recv, &ctr2);
+
+  /* unicast to netif1 */
+  p = test_udp_create_test_packet(16, port, test_ipaddr1.addr);
+  EXPECT_RET(p != NULL);
+  err = ip4_input(p, &test_netif1);
+  fail_unless(err == ERR_OK);
+  fail_unless(ctr1.rx_cnt == 1);
+  fail_unless(ctr1.rx_bytes == 16);
+  fail_unless(ctr2.rx_cnt == 0);
+#if SO_REUSE
+  fail_unless(ctr_any.rx_cnt == 0);
+#endif
+  ctr1.rx_cnt = ctr1.rx_bytes = 0;
+
+  /* unicast to netif2 */
+  p = test_udp_create_test_packet(16, port, test_ipaddr2.addr);
+  EXPECT_RET(p != NULL);
+  err = ip4_input(p, &test_netif2);
+  fail_unless(err == ERR_OK);
+  fail_unless(ctr2.rx_cnt == 1);
+  fail_unless(ctr2.rx_bytes == 16);
+  fail_unless(ctr1.rx_cnt == 0);
+#if SO_REUSE
+  fail_unless(ctr_any.rx_cnt == 0);
+#endif
+  ctr2.rx_cnt = ctr2.rx_bytes = 0;
+
+  /* broadcast to netif1-broadcast, input to netif2 */
+  p = test_udp_create_test_packet(16, port, test_ipaddr1.addr | ~test_netmask1.addr);
+  EXPECT_RET(p != NULL);
+  err = ip4_input(p, &test_netif2);
+  fail_unless(err == ERR_OK);
+  fail_unless(ctr1.rx_cnt == 1);
+  fail_unless(ctr1.rx_bytes == 16);
+  fail_unless(ctr2.rx_cnt == 0);
+#if SO_REUSE
+  fail_unless(ctr_any.rx_cnt == 0);
+#endif
+  ctr1.rx_cnt = ctr1.rx_bytes = 0;
+
+  /* broadcast to netif2-broadcast, input to netif1 */
+  p = test_udp_create_test_packet(16, port, test_ipaddr2.addr | ~test_netmask2.addr);
+  EXPECT_RET(p != NULL);
+  err = ip4_input(p, &test_netif1);
+  fail_unless(err == ERR_OK);
+  fail_unless(ctr2.rx_cnt == 1);
+  fail_unless(ctr2.rx_bytes == 16);
+  fail_unless(ctr1.rx_cnt == 0);
+#if SO_REUSE
+  fail_unless(ctr_any.rx_cnt == 0);
+#endif
+  ctr2.rx_cnt = ctr2.rx_bytes = 0;
+
+  /* broadcast to global-broadcast, input to netif1 */
+  p = test_udp_create_test_packet(16, port, 0xffffffff);
+  EXPECT_RET(p != NULL);
+  err = ip4_input(p, &test_netif1);
+  fail_unless(err == ERR_OK);
+  fail_unless(ctr1.rx_cnt == 1);
+  fail_unless(ctr1.rx_bytes == 16);
+  fail_unless(ctr2.rx_cnt == 0);
+#if SO_REUSE
+  fail_unless(ctr_any.rx_cnt == 0);
+#endif
+  ctr1.rx_cnt = ctr1.rx_bytes = 0;
+
+  /* broadcast to global-broadcast, input to netif2 */
+  p = test_udp_create_test_packet(16, port, 0xffffffff);
+  EXPECT_RET(p != NULL);
+  err = ip4_input(p, &test_netif2);
+  fail_unless(err == ERR_OK);
+  fail_unless(ctr2.rx_cnt == 1);
+  fail_unless(ctr2.rx_bytes == 16);
+  fail_unless(ctr1.rx_cnt == 0);
+#if SO_REUSE
+  fail_unless(ctr_any.rx_cnt == 0);
+#endif
+  ctr2.rx_cnt = ctr2.rx_bytes = 0;
+}
+END_TEST
 
 /** Create the suite including all tests for this module */
 Suite *
@@ -63,6 +341,7 @@
 {
   testfunc tests[] = {
     TESTFUNC(test_udp_new_remove),
+    TESTFUNC(test_udp_broadcast_rx_with_2_netifs)
   };
   return create_suite("UDP", tests, sizeof(tests)/sizeof(testfunc), udp_setup, udp_teardown);
 }